Files
im-uniapp/util/withDeptName.js
2025-07-14 17:02:56 +08:00

76 lines
2.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 }
}
});
}