【MPM集成接口】批量从MPM系统同步物料图纸数据,批量从MPM系统同步钢构包数据

This commit is contained in:
10001392 2026-04-22 08:26:05 +08:00
parent 907dc774cf
commit 41e30dbc63
9 changed files with 185 additions and 1 deletions

View File

@ -176,4 +176,13 @@ public class MaterialController extends BaseController {
public ApiResult<EbomParentVO> queryMaterial(@Valid @RequestBody @NotNull EbomMaterialQO request) {
return ApiResult.success(materialControllerService.queryMaterial(request));
}
/**
* 批量从MPM系统同步图纸数据
*/
@PostMapping("/mpm/syncFromMpmBatch")
public ApiResult<Void> syncFromMpmBatch(/*@Valid */@RequestBody @NotEmpty List<MaterialAddQO> requests) {
materialControllerService.syncFromMpmBatch(requests);
return ApiResult.success();
}
}

View File

@ -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<String> exportPdf(@Valid @RequestParam @NotNull Long id) throws Exception {
return ApiResult.success(packageControllerService.exportPdf(id));
}
/**
* 从MPM系统同步钢构包数据MPM推送数据到本系统
*/
@PostMapping("/mpm/syncFromMpm")
public ApiResult<Void> syncFromMpm(/*@Valid */@RequestBody PackageAddQO request) {
packageControllerService.syncFromMpm(request);
return ApiResult.success();
}
/**
* 批量从MPM系统同步钢构包数据
*/
@PostMapping("/mpm/syncFromMpmBatch")
public ApiResult<Void> syncFromMpmBatch(/*@Valid */@RequestBody @NotEmpty List<PackageAddQO> requests) {
packageControllerService.syncFromMpmBatch(requests);
return ApiResult.success();
}
//
// /**
// * 导出老鼠图PDF

View File

@ -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<MaterialVO> getMaterials(@Valid @NotEmpty Set<String> nos) {
return materialService.getMaterials(nos);
}
/**
* 批量从MPM系统同步图纸数据
* 每次推送都是新版本直接新增
*/
@Transactional
public void syncFromMpmBatch(@Valid @NotEmpty List<MaterialAddQO> 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系统同步图纸数据完成");
}
}

View File

@ -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<String> modelNos = StrUtil.split(modelNo, ",");
if (CollectionUtil.isNotEmpty(modelNos)) {
List<WmsModel> 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<PackageMaterialDTO> 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<PackageAddQO> 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系统同步钢构包数据完成");
}
}

View File

@ -71,4 +71,9 @@ public class MaterialAddQO {
*/
@NotNull
private Long supplierId;
/**
* 版本号
*/
private Integer version;
}

View File

@ -75,4 +75,14 @@ public class PackageAddQO {
@Valid
@NotEmpty
private List<PackageMaterialDTO> materials;
/**
* 托盘数量
*/
private BigDecimal trayNum;
/**
* 机型编号多个隔开
*/
private String modelNos;
}

View File

@ -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);

View File

@ -122,4 +122,9 @@ public class WmsMaterial implements Serializable {
public Boolean getComplete() {
return StrUtil.isNotBlank(getImage()) && Objects.nonNull(getWeight());
}
/**
* 是否来自MPM
*/
private Boolean fromMpm;
}

View File

@ -116,4 +116,14 @@ public class WmsStructuralPackage implements Serializable {
* 最新版本
*/
private Boolean latest;
/**
* 托盘数量
*/
private BigDecimal trayNum;
/**
* 是否来自MPM
*/
private Boolean fromMpm;
}