From 28843fc8fe19e62c72e491cf8bda65186fc8ca37 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 21 Oct 2025 19:39:06 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91bpm=20process?= =?UTF-8?q?Instance/report/=20=E7=9A=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-ele/src/router/routes/modules/bpm.ts | 24 +-- .../views/bpm/processInstance/report/data.ts | 157 +++++++++++++++++ .../bpm/processInstance/report/index.vue | 163 ++++++++++++++++++ 3 files changed, 332 insertions(+), 12 deletions(-) create mode 100644 apps/web-ele/src/views/bpm/processInstance/report/data.ts create mode 100644 apps/web-ele/src/views/bpm/processInstance/report/index.vue diff --git a/apps/web-ele/src/router/routes/modules/bpm.ts b/apps/web-ele/src/router/routes/modules/bpm.ts index c6bbc66c2..d732af975 100644 --- a/apps/web-ele/src/router/routes/modules/bpm.ts +++ b/apps/web-ele/src/router/routes/modules/bpm.ts @@ -98,18 +98,18 @@ const routes: RouteRecordRaw[] = [ // keepAlive: true, // }, // }, - // { - // path: 'process-instance/report', - // component: () => import('#/views/bpm/processInstance/report/index.vue'), - // name: 'BpmProcessInstanceReport', - // meta: { - // title: '数据报表', - // activePath: '/bpm/manager/model', - // icon: 'carbon:data-2', - // hideInMenu: true, - // keepAlive: true, - // }, - // }, + { + path: 'process-instance/report', + component: () => import('#/views/bpm/processInstance/report/index.vue'), + name: 'BpmProcessInstanceReport', + meta: { + title: '数据报表', + activePath: '/bpm/manager/model', + icon: 'carbon:data-2', + hideInMenu: true, + keepAlive: true, + }, + }, ], }, ]; diff --git a/apps/web-ele/src/views/bpm/processInstance/report/data.ts b/apps/web-ele/src/views/bpm/processInstance/report/data.ts new file mode 100644 index 000000000..dc099b5bf --- /dev/null +++ b/apps/web-ele/src/views/bpm/processInstance/report/data.ts @@ -0,0 +1,157 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { + VxeGridPropTypes, + VxeTableGridOptions, +} from '#/adapter/vxe-table'; +import type { BpmProcessInstanceApi } from '#/api/bpm/processInstance'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; + +interface FormField { + field: string; + title: string; + type: string; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema( + formFields: FormField[] = [], +): VbenFormSchema[] { + // 基础搜索字段配置 + const baseFormSchema: VbenFormSchema[] = [ + { + fieldName: 'startUserId', + label: '发起人', + component: 'ApiSelect', + componentProps: { + placeholder: '请选择发起人', + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + valueField: 'id', + }, + }, + { + fieldName: 'name', + label: '流程名称', + component: 'Input', + componentProps: { + placeholder: '请输入流程名称', + allowClear: true, + }, + }, + { + fieldName: 'status', + label: '流程状态', + component: 'Select', + componentProps: { + placeholder: '请选择流程状态', + allowClear: true, + options: getDictOptions( + DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS, + 'number', + ), + }, + }, + { + fieldName: 'createTime', + label: '发起时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + { + fieldName: 'endTime', + label: '结束时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; + + // 动态表单字段配置:目前支持 input 和 textarea 类型 + const dynamicFormSchema: VbenFormSchema[] = formFields + .filter((item) => ['input', 'textarea'].includes(item.type)) + .map((item) => ({ + fieldName: `formFieldsParams.${item.field}`, + label: item.title, + component: 'Input', + componentProps: { + placeholder: `请输入${item.title}`, + allowClear: true, + }, + })); + + return [...baseFormSchema, ...dynamicFormSchema]; +} + +/** 列表的字段 */ +export function useGridColumns( + formFields: FormField[] = [], +): VxeTableGridOptions['columns'] { + // 基础列配置 + const baseColumns: VxeGridPropTypes.Columns = + [ + { + field: 'name', + title: '流程名称', + minWidth: 250, + fixed: 'left', + }, + { + field: 'startUser.nickname', + title: '流程发起人', + minWidth: 200, + }, + { + field: 'status', + title: '流程状态', + minWidth: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS }, + }, + }, + { + field: 'startTime', + title: '发起时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + field: 'endTime', + title: '结束时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + ]; + + // 动态表单字段列配置:根据表单字段生成对应的列,从 formVariables 中获取值 + const formFieldColumns = formFields.map((item) => ({ + field: `formVariables.${item.field}`, + title: item.title, + minWidth: 120, + formatter: ({ row }: any) => { + return row.formVariables?.[item.field] ?? ''; + }, + })); + + return [ + ...baseColumns, + ...formFieldColumns, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/bpm/processInstance/report/index.vue b/apps/web-ele/src/views/bpm/processInstance/report/index.vue new file mode 100644 index 000000000..5c8641a3d --- /dev/null +++ b/apps/web-ele/src/views/bpm/processInstance/report/index.vue @@ -0,0 +1,163 @@ + + +