diff --git a/apps/web-antd/src/api/workflow/definition/index.ts b/apps/web-antd/src/api/workflow/definition/index.ts index bf228a6b..a450313d 100644 --- a/apps/web-antd/src/api/workflow/definition/index.ts +++ b/apps/web-antd/src/api/workflow/definition/index.ts @@ -101,6 +101,7 @@ export function workflowDefinitionImport(file: File) { export function workflowDefinitionExport(id: ID) { return requestClient.postWithMsg( `/workflow/definition/exportDef/${id}`, + {}, { responseType: 'blob', isTransformResponse: false, diff --git a/apps/web-antd/src/views/workflow/processDefinition/data.tsx b/apps/web-antd/src/views/workflow/processDefinition/data.tsx index b93c47cb..38845cfa 100644 --- a/apps/web-antd/src/views/workflow/processDefinition/data.tsx +++ b/apps/web-antd/src/views/workflow/processDefinition/data.tsx @@ -74,3 +74,32 @@ export const columns: VxeGridProps['columns'] = [ width: 280, }, ]; + +export const modalSchema: FormSchemaGetter = () => [ + { + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + fieldName: 'id', + }, + { + component: 'TreeSelect', + fieldName: 'category', + label: '流程分类', + rules: 'selectRequired', + }, + { + component: 'Input', + fieldName: 'flowCode', + label: '流程分类', + rules: 'required', + }, + { + component: 'Input', + fieldName: 'flowName', + label: '流程名称', + rules: 'required', + }, +]; diff --git a/apps/web-antd/src/views/workflow/processDefinition/index.vue b/apps/web-antd/src/views/workflow/processDefinition/index.vue index e601faea..c8d00325 100644 --- a/apps/web-antd/src/views/workflow/processDefinition/index.vue +++ b/apps/web-antd/src/views/workflow/processDefinition/index.vue @@ -4,7 +4,7 @@ import type { Recordable } from '@vben/types'; import { ref } from 'vue'; import { useRouter } from 'vue-router'; -import { Page, type VbenFormProps } from '@vben/common-ui'; +import { Page, useVbenModal, type VbenFormProps } from '@vben/common-ui'; import { $t } from '@vben/locales'; import { getVxePopupContainer } from '@vben/utils'; @@ -16,13 +16,16 @@ import { workflowDefinitionActive, workflowDefinitionCopy, workflowDefinitionDelete, + workflowDefinitionExport, workflowDefinitionList, workflowDefinitionPublish, } from '#/api/workflow/definition'; +import { downloadByData } from '#/utils/file/download'; import CategoryTree from './category-tree.vue'; import { ActivityStatusEnum } from './constant'; import { columns, querySchema } from './data'; +import processDefinitionModal from './process-definition-modal.vue'; // 左边部门用 const selectedCode = ref([]); @@ -81,7 +84,7 @@ const gridOptions: VxeGridProps = { rowConfig: { isHover: true, keyField: 'id', - height: 66, + height: 100, }, id: 'workflow-definition-index', }; @@ -158,6 +161,42 @@ async function handleCopy(row: any) { await workflowDefinitionCopy(row.id); await tableApi.query(); } + +const [ProcessDefinitionModal, modalApi] = useVbenModal({ + connectedComponent: processDefinitionModal, +}); + +/** + * 新增流程 + */ +function handleAdd() { + modalApi.setData({}); + modalApi.open(); +} + +/** + * 编辑流程 + */ +function handleEdit(row: any) { + modalApi.setData({ id: row.id }); + modalApi.open(); +} + +/** + * 导出xml + * @param row row + */ +async function handleExportXml(row: any) { + const hideLoading = message.loading($t('pages.common.downloadLoading'), 0); + try { + const blob = await workflowDefinitionExport(row.id); + downloadByData(blob, `${row.flowName}-${Date.now()}.xml`); + } catch (error) { + console.error(error); + } finally { + hideLoading(); + } +} + diff --git a/apps/web-antd/src/views/workflow/processDefinition/process-definition-modal.vue b/apps/web-antd/src/views/workflow/processDefinition/process-definition-modal.vue new file mode 100644 index 00000000..62d12cfa --- /dev/null +++ b/apps/web-antd/src/views/workflow/processDefinition/process-definition-modal.vue @@ -0,0 +1,141 @@ + + +