From ee1010842bc621d77f12b33209f607afb4284d3d Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Tue, 4 Aug 2026 11:42:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=8E=92=E5=8D=95=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E7=BB=84=E4=BB=B6=E5=88=9B=E5=BB=BA=E6=8E=92=E5=8D=95?= =?UTF-8?q?=E6=8A=A5=E6=96=87=E7=BB=93=E6=9E=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/plan/PlanServiceImpl.java | 104 ++++++++++++++++-- .../producing/ProducingPlanOrderClient.java | 9 +- .../ProducingPlanOrderMaterialGroup.java | 63 +++++++++++ .../ProducingPlanOrderProperties.java | 2 +- .../ProducingPlanOrderClientTest.java | 22 +++- .../factory/ProducingOrderImportFactory.java | 4 +- .../dto/ProducingOrderExtraSyncRequest.java | 4 +- ...oducingOrderItemSerialNoUpdateRequest.java | 4 +- 8 files changed, 196 insertions(+), 16 deletions(-) create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderMaterialGroup.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java index aa63e7498..e41369d45 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java @@ -59,6 +59,7 @@ import com.cf.imes.module.executor.enums.ErrorCodeConstants; import com.cf.imes.module.executor.enums.OrderPlanQueryTypeEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.service.plan.producing.ProducingPlanOrderClient; +import com.cf.imes.module.executor.service.plan.producing.ProducingPlanOrderMaterialGroup; import com.cf.imes.module.system.api.auth.AuthApi; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -76,6 +77,7 @@ import java.time.LocalDateTime; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.pojo.PageParam.PAGE_SIZE_NONE; @@ -168,6 +170,8 @@ public class PlanServiceImpl implements PlanService { String processName = createReqVO.getProcessName(); List planDOS = new ArrayList<>(); + Map producingMaterialGroupByPlanId = + new HashMap<>(); SavePlanPlateList savePlanPlateList = Optional.ofNullable(createReqVO.getSavePlanPlateList()).orElseThrow(()-> new ServiceException(PLAN_PLATE_DATA_ERROR)); @@ -184,7 +188,9 @@ public class PlanServiceImpl implements PlanService { List planActualGoodsLists = Optional.ofNullable(createReqVO.getPlanActualGoodsListList()).orElse(new ArrayList<>()); // 混单时判断是否进行板材对应并创建排单 - mixConfigPlateCorresponding(planActualGoodsLists, plateItemList, goodsItemList, planDOS, processId, processName, loginUser, mixedType); + mixConfigPlateCorresponding(planActualGoodsLists, plateItemList, goodsItemList, + planDOS, producingMaterialGroupByPlanId, processId, processName, + loginUser, mixedType); } else { @@ -195,7 +201,9 @@ public class PlanServiceImpl implements PlanService { // 查找材质和厚度和颜色相同的大板 Map> grouped = groupByMaterialAndThicknessAndColorAndBrand(goodsItemList); - createPlanAndPlateDataList(grouped, plateItemList, planDOS, processId, processName, loginUser, PlanTypeEnum.ORDERPLAN.getType()); + createPlanAndPlateDataList(grouped, plateItemList, goodsItemList, planDOS, + producingMaterialGroupByPlanId, processId, processName, loginUser, + PlanTypeEnum.ORDERPLAN.getType()); } // 计算排单的数量和面积 if (CollUtil.isNotEmpty(planDOS)) { @@ -211,7 +219,7 @@ public class PlanServiceImpl implements PlanService { } // 增加排单 planMapper.insertBatch(planDOS); - createProducingPlanOrders(planDOS); + createProducingPlanOrders(planDOS, producingMaterialGroupByPlanId); } } @@ -1629,6 +1637,7 @@ public class PlanServiceImpl implements PlanService { List plateItemList, List goodsItemList, List planDOS, + Map producingMaterialGroupByPlanId, Long processId, String processName, LoginUser loginUser, @@ -1640,14 +1649,17 @@ public class PlanServiceImpl implements PlanService { if(CollUtil.isNotEmpty(planActualGoodsLists)) { // 有选实际大板的小板加大板创建排单 - getCreatePlanMultipleGoodsList(planActualGoodsLists, plateItemList, planDOS, processId, processName, loginUser); + getCreatePlanMultipleGoodsList(planActualGoodsLists, plateItemList, planDOS, + producingMaterialGroupByPlanId, processId, processName, loginUser); // 不用混单的材质按goodsCode商品编码分组 grouped = groupByGoodsCodeEqualToOne(goodsItemList); if (CollUtil.isNotEmpty(grouped)) { - createPlanAndPlateDataList(grouped, plateItemList, planDOS, processId, processName, loginUser, PlanTypeEnum.ORDERPLAN.getType()); + createPlanAndPlateDataList(grouped, plateItemList, goodsItemList, planDOS, + producingMaterialGroupByPlanId, processId, processName, loginUser, + PlanTypeEnum.ORDERPLAN.getType()); } } else { @@ -1655,7 +1667,9 @@ public class PlanServiceImpl implements PlanService { grouped = groupByGoodsCodeEqualToOne(goodsItemList); if (CollUtil.isNotEmpty(grouped)) { - createPlanAndPlateDataList(grouped, plateItemList, planDOS, processId, processName, loginUser, PlanTypeEnum.ORDERPLAN.getType()); + createPlanAndPlateDataList(grouped, plateItemList, goodsItemList, planDOS, + producingMaterialGroupByPlanId, processId, processName, loginUser, + PlanTypeEnum.ORDERPLAN.getType()); } } @@ -1721,6 +1735,7 @@ public class PlanServiceImpl implements PlanService { private void getCreatePlanMultipleGoodsList(List planActualGoodsLists, List plateItemList, List planDOS, + Map producingMaterialGroupByPlanId, Long processId, String processName, LoginUser loginUser) { @@ -1782,6 +1797,8 @@ public class PlanServiceImpl implements PlanService { .build(); planDOS.add(planDO); + producingMaterialGroupByPlanId.put(planId, + toProducingMaterialGroup(planId, f.getPlanActualGoodsModelDO())); } // 统计更新order_goods的数量和面积 computePlatePlanAndComputeOrderGoodsInfo(allGoodsIds); @@ -1794,7 +1811,9 @@ public class PlanServiceImpl implements PlanService { private void createPlanAndPlateDataList(Map> grouped, List plateItemList, + List goodsItemList, List planDOS, + Map producingMaterialGroupByPlanId, Long processId, String processName, LoginUser loginUser, @@ -1855,6 +1874,11 @@ public class PlanServiceImpl implements PlanService { .build(); planDOS.add(planDO); + goodsItemList.stream() + .filter(goods -> value.contains(goods.getId())) + .findFirst() + .ifPresent(goods -> producingMaterialGroupByPlanId.put(planId, + toProducingMaterialGroup(planId, goods))); } // 统计更新order_goods的数量和面积 computePlatePlanAndComputeOrderGoodsInfo(allGoodsIds); @@ -1973,7 +1997,9 @@ public class PlanServiceImpl implements PlanService { /** * 为包含组件来源板件的本地排单创建组件生产排单。 */ - private void createProducingPlanOrders(List plans) { + private void createProducingPlanOrders( + List plans, + Map materialGroupByPlanId) { String token = null; for (PlanDO plan : plans) { List sourceBlockIds = getSourceBlockIdsByPlanId(plan.getId()); @@ -1984,11 +2010,17 @@ public class PlanServiceImpl implements PlanService { throw new ServiceException(PRODUCING_PLAN_ORDER_SYNC_FAILED, "workflowSchemeId is required"); } + ProducingPlanOrderMaterialGroup materialGroup = + materialGroupByPlanId.get(plan.getId()); + if (materialGroup == null) { + throw new ServiceException(PRODUCING_PLAN_ORDER_SYNC_FAILED, + "customMaterialGroupList is required"); + } if (token == null) { token = getProducingToken(); } Long producingPlanOrderId = producingPlanOrderClient.create( - token, plan.getProcessId(), sourceBlockIds); + token, plan.getProcessId(), sourceBlockIds, List.of(materialGroup)); plan.setProducingPlanOrderId(producingPlanOrderId); planMapper.update(new LambdaUpdateWrapper() .eq(PlanDO::getId, plan.getId()) @@ -1997,6 +2029,62 @@ public class PlanServiceImpl implements PlanService { } } + /** + * 根据普通排单使用的材质属性构建组件生产系统自定义材质分组。 + */ + private ProducingPlanOrderMaterialGroup toProducingMaterialGroup( + Long planId, SavePlanPlateList.GoodsItemList goods) { + return ProducingPlanOrderMaterialGroup.builder() + .id(goods.getGoodsId()) + .name(buildProducingMaterialGroupName( + planId, null, goods.getMaterial(), goods.getColor(), goods.getThickness())) + .type(1) + .thickness(goods.getThickness()) + .hasWave(goods.getTexture()) + .materialIds(Collections.emptyList()) + .brand(goods.getBrand()) + .material(goods.getMaterial()) + .color(goods.getColor()) + .build(); + } + + /** + * 根据混单选择的实际大板属性构建组件生产系统自定义材质分组。 + */ + private ProducingPlanOrderMaterialGroup toProducingMaterialGroup( + Long planId, PlanActualGoodsModelDO goods) { + return ProducingPlanOrderMaterialGroup.builder() + .id(goods.getGoodsId()) + .name(buildProducingMaterialGroupName( + planId, goods.getGoodsName(), goods.getMaterial(), + goods.getColor(), goods.getThickness())) + .type(1) + .thickness(goods.getThickness()) + .materialIds(Collections.emptyList()) + .brand(goods.getBrand()) + .material(goods.getMaterial()) + .color(goods.getColor()) + .build(); + } + + /** + * 生成对方接口必填的材质分组名称。 + */ + private String buildProducingMaterialGroupName( + Long planId, String goodsName, String material, String color, BigDecimal thickness) { + if (StringUtils.isNotBlank(goodsName)) { + return goodsName; + } + String generatedName = Stream.of( + material, + color, + thickness == null ? null : thickness.stripTrailingZeros().toPlainString()) + .filter(StringUtils::isNotBlank) + .collect(Collectors.joining("-")); + return StringUtils.isNotBlank(generatedName) + ? generatedName : String.valueOf(planId); + } + /** * 向已有组件生产排单追加板件。 * diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClient.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClient.java index 36aac75d3..d97027048 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClient.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClient.java @@ -39,8 +39,12 @@ public class ProducingPlanOrderClient { .build(); } - public Long create(String token, Long workflowSchemeId, List blockIds) { - CreateRequest request = new CreateRequest(blockIds, workflowSchemeId); + public Long create(String token, Long workflowSchemeId, List blockIds, + List customMaterialGroupList) { + CreateRequest request = new CreateRequest( + blockIds, workflowSchemeId, customMaterialGroupList); + log.info("Submitting producing plan order customMaterialGroupList={}", + serialize(customMaterialGroupList)); HttpResponse response = send( properties.getBaseUrl(), token, "POST", serialize(request), "create"); try { @@ -175,6 +179,7 @@ public class ProducingPlanOrderClient { private static class CreateRequest { private List blockIds; private Long workflowSchemeId; + private List customMaterialGroupList; } @Data diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderMaterialGroup.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderMaterialGroup.java new file mode 100644 index 000000000..0415f796d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderMaterialGroup.java @@ -0,0 +1,63 @@ +package com.cf.imes.module.executor.service.plan.producing; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 组件生产系统创建生产排单时使用的自定义材质分组。 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ProducingPlanOrderMaterialGroup { + + /** 自定义材质分组 ID。 */ + private String id; + + /** 物料名称。 */ + private String name; + + /** 物料类型,1 表示板材。 */ + private Integer type; + + /** 板材宽度。 */ + private BigDecimal width; + + /** 板材长度。 */ + private BigDecimal length; + + /** 板材厚度。 */ + private BigDecimal thickness; + + /** 是否有纹路。 */ + private Boolean hasWave; + + /** 分组下的物料 ID 列表,当前按接口约定暂不填充。 */ + private List materialIds; + + /** 备注。 */ + private String remark; + + /** 厂家。 */ + private String factory; + + /** 品牌。 */ + private String brand; + + /** 规格。 */ + private String spec; + + /** 材料。 */ + private String material; + + /** 颜色。 */ + private String color; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderProperties.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderProperties.java index 4432e6641..dda6bc88f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderProperties.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderProperties.java @@ -15,7 +15,7 @@ import java.time.Duration; public class ProducingPlanOrderProperties { private String baseUrl = - "http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/plan-order"; + "https://chenfeng.tech:38113/api-branch=opt_split_order/api/v1/producing/plan-order"; private Duration connectTimeout = Duration.ofSeconds(5); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/test/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClientTest.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/test/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClientTest.java index 0a2d564b6..a051913bc 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/test/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClientTest.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/test/java/com/cf/imes/module/executor/service/plan/producing/ProducingPlanOrderClientTest.java @@ -42,7 +42,21 @@ class ProducingPlanOrderClientTest { @Test void shouldUseSourceBlockIdsForAllFourOperations() throws Exception { - Long remotePlanId = client.create("mes-token", 36L, List.of("source-1", "source-2")); + ProducingPlanOrderMaterialGroup materialGroup = + ProducingPlanOrderMaterialGroup.builder() + .id("goods-1") + .name("颗粒板-白色-18") + .type(1) + .thickness(new java.math.BigDecimal("18")) + .hasWave(true) + .materialIds(List.of()) + .brand("测试品牌") + .material("颗粒板") + .color("白色") + .build(); + Long remotePlanId = client.create( + "mes-token", 36L, List.of("source-1", "source-2"), + List.of(materialGroup)); client.appendBlocks("mes-token", remotePlanId, List.of("source-3")); client.deleteBlocks("mes-token", remotePlanId, List.of("source-2")); client.delete("mes-token", remotePlanId); @@ -64,6 +78,12 @@ class ProducingPlanOrderClientTest { assertThat(createBody.get("workflowSchemeId").longValue()).isEqualTo(36L); assertThat(createBody.get("blockIds").toString()) .isEqualTo("[\"source-1\",\"source-2\"]"); + JsonNode materialBody = createBody.get("customMaterialGroupList").get(0); + assertThat(materialBody.get("id").textValue()).isEqualTo("goods-1"); + assertThat(materialBody.get("name").textValue()).isEqualTo("颗粒板-白色-18"); + assertThat(materialBody.get("materialIds").isArray()).isTrue(); + assertThat(materialBody.get("materialIds").isEmpty()).isTrue(); + assertThat(materialBody.get("material").textValue()).isEqualTo("颗粒板"); assertThat(objectMapper.readTree(requests.get(1).body()) .get("appendBlockIds").get(0).textValue()).isEqualTo("source-3"); assertThat(objectMapper.readTree(requests.get(2).body()) diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/ProducingOrderImportFactory.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/ProducingOrderImportFactory.java index 450ff31da..a85b53ee5 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/ProducingOrderImportFactory.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/ProducingOrderImportFactory.java @@ -646,9 +646,9 @@ public class ProducingOrderImportFactory { // 缓存goodCode和orderGoodsId的对应关系 materialMap.put(plateGoodsGoodsId, goodsDO); } - if (StringUtils.isNotEmpty(materialReqVO.getSourceMaterialId())) { + if (StringUtils.isNotEmpty(plateGoodsGoodsId)) { externalMaterialMap.putIfAbsent( - materialReqVO.getSourceMaterialId(), + plateGoodsGoodsId, toExternalBlockMaterial(materialReqVO)); } } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderExtraSyncRequest.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderExtraSyncRequest.java index 78d134b90..d01113efa 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderExtraSyncRequest.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderExtraSyncRequest.java @@ -32,7 +32,9 @@ public class ProducingOrderExtraSyncRequest { private Map parts = new LinkedHashMap<>(); /** - * 对方 materials.id 到 iMES 板材库/配件物料对象的映射,仅包含 type=1/2/3。 + * iMES 物料标识到板材库/配件物料对象的映射。板材(type=1)使用 + * {@code order_goods.goods_id} 作为 key,配件和封边条(type=2/3)使用对方 + * {@code materials.id} 作为 key。 */ @Builder.Default private Map externalMaterialMapping = diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateRequest.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateRequest.java index 6b33bf964..99dbf2687 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateRequest.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateRequest.java @@ -29,7 +29,9 @@ public class ProducingOrderItemSerialNoUpdateRequest { private Map parts = new LinkedHashMap<>(); /** - * 对方 materials.id 到 iMES 板材库/配件物料对象的映射。 + * iMES 物料标识到板材库/配件物料对象的映射。板材(type=1)使用 + * {@code order_goods.goods_id} 作为 key,配件和封边条(type=2/3)使用对方 + * {@code materials.id} 作为 key。 */ private Map externalMaterialMapping = new LinkedHashMap<>();