diff --git a/.idea/libraries/Maven__com_deepoove_poi_ooxml_schemas_extra_4_1_5.xml b/.idea/libraries/Maven__com_deepoove_poi_ooxml_schemas_extra_4_1_5.xml new file mode 100644 index 000000000..4d49a1a2a --- /dev/null +++ b/.idea/libraries/Maven__com_deepoove_poi_ooxml_schemas_extra_4_1_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_deepoove_poi_tl_1_12_0.xml b/.idea/libraries/Maven__com_deepoove_poi_tl_1_10_6.xml similarity index 65% rename from .idea/libraries/Maven__com_deepoove_poi_tl_1_12_0.xml rename to .idea/libraries/Maven__com_deepoove_poi_tl_1_10_6.xml index 46d27cf2e..bfeb49340 100644 --- a/.idea/libraries/Maven__com_deepoove_poi_tl_1_12_0.xml +++ b/.idea/libraries/Maven__com_deepoove_poi_tl_1_10_6.xml @@ -1,13 +1,13 @@ - + - + - + - + \ No newline at end of file diff --git a/.idea/libraries/Maven__xalan_serializer_2_7_2.xml b/.idea/libraries/Maven__xalan_serializer_2_7_2.xml new file mode 100644 index 000000000..8fd4cc955 --- /dev/null +++ b/.idea/libraries/Maven__xalan_serializer_2_7_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__xalan_xalan_2_7_2.xml b/.idea/libraries/Maven__xalan_xalan_2_7_2.xml new file mode 100644 index 000000000..c806972a1 --- /dev/null +++ b/.idea/libraries/Maven__xalan_xalan_2_7_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/emis-biz-web/emis-biz-web.iml b/emis-biz-web/emis-biz-web.iml index ffe94dde5..2b4f5d82d 100644 --- a/emis-biz-web/emis-biz-web.iml +++ b/emis-biz-web/emis-biz-web.iml @@ -113,10 +113,6 @@ - - - - @@ -271,7 +267,12 @@ - + + + + + + @@ -283,6 +284,8 @@ + + diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java index 24e976821..f375e2cf3 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWaybillController.java @@ -11,7 +11,9 @@ package com.xdadan.erp.web.emis; +import java.awt.image.BufferedImage; import java.io.*; +import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.*; import javax.servlet.http.HttpServletRequest; @@ -23,15 +25,18 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.data.PictureType; +import com.deepoove.poi.data.Pictures; import com.xdadan.erp.common.annotation.filter.jackson.JacksonFilter; import com.xdadan.erp.common.config.PayConfig; import com.xdadan.erp.common.core.domain.entity.SysUser; +import com.xdadan.erp.common.utils.BarcodeUtils; import com.xdadan.erp.common.utils.DateUtils; import com.xdadan.erp.common.utils.file.FileUtils; import com.xdadan.erp.common.utils.idgen.UUID; -import com.xdadan.erp.emis.domain.EmisBrand; -import com.xdadan.erp.emis.domain.EmisCountry; -import com.xdadan.erp.emis.domain.EmisTmsScanRecord; +import com.xdadan.erp.emis.domain.*; +import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; +import com.xdadan.erp.emis.domain.enumtype.OrderStatus; import com.xdadan.erp.emis.domain.enumtype.ScanType; import com.xdadan.erp.emis.domain.enumtype.WaybillStatus; import com.xdadan.erp.emis.domain.exception.EmisBizError; @@ -65,8 +70,6 @@ import com.xdadan.erp.common.core.domain.AjaxResult; import com.xdadan.erp.common.core.page.TableDataInfo; import com.xdadan.erp.common.enums.BusinessType; -import com.xdadan.erp.emis.domain.EmisWaybill; - /** * 运单列表Controller * @@ -233,31 +236,28 @@ public class EmisWaybillController extends EmisBaseController /** * 导出进仓单模板 * @param response - * @param inNo * @return */ @Log(title = "导出进仓单", businessType = BusinessType.EXPORT) @PostMapping("/exportWarehouseInTpl") - public void exportWarehouseInTpl(HttpServletResponse response,String inNo) { + public AjaxResult exportWarehouseInTpl(HttpServletResponse response,WaybillOrder waybillOrder) { try{ - Map tempMap = new HashMap<>(); - tempMap.put("name", "模版"); - tempMap.put("age", 134); - OutputStream outputStream=response.getOutputStream(); - InputStream fis = new ClassPathResource("tpl/ws_in_tpl.docx").getInputStream(); - /*1.根据模板生成文档*/ - XWPFTemplate template = XWPFTemplate.compile(fis).render(tempMap); - response.setContentType("application/octet-stream"); - response.setHeader("Content-Disposition", "attachment;fileName="+ inNo +".docx"); - response.flushBuffer(); - template.write(response.getOutputStream()); - - IOUtils.closeQuietly(fis); - IOUtils.closeQuietly(outputStream); - - }catch (Exception ex){ + emisWaybillService.genWarehouseInTplFile(response,waybillOrder.getOrderSn()); + return AjaxResult.success("下载成功"); + } + catch(EmisBizError ex){ ex.printStackTrace(); + return AjaxResult.error("("+ex.getErrorCode()+")"+ex.getMessage()); + } + catch (Exception ex){ + ex.printStackTrace(); + // 返回子定义异常 + if(ex instanceof EmisBizError){ + return AjaxResult.error(ex.getMessage(),((EmisBizError)ex).getErrorCode()); + } + + return AjaxResult.error("服务器异常,联系客服"); } } diff --git a/emis-biz/emis-biz.iml b/emis-biz/emis-biz.iml index b7343c0ef..4e9707fa2 100644 --- a/emis-biz/emis-biz.iml +++ b/emis-biz/emis-biz.iml @@ -66,10 +66,6 @@ - - - - @@ -230,7 +226,12 @@ - + + + + + + @@ -242,6 +243,8 @@ + + diff --git a/emis-biz/pom.xml b/emis-biz/pom.xml index e997f8c85..edd4db03c 100644 --- a/emis-biz/pom.xml +++ b/emis-biz/pom.xml @@ -127,18 +127,6 @@ 1.10.6 - - - - - - - - - - - - diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java index b44ffb5eb..b26c1c442 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisWaybillService.java @@ -9,6 +9,8 @@ */ package com.xdadan.erp.emis.service; +import java.io.IOException; +import java.io.OutputStream; import java.util.List; import java.util.Map; @@ -17,6 +19,8 @@ import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.domain.vo.AddressParseResult; import com.xdadan.erp.emis.domain.vo.WaybillOrder; +import javax.servlet.http.HttpServletResponse; + /** * @ClassName EmisWaybillService * @Description 运单列表 @@ -189,5 +193,6 @@ public interface IEmisWaybillService public List selectPrintWaybillList(EmisWaybill emisWaybill); + public void genWarehouseInTplFile(HttpServletResponse response, String orderSn) throws EmisBizError, IOException ; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java index 3082c4b69..a2573f902 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java @@ -10,7 +10,12 @@ package com.xdadan.erp.emis.service.impl; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.math.BigDecimal; +import java.net.URLEncoder; import java.text.DecimalFormat; import java.util.*; @@ -18,12 +23,18 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONObject; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.data.PictureType; +import com.deepoove.poi.data.Pictures; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import com.fasterxml.jackson.annotation.JsonFormat; import com.googlecode.aviator.AviatorEvaluator; import com.xdadan.erp.common.annotation.audit.DataAuditFilter; import com.xdadan.erp.common.core.domain.AjaxResult; import com.xdadan.erp.common.core.domain.entity.SysUser; import com.xdadan.erp.common.core.redis.RedissonService; +import com.xdadan.erp.common.utils.BarcodeUtils; import com.xdadan.erp.common.utils.DateUtils; import com.xdadan.erp.common.utils.DictUtils; import com.xdadan.erp.common.utils.SecurityUtils; @@ -35,14 +46,19 @@ import com.xdadan.erp.emis.domain.vo.scan.ScanInfo; import com.xdadan.erp.emis.mapper.*; import com.xdadan.erp.emis.service.*; import com.xdadan.erp.emis.utils.WaybillHelper; +import com.xdadan.erp.emis.utils.sensitive.Convert; import com.xdadan.erp.system.service.ISysUserService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import javax.servlet.http.HttpServletResponse; + /** * 运单列表Service业务层处理 * @@ -2196,6 +2212,129 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb return emisWaybillMapper.selectPrintWaybillList(emisWaybill); } + @Override + public void genWarehouseInTplFile(HttpServletResponse response, String orderSn) throws EmisBizError, IOException { + + if(StringUtils.isEmpty(orderSn)){ + throw new EmisBizError(EmisBizErrorType.NOT_EXISTS,"订单号为空"); + } + + EmisWaybill emisWaybillOld = this.selectEmisWaybillByOrderSn(orderSn); + if(emisWaybillOld==null){ + throw new EmisBizError(EmisBizErrorType.NOT_EXISTS,"订单不存在"); + } + + if(OrderStatus.CANCEL.statusCode.equals(emisWaybillOld.getOrderStatus())){ + throw new EmisBizError(EmisBizErrorType.FAIL,"订单已取消"); + } + + + if(!"1".equals(emisWaybillOld.getPickupMethod())){ + throw new EmisBizError(EmisBizErrorType.FAIL,"取件方式非仓库收货"); + } + + if(StringUtils.isEmpty(emisWaybillOld.getIntoWarehouseBillCode())){ + throw new EmisBizError(EmisBizErrorType.NOT_EXISTS,"进仓预报单号为空"); + } + + // 根据不同线路使用不同模版 + String tplName="tpl/ws_ls_in_tpl.docx"; + EmisTransLine emisTransLine = getTransLineByCode(emisWaybillOld.getTransLineType()); + // 快递 + if("1".equals(emisTransLine.getTransType()) ){ + tplName="tpl/ws_ls_in_tpl.docx"; + } + // 空运 + else if("2".equals(emisTransLine.getTransType()) ){ + tplName="tpl/ws_air_in_tpl.docx"; + } + // 陆运 + else if("3".equals(emisTransLine.getTransType()) ){ + tplName="tpl/ws_ls_in_tpl.docx"; + } + // 海运 + else if("4".equals(emisTransLine.getTransType()) ){ + tplName="tpl/ws_ls_in_tpl.docx"; + } + // 铁路 + else if("4".equals(emisTransLine.getTransType()) ){ + tplName="tpl/ws_ls_in_tpl.docx"; + } + + OutputStream outputStream=response.getOutputStream(); + InputStream fis = new ClassPathResource(tplName).getInputStream(); + /*1.根据模板生成文档*/ + String fileName= URLEncoder.encode(emisWaybillOld.getIntoWarehouseBillCode(),"UTF-8"); + + + // 货物清单 + EmisWaybillCargo queryCargo = new EmisWaybillCargo(); + queryCargo.setWaybillId(emisWaybillOld.getId()); + List cargoList=emisWaybillCargoMapper.selectEmisWaybillCargoList(queryCargo); + + + // 生成条码 + int width=350; + int height=40; + BufferedImage barcodeImageBuffer = BarcodeUtils.getBarCodeWithWord(emisWaybillOld.getIntoWarehouseBillCode(),width,height,70); + + // 填充模版数据 + LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); + Configure config = Configure.builder().bind("cargoList", policy).build(); + + String customsEclaration=""; + if(!StringUtils.isEmpty(emisWaybillOld.getCustomsEclaration())){ + customsEclaration=DictUtils.getDictLabel("emis_declare_mode",emisWaybillOld.getCustomsEclaration()); + } + + String customsClear=""; + if(!StringUtils.isEmpty(emisWaybillOld.getCustomsClear())){ + customsClear=DictUtils.getDictLabel("emis_customs_clear",emisWaybillOld.getCustomsClear()); + } + + Map fillMap = new HashMap<>(); + fillMap.put("wsInNo", emisWaybillOld.getIntoWarehouseBillCode()); + fillMap.put("country", emisWaybillOld.getReceiveCountryName()); + fillMap.put("warehouse", emisWaybillOld.getIntoWarehouseName()); + fillMap.put("productName", emisWaybillOld.getProductTypeName()); + fillMap.put("estDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,emisWaybillOld.getPickStartDate()==null?emisWaybillOld.getOrderDate():emisWaybillOld.getPickStartDate())); + fillMap.put("declareType", customsEclaration); + fillMap.put("eDeclareType", customsClear); + fillMap.put("supplier", ""); + + fillMap.put("sendName", Convert.chineseName(emisWaybillOld.getSendName())); + fillMap.put("sendTel", Convert.mobile(emisWaybillOld.getSendMobile())); + fillMap.put("sendAddress", Convert.address(emisWaybillOld.getSendAddress())); + fillMap.put("sendCompany", emisWaybillOld.getSendCompany()); + + fillMap.put("recvName", Convert.chineseName(emisWaybillOld.getReceiveName())); + fillMap.put("recvTel", Convert.mobile(emisWaybillOld.getReceiveMobile())); + fillMap.put("recvAddress", Convert.address(emisWaybillOld.getReceiveAddress())); + fillMap.put("recvCompany", emisWaybillOld.getReceiveCompany()); + + fillMap.put("wsContact", emisWaybillOld.getIntoWarehouseContact()); + fillMap.put("wsPhone", emisWaybillOld.getIntoWarehousePhone()); + fillMap.put("wsAddress", emisWaybillOld.getIntoWarehouseAddress()); + fillMap.put("salesmen", emisWaybillOld.getSalesmen()); + + fillMap.put("barcode", Pictures.ofBufferedImage(barcodeImageBuffer, PictureType.JPEG).size(width, height).create()); + + fillMap.put("cargoList", emisWaybillOld.getCargoList()); + + // 生成模版 + XWPFTemplate template = XWPFTemplate.compile(fis,config).render(fillMap); + + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;fileName="+ fileName +".docx"); + response.flushBuffer(); + template.write(response.getOutputStream()); + + IOUtils.closeQuietly(fis); + IOUtils.closeQuietly(outputStream); + + } + + public static void main(String[] args) { diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/warehouse/WordTplUtils.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/warehouse/WordTplUtils.java index 51bc102d3..f81cdfe46 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/warehouse/WordTplUtils.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/warehouse/WordTplUtils.java @@ -1,33 +1,175 @@ package com.xdadan.erp.emis.service.warehouse; import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.data.Numberings; +import com.deepoove.poi.data.PictureType; +import com.deepoove.poi.data.Pictures; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; +import com.xdadan.erp.common.utils.BarcodeUtils; +import com.xdadan.erp.emis.domain.EmisWaybill; +import com.xdadan.erp.emis.domain.vo.Cargo; import org.apache.http.HttpResponse; +import org.springframework.core.io.ClassPathResource; +import java.awt.image.BufferedImage; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.math.BigDecimal; 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; public class WordTplUtils { - public void genWord(OutputStream out, String tplFile, Map fillMap) throws IOException { - // 数据转换 - // 文件名称 -// String fileName = URLEncoder.encode("文件名称", StandardCharsets.UTF_8.name()); - // 指示响应内容的格式 + public void genWord(OutputStream out, EmisWaybill waybill) throws IOException { -// response.setContentType("application/octet-stream"); -// response.setCharacterEncoding("utf-8"); -// response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx"); -//​ - XWPFTemplate template = XWPFTemplate.compile(tplFile); +// XWPFTemplate template = XWPFTemplate.compile(tplFile); +// // 数据填充 +// template.render(fillMap); +// template.write(out); +// out.flush(); + + try { + int width=350; + int height=40; + + BufferedImage barcodeImageBuffer = BarcodeUtils.getBarCodeWithWord("TAN-SHJD-24072701",width,height,70); + + List cargoList= new ArrayList<>(); + + Cargo cargo=new Cargo(); + cargo.setGoodsName("测试"); + cargo.setCargoQty(1); + cargo.setWeight(BigDecimal.valueOf(1.2D)); + cargo.setWeight(BigDecimal.valueOf(1.2D)); + cargo.setLength(BigDecimal.valueOf(1.2D)); + cargo.setWidth(BigDecimal.valueOf(1.2D)); + cargo.setHeight(BigDecimal.valueOf(1.2D)); + cargoList.add(cargo); + + + LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); + + Configure config = Configure.builder() + .bind("cargoList", policy).build(); + + + InputStream fis = new ClassPathResource("tpl/ws_in_tpl.docx").getInputStream(); + XWPFTemplate template = XWPFTemplate.compile("/Users/alan/Downloads/ws_air_in_tpl.docx",config).render( + new HashMap(){{ + put("wsInNo", "TAN-SHJD-24072701"); + put("country", "越南"); + put("warehouse", "柯桥"); + put("productName", "探路特快"); + put("estDate", "2024-07-22"); + put("declareType", "快递报关"); + put("eDeclareType", "快递清关"); + + put("supplier", "供应商"); + + put("sendName", "发件人"); + put("sendTel", "发件电话"); + put("sendAddress", "发件地址"); + put("sendCompany", "发件公司"); + + put("recvName", "收件人"); + put("recvTel", "收件电话"); + put("recvAddress", "收件地址"); + put("recvCompany", "收件公司"); + + put("wsContact", "易大伟"); + put("wsPhone", "123"); + put("wsAddress", "南京机场"); + put("payee", "李晓虎"); + + put("barcode", Pictures.ofBufferedImage(barcodeImageBuffer, PictureType.JPEG) + .size(width, height).create()); + + put("cargoList", cargoList); + }}); + + + + template.writeAndClose(new FileOutputStream("/Users/alan/Downloads/1.docx")); + } catch (IOException e) { + e.printStackTrace(); + } -// XWPFTemplate template = getTemplate(filePath)) { - // 数据填充 - template.render(fillMap); - template.write(out); - out.flush(); } + + public static void main(String[] args) { + + try { + int width=350; + int height=40; + + BufferedImage barcodeImageBuffer = BarcodeUtils.getBarCodeWithWord("TAN-SHJD-24072701",width,height,70); + + List cargoList= new ArrayList<>(); + + Cargo cargo=new Cargo(); + cargo.setGoodsName("测试"); + cargo.setCargoQty(1); + cargo.setWeight(BigDecimal.valueOf(1.2D)); + cargo.setWeight(BigDecimal.valueOf(1.2D)); + cargo.setLength(BigDecimal.valueOf(1.2D)); + cargo.setWidth(BigDecimal.valueOf(1.2D)); + cargo.setHeight(BigDecimal.valueOf(1.2D)); + cargoList.add(cargo); + + + LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); + + Configure config = Configure.builder() + .bind("cargoList", policy).build(); + + + + XWPFTemplate template = XWPFTemplate.compile("/Users/alan/Downloads/ws_air_in_tpl.docx",config).render( + new HashMap(){{ + put("wsInNo", "TAN-SHJD-24072701"); + put("country", "越南"); + put("warehouse", "柯桥"); + put("productName", "探路特快"); + put("estDate", "2024-07-22"); + put("declareType", "快递报关"); + put("eDeclareType", "快递清关"); + + put("supplier", "供应商"); + + put("sendName", "发件人"); + put("sendTel", "发件电话"); + put("sendAddress", "发件地址"); + put("sendCompany", "发件公司"); + + put("recvName", "收件人"); + put("recvTel", "收件电话"); + put("recvAddress", "收件地址"); + put("recvCompany", "收件公司"); + + put("wsContact", "易大伟"); + put("wsPhone", "123"); + put("wsAddress", "南京机场"); + put("payee", "李晓虎"); + + put("barcode", Pictures.ofBufferedImage(barcodeImageBuffer, PictureType.JPEG) + .size(width, height).create()); + + put("cargoList", cargoList); + }}); + + + + template.writeAndClose(new FileOutputStream("/Users/alan/Downloads/1.docx")); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/emis-biz/src/main/resources/tpl/ws_air_in_tpl.docx b/emis-biz/src/main/resources/tpl/ws_air_in_tpl.docx new file mode 100644 index 000000000..9c1799ee5 Binary files /dev/null and b/emis-biz/src/main/resources/tpl/ws_air_in_tpl.docx differ diff --git a/emis-biz/src/main/resources/tpl/ws_in_tpl.docx b/emis-biz/src/main/resources/tpl/ws_in_tpl.docx deleted file mode 100644 index 3f4d8e166..000000000 Binary files a/emis-biz/src/main/resources/tpl/ws_in_tpl.docx and /dev/null differ diff --git a/emis-biz/src/main/resources/tpl/ws_ls_in_tpl.docx b/emis-biz/src/main/resources/tpl/ws_ls_in_tpl.docx new file mode 100644 index 000000000..04d57f338 Binary files /dev/null and b/emis-biz/src/main/resources/tpl/ws_ls_in_tpl.docx differ