From 6519c24135db2b6b76fb9409718635daf9cf099e Mon Sep 17 00:00:00 2001 From: tzy Date: Sun, 23 Nov 2025 21:33:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E8=89=BA=E6=97=A5=E5=BF=97=E6=8E=A8?= =?UTF-8?q?=E9=80=81=20bom=E6=97=A5=E5=BF=97=E6=8E=A8=E9=80=811?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../ruoyi/common/poi/ExcelTemplateProc.java | 5 +- .../system/controller/PartCostController.java | 2 + .../controller/ProcessOrderProController.java | 154 ++++++++++++++---- .../ruoyi/system/domain/dto/JdVersionDTO.java | 7 +- .../java/com/ruoyi/system/runner/JdUtil.java | 114 ++++++++----- .../service/impl/PartCostServiceImpl.java | 8 +- .../EXCEL模板/生产及工艺计划模版.xlsx | Bin 18572 -> 18490 bytes .../resources/jpg/生产及工艺计划模版.xlsx | Bin 0 -> 18390 bytes 9 files changed, 207 insertions(+), 85 deletions(-) create mode 100644 ruoyi-system/src/main/resources/jpg/生产及工艺计划模版.xlsx diff --git a/pom.xml b/pom.xml index 796092e..7596720 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 1.39.0 3.5.3.1 3.9.1 - 5.8.18 + 5.8.30 4.10.0 2.7.10 3.20.1 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/poi/ExcelTemplateProc.java b/ruoyi-common/src/main/java/com/ruoyi/common/poi/ExcelTemplateProc.java index 1f7180d..aea8b27 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/poi/ExcelTemplateProc.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/poi/ExcelTemplateProc.java @@ -293,9 +293,10 @@ public class ExcelTemplateProc { String value = cell.getStringCellValue(); if (value != null) { - + String trimmed = value.trim(); for (DynamicDataMapping dynamicData : dynamicDataMappingList) { - if (value.startsWith("{{" + dynamicData.getDataId() + ".")) { + String prefix = "{{" + dynamicData.getDataId() + "."; + if (trimmed.startsWith(prefix) || trimmed.contains(prefix)) { return dynamicData; } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/PartCostController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/PartCostController.java index e148f09..20e5452 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/PartCostController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/PartCostController.java @@ -3,6 +3,7 @@ package com.ruoyi.system.controller; import java.util.List; import java.util.Arrays; +import com.xxl.job.core.handler.annotation.XxlJob; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; @@ -113,6 +114,7 @@ public class PartCostController extends BaseController { @Log(title = "在金蝶获取成本价", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/getObtainPartData") + @XxlJob("getObtainPartData") public R getObtainPartData() { return toAjax(iPartCostService.getObtainPartData()); } 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 7205dad..8d9250e 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 @@ -6,6 +6,7 @@ import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.*; +import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.fasterxml.jackson.core.JsonProcessingException; import com.ruoyi.common.excel.DefaultExcelListener; @@ -17,6 +18,8 @@ import com.ruoyi.common.poi.ExcelTemplateProc; import com.ruoyi.common.poi.DynamicDataMapping; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.bo.FigureSaveBo; +import com.ruoyi.system.domain.dto.MaterialUseDTO; +import com.ruoyi.system.domain.dto.ProcessRouteDTO; import com.ruoyi.system.domain.dto.ProcessRouteExcelDTO; import com.ruoyi.system.domain.dto.ProcessRoutePushResultDTO; import com.ruoyi.system.domain.vo.*; @@ -542,7 +545,7 @@ public class ProcessOrderProController extends BaseController { // 使用Excel模板文件 - String templatePath = "D:/java/excel-template/生产及工艺计划模版.xlsx"; + String templatePath = "jpg/生产及工艺计划模版.xlsx"; String outputPath = "D:/file/" + orderPro.getProductionOrderNo() + "生产及工艺计划表.xlsx"; // 准备模板数据 @@ -613,11 +616,11 @@ public class ProcessOrderProController extends BaseController { List> evoDataList = convertEVOProductsDataToMapList(evoProductsList); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("EVOProductsDataVO", evoDataList)); } - // 添加伊特产品数据 + /* // 添加伊特产品数据 if (!excelDTOList.isEmpty()) { List> evoRouteDataList = convertRouteDataToMapList(excelDTOList); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("ProcessRouteExcelDTO", evoRouteDataList)); - } + }*/ // 使用模板导出Excel ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, outputPath, staticDataMap, dynamicDataMappingList); @@ -625,8 +628,7 @@ public class ProcessOrderProController extends BaseController { // 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode(orderPro.getProductionOrderNo() + "_分类BOM表", "UTF-8") - .replaceAll("\\+", "%20"); + String fileName = URLEncoder.encode(orderPro.getProductionOrderNo() + "_分类BOM表", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 将生成的文件写入响应 @@ -671,7 +673,15 @@ public class ProcessOrderProController extends BaseController { vo.setMaterialCode(getCellValueAsString(row.getCell(0))); // 图号 vo.setMaterialName(getCellValueAsString(row.getCell(1))); // 名称 vo.setMaterial(getCellValueAsString(row.getCell(2))); // 数量 - vo.setDiscWeight(getCellValueAsDouble(row.getCell(3))); // 单重 + vo.setDiscWeight(getCellValueAsDouble(row.getCell(3))); + + vo.setRawMaterialCode(getCellValueAsString(row.getCell(4))); + vo.setRawMaterialName(getCellValueAsString(row.getCell(5))); + vo.setBomMaterial(getCellValueAsString(row.getCell(6))); + vo.setBomUnit(getCellValueAsString(row.getCell(9))); + vo.setBomDanZhong(getCellValueAsDouble(row.getCell(7))); + vo.setDiscUsage(getCellValueAsString(row.getCell(8))); + // 单重 vo.setBatchQuantity(getCellValueAsLong(row.getCell(18))); // 批次数量 vo.setUnitQuantity(getCellValueAsDouble(row.getCell(17))); // 批次数量 @@ -1092,10 +1102,10 @@ public class ProcessOrderProController extends BaseController { /** * 转换工艺VO为Map列表(用于模板) */ - private List> convertRouteDataToMapList(List routeDataList) { + private List> convertRouteDataToMapList(List routeDataList) { List> mapList = new ArrayList<>(); int index = 1; - for (ProcessRouteExcelDTO item : routeDataList) { + for (ProcessRoute item : routeDataList) { Map map = new HashMap<>(); map.put("index", index); map.put("routeDescription", item.getRouteDescription()); // 生产令号 @@ -1103,12 +1113,6 @@ public class ProcessOrderProController extends BaseController { map.put("materialName", item.getMaterialName()); // 物料名称 map.put("material", item.getMaterial()); // 材质 map.put("discWeight", item.getDiscWeight()); // 单重KG - map.put("rawMaterialCode", item.getRawMaterialCode()); // 材料BOM物料编码 - map.put("rawMaterialName", item.getRawMaterialName()); // 材料BOM物料名称 - map.put("bomMaterial", item.getBomMaterial()); // BOM材质 - map.put("bomDanZhong", item.getBomDanZhong()); // 材料单重KG - map.put("discUsage", item.getDiscUsage()); // 用量 - map.put("bomUnit", item.getBomUnit()); // 单位 map.put("processNo", item.getProcessNo()); // 工序号 map.put("workCenter", item.getWorkCenter()); // 工作中心 map.put("processName", item.getProcessName()); // 工序名称 @@ -1153,14 +1157,78 @@ public class ProcessOrderProController extends BaseController { // 1. 读取第一个sheet的数据list - 使用POI直接读取以保留空格 List allDataList = readExcelWithPOI(excelName); List routeList = readExcelPOIRoute(excelName); - //获取此项目的物料最新BOM 并且 将工艺路线拉取出来 - ArrayList routes = new ArrayList<>(); - for (ProcessRoute processRoute : routeList) { - //TODO 获取最新的BOM版本的型号 - String bomVersion = JdUtil.readGetTheLatestVersion(processRoute.getMaterialCode()); - //TODO 获取此物料的所有工艺路线 - + List routes = new ArrayList<>(); + List> kingdeeBomRows = new ArrayList<>(); + for (ProcessRoute base : routeList) { + String materialCode = base.getMaterialCode(); + if (StringUtils.isBlank(materialCode)) { + ProcessRoute item = new ProcessRoute(); + item.setRouteDescription(base.getRouteDescription()); + item.setMaterialCode(base.getMaterialCode()); + item.setMaterialName(base.getMaterialName()); + item.setMaterial(base.getMaterial()); + item.setDiscWeight(base.getDiscWeight()); + item.setUnitQuantity(base.getUnitQuantity()); + item.setBatchQuantity(base.getBatchQuantity()); + routes.add(item); + continue; + } + String bomversion = JdUtil.readGetTheLatestVersion(materialCode); + List bomItems = StringUtils.isNotBlank(bomversion) ? JdUtil.getMaterialUseXByVer(bomversion) : Collections.emptyList(); + List routeGuDing = JdUtil.getRouteGuDing(materialCode); + if (bomItems != null && !bomItems.isEmpty()) { + for (MaterialUseDTO b : bomItems) { + Map bomMap = new HashMap<>(); + bomMap.put("routeDescription", base.getRouteDescription()); + bomMap.put("materialCode", base.getMaterialCode()); + bomMap.put("materialName", base.getMaterialName()); + bomMap.put("material", base.getMaterial()); + bomMap.put("discWeight", base.getDiscWeight()); + bomMap.put("rawMaterialCode", b.getMaterialCode()); + bomMap.put("rawMaterialName", b.getMaterialName()); + bomMap.put("bomMaterial", b.getCaizhi()); + bomMap.put("bomDanZhong", b.getDanzhong()); + bomMap.put("discUsage", (b.getFenzi() != null && b.getFenmu() != null) ? (b.getFenzi() + "/" + b.getFenmu()) : null); + bomMap.put("bomUnit", b.getChildUnit()); + kingdeeBomRows.add(bomMap); + } + } + if (routeGuDing != null && !routeGuDing.isEmpty()) { + routeGuDing.stream() + .forEach(r -> { + ProcessRoute item = new ProcessRoute(); + item.setRouteDescription(base.getRouteDescription()); + item.setMaterialCode(base.getMaterialCode()); + item.setMaterialName(base.getMaterialName()); + item.setMaterial(base.getMaterial()); + item.setDiscWeight(base.getDiscWeight()); + item.setUnitQuantity(base.getUnitQuantity()); + item.setBatchQuantity(base.getBatchQuantity()); + // 不写入BOM字段,保持纯工艺数据行 + item.setProcessNo(r.getProcessNo()); + item.setWorkCenter(r.getWorkCenter()); + item.setProcessName(r.getProcessName()); + item.setProcessDescription(r.getProcessDescription()); + item.setProcessControl(r.getProcessControl()); + item.setActivityDuration(r.getActivityDuration()); + item.setActivityUnit(r.getActivityUnit()); + routes.add(item); + }); + } else { + ProcessRoute item = new ProcessRoute(); + item.setRouteDescription(base.getRouteDescription()); + item.setMaterialCode(base.getMaterialCode()); + item.setMaterialName(base.getMaterialName()); + item.setMaterial(base.getMaterial()); + item.setDiscWeight(base.getDiscWeight()); + item.setUnitQuantity(base.getUnitQuantity()); + item.setBatchQuantity(base.getBatchQuantity()); + // 不写入BOM字段,保持纯工艺数据行 + routes.add(item); + } } + // 用生成的 routes 替换原始 routeList,保持原序展开后的结构用于后续导出 + routeList = routes; // 2. 读取原始表数据 List rawDataList = readRawDataTable(rawDataFile); @@ -1311,7 +1379,7 @@ public class ProcessOrderProController extends BaseController { } // 使用Excel模板文件 - String templatePath = "D:/java/excel-template/生产及工艺计划模版.xlsx"; + String templatePath = "jpg/生产及工艺计划模版.xlsx"; String outputPath = "D:/file/" + orderPro.getProductionOrderNo() + "生产及工艺计划表.xlsx"; // 准备模板数据 @@ -1383,11 +1451,15 @@ public class ProcessOrderProController extends BaseController { List> evoDataList = convertEVOProductsDataToMapList(evoProductsList); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("EVOProductsDataVO", evoDataList)); } + if (!kingdeeBomRows.isEmpty()) { + List> bomDataList2 = convertKingdeeBomToMapList(kingdeeBomRows); + dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("KingdeeBomData", bomDataList2)); + } // 添加伊特产品数据 - /*if (!excelDTOList.isEmpty()) { - List> evoRouteDataList = convertRouteDataToMapList(excelDTOList); + if (!routeList.isEmpty()) { + List> evoRouteDataList = convertRouteDataToMapList(routeList); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("ProcessRouteExcelDTO", evoRouteDataList)); - }*/ + } // 使用模板导出Excel ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, outputPath, staticDataMap, dynamicDataMappingList); @@ -1421,16 +1493,28 @@ public class ProcessOrderProController extends BaseController { } } - - - - - - - - - - + private List> convertKingdeeBomToMapList(List> kingdeeBomRows) { + List> mapList = new ArrayList<>(); + int index = 1; + for (Map row : kingdeeBomRows) { + Map map = new HashMap<>(); + map.put("index", index); + map.put("routeDescription", row.get("routeDescription")); + map.put("materialCode", row.get("materialCode")); + map.put("materialName", row.get("materialName")); + map.put("material", row.get("material")); + map.put("discWeight", row.get("discWeight")); + map.put("rawMaterialCode", row.get("rawMaterialCode")); + map.put("rawMaterialName", row.get("rawMaterialName")); + map.put("bomMaterial", row.get("bomMaterial")); + map.put("bomDanZhong", row.get("bomDanZhong")); + map.put("discUsage", row.get("discUsage")); + map.put("bomUnit", row.get("bomUnit")); + mapList.add(map); + index++; + } + return mapList; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/JdVersionDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/JdVersionDTO.java index d866682..60b8ebe 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/JdVersionDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/JdVersionDTO.java @@ -1,5 +1,10 @@ package com.ruoyi.system.domain.dto; -public class JdVersionDTO { +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +@Data +public class JdVersionDTO { + @JsonProperty("FNumber") + private String version; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java index a292b80..1db5393 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java @@ -12,6 +12,7 @@ import com.kingdee.bos.webapi.entity.RepoRet; import com.kingdee.bos.webapi.sdk.K3CloudApi; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.JdUtils; +import com.ruoyi.common.utils.VersionComparator; import com.ruoyi.system.domain.BomDetails; import com.ruoyi.system.domain.PartCost; import com.ruoyi.system.domain.dto.*; @@ -2488,7 +2489,6 @@ public class JdUtil { /** * 获取物料清单 - * * @param FMaterialCode * @return */ @@ -3232,68 +3232,104 @@ public class JdUtil { */ public static String readGetTheLatestVersion(String materialCode) { K3CloudApi client = new K3CloudApi(); - // 请求参数,要求为json字符串 JsonObject json = new JsonObject(); - json.addProperty("FormId", "SFC_OperationReport"); - json.addProperty("FieldKeys", "F_HBYT_SCLH,FBillNo,FMoNumber,FWorkShopID.FName,FOperNumber,FOperDescription,FQuaQty,FFinishQty,FStockInQuaAuxQty,FStockInFailAuxQty,F_HBYT_RKD,FDate"); - // 是否为入库点 - JsonObject filterObject = new JsonObject(); + json.addProperty("FormId", "ENG_BOM"); + json.addProperty("FieldKeys", "FNumber"); JsonArray filterString = new JsonArray(); - filterObject.addProperty("FieldName", "F_HBYT_RKD"); - filterObject.addProperty("Compare", "74"); - filterObject.addProperty("Value", true); + JsonObject filterObject = new JsonObject(); + filterObject.addProperty("FieldName", "FMATERIALID.FNumber"); + filterObject.addProperty("Compare", "67"); + filterObject.addProperty("Value", materialCode); filterObject.addProperty("Left", ""); filterObject.addProperty("Right", ""); filterObject.addProperty("Logic", 0); filterString.add(filterObject); JsonObject filterObject1 = new JsonObject(); - filterObject1.addProperty("FieldName", "FDocumentStatus"); + filterObject1.addProperty("FieldName", "FForbidStatus"); filterObject1.addProperty("Compare", "105"); filterObject1.addProperty("Value", "A"); filterObject1.addProperty("Left", ""); filterObject1.addProperty("Right", ""); - filterObject1.addProperty("Logic", 1); + filterObject1.addProperty("Logic", 0); filterString.add(filterObject1); - JsonObject filterObject2 = new JsonObject(); - filterObject2.addProperty("FieldName", "FDocumentStatus"); - filterObject2.addProperty("Compare", "105"); - filterObject2.addProperty("Value", "B"); - filterObject2.addProperty("Left", ""); - filterObject2.addProperty("Right", ""); - filterObject2.addProperty("Logic", 1); - filterString.add(filterObject2); json.add("FilterString", filterString); json.addProperty("OrderString", ""); json.addProperty("TopRowCount", 0); json.addProperty("StartRow", 0); - json.addProperty("Limit", 10000); + json.addProperty("Limit", 2000); json.addProperty("SubSystemId", ""); - List processReportDTOList = new ArrayList<>(); - int pageSize = 10000; - int startRow = 0; + List processReportDTOList = new ArrayList<>(); ObjectMapper objectMapper = new ObjectMapper(); try { - while (true) { - JsonObject pageJson = new Gson().fromJson(json.toString(), JsonObject.class); - pageJson.addProperty("StartRow", startRow); - pageJson.addProperty("Limit", pageSize); - String resultJson = String.valueOf(client.billQuery(pageJson.toString())); - JsonArray jsonArray = new Gson().fromJson(resultJson, JsonArray.class); - if (jsonArray == null || jsonArray.size() == 0) { - break; - } - List pageList = objectMapper.readValue(jsonArray.toString(), new TypeReference>() { + String resultJson = String.valueOf(client.billQuery(json.toString())); + JsonArray jsonArray = new Gson().fromJson(resultJson, JsonArray.class); + if (jsonArray != null && jsonArray.size() > 0) { + List pageList = objectMapper.readValue(jsonArray.toString(), new TypeReference>() { }); processReportDTOList.addAll(pageList); - if (jsonArray.size() < pageSize) { - break; - } - startRow += pageSize; } } catch (Exception e) { - e.printStackTrace(); // 输出异常日志 + e.printStackTrace(); } + if (processReportDTOList.isEmpty()) { + return null; + } + String latest = processReportDTOList.stream() + .map(JdVersionDTO::getVersion) + .filter(Objects::nonNull) + .max(new VersionComparator()) + .orElse(null); + return latest; + } + /** + * 根据bom版本获取物料清单 + * @param version + * @return + */ + public static List getMaterialUseXByVer(String version) { + K3CloudApi client = new K3CloudApi(); + // 请求参数,要求为json字符串 + JsonObject json = new JsonObject(); + json.addProperty("FormId", "ENG_BOM"); + json.addProperty("FieldKeys", "FNumber,FMATERIALIDCHILD.FNumber,FCHILDITEMNAME,FCHILDUNITID.FName,FNUMERATOR,FDENOMINATOR,F_HBYT_DZ,F_HBYT_CZ"); + JsonArray filterString = new JsonArray(); + JsonObject filterObject = new JsonObject(); + filterObject.addProperty("FieldName", "FNumber"); + filterObject.addProperty("Compare", "67"); + filterObject.addProperty("Value", version); + filterObject.addProperty("Left", ""); + filterObject.addProperty("Right", ""); + filterObject.addProperty("Logic", 0); + filterString.add(filterObject); + JsonObject filterObject1 = new JsonObject(); + filterObject1.addProperty("FieldName", "FForbidStatus"); + filterObject1.addProperty("Compare", "105"); + filterObject1.addProperty("Value", "A"); + filterObject1.addProperty("Left", ""); + filterObject1.addProperty("Right", ""); + filterObject1.addProperty("Logic", 0); + filterString.add(filterObject1); + json.add("FilterString", filterString); + json.addProperty("OrderString", ""); + json.addProperty("TopRowCount", 0); + json.addProperty("StartRow", 0); + json.addProperty("Limit", 2000); + json.addProperty("SubSystemId", ""); - return " "; + String jsonData = json.toString(); + try { + String resultJson = String.valueOf(client.billQuery(jsonData)); + JsonArray jsonArray = new Gson().fromJson(resultJson, JsonArray.class); + if (jsonArray != null && jsonArray.size() > 0) { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(jsonArray.toString(), new TypeReference>() { + }); + } else { + return Collections.emptyList(); + } + } catch (Exception e) { + log.error("调用接口时发生异常: " + e.getMessage(), e); + } + return Collections.emptyList(); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/PartCostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/PartCostServiceImpl.java index 55f9ccd..c2820af 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/PartCostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/PartCostServiceImpl.java @@ -124,24 +124,18 @@ public class PartCostServiceImpl implements IPartCostService { Map uniq = new LinkedHashMap<>(); for (PartCost pc : list) { if (pc == null) continue; - String code = pc.getMaterialCode(); String name = pc.getMaterialName(); BigDecimal cost = pc.getCostPrice(); - // 过滤无效数据 if (StringUtils.isBlank(code) || StringUtils.isBlank(name) || cost == null || cost.compareTo(BigDecimal.ZERO) == 0) { continue; } - // 以 物料编码 + 名称 为唯一键 String key = code + "|" + name; - PartCost existing = uniq.get(key); // 保留 createDate 最新的 - if (existing == null || - (pc.getCreateDate() != null && - (existing.getCreateDate() == null || pc.getCreateDate().after(existing.getCreateDate())))) { + if (existing == null || (pc.getCreateDate() != null && (existing.getCreateDate() == null || pc.getCreateDate().after(existing.getCreateDate())))) { uniq.put(key, pc); } } diff --git a/ruoyi-system/src/main/resources/EXCEL模板/生产及工艺计划模版.xlsx b/ruoyi-system/src/main/resources/EXCEL模板/生产及工艺计划模版.xlsx index 82479b538f6c1a7ebf4066c943d2fbce66c3d965..4e8f264f359949e934fe8b51a3c82c1778c3571b 100644 GIT binary patch delta 8148 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 H-$nl)w&XbN diff --git a/ruoyi-system/src/main/resources/jpg/生产及工艺计划模版.xlsx b/ruoyi-system/src/main/resources/jpg/生产及工艺计划模版.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..caaf06d56309f892f6932d3b385867a2ac56662e GIT binary patch literal 18390 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