Commit 828c878fd36537e06f4bbc98386433b8cdcc3e04

Authored by YunaiV
1 parent 37313f35

✨ feat(mes): 更新退货检验单相关字段,优化数据结构和逻辑

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
... ... @@ -52,9 +52,9 @@ public class MesWmReturnIssueLineDO extends BaseDO {
52 52 */
53 53 private Long batchId;
54 54 /**
55   - * 过程检验单 ID
  55 + * 退货检验单 ID
56 56 */
57   - private Long ipqcId;
  57 + private Long rqcId;
58 58 /**
59 59 * 是否需要质检
60 60 */
... ...
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 &quot;mes_wm_return_issue_line&quot; (
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 &quot;mes_wm_return_sales_line&quot; (
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 '',
... ...