From 3375a592d4e75fdd5b997b97085e7445d94f7db8 Mon Sep 17 00:00:00 2001 From: linfso Date: Tue, 23 Jul 2024 22:30:49 +0800 Subject: [PATCH] md --- .../web/emis/EmisSettleBillController.java | 88 ++++++++++++++---- .../emis/service/billexport/ExcelUtils.java | 6 +- .../service/impl/EmisSiteServiceImpl.java | 64 ++++++++----- emis-biz/src/main/resources/tpl/bill_tpl.xls | Bin 21504 -> 0 bytes emis-biz/src/main/resources/tpl/bill_tpl.xlsx | Bin 0 -> 10361 bytes 5 files changed, 113 insertions(+), 45 deletions(-) delete mode 100644 emis-biz/src/main/resources/tpl/bill_tpl.xls create mode 100644 emis-biz/src/main/resources/tpl/bill_tpl.xlsx diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java index db2da2ee0..a37e9a61a 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisSettleBillController.java @@ -14,12 +14,25 @@ package com.xdadan.erp.web.emis; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.io.resource.ResourceUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.util.MapUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.xdadan.erp.common.utils.DateUtils; +import com.xdadan.erp.common.utils.DictUtils; import com.xdadan.erp.emis.domain.EmisSettleSubBill; import com.xdadan.erp.emis.domain.EmisSettleSubBillFeeitem; import com.xdadan.erp.emis.domain.exception.EmisBizError; @@ -27,6 +40,8 @@ import com.xdadan.erp.emis.domain.vo.scan.ScanResult; import com.xdadan.erp.emis.service.EmisBaseService; import com.xdadan.erp.emis.service.billexport.ExcelUtils; import com.xdadan.erp.emis.service.billexport.MapObjectUtil; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.security.access.prepost.PreAuthorize; @@ -201,39 +216,72 @@ public class EmisSettleBillController extends BaseController @Log(title = "导出账单", businessType = BusinessType.EXPORT) @PostMapping("/exportBill") - public void exportBill(HttpServletResponse response, EmisSettleBill emisSettleBill) + public AjaxResult exportBill(HttpServletResponse response, EmisSettleBill emisSettleBill) { - -// bill.getSettleBillName()+".xls", - - try { EmisSettleBill bill=emisBaseService.getSettleBillBySettleBillNo(emisSettleBill.getSettleBillNo()); + if(bill==null){ + return AjaxResult.error("账单不存在"); + } - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("utf-8"); - String fileOutFileName = URLEncoder.encode(bill.getSettleBillName(), "UTF-8"); - response.setHeader("Content-disposition", "attachment;filename=" + fileOutFileName + ".xls"); - + // 获取子账单数据 List list = emisBaseService.selectSubBillListBySettleBillNo(emisSettleBill.getSettleBillNo()); + // 转换子账单为 MAP - List> listMap=MapObjectUtil.objListToMapList(list); + InputStream inputStream = ResourceUtil.getResourceObj("tpl/bill_tpl.xlsx").getStream(); - InputStream fis = new ClassPathResource("tpl/bill_tpl.xls").getInputStream(); + Map textMap = MapUtils.newHashMap(); + textMap.put("title", bill.getSettleBillName()); - Map map = MapUtils.newHashMap(); - map.put("name", "张三"); - map.put("number", 5.2); - EasyExcel.write(response.getOutputStream()).withTemplate(fis).sheet().doFill(map); -// ExcelUtils.exportToTemplate(response.getOutputStream(), fis, null, -// null, null, -// null); + ServletOutputStream outputStream = response.getOutputStream(); + + // 设置创建行的方式 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); +// FillConfig fillConfig2 = FillConfig.builder().forceNewRow(Boolean.FALSE).build(); + ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).build(); + // 写入到sheet + WriteSheet sheet0 = EasyExcel.writerSheet(0).build(); + excelWriter.fill(textMap, sheet0); + + List> listMap=new ArrayList<>(); + for(EmisSettleSubBill billItem:list){ + Map voMap = new HashMap<>(); + voMap.put("sendDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,billItem.getWaybillDetail().getSendDate())) ; + voMap.put("billCode",billItem.getBillCode()); + voMap.put("fjr",billItem.getWaybillDetail().getSendName()+"~"+billItem.getWaybillDetail().getReceiveName()); + voMap.put("kjlx",billItem.getWaybillDetail().getSendSiteName()+"--"+billItem.getWaybillDetail().getDispatchUnderlingSiteName()); + voMap.put("company",billItem.getWaybillDetail().getSendCompany()); + voMap.put("paymentType", DictUtils.getDictLabel("emis_payment_type",billItem.getWaybillDetail().getPaymentType())); + voMap.put("productTypeName", billItem.getWaybillDetail().getProductTypeName()); + voMap.put("parcelQty", billItem.getWaybillDetail().getParcelQty()); + voMap.put("settlementWeight", billItem.getWaybillDetail().getSettlementWeight()); + voMap.put("totalVolume", billItem.getWaybillDetail().getTotalVolume()); + voMap.put("freight", billItem.getWaybillDetail().getFreight()); + voMap.put("feeRemark", billItem.getWaybillDetail().getFeeRemark()); + listMap.add(voMap); + } + + // 填充 + logger.error("====>listMap===>{}",JSON.toJSONString(listMap)); + + excelWriter.fill(listMap, fillConfig, sheet0); + // 设置响应头信息 + String fileName = bill.getSettleBillName()+".xlsx"; + response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); + response.setContentType("application/octet-stream"); + //关流 + excelWriter.finish(); + IOUtils.closeQuietly(inputStream); + IOUtils.closeQuietly(outputStream); + + // 不输出 + return AjaxResult.success("成功"); } catch (IOException e) { e.printStackTrace(); + return AjaxResult.error("异常"); } - } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/billexport/ExcelUtils.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/billexport/ExcelUtils.java index ab03b957e..9450d7dbc 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/billexport/ExcelUtils.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/billexport/ExcelUtils.java @@ -166,15 +166,15 @@ public class ExcelUtils { try { - String templateFileName = "/Users/alan/Downloads/m1.xls"; - String fileName = "/Users/alan/Downloads/1.xls"; + String templateFileName = "/Users/alan/Downloads/bill_tpl.xlsx"; + String fileName = "/Users/alan/Downloads/2.xlsx"; // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 这里要注意 withTemplate 的模板文件会全量存储在内存里面,所以尽量不要用于追加文件,如果文件模板文件过大会OOM // 如果要再文件中追加(无法在一个线程里面处理,可以在一个线程的建议参照多次写入的demo) 建议临时存储到数据库 或者 磁盘缓存(ehcache) 然后再一次性写入 // EasyExcel.write(fileName, Map.class).withTemplate(templateFileName).sheet().doWrite(data()); Map map = MapUtils.newHashMap(); - map.put("name", "张三"); + map.put("title", "张三"); map.put("number", 5.2); EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSiteServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSiteServiceImpl.java index 408b85004..5f9780149 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSiteServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSiteServiceImpl.java @@ -88,33 +88,53 @@ public class EmisSiteServiceImpl extends EmisBaseService implements IEmisSiteSer try { - // 自动创建目的地 - EmisDestination emisDestination = new EmisDestination(); - emisDestination.setDestCode(emisSite.getSiteCode()); - emisDestination.setCountry(emisSite.getCountryCode()); - emisDestination.setDestName(emisSite.getSiteName()); - emisDestination.setDestNameEn(emisSite.getSiteNameEn()); - emisDestination.setStatus(1); - emisDestination.setSiteCode(emisSite.getSiteCode()); - emisDestination.setProvince(emisSite.getProvince()); - emisDestination.setCity(emisSite.getCity()); - emisDestination.setCounty(emisSite.getCounty()); - EmisRegion emisRegion = getRegionByCode(emisSite.getProvince()); - if (emisRegion != null) { - emisDestination.setCountryAreaId(emisRegion.getAreaId()); + EmisDestination oldDest=getDestinationByCode(emisSite.getSiteCode()); + if(oldDest!=null) { + // 自动创建目的地 + EmisDestination emisDestination = new EmisDestination(); + emisDestination.setDestCode(emisSite.getSiteCode()); + emisDestination.setCountry(emisSite.getCountryCode()); + emisDestination.setDestName(emisSite.getSiteName()); + emisDestination.setDestNameEn(emisSite.getSiteNameEn()); + emisDestination.setStatus(1); + emisDestination.setSiteCode(emisSite.getSiteCode()); + emisDestination.setProvince(emisSite.getProvince()); + emisDestination.setCity(emisSite.getCity()); + emisDestination.setCounty(emisSite.getCounty()); + + EmisRegion emisRegion = getRegionByCode(emisSite.getProvince()); + if (emisRegion != null) { + emisDestination.setCountryAreaId(emisRegion.getAreaId()); + } + + emisDestinationMapper.insertEmisDestination(emisDestination); + }else{ + oldDest.setDestCode(emisSite.getSiteCode()); + oldDest.setCountry(emisSite.getCountryCode()); + oldDest.setDestName(emisSite.getSiteName()); + oldDest.setDestNameEn(emisSite.getSiteNameEn()); + oldDest.setStatus(1); + oldDest.setSiteCode(emisSite.getSiteCode()); + oldDest.setProvince(emisSite.getProvince()); + oldDest.setCity(emisSite.getCity()); + oldDest.setCounty(emisSite.getCounty()); + emisDestinationMapper.updateEmisDestination(oldDest); } - emisDestinationMapper.insertEmisDestination(emisDestination); - // 自动创建网点账户 - EmisSiteAccount emisSiteAccount = new EmisSiteAccount(); - emisSiteAccount.setAccCode(emisSite.getSiteCode() + "001"); - emisSiteAccount.setSiteCode(emisSite.getSiteCode()); - emisSiteAccount.setCenterCode(emisSite.getParentSiteCode()); - emisSiteAccount.setStartDate(new Date()); + EmisSiteAccount oldSiteAccount=getSiteAccountBySiteCode(emisSite.getSiteCode()); + if(oldSiteAccount==null) { + EmisSiteAccount emisSiteAccount = new EmisSiteAccount(); + emisSiteAccount.setAccCode(emisSite.getSiteCode() + "001"); + emisSiteAccount.setSiteCode(emisSite.getSiteCode()); + emisSiteAccount.setCenterCode(emisSite.getParentSiteCode()); + emisSiteAccount.setStartDate(new Date()); - emisSiteAccountMapper.insertEmisSiteAccount(emisSiteAccount); + emisSiteAccountMapper.insertEmisSiteAccount(emisSiteAccount); + }else{ + // 不要新建 + } }catch(Exception ex){ ex.printStackTrace(); } diff --git a/emis-biz/src/main/resources/tpl/bill_tpl.xls b/emis-biz/src/main/resources/tpl/bill_tpl.xls deleted file mode 100644 index f7d22b02a4503ae8dbf038e6f49bd18a231bda96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21504 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 diff --git a/emis-biz/src/main/resources/tpl/bill_tpl.xlsx b/emis-biz/src/main/resources/tpl/bill_tpl.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b1405fd89d580d7fb6bcbcd26380b57f48ac1653 GIT binary patch literal 10361 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 T|GZhzpUT%@pX_u2&$#~smwOw) literal 0 HcmV?d00001