♻️ 认证迁移脚本补幂等并统一注释格式

三个认证相关迁移脚本按项目既有约定整理,DDL 效果不变:

- driving_vehicle 扩长、owner_name/vin 加列两处原为裸 ALTER,重复执行会报
  「Duplicate column」或白白重建表;改为 DELIMITER 存储过程 + information_schema
  判定,与 doc/sql/transport 下 upgrade_* 的既有写法一致,可重复执行。
  扩长那条额外判定 character_maximum_length < 100:MODIFY COLUMN 会重建整表,
  已达标就不必再跑一次。
- cert_record 的菜单段补注 parent_id 的出处(与 blade_transport_driver.sql /
  blade_transport_vehicle.sql / blade_vehicle_dispatch.sql 同一 ID),并说明
  ON DUPLICATE KEY UPDATE 会把 parent_id / name 回写,对旧环境重跑即可收敛。
- 去掉注释里的 markdown 粗体(doc/sql/transport 的既有排版不用 markdown),
  统一以 30 个破折号的横幅开头。

已在 dev 库 transport 连跑两遍验证:两遍均无报错,且列定义 116 行、索引 29 行、
三表排序规则与整理前逐项一致。
This commit is contained in:
2026-10-04 23:43:05 +08:00
parent ec98954351
commit 378aa11842
3 changed files with 82 additions and 15 deletions
@@ -1,14 +1,16 @@
-- ----------------------------
-- 认证记录数据模型:新建 blade_transport_cert_record,为司机表、车辆表补认证字段与
-- 生效快照指针,订正司机表排序规则,并新增认证审核菜单。
--
-- ----------------------------
-- 认证对象(司机 / 车辆)每次提交产生一条不可变记录,审核只改记录的状态,
-- 不覆盖已提交的内容。司机与车辆共用本表,由 biz_type 区分。
--
-- ⚠️ effective_cert_record_id(生效快照指针)是判定「该对象是否已认证」的唯一依据:
-- NULL = 从未审核通过;一经写入永不回退,提交、驳回、作废都不得修改它。
-- 因此「重新提交审核」不会让一辆已认证的车掉出可用池。
-- effective_cert_record_id(生效快照指针)是判定「该对象是否已认证」的唯一依据:
-- NULL = 从未审核通过;一经写入永不回退,提交、驳回、作废都不得修改它。
-- 因此「重新提交审核」不会让一辆已认证的车掉出可用池。
--
-- 幂等:全部语句可重复执行(建表 IF NOT EXISTS、加列先查 information_schema)。
-- 幂等:全部语句可重复执行(建表 IF NOT EXISTS、加列先查 information_schema、
-- 改列/改排序规则/改菜单都先判定当前状态;菜单用 ON DUPLICATE KEY UPDATE)。
-- MySQL 5.7+ 兼容。
-- ----------------------------
@@ -152,8 +154,13 @@ DELIMITER ;
-- ----------------------------
-- 5. 菜单与权限码
-- 挂在「运力管理」(2079000000000000001) 下,与司机管理 / 车辆管理同级。
-- 挂在「运力管理」(2079000000000000001,与 blade_transport_driver.sql /
-- blade_transport_vehicle.sql / blade_vehicle_dispatch.sql 用的是同一个 ID) 下,
-- 与司机管理 / 车辆管理同级。
-- 列表页权限码 cert_certification_audit_{driver|vehicle},审核动作加 _audit 后缀。
--
-- 幂等:ON DUPLICATE KEY UPDATE 同时把 parent_id / name 等回写,
-- 故对已存在(曾按早期版本建过菜单、或手工改过)的环境重跑即可收敛到本脚本的值。
-- ----------------------------
INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES
(2079000000000000300, 2079000000000000001, 'cert_certification_audit_driver', '司机审核', 'cert_certification_audit_driver', '/transportCapacity/cert-audit-driver', 'iconfont iconicon_doc', 4, 1, 0, 1, '', '司机认证待审列表', 0),
@@ -2,12 +2,38 @@
-- 司机「驾驶车辆」字段扩长:varchar(30) -> varchar(100)
-- ----------------------------
-- 一个司机最多绑定 5 辆车(与小程序端「车辆认证一个司机最多添加 5 辆」一致),
-- 该字段是**逗号并列的车牌列表**,5 个普通车牌连分隔符要 39 字符,
-- 该字段是逗号并列的车牌列表,5 个普通车牌连分隔符要 39 字符,
-- 新能源号牌(8 位)要 44 字符 —— 30 字符连 4 辆车都放不下。
-- 超长写入的后果不是报错而是**静默截断**:字段里会留下半个车牌,
-- 超长写入的后果不是报错而是静默截断:字段里会留下半个车牌,
-- 而拆车牌的规则会把这段残渣当成一辆车,司机名下于是多出一辆不存在的车。
--
-- 排序规则保持不变(utf8mb4_general_ci):车辆表与认证记录表都用这个规则,
-- 三张表之间已有按车牌的关联查询,改规则会引发 Illegal mix of collations。
ALTER TABLE `blade_transport_driver`
MODIFY COLUMN `driving_vehicle` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '驾驶车辆车牌号,多个用逗号分隔';
--
-- 幂等:已是目标长度时不再执行(MODIFY COLUMN 会重建表,重复执行无意义且有大表代价)。
-- MySQL 5.7+ 兼容。
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_transport_driver_driving_vehicle_widen_20261003`$$
CREATE PROCEDURE `upgrade_transport_driver_driving_vehicle_widen_20261003`()
BEGIN
DECLARE db_name varchar(128);
SET db_name = DATABASE();
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_transport_driver'
AND column_name = 'driving_vehicle'
AND character_maximum_length < 100
) THEN
ALTER TABLE `blade_transport_driver`
MODIFY COLUMN `driving_vehicle` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '驾驶车辆车牌号,多个用逗号分隔';
END IF;
END$$
CALL `upgrade_transport_driver_driving_vehicle_widen_20261003`()$$
DROP PROCEDURE `upgrade_transport_driver_driving_vehicle_widen_20261003`$$
DELIMITER ;
@@ -1,14 +1,48 @@
-- ----------------------------
-- 车辆档案补两列:所有人、车辆识别代号(车架号)
-- ----------------------------
-- 所有人:行驶证上登记的单位名称(如「桂物物流集团」),**不是司机**,
-- 所有人:行驶证上登记的单位名称(如「桂物物流集团」),不是司机,
-- 与「所属组织」也是两个字段——组织是内部管理归属,所有人是证件上的登记主体,
-- 两者可能不同(挂靠车的所有人不是本组织)。
-- VIN:司机端车辆认证一直在收这个值并写进认证快照,但车辆表此前没有对应列,
-- 于是它只存在于快照里、车辆档案上查不到。补列后档案与快照才一致。
--
-- 两列都允许为空:存量车辆(含订正补的那些)没有这两个值,
-- 且 VIN 在原型里是**选填**项,不设默认值也不设 NOT NULL。
ALTER TABLE `blade_transport_vehicle`
ADD COLUMN `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所有人(行驶证登记的单位名称,不是司机)' AFTER `plate_no`,
ADD COLUMN `vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '车辆识别代号(车架号)' AFTER `vehicle_type`;
-- 且 VIN 在原型里是选填项,不设默认值也不设 NOT NULL。
--
-- 幂等:逐列先查 information_schema,已存在则跳过(可重复执行)。
-- MySQL 5.7+ 兼容。
DELIMITER $$
DROP PROCEDURE IF EXISTS `upgrade_transport_vehicle_owner_vin_20261003`$$
CREATE PROCEDURE `upgrade_transport_vehicle_owner_vin_20261003`()
BEGIN
DECLARE db_name varchar(128);
SET db_name = DATABASE();
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_transport_vehicle'
AND column_name = 'owner_name'
) THEN
ALTER TABLE `blade_transport_vehicle`
ADD COLUMN `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所有人(行驶证登记的单位名称,不是司机)' AFTER `plate_no`;
END IF;
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = db_name
AND table_name = 'blade_transport_vehicle'
AND column_name = 'vin'
) THEN
ALTER TABLE `blade_transport_vehicle`
ADD COLUMN `vin` varchar(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '车辆识别代号(车架号)' AFTER `vehicle_type`;
END IF;
END$$
CALL `upgrade_transport_vehicle_owner_vin_20261003`()$$
DROP PROCEDURE `upgrade_transport_vehicle_owner_vin_20261003`$$
DELIMITER ;