From 9729e729b25c99e8fd1e973deed4706c3f7d4b97 Mon Sep 17 00:00:00 2001 From: erdanergou Date: Sat, 18 Mar 2023 17:00:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A1=A8=E6=A0=BC=E5=86=99?= =?UTF-8?q?=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DownLoadFileController.java | 3 + .../controller/ExcelController.java | 3 + .../entity/ApplicationOutRecord.java | 7 ++ .../entity/ExcelInfoByMinWrite.java | 44 +++++++++ .../entity/ExcelInfoByWrite.java | 51 ++++++++++ .../mapper/DepositoryRecordMapper.xml | 6 +- .../pojo/ApplicationOutRecordP.java | 8 ++ .../service/ExcelService.java | 11 +++ .../impl/DepositoryRecordServiceImpl.java | 1 + .../service/impl/ExcelServiceImpl.java | 93 +++++++++++++++++- .../static/upload/PrintTemplate.xlsx | Bin 0 -> 21379 bytes .../depository_manage/TestForOther.java | 16 ++- 12 files changed, 240 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMinWrite.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByWrite.java create mode 100644 src/main/resources/static/upload/PrintTemplate.xlsx diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DownLoadFileController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DownLoadFileController.java index 09d51729..72f8df81 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DownLoadFileController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DownLoadFileController.java @@ -162,4 +162,7 @@ public class DownLoadFileController { + + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java b/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java index 74cac204..1d2a6692 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java @@ -46,4 +46,7 @@ public class ExcelController { public ResultVo importInventory(@RequestParam("file") MultipartFile excel){ return excelService.importExcelInventory(excel); } + + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java index 59709d84..e560f8aa 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java @@ -164,5 +164,12 @@ public class ApplicationOutRecord { private Integer adminorgId; + /** + * 出库时间 + */ + private String outTime; + + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMinWrite.java b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMinWrite.java new file mode 100644 index 00000000..a1cf60ce --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMinWrite.java @@ -0,0 +1,44 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用于打印的类 + */ +@Data +@EqualsAndHashCode +public class ExcelInfoByMinWrite { + /** + * 物料编码: + */ + private String mcode; + /** + * 物料名称: + */ + private String mname; + /** + * 规格型号: + */ + private String mversion; + /** + * 单位: + */ + private String munit; + /** + * 库位 + */ + private String pcode; + /** + * 数量 : + */ + private String quantity; + + /** + * 项目 + */ + private String project; + + + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByWrite.java b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByWrite.java new file mode 100644 index 00000000..e9613c72 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByWrite.java @@ -0,0 +1,51 @@ +package com.dreamchaser.depository_manage.entity; + +import com.dreamchaser.depository_manage.pojo.ApplicationOutRecordP; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用于打印的类 + */ +@Data +@EqualsAndHashCode +public class ExcelInfoByWrite { + /** + * 出库单号: + */ + private String code; + /** + * 出库日期: + */ + private String outTime; + /** + * 出库类别: + */ + private String type; + /** + * 仓库: + */ + private String dname; + /** + * 部门: + */ + private String adminorgName; + /** + * 申请人: + */ + private String applicantName; + /** + * 施工单位: + */ + private String constructionUnitName; + /** + * 审核人: + */ + private String checkerName; + /** + * 制单人 + */ + private String producerName; + + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml index 02ac3d96..4947e298 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml @@ -115,6 +115,7 @@ + @@ -170,7 +171,7 @@ aorid,mid,mname,depositoryId,dname,applicantId,applicantTime,applyRemark,aorcode,aorpirce,aorquantity,departmenthead,departmentheadPass,departmentHeadTime,departmentheadMessage, depositoryManager,depositoryManagerPass,depositoryManagerTime,depositoryManagerMessage,aorstate,istransfer,mcode,placeId,pass,aormUnit,aormconstructionunitid,aormadminorgid,cuname, - cuintroduce,cuaddress + cuintroduce,cuaddress,outTime @@ -1444,6 +1445,9 @@ placeId = #{placeId}, + + outTime = #{outTime}, + pass = #{pass} diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java b/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java index b2ab9833..2bd40859 100644 --- a/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java @@ -1,6 +1,7 @@ package com.dreamchaser.depository_manage.pojo; import com.dreamchaser.depository_manage.entity.ApplicationOutRecord; +import com.dreamchaser.depository_manage.utils.DateUtil; import lombok.Data; @Data @@ -164,6 +165,12 @@ public class ApplicationOutRecordP { */ private Integer adminorgId; + + /** + * 出库时间 + */ + private String outTime; + public ApplicationOutRecordP(ApplicationOutRecord aor) { this.id = aor.getId(); this.mid = aor.getMid(); @@ -197,5 +204,6 @@ public class ApplicationOutRecordP { this.constructionUnitId = aor.getConstructionUnitId(); this.constructionUnitName = aor.getConstructionUnitName(); this.adminorgId = aor.getAdminorgId(); + this.outTime = aor.getOutTime() == null ? "": DateUtil.TimeStampToDateTime(Long.valueOf(aor.getOutTime())); } } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java b/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java index 0740c9e5..2367ae10 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java @@ -1,5 +1,6 @@ package com.dreamchaser.depository_manage.service; +import com.dreamchaser.depository_manage.entity.UserByPort; import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.utils.ResultVo; import org.springframework.web.multipart.MultipartFile; @@ -27,4 +28,14 @@ public interface ExcelService { * @return */ ResultVo importExcelInventory(MultipartFile file); + + + /** + * 用于出库订单填充 + * @param id 待打印出库订单id + */ + String writeExcelForPrint(Integer id, UserByPort userToken); + + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java index 68f8d809..467409bb 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java @@ -1785,6 +1785,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { Map map = new HashMap<>(); map.put("pass", pass); map.put("id", record.getId()); + map.put("outTime",System.currentTimeMillis()); // 修改状态为完成 depositoryRecordMapper.updateApplicationOutRecord(map); diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java index 0cb4a8fc..c621d820 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java @@ -1,7 +1,15 @@ package com.dreamchaser.depository_manage.service.impl; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.enums.WriteDirectionEnum; +import com.alibaba.excel.util.ListUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.fastjson.JSON; import com.dreamchaser.depository_manage.entity.*; +import com.dreamchaser.depository_manage.mapper.ConstructionUnitMapper; import com.dreamchaser.depository_manage.mapper.DepositoryRecordMapper; import com.dreamchaser.depository_manage.mapper.MaterialMapper; import com.dreamchaser.depository_manage.pojo.InventoryP; @@ -48,6 +56,10 @@ public class ExcelServiceImpl implements ExcelService { @Autowired DepositoryRecordMapper depositoryRecordMapper; + + @Autowired + ConstructionUnitMapper constructionUnitMapper; + /** * 用于导入物料名称 * @@ -317,7 +329,7 @@ public class ExcelServiceImpl implements ExcelService { String code = excelInfoByInventory.getCode(); if (code != null && !"".equals(code)) { material = materialService.findMaterialByCode(code); - }else{ + } else { material = materialMapper.findMaterialByCondition(insert).get(0); } } @@ -412,4 +424,83 @@ public class ExcelServiceImpl implements ExcelService { log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath); return ResultVoUtil.returnResultVo(200, readResult, "结果"); } + + /** + * 用于出库订单填充 + * + * @param id 待打印出库订单id + */ + @Override + public String writeExcelForPrint(Integer id, UserByPort userToken) { + // 获取要打印的出库主单 + ApplicationOutRecord record = depositoryRecordMapper.findApplicationOutRecordPById(id); + List recordMinList = depositoryRecordMapper.findApplicationOutRecordMinByParent(id); + // 表格模板 + String templateFileName = "D://PrintTemplate.xlsx"; + // 生成的表格 + String fileName = "D://PrintTemplate" + System.currentTimeMillis() + ".xlsx"; + // 待打印主数据列表 + List data = ListUtils.newArrayList(); + List dataMin = ListUtils.newArrayList(); + // 主数据 + ExcelInfoByWrite excelInfoByWrite = new ExcelInfoByWrite(); + String outTime = record.getOutTime(); + if (outTime == null || "".equals(outTime)) { + excelInfoByWrite.setOutTime(""); + } else { + excelInfoByWrite.setOutTime(DateUtil.TimeStampToDateTimeForDay(Long.valueOf(outTime))); + } + excelInfoByWrite.setDname(record.getDepositoryName()); + excelInfoByWrite.setCode(record.getCode()); + UserByPort applicanter = LinkInterfaceUtil.FindUserById(record.getApplicantId(), userToken); + Administration company = LinkInterfaceUtil.getCompany(record.getAdminorgId(), userToken); + excelInfoByWrite.setApplicantName(applicanter.getName()); + excelInfoByWrite.setAdminorgName(company.getName()); + Integer unitId = record.getConstructionUnitId(); + if (unitId != null) { + ConstructionUnit constructionUnitById = constructionUnitMapper.findConstructionUnitById(unitId); + excelInfoByWrite.setConstructionUnitName(constructionUnitById.getName()); + } else { + excelInfoByWrite.setConstructionUnitName(""); + } + UserByPort checker = LinkInterfaceUtil.FindUserById(record.getDepositoryId(), userToken); + excelInfoByWrite.setCheckerName(checker.getName()); + data.add(excelInfoByWrite); + double total = 0; + for (ApplicationOutRecordMin recordMin : recordMinList + ) { + ExcelInfoByMinWrite excelInfoByMinWrite = new ExcelInfoByMinWrite(); + Material materialById = materialMapper.findMaterialById(recordMin.getMid()); + excelInfoByMinWrite.setMname(materialById.getMname()); + excelInfoByMinWrite.setMcode(materialById.getCode()); + if ("-1".equals(recordMin.getUnit()) || materialById.getUnit().equals(recordMin.getUnit())) { + excelInfoByMinWrite.setMunit(materialById.getUnit()); + } else { + excelInfoByMinWrite.setMunit(recordMin.getUnit()); + } + excelInfoByMinWrite.setMversion(materialById.getVersion()); + Integer placeId = recordMin.getPlaceId(); + String pcode = ""; + if (placeId != null) { + Place placeById = placeService.findPlaceById(placeId); + pcode = placeById.getKingdeecode(); + } + excelInfoByMinWrite.setPcode(pcode); + excelInfoByMinWrite.setQuantity(String.valueOf(recordMin.getQuantity() / 100)); + dataMin.add(excelInfoByMinWrite); + total += (double) (recordMin.getQuantity() / 100); + } + try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); + // 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹 + excelWriter.fill(new FillWrapper("data", data), fillConfig, writeSheet); + excelWriter.fill(new FillWrapper("mindata", dataMin), writeSheet); + Map map = new HashMap(); + map.put("date", DateUtil.TimeStampToDateTime(System.currentTimeMillis())); + map.put("total", total); + excelWriter.fill(map, writeSheet); + } + return fileName; + } } diff --git a/src/main/resources/static/upload/PrintTemplate.xlsx b/src/main/resources/static/upload/PrintTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3ba8151172a1021d4df28c71f60bf69507445ac7 GIT binary patch literal 21379 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 n1^(XrKbiaAn|mt!Tk}77Tv;9#z#s$!3h+w