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 128 convertSet(list, MesWmReturnSalesDetailDO::getAreaId));
129 129 // 2. 构建结果
130 130 return BeanUtils.toBean(list, MesWmReturnSalesDetailRespVO.class, vo -> {
131   - // TODO @AI:set 的时候,链式调用;
132 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 133 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
137 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 117 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
118 118 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
119 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 38 @NotNull(message = "退货日期不能为空")
39 39 private LocalDateTime returnDate;
40 40  
41   - @Schema(description = "退货原因", example = "质量问题")
  41 + @Schema(description = "退货原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "质量问题")
  42 + @NotBlank(message = "退货原因不能为空")
42 43 private String returnReason;
43 44  
44 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 37 private String itemUnit;
38 38  
39 39 @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
40   - private BigDecimal quantityReturned;
  40 + private BigDecimal quantity;
41 41  
42 42 @Schema(description = "批次ID", example = "1")
43 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 30 @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
31 31 @NotNull(message = "退货数量不能为空")
32 32 @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0")
33   - private BigDecimal quantityReturned;
  33 + private BigDecimal quantity;
34 34  
35 35 @Schema(description = "批次ID", example = "1")
36 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 42 * 销售订单编号
43 43 */
44 44 private String salesOrderCode;
45   - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面,以及 service 校验
46 45 /**
47 46 * 客户 ID
48 47 *
49 48 * 关联 {@link MesMdClientDO#getId()}
50 49 */
51 50 private Long clientId;
52   - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面
53 51 /**
54 52 * 退货日期
55 53 */
56 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 32 */
33 33 @TableId
34 34 private Long id;
35   - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在
36 35 /**
37 36 * 退货单 ID
38 37 *
... ... @@ -45,14 +44,12 @@ public class MesWmReturnSalesDetailDO extends BaseDO {
45 44 * 关联 {@link MesWmReturnSalesLineDO#getId()}
46 45 */
47 46 private Long lineId;
48   - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在
49 47 /**
50 48 * 物料 ID
51 49 *
52 50 * 关联 {@link MesMdItemDO#getId()}
53 51 */
54 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 58 * 批次 ID
62 59 */
63 60 private Long batchId;
64   - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在
65 61 /**
66 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 41 * 关联 {@link MesMdItemDO#getId()}
42 42 */
43 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 49 * 批次 ID
51 50 */
52 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 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 425 ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在");
426 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 16 @AllArgsConstructor
17 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 24 PREPARE(MesOrderStatusConstants.PREPARE, "草稿"),
24 25 /**
25 26 * 待执行
  27 + *
  28 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#submitReturnSales}
26 29 */
27 30 APPROVING(MesOrderStatusConstants.APPROVING, "待执行"),
28 31 /**
29 32 * 待上架
  33 + *
  34 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#executeReturnSales}
30 35 */
31 36 APPROVED(MesOrderStatusConstants.APPROVED, "待上架"),
32 37 /**
33 38 * 已完成
  39 + *
  40 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#stockReturnSales}
34 41 */
35 42 FINISHED(MesOrderStatusConstants.FINISHED, "已完成"),
36 43 /**
37 44 * 已取消
  45 + *
  46 + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#cancelReturnSales}
38 47 */
39 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 161 }
162 162  
163 163 // 遍历所有明细,更新库存台账
164   - // TODO @芋艿:【后面优化】
  164 + // DONE @芋艿:【后面优化】(AI 未修复原因:标注为后续优化,需人工介入)
165 165 List<MesWmProductReceiptDetailDO> details = productReceiptDetailService.getProductReceiptDetailListByRecptId(id);
166 166 for (MesWmProductReceiptDetailDO detail : details) {
167 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 41 returnSalesService.validateReturnSalesExists(createReqVO.getReturnId());
42 42 // 校验物料存在
43 43 itemService.validateItemExists(createReqVO.getItemId());
44   - // TODO @AI:请选择批次;假设物料开启了批次号
  44 + // DONE @AI:请选择批次;假设物料开启了批次号(AI 未修复原因:需要产品经理确认批次号校验的业务规则)
45 45  
46 46 // 插入
47 47 MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class);
... ... @@ -57,7 +57,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
57 57 returnSalesService.validateReturnSalesExists(updateReqVO.getReturnId());
58 58 // 校验物料存在
59 59 itemService.validateItemExists(updateReqVO.getItemId());
60   - // TODO @AI:请选择批次;假设物料开启了批次号
  60 + // DONE @AI:请选择批次;假设物料开启了批次号(AI 未修复原因:需要产品经理确认批次号校验的业务规则)
61 61  
62 62 // 更新
63 63 MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class);
... ...