From ffc22b23b34ab0d640785f4044da1b9259624459 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 3 Aug 2026 17:05:15 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81OrderModelDO=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=AD=97=E6=AE=B5=EF=BC=9B2=E3=80=81?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E4=B8=9A=E5=8A=A1=E6=95=B0=E6=8D=AE=E6=8B=89?= =?UTF-8?q?=E5=8F=96=E6=94=B9=E5=8A=A8=EF=BC=9A=E5=8F=8D=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E8=AE=A2=E5=8D=95+=E6=9D=BF=E4=BB=B6/=E9=85=8D=E4=BB=B6?= =?UTF-8?q?=E5=90=88=E4=B8=BA=E4=B8=80=E4=B8=AA=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E6=9A=82=E6=97=B6=E6=B3=A8=E9=87=8A=E5=8F=8D=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=9D=BF=E6=9D=90=EF=BC=88=E7=BB=84=E4=BB=B6=E6=8A=A5=E9=94=99?= =?UTF-8?q?=EF=BC=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../optimizeplan/OptimizePlanServiceImpl.java | 24 ++-- .../service/plate/PlateServiceImpl.java | 11 +- .../veneer/VeneerDecomposeServiceImpl.java | 9 +- .../veneer/VeneerManageServiceImpl.java | 5 +- ...ducingOrderImportTransactionalService.java | 35 +++-- .../factory/ProducingOrderImportFactory.java | 115 ++++++++++++++-- .../producing/ProducingOrderClient.java | 125 +++++++++++------- .../producing/ProducingOrderConverter.java | 71 +++++++++- .../dto/ProducingExternalMaterial.java | 32 +++++ .../producing/dto/ProducingImportData.java | 5 + .../dto/ProducingImportMaterial.java | 7 + .../producing/dto/ProducingImportPart.java | 5 + .../dto/ProducingOrderExtraSyncRequest.java | 40 ++++++ ...oducingOrderItemSerialNoUpdateRequest.java | 6 + ...ducingOrderItemSerialNoUpdateResponse.java | 6 +- .../producing/dto/ProducingOrderResponse.java | 3 + .../ProducingOrderImportProperties.java | 8 +- .../src/main/resources/application-dev.yaml | 1 - .../src/main/resources/application-local.yaml | 1 - 19 files changed, 407 insertions(+), 102 deletions(-) create mode 100644 cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingExternalMaterial.java create mode 100644 cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderExtraSyncRequest.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index a20a4e5fd..7058ecfb3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -278,9 +278,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List models = plateDOS.stream() - .map(PlateDetailDO::getModelData) - .filter(StringUtils::isNotBlank) - .map(json -> parseObject(json, OrderModelDO.class)) + .filter(plate -> StringUtils.isNotBlank(plate.getModelData())) + .map(this::parseOrderModelWithPlateId) .toList(); AssertUtils.notEmpty(models, ORDER_PLATE_MODEL_DATE_ERROR); @@ -345,9 +344,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List models = plateDetailRespVOS.stream() - .map(PlateDetailDO::getModelData) - .filter(StringUtils::isNotBlank) - .map(json -> parseObject(json, OrderModelDO.class)) + .filter(plate -> StringUtils.isNotBlank(plate.getModelData())) + .map(this::parseOrderModelWithPlateId) .toList(); AssertUtils.notEmpty(models, ORDER_PLAN_PLATE_MODEL_DATE_ERROR); @@ -743,9 +741,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List models = resultPlateList.stream() - .map(PlateDetailDO::getModelData) - .filter(StringUtils::isNotBlank) - .map(json -> parseObject(json, OrderModelDO.class)) + .filter(plate -> StringUtils.isNotBlank(plate.getModelData())) + .map(this::parseOrderModelWithPlateId) .toList(); AssertUtils.notEmpty(plateDetailRespVOS, ORDER_PLATE_MODEL_DATE_ERROR); @@ -759,6 +756,15 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } + /** + * 解析板件造型数据,并以板件表查询结果中的主键为准补充板件 ID。 + */ + private OrderModelDO parseOrderModelWithPlateId(PlateDetailDO plate) { + OrderModelDO model = parseObject(plate.getModelData(), OrderModelDO.class); + model.setPlateId(plate.getPlateId()); + return model; + } + /** * 合并加工组、部件名称 * diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java index 47dfd06ef..b489b3187 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java @@ -390,9 +390,12 @@ public class PlateServiceImpl implements PlateService { List models = resultPlateList.stream() - .map(PlateDetailDO::getModelData) - .filter(StringUtils::isNotBlank) - .map(json -> JsonUtils.parseObject(json, OrderModelDO.class)) + .filter(plate -> StringUtils.isNotBlank(plate.getModelData())) + .map(plate -> { + OrderModelDO model = JsonUtils.parseObject(plate.getModelData(), OrderModelDO.class); + model.setPlateId(plate.getPlateId()); + return model; + }) .toList(); return NoPlanPlateRespVO.builder() @@ -1354,4 +1357,4 @@ public class PlateServiceImpl implements PlateService { return orderComponentService.getOrderViewCadInfo(detailReqVO); } -} \ No newline at end of file +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java index 0491ef46c..143f1f19c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerDecomposeServiceImpl.java @@ -179,9 +179,12 @@ public class VeneerDecomposeServiceImpl implements VeneerDecomposeService { private VeneerDecomposePlateDataRespVO buildPlateData(List rawPlates) { List plates = mergePlateDetails(rawPlates); List plateModels = plates.stream() - .map(VeneerDecomposePlateRespVO::getModelData) - .filter(StrUtil::isNotBlank) - .map(modelData -> JsonUtils.parseObject(modelData, OrderModelDO.class)) + .filter(plate -> StrUtil.isNotBlank(plate.getModelData())) + .map(plate -> { + OrderModelDO model = JsonUtils.parseObject(plate.getModelData(), OrderModelDO.class); + model.setPlateId(plate.getPlateId()); + return model; + }) .toList(); return VeneerDecomposePlateDataRespVO.builder() .plateList(plates) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java index 7025abb05..d187e2c93 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/veneer/VeneerManageServiceImpl.java @@ -193,8 +193,9 @@ public class VeneerManageServiceImpl implements VeneerManageService { for (UnplannedVeneerPlateRespVO plate : plates) { if (plate.getPlateId() != null && StrUtil.isNotBlank(plate.getModelData()) && !modelMap.containsKey(plate.getPlateId())) { - modelMap.put(plate.getPlateId(), - JsonUtils.parseObject(plate.getModelData(), OrderModelDO.class)); + OrderModelDO model = JsonUtils.parseObject(plate.getModelData(), OrderModelDO.class); + model.setPlateId(plate.getPlateId()); + modelMap.put(plate.getPlateId(), model); } } List plateModels = new ArrayList<>(modelMap.values()); diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/ProducingOrderImportTransactionalService.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/ProducingOrderImportTransactionalService.java index 426f9d5dc..d5ef93a5b 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/ProducingOrderImportTransactionalService.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/ProducingOrderImportTransactionalService.java @@ -22,6 +22,7 @@ import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateServic import com.cf.imes.module.plan.service.orderImport.factory.ProducingOrderImportFactory; import com.cf.imes.module.plan.service.orderImport.producing.ProducingOrderClient; import com.cf.imes.module.plan.service.orderImport.producing.ProducingOrderConverter; +import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderExtraSyncRequest; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderExtraUpdateRequest; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderItemSerialNoUpdateRequest; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderItemSerialNoUpdateResponse; @@ -128,16 +129,13 @@ public class ProducingOrderImportTransactionalService { logStage(request, "factory", stageStartedAt); // 反向同步放在本地事务末尾:任一接口失败都会触发本地导入回滚。 - stageStartedAt = System.nanoTime(); - producingOrderClient.updateOrderExtra( - request.getSourceOrderId(), token, - buildOrderExtraRequest(order, request.getSourceOrderId())); - logStage(request, "sync-order-extra", stageStartedAt); - stageStartedAt = System.nanoTime(); ProducingOrderItemSerialNoUpdateResponse serialNoResponse = - producingOrderClient.updateItemSerialNos(token, serialNoRequest); - logStage(request, "sync-item-serial-no", stageStartedAt); + producingOrderClient.updateOrderExtra( + request.getSourceOrderId(), token, + buildOrderExtraSyncRequest( + order, request.getSourceOrderId(), serialNoRequest)); + logStage(request, "sync-order-extra-and-serial-no", stageStartedAt); log.info("[producing-import-sync] sourceOrderId={} targetOrderId={} " + "blocksSubmitted={} partsSubmitted={} blocksUpdated={} partsUpdated={}", request.getSourceOrderId(), request.getTargetOrderId(), @@ -149,11 +147,28 @@ public class ProducingOrderImportTransactionalService { elapsedMillis(totalStartedAt)); } + /** + * 组装单头与生产项外部序列号的一体化反向同步报文。 + * + *

直接复用本次导入在内存中形成的映射,不重新查询数据库。

+ */ + private ProducingOrderExtraSyncRequest buildOrderExtraSyncRequest( + OrderDO order, + String sourceOrderId, + ProducingOrderItemSerialNoUpdateRequest serialNoRequest) { + return ProducingOrderExtraSyncRequest.builder() + .extra(buildOrderExtraRequest(order, sourceOrderId)) + .blocks(serialNoRequest.getBlocks()) + .parts(serialNoRequest.getParts()) +// .externalMaterialMapping(serialNoRequest.getExternalMaterialMapping()) + .build(); + } + /** * 将 iMES 订单字段转换为对方完整订单单头。 * - *

{@code customSerialNo} 严格使用 {@code orders.custom_order_no}; - * iMES 当前没有客户、经销商和人员业务 ID,因此嵌套对象 ID 传空字符串。

+ *

{@code customSerialNo} 使用 {@code orders.custom_order_no};iMES 暂无对应的 + * 联系人和人员业务 ID,因此嵌套对象 ID 按接口约定传空字符串。

*/ private ProducingOrderExtraUpdateRequest buildOrderExtraRequest( OrderDO order, String sourceOrderId) { 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 920895a9a..450ff31da 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 @@ -32,6 +32,7 @@ import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingImport import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingImportPart; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingImportProcessGroup; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingImportData; +import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingExternalMaterial; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderItemSerialNoUpdateRequest; import com.cf.imes.module.plan.dal.dataobject.goods.GoodsDO; import com.cf.imes.module.plan.dal.dataobject.ordecomponent.OrderComponentDO; @@ -183,6 +184,9 @@ public class ProducingOrderImportFactory { // 对方 partsItems.id:iMES 基础 order_item.id private Map partSerialNoMap = new LinkedHashMap<>(); + // 对方 materials.id:iMES 板材库/配件物料对象 + private Map externalMaterialMap = new LinkedHashMap<>(); + private List plateDOS = ListUtils.newArrayListWithExpectedSize(ORDER_PLATE_BATCH_THRESHOLD_NUMBER); private List orderItemDOS = ListUtils.newArrayListWithExpectedSize(ORDER_ITEM_BATCH_THRESHOLD_NUMBER); private List orderPartsDOS = new ArrayList<>(); @@ -349,7 +353,8 @@ public class ProducingOrderImportFactory { int itemRowsBeforeParts = itemBatchRows; int partRowsBeforeParts = partBatchRows; stageStartedAt = System.nanoTime(); - analyzeParts(producingImportData.getParts()); + analyzeParts(producingImportData.getParts(), + producingImportData.getStandaloneSealMaterials()); long partsElapsedNanos = System.nanoTime() - stageStartedAt; logStage("parts", stageStartedAt); logPartsPerformanceDetail(partsElapsedNanos, @@ -397,7 +402,8 @@ public class ProducingOrderImportFactory { return new ProducingOrderItemSerialNoUpdateRequest( new LinkedHashMap<>(blockSerialNoMap), - new LinkedHashMap<>(partSerialNoMap)); + new LinkedHashMap<>(partSerialNoMap), + new LinkedHashMap<>(externalMaterialMap)); } catch (Exception e) { throw e; } finally { @@ -640,6 +646,11 @@ public class ProducingOrderImportFactory { // 缓存goodCode和orderGoodsId的对应关系 materialMap.put(plateGoodsGoodsId, goodsDO); } + if (StringUtils.isNotEmpty(materialReqVO.getSourceMaterialId())) { + externalMaterialMap.putIfAbsent( + materialReqVO.getSourceMaterialId(), + toExternalBlockMaterial(materialReqVO)); + } } } @@ -1314,7 +1325,6 @@ public class ProducingOrderImportFactory { ProducingImportBlock.PointInfoDTO pointInfo = block.getPointInfo(); OrderModelDO orderModelDO = OrderModelDO.builder() - .plateId(plateDO.getId()) .texture(block.getTexture()) .typographicFace(block.getHoleArrange()) .openDoorType(block.getOpenDoorType()) @@ -1349,8 +1359,6 @@ public class ProducingOrderImportFactory { } orderModelDO.setPlateExtraRemark(plateExtraRemark); - orderModelDO.setGoodsId(block.getGoodsCode()); - orderModelDO.setPlateGoodsId(plateDO.getGoodsId()); return orderModelDO; } @@ -1867,10 +1875,12 @@ public class ProducingOrderImportFactory { /** * 解析配件列表 * - * @param parts + * @param parts 有实际柜体归属的配件 + * @param standaloneSealMaterials 仅由板件引用的订单级封边条物料 */ - private void analyzeParts(List parts) { - if (ObjectUtil.isNull(parts)) { + private void analyzeParts(List parts, + List standaloneSealMaterials) { + if (CollUtil.isEmpty(parts) && CollUtil.isEmpty(standaloneSealMaterials)) { return; } log.debug("====================【cad拆单获取封边配置开始】===================="); @@ -1878,7 +1888,14 @@ public class ProducingOrderImportFactory { getOrgSealEdgeConfig(); log.debug("====================【cad拆单获取封边配置结束】===================="); - for (ProducingImportRoomTree room : parts) { + if (CollUtil.isNotEmpty(standaloneSealMaterials)) { + for (ProducingImportPart sealMaterial : standaloneSealMaterials) { + analyzeOrderPart(sealMaterial); + } + } + + for (ProducingImportRoomTree room : parts == null + ? Collections.emptyList() : parts) { // 房间名 String roomName = room.getName(); @@ -2217,6 +2234,67 @@ public class ProducingOrderImportFactory { // orderpart id回显到配件 part.setImesPartsId(orderPartId); } + if (StringUtils.isNotEmpty(part.getSourceMaterialId())) { + externalMaterialMap.putIfAbsent( + part.getSourceMaterialId(), toExternalPartMaterial(part)); + } + } + + /** + * 将前端映射后的 iMES 板材库属性转换为对方 ProductMaterial(type=1)。 + */ + private ProducingExternalMaterial toExternalBlockMaterial( + ProducingImportMaterial material) { + return ProducingExternalMaterial.builder() + .id(material.getId()) + .type(1) + .name(material.getName()) + .remark(getEmpty(material.getRemark())) + .brand(material.getBrand()) + .spec(material.getSpec()) + .material(material.getMaterial()) + .color(material.getColor()) + .width(material.getWidth()) + .length(material.getHeight()) + .thickness(material.getThickness()) + .hasWave(material.getTexture()) + .build(); + } + + /** + * 将本次生成或复用的 iMES 配件属性转换为对方 ProductMaterial(type=2/3)。 + */ + private ProducingExternalMaterial toExternalPartMaterial(ProducingImportPart part) { + boolean sealMaterial = PART_CATEGORY_ONE.equals(part.getType()); + ProducingImportPart.GroupData groupData = part.getGroupData(); + String material = sealMaterial && groupData != null + ? groupData.getMaterial() + : StringUtils.isNotEmpty(part.getMaterial()) + ? part.getMaterial() : getFieldFromSpec(part.getSpec(), 1); + String color = sealMaterial && groupData != null + ? groupData.getColor() + : StringUtils.isNotEmpty(part.getColor()) + ? part.getColor() : getFieldFromSpec(part.getSpec(), 2); + return ProducingExternalMaterial.builder() + .id(String.valueOf(part.getImesPartsId())) + .type(sealMaterial ? 3 : 2) + .name(part.getName()) + .remark(getEmpty(part.getRemark())) + .factory(part.getFactory()) + .brand(part.getBrand()) + .spec(sealMaterial ? part.getSpec() : getFieldFromSpec(part.getSpec(), 0)) + .material(getEmpty(material)) + .color(getEmpty(color)) + .model(part.getModel()) + .width(sealMaterial ? nullableDouble(part.getWidth()) : null) + .size(sealMaterial && groupData != null && groupData.getSize() != null + ? groupData.getSize().doubleValue() : null) + .build(); + } + + /** 将可空配件尺寸转换为数字,空值继续保持为空。 */ + private Double nullableDouble(String value) { + return StringUtils.isEmpty(value) ? null : NumberUtil.parseDouble(value); } /** @@ -2747,9 +2825,21 @@ public class ProducingOrderImportFactory { } else { ps.setNull(20, Types.INTEGER); } - ps.setLong(21, item.getBodyId()); - ps.setString(22, item.getBodyName()); - ps.setString(23, item.getRoomName()); + if (item.getBodyId() != null) { + ps.setLong(21, item.getBodyId()); + } else { + ps.setNull(21, Types.BIGINT); + } + if (StringUtils.isNotEmpty(item.getBodyName())) { + ps.setString(22, item.getBodyName()); + } else { + ps.setNull(22, Types.VARCHAR); + } + if (StringUtils.isNotEmpty(item.getRoomName())) { + ps.setString(23, item.getRoomName()); + } else { + ps.setNull(23, Types.VARCHAR); + } } /** {@inheritDoc} */ @@ -2982,6 +3072,7 @@ public class ProducingOrderImportFactory { componentGroupMap = null; blockSerialNoMap = null; partSerialNoMap = null; + externalMaterialMap = null; plateDOS = null; orderItemDOS = null; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderClient.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderClient.java index bc539d930..b999c2d0c 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderClient.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderClient.java @@ -1,9 +1,7 @@ package com.cf.imes.module.plan.service.orderImport.producing; import com.cf.imes.framework.common.exception.ServiceException; -import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderApiResult; -import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderExtraUpdateRequest; -import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderItemSerialNoUpdateRequest; +import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderExtraSyncRequest; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderItemSerialNoUpdateResponse; import com.cf.imes.module.plan.service.orderImport.producing.dto.ProducingOrderResponse; import com.cf.imes.module.plan.service.orderImport.property.ProducingOrderImportProperties; @@ -36,6 +34,11 @@ import static com.cf.imes.module.plan.enums.ErrorCodeConstants.PRODUCING_ORDER_S @Slf4j public class ProducingOrderClient { + /** + * 外部接口报文的最大日志长度,避免批量序列号同步失败时输出过大的日志。 + */ + private static final int MAX_LOG_PAYLOAD_LENGTH = 16_384; + private final ProducingOrderImportProperties properties; private final ObjectMapper objectMapper; private final HttpClient httpClient; @@ -107,68 +110,40 @@ public class ProducingOrderClient { } /** - * 用 iMES 订单信息完整替换对方订单单头。 + * 一次性完整替换对方订单单头,并回写板件、配件外部序列号。 * * @param orderId 对方组件生产系统订单 ID * @param token MES JWT,不包含 {@code Bearer } 前缀 - * @param request iMES 订单单头 + * @param request iMES 订单单头及板件、配件映射 + * @return 对方实际更新的板件和配件数量 */ - public void updateOrderExtra(String orderId, - String token, - ProducingOrderExtraUpdateRequest request) { + public ProducingOrderItemSerialNoUpdateResponse updateOrderExtra( + String orderId, + String token, + ProducingOrderExtraSyncRequest request) { String encodedOrderId = URLEncoder.encode(orderId, StandardCharsets.UTF_8); URI uri = URI.create(properties.getOrderExtraUrl().replace("{id}", encodedOrderId)); HttpResponse response = sendPut( uri, token, serializeSyncRequest(request), "order-extra"); + if (!StringUtils.hasText(response.body())) { + throw new ServiceException(PRODUCING_ORDER_SYNC_FAILED, + "order-extra: empty response"); + } try { - ProducingOrderApiResult result = objectMapper.readValue( - response.body(), ProducingOrderApiResult.class); + ProducingOrderItemSerialNoUpdateResponse result = objectMapper.readValue( + response.body(), ProducingOrderItemSerialNoUpdateResponse.class); if (result == null || !result.isSuccess()) { String message = result == null ? "empty response" : result.getMessage(); throw new ServiceException(PRODUCING_ORDER_SYNC_FAILED, "order-extra: " + message); } + return result; } catch (JsonProcessingException ex) { throw new ServiceException(PRODUCING_ORDER_SYNC_FAILED, "order-extra: invalid JSON response"); } } - /** - * 批量回写板件编号和配件基础 {@code order_item.id}。 - * - *

接口返回的实际更新数量仅用于日志,不参与事务成功判断。

- * - * @param token MES JWT,不包含 {@code Bearer } 前缀 - * @param request 对方生产项 ID 与 iMES 编号的映射 - * @return 对方返回的实际更新数量;响应体无法解析时返回空计数对象 - */ - public ProducingOrderItemSerialNoUpdateResponse updateItemSerialNos( - String token, - ProducingOrderItemSerialNoUpdateRequest request) { - URI uri = URI.create(properties.getItemSerialNoUrl()); - HttpResponse response = sendPut( - uri, token, serializeSyncRequest(request), "item-serial-no"); - if (!StringUtils.hasText(response.body())) { - return new ProducingOrderItemSerialNoUpdateResponse(); - } - try { - ProducingOrderItemSerialNoUpdateResponse result = objectMapper.readValue( - response.body(), ProducingOrderItemSerialNoUpdateResponse.class); - if (result != null && !result.isSuccess()) { - throw new ServiceException(PRODUCING_ORDER_SYNC_FAILED, - "item-serial-no: " + result.getMessage()); - } - return result == null - ? new ProducingOrderItemSerialNoUpdateResponse() : result; - } catch (JsonProcessingException ex) { - // HTTP 已成功时不因观测字段无法解析而回滚,避免对方已更新、iMES 却回滚。 - log.warn("Producing item serial number response cannot be parsed; " - + "ignore update counts", ex); - return new ProducingOrderItemSerialNoUpdateResponse(); - } - } - /** * 序列化反向同步请求。 */ @@ -200,23 +175,49 @@ public class ProducingOrderClient { int maxAttempts = Math.max(1, properties.getNetworkRetryTimes() + 1); IOException lastNetworkError = null; for (int attempt = 1; attempt <= maxAttempts; attempt++) { + long startedAt = System.nanoTime(); + log.info("[producing-order-http] operation={} method=PUT uri={} attempt={}/{} requestBytes={}", + operation, uri, attempt, maxAttempts, utf8Length(body)); + log.debug("[producing-order-http-request] operation={} uri={} body={}", + operation, uri, logPayload(body)); try { HttpResponse response = httpClient.send( request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + long elapsedMs = elapsedMillis(startedAt); + String responseBody = response.body(); if (response.statusCode() < 200 || response.statusCode() >= 300) { + log.error("[producing-order-http-error] operation={} method=PUT uri={} " + + "attempt={}/{} status={} elapsedMs={} requestBody={} responseBody={}", + operation, uri, attempt, maxAttempts, response.statusCode(), elapsedMs, + logPayload(body), logPayload(responseBody)); throw new ServiceException(PRODUCING_ORDER_SYNC_FAILED, - operation + ": HTTP " + response.statusCode()); + operation + ": HTTP " + response.statusCode() + + ", response=" + logPayload(responseBody)); } + log.info("[producing-order-http] operation={} method=PUT uri={} attempt={}/{} " + + "status={} elapsedMs={} responseBytes={}", + operation, uri, attempt, maxAttempts, response.statusCode(), elapsedMs, + utf8Length(responseBody)); + log.debug("[producing-order-http-response] operation={} uri={} body={}", + operation, uri, logPayload(responseBody)); return response; } catch (InterruptedException ex) { Thread.currentThread().interrupt(); + log.error("[producing-order-http-error] operation={} method=PUT uri={} " + + "attempt={}/{} elapsedMs={} error=request-interrupted", + operation, uri, attempt, maxAttempts, elapsedMillis(startedAt)); throw new ServiceException(PRODUCING_ORDER_SYNC_FAILED, operation + ": request interrupted"); } catch (IOException ex) { lastNetworkError = ex; if (attempt < maxAttempts) { - log.warn("Producing order sync operation {} failed on attempt {}, retrying", - operation, attempt, ex); + log.warn("[producing-order-http-error] operation={} method=PUT uri={} " + + "attempt={}/{} elapsedMs={} retry=true", + operation, uri, attempt, maxAttempts, elapsedMillis(startedAt), ex); + } else { + log.error("[producing-order-http-error] operation={} method=PUT uri={} " + + "attempt={}/{} elapsedMs={} retry=false", + operation, uri, attempt, maxAttempts, elapsedMillis(startedAt), ex); } } } @@ -225,4 +226,32 @@ public class ProducingOrderClient { throw new ServiceException(PRODUCING_ORDER_SYNC_FAILED, operation + ": " + message); } + + /** + * 将外部接口报文限制在可控的日志长度内;空响应使用明确占位符表示。 + */ + private String logPayload(String payload) { + if (!StringUtils.hasText(payload)) { + return ""; + } + if (payload.length() <= MAX_LOG_PAYLOAD_LENGTH) { + return payload; + } + return payload.substring(0, MAX_LOG_PAYLOAD_LENGTH) + + "..."; + } + + /** + * 计算HTTP报文的UTF-8字节数。 + */ + private int utf8Length(String payload) { + return payload == null ? 0 : payload.getBytes(StandardCharsets.UTF_8).length; + } + + /** + * 将纳秒计时转换为毫秒。 + */ + private long elapsedMillis(long startedAt) { + return (System.nanoTime() - startedAt) / 1_000_000; + } } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderConverter.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderConverter.java index 49860cc67..575626370 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderConverter.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/ProducingOrderConverter.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -89,6 +90,7 @@ public class ProducingOrderConverter { result.setCadViewFileId(cadViewFileId); result.setUseConcreteProcessGroupName(true); result.setMaterials(toMaterials(context, request.getMaterialMappings(), mappedPlateGoods)); + result.setStandaloneSealMaterials(toStandaloneSealMaterials(context)); result.setProcessGroup(toProcessGroups(context)); result.setComponentGroup(toComponentGroups(context)); @@ -431,9 +433,11 @@ public class ProducingOrderConverter { } PlateGoodDO source = mappedPlateGoods.get(mapping.getSourceMaterialId()); ProducingImportMaterial target = new ProducingImportMaterial(); + target.setSourceMaterialId(mapping.getSourceMaterialId()); target.setId(String.valueOf(source.getId())); target.setGoodsId(source.getGoodsId()); target.setName(source.getGoodsName()); + target.setRemark(source.getRemark()); target.setMaterial(source.getMaterial()); target.setColor(source.getColor()); target.setTexture(Boolean.TRUE.equals(source.getTexture())); @@ -447,6 +451,68 @@ public class ProducingOrderConverter { return result; } + /** + * 将仅由板件 sealIds 引用的 type=3 物料转换为订单级封边条。 + * + *

已经通过 partsItems 导入的封边条不重复创建;该列表只生成 order_parts, + * 不生成没有实际归属关系的 order_item。

+ */ + private List toStandaloneSealMaterials(Context context) { + Set partMaterialIds = safe(context.order.getPartsItems()).stream() + .map(item -> context.parts.get(item.getRelationId())) + .filter(Objects::nonNull) + .map(ProducingOrderResponse.Part::getMaterialId) + .collect(Collectors.toSet()); + Set sealMaterialIds = safe(context.order.getBlockList()).stream() + .flatMap(block -> safe(block.getSealIds()).stream()) + .filter(id -> !partMaterialIds.contains(id)) + .collect(Collectors.toCollection(LinkedHashSet::new)); + List result = new ArrayList<>(); + for (String materialId : sealMaterialIds) { + ProducingOrderResponse.Material material = context.materials.get(materialId); + if (material == null || !Objects.equals(material.getType(), 3)) { + continue; + } + ProducingImportPart target = new ProducingImportPart(); + target.setName(material.getName()); + target.setType(SEAL_PART_GROUP); + target.setModel(empty(material.getModel())); + target.setSpec(empty(material.getSpec())); + target.setWidth(numberText(material.getWidth())); + target.setHeight("0"); + target.setThickness(numberText(material.getSize())); + target.setMaterial(empty(material.getMaterial())); + target.setColor(sealPartColor(material)); + target.setBrand(empty(material.getBrand())); + target.setFactory(empty(material.getFactory())); + target.setUnit(""); + target.setNum(1D); + target.setIsComposite(false); + target.setRemark(empty(material.getRemark())); + target.setSourceMaterialId(material.getId()); + + ProducingImportPart.GroupData groupData = new ProducingImportPart.GroupData(); + groupData.setSize(integerValue(material.getSize())); + groupData.setThickness(integerValue(material.getWidth())); + groupData.setMaterial(empty(material.getMaterial())); + groupData.setColor(sealPartColor(material)); + groupData.setBoardName(material.getName()); + target.setGroupData(groupData); + result.add(target); + } + return result; + } + + /** 将可空数字转换为原拆单配件使用的字符串,缺失时按 0。 */ + private String numberText(Double value) { + return String.valueOf(zero(value)); + } + + /** 将可空封边尺寸转换为原拆单结构使用的整数。 */ + private Integer integerValue(Double value) { + return value == null ? 0 : value.intValue(); + } + /** * 将 type=3 加工组类型及其 type=4 加工组转换为原导入结构。 */ @@ -991,6 +1057,7 @@ public class ProducingOrderConverter { target.setRemark(remarksText(effectivePartRemarks(item, part))); target.setObjectId(partCadViewId(context, part.getId())); target.setSourcePartsItemId(item.getId()); + target.setSourceMaterialId(part.getMaterialId()); target.setGroupIds(parseIds(item.getProcessGroupIds(), "process group")); target.setComponentIds(isNoComponent(item.getComponentGroupId()) ? new ArrayList<>() @@ -999,8 +1066,8 @@ public class ProducingOrderConverter { if (sealPart) { ProducingImportPart.GroupData groupData = new ProducingImportPart.GroupData(); - groupData.setSize(0); - groupData.setThickness(0); + groupData.setSize(integerValue(material.getSize())); + groupData.setThickness(integerValue(material.getWidth())); groupData.setMaterial(target.getMaterial()); groupData.setColor(sealPartColor(material)); groupData.setBoardName(material.getName()); diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingExternalMaterial.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingExternalMaterial.java new file mode 100644 index 000000000..80c03b635 --- /dev/null +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingExternalMaterial.java @@ -0,0 +1,32 @@ +package com.cf.imes.module.plan.service.orderImport.producing.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +/** + * 反向同步给组件系统的 iMES 物料对象。 + * + *

字段遵循对方 ProductMaterial 结构:1=板材、2=五金、3=封边条。

+ */ +@Data +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ProducingExternalMaterial { + + private String id; + private Integer type; + private String name; + private String remark; + private String factory; + private String brand; + private String spec; + private String material; + private String color; + private String model; + private Double width; + private Double length; + private Double thickness; + private Double size; + private Boolean hasWave; +} diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportData.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportData.java index a8dcc3a6a..b5e5a9943 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportData.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportData.java @@ -31,6 +31,11 @@ public class ProducingImportData { @JsonProperty(value = "Parts") private List Parts; + /** + * 被板件 sealIds 引用、但没有对应 partsItems 的订单级封边条物料。 + */ + private List standaloneSealMaterials; + @JsonProperty(value = "ProcessGroup") @Valid private List ProcessGroup; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportMaterial.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportMaterial.java index f93dc2adf..504533cc5 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportMaterial.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportMaterial.java @@ -28,12 +28,19 @@ public class ProducingImportMaterial { private String name; + private String remark; + private boolean texture; private String spec; private String id; + /** + * 对方板材的 {@code materials[].id}。 + */ + private String sourceMaterialId; + /** * 获取板材纹理标识。 * diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportPart.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportPart.java index 069a2c650..0fcc7a2a7 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportPart.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingImportPart.java @@ -58,6 +58,11 @@ public class ProducingImportPart { */ private String sourcePartsItemId; + /** + * 对方配件或封边条的 {@code materials[].id}。 + */ + private String sourceMaterialId; + private Long imesPartsId; private List groupIds = new ArrayList<>(); 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 new file mode 100644 index 000000000..78d134b90 --- /dev/null +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderExtraSyncRequest.java @@ -0,0 +1,40 @@ +package com.cf.imes.module.plan.service.orderImport.producing.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 组件生产单单头与生产项外部序列号的合并更新请求。 + * + *

{@code extra} 使用完整替换语义;{@code blocks} 和 {@code parts} 的键分别为 + * 对方 {@code blockItems.id}/{@code partsItems.id},值为 iMES 生成的板件号和配件短号。

+ */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProducingOrderExtraSyncRequest { + + /** 需要反向同步的 iMES 订单单头,接口必填。 */ + private ProducingOrderExtraUpdateRequest extra; + + /** 对方板件实例 ID 到 iMES 板件号的映射。 */ + @Builder.Default + private Map blocks = new LinkedHashMap<>(); + + /** 对方配件实例 ID 到 iMES 配件短号的映射。 */ + @Builder.Default + private Map parts = new LinkedHashMap<>(); + + /** + * 对方 materials.id 到 iMES 板材库/配件物料对象的映射,仅包含 type=1/2/3。 + */ + @Builder.Default + private Map externalMaterialMapping = + new LinkedHashMap<>(); +} 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 43cddb745..6b33bf964 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 @@ -27,4 +27,10 @@ public class ProducingOrderItemSerialNoUpdateRequest { * 对方配件实例 ID 到 iMES 基础 {@code order_item.id} 的映射。 */ private Map parts = new LinkedHashMap<>(); + + /** + * 对方 materials.id 到 iMES 板材库/配件物料对象的映射。 + */ + private Map externalMaterialMapping = + new LinkedHashMap<>(); } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateResponse.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateResponse.java index 700ba6b71..e348256c6 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateResponse.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderItemSerialNoUpdateResponse.java @@ -5,10 +5,10 @@ import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; /** - * 对方批量更新生产项外部序列号的响应。 + * 对方合并更新订单单头及生产项外部序列号的响应。 * - *

实际接口使用通用响应外壳,将更新数量放在 {@code data} 中; - * 同时保留对文档所示顶层更新数量字段的兼容。更新数量仅用于日志观测, + *

兼容接口文档所示的顶层更新数量,以及部署环境可能使用的通用响应外壳。 + * 更新数量仅用于日志观测, * 不作为本地事务提交条件。

*/ @Data diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderResponse.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderResponse.java index 69e730438..39536ae83 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderResponse.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/producing/dto/ProducingOrderResponse.java @@ -2,6 +2,7 @@ package com.cf.imes.module.plan.service.orderImport.producing.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; @@ -53,10 +54,12 @@ public class ProducingOrderResponse { @Data @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) public static class Material { private String id; private Integer type; private String name; + private String remark; private String factory; private String brand; private String spec; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/property/ProducingOrderImportProperties.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/property/ProducingOrderImportProperties.java index ca97e0e80..fa73fa7be 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/property/ProducingOrderImportProperties.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/property/ProducingOrderImportProperties.java @@ -9,7 +9,7 @@ import java.time.Duration; /** * 组件生产单拉取及导入配置。 * - *

统一管理对方订单查询、单头回写、生产项编号回写接口, + *

统一管理对方订单查询、单头及生产项编号合并回写接口, * HTTP 超时和重试策略,以及单订单板件数量上限。

*/ @Data @@ -29,12 +29,6 @@ public class ProducingOrderImportProperties { private String orderExtraUrl = "http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/{id}/extra"; - /** - * 批量更新板件、配件外部序列号的接口地址。 - */ - private String itemSerialNoUrl = - "http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/items/serial-no"; - /** * 建立 HTTP 连接的超时时间。 */ diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-dev.yaml b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-dev.yaml index d2261ab98..a037584dd 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-dev.yaml +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-dev.yaml @@ -167,7 +167,6 @@ chenfeng: producing-order: order-url: http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/{id} order-extra-url: http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/{id}/extra - item-serial-no-url: http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/items/serial-no connect-timeout: 5s read-timeout: 60s sync-read-timeout: 10s diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-local.yaml b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-local.yaml index f1c058334..c6a4a00a3 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-local.yaml +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application-local.yaml @@ -195,7 +195,6 @@ chenfeng: producing-order: order-url: http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/{id} order-extra-url: http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/{id}/extra - item-serial-no-url: http://proc.mes.cf/api-branch=opt_split_order/api/v1/producing/order/items/serial-no connect-timeout: 5s read-timeout: 60s sync-read-timeout: 10s