From 8ea0c2f09ba43c24d7076b96b0921b9d6b3c22b2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 1 Mar 2026 22:47:51 +0800 Subject: [PATCH] ✨ feat(mes): 更新退货单相关字段及逻辑优化 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java | 29 ++++++++++------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java | 16 ++++++---------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java | 3 ++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java | 3 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java | 4 ---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java | 6 +++--- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 15 +++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java | 11 ++++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java | 4 ++-- 12 files changed, 51 insertions(+), 46 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java index 27b3d13..83a550c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java @@ -128,29 +128,20 @@ public class MesWmReturnSalesDetailController { convertSet(list, MesWmReturnSalesDetailDO::getAreaId)); // 2. 构建结果 return BeanUtils.toBean(list, MesWmReturnSalesDetailRespVO.class, vo -> { - // TODO @AI:set 的时候,链式调用; MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { - vo.setItemCode(item.getCode()); - vo.setItemName(item.getName()); - vo.setItemSpecification(item.getSpecification()); + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification()); MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setItemUnit(unitMeasure.getName())); }); - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> { - // TODO @AI:set 的时候,链式调用; - vo.setWarehouseCode(warehouse.getCode()); - vo.setWarehouseName(warehouse.getName()); - }); - MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> { - // TODO @AI:set 的时候,链式调用; - vo.setLocationCode(location.getCode()); - vo.setLocationName(location.getName()); - }); - MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> { - // TODO @AI:set 的时候,链式调用; - vo.setAreaCode(area.getCode()); - vo.setAreaName(area.getName()); - }); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> + vo.setWarehouseCode(warehouse.getCode()).setWarehouseName(warehouse.getName()) + ); + MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> + vo.setLocationCode(location.getCode()).setLocationName(location.getName()) + ); + MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> + vo.setAreaCode(area.getCode()).setAreaName(area.getName()) + ); }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java index 2c3d970..cf66895 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java @@ -117,16 +117,12 @@ public class MesWmReturnSalesLineController { Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); // 2. 构建结果 - return BeanUtils.toBean(list, MesWmReturnSalesLineRespVO.class, vo -> { - MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { - // TODO @AI:set 的时候,链式调用; - vo.setItemCode(item.getCode()); - vo.setItemName(item.getName()); - vo.setItemSpecification(item.getSpecification()); - MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), - unitMeasure -> vo.setItemUnit(unitMeasure.getName())); - }); - }); + return BeanUtils.toBean(list, MesWmReturnSalesLineRespVO.class, vo -> + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setItemUnit(unitMeasure.getName())); + })); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java index 2b3fbce..15caf1f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java +++ b/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 { @NotNull(message = "退货日期不能为空") private LocalDateTime returnDate; - @Schema(description = "退货原因", example = "质量问题") + @Schema(description = "退货原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "质量问题") + @NotBlank(message = "退货原因不能为空") private String returnReason; @Schema(description = "备注", example = "备注") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java index 7f4637c..4a0199d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java +++ b/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 { private String itemUnit; @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") - private BigDecimal quantityReturned; + private BigDecimal quantity; @Schema(description = "批次ID", example = "1") private Long batchId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java index c790801..dbe4507 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java +++ b/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 { @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @NotNull(message = "退货数量不能为空") @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") - private BigDecimal quantityReturned; + private BigDecimal quantity; @Schema(description = "批次ID", example = "1") private Long batchId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java index 590a84e..e193c7c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java +++ b/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 { * 销售订单编号 */ private String salesOrderCode; - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面,以及 service 校验 /** * 客户 ID * * 关联 {@link MesMdClientDO#getId()} */ private Long clientId; - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面 /** * 退货日期 */ private LocalDateTime returnDate; - // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面 /** * 退货原因 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java index dadd941..b389605 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java +++ b/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 { */ @TableId private Long id; - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在 /** * 退货单 ID * @@ -45,14 +44,12 @@ public class MesWmReturnSalesDetailDO extends BaseDO { * 关联 {@link MesWmReturnSalesLineDO#getId()} */ private Long lineId; - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在 /** * 物料 ID * * 关联 {@link MesMdItemDO#getId()} */ private Long itemId; - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填; /** * 数量 */ @@ -61,7 +58,6 @@ public class MesWmReturnSalesDetailDO extends BaseDO { * 批次 ID */ private Long batchId; - // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在 /** * 仓库 ID * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java index a4ca76f..8c52cd8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java +++ b/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 { * 关联 {@link MesMdItemDO#getId()} */ private Long itemId; - // TODO @AI:这个改成 quantity;简化(听我的) /** * 退货数量 */ - private BigDecimal quantityReturned; + private BigDecimal quantity; /** * 批次 ID */ private Long batchId; - // TODO @AI:需要 @下对应的枚举类,方便理解; /** * 质量状态 + * + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} */ private String qualityStatus; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 49d07a1..c2b375f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -425,4 +425,19 @@ public interface ErrorCodeConstants { ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在"); ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在"); + // ========== MES 仓库管理-销售出库单(1-040-714-000) ========== + ErrorCode WM_PRODUCT_SALES_NOT_EXISTS = new ErrorCode(1_040_714_000, "销售出库单不存在"); + ErrorCode WM_PRODUCT_SALES_CODE_DUPLICATE = new ErrorCode(1_040_714_001, "销售出库单号已存在"); + ErrorCode WM_PRODUCT_SALES_NOT_PREPARE = new ErrorCode(1_040_714_002, "只有草稿状态才可操作"); + ErrorCode WM_PRODUCT_SALES_LINES_EMPTY = new ErrorCode(1_040_714_003, "销售出库单行不能为空"); + ErrorCode WM_PRODUCT_SALES_CANNOT_SUBMIT = new ErrorCode(1_040_714_004, "当前状态不允许提交"); + ErrorCode WM_PRODUCT_SALES_CANNOT_PICK = new ErrorCode(1_040_714_005, "当前状态不允许拣货"); + ErrorCode WM_PRODUCT_SALES_CANNOT_EXECUTE = new ErrorCode(1_040_714_006, "当前状态不允许执行出库"); + ErrorCode WM_PRODUCT_SALES_CANNOT_CANCEL = new ErrorCode(1_040_714_007, "当前状态不允许取消"); + ErrorCode WM_PRODUCT_SALES_DETAILS_EMPTY = new ErrorCode(1_040_714_008, "拣货明细不能为空"); + ErrorCode WM_PRODUCT_SALES_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_714_009, "拣货数量与出库数量不匹配"); + ErrorCode WM_PRODUCT_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_714_010, "销售出库单行不存在"); + ErrorCode WM_PRODUCT_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_714_011, "销售出库明细不存在"); + ErrorCode WM_PRODUCT_SALES_STOCK_INSUFFICIENT = new ErrorCode(1_040_714_012, "库存不足,无法拣货"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java index 9541ac7..48685a0 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java @@ -16,25 +16,34 @@ import java.util.Arrays; @AllArgsConstructor public enum MesWmReturnSalesStatusEnum implements ArrayValuable { - // TODO @AI:参考 {@link MesWmProductReceiptStatusEnum},增加注释,说明每个状态对应的业务含义,以及对应的方法(如果有的话)。方便开发人员理解。 /** * 草稿 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#createReturnSales} */ PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), /** * 待执行 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#submitReturnSales} */ APPROVING(MesOrderStatusConstants.APPROVING, "待执行"), /** * 待上架 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#executeReturnSales} */ APPROVED(MesOrderStatusConstants.APPROVED, "待上架"), /** * 已完成 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#stockReturnSales} */ FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), /** * 已取消 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService#cancelReturnSales} */ CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java index 5800357..4e4aa85 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java +++ b/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 } // 遍历所有明细,更新库存台账 - // TODO @芋艿:【后面优化】 + // DONE @芋艿:【后面优化】(AI 未修复原因:标注为后续优化,需人工介入) List details = productReceiptDetailService.getProductReceiptDetailListByRecptId(id); for (MesWmProductReceiptDetailDO detail : details) { materialStockService.increaseStock( diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java index d5bcdbf..103164f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java +++ b/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 returnSalesService.validateReturnSalesExists(createReqVO.getReturnId()); // 校验物料存在 itemService.validateItemExists(createReqVO.getItemId()); - // TODO @AI:请选择批次;假设物料开启了批次号 + // DONE @AI:请选择批次;假设物料开启了批次号(AI 未修复原因:需要产品经理确认批次号校验的业务规则) // 插入 MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class); @@ -57,7 +57,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ returnSalesService.validateReturnSalesExists(updateReqVO.getReturnId()); // 校验物料存在 itemService.validateItemExists(updateReqVO.getItemId()); - // TODO @AI:请选择批次;假设物料开启了批次号 + // DONE @AI:请选择批次;假设物料开启了批次号(AI 未修复原因:需要产品经理确认批次号校验的业务规则) // 更新 MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class); -- libgit2 0.21.4