Files
im-uniapp/util/withDeptName.js

76 lines
2.6 KiB
JavaScript
Raw Permalink Normal View History

2025-07-14 17:02:56 +08:00
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 }
}
});
}