-- 一次性数据修复:将 pl_plan_contract / pl_plan 合同号快照对齐到 CRM 现网编号。 -- 背景:合同页直接改 contract_no 后,计划归档列表仍读快照,导致列表与详情不一致。 -- 范围:全库 del_flag=0 且快照与 crm_contract.contract_no 不一致的关联/遗留主表行。 -- 含客户反馈三单:PO20261008011 / PO20261009018 / PO20261012005(临时号 SX/X-JT20261009002 → P0-2026-10-0016)。 -- MySQL 5.7。可重复执行(已对齐行不再更新)。 -- !!! 生产执行须单独授权;本文件不随应用启动自动执行。 SET NAMES utf8mb4; -- 预览(执行前建议先跑): -- SELECT p.plan_no, pc.id AS link_id, pc.side, pc.contract_id, -- pc.contract_no AS snapshot_no, c.contract_no AS live_no -- FROM pl_plan_contract pc -- JOIN pl_plan p ON p.id = pc.plan_id AND p.del_flag = 0 -- JOIN crm_contract c ON c.id = pc.contract_id AND c.tenant_no = pc.tenant_no AND c.del_flag = 0 -- WHERE pc.del_flag = 0 -- AND IFNULL(pc.contract_no, '') <> IFNULL(c.contract_no, ''); UPDATE pl_plan_contract pc INNER JOIN crm_contract c ON c.id = pc.contract_id AND c.tenant_no = pc.tenant_no AND c.del_flag = 0 SET pc.contract_no = c.contract_no, pc.update_time = NOW() WHERE pc.del_flag = 0 AND IFNULL(pc.contract_no, '') <> IFNULL(c.contract_no, ''); UPDATE pl_plan p INNER JOIN crm_contract c ON c.id = p.contract_id AND c.tenant_no = p.tenant_no AND c.del_flag = 0 SET p.contract_no = c.contract_no, p.update_time = NOW() WHERE p.del_flag = 0 AND p.contract_id IS NOT NULL AND p.contract_id <> '' AND IFNULL(p.contract_no, '') <> IFNULL(c.contract_no, '');