From 730786b61e8bfb684d863bdddb3412cf67290b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E5=A4=9C?= <278898052@qq.com> Date: Fri, 9 May 2025 20:23:19 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=80=89=E6=8B=A9=E5=BC=B9=E7=AA=97=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=85=B3=E9=97=AD=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=8C=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?ID=E5=8E=BB=E9=87=8D=E9=80=BB=E8=BE=91=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=EF=BC=8C=E6=94=AF=E6=8C=81=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=92=8C=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/bpm/definition/index.ts | 49 +++ .../user-select-modal/user-select-modal.vue | 31 +- .../bpm/processInstance/create/index.vue | 378 +++++++++++++++++- .../processInstance/create/modules/form.vue | 0 .../detail/modules/time-line.vue | 15 +- 5 files changed, 443 insertions(+), 30 deletions(-) create mode 100644 apps/web-antd/src/api/bpm/definition/index.ts create mode 100644 apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue 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 000000000..85cdecaf6 --- /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 7437a8b28..198bad308 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" >