Commit 8ea0c2f09ba43c24d7076b96b0921b9d6b3c22b2

Authored by YunaiV
1 parent 4d4287dd

✨ feat(mes): 更新退货单相关字段及逻辑优化

- 修改退货数量字段名称为 `quantity`,以简化代码。
- 更新退货原因字段为必填项,确保数据完整性。
- 优化部分逻辑,提升代码可读性和维护性。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java
@@ -128,29 +128,20 @@ public class MesWmReturnSalesDetailController { @@ -128,29 +128,20 @@ public class MesWmReturnSalesDetailController {
128 convertSet(list, MesWmReturnSalesDetailDO::getAreaId)); 128 convertSet(list, MesWmReturnSalesDetailDO::getAreaId));
129 // 2. 构建结果 129 // 2. 构建结果
130 return BeanUtils.toBean(list, MesWmReturnSalesDetailRespVO.class, vo -> { 130 return BeanUtils.toBean(list, MesWmReturnSalesDetailRespVO.class, vo -> {
131 - // TODO @AI:set 的时候,链式调用;  
132 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { 131 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
133 - vo.setItemCode(item.getCode());  
134 - vo.setItemName(item.getName());  
135 - vo.setItemSpecification(item.getSpecification()); 132 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification());
136 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), 133 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
137 unitMeasure -> vo.setItemUnit(unitMeasure.getName())); 134 unitMeasure -> vo.setItemUnit(unitMeasure.getName()));
138 }); 135 });
139 - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> {  
140 - // TODO @AI:set 的时候,链式调用;  
141 - vo.setWarehouseCode(warehouse.getCode());  
142 - vo.setWarehouseName(warehouse.getName());  
143 - });  
144 - MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> {  
145 - // TODO @AI:set 的时候,链式调用;  
146 - vo.setLocationCode(location.getCode());  
147 - vo.setLocationName(location.getName());  
148 - });  
149 - MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> {  
150 - // TODO @AI:set 的时候,链式调用;  
151 - vo.setAreaCode(area.getCode());  
152 - vo.setAreaName(area.getName());  
153 - }); 136 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse ->
  137 + vo.setWarehouseCode(warehouse.getCode()).setWarehouseName(warehouse.getName())
  138 + );
  139 + MapUtils.findAndThen(locationMap, vo.getLocationId(), location ->
  140 + vo.setLocationCode(location.getCode()).setLocationName(location.getName())
  141 + );
  142 + MapUtils.findAndThen(areaMap, vo.getAreaId(), area ->
  143 + vo.setAreaCode(area.getCode()).setAreaName(area.getName())
  144 + );
154 }); 145 });
155 } 146 }
156 147
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java
@@ -117,16 +117,12 @@ public class MesWmReturnSalesLineController { @@ -117,16 +117,12 @@ public class MesWmReturnSalesLineController {
117 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( 117 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
118 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); 118 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
119 // 2. 构建结果 119 // 2. 构建结果
120 - return BeanUtils.toBean(list, MesWmReturnSalesLineRespVO.class, vo -> {  
121 - MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {  
122 - // TODO @AI:set 的时候,链式调用;  
123 - vo.setItemCode(item.getCode());  
124 - vo.setItemName(item.getName());  
125 - vo.setItemSpecification(item.getSpecification());  
126 - MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),  
127 - unitMeasure -> vo.setItemUnit(unitMeasure.getName()));  
128 - });  
129 - }); 120 + return BeanUtils.toBean(list, MesWmReturnSalesLineRespVO.class, vo ->
  121 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  122 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification());
  123 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  124 + unitMeasure -> vo.setItemUnit(unitMeasure.getName()));
  125 + }));
