Commit 828c878fd36537e06f4bbc98386433b8cdcc3e04
1 parent
37313f35
✨ feat(mes): 更新退货检验单相关字段,优化数据结构和逻辑
Showing
12 changed files
with
76 additions
and
38 deletions
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 { |
| 43 | 43 | @Schema(description = "质量状态", example = "0") |
| 44 | 44 | private Integer qualityStatus; |
| 45 | 45 | |
| 46 | - @Schema(description = "过程检验单 ID", example = "1") | |
| 47 | - private Long ipqcId; | |
| 46 | + @Schema(description = "退货检验单 ID", example = "21601") | |
| 47 | + private Long rqcId; | |
| 48 | 48 | |
| 49 | 49 | @Schema(description = "备注", example = "备注") |
| 50 | 50 | private String remark; | ... | ... |
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 { |
| 42 | 42 | @Schema(description = "批次ID", example = "1") |
| 43 | 43 | private Long batchId; |
| 44 | 44 | |
| 45 | + @Schema(description = "退货检验单 ID", example = "400") | |
| 46 | + private Long rqcId; | |
| 47 | + | |
| 48 | + @Schema(description = "是否需要质检", example = "true") | |
| 49 | + private Boolean qcFlag; | |
| 50 | + | |
| 45 | 51 | @Schema(description = "批次号", example = "B001") |
| 46 | 52 | private String batchCode; |
| 47 | 53 | ... | ... |
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 { |
| 32 | 32 | @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") |
| 33 | 33 | private BigDecimal quantity; |
| 34 | 34 | |
| 35 | - @Schema(description = "批次ID", example = "1") | |
| 35 | + @Schema(description = "批次号", example = "B20250101") | |
| 36 | 36 | private Long batchId; |
| 37 | 37 | |
| 38 | - @Schema(description = "质量状态", example = "合格") | |
| 39 | - private Integer qualityStatus; | |
| 38 | + @Schema(description = "是否需要质检", example = "true") | |
| 39 | + private Boolean qcFlag; | |
| 40 | 40 | |
| 41 | 41 | @Schema(description = "备注", example = "备注") |
| 42 | 42 | private String remark; | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java
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 { |
| 50 | 50 | */ |
| 51 | 51 | private Long batchId; |
| 52 | 52 | /** |
| 53 | + * 退货检验单 ID | |
| 54 | + */ | |
| 55 | + private Long rqcId; | |
| 56 | + /** | |
| 57 | + * 是否需要质检 | |
| 58 | + */ | |
| 59 | + private Boolean qcFlag; | |
| 60 | + /** | |
| 53 | 61 | * 质量状态 |
| 54 | 62 | * |
| 55 | 63 | * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java
| 1 | 1 | package cn.iocoder.yudao.module.mes.enums.wm; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| 4 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO; | |
| 4 | 5 | import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; |
| 6 | +import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; | |
| 5 | 7 | import lombok.AllArgsConstructor; |
| 6 | 8 | import lombok.Getter; |
| 7 | 9 | |
| ... | ... | @@ -19,31 +21,37 @@ public enum MesWmReturnSalesStatusEnum implements ArrayValuable<Integer> { |
| 19 | 21 | /** |
| 20 | 22 | * 草稿 |
| 21 | 23 | * |
| 22 | - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#createReturnSales} | |
| 24 | + * 对应方法:{@link MesWmReturnSalesService#createReturnSales(MesWmReturnSalesSaveReqVO)} | |
| 23 | 25 | */ |
| 24 | 26 | PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), |
| 25 | 27 | /** |
| 26 | - * 待执行 | |
| 28 | + * 待检验(已确认,等待质检) | |
| 27 | 29 | * |
| 28 | - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#submitReturnSales} | |
| 30 | + * 对应方法:{@link MesWmReturnSalesService#submitReturnSales(Long)} | |
| 29 | 31 | */ |
| 30 | - APPROVING(MesOrderStatusConstants.APPROVING, "待执行"), | |
| 32 | + CONFIRMED(MesOrderStatusConstants.CONFIRMED, "待检验"), // "UNCHECK" | |
| 31 | 33 | /** |
| 32 | - * 待上架 | |
| 34 | + * 待执行(检验完成或免检,等待执行退货) | |
| 33 | 35 | * |
| 34 | - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#finishReturnSales} | |
| 36 | + * 对应方法:{@link MesWmReturnSalesService#submitReturnSales(Long)} | |
| 35 | 37 | */ |
| 36 | - APPROVED(MesOrderStatusConstants.APPROVED, "待上架"), | |
| 38 | + APPROVING(MesOrderStatusConstants.APPROVING, "待执行"), // "UNEXECUTE" | |
| 37 | 39 | /** |
| 38 | - * 已完成 | |
| 40 | + * 待上架(退货执行完成,等待仓库上架) | |
| 39 | 41 | * |
| 40 | - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#stockReturnSales} | |
| 42 | + * 对应方法:{@link MesWmReturnSalesService#finishReturnSales(Long)} | |
| 43 | + */ | |
| 44 | + APPROVED(MesOrderStatusConstants.APPROVED, "待上架"), // "UNSTOCK" | |
| 45 | + /** | |
| 46 | + * 已完成(上架完成,库存已更新) | |
| 47 | + * | |
| 48 | + * 对应方法:{@link MesWmReturnSalesService#stockReturnSales(Long)} | |
| 41 | 49 | */ |
| 42 | 50 | FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), |
| 43 | 51 | /** |
| 44 | 52 | * 已取消 |
| 45 | 53 | * |
| 46 | - * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#cancelReturnSales} | |
| 54 | + * 对应方法:{@link MesWmReturnSalesService#cancelReturnSales(Long)} | |
| 47 | 55 | */ |
| 48 | 56 | CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); |
| 49 | 57 | ... | ... |
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 |
| 163 | 163 | .setItemId(sourceLine.getItemId()) |
| 164 | 164 | .setQuantity(unqualifiedQuantity) |
| 165 | 165 | .setBatchId(sourceLine.getBatchId()) |
| 166 | - .setIpqcId(sourceLine.getIpqcId()) | |
| 166 | + .setRqcId(sourceLine.getRqcId()) | |
| 167 | 167 | .setQcFlag(sourceLine.getQcFlag()) |
| 168 | 168 | .setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus()) |
| 169 | 169 | .setRemark(sourceLine.getRemark()); | ... | ... |
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 { |
| 133 | 133 | @Override |
| 134 | 134 | @Transactional(rollbackFor = Exception.class) |
| 135 | 135 | public void submitReturnIssue(Long id) { |
| 136 | - // 校验存在 + 草稿状态 | |
| 136 | + // 1.1 校验存在 + 草稿状态 | |
| 137 | 137 | validateReturnIssueExistsAndPrepare(id); |
| 138 | - // 校验至少有一条行 | |
| 138 | + // 1.2 校验至少有一条行 | |
| 139 | 139 | List<MesWmReturnIssueLineDO> lines = issueLineService.getReturnIssueLineListByIssueId(id); |
| 140 | 140 | if (CollUtil.isEmpty(lines)) { |
| 141 | 141 | throw exception(WM_RETURN_ISSUE_NO_LINE); |
| 142 | 142 | } |
| 143 | 143 | |
| 144 | - // 2.1.1 检查是否有待检验的物料 | |
| 144 | + // 2.1 确定目标状态:1)有待检验物料 → 待检验状态;2)无待检验物料 → 待上架状态 | |
| 145 | 145 | boolean hasPendingQc = CollUtil.contains(lines, |
| 146 | 146 | line -> MesWmQualityStatusEnum.PENDING.getStatus().equals(line.getQualityStatus())); |
| 147 | - // 2.1.2 确定目标状态:1)有待检验物料 → 待检验状态;2)无待检验物料 → 待上架状态 | |
| 148 | 147 | Integer targetStatus = hasPendingQc ? MesWmReturnIssueStatusEnum.CONFIRMED.getStatus() |
| 149 | 148 | : MesWmReturnIssueStatusEnum.APPROVING.getStatus(); |
| 150 | - | |
| 151 | 149 | // 2.2 提交(草稿 → 待检验/待上架) |
| 152 | 150 | issueMapper.updateById(new MesWmReturnIssueDO().setId(id).setStatus(targetStatus)); |
| 153 | 151 | } | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
| 1 | 1 | package cn.iocoder.yudao.module.mes.service.wm.returnsales; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.hutool.core.util.ObjUtil; | |
| 4 | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | 6 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | 7 | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLinePageReqVO; |
| ... | ... | @@ -51,6 +52,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ |
| 51 | 52 | |
| 52 | 53 | // 插入 |
| 53 | 54 | MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class); |
| 55 | + line.setQualityStatus(calculateQualityStatus(line.getQcFlag())); | |
| 54 | 56 | returnSalesLineMapper.insert(line); |
| 55 | 57 | return line.getId(); |
| 56 | 58 | } |
| ... | ... | @@ -66,6 +68,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ |
| 66 | 68 | |
| 67 | 69 | // 更新 |
| 68 | 70 | MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class); |
| 71 | + updateObj.setQualityStatus(calculateQualityStatus(updateObj.getQcFlag())); | |
| 69 | 72 | returnSalesLineMapper.updateById(updateObj); |
| 70 | 73 | } |
| 71 | 74 | |
| ... | ... | @@ -110,10 +113,19 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ |
| 110 | 113 | public void updateQualityStatusByReturnId(Long returnId, Integer qualityStatus) { |
| 111 | 114 | List<MesWmReturnSalesLineDO> lines = returnSalesLineMapper.selectListByReturnId(returnId); |
| 112 | 115 | for (MesWmReturnSalesLineDO line : lines) { |
| 113 | - returnSalesLineMapper.updateById(new MesWmReturnSalesLineDO() | |
| 114 | - .setId(line.getId()) | |
| 115 | - .setQualityStatus(qualityStatus)); | |
| 116 | + Integer newStatus = calculateQualityStatus(line.getQcFlag()); | |
| 117 | + if (ObjUtil.notEqual(newStatus, line.getQualityStatus())) { | |
| 118 | + returnSalesLineMapper.updateById(new MesWmReturnSalesLineDO() | |
| 119 | + .setId(line.getId()).setQualityStatus(newStatus)); | |
| 120 | + } | |
| 121 | + } | |
| 122 | + } | |
| 123 | + | |
| 124 | + private Integer calculateQualityStatus(Boolean qcFlag) { | |
| 125 | + if (Boolean.TRUE.equals(qcFlag)) { | |
| 126 | + return MesWmQualityStatusEnum.PENDING.getStatus(); // 待检 | |
| 116 | 127 | } |
| 128 | + return MesWmQualityStatusEnum.PASS.getStatus(); // 不需检验,默认合格 | |
| 117 | 129 | } |
| 118 | 130 | |
| 119 | 131 | /** |
| ... | ... | @@ -154,6 +166,8 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ |
| 154 | 166 | .setItemId(sourceLine.getItemId()) |
| 155 | 167 | .setQuantity(unqualifiedQuantity) |
| 156 | 168 | .setBatchId(sourceLine.getBatchId()) |
| 169 | + .setRqcId(sourceLine.getRqcId()) | |
| 170 | + .setQcFlag(sourceLine.getQcFlag()) | |
| 157 | 171 | .setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus()) |
| 158 | 172 | .setRemark(sourceLine.getRemark()); |
| 159 | 173 | returnSalesLineMapper.insert(unqualifiedLine); |
| ... | ... | @@ -170,7 +184,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ |
| 170 | 184 | boolean allInspected = !CollUtil.contains(allLines, |
| 171 | 185 | line -> Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus())); |
| 172 | 186 | if (allInspected) { |
| 173 | - returnSalesService.updateReturnSalesStatus(sourceDocId, MesWmReturnSalesStatusEnum.APPROVED.getStatus()); | |
| 187 | + returnSalesService.updateReturnSalesStatus(sourceDocId, MesWmReturnSalesStatusEnum.APPROVING.getStatus()); | |
| 174 | 188 | } |
| 175 | 189 | } |
| 176 | 190 | } | ... | ... |
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 { |
| 110 | 110 | @Override |
| 111 | 111 | @Transactional(rollbackFor = Exception.class) |
| 112 | 112 | public void submitReturnSales(Long id) { |
| 113 | - // 校验存在 + 草稿状态 | |
| 113 | + // 1.1 校验存在 + 草稿状态 | |
| 114 | 114 | validateReturnSalesExistsAndPrepare(id); |
| 115 | - // 校验至少有一条行 | |
| 115 | + // 1.2 校验至少有一条行 | |
| 116 | 116 | List<MesWmReturnSalesLineDO> lines = returnSalesLineService.getReturnSalesLineListByReturnId(id); |
| 117 | 117 | if (CollUtil.isEmpty(lines)) { |
| 118 | 118 | throw exception(WM_RETURN_SALES_NO_LINE); |
| 119 | 119 | } |
| 120 | 120 | |
| 121 | - // 提交(草稿 -> 待执行) | |
| 121 | + // 2.1 确定目标状态:1)有待检验物料 → 待检验状态;2)无待检验物料 → 待执行状态 | |
| 122 | + boolean hasPendingQc = CollUtil.contains(lines, | |
| 123 | + line -> MesWmQualityStatusEnum.PENDING.getStatus().equals(line.getQualityStatus())); | |
| 124 | + Integer targetStatus = hasPendingQc ? MesWmReturnSalesStatusEnum.CONFIRMED.getStatus() | |
| 125 | + : MesWmReturnSalesStatusEnum.APPROVING.getStatus(); | |
| 126 | + // 2.2 提交(草稿 -> 待检验/待执行) | |
| 122 | 127 | returnSalesMapper.updateById(new MesWmReturnSalesDO() |
| 123 | - .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVING.getStatus())); | |
| 124 | - | |
| 125 | - // DONE @AI:全部的行设置为待检验状态 | |
| 126 | - returnSalesLineService.updateQualityStatusByReturnId(id, | |
| 127 | - MesWmQualityStatusEnum.PENDING.getStatus()); | |
| 128 | + .setId(id).setStatus(targetStatus)); | |
| 128 | 129 | } |
| 129 | 130 | |
| 130 | 131 | @Override | ... | ... |
yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml
| ... | ... | @@ -133,7 +133,7 @@ |
| 133 | 133 | |
| 134 | 134 | UNION ALL |
| 135 | 135 | |
| 136 | - <!-- 6. RQC 来源:销售退货单(待执行(APPROVING),行的 quality_status=0) --> | |
| 136 | + <!-- 6. RQC 来源:销售退货单(待检验(CONFIRMED),行的 quality_status=0) --> | |
| 137 | 137 | SELECT |
| 138 | 138 | r.id AS sourceDocId, |
| 139 | 139 | ${@cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants@WM_RETURN_SALES} AS sourceDocType, |
| ... | ... | @@ -150,7 +150,8 @@ |
| 150 | 150 | r.client_id AS clientId |
| 151 | 151 | FROM mes_wm_return_sales r |
| 152 | 152 | JOIN mes_wm_return_sales_line rl ON r.id = rl.return_id |
| 153 | - WHERE r.status = ${@cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum@APPROVING.status} | |
| 153 | + WHERE r.status = ${@cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum@CONFIRMED.status} | |
| 154 | + AND rl.qc_flag = 1 | |
| 154 | 155 | AND rl.quality_status = ${@cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum@PENDING.status} |
| 155 | 156 | AND r.deleted = 0 |
| 156 | 157 | AND rl.deleted = 0 | ... | ... |
yudao-module-mes/src/test/resources/sql/create_tables.sql
| ... | ... | @@ -414,7 +414,7 @@ CREATE TABLE IF NOT EXISTS "mes_wm_return_issue_line" ( |
| 414 | 414 | "item_id" bigint NOT NULL, |
| 415 | 415 | "quantity" decimal(12,2) NOT NULL DEFAULT 0.00, |
| 416 | 416 | "batch_id" bigint DEFAULT NULL, |
| 417 | - "ipqc_id" bigint DEFAULT NULL, | |
| 417 | + "rqc_id" bigint DEFAULT NULL, | |
| 418 | 418 | "qc_flag" bit NOT NULL DEFAULT FALSE, |
| 419 | 419 | "quality_status" int DEFAULT NULL, |
| 420 | 420 | "remark" varchar(500) DEFAULT '', |
| ... | ... | @@ -436,6 +436,8 @@ CREATE TABLE IF NOT EXISTS "mes_wm_return_sales_line" ( |
| 436 | 436 | "item_id" bigint NOT NULL, |
| 437 | 437 | "quantity" decimal(12,2) NOT NULL DEFAULT 0.00, |
| 438 | 438 | "batch_id" bigint DEFAULT NULL, |
| 439 | + "rqc_id" bigint DEFAULT NULL, | |
| 440 | + "qc_flag" bit NOT NULL DEFAULT FALSE, | |
| 439 | 441 | "quality_status" int DEFAULT NULL, |
| 440 | 442 | "remark" varchar(500) DEFAULT '', |
| 441 | 443 | "creator" varchar(64) DEFAULT '', | ... | ... |