diff --git a/apps/web-antd/src/api/system/project/index.ts b/apps/web-antd/src/api/system/project/index.ts index 4d767fb74..524cc09b8 100644 --- a/apps/web-antd/src/api/system/project/index.ts +++ b/apps/web-antd/src/api/system/project/index.ts @@ -23,12 +23,20 @@ export function getProjectPage(params: PageParam) { ); } +/** 获取当前登录用户授权的项目精简列表(顶栏项目切换器用) */ export function getSimpleProjectList() { return requestClient.get( '/system/project/simple-list', ); } +/** 获取本租户全部启用项目(管理员分配场景下拉数据源) */ +export function getAllProjectSimpleList() { + return requestClient.get( + '/system/project/all-simple-list', + ); +} + export function getProject(id: number) { return requestClient.get( `/system/project/get?id=${id}`, diff --git a/apps/web-antd/src/api/system/user-project/index.ts b/apps/web-antd/src/api/system/user-project/index.ts new file mode 100644 index 000000000..795a6f2e1 --- /dev/null +++ b/apps/web-antd/src/api/system/user-project/index.ts @@ -0,0 +1,46 @@ +import { requestClient } from '#/api/request'; + +export namespace SystemUserProjectApi { + export interface AssignUserProjectsReq { + userId: number; + projectIds: number[]; + } + export interface AssignProjectUsersReq { + projectId: number; + userIds: number[]; + } +} + +/** 给用户覆盖式分配项目 */ +export function assignUserProjects( + data: SystemUserProjectApi.AssignUserProjectsReq, +) { + return requestClient.post( + '/system/user-project/assign-user-projects', + data, + ); +} + +/** 给项目覆盖式分配成员 */ +export function assignProjectUsers( + data: SystemUserProjectApi.AssignProjectUsersReq, +) { + return requestClient.post( + '/system/user-project/assign-project-users', + data, + ); +} + +/** 查询某用户已绑定的项目编号集合 */ +export function getProjectIdsByUserId(userId: number) { + return requestClient.get( + `/system/user-project/list-project-ids-by-user?userId=${userId}`, + ); +} + +/** 查询某项目下绑定的用户编号集合 */ +export function getUserIdsByProjectId(projectId: number) { + return requestClient.get( + `/system/user-project/list-user-ids-by-project?projectId=${projectId}`, + ); +} diff --git a/apps/web-antd/src/views/system/project/data.ts b/apps/web-antd/src/views/system/project/data.ts index d4eb1080a..8bd1bf701 100644 --- a/apps/web-antd/src/views/system/project/data.ts +++ b/apps/web-antd/src/views/system/project/data.ts @@ -5,6 +5,7 @@ import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; import { z } from '#/adapter/form'; +import { getSimpleUserList } from '#/api/system/user'; /** 新增/修改的表单 */ export function useFormSchema(): VbenFormSchema[] { @@ -83,6 +84,51 @@ export function useFormSchema(): VbenFormSchema[] { ]; } +/** 管理成员的表单(项目 → 多用户) */ +export function useAssignUserFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'name', + label: '项目名称', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'code', + label: '项目编码', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'userIds', + label: '成员', + component: 'ApiSelect', + componentProps: { + api: getSimpleUserList, + labelField: 'nickname', + valueField: 'id', + mode: 'multiple', + placeholder: '请选择成员(留空表示清空所有成员)', + allowClear: true, + showSearch: true, + optionFilterProp: 'label', + }, + }, + ]; +} + /** 列表的搜索表单 */ export function useGridFormSchema(): VbenFormSchema[] { return [ diff --git a/apps/web-antd/src/views/system/project/index.vue b/apps/web-antd/src/views/system/project/index.vue index dec6426bd..708a59ede 100644 --- a/apps/web-antd/src/views/system/project/index.vue +++ b/apps/web-antd/src/views/system/project/index.vue @@ -14,6 +14,7 @@ import { deleteProject, getProjectPage } from '#/api/system/project'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; +import AssignUserForm from './modules/assign-user-form.vue'; import Form from './modules/form.vue'; const [FormModal, formModalApi] = useVbenModal({ @@ -21,6 +22,11 @@ const [FormModal, formModalApi] = useVbenModal({ destroyOnClose: true, }); +const [AssignUserModal, assignUserModalApi] = useVbenModal({ + connectedComponent: AssignUserForm, + destroyOnClose: true, +}); + /** 刷新表格 */ function handleRefresh() { gridApi.query(); @@ -36,6 +42,11 @@ function handleEdit(row: SystemProjectApi.Project) { formModalApi.setData(row).open(); } +/** 管理成员 */ +function handleAssignUser(row: SystemProjectApi.Project) { + assignUserModalApi.setData(row).open(); +} + /** 删除项目 */ async function handleDelete(row: SystemProjectApi.Project) { const hideLoading = message.loading({ @@ -114,6 +125,7 @@ const [Grid, gridApi] = useVbenVxeGrid({