优化
This commit is contained in:
@@ -15,9 +15,8 @@ CREATE TABLE IF NOT EXISTS wh_pallet (
|
||||
pallet_type VARCHAR(32) NOT NULL COMMENT '托盘类型',
|
||||
pallet_name VARCHAR(100) NULL COMMENT '托盘名称',
|
||||
capacity_cbm DECIMAL(18,6) NOT NULL COMMENT '托盘可用容积CBM',
|
||||
weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT '托盘重量kg',
|
||||
weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT '托盘皮重kg',
|
||||
color VARCHAR(32) NOT NULL DEFAULT '' COMMENT '托盘颜色',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'AVAILABLE' COMMENT '内部状态:AVAILABLE、RESERVED或OCCUPIED',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
created_by BIGINT UNSIGNED NOT NULL COMMENT '创建人ID',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||||
@@ -27,11 +26,11 @@ CREATE TABLE IF NOT EXISTS wh_pallet (
|
||||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_pallet_tenant_code (tenant_id, pallet_code),
|
||||
KEY idx_pallet_available (tenant_id, warehouse_id, status, deleted),
|
||||
KEY idx_pallet_type (tenant_id, warehouse_id, pallet_type, status, deleted),
|
||||
KEY idx_pallet_warehouse (tenant_id, warehouse_id, deleted, pallet_code),
|
||||
KEY idx_pallet_type (tenant_id, warehouse_id, pallet_type, capacity_cbm, deleted),
|
||||
CONSTRAINT fk_pallet_warehouse FOREIGN KEY (warehouse_id) REFERENCES wh_warehouse (id),
|
||||
CONSTRAINT ck_pallet_capacity CHECK (capacity_cbm > 0)
|
||||
) ENGINE=InnoDB COMMENT='二期托盘基础资料和物理托盘实例';
|
||||
) ENGINE=InnoDB COMMENT='可复用托盘标识和称重主数据,不承载动态资源状态';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS wh_location (
|
||||
id BIGINT UNSIGNED NOT NULL COMMENT '库位ID(雪花ID)',
|
||||
@@ -84,19 +83,17 @@ CREATE TABLE IF NOT EXISTS wh_location_reservation (
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
||||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||||
active_reservation TINYINT GENERATED ALWAYS AS (CASE WHEN reservation_status = 'RESERVED' AND shared_overflow = 0 THEN 1 ELSE NULL END) STORED COMMENT '普通库位活动预占唯一标记,A0 返回 NULL',
|
||||
active_pallet_reservation TINYINT GENERATED ALWAYS AS (CASE WHEN reservation_status = 'RESERVED' THEN 1 ELSE NULL END) STORED COMMENT '托盘活动预占唯一标记(包含A0)',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_location_reservation_no (tenant_id, reservation_no),
|
||||
UNIQUE KEY uk_location_reservation_idempotency (tenant_id, source_service, idempotency_key),
|
||||
UNIQUE KEY uk_location_active_reservation (tenant_id, location_id, active_reservation),
|
||||
UNIQUE KEY uk_pallet_active_reservation (tenant_id, pallet_id, active_pallet_reservation),
|
||||
KEY idx_location_reservation_business (tenant_id, source_service, business_id, reservation_status),
|
||||
KEY idx_location_reservation_expire (reservation_status, expires_at),
|
||||
KEY idx_location_reservation_target (tenant_id, warehouse_id, location_id, reservation_status),
|
||||
CONSTRAINT fk_reservation_warehouse FOREIGN KEY (warehouse_id) REFERENCES wh_warehouse (id),
|
||||
CONSTRAINT fk_reservation_pallet FOREIGN KEY (pallet_id) REFERENCES wh_pallet (id),
|
||||
CONSTRAINT fk_reservation_location FOREIGN KEY (location_id) REFERENCES wh_location (id)
|
||||
) ENGINE=InnoDB COMMENT='跨服务入库Saga的托盘和库位临时预占';
|
||||
) ENGINE=InnoDB COMMENT='跨服务入库Saga的库位临时预占,托盘字段仅为主数据快照';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS wh_location_occupancy (
|
||||
id BIGINT UNSIGNED NOT NULL COMMENT '库位占用ID',
|
||||
@@ -123,12 +120,10 @@ CREATE TABLE IF NOT EXISTS wh_location_occupancy (
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
||||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
||||
active_location_occupancy TINYINT GENERATED ALWAYS AS (CASE WHEN occupancy_status = 'OCCUPIED' AND shared_overflow = 0 THEN 1 ELSE NULL END) STORED COMMENT '普通库位活动占用唯一标记',
|
||||
active_pallet_occupancy TINYINT GENERATED ALWAYS AS (CASE WHEN occupancy_status = 'OCCUPIED' THEN 1 ELSE NULL END) STORED COMMENT '托盘活动占用唯一标记(包含A0)',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_location_occupancy_no (tenant_id, occupancy_no),
|
||||
UNIQUE KEY uk_occupancy_reservation (tenant_id, reservation_id),
|
||||
UNIQUE KEY uk_location_active_occupancy (tenant_id, location_id, active_location_occupancy),
|
||||
UNIQUE KEY uk_pallet_active_occupancy (tenant_id, pallet_id, active_pallet_occupancy),
|
||||
KEY idx_occupancy_business (tenant_id, source_service, business_id, occupancy_status),
|
||||
KEY idx_occupancy_warehouse (tenant_id, warehouse_id, occupancy_status, occupied_at),
|
||||
CONSTRAINT fk_occupancy_reservation FOREIGN KEY (reservation_id) REFERENCES wh_location_reservation (id),
|
||||
@@ -136,6 +131,6 @@ CREATE TABLE IF NOT EXISTS wh_location_occupancy (
|
||||
CONSTRAINT fk_occupancy_pallet FOREIGN KEY (pallet_id) REFERENCES wh_pallet (id),
|
||||
CONSTRAINT fk_occupancy_location FOREIGN KEY (location_id) REFERENCES wh_location (id),
|
||||
CONSTRAINT ck_occupancy_volume CHECK (allocated_volume_cbm > 0)
|
||||
) ENGINE=InnoDB COMMENT='已确认的一托一库位占用事实记录';
|
||||
) ENGINE=InnoDB COMMENT='已确认的库位占用事实记录,托盘字段仅为主数据快照';
|
||||
|
||||
-- 头程入库单属于其他数据库,不建立跨库外键。
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
SET NAMES utf8mb4;
|
||||
USE baiyue_warehouse;
|
||||
|
||||
-- 编码由平台维护接口自动生成;两个国内作业仓各初始化一个可用托盘。
|
||||
INSERT INTO wh_pallet(id,tenant_id,warehouse_id,pallet_code,pallet_type,capacity_cbm,weight_kg,color,status,remark,created_by,updated_by)
|
||||
-- 编码由平台维护接口自动生成;两个国内作业仓各初始化一条可复用托盘主数据。
|
||||
INSERT INTO wh_pallet(id,tenant_id,warehouse_id,pallet_code,pallet_type,capacity_cbm,weight_kg,color,remark,created_by,updated_by)
|
||||
VALUES
|
||||
(190000000000000101,0,190000000000000001,'TP-001','木托盘',1.200000,8.000,'黄色','AVAILABLE',NULL,0,0),
|
||||
(190000000000000102,0,190000000000000002,'TP-002','胶托盘',2.400000,12.000,'黑色','AVAILABLE',NULL,0,0)
|
||||
(190000000000000101,0,190000000000000001,'TP-001','木托盘',1.200000,8.000,'黄色',NULL,0,0),
|
||||
(190000000000000102,0,190000000000000002,'TP-002','胶托盘',2.400000,12.000,'黑色',NULL,0,0)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
tenant_id=0,
|
||||
warehouse_id=VALUES(warehouse_id),
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
openapi: 3.0.3
|
||||
info:
|
||||
title: Warehouse Pallet API
|
||||
version: 1.0.0
|
||||
description: 托盘是可复用标识和称重主数据,不承载 AVAILABLE、RESERVED 或 OCCUPIED 动态状态。
|
||||
paths:
|
||||
/internal/warehouse/v1/pallets/{palletId}/snapshot:
|
||||
get:
|
||||
summary: 查询单条托盘主数据快照
|
||||
description: 固定使用平台公共作用域 tenant_id=0,并按 warehouseId 校验归属;不返回状态或可用性。
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/InternalToken'
|
||||
- { in: path, name: palletId, required: true, schema: { type: integer, format: int64, minimum: 1 } }
|
||||
- { in: query, name: warehouseId, required: true, schema: { type: integer, format: int64, minimum: 1 } }
|
||||
responses:
|
||||
'200':
|
||||
description: 业务响应;不存在或归属不符时 body code 为 A0404
|
||||
content: { application/json: { schema: { $ref: '#/components/schemas/PalletSnapshotResponse' } } }
|
||||
/internal/warehouse/v1/pallets/snapshots:
|
||||
get:
|
||||
summary: 查询仓库全部托盘主数据快照
|
||||
description: 固定使用平台公共作用域 tenant_id=0,返回该仓全部未删除主数据,不按状态或占用过滤。
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/InternalToken'
|
||||
- { in: query, name: warehouseId, required: true, schema: { type: integer, format: int64, minimum: 1 } }
|
||||
responses:
|
||||
'200':
|
||||
description: 业务响应
|
||||
content: { application/json: { schema: { $ref: '#/components/schemas/PalletSnapshotListResponse' } } }
|
||||
components:
|
||||
parameters:
|
||||
InternalToken:
|
||||
in: header
|
||||
name: X-Internal-Service-Token
|
||||
required: true
|
||||
schema: { type: string }
|
||||
schemas:
|
||||
PalletSnapshot:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
required: [palletId, palletCode, palletType, capacityCbm, tareWeightKg]
|
||||
properties:
|
||||
palletId: { type: integer, format: int64 }
|
||||
palletCode: { type: string }
|
||||
palletType: { type: string }
|
||||
capacityCbm: { type: number }
|
||||
tareWeightKg: { type: number }
|
||||
ApiEnvelope:
|
||||
type: object
|
||||
required: [code, message, timestamp]
|
||||
properties:
|
||||
code: { type: string, example: '200' }
|
||||
message: { type: string }
|
||||
requestId: { type: string, nullable: true }
|
||||
traceId: { type: string, nullable: true }
|
||||
timestamp: { type: string, format: date-time }
|
||||
PalletSnapshotResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiEnvelope' }
|
||||
- type: object
|
||||
required: [data]
|
||||
properties:
|
||||
data: { $ref: '#/components/schemas/PalletSnapshot' }
|
||||
PalletSnapshotListResponse:
|
||||
allOf:
|
||||
- { $ref: '#/components/schemas/ApiEnvelope' }
|
||||
- type: object
|
||||
required: [data]
|
||||
properties:
|
||||
data:
|
||||
type: array
|
||||
items: { $ref: '#/components/schemas/PalletSnapshot' }
|
||||
Reference in New Issue
Block a user