diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java index f1ff52c..fcb3e89 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java @@ -41,7 +41,6 @@ public class MesWmReturnIssueLineController { @Resource private MesMdItemService itemService; - @Resource private MesMdUnitMeasureService unitMeasureService; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java index 8144ce3..ccbe46b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java @@ -31,12 +31,18 @@ public class MesWmReturnIssueLineRespVO { @Schema(description = "计量单位名称", example = "千克") private String unitMeasureName; + @Schema(description = "库存记录 ID", example = "1") + private Long materialStockId; + @Schema(description = "退料数量", example = "100.00") private BigDecimal quantity; @Schema(description = "批次 ID", example = "1") private Long batchId; + @Schema(description = "批次编码", example = "BAT202601001") + private String batchCode; + @Schema(description = "是否需要质检", example = "false") private Boolean rqcCheckFlag; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java index b634b86..3403b2a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java @@ -27,9 +27,15 @@ public class MesWmReturnIssueLineSaveReqVO { @DecimalMin(value = "0", inclusive = false, message = "退料数量必须大于 0") private BigDecimal quantity; + @Schema(description = "库存记录 ID", example = "1") + private Long materialStockId; + @Schema(description = "批次 ID", example = "1") private Long batchId; + @Schema(description = "批次编码", example = "BCH20260330001") + private String batchCode; + @Schema(description = "是否需要质检", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") @NotNull(message = "是否需要质检不能为空") private Boolean rqcCheckFlag; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java index ccf0f73..d0acb37 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java @@ -43,7 +43,6 @@ public class MesWmReturnIssueDO extends BaseDO { * 关联 {@link MesProWorkOrderDO#getId()} */ private Long workOrderId; - // TODO @芋艿:可能不需要这个字段。界面上没有; /** * 工作站 ID * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java index efbacae..00b3ca1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java @@ -2,6 +2,9 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -35,6 +38,8 @@ public class MesWmReturnIssueLineDO extends BaseDO { private Long issueId; /** * 库存记录 ID + * + * 关联 {@link MesWmMaterialStockDO#getId()} */ private Long materialStockId; /** @@ -49,10 +54,20 @@ public class MesWmReturnIssueLineDO extends BaseDO { private BigDecimal quantity; /** * 批次 ID + * + * 关联 {@link MesWmBatchDO#getId()} */ private Long batchId; /** + * 批次编码 + * + * 关联 {@link MesWmBatchDO#getCode()} + */ + private String batchCode; + /** * 退货检验单 ID + * + * 关联 {@link MesQcRqcDO#getId()} */ private Long rqcId; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueDetailMapper.java index 8ec059e..a1f1858 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueDetailMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueDetailMapper.java @@ -24,4 +24,8 @@ public interface MesWmReturnIssueDetailMapper extends BaseMapperX .orderByDesc(MesWmReturnIssueDO::getId)); } + default MesWmReturnIssueDO selectByCode(String code) { + return selectOne(MesWmReturnIssueDO::getCode, code); + } + } 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 a067f10..5261196 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 @@ -468,6 +468,7 @@ public interface ErrorCodeConstants { ErrorCode WM_RETURN_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_710_200, "生产退料单明细不存在"); ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_710_201, "退料明细数量必须大于0"); ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_EXCEED = new ErrorCode(1_040_710_202, "退料明细总数量不能超过退料单行数量"); + ErrorCode WM_RETURN_ISSUE_CODE_DUPLICATE = new ErrorCode(1_040_710_203, "退料单编码已存在"); // ========== MES 仓库管理-供应商退货单(1-040-711-000) ========== ErrorCode WM_RETURN_VENDOR_NOT_EXISTS = new ErrorCode(1_040_711_000, "供应商退货单不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java index 2ab0312..800dcf6 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java @@ -20,6 +20,7 @@ public enum MesMdAutoCodeRuleCodeEnum { WM_ARRIVAL_NOTICE_CODE("WM_ARRIVAL_NOTICE_CODE", "到货通知单编码"), WM_ITEM_RECEIPT_CODE("WM_ITEM_RECEIPT_CODE", "采购入库单编码"), WM_RETURN_VENDOR_CODE("WM_RETURN_VENDOR_CODE", "采购退货单编码"), + WM_RETURN_ISSUE_CODE("WM_RETURN_ISSUE_CODE", "生产退料单编码"), WM_SN_CODE("WM_SN_CODE", "SN 码"), WM_PACKAGE_CODE("WM_PACKAGE_CODE", "装箱单编码"), WM_BATCH_CODE("WM_BATCH_CODE", "批次编码"), diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailService.java index e1f051f..1c012e4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailService.java @@ -64,4 +64,11 @@ public interface MesWmReturnIssueDetailService { */ void deleteReturnIssueDetailByIssueId(Long issueId); + /** + * 根据行 ID 删除明细 + * + * @param lineId 行 ID + */ + void deleteReturnIssueDetailByLineId(Long lineId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java index b12f5d3..19975ff 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java @@ -87,6 +87,11 @@ public class MesWmReturnIssueDetailServiceImpl implements MesWmReturnIssueDetail issueDetailMapper.deleteByIssueId(issueId); } + @Override + public void deleteReturnIssueDetailByLineId(Long lineId) { + issueDetailMapper.deleteByLineId(lineId); + } + private void validateReturnIssueDetailExists(Long id) { if (issueDetailMapper.selectById(id) == null) { throw exception(WM_RETURN_ISSUE_DETAIL_NOT_EXISTS); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java index 2358ca2..81449ac 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java @@ -40,6 +40,9 @@ public class MesWmReturnIssueLineServiceImpl implements MesWmReturnIssueLineServ private MesWmReturnIssueService issueService; @Resource private MesMdItemService itemService; + @Resource + @Lazy + private MesWmReturnIssueDetailService issueDetailService; @Override public Long createReturnIssueLine(MesWmReturnIssueLineSaveReqVO createReqVO) { @@ -69,8 +72,12 @@ public class MesWmReturnIssueLineServiceImpl implements MesWmReturnIssueLineServ @Override public void deleteReturnIssueLine(Long id) { // 校验存在 - validateReturnIssueLineExists(id); - // 删除 + MesWmReturnIssueLineDO line = validateReturnIssueLineExists(id); + // 校验主单为草稿状态才允许删除行 + issueService.validateReturnIssueExistsAndPrepare(line.getIssueId()); + // 级联删除该行的明细 + issueDetailService.deleteReturnIssueDetailByLineId(id); + // 删除行 issueLineMapper.deleteById(id); } @@ -107,8 +114,8 @@ public class MesWmReturnIssueLineServiceImpl implements MesWmReturnIssueLineServ * 校验保存时的关联数据 */ private MesWmReturnIssueDO validateReturnIssueLineSaveData(MesWmReturnIssueLineSaveReqVO reqVO) { - // 校验父数据存在 - MesWmReturnIssueDO issue = issueService.validateReturnIssueExists(reqVO.getIssueId()); + // 校验父数据存在 + 草稿状态 + MesWmReturnIssueDO issue = issueService.validateReturnIssueExistsAndPrepare(reqVO.getIssueId()); // 校验物料存在 itemService.validateItemExists(reqVO.getItemId()); return issue; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java index 5f16cb5..fb7a69d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java @@ -58,6 +58,14 @@ public interface MesWmReturnIssueService { MesWmReturnIssueDO validateReturnIssueExists(Long id); /** + * 校验生产退料单存在且为准备中状态 + * + * @param id 编号 + * @return 生产退料单 + */ + MesWmReturnIssueDO validateReturnIssueExistsAndPrepare(Long id); + + /** * 提交生产退料单(草稿 → 待检验/待上架) * * @param id 编号 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java index ef7db2c..361ee80 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java @@ -254,7 +254,8 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { /** * 校验生产退料单存在且为准备中状态 */ - private MesWmReturnIssueDO validateReturnIssueExistsAndPrepare(Long id) { + @Override + public MesWmReturnIssueDO validateReturnIssueExistsAndPrepare(Long id) { MesWmReturnIssueDO issue = validateReturnIssueExists(id); if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.PREPARE.getStatus(), issue.getStatus())) { throw exception(WM_RETURN_ISSUE_NOT_PREPARE); @@ -269,9 +270,23 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { } /** + * 校验编码唯一性 + */ + private void validateCodeUnique(Long id, String code) { + MesWmReturnIssueDO issue = issueMapper.selectByCode(code); + if (issue == null) { + return; + } + if (ObjUtil.notEqual(id, issue.getId())) { + throw exception(WM_RETURN_ISSUE_CODE_DUPLICATE); + } + } + + /** * 校验保存时的关联数据 */ private void validateReturnIssueSaveData(MesWmReturnIssueSaveReqVO reqVO) { + validateCodeUnique(reqVO.getId(), reqVO.getCode()); workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()); if (reqVO.getWorkstationId() != null) { workstationService.validateWorkstationExists(reqVO.getWorkstationId()); diff --git a/yudao-module-mes/src/test/resources/sql/create_tables.sql b/yudao-module-mes/src/test/resources/sql/create_tables.sql index 8c78c62..7ec75ec 100644 --- a/yudao-module-mes/src/test/resources/sql/create_tables.sql +++ b/yudao-module-mes/src/test/resources/sql/create_tables.sql @@ -414,6 +414,7 @@ CREATE TABLE IF NOT EXISTS "mes_wm_return_issue_line" ( "item_id" bigint NOT NULL, "quantity" decimal(12,2) NOT NULL DEFAULT 0.00, "batch_id" bigint DEFAULT NULL, + "batch_code" varchar(255) DEFAULT NULL, "rqc_id" bigint DEFAULT NULL, "rqc_check_flag" bit NOT NULL DEFAULT FALSE, "quality_status" int DEFAULT NULL,