From 41e30dbc636c1ebb934b7977edff343d24338bbf Mon Sep 17 00:00:00 2001 From: 10001392 <1055202292@qq.com> Date: Wed, 22 Apr 2026 08:26:05 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90MPM=E9=9B=86=E6=88=90=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E3=80=91=E6=89=B9=E9=87=8F=E4=BB=8EMPM=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=90=8C=E6=AD=A5=E7=89=A9=E6=96=99=E5=9B=BE=E7=BA=B8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=8C=E6=89=B9=E9=87=8F=E4=BB=8EMPM?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=90=8C=E6=AD=A5=E9=92=A2=E6=9E=84=E5=8C=85?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/MaterialController.java | 9 ++ .../StructuralPackageController.java | 19 ++++ .../service/MaterialControllerService.java | 33 +++++++ .../StructuralPackageControllerService.java | 91 +++++++++++++++++++ .../wms/common/pojo/qo/MaterialAddQO.java | 5 + .../nflg/wms/common/pojo/qo/PackageAddQO.java | 10 ++ .../wms/gateway/satoken/SaTokenConfigure.java | 4 +- .../wms/repository/entity/WmsMaterial.java | 5 + .../entity/WmsStructuralPackage.java | 10 ++ 9 files changed, 185 insertions(+), 1 deletion(-) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java index c7fcf28d..c8010bcf 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java @@ -176,4 +176,13 @@ public class MaterialController extends BaseController { public ApiResult queryMaterial(@Valid @RequestBody @NotNull EbomMaterialQO request) { return ApiResult.success(materialControllerService.queryMaterial(request)); } + + /** + * 批量从MPM系统同步图纸数据 + */ + @PostMapping("/mpm/syncFromMpmBatch") + public ApiResult syncFromMpmBatch(/*@Valid */@RequestBody @NotEmpty List requests) { + materialControllerService.syncFromMpmBatch(requests); + return ApiResult.success(); + } } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java index d5896934..65a6616a 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java @@ -11,6 +11,7 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -137,6 +138,24 @@ public class StructuralPackageController extends BaseController { public ApiResult exportPdf(@Valid @RequestParam @NotNull Long id) throws Exception { return ApiResult.success(packageControllerService.exportPdf(id)); } + + /** + * 从MPM系统同步钢构包数据(MPM推送数据到本系统) + */ + @PostMapping("/mpm/syncFromMpm") + public ApiResult syncFromMpm(/*@Valid */@RequestBody PackageAddQO request) { + packageControllerService.syncFromMpm(request); + return ApiResult.success(); + } + + /** + * 批量从MPM系统同步钢构包数据 + */ + @PostMapping("/mpm/syncFromMpmBatch") + public ApiResult syncFromMpmBatch(/*@Valid */@RequestBody @NotEmpty List requests) { + packageControllerService.syncFromMpmBatch(requests); + return ApiResult.success(); + } // // /** // * 导出老鼠图PDF diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java index d5c548ff..71b65c8c 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java @@ -60,6 +60,9 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; + +@Slf4j @Component public class MaterialControllerService { @@ -392,4 +395,34 @@ public class MaterialControllerService { public List getMaterials(@Valid @NotEmpty Set nos) { return materialService.getMaterials(nos); } + + /** + * 批量从MPM系统同步图纸数据 + * 每次推送都是新版本,直接新增 + */ + @Transactional + public void syncFromMpmBatch(@Valid @NotEmpty List requests) { + log.info("开始批量从MPM系统同步图纸数据,共{}条", requests.size()); + + for (MaterialAddQO request : requests) { + try { + log.info("开始从MPM系统同步图纸数据: {}", request.getNo()); + + WmsMaterial wmsMaterial = Convert.convert(WmsMaterial.class, request); + + wmsMaterial.setCreateBy("MPM_SYNC"); + wmsMaterial.setCreateTime(LocalDateTime.now()); + wmsMaterial.setFromMpm(true); // 标记为来自MPM + + materialService.add(wmsMaterial); + + log.info("成功从MPM系统同步图纸数据: {}, 版本: {}", request.getNo(), wmsMaterial.getVersion()); + } catch (Exception e) { + log.error("同步图纸失败: {}, 错误: {}", request.getNo(), e.getMessage(), e); + // 继续处理下一条,不中断整个批量同步 + } + } + + log.info("批量从MPM系统同步图纸数据完成"); + } } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java index 0abfcb88..bb302b6a 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java @@ -33,6 +33,7 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; @@ -559,4 +560,94 @@ public class StructuralPackageControllerService { //// sapService.zwm3A02(qo.getFactory(), qo.getMaterialNo(), qo.getReceivedWarehouse(), qo.getBinNos()); // } // } + + /** + * 从 MPM系统同步钢构包数据(MPM推送数据到本系统) + * 每次推送都是新版本,直接新增 + */ + @Transactional + public void syncFromMpm(@Valid PackageAddQO request) { + log.info("开始从MPM系统同步钢构包数据: {}, 版本: {}", request.getNo(), request.getVersion()); + + WmsStructuralPackage structuralPackage = Convert.convert(WmsStructuralPackage.class, request); + structuralPackage.setOrderNo(getOrderNo()); + structuralPackage.setCreateBy("MPM_SYNC"); + structuralPackage.setCreateTime(LocalDateTime.now()); + + String modelNo = request.getModelNos(); + if (StrUtil.isNotBlank(modelNo)) { + List modelNos = StrUtil.split(modelNo, ","); + if (CollectionUtil.isNotEmpty(modelNos)) { + List models = modelService.lambdaQuery().select(WmsModel::getId, WmsModel::getNo).eq(WmsModel::getEnable, true).in(WmsModel::getNo, modelNos).list(); + modelNos.removeIf(mno -> models.stream().anyMatch(model -> model.getNo().equals(mno))); + VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(modelNos)).throwMessage("以下机型编号无效:" + StrUtil.join(",", modelNos)); + structuralPackage.setModelIds(StrUtil.join(",", models.stream().map(WmsModel::getId).toList())); + } + } + + structuralPackage.setFromMpm(true); // 标记为来自MPM + structuralPackage.setLatest(true); // 设置为最新版本 + + // 将同编号的其他版本设置为非最新 + packageService.lambdaUpdate() + .set(WmsStructuralPackage::getLatest, false) + .eq(WmsStructuralPackage::getNo, request.getNo()) + .update(); + + // 处理零件清单,补充完整的物料信息 + List materials = new ArrayList<>(); + for (PackageMaterialDTO dto : request.getMaterials()) { + // 从物料服务获取当前最新的物料信息 + WmsMaterial material = materialService.getCurrent(dto.getNo()); + if (Objects.isNull(material)) { + log.warn("零件编码{}不存在,跳过", dto.getNo()); + continue; + } + + // 补充完整的物料信息 + dto.setName(material.getDescribe()); + dto.setDrawingNo(material.getDrawingNo()); + dto.setImage(material.getImage()); + + // 如果MPM推送的版本号为空,使用物料当前版本 + if (Objects.isNull(dto.getVersion())) { + dto.setVersion(material.getVersion()); + } + + dto.setCreateBy("MPM_SYNC"); + dto.setCreateTime(DateTimeUtil.format(LocalDateTime.now())); + materials.add(dto); + } + + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(materials)).throwMessage("有效的零件不能为空"); + + // 计算总重 + structuralPackage.setWeight(materials.stream() + .map(m -> m.getWeight().multiply(m.getNum())) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + + structuralPackage.setMaterials(JSONUtil.toJsonStr(materials)); + packageService.add(structuralPackage); + + log.info("成功从MPM系统同步钢构包数据: {}, 版本: {}, 零件数: {}", request.getNo(), request.getVersion(), materials.size()); + } + + /** + * 批量从MPM系统同步钢构包数据 + */ + @Transactional + public void syncFromMpmBatch(@Valid @NotEmpty List requests) { + log.info("开始批量从MPM系统同步钢构包数据,共{}条", requests.size()); + + for (PackageAddQO request : requests) { + try { + syncFromMpm(request); + } catch (Exception e) { + log.error("同步钢构包失败: {}, 错误: {}", request.getNo(), e.getMessage(), e); + // 继续处理下一条,不中断整个批量同步 + } + } + + log.info("批量从MPM系统同步钢构包数据完成"); + } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java index 5ebe1bc5..f4a5564c 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java @@ -71,4 +71,9 @@ public class MaterialAddQO { */ @NotNull private Long supplierId; + + /** + * 版本号 + */ + private Integer version; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageAddQO.java index bcaba7af..3117bfd3 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageAddQO.java @@ -75,4 +75,14 @@ public class PackageAddQO { @Valid @NotEmpty private List materials; + + /** + * 托盘数量 + */ + private BigDecimal trayNum; + + /** + * 机型编号(多个,隔开) + */ + private String modelNos; } diff --git a/nflg-wms-gateway/src/main/java/com/nflg/wms/gateway/satoken/SaTokenConfigure.java b/nflg-wms-gateway/src/main/java/com/nflg/wms/gateway/satoken/SaTokenConfigure.java index d07f491f..a6bf9bf3 100644 --- a/nflg-wms-gateway/src/main/java/com/nflg/wms/gateway/satoken/SaTokenConfigure.java +++ b/nflg-wms-gateway/src/main/java/com/nflg/wms/gateway/satoken/SaTokenConfigure.java @@ -38,7 +38,9 @@ public class SaTokenConfigure { .setAuth(obj -> { // 登录校验 -- 拦截所有路由 SaRouter.match("/**") - .notMatch("/auth/**","/srm-receive/**", "/shipment/material/**","**/actuator/**") + .notMatch("/auth/**","/srm-receive/**", "/shipment/material/**","**/actuator/**" + // MPM 免登录接口 + , "/admin/material/mpm/**", "/admin/package/mpm/**") .check(r -> { String traceId = SaHolder.getRequest().getHeader(Constant.TRACE_ID_HEADER, IdUtil.getSnowflakeNextIdStr()); MDC.put(Constant.TRACE_ID, traceId); diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java index 8e1afb0a..5377793e 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java @@ -122,4 +122,9 @@ public class WmsMaterial implements Serializable { public Boolean getComplete() { return StrUtil.isNotBlank(getImage()) && Objects.nonNull(getWeight()); } + + /** + * 是否来自MPM + */ + private Boolean fromMpm; } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStructuralPackage.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStructuralPackage.java index 5e4a9573..137a2fef 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStructuralPackage.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStructuralPackage.java @@ -116,4 +116,14 @@ public class WmsStructuralPackage implements Serializable { * 最新版本 */ private Boolean latest; + + /** + * 托盘数量 + */ + private BigDecimal trayNum; + + /** + * 是否来自MPM + */ + private Boolean fromMpm; }