import { getDeptNameByNickName } from '@/api/oa/binding'; /* * withDeptName 高阶函数 * --------------------------------------------- * 用途: * 为会话列表(如IM会话、联系人等)异步注入部门名称和部门颜色, * 使前端组件可直接渲染带部门信息的会话项。 * * 参数: * @param {Array} conversationList - 原始会话对象数组, * 每项需包含唯一标识(如 showName 字段)。 * * 返回: * @returns {Promise>} - 返回一个 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 } } }); }