From d15470efb1a3952b0d9d7ec21391cdc302baab0c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 13 May 2026 00:42:29 +0800 Subject: [PATCH] feat(wms):修复只能删除作废的入库单的问题 --- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java | 1 + yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java | 22 ++++++++++++++++++++++ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java | 19 +++++++++---------- yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java | 28 ++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java create mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java index cbcc89d..cbcd7fb 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java @@ -55,6 +55,7 @@ public interface ErrorCodeConstants { ErrorCode RECEIPT_ORDER_STATUS_NOT_PREPARE = new ErrorCode(1_060_200_002, "入库单状态不是草稿,不能操作"); ErrorCode RECEIPT_ORDER_DETAIL_REQUIRED = new ErrorCode(1_060_200_003, "入库单至少包含一条明细"); ErrorCode RECEIPT_ORDER_AREA_REQUIRED = new ErrorCode(1_060_200_004, "库区模式下,入库单库区不能为空"); + ErrorCode RECEIPT_ORDER_STATUS_NOT_DELETABLE = new ErrorCode(1_060_200_005, "入库单状态不是草稿或已作废,不能删除"); ErrorCode RECEIPT_ORDER_DETAIL_NOT_EXISTS = new ErrorCode(1_060_200_007, "入库单明细不存在"); } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java new file mode 100644 index 0000000..065655b --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.wms.enums.order; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * WMS 单据状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum WmsOrderStatusEnum implements ArrayValuable { + + PREPARE(0, "草稿"), + FINISHED(4, "已完成"), + CANCELED(5, "已作废"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(WmsOrderStatusEnum::getStatus) + .toArray(Integer[]::new); + + /** + * 状态 + */ + private final Integer status; + /** + * 名称 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java new file mode 100644 index 0000000..4bd1604 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.wms.enums.order; + +/** + * WMS 单据类型常量 + * + * 集中管理业务类型枚举的编号,按业务域分段。 + * 各枚举类引用此处常量,避免硬编码数字。(也避免冲突!!!) + * + * @author 芋道源码 + */ +public final class WmsOrderTypeConstants { + + private WmsOrderTypeConstants() {} + + // ========== 入库单类型 [100, 200) ========== + + public static final int RECEIPT_PRODUCTION = 100; // 生产入库:WmsReceiptOrderDO + public static final int RECEIPT_PURCHASE = 101; // 采购入库:WmsReceiptOrderDO + public static final int RECEIPT_RETURN = 102; // 退货入库:WmsReceiptOrderDO + public static final int RECEIPT_GIVE_BACK = 103; // 归还入库:WmsReceiptOrderDO + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java index e1ad228..33e10af 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java @@ -78,8 +78,12 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { @Override @Transactional(rollbackFor = Exception.class) public void deleteReceiptOrder(Long id) { - // 1. 校验存在,且草稿 - validateReceiptOrderPrepare(id); + // 1. 校验存在,且可删除 + WmsReceiptOrderDO order = validateReceiptOrderExists(id); + if (ObjectUtil.notEqual(order.getStatus(), WmsOrderStatusEnum.PREPARE.getStatus()) + && ObjectUtil.notEqual(order.getStatus(), WmsOrderStatusEnum.CANCELED.getStatus())) { + throw exception(RECEIPT_ORDER_STATUS_NOT_DELETABLE); + } // 2.1 删除入库单 receiptOrderMapper.deleteById(id); @@ -130,7 +134,9 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { // 校验仓库存在 warehouseService.validateWarehouseExists(reqVO.getWarehouseId()); // 校验供应商类型 - validateReceiptOrderMerchant(reqVO.getMerchantId()); + if (reqVO.getMerchantId() != null) { + merchantService.validateSupplierMerchantExists(reqVO.getMerchantId()); + } } private void validateReceiptOrderNoUnique(Long id, String no) { @@ -165,13 +171,6 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { return order; } - private void validateReceiptOrderMerchant(Long merchantId) { - if (merchantId == null) { - return; - } - merchantService.validateSupplierMerchantExists(merchantId); - } - private void createInventory(WmsReceiptOrderDO order, List details) { List items = convertList(details, detail -> BeanUtils.toBean(detail, WmsInventoryChangeReqDTO.Item.class)); diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java index efb8afc..b00ca7c 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java @@ -26,8 +26,10 @@ import java.math.BigDecimal; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_AREA_REQUIRED; import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_DETAIL_REQUIRED; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_STATUS_NOT_DELETABLE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -124,6 +126,32 @@ public class WmsReceiptOrderServiceImplTest extends BaseDbUnitTest { verify(inventoryService, never()).changeInventory(any()); } + @Test + public void testDeleteReceiptOrder_canceled() { + // mock 数据 + WmsReceiptOrderDO order = createReceiptOrder(100L).setStatus(WmsOrderStatusEnum.CANCELED.getStatus()); + receiptOrderMapper.insert(order); + receiptOrderDetailMapper.insert(createReceiptOrderDetail(order.getId(), 200L, 100L, 300L)); + + // 调用 + receiptOrderService.deleteReceiptOrder(order.getId()); + + // 断言 + assertNull(receiptOrderMapper.selectById(order.getId())); + assertEquals(0, receiptOrderDetailMapper.selectListByOrderId(order.getId()).size()); + } + + @Test + public void testDeleteReceiptOrder_finished() { + // mock 数据 + WmsReceiptOrderDO order = createReceiptOrder(100L).setStatus(WmsOrderStatusEnum.FINISHED.getStatus()); + receiptOrderMapper.insert(order); + + // 调用,并断言 + assertServiceException(() -> receiptOrderService.deleteReceiptOrder(order.getId()), + RECEIPT_ORDER_STATUS_NOT_DELETABLE); + } + private static WmsReceiptOrderDO createReceiptOrder(Long warehouseId) { return new WmsReceiptOrderDO() .setNo("RK202605120001") -- libgit2 0.21.4