10 changed files with 252 additions and 4 deletions
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 58 KiB |
@ -0,0 +1,243 @@ |
|||||||
|
<template> |
||||||
|
<div :class="prefixCls"> |
||||||
|
<ALayoutContent class="m-10"> |
||||||
|
<h4 class="text-center text-lg pb-2">{{ state.formTitle }}</h4> |
||||||
|
<img class="process-status-img" |
||||||
|
:src="state.processImg" |
||||||
|
alt="流程状态" |
||||||
|
> |
||||||
|
<ATables v-model:activeKey="state.taskSelectedTab" |
||||||
|
class="bg-white" |
||||||
|
:tab-bar-style="{ 'padding-left': '13px' }" |
||||||
|
@tab-click="handleTabsClick" |
||||||
|
> |
||||||
|
<ATabPane key="formInfo"> |
||||||
|
<template #tab> |
||||||
|
<span> |
||||||
|
<Icon icon="fa6-solid:file-lines"/>表单信息 |
||||||
|
</span> |
||||||
|
</template> |
||||||
|
<!-- 动态表单:内置使用枇杷表单设计器(待更新为VUE3海豚表单设计器) --> |
||||||
|
<workflow-preview-form v-if="state.formType !== '2'" |
||||||
|
ref="formPreview" |
||||||
|
:taskFormData="state.taskFormData" |
||||||
|
:disabled="true" |
||||||
|
/> |
||||||
|
<!-- 外置表单:内置使用用户自定义的vue页面,手动填写页面路径即可 --> |
||||||
|
<component :is="state.formPath" |
||||||
|
v-if="state.formType === '2'" |
||||||
|
ref="formPreview" |
||||||
|
:formReadOnly="state.formReadOnly" |
||||||
|
:businessId="state.businessId" |
||||||
|
:disabled="true" |
||||||
|
/> |
||||||
|
</ATabPane> |
||||||
|
<ATabPane key="processInfo"> |
||||||
|
<template #tab> |
||||||
|
<span> |
||||||
|
<Icon icon="fa6-solid:money-bill-wheat"/>流程信息 |
||||||
|
</span> |
||||||
|
</template> |
||||||
|
<WorkflowTimeLine :history-flow-change-list="state.historyFlowChangeList"/> |
||||||
|
</ATabPane> |
||||||
|
<ATabPane key="processChart"> |
||||||
|
<template #tab> |
||||||
|
<span> |
||||||
|
<Icon icon="fa-solid:image"/>流程图 |
||||||
|
</span> |
||||||
|
</template> |
||||||
|
<WorkflowChartModel ref="workflowChart"/> |
||||||
|
</ATabPane> |
||||||
|
<ATabPane key="flowRecord"> |
||||||
|
<template #tab> |
||||||
|
<span> |
||||||
|
<Icon icon="fa6-solid:bars-progress"/>流转记录 |
||||||
|
</span> |
||||||
|
</template> |
||||||
|
<WorkflowStep :history-flow-change-list="state.historyFlowChangeList"/> |
||||||
|
</ATabPane> |
||||||
|
</ATables> |
||||||
|
</ALayoutContent> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<script lang="ts" setup> |
||||||
|
/** |
||||||
|
* 提供模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致 |
||||||
|
* 采用vben-动态表格表单封装组件编写,采用 setup 写法 |
||||||
|
* Copyright © 2023-2023 <a href="https://godolphinx.org">海豚生态开源社区</a> All rights reserved. |
||||||
|
* author wangxiang4 |
||||||
|
*/ |
||||||
|
import { reactive, onActivated, unref, nextTick, ref } from 'vue'; |
||||||
|
import { LayoutContent, Tabs } from 'ant-design-vue'; |
||||||
|
import type { FormProperty } from '/@/api/platform/workflow/entity/formProperty'; |
||||||
|
import type { Workflow } from '/@/api/platform/workflow/entity/workflow'; |
||||||
|
import { useRouter } from 'vue-router'; |
||||||
|
import { useMessage } from '/@/hooks/web/useMessage'; |
||||||
|
import { queryProcessStatus } from '/@/api/platform/workflow/controller/process'; |
||||||
|
import { useTabs } from '/@/hooks/web/useTabs'; |
||||||
|
import { listHistoryFlowChange } from '/@/api/platform/workflow/controller/task'; |
||||||
|
import WorkflowPreviewForm from './WorkflowPreviewForm.vue'; |
||||||
|
import WorkflowChartModel from './WorkflowChartModel.vue'; |
||||||
|
import WorkflowTimeLine from './WorkflowTimeLine.vue'; |
||||||
|
import WorkflowStep from './workflowStep/index.vue'; |
||||||
|
import { useDesign } from '/@/hooks/web/useDesign'; |
||||||
|
import { useAppInject } from '/@/hooks/web/useAppInject'; |
||||||
|
import agreeImg from '/@/assets/images/workflow/agree.png'; |
||||||
|
import deletedImg from '/@/assets/images/workflow/deleted.png'; |
||||||
|
import rejectImg from '/@/assets/images/workflow/reject.png'; |
||||||
|
import revokeImg from '/@/assets/images/workflow/revoke.png'; |
||||||
|
import stopImg from '/@/assets/images/workflow/stop.png'; |
||||||
|
import waitingImg from '/@/assets/images/workflow/waiting.png'; |
||||||
|
|
||||||
|
/** 类型规范统一声明定义区域 */ |
||||||
|
interface WindowState { |
||||||
|
// 流程表单标题 |
||||||
|
formTitle: string; |
||||||
|
// 流程表单key |
||||||
|
formKey: string; |
||||||
|
// 表单类型(1:动态表单,2:外置表单) |
||||||
|
formType: string; |
||||||
|
// 外置表单路径 |
||||||
|
formPath: string; |
||||||
|
// 外置表单是否只读 |
||||||
|
formReadOnly: boolean; |
||||||
|
// 外置表单业务数据绑定ID |
||||||
|
businessId: string; |
||||||
|
// 动态表单字段配置数据 |
||||||
|
taskFormData: FormProperty[]; |
||||||
|
|
||||||
|
// 设置选择任务选项卡 |
||||||
|
taskSelectedTab: string; |
||||||
|
// 流程任务定义key |
||||||
|
taskDefKey: string; |
||||||
|
|
||||||
|
// 流程定义ID |
||||||
|
processDefId: string; |
||||||
|
// 流程实例ID |
||||||
|
processInsId: string; |
||||||
|
// 流程定义Key |
||||||
|
processDefKey: string; |
||||||
|
// 流程状态图片 |
||||||
|
processImg: string; |
||||||
|
|
||||||
|
// 历史流转信息 |
||||||
|
historyFlowChangeList: Workflow[]; |
||||||
|
} |
||||||
|
|
||||||
|
/** 通用变量统一声明区域 */ |
||||||
|
const ALayoutContent = LayoutContent; |
||||||
|
const ATables = Tabs; |
||||||
|
const ATabPane = Tabs.TabPane; |
||||||
|
|
||||||
|
const { prefixCls } = useDesign('task-form-view'); |
||||||
|
const { getIsMobile } = useAppInject(); |
||||||
|
const state = reactive<WindowState>({ |
||||||
|
formTitle: '', |
||||||
|
formKey: '', |
||||||
|
formType: '', |
||||||
|
formPath: '', |
||||||
|
formReadOnly: false, |
||||||
|
businessId: '', |
||||||
|
taskFormData: [], |
||||||
|
|
||||||
|
taskSelectedTab: 'formInfo', |
||||||
|
taskDefKey: '', |
||||||
|
|
||||||
|
processDefId: '', |
||||||
|
processInsId: '', |
||||||
|
processDefKey: '', |
||||||
|
processImg: waitingImg, |
||||||
|
|
||||||
|
historyFlowChangeList: [], |
||||||
|
}); |
||||||
|
const { currentRoute, push } = useRouter(); |
||||||
|
const { params, query } = unref(currentRoute); |
||||||
|
const { notification, createMessage, createConfirm } = useMessage(); |
||||||
|
const { close } = useTabs(); |
||||||
|
const formPreview = ref(); |
||||||
|
const workflowChart = ref(); |
||||||
|
onActivated(() => { |
||||||
|
handleInit(); |
||||||
|
nextTick(async () => { |
||||||
|
// 初始化外置表单 |
||||||
|
if (state.formType === '2') { |
||||||
|
if (state.formKey === '/404') { |
||||||
|
state.formPath = ''; |
||||||
|
createMessage.info('没有关联流程表单!'); |
||||||
|
} else { |
||||||
|
state.formPath = require('@/views' + state.formKey + '.vue').default; |
||||||
|
} |
||||||
|
// 初始化动态表单 |
||||||
|
} else { |
||||||
|
if (state.formKey === '/404') { |
||||||
|
formPreview.value.init(''); |
||||||
|
} else { |
||||||
|
formPreview.value.init(state.formKey); |
||||||
|
} |
||||||
|
} |
||||||
|
// 获取历史任务流转列表 |
||||||
|
if (state.processInsId) { |
||||||
|
const processDefinitionInfo = await queryProcessStatus(state.processInsId); |
||||||
|
switch (processDefinitionInfo.mesCode) { |
||||||
|
case '_workflow_process_waiting': |
||||||
|
state.processImg = waitingImg; |
||||||
|
break; |
||||||
|
case '_workflow_process_agree': |
||||||
|
state.processImg = agreeImg; |
||||||
|
break; |
||||||
|
case '_workflow_process_revoke': |
||||||
|
state.processImg = revokeImg; |
||||||
|
break; |
||||||
|
case '_workflow_process_reject': |
||||||
|
state.processImg = rejectImg; |
||||||
|
break; |
||||||
|
case '_workflow_process_stop': |
||||||
|
state.processImg = stopImg; |
||||||
|
break; |
||||||
|
case '_workflow_process_deleted': |
||||||
|
state.processImg = deletedImg; |
||||||
|
break; |
||||||
|
} |
||||||
|
state.historyFlowChangeList = await listHistoryFlowChange(state.processInsId); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
function handleInit() { |
||||||
|
state.taskSelectedTab = 'formInfo'; |
||||||
|
state.processDefId = query.processDefId as string; |
||||||
|
state.processInsId = query.processInsId as string; |
||||||
|
state.processDefKey = query.processDefKey as string; |
||||||
|
state.formType = query.formType as string; |
||||||
|
state.formKey = query.formKey as string; |
||||||
|
state.taskDefKey = query.taskDefKey as string; |
||||||
|
state.formTitle = query.formTitle as string; |
||||||
|
state.businessId = query.businessId as string; |
||||||
|
state.formReadOnly = query.formReadOnly === 'true'; |
||||||
|
} |
||||||
|
|
||||||
|
function handleTabsClick(activeKey: string, event: MouseEvent) { |
||||||
|
// fixme: tabs组件首次加载不能初始化未激活的tab中的组件 |
||||||
|
if (activeKey === 'processChart' && !workflowChart.value) { |
||||||
|
setTimeout(() => { |
||||||
|
// 获取流程图数据 |
||||||
|
workflowChart.value.init(state.processInsId, state.processDefId); |
||||||
|
}, 100); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
</script> |
||||||
|
<style lang="less" scoped> |
||||||
|
@prefix-cls: ~'@{namespace}-task-form-view'; |
||||||
|
|
||||||
|
.@{prefix-cls} { |
||||||
|
.process-status-img { |
||||||
|
height: 180px; |
||||||
|
position: absolute; |
||||||
|
z-index: 999; |
||||||
|
top: 1px; |
||||||
|
right: 1px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
</style> |
Loading…
Reference in new issue