admin/sql/migrate_t_order_stock_bind.sql
zzh dc3071c90d feat: 物流单绑定包裹/库存(冻结可用库存)
支持我的订单对已创建物流单绑定仓储资源:新增 t_order_stock_bind 与 stock-bind API,库存/包裹增加 FrozenQty、AvailableQty。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 10:32:44 +08:00

93 lines
3.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 物流单绑定包裹/库存:t_order_stock_bind + C_inventory/C_parcel_item 冻结与可用字段
-- 见 oms系统设计-050801.md §4.2.11 / §4.4.6
-- 可重复执行
CREATE TABLE IF NOT EXISTS `t_order_stock_bind` (
`Id` INT NOT NULL AUTO_INCREMENT,
`OrderId` INT NOT NULL COMMENT '物流单 t_order.Id',
`CustomerId` INT NOT NULL COMMENT '客户隔离键',
`WarehouseId` INT NOT NULL COMMENT '仓库',
`BindType` VARCHAR(20) NOT NULL COMMENT 'inventory / parcelItem',
`SkuId` INT NULL COMMENT 'SKU',
`InventoryId` INT NULL COMMENT 'C_inventory.Id,可空=按SKU分摊',
`BinLocationId` INT NULL COMMENT '库位快照',
`ParcelId` INT NULL COMMENT 'C_parcel.Id',
`ParcelItemId` INT NULL COMMENT 'C_parcel_item.Id',
`BindQty` INT NOT NULL COMMENT '绑定数量',
`Status` VARCHAR(20) NOT NULL DEFAULT 'bound' COMMENT 'bound/deducted/released',
`SkuCode` VARCHAR(64) NULL,
`SkuName` VARCHAR(128) NULL,
`TrackingNo` VARCHAR(64) NULL,
`ProductName` VARCHAR(256) NULL,
`ImageUrl` VARCHAR(512) NULL,
`AttributeText` VARCHAR(256) NULL,
`Remark` VARCHAR(512) NULL,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL,
`CreateTime` DATETIME NOT NULL,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
KEY `idx_osb_order` (`OrderId`, `IsDeleted`, `Status`),
KEY `idx_osb_parcel_item` (`ParcelItemId`, `Status`, `IsDeleted`),
KEY `idx_osb_sku` (`CustomerId`, `WarehouseId`, `SkuId`, `Status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物流单仓储绑定明细';
-- C_inventory.FrozenQty
SET @col_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'C_inventory' AND COLUMN_NAME = 'FrozenQty'
);
SET @sql := IF(
@col_exists = 0,
'ALTER TABLE `C_inventory` ADD COLUMN `FrozenQty` INT NOT NULL DEFAULT 0 COMMENT ''冻结数量'' AFTER `Qty`',
'SELECT ''C_inventory.FrozenQty already exists'' AS info'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- C_inventory.AvailableQty
SET @col_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'C_inventory' AND COLUMN_NAME = 'AvailableQty'
);
SET @sql := IF(
@col_exists = 0,
'ALTER TABLE `C_inventory` ADD COLUMN `AvailableQty` INT NOT NULL DEFAULT 0 COMMENT ''可用=Qty-FrozenQty'' AFTER `FrozenQty`',
'SELECT ''C_inventory.AvailableQty already exists'' AS info'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
UPDATE `C_inventory`
SET `AvailableQty` = GREATEST(0, `Qty` - IFNULL(`FrozenQty`, 0))
WHERE `AvailableQty` <> GREATEST(0, `Qty` - IFNULL(`FrozenQty`, 0))
OR (`AvailableQty` = 0 AND `Qty` > 0 AND IFNULL(`FrozenQty`, 0) = 0);
-- C_parcel_item.FrozenQty
SET @col_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'C_parcel_item' AND COLUMN_NAME = 'FrozenQty'
);
SET @sql := IF(
@col_exists = 0,
'ALTER TABLE `C_parcel_item` ADD COLUMN `FrozenQty` INT NOT NULL DEFAULT 0 COMMENT ''冻结数量'' AFTER `Quantity`',
'SELECT ''C_parcel_item.FrozenQty already exists'' AS info'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- C_parcel_item.AvailableQty
SET @col_exists := (
SELECT COUNT(1) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'C_parcel_item' AND COLUMN_NAME = 'AvailableQty'
);
SET @sql := IF(
@col_exists = 0,
'ALTER TABLE `C_parcel_item` ADD COLUMN `AvailableQty` INT NOT NULL DEFAULT 0 COMMENT ''可用=Quantity-FrozenQty'' AFTER `FrozenQty`',
'SELECT ''C_parcel_item.AvailableQty already exists'' AS info'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
UPDATE `C_parcel_item`
SET `AvailableQty` = GREATEST(0, `Quantity` - IFNULL(`FrozenQty`, 0))
WHERE `AvailableQty` <> GREATEST(0, `Quantity` - IFNULL(`FrozenQty`, 0))
OR (`AvailableQty` = 0 AND `Quantity` > 0 AND IFNULL(`FrozenQty`, 0) = 0);