From 775aa676747c19bdc6962c1d46efa395d6861f54 Mon Sep 17 00:00:00 2001 From: tzy <1042411602@qq.com> Date: Tue, 16 Sep 2025 23:38:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E8=89=BA=E8=AE=A1=E5=88=92=E8=A1=A8?= =?UTF-8?q?=20=20=E6=9B=B4=E6=96=B0=20=E6=A8=A1=E6=9D=BF=E5=A4=A7=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProcessOrderProController.java | 70 ++++++- .../domain/dto/ProcessRouteExcelDTO.java | 6 +- .../impl/ProcessOrderProServiceImpl.java | 192 +++++++++++++++++- .../EXCEL模板/生产及工艺计划模版.xlsx | Bin 18742 -> 18275 bytes 4 files changed, 254 insertions(+), 14 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java index 20806f2..b5cb9bc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessOrderProController.java @@ -3,6 +3,7 @@ package com.ruoyi.system.controller; import java.io.*; import java.math.BigDecimal; import java.net.URLEncoder; +import java.text.SimpleDateFormat; import java.util.*; import com.alibaba.excel.EasyExcel; @@ -491,10 +492,10 @@ public class ProcessOrderProController extends BaseController { if (!found) { processDataList.add(item); } - List excelDTOList = iProcessOrderProService.getRouteAndBomDetail( processDataList,orderPro); + } - + List excelDTOList = iProcessOrderProService.getRouteAndBomDetail(processDataList,orderPro); // 使用Excel模板文件 String templatePath = "EXCEL模板/生产及工艺计划模版.xlsx"; String outputPath = "D:/file/" + orderPro.getProductionOrderNo() + "生产及工艺计划表.xlsx"; @@ -551,6 +552,11 @@ public class ProcessOrderProController extends BaseController { List> evoDataList = convertEVOProductsDataToMapList(evoProductsList); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("EVOProductsDataVO", evoDataList)); } + // 添加工艺路线 + if (!excelDTOList.isEmpty()) { + List> routeExcelList = convertEVORoutesDataToMapList(excelDTOList); + dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("ProcessRouteExcelDTO", routeExcelList)); + } // 使用模板导出Excel ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, outputPath, staticDataMap, dynamicDataMappingList); @@ -584,6 +590,7 @@ public class ProcessOrderProController extends BaseController { } } + /** * 读取RawDataTable数据 */ @@ -984,6 +991,65 @@ public class ProcessOrderProController extends BaseController { } return mapList; } + /** + * 转换ProcessRouteExcelDTO为Map列表(用于模板) + */ + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + private String formatDate(Date date) { + return date == null ? "" : DATE_FORMAT.format(date); + } + private List> convertEVORoutesDataToMapList(List evoProductsList) { + + List> mapList = new ArrayList<>(); + int index = 1; + for (ProcessRouteExcelDTO dto : evoProductsList) { + Map map = new HashMap<>(); + map.put("index", index); + // 基础信息 + map.put("routeDescription", dto.getRouteDescription()); + map.put("materialCode", dto.getMaterialCode()); + map.put("materialName", dto.getMaterialName()); + map.put("material", dto.getMaterial()); + map.put("discWeight", dto.getDiscWeight()); + + + // BOM 部分 + map.put("rawMaterialCode", dto.getRawMaterialCode()); + map.put("rawMaterialName", dto.getRawMaterialName()); + map.put("bomMaterial", dto.getBomMaterial()); + map.put("bomDanZhong", dto.getBomDanZhong()); + map.put("discUsage", dto.getDiscUsage()); + map.put("bomUnit", dto.getBomUnit()); + + // 工艺部分 + map.put("processNo", dto.getProcessNo()); + map.put("workCenter", dto.getWorkCenter()); + map.put("processName", dto.getProcessName()); + map.put("processDescription", dto.getProcessDescription()); + map.put("processControl", dto.getProcessControl()); + map.put("activityDuration", dto.getActivityDuration()); + map.put("activityUnit", dto.getActivityUnit()); + + // 数量部分 + map.put("unitQuantity", dto.getUnitQuantity()); + map.put("batchQuantity", dto.getBatchQuantity()); + map.put("firstBatchQuantity", dto.getFirstBatchQuantity()); + + // 时间字段格式化 + map.put("planStartTime", formatDate(dto.getPlanStartTime())); + map.put("planEndTime", formatDate(dto.getPlanEndTime())); + map.put("xuStartTime", formatDate(dto.getXuStartTime())); + map.put("xuEndTime", formatDate(dto.getXuEndTime())); + + mapList.add(map); + index++; + } + return mapList; + } + + + + /** * 转换工艺VO为Map列表(用于模板) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java index b3d5e5f..67beeb3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/ProcessRouteExcelDTO.java @@ -59,7 +59,7 @@ public class ProcessRouteExcelDTO { /** * 材料BOM用量 */ - private Double discUsage; + private String discUsage; /** * 材料BOM单位 */ @@ -103,13 +103,13 @@ public class ProcessRouteExcelDTO { /** * 单台数量 */ - private Long unitQuantity; + private Double unitQuantity; /** * 本批数量 */ - private Long batchQuantity; + private String batchQuantity; /** * 首批数量 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java index aa2e4d8..123559c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java @@ -1132,17 +1132,191 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService { * 将工艺部分 材料BOM部分 合并成ProcessRouteExcelDTO * @return */ - @Override - public List getRouteAndBomDetail(List processDataList,ProcessOrderPro orderPro) { - String proRoot = orderPro.getProductionOrderNo(); - //工艺部分 - List processRoutes = iProcessRouteService.selectByProjectNumber(proRoot); - List materialBoms = materialBomService.selectByProCode(proRoot); - for (ProductionOrderVo productionOrderVo : processDataList) { - ProcessRouteExcelDTO processRouteExcelDTO = new ProcessRouteExcelDTO(); + //@Override + public List getRouteAndBomDetail1(List processDataList, + ProcessOrderPro orderPro) { + String proRoot = orderPro.getProductionOrderNo(); + + // 查出所有工艺路线和BOM + List allRoutes = iProcessRouteService.selectByProjectNumber(proRoot); + List allBoms = materialBomService.selectByProCode(proRoot); + + List resultList = new ArrayList<>(); + + for (ProductionOrderVo orderVo : processDataList) { + String materialCode = orderVo.getDrawingNo(); // 这里我假设 drawingNo == materialCode + + // 按 materialCode 过滤 + List processRoutes = allRoutes.stream() + .filter(r -> materialCode.equals(r.getMaterialCode())) + .collect(Collectors.toList()); + + List materialBoms = allBoms.stream() + .filter(b -> materialCode.equals(b.getParentMaterialCode())) + .collect(Collectors.toList()); + + // 对齐到最长列表 + int maxSize = Math.max(processRoutes.size(), materialBoms.size()); + for (int i = 0; i < maxSize; i++) { + ProcessRouteExcelDTO dto = new ProcessRouteExcelDTO(); + + // 订单基础信息 + dto.setRouteDescription(orderVo.getProductionOrderNo()); + dto.setMaterialCode(orderVo.getDrawingNo()); + dto.setMaterialName(orderVo.getDrawingName()); + dto.setMaterial(orderVo.getMaterial()); + dto.setDiscWeight(orderVo.getSingleWeight()); + dto.setUnitQuantity(orderVo.getQuantity()); + dto.setBatchQuantity(orderVo.getBatchQuantity()); + + + // 工艺部分 + if (i < processRoutes.size()) { + ProcessRoute route = processRoutes.get(i); + dto.setProcessNo(route.getProcessNo()); + dto.setProcessName(route.getProcessName()); + dto.setWorkCenter(route.getWorkCenter()); + dto.setProcessDescription(route.getProcessDescription()); + dto.setProcessControl(route.getProcessControl()); + dto.setActivityDuration(route.getActivityDuration()); + dto.setActivityUnit(route.getActivityUnit()); + dto.setXuEndTime(route.getXuEndTime()); + dto.setXuStartTime(route.getXuStartTime()); + } + + // BOM 部分 + if (i < materialBoms.size()) { + MaterialBom bom = materialBoms.get(i); + dto.setRawMaterialCode(bom.getMaterialCode()); + dto.setRawMaterialName(bom.getMaterialName()); + dto.setBomMaterial(bom.getMaterialType()); + dto.setBomUnit(bom.getUnit()); + dto.setDiscUsage(bom.getQuantity()); + } + + resultList.add(dto); + } + } + return resultList; + } +/** + * 将工艺部分 材料BOM部分 合并成ProcessRouteExcelDTO + * @return + */ +@Override +public List getRouteAndBomDetail(List processDataList, + ProcessOrderPro orderPro) { + String proRoot = orderPro.getProductionOrderNo(); + + // 查出所有工艺路线和BOM + List allRoutes = iProcessRouteService.selectByProjectNumber(proRoot); + List allBoms = materialBomService.selectByProCode(proRoot); + + List resultList = new ArrayList<>(); + + // 规范化 key:trim + upper,避免空格/大小写导致匹配失败 + Function normalize = s -> s == null ? "" : s.trim().toUpperCase(); + + // 按 materialCode 分组(工艺路线) + Map> routeMap = allRoutes.stream() + .collect(Collectors.groupingBy(r -> normalize.apply(r.getMaterialCode()))); + + // 按 parentMaterialCode 分组(BOM 的 parent) + Map> bomMap = allBoms.stream() + .collect(Collectors.groupingBy(b -> normalize.apply(b.getParentMaterialCode()))); + + // 把订单数据做成 Map(key = drawingNo 规范化) + Map orderMap = processDataList.stream() + .collect(Collectors.toMap(vo -> normalize.apply(vo.getDrawingNo()), vo -> vo, (a, b) -> a)); + + // 先把 routeMap 的 key 加入(保证 processRoutes 为基础),再补上 orderMap 中但不在 routeMap 的物料 + LinkedHashSet materialKeys = new LinkedHashSet<>(); + materialKeys.addAll(routeMap.keySet()); // 以工艺路线为主序 + orderMap.keySet().stream() + .filter(key -> !materialKeys.contains(key)) + .forEach(materialKeys::add); // 补充仅在订单里的物料 + + // 遍历每个物料编码(规范化 key) + for (String key : materialKeys) { + List processRoutes = routeMap.getOrDefault(key, Collections.emptyList()); + List materialBoms = bomMap.getOrDefault(key, Collections.emptyList()); + ProductionOrderVo orderVo = orderMap.get(key); // 可能为 null + + // 用于显示在 DTO 中的原始物料编码(未规范化的形式) + String originalMaterialCode = null; + String originalMaterialName = null; + String originalMaterial = null; + String originalDiscWeight = null; + if (orderVo != null) { + originalMaterialCode = orderVo.getDrawingNo(); + originalMaterialName = orderVo.getDrawingName(); + originalMaterial = orderVo.getMaterial(); + originalDiscWeight = String.valueOf(orderVo.getSingleWeight()); + } else if (!processRoutes.isEmpty()) { + originalMaterialCode = processRoutes.get(0).getMaterialCode(); + } else if (!materialBoms.isEmpty()) { + originalMaterialCode = materialBoms.get(0).getParentMaterialCode(); + } else { + originalMaterialCode = key; // 退路:用规范化 key } - return Collections.emptyList(); + // 以 processRoutes 为主,行数 = max(processRoutes.size(), materialBoms.size()) + int maxSize = Math.max(processRoutes.size(), materialBoms.size()); + // 如果两边都为空但有订单(order-only),也至少输出一行 + if (maxSize == 0 && orderVo != null) { + maxSize = 1; + } + + for (int i = 0; i < maxSize; i++) { + ProcessRouteExcelDTO dto = new ProcessRouteExcelDTO(); + + // 订单基础信息(有就填) + if (orderVo != null) { + dto.setRouteDescription(orderVo.getProductionOrderNo()); + dto.setMaterialCode(orderVo.getDrawingNo()); + dto.setMaterialName(orderVo.getDrawingName()); + dto.setMaterial(orderVo.getMaterial()); + dto.setDiscWeight(orderVo.getSingleWeight()); + dto.setUnitQuantity(orderVo.getQuantity()); + dto.setBatchQuantity(orderVo.getBatchQuantity()); + } else { + // 若无订单,则至少把 materialCode 放入显示(用原始值) + dto.setMaterialCode(originalMaterialCode); + dto.setMaterialName(originalMaterialName); + dto.setMaterial(originalMaterial); + dto.setDiscUsage(originalDiscWeight); + } + + // 工艺部分(有就填) + if (i < processRoutes.size()) { + ProcessRoute route = processRoutes.get(i); + dto.setProcessNo(route.getProcessNo()); + dto.setProcessName(route.getProcessName()); + dto.setWorkCenter(route.getWorkCenter()); + dto.setProcessDescription(route.getProcessDescription()); + dto.setProcessControl(route.getProcessControl()); + dto.setActivityDuration(route.getActivityDuration()); + dto.setActivityUnit(route.getActivityUnit()); + dto.setXuEndTime(route.getXuEndTime()); + dto.setXuStartTime(route.getXuStartTime()); + } + + // BOM 部分(以 parentMaterialCode 为匹配依据) + if (i < materialBoms.size()) { + MaterialBom bom = materialBoms.get(i); + dto.setRawMaterialCode(bom.getMaterialCode()); + dto.setRawMaterialName(bom.getMaterialName()); + dto.setBomMaterial(bom.getMaterialType()); + dto.setBomUnit(bom.getUnit()); + dto.setDiscUsage(bom.getQuantity()); + } + + resultList.add(dto); + } } + return resultList; +} + + } diff --git a/ruoyi-system/src/main/resources/EXCEL模板/生产及工艺计划模版.xlsx b/ruoyi-system/src/main/resources/EXCEL模板/生产及工艺计划模版.xlsx index b0ff69259ff635fcaa869f9a4da5f45108532c02..cb29522ddbe19861183f287f98816aab681cef98 100644 GIT binary patch delta 13153 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 z zSyh~io=zUir9CZ(NR@pcTs@6!LZLK_nMuBMfEinUV*J`m5YN)rpZM=c=wtLkjOEIH z%>)E$(NJuqe3e9}G2h}6)m!g@y=m+UM3w$$gn?EE&I0Z#r?&k$qwS)fc6{Z5)F>sQ zJVhE%#OS;cMy{M59&=}jZ5-OhGE!uJ<#@fovERrKwb2cxh~hi`a`|VL`2DM33QkQ5 znXNz7SPw61*?bF!f7-;K@Q=S1c;+q&An#Y`hFuqJ9!gSk8%xBVJ9w~3HzC}$dm`&X zhB;i=$ckP_T&P*@@Xa4kd)E7xmyupjFQlh|lp%%)7?1tY_VFa!jf;=w$t|L9X!KX~ zuyMqC?`5&c4*Ez%EpRwUxEjGy_pREY(K?K@*81uJAGQboQcL$qSjDI46~Tir-`I#<%!P|O^eyz{ADH`R-^cN7+w8b8kwXjT&__-o`;Q~kH$A*PR8ZCf5SsmuG64$C zo|l~Y2ZH`Vj4&Z@{$0>W_@#saOoD?_bR(wT?%*!pC^Q)a^pQ3J28UW4QoQL{ro*kE z+KYJAfa@et2HL$=79*pMiZUi61w#3X?)Q366L$$dolz{I?Bb?07~8dONA4Zu=LrXT z-d`S_pl%2mrbW>arIew{8@2deU-ag!`EPK^a^pX5g}T8l7^d+CUN7yzUgW=St&hq8 zz4r>z&G}xsH5g=pD#AV9_oF0+@alFAa7%y65=Ee0Xxd1c7G>om8y%TN9NZCd?Gl%d zkon6USIhat*G2OgtwI(Z((t z7f4GDVNwNWw96gnHoEK6x0ChJGZq7Pk2Yb9EjPQT!w7F-eXh-DECA;CbiUs~lS6P6 zn9G#Nw?9>NUxcnCb(#AFbot1~S@QGWZctnTo_4pEX-M*V9vKbeiUFLt`#!#MPQRt;U>;uGu;9A4D+&oi z0>A%a0U9Xr7wQCXISARg`O@6R)WIaU6g_$%xeYN0?k-wa2al`#oo2MoF_=Q=-mWsu zTG?gSIm9+b9$&@D=m6CEq_vE?;TYKyMKSacqyw8S2PqN={#oL_g>MYt60h^I>qF*U zU~=-@^?^1sd*InUTmQ_!#B3d5aP{%=99{VsKGa59I>n9~{9U(6vP#SB&SwN3^YPZw z1{g! z*tzwm!T2h%SApahW!8JjPruhvS5vBYo1|B2eFJOoS|7dlXs{rCAu?c^f^!%vQt$=no<#MWLezL=p*h1=y(F*o99GhVn4Xe$ zO8Vu(x*=v*doR45bXo3nS~$Sr;h^%ir{AP7&7_co6;-nuByJfRNNh|(oE4>ADVhE$ z!~|Egbz^PAaicIbo!Hc9;ZO}bB6M$YaXQyLSAuGGiHnwBuBD>5WCm!_m3}2>)mKES z>&{W#?^Tq&PKG`KNTJy$V&U@aS#-+&;cRznKIEB=!`5~9SOsBOVS(i~Q4&(jxB!1t z$ceAp4vo z#+0PY&765R!D^2?VF$FzOhdHd`{FapfHFU|^UZA+x@Ovy+FVlZUaUFQ{4+4mg=U{jKM5y0Q_-Xp<}LOKv%!VBGnE}HCqk)@zMb8F?OBa>U81&RFS!8@&FjT@=%aIsyrw%yJ0!uSc*1t9{{5 zz+@XdTtT=FEX2(W&?t7sI+aU>vR>F^X}&45Hno=V;;o+oMn7qlup_QjU3xTHTsk>A zU9Y#@bV-nlO?hK=zcOrq1YR78#|Xzew@>+t*sNqtK_@m_AZ|Kq`}H;Vb8v2Oc9|B6 z$@7ze0%?3&2^_%)6N9QJsoZC|0g4+CaD7e&&$(xuRwvQR!1UUy>%eHBaRiCenD7f^ zjB=*)Z>9#GPTnkN38=z)NZG~InqPcpQ0H2nY->Oa<^)XPCV-R^gTo{W9KZ(rAq)a;lcX5t0y&pEF|U_k!{yxxx2A3zF2(|4D|vOJYOZ(1UQK1cdLP{#Vz# zrKN{E%fFBG-v?9v(7v(HXi<4Xc1&0%>ekH{wcVB&x>OIvq_gUHsF8yNB)089ytF9LC9bO{#!x+_f9qV U{|K4jLxYrL&|sv+{~qW60j(