Commit 8bbd1d9ca73ba295ccf9ef1fcb3e6587486b37be

Authored by YunaiV
1 parent 5159b19e

fix(wms): 完善单据状态保护与金额精度处理

- 后端补充商品、往来企业唯一性校验
- 单据更新改为按草稿状态条件更新,避免覆盖已完成单据
- 补充 WMS 金额、规格精度迁移 SQL 与测试表结构
- 前端统一明细金额兜底计算,优化完成/作废取消处理
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemMapper.java
@@ -43,6 +43,10 @@ public interface WmsItemMapper extends BaseMapperX<WmsItemDO> { @@ -43,6 +43,10 @@ public interface WmsItemMapper extends BaseMapperX<WmsItemDO> {
43 return selectOne(WmsItemDO::getName, name); 43 return selectOne(WmsItemDO::getName, name);
44 } 44 }
45 45
  46 + default WmsItemDO selectByCode(String code) {
  47 + return selectOne(WmsItemDO::getCode, code);
  48 + }
  49 +
46 default Long selectCountByCategoryId(Long categoryId) { 50 default Long selectCountByCategoryId(Long categoryId) {
47 return selectCount(WmsItemDO::getCategoryId, categoryId); 51 return selectCount(WmsItemDO::getCategoryId, categoryId);
48 } 52 }
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/merchant/WmsMerchantMapper.java
@@ -36,4 +36,12 @@ public interface WmsMerchantMapper extends BaseMapperX<WmsMerchantDO> { @@ -36,4 +36,12 @@ public interface WmsMerchantMapper extends BaseMapperX<WmsMerchantDO> {
36 .orderByDesc(WmsMerchantDO::getId)); 36 .orderByDesc(WmsMerchantDO::getId));
37 } 37 }
38 38
  39 + default WmsMerchantDO selectByCode(String code) {
  40 + return selectOne(WmsMerchantDO::getCode, code);
  41 + }
  42 +
  43 + default WmsMerchantDO selectByName(String name) {
  44 + return selectOne(WmsMerchantDO::getName, name);
  45 + }
  46 +
