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,6 +55,7 @@ public interface ErrorCodeConstants {
55 ErrorCode RECEIPT_ORDER_STATUS_NOT_PREPARE = new ErrorCode(1_060_200_002, "入库单状态不是草稿,不能操作"); 55 ErrorCode RECEIPT_ORDER_STATUS_NOT_PREPARE = new ErrorCode(1_060_200_002, "入库单状态不是草稿,不能操作");
56 ErrorCode RECEIPT_ORDER_DETAIL_REQUIRED = new ErrorCode(1_060_200_003, "入库单至少包含一条明细"); 56 ErrorCode RECEIPT_ORDER_DETAIL_REQUIRED = new ErrorCode(1_060_200_003, "入库单至少包含一条明细");
57 ErrorCode RECEIPT_ORDER_AREA_REQUIRED = new ErrorCode(1_060_200_004, "库区模式下,入库单库区不能为空"); 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 ErrorCode RECEIPT_ORDER_DETAIL_NOT_EXISTS = new ErrorCode(1_060_200_007, "入库单明细不存在"); 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,8 +78,12 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService {
78 @Override 78 @Override
79 @Transactional(rollbackFor = Exception.class) 79 @Transactional(rollbackFor = Exception.class)
80 public void deleteReceiptOrder(Long id) { 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 // 2.1 删除入库单 88 // 2.1 删除入库单
85 receiptOrderMapper.deleteById(id); 89 receiptOrderMapper.deleteById(id);
@@ -130,7 +134,9 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { @@ -130,7 +134,9 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService {
130 // 校验仓库存在 134 // 校验仓库存在
131 warehouseService.validateWarehouseExists(reqVO.getWarehouseId()); 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 private void validateReceiptOrderNoUnique(Long id, String no) { 142 private void validateReceiptOrderNoUnique(Long id, String no) {
@@ -165,13 +171,6 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { @@ -165,13 +171,6 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService {
165 return order; 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 private void createInventory(WmsReceiptOrderDO order, List<WmsReceiptOrderDetailDO> details) { 174 private void createInventory(WmsReceiptOrderDO order, List<WmsReceiptOrderDetailDO> details) {
176 List<WmsInventoryChangeReqDTO.Item> items = convertList(details, 175 List<WmsInventoryChangeReqDTO.Item> items = convertList(details,
177 detail -> BeanUtils.toBean(detail, WmsInventoryChangeReqDTO.Item.class)); 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,8 +26,10 @@ import java.math.BigDecimal;
26 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; 26 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
27 import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_AREA_REQUIRED; 27 import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_AREA_REQUIRED;
28 import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_DETAIL_REQUIRED; 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 import static org.junit.jupiter.api.Assertions.assertEquals; 30 import static org.junit.jupiter.api.Assertions.assertEquals;
30 import static org.junit.jupiter.api.Assertions.assertNotNull; 31 import static org.junit.jupiter.api.Assertions.assertNotNull;
  32 +import static org.junit.jupiter.api.Assertions.assertNull;
31 import static org.mockito.ArgumentMatchers.any; 33 import static org.mockito.ArgumentMatchers.any;
32 import static org.mockito.Mockito.never; 34 import static org.mockito.Mockito.never;
33 import static org.mockito.Mockito.verify; 35 import static org.mockito.Mockito.verify;
@@ -124,6 +126,32 @@ public class WmsReceiptOrderServiceImplTest extends BaseDbUnitTest { @@ -124,6 +126,32 @@ public class WmsReceiptOrderServiceImplTest extends BaseDbUnitTest {
124 verify(inventoryService, never()).changeInventory(any()); 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 private static WmsReceiptOrderDO createReceiptOrder(Long warehouseId) { 155 private static WmsReceiptOrderDO createReceiptOrder(Long warehouseId) {
128 return new WmsReceiptOrderDO() 156 return new WmsReceiptOrderDO()
129 .setNo("RK202605120001") 157 .setNo("RK202605120001")