package com.yutu.base.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.yutu.base.entity.Response; import com.yutu.base.entity.Store; import com.yutu.base.entity.User; import com.yutu.base.utils.MyComparator; import jxl.CellView; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.write.*; import jxl.write.Number; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.File; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; @Service public class SaleDetailReportService extends BaseService { private Logger logger = Logger.getLogger("download"); public Map<String, String> createSaleDetailReport(Map<String, JSONArray> resultMap, String[] tableNames, String filePath, String requestId) { logger.info("开始解析数据"); long beginTime = System.currentTimeMillis(); JSONArray resultArr = resultMap.get("orderinfo"); List<String> tableNameList = Arrays.asList(tableNames); for (int k = 0; k < resultArr.size(); k++) { JSONObject orderInfoObj = resultArr.getJSONObject(k); String id = orderInfoObj.getString("id"); for (int t = 0; t < tableNameList.size(); t++) { JSONArray Arr = resultMap.get(tableNameList.get(t));//乘客信息表中匹配该订单 JSONArray array = new JSONArray(); for (int a = 0; a < Arr.size(); a++) { String orderId = ""; if ("ordervalueadded".equals(tableNames[t])) { orderId = Arr.getJSONObject(a).getString("orderId"); } else if ("orderpurchase".equals(tableNames[t])) { } else if ("transactiondetail_old".equals(tableNames[t])) { orderId = Arr.getJSONObject(a).getString("orderId"); } else { orderId = Arr.getJSONObject(a).getString("order_ID"); } if (id.equals(orderId)) { array.add(Arr.getJSONObject(a)); resultArr.getJSONObject(k).put(tableNames[t], array); } } } } JSONArray puchArr = resultMap.get("orderpurchase"); JSONArray transArr = resultMap.get("transactiondetail"); //去除采购信息的重复信息,并将orderId逗号分隔写入orderIds List<Integer> listRemove = new ArrayList<>(); for (int s = 0; s < puchArr.size(); s++) { JSONObject puchObj_out = puchArr.getJSONObject(s); String purchaseId_out = puchObj_out.getString("purchaseId"); String orderId_out = puchObj_out.getString("orderId"); String passengerIds_out = puchObj_out.getString("passengerIds"); String flightInfoIds_out = puchObj_out.getString("flightInfoIds"); for (int i = 0; i < puchArr.size(); i++) { if (i == s) continue; JSONObject puchObj_in = puchArr.getJSONObject(i); String purchaseId_in = puchObj_in.getString("purchaseId"); String orderId_in = puchObj_in.getString("orderId"); String passengerIds_in = puchObj_in.getString("passengerIds"); String flightInfoIds_in = puchObj_in.getString("flightInfoIds"); if (purchaseId_out.equals(purchaseId_in)) { listRemove.add(i); orderId_out += "," + orderId_in; passengerIds_out += "," + passengerIds_in; flightInfoIds_out += "," + flightInfoIds_in; passengerIds_out = removeDuplicateStr(passengerIds_out); flightInfoIds_out = removeDuplicateStr(flightInfoIds_out); puchObj_out.remove("orderId"); puchObj_out.remove("passengerIds"); puchObj_out.remove("flightInfoIds"); puchObj_in.remove("orderId"); puchObj_out.put("orderId", orderId_out); puchObj_out.put("passengerIds", passengerIds_out); puchObj_out.put("flightInfoIds", flightInfoIds_out); puchObj_in.put("orderId", ""); } } } List<Object> transList = Arrays.asList(transArr.toArray()); transList = removeDuplicateList(transList); JSONArray transConvert = new JSONArray(); for (Object obj : transList) { transConvert.add(obj); } puchArr = sortJsonArray(puchArr); Map<String, String> map = new HashMap<String, String>();//进行数据整合后的 Map map.put("orderpurchase", puchArr.toJSONString()); map.put("transactiondetail", transConvert.toJSONString()); map.put("other", resultArr.toJSONString()); logger.info("解析数据完毕,共用时:" + (System.currentTimeMillis() - beginTime) + " ms"); return map; } //去除Str重复 public String removeDuplicateStr(String str) { if (str == null || "".equals(str)) return str; List<String> strList = Arrays.asList(str.split(",", -1)); Set set = new HashSet(); List newList = new ArrayList(); for (Iterator iter = strList.iterator(); iter.hasNext(); ) { Object element = iter.next(); if (set.add(element)) newList.add(element); } str = ""; for (Object obj : newList) { str += "," + obj; } return str.substring(1); } //去除List重复 public List removeDuplicateList(List list) { Set set = new HashSet(); List newList = new ArrayList(); for (Iterator iter = list.iterator(); iter.hasNext(); ) { Object element = iter.next(); if (set.add(element)) newList.add(element); } return newList; } //jsonarray排序 public JSONArray sortJsonArray(JSONArray jsonArr) { //转成list List<JSONObject> list = new ArrayList<JSONObject>(); JSONObject jsonObj = null; for (int i = 0; i < jsonArr.size(); i++) { jsonObj = (JSONObject) jsonArr.get(i); list.add(jsonObj); } Collections.sort(list, new MyComparator()); jsonArr.clear(); for (int i = 0; i < list.size(); i++) { jsonObj = list.get(i); jsonArr.add(jsonObj); } //jsonArr排序 return jsonArr; } //生成销售明细报表 public String createExcel(Map<String, String> map, String filePath, String requestId) throws Exception { logger.info("开始生成报表"); List<User> userlist = getUsers(); List<Store> storelist = getStores(); File files = new File(filePath); if (!files.exists()) { files.mkdir(); } String file = filePath + new SimpleDateFormat("yyMMddHHmmss").format(new Date()) + ".xls"; WritableWorkbook workbook = Workbook.createWorkbook(new File(file)); DecimalFormat df = new DecimalFormat("######0.00"); String orderDetail = map.get("other"); String purchase = map.get("orderpurchase"); String transactiondetail = map.get("transactiondetail"); JSONArray orderArr = JSONArray.parseArray(orderDetail); JSONArray purchArr = JSONArray.parseArray(purchase); JSONArray transArr = JSONArray.parseArray(transactiondetail); try { WritableFont wf = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK); WritableFont wf_auto = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK); WritableCellFormat wcf_integer = new WritableCellFormat(wf_auto, NumberFormats.INTEGER); // 整数 WritableCellFormat wcf_float = new WritableCellFormat(wf_auto, NumberFormats.FLOAT); // 小数 //wcf_integer.setBackground(Colour.LIGHT_ORANGE); // 设置单元格的背景颜色(海洋蓝) wcf_integer.setAlignment(Alignment.CENTRE); // 设置对齐方式 //wcf_float.setBackground(Colour.LIGHT_ORANGE); // 设置单元格的背景颜色(海洋蓝) wcf_float.setAlignment(Alignment.CENTRE); // 设置对齐方式 WritableCellFormat wcf = new WritableCellFormat(wf); // 单元格定义 //wcf.setBackground(Colour.LIGHT_ORANGE); // 设置单元格的背景颜色(海洋蓝) wcf.setAlignment(Alignment.CENTRE); // 设置对齐方式 WritableCellFormat wcf1 = new WritableCellFormat(wf); // 单元格定义 //wcf1.setBackground(Colour.PALE_BLUE); // 设置单元格的背景颜色 (苍白之蓝) wcf1.setAlignment(Alignment.CENTRE); // 设置对齐方式 WritableCellFormat wcf2 = new WritableCellFormat(); wcf2.setAlignment(Alignment.CENTRE); // 设置对齐方式 wcf2.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); wcf2.setWrap(true); WritableSheet sheet = workbook.createSheet("First Sheet", 0);//创建新的一页 CellView cellView = new CellView(); cellView.setAutosize(true); //设置自动大小 cellView.setFormat(wcf1); CellView cellView_float = new CellView(); cellView.setAutosize(true); //设置自动大小 cellView.setFormat(wcf_float); sheet.setColumnView(0, cellView); sheet.setColumnView(1, cellView); sheet.setColumnView(2, cellView); sheet.setColumnView(3, cellView); sheet.setColumnView(4, cellView); sheet.setColumnView(5, cellView); sheet.setColumnView(6, cellView); sheet.setColumnView(7, cellView); sheet.setColumnView(8, cellView); sheet.setColumnView(9, cellView); sheet.setColumnView(10, cellView); sheet.setColumnView(11, cellView); sheet.setColumnView(12, cellView); sheet.setColumnView(13, cellView); sheet.setColumnView(14, cellView); sheet.setColumnView(15, cellView); sheet.setColumnView(16, cellView); sheet.setColumnView(17, cellView); sheet.setColumnView(18, cellView); sheet.setColumnView(19, cellView); sheet.setColumnView(20, cellView); sheet.setColumnView(21, cellView); sheet.setColumnView(22, cellView); sheet.setColumnView(23, cellView); sheet.setColumnView(24, cellView); sheet.setColumnView(25, cellView); sheet.setColumnView(26, cellView); sheet.setColumnView(27, cellView); sheet.setColumnView(28, cellView); sheet.setColumnView(29, cellView); sheet.setColumnView(30, cellView); sheet.setColumnView(31, cellView); sheet.setColumnView(32, cellView); sheet.setColumnView(33, cellView); sheet.setColumnView(34, cellView); sheet.setColumnView(35, cellView); sheet.setColumnView(36, cellView); sheet.setColumnView(37, cellView); sheet.setColumnView(38, cellView); sheet.getSettings().setDefaultColumnWidth(22);//设置默认宽度22px sheet.addCell(new Label(0, 0, "生单时间", wcf2)); sheet.addCell(new Label(1, 0, "出票时间", wcf2)); sheet.addCell(new Label(2, 0, "订单号", wcf2)); sheet.addCell(new Label(3, 0, "销售渠道", wcf2)); sheet.addCell(new Label(4, 0, "销售店铺", wcf2)); sheet.addCell(new Label(5, 0, "航线", wcf2)); sheet.addCell(new Label(6, 0, "起飞时间", wcf2)); sheet.addCell(new Label(7, 0, "航班号", wcf2)); sheet.addCell(new Label(8, 0, "行程类型", wcf2)); sheet.addCell(new Label(9, 0, "票号类型", wcf2)); sheet.addCell(new Label(10, 0, "编码", wcf2)); sheet.addCell(new Label(11, 0, "人数", wcf2)); sheet.addCell(new Label(12, 0, "销售—金额", wcf2)); sheet.addCell(new Label(13, 0, "行李总金额", wcf2)); sheet.addCell(new Label(14, 0, "采购积分", wcf2)); sheet.addCell(new Label(15, 0, "采购币种", wcf2)); sheet.addCell(new Label(16, 0, "采购金额(外)", wcf2)); sheet.addCell(new Label(17, 0, "采购金额(本)", wcf2)); sheet.addCell(new Label(18, 0, "支付明细(外)", wcf2)); sheet.addCell(new Label(19, 0, "支付明细(本)", wcf2)); sheet.addCell(new Label(20, 0, "支付方式", wcf2)); sheet.addCell(new Label(21, 0, "卡号", wcf2)); sheet.addCell(new Label(22, 0, "利润", wcf2)); sheet.addCell(new Label(23, 0, "交易流水号", wcf2)); sheet.addCell(new Label(24, 0, "辅营订单号", wcf2)); sheet.addCell(new Label(25, 0, "采购渠道", wcf2)); sheet.addCell(new Label(26, 0, "采购账户", wcf2)); sheet.addCell(new Label(27, 0, "采购订单号", wcf2)); sheet.addCell(new Label(28, 0, "政策类型", wcf2)); sheet.addCell(new Label(29, 0, "政策编码", wcf2)); sheet.addCell(new Label(30, 0, "订单状态", wcf2)); sheet.addCell(new Label(31, 0, "出票人", wcf2)); sheet.addCell(new Label(32, 0, "采购时间", wcf2)); sheet.addCell(new Label(33, 0, "附加产品", wcf2)); sheet.addCell(new Label(34, 0, "附加产品规格", wcf2)); sheet.addCell(new Label(35, 0, "备注", wcf2)); sheet.addCell(new Label(36, 0, "财务-回款状态", wcf2)); sheet.addCell(new Label(37, 0, "财务-实际支出金额", wcf2)); sheet.addCell(new Label(38, 0, "财务-补差", wcf2)); sheet.addCell(new Label(39, 0, "财务-外币调整日期", wcf2)); //遍历采购信息 int num = 1;//当前行 int count_transDetail = 0; int count_saleOrder = 0; String orderIdStr = ""; for (int k = 0; k < purchArr.size(); k++) { int mergeNum = 0;//合并行数 Double profit = 0.0;//利润 JSONObject purchObj = purchArr.getJSONObject(k); Integer deleted = purchObj.getInteger("deleted"); if (deleted != 0) {//已作废的采购信息跳过 continue; } String purchaseId = purchObj.getString("purchaseId");//采购id String saleOrderId = purchObj.getString("orderId");//销售id if ("".equals(saleOrderId) || saleOrderId == null) continue; String flightInfoIds = purchObj.getString("flightInfoIds");//航班id String passengerIds = purchObj.getString("passengerIds");//乘客id int flightSize = flightInfoIds.replace(",", "").length() / 36;//行程段数 int passengerSize = passengerIds.replace(",", "").length() / 36;//乘客人量 String route = purchObj.getString("routeType"); String orderTripType = "";//订单行程类型 String routeType = convertRouteType(route);//采购行程类型 String ticketType = convertRouteType(route);//票号类型 String points = purchObj.getString("points");//使用积分 String localCurrency = purchObj.getString("localCurrencyCode");//采购币种 String currency = purchObj.getString("currencyCode");//采购币种 String localTotalPrice = purchObj.getString("localTotalPrice");//外币金额 String purchaseTotalPrice = purchObj.getString("purchaseTotalPrice");//本币金额 String orderValuedAddedOrderNo = purchObj.getString("orderValuedAddedOrderNo");//增值服务单号 String purchaseChannel = purchObj.getString("purchaseChannel");//采购渠道 String purchaseAccount = purchObj.getString("purchaseAccount");//采购账户 String purchaseOrderNo = purchObj.getString("purchaseOrderNo");//采购订单号 String purchaseOperator = purchObj.getString("purchaseOperator");//出票人 String purchaseTime = purchObj.getString("purchaseTime");//出票时间 String remarkText = purchObj.getString("remarkText");//备注信息 String trueName = ""; if (userlist != null && userlist.size() > 0) { for (int tName = 0; tName < userlist.size(); tName++) { if (userlist.get(tName).getUserID().equals(purchaseOperator)) { trueName = userlist.get(tName).getUsername();//出票人真名 break; } } } String orderType = purchObj.getString("orderType"); orderType = convertOrderType(orderType); String owPolicyType = "";//政策类型 String rtPolicyType = "";//政策类型(返程) String owPolicyCode = ""; String rtPolicyCode = ""; List<String> policySourceArr = new ArrayList<String>(); sheet.addCell(new Number(14, num, Double.parseDouble(points), wcf2)); sheet.addCell(new Label(15, num, localCurrency, wcf2)); sheet.addCell(new Label(24, num, orderValuedAddedOrderNo, wcf2)); sheet.addCell(new Label(25, num, purchaseChannel, wcf2)); sheet.addCell(new Label(26, num, purchaseAccount, wcf2)); sheet.addCell(new Label(27, num, purchaseOrderNo, wcf2)); sheet.addCell(new Label(31, num, trueName, wcf2)); sheet.addCell(new Label(32, num, date_alt(purchaseTime), wcf2)); sheet.addCell(new Label(33, num, orderType, wcf2)); sheet.addCell(new Label(35, num, remarkText, wcf2)); sheet.addCell(new Number(16, num, Double.parseDouble(localTotalPrice), wcf2)); sheet.addCell(new Number(17, num, Double.parseDouble(purchaseTotalPrice), wcf2)); //反推销售单信息 count_saleOrder = 0; Double combinOrderTotalPrice = 0.0; String ORDERID = ""; String createTime = "";//采购时间 String ticketTime = "";//出票时间 String outerOrderNo = "";//外币订单号 Store store = new Store();//店铺信息 String flightLine = ""; String flightTime = ""; String flightNo = ""; String productType = "";//附加产品类型 String productDetail = "";//附加产品规格 String pnr = ""; String ticketNumber = ""; String status = ""; Double orderValuedPrice = 0.0; for (int j = 0; j < orderArr.size(); j++) { JSONObject orderObj = orderArr.getJSONObject(j); String orderId = orderObj.getString("iD"); // if(orderArr.size() == 1){ // ORDERID = orderId;//为合适以前的报表,此变量只在匹配交易信息时匹配orderid,因为历史问题导致purhaseId字段无用 // } if (saleOrderId.indexOf(orderId) > -1) {//匹配成功 ORDERID = orderId; count_saleOrder++; createTime = orderObj.getString("createTime"); createTime = date_alt(createTime); ticketTime = orderObj.getString("ticketTime"); ticketTime = date_alt(ticketTime); outerOrderNo = orderObj.getString("outerOrderNo"); String orderBelong = orderObj.getString("orderBelong"); if (storelist != null && storelist.size() > 0) { for (int tName = 0; tName < storelist.size(); tName++) { if (storelist.get(tName).getId().equals(orderBelong)) { store = storelist.get(tName); break; } } } String saleTotlalPrice = orderObj.getString("totalPrice"); int orderStatus = orderObj.getInteger("orderStatus");//订单状态 String policySource = orderObj.getString("policySource");//政策信息 status = convertOrderStatus(orderStatus); sheet.addCell(new Label(0, num + count_saleOrder - 1, createTime, wcf2)); sheet.addCell(new Label(1, num + count_saleOrder - 1, ticketTime, wcf2)); sheet.addCell(new Label(2, num + count_saleOrder - 1, outerOrderNo, wcf2)); sheet.addCell(new Label(3, num + count_saleOrder - 1, store.getChannelCode(), wcf2)); sheet.addCell(new Label(4, num + count_saleOrder - 1, store.getStoreShortName(), wcf2)); sheet.addCell(new Label(30, num + count_saleOrder - 1, status, wcf2)); //政策信息 if (policySource != null && !"".equals(policySource)) { policySourceArr = Arrays.asList(policySource.split("_", -1)); } if (policySourceArr.size() == 2) {// 去哪儿、同城、航管等 //单程 if ("0".equals(policySourceArr.get(0))) owPolicyType = "默认"; if ("1".equals(policySourceArr.get(0))) owPolicyType = "普通"; if ("2".equals(policySourceArr.get(0))) owPolicyType = "积分"; if ("3".equals(policySourceArr.get(0))) owPolicyType = "普通促销"; owPolicyCode = policySourceArr.get(1); sheet.addCell(new Label(28, num + count_saleOrder - 1, owPolicyType, wcf2));//转换后政策类型 sheet.addCell(new Label(29, num + count_saleOrder - 1, policySourceArr.get(1), wcf2));//转换后政策编码 } if (policySourceArr.size() == 4) {// 淘宝-->单程或者往返 其他平台-->往返 if ("0".equals(policySourceArr.get(0))) owPolicyType = "默认"; if ("1".equals(policySourceArr.get(0))) owPolicyType = "普通"; if ("2".equals(policySourceArr.get(0))) owPolicyType = "积分"; if ("3".equals(policySourceArr.get(0))) owPolicyType = "普通促销"; if ("0".equals(policySourceArr.get(2))) rtPolicyType = "默认"; if ("1".equals(policySourceArr.get(2))) rtPolicyType = "普通"; if ("2".equals(policySourceArr.get(2))) rtPolicyType = "积分"; if ("3".equals(policySourceArr.get(2))) rtPolicyType = "普通促销"; if ("".equals(policySourceArr.get(2)) && "".equals(policySourceArr.get(3))) { sheet.addCell(new Label(28, num + count_saleOrder - 1, owPolicyType, wcf2));//转换后政策类型 sheet.addCell(new Label(29, num + count_saleOrder - 1, policySourceArr.get(1), wcf2));//转换后政策编码 } else { sheet.addCell(new Label(28, num + count_saleOrder - 1, "去程:" + owPolicyType + "\r\n回程:" + rtPolicyType, wcf2));//转换后政策类型 sheet.addCell(new Label(29, num + count_saleOrder - 1, "去程:" + policySourceArr.get(1) + "\r\n回程:" + policySourceArr.get(3), wcf2));//转换后政策编码 owPolicyCode = "去程:" + owPolicyType + "\r\n回程:" + rtPolicyType; rtPolicyCode = "去程:" + policySourceArr.get(1) + "\r\n回程:" + policySourceArr.get(3); } } if (policySourceArr.size() >= 6) {// 最新更新后政策信息 if ("0".equals(policySourceArr.get(1))) owPolicyType = "默认"; if ("1".equals(policySourceArr.get(1))) owPolicyType = "普通"; if ("2".equals(policySourceArr.get(1))) owPolicyType = "积分"; if ("3".equals(policySourceArr.get(1))) owPolicyType = "普通促销"; if ("4".equals(policySourceArr.get(1))) owPolicyType = "官网押位"; if ("0".equals(policySourceArr.get(4))) rtPolicyType = "默认"; if ("1".equals(policySourceArr.get(4))) rtPolicyType = "普通"; if ("2".equals(policySourceArr.get(4))) rtPolicyType = "积分"; if ("3".equals(policySourceArr.get(4))) rtPolicyType = "普通促销"; if ("4".equals(policySourceArr.get(4))) rtPolicyType = "官网押位"; if ("".equals(policySourceArr.get(4))) { sheet.addCell(new Label(28, num + count_saleOrder - 1, owPolicyType, wcf2));//转换后政策类型 sheet.addCell(new Label(29, num + count_saleOrder - 1, policySourceArr.get(2), wcf2));//转换后政策编码 } else { sheet.addCell(new Label(28, num + count_saleOrder - 1, "去程:" + owPolicyType + "\r\n回程:" + rtPolicyType, wcf2));//转换后政策类型 sheet.addCell(new Label(29, num + count_saleOrder - 1, "去程:" + policySourceArr.get(2) + "\r\n回程:" + policySourceArr.get(5), wcf2));//转换后政策编码 owPolicyCode = "去程:" + owPolicyType + "\r\n回程:" + rtPolicyType; rtPolicyCode = "去程:" + policySourceArr.get(2) + "\r\n回程:" + policySourceArr.get(5); } } //写入附加产品规格 JSONArray ordervalueadded_info = orderObj.getJSONArray("ordervalueadded");//附加产品信息json if (!"".equals(ordervalueadded_info) && ordervalueadded_info != null) { for (int x = 0; x < ordervalueadded_info.size(); x++) { JSONObject ordervalueadded_data = ordervalueadded_info.getJSONObject(x); productType = ordervalueadded_data.getString("productType");//产品类型 String specifications = ordervalueadded_data.getString("specifications");//产品规格 String productUnit = ordervalueadded_data.getString("productUnit");//产品单位 String quantity = ordervalueadded_data.getString("quantity");//购买数量 String price = ordervalueadded_data.getString("price");//购买价格 String tripType = ordervalueadded_data.getString("tripType");//行程类型 String passengerName = ordervalueadded_data.getString("passengerName");//乘客姓名 if ("1".equals(productType)) { productType = "行李"; } else if ("2".equals(productType)) { productType = "值机"; } else if ("3".equals(productType)) { productType = "餐食"; } else if ("4".equals(productType)) { productType = "WIFI"; } if ("0".equals(tripType)) { tripType = "所有"; } else if ("1".equals(tripType)) { tripType = "单去程"; } else if ("2".equals(tripType)) { tripType = "单回程"; } // orderValuedPrice += Double.parseDouble(price)*Double.parseDouble(quantity); orderValuedPrice += Double.parseDouble(price); productDetail += ("[" + passengerName + "-规格:" + specifications + productUnit + ";数量:" + quantity + ";价格:" + price + ";行程:" + tripType + "];"); } } //销售金额 if (orderIdStr.indexOf(orderId) == -1) { orderIdStr += orderId; } else { saleTotlalPrice = "0"; orderValuedPrice = 0.0; } sheet.addCell(new Label(34, num + count_saleOrder - 1, productDetail, wcf2)); sheet.addCell(new Number(13, num + count_saleOrder - 1, orderValuedPrice, wcf2)); sheet.addCell(new Number(12, num + count_saleOrder - 1, Double.parseDouble(saleTotlalPrice), wcf2)); combinOrderTotalPrice += Double.parseDouble(saleTotlalPrice); //航班信息 JSONArray flightArr = orderObj.getJSONArray("orderflightinfo"); flightLine = ""; flightTime = ""; flightNo = ""; if (flightArr.size() == 1) orderTripType = "单程"; if (flightArr.size() == 2) orderTripType = "往返"; if (flightArr.size() == 3) orderTripType = "转机"; for (int fli = 0; fli < flightArr.size(); fli++) { JSONObject flightObject = flightArr.getJSONObject(fli); String flightId = flightObject.getString("iD"); if (flightSize == 1) { if (flightInfoIds.indexOf(flightId) > -1) { flightLine = flightObject.getString("org") + "-" + flightObject.getString("dst"); flightTime = flightObject.getString("flightTime"); flightNo = flightObject.getString("flightNo"); } } else { if (flightInfoIds.indexOf(flightId) > -1) { flightLine += flightObject.getString("org") + "-" + flightObject.getString("dst") + "\r\n"; flightTime += flightObject.getString("flightTime"); flightNo += flightObject.getString("flightNo"); } } } sheet.addCell(new Label(5, num + count_saleOrder - 1, flightLine, wcf2)); sheet.addCell(new Label(6, num + count_saleOrder - 1, date_alt(String.valueOf(flightTime)), wcf2)); sheet.addCell(new Label(7, num + count_saleOrder - 1, flightNo, wcf2)); sheet.addCell(new Label(8, num + count_saleOrder - 1, orderTripType, wcf2)); sheet.addCell(new Label(9, num + count_saleOrder - 1, ticketType, wcf2)); //乘客信息 JSONArray passengerArr = orderObj.getJSONArray("orderpassenger"); for (int pass = 0; pass < passengerArr.size(); pass++) { JSONObject passengerObj = passengerArr.getJSONObject(pass); String passengerId = passengerObj.getString("iD"); if (passengerIds.indexOf(passengerId) > -1) { pnr = passengerObj.getString("pnr"); ticketNumber = passengerObj.getString("ticketNumber"); } } if (pnr.indexOf("/") > -1) { if ("去程".equals(routeType) || "往返".equals(routeType)) { pnr = pnr.substring(0, pnr.indexOf("/")); } else { pnr = pnr.substring(pnr.indexOf("/") + 1); } } sheet.addCell(new Label(10, num, pnr, wcf2)); sheet.addCell(new Number(11, num, passengerSize, wcf2)); } } //写入利润 profit = combinOrderTotalPrice - Double.parseDouble(purchaseTotalPrice) + orderValuedPrice; sheet.addCell(new Number(22, num, profit, wcf2)); //正推交易流水 count_transDetail = 0; String purchaseId_trans = ""; String orderId_trans = ""; String accountId = ""; String cardNumber = ""; String transactionNumber = ""; String localPrice = ""; String rmbPrice = ""; if (transArr.size() > 0) { for (int m = 0; m < transArr.size(); m++) { JSONObject transObj = transArr.getJSONObject(m); String transId = transObj.getString("id"); purchaseId_trans = transObj.getString("purchaseId"); orderId_trans = transObj.getString("orderId"); accountId = transObj.getString("accountId"); cardNumber = transObj.getString("cardNumber"); transactionNumber = transObj.getString("transactionNumber"); localPrice = transObj.getString("localPrice"); rmbPrice = transObj.getString("rmbPrice"); if (purchaseId.equals(purchaseId_trans)) { count_transDetail++; sheet.addCell(new Label(20, num + count_transDetail - 1, accountId, wcf2)); sheet.addCell(new Label(21, num + count_transDetail - 1, cardNumber, wcf2)); sheet.addCell(new Label(23, num + count_transDetail - 1, transactionNumber, wcf2)); sheet.addCell(new Number(18, num + count_transDetail - 1, Double.parseDouble(localPrice), wcf2)); sheet.addCell(new Number(19, num + count_transDetail - 1, Double.parseDouble(rmbPrice), wcf2)); } else { //以前的报表导出的订单 for (int ord = 0; ord < orderArr.size(); ord++) { JSONObject orderInfo = orderArr.getJSONObject(ord); JSONArray transcationDetail_old = orderInfo.getJSONArray("transactiondetail_old"); if (transcationDetail_old != null && !"".equals(transcationDetail_old)) { for (int tra = 0; tra < transcationDetail_old.size(); tra++) { JSONObject traObj = transcationDetail_old.getJSONObject(tra); orderId_trans = traObj.getString("orderId"); accountId = traObj.getString("accountId"); cardNumber = traObj.getString("cardNumber"); transactionNumber = traObj.getString("transactionNumber"); localPrice = traObj.getString("localPrice"); rmbPrice = traObj.getString("rmbPrice"); if (ORDERID.equals(orderId_trans)) { count_transDetail++; sheet.addCell(new Label(20, num + count_transDetail - 1, accountId, wcf2)); sheet.addCell(new Label(21, num + count_transDetail - 1, cardNumber, wcf2)); sheet.addCell(new Label(23, num + count_transDetail - 1, transactionNumber, wcf2)); sheet.addCell(new Number(18, num + count_transDetail - 1, Double.parseDouble(localPrice), wcf2)); sheet.addCell(new Number(19, num + count_transDetail - 1, Double.parseDouble(rmbPrice), wcf2)); } } } } } } } else { //以前的报表导出的订单 for (int ord = 0; ord < orderArr.size(); ord++) { JSONObject orderInfo = orderArr.getJSONObject(ord); JSONArray transcationDetail_old = orderInfo.getJSONArray("transactiondetail_old"); if (transcationDetail_old != null && !"".equals(transcationDetail_old)) { if (transcationDetail_old.size() > 0) { for (int tra = 0; tra < transcationDetail_old.size(); tra++) { JSONObject traObj = transcationDetail_old.getJSONObject(tra); orderId_trans = traObj.getString("orderId"); accountId = traObj.getString("accountId"); cardNumber = traObj.getString("cardNumber"); transactionNumber = traObj.getString("transactionNumber"); localPrice = traObj.getString("localPrice"); rmbPrice = traObj.getString("rmbPrice"); if (ORDERID.equals(orderId_trans)) { count_transDetail++; sheet.addCell(new Label(20, num + count_transDetail - 1, accountId, wcf2)); sheet.addCell(new Label(21, num + count_transDetail - 1, cardNumber, wcf2)); sheet.addCell(new Label(23, num + count_transDetail - 1, transactionNumber, wcf2)); sheet.addCell(new Number(18, num + count_transDetail - 1, Double.parseDouble(localPrice), wcf2)); sheet.addCell(new Number(19, num + count_transDetail - 1, Double.parseDouble(rmbPrice), wcf2)); break; } } } } } } int D_value = 0; D_value = Math.abs(count_saleOrder - count_transDetail); mergeNum = count_saleOrder > count_transDetail ? count_saleOrder : count_transDetail; //销售单对支付信息 一对多,多余的行填充重复的销售单信息 if (count_saleOrder == 1 && count_transDetail > 1) { for (int repeat = 0; repeat < (count_transDetail - count_saleOrder); repeat++) { sheet.addCell(new Label(0, num + repeat + 1, createTime, wcf2)); sheet.addCell(new Label(1, num + repeat + 1, ticketTime, wcf2)); sheet.addCell(new Label(2, num + repeat + 1, outerOrderNo, wcf2)); sheet.addCell(new Label(3, num + repeat + 1, store.getChannelCode(), wcf2)); sheet.addCell(new Label(4, num + repeat + 1, store.getStoreShortName(), wcf2)); sheet.addCell(new Label(5, num + repeat + 1, flightLine, wcf2)); sheet.addCell(new Label(6, num + repeat + 1, date_alt(String.valueOf(flightTime)), wcf2)); sheet.addCell(new Label(7, num + repeat + 1, flightNo, wcf2)); sheet.addCell(new Label(8, num + repeat + 1, orderTripType, wcf2)); sheet.addCell(new Label(9, num + repeat + 1, ticketType, wcf2)); sheet.addCell(new Label(10, num + repeat + 1, pnr, wcf2)); // sheet.addCell(new Label(27,num + repeat +1 ,owPolicyCode,wcf2)); // sheet.addCell(new Label(28,num + repeat +1 ,rtPolicyCode,wcf2)); // sheet.addCell(new Label(29,num + repeat +1 ,status,wcf2)); // sheet.addCell(new Label(30,num + repeat +1 ,trueName,wcf2)); } sheet.mergeCells(12, num, 12, num + mergeNum - 1);//合并订单金额 } //合并采购信息 sheet.mergeCells(11, num, 11, num + mergeNum - 1); sheet.mergeCells(14, num, 14, num + mergeNum - 1); sheet.mergeCells(15, num, 15, num + mergeNum - 1); sheet.mergeCells(16, num, 16, num + mergeNum - 1); sheet.mergeCells(17, num, 17, num + mergeNum - 1); sheet.mergeCells(22, num, 22, num + mergeNum - 1); sheet.mergeCells(24, num, 24, num + mergeNum - 1); sheet.mergeCells(25, num, 25, num + mergeNum - 1); sheet.mergeCells(26, num, 26, num + mergeNum - 1); sheet.mergeCells(27, num, 27, num + mergeNum - 1); //sheet.mergeCells(31,num,31,num+mergeNum-1); sheet.mergeCells(33, num, 33, num + mergeNum - 1); sheet.mergeCells(35, num, 35, num + mergeNum - 1); //合并销售单信息 if (count_saleOrder < count_transDetail && D_value > 0) { // sheet.mergeCells(0,num+count_saleOrder-1,0,num+D_value); // sheet.mergeCells(1,num+count_saleOrder-1,1,num+D_value); // sheet.mergeCells(2,num+count_saleOrder-1,2,num+D_value); // sheet.mergeCells(3,num+count_saleOrder-1,3,num+D_value); // sheet.mergeCells(4,num+count_saleOrder-1,4,num+D_value); // sheet.mergeCells(5,num+count_saleOrder-1,5,num+D_value); // sheet.mergeCells(6,num+count_saleOrder-1,6,num+D_value); // sheet.mergeCells(7,num+count_saleOrder-1,7,num+D_value); // sheet.mergeCells(8,num+count_saleOrder-1,8,num+D_value); // sheet.mergeCells(9,num+count_saleOrder-1,9,num+D_value); // sheet.mergeCells(12,num+count_saleOrder-1,12,num+D_value); // sheet.mergeCells(30,num+count_saleOrder-1,29,num+D_value); } num += mergeNum; } logger.info("生成销售明细报表成功!"); //生成完毕后,将响应结果存入消息队列 // Response response = new Response(); // response.setData(file); // response.setStatus(Response.Status.SUCCEED); // response.setErrorMessage(requestId); // String responseUrl = overseasCheetahUrl + "receive/saleReportResponse.do"; // MessageQueueController.setResponseMessageQueue(responseUrl,response); } catch (Exception e) { e.printStackTrace(); logger.error("导出Execl异常", e); } finally { workbook.write(); workbook.close(); } return file; } /** * 将毫秒数转化为日期格式 * * @param timeMs 传入毫秒数 * @return */ public String date_s(String timeMs) { // long time=Long.parseLong(timeMs); // Date date=new Date(time); // SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // return sdf.format(date).toString(); return timeMs; } public String date_alt(String timeMs) { try { long time = Long.parseLong(timeMs); Date date = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); return sdf.format(date); } catch (Exception e) { } return timeMs; } public String OperName(String userId) { String TrueName = ""; List<User> list = new ArrayList<>(); for (int n = 0; n < list.size(); n++) { if (list.get(n).getUserID().equals(userId)) { TrueName = list.get(n).getName(); } } return TrueName; } //订单状态转换 public String convertOrderStatus(int orderStatus) { String status = ""; switch (orderStatus) { case 0: status = "未支付"; break; case 2: status = "等待出票"; break; case 3: status = "出票中"; break; case 4: status = "已出票"; break; case 5: status = "出票失败"; break; default: status = ""; break; } return status; } public String convertRouteType(String key) { switch (key) { case "OW": key = "去程"; break; case "RT": key = "回程"; break; case "OWRT": key = "往返"; break; default: key = ""; break; } return key; } public String convertTripType(String key) { switch (key) { case "OW": key = "单程"; break; case "RT": key = "单程"; break; case "OWRT": key = "往返"; break; default: key = ""; break; } return key; } public String convertOrderType(String key) { switch (key) { case "ticket": key = ""; break; case "luggage": key = "行李"; break; case "food": key = "餐食"; break; case "checkin": key = "值机"; break; default: key = ""; break; } return key; } }