Commit 8ea0c2f09ba43c24d7076b96b0921b9d6b3c22b2
1 parent
4d4287dd
✨ feat(mes): 更新退货单相关字段及逻辑优化
- 修改退货数量字段名称为 `quantity`,以简化代码。 - 更新退货原因字段为必填项,确保数据完整性。 - 优化部分逻辑,提升代码可读性和维护性。
Showing
12 changed files
with
51 additions
and
46 deletions
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); | ... | ... |