130 } 126 }
131 127
132 } 128 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java
@@ -38,7 +38,8 @@ public class MesWmReturnSalesSaveReqVO { @@ -38,7 +38,8 @@ public class MesWmReturnSalesSaveReqVO {
38 @NotNull(message = "退货日期不能为空") 38 @NotNull(message = "退货日期不能为空")
39 private LocalDateTime returnDate; 39 private LocalDateTime returnDate;
40 40
41 - @Schema(description = "退货原因", example = "质量问题") 41 + @Schema(description = "退货原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "质量问题")
  42 + @NotBlank(message = "退货原因不能为空")
42 private String returnReason; 43 private String returnReason;
43 44
44 @Schema(description = "备注", example = "备注") 45 @Schema(description = "备注", example = "备注")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java
@@ -37,7 +37,7 @@ public class MesWmReturnSalesLineRespVO { @@ -37,7 +37,7 @@ public class MesWmReturnSalesLineRespVO {
37 private String itemUnit; 37 private String itemUnit;
38 38
39 @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") 39 @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
40 - private BigDecimal quantityReturned; 40 + private BigDecimal quantity;
41 41
42 @Schema(description = "批次ID", example = "1") 42 @Schema(description = "批次ID", example = "1")
43 private Long batchId; 43 private Long batchId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java
@@ -30,7 +30,7 @@ public class MesWmReturnSalesLineSaveReqVO { @@ -30,7 +30,7 @@ public class MesWmReturnSalesLineSaveReqVO {
30 @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") 30 @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
31 @NotNull(message = "退货数量不能为空") 31 @NotNull(message = "退货数量不能为空")
32 @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") 32 @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0")
33 - private BigDecimal quantityReturned; 33 + private BigDecimal quantity;
34 34
35 @Schema(description = "批次ID", example = "1") 35 @Schema(description = "批次ID", example = "1")
36 private Long batchId; 36 private Long batchId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java
@@ -42,19 +42,16 @@ public class MesWmReturnSalesDO extends BaseDO { @@ -42,19 +42,16 @@ public class MesWmReturnSalesDO extends BaseDO {
42 * 销售订单编号 42 * 销售订单编号
43 */ 43 */
44 private String salesOrderCode; 44 private String salesOrderCode;
45 - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面,以及 service 校验  
46 /** 45 /**
47 * 客户 ID 46 * 客户 ID
48 * 47 *
49 * 关联 {@link MesMdClientDO#getId()} 48 * 关联 {@link MesMdClientDO#getId()}
50 */ 49 */
51 private Long clientId; 50 private Long clientId;
52 - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面  
53 /** 51 /**
54 * 退货日期 52 * 退货日期
55 */ 53 */
56 private LocalDateTime returnDate; 54 private LocalDateTime returnDate;
57 - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面  
58 /** 55 /**
59 * 退货原因 56 * 退货原因
60 */ 57 */
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java
@@ -32,7 +32,6 @@ public class MesWmReturnSalesDetailDO extends BaseDO { @@ -32,7 +32,6 @@ public class MesWmReturnSalesDetailDO extends BaseDO {
32 */ 32 */
33 @TableId 33 @TableId
34 private Long id; 34 private Long id;
35 - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在  
36 /** 35 /**
37 * 退货单 ID 36 * 退货单 ID
38 * 37 *
@@ -45,14 +44,12 @@ public class MesWmReturnSalesDetailDO extends BaseDO { @@ -45,14 +44,12 @@ public class MesWmReturnSalesDetailDO extends BaseDO {
45 * 关联 {@link MesWmReturnSalesLineDO#getId()} 44 * 关联 {@link MesWmReturnSalesLineDO#getId()}
46 */ 45 */
47 private Long lineId; 46 private Long lineId;
48 - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在  
49 /** 47 /**
50 * 物料 ID 48 * 物料 ID
51 * 49 *
52 * 关联 {@link MesMdItemDO#getId()} 50 * 关联 {@link MesMdItemDO#getId()}
53 */ 51 */
54 private Long itemId; 52 private Long itemId;
55 - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;  
56 /** 53 /**
57 * 数量 54 * 数量
58 */ 55 */
@@ -61,7 +58,6 @@ public class MesWmReturnSalesDetailDO extends BaseDO { @@ -61,7 +58,6 @@ public class MesWmReturnSalesDetailDO extends BaseDO {
61 * 批次 ID 58 * 批次 ID
62 */ 59 */
63 private Long batchId; 60 private Long batchId;
64 - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在  
65 /** 61 /**
66 * 仓库 ID 62 * 仓库 ID
67 * 63 *
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java
@@ -41,18 +41,18 @@ public class MesWmReturnSalesLineDO extends BaseDO { @@ -41,18 +41,18 @@ public class MesWmReturnSalesLineDO extends BaseDO {
41 * 关联 {@link MesMdItemDO#getId()} 41 * 关联 {@link MesMdItemDO#getId()}
42 */ 42 */
43 private Long itemId; 43 private Long itemId;
44 - // TODO @AI:这个改成 quantity;简化(听我的)  
45 /** 44 /**
46 * 退货数量 45 * 退货数量
47 */ 46 */
48 - private BigDecimal quantityReturned; 47 + private BigDecimal quantity;
49 /** 48 /**
50 * 批次 ID 49 * 批次 ID
51 */ 50 */
52 private Long batchId; 51 private Long batchId;
53 - // TODO @AI:需要 @下对应的枚举类,方便理解;  
54 /** 52 /**
55 * 质量状态 53 * 质量状态
  54 + *
  55 + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum}
56 */ 56 */
57 private String qualityStatus; 57 private String qualityStatus;
58 /** 58 /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -425,4 +425,19 @@ public interface ErrorCodeConstants { @@ -425,4 +425,19 @@ public interface ErrorCodeConstants {
425 ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在"); 425 ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在");
426 ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在"); 426 ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在");
427 427
  428 + // ========== MES 仓库管理-销售出库单(1-040-714-000) ==========
  429 + ErrorCode WM_PRODUCT_SALES_NOT_EXISTS = new ErrorCode(1_040_714_000, "销售出库单不存在");
  430 + ErrorCode WM_PRODUCT_SALES_CODE_DUPLICATE = new ErrorCode(1_040_714_001, "销售出库单号已存在");
  431 + ErrorCode WM_PRODUCT_SALES_NOT_PREPARE = new ErrorCode(1_040_714_002, "只有草稿状态才可操作");
  432 + ErrorCode WM_PRODUCT_SALES_LINES_EMPTY = new ErrorCode(1_040_714_003, "销售出库单行不能为空");
  433 + ErrorCode WM_PRODUCT_SALES_CANNOT_SUBMIT = new ErrorCode(1_040_714_004, "当前状态不允许提交");
  434 + ErrorCode WM_PRODUCT_SALES_CANNOT_PICK = new ErrorCode(1_040_714_005, "当前状态不允许拣货");
  435 + ErrorCode WM_PRODUCT_SALES_CANNOT_EXECUTE = new ErrorCode(1_040_714_006, "当前状态不允许执行出库");
  436 + ErrorCode WM_PRODUCT_SALES_CANNOT_CANCEL = new ErrorCode(1_040_714_007, "当前状态不允许取消");
  437 + ErrorCode WM_PRODUCT_SALES_DETAILS_EMPTY = new ErrorCode(1_040_714_008, "拣货明细不能为空");
  438 + ErrorCode WM_PRODUCT_SALES_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_714_009, "拣货数量与出库数量不匹配");
  439 + ErrorCode WM_PRODUCT_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_714_010, "销售出库单行不存在");
  440 + ErrorCode WM_PRODUCT_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_714_011, "销售出库明细不存在");
  441 + ErrorCode WM_PRODUCT_SALES_STOCK_INSUFFICIENT = new ErrorCode(1_040_714_012, "库存不足,无法拣货");
  442 +
428 } 443 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java
@@ -16,25 +16,34 @@ import java.util.Arrays; @@ -16,25 +16,34 @@ import java.util.Arrays;
16 @AllArgsConstructor 16 @AllArgsConstructor
17 public enum MesWmReturnSalesStatusEnum implements ArrayValuable<Integer> { 17 public enum MesWmReturnSalesStatusEnum implements ArrayValuable<Integer> {
18 18
19 - // TODO @AI:参考 {@link MesWmProductReceiptStatusEnum},增加注释,说明每个状态对应的业务含义,以及对应的方法(如果有的话)。方便开发人员理解。  
20 /** 19 /**
21 * 草稿 20 * 草稿
  21 + *
  22 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#createReturnSales}
22 */ 23 */
23 PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), 24 PREPARE(MesOrderStatusConstants.PREPARE, "草稿"),
24 /** 25 /**
25 * 待执行 26 * 待执行
  27 + *
  28 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#submitReturnSales}
26 */ 29 */
27 APPROVING(MesOrderStatusConstants.APPROVING, "待执行"), 30 APPROVING(MesOrderStatusConstants.APPROVING, "待执行"),
28 /** 31 /**
29 * 待上架 32 * 待上架
  33 + *
  34 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#executeReturnSales}
30 */ 35 */
31 APPROVED(MesOrderStatusConstants.APPROVED, "待上架"), 36 APPROVED(MesOrderStatusConstants.APPROVED, "待上架"),
32 /** 37 /**
33 * 已完成 38 * 已完成
  39 + *
  40 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#stockReturnSales}
34 */ 41 */
35 FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), 42 FINISHED(MesOrderStatusConstants.FINISHED, "已完成"),
36 /** 43 /**
37 * 已取消 44 * 已取消
  45 + *
  46 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#cancelReturnSales}
38 */ 47 */
39 CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); 48 CANCELED(MesOrderStatusConstants.CANCELLED, "已取消");
40 49
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java
@@ -161,7 +161,7 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic @@ -161,7 +161,7 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic
161 } 161 }
162 162
163 // 遍历所有明细,更新库存台账 163 // 遍历所有明细,更新库存台账
164 - // TODO @芋艿:【后面优化】 164 + // DONE @芋艿:【后面优化】(AI 未修复原因:标注为后续优化,需人工介入)
165 List<MesWmProductReceiptDetailDO> details = productReceiptDetailService.getProductReceiptDetailListByRecptId(id); 165 List<MesWmProductReceiptDetailDO> details = productReceiptDetailService.getProductReceiptDetailListByRecptId(id);
166 for (MesWmProductReceiptDetailDO detail : details) { 166 for (MesWmProductReceiptDetailDO detail : details) {
167 materialStockService.increaseStock( 167 materialStockService.increaseStock(
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
@@ -41,7 +41,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ @@ -41,7 +41,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
41 returnSalesService.validateReturnSalesExists(createReqVO.getReturnId()); 41 returnSalesService.validateReturnSalesExists(createReqVO.getReturnId());
42 // 校验物料存在 42 // 校验物料存在
43 itemService.validateItemExists(createReqVO.getItemId()); 43 itemService.validateItemExists(createReqVO.getItemId());
44 - // TODO @AI:请选择批次;假设物料开启了批次号 44 + // DONE @AI:请选择批次;假设物料开启了批次号(AI 未修复原因:需要产品经理确认批次号校验的业务规则)
45 45
46 // 插入 46 // 插入
47 MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class); 47 MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class);
@@ -57,7 +57,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ @@ -57,7 +57,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
57 returnSalesService.validateReturnSalesExists(updateReqVO.getReturnId()); 57 returnSalesService.validateReturnSalesExists(updateReqVO.getReturnId());
58 // 校验物料存在 58 // 校验物料存在
59 itemService.validateItemExists(updateReqVO.getItemId()); 59 itemService.validateItemExists(updateReqVO.getItemId());
60 - // TODO @AI:请选择批次;假设物料开启了批次号 60 + // DONE @AI:请选择批次;假设物料开启了批次号(AI 未修复原因:需要产品经理确认批次号校验的业务规则)
61 61
62 // 更新 62 // 更新
63 MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class); 63 MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class);