增加昵称和部门的匹配

This commit is contained in:
砂糖
2025-07-14 17:02:56 +08:00
parent 66169c3620
commit 4c0df26d3d
7 changed files with 168 additions and 8 deletions

76
util/withDeptName.js Normal file
View File

@@ -0,0 +1,76 @@
import { getDeptNameByNickName } from '@/api/oa/binding';
/*
* withDeptName 高阶函数
* ---------------------------------------------
* 用途:
* 为会话列表如IM会话、联系人等异步注入部门名称和部门颜色
* 使前端组件可直接渲染带部门信息的会话项。
*
* 参数:
* @param {Array<Object>} conversationList - 原始会话对象数组,
* 每项需包含唯一标识(如 showName 字段)。
*
* 返回:
* @returns {Promise<Array<Object>>} - 返回一个 Promise
* 解析后为带有部门名deptName和部门色color的会话对象数组。
* 若某项无部门信息,则不包含 deptName/color 字段。
*
* 使用场景:
* - 会话列表、联系人列表等需要展示部门信息的场景。
* - 适用于任何需要根据昵称批量获取部门名的业务。
* - 可在 watch、生命周期、异步数据流等场景下调用。
*
* 示例:
* import { withDeptName } from '@/util/withDeptName';
* const result = await withDeptName(conversationList);
* // result: [{...item, deptName, color}, ...]
*
* 注意事项:
* - 依赖 getDeptNameByNickName 接口,需保证接口可用。
* - 仅为获取到真实部门名的项添加 deptName/color 字段。
* - 若接口异常或无部门名,则原项不变。
* - color 为自动分配的浅色系,便于前端高亮展示。
* - 建议在数据源变更时重新调用。
*/
export async function withDeptName(conversationList) {
const nicknames = conversationList.map(item => item.showName);
let deptMap = {};
try {
const res = await getDeptNameByNickName(nicknames);
if (Array.isArray(res.data)) {
res.data.forEach(obj => {
if (obj && obj.nickName && obj.deptName) {
deptMap[obj.nickName] = obj.deptName;
}
});
}
} catch (e) {
deptMap = {};
}
const colorList = [
'#FFB6C1', '#87CEFA', '#90EE90', '#FFD700', '#FFA07A',
'#9370DB', '#00CED1', '#FF69B4', '#B0C4DE', '#40E0D0',
];
const deptNameSet = new Set();
Object.values(deptMap).forEach(deptName => {
deptNameSet.add(deptName);
});
const deptNameArr = Array.from(deptNameSet);
const deptColorMap = {};
deptNameArr.forEach((dept, idx) => {
deptColorMap[dept] = colorList[idx % colorList.length];
});
return conversationList.map(item => {
const deptName = deptMap[item.showName];
if (deptName) {
return {
...item,
deptName,
color: deptColorMap[deptName] || ''
}
} else {
return { ...item }
}
});
}