diff --git a/software/web/src/api/user.ts b/software/web/src/api/user.ts index c649bb1..9c995fd 100644 --- a/software/web/src/api/user.ts +++ b/software/web/src/api/user.ts @@ -47,11 +47,14 @@ export async function fetchUsers(params: { page?: number; page_size?: number; keyword?: string; + /** 角色过滤:0=操作员 1=企业管理员 2=总管理员;不给 = 全部 */ + role?: number; }): Promise { const searchParams = new URLSearchParams(); if (params.page) searchParams.set('page', String(params.page)); if (params.page_size) searchParams.set('page_size', String(params.page_size)); if (params.keyword) searchParams.set('keyword', params.keyword); + if (params.role !== undefined) searchParams.set('role', String(params.role)); const res = await api.get(`/users?${searchParams.toString()}`); return res.data; } diff --git a/software/web/src/pages/settings/users.tsx b/software/web/src/pages/settings/users.tsx index 23521ce..268f16c 100644 --- a/software/web/src/pages/settings/users.tsx +++ b/software/web/src/pages/settings/users.tsx @@ -339,6 +339,19 @@ export default function UsersPage() { setScopeModalVisible(true); }; + /** 表格内直接分配组织(仅超管可见/可操作)。 + * 不必进编辑弹窗 —— 生产上有 3 个用户从未分过组织,逐个进弹窗改太慢。 */ + const handleAssignOrg = async (user: User, orgId: number) => { + try { + await updateUser(user.id, { organization_id: orgId }); + Message.success(`已将「${user.name || user.phone}」分配到该组织`); + fetchData(); + } catch (e: any) { + Message.error(e?.message || '分配失败'); + fetchData(); // 失败也刷新,把下拉回滚到真实值 + } + }; + /** 表格列 */ const columns: TableColumnProps[] = [ { title: '手机号', dataIndex: 'phone', width: 130 }, @@ -347,8 +360,29 @@ export default function UsersPage() { { title: '所属组织', dataIndex: 'organization_name', - width: 150, - render: (v: string | null) => v || '-', + width: 180, + render: (v: string | null, record: User) => { + // 总管理员本就不属任何组织(后端 resolve_update_org_id 对 role=2 强制 None); + // 非超管操作者也只能看,不能改。 + if (!isSuperAdmin || record.role === 2) { + return v || '-'; + } + // 超管 + 非总管理员 ⇒ 表格里直接分配(生产上有用户从未分过组织) + return ( +