标签:java
需求:页面输入团单号,从数据库中查询搬单错误的数据,以excel形式导出。
前端页面放在ts-settle-tools-web项目中,后端查询数据库的部分写在ts-tg-settle中,以API形式提供给ts-settle-tools使用,其实是通过webservice调用的。
java
public interface TSSettleService {
/**
* 查询搬单错误数据
* @param dealGroupIds
* @return
*/
public List<TSSettleDetailDTO> getSettleDetailByDealGroupIds(List<Integer> dealGroupIds);
}
java
public class TSSettleServiceObject implements TSSettleService {
@Override
public List<TSSettleDetailDTO> getSettleDetailByDealGroupIds(List<Integer> dealGroupIds){
if(dealGroupIds == null || dealGroupIds.size() == 0){
return null;
}
List<TSSettleDetailData> list = tsSettleDetailDao.getSettleDetailByDealGroupIds(dealGroupIds);
if(list == null || list.size() == 0){
return null;
}
List<TSSettleDetailDTO> tsSettleDetailDTOs = new ArrayList<TSSettleDetailDTO>();
for(TSSettleDetailData tsSettleDetailData: list){
TSSettleDetailDTO tsSettleDetailDTO = new TSSettleDetailDTO();
tsSettleDetailDTO.setAddTime(tsSettleDetailData.getAddTime());
tsSettleDetailDTO.setAccountId(tsSettleDetailData.getAccountId());
tsSettleDetailDTO.setCustomerId(tsSettleDetailData.getCustomerId());
tsSettleDetailDTO.setDealCost(tsSettleDetailData.getDealCost());
tsSettleDetailDTO.setDealGroupId(tsSettleDetailData.getDealGroupId());
tsSettleDetailDTO.setDealPrice(tsSettleDetailData.getDealPrice());
tsSettleDetailDTO.setDealId(tsSettleDetailData.getDealId());
tsSettleDetailDTO.setDetailId(tsSettleDetailData.getDetailId());
tsSettleDetailDTO.setGroupId(tsSettleDetailData.getGroupId());
tsSettleDetailDTO.setIsDeleted(tsSettleDetailData.getIsDeleted());
tsSettleDetailDTO.setIsOrderId(tsSettleDetailData.getIsOrderId());
tsSettleDetailDTO.setQuantity(tsSettleDetailData.getQuantity());
tsSettleDetailDTO.setSequence(tsSettleDetailData.getSequence());
tsSettleDetailDTO.setSettleLevel(tsSettleDetailData.getSettleLevel());
tsSettleDetailDTO.setSettleStatus(tsSettleDetailData.getSettleStatus());
tsSettleDetailDTO.setSettleTime(tsSettleDetailData.getSettleTime());
tsSettleDetailDTO.setSettleType(tsSettleDetailData.getSettleType());
tsSettleDetailDTO.setShopId(tsSettleDetailData.getShopId());
tsSettleDetailDTOs.add(tsSettleDetailDTO);
}
return tsSettleDetailDTOs;
}
}
java
public interface TSSettleDetailDao extends GenericDao {
@DAOAction(action = DAOActionType.QUERY)
List<TSSettleDetailData> getSettleDetailByDealGroupIds(@DAOParam("dealGroupIds") List<Integer> dealGroupIds);
}
xml
<select id="getSettleDetailByDealGroupIds" resultClass="tsSettleDetail" parameterClass="map">
<include refid="sql_select"/>
WHERE DealGroupID IN
<iterate property="dealGroupIds" open="(" close=")" conjunction=",">
#dealGroupIds[]#
</iterate>
<![CDATA[
AND UpdateTime>‘2015-12-01‘ ORDER BY id ;
]]>
</select>
以上是调用TSSettleService接口的部分代码。TSSettleService中的服务需要发布,配置如下xml
<bean id="tsSettleSystemService" class="com.dianping.dpsf.spring.ServiceRegistry" init-method="init" lazy-init="false">
<property name="port" value="${ts-tg-settle-service.tsSettleService.port}"/>
<property name="services">
<map>
<entry key="http://service.dianping.com/ts/tg/tsSettleService/TSSettleService_1.0.0" value-ref="tsTGSettleService"/>
</map>
</property>
</bean>
ts-settle-tools中接收页面请求,并且调用TSSettleService的服务。页面效果如下:页面代码如下:
`html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="/css/bootstrap.min.css" rel="stylesheet"> <title>搬单错误查询页面</title> </head> <body> <div class="panel panel-primary"> <div class="panel-heading"> <div class="panel-title">搬单错误数据查询</div> </div> <div class="panel-body"> <div class="row"> <div class="col-md-12"> <form class="form-horizontal" action="/settle/querySettleDetailDataAction" onsubmit="return check()" method="post"> <div class="form-group"> <label class="col-md-2 control-label">团单号</label> <div class="col-md-10"> <textarea rows="3" class="form-control" id="dealGroupIds" name="dealGroupIds" placeholder="使用英文逗号分隔"></textarea> </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <button class="btn btn-primary" type="submit">查询</button> </div> </div> </form> </div> </div> </div> </div> <script type="text/javascript" src="/js/jquery.min.js"></script> <script type="text/javascript" src="/js/layer/layer.js"></script>
<script type="text/javascript"> $(document).ready(function(){
}); function check(){ if($("#dealGroupIds").val() == "" || $("#dealGroupIds").val() == ","){ layer.tips(‘请输入正确的团单号,多个团单号用英文逗号分隔‘, ‘#dealGroupIds‘); return false; } }
</script>
</body>
</html>页面使用了JQuery和layer以及bootstrap。controller部分如下:
java
@RequestMapping("/settle")
@Controller
public class SettleController {
@Autowired private SettleService settleService; @RequestMapping("/querySettleDetailData") public String querySettleDetailData(){ return "querySettleDetailData"; } @RequestMapping("/querySettleDetailDataAction") public void querySettleDetailDataAction(@RequestParam String dealGroupIds, HttpServletRequest request, HttpServletResponse response){ List<QuerySettleDetailData> list = settleService.loadTsSettleDetail(dealGroupIds); ExportExcel<QuerySettleDetailData> ex = new ExportExcel<QuerySettleDetailData>(); String[] headers = { "团单号", "套餐号", "验券门店", "结算价", "售价", "验券时间", "券号", "打款状态"}; try { HSSFWorkbook workbook = ex.exportExcel(headers, list); String filename = "result.xls"; response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=" + filename); OutputStream ouputStream = response.getOutputStream(); workbook.write(ouputStream); ouputStream.flush(); ouputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
}
service部分如下:
java
public class SettleServiceImpl implements SettleService {
private AvatarLogger monitorLogger = AvatarLoggerFactory.getLogger(this.getClass()); @Autowired private TSSettleService tsSettleService; @Autowired private TSSettleInfoQueryService tsSettleInfoQueryService; @Autowired private DistributionBaseService distributionBaseService; @Autowired private PayPlanBaseService payPlanBaseService; public List<QuerySettleDetailData> loadTsSettleDetail(String dealGroupIds){ if(dealGroupIds == null || dealGroupIds.equals("")){ return null; } String[] strs=dealGroupIds.split(","); List<Integer> dealGroupIdList = new ArrayList<Integer>(); for(int i = 0; i < strs.length; i++){ try { dealGroupIdList.add(Integer.valueOf(strs[i])); }catch (Exception e) { monitorLogger.error("Number format error", e); } } List<TSSettleDetailDTO> tsSettleDetailDTOs = tsSettleService.getSettleDetailByDealGroupIds(dealGroupIdList); if(tsSettleDetailDTOs == null){ return null; } List<QuerySettleDetailData> querySettleDetailDatas = new ArrayList<QuerySettleDetailData>(); for (TSSettleDetailDTO o: tsSettleDetailDTOs){ //调用tsSettleInfoQueryService服务 String sn = tsSettleInfoQueryService.loadSnByGroupId(o.getGroupId()); QuerySettleDetailData querySettleDetailData = new QuerySettleDetailData(); querySettleDetailData.setDealGroupId(o.getDealGroupId()); querySettleDetailData.setDealId(o.getDealId()); querySettleDetailData.setShopId(o.getShopId()); querySettleDetailData.setDealCost(o.getDealCost()); querySettleDetailData.setDealPrice(o.getDealPrice()); querySettleDetailData.setSettleTime(o.getSettleTime()); querySettleDetailData.setDetailId(o.getDetailId()); int payPlanId = 0; //调用distribution服务 List<DistributionDetailDTO> distributionDetailDTOs = distributionBaseService.queryDistributeDetail(sn); for(DistributionDetailDTO distributionDetailDTO: distributionDetailDTOs){ if(distributionDetailDTO.getPayPlanId() != 0){ payPlanId = distributionDetailDTO.getPayPlanId(); break; } } int status = 0; //调用payPlan服务 PayPlanDTO payPlanDTO = payPlanBaseService.loadPayPlanData(payPlanId); if(payPlanDTO != null){ if(payPlanDTO.getStatus() == 5){ status = 1;//payPlan的status=5 已打款 }else{//其他都为未打款 status = 0; } } querySettleDetailData.setStatus(status); querySettleDetailDatas.add(querySettleDetailData); } return querySettleDetailDatas; }
}
` 至此就得到了需要查询的数据,controllrt拿到查询到的数据之后需要将数据以excel形式返回给浏览器。生成excel的代码如下:
`java public class ExportExcel<T> { private AvatarLogger monitorLogger = AvatarLoggerFactory.getLogger(this.getClass()); public HSSFWorkbook exportExcel(Collection<T> dataset) { return exportExcel("导出结果", null, dataset); }
public HSSFWorkbook exportExcel(String[] headers, Collection<T> dataset) { return exportExcel("导出结果", headers, dataset); } @SuppressWarnings("unchecked") public HSSFWorkbook exportExcel(String title, String[] headers, Collection<T> dataset) { // 声明一个工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); // 生成一个表格 HSSFSheet sheet = workbook.createSheet(title); // 设置表格默认列宽度为18个字节 sheet.setDefaultColumnWidth((short) 18); // 生成一个样式 HSSFCellStyle style = workbook.createCellStyle(); // 设置这些样式 style.setFillForegroundColor(HSSFColor.WHITE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 生成一个字体 HSSFFont font = workbook.createFont();
// font.setColor(HSSFColor.VIOLET.index); font.setFontHeightInPoints((short) 12); font.setBoldweight(HSSFFont.BOLDWEIGHTBOLD); // 把字体应用到当前的样式 style.setFont(font); // 生成并设置另一个样式 HSSFCellStyle style2 = workbook.createCellStyle(); style2.setFillForegroundColor(HSSFColor.WHITE.index); style2.setFillPattern(HSSFCellStyle.SOLIDFOREGROUND); style2.setBorderBottom(HSSFCellStyle.BORDERTHIN); style2.setBorderLeft(HSSFCellStyle.BORDERTHIN); style2.setBorderRight(HSSFCellStyle.BORDERTHIN); style2.setBorderTop(HSSFCellStyle.BORDERTHIN); style2.setAlignment(HSSFCellStyle.ALIGNCENTER); style2.setVerticalAlignment(HSSFCellStyle.VERTICALCENTER); // 生成另一个字体 HSSFFont font2 = workbook.createFont(); font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); // 把字体应用到当前的样式 style2.setFont(font2);
// 产生表格标题行 HSSFRow row = sheet.createRow(0); for (short i = 0; i < headers.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text); } //没有查询到数据 if (dataset == null || dataset.size() == 0) { sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, headers.length - 1)); HSSFRow row1 = sheet.createRow(1); HSSFCell cell = row1.createCell(0); cell.setCellValue("没有查询到数据"); }else{ // 遍历集合数据,产生数据行 Iterator<T> it = dataset.iterator(); int index = 0; while (it.hasNext()) { index++; row = sheet.createRow(index); T t = (T) it.next(); // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 Field[] fields = t.getClass().getDeclaredFields(); int colNum = 0; for (short i = 0; i < fields.length; i++) { Field field = fields[i]; String fieldName = field.getName(); String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (fieldName.equals("dealGroupId") || fieldName.equals("dealId") || fieldName.equals("shopId") || fieldName.equals("dealCost") || fieldName.equals("dealPrice") || fieldName.equals("settleTime") || fieldName.equals("detailId") || fieldName.equals("status")) { //只导出这几个字段 } else { continue; } HSSFCell cell = row.createCell(colNum); cell.setCellStyle(style2); try { Class tCls = t.getClass(); Method getMethod = tCls.getMethod(getMethodName, new Class[]{}); Object value = getMethod.invoke(t, new Object[]{}); // 判断值的类型后进行强制类型转换 if (fieldName.equals("dealCost") || fieldName.equals("dealPrice")) { cell.setCellValue(Double.parseDouble(value.toString())); } else if (fieldName.equals("status")) { cell.setCellValue(TSTGSettleStatusEnum.getByCode(Integer.valueOf(value.toString())).getMessage()); } else if (value instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); cell.setCellValue(sdf.format(date)); } else if (fieldName.equals("dealGroupId") || fieldName.equals("dealId") || fieldName.equals("shopId") || fieldName.equals("detailId")) { cell.setCellValue(value.toString()); } colNum++; } catch (Exception e) { monitorLogger.error(e); } finally { // 清理资源 } } } } return workbook; }
}
`
ts-settle-tools使用服务时,需要添加对应的pom依赖,并且配置服务的地址:`xml <bean id="tsSettleService" class="com.dianping.dpsf.spring.ProxyBeanFactory" init-method="init"> <property name="serviceName" value="http://service.dianping.com/ts/tg/tsSettleService/TSSettleService_1.0.0"/> <property name="iface" value="com.dianping.ts.tg.settle.api.TSSettleService"/> <property name="serialize" value="hessian"/> <property name="callMethod" value="sync"/> <property name="timeout" value="5000"/> </bean>
<bean id="tsSettleInfoQueryService" class="com.dianping.dpsf.spring.ProxyBeanFactory" init-method="init"> <property name="serviceName" value="http://service.dianping.com/ts/tg/tsSettleService/TSSettleInfoQueryService_1.0.0"/> <property name="iface" value="com.dianping.ts.tg.settle.api.TSSettleInfoQueryService"/> <property name="serialize" value="hessian"/> <property name="callMethod" value="sync"/> <property name="timeout" value="5000"/> </bean>
<bean id="distributionBaseService" class="com.dianping.dpsf.spring.ProxyBeanFactory" init-method="init"> <property name="serviceName" value="http://service.dianping.com/tsDistributionService/DistributionBaseService_1.0.0"/> <property name="iface" value="com.dianping.ts.account.distribution.api.service.DistributionBaseService"/> <property name="serialize" value="hessian"/> <property name="callMethod" value="sync"/> <property name="timeout" value="5000"/> </bean>
<bean id="payPlanBaseService" class="com.dianping.dpsf.spring.ProxyBeanFactory" init-method="init"> <property name="serviceName" value="http://service.dianping.com/tsATMPayPlanBaseService/PayPlanBaseService_1.0.0"/> <property name="iface" value="com.dianping.ts.atm.payplan.api.PayPlanBaseService"/> <property name="serialize" value="hessian"/> <property name="callMethod" value="sync"/> <property name="timeout" value="5000"/> </bean>`
本文出自 “优赛工作室” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/1772797
标签:java
原文地址:http://shamrock.blog.51cto.com/2079212/1772797