diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java index 347c796..1869fcf 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java @@ -35,9 +35,6 @@ public class MesWmProductionIssueDetailSaveReqVO { @Schema(description = "批次号", example = "BATCH20260101001") private String batchCode; - @Schema(description = "库存记录编号", example = "1") - private Long materialStockId; - @Schema(description = "仓库编号", example = "1") private Long warehouseId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java index e903067..0188767 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; import lombok.Data; import java.math.BigDecimal; @@ -13,12 +15,16 @@ public class MesWmProductionIssueLineSaveReqVO { private Long id; @Schema(description = "领料单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单ID不能为空") private Long issueId; @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料ID不能为空") private Long itemId; @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "领料数量不能为空") + @DecimalMin(value = "0", inclusive = false, message = "领料数量必须大于 0") private BigDecimal quantity; @Schema(description = "批次ID", example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestDO.java index 9291ef2..7e8a60f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestDO.java @@ -69,6 +69,8 @@ public class MesWmMaterialRequestDO extends BaseDO { * 备注 */ private String remark; + + // TODO @AI:删除 attribute1-4 字段 /** * 预留字段1 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestLineDO.java index 925ce1b..a5eb944 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestLineDO.java @@ -54,6 +54,8 @@ public class MesWmMaterialRequestLineDO extends BaseDO { * 备注 */ private String remark; + + // TODO @AI:删除 attribute1-4 字段 /** * 预留字段1 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 3c4f65f..9b39afe 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -366,6 +366,7 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCTION_ISSUE_WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_708_005, "工作站不存在"); ErrorCode WM_PRODUCTION_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_708_006, "生产领料出库单已完成或已取消,无法取消"); ErrorCode WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_708_100, "生产领料出库单行不存在"); + ErrorCode WM_PRODUCTION_ISSUE_LINE_ITEM_NOT_IN_BOM = new ErrorCode(1_040_708_101, "当前物料不在生产工单的 BOM 物料清单中"); ErrorCode WM_PRODUCTION_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_708_200, "生产领料出库单明细不存在"); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMaterialRequestStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMaterialRequestStatusEnum.java index ab546dd..102d662 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMaterialRequestStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMaterialRequestStatusEnum.java @@ -7,7 +7,6 @@ import lombok.Getter; import java.util.Arrays; -// TODO @AI:这里需要迁移下; /** * MES 领料申请单状态枚举 * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java index 970676c..aa5116b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java @@ -1,12 +1,16 @@ package cn.iocoder.yudao.module.mes.service.wm.productionissue; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueLineMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -15,6 +19,7 @@ import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_LINE_ITEM_NOT_IN_BOM; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS; /** @@ -32,11 +37,13 @@ public class MesWmProductionIssueLineServiceImpl implements MesWmProductionIssue private MesWmProductionIssueService issueService; @Resource private MesMdItemService itemService; + @Resource + private MesProWorkOrderBomService workOrderBomService; @Override public Long createProductionIssueLine(MesWmProductionIssueLineSaveReqVO createReqVO) { - // 校验父数据存在 - issueService.validateProductionIssueExists(createReqVO.getIssueId()); + // 校验父数据存在 + 校验物料在工单 BOM 中 + validateItemInWorkOrderBom(createReqVO.getIssueId(), createReqVO.getItemId()); // 校验物料存在 itemService.validateItemExists(createReqVO.getItemId()); @@ -50,8 +57,8 @@ public class MesWmProductionIssueLineServiceImpl implements MesWmProductionIssue public void updateProductionIssueLine(MesWmProductionIssueLineSaveReqVO updateReqVO) { // 校验存在 validateProductionIssueLineExists(updateReqVO.getId()); - // 校验父数据存在 - issueService.validateProductionIssueExists(updateReqVO.getIssueId()); + // 校验父数据存在 + 校验物料在工单 BOM 中 + validateItemInWorkOrderBom(updateReqVO.getIssueId(), updateReqVO.getItemId()); // 校验物料存在 itemService.validateItemExists(updateReqVO.getItemId()); @@ -97,4 +104,19 @@ public class MesWmProductionIssueLineServiceImpl implements MesWmProductionIssue return line; } + private void validateItemInWorkOrderBom(Long issueId, Long itemId) { + // 校验领料单存在,并获取工单编号 + MesWmProductionIssueDO issue = issueService.validateProductionIssueExists(issueId); + // 校验物料是否在工单 BOM 中(防错料) + List workOrderBoms = workOrderBomService.getWorkOrderBomListByWorkOrderId(issue.getWorkOrderId()); + if (CollUtil.isEmpty(workOrderBoms)) { + return; + } + MesProWorkOrderBomDO workOrderBom = CollUtil.findOne(workOrderBoms, + bom -> bom.getItemId().equals(itemId)); + if (workOrderBom == null) { + throw exception(WM_PRODUCTION_ISSUE_LINE_ITEM_NOT_IN_BOM); + } + } + }