157 lines
11 KiB
SQL
157 lines
11 KiB
SQL
SET NAMES utf8mb4;
|
|
CREATE TABLE IF NOT EXISTS fl_truck_appointment (
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '拖车预约ID',
|
|
appointment_no VARCHAR(40) NOT NULL COMMENT '平台拖车预约编号',
|
|
outbound_order_id BIGINT UNSIGNED NULL COMMENT '关联头程订单逻辑ID;不跨库建外键',
|
|
ocean_booking_id BIGINT UNSIGNED NULL COMMENT '关联海运订舱逻辑ID',
|
|
container_booking_id BIGINT UNSIGNED NULL COMMENT '关联柜次逻辑ID;拖车完成供装柜门禁校验',
|
|
loading_plan_id BIGINT UNSIGNED NULL COMMENT '关联装柜计划逻辑ID',
|
|
warehouse_id BIGINT UNSIGNED NULL COMMENT '预约到仓的国内收货仓逻辑ID',
|
|
customer_id BIGINT UNSIGNED NULL COMMENT '客户ID和数据隔离键',
|
|
customer_name VARCHAR(128) NULL COMMENT '客户名称快照',
|
|
carrier_id BIGINT UNSIGNED NULL COMMENT '拖车服务商逻辑ID',
|
|
carrier_name VARCHAR(128) NULL COMMENT '拖车服务商名称快照',
|
|
bill_of_lading_no VARCHAR(128) NULL COMMENT '派车提单号快照;关联RELEASED订舱时由订舱事实源冻结',
|
|
fleet_contact VARCHAR(64) NULL COMMENT '车队联系人',
|
|
fleet_phone VARCHAR(32) NULL COMMENT '车队联系电话',
|
|
driver_name VARCHAR(64) NULL COMMENT '司机姓名',
|
|
driver_phone VARCHAR(32) NULL COMMENT '司机联系电话',
|
|
driver_id_card VARCHAR(32) NULL COMMENT '司机身份证号;平台内部敏感信息',
|
|
vehicle_no VARCHAR(32) NULL COMMENT '车辆车牌号',
|
|
store_name VARCHAR(128) NULL COMMENT '到仓装柜地点名称快照',
|
|
store_contact VARCHAR(64) NULL COMMENT '到仓地点联系人快照',
|
|
store_phone VARCHAR(32) NULL COMMENT '到仓地点联系电话快照',
|
|
store_address VARCHAR(255) NULL COMMENT '到仓装柜地点地址快照',
|
|
store_city VARCHAR(64) NULL COMMENT '到仓地点城市快照',
|
|
store_zipcode VARCHAR(16) NULL COMMENT '到仓地点邮编快照',
|
|
package_count INT UNSIGNED NULL COMMENT '预约货物包装件数快照',
|
|
gross_weight_kg DECIMAL(18,3) NULL COMMENT '预约货物毛重,单位千克',
|
|
volume_cbm DECIMAL(18,4) NULL COMMENT '预约货物体积,单位立方米',
|
|
pallet_count INT UNSIGNED NULL COMMENT '预约托盘数量',
|
|
po_no VARCHAR(255) NULL COMMENT '关联采购单号或客户PO号',
|
|
planned_loading_at DATETIME(3) NULL COMMENT '预约到仓装柜时间',
|
|
actual_arrived_warehouse_at DATETIME(3) NULL COMMENT '车辆实际到达收货仓时间',
|
|
actual_loading_at DATETIME(3) NULL COMMENT '实际开始装柜时间',
|
|
actual_departed_at DATETIME(3) NULL COMMENT '车辆实际离仓时间;DEPARTED后供LOADED门禁使用',
|
|
transit_minutes INT UNSIGNED NULL COMMENT '从到仓到离仓的运输作业耗时,单位分钟',
|
|
payable_amount DECIMAL(18,2) NULL COMMENT '应付拖车服务商金额;币种由currency指定',
|
|
receivable_amount DECIMAL(18,2) NULL COMMENT '向客户收取的拖车金额;币种由currency指定',
|
|
currency VARCHAR(8) NOT NULL DEFAULT 'RMB' COMMENT '金额币种;首期默认RMB',
|
|
status VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '拖车预约状态:DRAFT草稿、PENDING_DISPATCH待派车、DISPATCHED已派车、PICKUP_IN_PROGRESS提货中、ARRIVED_WAREHOUSE已到仓、LOADING装柜中、DEPARTED已离仓、COMPLETED已完成、RESCHEDULED已改约、EXCEPTION异常、CANCELLED已取消',
|
|
revision INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '拖车预约业务修订号;每次状态或改约递增',
|
|
version INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
|
remark VARCHAR(1000) NULL COMMENT '平台内部备注或异常说明',
|
|
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '拖车预约创建时间',
|
|
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '拖车预约最后更新时间',
|
|
PRIMARY KEY(id), UNIQUE KEY uk_truck_appointment_no(appointment_no),
|
|
KEY idx_truck_appointment_status(status,updated_at), KEY idx_truck_appointment_container(container_booking_id), KEY idx_truck_appointment_customer(customer_id),
|
|
CONSTRAINT chk_truck_appointment_status CHECK(status IN ('DRAFT','PENDING_DISPATCH','DISPATCHED','PICKUP_IN_PROGRESS','ARRIVED_WAREHOUSE','LOADING','DEPARTED','COMPLETED','RESCHEDULED','EXCEPTION','CANCELLED'))
|
|
) ENGINE=InnoDB COMMENT='三期拖车预约派车聚合';
|
|
CREATE TABLE IF NOT EXISTS fl_truck_appointment_history (
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '拖车预约历史ID', appointment_id BIGINT UNSIGNED NOT NULL COMMENT '所属拖车预约ID', revision INT UNSIGNED NOT NULL COMMENT '该预约业务修订号', action VARCHAR(32) NOT NULL COMMENT '触发状态或改约的业务动作',
|
|
from_status VARCHAR(32) NULL COMMENT '变更前拖车状态;创建时为空', to_status VARCHAR(32) NULL COMMENT '变更后拖车状态;改约时可保持原状态', reason VARCHAR(500) NULL COMMENT '状态或改约原因', operator_id BIGINT UNSIGNED NOT NULL COMMENT '执行操作的平台用户ID',
|
|
operator_name VARCHAR(64) NULL COMMENT '操作人姓名快照', request_id VARCHAR(128) NULL COMMENT '请求链路中的请求ID', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '历史记录创建时间', PRIMARY KEY(id), KEY idx_truck_history(appointment_id,revision)
|
|
) ENGINE=InnoDB COMMENT='拖车状态与改约历史';
|
|
CREATE TABLE IF NOT EXISTS fl_truck_appointment_attachment (
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '拖车附件关系ID', appointment_id BIGINT UNSIGNED NOT NULL COMMENT '所属拖车预约ID', file_id BIGINT UNSIGNED NOT NULL COMMENT 'File服务文件逻辑ID', attachment_type VARCHAR(32) NOT NULL COMMENT '附件类型:BILL_OF_LADING提单、DISPATCH_ORDER派车单、DRIVER_DOCUMENT司机证件、VEHICLE_DOCUMENT车辆证件、OTHER其他',
|
|
file_name VARCHAR(255) NULL COMMENT '上传时文件名快照', file_hash CHAR(64) NULL COMMENT '文件内容SHA-256摘要', visibility VARCHAR(24) NOT NULL DEFAULT 'INTERNAL' COMMENT '可见范围:INTERNAL仅平台内部、CLIENT客户可见', uploaded_by BIGINT UNSIGNED NOT NULL COMMENT '上传操作人ID',
|
|
uploaded_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '附件上传时间', PRIMARY KEY(id), UNIQUE KEY uk_truck_attachment(appointment_id,file_id), KEY idx_truck_attachment(appointment_id), CONSTRAINT chk_truck_attachment_type CHECK(attachment_type IN ('BILL_OF_LADING','DISPATCH_ORDER','DRIVER_DOCUMENT','VEHICLE_DOCUMENT','OTHER'))
|
|
) ENGINE=InnoDB COMMENT='拖车附件文件引用';
|
|
CREATE TABLE IF NOT EXISTS fl_truck_appointment_operation (
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '拖车写操作幂等记录ID', appointment_id BIGINT UNSIGNED NOT NULL COMMENT '所属拖车预约ID', idempotency_key VARCHAR(128) NOT NULL COMMENT '客户端写操作幂等键', request_hash CHAR(64) NOT NULL COMMENT '规范化请求内容SHA-256摘要;用于识别同键不同请求',
|
|
action VARCHAR(32) NOT NULL COMMENT '执行的拖车业务动作', response_snapshot JSON NULL COMMENT '成功响应JSON快照;供相同幂等请求重放', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '幂等记录创建时间', PRIMARY KEY(id), UNIQUE KEY uk_truck_operation(idempotency_key), KEY idx_truck_operation_appointment(appointment_id)
|
|
) ENGINE=InnoDB COMMENT='拖车操作幂等记录';
|
|
|
|
DROP PROCEDURE IF EXISTS phase3_truck_add_column;
|
|
DELIMITER $$
|
|
CREATE PROCEDURE phase3_truck_add_column(
|
|
IN p_column_name VARCHAR(64), IN p_definition TEXT
|
|
)
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE table_schema = DATABASE()
|
|
AND table_name = 'fl_truck_appointment'
|
|
AND column_name = p_column_name
|
|
) THEN
|
|
SET @phase3_truck_ddl = CONCAT(
|
|
'ALTER TABLE fl_truck_appointment ADD COLUMN `', p_column_name, '` ', p_definition
|
|
);
|
|
PREPARE phase3_truck_stmt FROM @phase3_truck_ddl;
|
|
EXECUTE phase3_truck_stmt;
|
|
DEALLOCATE PREPARE phase3_truck_stmt;
|
|
END IF;
|
|
END$$
|
|
DELIMITER ;
|
|
|
|
CALL phase3_truck_add_column(
|
|
'bill_of_lading_no',
|
|
'VARCHAR(128) NULL COMMENT ''派车提单号快照;关联RELEASED订舱时由订舱事实源冻结'' AFTER carrier_name'
|
|
);
|
|
CALL phase3_truck_add_column(
|
|
'actual_arrived_warehouse_at',
|
|
'DATETIME(3) NULL COMMENT ''车辆实际到达收货仓时间'' AFTER planned_loading_at'
|
|
);
|
|
CALL phase3_truck_add_column(
|
|
'actual_loading_at',
|
|
'DATETIME(3) NULL COMMENT ''实际开始装柜时间'' AFTER actual_arrived_warehouse_at'
|
|
);
|
|
CALL phase3_truck_add_column(
|
|
'actual_departed_at',
|
|
'DATETIME(3) NULL COMMENT ''车辆实际离仓时间;DEPARTED后供LOADED门禁使用'' AFTER actual_loading_at'
|
|
);
|
|
DROP PROCEDURE IF EXISTS phase3_truck_add_column;
|
|
|
|
USE baiyue_iam;
|
|
DROP PROCEDURE IF EXISTS assert_truck_appointment_permission_ids_available;
|
|
DELIMITER $$
|
|
CREATE PROCEDURE assert_truck_appointment_permission_ids_available()
|
|
BEGIN
|
|
IF EXISTS (
|
|
SELECT 1 FROM iam_permission
|
|
WHERE (id = 5102150 AND permission_code <> 'platform:firstleg:truck-appointment:list')
|
|
OR (id = 5102151 AND permission_code NOT IN (
|
|
'platform:firstleg:truck-appointment:list',
|
|
'platform:firstleg:truck-appointment:view'))
|
|
OR (id = 5102152 AND permission_code <> 'platform:firstleg:truck-appointment:create')
|
|
OR (id = 5102153 AND permission_code <> 'platform:firstleg:truck-appointment:edit')
|
|
OR (id = 5102154 AND permission_code <> 'platform:firstleg:truck-appointment:operate')
|
|
OR (permission_code LIKE 'platform:firstleg:truck-appointment:%'
|
|
AND (tenant_id <> 0 OR app_code <> 'PLATFORM' OR id NOT BETWEEN 5102150 AND 5102154))
|
|
) THEN
|
|
SIGNAL SQLSTATE '45000'
|
|
SET MESSAGE_TEXT = '三期拖车权限迁移失败:5102150-5102154 ID 或权限码被其他语义占用';
|
|
END IF;
|
|
END$$
|
|
DELIMITER ;
|
|
CALL assert_truck_appointment_permission_ids_available();
|
|
DROP PROCEDURE IF EXISTS assert_truck_appointment_permission_ids_available;
|
|
|
|
UPDATE iam_permission
|
|
SET permission_code='platform:firstleg:truck-appointment:view',status='INACTIVE',deleted=1
|
|
WHERE id=5102151 AND permission_code='platform:firstleg:truck-appointment:list';
|
|
|
|
INSERT INTO iam_permission
|
|
(id,tenant_id,app_code,permission_type,parent_id,permission_code,permission_name,
|
|
route_path,http_method,sort_no,status,built_in,deleted)
|
|
VALUES
|
|
(5102150,0,'PLATFORM','MENU',5102000,'platform:firstleg:truck-appointment:list','拖车预约','/first-leg/truck-appointments','GET',90,'ACTIVE',1,0),
|
|
(5102152,0,'PLATFORM','BUTTON',5102150,'platform:firstleg:truck-appointment:create','创建拖车预约',NULL,'POST',20,'ACTIVE',1,0),
|
|
(5102153,0,'PLATFORM','BUTTON',5102150,'platform:firstleg:truck-appointment:edit','编辑拖车预约',NULL,'PUT',30,'ACTIVE',1,0),
|
|
(5102154,0,'PLATFORM','BUTTON',5102150,'platform:firstleg:truck-appointment:operate','操作拖车预约',NULL,'POST',40,'ACTIVE',1,0)
|
|
ON DUPLICATE KEY UPDATE tenant_id=0,app_code='PLATFORM',permission_type=VALUES(permission_type),
|
|
permission_code=VALUES(permission_code),permission_name=VALUES(permission_name),parent_id=VALUES(parent_id),
|
|
route_path=VALUES(route_path),http_method=VALUES(http_method),sort_no=VALUES(sort_no),status='ACTIVE',built_in=1,deleted=0;
|
|
|
|
INSERT IGNORE INTO iam_role_permission(role_id,permission_id,tenant_id)
|
|
SELECT role.id,permission.id,0 FROM iam_role role JOIN iam_permission permission
|
|
ON permission.tenant_id=0 AND permission.app_code='PLATFORM'
|
|
AND permission.permission_code LIKE 'platform:firstleg:truck-appointment:%'
|
|
WHERE role.tenant_id=0 AND role.role_code IN ('PLATFORM_ADMIN','ORDER_OPERATOR');
|
|
|
|
DELETE rp FROM iam_role_permission rp JOIN iam_permission p ON p.tenant_id=rp.tenant_id AND p.id=rp.permission_id
|
|
WHERE p.id=5102151;
|
|
UPDATE iam_permission SET status='INACTIVE',deleted=1 WHERE id=5102151;
|
|
|
|
USE baiyue_firstleg;
|