From 86d760fdb1593fdd591aa5447cc75058f0681e03 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 13 May 2026 22:06:38 +0800 Subject: [PATCH] feat(wms):减法,去掉批次号等字段 --- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java | 6 ------ yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailRespVO.java | 9 --------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailSaveReqVO.java | 10 ---------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java | 9 --------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java | 11 ----------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailRespVO.java | 9 --------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailSaveReqVO.java | 11 ----------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java | 9 --------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java | 11 ----------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryHistoryDO.java | 16 ---------------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDetailDO.java | 14 -------------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java | 16 ---------------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java | 16 ---------------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java | 16 ---------------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/package-info.java | 4 ---- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java | 54 ++++++++++++++++++++++++++---------------------------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryChangeReqDTO.java | 16 ---------------- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java | 8 +++++--- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java | 4 +--- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java | 2 +- yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java | 4 +--- yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java | 32 +++++++++++++++++++++++++++++++- yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImplTest.java | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImplTest.java | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-wms/src/test/resources/sql/clean.sql | 4 ++++ yudao-module-wms/src/test/resources/sql/create_tables.sql | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 29 files changed, 939 insertions(+), 231 deletions(-) delete mode 100644 yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/package-info.java create mode 100644 yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImplTest.java create mode 100644 yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImplTest.java create mode 100644 yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java create mode 100644 yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java create mode 100644 yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java index b8faa01..d3aef86 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java @@ -40,12 +40,6 @@ public class WmsInventoryHistoryRespVO { private BigDecimal beforeQuantity; @Schema(description = "变化后库存数量", example = "100.00") private BigDecimal afterQuantity; - @Schema(description = "批号", example = "BATCH001") - private String batchNo; - @Schema(description = "生产日期") - private LocalDateTime productionDate; - @Schema(description = "过期日期") - private LocalDateTime expirationDate; @Schema(description = "金额", example = "1000.00") private BigDecimal amount; @Schema(description = "备注", example = "备注") diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailRespVO.java index 99d1417..48a9435 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailRespVO.java @@ -46,15 +46,6 @@ public class WmsCheckOrderDetailRespVO { @Schema(description = "库存编号", example = "1024") private Long inventoryId; - @Schema(description = "批号", example = "B202605110001") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "入库时间") private LocalDateTime receiptTime; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailSaveReqVO.java index 2f5769f..15f41ae 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailSaveReqVO.java @@ -23,16 +23,6 @@ public class WmsCheckOrderDetailSaveReqVO { @Schema(description = "库存编号", example = "1024") private Long inventoryId; - @Schema(description = "批号", example = "B202605110001") - @Size(max = 64, message = "批号长度不能超过 64 个字符") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "入库时间") private LocalDateTime receiptTime; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java index d243236..ef3864d 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java @@ -49,15 +49,6 @@ public class WmsMovementOrderDetailRespVO { @Schema(description = "目标仓库名称", example = "上海仓") private String targetWarehouseName; - @Schema(description = "批号", example = "B202605110001") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "移库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") private BigDecimal quantity; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java index e56df57..7cc1884 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java @@ -7,7 +7,6 @@ import jakarta.validation.constraints.Size; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDateTime; @Schema(description = "管理后台 - WMS 移库单明细保存 Request VO") @Data @@ -20,16 +19,6 @@ public class WmsMovementOrderDetailSaveReqVO { @NotNull(message = "SKU 不能为空") private Long skuId; - @Schema(description = "批号", example = "B202605110001") - @Size(max = 64, message = "批号长度不能超过 64 个字符") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "移库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @NotNull(message = "移库数量不能为空") @DecimalMin(value = "0", inclusive = false, message = "移库数量必须大于 0") diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailRespVO.java index fd6f61d..fe885e3 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailRespVO.java @@ -43,15 +43,6 @@ public class WmsReceiptOrderDetailRespVO { @Schema(description = "仓库名称", example = "北京仓") private String warehouseName; - @Schema(description = "批号", example = "B202605110001") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") private BigDecimal quantity; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailSaveReqVO.java index 9875acb..3b7a918 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailSaveReqVO.java @@ -7,7 +7,6 @@ import jakarta.validation.constraints.Size; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDateTime; @Schema(description = "管理后台 - WMS 入库单明细保存 Request VO") @Data @@ -20,16 +19,6 @@ public class WmsReceiptOrderDetailSaveReqVO { @NotNull(message = "SKU 不能为空") private Long skuId; - @Schema(description = "批号", example = "B202605110001") - @Size(max = 64, message = "批号长度不能超过 64 个字符") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @NotNull(message = "入库数量不能为空") @DecimalMin(value = "0", inclusive = false, message = "入库数量必须大于 0") diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java index 9369639..4ea906d 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java @@ -43,15 +43,6 @@ public class WmsShipmentOrderDetailRespVO { @Schema(description = "仓库名称", example = "北京仓") private String warehouseName; - @Schema(description = "批号", example = "B202605110001") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") private BigDecimal quantity; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java index 39d8e44..d10922c 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java @@ -7,7 +7,6 @@ import jakarta.validation.constraints.Size; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDateTime; @Schema(description = "管理后台 - WMS 出库单明细保存 Request VO") @Data @@ -20,16 +19,6 @@ public class WmsShipmentOrderDetailSaveReqVO { @NotNull(message = "SKU 不能为空") private Long skuId; - @Schema(description = "批号", example = "B202605110001") - @Size(max = 64, message = "批号长度不能超过 64 个字符") - private String batchNo; - - @Schema(description = "生产日期") - private LocalDateTime productionDate; - - @Schema(description = "过期日期") - private LocalDateTime expirationDate; - @Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @NotNull(message = "出库数量不能为空") @DecimalMin(value = "0", inclusive = false, message = "出库数量必须大于 0") diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryHistoryDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryHistoryDO.java index 31f1c3c..45c91f6 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryHistoryDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryHistoryDO.java @@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; -import java.time.LocalDateTime; /** * WMS 库存流水 DO @@ -60,21 +59,6 @@ public class WmsInventoryHistoryDO extends BaseDO { */ private BigDecimal afterQuantity; - // ========= 批次效期相关字段 ========= - - /** - * 批号 - */ - private String batchNo; - /** - * 生产日期 - */ - private LocalDateTime productionDate; - /** - * 过期日期 - */ - private LocalDateTime expirationDate; - // ========= 金额备注相关字段 ========= /** diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDetailDO.java index b1be796..2bedef5 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDetailDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDetailDO.java @@ -67,20 +67,6 @@ public class WmsCheckOrderDetailDO extends BaseDO { */ private Long inventoryId; - // ========= 批次效期字段 ========= - - /** - * 批号 - */ - private String batchNo; - /** - * 生产日期 - */ - private LocalDateTime productionDate; - /** - * 过期日期 - */ - private LocalDateTime expirationDate; /** * 入库时间 */ diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java index 78e20c6..7fcd9e1 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java @@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; -import java.time.LocalDateTime; /** * WMS 移库单明细 DO @@ -69,21 +68,6 @@ public class WmsMovementOrderDetailDO extends BaseDO { */ private Long targetWarehouseId; - // ========= 批次效期字段 ========= - - /** - * 批号 - */ - private String batchNo; - /** - * 生产日期 - */ - private LocalDateTime productionDate; - /** - * 过期日期 - */ - private LocalDateTime expirationDate; - // ========= 汇总金额字段 ========= /** diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java index 2ed3b72..556d465 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java @@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; -import java.time.LocalDateTime; /** * WMS 入库单明细 DO @@ -60,21 +59,6 @@ public class WmsReceiptOrderDetailDO extends BaseDO { */ private Long warehouseId; - // ========= 批次效期字段 ========= - - /** - * 批号 - */ - private String batchNo; - /** - * 生产日期 - */ - private LocalDateTime productionDate; - /** - * 过期日期 - */ - private LocalDateTime expirationDate; - // ========= 汇总金额字段 ========= /** diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java index c7e62c1..3300fd4 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java @@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; -import java.time.LocalDateTime; /** * WMS 出库单明细 DO @@ -60,21 +59,6 @@ public class WmsShipmentOrderDetailDO extends BaseDO { */ private Long warehouseId; - // ========= 批次效期字段 ========= - - /** - * 批号 - */ - private String batchNo; - /** - * 生产日期 - */ - private LocalDateTime productionDate; - /** - * 过期日期 - */ - private LocalDateTime expirationDate; - // ========= 汇总金额字段 ========= /** diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/package-info.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/package-info.java deleted file mode 100644 index 2747c36..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * WMS 模块配置 - */ -package cn.iocoder.yudao.module.wms.framework.config; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java index bcedfc6..9f00359 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java @@ -121,50 +121,50 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { } private List getOrCreateInventoryList(List items) { - // 先按库存维度在内存去重,避免同一批明细重复查询或重复补行。 - List inventoryKeyList = new ArrayList<>(items.size()); + // 1.1 先按库存维度在内存去重,避免同一批明细重复查询或重复补行 + List inventoryDimensions = new ArrayList<>(items.size()); for (WmsInventoryChangeReqDTO.Item item : items) { - if (findInventory(inventoryKeyList, item) == null) { - inventoryKeyList.add(new WmsInventoryDO().setSkuId(item.getSkuId()) + if (findInventory(inventoryDimensions, item) == null) { + inventoryDimensions.add(new WmsInventoryDO().setSkuId(item.getSkuId()) .setWarehouseId(item.getWarehouseId())); } } - - // 批量查询已存在的库存行;这里不加锁,后续统一按库存 ID 批量加锁。 - List inventories = inventoryMapper.selectListByKeys(inventoryKeyList); - - // 对比库存维度,找出数据库中还不存在的库存行,再按唯一索引兜底补齐。 - List missingInventoryList = new ArrayList<>(inventoryKeyList.size()); - for (WmsInventoryDO inventoryKey : inventoryKeyList) { - if (findInventory(inventories, inventoryKey) == null) { - missingInventoryList.add(inventoryKey); + // 1.2 批量查询已存在的库存行(这里不加锁,后续统一按库存 ID 批量加锁) + List inventories = inventoryMapper.selectListByKeys(inventoryDimensions); + + // 2.1 对比库存维度,找出数据库中还不存在的库存行 + List missingInventories = new ArrayList<>(inventoryDimensions.size()); + for (WmsInventoryDO inventoryDimension : inventoryDimensions) { + if (findInventory(inventories, inventoryDimension) == null) { + missingInventories.add(inventoryDimension); } } - if (CollUtil.isEmpty(missingInventoryList)) { + // 2.2 如果库存行都已存在,直接返回待加锁库存列表 + if (CollUtil.isEmpty(missingInventories)) { return inventories; } - - inventories.addAll(createMissingInventoryList(missingInventoryList)); + // 2.3 对缺失库存行执行创建;并发冲突时,内部会按唯一索引回查已创建的库存行 + inventories.addAll(createMissingInventoryList(missingInventories)); return inventories; } - private List createMissingInventoryList(List missingInventoryList) { + private List createMissingInventoryList(List missingInventories) { // 优先批量插入缺失库存行;并发唯一键冲突时,再逐个插入并回查冲突行。 - List newInventoryList = convertList(missingInventoryList, missingInventory -> + List newInventories = convertList(missingInventories, missingInventory -> new WmsInventoryDO().setSkuId(missingInventory.getSkuId()).setWarehouseId(missingInventory.getWarehouseId()) .setQuantity(BigDecimal.ZERO)); try { - inventoryMapper.insertBatch(newInventoryList); - return newInventoryList; + inventoryMapper.insertBatch(newInventories); + return newInventories; } catch (DuplicateKeyException ex) { // 并发事务可能已经补齐部分库存行,降级为逐个插入并回查唯一键冲突的行。 - log.warn("[createMissingInventoryList][missingInventoryList({}) 批量插入库存行冲突,降级为逐个插入]", - missingInventoryList, ex); + log.warn("[createMissingInventoryList][missingInventories({}) 批量插入库存行冲突,降级为逐个插入]", + missingInventories, ex); } // 批量插入失败后逐条补齐;单条唯一键冲突时,回查并使用并发事务创建的库存行。 - List resultList = new ArrayList<>(missingInventoryList.size()); - for (WmsInventoryDO missingInventory : missingInventoryList) { + List createdInventories = new ArrayList<>(missingInventories.size()); + for (WmsInventoryDO missingInventory : missingInventories) { WmsInventoryDO inventory = new WmsInventoryDO().setSkuId(missingInventory.getSkuId()) .setWarehouseId(missingInventory.getWarehouseId()) .setQuantity(BigDecimal.ZERO); @@ -178,9 +178,9 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { throw ex; } } - resultList.add(inventory); + createdInventories.add(inventory); } - return resultList; + return createdInventories; } private WmsInventoryHistoryDO buildInventoryHistory(WmsInventoryChangeReqDTO reqDTO, @@ -189,8 +189,6 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { return new WmsInventoryHistoryDO() .setWarehouseId(item.getWarehouseId()).setSkuId(item.getSkuId()) .setQuantity(item.getQuantity()).setBeforeQuantity(result.get(0)).setAfterQuantity(result.get(1)) - .setBatchNo(item.getBatchNo()).setProductionDate(item.getProductionDate()) - .setExpirationDate(item.getExpirationDate()) .setAmount(item.getAmount()).setRemark(item.getRemark()) .setOrderId(reqDTO.getOrderId()).setOrderNo(reqDTO.getOrderNo()).setOrderType(reqDTO.getOrderType()); } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryChangeReqDTO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryChangeReqDTO.java index a84158a..de7071b 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryChangeReqDTO.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryChangeReqDTO.java @@ -4,7 +4,6 @@ import cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryOrderTypeEnum; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; /** @@ -54,21 +53,6 @@ public class WmsInventoryChangeReqDTO { */ private BigDecimal quantity; - // ========= 批次效期相关字段 ========= - - /** - * 批号 - */ - private String batchNo; - /** - * 生产日期 - */ - private LocalDateTime productionDate; - /** - * 过期日期 - */ - private LocalDateTime expirationDate; - // ========= 金额备注相关字段 ========= /** diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java index e34cfda..e676f41 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.wms.service.order.check; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -171,9 +172,7 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService { } /** - * 盘点盘库单对应库存。 - * - * 盘库只对盈亏数量生成库存变更:实盘数量大于账面数量时增加库存,反之扣减库存,批次字段随库存流水记录。 + * 盘点盘库单对应库存 * * @param order 盘库单 * @param details 盘库单明细列表 @@ -189,6 +188,9 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService { .setQuantity(differenceQuantity); items.add(item); } + if (CollUtil.isEmpty(items)) { + return; + } inventoryService.changeInventory(new WmsInventoryChangeReqDTO() .setOrderId(order.getId()).setOrderNo(order.getNo()) .setOrderType(WmsInventoryOrderTypeEnum.CHECK.getType()).setItems(items)); diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java index 0dda60a..a9e15f1 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java @@ -175,9 +175,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { } /** - * 移动移库单对应库存。 - * - * 移库会生成两条库存变更:来源仓库扣减库存,目标仓库增加库存,批次字段随库存流水记录。 + * 移动移库单对应库存 * * @param order 移库单 * @param details 移库单明细列表 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 1f6ee11..db4c0b1 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 @@ -184,7 +184,7 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { /** * 增加入库单对应库存。 * - * 入库在库存变更模型中使用正数数量,批次字段随库存流水记录。 + * 入库在库存变更模型中使用正数数量。 * * @param order 入库单 * @param details 入库单明细列表 diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java index 2f7b9f7..1f400f3 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java @@ -183,9 +183,7 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { } /** - * 扣减出库单对应库存。 - * - * 出库在库存变更模型中使用负数数量,批次字段随库存流水记录。 + * 扣减出库单对应库存 * * @param order 出库单 * @param details 出库单明细列表 diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java index 2a1a5ba..f1f5d64 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java @@ -30,6 +30,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.INVENTORY_QUANTITY_NOT_ENOUGH; 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.Mockito.when; @Import({WmsInventoryServiceImpl.class, WmsInventoryHistoryServiceImpl.class}) @@ -230,6 +231,10 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { // 调用,并断言 assertServiceException(() -> inventoryService.changeInventory(reqDTO), INVENTORY_QUANTITY_NOT_ENOUGH, item.getName(), sku.getName(), 100L, new BigDecimal("2.000000"), new BigDecimal("-3.00")); + WmsInventoryDO inventory = inventoryMapper.selectBySkuIdAndWarehouseId(sku.getId(), 100L); + assertNotNull(inventory); + assertEquals(0, new BigDecimal("2.00").compareTo(inventory.getQuantity())); + assertEquals(0L, inventoryHistoryMapper.selectCount()); } @Test @@ -243,7 +248,32 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { // 调用,并断言 assertServiceException(() -> inventoryService.changeInventory(reqDTO), INVENTORY_QUANTITY_NOT_ENOUGH, item.getName(), sku.getName(), 100L, BigDecimal.ZERO.setScale(6), new BigDecimal("-3.00")); - assertEquals(0, inventoryMapper.selectCount()); + assertEquals(0L, inventoryMapper.selectCount()); + assertEquals(0L, inventoryHistoryMapper.selectCount()); + } + + @Test + public void testChangeInventory_quantityNotEnoughRollbackCreatedInventories() { + // mock 数据 + WmsItemDO item = createItem("ITEM-001", "红富士苹果"); + WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); + WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, "5.00"); + List items = new ArrayList<>(reqDTO.getItems()); + items.add(new WmsInventoryChangeReqDTO.Item() + .setSkuId(sku.getId()) + .setWarehouseId(200L) + .setQuantity(new BigDecimal("-1.00")) + .setAmount(new BigDecimal("20.00")) + .setRemark("测试出库")); + reqDTO.setItems(items); + mockItemSkuAndItem(item, sku); + + // 调用,并断言:第二条明细库存不足,事务回滚前面补齐的库存行 + assertServiceException(() -> inventoryService.changeInventory(reqDTO), INVENTORY_QUANTITY_NOT_ENOUGH, + item.getName(), sku.getName(), 200L, BigDecimal.ZERO.setScale(6), new BigDecimal("-1.00")); + assertNull(inventoryMapper.selectBySkuIdAndWarehouseId(sku.getId(), 100L)); + assertNull(inventoryMapper.selectBySkuIdAndWarehouseId(sku.getId(), 200L)); + assertEquals(0L, inventoryHistoryMapper.selectCount()); } @Test diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImplTest.java new file mode 100644 index 0000000..f3452f6 --- /dev/null +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImplTest.java @@ -0,0 +1,151 @@ +package cn.iocoder.yudao.module.wms.service.order.check; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailSaveReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO; +import cn.iocoder.yudao.module.wms.dal.mysql.order.check.WmsCheckOrderDetailMapper; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.CHECK_ORDER_DETAIL_NOT_EXISTS; +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(WmsCheckOrderDetailServiceImpl.class) +public class WmsCheckOrderDetailServiceImplTest extends BaseDbUnitTest { + + @Resource + private WmsCheckOrderDetailServiceImpl checkOrderDetailService; + + @Resource + private WmsCheckOrderDetailMapper checkOrderDetailMapper; + + @MockitoBean + private WmsItemSkuService itemSkuService; + + @Test + public void testCreateCheckOrderDetailList_success() { + // mock 数据 + Long orderId = 10L; + WmsCheckOrderSaveReqVO reqVO = createCheckOrderReqVO( + createCheckOrderDetailReqVO(null, 1001L, "10.00", "9.00"), + createCheckOrderDetailReqVO(null, 1002L, "20.00", "21.00")); + + // 调用 + checkOrderDetailService.createCheckOrderDetailList(orderId, reqVO); + + // 断言 + List details = checkOrderDetailMapper.selectListByOrderId(orderId); + assertEquals(2, details.size()); + assertEquals(orderId, details.get(0).getOrderId()); + assertEquals(orderId, details.get(1).getOrderId()); + assertEquals(100L, details.get(0).getWarehouseId()); + } + + @Test + public void testCreateCheckOrderDetailList_ignoreId() { + // mock 数据 + WmsCheckOrderSaveReqVO reqVO = createCheckOrderReqVO( + createCheckOrderDetailReqVO(999L, 1001L, "10.00", "9.00")); + + // 调用 + checkOrderDetailService.createCheckOrderDetailList(10L, reqVO); + + // 断言 + List details = checkOrderDetailMapper.selectListByOrderId(10L); + assertEquals(1, details.size()); + assertNotNull(details.get(0).getId()); + assertEquals(1001L, details.get(0).getSkuId()); + } + + @Test + public void testUpdateCheckOrderDetailList_diff() { + // mock 数据 + Long orderId = 10L; + WmsCheckOrderDetailDO detail01 = createCheckOrderDetail(orderId, 1001L, "10.00", "9.00"); + WmsCheckOrderDetailDO detail02 = createCheckOrderDetail(orderId, 1002L, "20.00", "21.00"); + checkOrderDetailMapper.insert(detail01); + checkOrderDetailMapper.insert(detail02); + WmsCheckOrderSaveReqVO reqVO = createCheckOrderReqVO( + createCheckOrderDetailReqVO(detail01.getId(), 2001L, "11.00", "8.00"), + createCheckOrderDetailReqVO(null, 2002L, "22.00", "25.00")); + + // 调用 + checkOrderDetailService.updateCheckOrderDetailList(orderId, reqVO); + + // 断言:修改 + WmsCheckOrderDetailDO dbUpdateDetail = checkOrderDetailMapper.selectById(detail01.getId()); + assertNotNull(dbUpdateDetail); + assertEquals(orderId, dbUpdateDetail.getOrderId()); + assertEquals(2001L, dbUpdateDetail.getSkuId()); + assertEquals(0, new BigDecimal("11.00").compareTo(dbUpdateDetail.getQuantity())); + assertEquals(0, new BigDecimal("8.00").compareTo(dbUpdateDetail.getCheckQuantity())); + assertEquals(100L, dbUpdateDetail.getWarehouseId()); + // 断言:新增 + List details = checkOrderDetailMapper.selectListByOrderId(orderId); + assertEquals(2, details.size()); + WmsCheckOrderDetailDO dbCreateDetail = details.stream() + .filter(detail -> Long.valueOf(2002L).equals(detail.getSkuId())) + .findFirst().orElse(null); + assertNotNull(dbCreateDetail); + assertEquals(orderId, dbCreateDetail.getOrderId()); + assertEquals(0, new BigDecimal("22.00").compareTo(dbCreateDetail.getQuantity())); + assertEquals(0, new BigDecimal("25.00").compareTo(dbCreateDetail.getCheckQuantity())); + // 断言:删除 + assertNull(checkOrderDetailMapper.selectById(detail02.getId())); + } + + @Test + public void testUpdateCheckOrderDetailList_detailNotExists() { + // mock 数据 + WmsCheckOrderSaveReqVO reqVO = createCheckOrderReqVO( + createCheckOrderDetailReqVO(999L, 1001L, "10.00", "9.00")); + + // 调用,并断言 + assertServiceException(() -> checkOrderDetailService.updateCheckOrderDetailList(10L, reqVO), + CHECK_ORDER_DETAIL_NOT_EXISTS); + } + + private static WmsCheckOrderSaveReqVO createCheckOrderReqVO(WmsCheckOrderDetailSaveReqVO... details) { + WmsCheckOrderSaveReqVO reqVO = new WmsCheckOrderSaveReqVO(); + reqVO.setWarehouseId(100L); + reqVO.setDetails(Arrays.asList(details)); + return reqVO; + } + + private static WmsCheckOrderDetailSaveReqVO createCheckOrderDetailReqVO(Long id, Long skuId, + String quantity, String checkQuantity) { + WmsCheckOrderDetailSaveReqVO reqVO = new WmsCheckOrderDetailSaveReqVO(); + reqVO.setId(id); + reqVO.setSkuId(skuId); + reqVO.setInventoryId(300L); + reqVO.setQuantity(new BigDecimal(quantity)); + reqVO.setCheckQuantity(new BigDecimal(checkQuantity)); + reqVO.setAmount(new BigDecimal("100.00")); + return reqVO; + } + + private static WmsCheckOrderDetailDO createCheckOrderDetail(Long orderId, Long skuId, + String quantity, String checkQuantity) { + return WmsCheckOrderDetailDO.builder() + .orderId(orderId) + .skuId(skuId) + .warehouseId(100L) + .inventoryId(300L) + .quantity(new BigDecimal(quantity)) + .checkQuantity(new BigDecimal(checkQuantity)) + .amount(new BigDecimal("100.00")) + .build(); + } + +} diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImplTest.java new file mode 100644 index 0000000..4316407 --- /dev/null +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImplTest.java @@ -0,0 +1,175 @@ +package cn.iocoder.yudao.module.wms.service.order.check; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO; +import cn.iocoder.yudao.module.wms.dal.mysql.order.check.WmsCheckOrderDetailMapper; +import cn.iocoder.yudao.module.wms.dal.mysql.order.check.WmsCheckOrderMapper; +import cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryOrderTypeEnum; +import cn.iocoder.yudao.module.wms.enums.order.WmsOrderStatusEnum; +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService; +import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; +import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import java.math.BigDecimal; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.CHECK_ORDER_DETAIL_REQUIRED; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.CHECK_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; + +@Import({WmsCheckOrderServiceImpl.class, WmsCheckOrderDetailServiceImpl.class}) +public class WmsCheckOrderServiceImplTest extends BaseDbUnitTest { + + @Resource + private WmsCheckOrderServiceImpl checkOrderService; + + @Resource + private WmsCheckOrderMapper checkOrderMapper; + @Resource + private WmsCheckOrderDetailMapper checkOrderDetailMapper; + + @MockitoBean + private WmsWarehouseService warehouseService; + @MockitoBean + private WmsItemSkuService itemSkuService; + @MockitoBean + private WmsInventoryService inventoryService; + + @Test + public void testCompleteCheckOrder_success() { + // mock 数据 + Long warehouseId = 100L; + Long skuId = 200L; + WmsCheckOrderDO order = createCheckOrder(warehouseId); + checkOrderMapper.insert(order); + checkOrderDetailMapper.insert(createCheckOrderDetail(order.getId(), skuId, warehouseId, + "10.00", "7.00")); + + // 调用 + checkOrderService.completeCheckOrder(order.getId()); + + // 断言:盘库单 + WmsCheckOrderDO dbOrder = checkOrderMapper.selectById(order.getId()); + assertNotNull(dbOrder); + assertEquals(WmsOrderStatusEnum.FINISHED.getStatus(), dbOrder.getStatus()); + // 断言:库存变更 + ArgumentCaptor captor = ArgumentCaptor.forClass(WmsInventoryChangeReqDTO.class); + verify(inventoryService).changeInventory(captor.capture()); + WmsInventoryChangeReqDTO inventoryReqDTO = captor.getValue(); + assertEquals(order.getId(), inventoryReqDTO.getOrderId()); + assertEquals(order.getNo(), inventoryReqDTO.getOrderNo()); + assertEquals(WmsInventoryOrderTypeEnum.CHECK.getType(), inventoryReqDTO.getOrderType()); + assertEquals(1, inventoryReqDTO.getItems().size()); + assertEquals(skuId, inventoryReqDTO.getItems().get(0).getSkuId()); + assertEquals(warehouseId, inventoryReqDTO.getItems().get(0).getWarehouseId()); + assertEquals(0, new BigDecimal("-3.00").compareTo(inventoryReqDTO.getItems().get(0).getQuantity())); + } + + @Test + public void testCompleteCheckOrder_zeroDifference() { + // mock 数据 + WmsCheckOrderDO order = createCheckOrder(100L); + checkOrderMapper.insert(order); + checkOrderDetailMapper.insert(createCheckOrderDetail(order.getId(), 200L, 100L, + "10.00", "10.00")); + + // 调用 + checkOrderService.completeCheckOrder(order.getId()); + + // 断言 + WmsCheckOrderDO dbOrder = checkOrderMapper.selectById(order.getId()); + assertNotNull(dbOrder); + assertEquals(WmsOrderStatusEnum.FINISHED.getStatus(), dbOrder.getStatus()); + verify(inventoryService, never()).changeInventory(any()); + } + + @Test + public void testCompleteCheckOrder_detailRequired() { + // mock 数据 + WmsCheckOrderDO order = createCheckOrder(100L); + checkOrderMapper.insert(order); + + // 调用,并断言 + assertServiceException(() -> checkOrderService.completeCheckOrder(order.getId()), + CHECK_ORDER_DETAIL_REQUIRED); + verify(inventoryService, never()).changeInventory(any()); + } + + @Test + public void testCancelCheckOrder_success() { + // mock 数据 + WmsCheckOrderDO order = createCheckOrder(100L); + checkOrderMapper.insert(order); + + // 调用 + checkOrderService.cancelCheckOrder(order.getId()); + + // 断言 + WmsCheckOrderDO dbOrder = checkOrderMapper.selectById(order.getId()); + assertNotNull(dbOrder); + assertEquals(WmsOrderStatusEnum.CANCELED.getStatus(), dbOrder.getStatus()); + verify(inventoryService, never()).changeInventory(any()); + } + + @Test + public void testDeleteCheckOrder_canceled() { + // mock 数据 + WmsCheckOrderDO order = createCheckOrder(100L).setStatus(WmsOrderStatusEnum.CANCELED.getStatus()); + checkOrderMapper.insert(order); + checkOrderDetailMapper.insert(createCheckOrderDetail(order.getId(), 200L, 100L, + "10.00", "8.00")); + + // 调用 + checkOrderService.deleteCheckOrder(order.getId()); + + // 断言 + assertNull(checkOrderMapper.selectById(order.getId())); + assertEquals(0, checkOrderDetailMapper.selectListByOrderId(order.getId()).size()); + } + + @Test + public void testDeleteCheckOrder_finished() { + // mock 数据 + WmsCheckOrderDO order = createCheckOrder(100L).setStatus(WmsOrderStatusEnum.FINISHED.getStatus()); + checkOrderMapper.insert(order); + + // 调用,并断言 + assertServiceException(() -> checkOrderService.deleteCheckOrder(order.getId()), + CHECK_ORDER_STATUS_NOT_DELETABLE); + } + + private static WmsCheckOrderDO createCheckOrder(Long warehouseId) { + return new WmsCheckOrderDO() + .setNo("PK202605120001") + .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()) + .setWarehouseId(warehouseId) + .setTotalQuantity(new BigDecimal("-3.00")) + .setTotalAmount(new BigDecimal("30.00")); + } + + private static WmsCheckOrderDetailDO createCheckOrderDetail(Long orderId, Long skuId, Long warehouseId, + String quantity, String checkQuantity) { + return WmsCheckOrderDetailDO.builder() + .orderId(orderId) + .skuId(skuId) + .warehouseId(warehouseId) + .inventoryId(300L) + .quantity(new BigDecimal(quantity)) + .checkQuantity(new BigDecimal(checkQuantity)) + .amount(new BigDecimal("30.00")) + .build(); + } + +} diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java new file mode 100644 index 0000000..52b9cd8 --- /dev/null +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java @@ -0,0 +1,147 @@ +package cn.iocoder.yudao.module.wms.service.order.movement; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailSaveReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO; +import cn.iocoder.yudao.module.wms.dal.mysql.order.movement.WmsMovementOrderDetailMapper; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.MOVEMENT_ORDER_DETAIL_NOT_EXISTS; +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(WmsMovementOrderDetailServiceImpl.class) +public class WmsMovementOrderDetailServiceImplTest extends BaseDbUnitTest { + + @Resource + private WmsMovementOrderDetailServiceImpl movementOrderDetailService; + + @Resource + private WmsMovementOrderDetailMapper movementOrderDetailMapper; + + @MockitoBean + private WmsItemSkuService itemSkuService; + + @Test + public void testCreateMovementOrderDetailList_success() { + // mock 数据 + Long orderId = 10L; + WmsMovementOrderSaveReqVO reqVO = createMovementOrderReqVO( + createMovementOrderDetailReqVO(null, 1001L, "1.00"), + createMovementOrderDetailReqVO(null, 1002L, "2.00")); + + // 调用 + movementOrderDetailService.createMovementOrderDetailList(orderId, reqVO); + + // 断言 + List details = movementOrderDetailMapper.selectListByOrderId(orderId); + assertEquals(2, details.size()); + assertEquals(orderId, details.get(0).getOrderId()); + assertEquals(orderId, details.get(1).getOrderId()); + assertEquals(100L, details.get(0).getSourceWarehouseId()); + assertEquals(200L, details.get(0).getTargetWarehouseId()); + } + + @Test + public void testCreateMovementOrderDetailList_ignoreId() { + // mock 数据 + WmsMovementOrderSaveReqVO reqVO = createMovementOrderReqVO( + createMovementOrderDetailReqVO(999L, 1001L, "1.00")); + + // 调用 + movementOrderDetailService.createMovementOrderDetailList(10L, reqVO); + + // 断言 + List details = movementOrderDetailMapper.selectListByOrderId(10L); + assertEquals(1, details.size()); + assertNotNull(details.get(0).getId()); + assertEquals(1001L, details.get(0).getSkuId()); + } + + @Test + public void testUpdateMovementOrderDetailList_diff() { + // mock 数据 + Long orderId = 10L; + WmsMovementOrderDetailDO detail01 = createMovementOrderDetail(orderId, 1001L, "1.00"); + WmsMovementOrderDetailDO detail02 = createMovementOrderDetail(orderId, 1002L, "2.00"); + movementOrderDetailMapper.insert(detail01); + movementOrderDetailMapper.insert(detail02); + WmsMovementOrderSaveReqVO reqVO = createMovementOrderReqVO( + createMovementOrderDetailReqVO(detail01.getId(), 2001L, "11.00"), + createMovementOrderDetailReqVO(null, 2002L, "22.00")); + + // 调用 + movementOrderDetailService.updateMovementOrderDetailList(orderId, reqVO); + + // 断言:修改 + WmsMovementOrderDetailDO dbUpdateDetail = movementOrderDetailMapper.selectById(detail01.getId()); + assertNotNull(dbUpdateDetail); + assertEquals(orderId, dbUpdateDetail.getOrderId()); + assertEquals(2001L, dbUpdateDetail.getSkuId()); + assertEquals(0, new BigDecimal("11.00").compareTo(dbUpdateDetail.getQuantity())); + assertEquals(100L, dbUpdateDetail.getSourceWarehouseId()); + assertEquals(200L, dbUpdateDetail.getTargetWarehouseId()); + // 断言:新增 + List details = movementOrderDetailMapper.selectListByOrderId(orderId); + assertEquals(2, details.size()); + WmsMovementOrderDetailDO dbCreateDetail = details.stream() + .filter(detail -> Long.valueOf(2002L).equals(detail.getSkuId())) + .findFirst().orElse(null); + assertNotNull(dbCreateDetail); + assertEquals(orderId, dbCreateDetail.getOrderId()); + assertEquals(0, new BigDecimal("22.00").compareTo(dbCreateDetail.getQuantity())); + // 断言:删除 + assertNull(movementOrderDetailMapper.selectById(detail02.getId())); + } + + @Test + public void testUpdateMovementOrderDetailList_detailNotExists() { + // mock 数据 + WmsMovementOrderSaveReqVO reqVO = createMovementOrderReqVO( + createMovementOrderDetailReqVO(999L, 1001L, "1.00")); + + // 调用,并断言 + assertServiceException(() -> movementOrderDetailService.updateMovementOrderDetailList(10L, reqVO), + MOVEMENT_ORDER_DETAIL_NOT_EXISTS); + } + + private static WmsMovementOrderSaveReqVO createMovementOrderReqVO(WmsMovementOrderDetailSaveReqVO... details) { + WmsMovementOrderSaveReqVO reqVO = new WmsMovementOrderSaveReqVO(); + reqVO.setSourceWarehouseId(100L); + reqVO.setTargetWarehouseId(200L); + reqVO.setDetails(Arrays.asList(details)); + return reqVO; + } + + private static WmsMovementOrderDetailSaveReqVO createMovementOrderDetailReqVO(Long id, Long skuId, String quantity) { + WmsMovementOrderDetailSaveReqVO reqVO = new WmsMovementOrderDetailSaveReqVO(); + reqVO.setId(id); + reqVO.setSkuId(skuId); + reqVO.setQuantity(new BigDecimal(quantity)); + reqVO.setAmount(new BigDecimal("100.00")); + return reqVO; + } + + private static WmsMovementOrderDetailDO createMovementOrderDetail(Long orderId, Long skuId, String quantity) { + return WmsMovementOrderDetailDO.builder() + .orderId(orderId) + .skuId(skuId) + .sourceWarehouseId(100L) + .targetWarehouseId(200L) + .quantity(new BigDecimal(quantity)) + .amount(new BigDecimal("100.00")) + .build(); + } + +} diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java new file mode 100644 index 0000000..815f274 --- /dev/null +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java @@ -0,0 +1,182 @@ +package cn.iocoder.yudao.module.wms.service.order.movement; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDO; +import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO; +import cn.iocoder.yudao.module.wms.dal.mysql.order.movement.WmsMovementOrderDetailMapper; +import cn.iocoder.yudao.module.wms.dal.mysql.order.movement.WmsMovementOrderMapper; +import cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryOrderTypeEnum; +import cn.iocoder.yudao.module.wms.enums.order.WmsOrderStatusEnum; +import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService; +import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; +import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import java.math.BigDecimal; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.MOVEMENT_ORDER_DETAIL_REQUIRED; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.MOVEMENT_ORDER_STATUS_NOT_DELETABLE; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.MOVEMENT_ORDER_WAREHOUSE_SAME; +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; + +@Import({WmsMovementOrderServiceImpl.class, WmsMovementOrderDetailServiceImpl.class}) +public class WmsMovementOrderServiceImplTest extends BaseDbUnitTest { + + @Resource + private WmsMovementOrderServiceImpl movementOrderService; + + @Resource + private WmsMovementOrderMapper movementOrderMapper; + @Resource + private WmsMovementOrderDetailMapper movementOrderDetailMapper; + + @MockitoBean + private WmsWarehouseService warehouseService; + @MockitoBean + private WmsItemSkuService itemSkuService; + @MockitoBean + private WmsInventoryService inventoryService; + + @Test + public void testCompleteMovementOrder_success() { + // mock 数据 + Long sourceWarehouseId = 100L; + Long targetWarehouseId = 200L; + Long skuId = 300L; + WmsMovementOrderDO order = createMovementOrder(sourceWarehouseId, targetWarehouseId); + movementOrderMapper.insert(order); + movementOrderDetailMapper.insert(createMovementOrderDetail(order.getId(), skuId, + sourceWarehouseId, targetWarehouseId)); + + // 调用 + movementOrderService.completeMovementOrder(order.getId()); + + // 断言:移库单 + WmsMovementOrderDO dbOrder = movementOrderMapper.selectById(order.getId()); + assertNotNull(dbOrder); + assertEquals(WmsOrderStatusEnum.FINISHED.getStatus(), dbOrder.getStatus()); + // 断言:库存变更 + ArgumentCaptor captor = ArgumentCaptor.forClass(WmsInventoryChangeReqDTO.class); + verify(inventoryService).changeInventory(captor.capture()); + WmsInventoryChangeReqDTO inventoryReqDTO = captor.getValue(); + assertEquals(order.getId(), inventoryReqDTO.getOrderId()); + assertEquals(order.getNo(), inventoryReqDTO.getOrderNo()); + assertEquals(WmsInventoryOrderTypeEnum.MOVEMENT.getType(), inventoryReqDTO.getOrderType()); + assertEquals(2, inventoryReqDTO.getItems().size()); + assertEquals(skuId, inventoryReqDTO.getItems().get(0).getSkuId()); + assertEquals(sourceWarehouseId, inventoryReqDTO.getItems().get(0).getWarehouseId()); + assertEquals(0, new BigDecimal("-2.00").compareTo(inventoryReqDTO.getItems().get(0).getQuantity())); + assertEquals(skuId, inventoryReqDTO.getItems().get(1).getSkuId()); + assertEquals(targetWarehouseId, inventoryReqDTO.getItems().get(1).getWarehouseId()); + assertEquals(0, new BigDecimal("2.00").compareTo(inventoryReqDTO.getItems().get(1).getQuantity())); + } + + @Test + public void testCompleteMovementOrder_detailRequired() { + // mock 数据 + WmsMovementOrderDO order = createMovementOrder(100L, 200L); + movementOrderMapper.insert(order); + + // 调用,并断言 + assertServiceException(() -> movementOrderService.completeMovementOrder(order.getId()), + MOVEMENT_ORDER_DETAIL_REQUIRED); + verify(inventoryService, never()).changeInventory(any()); + } + + @Test + public void testCreateMovementOrder_sameWarehouse() { + // 准备参数 + WmsMovementOrderSaveReqVO reqVO = createMovementOrderReqVO(100L, 100L); + + // 调用,并断言 + assertServiceException(() -> movementOrderService.createMovementOrder(reqVO), MOVEMENT_ORDER_WAREHOUSE_SAME); + verify(inventoryService, never()).changeInventory(any()); + } + + @Test + public void testCancelMovementOrder_success() { + // mock 数据 + WmsMovementOrderDO order = createMovementOrder(100L, 200L); + movementOrderMapper.insert(order); + + // 调用 + movementOrderService.cancelMovementOrder(order.getId()); + + // 断言 + WmsMovementOrderDO dbOrder = movementOrderMapper.selectById(order.getId()); + assertNotNull(dbOrder); + assertEquals(WmsOrderStatusEnum.CANCELED.getStatus(), dbOrder.getStatus()); + verify(inventoryService, never()).changeInventory(any()); + } + + @Test + public void testDeleteMovementOrder_canceled() { + // mock 数据 + WmsMovementOrderDO order = createMovementOrder(100L, 200L).setStatus(WmsOrderStatusEnum.CANCELED.getStatus()); + movementOrderMapper.insert(order); + movementOrderDetailMapper.insert(createMovementOrderDetail(order.getId(), 300L, 100L, 200L)); + + // 调用 + movementOrderService.deleteMovementOrder(order.getId()); + + // 断言 + assertNull(movementOrderMapper.selectById(order.getId())); + assertEquals(0, movementOrderDetailMapper.selectListByOrderId(order.getId()).size()); + } + + @Test + public void testDeleteMovementOrder_finished() { + // mock 数据 + WmsMovementOrderDO order = createMovementOrder(100L, 200L).setStatus(WmsOrderStatusEnum.FINISHED.getStatus()); + movementOrderMapper.insert(order); + + // 调用,并断言 + assertServiceException(() -> movementOrderService.deleteMovementOrder(order.getId()), + MOVEMENT_ORDER_STATUS_NOT_DELETABLE); + } + + private static WmsMovementOrderDO createMovementOrder(Long sourceWarehouseId, Long targetWarehouseId) { + return new WmsMovementOrderDO() + .setNo("YK202605120001") + .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()) + .setSourceWarehouseId(sourceWarehouseId) + .setTargetWarehouseId(targetWarehouseId) + .setTotalQuantity(new BigDecimal("2.00")) + .setTotalAmount(new BigDecimal("20.00")); + } + + private static WmsMovementOrderDetailDO createMovementOrderDetail(Long orderId, Long skuId, + Long sourceWarehouseId, Long targetWarehouseId) { + return WmsMovementOrderDetailDO.builder() + .orderId(orderId) + .skuId(skuId) + .sourceWarehouseId(sourceWarehouseId) + .targetWarehouseId(targetWarehouseId) + .quantity(new BigDecimal("2.00")) + .amount(new BigDecimal("20.00")) + .build(); + } + + private static WmsMovementOrderSaveReqVO createMovementOrderReqVO(Long sourceWarehouseId, Long targetWarehouseId) { + WmsMovementOrderSaveReqVO reqVO = new WmsMovementOrderSaveReqVO(); + reqVO.setNo("YK202605120001"); + reqVO.setSourceWarehouseId(sourceWarehouseId); + reqVO.setTargetWarehouseId(targetWarehouseId); + reqVO.setTotalQuantity(new BigDecimal("2.00")); + reqVO.setTotalAmount(new BigDecimal("20.00")); + return reqVO; + } + +} diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java new file mode 100644 index 0000000..99f6793 --- /dev/null +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java @@ -0,0 +1,142 @@ +package cn.iocoder.yudao.module.wms.service.order.shipment; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailSaveReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO; +import cn.iocoder.yudao.module.wms.dal.mysql.order.shipment.WmsShipmentOrderDetailMapper; +import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.SHIPMENT_ORDER_DETAIL_NOT_EXISTS; +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(WmsShipmentOrderDetailServiceImpl.class) +public class WmsShipmentOrderDetailServiceImplTest extends BaseDbUnitTest { + + @Resource + private WmsShipmentOrderDetailServiceImpl shipmentOrderDetailService; + + @Resource + private WmsShipmentOrderDetailMapper shipmentOrderDetailMapper; + + @MockitoBean + private WmsItemSkuService itemSkuService; + + @Test + public void testCreateShipmentOrderDetailList_success() { + // mock 数据 + Long orderId = 10L; + WmsShipmentOrderSaveReqVO reqVO = createShipmentOrderReqVO( + createShipmentOrderDetailReqVO(null, 1001L, "1.00"), + createShipmentOrderDetailReqVO(null, 1002L, "2.00")); + + // 调用 + shipmentOrderDetailService.createShipmentOrderDetailList(orderId, reqVO); + + // 断言 + List details = shipmentOrderDetailMapper.selectListByOrderId(orderId); + assertEquals(2, details.size()); + assertEquals(orderId, details.get(0).getOrderId()); + assertEquals(orderId, details.get(1).getOrderId()); + assertEquals(100L, details.get(0).getWarehouseId()); + } + + @Test + public void testCreateShipmentOrderDetailList_ignoreId() { + // mock 数据 + WmsShipmentOrderSaveReqVO reqVO = createShipmentOrderReqVO( + createShipmentOrderDetailReqVO(999L, 1001L, "1.00")); + + // 调用 + shipmentOrderDetailService.createShipmentOrderDetailList(10L, reqVO); + + // 断言 + List details = shipmentOrderDetailMapper.selectListByOrderId(10L); + assertEquals(1, details.size()); + assertNotNull(details.get(0).getId()); + assertEquals(1001L, details.get(0).getSkuId()); + } + + @Test + public void testUpdateShipmentOrderDetailList_diff() { + // mock 数据 + Long orderId = 10L; + WmsShipmentOrderDetailDO detail01 = createShipmentOrderDetail(orderId, 1001L, "1.00"); + WmsShipmentOrderDetailDO detail02 = createShipmentOrderDetail(orderId, 1002L, "2.00"); + shipmentOrderDetailMapper.insert(detail01); + shipmentOrderDetailMapper.insert(detail02); + WmsShipmentOrderSaveReqVO reqVO = createShipmentOrderReqVO( + createShipmentOrderDetailReqVO(detail01.getId(), 2001L, "11.00"), + createShipmentOrderDetailReqVO(null, 2002L, "22.00")); + + // 调用 + shipmentOrderDetailService.updateShipmentOrderDetailList(orderId, reqVO); + + // 断言:修改 + WmsShipmentOrderDetailDO dbUpdateDetail = shipmentOrderDetailMapper.selectById(detail01.getId()); + assertNotNull(dbUpdateDetail); + assertEquals(orderId, dbUpdateDetail.getOrderId()); + assertEquals(2001L, dbUpdateDetail.getSkuId()); + assertEquals(0, new BigDecimal("11.00").compareTo(dbUpdateDetail.getQuantity())); + // 断言:新增 + List details = shipmentOrderDetailMapper.selectListByOrderId(orderId); + assertEquals(2, details.size()); + WmsShipmentOrderDetailDO dbCreateDetail = details.stream() + .filter(detail -> Long.valueOf(2002L).equals(detail.getSkuId())) + .findFirst().orElse(null); + assertNotNull(dbCreateDetail); + assertEquals(orderId, dbCreateDetail.getOrderId()); + assertEquals(0, new BigDecimal("22.00").compareTo(dbCreateDetail.getQuantity())); + // 断言:删除 + assertNull(shipmentOrderDetailMapper.selectById(detail02.getId())); + } + + @Test + public void testUpdateShipmentOrderDetailList_detailNotExists() { + // mock 数据 + WmsShipmentOrderSaveReqVO reqVO = createShipmentOrderReqVO( + createShipmentOrderDetailReqVO(999L, 1001L, "1.00")); + + // 调用,并断言 + assertServiceException(() -> shipmentOrderDetailService.updateShipmentOrderDetailList(10L, reqVO), + SHIPMENT_ORDER_DETAIL_NOT_EXISTS); + } + + private static WmsShipmentOrderSaveReqVO createShipmentOrderReqVO(WmsShipmentOrderDetailSaveReqVO... details) { + WmsShipmentOrderSaveReqVO reqVO = new WmsShipmentOrderSaveReqVO(); + reqVO.setWarehouseId(100L); + reqVO.setDetails(Arrays.asList(details)); + return reqVO; + } + + private static WmsShipmentOrderDetailSaveReqVO createShipmentOrderDetailReqVO(Long id, Long skuId, String quantity) { + WmsShipmentOrderDetailSaveReqVO reqVO = new WmsShipmentOrderDetailSaveReqVO(); + reqVO.setId(id); + reqVO.setSkuId(skuId); + reqVO.setQuantity(new BigDecimal(quantity)); + reqVO.setAmount(new BigDecimal("100.00")); + return reqVO; + } + + private static WmsShipmentOrderDetailDO createShipmentOrderDetail(Long orderId, Long skuId, String quantity) { + return WmsShipmentOrderDetailDO.builder() + .orderId(orderId) + .skuId(skuId) + .warehouseId(100L) + .quantity(new BigDecimal(quantity)) + .amount(new BigDecimal("100.00")) + .build(); + } + +} diff --git a/yudao-module-wms/src/test/resources/sql/clean.sql b/yudao-module-wms/src/test/resources/sql/clean.sql index f003505..b636db4 100644 --- a/yudao-module-wms/src/test/resources/sql/clean.sql +++ b/yudao-module-wms/src/test/resources/sql/clean.sql @@ -1,3 +1,7 @@ +DELETE FROM "wms_check_order_detail"; +DELETE FROM "wms_check_order"; +DELETE FROM "wms_movement_order_detail"; +DELETE FROM "wms_movement_order"; DELETE FROM "wms_shipment_order_detail"; DELETE FROM "wms_shipment_order"; DELETE FROM "wms_receipt_order_detail"; diff --git a/yudao-module-wms/src/test/resources/sql/create_tables.sql b/yudao-module-wms/src/test/resources/sql/create_tables.sql index b1540d9..6379b1a 100644 --- a/yudao-module-wms/src/test/resources/sql/create_tables.sql +++ b/yudao-module-wms/src/test/resources/sql/create_tables.sql @@ -60,9 +60,6 @@ CREATE TABLE IF NOT EXISTS "wms_inventory_history" ( "quantity" decimal(24, 6) NOT NULL DEFAULT '0', "before_quantity" decimal(24, 6) DEFAULT NULL, "after_quantity" decimal(24, 6) DEFAULT NULL, - "batch_no" varchar(64) DEFAULT NULL, - "production_date" timestamp DEFAULT NULL, - "expiration_date" timestamp DEFAULT NULL, "amount" decimal(24, 6) DEFAULT NULL, "remark" varchar(255) DEFAULT NULL, "order_id" bigint DEFAULT NULL, @@ -103,9 +100,6 @@ CREATE TABLE IF NOT EXISTS "wms_receipt_order_detail" ( "order_id" bigint NOT NULL, "sku_id" bigint NOT NULL, "warehouse_id" bigint NOT NULL, - "batch_no" varchar(64) DEFAULT NULL, - "production_date" timestamp DEFAULT NULL, - "expiration_date" timestamp DEFAULT NULL, "quantity" decimal(20, 2) NOT NULL DEFAULT '0', "amount" decimal(10, 2) DEFAULT NULL, "creator" varchar(64) DEFAULT '', @@ -143,9 +137,6 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order_detail" ( "order_id" bigint NOT NULL, "sku_id" bigint NOT NULL, "warehouse_id" bigint NOT NULL, - "batch_no" varchar(64) DEFAULT NULL, - "production_date" timestamp DEFAULT NULL, - "expiration_date" timestamp DEFAULT NULL, "quantity" decimal(20, 2) NOT NULL DEFAULT '0', "amount" decimal(10, 2) DEFAULT NULL, "creator" varchar(64) DEFAULT '', @@ -156,3 +147,76 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order_detail" ( "tenant_id" bigint NOT NULL DEFAULT '0', PRIMARY KEY ("id") ) COMMENT 'WMS 出库单明细表'; + +CREATE TABLE IF NOT EXISTS "wms_movement_order" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "no" varchar(64) NOT NULL, + "status" int NOT NULL DEFAULT '0', + "remark" varchar(255) DEFAULT NULL, + "source_warehouse_id" bigint NOT NULL, + "target_warehouse_id" bigint NOT NULL, + "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0', + "total_amount" decimal(10, 2) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT '0', + PRIMARY KEY ("id") +) COMMENT 'WMS 移库单表'; + +CREATE TABLE IF NOT EXISTS "wms_movement_order_detail" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "remark" varchar(255) DEFAULT NULL, + "order_id" bigint NOT NULL, + "sku_id" bigint NOT NULL, + "source_warehouse_id" bigint NOT NULL, + "target_warehouse_id" bigint NOT NULL, + "quantity" decimal(20, 2) NOT NULL DEFAULT '0', + "amount" decimal(10, 2) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT '0', + PRIMARY KEY ("id") +) COMMENT 'WMS 移库单明细表'; + +CREATE TABLE IF NOT EXISTS "wms_check_order" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "no" varchar(64) NOT NULL, + "status" int NOT NULL DEFAULT '0', + "remark" varchar(255) DEFAULT NULL, + "warehouse_id" bigint NOT NULL, + "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0', + "total_amount" decimal(10, 2) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT '0', + PRIMARY KEY ("id") +) COMMENT 'WMS 盘库单表'; + +CREATE TABLE IF NOT EXISTS "wms_check_order_detail" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "remark" varchar(255) DEFAULT NULL, + "order_id" bigint NOT NULL, + "sku_id" bigint NOT NULL, + "warehouse_id" bigint NOT NULL, + "inventory_id" bigint DEFAULT NULL, + "receipt_time" timestamp DEFAULT NULL, + "quantity" decimal(20, 2) NOT NULL DEFAULT '0', + "check_quantity" decimal(20, 2) NOT NULL DEFAULT '0', + "amount" decimal(10, 2) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT '0', + PRIMARY KEY ("id") +) COMMENT 'WMS 盘库单明细表'; -- libgit2 0.21.4