diff --git a/apps/web-antd/src/api/bpm/definition/index.ts b/apps/web-antd/src/api/bpm/definition/index.ts new file mode 100644 index 00000000..85cdecaf --- /dev/null +++ b/apps/web-antd/src/api/bpm/definition/index.ts @@ -0,0 +1,49 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +/** 流程定义 */ +export namespace BpmDefinitionApi { + export interface ProcessDefinitionVO { + id: string; + version: number; + deploymentTime: number; + suspensionState: number; + formType?: number; + } +} + +/** 查询流程定义 */ +export async function getProcessDefinition(id?: string, key?: string) { + return requestClient.get( + '/bpm/process-definition/get', + { + params: { id, key }, + }, + ); +} + +/** 分页查询流程定义 */ +export async function getProcessDefinitionPage(params: PageParam) { + return requestClient.get>( + '/bpm/process-definition/page', + { params }, + ); +} + +/** 查询流程定义列表 */ +export async function getProcessDefinitionList(params: any) { + return requestClient.get>( + '/bpm/process-definition/list', + { + params, + }, + ); +} + +/** 查询流程定义列表(简单列表) */ +export async function getSimpleProcessDefinitionList() { + return requestClient.get>( + '/bpm/process-definition/simple-list', + ); +} diff --git a/apps/web-antd/src/components/user-select-modal/user-select-modal.vue b/apps/web-antd/src/components/user-select-modal/user-select-modal.vue index 7437a8b2..198bad30 100644 --- a/apps/web-antd/src/components/user-select-modal/user-select-modal.vue +++ b/apps/web-antd/src/components/user-select-modal/user-select-modal.vue @@ -52,6 +52,7 @@ const props = withDefaults( const emit = defineEmits<{ cancel: []; + closed: []; confirm: [value: number[]]; 'update:value': [value: number[]]; }>(); @@ -167,9 +168,12 @@ const loadUserData = async (pageNo: number, pageSize: number) => { // 更新右侧列表数据 const updateRightListData = () => { - // 获取选中的用户 + // 使用 Set 来去重选中的用户ID + const uniqueSelectedIds = new Set(selectedUserIds.value); + + // 获取选中的用户,确保不重复 const selectedUsers = userList.value.filter((user) => - selectedUserIds.value.includes(String(user.id)), + uniqueSelectedIds.has(String(user.id)), ); // 应用搜索过滤 @@ -181,8 +185,10 @@ const updateRightListData = () => { ) : selectedUsers; - // 更新总数 - rightListState.value.pagination.total = filteredUsers.length; + // 更新总数(使用 Set 确保唯一性) + rightListState.value.pagination.total = new Set( + filteredUsers.map((user) => user.id), + ).size; // 应用分页 const { current, pageSize } = rightListState.value.pagination; @@ -219,8 +225,9 @@ const handleUserSearch = async (direction: string, value: string) => { // 处理用户选择变化 const handleUserChange = (targetKeys: string[]) => { - selectedUserIds.value = targetKeys; - emit('update:value', targetKeys.map(Number)); + // 使用 Set 来去重选中的用户ID + selectedUserIds.value = [...new Set(targetKeys)]; + emit('update:value', selectedUserIds.value.map(Number)); updateRightListData(); }; @@ -281,7 +288,14 @@ const open = async () => { pageSize: props.value.length, userIds: props.value, }); - userList.value.push(...list); + // 使用 Map 来去重,以用户 ID 为 key + const userMap = new Map(userList.value.map((user) => [user.id, user])); + list.forEach((user) => { + if (!userMap.has(user.id)) { + userMap.set(user.id, user); + } + }); + userList.value = [...userMap.values()]; updateRightListData(); } @@ -360,6 +374,7 @@ const handleCancel = () => { // 关闭弹窗 const handleClosed = () => { + emit('closed'); resetData(); }; @@ -421,7 +436,7 @@ defineExpose({ @search="handleUserSearch" >