|
@@ -14,18 +14,23 @@
|
|
|
<el-input v-model="form.code" placeholder="请输入模板编码" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
|
|
|
- <el-form-item label="模板类型" prop="flowType" :rules="[{ required: true, message: '请选择模板类型', trigger: 'change' }]">
|
|
|
- <el-select v-model="form.flowType" class="w100" placeholder="请选择模板类型">
|
|
|
- <el-option v-for="item in baseDataResult.flowTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
|
|
|
- <el-form-item label="模板描述" prop="description" :rules="[{ required: false, message: '请输入模板描述', trigger: 'blur' }]">
|
|
|
- <el-input v-model="form.description" placeholder="请输入模板描述" clearable></el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
|
|
|
+ <el-form-item label="模板类型" prop="flowType" :rules="[{ required: true, message: '请选择模板类型', trigger: 'change' }]">
|
|
|
+ <el-select v-model="form.flowType" class="w100" placeholder="请选择模板类型">
|
|
|
+ <el-option v-for="item in baseDataResult.flowTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
|
|
|
+ <el-form-item label="展示主办" prop="isMainHandlerShow" :rules="[{ required: false, message: '请选择模板类型', trigger: 'change' }]">
|
|
|
+ <el-switch v-model="form.isMainHandlerShow" inline-prompt active-text="展示" inactive-text="隐藏" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
|
|
|
+ <el-form-item label="模板描述" prop="description" :rules="[{ required: false, message: '请输入模板描述', trigger: 'blur' }]">
|
|
|
+ <el-input v-model="form.description" placeholder="请输入模板描述" clearable></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
</el-form>
|
|
|
<!-- 流程图画布内容 -->
|
|
@@ -33,33 +38,39 @@
|
|
|
<div class="w100 h100" ref="lfElRef" style="height: 100%"></div>
|
|
|
</div>
|
|
|
<!-- 节点内容弹窗 -->
|
|
|
- <PropertySetting ref="propertySettingRef" v-model="formData" @change="handlePropertyChange" @changeOther="handlePropertyChangeOther" :baseData="baseDataResult"/>
|
|
|
+ <PropertySetting
|
|
|
+ ref="propertySettingRef"
|
|
|
+ v-model="formData"
|
|
|
+ @change="handlePropertyChange"
|
|
|
+ @changeOther="handlePropertyChangeOther"
|
|
|
+ :baseData="baseDataResult"
|
|
|
+ />
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script setup lang="ts" name="hotlineFlowDesigner">
|
|
|
-import {defineAsyncComponent, nextTick, onMounted, reactive, Ref, ref, unref, watch} from 'vue';
|
|
|
-import {useRoute, useRouter} from 'vue-router';
|
|
|
+import { defineAsyncComponent, nextTick, onMounted, reactive, Ref, ref, unref, watch } from 'vue';
|
|
|
+import { useRoute, useRouter } from 'vue-router';
|
|
|
import LogicFlow from '@logicflow/core';
|
|
|
-import {Control, DndPanel, Group, InsertNodeInPolyline, Menu, MiniMap, SelectionSelect, Snapshot} from '@logicflow/extension';
|
|
|
+import { Control, DndPanel, Group, InsertNodeInPolyline, Menu, MiniMap, SelectionSelect, Snapshot } from '@logicflow/extension';
|
|
|
import '@logicflow/core/dist/style/index.css';
|
|
|
import '@logicflow/extension/lib/style/index.css';
|
|
|
-import {SnakerFlowAdapter, SnakerFlowElement} from './snakerflow/index';
|
|
|
-import {NodeTypeEnum} from './enums';
|
|
|
-import {baseData, workflowAdd, workflowUpdate} from '@/api/system/workflow';
|
|
|
+import { SnakerFlowAdapter, SnakerFlowElement } from './snakerflow/index';
|
|
|
+import { NodeTypeEnum } from './enums';
|
|
|
+import { baseData, workflowAdd, workflowUpdate } from '@/api/system/workflow';
|
|
|
import mittBus from '@/utils/mitt';
|
|
|
-import {throttle} from '@/utils/tools';
|
|
|
-import {ElMessage, FormInstance} from 'element-plus';
|
|
|
+import { throttle } from '@/utils/tools';
|
|
|
+import { ElMessage, FormInstance } from 'element-plus';
|
|
|
// 引入组件
|
|
|
-const PropertySetting = defineAsyncComponent(() => import('./PropertySetting/index.vue')); // 节点属性设置
|
|
|
+const PropertySetting = defineAsyncComponent(() => import('./PropertySetting/index.vue')); // 节点属性设置
|
|
|
|
|
|
const route = useRoute(); // 当前路由信息
|
|
|
const router = useRouter(); // 路由实例
|
|
|
-const emits = defineEmits(['update:modelValue', 'on-save']); // 定义组件事件
|
|
|
+const emits = defineEmits(['update:modelValue', 'on-save']); // 定义组件事件
|
|
|
// 提交表单数据
|
|
|
let formData = reactive({} as any);
|
|
|
// 外层表单
|
|
|
-let form = reactive<Record<string, any>>({});
|
|
|
+let form = reactive<Record<string, any>>({});
|
|
|
const ruleFormRef = ref<RefType>();
|
|
|
// 定义组件接收的参数
|
|
|
const props = defineProps({
|
|
@@ -251,17 +262,15 @@ const initOp = () => {
|
|
|
text: '开始',
|
|
|
label: '开始节点',
|
|
|
properties: {
|
|
|
- stepType: 1, // 节点类型(开始1 结束2)
|
|
|
- },
|
|
|
+ stepType: 1, // 节点类型(开始1 结束2)
|
|
|
+ },
|
|
|
icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==',
|
|
|
},
|
|
|
{
|
|
|
type: 'hotline:task',
|
|
|
text: '流程节点',
|
|
|
label: '流程节点',
|
|
|
- properties: {
|
|
|
-
|
|
|
- },
|
|
|
+ properties: {},
|
|
|
icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==',
|
|
|
className: 'important-node',
|
|
|
},
|
|
@@ -270,8 +279,8 @@ const initOp = () => {
|
|
|
text: '结束',
|
|
|
label: '结束节点',
|
|
|
properties: {
|
|
|
- stepType: 2, // 节点类型(开始1 结束2)
|
|
|
- },
|
|
|
+ stepType: 2, // 节点类型(开始1 结束2)
|
|
|
+ },
|
|
|
icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAA1BJREFUOBFtVE1IVUEYPXOf+tq40Y3vPcmFIdSjIorWoRG0ERWUgnb5FwVhYQSl72oUoZAboxKNFtWiwKRN0M+jpfSzqJAQclHo001tKkjl3emc8V69igP3znzfnO/M9zcDcKT67azmjYWTwl9Vn7Vumeqzj1DVb6cleQY4oAVnIOPb+mKAGxQmKI5CWNJ2aLPatxWa3aB9K7/fB+/Z0jUF6TmMlFLQqrkECWQzOZxYGjTlOl8eeKaIY5yHnFn486xBustDjWT6dG7pmjHOJd+33t0iitTPkK6tEvjxq4h2MozQ6WFSX/LkDUGfFwfhEZj1Auz/U4pyAi5Sznd7uKzznXeVHlI/Aywmk6j7fsUsEuCGADrWARXXwjxWQsUbIupDHJI7kF5dRktg0eN81IbiZXiTESic50iwS+t1oJgL83jAiBupLDCQqwziaWSoAFSeIR3P5Xv5az00wyIn35QRYTwdSYbz8pH8fxUUAtxnFvYmEmgI0wYXUXcCCSpeEVpXlsRhBnCEATxWylL9+EKCAYhe1NGstUa6356kS9NVvt3DU2fd+Wtbm/+lSbylJqsqkSm9CRhvoJVlvKPvF1RKY/FcPn5j4UfIMLn8D4UYb54BNsilTDXKnF4CfTobA0FpoW/LSp306wkXM+XaOJhZaFkcNM82ASNAWMrhrUbRfmyeI1FvRBTpN06WKxa9BK0o2E4Pd3zfBBEwPsv9sQBnmLVbLEIZ/Xe9LYwJu/Er17W6HYVBc7vmuk0xUQ+pqxdom5Fnp55SiytXLPYoMXNM4u4SNSCFWnrVIzKG3EGyMXo6n/BQOe+bX3FClY4PwydVhthOZ9NnS+ntiLh0fxtlUJHAuGaFoVmttpVMeum0p3WEXbcll94l1wM/gZ0Ccczop77VvN2I7TlsZCsuXf1WHvWEhjO8DPtyOVg2/mvK9QqboEth+7pD6NUQC1HN/TwvydGBARi9MZSzLE4b8Ru3XhX2PBxf8E1er2A6516o0w4sIA+lwURhAON82Kwe2iDAC1Watq4XHaGQ7skLcFOtI5lDxuM2gZe6WFIotPAhbaeYlU4to5cuarF1QrcZ/lwrLaCJl66JBocYZnrNlvm2+MBCTmUymPrYZVbjdlr/BxlMjmNmNI3SAAAAAElFTkSuQmCC',
|
|
|
},
|
|
|
]);
|
|
@@ -300,7 +309,7 @@ const initEvent = () => {
|
|
|
// })
|
|
|
// 节点点击事件
|
|
|
eventCenter.on('node:click', (args: any) => {
|
|
|
- if (['hotline:start','hotline:task'].includes(args.data.type)) {
|
|
|
+ if (['hotline:start', 'hotline:task'].includes(args.data.type)) {
|
|
|
currentOpId.value = args.data.id;
|
|
|
propertySettingRef.value.show({
|
|
|
...args.data.properties,
|
|
@@ -324,54 +333,56 @@ const initEvent = () => {
|
|
|
// })
|
|
|
};
|
|
|
const closePage = () => {
|
|
|
- // 更新
|
|
|
- ElMessage.success('操作成功');
|
|
|
- // 关闭当前 tagsView
|
|
|
- mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
|
|
|
- mittBus.emit('clearCache', 'systemWorkflow');
|
|
|
- if(!router.hasRoute('systemWorkflow')){
|
|
|
- ElMessage.warning('未找到流程模板列表页面');
|
|
|
- return;
|
|
|
- }
|
|
|
- router.push({
|
|
|
- name: 'systemWorkflow',
|
|
|
- state:{
|
|
|
- index:'1'
|
|
|
- }
|
|
|
- });
|
|
|
+ // 更新
|
|
|
+ ElMessage.success('操作成功');
|
|
|
+ // 关闭当前 tagsView
|
|
|
+ mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
|
|
|
+ mittBus.emit('clearCache', 'systemWorkflow');
|
|
|
+ if (!router.hasRoute('systemWorkflow')) {
|
|
|
+ ElMessage.warning('未找到流程模板列表页面');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ router.push({
|
|
|
+ name: 'systemWorkflow',
|
|
|
+ state: {
|
|
|
+ index: '1',
|
|
|
+ },
|
|
|
+ });
|
|
|
};
|
|
|
// 暂存(保存为草稿)
|
|
|
const saveOnly = throttle((formEl: FormInstance | undefined) => {
|
|
|
const lf = unref(lfInstance);
|
|
|
if (!lf) return;
|
|
|
- if(!formEl) return;
|
|
|
- // 表单验证
|
|
|
- formEl.validate((valid: boolean)=>{
|
|
|
- if(!valid) return;
|
|
|
- // 流程模板属性 最外层
|
|
|
- Object.keys(form).forEach((key: string) => {
|
|
|
- // 监听属性变化 并保存
|
|
|
- lf.graphModel[key] = form[key];
|
|
|
- });
|
|
|
- const { submitData } = getGraphData();
|
|
|
+ if (!formEl) return;
|
|
|
+ // 表单验证
|
|
|
+ formEl.validate((valid: boolean) => {
|
|
|
+ if (!valid) return;
|
|
|
+ // 流程模板属性 最外层
|
|
|
+ Object.keys(form).forEach((key: string) => {
|
|
|
+ // 监听属性变化 并保存
|
|
|
+ lf.graphModel[key] = form[key];
|
|
|
+ });
|
|
|
+ const { submitData } = getGraphData();
|
|
|
|
|
|
- if (submitData.error) {
|
|
|
- //错误提示
|
|
|
- ElMessage.warning(submitData.error);
|
|
|
- return;
|
|
|
- }
|
|
|
- if (route.params.id) {
|
|
|
- workflowUpdate(submitData).then(() => { //更新
|
|
|
- closePage();
|
|
|
- });
|
|
|
- } else {
|
|
|
- workflowAdd(submitData).then(() => {//保存
|
|
|
- closePage()
|
|
|
- });
|
|
|
- }
|
|
|
+ if (submitData.error) {
|
|
|
+ //错误提示
|
|
|
+ ElMessage.warning(submitData.error);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (route.params.id) {
|
|
|
+ workflowUpdate(submitData).then(() => {
|
|
|
+ //更新
|
|
|
+ closePage();
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ workflowAdd(submitData).then(() => {
|
|
|
+ //保存
|
|
|
+ closePage();
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- emits('on-save', getGraphData());
|
|
|
- })
|
|
|
+ emits('on-save', getGraphData());
|
|
|
+ });
|
|
|
}, 300);
|
|
|
// 重新渲染
|
|
|
const reRender = (data: any): void => {
|
|
@@ -383,8 +394,9 @@ const reRender = (data: any): void => {
|
|
|
// 最外层扩展属性赋值
|
|
|
form.name = lf.graphModel.name;
|
|
|
form.code = lf.graphModel.code;
|
|
|
- form.flowType = lf.graphModel.flowType;
|
|
|
- form.description = lf.graphModel.description;
|
|
|
+ form.flowType = lf.graphModel.flowType;
|
|
|
+ form.description = lf.graphModel.description;
|
|
|
+ form.isMainHandlerShow = lf.graphModel.isMainHandlerShow;
|
|
|
form.id = route.params.id;
|
|
|
form.name = lf.graphModel.name;
|
|
|
});
|
|
@@ -460,11 +472,11 @@ const importJson = (data: any) => {
|
|
|
reRender(data);
|
|
|
};
|
|
|
const baseDataResult = ref<EmptyObjectType>({});
|
|
|
-onMounted( async()=>{
|
|
|
- // 获取页面基础数据
|
|
|
- const {result} = await baseData();
|
|
|
- baseDataResult.value = result;
|
|
|
- await init();
|
|
|
+onMounted(async () => {
|
|
|
+ // 获取页面基础数据
|
|
|
+ const { result } = await baseData();
|
|
|
+ baseDataResult.value = result;
|
|
|
+ await init();
|
|
|
});
|
|
|
|
|
|
// 出提供给外部操作-$refs.xxx
|