Commit d15470efb1a3952b0d9d7ec21391cdc302baab0c

Authored by YunaiV
1 parent 076de400

feat(wms):修复只能删除作废的入库单的问题

yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java
... ... @@ -55,6 +55,7 @@ public interface ErrorCodeConstants {
55 55 ErrorCode RECEIPT_ORDER_STATUS_NOT_PREPARE = new ErrorCode(1_060_200_002, "入库单状态不是草稿,不能操作");
56 56 ErrorCode RECEIPT_ORDER_DETAIL_REQUIRED = new ErrorCode(1_060_200_003, "入库单至少包含一条明细");
57 57 ErrorCode RECEIPT_ORDER_AREA_REQUIRED = new ErrorCode(1_060_200_004, "库区模式下,入库单库区不能为空");
  58 + ErrorCode RECEIPT_ORDER_STATUS_NOT_DELETABLE = new ErrorCode(1_060_200_005, "入库单状态不是草稿或已作废,不能删除");
58 59 ErrorCode RECEIPT_ORDER_DETAIL_NOT_EXISTS = new ErrorCode(1_060_200_007, "入库单明细不存在");
59 60  
60 61 }
... ...
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.wms.enums.order;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * WMS 单据状态枚举
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +public enum WmsOrderStatusEnum implements ArrayValuable<Integer> {
  17 +
  18 + PREPARE(0, "草稿"),
  19 + FINISHED(4, "已完成"),
  20 + CANCELED(5, "已作废");
  21 +
  22 + public static final Integer[] ARRAYS = Arrays.stream(values()).map(WmsOrderStatusEnum::getStatus)
  23 + .toArray(Integer[]::new);
  24 +
  25 + /**
  26 + * 状态
  27 + */
  28 + private final Integer status;
  29 + /**
  30 + * 名称
  31 + */
  32 + private final String name;
  33 +
  34 + @Override
  35 + public Integer[] array() {
  36 + return ARRAYS;
  37 + }
  38 +
  39 +}
... ...
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.module.wms.enums.order;
  2 +
  3 +/**
  4 + * WMS 单据类型常量
  5 + *
  6 + * 集中管理业务类型枚举的编号,按业务域分段。
  7 + * 各枚举类引用此处常量,避免硬编码数字。(也避免冲突!!!)
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +public final class WmsOrderTypeConstants {
  12 +
  13 + private WmsOrderTypeConstants() {}
  14 +
  15 + // ========== 入库单类型 [100, 200) ==========
  16 +
  17 + public static final int RECEIPT_PRODUCTION = 100; // 生产入库:WmsReceiptOrderDO
  18 + public static final int RECEIPT_PURCHASE = 101; // 采购入库:WmsReceiptOrderDO
  19 + public static final int RECEIPT_RETURN = 102; // 退货入库:WmsReceiptOrderDO
  20 + public static final int RECEIPT_GIVE_BACK = 103; // 归还入库:WmsReceiptOrderDO
  21 +
  22 +}
... ...
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 {
78 78 @Override
79 79 @Transactional(rollbackFor = Exception.class)
80 80 public void deleteReceiptOrder(Long id) {
81   - // 1. 校验存在,且草稿
82   - validateReceiptOrderPrepare(id);
  81 + // 1. 校验存在,且可删除
  82 + WmsReceiptOrderDO order = validateReceiptOrderExists(id);
  83 + if (ObjectUtil.notEqual(order.getStatus(), WmsOrderStatusEnum.PREPARE.getStatus())
  84 + && ObjectUtil.notEqual(order.getStatus(), WmsOrderStatusEnum.CANCELED.getStatus())) {
  85 + throw exception(RECEIPT_ORDER_STATUS_NOT_DELETABLE);
  86 + }
83 87  
84 88 // 2.1 删除入库单
85 89 receiptOrderMapper.deleteById(id);
... ... @@ -130,7 +134,9 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService {
130 134 // 校验仓库存在
131 135 warehouseService.validateWarehouseExists(reqVO.getWarehouseId());
132 136 // 校验供应商类型
133   - validateReceiptOrderMerchant(reqVO.getMerchantId());
  137 + if (reqVO.getMerchantId() != null) {
  138 + merchantService.validateSupplierMerchantExists(reqVO.getMerchantId());
  139 + }
134 140 }
135 141  
136 142 private void validateReceiptOrderNoUnique(Long id, String no) {
... ... @@ -165,13 +171,6 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService {
165 171 return order;
166 172 }
167 173  
168   - private void validateReceiptOrderMerchant(Long merchantId) {
169   - if (merchantId == null) {
170   - return;
171   - }
172   - merchantService.validateSupplierMerchantExists(merchantId);
173   - }
174   -
175 174 private void createInventory(WmsReceiptOrderDO order, List<WmsReceiptOrderDetailDO> details) {
176 175 List<WmsInventoryChangeReqDTO.Item> items = convertList(details,
177 176 detail -> BeanUtils.toBean(detail, WmsInventoryChangeReqDTO.Item.class));
... ...
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java
... ... @@ -26,8 +26,10 @@ import java.math.BigDecimal;
26 26 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
27 27 import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_AREA_REQUIRED;
28 28 import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_DETAIL_REQUIRED;
  29 +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_STATUS_NOT_DELETABLE;
29 30 import static org.junit.jupiter.api.Assertions.assertEquals;
30 31 import static org.junit.jupiter.api.Assertions.assertNotNull;
  32 +import static org.junit.jupiter.api.Assertions.assertNull;
31 33 import static org.mockito.ArgumentMatchers.any;
32 34 import static org.mockito.Mockito.never;
33 35 import static org.mockito.Mockito.verify;
... ... @@ -124,6 +126,32 @@ public class WmsReceiptOrderServiceImplTest extends BaseDbUnitTest {
124 126 verify(inventoryService, never()).changeInventory(any());
125 127 }
126 128  
  129 + @Test
  130 + public void testDeleteReceiptOrder_canceled() {
  131 + // mock 数据
  132 + WmsReceiptOrderDO order = createReceiptOrder(100L).setStatus(WmsOrderStatusEnum.CANCELED.getStatus());
  133 + receiptOrderMapper.insert(order);
  134 + receiptOrderDetailMapper.insert(createReceiptOrderDetail(order.getId(), 200L, 100L, 300L));
  135 +
  136 + // 调用
  137 + receiptOrderService.deleteReceiptOrder(order.getId());
  138 +
  139 + // 断言
  140 + assertNull(receiptOrderMapper.selectById(order.getId()));
  141 + assertEquals(0, receiptOrderDetailMapper.selectListByOrderId(order.getId()).size());
  142 + }
  143 +
  144 + @Test
  145 + public void testDeleteReceiptOrder_finished() {
  146 + // mock 数据
  147 + WmsReceiptOrderDO order = createReceiptOrder(100L).setStatus(WmsOrderStatusEnum.FINISHED.getStatus());
  148 + receiptOrderMapper.insert(order);
  149 +
  150 + // 调用,并断言
  151 + assertServiceException(() -> receiptOrderService.deleteReceiptOrder(order.getId()),
  152 + RECEIPT_ORDER_STATUS_NOT_DELETABLE);
  153 + }
  154 +
127 155 private static WmsReceiptOrderDO createReceiptOrder(Long warehouseId) {
128 156 return new WmsReceiptOrderDO()
129 157 .setNo("RK202605120001")
... ...