Files
biz-api-cloud-zax/db/20261030_sync_wallet_department_after_user_transaction.sql
T
2026-10-30 16:08:23 +08:00

106 lines
4.3 KiB
SQL

-- 人员调动审批通过后的历史钱包部门补同步(2026-10-30,仅生成,尚未执行)。
-- 范围:指定租户内,存在“审批通过且目标部门等于用户当前部门”的调动记录,
-- 用户、当前部门及钱包均未删除,钱包部门与当前用户部门不一致(包含 NULL)。
-- 以 sys_user.dept_id 为准,不用历史调动单覆盖用户后来再次变更的部门。
-- 仅更新 wallet_manage.dept_id 和 update_time,不处理余额、流水、饭卡商户或正元第三方同步。
-- 重复执行会跳过已经一致的钱包;所有跨表关联均同时校验租户和用户。
-- 默认微服务库名:UPMS 为 pjcloudx,钱包为 pjcloudx_wallet,要求位于同一 MySQL 实例。
-- 单体部署或自定义库名请先统一替换下方库名前缀,并确认执行账号具备跨库读写权限。
-- 先执行第 1 节并导出旧值作为修复前快照,核对范围后在同一连接执行第 2、3 节。
-- 执行期间暂停人员部门变更及钱包部门同步;遇到 SQL 错误立即 ROLLBACK,不继续 COMMIT。
-- 本文件不修改表结构;此 SQL 只补钱包部门,饭卡商户和第三方信息仍需按业务接口同步。
SET NAMES utf8mb4;
-- 目标租户,默认限定本次问题所在的租户 1;切换租户时必须先重新核对预览结果。
SET @repair_tenant_id = 1;
-- NULL 表示修复该租户内所有符合条件的人员;只修董馨悦时改为 2087822558359871489。
SET @repair_user_id = NULL;
-- 1. 修复前预览:每行对应一个待更新钱包,部门不一致判断使用 NULL 安全比较。
SELECT w.tenant_id,
w.id AS wallet_id,
w.user_id,
u.name AS user_name,
w.dept_id AS old_wallet_dept_id,
u.dept_id AS new_wallet_dept_id,
d.name AS new_wallet_dept_name,
w.update_time AS old_update_time
FROM pjcloudx_wallet.wallet_manage w
JOIN pjcloudx.sys_user u
ON u.user_id = w.user_id AND u.tenant_id = w.tenant_id
JOIN pjcloudx.sys_dept d
ON d.dept_id = u.dept_id AND d.tenant_id = u.tenant_id
WHERE w.tenant_id = @repair_tenant_id
AND (@repair_user_id IS NULL OR w.user_id = @repair_user_id)
AND w.del_flag = '0'
AND u.del_flag = '0'
AND d.del_flag = '0'
AND u.dept_id IS NOT NULL
AND NOT (w.dept_id <=> u.dept_id)
AND EXISTS (
SELECT 1
FROM pjcloudx.sys_user_transaction t
WHERE t.tenant_id = u.tenant_id
AND t.user_id = u.user_id
AND t.del_flag = '0'
AND t.process_status = '2'
AND t.target_dept_id = u.dept_id
)
ORDER BY w.user_id, w.id;
-- 2. 补同步:更新时重新核对当前用户部门及审批记录,不依赖预览中可能过期的部门值。
START TRANSACTION;
UPDATE pjcloudx_wallet.wallet_manage w
JOIN pjcloudx.sys_user u
ON u.user_id = w.user_id AND u.tenant_id = w.tenant_id
JOIN pjcloudx.sys_dept d
ON d.dept_id = u.dept_id AND d.tenant_id = u.tenant_id
SET w.dept_id = u.dept_id,
w.update_time = NOW()
WHERE w.tenant_id = @repair_tenant_id
AND (@repair_user_id IS NULL OR w.user_id = @repair_user_id)
AND w.del_flag = '0'
AND u.del_flag = '0'
AND d.del_flag = '0'
AND u.dept_id IS NOT NULL
AND NOT (w.dept_id <=> u.dept_id)
AND EXISTS (
SELECT 1
FROM pjcloudx.sys_user_transaction t
WHERE t.tenant_id = u.tenant_id
AND t.user_id = u.user_id
AND t.del_flag = '0'
AND t.process_status = '2'
AND t.target_dept_id = u.dept_id
);
SELECT ROW_COUNT() AS updated_wallet_count;
COMMIT;
-- 3. 修复后复核:同一范围的剩余不一致钱包数量应为 0;也可重跑第 1 节查看明细。
SELECT COUNT(*) AS remaining_mismatched_wallet_count
FROM pjcloudx_wallet.wallet_manage w
JOIN pjcloudx.sys_user u
ON u.user_id = w.user_id AND u.tenant_id = w.tenant_id
JOIN pjcloudx.sys_dept d
ON d.dept_id = u.dept_id AND d.tenant_id = u.tenant_id
WHERE w.tenant_id = @repair_tenant_id
AND (@repair_user_id IS NULL OR w.user_id = @repair_user_id)
AND w.del_flag = '0'
AND u.del_flag = '0'
AND d.del_flag = '0'
AND u.dept_id IS NOT NULL
AND NOT (w.dept_id <=> u.dept_id)
AND EXISTS (
SELECT 1
FROM pjcloudx.sys_user_transaction t
WHERE t.tenant_id = u.tenant_id
AND t.user_id = u.user_id
AND t.del_flag = '0'
AND t.process_status = '2'
AND t.target_dept_id = u.dept_id
);