76 lines
2.6 KiB
JavaScript
76 lines
2.6 KiB
JavaScript
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 }
|
||
}
|
||
});
|
||
}
|