puzhibing
27 分钟以前 351757b4cc2227bf9a9613d712012fff70815da2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-- VIN码充电订单「所属公司 / 所属车队」历史数据回填脚本
-- 前置:已执行 20260928_vin_charging_order_company_fleet.sql(两列已存在)
-- 数据来源:charging_pile_account.t_vin_management(含 company_id / fleet_id / del_flag)
-- 执行方式:MyCat 不支持跨逻辑库 UPDATE JOIN,故分三步人工执行:
--   步骤1 在 charging_pile_account 生成 UPDATE 语句(单库只读查询);
--   步骤2 把步骤1 结果集逐行复制到 charging_pile_order 执行(vin_id 为分片键,可路由单分片);
--   步骤3 回查校验。
-- 语义与幂等:
--   * 仅回填 company_id IS NULL 的历史订单行,不覆盖上线后新建订单的建单时快照;
--   * 同一 VIN 重复执行结果一致(写入 VIN 记录当前归属);
--   * 车辆未分配公司且未分配车队的 VIN 不生成语句,其历史订单两列保持 NULL。
 
-- ============ 步骤 0:前置检查(charging_pile_account,只读) ============
USE `charging_pile_account`;
 
SELECT COUNT(1) AS assignable_vehicle_count
FROM `t_vin_management`
WHERE `del_flag` = 0 AND (`company_id` IS NOT NULL OR `fleet_id` IS NOT NULL);
 
SELECT COUNT(1) AS unassigned_vehicle_count
FROM `t_vin_management`
WHERE `del_flag` = 0 AND `company_id` IS NULL AND `fleet_id` IS NULL;
 
-- ============ 步骤 1:生成回填语句(charging_pile_account,只读) ============
-- 复制结果集 backfill_sql 列全部内容,粘贴到 charging_pile_order 逐行执行
SELECT CONCAT('UPDATE `t_vin_charging_order` SET `company_id` = ', IFNULL(v.`company_id`, 'NULL'),
              ', `fleet_id` = ', IFNULL(v.`fleet_id`, 'NULL'),
              ' WHERE `vin_id` = ', v.`id`, ' AND `company_id` IS NULL;') AS backfill_sql
FROM `t_vin_management` v
WHERE v.`del_flag` = 0
  AND (v.`company_id` IS NOT NULL OR v.`fleet_id` IS NOT NULL)
ORDER BY v.`id`;
 
-- ============ 步骤 2:在 charging_pile_order 执行步骤1 生成的语句 ============
-- 示例(vin_id = 1 的车辆归属公司 12、车队 3):
-- USE `charging_pile_order`;
-- UPDATE `t_vin_charging_order` SET `company_id` = 12, `fleet_id` = 3 WHERE `vin_id` = 1 AND `company_id` IS NULL;
 
-- ============ 步骤 3:回查校验(charging_pile_order) ============
USE `charging_pile_order`;
 
-- 全量盘点:总数 / 已回填公司 / 已回填车队 / 两者皆空
SELECT COUNT(1) AS 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_vin_charging_order`;
 
-- 以下跨逻辑库比对请【直连后端 MySQL 实例】执行(代理不支持跨库 JOIN):
-- 归属公司与 VIN 记录不一致的订单(回填后应为 0;上线后新建订单因车辆改归属而不为 0 属预期)
-- SELECT COUNT(1) AS snapshot_diff_count
-- FROM `charging_pile_order`.`t_vin_charging_order` o
-- JOIN `charging_pile_account`.`t_vin_management` v ON v.`id` = o.`vin_id`
-- WHERE o.`del_flag` = 0
--   AND o.`company_id` IS NOT NULL
--   AND v.`company_id` <> o.`company_id`;