Files
tms-erp-api/doc/sql/transport/blade_waybill_dept_backfill_20261018.sql
weicw-dshsa 7d951d5b04 ✨ 小程序调度端运单列表、待处理与统计按组织收口
原先三个取数入口都不带组织条件,租户内两个组织的运单混在同一张表里。「小程序管理」
账号与运单业务组织不一致确实是事实,但那是账号挂在一个已软删部门上的脏数据症状,
不是「不该按组织过滤」的理由。

现在与后台运单列表同一条规则:普通用户只出自己所属组织,超级管理员不过滤,
小程序端不提供「全部组织」开关;详情与重新派单照旧不按组织收口。
组织条件由调用方算好、经 TripQueryVO.deptIds 落到运次读服务的运单行上,
列表、待处理与首页三档统计因此共用同一条可见范围;「待重新派单」另走库层分组查询,
单独带上,首页重派角标与待办 feed 随之一起收口。

运次读服务的分档统计走一份「去掉 Tab 条件」的副本,该副本必须照搬 deptIds,
否则统计会退回全租户、与列表的数对不上(已由用例钉住)。

存量 42 张 dept_id 为 -1 或 NULL 的运单不属于任何组织,收紧后普通用户再也看不到,
另订正到各自的创建组织,见 doc/sql/transport/blade_waybill_dept_backfill_20261018.sql。

新增 ManageWaybillOrgScopeTest(8 项),TripQueryServiceImplTest 补 3 项;
blade-transport 全量 376 项用例通过。
2026-10-18 11:22:04 +08:00

62 lines
3.0 KiB
SQL

-- ----------------------------
-- 调度端运单列表按组织过滤: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;