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 e1868ad..6c09059 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 @@ -43,8 +43,8 @@ public class MesWmReturnIssueLineRespVO { @Schema(description = "质量状态", example = "0") private Integer qualityStatus; - @Schema(description = "过程检验单 ID", example = "1") - private Long ipqcId; + @Schema(description = "退货检验单 ID", example = "21601") + private Long rqcId; @Schema(description = "备注", example = "备注") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java index 8f76c45..2d056bf 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java @@ -42,6 +42,12 @@ public class MesWmReturnSalesLineRespVO { @Schema(description = "批次ID", example = "1") private Long batchId; + @Schema(description = "退货检验单 ID", example = "400") + private Long rqcId; + + @Schema(description = "是否需要质检", example = "true") + private Boolean qcFlag; + @Schema(description = "批次号", example = "B001") private String batchCode; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java index d8d4cef..7af1c2c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java @@ -32,11 +32,11 @@ public class MesWmReturnSalesLineSaveReqVO { @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") private BigDecimal quantity; - @Schema(description = "批次ID", example = "1") + @Schema(description = "批次号", example = "B20250101") private Long batchId; - @Schema(description = "质量状态", example = "合格") - private Integer qualityStatus; + @Schema(description = "是否需要质检", example = "true") + private Boolean qcFlag; @Schema(description = "备注", example = "备注") private String remark; 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 fdf6594..d04dedf 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 @@ -52,9 +52,9 @@ public class MesWmReturnIssueLineDO extends BaseDO { */ private Long batchId; /** - * 过程检验单 ID + * 退货检验单 ID */ - private Long ipqcId; + private Long rqcId; /** * 是否需要质检 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java index 325cbe4..b17b741 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java @@ -50,6 +50,14 @@ public class MesWmReturnSalesLineDO extends BaseDO { */ private Long batchId; /** + * 退货检验单 ID + */ + private Long rqcId; + /** + * 是否需要质检 + */ + private Boolean qcFlag; + /** * 质量状态 * * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java index 7fb5d0a..6185b15 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.mes.enums.wm; import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO; import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; import lombok.AllArgsConstructor; import lombok.Getter; @@ -19,31 +21,37 @@ public enum MesWmReturnSalesStatusEnum implements ArrayValuable { /** * 草稿 * - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#createReturnSales} + * 对应方法:{@link MesWmReturnSalesService#createReturnSales(MesWmReturnSalesSaveReqVO)} */ PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), /** - * 待执行 + * 待检验(已确认,等待质检) * - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#submitReturnSales} + * 对应方法:{@link MesWmReturnSalesService#submitReturnSales(Long)} */ - APPROVING(MesOrderStatusConstants.APPROVING, "待执行"), + CONFIRMED(MesOrderStatusConstants.CONFIRMED, "待检验"), // "UNCHECK" /** - * 待上架 + * 待执行(检验完成或免检,等待执行退货) * - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#finishReturnSales} + * 对应方法:{@link MesWmReturnSalesService#submitReturnSales(Long)} */ - APPROVED(MesOrderStatusConstants.APPROVED, "待上架"), + APPROVING(MesOrderStatusConstants.APPROVING, "待执行"), // "UNEXECUTE" /** - * 已完成 + * 待上架(退货执行完成,等待仓库上架) * - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#stockReturnSales} + * 对应方法:{@link MesWmReturnSalesService#finishReturnSales(Long)} + */ + APPROVED(MesOrderStatusConstants.APPROVED, "待上架"), // "UNSTOCK" + /** + * 已完成(上架完成,库存已更新) + * + * 对应方法:{@link MesWmReturnSalesService#stockReturnSales(Long)} */ FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), /** * 已取消 * - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#cancelReturnSales} + * 对应方法:{@link MesWmReturnSalesService#cancelReturnSales(Long)} */ CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); 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 f4dff35..6b2fe57 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 @@ -163,7 +163,7 @@ public class MesWmReturnIssueLineServiceImpl implements MesWmReturnIssueLineServ .setItemId(sourceLine.getItemId()) .setQuantity(unqualifiedQuantity) .setBatchId(sourceLine.getBatchId()) - .setIpqcId(sourceLine.getIpqcId()) + .setRqcId(sourceLine.getRqcId()) .setQcFlag(sourceLine.getQcFlag()) .setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus()) .setRemark(sourceLine.getRemark()); 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 17c8184..9632717 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 @@ -133,21 +133,19 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { @Override @Transactional(rollbackFor = Exception.class) public void submitReturnIssue(Long id) { - // 校验存在 + 草稿状态 + // 1.1 校验存在 + 草稿状态 validateReturnIssueExistsAndPrepare(id); - // 校验至少有一条行 + // 1.2 校验至少有一条行 List lines = issueLineService.getReturnIssueLineListByIssueId(id); if (CollUtil.isEmpty(lines)) { throw exception(WM_RETURN_ISSUE_NO_LINE); } - // 2.1.1 检查是否有待检验的物料 + // 2.1 确定目标状态:1)有待检验物料 → 待检验状态;2)无待检验物料 → 待上架状态 boolean hasPendingQc = CollUtil.contains(lines, line -> MesWmQualityStatusEnum.PENDING.getStatus().equals(line.getQualityStatus())); - // 2.1.2 确定目标状态:1)有待检验物料 → 待检验状态;2)无待检验物料 → 待上架状态 Integer targetStatus = hasPendingQc ? MesWmReturnIssueStatusEnum.CONFIRMED.getStatus() : MesWmReturnIssueStatusEnum.APPROVING.getStatus(); - // 2.2 提交(草稿 → 待检验/待上架) issueMapper.updateById(new MesWmReturnIssueDO().setId(id).setStatus(targetStatus)); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java index a3fb263..eee9b6d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.service.wm.returnsales; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; 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.returnsales.vo.line.MesWmReturnSalesLinePageReqVO; @@ -51,6 +52,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ // 插入 MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class); + line.setQualityStatus(calculateQualityStatus(line.getQcFlag())); returnSalesLineMapper.insert(line); return line.getId(); } @@ -66,6 +68,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ // 更新 MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class); + updateObj.setQualityStatus(calculateQualityStatus(updateObj.getQcFlag())); returnSalesLineMapper.updateById(updateObj); } @@ -110,10 +113,19 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ public void updateQualityStatusByReturnId(Long returnId, Integer qualityStatus) { List lines = returnSalesLineMapper.selectListByReturnId(returnId); for (MesWmReturnSalesLineDO line : lines) { - returnSalesLineMapper.updateById(new MesWmReturnSalesLineDO() - .setId(line.getId()) - .setQualityStatus(qualityStatus)); + Integer newStatus = calculateQualityStatus(line.getQcFlag()); + if (ObjUtil.notEqual(newStatus, line.getQualityStatus())) { + returnSalesLineMapper.updateById(new MesWmReturnSalesLineDO() + .setId(line.getId()).setQualityStatus(newStatus)); + } + } + } + + private Integer calculateQualityStatus(Boolean qcFlag) { + if (Boolean.TRUE.equals(qcFlag)) { + return MesWmQualityStatusEnum.PENDING.getStatus(); // 待检 } + return MesWmQualityStatusEnum.PASS.getStatus(); // 不需检验,默认合格 } /** @@ -154,6 +166,8 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ .setItemId(sourceLine.getItemId()) .setQuantity(unqualifiedQuantity) .setBatchId(sourceLine.getBatchId()) + .setRqcId(sourceLine.getRqcId()) + .setQcFlag(sourceLine.getQcFlag()) .setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus()) .setRemark(sourceLine.getRemark()); returnSalesLineMapper.insert(unqualifiedLine); @@ -170,7 +184,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ boolean allInspected = !CollUtil.contains(allLines, line -> Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus())); if (allInspected) { - returnSalesService.updateReturnSalesStatus(sourceDocId, MesWmReturnSalesStatusEnum.APPROVED.getStatus()); + returnSalesService.updateReturnSalesStatus(sourceDocId, MesWmReturnSalesStatusEnum.APPROVING.getStatus()); } } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java index 675ed98..8df9d6c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java @@ -110,21 +110,22 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { @Override @Transactional(rollbackFor = Exception.class) public void submitReturnSales(Long id) { - // 校验存在 + 草稿状态 + // 1.1 校验存在 + 草稿状态 validateReturnSalesExistsAndPrepare(id); - // 校验至少有一条行 + // 1.2 校验至少有一条行 List lines = returnSalesLineService.getReturnSalesLineListByReturnId(id); if (CollUtil.isEmpty(lines)) { throw exception(WM_RETURN_SALES_NO_LINE); } - // 提交(草稿 -> 待执行) + // 2.1 确定目标状态:1)有待检验物料 → 待检验状态;2)无待检验物料 → 待执行状态 + boolean hasPendingQc = CollUtil.contains(lines, + line -> MesWmQualityStatusEnum.PENDING.getStatus().equals(line.getQualityStatus())); + Integer targetStatus = hasPendingQc ? MesWmReturnSalesStatusEnum.CONFIRMED.getStatus() + : MesWmReturnSalesStatusEnum.APPROVING.getStatus(); + // 2.2 提交(草稿 -> 待检验/待执行) returnSalesMapper.updateById(new MesWmReturnSalesDO() - .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVING.getStatus())); - - // DONE @AI:全部的行设置为待检验状态 - returnSalesLineService.updateQualityStatusByReturnId(id, - MesWmQualityStatusEnum.PENDING.getStatus()); + .setId(id).setStatus(targetStatus)); } @Override diff --git a/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml b/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml index ec6c509..07fe0cb 100644 --- a/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml +++ b/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml @@ -133,7 +133,7 @@ UNION ALL - + SELECT r.id AS sourceDocId, ${@cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants@WM_RETURN_SALES} AS sourceDocType, @@ -150,7 +150,8 @@ r.client_id AS clientId FROM mes_wm_return_sales r JOIN mes_wm_return_sales_line rl ON r.id = rl.return_id - WHERE r.status = ${@cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum@APPROVING.status} + WHERE r.status = ${@cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum@CONFIRMED.status} + AND rl.qc_flag = 1 AND rl.quality_status = ${@cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum@PENDING.status} AND r.deleted = 0 AND rl.deleted = 0 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 1b40521..7044518 100644 --- a/yudao-module-mes/src/test/resources/sql/create_tables.sql +++ b/yudao-module-mes/src/test/resources/sql/create_tables.sql @@ -414,7 +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, - "ipqc_id" bigint DEFAULT NULL, + "rqc_id" bigint DEFAULT NULL, "qc_flag" bit NOT NULL DEFAULT FALSE, "quality_status" int DEFAULT NULL, "remark" varchar(500) DEFAULT '', @@ -436,6 +436,8 @@ CREATE TABLE IF NOT EXISTS "mes_wm_return_sales_line" ( "item_id" bigint NOT NULL, "quantity" decimal(12,2) NOT NULL DEFAULT 0.00, "batch_id" bigint DEFAULT NULL, + "rqc_id" bigint DEFAULT NULL, + "qc_flag" bit NOT NULL DEFAULT FALSE, "quality_status" int DEFAULT NULL, "remark" varchar(500) DEFAULT '', "creator" varchar(64) DEFAULT '',