标签: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