From d4d3ad4f5794083b9b948c9a86861a0062c72b8a Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Tue, 14 Apr 2026 10:40:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E7=89=A9=E6=96=99?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=8D=95=E4=BD=8D=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/mes/enums/ErrorCodeConstants.java | 4 ++ .../admin/plan/vo/DevicePlanGanttRespVO.java | 4 ++ .../mes/service/bom/BomServiceImpl.java | 5 +- .../ItemAnalysisServiceImpl.java | 65 +++++++++++++++---- .../entity/ItemRequisitionAndStock.java | 9 ++- .../mes/service/plan/PlanServiceImpl.java | 2 + 6 files changed, 71 insertions(+), 18 deletions(-) diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 160e39697..110b3030c 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -17,6 +17,10 @@ public interface ErrorCodeConstants { ErrorCode BOM_NOT_EXISTS = new ErrorCode(5_001, "产品BOM不存在"); ErrorCode BOM_EXISTS = new ErrorCode(5_002, "产品BOM已存在"); + ErrorCode UNIT_ERROR = new ErrorCode(5_002, "物料bom单位不一致!"); + ErrorCode BOM_ONLY = new ErrorCode(5_002, "每个产品启用的BOM只能有一个,请先禁用改产品其他BOM!"); + + ErrorCode ORGANIZATION_NOT_EXISTS = new ErrorCode(5_0011, "产线工位不存在"); ErrorCode ORGANIZATION_ID_NOT_EXISTS = new ErrorCode(5_0011, "产线工位不存在"); ErrorCode ORGANIZATION_EXITS_CHILDREN = new ErrorCode(5_0012, "存在存在子产线工位,无法删除"); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/DevicePlanGanttRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/DevicePlanGanttRespVO.java index 99ab7e3e9..d7b184e4b 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/DevicePlanGanttRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/plan/vo/DevicePlanGanttRespVO.java @@ -36,7 +36,11 @@ public class DevicePlanGanttRespVO { private Long planNumber; @Schema(description = "产品名称") private String productName; + @Schema(description = "产品编码") + private String productCode; @Schema(description = "设备名称") private String deviceName; + @Schema(description = "设备编码") + private String deviceCode; } } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java index 2d858cea3..ce480710f 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/bom/BomServiceImpl.java @@ -34,8 +34,7 @@ import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.BOM_EXISTS; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.BOM_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * 产品BOM Service 实现类 @@ -91,7 +90,7 @@ public class BomServiceImpl implements BomService { if (updateReqVO.getIsEnable()) { BomDO temp = bomMapper.selectByProductId(updateReqVO.getProductId()); if (temp != null && !Objects.equals(temp.getId(), updateReqVO.getId())) { - throw exception(new ErrorCode(500, "每个产品启用的BOM只能有一个,请先禁用改产品其他BOM!")); + throw exception((BOM_ONLY)); } } // 校验存在 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisServiceImpl.java index 7939fcc54..d557d20f9 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/ItemAnalysisServiceImpl.java @@ -32,6 +32,7 @@ import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.UNIT_ERROR; /** * 生产领料 Service 实现类 @@ -42,7 +43,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. @Validated public class ItemAnalysisServiceImpl implements ItemAnalysisService { private static final Logger log = LoggerFactory.getLogger(ItemAnalysisServiceImpl.class); - private static final String UNIT_ERROR = "物料bom单位不一致!"; +// private static final String UNIT_ERROR = "物料bom单位不一致!"; @Resource private ErpStockService erpStockService; @Resource @@ -78,7 +79,7 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService { //每个taskDetail计算一次物料需求,汇总到map里面 List bomDetailDOList = bomService.getBomDetailListByProductId(detail.getProductId(), detail.getNumber()); - buildItemMap(itemMap, bomDetailDOList); + buildItemMap(itemMap, bomDetailDOList,detail.getProductId()); } //算库存 for (Long key : itemMap.keySet()) { @@ -135,13 +136,13 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService { BomDO bomDO = bomService.selectByProductId(detail.getProductId()); if (!bomDO.getUnitId().equals(ProductUnitEnum.Each.getUnitId()) || !detail.getProductUnitId().equals(ProductUnitEnum.Each.getUnitId())) { - log.error(UNIT_ERROR); - throw exception(new ErrorCode(500, UNIT_ERROR)); + log.error(String.valueOf(UNIT_ERROR)); + throw exception(UNIT_ERROR); } //每个detail计算一次物料需求,汇总到map里面 List bomDetailDOList = bomService.getBomDetailListByProductId(detail.getProductId(), detail.getCount().longValue()); - buildItemMap(itemMap, bomDetailDOList); + buildItemMap(itemMap, bomDetailDOList,detail.getProductId()); } //算库存 for (Long key : itemMap.keySet()) { @@ -173,22 +174,58 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService { }); } - private void buildItemMap(Map itemMap, List bomDetailDOList) { + private void buildItemMap(Map itemMap, + List bomDetailDOList, + Long currentProductId) { for (BomDetailDO bomDetail : bomDetailDOList) { - if (itemMap.containsKey(bomDetail.getProductId())) { - ItemRequisitionAndStock temp = itemMap.get(bomDetail.getProductId()); - //比较单位是否一致 + Long itemId = bomDetail.getProductId(); + if (itemMap.containsKey(itemId)) { + ItemRequisitionAndStock temp = itemMap.get(itemId); + if (!temp.getUnitId().equals(bomDetail.getUnitId())) { - log.error(UNIT_ERROR); - throw exception(new ErrorCode(500, UNIT_ERROR)); + BomDO currBom = bomService.getBom(bomDetail.getBomId()); + BomDO prevBom = temp.getSourceBomId() == null ? null : bomService.getBom(temp.getSourceBomId()); + + ErpProductDO subItem = productService.getProduct(itemId); + ErpProductDO currProduct = currentProductId == null ? null : productService.getProduct(currentProductId); + ErpProductDO prevProduct = temp.getSourceProductId() == null ? null : productService.getProduct(temp.getSourceProductId()); + + ErpProductUnitDO currUnit = productUnitService.getProductUnit(bomDetail.getUnitId()); + ErpProductUnitDO prevUnit = productUnitService.getProductUnit(temp.getUnitId()); + + String currProductCode = currProduct == null ? "-" : Objects.toString(currProduct.getBarCode(), "-"); + String currProductName = currProduct == null ? "-" : Objects.toString(currProduct.getName(), "-"); + String prevProductCode = prevProduct == null ? "-" : Objects.toString(prevProduct.getBarCode(), "-"); + String prevProductName = prevProduct == null ? "-" : Objects.toString(prevProduct.getName(), "-"); + + String currBomCode = currBom == null ? "-" : Objects.toString(currBom.getCode(), "-"); + String prevBomCode = prevBom == null ? "-" : Objects.toString(prevBom.getCode(), "-"); + + String subItemCode = subItem == null ? "-" : Objects.toString(subItem.getBarCode(), "-"); + String subItemName = subItem == null ? "-" : Objects.toString(subItem.getName(), "-"); + + String currUnitName = currUnit == null ? "-" : Objects.toString(currUnit.getName(), "-"); + String prevUnitName = prevUnit == null ? "-" : Objects.toString(prevUnit.getName(), "-"); + + String msg = String.format( + "产品[%s-%s] 的 BOM[%s] 中,子物料[%s-%s] 单位[%s] 与 产品[%s-%s] 的 BOM[%s] 中子物料单位[%s] 冲突!应改成一致的单位", + currProductCode, currProductName, currBomCode, + subItemCode, subItemName, currUnitName, + prevProductCode, prevProductName, prevBomCode, prevUnitName + ); + log.error(msg); + throw exception(new ErrorCode(5_002, msg)); } + temp.setNumber(temp.getNumber().add(bomDetail.getUsageNumber())); } else { ItemRequisitionAndStock temp = new ItemRequisitionAndStock() - .setItemId(bomDetail.getProductId()) + .setItemId(itemId) .setNumber(bomDetail.getUsageNumber()) - .setUnitId(bomDetail.getUnitId()); - itemMap.put(bomDetail.getProductId(), temp); + .setUnitId(bomDetail.getUnitId()) + .setSourceBomId(bomDetail.getBomId()) + .setSourceProductId(currentProductId); + itemMap.put(itemId, temp); } } } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/entity/ItemRequisitionAndStock.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/entity/ItemRequisitionAndStock.java index fd8298817..775dabaec 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/entity/ItemRequisitionAndStock.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/itemrequisition/entity/ItemRequisitionAndStock.java @@ -47,5 +47,12 @@ public class ItemRequisitionAndStock { * 车间仓库存数量 */ private BigDecimal stockWorkshopNumber; - + /** + * 首次汇总来源BOM + */ + private Long sourceBomId; + /** + * 首次汇总来源成品 + */ + private Long sourceProductId; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java index 3d0136905..d61efd4e9 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/plan/PlanServiceImpl.java @@ -567,6 +567,8 @@ public class PlanServiceImpl implements PlanService { ErpProductDO product = productMap.get(plan.getProductId()); item.setProductName(product == null ? null : product.getName()); item.setDeviceName(device == null ? null : device.getDeviceName()); + item.setProductCode(product == null ? null : product.getBarCode()); + item.setDeviceCode(device == null ? null : device.getDeviceCode()); plans.add(item); } vo.setPlans(plans);