增加昵称和部门的匹配
This commit is contained in:
76
util/withDeptName.js
Normal file
76
util/withDeptName.js
Normal 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 }
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user