-- ============================================================================= -- 运输计划 · 车辆/人员/证书重构 — 数据迁移 -- 日期: 2026-06-19 -- 前置: 先执行 docs/sql/20260619_pl_personnel_cert.sql -- 说明: 从 pl_driver / pl_vehicle_driver 迁移至新表;可重复执行(幂等) -- ============================================================================= SET NAMES utf8mb4; -- ----------------------------------------------------------------------------- -- 1. pl_driver → pl_personnel(保留 id) -- ----------------------------------------------------------------------------- INSERT IGNORE INTO `pl_personnel` ( `id`, `personnel_name`, `phone_no`, `age`, `id_card_no`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) SELECT d.`id`, d.`driver_name`, NULLIF(TRIM(d.`phone_no`), ''), NULL, d.`id_card_no`, '1', d.`tenant_no`, d.`order_num`, d.`remark`, d.`create_by`, d.`create_dept_id`, d.`create_time`, d.`update_by`, d.`update_time`, d.`del_flag` FROM `pl_driver` d WHERE d.`del_flag` = 0 AND NOT EXISTS (SELECT 1 FROM `pl_personnel` p WHERE p.`id` = d.`id`); -- ----------------------------------------------------------------------------- -- 2. 司机证件 → pl_cert(owner_type=personnel, remind_days=30) -- 证书 id 使用确定性前缀,便于幂等 -- ----------------------------------------------------------------------------- -- 驾驶证 INSERT INTO `pl_cert` ( `id`, `owner_type`, `owner_id`, `cert_name`, `cert_no`, `expire_date`, `remind_days`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) SELECT CONCAT(d.`id`, '-dl'), 'personnel', d.`id`, '驾驶证', d.`driving_license_no`, d.`driving_license_expire`, 30, 'valid', d.`tenant_no`, d.`order_num`, d.`remark`, d.`create_by`, d.`create_dept_id`, d.`create_time`, d.`update_by`, d.`update_time`, 0 FROM `pl_driver` d WHERE d.`del_flag` = 0 AND d.`driving_license_expire` IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `pl_cert` c WHERE c.`id` = CONCAT(d.`id`, '-dl')); -- 行驶证(原存于司机表,迁移后挂人员;业务上可后续调整到车辆) INSERT INTO `pl_cert` ( `id`, `owner_type`, `owner_id`, `cert_name`, `cert_no`, `expire_date`, `remind_days`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) SELECT CONCAT(d.`id`, '-vl'), 'personnel', d.`id`, '行驶证', d.`vehicle_license_no`, d.`vehicle_license_expire`, 30, 'valid', d.`tenant_no`, d.`order_num`, d.`remark`, d.`create_by`, d.`create_dept_id`, d.`create_time`, d.`update_by`, d.`update_time`, 0 FROM `pl_driver` d WHERE d.`del_flag` = 0 AND d.`vehicle_license_expire` IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `pl_cert` c WHERE c.`id` = CONCAT(d.`id`, '-vl')); -- 危化品从业资格证 INSERT INTO `pl_cert` ( `id`, `owner_type`, `owner_id`, `cert_name`, `cert_no`, `expire_date`, `remind_days`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) SELECT CONCAT(d.`id`, '-hc'), 'personnel', d.`id`, '危化品从业资格证', d.`hazmat_cert_no`, d.`hazmat_cert_expire`, 30, 'valid', d.`tenant_no`, d.`order_num`, d.`remark`, d.`create_by`, d.`create_dept_id`, d.`create_time`, d.`update_by`, d.`update_time`, 0 FROM `pl_driver` d WHERE d.`del_flag` = 0 AND d.`hazmat_cert_expire` IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `pl_cert` c WHERE c.`id` = CONCAT(d.`id`, '-hc')); -- ----------------------------------------------------------------------------- -- 3. pl_vehicle_driver → pl_vehicle_personnel(driver_id → personnel_id, role=driver) -- ----------------------------------------------------------------------------- INSERT IGNORE INTO `pl_vehicle_personnel` ( `id`, `vehicle_id`, `personnel_id`, `role`, `is_default`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) SELECT vd.`id`, vd.`vehicle_id`, vd.`driver_id`, 'driver', vd.`is_default`, vd.`tenant_no`, vd.`order_num`, vd.`remark`, vd.`create_by`, vd.`create_dept_id`, vd.`create_time`, vd.`update_by`, vd.`update_time`, vd.`del_flag` FROM `pl_vehicle_driver` vd WHERE vd.`del_flag` = 0 AND NOT EXISTS (SELECT 1 FROM `pl_vehicle_personnel` vp WHERE vp.`id` = vd.`id`); -- ----------------------------------------------------------------------------- -- 4. 从 pl_vehicle.default_driver_id 修正 is_default(每车最多一条 is_default=1) -- ----------------------------------------------------------------------------- -- 先清零所有关联的 is_default UPDATE `pl_vehicle_personnel` vp INNER JOIN `pl_vehicle` v ON v.`id` = vp.`vehicle_id` AND v.`del_flag` = 0 SET vp.`is_default` = 0 WHERE vp.`del_flag` = 0 AND vp.`role` = 'driver' AND v.`default_driver_id` IS NOT NULL AND v.`default_driver_id` != ''; -- 按车辆 default_driver_id 设置默认司机 UPDATE `pl_vehicle_personnel` vp INNER JOIN `pl_vehicle` v ON v.`id` = vp.`vehicle_id` AND v.`del_flag` = 0 SET vp.`is_default` = 1 WHERE vp.`del_flag` = 0 AND vp.`role` = 'driver' AND vp.`personnel_id` = v.`default_driver_id` AND v.`default_driver_id` IS NOT NULL AND v.`default_driver_id` != ''; -- 若 default_driver_id 有值但尚无关联行,补插一条 INSERT IGNORE INTO `pl_vehicle_personnel` ( `id`, `vehicle_id`, `personnel_id`, `role`, `is_default`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) SELECT CONCAT('mig-vp-', v.`id`, '-', v.`default_driver_id`), v.`id`, v.`default_driver_id`, 'driver', 1, v.`tenant_no`, NULL, '迁移自 default_driver_id', v.`create_by`, v.`create_dept_id`, v.`create_time`, v.`update_by`, v.`update_time`, 0 FROM `pl_vehicle` v WHERE v.`del_flag` = 0 AND v.`default_driver_id` IS NOT NULL AND v.`default_driver_id` != '' AND EXISTS (SELECT 1 FROM `pl_personnel` p WHERE p.`id` = v.`default_driver_id` AND p.`del_flag` = 0) AND NOT EXISTS ( SELECT 1 FROM `pl_vehicle_personnel` vp WHERE vp.`vehicle_id` = v.`id` AND vp.`personnel_id` = v.`default_driver_id` AND vp.`role` = 'driver' AND vp.`del_flag` = 0 );