From 11aba9e2c85a555d35f5204d481bc3617f5d9e92 Mon Sep 17 00:00:00 2001 From: xlsea Date: Thu, 22 May 2025 22:56:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../custom/workflow-category-select.vue | 46 +++ src/constants/workflow.ts | 10 + src/locales/langs/en-us.ts | 3 +- src/locales/langs/zh-cn.ts | 3 +- src/router/elegant/imports.ts | 1 + src/router/elegant/routes.ts | 9 + src/router/elegant/transform.ts | 3 +- src/service/api/workflow/category.ts | 8 + src/service/api/workflow/definition.ts | 56 +++ src/service/api/workflow/index.ts | 1 + src/typings/api/workflow.api.d.ts | 46 +++ src/typings/components.d.ts | 2 + src/typings/elegant-router.d.ts | 2 + src/views/workflow/category/index.vue | 1 - .../modules/category-operate-drawer.vue | 12 +- .../workflow/process-definition/index.vue | 352 ++++++++++++++++++ .../modules/definition-import-modal.vue | 159 ++++++++ .../modules/definition-operate-drawer.vue | 133 +++++++ .../modules/definition-search.vue | 67 ++++ 19 files changed, 899 insertions(+), 15 deletions(-) create mode 100644 src/components/custom/workflow-category-select.vue create mode 100644 src/constants/workflow.ts create mode 100644 src/service/api/workflow/definition.ts create mode 100644 src/views/workflow/process-definition/index.vue create mode 100644 src/views/workflow/process-definition/modules/definition-import-modal.vue create mode 100644 src/views/workflow/process-definition/modules/definition-operate-drawer.vue create mode 100644 src/views/workflow/process-definition/modules/definition-search.vue diff --git a/src/components/custom/workflow-category-select.vue b/src/components/custom/workflow-category-select.vue new file mode 100644 index 00000000..d3ce2e4b --- /dev/null +++ b/src/components/custom/workflow-category-select.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/constants/workflow.ts b/src/constants/workflow.ts new file mode 100644 index 00000000..234681be --- /dev/null +++ b/src/constants/workflow.ts @@ -0,0 +1,10 @@ +import { transformRecordToOption } from '@/utils/common'; + +/** workflow publish status */ +export const workflowPublishStatusRecord: Record = { + '0': '未发布', + '1': '已发布', + '9': '失效' +}; + +export const workflowPublishStatusOptions = transformRecordToOption(workflowPublishStatusRecord); diff --git a/src/locales/langs/en-us.ts b/src/locales/langs/en-us.ts index 3730e8bd..0e9fc22f 100644 --- a/src/locales/langs/en-us.ts +++ b/src/locales/langs/en-us.ts @@ -217,7 +217,8 @@ const local: App.I18n.Schema = { exception: 'Exception', exception_403: '403', exception_404: '404', - exception_500: '500' + exception_500: '500', + 'workflow_process-definition': 'Process Definition' }, page: { login: { diff --git a/src/locales/langs/zh-cn.ts b/src/locales/langs/zh-cn.ts index e2bb23e6..fe46e957 100644 --- a/src/locales/langs/zh-cn.ts +++ b/src/locales/langs/zh-cn.ts @@ -217,7 +217,8 @@ const local: App.I18n.Schema = { exception: '异常页', exception_403: '403', exception_404: '404', - exception_500: '500' + exception_500: '500', + 'workflow_process-definition': '流程定义' }, page: { login: { diff --git a/src/router/elegant/imports.ts b/src/router/elegant/imports.ts index 6ddf682e..e6206e98 100644 --- a/src/router/elegant/imports.ts +++ b/src/router/elegant/imports.ts @@ -44,4 +44,5 @@ export const views: Record Promise import("@/views/system/user/index.vue"), tool_gen: () => import("@/views/tool/gen/index.vue"), workflow_category: () => import("@/views/workflow/category/index.vue"), + "workflow_process-definition": () => import("@/views/workflow/process-definition/index.vue"), }; diff --git a/src/router/elegant/routes.ts b/src/router/elegant/routes.ts index 556719cf..85d79599 100644 --- a/src/router/elegant/routes.ts +++ b/src/router/elegant/routes.ts @@ -349,6 +349,15 @@ export const generatedRoutes: GeneratedRoute[] = [ title: 'workflow_category', i18nKey: 'route.workflow_category' } + }, + { + name: 'workflow_process-definition', + path: '/workflow/process-definition', + component: 'view.workflow_process-definition', + meta: { + title: 'workflow_process-definition', + i18nKey: 'route.workflow_process-definition' + } } ] } diff --git a/src/router/elegant/transform.ts b/src/router/elegant/transform.ts index 13279891..4a54703c 100644 --- a/src/router/elegant/transform.ts +++ b/src/router/elegant/transform.ts @@ -200,7 +200,8 @@ const routeMap: RouteMap = { "tool_gen": "/tool/gen", "user-center": "/user-center", "workflow": "/workflow", - "workflow_category": "/workflow/category" + "workflow_category": "/workflow/category", + "workflow_process-definition": "/workflow/process-definition" }; /** diff --git a/src/service/api/workflow/category.ts b/src/service/api/workflow/category.ts index 2e6fc97c..e0c8bdcb 100644 --- a/src/service/api/workflow/category.ts +++ b/src/service/api/workflow/category.ts @@ -43,3 +43,11 @@ export function fetchExportCategory(params?: Api.Workflow.WorkflowCategorySearch params }); } + +/** 获取分类树 */ +export function fetchGetCategoryTree() { + return request({ + url: '/workflow/category/categoryTree', + method: 'get' + }); +} diff --git a/src/service/api/workflow/definition.ts b/src/service/api/workflow/definition.ts new file mode 100644 index 00000000..e891c437 --- /dev/null +++ b/src/service/api/workflow/definition.ts @@ -0,0 +1,56 @@ +import { request } from '@/service/request'; + +/** 获取流程定义列表 */ +export function fetchGetDefinitionList(params?: Api.Workflow.DefinitionSearchParams) { + return request({ + url: '/workflow/definition/list', + method: 'get', + params + }); +} + +/** 获取未发布流程定义列表 */ +export function fetchGetUnPublishDefinitionList(params?: Api.Workflow.DefinitionSearchParams) { + return request({ + url: '/workflow/definition/unPublishList', + method: 'get', + params + }); +} + +/** 新增流程定义 */ +export function fetchCreateDefinition(data: Api.Workflow.DefinitionOperateParams) { + return request({ + url: '/workflow/definition', + method: 'post', + data + }); +} + +/** 修改流程定义 */ +export function fetchUpdateDefinition(data: Api.Workflow.DefinitionOperateParams) { + return request({ + url: '/workflow/definition', + method: 'put', + data + }); +} + +/** 批量删除流程定义 */ +export function fetchBatchDeleteDefinition(ids: CommonType.IdType[]) { + return request({ + url: `/workflow/definition/${ids.join(',')}`, + method: 'delete' + }); +} + +/** 激活/挂起流程定义 */ +export function fetchActiveDefinition(id: CommonType.IdType, active: boolean) { + return request({ + url: `/workflow/definition/active/${id}`, + method: 'put', + params: { + active + } + }); +} diff --git a/src/service/api/workflow/index.ts b/src/service/api/workflow/index.ts index 182b5fe1..901afeb2 100644 --- a/src/service/api/workflow/index.ts +++ b/src/service/api/workflow/index.ts @@ -1 +1,2 @@ export * from './category'; +export * from './definition'; diff --git a/src/typings/api/workflow.api.d.ts b/src/typings/api/workflow.api.d.ts index 10587e95..781e52f4 100644 --- a/src/typings/api/workflow.api.d.ts +++ b/src/typings/api/workflow.api.d.ts @@ -40,5 +40,51 @@ declare namespace Api { /** 工作流分类列表 */ type WorkflowCategoryList = WorkflowCategory[]; + + /** 工作流发布状态 */ + type WorkflowPublishStatus = 0 | 1 | 9; + + /** definition */ + type Definition = Common.CommonTenantRecord<{ + /** 主键id */ + id: CommonType.IdType; + /** 流程编码 */ + flowCode: string; + /** 流程名称 */ + flowName: string; + /** 流程类别 */ + category: string; + /** 流程版本 */ + version: string; + /** 是否发布(0未发布 1已发布 9失效) */ + isPublish: WorkflowPublishStatus; + /** 审批表单是否自定义(Y是 N否) */ + formCustom: string; + /** 审批表单路径 */ + formPath: string; + /** 流程激活状态(0挂起 1激活) */ + activityStatus: number; + /** 监听器类型 */ + listenerType: string; + /** 监听器路径 */ + listenerPath: string; + /** 业务详情 存业务表对象json字符串 */ + ext: string; + /** 删除标志 */ + delFlag: string; + }>; + + /** definition search params */ + type DefinitionSearchParams = CommonType.RecordNullable< + Pick & Api.Common.CommonSearchParams + >; + + /** definition operate params */ + type DefinitionOperateParams = CommonType.RecordNullable< + Pick + >; + + /** definition list */ + type DefinitionList = Api.Common.PaginatingQueryRecord; } } diff --git a/src/typings/components.d.ts b/src/typings/components.d.ts index 6ae162ed..9c620148 100644 --- a/src/typings/components.d.ts +++ b/src/typings/components.d.ts @@ -12,6 +12,7 @@ declare module 'vue' { BetterScroll: typeof import('./../components/custom/better-scroll.vue')['default'] BooleanTag: typeof import('./../components/custom/boolean-tag.vue')['default'] ButtonIcon: typeof import('./../components/custom/button-icon.vue')['default'] + copy: typeof import('./../components/custom/dept-tree-select copy.vue')['default'] CountTo: typeof import('./../components/custom/count-to.vue')['default'] DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default'] DeptTree: typeof import('./../components/custom/dept-tree.vue')['default'] @@ -144,5 +145,6 @@ declare module 'vue' { ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.vue')['default'] UserSelect: typeof import('./../components/custom/user-select.vue')['default'] WaveBg: typeof import('./../components/custom/wave-bg.vue')['default'] + WorkflowCategorySelect: typeof import('./../components/custom/workflow-category-select.vue')['default'] } } diff --git a/src/typings/elegant-router.d.ts b/src/typings/elegant-router.d.ts index b05f3c7a..58a4bd96 100644 --- a/src/typings/elegant-router.d.ts +++ b/src/typings/elegant-router.d.ts @@ -55,6 +55,7 @@ declare module "@elegant-router/types" { "user-center": "/user-center"; "workflow": "/workflow"; "workflow_category": "/workflow/category"; + "workflow_process-definition": "/workflow/process-definition"; }; /** @@ -149,6 +150,7 @@ declare module "@elegant-router/types" { | "system_user" | "tool_gen" | "workflow_category" + | "workflow_process-definition" >; /** diff --git a/src/views/workflow/category/index.vue b/src/views/workflow/category/index.vue index 560c12b5..ec91c56f 100644 --- a/src/views/workflow/category/index.vue +++ b/src/views/workflow/category/index.vue @@ -197,7 +197,6 @@ function handleExport() { v-model:visible="drawerVisible" :operate-type="operateType" :row-data="editingData" - :category-tree-list="data" @submitted="getData" /> diff --git a/src/views/workflow/category/modules/category-operate-drawer.vue b/src/views/workflow/category/modules/category-operate-drawer.vue index 55a55a52..42c30e07 100644 --- a/src/views/workflow/category/modules/category-operate-drawer.vue +++ b/src/views/workflow/category/modules/category-operate-drawer.vue @@ -12,8 +12,6 @@ interface Props { operateType: NaiveUI.TableOperateType; /** the edit row data */ rowData?: Api.Workflow.WorkflowCategory | null; - /** the category data */ - categoryTreeList?: Api.Workflow.WorkflowCategory[] | null; } const props = defineProps(); @@ -109,15 +107,7 @@ watch(visible, () => { - + diff --git a/src/views/workflow/process-definition/index.vue b/src/views/workflow/process-definition/index.vue new file mode 100644 index 00000000..5561b125 --- /dev/null +++ b/src/views/workflow/process-definition/index.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/src/views/workflow/process-definition/modules/definition-import-modal.vue b/src/views/workflow/process-definition/modules/definition-import-modal.vue new file mode 100644 index 00000000..4b37d7fe --- /dev/null +++ b/src/views/workflow/process-definition/modules/definition-import-modal.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/workflow/process-definition/modules/definition-operate-drawer.vue b/src/views/workflow/process-definition/modules/definition-operate-drawer.vue new file mode 100644 index 00000000..dea20f1f --- /dev/null +++ b/src/views/workflow/process-definition/modules/definition-operate-drawer.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/workflow/process-definition/modules/definition-search.vue b/src/views/workflow/process-definition/modules/definition-search.vue new file mode 100644 index 00000000..1d7745d1 --- /dev/null +++ b/src/views/workflow/process-definition/modules/definition-search.vue @@ -0,0 +1,67 @@ + + + + +