fix: assign each user to single leaf dept to prevent duplicates

This commit is contained in:
2026-07-10 10:09:47 +08:00
parent fb54a6c466
commit f6a84fd6b3

View File

@@ -352,25 +352,19 @@ export class DingTalkService {
}; };
collectIds(deptTree); collectIds(deptTree);
// 3. 从每个部门拉用户,找到用户所属的叶子部门(支持多分支 // 3. 从每个部门拉用户,每人只挂到一个部门dept_id_list 最后一个
const allDeptIdsSet = new Set(allDeptIds);
const usersByDept = new Map<number, Array<{ userid: string; name: string; mobile: string; deptIds: number[] }>>(); const usersByDept = new Map<number, Array<{ userid: string; name: string; mobile: string; deptIds: number[] }>>();
const seenUsers = new Set<string>(); const placedUsers = new Set<string>();
for (const did of allDeptIds) { for (const did of allDeptIds) {
const deptUsers = await this.getDeptUsers(token, did); const deptUsers = await this.getDeptUsers(token, did);
for (const u of deptUsers) { for (const u of deptUsers) {
if (seenUsers.has(u.userid)) continue; if (placedUsers.has(u.userid)) continue;
seenUsers.add(u.userid); const targetDept = u.dept_id_list[u.dept_id_list.length - 1];
// 找到所有叶子部门:链 [1,2,3,1,4,5] → 叶子 [3,5] if (allDeptIdsSet.has(targetDept)) {
const leafDepts: number[] = []; placedUsers.add(u.userid);
for (let i = 0; i < u.dept_id_list.length; i++) { if (!usersByDept.has(targetDept)) usersByDept.set(targetDept, []);
const next = u.dept_id_list[i + 1]; usersByDept.get(targetDept)!.push({ userid: u.userid, name: u.name, mobile: u.mobile, deptIds: u.dept_id_list });
if (next === undefined || next <= u.dept_id_list[i]) {
leafDepts.push(u.dept_id_list[i]);
}
}
for (const ld of leafDepts) {
if (!usersByDept.has(ld)) usersByDept.set(ld, []);
usersByDept.get(ld)!.push({ userid: u.userid, name: u.name, mobile: u.mobile, deptIds: u.dept_id_list });
} }
} }
} }