123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <template>
- <div class="overflow-auto">
- <SimpleProcessModel
- ref="simpleProcessModelRef"
- v-if="processNodeTree"
- :flow-node="processNodeTree"
- :readonly="false"
- @save="saveSimpleFlowModel"
- />
- <Dialog v-model="errorDialogVisible" title="保存失败" width="400" :fullscreen="false">
- <div class="mb-2">以下节点内容不完善,请修改后保存</div>
- <div
- class="mb-3 b-rounded-1 bg-gray-100 p-2 line-height-normal"
- v-for="(item, index) in errorNodes"
- :key="index"
- >
- {{ item.name }} : {{ NODE_DEFAULT_TEXT.get(item.type) }}
- </div>
- <template #footer>
- <el-button type="primary" @click="errorDialogVisible = false">知道了</el-button>
- </template>
- </Dialog>
- </div>
- </template>
- <script setup lang="ts">
- import SimpleProcessModel from './SimpleProcessModel.vue'
- import { updateBpmSimpleModel, getBpmSimpleModel } from '@/api/bpm/simple'
- import { SimpleFlowNode, NodeType, NodeId, NODE_DEFAULT_TEXT } from './consts'
- import { getModel } from '@/api/bpm/model'
- import { getForm, FormVO } from '@/api/bpm/form'
- import { handleTree } from '@/utils/tree'
- import * as RoleApi from '@/api/system/role'
- import * as DeptApi from '@/api/system/dept'
- import * as PostApi from '@/api/system/post'
- import * as UserApi from '@/api/system/user'
- import * as UserGroupApi from '@/api/bpm/userGroup'
- defineOptions({
- name: 'SimpleProcessDesigner'
- })
- const emits = defineEmits(['success']) // 保存成功事件
- const props = defineProps({
- modelId: {
- type: String,
- required: false
- },
- modelKey: {
- type: String,
- required: false
- },
- modelName: {
- type: String,
- required: false
- },
- // 可发起流程的人员编号
- startUserIds: {
- type: Array,
- required: false
- }
- })
- const processData = inject('processData') as Ref
- const loading = ref(false)
- const formFields = ref<string[]>([])
- const formType = ref(20)
- const roleOptions = ref<RoleApi.RoleVO[]>([]) // 角色列表
- const postOptions = ref<PostApi.PostVO[]>([]) // 岗位列表
- const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
- const deptOptions = ref<DeptApi.DeptVO[]>([]) // 部门列表
- const deptTreeOptions = ref()
- const userGroupOptions = ref<UserGroupApi.UserGroupVO[]>([]) // 用户组列表
- const isDataInitialized = ref(false) // 添加标记,用于判断数据是否已初始化
- provide('formFields', formFields)
- provide('formType', formType)
- provide('roleList', roleOptions)
- provide('postList', postOptions)
- provide('userList', userOptions)
- provide('deptList', deptOptions)
- provide('userGroupList', userGroupOptions)
- provide('deptTree', deptTreeOptions)
- provide('startUserIds', props.startUserIds)
- provide('tasks', [])
- provide('processInstance', {})
- const message = useMessage() // 国际化
- const processNodeTree = ref<SimpleFlowNode | undefined>()
- provide('processNodeTree', processNodeTree)
- const errorDialogVisible = ref(false)
- let errorNodes: SimpleFlowNode[] = []
- // 添加更新模型的方法
- const updateModel = () => {
- if (!processNodeTree.value) {
- processNodeTree.value = {
- name: '发起人',
- type: NodeType.START_USER_NODE,
- id: NodeId.START_USER_NODE_ID,
- childNode: {
- id: NodeId.END_EVENT_NODE_ID,
- name: '结束',
- type: NodeType.END_EVENT_NODE
- }
- }
- // 初始化时也触发一次保存
- saveSimpleFlowModel(processNodeTree.value)
- }
- }
- const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
- if (!simpleModelNode) {
- return
- }
- try {
- processData.value = simpleModelNode
- emits('success', simpleModelNode)
- } catch (error) {
- console.error('保存失败:', error)
- }
- }
- // 校验节点设置。 暂时以 showText 为空 未节点错误配置
- const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNode[]) => {
- if (node) {
- const { type, showText, conditionNodes } = node
- if (type == NodeType.END_EVENT_NODE) {
- return
- }
- if (type == NodeType.START_USER_NODE) {
- // 发起人节点暂时不用校验,直接校验孩子节点
- validateNode(node.childNode, errorNodes)
- }
- if (
- type === NodeType.USER_TASK_NODE ||
- type === NodeType.COPY_TASK_NODE ||
- type === NodeType.CONDITION_NODE
- ) {
- if (!showText) {
- errorNodes.push(node)
- }
- validateNode(node.childNode, errorNodes)
- }
- if (
- type == NodeType.CONDITION_BRANCH_NODE ||
- type == NodeType.PARALLEL_BRANCH_NODE ||
- type == NodeType.INCLUSIVE_BRANCH_NODE
- ) {
- // 分支节点
- // 1. 先校验各个分支
- conditionNodes?.forEach((item) => {
- validateNode(item, errorNodes)
- })
- // 2. 校验孩子节点
- validateNode(node.childNode, errorNodes)
- }
- }
- }
- // 初始化数据的方法
- const initializeData = async () => {
- if (isDataInitialized.value) {
- return
- }
- try {
- loading.value = true
- // 并行加载所有数据
- const [roleList, postList, userList, deptList, userGroupList] = await Promise.all([
- RoleApi.getSimpleRoleList(),
- PostApi.getSimplePostList(),
- UserApi.getSimpleUserList(),
- DeptApi.getSimpleDeptList(),
- UserGroupApi.getUserGroupSimpleList()
- ])
- // 更新数据
- roleOptions.value = roleList
- postOptions.value = postList
- userOptions.value = userList
- deptOptions.value = deptList
- deptTreeOptions.value = handleTree(deptList as DeptApi.DeptVO[], 'id')
- userGroupOptions.value = userGroupList
- // 获取表单字段
- if (props.modelId) {
- const bpmnModel = await getModel(props.modelId)
- if (bpmnModel) {
- formType.value = bpmnModel.formType
- if (formType.value === 10) {
- const bpmnForm = (await getForm(bpmnModel.formId)) as unknown as FormVO
- formFields.value = bpmnForm?.fields
- }
- }
- }
- // 获得角色列表
- roleOptions.value = await RoleApi.getSimpleRoleList()
- // 获得岗位列表
- postOptions.value = await PostApi.getSimplePostList()
- // 获得用户列表
- userOptions.value = await UserApi.getSimpleUserList()
- // 获得部门列表
- deptOptions.value = await DeptApi.getSimpleDeptList()
- deptTreeOptions.value = handleTree(deptOptions.value as DeptApi.DeptVO[], 'id')
- // 获取用户组列表
- userGroupOptions.value = await UserGroupApi.getUserGroupSimpleList()
- // 加载流程数据
- if (processData.value) {
- processNodeTree.value = processData?.value
- } else {
- updateModel()
- }
- isDataInitialized.value = true
- } catch (error) {
- console.error('初始化数据失败:', error)
- } finally {
- loading.value = false
- }
- }
- onMounted(async () => {
- await initializeData()
- })
- // 添加 activated 生命周期钩子
- onActivated(() => {
- // 组件被激活时,只需要刷新视图
- if (isDataInitialized.value) {
- refresh()
- } else {
- initializeData()
- }
- })
- const simpleProcessModelRef = ref()
- defineExpose({})
- </script>
|