Commit d15470efb1a3952b0d9d7ec21391cdc302baab0c
1 parent
076de400
feat(wms):修复只能删除作废的入库单的问题
Showing
5 changed files
with
99 additions
and
10 deletions
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") |