/** * 当前登录用户所属机构 / 部门(2026-11-03 按用户口述校准): * - 「所属机构」唯一来源:登录缓存 userInfo.orgVO,形如 { id, name, code, type }; * - 「所属部门」来源:loginChangeGroupVOList(groupType=30 的部门列表), * 其中 isMainGroup == 1 的那条为主所属部门。 * * 历史口径错误:早期把 loginChangeGroupVOList 当成「所属机构」候选, * 于是「研发部」被当成所属机构显示在调岗申请 / 入职登记 / 档案编辑三处。 */ import { pickLegalEntities } from "@/utils/hr/organization-tree"; /** 登录缓存的业务字段层(兼容 { raw: {...} } 包装的历史写法) */ function cacheSource() { const info = uni.getStorageSync("userInfo") || {}; return info.raw && typeof info.raw === "object" ? info.raw : info; } /** * 所属机构:登录缓存 orgVO → { id, name }。 * 接口未返回 orgVO 时返回 null,由调用方如实提示,不拿部门或组织树顶替。 */ export function getCurrentOrg() { const org = cacheSource().orgVO; if (!org || org.id == null || org.id === "") return null; return { id: String(org.id), name: org.name || "" }; } /** 所属机构 id(无 orgVO 时 null) */ export function getCurrentOrgId() { const org = getCurrentOrg(); return org ? org.id : null; } /** * 登录缓存里的部门列表 loginChangeGroupVOList → [{ id, name, isMainGroup }]。 * 注意:这是「部门」列表(groupType=30),不是机构列表;isMainGroup==1 是主所属部门。 */ export function getLoginGroupOptions() { const list = cacheSource().loginChangeGroupVOList; return (Array.isArray(list) ? list : []) .filter((item) => item && item.groupId != null && item.groupId !== "") .map((item) => ({ id: String(item.groupId), name: item.groupName || "", isMainGroup: Number(item.isMainGroup) === 1, })); } /** 主所属部门(isMainGroup == 1);缓存里没有该标识时返回 null,不猜第一条 */ export function getMainDept() { return getLoginGroupOptions().find((item) => item.isMainGroup) || null; } /** * 「所属机构」下拉选项:唯一主源是登录缓存 orgVO(普通账号只属于自己的公司)。 * orgVO 缺名称时按 id 从组织树补名(只补名称,不扩大候选范围); * currentId 不在候选里时(看他人档案 / 历史单据)补一条,保证原值能显示、能保存。 * @param {Array} orgList 组织树全量列表(仅用于补名称,可传空) * @param {string|number} currentId 当前编辑中的机构 id * @param {string} currentName 当前编辑中的机构名称 * @returns {Array<{id:string, name:string}>} */ export function getOrgOptionsWithFallback(orgList = [], currentId = "", currentName = "") { const tree = Array.isArray(orgList) ? orgList : []; const nameFromTree = (id) => { const hit = pickLegalEntities(tree).find((item) => String(item.id) === String(id)); return hit ? hit.name || "" : ""; }; const org = getCurrentOrg(); let list = org ? [{ id: org.id, name: org.name || nameFromTree(org.id) }] : []; const id = currentId == null || currentId === "" ? "" : String(currentId); if (id && !list.some((item) => String(item.id) === id)) { list = [{ id, name: nameFromTree(id) || currentName || "" }].concat(list); } return list; }