-- 充电桩订单「所属公司 / 所属车队」历史数据回填脚本(仅白名单订单) -- 前置:已执行 20260929_charging_order_company_fleet.sql(两列已存在) -- 数据来源:charging_pile_account.t_app_user_whitelist(含 company_id / fleet_id / del_flag / status), -- 订单侧 whitelist_id 为建单时白名单记录 ID 快照,直接按 id 关联,无需经手机号中转。 -- 范围:仅回填 is_whitelist = 1 的白名单用户充电订单;非白名单订单无归属来源,两列保持 NULL。 -- 执行方式:MyCat 不支持跨逻辑库 UPDATE JOIN,故分三步人工执行: -- 步骤1 在 charging_pile_account 生成 UPDATE 语句(单库只读查询); -- 步骤2 把步骤1 结果集逐行复制到 charging_pile_order 执行(whitelist_id 非分片键,语句广播到各分片,无匹配分片零影响); -- 步骤3 回查校验。 -- 语义与幂等: -- * 仅回填 company_id IS NULL 的历史订单行,不覆盖上线后新建订单的建单时快照; -- * 同一白名单用户重复执行结果一致(写入白名单当前归属); -- * 白名单未分配公司且未分配车队时不生成语句,其历史订单两列保持 NULL。 -- ============ 步骤 0:前置检查(charging_pile_account,只读) ============ USE `charging_pile_account`; SELECT COUNT(1) AS assignable_whitelist_count FROM `t_app_user_whitelist` WHERE `del_flag` = 0 AND `status` = 1 AND (`company_id` IS NOT NULL OR `fleet_id` IS NOT NULL); SELECT COUNT(1) AS unassigned_whitelist_count FROM `t_app_user_whitelist` WHERE `del_flag` = 0 AND `status` = 1 AND `company_id` IS NULL AND `fleet_id` IS NULL; -- ============ 步骤 1:生成回填语句(charging_pile_account,只读) ============ -- 复制结果集 backfill_sql 列全部内容,粘贴到 charging_pile_order 逐行执行 SELECT CONCAT('UPDATE `t_charging_order` SET `company_id` = ', IFNULL(w.`company_id`, 'NULL'), ', `fleet_id` = ', IFNULL(w.`fleet_id`, 'NULL'), ' WHERE `whitelist_id` = ', w.`id`, ' AND `is_whitelist` = 1 AND `company_id` IS NULL;') AS backfill_sql FROM `t_app_user_whitelist` w WHERE w.`del_flag` = 0 AND w.`status` = 1 AND (w.`company_id` IS NOT NULL OR w.`fleet_id` IS NOT NULL) ORDER BY w.`id`; -- ============ 步骤 2:在 charging_pile_order 执行步骤1 生成的语句 ============ -- 示例(白名单记录 id = 1 归属公司 12、车队 3): -- USE `charging_pile_order`; -- UPDATE `t_charging_order` SET `company_id` = 12, `fleet_id` = 3 WHERE `whitelist_id` = 1 AND `is_whitelist` = 1 AND `company_id` IS NULL; -- ============ 步骤 3:回查校验(charging_pile_order) ============ USE `charging_pile_order`; -- 白名单订单盘点:总数 / 已回填公司 / 已回填车队 / 两者皆空 SELECT COUNT(1) AS whitelist_order_total, SUM(CASE WHEN `company_id` IS NOT NULL THEN 1 ELSE 0 END) AS company_filled, SUM(CASE WHEN `fleet_id` IS NOT NULL THEN 1 ELSE 0 END) AS fleet_filled, SUM(CASE WHEN `company_id` IS NULL AND `fleet_id` IS NULL THEN 1 ELSE 0 END) AS unassigned FROM `t_charging_order` WHERE `is_whitelist` = 1; -- 以下跨逻辑库比对请【直连后端 MySQL 实例】执行(代理不支持跨库 JOIN): -- 归属公司与白名单用户不一致的订单(回填后应为 0;上线后白名单改归属导致新建订单不同属预期) -- SELECT COUNT(1) AS snapshot_diff_count -- FROM `charging_pile_order`.`t_charging_order` o -- JOIN `charging_pile_account`.`t_app_user_whitelist` w ON w.`id` = o.`whitelist_id` -- WHERE o.`del_flag` = 0 -- AND o.`is_whitelist` = 1 -- AND o.`company_id` IS NOT NULL -- AND w.`company_id` <> o.`company_id`;