添加工作流 设计器

This commit is contained in:
GGJ
2024-04-16 08:41:41 +08:00
parent 071ee4d2b5
commit ecb649dc47
79 changed files with 11162 additions and 207 deletions

View File

@@ -0,0 +1,126 @@
<template>
<div>
<!-- 流程设计器负责绘制流程等 -->
<MyProcessDesigner
key="designer"
v-if="xmlString !== undefined"
v-model="xmlString"
:value="xmlString"
v-bind="controlForm"
keyboard
ref="processDesigner"
@init-finished="initModeler"
:additionalModel="controlForm.additionalModel"
@quit="emit('quit')"
@save="save"
/>
<!-- 流程属性器负责编辑每个流程节点的属性 -->
<MyProcessPenal
key="penal"
:bpmnModeler="modeler as any"
:prefix="controlForm.prefix"
class="process-panel"
:model="model"
/>
</div>
</template>
<script lang="ts" setup>
import * as ModelApi from '@/api/process-boot/bpm'
import { onMounted, provide, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { MyProcessDesigner, MyProcessPenal } from '@/components/bpmnProcessDesigner/package'
// 自定义元素选中时的弹出菜单(修改 默认任务 为 用户任务)
import CustomContentPadProvider from '@/components/bpmnProcessDesigner/package/designer/plugins/content-pad'
// 自定义左侧菜单(修改 默认任务 为 用户任务)
import CustomPaletteProvider from '@/components/bpmnProcessDesigner/package/designer/plugins/palette'
defineOptions({ name: 'BpmModelEditor' })
const prop = defineProps({
model: { type: Object, default: undefined }
})
const xmlString = ref(undefined) // BPMN XML
const modeler = ref(null) // BPMN Modeler
const emit = defineEmits(['quit'])
const controlForm = ref({
simulation: true,
labelEditing: false,
labelVisible: false,
prefix: 'flowable',
headerButtonSize: 'mini',
additionalModel: [CustomContentPadProvider, CustomPaletteProvider]
})
const model = ref<ModelApi.ModelVO>() // 流程模型的信息
/** 初始化 modeler */
const initModeler = item => {
setTimeout(() => {
modeler.value = item
}, 10)
}
/** 添加/修改模型 */
const save = async bpmnXml => {
const data = {
// name
// flowableXml
// category
...model.value,
flowableXml: bpmnXml, // bpmnXml 只是初始化流程图,后续修改无法通过它获得
category: '',
name: ''
} as unknown as ModelApi.ModelVO
// 提交
if (data.id) {
await ModelApi.updateModel(data)
ElMessage.success('修改成功')
} else {
await ModelApi.createModel(data)
ElMessage.success('新增成功')
}
// 跳转回去
close()
}
/** 关闭按钮 */
const close = () => {}
const randomStr = () => {
return Math.random().toString(36).slice(-8)
}
/** 初始化 */
onMounted(async () => {
const data: any = {}
if (prop.model?.deploymentId === undefined) {
if (!data.bpmnXml) {
// 首次创建的 Model 模型,它是没有 bpmnXml此时需要给它一个默认的
data.bpmnXml = ` <?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.activiti.org/processdef">
<process id="${data.key}" name="${data.name}" />
<bpmndi:BPMNDiagram id="BPMNDiagram">
<bpmndi:BPMNPlane id="${data.key}_di" bpmnElement="${data.key}" />
</bpmndi:BPMNDiagram>
</definitions>`
}
} else {
await ModelApi.readXml(prop.model?.deploymentId).then((res: any) => {
data.bpmnXml = res.data
})
// const data: any = {}
}
// 查询模型
model.value = {
...data,
bpmnXml: undefined // 清空 bpmnXml 属性
}
xmlString.value = data.bpmnXml
})
</script>
<style lang="scss">
.process-panel__container {
position: absolute;
top: 90px;
right: 60px;
}
</style>

View File

@@ -0,0 +1,155 @@
<!--业务用户管理界面-->
<template>
<div class="default-main">
<div v-show="addedShow">
<TableHeader>
<template v-slot:select>
<el-form-item label="筛选数据">
<el-input v-model="tableStore.table.params.name" clearable placeholder="筛选数据" />
</el-form-item>
</template>
<template v-slot:operation>
<el-button type="primary" @click="add" class="ml10" icon="el-icon-Plus">新增</el-button>
</template>
</TableHeader>
<!--表格-->
<Table ref="tableRef"></Table>
</div>
<!-- 设计流程 -->
<editor v-if="!addedShow" :model="model" @quit="addedShow = true"/>
</div>
</template>
<script setup lang="ts">
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { onMounted, provide, ref } from 'vue'
import editor from './editor/index.vue';
defineOptions({
name: 'harmonic-boot/reate/word'
})
const tableRef = ref()
const model = ref({})
const addedShow = ref(true)
const tableStore = new TableStore({
url: '/process-boot/flowable/definition/list',
method: 'GET',
column: [
{
title: '序号',
width: 60,
formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '流程标识', field: 'flowKey' },
{ title: '流程分类', field: 'category' },
{ title: '流程名称', field: 'name' },
{
title: '业务功能',
field: 'formId',
formatter: (row: any) => {
return row.cellValue == 1 ? '谐波普测计划' : row.cellValue == 2 ? '干扰源用户管理' : '暂无表单'
}
},
{ title: '流程版本V', field: 'version' },
{
title: '状态',
field: 'suspensionState',
render: 'tag',
custom: {
0: '',
1: 'success',
2: 'warning'
},
replaceValue: {
0: '',
1: '激活',
2: '挂起'
}
},
{ title: '部署时间', field: 'deploymentTime' },
{
title: '操作',
width: '180',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '设计',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: row => {
model.value = row
addedShow.value = false
}
},
{
name: 'edit',
title: '配置主表单',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: async row => {}
},
{
name: 'edit',
title: '挂起',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: async row => {}
},
{
name: 'edit',
title: '激活',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: async row => {}
},
{
name: 'del',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {}
}
]
}
],
beforeSearchFun: () => {
tableStore.table.params.beginTime = tableStore.table.params.startTime
tableStore.table.params.deptId = tableStore.table.params.deptIndex
}
})
// 新增
const add = () => {
model.value = {}
addedShow.value = false
}
onMounted(() => {
// 加载数据
tableStore.index()
})
tableStore.table.params.name = ''
provide('tableStore', tableStore)
</script>