diff --git a/deploy/sql/README.md b/deploy/sql/README.md index 7a69bb335..be1ea2931 100644 --- a/deploy/sql/README.md +++ b/deploy/sql/README.md @@ -1,6 +1,6 @@ # 单测试环境数据库空库初始化 -内部拼车需求池的当前结构在 Lastleg 源基线和海外统一空库基线同步维护,独立五项权限在 IAM 源种子和国内统一基线维护。已存在基础表的指定环境结构补齐使用 `migrations/overseas/baiyue_lastleg/V10__fleet_capacity_pool.sql` 与 `migrations/cn/baiyue_iam/V4__fleet_capacity_offer_permissions.sql`;执行前确认三张新表、六个新增字段均未存在,并单独核对目标环境。它们不回填、删除或重置业务数据,不能重放整个空库基线。候选文件存在不表示已经执行。 +内部拼车需求池的当前结构在 Lastleg 源基线和海外统一空库基线同步维护,独立五项权限在 IAM 源种子和国内统一基线维护。已存在基础表的指定环境结构补齐使用 `migrations/overseas/baiyue_lastleg/V10__fleet_capacity_pool.sql` 与 `migrations/cn/baiyue_iam/V4__fleet_capacity_offer_permissions.sql`;执行前确认三张新表、六个新增字段均未存在,并单独核对目标环境。随后 `V11__align_capacity_pool_collation.sql` 将预订与商业桥的客户关联字段显式统一为 `utf8mb4_unicode_ci`,与原订单域一致,避免依赖MySQL实例默认排序规则导致JOIN失败。它们不回填、删除或重置业务数据,不能重放整个空库基线。候选文件存在不表示已经执行。 ## 唯一入口与区域边界 diff --git a/deploy/sql/migrations/overseas/baiyue_lastleg/V11__align_capacity_pool_collation.sql b/deploy/sql/migrations/overseas/baiyue_lastleg/V11__align_capacity_pool_collation.sql new file mode 100644 index 000000000..477eb0c40 --- /dev/null +++ b/deploy/sql/migrations/overseas/baiyue_lastleg/V11__align_capacity_pool_collation.sql @@ -0,0 +1,7 @@ +-- Region: OVERSEAS +-- Schema: baiyue_lastleg +-- Purpose: 拼车履约客户关联字段与现有订单域排序规则一致 +-- Preconditions: 外接预订和商业履约桥已存在,客户字段为VARCHAR(128)且非空 +-- Postconditions: 两个客户关联字段使用utf8mb4_unicode_ci;不修改客户标识或业务状态 +ALTER TABLE ll_fleet_external_booking MODIFY COLUMN customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '委托客户及付款归属'; +ALTER TABLE ll_fleet_pool_order_link MODIFY COLUMN customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商业客户隔离范围'; diff --git a/deploy/sql/海外区域统一增量-MySQL8.sql b/deploy/sql/海外区域统一增量-MySQL8.sql index fbf6a80e2..68869770b 100644 --- a/deploy/sql/海外区域统一增量-MySQL8.sql +++ b/deploy/sql/海外区域统一增量-MySQL8.sql @@ -2810,7 +2810,7 @@ CREATE TABLE ll_fleet_external_booking ( booking_no VARCHAR(32) NOT NULL COMMENT '外接预订业务编号', trip_id BIGINT NOT NULL COMMENT '所属车次', trip_no VARCHAR(32) NOT NULL COMMENT '车次业务编号', - customer_id VARCHAR(128) NOT NULL COMMENT '委托客户及付款归属', + customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '委托客户及付款归属', customer_code VARCHAR(64) NOT NULL COMMENT '客户编号快照', customer_name VARCHAR(255) NOT NULL COMMENT '客户名称快照', status VARCHAR(16) NOT NULL COMMENT 'DRAFT询价/CONFIRMED占位/RECEIVED确认实收/BOUND关联发运/CANCELLED取消', @@ -2863,7 +2863,7 @@ CREATE TABLE ll_fleet_pool_order_link ( id BIGINT NOT NULL COMMENT '内部主键', booking_id BIGINT NOT NULL COMMENT '唯一外接预订', booking_no VARCHAR(64) NOT NULL COMMENT '预订业务编号', - customer_id VARCHAR(128) NOT NULL COMMENT '商业客户隔离范围', + customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商业客户隔离范围', business_type VARCHAR(32) NOT NULL COMMENT '本土散板或本土卡车商业类型', business_order_id BIGINT NOT NULL COMMENT '对应商业订单内部关联', business_order_no VARCHAR(64) NOT NULL COMMENT '本土商业订单业务编号', diff --git a/lastleg-service/src/main/resources/db/lastleg.sql b/lastleg-service/src/main/resources/db/lastleg.sql index adfba4afa..e4ce34539 100644 --- a/lastleg-service/src/main/resources/db/lastleg.sql +++ b/lastleg-service/src/main/resources/db/lastleg.sql @@ -1175,7 +1175,7 @@ CREATE TABLE ll_fleet_external_booking ( booking_no VARCHAR(32) NOT NULL COMMENT '外接预订业务编号', trip_id BIGINT NOT NULL COMMENT '所属车次', trip_no VARCHAR(32) NOT NULL COMMENT '车次业务编号', - customer_id VARCHAR(128) NOT NULL COMMENT '委托客户及付款归属', + customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '委托客户及付款归属', customer_code VARCHAR(64) NOT NULL COMMENT '客户编号快照', customer_name VARCHAR(255) NOT NULL COMMENT '客户名称快照', status VARCHAR(16) NOT NULL COMMENT 'DRAFT询价/CONFIRMED占位/RECEIVED确认实收/BOUND关联发运/CANCELLED取消', @@ -1228,7 +1228,7 @@ CREATE TABLE ll_fleet_pool_order_link ( id BIGINT NOT NULL COMMENT '内部主键', booking_id BIGINT NOT NULL COMMENT '唯一外接预订', booking_no VARCHAR(64) NOT NULL COMMENT '预订业务编号', - customer_id VARCHAR(128) NOT NULL COMMENT '商业客户隔离范围', + customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商业客户隔离范围', business_type VARCHAR(32) NOT NULL COMMENT '本土散板或本土卡车商业类型', business_order_id BIGINT NOT NULL COMMENT '对应商业订单内部关联', business_order_no VARCHAR(64) NOT NULL COMMENT '本土商业订单业务编号', diff --git a/scripts/admin-test-env-modules/fleet-capacity-pool-schema-contract.test.mjs b/scripts/admin-test-env-modules/fleet-capacity-pool-schema-contract.test.mjs index 8e392734b..e6cc9080e 100644 --- a/scripts/admin-test-env-modules/fleet-capacity-pool-schema-contract.test.mjs +++ b/scripts/admin-test-env-modules/fleet-capacity-pool-schema-contract.test.mjs @@ -46,6 +46,15 @@ test('module and unified fresh baselines contain the exact same new table defini assert.match(sql, /ADD CONSTRAINT fk_fleet_booking_offer/i) }) +test('customer identity joins use the same explicit collation as existing fulfillment orders', () => { + for (const name of ['ll_fleet_external_booking', 'll_fleet_pool_order_link']) { + assert.match(table(overseas, 'baiyue_lastleg', name), /customer_id VARCHAR\(128\) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL/i) + } + const sql = read('deploy/sql/migrations/overseas/baiyue_lastleg/V11__align_capacity_pool_collation.sql') + assert.equal((sql.match(/MODIFY COLUMN customer_id/g) || []).length, 2) + assert.doesNotMatch(sql.replace(/^--.*$/gm, ''), /\b(?:DROP|TRUNCATE|DELETE|UPDATE|REPLACE)\b/i) +}) + test('pool permissions are independent of trip details and default only to the platform administrator', () => { const permissions = seedRows(cn, 'iam_permission').filter(row => String(row.permission_code).startsWith('platform:fleet:capacity-offer:')) assert.equal(permissions.length, 5)