current-org.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * 当前登录用户所属机构 / 部门(2026-11-03 按用户口述校准):
  3. * - 「所属机构」唯一来源:登录缓存 userInfo.orgVO,形如 { id, name, code, type };
  4. * - 「所属部门」来源:loginChangeGroupVOList(groupType=30 的部门列表),
  5. * 其中 isMainGroup == 1 的那条为主所属部门。
  6. *
  7. * 历史口径错误:早期把 loginChangeGroupVOList 当成「所属机构」候选,
  8. * 于是「研发部」被当成所属机构显示在调岗申请 / 入职登记 / 档案编辑三处。
  9. */
  10. import { pickLegalEntities } from "@/utils/hr/organization-tree";
  11. /** 登录缓存的业务字段层(兼容 { raw: {...} } 包装的历史写法) */
  12. function cacheSource() {
  13. const info = uni.getStorageSync("userInfo") || {};
  14. return info.raw && typeof info.raw === "object" ? info.raw : info;
  15. }
  16. /**
  17. * 所属机构:登录缓存 orgVO → { id, name }。
  18. * 接口未返回 orgVO 时返回 null,由调用方如实提示,不拿部门或组织树顶替。
  19. */
  20. export function getCurrentOrg() {
  21. const org = cacheSource().orgVO;
  22. if (!org || org.id == null || org.id === "") return null;
  23. return { id: String(org.id), name: org.name || "" };
  24. }
  25. /** 所属机构 id(无 orgVO 时 null) */
  26. export function getCurrentOrgId() {
  27. const org = getCurrentOrg();
  28. return org ? org.id : null;
  29. }
  30. /**
  31. * 登录缓存里的部门列表 loginChangeGroupVOList → [{ id, name, isMainGroup }]。
  32. * 注意:这是「部门」列表(groupType=30),不是机构列表;isMainGroup==1 是主所属部门。
  33. */
  34. export function getLoginGroupOptions() {
  35. const list = cacheSource().loginChangeGroupVOList;
  36. return (Array.isArray(list) ? list : [])
  37. .filter((item) => item && item.groupId != null && item.groupId !== "")
  38. .map((item) => ({
  39. id: String(item.groupId),
  40. name: item.groupName || "",
  41. isMainGroup: Number(item.isMainGroup) === 1,
  42. }));
  43. }
  44. /** 主所属部门(isMainGroup == 1);缓存里没有该标识时返回 null,不猜第一条 */
  45. export function getMainDept() {
  46. return getLoginGroupOptions().find((item) => item.isMainGroup) || null;
  47. }
  48. /**
  49. * 「所属机构」下拉选项:唯一主源是登录缓存 orgVO(普通账号只属于自己的公司)。
  50. * orgVO 缺名称时按 id 从组织树补名(只补名称,不扩大候选范围);
  51. * currentId 不在候选里时(看他人档案 / 历史单据)补一条,保证原值能显示、能保存。
  52. * @param {Array} orgList 组织树全量列表(仅用于补名称,可传空)
  53. * @param {string|number} currentId 当前编辑中的机构 id
  54. * @param {string} currentName 当前编辑中的机构名称
  55. * @returns {Array<{id:string, name:string}>}
  56. */
  57. export function getOrgOptionsWithFallback(orgList = [], currentId = "", currentName = "") {
  58. const tree = Array.isArray(orgList) ? orgList : [];
  59. const nameFromTree = (id) => {
  60. const hit = pickLegalEntities(tree).find((item) => String(item.id) === String(id));
  61. return hit ? hit.name || "" : "";
  62. };
  63. const org = getCurrentOrg();
  64. let list = org ? [{ id: org.id, name: org.name || nameFromTree(org.id) }] : [];
  65. const id = currentId == null || currentId === "" ? "" : String(currentId);
  66. if (id && !list.some((item) => String(item.id) === id)) {
  67. list = [{ id, name: nameFromTree(id) || currentName || "" }].concat(list);
  68. }
  69. return list;
  70. }