Commit 8ac5704591f0fd6f6830c8ccbf4f935f5b09e6ac
1 parent
383e265e
✨ feat(mes): 增强退货单功能,新增行数据校验与删除逻辑
- 新增退货数量字段的校验,确保其大于 0 - 增加根据行 ID 删除明细的功能 - 新增退货单编码的定义 - 增强退货单状态校验,确保状态为草稿才能进行删除操作
Showing
10 changed files
with
119 additions
and
27 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/detail/MesWmReturnVendorDetailSaveReqVO.java
| 1 | package cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail; | 1 | package cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail; |
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | +import jakarta.validation.constraints.DecimalMin; | ||
| 4 | import jakarta.validation.constraints.NotNull; | 5 | import jakarta.validation.constraints.NotNull; |
| 5 | import lombok.Data; | 6 | import lombok.Data; |
| 6 | 7 | ||
| @@ -27,6 +28,7 @@ public class MesWmReturnVendorDetailSaveReqVO { | @@ -27,6 +28,7 @@ public class MesWmReturnVendorDetailSaveReqVO { | ||
| 27 | 28 | ||
| 28 | @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") | 29 | @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") |
| 29 | @NotNull(message = "退货数量不能为空") | 30 | @NotNull(message = "退货数量不能为空") |
| 31 | + @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") | ||
| 30 | private BigDecimal quantity; | 32 | private BigDecimal quantity; |
| 31 | 33 | ||
| 32 | @Schema(description = "批次编号", example = "1") | 34 | @Schema(description = "批次编号", example = "1") |
| @@ -48,3 +50,4 @@ public class MesWmReturnVendorDetailSaveReqVO { | @@ -48,3 +50,4 @@ public class MesWmReturnVendorDetailSaveReqVO { | ||
| 48 | private String remark; | 50 | private String remark; |
| 49 | 51 | ||
| 50 | } | 52 | } |
| 53 | + |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorDetailMapper.java
| @@ -24,4 +24,8 @@ public interface MesWmReturnVendorDetailMapper extends BaseMapperX<MesWmReturnVe | @@ -24,4 +24,8 @@ public interface MesWmReturnVendorDetailMapper extends BaseMapperX<MesWmReturnVe | ||
| 24 | delete(MesWmReturnVendorDetailDO::getReturnId, returnId); | 24 | delete(MesWmReturnVendorDetailDO::getReturnId, returnId); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | + default void deleteByLineId(Long lineId) { | ||
| 28 | + delete(MesWmReturnVendorDetailDO::getLineId, lineId); | ||
| 29 | + } | ||
| 30 | + | ||
| 27 | } | 31 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java
| @@ -26,4 +26,8 @@ public interface MesWmReturnVendorMapper extends BaseMapperX<MesWmReturnVendorDO | @@ -26,4 +26,8 @@ public interface MesWmReturnVendorMapper extends BaseMapperX<MesWmReturnVendorDO | ||
| 26 | return selectCount(MesWmReturnVendorDO::getVendorId, vendorId); | 26 | return selectCount(MesWmReturnVendorDO::getVendorId, vendorId); |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | + default MesWmReturnVendorDO selectByCode(String code) { | ||
| 30 | + return selectOne(MesWmReturnVendorDO::getCode, code); | ||
| 31 | + } | ||
| 32 | + | ||
| 29 | } | 33 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
| @@ -473,8 +473,12 @@ public interface ErrorCodeConstants { | @@ -473,8 +473,12 @@ public interface ErrorCodeConstants { | ||
| 473 | ErrorCode WM_RETURN_VENDOR_NO_LINE = new ErrorCode(1_040_711_002, "供应商退货单至少需要一条行数据"); | 473 | ErrorCode WM_RETURN_VENDOR_NO_LINE = new ErrorCode(1_040_711_002, "供应商退货单至少需要一条行数据"); |
| 474 | ErrorCode WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_711_003, "供应商退货单行数量与明细数量不一致"); | 474 | ErrorCode WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_711_003, "供应商退货单行数量与明细数量不一致"); |
| 475 | ErrorCode WM_RETURN_VENDOR_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_711_004, "供应商退货单已完成或已取消,无法取消"); | 475 | ErrorCode WM_RETURN_VENDOR_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_711_004, "供应商退货单已完成或已取消,无法取消"); |
| 476 | + ErrorCode WM_RETURN_VENDOR_CODE_DUPLICATE = new ErrorCode(1_040_711_005, "供应商退货单编号已存在"); | ||
| 477 | + ErrorCode WM_RETURN_VENDOR_NO_DETAIL = new ErrorCode(1_040_711_006, "供应商退货单没有拣货明细,无法执行退货"); | ||
| 478 | + ErrorCode WM_RETURN_VENDOR_DETAIL_ITEM_MISMATCH = new ErrorCode(1_040_711_007, "拣货明细的物料与退货单行的物料不一致"); | ||
| 476 | ErrorCode WM_RETURN_VENDOR_LINE_NOT_EXISTS = new ErrorCode(1_040_711_100, "供应商退货单行不存在"); | 479 | ErrorCode WM_RETURN_VENDOR_LINE_NOT_EXISTS = new ErrorCode(1_040_711_100, "供应商退货单行不存在"); |
| 477 | ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "供应商退货单明细不存在"); | 480 | ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "供应商退货单明细不存在"); |
| 481 | + ErrorCode WM_RETURN_VENDOR_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_711_201, "退货明细数量必须大于 0"); | ||
| 478 | 482 | ||
| 479 | // ========== MES 仓库管理-产品收货单(1-040-712-000) ========== | 483 | // ========== MES 仓库管理-产品收货单(1-040-712-000) ========== |
| 480 | ErrorCode WM_PRODUCT_RECPT_NOT_EXISTS = new ErrorCode(1_040_712_000, "产品收货单不存在"); | 484 | ErrorCode WM_PRODUCT_RECPT_NOT_EXISTS = new ErrorCode(1_040_712_000, "产品收货单不存在"); |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
| @@ -19,6 +19,7 @@ public enum MesMdAutoCodeRuleCodeEnum { | @@ -19,6 +19,7 @@ public enum MesMdAutoCodeRuleCodeEnum { | ||
| 19 | TM_TOOL_TYPE_CODE("TM_TOOL_TYPE_CODE", "工具类型编码"), | 19 | TM_TOOL_TYPE_CODE("TM_TOOL_TYPE_CODE", "工具类型编码"), |
| 20 | WM_ARRIVAL_NOTICE_CODE("WM_ARRIVAL_NOTICE_CODE", "到货通知单编码"), | 20 | WM_ARRIVAL_NOTICE_CODE("WM_ARRIVAL_NOTICE_CODE", "到货通知单编码"), |
| 21 | WM_ITEM_RECEIPT_CODE("WM_ITEM_RECEIPT_CODE", "采购入库单编码"), | 21 | WM_ITEM_RECEIPT_CODE("WM_ITEM_RECEIPT_CODE", "采购入库单编码"), |
| 22 | + WM_RETURN_VENDOR_CODE("WM_RETURN_VENDOR_CODE", "采购退货单编码"), | ||
| 22 | WM_SN_CODE("WM_SN_CODE", "SN 码"), | 23 | WM_SN_CODE("WM_SN_CODE", "SN 码"), |
| 23 | WM_PACKAGE_CODE("WM_PACKAGE_CODE", "装箱单编码"), | 24 | WM_PACKAGE_CODE("WM_PACKAGE_CODE", "装箱单编码"), |
| 24 | WM_BATCH_CODE("WM_BATCH_CODE", "批次编码"), | 25 | WM_BATCH_CODE("WM_BATCH_CODE", "批次编码"), |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailService.java
| @@ -64,4 +64,11 @@ public interface MesWmReturnVendorDetailService { | @@ -64,4 +64,11 @@ public interface MesWmReturnVendorDetailService { | ||
| 64 | */ | 64 | */ |
| 65 | void deleteReturnVendorDetailByReturnId(Long returnId); | 65 | void deleteReturnVendorDetailByReturnId(Long returnId); |
| 66 | 66 | ||
| 67 | + /** | ||
| 68 | + * 根据行ID删除明细 | ||
| 69 | + * | ||
| 70 | + * @param lineId 行ID | ||
| 71 | + */ | ||
| 72 | + void deleteReturnVendorDetailByLineId(Long lineId); | ||
| 73 | + | ||
| 67 | } | 74 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java
| 1 | package cn.iocoder.yudao.module.mes.service.wm.returnvendor; | 1 | package cn.iocoder.yudao.module.mes.service.wm.returnvendor; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.ObjUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 4 | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO; | 5 | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO; |
| 5 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; | 6 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; |
| 7 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; | ||
| 6 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorDetailMapper; | 8 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorDetailMapper; |
| 7 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | 9 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| 8 | import jakarta.annotation.Resource; | 10 | import jakarta.annotation.Resource; |
| @@ -13,6 +15,7 @@ import org.springframework.validation.annotation.Validated; | @@ -13,6 +15,7 @@ import org.springframework.validation.annotation.Validated; | ||
| 13 | import java.util.List; | 15 | import java.util.List; |
| 14 | 16 | ||
| 15 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 17 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 18 | +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_DETAIL_ITEM_MISMATCH; | ||
| 16 | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_DETAIL_NOT_EXISTS; | 19 | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_DETAIL_NOT_EXISTS; |
| 17 | 20 | ||
| 18 | /** | 21 | /** |
| @@ -35,9 +38,11 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta | @@ -35,9 +38,11 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta | ||
| 35 | @Override | 38 | @Override |
| 36 | public Long createReturnVendorDetail(MesWmReturnVendorDetailSaveReqVO createReqVO) { | 39 | public Long createReturnVendorDetail(MesWmReturnVendorDetailSaveReqVO createReqVO) { |
| 37 | // 校验父数据存在 | 40 | // 校验父数据存在 |
| 38 | - returnVendorLineService.validateReturnVendorLineExists(createReqVO.getLineId()); | 41 | + MesWmReturnVendorLineDO line = returnVendorLineService.validateReturnVendorLineExists(createReqVO.getLineId()); |
| 39 | // 校验物料存在 | 42 | // 校验物料存在 |
| 40 | itemService.validateItemExists(createReqVO.getItemId()); | 43 | itemService.validateItemExists(createReqVO.getItemId()); |
| 44 | + // 校验物料与行物料一致 | ||
| 45 | + validateItemConsistency(createReqVO.getItemId(), line); | ||
| 41 | 46 | ||
| 42 | // 插入 | 47 | // 插入 |
| 43 | MesWmReturnVendorDetailDO detail = BeanUtils.toBean(createReqVO, MesWmReturnVendorDetailDO.class); | 48 | MesWmReturnVendorDetailDO detail = BeanUtils.toBean(createReqVO, MesWmReturnVendorDetailDO.class); |
| @@ -50,9 +55,11 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta | @@ -50,9 +55,11 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta | ||
| 50 | // 校验存在 | 55 | // 校验存在 |
| 51 | validateReturnVendorDetailExists(updateReqVO.getId()); | 56 | validateReturnVendorDetailExists(updateReqVO.getId()); |
| 52 | // 校验父数据存在 | 57 | // 校验父数据存在 |
| 53 | - returnVendorLineService.validateReturnVendorLineExists(updateReqVO.getLineId()); | 58 | + MesWmReturnVendorLineDO line = returnVendorLineService.validateReturnVendorLineExists(updateReqVO.getLineId()); |
| 54 | // 校验物料存在 | 59 | // 校验物料存在 |
| 55 | itemService.validateItemExists(updateReqVO.getItemId()); | 60 | itemService.validateItemExists(updateReqVO.getItemId()); |
| 61 | + // 校验物料与行物料一致 | ||
| 62 | + validateItemConsistency(updateReqVO.getItemId(), line); | ||
| 56 | 63 | ||
| 57 | // 更新 | 64 | // 更新 |
| 58 | MesWmReturnVendorDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDetailDO.class); | 65 | MesWmReturnVendorDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDetailDO.class); |
| @@ -87,10 +94,24 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta | @@ -87,10 +94,24 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta | ||
| 87 | returnVendorDetailMapper.deleteByReturnId(returnId); | 94 | returnVendorDetailMapper.deleteByReturnId(returnId); |
| 88 | } | 95 | } |
| 89 | 96 | ||
| 97 | + @Override | ||
| 98 | + public void deleteReturnVendorDetailByLineId(Long lineId) { | ||
| 99 | + returnVendorDetailMapper.deleteByLineId(lineId); | ||
| 100 | + } | ||
| 101 | + | ||
| 90 | private void validateReturnVendorDetailExists(Long id) { | 102 | private void validateReturnVendorDetailExists(Long id) { |
| 91 | if (returnVendorDetailMapper.selectById(id) == null) { | 103 | if (returnVendorDetailMapper.selectById(id) == null) { |
| 92 | throw exception(WM_RETURN_VENDOR_DETAIL_NOT_EXISTS); | 104 | throw exception(WM_RETURN_VENDOR_DETAIL_NOT_EXISTS); |
| 93 | } | 105 | } |
| 94 | } | 106 | } |
| 95 | 107 | ||
| 108 | + /** | ||
| 109 | + * 校验明细物料与行物料一致 | ||
| 110 | + */ | ||
| 111 | + private void validateItemConsistency(Long detailItemId, MesWmReturnVendorLineDO line) { | ||
| 112 | + if (ObjUtil.notEqual(detailItemId, line.getItemId())) { | ||
| 113 | + throw exception(WM_RETURN_VENDOR_DETAIL_ITEM_MISMATCH); | ||
| 114 | + } | ||
| 115 | + } | ||
| 116 | + | ||
| 96 | } | 117 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
| @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | ||
| 10 | import jakarta.annotation.Resource; | 10 | import jakarta.annotation.Resource; |
| 11 | import org.springframework.context.annotation.Lazy; | 11 | import org.springframework.context.annotation.Lazy; |
| 12 | import org.springframework.stereotype.Service; | 12 | import org.springframework.stereotype.Service; |
| 13 | +import org.springframework.transaction.annotation.Transactional; | ||
| 13 | import org.springframework.validation.annotation.Validated; | 14 | import org.springframework.validation.annotation.Validated; |
| 14 | 15 | ||
| 15 | import java.util.List; | 16 | import java.util.List; |
| @@ -31,14 +32,15 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | @@ -31,14 +32,15 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | ||
| 31 | @Lazy | 32 | @Lazy |
| 32 | private MesWmReturnVendorService returnVendorService; | 33 | private MesWmReturnVendorService returnVendorService; |
| 33 | @Resource | 34 | @Resource |
| 35 | + @Lazy | ||
| 36 | + private MesWmReturnVendorDetailService returnVendorDetailService; | ||
| 37 | + @Resource | ||
| 34 | private MesMdItemService itemService; | 38 | private MesMdItemService itemService; |
| 35 | 39 | ||
| 36 | @Override | 40 | @Override |
| 37 | public Long createReturnVendorLine(MesWmReturnVendorLineSaveReqVO createReqVO) { | 41 | public Long createReturnVendorLine(MesWmReturnVendorLineSaveReqVO createReqVO) { |
| 38 | - // 校验父数据存在 | ||
| 39 | - returnVendorService.validateReturnVendorExists(createReqVO.getReturnId()); | ||
| 40 | - // 校验物料存在 | ||
| 41 | - itemService.validateItemExists(createReqVO.getItemId()); | 42 | + // 校验数据 |
| 43 | + validateReturnVendorLineSaveData(createReqVO); | ||
| 42 | 44 | ||
| 43 | // 插入 | 45 | // 插入 |
| 44 | MesWmReturnVendorLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnVendorLineDO.class); | 46 | MesWmReturnVendorLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnVendorLineDO.class); |
| @@ -50,10 +52,8 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | @@ -50,10 +52,8 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | ||
| 50 | public void updateReturnVendorLine(MesWmReturnVendorLineSaveReqVO updateReqVO) { | 52 | public void updateReturnVendorLine(MesWmReturnVendorLineSaveReqVO updateReqVO) { |
| 51 | // 校验存在 | 53 | // 校验存在 |
| 52 | validateReturnVendorLineExists(updateReqVO.getId()); | 54 | validateReturnVendorLineExists(updateReqVO.getId()); |
| 53 | - // 校验父数据存在 | ||
| 54 | - returnVendorService.validateReturnVendorExists(updateReqVO.getReturnId()); | ||
| 55 | - // 校验物料存在 | ||
| 56 | - itemService.validateItemExists(updateReqVO.getItemId()); | 55 | + // 校验数据 |
| 56 | + validateReturnVendorLineSaveData(updateReqVO); | ||
| 57 | 57 | ||
| 58 | // 更新 | 58 | // 更新 |
| 59 | MesWmReturnVendorLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorLineDO.class); | 59 | MesWmReturnVendorLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorLineDO.class); |
| @@ -61,10 +61,16 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | @@ -61,10 +61,16 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | ||
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | @Override | 63 | @Override |
| 64 | + @Transactional(rollbackFor = Exception.class) | ||
| 64 | public void deleteReturnVendorLine(Long id) { | 65 | public void deleteReturnVendorLine(Long id) { |
| 65 | - // 校验存在 | ||
| 66 | - validateReturnVendorLineExists(id); | ||
| 67 | - // 删除 | 66 | + // 1.1 校验存在 |
| 67 | + MesWmReturnVendorLineDO line = validateReturnVendorLineExists(id); | ||
| 68 | + // 1.2 校验父数据为草稿状态 | ||
| 69 | + returnVendorService.validateReturnVendorExistsAndPrepare(line.getReturnId()); | ||
| 70 | + | ||
| 71 | + // 2.1 级联删除该行下的明细 | ||
| 72 | + returnVendorDetailService.deleteReturnVendorDetailByLineId(id); | ||
| 73 | + // 2.2 删除行 | ||
| 68 | returnVendorLineMapper.deleteById(id); | 74 | returnVendorLineMapper.deleteById(id); |
| 69 | } | 75 | } |
| 70 | 76 | ||
| @@ -97,4 +103,11 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | @@ -97,4 +103,11 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe | ||
| 97 | return line; | 103 | return line; |
| 98 | } | 104 | } |
| 99 | 105 | ||
| 106 | + private void validateReturnVendorLineSaveData(MesWmReturnVendorLineSaveReqVO reqVO) { | ||
| 107 | + // 校验父数据存在且为草稿状态 | ||
| 108 | + returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId()); | ||
| 109 | + // 校验物料存在 | ||
| 110 | + itemService.validateItemExists(reqVO.getItemId()); | ||
| 111 | + } | ||
| 112 | + | ||
| 100 | } | 113 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java
| @@ -101,4 +101,12 @@ public interface MesWmReturnVendorService { | @@ -101,4 +101,12 @@ public interface MesWmReturnVendorService { | ||
| 101 | */ | 101 | */ |
| 102 | Long getReturnVendorCountByVendorId(Long vendorId); | 102 | Long getReturnVendorCountByVendorId(Long vendorId); |
| 103 | 103 | ||
| 104 | + /** | ||
| 105 | + * 校验供应商退货单存在且为草稿状态 | ||
| 106 | + * | ||
| 107 | + * @param id 编号 | ||
| 108 | + * @return 供应商退货单 | ||
| 109 | + */ | ||
| 110 | + MesWmReturnVendorDO validateReturnVendorExistsAndPrepare(Long id); | ||
| 111 | + | ||
| 104 | } | 112 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
| @@ -52,8 +52,8 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | @@ -52,8 +52,8 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | ||
| 52 | @Override | 52 | @Override |
| 53 | @Transactional(rollbackFor = Exception.class) | 53 | @Transactional(rollbackFor = Exception.class) |
| 54 | public Long createReturnVendor(MesWmReturnVendorSaveReqVO createReqVO) { | 54 | public Long createReturnVendor(MesWmReturnVendorSaveReqVO createReqVO) { |
| 55 | - // 1. 校验关联数据 | ||
| 56 | - vendorService.validateVendorExists(createReqVO.getVendorId()); | 55 | + // 1. 校验数据 |
| 56 | + validateReturnVendorSaveData(createReqVO); | ||
| 57 | 57 | ||
| 58 | // 2. 插入主表 | 58 | // 2. 插入主表 |
| 59 | MesWmReturnVendorDO returnVendor = BeanUtils.toBean(createReqVO, MesWmReturnVendorDO.class); | 59 | MesWmReturnVendorDO returnVendor = BeanUtils.toBean(createReqVO, MesWmReturnVendorDO.class); |
| @@ -65,10 +65,8 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | @@ -65,10 +65,8 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | ||
| 65 | @Override | 65 | @Override |
| 66 | @Transactional(rollbackFor = Exception.class) | 66 | @Transactional(rollbackFor = Exception.class) |
| 67 | public void updateReturnVendor(MesWmReturnVendorSaveReqVO updateReqVO) { | 67 | public void updateReturnVendor(MesWmReturnVendorSaveReqVO updateReqVO) { |
| 68 | - // 1.1 校验存在 + 准备中状态 | ||
| 69 | - validateReturnVendorExistsAndPrepare(updateReqVO.getId()); | ||
| 70 | - // 1.2 校验关联数据 | ||
| 71 | - vendorService.validateVendorExists(updateReqVO.getVendorId()); | 68 | + // 1. 校验数据 |
| 69 | + validateReturnVendorSaveData(updateReqVO); | ||
| 72 | 70 | ||
| 73 | // 2. 更新主表 | 71 | // 2. 更新主表 |
| 74 | MesWmReturnVendorDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDO.class); | 72 | MesWmReturnVendorDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDO.class); |
| @@ -131,22 +129,26 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | @@ -131,22 +129,26 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | ||
| 131 | @Override | 129 | @Override |
| 132 | @Transactional(rollbackFor = Exception.class) | 130 | @Transactional(rollbackFor = Exception.class) |
| 133 | public void finishReturnVendor(Long id) { | 131 | public void finishReturnVendor(Long id) { |
| 134 | - // 1. 校验存在 | 132 | + // 1.1 校验存在 |
| 135 | MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); | 133 | MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); |
| 136 | if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.APPROVED.getStatus(), returnVendor.getStatus())) { | 134 | if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.APPROVED.getStatus(), returnVendor.getStatus())) { |
| 137 | throw exception(WM_RETURN_VENDOR_STATUS_INVALID); | 135 | throw exception(WM_RETURN_VENDOR_STATUS_INVALID); |
| 138 | } | 136 | } |
| 137 | + // 1.2 校验明细不为空 | ||
| 138 | + List<MesWmReturnVendorDetailDO> details = returnVendorDetailService.getReturnVendorDetailListByReturnId(id); | ||
| 139 | + if (CollUtil.isEmpty(details)) { | ||
| 140 | + throw exception(WM_RETURN_VENDOR_NO_DETAIL); | ||
| 141 | + } | ||
| 139 | 142 | ||
| 140 | // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) | 143 | // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) |
| 141 | - createTransactionList(returnVendor); | 144 | + createTransactionList(returnVendor, details); |
| 142 | 145 | ||
| 143 | // 3. 更新退货单状态 | 146 | // 3. 更新退货单状态 |
| 144 | returnVendorMapper.updateById(new MesWmReturnVendorDO() | 147 | returnVendorMapper.updateById(new MesWmReturnVendorDO() |
| 145 | .setId(id).setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus())); | 148 | .setId(id).setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus())); |
| 146 | } | 149 | } |
| 147 | 150 | ||
| 148 | - private void createTransactionList(MesWmReturnVendorDO returnVendor) { | ||
| 149 | - List<MesWmReturnVendorDetailDO> details = returnVendorDetailService.getReturnVendorDetailListByReturnId(returnVendor.getId()); | 151 | + private void createTransactionList(MesWmReturnVendorDO returnVendor, List<MesWmReturnVendorDetailDO> details) { |
| 150 | wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() | 152 | wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() |
| 151 | .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) | 153 | .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) |
| 152 | .setQuantity(detail.getQuantity().negate()) // 出库数量为负数 | 154 | .setQuantity(detail.getQuantity().negate()) // 出库数量为负数 |
| @@ -197,10 +199,8 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | @@ -197,10 +199,8 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | ||
| 197 | return returnVendor; | 199 | return returnVendor; |
| 198 | } | 200 | } |
| 199 | 201 | ||
| 200 | - /** | ||
| 201 | - * 校验供应商退货单存在且为准备中状态 | ||
| 202 | - */ | ||
| 203 | - private MesWmReturnVendorDO validateReturnVendorExistsAndPrepare(Long id) { | 202 | + @Override |
| 203 | + public MesWmReturnVendorDO validateReturnVendorExistsAndPrepare(Long id) { | ||
| 204 | MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); | 204 | MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); |
| 205 | if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.PREPARE.getStatus(), returnVendor.getStatus())) { | 205 | if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.PREPARE.getStatus(), returnVendor.getStatus())) { |
| 206 | throw exception(WM_RETURN_VENDOR_STATUS_INVALID); | 206 | throw exception(WM_RETURN_VENDOR_STATUS_INVALID); |
| @@ -208,6 +208,33 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | @@ -208,6 +208,33 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { | ||
| 208 | return returnVendor; | 208 | return returnVendor; |
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | + /** | ||
| 212 | + * 校验退货单创建/修改的公共数据 | ||
| 213 | + */ | ||
| 214 | + private void validateReturnVendorSaveData(MesWmReturnVendorSaveReqVO reqVO) { | ||
| 215 | + // 校验存在 + 草稿状态(仅修改时) | ||
| 216 | + if (reqVO.getId() != null) { | ||
| 217 | + validateReturnVendorExistsAndPrepare(reqVO.getId()); | ||
| 218 | + } | ||
| 219 | + // 校验供应商存在 | ||
| 220 | + vendorService.validateVendorExists(reqVO.getVendorId()); | ||
| 221 | + // 校验编码唯一 | ||
| 222 | + validateCodeUnique(reqVO.getId(), reqVO.getCode()); | ||
| 223 | + } | ||
| 224 | + | ||
| 225 | + /** | ||
| 226 | + * 校验退货单编号唯一 | ||
| 227 | + */ | ||
| 228 | + private void validateCodeUnique(Long id, String code) { | ||
| 229 | + MesWmReturnVendorDO existing = returnVendorMapper.selectByCode(code); | ||
| 230 | + if (existing == null) { | ||
| 231 | + return; | ||
| 232 | + } | ||
| 233 | + if (ObjUtil.notEqual(id, existing.getId())) { | ||
| 234 | + throw exception(WM_RETURN_VENDOR_CODE_DUPLICATE); | ||
| 235 | + } | ||
| 236 | + } | ||
| 237 | + | ||
| 211 | @Override | 238 | @Override |
| 212 | public Long getReturnVendorCountByVendorId(Long vendorId) { | 239 | public Long getReturnVendorCountByVendorId(Long vendorId) { |
| 213 | return returnVendorMapper.selectCountByVendorId(vendorId); | 240 | return returnVendorMapper.selectCountByVendorId(vendorId); |