|
|
@@ -1,94 +1,77 @@
|
|
|
/**
|
|
|
- * 当前登录用户所属机构(与 PC 端 src/utils/current-org.js 同一口径):
|
|
|
- * 「所属机构」下拉选项一律取登录缓存 loginChangeGroupVOList,
|
|
|
- * 不再调 /main/group/getGroupList 全量接口——普通账号不该看到其它公司。
|
|
|
+ * 当前登录用户所属机构 / 部门(2026-11-03 按用户口述校准):
|
|
|
+ * - 「所属机构」唯一来源:登录缓存 userInfo.orgVO,形如 { id, name, code, type };
|
|
|
+ * - 「所属部门」来源:loginChangeGroupVOList(groupType=30 的部门列表),
|
|
|
+ * 其中 isMainGroup == 1 的那条为主所属部门。
|
|
|
*
|
|
|
- * 移动端登录后把 /main/user/login 的返回整体存在 storage 的 userInfo 里,
|
|
|
- * 与 PC vuex 里 user.info 同源,故直接读 loginChangeGroupVOList。
|
|
|
+ * 历史口径错误:早期把 loginChangeGroupVOList 当成「所属机构」候选,
|
|
|
+ * 于是「研发部」被当成所属机构显示在调岗申请 / 入职登记 / 档案编辑三处。
|
|
|
*/
|
|
|
import { pickLegalEntities } from "@/utils/hr/organization-tree";
|
|
|
|
|
|
-/** 是否有效机构 id(0 视为无效) */
|
|
|
-function isValidId(value) {
|
|
|
- return value !== undefined && value !== null && value !== "" && Number(value) !== 0;
|
|
|
-}
|
|
|
-
|
|
|
-/** 登录缓存中的可选机构列表 → [{ id, name }](即当前账号所属公司) */
|
|
|
-export function getLoginGroupOptions() {
|
|
|
+/** 登录缓存的业务字段层(兼容 { raw: {...} } 包装的历史写法) */
|
|
|
+function cacheSource() {
|
|
|
const info = uni.getStorageSync("userInfo") || {};
|
|
|
- const raw = info.raw || {};
|
|
|
- const list = info.loginChangeGroupVOList || raw.loginChangeGroupVOList || [];
|
|
|
- return (Array.isArray(list) ? list : [])
|
|
|
- .filter((item) => item && isValidId(item.groupId))
|
|
|
- .map((item) => ({
|
|
|
- id: item.groupId,
|
|
|
- name: item.groupName || item.name || item.organName || item.orgName || "",
|
|
|
- }));
|
|
|
+ return info.raw && typeof info.raw === "object" ? info.raw : info;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 当前登录用户所属机构 id:
|
|
|
- * 优先取登录缓存机构列表第一条(用户所属多个机构时默认第一个),
|
|
|
- * 缓存缺失时回落 userInfo.currentGroupId(登录/切换机构时写入)。
|
|
|
+ * 所属机构:登录缓存 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 options = getLoginGroupOptions();
|
|
|
- if (options.length) return options[0].id;
|
|
|
- const info = uni.getStorageSync("userInfo") || {};
|
|
|
- const raw = info.raw || {};
|
|
|
- const current = info.currentGroupId != null ? info.currentGroupId : raw.currentGroupId;
|
|
|
- return isValidId(current) ? current : null;
|
|
|
+ const org = getCurrentOrg();
|
|
|
+ return org ? org.id : null;
|
|
|
}
|
|
|
|
|
|
-/** 当前登录用户所属机构 { id, name } */
|
|
|
-export function getCurrentOrg() {
|
|
|
- const id = getCurrentOrgId();
|
|
|
- const matched = getLoginGroupOptions().find((item) => String(item.id) === String(id));
|
|
|
- return matched || { id, name: "" };
|
|
|
+/**
|
|
|
+ * 登录缓存里的部门列表 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;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 「所属机构」下拉选项(口径对齐 PC EmployeeArchiveForm.legalEntities):
|
|
|
- * ① 主源:登录缓存 loginChangeGroupVOList(当前账号所属公司),**不再用全量机构树**;
|
|
|
- * ② 缓存里只有 id 没有名称时(老缓存/接口缺字段),才回落到组织树里的集团/公司节点,
|
|
|
- * 保证下拉可读可选,而不是显示成一串 id;
|
|
|
- * ③ 当前值不在候选中时(编辑老档案,原机构已不在账号所属范围)补一条兜底项,
|
|
|
- * 避免下拉只显示 ID、且不会因此改掉已保存的值。
|
|
|
- * @param {Array} orgList 组织树全量列表(仅用于 ②③ 兜底,可传空)
|
|
|
+ * 「所属机构」下拉选项:唯一主源是登录缓存 orgVO(普通账号只属于自己的公司)。
|
|
|
+ * orgVO 缺名称时按 id 从组织树补名(只补名称,不扩大候选范围);
|
|
|
+ * currentId 不在候选里时(看他人档案 / 历史单据)补一条,保证原值能显示、能保存。
|
|
|
+ * @param {Array} orgList 组织树全量列表(仅用于补名称,可传空)
|
|
|
* @param {string|number} currentId 当前编辑中的机构 id
|
|
|
- * @param {string} currentName 当前编辑中的机构名称(组织树里也找不到时兜底显示)
|
|
|
+ * @param {string} currentName 当前编辑中的机构名称
|
|
|
* @returns {Array<{id:string, name:string}>}
|
|
|
*/
|
|
|
export function getOrgOptionsWithFallback(orgList = [], currentId = "", currentName = "") {
|
|
|
const tree = Array.isArray(orgList) ? orgList : [];
|
|
|
- const companiesFromTree = () =>
|
|
|
- pickLegalEntities(tree).map((item) => ({ id: String(item.id), name: item.name || "" }));
|
|
|
const nameFromTree = (id) => {
|
|
|
- const hit = companiesFromTree().find((item) => String(item.id) === String(id));
|
|
|
- return hit ? hit.name : "";
|
|
|
+ const hit = pickLegalEntities(tree).find((item) => String(item.id) === String(id));
|
|
|
+ return hit ? hit.name || "" : "";
|
|
|
};
|
|
|
|
|
|
- let list;
|
|
|
- const cached = getLoginGroupOptions();
|
|
|
- if (cached.length) {
|
|
|
- // 机构范围锁在登录缓存里;只是名称缺失(老缓存/接口少字段)时按 id 从组织树补名,
|
|
|
- // 不因为“没名称”就把候选扩大到全部公司(这点比 PC 更严一点)
|
|
|
- list = cached.map((item) => ({
|
|
|
- id: String(item.id),
|
|
|
- name: item.name || nameFromTree(item.id),
|
|
|
- }));
|
|
|
- } else {
|
|
|
- // 完全没有登录缓存(半登录态/老缓存)才回落组织树,否则下拉会是空的
|
|
|
- list = companiesFromTree();
|
|
|
- console.log(
|
|
|
- "[current-org] 登录缓存无机构列表,回落组织树:",
|
|
|
- list.map((item) => item.id).join(",") || "-"
|
|
|
- );
|
|
|
- }
|
|
|
+ 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;
|