-- ---------------------------- -- 调度端运单列表按组织过滤:dept_id 缺失的存量运单订正回它所属的组织 -- 写业务数据。执行前必须先建备份表(第 0 节),执行后必须跑第 2 节校验。可重复执行。 -- ---------------------------- -- -- 为什么要订正: -- 调度端(小程序管理端)运单列表的可见范围是「本组织」,超管看全租户。 -- dept_id 为 NULL 或 -1 的运单不属于任何组织,普通用户再也看不到它们。 -- 本机库实测 42 张:34 张的 dept_id = -1、8 张为 NULL,全部是 2026-10-15 / 10-16 -- 由 admin 在 1123598813738675201 下建的(-1 是客户端把「未选组织」当 -1 传上来的哨兵值, -- 服务端写入前的兜底只判空、拦不住负数)。 -- -- 处置口径:取该运单的 create_dept(创建人所属组织)作为它的组织。 -- 42 张的 create_dept 都是 1123598813738675201,与它们的业务归属一致; -- 按 create_dept 取而不是写死这个 id,其它环境执行时同样成立。 -- dept_name 取组织表当前的名字:新建运单写的就是这个名字,不跟随存量行里的历史短名 -- (「桂物物流集团」这类短名是历史写法,本次只补缺失值,不复位已存在的值)。 -- 只动 dept_id 为空或非正数的行,且要求 create_dept 为正数:重复执行不再改动任何行。 -- update_time 不在 SET 里,保留原值。 -- ---------------------------- -- 0. 备份(必须在订正之前执行,仅首次需要) -- ---------------------------- -- CREATE TABLE blade_waybill_dept_bak AS -- SELECT id, waybill_no, dept_id, dept_name, create_dept, update_time -- FROM blade_waybill -- WHERE is_deleted = 0 AND (dept_id IS NULL OR dept_id <= 0); START TRANSACTION; -- ---------------------------- -- 1. 订正组织 -- ---------------------------- UPDATE `blade_waybill` SET `dept_id` = `create_dept`, `dept_name` = (SELECT `dept_name` FROM `blade_dept` WHERE `id` = `blade_waybill`.`create_dept` LIMIT 1) WHERE `is_deleted` = 0 AND (`dept_id` IS NULL OR `dept_id` <= 0) AND `create_dept` IS NOT NULL AND `create_dept` > 0; COMMIT; -- ---------------------------- -- 2. 校验(执行后必看,两个都必须返回 0) -- ---------------------------- -- -- 仍不属于任何组织的可见运单 -- SELECT COUNT(*) FROM blade_waybill -- WHERE is_deleted = 0 AND (dept_id IS NULL OR dept_id <= 0) AND create_dept > 0; -- -- -- 本次订正过的行,组织 ID 与组织名都必须跟组织表一致 -- SELECT COUNT(*) FROM blade_waybill w -- JOIN blade_waybill_dept_bak b ON b.id = w.id -- JOIN blade_dept d ON d.id = w.dept_id -- WHERE w.dept_id <> w.create_dept OR w.dept_name <> d.dept_name; -- ---------------------------- -- 3. 回退(订正后发现问题时执行) -- ---------------------------- -- UPDATE blade_waybill w -- JOIN blade_waybill_dept_bak b ON b.id = w.id -- SET w.dept_id = b.dept_id, w.dept_name = b.dept_name;