diff --git a/src/main.ts b/src/main.ts index cb32e47..ab45c37 100644 --- a/src/main.ts +++ b/src/main.ts @@ -72,7 +72,7 @@ const parseCurrentOrgIdFromToken = (token: string | null): string | undefined => router.beforeEach(async (to, from , next) => { document.title = to.meta.title as string; let { store, read, login, logout, chooseRole, getUnreadTongzhis, set_editing } = useUser(); - let { store: orgStore, loadMyOrgs, switchOrg } = useOrg(); + let { store: orgStore, loadMyOrgs, switchOrg, loadMyDepartments } = useOrg(); set_editing(false) store.unionid = (store.unionid || cookie.get(HtyUnionIDToken) || '').toString(); if (!store.current.hty_id) { @@ -173,6 +173,8 @@ router.beforeEach(async (to, from , next) => { if (currentAuthToken) { window.localStorage.setItem(HtySudoToken, currentAuthToken); } + // load departments after org switch (single-department transparent) + await loadMyDepartments(); } else if (organizations.length > 1) { await router.replace('/org/select'); next(); @@ -182,6 +184,10 @@ router.beforeEach(async (to, from , next) => { window.localStorage.setItem(CurrentOrgId, tokenOrgId); orgStore.currentOrgId = tokenOrgId; } + // load departments if not already loaded (after org context is established) + if (orgStore.currentOrgId && orgStore.departments.length === 0) { + await loadMyDepartments(); + } } let {stopTimer} = useTimer() diff --git a/src/store/org.ts b/src/store/org.ts index 7943b35..5062550 100644 --- a/src/store/org.ts +++ b/src/store/org.ts @@ -1,19 +1,23 @@ import { reactive } from "vue"; import request from "~/utils/request"; import { CurrentOrgId, HtyAuthToken, HtySudoToken } from "~/utils"; -import type { Organization } from "~/types"; +import type { Department, Organization } from "~/types"; import { showDialog, showFailToast } from "vant"; interface OrgState { currentOrgId?: string; orgs: Organization[]; homepageMd?: string; + departments: Department[]; + currentDepartmentId?: string; } const store = reactive({ currentOrgId: window.localStorage.getItem(CurrentOrgId) || undefined, orgs: [], homepageMd: "", + departments: [], + currentDepartmentId: window.localStorage.getItem("CurrentDepartmentId") || undefined, }); type JwtPayloadDebug = { @@ -151,6 +155,46 @@ export default function useOrg() { return ""; }; + const loadMyDepartments = async () => { + const { r, d, e } = await request({ + url: "/api/v1/uc/org/departments/my", + method: "GET", + }); + if (r) { + store.departments = d || []; + // single department: auto-select + if (store.departments.length === 1) { + store.currentDepartmentId = store.departments[0].id; + window.localStorage.setItem("CurrentDepartmentId", store.currentDepartmentId); + } + return store.departments; + } + store.departments = []; + console.warn("[loadMyDepartments]", e); + return []; + }; + + const switchDepartment = async (departmentId: string) => { + const { r, d, e } = await request({ + url: "/api/v1/uc/org/department/switch", + method: "POST", + data: { department_id: departmentId }, + }); + if (!r) { + showFailToast(e); + return false; + } + if (typeof d !== "string") { + showFailToast("部门切换失败:返回 token 非法"); + return false; + } + window.localStorage.setItem(HtyAuthToken, d); + window.localStorage.setItem(HtySudoToken, d); + window.localStorage.setItem("CurrentDepartmentId", departmentId); + store.currentDepartmentId = departmentId; + return true; + }; + const saveHomepage = async (orgId: string, markdownText: string) => { const { r, d, e } = await request({ url: "/api/v1/uc/org/save_homepage", @@ -174,5 +218,7 @@ export default function useOrg() { switchOrg, getHomepage, saveHomepage, + loadMyDepartments, + switchDepartment, }; } diff --git a/src/types.ts b/src/types.ts index f613546..689c772 100644 --- a/src/types.ts +++ b/src/types.ts @@ -67,6 +67,17 @@ export interface Organization { is_delete?: boolean; } +export interface Department { + id: string; + org_id: string; + dept_name: string; + dept_desc?: string; + supervisor_user_info_id?: string; + is_default: boolean; + dept_status: string; + is_delete?: boolean; +} + export interface StudentSummary { student_id: string; student_name: string;