39 } 47 }
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java
@@ -35,6 +35,7 @@ public interface ErrorCodeConstants { @@ -35,6 +35,7 @@ public interface ErrorCodeConstants {
35 // ========== WMS 基础数据-商品 1-060-104-000 ========== 35 // ========== WMS 基础数据-商品 1-060-104-000 ==========
36 ErrorCode ITEM_NOT_EXISTS = new ErrorCode(1_060_104_000, "商品不存在"); 36 ErrorCode ITEM_NOT_EXISTS = new ErrorCode(1_060_104_000, "商品不存在");
37 ErrorCode ITEM_NAME_DUPLICATE = new ErrorCode(1_060_104_001, "商品名称重复"); 37 ErrorCode ITEM_NAME_DUPLICATE = new ErrorCode(1_060_104_001, "商品名称重复");
  38 + ErrorCode ITEM_CODE_DUPLICATE = new ErrorCode(1_060_104_007, "商品编号重复");
38 ErrorCode ITEM_SKU_REQUIRED = new ErrorCode(1_060_104_002, "至少包含一个商品规格"); 39 ErrorCode ITEM_SKU_REQUIRED = new ErrorCode(1_060_104_002, "至少包含一个商品规格");
39 ErrorCode ITEM_SKU_NAME_DUPLICATE = new ErrorCode(1_060_104_003, "商品规格名称【{}】重复"); 40 ErrorCode ITEM_SKU_NAME_DUPLICATE = new ErrorCode(1_060_104_003, "商品规格名称【{}】重复");
40 ErrorCode ITEM_SKU_NOT_EXISTS = new ErrorCode(1_060_104_004, "商品规格不存在"); 41 ErrorCode ITEM_SKU_NOT_EXISTS = new ErrorCode(1_060_104_004, "商品规格不存在");
@@ -46,6 +47,8 @@ public interface ErrorCodeConstants { @@ -46,6 +47,8 @@ public interface ErrorCodeConstants {
46 ErrorCode MERCHANT_NOT_SUPPLIER = new ErrorCode(1_060_105_001, "往来企业必须是供应商或客户/供应商类型"); 47 ErrorCode MERCHANT_NOT_SUPPLIER = new ErrorCode(1_060_105_001, "往来企业必须是供应商或客户/供应商类型");
47 ErrorCode MERCHANT_NOT_CUSTOMER = new ErrorCode(1_060_105_002, "往来企业必须是客户或客户/供应商类型"); 48 ErrorCode MERCHANT_NOT_CUSTOMER = new ErrorCode(1_060_105_002, "往来企业必须是客户或客户/供应商类型");
48 ErrorCode MERCHANT_HAS_ORDER = new ErrorCode(1_060_105_003, "删除失败!往来企业已被{}使用!"); 49 ErrorCode MERCHANT_HAS_ORDER = new ErrorCode(1_060_105_003, "删除失败!往来企业已被{}使用!");
  50 + ErrorCode MERCHANT_CODE_DUPLICATE = new ErrorCode(1_060_105_004, "往来企业编号重复");
  51 + ErrorCode MERCHANT_NAME_DUPLICATE = new ErrorCode(1_060_105_005, "往来企业名称重复");
49 52
50 // ========== WMS 入库单 1-060-200-000 ========== 53 // ========== WMS 入库单 1-060-200-000 ==========
51 ErrorCode RECEIPT_ORDER_NOT_EXISTS = new ErrorCode(1_060_200_000, "入库单不存在"); 54 ErrorCode RECEIPT_ORDER_NOT_EXISTS = new ErrorCode(1_060_200_000, "入库单不存在");
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemServiceImpl.java
@@ -72,6 +72,8 @@ public class WmsItemServiceImpl implements WmsItemService { @@ -72,6 +72,8 @@ public class WmsItemServiceImpl implements WmsItemService {
72 } 72 }
73 73
74 private void validateItemSaveData(WmsItemSaveReqVO reqVO) { 74 private void validateItemSaveData(WmsItemSaveReqVO reqVO) {
  75 + // 校验商品编号唯一
  76 + validateItemCodeUnique(reqVO.getId(), reqVO.getCode());
75 // 校验商品名称唯一 77 // 校验商品名称唯一
76 validateItemNameUnique(reqVO.getId(), reqVO.getName()); 78 validateItemNameUnique(reqVO.getId(), reqVO.getName());
77 // 校验商品分类存在 79 // 校验商品分类存在
@@ -80,6 +82,16 @@ public class WmsItemServiceImpl implements WmsItemService { @@ -80,6 +82,16 @@ public class WmsItemServiceImpl implements WmsItemService {
80 validateBrandExists(reqVO.getBrandId()); 82 validateBrandExists(reqVO.getBrandId());
81 } 83 }
82 84
  85 + private void validateItemCodeUnique(Long id, String code) {
  86 + WmsItemDO item = itemMapper.selectByCode(code);
  87 + if (item == null) {
  88 + return;
  89 + }
  90 + if (id == null || ObjectUtil.notEqual(item.getId(), id)) {
  91 + throw exception(ITEM_CODE_DUPLICATE);
  92 + }
  93 + }
  94 +
83 private void validateItemNameUnique(Long id, String name) { 95 private void validateItemNameUnique(Long id, String name) {
84 WmsItemDO item = itemMapper.selectByName(name); 96 WmsItemDO item = itemMapper.selectByName(name);
85 if (item == null) { 97 if (item == null) {
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/merchant/WmsMerchantServiceImpl.java
@@ -45,6 +45,9 @@ public class WmsMerchantServiceImpl implements WmsMerchantService { @@ -45,6 +45,9 @@ public class WmsMerchantServiceImpl implements WmsMerchantService {
45 45
46 @Override 46 @Override
47 public Long createMerchant(WmsMerchantSaveReqVO createReqVO) { 47 public Long createMerchant(WmsMerchantSaveReqVO createReqVO) {
  48 + validateMerchantSaveData(null, createReqVO);
  49 +
  50 + // 新增
48 WmsMerchantDO merchant = BeanUtils.toBean(createReqVO, WmsMerchantDO.class); 51 WmsMerchantDO merchant = BeanUtils.toBean(createReqVO, WmsMerchantDO.class);
49 merchantMapper.insert(merchant); 52 merchantMapper.insert(merchant);
50 return merchant.getId(); 53 return merchant.getId();
@@ -54,12 +57,40 @@ public class WmsMerchantServiceImpl implements WmsMerchantService { @@ -54,12 +57,40 @@ public class WmsMerchantServiceImpl implements WmsMerchantService {
54 public void updateMerchant(WmsMerchantSaveReqVO updateReqVO) { 57 public void updateMerchant(WmsMerchantSaveReqVO updateReqVO) {
55 // 校验存在 58 // 校验存在
56 validateMerchantExists(updateReqVO.getId()); 59 validateMerchantExists(updateReqVO.getId());
  60 + validateMerchantSaveData(updateReqVO.getId(), updateReqVO);
57 61
58 // 更新 62 // 更新
59 WmsMerchantDO updateObj = BeanUtils.toBean(updateReqVO, WmsMerchantDO.class); 63 WmsMerchantDO updateObj = BeanUtils.toBean(updateReqVO, WmsMerchantDO.class);
60 merchantMapper.updateById(updateObj); 64 merchantMapper.updateById(updateObj);
61 } 65 }
62 66
  67 + private void validateMerchantSaveData(Long id, WmsMerchantSaveReqVO reqVO) {
  68 + // 校验 code 唯一
  69 + validateMerchantCodeUnique(id, reqVO.getCode());
  70 + // 校验 name 唯一
  71 + validateMerchantNameUnique(id, reqVO.getName());
  72 + }
  73 +
  74 + private void validateMerchantCodeUnique(Long id, String code) {
  75 + WmsMerchantDO merchant = merchantMapper.selectByCode(code);
  76 + if (merchant == null) {
  77 + return;
  78 + }
  79 + if (id == null || ObjectUtil.notEqual(merchant.getId(), id)) {
  80 + throw exception(MERCHANT_CODE_DUPLICATE);
  81 + }
  82 + }
  83 +
  84 + private void validateMerchantNameUnique(Long id, String name) {
  85 + WmsMerchantDO merchant = merchantMapper.selectByName(name);
  86 + if (merchant == null) {
  87 + return;
  88 + }
  89 + if (id == null || ObjectUtil.notEqual(merchant.getId(), id)) {
  90 + throw exception(MERCHANT_NAME_DUPLICATE);
  91 + }
  92 + }
  93 +
63 @Override 94 @Override
64 public void deleteMerchant(Long id) { 95 public void deleteMerchant(Long id) {
65 // 校验存在 96 // 校验存在
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java
@@ -72,7 +72,11 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService { @@ -72,7 +72,11 @@ public class WmsCheckOrderServiceImpl implements WmsCheckOrderService {
72 WmsCheckOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsCheckOrderDO.class) 72 WmsCheckOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsCheckOrderDO.class)
73 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); 73 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus());
74 fillCheckOrderTotal(updateObj, updateReqVO); 74 fillCheckOrderTotal(updateObj, updateReqVO);
75 - checkOrderMapper.updateById(updateObj); 75 + int updateCount = checkOrderMapper.updateByIdAndStatus(updateReqVO.getId(),
  76 + WmsOrderStatusEnum.PREPARE.getStatus(), updateObj);
  77 + if (updateCount == 0) {
  78 + throw exception(CHECK_ORDER_STATUS_NOT_PREPARE);
  79 + }
76 // 2.2 更新盘库单明细 80 // 2.2 更新盘库单明细
77 checkOrderDetailService.updateCheckOrderDetailList(updateReqVO.getId(), updateReqVO); 81 checkOrderDetailService.updateCheckOrderDetailList(updateReqVO.getId(), updateReqVO);
78 } 82 }
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java
@@ -73,7 +73,11 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService { @@ -73,7 +73,11 @@ public class WmsMovementOrderServiceImpl implements WmsMovementOrderService {
73 WmsMovementOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsMovementOrderDO.class) 73 WmsMovementOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsMovementOrderDO.class)
74 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); 74 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus());
75 fillMovementOrderTotal(updateObj, updateReqVO); 75 fillMovementOrderTotal(updateObj, updateReqVO);
76 - movementOrderMapper.updateById(updateObj); 76 + int updateCount = movementOrderMapper.updateByIdAndStatus(updateReqVO.getId(),
  77 + WmsOrderStatusEnum.PREPARE.getStatus(), updateObj);
  78 + if (updateCount == 0) {
  79 + throw exception(MOVEMENT_ORDER_STATUS_NOT_PREPARE);
  80 + }
77 // 2.2 更新移库单明细 81 // 2.2 更新移库单明细
78 movementOrderDetailService.updateMovementOrderDetailList(updateReqVO.getId(), updateReqVO); 82 movementOrderDetailService.updateMovementOrderDetailList(updateReqVO.getId(), updateReqVO);
79 } 83 }
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java
@@ -76,7 +76,11 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService { @@ -76,7 +76,11 @@ public class WmsReceiptOrderServiceImpl implements WmsReceiptOrderService {
76 WmsReceiptOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsReceiptOrderDO.class) 76 WmsReceiptOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsReceiptOrderDO.class)
77 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); 77 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus());
78 fillReceiptOrderTotal(updateObj, updateReqVO); 78 fillReceiptOrderTotal(updateObj, updateReqVO);
79 - receiptOrderMapper.updateById(updateObj); 79 + int updateCount = receiptOrderMapper.updateByIdAndStatus(updateReqVO.getId(),
  80 + WmsOrderStatusEnum.PREPARE.getStatus(), updateObj);
  81 + if (updateCount == 0) {
  82 + throw exception(RECEIPT_ORDER_STATUS_NOT_PREPARE);
  83 + }
80 // 2.2 更新入库单明细 84 // 2.2 更新入库单明细
81 receiptOrderDetailService.updateReceiptOrderDetailList(updateReqVO.getId(), updateReqVO); 85 receiptOrderDetailService.updateReceiptOrderDetailList(updateReqVO.getId(), updateReqVO);
82 } 86 }
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java
@@ -76,7 +76,11 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService { @@ -76,7 +76,11 @@ public class WmsShipmentOrderServiceImpl implements WmsShipmentOrderService {
76 WmsShipmentOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsShipmentOrderDO.class) 76 WmsShipmentOrderDO updateObj = BeanUtils.toBean(updateReqVO, WmsShipmentOrderDO.class)
77 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus()); 77 .setStatus(WmsOrderStatusEnum.PREPARE.getStatus());
78 fillShipmentOrderTotal(updateObj, updateReqVO); 78 fillShipmentOrderTotal(updateObj, updateReqVO);
79 - shipmentOrderMapper.updateById(updateObj); 79 + int updateCount = shipmentOrderMapper.updateByIdAndStatus(updateReqVO.getId(),
  80 + WmsOrderStatusEnum.PREPARE.getStatus(), updateObj);
  81 + if (updateCount == 0) {
  82 + throw exception(SHIPMENT_ORDER_STATUS_NOT_PREPARE);
  83 + }
80 // 2.2 更新出库单明细 84 // 2.2 更新出库单明细
81 shipmentOrderDetailService.updateShipmentOrderDetailList(updateReqVO.getId(), updateReqVO); 85 shipmentOrderDetailService.updateShipmentOrderDetailList(updateReqVO.getId(), updateReqVO);
82 } 86 }
yudao-module-wms/src/test/resources/sql/create_tables.sql
@@ -15,17 +15,17 @@ CREATE TABLE IF NOT EXISTS "wms_warehouse" ( @@ -15,17 +15,17 @@ CREATE TABLE IF NOT EXISTS "wms_warehouse" (
15 15
16 CREATE TABLE IF NOT EXISTS "wms_merchant" ( 16 CREATE TABLE IF NOT EXISTS "wms_merchant" (
17 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 17 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
18 - "code" varchar(20) DEFAULT NULL,  
19 - "name" varchar(50) NOT NULL,  
20 - "type" int NOT NULL,  
21 - "level" varchar(20) DEFAULT NULL,  
22 - "bank_name" varchar(50) DEFAULT NULL,  
23 - "bank_account" varchar(50) DEFAULT NULL,  
24 - "address" varchar(255) DEFAULT NULL,  
25 - "mobile" varchar(20) DEFAULT NULL,  
26 - "telephone" varchar(20) DEFAULT NULL,  
27 - "contact" varchar(20) DEFAULT NULL,  
28 - "email" varchar(64) DEFAULT NULL, 18 + "code" varchar(20) NOT NULL,
  19 + "name" varchar(60) NOT NULL,
  20 + "type" tinyint NOT NULL,
  21 + "level" varchar(10) DEFAULT NULL,
  22 + "bank_name" varchar(255) DEFAULT NULL,
  23 + "bank_account" varchar(40) DEFAULT NULL,
  24 + "address" varchar(200) DEFAULT NULL,
  25 + "mobile" varchar(13) DEFAULT NULL,
  26 + "telephone" varchar(13) DEFAULT NULL,
  27 + "contact" varchar(30) DEFAULT NULL,
  28 + "email" varchar(50) DEFAULT NULL,
29 "remark" varchar(255) DEFAULT NULL, 29 "remark" varchar(255) DEFAULT NULL,
30 "creator" varchar(64) DEFAULT '', 30 "creator" varchar(64) DEFAULT '',
31 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 31 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -39,7 +39,7 @@ CREATE TABLE IF NOT EXISTS "wms_merchant" ( @@ -39,7 +39,7 @@ CREATE TABLE IF NOT EXISTS "wms_merchant" (
39 CREATE TABLE IF NOT EXISTS "wms_item_brand" ( 39 CREATE TABLE IF NOT EXISTS "wms_item_brand" (
40 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 40 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
41 "code" varchar(20) NOT NULL, 41 "code" varchar(20) NOT NULL,
42 - "name" varchar(60) NOT NULL, 42 + "name" varchar(30) NOT NULL,
43 "creator" varchar(64) DEFAULT '', 43 "creator" varchar(64) DEFAULT '',
44 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 44 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
45 "updater" varchar(64) DEFAULT '', 45 "updater" varchar(64) DEFAULT '',
@@ -53,9 +53,9 @@ CREATE TABLE IF NOT EXISTS "wms_item_category" ( @@ -53,9 +53,9 @@ CREATE TABLE IF NOT EXISTS "wms_item_category" (
53 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 53 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
54 "parent_id" bigint NOT NULL DEFAULT '0', 54 "parent_id" bigint NOT NULL DEFAULT '0',
55 "code" varchar(20) NOT NULL, 55 "code" varchar(20) NOT NULL,
56 - "name" varchar(60) NOT NULL, 56 + "name" varchar(30) NOT NULL,
57 "sort" int DEFAULT '0', 57 "sort" int DEFAULT '0',
58 - "status" tinyint NOT NULL DEFAULT '0', 58 + "status" tinyint NOT NULL DEFAULT '1',
59 "creator" varchar(64) DEFAULT '', 59 "creator" varchar(64) DEFAULT '',
60 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 60 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
61 "updater" varchar(64) DEFAULT '', 61 "updater" varchar(64) DEFAULT '',
@@ -67,10 +67,10 @@ CREATE TABLE IF NOT EXISTS "wms_item_category" ( @@ -67,10 +67,10 @@ CREATE TABLE IF NOT EXISTS "wms_item_category" (
67 67
68 CREATE TABLE IF NOT EXISTS "wms_item" ( 68 CREATE TABLE IF NOT EXISTS "wms_item" (
69 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 69 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
70 - "code" varchar(20) NOT NULL, 70 + "code" varchar(20) DEFAULT NULL,
71 "name" varchar(60) NOT NULL, 71 "name" varchar(60) NOT NULL,
72 - "unit" varchar(20) DEFAULT NULL,  
73 "category_id" bigint NOT NULL, 72 "category_id" bigint NOT NULL,
  73 + "unit" varchar(20) DEFAULT NULL,
74 "brand_id" bigint DEFAULT NULL, 74 "brand_id" bigint DEFAULT NULL,
75 "remark" varchar(255) DEFAULT NULL, 75 "remark" varchar(255) DEFAULT NULL,
76 "creator" varchar(64) DEFAULT '', 76 "creator" varchar(64) DEFAULT '',
@@ -108,6 +108,7 @@ CREATE TABLE IF NOT EXISTS "wms_inventory" ( @@ -108,6 +108,7 @@ CREATE TABLE IF NOT EXISTS "wms_inventory" (
108 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 108 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
109 "sku_id" bigint NOT NULL, 109 "sku_id" bigint NOT NULL,
110 "warehouse_id" bigint NOT NULL, 110 "warehouse_id" bigint NOT NULL,
  111 + "area_id" bigint NOT NULL DEFAULT '0',
111 "quantity" decimal(20, 2) NOT NULL DEFAULT '0', 112 "quantity" decimal(20, 2) NOT NULL DEFAULT '0',
112 "remark" varchar(255) DEFAULT NULL, 113 "remark" varchar(255) DEFAULT NULL,
113 "creator" varchar(64) DEFAULT '', 114 "creator" varchar(64) DEFAULT '',
@@ -117,22 +118,26 @@ CREATE TABLE IF NOT EXISTS "wms_inventory" ( @@ -117,22 +118,26 @@ CREATE TABLE IF NOT EXISTS "wms_inventory" (
117 "deleted" bit NOT NULL DEFAULT FALSE, 118 "deleted" bit NOT NULL DEFAULT FALSE,
118 "tenant_id" bigint NOT NULL DEFAULT '0', 119 "tenant_id" bigint NOT NULL DEFAULT '0',
119 PRIMARY KEY ("id"), 120 PRIMARY KEY ("id"),
120 - CONSTRAINT "uk_wms_inventory_sku_warehouse" UNIQUE ("sku_id", "warehouse_id", "tenant_id", "deleted") 121 + CONSTRAINT "uk_sku_id_warehouse_id" UNIQUE ("sku_id", "warehouse_id")
121 ) COMMENT 'WMS 库存表'; 122 ) COMMENT 'WMS 库存表';
122 123
123 CREATE TABLE IF NOT EXISTS "wms_inventory_history" ( 124 CREATE TABLE IF NOT EXISTS "wms_inventory_history" (
124 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 125 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
125 "warehouse_id" bigint NOT NULL, 126 "warehouse_id" bigint NOT NULL,
  127 + "area_id" bigint NOT NULL DEFAULT '0',
126 "sku_id" bigint NOT NULL, 128 "sku_id" bigint NOT NULL,
127 "quantity" decimal(20, 2) NOT NULL DEFAULT '0', 129 "quantity" decimal(20, 2) NOT NULL DEFAULT '0',
128 "before_quantity" decimal(20, 2) DEFAULT NULL, 130 "before_quantity" decimal(20, 2) DEFAULT NULL,
129 "after_quantity" decimal(20, 2) DEFAULT NULL, 131 "after_quantity" decimal(20, 2) DEFAULT NULL,
  132 + "batch_no" varchar(64) DEFAULT NULL,
  133 + "production_date" timestamp DEFAULT NULL,
  134 + "expiration_date" timestamp DEFAULT NULL,
130 "price" decimal(16, 2) DEFAULT NULL, 135 "price" decimal(16, 2) DEFAULT NULL,
131 "total_price" decimal(16, 2) DEFAULT NULL, 136 "total_price" decimal(16, 2) DEFAULT NULL,
132 "remark" varchar(255) DEFAULT NULL, 137 "remark" varchar(255) DEFAULT NULL,
133 "order_id" bigint DEFAULT NULL, 138 "order_id" bigint DEFAULT NULL,
134 "order_no" varchar(64) DEFAULT NULL, 139 "order_no" varchar(64) DEFAULT NULL,
135 - "order_type" tinyint DEFAULT NULL, 140 + "order_type" int DEFAULT NULL,
136 "creator" varchar(64) DEFAULT '', 141 "creator" varchar(64) DEFAULT '',
137 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 142 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
138 "updater" varchar(64) DEFAULT '', 143 "updater" varchar(64) DEFAULT '',
@@ -152,6 +157,7 @@ CREATE TABLE IF NOT EXISTS "wms_receipt_order" ( @@ -152,6 +157,7 @@ CREATE TABLE IF NOT EXISTS "wms_receipt_order" (
152 "merchant_id" bigint DEFAULT NULL, 157 "merchant_id" bigint DEFAULT NULL,
153 "remark" varchar(255) DEFAULT NULL, 158 "remark" varchar(255) DEFAULT NULL,
154 "warehouse_id" bigint NOT NULL, 159 "warehouse_id" bigint NOT NULL,
  160 + "area_id" bigint NOT NULL DEFAULT '0',
155 "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0', 161 "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0',
156 "total_price" decimal(16, 2) DEFAULT NULL, 162 "total_price" decimal(16, 2) DEFAULT NULL,
157 "creator" varchar(64) DEFAULT '', 163 "creator" varchar(64) DEFAULT '',
@@ -168,6 +174,10 @@ CREATE TABLE IF NOT EXISTS "wms_receipt_order_detail" ( @@ -168,6 +174,10 @@ CREATE TABLE IF NOT EXISTS "wms_receipt_order_detail" (
168 "order_id" bigint NOT NULL, 174 "order_id" bigint NOT NULL,
169 "sku_id" bigint NOT NULL, 175 "sku_id" bigint NOT NULL,
170 "warehouse_id" bigint NOT NULL, 176 "warehouse_id" bigint NOT NULL,
  177 + "area_id" bigint NOT NULL DEFAULT '0',
  178 + "batch_no" varchar(64) DEFAULT NULL,
  179 + "production_date" timestamp DEFAULT NULL,
  180 + "expiration_date" timestamp DEFAULT NULL,
171 "quantity" decimal(20, 2) NOT NULL DEFAULT '0', 181 "quantity" decimal(20, 2) NOT NULL DEFAULT '0',
172 "price" decimal(16, 2) DEFAULT NULL, 182 "price" decimal(16, 2) DEFAULT NULL,
173 "total_price" decimal(16, 2) DEFAULT NULL, 183 "total_price" decimal(16, 2) DEFAULT NULL,
@@ -190,6 +200,7 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order" ( @@ -190,6 +200,7 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order" (
190 "merchant_id" bigint DEFAULT NULL, 200 "merchant_id" bigint DEFAULT NULL,
191 "remark" varchar(255) DEFAULT NULL, 201 "remark" varchar(255) DEFAULT NULL,
192 "warehouse_id" bigint NOT NULL, 202 "warehouse_id" bigint NOT NULL,
  203 + "area_id" bigint NOT NULL DEFAULT '0',
193 "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0', 204 "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0',
194 "total_price" decimal(16, 2) DEFAULT NULL, 205 "total_price" decimal(16, 2) DEFAULT NULL,
195 "creator" varchar(64) DEFAULT '', 206 "creator" varchar(64) DEFAULT '',
@@ -206,6 +217,11 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order_detail" ( @@ -206,6 +217,11 @@ CREATE TABLE IF NOT EXISTS "wms_shipment_order_detail" (
206 "order_id" bigint NOT NULL, 217 "order_id" bigint NOT NULL,
207 "sku_id" bigint NOT NULL, 218 "sku_id" bigint NOT NULL,
208 "warehouse_id" bigint NOT NULL, 219 "warehouse_id" bigint NOT NULL,
  220 + "area_id" bigint NOT NULL DEFAULT '0',
  221 + "inventory_detail_id" bigint DEFAULT NULL,
  222 + "batch_no" varchar(64) DEFAULT NULL,
  223 + "production_date" timestamp DEFAULT NULL,
  224 + "expiration_date" timestamp DEFAULT NULL,
209 "quantity" decimal(20, 2) NOT NULL DEFAULT '0', 225 "quantity" decimal(20, 2) NOT NULL DEFAULT '0',
210 "price" decimal(16, 2) DEFAULT NULL, 226 "price" decimal(16, 2) DEFAULT NULL,
211 "total_price" decimal(16, 2) DEFAULT NULL, 227 "total_price" decimal(16, 2) DEFAULT NULL,
@@ -243,6 +259,10 @@ CREATE TABLE IF NOT EXISTS "wms_movement_order_detail" ( @@ -243,6 +259,10 @@ CREATE TABLE IF NOT EXISTS "wms_movement_order_detail" (
243 "sku_id" bigint NOT NULL, 259 "sku_id" bigint NOT NULL,
244 "source_warehouse_id" bigint NOT NULL, 260 "source_warehouse_id" bigint NOT NULL,
245 "target_warehouse_id" bigint NOT NULL, 261 "target_warehouse_id" bigint NOT NULL,
  262 + "inventory_detail_id" bigint DEFAULT NULL,
  263 + "batch_no" varchar(64) DEFAULT NULL,
  264 + "production_date" timestamp DEFAULT NULL,
  265 + "expiration_date" timestamp DEFAULT NULL,
246 "quantity" decimal(20, 2) NOT NULL DEFAULT '0', 266 "quantity" decimal(20, 2) NOT NULL DEFAULT '0',
247 "price" decimal(16, 2) DEFAULT NULL, 267 "price" decimal(16, 2) DEFAULT NULL,
248 "total_price" decimal(16, 2) DEFAULT NULL, 268 "total_price" decimal(16, 2) DEFAULT NULL,
@@ -262,6 +282,7 @@ CREATE TABLE IF NOT EXISTS "wms_check_order" ( @@ -262,6 +282,7 @@ CREATE TABLE IF NOT EXISTS "wms_check_order" (
262 "status" int NOT NULL DEFAULT '0', 282 "status" int NOT NULL DEFAULT '0',
263 "remark" varchar(255) DEFAULT NULL, 283 "remark" varchar(255) DEFAULT NULL,
264 "warehouse_id" bigint NOT NULL, 284 "warehouse_id" bigint NOT NULL,
  285 + "area_id" bigint NOT NULL DEFAULT '0',
265 "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0', 286 "total_quantity" decimal(20, 2) NOT NULL DEFAULT '0',
266 "total_price" decimal(16, 2) DEFAULT NULL, 287 "total_price" decimal(16, 2) DEFAULT NULL,
267 "actual_price" decimal(16, 2) DEFAULT NULL, 288 "actual_price" decimal(16, 2) DEFAULT NULL,
@@ -279,7 +300,12 @@ CREATE TABLE IF NOT EXISTS "wms_check_order_detail" ( @@ -279,7 +300,12 @@ CREATE TABLE IF NOT EXISTS "wms_check_order_detail" (
279 "order_id" bigint NOT NULL, 300 "order_id" bigint NOT NULL,
280 "sku_id" bigint NOT NULL, 301 "sku_id" bigint NOT NULL,
281 "warehouse_id" bigint NOT NULL, 302 "warehouse_id" bigint NOT NULL,
  303 + "area_id" bigint NOT NULL DEFAULT '0',
282 "inventory_id" bigint DEFAULT NULL, 304 "inventory_id" bigint DEFAULT NULL,
  305 + "inventory_detail_id" bigint DEFAULT NULL,
  306 + "batch_no" varchar(64) DEFAULT NULL,
  307 + "production_date" timestamp DEFAULT NULL,
  308 + "expiration_date" timestamp DEFAULT NULL,
283 "receipt_time" timestamp DEFAULT NULL, 309 "receipt_time" timestamp DEFAULT NULL,
284 "quantity" decimal(20, 2) NOT NULL DEFAULT '0', 310 "quantity" decimal(20, 2) NOT NULL DEFAULT '0',
285 "check_quantity" decimal(20, 2) NOT NULL DEFAULT '0', 311 "check_quantity" decimal(20, 2) NOT NULL DEFAULT '0',