diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java deleted file mode 100644 index f4e2783..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryDetailController.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.iocoder.yudao.module.wms.controller.admin.inventory; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; -import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailRespVO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; -import cn.iocoder.yudao.module.wms.framework.config.WmsProperties; -import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryDetailService; -import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService; -import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; -import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseAreaService; -import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - WMS 库存明细") -@RestController -@RequestMapping("/wms/inventory-detail") -@Validated -public class WmsInventoryDetailController { - - @Resource - private WmsInventoryDetailService inventoryDetailService; - @Resource - private WmsItemService itemService; - @Resource - private WmsItemSkuService itemSkuService; - @Resource - private WmsWarehouseService warehouseService; - @Resource - private WmsWarehouseAreaService warehouseAreaService; - @Resource - private WmsProperties wmsProperties; - - @GetMapping("/page") - @Operation(summary = "获得库存明细分页") - @PreAuthorize("@ss.hasPermission('wms:inventory-detail:query')") - public CommonResult> getInventoryDetailPage( - @Valid WmsInventoryDetailPageReqVO pageReqVO) { - PageResult pageResult = inventoryDetailService.getInventoryDetailPage(pageReqVO); - return success(new PageResult<>(buildInventoryDetailRespVOList(pageResult.getList()), pageResult.getTotal())); - } - - // ==================== 拼接 VO ==================== - - private List buildInventoryDetailRespVOList(List list) { - if (CollUtil.isEmpty(list)) { - return Collections.emptyList(); - } - Map skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsInventoryDetailDO::getSkuId)); - Map itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId)); - Map warehouseMap = warehouseService.getWarehouseMap( - convertSet(list, WmsInventoryDetailDO::getWarehouseId)); - Map areaMap = wmsProperties.isAreaEnabled() - ? warehouseAreaService.getWarehouseAreaMap(convertSet(list, WmsInventoryDetailDO::getAreaId)) - : Collections.emptyMap(); - return BeanUtils.toBean(list, WmsInventoryDetailRespVO.class, vo -> { - MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> { - vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId()); - MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode()) - .setItemName(item.getName()).setUnit(item.getUnit())); - }); - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName())); - MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> vo.setAreaName(area.getName())); - }); - } - -} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java deleted file mode 100644 index f3931d8..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailPageReqVO.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - WMS 库存明细分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class WmsInventoryDetailPageReqVO extends PageParam { - - /** - * 按仓库库区维度统计 - */ - public static final String TYPE_WAREHOUSE = "warehouse"; - /** - * 按商品维度统计 - */ - public static final String TYPE_ITEM = "item"; - - @Schema(description = "统计维度", example = "warehouse") - private String type; - - @Schema(description = "商品编号", example = "ITEM001") - private String itemCode; - - @Schema(description = "商品名称", example = "红富士苹果") - private String itemName; - - @Schema(description = "商品 SKU 编号", example = "1024") - private Long skuId; - - @Schema(description = "规格编号", example = "SKU001") - private String skuCode; - - @Schema(description = "规格名称", example = "10kg 箱装") - private String skuName; - - @Schema(description = "仓库编号", example = "2048") - private Long warehouseId; - - @Schema(description = "库区编号", example = "4096") - private Long areaId; - - @Schema(description = "批号", example = "BATCH001") - private String batchNo; - - @Schema(description = "最小剩余库存数量", example = "0.01") - private BigDecimal minRemainQuantity; - - @Schema(description = "距离过期天数", example = "30") - private Integer daysToExpires; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java deleted file mode 100644 index 7c03259..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/detail/WmsInventoryDetailRespVO.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - WMS 库存明细 Response VO") -@Data -public class WmsInventoryDetailRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") - private Long itemId; - @Schema(description = "商品编码", example = "ITEM001") - private String itemCode; - @Schema(description = "商品名称", example = "红富士苹果") - private String itemName; - @Schema(description = "商品单位", example = "箱") - private String unit; - - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") - private Long skuId; - @Schema(description = "规格编号", example = "SKU001") - private String skuCode; - @Schema(description = "规格名称", example = "10kg 箱装") - private String skuName; - - @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8192") - private Long warehouseId; - @Schema(description = "仓库名称", example = "成品仓") - private String warehouseName; - @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - private Long areaId; - @Schema(description = "库区名称", example = "A 区") - private String areaName; - - @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") - private BigDecimal quantity; - @Schema(description = "剩余数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "60.00") - private BigDecimal remainQuantity; - @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 = "备注") - private String remark; - - @Schema(description = "操作单编号", example = "1024") - private Long orderId; - @Schema(description = "操作单号", example = "RK202605110001") - private String orderNo; - @Schema(description = "操作类型", example = "1") - private Integer orderType; - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} 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 07eac6f..70bd806 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 @@ -52,9 +52,6 @@ public class WmsCheckOrderDetailRespVO { @Schema(description = "库存编号", example = "1024") private Long inventoryId; - @Schema(description = "库存明细编号", example = "1024") - private Long inventoryDetailId; - @Schema(description = "批号", example = "B202605110001") private String batchNo; 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 48c9f32..3b46d0c 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 @@ -26,9 +26,6 @@ public class WmsCheckOrderDetailSaveReqVO { @Schema(description = "库存编号", example = "1024") private Long inventoryId; - @Schema(description = "库存明细编号", example = "1024") - private Long inventoryDetailId; - @Schema(description = "批号", example = "B202605110001") @Size(max = 64, message = "批号长度不能超过 64 个字符") private String batchNo; 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 51a3344..d50848a 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 @@ -61,9 +61,6 @@ public class WmsMovementOrderDetailRespVO { @Schema(description = "目标库区名称", example = "上海库区01") private String targetAreaName; - @Schema(description = "库存明细编号", example = "1024") - private Long inventoryDetailId; - @Schema(description = "批号", example = "B202605110001") private String batchNo; 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 a9f1c40..e7753b3 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 @@ -26,9 +26,6 @@ public class WmsMovementOrderDetailSaveReqVO { @Schema(description = "目标库区编号", example = "2048") private Long targetAreaId; - @Schema(description = "库存明细编号", example = "1024") - private Long inventoryDetailId; - @Schema(description = "批号", example = "B202605110001") @Size(max = 64, message = "批号长度不能超过 64 个字符") private String batchNo; 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 8672783..2740583 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 @@ -49,9 +49,6 @@ public class WmsShipmentOrderDetailRespVO { @Schema(description = "库区名称", example = "北京库区01") private String areaName; - @Schema(description = "库存明细编号", example = "1024") - private Long inventoryDetailId; - @Schema(description = "批号", example = "B202605110001") private String batchNo; 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 b594a75..1164525 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 @@ -23,9 +23,6 @@ public class WmsShipmentOrderDetailSaveReqVO { @Schema(description = "库区编号", example = "1024") private Long areaId; - @Schema(description = "库存明细编号", example = "1024") - private Long inventoryDetailId; - @Schema(description = "批号", example = "B202605110001") @Size(max = 64, message = "批号长度不能超过 64 个字符") private String batchNo; diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryDetailDO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryDetailDO.java deleted file mode 100644 index 3f7a7ae..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryDetailDO.java +++ /dev/null @@ -1,116 +0,0 @@ -package cn.iocoder.yudao.module.wms.dal.dataobject.inventory; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; -import cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryOrderTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * WMS 库存明细 DO - *

- * 记录可用库存明细余额,用于按库区、批次、效期扣减库存。 - * 库存操作流水见 {@link WmsInventoryHistoryDO}。 - * - * @author 芋道源码 - */ -@TableName("wms_inventory_detail") -@KeySequence("wms_inventory_detail_seq") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class WmsInventoryDetailDO extends BaseDO { - - /** - * 主键编号 - */ - @TableId - private Long id; - - // ========= 库存维度相关字段 ========= - - /** - * 商品 SKU 编号 - * - * 关联 {@link WmsItemSkuDO#getId()} - */ - private Long skuId; - /** - * 仓库编号 - * - * 关联 {@link WmsWarehouseDO#getId()} - */ - private Long warehouseId; - /** - * 库区编号 - * - * 关联 {@link WmsWarehouseAreaDO#getId()} - */ - private Long areaId; - /** - * 数量 - */ - private BigDecimal quantity; - /** - * 剩余数量 - */ - private BigDecimal remainQuantity; - - // ========= 批次效期相关字段 ========= - - /** - * 批号 - */ - private String batchNo; - /** - * 生产日期 - */ - private LocalDateTime productionDate; - /** - * 过期日期 - */ - private LocalDateTime expirationDate; - - // ========= 金额备注相关字段 ========= - - /** - * 金额(小计、非单价) - */ - private BigDecimal amount; - /** - * 备注 - */ - private String remark; - - // ========= 来源单据相关字段 ========= - - /** - * 操作单编号 - * - * 关联来源单据的主键编号,单据类型见 {@link #orderType} - */ - private Long orderId; - /** - * 操作单号 - * - * 关联来源单据的单号,单据类型见 {@link #orderType} - */ - private String orderNo; - /** - * 操作类型 - * - * 枚举 {@link WmsInventoryOrderTypeEnum#getType()} - */ - private Integer orderType; - -} 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 d673e5a..21156b7 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 @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.wms.dal.dataobject.order.check; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; @@ -74,12 +73,6 @@ public class WmsCheckOrderDetailDO extends BaseDO { * 关联 {@link WmsInventoryDO#getId()} */ private Long inventoryId; - /** - * 库存明细编号 - * - * 关联 {@link WmsInventoryDetailDO#getId()} - */ - private Long inventoryDetailId; // ========= 批次效期字段 ========= 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 4fc5a7f..562b20c 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 @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.wms.dal.dataobject.order.movement; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; @@ -67,12 +66,6 @@ public class WmsMovementOrderDetailDO extends BaseDO { * 关联 {@link WmsWarehouseAreaDO#getId()} */ private Long sourceAreaId; - /** - * 库存明细编号 - * - * 关联 {@link WmsInventoryDetailDO#getId()} - */ - private Long inventoryDetailId; // ========= 目标仓库库区字段 ========= 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 ae062bc..4193192 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 @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseAreaDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; @@ -67,12 +66,6 @@ public class WmsShipmentOrderDetailDO extends BaseDO { * 关联 {@link WmsWarehouseAreaDO#getId()} */ private Long areaId; - /** - * 库存明细编号 - * - * 关联 {@link WmsInventoryDetailDO#getId()} - */ - private Long inventoryDetailId; // ========= 批次效期字段 ========= diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java deleted file mode 100644 index 9d10c57..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryDetailMapper.java +++ /dev/null @@ -1,104 +0,0 @@ -package cn.iocoder.yudao.module.wms.dal.mysql.inventory; - -import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; -import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.apache.ibatis.annotations.Mapper; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.Collection; -import java.util.List; - -/** - * WMS 库存明细 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface WmsInventoryDetailMapper extends BaseMapperX { - - default PageResult selectPage(WmsInventoryDetailPageReqVO reqVO) { - MPJLambdaWrapperX query = new MPJLambdaWrapperX() - .selectAll(WmsInventoryDetailDO.class) - .innerJoin(WmsItemSkuDO.class, WmsItemSkuDO::getId, WmsInventoryDetailDO::getSkuId) - .innerJoin(WmsItemDO.class, WmsItemDO::getId, WmsItemSkuDO::getItemId) - .likeIfPresent(WmsItemDO::getCode, reqVO.getItemCode()) - .likeIfPresent(WmsItemDO::getName, reqVO.getItemName()) - .eqIfPresent(WmsInventoryDetailDO::getSkuId, reqVO.getSkuId()) - .likeIfPresent(WmsItemSkuDO::getCode, reqVO.getSkuCode()) - .likeIfPresent(WmsItemSkuDO::getName, reqVO.getSkuName()) - .eqIfPresent(WmsInventoryDetailDO::getWarehouseId, reqVO.getWarehouseId()) - .eqIfPresent(WmsInventoryDetailDO::getAreaId, reqVO.getAreaId()) - .likeIfPresent(WmsInventoryDetailDO::getBatchNo, reqVO.getBatchNo()) - .geIfPresent(WmsInventoryDetailDO::getRemainQuantity, reqVO.getMinRemainQuantity()) - .betweenIfPresent(WmsInventoryDetailDO::getCreateTime, reqVO.getCreateTime()); - appendDaysToExpiresQuery(query, reqVO.getDaysToExpires()); - appendDimensionOrder(query, reqVO.getType()); - return selectJoinPage(reqVO, WmsInventoryDetailDO.class, query); - } - - static void appendDaysToExpiresQuery(MPJLambdaWrapperX query, Integer daysToExpires) { - if (daysToExpires == null) { - return; - } - LocalDateTime startTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); - query.geIfPresent(WmsInventoryDetailDO::getExpirationDate, startTime) - .leIfPresent(WmsInventoryDetailDO::getExpirationDate, startTime.plusDays(daysToExpires)); - } - - static void appendDimensionOrder(MPJLambdaWrapperX query, String type) { - if (StrUtil.equals(WmsInventoryDetailPageReqVO.TYPE_WAREHOUSE, type)) { - query.orderByAsc(WmsInventoryDetailDO::getWarehouseId) - .orderByAsc(WmsInventoryDetailDO::getAreaId) - .orderByAsc(WmsItemSkuDO::getItemId) - .orderByAsc(WmsInventoryDetailDO::getSkuId) - .orderByAsc(WmsInventoryDetailDO::getId); - return; - } - if (StrUtil.equals(WmsInventoryDetailPageReqVO.TYPE_ITEM, type)) { - query.orderByAsc(WmsItemSkuDO::getItemId) - .orderByAsc(WmsInventoryDetailDO::getSkuId) - .orderByAsc(WmsInventoryDetailDO::getWarehouseId) - .orderByAsc(WmsInventoryDetailDO::getAreaId) - .orderByAsc(WmsInventoryDetailDO::getId); - return; - } - throw new IllegalArgumentException("未知库存明细统计维度:" + type); - } - - default WmsInventoryDetailDO selectByIdForUpdate(Long id) { - return selectOneForUpdate(WmsInventoryDetailDO::getId, id); - } - - default List selectListByIdsForUpdate(Collection ids) { - return selectList(new LambdaQueryWrapperX() - .in(WmsInventoryDetailDO::getId, ids) - .orderByAsc(WmsInventoryDetailDO::getId) - .last("FOR UPDATE")); - } - - /** - * 增量更新库存明细剩余数量 - * - * @param id 库存明细编号 - * @param quantity 变更数量 - * @return 更新行数 - */ - @SuppressWarnings("UnusedReturnValue") - default int updateRemainQuantityIncr(Long id, BigDecimal quantity) { - return update(null, new LambdaUpdateWrapper() - .eq(WmsInventoryDetailDO::getId, id) - .setSql("remain_quantity = remain_quantity + (" + quantity + ")")); - } - -} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java index 980c6ad..2b877e7 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java @@ -94,7 +94,5 @@ public interface ErrorCodeConstants { // ========== WMS 库存 1-060-300-000 ========== ErrorCode INVENTORY_QUANTITY_NOT_ENOUGH = new ErrorCode(1_060_300_000, "库存不足,商品:{},商品规格:{},仓库:{},库区:{},当前库存:{},变更数量:{}"); - ErrorCode INVENTORY_DETAIL_NOT_EXISTS = new ErrorCode(1_060_300_001, "库存明细不存在"); - ErrorCode INVENTORY_DETAIL_REMAIN_QUANTITY_NOT_ENOUGH = new ErrorCode(1_060_300_002, "库存明细剩余数量不足,当前剩余:{},出库数量:{}"); } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/WmsProperties.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/WmsProperties.java index 5f357d3..3d156fe 100644 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/WmsProperties.java +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/config/WmsProperties.java @@ -4,7 +4,6 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; -import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.NotNull; /** @@ -23,25 +22,8 @@ public class WmsProperties { @NotNull(message = "是否启用库区模式不能为空") private Boolean areaEnable = true; - /** - * 是否启用批次/效期/库存明细模式 - * - * 依赖 {@link #areaEnable} 为 true - */ - @NotNull(message = "是否启用批次/效期/库存明细模式不能为空") - private Boolean batchEnable = true; - public boolean isAreaEnabled() { return Boolean.TRUE.equals(areaEnable); } - public boolean isBatchEnabled() { - return Boolean.TRUE.equals(batchEnable); - } - - @AssertTrue(message = "WMS 批次/效期模式依赖库区模式,请先开启 yudao.wms.area-enable") - public boolean isBatchDependsOnAreaValid() { - return !isBatchEnabled() || isAreaEnabled(); - } - } diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java deleted file mode 100644 index 65b8e03..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailService.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.wms.service.inventory; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; -import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; - -import java.util.List; - -/** - * WMS 库存明细 Service 接口 - * - * @author 芋道源码 - */ -public interface WmsInventoryDetailService { - - /** - * 获得库存明细分页 - * - * @param pageReqVO 分页查询 - * @return 库存明细分页 - */ - PageResult getInventoryDetailPage(WmsInventoryDetailPageReqVO pageReqVO); - - /** - * 创建库存明细列表 - * - * @param list 库存明细列表 - */ - void createInventoryDetailList(List list); - - /** - * 扣减库存明细剩余数量 - * - * @param items 库存变更明细列表 - */ - void decreaseInventoryDetailList(List items); - -} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java deleted file mode 100644 index 519c1a0..0000000 --- a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.iocoder.yudao.module.wms.service.inventory; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; -import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryDetailMapper; -import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.math.BigDecimal; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.INVENTORY_DETAIL_NOT_EXISTS; -import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.INVENTORY_DETAIL_REMAIN_QUANTITY_NOT_ENOUGH; - -/** - * WMS 库存明细 Service 实现类 - * - * @author 芋道源码 - */ -@Service -@Validated -public class WmsInventoryDetailServiceImpl implements WmsInventoryDetailService { - - @Resource - private WmsInventoryDetailMapper inventoryDetailMapper; - - @Override - public PageResult getInventoryDetailPage(WmsInventoryDetailPageReqVO pageReqVO) { - return inventoryDetailMapper.selectPage(pageReqVO); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void createInventoryDetailList(List list) { - if (CollUtil.isEmpty(list)) { - return; - } - inventoryDetailMapper.insertBatch(list); - } - - // DONE @AI:加锁,也按照 inventory 做法;一批直接加锁;避免按照顺序,多个明细交叉拿锁,导致死锁 - // 批量扣减库存明细:先一次性锁定相关明细,再在内存合并扣减数量后统一校验与更新。 - @Override - @Transactional(rollbackFor = Exception.class) - public void decreaseInventoryDetailList(List items) { - if (CollUtil.isEmpty(items)) { - return; - } - if (items.stream().anyMatch(item -> item.getInventoryDetailId() == null)) { - throw exception(INVENTORY_DETAIL_NOT_EXISTS); - } - List sortedItems = items.stream() - .sorted(Comparator.comparing(WmsInventoryChangeReqDTO.Item::getInventoryDetailId)) - .collect(Collectors.toList()); - - // 1. 批量锁定本次涉及的库存明细行,避免逐条加锁时不同事务交叉等待 - Map detailMap = convertMap(inventoryDetailMapper.selectListByIdsForUpdate( - convertSet(sortedItems, WmsInventoryChangeReqDTO.Item::getInventoryDetailId)), - WmsInventoryDetailDO::getId); - - // 2. 校验库存明细归属,并合并相同库存明细的扣减数量 - Map decreaseQuantityMap = new LinkedHashMap<>(); - for (WmsInventoryChangeReqDTO.Item item : sortedItems) { - WmsInventoryDetailDO detail = detailMap.get(item.getInventoryDetailId()); - if (detail == null - || ObjectUtil.notEqual(detail.getSkuId(), item.getSkuId()) - || ObjectUtil.notEqual(detail.getWarehouseId(), item.getWarehouseId()) - || ObjectUtil.notEqual(detail.getAreaId(), item.getAreaId())) { - throw exception(INVENTORY_DETAIL_NOT_EXISTS); - } - decreaseQuantityMap.merge(detail.getId(), item.getQuantity().abs(), BigDecimal::add); - } - - // 3. 校验并扣减库存明细剩余数量 - for (Map.Entry entry : decreaseQuantityMap.entrySet()) { - WmsInventoryDetailDO detail = detailMap.get(entry.getKey()); - BigDecimal decreaseQuantity = entry.getValue(); - if (detail.getRemainQuantity().compareTo(decreaseQuantity) < 0) { - throw exception(INVENTORY_DETAIL_REMAIN_QUANTITY_NOT_ENOUGH, - detail.getRemainQuantity(), decreaseQuantity); - } - inventoryDetailMapper.updateRemainQuantityIncr(detail.getId(), decreaseQuantity.negate()); - } - } - -} 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 1c63aa6..3f63c4e 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 @@ -7,13 +7,11 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryMapper; -import cn.iocoder.yudao.module.wms.framework.config.WmsProperties; import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService; import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; @@ -26,7 +24,6 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Collections; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; @@ -50,8 +47,6 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { private WmsInventoryMapper inventoryMapper; @Resource - private WmsInventoryDetailService inventoryDetailService; - @Resource private WmsInventoryHistoryService inventoryHistoryService; @Resource @@ -59,9 +54,6 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { @Resource private WmsItemService itemService; - @Resource - private WmsProperties wmsProperties; - @Override public PageResult getInventoryPage(WmsInventoryPageReqVO pageReqVO) { if (StrUtil.equals(WmsInventoryPageReqVO.TYPE_WAREHOUSE, pageReqVO.getType())) { @@ -85,29 +77,11 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { // 1. 补齐并锁定本次涉及的库存余额行,再计算库存变更 Map resultMap = changeInventoryList(reqDTO.getItems()); - // 2.1 构建库存流水与批次库存明细 - boolean batchEnabled = wmsProperties.isBatchEnabled(); + // 2. 批量写入库存流水 List histories = new ArrayList<>(reqDTO.getItems().size()); - List increaseDetails = batchEnabled ? new ArrayList<>(reqDTO.getItems().size()) : Collections.emptyList(); - List decreaseItems = batchEnabled ? new ArrayList<>(reqDTO.getItems().size()) : Collections.emptyList(); for (WmsInventoryChangeReqDTO.Item item : reqDTO.getItems()) { histories.add(buildInventoryHistory(reqDTO, item, resultMap.get(item))); - if (!batchEnabled) { - continue; - } - if (item.getQuantity().compareTo(BigDecimal.ZERO) > 0) { - increaseDetails.add(buildInventoryDetail(reqDTO, item)); - } else { - decreaseItems.add(item); - } - } - - // 2.2.1 扣减已有批次库存明细,再写入新增批次库存明细 - if (batchEnabled) { - inventoryDetailService.decreaseInventoryDetailList(decreaseItems); - inventoryDetailService.createInventoryDetailList(increaseDetails); } - // 2.2.2 批量写入库存流水 inventoryHistoryService.createInventoryHistoryList(histories); } @@ -225,17 +199,6 @@ public class WmsInventoryServiceImpl implements WmsInventoryService { .setOrderId(reqDTO.getOrderId()).setOrderNo(reqDTO.getOrderNo()).setOrderType(reqDTO.getOrderType()); } - private WmsInventoryDetailDO buildInventoryDetail(WmsInventoryChangeReqDTO reqDTO, - WmsInventoryChangeReqDTO.Item item) { - return new WmsInventoryDetailDO() - .setSkuId(item.getSkuId()).setWarehouseId(item.getWarehouseId()).setAreaId(item.getAreaId()) - .setQuantity(item.getQuantity()).setRemainQuantity(item.getQuantity()) - .setBatchNo(item.getBatchNo()).setProductionDate(item.getProductionDate()) - .setExpirationDate(item.getExpirationDate()) - .setAmount(item.getAmount()).setRemark(item.getRemark()) - .setOrderId(reqDTO.getOrderId()).setOrderNo(reqDTO.getOrderNo()).setOrderType(reqDTO.getOrderType()); - } - private static WmsInventoryDO findInventory(List inventories, WmsInventoryChangeReqDTO.Item item) { return CollUtil.findOne(inventories, inventory -> isSameInventory(inventory, item)); } 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 aeb22b4..339a2d3 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 @@ -54,10 +54,6 @@ public class WmsInventoryChangeReqDTO { */ private Long areaId; /** - * 库存明细编号 - */ - private Long inventoryDetailId; - /** * 变更数量 */ private BigDecimal quantity; 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 f04ea37..f4ca567 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 @@ -183,8 +183,7 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService { /** * 盘点盘库单对应库存。 * - * 盘库只对盈亏数量生成库存变更:实盘数量大于账面数量时增加库存,反之扣减库存;批次模式下,扣减库存会使用 - * inventoryDetailId 扣减对应库存明细的剩余数量。 + * 盘库只对盈亏数量生成库存变更:实盘数量大于账面数量时增加库存,反之扣减库存,批次字段随库存流水记录。 * * @param order 盘库单 * @param details 盘库单明细列表 @@ -198,9 +197,6 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService { } WmsInventoryChangeReqDTO.Item item = BeanUtils.toBean(detail, WmsInventoryChangeReqDTO.Item.class) .setQuantity(differenceQuantity); - if (differenceQuantity.compareTo(BigDecimal.ZERO) > 0) { - item.setInventoryDetailId(null); - } items.add(item); } inventoryService.changeInventory(new WmsInventoryChangeReqDTO() 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 a15ba51..84fd1d5 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 @@ -190,8 +190,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { /** * 移动移库单对应库存。 * - * 移库会生成两条库存变更:来源仓库扣减库存,目标仓库增加库存;批次模式下,来源库存明细用 - * inventoryDetailId 扣减剩余数量,目标仓库生成新的库存明细。 + * 移库会生成两条库存变更:来源仓库扣减库存,目标仓库增加库存,批次字段随库存流水记录。 * * @param order 移库单 * @param details 移库单明细列表 @@ -204,7 +203,7 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { .setQuantity(detail.getQuantity().negate())); items.add(BeanUtils.toBean(detail, WmsInventoryChangeReqDTO.Item.class) .setWarehouseId(detail.getTargetWarehouseId()).setAreaId(detail.getTargetAreaId()) - .setInventoryDetailId(null).setQuantity(detail.getQuantity())); + .setQuantity(detail.getQuantity())); } inventoryService.changeInventory(new WmsInventoryChangeReqDTO() .setOrderId(order.getId()).setOrderNo(order.getNo()) 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 77ff8e7..fc3c6e9 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 @@ -189,7 +189,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 417f988..5065d1e 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 @@ -190,7 +190,7 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { /** * 扣减出库单对应库存。 * - * 出库在库存变更模型中使用负数数量;批次模式下,明细里的 inventoryDetailId 会用于扣减对应库存明细的剩余数量。 + * 出库在库存变更模型中使用负数数量,批次字段随库存流水记录。 * * @param order 出库单 * @param details 出库单明细列表 diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImplTest.java deleted file mode 100644 index 7ac3611..0000000 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryDetailServiceImplTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.iocoder.yudao.module.wms.service.inventory; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.detail.WmsInventoryDetailPageReqVO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; -import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; -import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryDetailMapper; -import cn.iocoder.yudao.module.wms.dal.mysql.md.item.WmsItemMapper; -import cn.iocoder.yudao.module.wms.dal.mysql.md.item.WmsItemSkuMapper; -import jakarta.annotation.Resource; -import org.junit.jupiter.api.Test; -import org.springframework.context.annotation.Import; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@Import(WmsInventoryDetailServiceImpl.class) -public class WmsInventoryDetailServiceImplTest extends BaseDbUnitTest { - - @Resource - private WmsInventoryDetailServiceImpl inventoryDetailService; - - @Resource - private WmsInventoryDetailMapper inventoryDetailMapper; - @Resource - private WmsItemMapper itemMapper; - @Resource - private WmsItemSkuMapper skuMapper; - - @Test - public void testGetInventoryDetailPage_daysToExpires() { - // mock 数据 - WmsItemDO item = createItem("ITEM-001", "红富士苹果"); - WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); - WmsInventoryDetailDO dbDetail = createInventoryDetail(sku.getId(), 100L, 1001L, "10.00", - LocalDateTime.of(LocalDate.now().plusDays(10), LocalTime.MIN)); - inventoryDetailMapper.insert(dbDetail); - inventoryDetailMapper.insert(createInventoryDetail(sku.getId(), 100L, 1002L, "20.00", - LocalDateTime.of(LocalDate.now().plusDays(40), LocalTime.MIN))); - // 准备参数 - WmsInventoryDetailPageReqVO reqVO = new WmsInventoryDetailPageReqVO(); - reqVO.setType(WmsInventoryDetailPageReqVO.TYPE_WAREHOUSE); - reqVO.setDaysToExpires(30); - - // 调用 - PageResult pageResult = inventoryDetailService.getInventoryDetailPage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertEquals(dbDetail.getId(), pageResult.getList().get(0).getId()); - } - - private WmsItemDO createItem(String code, String name) { - WmsItemDO item = WmsItemDO.builder() - .code(code) - .name(name) - .unit("箱") - .categoryId(1L) - .build(); - itemMapper.insert(item); - return item; - } - - private WmsItemSkuDO createSku(Long itemId, String code, String name) { - WmsItemSkuDO sku = WmsItemSkuDO.builder() - .itemId(itemId) - .code(code) - .name(name) - .barCode("69010001") - .build(); - skuMapper.insert(sku); - return sku; - } - - private static WmsInventoryDetailDO createInventoryDetail(Long skuId, Long warehouseId, Long areaId, - String quantity, LocalDateTime expirationDate) { - return WmsInventoryDetailDO.builder() - .skuId(skuId) - .warehouseId(warehouseId) - .areaId(areaId) - .quantity(new BigDecimal(quantity)) - .remainQuantity(new BigDecimal(quantity)) - .expirationDate(expirationDate) - .build(); - } - -} 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 d263516..355a33b 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 @@ -3,18 +3,15 @@ package cn.iocoder.yudao.module.wms.service.inventory; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; -import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDetailDO; import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO; import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; -import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryDetailMapper; import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryHistoryMapper; import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryMapper; import cn.iocoder.yudao.module.wms.dal.mysql.md.item.WmsItemMapper; import cn.iocoder.yudao.module.wms.dal.mysql.md.item.WmsItemSkuMapper; import cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryOrderTypeEnum; -import cn.iocoder.yudao.module.wms.framework.config.WmsProperties; import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService; import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; @@ -30,14 +27,12 @@ import java.util.Comparator; import java.util.List; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; -import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.INVENTORY_DETAIL_REMAIN_QUANTITY_NOT_ENOUGH; 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.mockito.Mockito.when; -@Import({WmsInventoryServiceImpl.class, WmsInventoryDetailServiceImpl.class, WmsInventoryHistoryServiceImpl.class, - WmsProperties.class}) +@Import({WmsInventoryServiceImpl.class, WmsInventoryHistoryServiceImpl.class}) public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Resource @@ -46,15 +41,11 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Resource private WmsInventoryMapper inventoryMapper; @Resource - private WmsInventoryDetailMapper inventoryDetailMapper; - @Resource private WmsInventoryHistoryMapper inventoryHistoryMapper; @Resource private WmsItemMapper itemMapper; @Resource private WmsItemSkuMapper skuMapper; - @Resource - private WmsProperties wmsProperties; @MockitoBean private WmsItemSkuService itemSkuService; @@ -64,7 +55,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Test public void testChangeInventory_createInventory() { // mock 数据 - wmsProperties.setBatchEnable(false); WmsItemDO item = createItem("ITEM-001", "红富士苹果"); WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, 1001L, "5.00"); @@ -93,7 +83,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Test public void testChangeInventory_updateInventory() { // mock 数据 - wmsProperties.setBatchEnable(false); WmsItemDO item = createItem("ITEM-001", "红富士苹果"); WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); inventoryMapper.insert(createInventory(sku.getId(), 100L, 1001L, "2.00")); @@ -118,7 +107,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Test public void testChangeInventory_sameInventoryKeyKeepItemGranularity() { // mock 数据 - wmsProperties.setBatchEnable(false); WmsItemDO item = createItem("ITEM-001", "红富士苹果"); WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, 1001L, "5.00"); @@ -154,7 +142,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Test public void testChangeInventory_sameExistingInventoryKeyKeepItemGranularity() { // mock 数据 - wmsProperties.setBatchEnable(false); WmsItemDO item = createItem("ITEM-001", "红富士苹果"); WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); inventoryMapper.insert(createInventory(sku.getId(), 100L, 1001L, "2.00")); @@ -191,7 +178,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Test public void testChangeInventory_multipleInventoryKeysKeepItemGranularity() { // mock 数据 - wmsProperties.setBatchEnable(false); WmsItemDO item = createItem("ITEM-001", "红富士苹果"); WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, 1001L, "5.00"); @@ -240,7 +226,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Test public void testChangeInventory_quantityNotEnough() { // mock 数据 - wmsProperties.setBatchEnable(false); WmsItemDO item = createItem("ITEM-001", "红富士苹果"); WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); inventoryMapper.insert(createInventory(sku.getId(), 100L, 1001L, "2.00")); @@ -255,7 +240,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { @Test public void testChangeInventory_quantityNotEnoughWithoutInventory() { // mock 数据 - wmsProperties.setBatchEnable(false); WmsItemDO item = createItem("ITEM-001", "红富士苹果"); WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, 1001L, "-3.00"); @@ -268,58 +252,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { } @Test - public void testChangeInventory_decreaseInventoryDetail() { - // mock 数据 - wmsProperties.setBatchEnable(true); - WmsItemDO item = createItem("ITEM-001", "红富士苹果"); - WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); - inventoryMapper.insert(createInventory(sku.getId(), 100L, 1001L, "10.00")); - WmsInventoryDetailDO detail = createInventoryDetail(sku.getId(), 100L, 1001L, "5.00"); - inventoryDetailMapper.insert(detail); - WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, 1001L, "-3.00"); - reqDTO.getItems().get(0).setInventoryDetailId(detail.getId()); - - // 调用 - inventoryService.changeInventory(reqDTO); - - // 断言:库存余额 - WmsInventoryDO inventory = inventoryMapper.selectBySkuIdAndWarehouseIdAndAreaId(sku.getId(), 100L, 1001L); - assertEquals(0, new BigDecimal("7.00").compareTo(inventory.getQuantity())); - // 断言:库存明细 - WmsInventoryDetailDO dbDetail = inventoryDetailMapper.selectById(detail.getId()); - assertEquals(0, new BigDecimal("2.00").compareTo(dbDetail.getRemainQuantity())); - // 断言:库存流水 - List histories = inventoryHistoryMapper.selectList(); - assertEquals(1, histories.size()); - assertEquals(0, new BigDecimal("-3.00").compareTo(histories.get(0).getQuantity())); - } - - @Test - public void testChangeInventory_decreaseInventoryDetailRemainQuantityNotEnough() { - // mock 数据 - wmsProperties.setBatchEnable(true); - WmsItemDO item = createItem("ITEM-001", "红富士苹果"); - WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装"); - inventoryMapper.insert(createInventory(sku.getId(), 100L, 1001L, "10.00")); - WmsInventoryDetailDO detail = createInventoryDetail(sku.getId(), 100L, 1001L, "5.00"); - inventoryDetailMapper.insert(detail); - WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, 1001L, "-3.00"); - reqDTO.getItems().get(0).setInventoryDetailId(detail.getId()); - List items = new ArrayList<>(reqDTO.getItems()); - items.add(new WmsInventoryChangeReqDTO.Item() - .setSkuId(sku.getId()) - .setWarehouseId(100L) - .setAreaId(1001L) - .setInventoryDetailId(detail.getId()) - .setQuantity(new BigDecimal("-3.00"))); - reqDTO.setItems(items); - - // 调用,并断言:相同库存明细会合并后校验 - assertServiceException(() -> inventoryService.changeInventory(reqDTO), - INVENTORY_DETAIL_REMAIN_QUANTITY_NOT_ENOUGH, new BigDecimal("5.000000"), new BigDecimal("6.00")); - } - - @Test public void testGetInventoryPage_groupByWarehouse() { // mock 数据 WmsItemDO item = createItem("ITEM-001", "红富士苹果"); @@ -419,17 +351,6 @@ public class WmsInventoryServiceImplTest extends BaseDbUnitTest { .build(); } - private static WmsInventoryDetailDO createInventoryDetail(Long skuId, Long warehouseId, Long areaId, - String remainQuantity) { - return WmsInventoryDetailDO.builder() - .skuId(skuId) - .warehouseId(warehouseId) - .areaId(areaId) - .quantity(new BigDecimal(remainQuantity)) - .remainQuantity(new BigDecimal(remainQuantity)) - .build(); - } - private static WmsInventoryChangeReqDTO createChangeReq(Long skuId, Long warehouseId, Long areaId, String quantity) { return new WmsInventoryChangeReqDTO() .setOrderId(1L) diff --git a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java index 4e92bdd..c04bf5f 100644 --- a/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java +++ b/yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java @@ -61,11 +61,9 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { // mock 数据 Long warehouseId = 100L; Long skuId = 200L; - Long inventoryDetailId = 300L; WmsShipmentOrderDO order = createShipmentOrder(warehouseId); shipmentOrderMapper.insert(order); - shipmentOrderDetailMapper.insert(createShipmentOrderDetail(order.getId(), skuId, warehouseId, 400L, - inventoryDetailId)); + shipmentOrderDetailMapper.insert(createShipmentOrderDetail(order.getId(), skuId, warehouseId, 400L)); // 调用 shipmentOrderService.completeShipmentOrder(order.getId()); @@ -84,7 +82,6 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { assertEquals(1, inventoryReqDTO.getItems().size()); assertEquals(skuId, inventoryReqDTO.getItems().get(0).getSkuId()); assertEquals(warehouseId, inventoryReqDTO.getItems().get(0).getWarehouseId()); - assertEquals(inventoryDetailId, inventoryReqDTO.getItems().get(0).getInventoryDetailId()); assertEquals(0, new BigDecimal("-2.00").compareTo(inventoryReqDTO.getItems().get(0).getQuantity())); } @@ -105,7 +102,7 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { // mock 数据 WmsShipmentOrderDO order = createShipmentOrder(100L); shipmentOrderMapper.insert(order); - shipmentOrderDetailMapper.insert(createShipmentOrderDetail(order.getId(), 200L, 100L, 0L, null)); + shipmentOrderDetailMapper.insert(createShipmentOrderDetail(order.getId(), 200L, 100L, 0L)); // 调用,并断言 assertServiceException(() -> shipmentOrderService.completeShipmentOrder(order.getId()), @@ -134,7 +131,7 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { // mock 数据 WmsShipmentOrderDO order = createShipmentOrder(100L).setStatus(WmsOrderStatusEnum.CANCELED.getStatus()); shipmentOrderMapper.insert(order); - shipmentOrderDetailMapper.insert(createShipmentOrderDetail(order.getId(), 200L, 100L, 300L, null)); + shipmentOrderDetailMapper.insert(createShipmentOrderDetail(order.getId(), 200L, 100L, 300L)); // 调用 shipmentOrderService.deleteShipmentOrder(order.getId()); @@ -167,13 +164,12 @@ public class WmsShipmentOrderServiceImplTest extends BaseDbUnitTest { } private static WmsShipmentOrderDetailDO createShipmentOrderDetail(Long orderId, Long skuId, Long warehouseId, - Long areaId, Long inventoryDetailId) { + Long areaId) { return WmsShipmentOrderDetailDO.builder() .orderId(orderId) .skuId(skuId) .warehouseId(warehouseId) .areaId(areaId) - .inventoryDetailId(inventoryDetailId) .quantity(new BigDecimal("2.00")) .amount(new BigDecimal("20.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 675414e..f003505 100644 --- a/yudao-module-wms/src/test/resources/sql/clean.sql +++ b/yudao-module-wms/src/test/resources/sql/clean.sql @@ -3,7 +3,6 @@ DELETE FROM "wms_shipment_order"; DELETE FROM "wms_receipt_order_detail"; DELETE FROM "wms_receipt_order"; DELETE FROM "wms_inventory_history"; -DELETE FROM "wms_inventory_detail"; DELETE FROM "wms_inventory"; DELETE FROM "wms_item_sku"; DELETE FROM "wms_item"; 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 14c349c..9572ba0 100644 --- a/yudao-module-wms/src/test/resources/sql/create_tables.sql +++ b/yudao-module-wms/src/test/resources/sql/create_tables.sql @@ -54,30 +54,6 @@ CREATE TABLE IF NOT EXISTS "wms_inventory" ( CONSTRAINT "uk_wms_inventory_sku_warehouse_area" UNIQUE ("sku_id", "warehouse_id", "area_id", "tenant_id", "deleted") ) COMMENT 'WMS 库存表'; -CREATE TABLE IF NOT EXISTS "wms_inventory_detail" ( - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - "sku_id" bigint NOT NULL, - "warehouse_id" bigint NOT NULL, - "area_id" bigint NOT NULL DEFAULT '0', - "quantity" decimal(24, 6) NOT NULL DEFAULT '0', - "remain_quantity" decimal(24, 6) NOT NULL DEFAULT '0', - "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, - "order_no" varchar(64) DEFAULT NULL, - "order_type" tinyint 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_inventory_history" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, "warehouse_id" bigint NOT NULL, @@ -173,7 +149,6 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order_detail" ( "sku_id" bigint NOT NULL, "warehouse_id" bigint NOT NULL, "area_id" bigint NOT NULL DEFAULT '0', - "inventory_detail_id" bigint DEFAULT NULL, "batch_no" varchar(64) DEFAULT NULL, "production_date" timestamp DEFAULT NULL, "expiration_date" timestamp DEFAULT NULL,