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
57
58
59
60
61
62
-- =============================================
-- 修复:部门/岗位的 tenant_id 错误(0 应为 1)
--
-- 现象:
--   1) 员工管理列表「部门」列为空(部分或全部)
--   2) 部门管理页面看不到大部分部门(只剩「总公司」)
--   3) 新增员工报「部门不存在 / 岗位不存在」,无法保存
--   4) 员工列表按部门筛选查不到数据
--
-- 根因:
--   导入部门/岗位时未写 tenant_id,落成 0;而系统按登录租户(通常为 1)查询,
--   导致这些部门/岗位在业务上"不存在"。
--   (hrm_employee 表无 tenant_id 列,所以员工本身能看到,只是部门名解析不到)
--
-- 执行前请确认目标租户 id(单租户系统一般为 1):
--   SELECT id, name FROM system_tenant;
-- =============================================
SET NAMES utf8mb4;
 
-- 目标租户(按实际情况修改)
SET @T := 1;
 
-- ---------- 1. 执行前检查 ----------
SELECT '执行前:部门租户分布' AS step, tenant_id, COUNT(*) AS cnt
FROM system_dept WHERE deleted = b'0' GROUP BY tenant_id;
 
SELECT '执行前:岗位租户分布' AS step, tenant_id, COUNT(*) AS cnt
FROM system_post WHERE deleted = b'0' GROUP BY tenant_id;
 
-- 重名检查:必须都为 0,否则 UPDATE 会违反唯一索引
SELECT '部门重名数(须为0)' AS step, COUNT(*) AS cnt
FROM system_dept d0
JOIN system_dept d1 ON d1.tenant_id = @T AND d1.name = d0.name AND d1.deleted = b'0'
WHERE d0.tenant_id = 0 AND d0.deleted = b'0';
 
SELECT '岗位重名数(须为0)' AS step, COUNT(*) AS cnt
FROM system_post p0
JOIN system_post p1 ON p1.tenant_id = @T AND p1.name = p0.name AND p1.deleted = b'0'
WHERE p0.tenant_id = 0 AND p0.deleted = b'0';
 
-- ---------- 2. 备份 ----------
CREATE TABLE IF NOT EXISTS bak_system_dept_tenant AS SELECT * FROM system_dept;
CREATE TABLE IF NOT EXISTS bak_system_post_tenant AS SELECT * FROM system_post;
 
-- ---------- 3. 修复 ----------
UPDATE system_dept SET tenant_id = @T WHERE tenant_id = 0;
UPDATE system_post SET tenant_id = @T WHERE tenant_id = 0;
 
-- ---------- 4. 执行后核对 ----------
SELECT '执行后:部门租户分布' AS step, tenant_id, COUNT(*) AS cnt
FROM system_dept WHERE deleted = b'0' GROUP BY tenant_id;
 
SELECT '执行后:岗位租户分布' AS step, tenant_id, COUNT(*) AS cnt
FROM system_post WHERE deleted = b'0' GROUP BY tenant_id;
 
-- 员工部门悬空数(应为 0,表示所有员工的部门都能解析到)
SELECT '员工部门悬空数(应为0)' AS step, COUNT(*) AS cnt
FROM hrm_employee e
LEFT JOIN system_dept d ON d.id = e.dept_id AND d.tenant_id = @T AND d.deleted = b'0'
WHERE e.deleted = b'0' AND d.id IS NULL;
 
SELECT '修复完成,请让用户重新登录后刷新页面' AS result;