Browse Source

reactor:流程调整;

zhangchong 1 year ago
parent
commit
3a3b9ccb67

+ 146 - 165
src/components/LogicFlow/PropertySetting/end.vue

@@ -4,22 +4,30 @@
       <el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
       <el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
         <el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
         <el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="节点编码" prop="code" :rules="[{ required: true, message: '请输入节点编码', trigger: 'blur' }]">
+      <el-form-item label="节点编码" prop="stepType" :rules="[{ required: true, message: '请输入节点编码', trigger: 'blur' }]">
         <el-input v-model="form.code" disabled placeholder="请输入节点编码" clearable></el-input>
         <el-input v-model="form.code" disabled placeholder="请输入节点编码" clearable></el-input>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="处理人" prop="handlerType" :rules="[{ required: true, message: '请选择处理人', trigger: 'change' }]">
-        <el-select v-model="form.handlerType" class="w100" placeholder="请选择处理人" @change="changeOptions">
-          <el-option v-for="item in handlerTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
+      <el-form-item label="节点类型" prop="stepTypeName" :rules="[{ required: true, message: '请选择节点类型', trigger: 'change' }]">
+        <el-input v-model="form.stepTypeName" disabled></el-input>
+      </el-form-item>
+      <el-form-item label="业务类型" prop="businessType" :rules="[{ required: true, message: '请选择业务类型', trigger: 'change' }]">
+        <el-select v-model="form.businessType" class="w100" placeholder="请选择业务类型">
+          <el-option v-for="item in baseData.businessTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="办理者类型" prop="handlerType" :rules="[{ required: true, message: '请选择办理者类型', trigger: 'change' }]">
+        <el-select v-model="form.handlerType" class="w100" placeholder="请选择办理者类型" @change="changeOptions">
+          <el-option v-for="item in baseData.handlerTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
       <!-- 选择其他 -->
       <!-- 选择其他 -->
       <el-form-item
       <el-form-item
           v-if="[0, 1, 2].includes(form.handlerType)"
           v-if="[0, 1, 2].includes(form.handlerType)"
           :label="itemName"
           :label="itemName"
-          prop="handlerClassifiesOrgin"
+          prop="handlerTypeItemsOrigin"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
       >
       >
-        <el-select v-model="form.handlerClassifiesOrgin" multiple filterable class="w100" @change="getSelectValue" value-key="id">
+        <el-select v-model="form.handlerTypeItemsOrigin" multiple filterable class="w100" @change="getSelectValue" value-key="id">
           <el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item" />
           <el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
@@ -27,11 +35,11 @@
       <el-form-item
       <el-form-item
           v-if="[3].includes(form.handlerType)"
           v-if="[3].includes(form.handlerType)"
           :label="itemName"
           :label="itemName"
-          prop="handlerClassifiesOrgin"
+          prop="handlerTypeItemsOrigin"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
       >
       >
         <el-select
         <el-select
-            v-model="form.handlerClassifiesOrgin"
+            v-model="form.handlerTypeItemsOrigin"
             multiple
             multiple
             filterable
             filterable
             remote
             remote
@@ -51,101 +59,128 @@
       <el-form-item
       <el-form-item
           v-if="[4].includes(form.handlerType)"
           v-if="[4].includes(form.handlerType)"
           :label="itemName"
           :label="itemName"
-          prop="handlerClassifiesOrgin"
+          prop="handlerTypeItemsOrigin"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
       >
       >
         <el-tree-select
         <el-tree-select
-            :props="{ label: 'orgName' }"
+            :props="{ label: 'name' }"
             node-key="id"
             node-key="id"
             class="w100"
             class="w100"
             ref="treeSelectRef"
             ref="treeSelectRef"
-            v-model="form.handlerClassifiesOrgin"
+            v-model="form.handlerTypeItemsOrigin"
             :data="orgData"
             :data="orgData"
             multiple
             multiple
             :render-after-expand="false"
             :render-after-expand="false"
             show-checkbox
             show-checkbox
-            @check-change="checkChange"
             check-strictly
             check-strictly
             default-expand-all
             default-expand-all
             filterable
             filterable
         />
         />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="节点属性" prop="businessProperty" :rules="[{ required: true, message: '请选择节点属性', trigger: 'change' }]">
-        <el-select v-model="form.businessProperty" class="w100" placeholder="请选择节点属性">
-          <el-option v-for="item in businessPropertyOptions" :key="item.value" :label="item.label" :value="item.value" />
+      <el-form-item label="否决按钮" prop="canReject">
+        <el-switch
+            v-model="form.canReject"
+            inline-prompt
+            active-text="启用"
+            inactive-text="禁用"
+        />
+      </el-form-item>
+      <el-form-item label="执行模式" prop="executeMode" :rules="[{ required: true, message: '请选择执行模式', trigger: 'change' }]">
+        <el-select v-model="form.executeMode" class="w100" placeholder="请选择执行模式">
+          <el-option v-for="item in baseData.executeModeOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="会签" prop="countersignMode" :rules="[{ required: true, message: '请选择会签', trigger: 'change' }]">
-        <el-select v-model="form.countersignMode" class="w100" placeholder="请选择会签">
-          <el-option v-for="item in countersignModeList" :key="item.value" :label="item.label" :value="item.value" />
+      <el-form-item label="支持会签" prop="canStartCountersign">
+        <el-switch
+            v-model="form.canStartCountersign"
+            inline-prompt
+            active-text="支持"
+            inactive-text="不支持"
+        />
+      </el-form-item>
+      <el-form-item label="会签策略" prop="countersignPolicy" :rules="[{ required: true, message: '请选择会签策略', trigger: 'change' }]" v-if="form.canStartCountersign">
+        <el-select v-model="form.countersignPolicy" class="w100" placeholder="请选择会签策略">
+          <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="节点过滤策略" prop="pathPolicy" :rules="[{ required: true, message: '请选择节点过滤策略', trigger: 'change' }]">
-        <el-select v-model="form.pathPolicy" class="w100" placeholder="请选择节点过滤策略">
-          <el-option v-for="item in pathPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
+      <el-form-item label="实例化模式" prop="instanceMode" :rules="[{ required: true, message: '请选择实例化模式', trigger: 'change' }]">
+        <el-select v-model="form.instanceMode" class="w100" placeholder="请选择实例化模式">
+          <el-option v-for="item in baseData.instanceModeOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="会签发起节点" prop="countersignStartStepCode" :rules="[{ required: false, message: '请选择会签发起节点', trigger: 'change' }]">
-        <el-select v-model="form.countersignStartStepCode" class="w100" placeholder="请选择会签发起节点" @change="chanStartCode">
-          <el-option v-for="item in nodesOptions" :key="item.id" :label="item.text.value" :value="item.id" />
+      <el-form-item label="动态策略" prop="instancePolicy" :rules="[{ required: true, message: '请选择动态策略', trigger: 'change' }]" v-if="form.instanceMode === 1">
+        <el-select v-model="form.instancePolicy" class="w100" placeholder="请选择动态策略" @change="selectInstancePolicy">
+          <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="组件配置" prop="componentsOrigin" :rules="[{ required: false, message: '请选择组件配置', trigger: 'change' }]">
-        <el-checkbox-group v-model="form.componentsOrigin" @change="selectComponent">
-          <el-checkbox :label="item.dicDataValue" v-for="item in stepPropertiesOptions" :key="item.id">{{item.dicDataName}}</el-checkbox>
-        </el-checkbox-group>
+      <el-form-item label="动态终止标识" prop="terminalDynamicMark" :rules="[{ required: true, message: '请选择动态终止标识', trigger: 'change' }]" v-if="form.instanceMode === 1">
+        <el-select v-model="form.terminalDynamicMark" class="w100" placeholder="请选择动态终止标识">
+          <el-option v-for="item in baseData.dynamicStrategyOptions" :key="item.key" :label="item.value" :value="item.key" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="标识" prop="tag" :rules="[{ required: false, message: '请输入标识', trigger: 'blur' }]">
+        <el-input v-model="form.tag" placeholder="请输入标识" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
       </el-form-item>
       </el-form-item>
     </el-form>
     </el-form>
   </div>
   </div>
 </template>
 </template>
 <script lang="ts" setup name="flowNode">
 <script lang="ts" setup name="flowNode">
 import { reactive, watch, onMounted, ref } from 'vue';
 import { reactive, watch, onMounted, ref } from 'vue';
-import { ElMessageBox } from 'element-plus';
-import { removeDuplicate } from '/@/utils/arrayOperation';
-import { baseData, getSelectList,queryUser } from '/@/api/system/workflow';
+import { getSelectList, queryUser } from '/@/api/system/workflow';
 import { getCanUseOrg } from '/@/api/system/user';
 import { getCanUseOrg } from '/@/api/system/user';
+import { removeDuplicate } from '/@/utils/arrayOperation';
+import {ElInput} from "element-plus";
 const ruleFormRef = ref<RefType>();
 const ruleFormRef = ref<RefType>();
 // 定义属性
 // 定义属性
-const props = defineProps<{
-  modelValue: any;
-}>();
+const props = defineProps({
+  modelValue: {
+    type: Object,
+    default: () => {
+    }
+  },
+  baseData: {
+    type: Object,
+    default: () => {
+    }
+  }
+})
 // 注意:ref不能与model一样,相同的话表单双向绑定将会失效
 // 注意:ref不能与model一样,相同的话表单双向绑定将会失效
 const form = reactive<Record<string, any>>({
 const form = reactive<Record<string, any>>({
-  ...props.modelValue,  // 传入的数据
-  handlerClassifiesOrgin: [], // 选择的数据
-  handlerClassifies: [],  // 选择的数据
-  handlerType: '',  // 处理人类型
-  businessProperty: '', // 节点属性
-  countersignMode: '',  // 会签
-  countersignStartStepCode: '', // 会签发起节点
-  countersignEndStepCode: '',  // 会签结束节点
-  pathPolicy: null, // 节点过滤策略
-  componentsOrigin:[],
-  components:[], //组件配置
+  ...props.modelValue, // 传入的数据
+  stepTypeName:'结束节点',
+  stepType:2,// 节点类型
+  businessType:null,// 业务类型
+  handlerType:null,// 办理者类型
+  handlerTypeItemsOrigin:[],// 办理者类型
+  handlerTypeItems:'[]',// 办理者类型
+  canReject:false, // 否决按钮
+  executeMode:null, // 执行模式
+  canStartCountersign:false, // 支持会签
+  countersignPolicy:null, // 会签策略
+  instanceMode:null, // 实例化模式
+  instancePolicy:null, // 动态策略
+  terminalDynamicMark:null, // 动态终止标识
+  tag:'', // 标识
 });
 });
-const emits = defineEmits(['update:modelValue', 'countersignStartStepCode']); // 定义事件
-
-//
+const emits = defineEmits(['update:modelValue']); // 定义事件
 const loading = ref(false); // 加载
 const loading = ref(false); // 加载
-const nodesOptions = ref([] as any);  // 节点
 watch(
 watch(
     () => form,
     () => form,
     () => {
     () => {
+      form.stepTypeName = form.name+'节点';
       emits('update:modelValue', Object.assign(props.modelValue, form));
       emits('update:modelValue', Object.assign(props.modelValue, form));
     },
     },
     { deep: true }
     { deep: true }
 );
 );
 // 选择处理人获取数据
 // 选择处理人获取数据
-// 处理人
-const handlerTypeOptions = ref<EmptyArrayType>() as any;
 // 下拉内容
 // 下拉内容
 const selectList = ref<EmptyArrayType>() as any;
 const selectList = ref<EmptyArrayType>() as any;
 // 会签
 // 会签
 const itemName = ref<string>('');
 const itemName = ref<string>('');
 const changeOptions = (e: any) => {
 const changeOptions = (e: any) => {
-  form.handlerClassifiesOrgin = [];
-  form.handlerClassifies = '[]';
-  itemName.value = handlerTypeOptions.value[e].label;
+  form.handlerTypeItemsOrigin = [];
+  form.handlerTypeItems = '[]';
+  itemName.value = baseData.handlerTypeOptions[e].label;
   if ([0, 1, 2].includes(e)) {
   if ([0, 1, 2].includes(e)) {
     getSelectList(e).then((res: any) => {
     getSelectList(e).then((res: any) => {
       selectList.value = res.result ?? [];
       selectList.value = res.result ?? [];
@@ -159,29 +194,9 @@ const changeOptions = (e: any) => {
     getOrgListFn();
     getOrgListFn();
   }
   }
 };
 };
-// 获取可用组织
-const getOrgListFn = () => {
-  getCanUseOrg().then((res: any) => {
-    orgData.value = res?.result ?? [];
-  });
-};
-const treeSelectRef = ref<RefType>();
-// 选择部门
-const checkChange = () => {
-  const data = treeSelectRef.value.getCheckedNodes();
-  let arr: EmptyArrayType;
-  arr = data.map((v: any) => {
-    return {
-      id: v.orgCode,
-      name: v.orgName,
-    };
-  });
-  // 使用模板字符串
-  form.handlerClassifies = `${JSON.stringify(arr)}`;
-};
 // 远程搜索用户名称
 // 远程搜索用户名称
 // 指定用户列表
 // 指定用户列表
-const userList = ref<any>();
+const userList = ref<EmptyArrayType>([]);
 const remoteMethod = (query: string) => {
 const remoteMethod = (query: string) => {
   if (query !== '') {
   if (query !== '') {
     loading.value = true;
     loading.value = true;
@@ -190,117 +205,81 @@ const remoteMethod = (query: string) => {
       const newUsers = res.result.map((item: any) => {
       const newUsers = res.result.map((item: any) => {
         return {
         return {
           ...item,
           ...item,
-          name: !item.name.includes('-') ? item.name + '-' + item.organization.orgName : item.name
+          name: !item.name.includes('-') ? item.name + '-' + item.organization.name : item.name,
         };
         };
       });
       });
-      userList.value = removeDuplicate([ ...newUsers,...userList.value], 'id');
+      userList.value = removeDuplicate([...newUsers, ...userList.value], 'id');
     });
     });
   }
   }
 };
 };
+
+// 获取可用组织
+const orgData = ref<EmptyArrayType>([]);
+const getOrgListFn = () => {
+  getCanUseOrg().then((res: any) => {
+    orgData.value = res?.result ?? [];
+  });
+};
+const treeSelectRef = ref<RefType>();
 // 获取选择对象
 // 获取选择对象
-const getSelectValue = (query: any) => {
+const getSelectValue = (query: any[]) => {
   let arr: EmptyArrayType;
   let arr: EmptyArrayType;
   arr = query.map((item: any) => ({ name: item.name, id: item.id }));
   arr = query.map((item: any) => ({ name: item.name, id: item.id }));
   // 使用模板字符串
   // 使用模板字符串
-  form.handlerClassifies = `${JSON.stringify(arr)}`;
-};
-const selectComponent = (val: any) => {
-  form.components = JSON.stringify(val);
+  form.handlerTypeItems = `${JSON.stringify(arr)}`;
 };
 };
-// 选择会签发起节点
-const chanStartCode = (val: string) => {
-  form.countersignEndStepCode = form.code;
-  const currentItem = form.nodes.find((v: any) => v.id === val); //拿到当前选中的节点
-  if (currentItem) {
-    if (currentItem.properties?.countersignStartStepCode) {
-      // 如果选中的会签发起节点有关联其他汇总节点
-      ElMessageBox.alert(`该节点已关联其他汇总节点,覆盖当前配置`, '提示', {
-        confirmButtonText: '确认',
-        type: 'warning',
-        draggable: true,
-        cancelButtonClass: 'default-button',
-        showClose: false,
-        autofocus: false,
-      }).then(() => {
-        const beforeChangeItem = form.nodes.find((v: any) => v.properties?.countersignEndStepCode === form.countersignEndStepCode);
-        // 先找到修改前关联的流程节点并清空
-        beforeChangeItem.properties.countersignStartStepCode = '';
-        beforeChangeItem.properties.countersignEndStepCode = '';
-        beforeChangeItem.properties.type = beforeChangeItem.type.replace('hotline:', '');
-        beforeChangeItem.properties.id = beforeChangeItem.id;
-        emits('countersignStartStepCode', beforeChangeItem.properties);
-
-        // 再找到修改前的汇总节点并清空
-        const afterChangeItem = form.summaryNodes.find((v: any) => v.id === currentItem.properties.countersignEndStepCode);
-        afterChangeItem.properties.countersignStartStepCode = '';
-        afterChangeItem.properties.countersignEndStepCode = '';
-        afterChangeItem.properties.type = afterChangeItem.type.replace('hotline:', '');
-        afterChangeItem.properties.id = afterChangeItem.id;
-        emits('countersignStartStepCode', afterChangeItem.properties);
-
-        // 再重新赋值 当前节点
-        currentItem.properties.countersignStartStepCode = val;
-        currentItem.properties.countersignEndStepCode = form.code;
-        currentItem.properties.type = currentItem.type.replace('hotline:', '');
-        currentItem.properties.id = currentItem.id;
-        emits('countersignStartStepCode', currentItem.properties);
-      });
-    } else {
-      currentItem.properties.countersignStartStepCode = val;
-      currentItem.properties.countersignEndStepCode = form.code;
-      currentItem.properties.type = currentItem.type.replace('hotline:', '');
-      currentItem.properties.id = currentItem.id;
-      emits('countersignStartStepCode', currentItem.properties);
-    }
+// 选择动态策略
+const selectInstancePolicy = (val:string|number)=>{
+  ruleFormRef.value.resetFields('terminalDynamicMark');
+  baseData.dynamicStrategyOptions = [];
+  let item = baseData.dynamicPolicyOptions.filter((item:any)=>item.key === val)[0];
+  if(item.items && item.items.length){
+    baseData.dynamicStrategyOptions = item.items;
   }
   }
-};
-// 会签
-const countersignModeList = ref<EmptyArrayType>() as any;
-// 节点属性
-const businessPropertyOptions = ref<EmptyArrayType>() as any;
-// 部门
-const orgData = ref<EmptyArrayType>() as any;
-// 组件
-const stepPropertiesOptions = ref<EmptyArrayType>() as any;
-//
-const pathPolicyOptions = ref<EmptyArrayType>() as any;
+}
+const baseData = reactive<any>({
+  businessTypeOptions: <EmptyArrayType>[], // 业务类型
+  countersignMode: <EmptyArrayType>[], // 会签
+  handlerTypeOptions: <EmptyArrayType>[], // 办理者类型
+  dynamicStrategyOptions: <EmptyArrayType>[], // 动态策略
+  executeModeOptions: <EmptyArrayType>[], // 执行模式
+  dynamicPolicyOptions: <EmptyArrayType>[], // 会签策略
+  instanceModeOptions: <EmptyArrayType>[], // 实例化模式
+});
 onMounted(async () => {
 onMounted(async () => {
-  // 获取页面基础数据
-  const res: any = await baseData();
-  handlerTypeOptions.value = res.result?.handlerTypeOptions ?? [];
-  handlerTypeOptions.value = handlerTypeOptions.value.map((item: any) => ({
-    value: item.key,
-    label: item.value,
-  }));
-  countersignModeList.value = res.result?.countersignMode ?? [];
-  countersignModeList.value = countersignModeList.value.map((item: any) => ({
+  const {
+    businessTypeOptions,
+    handlerTypeOptions,
+    countersignMode,
+    dynamicPolicyOptions,
+    executeModeOptions,
+    instanceModeOptions,
+  } = props.baseData;
+  baseData.businessTypeOptions = businessTypeOptions; // 业务类型
+  baseData.handlerTypeOptions = handlerTypeOptions.map((item: any) => ({
+    // 办理者类型
     value: item.key,
     value: item.key,
     label: item.value,
     label: item.value,
   }));
   }));
-  businessPropertyOptions.value = res.result?.businessPropertyOptions ?? [];
-  businessPropertyOptions.value = businessPropertyOptions.value.map((item: any) => ({
-    value: item.key,
-    label: item.value,
-  }));
-  pathPolicyOptions.value = res.result?.pathPolicyOptions ?? [];
-  stepPropertiesOptions.value = res.result?.stepPropertiesOptions ?? [];
+  baseData.executeModeOptions = executeModeOptions; // 执行模式
+  baseData.countersignMode = countersignMode;// 支持发起会签
+  baseData.dynamicPolicyOptions = dynamicPolicyOptions; // 会签策略
+  baseData.instanceModeOptions = instanceModeOptions; // 实例模式
+
   // 合并表单
   // 合并表单
   Object.assign(form, props.modelValue);
   Object.assign(form, props.modelValue);
-  if(form.components.includes('[')){
-    form.componentsOrigin = JSON.parse(form.components);
-  }
-  if (form.handlerClassifies.includes('[')) {
+  if (form.handlerTypeItems.includes('[')) {
     switch (form.handlerType) {
     switch (form.handlerType) {
       case 0:
       case 0:
       case 1:
       case 1:
       case 2:
       case 2:
-        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems);
         break;
         break;
       case 3:
       case 3:
-        userList.value = form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        userList.value = form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems);
         break;
         break;
       case 4:
       case 4:
-        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies).map((v: any) => v.id);
+        form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems).map((v: any) => v.id);
         break;
         break;
       default:
       default:
         break;
         break;
@@ -313,14 +292,16 @@ onMounted(async () => {
       id: item.key,
       id: item.key,
       name: item.value,
       name: item.value,
     }));
     }));
-    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
   } else if ([3].includes(form.handlerType)) {
   } else if ([3].includes(form.handlerType)) {
-    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
   } else if ([4].includes(form.handlerType)) {
   } else if ([4].includes(form.handlerType)) {
-    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
     getOrgListFn();
     getOrgListFn();
   }
   }
-  nodesOptions.value = form.nodes ?? [];
+  if(form.instancePolicy || form.instancePolicy === 0){
+    selectInstancePolicy(form.instancePolicy);
+  }
 });
 });
 // 导入属性及方法给外部调用
 // 导入属性及方法给外部调用
 defineExpose({
 defineExpose({

+ 8 - 8
src/components/LogicFlow/PropertySetting/index.vue

@@ -96,7 +96,6 @@ const propertyKeys:Array<string> = [
 	'name',
 	'name',
 	'code',
 	'code',
 	'id',
 	'id',
-	'description',
 	// 节点属性
 	// 节点属性
 	'name',
 	'name',
 	'code',
 	'code',
@@ -104,13 +103,14 @@ const propertyKeys:Array<string> = [
   'businessType',
   'businessType',
   'handlerType',
   'handlerType',
 	'handlerTypeItems',
 	'handlerTypeItems',
-	'countersignMode',
-	'form',
-	'countersignStartStepCode',
-	'countersignEndStepCode',
-  'businessProperty',
-  'components',
-  'pathPolicy'
+  'canReject',
+  'executeMode',
+  'canStartCountersign',
+  'countersignPolicy',
+  'instanceMode',
+  'instancePolicy',
+  'terminalDynamicMark',
+  'tag',
 ];
 ];
 // 去重后的key
 // 去重后的key
 const propertyKeysSet = Array.from(new Set(propertyKeys));
 const propertyKeysSet = Array.from(new Set(propertyKeys));

+ 151 - 166
src/components/LogicFlow/PropertySetting/start.vue

@@ -4,22 +4,30 @@
       <el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
       <el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
         <el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
         <el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="节点编码" prop="code" :rules="[{ required: true, message: '请输入节点编码', trigger: 'blur' }]">
+      <el-form-item label="节点编码" prop="stepType" :rules="[{ required: true, message: '请输入节点编码', trigger: 'blur' }]">
         <el-input v-model="form.code" disabled placeholder="请输入节点编码" clearable></el-input>
         <el-input v-model="form.code" disabled placeholder="请输入节点编码" clearable></el-input>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="处理人" prop="handlerType" :rules="[{ required: true, message: '请选择处理人', trigger: 'change' }]">
-        <el-select v-model="form.handlerType" class="w100" placeholder="请选择处理人" @change="changeOptions">
-          <el-option v-for="item in handlerTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
+      <el-form-item label="节点类型" prop="stepTypeName" :rules="[{ required: true, message: '请选择节点类型', trigger: 'change' }]">
+        <el-input v-model="form.stepTypeName" disabled></el-input>
+      </el-form-item>
+      <el-form-item label="业务类型" prop="businessType" :rules="[{ required: true, message: '请选择业务类型', trigger: 'change' }]">
+        <el-select v-model="form.businessType" class="w100" placeholder="请选择业务类型">
+          <el-option v-for="item in baseData.businessTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="办理者类型" prop="handlerType" :rules="[{ required: true, message: '请选择办理者类型', trigger: 'change' }]">
+        <el-select v-model="form.handlerType" class="w100" placeholder="请选择办理者类型" @change="changeOptions">
+          <el-option v-for="item in baseData.handlerTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
       <!-- 选择其他 -->
       <!-- 选择其他 -->
       <el-form-item
       <el-form-item
           v-if="[0, 1, 2].includes(form.handlerType)"
           v-if="[0, 1, 2].includes(form.handlerType)"
           :label="itemName"
           :label="itemName"
-          prop="handlerClassifiesOrgin"
+          prop="handlerTypeItemsOrigin"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
       >
       >
-        <el-select v-model="form.handlerClassifiesOrgin" multiple filterable class="w100" @change="getSelectValue" value-key="id">
+        <el-select v-model="form.handlerTypeItemsOrigin" multiple filterable class="w100" @change="getSelectValue" value-key="id">
           <el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item" />
           <el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
@@ -27,11 +35,11 @@
       <el-form-item
       <el-form-item
           v-if="[3].includes(form.handlerType)"
           v-if="[3].includes(form.handlerType)"
           :label="itemName"
           :label="itemName"
-          prop="handlerClassifiesOrgin"
+          prop="handlerTypeItemsOrigin"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
       >
       >
         <el-select
         <el-select
-            v-model="form.handlerClassifiesOrgin"
+            v-model="form.handlerTypeItemsOrigin"
             multiple
             multiple
             filterable
             filterable
             remote
             remote
@@ -51,101 +59,128 @@
       <el-form-item
       <el-form-item
           v-if="[4].includes(form.handlerType)"
           v-if="[4].includes(form.handlerType)"
           :label="itemName"
           :label="itemName"
-          prop="handlerClassifiesOrgin"
+          prop="handlerTypeItemsOrigin"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
           :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
       >
       >
         <el-tree-select
         <el-tree-select
-            :props="{ label: 'orgName' }"
+            :props="{ label: 'name' }"
             node-key="id"
             node-key="id"
             class="w100"
             class="w100"
             ref="treeSelectRef"
             ref="treeSelectRef"
-            v-model="form.handlerClassifiesOrgin"
+            v-model="form.handlerTypeItemsOrigin"
             :data="orgData"
             :data="orgData"
             multiple
             multiple
             :render-after-expand="false"
             :render-after-expand="false"
             show-checkbox
             show-checkbox
-            @check-change="checkChange"
             check-strictly
             check-strictly
             default-expand-all
             default-expand-all
             filterable
             filterable
         />
         />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="节点属性" prop="businessProperty" :rules="[{ required: true, message: '请选择节点属性', trigger: 'change' }]">
-        <el-select v-model="form.businessProperty" class="w100" placeholder="请选择节点属性">
-          <el-option v-for="item in businessPropertyOptions" :key="item.value" :label="item.label" :value="item.value" />
+      <el-form-item label="否决按钮" prop="canReject">
+        <el-switch
+            v-model="form.canReject"
+            inline-prompt
+            active-text="启用"
+            inactive-text="禁用"
+        />
+      </el-form-item>
+      <el-form-item label="执行模式" prop="executeMode" :rules="[{ required: true, message: '请选择执行模式', trigger: 'change' }]">
+        <el-select v-model="form.executeMode" class="w100" placeholder="请选择执行模式">
+          <el-option v-for="item in baseData.executeModeOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="会签" prop="countersignMode" :rules="[{ required: true, message: '请选择会签', trigger: 'change' }]">
-        <el-select v-model="form.countersignMode" class="w100" placeholder="请选择会签">
-          <el-option v-for="item in countersignModeList" :key="item.value" :label="item.label" :value="item.value" />
+      <el-form-item label="支持会签" prop="canStartCountersign">
+        <el-switch
+            v-model="form.canStartCountersign"
+            inline-prompt
+            active-text="支持"
+            inactive-text="不支持"
+        />
+      </el-form-item>
+      <el-form-item label="会签策略" prop="countersignPolicy" :rules="[{ required: true, message: '请选择会签策略', trigger: 'change' }]" v-if="form.canStartCountersign">
+        <el-select v-model="form.countersignPolicy" class="w100" placeholder="请选择会签策略">
+          <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="节点过滤策略" prop="pathPolicy" :rules="[{ required: true, message: '请选择节点过滤策略', trigger: 'change' }]">
-        <el-select v-model="form.pathPolicy" class="w100" placeholder="请选择节点过滤策略">
-          <el-option v-for="item in pathPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
+      <el-form-item label="实例化模式" prop="instanceMode" :rules="[{ required: true, message: '请选择实例化模式', trigger: 'change' }]">
+        <el-select v-model="form.instanceMode" class="w100" placeholder="请选择实例化模式">
+          <el-option v-for="item in baseData.instanceModeOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="会签发起节点" prop="countersignStartStepCode" :rules="[{ required: false, message: '请选择会签发起节点', trigger: 'change' }]">
-        <el-select v-model="form.countersignStartStepCode" class="w100" placeholder="请选择会签发起节点" @change="chanStartCode">
-          <el-option v-for="item in nodesOptions" :key="item.id" :label="item.text.value" :value="item.id" />
+      <el-form-item label="动态策略" prop="instancePolicy" :rules="[{ required: true, message: '请选择动态策略', trigger: 'change' }]" v-if="form.instanceMode === 1">
+        <el-select v-model="form.instancePolicy" class="w100" placeholder="请选择动态策略" @change="selectInstancePolicy">
+          <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="组件配置" prop="componentsOrigin" :rules="[{ required: false, message: '请选择组件配置', trigger: 'change' }]">
-        <el-checkbox-group v-model="form.componentsOrigin" @change="selectComponent">
-          <el-checkbox :label="item.dicDataValue" v-for="item in stepPropertiesOptions" :key="item.id">{{item.dicDataName}}</el-checkbox>
-        </el-checkbox-group>
+      <el-form-item label="动态终止标识" prop="terminalDynamicMark" :rules="[{ required: true, message: '请选择动态终止标识', trigger: 'change' }]" v-if="form.instanceMode === 1">
+        <el-select v-model="form.terminalDynamicMark" class="w100" placeholder="请选择动态终止标识">
+          <el-option v-for="item in baseData.dynamicStrategyOptions" :key="item.key" :label="item.value" :value="item.key" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="标识" prop="tag" :rules="[{ required: false, message: '请输入标识', trigger: 'blur' }]">
+        <el-input v-model="form.tag" placeholder="请输入标识" type="textarea" :autosize="{ minRows: 4, maxRows: 8 }"></el-input>
       </el-form-item>
       </el-form-item>
     </el-form>
     </el-form>
   </div>
   </div>
 </template>
 </template>
 <script lang="ts" setup name="flowNode">
 <script lang="ts" setup name="flowNode">
 import { reactive, watch, onMounted, ref } from 'vue';
 import { reactive, watch, onMounted, ref } from 'vue';
-import { ElMessageBox } from 'element-plus';
-import { removeDuplicate } from '/@/utils/arrayOperation';
-import { baseData, getSelectList,queryUser } from '/@/api/system/workflow';
+import { getSelectList, queryUser } from '/@/api/system/workflow';
 import { getCanUseOrg } from '/@/api/system/user';
 import { getCanUseOrg } from '/@/api/system/user';
+import { removeDuplicate } from '/@/utils/arrayOperation';
+import {ElInput} from "element-plus";
 const ruleFormRef = ref<RefType>();
 const ruleFormRef = ref<RefType>();
 // 定义属性
 // 定义属性
-const props = defineProps<{
-  modelValue: any;
-}>();
+const props = defineProps({
+  modelValue: {
+    type: Object,
+    default: () => {
+    }
+  },
+  baseData: {
+    type: Object,
+    default: () => {
+    }
+  }
+})
 // 注意:ref不能与model一样,相同的话表单双向绑定将会失效
 // 注意:ref不能与model一样,相同的话表单双向绑定将会失效
 const form = reactive<Record<string, any>>({
 const form = reactive<Record<string, any>>({
-  ...props.modelValue,  // 传入的数据
-  handlerClassifiesOrgin: [], // 选择的数据
-  handlerClassifies: [],  // 选择的数据
-  handlerType: '',  // 处理人类型
-  businessProperty: '', // 节点属性
-  countersignMode: '',  // 会签
-  countersignStartStepCode: '', // 会签发起节点
-  countersignEndStepCode: '',  // 会签结束节点
-  pathPolicy: null, // 节点过滤策略
-  componentsOrigin:[],
-  components:[], //组件配置
-});
-const emits = defineEmits(['update:modelValue', 'countersignStartStepCode']); // 定义事件
-
-//
+  ...props.modelValue, // 传入的数据
+  stepTypeName:'开始节点',
+  stepType:1,// 节点类型(开始1 结束2)
+  businessType:null,// 业务类型
+  handlerType:null,// 办理者类型
+  handlerTypeItemsOrigin:[],// 办理者类型
+  handlerTypeItems:'[]',// 办理者类型
+  canReject:false, // 否决按钮
+  executeMode:null, // 执行模式
+  canStartCountersign:false, // 支持会签
+  countersignPolicy:null, // 会签策略
+  instanceMode:null, // 实例化模式
+  instancePolicy:null, // 动态策略
+  terminalDynamicMark:null, // 动态终止标识
+  tag:'', // 标识
+}) as any;
+const emits = defineEmits(['update:modelValue']); // 定义事件
 const loading = ref(false); // 加载
 const loading = ref(false); // 加载
-const nodesOptions = ref([] as any);  // 节点
 watch(
 watch(
     () => form,
     () => form,
     () => {
     () => {
+      form.stepTypeName = form.name+'节点';
       emits('update:modelValue', Object.assign(props.modelValue, form));
       emits('update:modelValue', Object.assign(props.modelValue, form));
     },
     },
     { deep: true }
     { deep: true }
 );
 );
 // 选择处理人获取数据
 // 选择处理人获取数据
-// 处理人
-const handlerTypeOptions = ref<EmptyArrayType>() as any;
 // 下拉内容
 // 下拉内容
 const selectList = ref<EmptyArrayType>() as any;
 const selectList = ref<EmptyArrayType>() as any;
 // 会签
 // 会签
 const itemName = ref<string>('');
 const itemName = ref<string>('');
 const changeOptions = (e: any) => {
 const changeOptions = (e: any) => {
-  form.handlerClassifiesOrgin = [];
-  form.handlerClassifies = '[]';
-  itemName.value = handlerTypeOptions.value[e].label;
+  form.handlerTypeItemsOrigin = [];
+  form.handlerTypeItems = '[]';
+  itemName.value = baseData.handlerTypeOptions[e].label;
   if ([0, 1, 2].includes(e)) {
   if ([0, 1, 2].includes(e)) {
     getSelectList(e).then((res: any) => {
     getSelectList(e).then((res: any) => {
       selectList.value = res.result ?? [];
       selectList.value = res.result ?? [];
@@ -159,29 +194,9 @@ const changeOptions = (e: any) => {
     getOrgListFn();
     getOrgListFn();
   }
   }
 };
 };
-// 获取可用组织
-const getOrgListFn = () => {
-  getCanUseOrg().then((res: any) => {
-    orgData.value = res?.result ?? [];
-  });
-};
-const treeSelectRef = ref<RefType>();
-// 选择部门
-const checkChange = () => {
-  const data = treeSelectRef.value.getCheckedNodes();
-  let arr: EmptyArrayType;
-  arr = data.map((v: any) => {
-    return {
-      id: v.orgCode,
-      name: v.orgName,
-    };
-  });
-  // 使用模板字符串
-  form.handlerClassifies = `${JSON.stringify(arr)}`;
-};
 // 远程搜索用户名称
 // 远程搜索用户名称
 // 指定用户列表
 // 指定用户列表
-const userList = ref<any>();
+const userList = ref<EmptyArrayType>([]);
 const remoteMethod = (query: string) => {
 const remoteMethod = (query: string) => {
   if (query !== '') {
   if (query !== '') {
     loading.value = true;
     loading.value = true;
@@ -190,117 +205,85 @@ const remoteMethod = (query: string) => {
       const newUsers = res.result.map((item: any) => {
       const newUsers = res.result.map((item: any) => {
         return {
         return {
           ...item,
           ...item,
-          name: !item.name.includes('-') ? item.name + '-' + item.organization.orgName : item.name
+          name: !item.name.includes('-') ? item.name + '-' + item.organization.name : item.name,
         };
         };
       });
       });
-      userList.value = removeDuplicate([ ...newUsers,...userList.value], 'id');
+      userList.value = removeDuplicate([...newUsers, ...userList.value], 'id');
     });
     });
   }
   }
 };
 };
+
+// 获取可用组织
+const orgData = ref<EmptyArrayType>([]);
+const getOrgListFn = () => {
+  getCanUseOrg().then((res: any) => {
+    orgData.value = res?.result ?? [];
+  });
+};
+const treeSelectRef = ref<RefType>();
 // 获取选择对象
 // 获取选择对象
-const getSelectValue = (query: any) => {
+const getSelectValue = (query: any[]) => {
   let arr: EmptyArrayType;
   let arr: EmptyArrayType;
   arr = query.map((item: any) => ({ name: item.name, id: item.id }));
   arr = query.map((item: any) => ({ name: item.name, id: item.id }));
   // 使用模板字符串
   // 使用模板字符串
-  form.handlerClassifies = `${JSON.stringify(arr)}`;
-};
-const selectComponent = (val: any) => {
-  form.components = JSON.stringify(val);
+  form.handlerTypeItems = `${JSON.stringify(arr)}`;
 };
 };
-// 选择会签发起节点
-const chanStartCode = (val: string) => {
-  form.countersignEndStepCode = form.code;
-  const currentItem = form.nodes.find((v: any) => v.id === val); //拿到当前选中的节点
-  if (currentItem) {
-    if (currentItem.properties?.countersignStartStepCode) {
-      // 如果选中的会签发起节点有关联其他汇总节点
-      ElMessageBox.alert(`该节点已关联其他汇总节点,覆盖当前配置`, '提示', {
-        confirmButtonText: '确认',
-        type: 'warning',
-        draggable: true,
-        cancelButtonClass: 'default-button',
-        showClose: false,
-        autofocus: false,
-      }).then(() => {
-        const beforeChangeItem = form.nodes.find((v: any) => v.properties?.countersignEndStepCode === form.countersignEndStepCode);
-        // 先找到修改前关联的流程节点并清空
-        beforeChangeItem.properties.countersignStartStepCode = '';
-        beforeChangeItem.properties.countersignEndStepCode = '';
-        beforeChangeItem.properties.type = beforeChangeItem.type.replace('hotline:', '');
-        beforeChangeItem.properties.id = beforeChangeItem.id;
-        emits('countersignStartStepCode', beforeChangeItem.properties);
-
-        // 再找到修改前的汇总节点并清空
-        const afterChangeItem = form.summaryNodes.find((v: any) => v.id === currentItem.properties.countersignEndStepCode);
-        afterChangeItem.properties.countersignStartStepCode = '';
-        afterChangeItem.properties.countersignEndStepCode = '';
-        afterChangeItem.properties.type = afterChangeItem.type.replace('hotline:', '');
-        afterChangeItem.properties.id = afterChangeItem.id;
-        emits('countersignStartStepCode', afterChangeItem.properties);
-
-        // 再重新赋值 当前节点
-        currentItem.properties.countersignStartStepCode = val;
-        currentItem.properties.countersignEndStepCode = form.code;
-        currentItem.properties.type = currentItem.type.replace('hotline:', '');
-        currentItem.properties.id = currentItem.id;
-        emits('countersignStartStepCode', currentItem.properties);
-      });
-    } else {
-      currentItem.properties.countersignStartStepCode = val;
-      currentItem.properties.countersignEndStepCode = form.code;
-      currentItem.properties.type = currentItem.type.replace('hotline:', '');
-      currentItem.properties.id = currentItem.id;
-      emits('countersignStartStepCode', currentItem.properties);
-    }
+// 选择动态策略
+const selectInstancePolicy = (val:string|number)=>{
+  ruleFormRef.value.resetFields('terminalDynamicMark');
+  baseData.dynamicStrategyOptions = [];
+  let item = baseData.dynamicPolicyOptions.filter((item:any)=>item.key === val)[0];
+  if(item.items && item.items.length){
+    baseData.dynamicStrategyOptions = item.items;
   }
   }
-};
-// 会签
-const countersignModeList = ref<EmptyArrayType>() as any;
-// 节点属性
-const businessPropertyOptions = ref<EmptyArrayType>() as any;
-// 部门
-const orgData = ref<EmptyArrayType>() as any;
-// 组件
-const stepPropertiesOptions = ref<EmptyArrayType>() as any;
-//
-const pathPolicyOptions = ref<EmptyArrayType>() as any;
+}
+const baseData = reactive<any>({
+  businessTypeOptions: <EmptyArrayType>[], // 业务类型
+  countersignMode: <EmptyArrayType>[], // 会签
+  handlerTypeOptions: <EmptyArrayType>[], // 办理者类型
+  dynamicStrategyOptions: <EmptyArrayType>[], // 动态策略
+  executeModeOptions: <EmptyArrayType>[], // 执行模式
+  dynamicPolicyOptions: <EmptyArrayType>[], // 会签策略
+  instanceModeOptions: <EmptyArrayType>[], // 实例化模式
+});
+// 会签结束节点
+const nodesOptions = ref([] as any);
 onMounted(async () => {
 onMounted(async () => {
-  // 获取页面基础数据
-  const res: any = await baseData();
-  handlerTypeOptions.value = res.result?.handlerTypeOptions ?? [];
-  handlerTypeOptions.value = handlerTypeOptions.value.map((item: any) => ({
-    value: item.key,
-    label: item.value,
-  }));
-  countersignModeList.value = res.result?.countersignMode ?? [];
-  countersignModeList.value = countersignModeList.value.map((item: any) => ({
+  const {
+    stepTypeOptions,
+    businessTypeOptions,
+    handlerTypeOptions,
+    countersignMode,
+    dynamicPolicyOptions,
+    executeModeOptions,
+    instanceModeOptions,
+  } = props.baseData;
+  baseData.businessTypeOptions = businessTypeOptions; // 业务类型
+  baseData.stepTypeOptions = stepTypeOptions; // 节点类型
+  baseData.handlerTypeOptions = handlerTypeOptions.map((item: any) => ({
+    // 办理者类型
     value: item.key,
     value: item.key,
     label: item.value,
     label: item.value,
   }));
   }));
-  businessPropertyOptions.value = res.result?.businessPropertyOptions ?? [];
-  businessPropertyOptions.value = businessPropertyOptions.value.map((item: any) => ({
-    value: item.key,
-    label: item.value,
-  }));
-  pathPolicyOptions.value = res.result?.pathPolicyOptions ?? [];
-  stepPropertiesOptions.value = res.result?.stepPropertiesOptions ?? [];
+  baseData.executeModeOptions = executeModeOptions; // 执行模式
+  baseData.countersignMode = countersignMode;// 支持发起会签
+  baseData.dynamicPolicyOptions = dynamicPolicyOptions; // 会签策略
+  baseData.instanceModeOptions = instanceModeOptions; // 实例模式
+
   // 合并表单
   // 合并表单
   Object.assign(form, props.modelValue);
   Object.assign(form, props.modelValue);
-  if(form.components.includes('[')){
-    form.componentsOrigin = JSON.parse(form.components);
-  }
-  if (form.handlerClassifies.includes('[')) {
+  if (form.handlerTypeItems.includes('[')) {
     switch (form.handlerType) {
     switch (form.handlerType) {
       case 0:
       case 0:
       case 1:
       case 1:
       case 2:
       case 2:
-        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems);
         break;
         break;
       case 3:
       case 3:
-        userList.value = form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        userList.value = form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems);
         break;
         break;
       case 4:
       case 4:
-        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies).map((v: any) => v.id);
+        form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems).map((v: any) => v.id);
         break;
         break;
       default:
       default:
         break;
         break;
@@ -313,14 +296,16 @@ onMounted(async () => {
       id: item.key,
       id: item.key,
       name: item.value,
       name: item.value,
     }));
     }));
-    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
   } else if ([3].includes(form.handlerType)) {
   } else if ([3].includes(form.handlerType)) {
-    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
   } else if ([4].includes(form.handlerType)) {
   } else if ([4].includes(form.handlerType)) {
-    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
     getOrgListFn();
     getOrgListFn();
   }
   }
-  nodesOptions.value = form.nodes ?? [];
+  if(form.instancePolicy || form.instancePolicy === 0){
+    selectInstancePolicy(form.instancePolicy);
+  }
 });
 });
 // 导入属性及方法给外部调用
 // 导入属性及方法给外部调用
 defineExpose({
 defineExpose({

+ 61 - 67
src/components/LogicFlow/PropertySetting/task.vue

@@ -26,10 +26,10 @@
 			<el-form-item
 			<el-form-item
 				v-if="[0, 1, 2].includes(form.handlerType)"
 				v-if="[0, 1, 2].includes(form.handlerType)"
 				:label="itemName"
 				:label="itemName"
-				prop="handlerTypeItemsOrgin"
+				prop="handlerTypeItemsOrigin"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 			>
 			>
-				<el-select v-model="form.handlerTypeItemsOrgin" multiple filterable class="w100" @change="getSelectValue" value-key="id">
+				<el-select v-model="form.handlerTypeItemsOrigin" multiple filterable class="w100" @change="getSelectValue" value-key="id">
 					<el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item" />
 					<el-option v-for="item in selectList" :key="item.id" :label="item.name" :value="item" />
 				</el-select>
 				</el-select>
 			</el-form-item>
 			</el-form-item>
@@ -37,11 +37,11 @@
 			<el-form-item
 			<el-form-item
 				v-if="[3].includes(form.handlerType)"
 				v-if="[3].includes(form.handlerType)"
 				:label="itemName"
 				:label="itemName"
-				prop="handlerTypeItemsOrgin"
+				prop="handlerTypeItemsOrigin"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 			>
 			>
 				<el-select
 				<el-select
-					v-model="form.handlerTypeItemsOrgin"
+					v-model="form.handlerTypeItemsOrigin"
 					multiple
 					multiple
 					filterable
 					filterable
 					remote
 					remote
@@ -61,7 +61,7 @@
 			<el-form-item
 			<el-form-item
 				v-if="[4].includes(form.handlerType)"
 				v-if="[4].includes(form.handlerType)"
 				:label="itemName"
 				:label="itemName"
-				prop="handlerTypeItemsOrgin"
+				prop="handlerTypeItemsOrigin"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 			>
 			>
 				<el-tree-select
 				<el-tree-select
@@ -69,7 +69,7 @@
 					node-key="id"
 					node-key="id"
 					class="w100"
 					class="w100"
 					ref="treeSelectRef"
 					ref="treeSelectRef"
-					v-model="form.handlerTypeItemsOrgin"
+					v-model="form.handlerTypeItemsOrigin"
 					:data="orgData"
 					:data="orgData"
 					multiple
 					multiple
 					:render-after-expand="false"
 					:render-after-expand="false"
@@ -100,25 +100,24 @@
             inactive-text="不支持"
             inactive-text="不支持"
         />
         />
 			</el-form-item>
 			</el-form-item>
-			<el-form-item label="会签策略" prop="countersignPolicy" :rules="[{ required: true, message: '请选择会签策略', trigger: 'change' }]" v-if="form.canStartCountersign">
-				<el-select v-model="form.countersignPolicy" class="w100" placeholder="请选择会签策略" @change="selectCountersignPolicy">
-					<el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
-				</el-select>
-			</el-form-item>
-      <el-form-item label="实例化模式" prop="instanceMode" :rules="[{ required: true, message: '请选择实例化模式', trigger: 'change' }]" v-if="form.canStartCountersign">
+      <el-form-item label="会签策略" prop="countersignPolicy" :rules="[{ required: true, message: '请选择会签策略', trigger: 'change' }]" v-if="form.canStartCountersign">
+        <el-select v-model="form.countersignPolicy" class="w100" placeholder="请选择会签策略">
+          <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="实例化模式" prop="instanceMode" :rules="[{ required: true, message: '请选择实例化模式', trigger: 'change' }]">
         <el-select v-model="form.instanceMode" class="w100" placeholder="请选择实例化模式">
         <el-select v-model="form.instanceMode" class="w100" placeholder="请选择实例化模式">
           <el-option v-for="item in baseData.instanceModeOptions" :key="item.key" :label="item.value" :value="item.key" />
           <el-option v-for="item in baseData.instanceModeOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-
       <el-form-item label="动态策略" prop="instancePolicy" :rules="[{ required: true, message: '请选择动态策略', trigger: 'change' }]" v-if="form.instanceMode === 1">
       <el-form-item label="动态策略" prop="instancePolicy" :rules="[{ required: true, message: '请选择动态策略', trigger: 'change' }]" v-if="form.instanceMode === 1">
-        <el-select v-model="form.instancePolicy" class="w100" placeholder="请选择动态策略">
+        <el-select v-model="form.instancePolicy" class="w100" placeholder="请选择动态策略" @change="selectInstancePolicy">
           <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
           <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
       <el-form-item label="动态终止标识" prop="terminalDynamicMark" :rules="[{ required: true, message: '请选择动态终止标识', trigger: 'change' }]" v-if="form.instanceMode === 1">
       <el-form-item label="动态终止标识" prop="terminalDynamicMark" :rules="[{ required: true, message: '请选择动态终止标识', trigger: 'change' }]" v-if="form.instanceMode === 1">
         <el-select v-model="form.terminalDynamicMark" class="w100" placeholder="请选择动态终止标识">
         <el-select v-model="form.terminalDynamicMark" class="w100" placeholder="请选择动态终止标识">
-          <el-option v-for="item in baseData.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
+          <el-option v-for="item in baseData.dynamicStrategyOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
 			<el-form-item label="标识" prop="tag" :rules="[{ required: false, message: '请输入标识', trigger: 'blur' }]">
 			<el-form-item label="标识" prop="tag" :rules="[{ required: false, message: '请输入标识', trigger: 'blur' }]">
@@ -135,36 +134,34 @@ import { removeDuplicate } from '/@/utils/arrayOperation';
 import {ElInput} from "element-plus";
 import {ElInput} from "element-plus";
 const ruleFormRef = ref<RefType>();
 const ruleFormRef = ref<RefType>();
 // 定义属性
 // 定义属性
-const props = defineProps<{
-	modelValue: any;
-	baseData: {
-		type: object;
-		default: () => {
-			stepTypeOptions: EmptyArrayType;
-			businessTypeOptions: EmptyArrayType;
-			handlerTypeOptions: EmptyArrayType;
-			countersignMode: EmptyArrayType;
-			dynamicPolicyOptions: EmptyArrayType;
-			executeModeOptions: EmptyArrayType;
-			instanceModeOptions: EmptyArrayType;
-			moduleOptions: EmptyArrayType;
-			stepPropertiesOptions: EmptyArrayType;
-		};
-	};
-}>();
+const props = defineProps({
+  modelValue: {
+    type: Object,
+    default: () => {
+    }
+  },
+  baseData: {
+    type: Object,
+    default: () => {
+    }
+  }
+})
 // 注意:ref不能与model一样,相同的话表单双向绑定将会失效
 // 注意:ref不能与model一样,相同的话表单双向绑定将会失效
 const form = reactive<Record<string, any>>({
 const form = reactive<Record<string, any>>({
 	...props.modelValue, // 传入的数据
 	...props.modelValue, // 传入的数据
-	handlerTypeItemsOrgin: [], // 选择的数据
-	handlerTypeItems: [], // 选择的数据
-	handlerType: '', // 处理人类型
-	businessProperty: '', // 节点属性
-	countersignMode: '', // 会签
-	countersignStartStepCode: '', // 会签开始节点
-	countersignEndStepCode: '', // 会签结束节点
-	pathPolicy: null, // 节点过滤策略
-	componentsOrigin: [], // 组件配置
-	components: [], //组件配置
+  stepType:null,// 节点类型
+  businessType:null,// 业务类型
+  handlerType:null,// 办理者类型
+  handlerTypeItemsOrigin:[],// 办理者类型
+  handlerTypeItems:'[]',// 办理者类型
+  canReject:false, // 否决按钮
+  executeMode:null, // 执行模式
+  canStartCountersign:false, // 支持会签
+  countersignPolicy:null, // 会签策略
+  instanceMode:null, // 实例化模式
+  instancePolicy:null, // 动态策略
+  terminalDynamicMark:null, // 动态终止标识
+  tag:'', // 标识
 });
 });
 const emits = defineEmits(['update:modelValue']); // 定义事件
 const emits = defineEmits(['update:modelValue']); // 定义事件
 const loading = ref(false); // 加载
 const loading = ref(false); // 加载
@@ -181,7 +178,7 @@ const selectList = ref<EmptyArrayType>() as any;
 // 会签
 // 会签
 const itemName = ref<string>('');
 const itemName = ref<string>('');
 const changeOptions = (e: any) => {
 const changeOptions = (e: any) => {
-	form.handlerTypeItemsOrgin = [];
+	form.handlerTypeItemsOrigin = [];
 	form.handlerTypeItems = '[]';
 	form.handlerTypeItems = '[]';
 	itemName.value = baseData.handlerTypeOptions[e].label;
 	itemName.value = baseData.handlerTypeOptions[e].label;
 	if ([0, 1, 2].includes(e)) {
 	if ([0, 1, 2].includes(e)) {
@@ -217,15 +214,13 @@ const remoteMethod = (query: string) => {
 };
 };
 
 
 // 获取可用组织
 // 获取可用组织
+const orgData = ref<EmptyArrayType>([]);
 const getOrgListFn = () => {
 const getOrgListFn = () => {
 	getCanUseOrg().then((res: any) => {
 	getCanUseOrg().then((res: any) => {
 		orgData.value = res?.result ?? [];
 		orgData.value = res?.result ?? [];
 	});
 	});
 };
 };
 const treeSelectRef = ref<RefType>();
 const treeSelectRef = ref<RefType>();
-const selectComponent = (val: any) => {
-	form.components = JSON.stringify(val);
-};
 // 获取选择对象
 // 获取选择对象
 const getSelectValue = (query: any[]) => {
 const getSelectValue = (query: any[]) => {
 	let arr: EmptyArrayType;
 	let arr: EmptyArrayType;
@@ -233,19 +228,27 @@ const getSelectValue = (query: any[]) => {
 	// 使用模板字符串
 	// 使用模板字符串
 	form.handlerTypeItems = `${JSON.stringify(arr)}`;
 	form.handlerTypeItems = `${JSON.stringify(arr)}`;
 };
 };
-// 选择会签策略
-const selectCountersignPolicy = ()=>{
-
+// 选择动态策略
+const selectInstancePolicy = (val:string|number)=>{
+  ruleFormRef.value.resetFields('terminalDynamicMark');
+  baseData.dynamicStrategyOptions = [];
+  let item = baseData.dynamicPolicyOptions.filter((item:any)=>item.key === val)[0];
+  if(item.items && item.items.length){
+    baseData.dynamicStrategyOptions = item.items;
+  }
 }
 }
 const baseData = reactive<any>({
 const baseData = reactive<any>({
 	businessTypeOptions: <EmptyArrayType>[], // 业务类型
 	businessTypeOptions: <EmptyArrayType>[], // 业务类型
 	countersignMode: <EmptyArrayType>[], // 会签
 	countersignMode: <EmptyArrayType>[], // 会签
 	handlerTypeOptions: <EmptyArrayType>[], // 办理者类型
 	handlerTypeOptions: <EmptyArrayType>[], // 办理者类型
+  dynamicStrategyOptions: <EmptyArrayType>[], // 动态策略
+  executeModeOptions: <EmptyArrayType>[], // 执行模式
+  dynamicPolicyOptions: <EmptyArrayType>[], // 会签策略
+  instanceModeOptions: <EmptyArrayType>[], // 实例化模式
 });
 });
 // 会签结束节点
 // 会签结束节点
 const nodesOptions = ref([] as any);
 const nodesOptions = ref([] as any);
 onMounted(async () => {
 onMounted(async () => {
-	console.log(props.baseData, '21');
 	const {
 	const {
 		stepTypeOptions,
 		stepTypeOptions,
 		businessTypeOptions,
 		businessTypeOptions,
@@ -254,8 +257,6 @@ onMounted(async () => {
 		dynamicPolicyOptions,
 		dynamicPolicyOptions,
 		executeModeOptions,
 		executeModeOptions,
 		instanceModeOptions,
 		instanceModeOptions,
-		moduleOptions,
-		stepPropertiesOptions,
 	} = props.baseData;
 	} = props.baseData;
 	baseData.businessTypeOptions = businessTypeOptions; // 业务类型
 	baseData.businessTypeOptions = businessTypeOptions; // 业务类型
 	baseData.stepTypeOptions = stepTypeOptions; // 节点类型
 	baseData.stepTypeOptions = stepTypeOptions; // 节点类型
@@ -266,32 +267,23 @@ onMounted(async () => {
 	}));
 	}));
   baseData.executeModeOptions = executeModeOptions; // 执行模式
   baseData.executeModeOptions = executeModeOptions; // 执行模式
   baseData.countersignMode = countersignMode;// 支持发起会签
   baseData.countersignMode = countersignMode;// 支持发起会签
-  baseData.dynamicPolicyOptions = dynamicPolicyOptions; // 节点过滤策略
+  baseData.dynamicPolicyOptions = dynamicPolicyOptions; // 会签策略
   baseData.instanceModeOptions = instanceModeOptions; // 实例模式
   baseData.instanceModeOptions = instanceModeOptions; // 实例模式
-	console.log(businessTypeOptions, '21');
-	// businessPropertyOptions.value = businessPropertyOptions.map((item: any) => ({
-	// 	value: item.key,
-	// 	label: item.value,
-	// }));
-	// stepPropertiesOptions.value = businessPropertyOptions;
-	// pathPolicyOptions.value = businessPropertyOptions;
+
 	// 合并表单
 	// 合并表单
 	Object.assign(form, props.modelValue);
 	Object.assign(form, props.modelValue);
-	if (form.components.includes('[')) {
-		form.componentsOrigin = JSON.parse(form.components);
-	}
 	if (form.handlerTypeItems.includes('[')) {
 	if (form.handlerTypeItems.includes('[')) {
 		switch (form.handlerType) {
 		switch (form.handlerType) {
 			case 0:
 			case 0:
 			case 1:
 			case 1:
 			case 2:
 			case 2:
-				form.handlerTypeItemsOrgin = JSON.parse(form.handlerTypeItems);
+				form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems);
 				break;
 				break;
 			case 3:
 			case 3:
-				userList.value = form.handlerTypeItemsOrgin = JSON.parse(form.handlerTypeItems);
+				userList.value = form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems);
 				break;
 				break;
 			case 4:
 			case 4:
-				form.handlerTypeItemsOrgin = JSON.parse(form.handlerTypeItems).map((v: any) => v.id);
+				form.handlerTypeItemsOrigin = JSON.parse(form.handlerTypeItems).map((v: any) => v.id);
 				break;
 				break;
 			default:
 			default:
 				break;
 				break;
@@ -311,7 +303,9 @@ onMounted(async () => {
 		if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
 		if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
 		getOrgListFn();
 		getOrgListFn();
 	}
 	}
-	nodesOptions.value = form.summaryNodes ?? [];
+  if(form.instancePolicy || form.instancePolicy === 0){
+    selectInstancePolicy(form.instancePolicy);
+  }
 });
 });
 // 导入属性及方法给外部调用
 // 导入属性及方法给外部调用
 defineExpose({
 defineExpose({

+ 0 - 2
src/components/LogicFlow/enums.ts

@@ -9,8 +9,6 @@ export enum NodeTypeEnum {
     task = 'task',
     task = 'task',
     summary = 'summary',
     summary = 'summary',
     transition = 'transition',
     transition = 'transition',
-    returnTransition = 'returnTransition',
-    subProcess = 'subProcess',
     ignore = 'ignore',
     ignore = 'ignore',
   }
   }
   
   

+ 8 - 69
src/components/LogicFlow/index.vue

@@ -244,9 +244,7 @@ const initOp = () => {
 			text: '开始',
 			text: '开始',
 			label: '开始节点',
 			label: '开始节点',
 			properties: {
 			properties: {
-        countersignMode: '',
-        handlerClassifies: [],
-        handlerType: '',
+
       },
       },
 			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==',
 			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==',
 		},
 		},
@@ -255,9 +253,7 @@ const initOp = () => {
 			text: '流程节点',
 			text: '流程节点',
 			label: '流程节点',
 			label: '流程节点',
 			properties: {
 			properties: {
-				countersignMode: '',
-				handlerClassifies: [],
-				handlerType: '',
+
 			},
 			},
 			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==',
 			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',
 			className: 'important-node',
@@ -267,9 +263,7 @@ const initOp = () => {
 			text: '结束',
 			text: '结束',
 			label: '结束节点',
 			label: '结束节点',
 			properties: {
 			properties: {
-        countersignMode: '',
-        handlerClassifies: [],
-        handlerType: '',
+
       },
       },
 			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',
 			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',
 		},
 		},
@@ -299,13 +293,6 @@ const initEvent = () => {
 	// })
 	// })
 	// 节点点击事件
 	// 节点点击事件
 	eventCenter.on('node:click', (args: any) => {
 	eventCenter.on('node:click', (args: any) => {
-		let nodes = lf.getGraphData().json.nodes;
-		let summaryNodes = nodes.filter((item: any) => {
-			return item.type === 'hotline:summary';
-		});
-		nodes = nodes.filter((item: any) => {
-			return item.type === 'hotline:task' || item.type === 'hotline:start' || item.type === 'hotline:end';
-		});
 		if (['hotline:start','hotline:task','hotline:end'].includes(args.data.type)) {
 		if (['hotline:start','hotline:task','hotline:end'].includes(args.data.type)) {
 			currentOpId.value = args.data.id;
 			currentOpId.value = args.data.id;
 			propertySettingRef.value.show({
 			propertySettingRef.value.show({
@@ -314,8 +301,6 @@ const initEvent = () => {
 				id: args.data.id,
 				id: args.data.id,
 				name: args.data.text?.value,
 				name: args.data.text?.value,
 				type: args.data.type,
 				type: args.data.type,
-				nodes,
-				summaryNodes,
 			});
 			});
 		}
 		}
 	});
 	});
@@ -345,6 +330,7 @@ const saveOnly = throttle((formEl: FormInstance | undefined) => {
       lf.graphModel[key] = form[key];
       lf.graphModel[key] = form[key];
     });
     });
     const { submitData } = getGraphData();
     const { submitData } = getGraphData();
+
     if (submitData.error) {
     if (submitData.error) {
       //错误提示
       //错误提示
       ElMessage.warning(submitData.error);
       ElMessage.warning(submitData.error);
@@ -379,53 +365,7 @@ const saveOnly = throttle((formEl: FormInstance | undefined) => {
         });
         });
       });
       });
     }
     }
-    emits('on-save', getGraphData());
-  })
-}, 300);
-// 发布 保存并发布
-const release = 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 (submitData.error) {
-      // 错误提示
-      ElMessage.warning(submitData.error);
-      return;
-    }
-    //不存在直接发布
-    ElMessageBox.confirm(`此操作将发布模板:“${form.name}”,是否继续?`, '提示', {
-      confirmButtonText: '确认',
-      cancelButtonText: '取消',
-      type: 'warning',
-      draggable: true,
-      cancelButtonClass: 'default-button',
-      autofocus: false,
-    })
-        .then(() => {
-          publish(submitData).then(() => {
-            //保存并发布
-            ElMessage.success('操作成功');
-            // 关闭当前 tagsView
-            mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
-            mittBus.emit('clearCache', 'systemWorkflow');
-            router.push({
-              name: 'systemWorkflow',
-              state:{
-                index:'1'
-              }
-            });
-          });
-        })
-        .catch(() => {});
+
     emits('on-save', getGraphData());
     emits('on-save', getGraphData());
   })
   })
 }, 300);
 }, 300);
@@ -439,8 +379,7 @@ const reRender = (data: any): void => {
 			// 最外层扩展属性赋值
 			// 最外层扩展属性赋值
 			form.name = lf.graphModel.name;
 			form.name = lf.graphModel.name;
 			form.code = lf.graphModel.code;
 			form.code = lf.graphModel.code;
-			form.moduleName = lf.graphModel.moduleName ?? '';
-			form.moduleCode = lf.graphModel.moduleCode ?? '';
+      form.description = lf.graphModel.description;
 			form.id = route.params.id;
 			form.id = route.params.id;
 			form.name = lf.graphModel.name;
 			form.name = lf.graphModel.name;
 		});
 		});
@@ -451,7 +390,7 @@ const reRender = (data: any): void => {
 const handlePropertyChange = (e: any) => {
 const handlePropertyChange = (e: any) => {
 	const lf = unref(lfInstance);
 	const lf = unref(lfInstance);
 	if (!lf) return;
 	if (!lf) return;
-	if (([NodeTypeEnum.task, NodeTypeEnum.summary, NodeTypeEnum.start] as NodeTypeEnum[]).includes(e.type)) {
+	if (([NodeTypeEnum.task, NodeTypeEnum.end, NodeTypeEnum.start] as NodeTypeEnum[]).includes(e.type)) {
 		// 节点属性
 		// 节点属性
 		const nodeId = unref(currentOpId);
 		const nodeId = unref(currentOpId);
 		// 节点信息
 		// 节点信息
@@ -477,7 +416,7 @@ const handlePropertyChange = (e: any) => {
 const handlePropertyChangeOther = (e: any) => {
 const handlePropertyChangeOther = (e: any) => {
 	const lf = unref(lfInstance);
 	const lf = unref(lfInstance);
 	if (!lf) return;
 	if (!lf) return;
-	if (([NodeTypeEnum.task, NodeTypeEnum.summary, NodeTypeEnum.start] as NodeTypeEnum[]).includes(e.type)) {
+	if (([NodeTypeEnum.task, NodeTypeEnum.end, NodeTypeEnum.start] as NodeTypeEnum[]).includes(e.type)) {
 		// 节点属性
 		// 节点属性
 		const nodeId = unref(e.id);
 		const nodeId = unref(e.id);
 		// 节点信息
 		// 节点信息

+ 2 - 4
src/components/LogicFlow/snakerflow/index.ts

@@ -32,8 +32,7 @@ class SnakerFlowAdapter {
       // 将流程扩展属性绑定给lf图模型对象
       // 将流程扩展属性绑定给lf图模型对象
       lf.graphModel.name = userData.name
       lf.graphModel.name = userData.name
       lf.graphModel.code = userData.code
       lf.graphModel.code = userData.code
-      lf.graphModel.moduleName = userData.moduleName
-      lf.graphModel.moduleCode = userData.moduleCode
+      lf.graphModel.description = userData.description
       lf.graphModel.id = userData.id
       lf.graphModel.id = userData.id
       return userData
       return userData
     }
     }
@@ -41,8 +40,7 @@ class SnakerFlowAdapter {
       const graphData = {
       const graphData = {
         name: lf.graphModel.name,
         name: lf.graphModel.name,
         code: lf.graphModel.code,
         code: lf.graphModel.code,
-        moduleName: lf.graphModel.moduleName,
-        moduleCode: lf.graphModel.moduleCode,
+        description:lf.graphModel.description,
         id: lf.graphModel.id,
         id: lf.graphModel.id,
         ...logicFlowData
         ...logicFlowData
       }
       }

+ 31 - 88
src/components/LogicFlow/snakerflow/tool.ts

@@ -51,13 +51,6 @@ export const edgeStyleHandle = (_this: BaseEdgeModel, style: {
   }
   }
   return style
   return style
 }
 }
-// 节点类型
-const nodeType:any = {
-  'task': 0,
-  'start': 1,
-  'end': 2,
-  'summary': 3,
-}
 /**
 /**
  * 将获取到的数据转换成logic flow需要的数据
  * 将获取到的数据转换成logic flow需要的数据
  * @param {*} data(...processInfo,nodes,edges)
  * @param {*} data(...processInfo,nodes,edges)
@@ -79,8 +72,7 @@ export const logicFlowJsonToSubmit = (data: any): object => {
   const processObj = <any>{
   const processObj = <any>{
     name: data.name, // 流程定义名称
     name: data.name, // 流程定义名称
     code: data.code, // 流程定义code
     code: data.code, // 流程定义code
-    moduleName: data.moduleName, // 业务模块
-    moduleCode: data.moduleCode, // 业务模块
+    description: data.description, // 流程定义描述
     id: data.id, // 流程id
     id: data.id, // 流程id
     steps: [] // 所有步骤
     steps: [] // 所有步骤
   }
   }
@@ -90,60 +82,27 @@ export const logicFlowJsonToSubmit = (data: any): object => {
   //  * @returns
   //  * @returns
   //  */
   //  */
   const getStartNode = () => {
   const getStartNode = () => {
-    return data.nodes.find((node: any) => {
+    return data.nodes.filter((node: any) => {
       // 是开始节点,且非子流程中的开始节点
       // 是开始节点,且非子流程中的开始节点
       return node.type === 'hotline:start'
       return node.type === 'hotline:start'
     })
     })
   }
   }
   // 获取结束节点
   // 获取结束节点
   const getEndNode = () => {
   const getEndNode = () => {
-    return data.nodes.find((node: any) => {
+    return data.nodes.filter((node: any) => {
       return node.type === 'hotline:end'
       return node.type === 'hotline:end'
     })
     })
   }
   }
-
-  // /**
-  // * 获取当前节点的所有下一个节点集合 非回退
-  // * @param {*} id 当前节点名称
-  // * @returns
-  // */
-  // const getNextNodes = (id: string) => {
-  //   return data.edges.filter((edge: any) => {
-  //     return edge.sourceNodeId === id && !edge.properties.isPrevious
-  //   }).map((edge: any) => {
-  //     return data.nodes.find((node: any) => {
-  //       return node.id === edge.targetNodeId
-  //     })
-  //   })
-  // }
-  // /**
-  //  * 获节点的下一步
-  //  * @param {*} id
-  //  * @returns
-  //  */
-  // const getNextStep = (id: string) => {
-  //   return data.edges.filter((edge: any) => {
-  //     return edge.sourceNodeId === id
-  //   }).map((edge: any) => {
-  //     return {
-  //       isPrevious: edge.properties.isPrevious ?? false,
-  //       code: edge.targetNodeId
-  //     }
-  //   })
-  // }
   // /**
   // /**
   //  * 构建节点属性
   //  * 构建节点属性
   //  * @param {}} node
   //  * @param {}} node
   //  * @returns
   //  * @returns
   //  */
   //  */
   const buildNode = (node: any) => {
   const buildNode = (node: any) => {
-    const nodeName = node.type.replace('hotline:', '')
     return {
     return {
-      stepType: nodeType[nodeName],
       name: (node.text instanceof String || node.text === undefined) ? node.text : node.text.value,
       name: (node.text instanceof String || node.text === undefined) ? node.text : node.text.value,
       ...node.properties,
       ...node.properties,
-      handlerClassifies: formatArrayHandlerClassifies(node),
-      components: formatArrayComponent(node),
+      handlerTypeItems: formatArrayHandlerTypeItems(node),
       code: node.id,
       code: node.id,
       nextSteps: node.nextSteps
       nextSteps: node.nextSteps
     }
     }
@@ -152,57 +111,35 @@ export const logicFlowJsonToSubmit = (data: any): object => {
    * 处理数组类型
    * 处理数组类型
    * @param {} node
    * @param {} node
    */
    */
-  const formatArrayHandlerClassifies = (node: any) => {
-    const nodeName = node.type.replace('hotline:', '')
-    let data: string[] = []
-    if (nodeName === 'task' || nodeName === 'summary') {
-      if (node.properties.handlerClassifies && Object.prototype.toString.call(node.properties.handlerClassifies) === '[object String]') {
-        data = JSON.parse(node.properties.handlerClassifies)
-      }
-    }
-    return data;
-  }
-  /**
-   * 处理数组类型
-   * @param {} node
-   */
-  const formatArrayComponent = (node: any) => {
+  const formatArrayHandlerTypeItems = (node: any) => {
     const nodeName = node.type.replace('hotline:', '')
     const nodeName = node.type.replace('hotline:', '')
     let data: string[] = []
     let data: string[] = []
-    if (nodeName === 'task' || nodeName === 'summary') {
-      if (node.properties.components && Object.prototype.toString.call(node.properties.components) === '[object String]') {
-        data = JSON.parse(node.properties.components)
+    if (['start', 'task','end'].includes(nodeName)) {
+      if (node.properties.handlerTypeItems && Object.prototype.toString.call(node.properties.handlerTypeItems) === '[object String]') {
+        data = JSON.parse(node.properties.handlerTypeItems)
       }
       }
     }
     }
     return data;
     return data;
   }
   }
-  // /**
-  //  * 递归构建节点属性
-  //  * @param {} node
-  //  */
-  // const recursionBuildNode = (node: any) => {
-  //   const nodeName = node.type.replace('hotline:', '')
-  //   if (!processObj[nodeName + '_' + node.id]) {
-  //     processObj.steps.push(buildNode(node))
-
-  //     const nextNodes = getNextNodes(node.id)
 
 
-  //     nextNodes.forEach((nextNode: any) => {
-  //       recursionBuildNode(nextNode)
-  //     })
-  //   }
-  // }
   const startNode = getStartNode();
   const startNode = getStartNode();
   const endNode = getEndNode();
   const endNode = getEndNode();
-  if (!startNode) {
+  if (!startNode[0]) {
     // 开始节点不存在
     // 开始节点不存在
     return { error: '开始节点不存在' }
     return { error: '开始节点不存在' }
   }
   }
-    if (!endNode) {
+  if(startNode.length > 1){
+    // 开始节点存在多个
+    return { error: '开始节点存在多个' }
+  }
+    if (!endNode[0]) {
     // 结束节点不存在
     // 结束节点不存在
     return { error: '结束节点不存在' }
     return { error: '结束节点不存在' }
   }
   }
-  // recursionBuildNode(startNode);
+  if(endNode.length > 1){
+    // 结束节点存在多个
+    return { error: '结束节点存在多个' }
+  }
   for (let node of data.nodes) {
   for (let node of data.nodes) {
     node.nextSteps = [];
     node.nextSteps = [];
     const edges = data.edges.filter((v: any) => v.sourceNodeId === node.id);// 找到当前节点的边
     const edges = data.edges.filter((v: any) => v.sourceNodeId === node.id);// 找到当前节点的边
@@ -215,15 +152,21 @@ export const logicFlowJsonToSubmit = (data: any): object => {
     }
     }
     processObj.steps.push(buildNode(node))
     processObj.steps.push(buildNode(node))
   }
   }
-  for (let i of processObj.steps) {
-    if (i.stepType == 0 || i.stepType == 3) { //普通节点字段非空校验
-      if (!i.handlerType && String(i.handlerType) !== '0') {
-        return { error: `请选择${i.name}的处理人` };
-      }
-      if (!i.countersignMode && String(i.countersignMode) !== '0') {
-        return { error: `请选择${i.name}的会签` };
+  for (let i of processObj.steps) {//普通节点字段非空校验
+    if(!['start','end'].includes(i.code)){
+      if (!i.stepType && String(i.stepType) !== '0') {
+        return { error: `请选择${i.name}的节点类型` };
       }
       }
     }
     }
+    if (!i.businessType && String(i.businessType) !== '0') {
+      return { error: `请选择${i.name}的业务类型` };
+    }
+    if (!i.executeMode && String(i.executeMode) !== '0') {
+      return { error: `请选择${i.name}的执行者模式` };
+    }
+    if (!i.handlerType && String(i.handlerType) !== '0') {
+      return { error: `请选择${i.name}的办理者类型` };
+    }
   }
   }
   returnData = {
   returnData = {
     ...processObj
     ...processObj

+ 7 - 4
src/views/system/config/workflow/component/workflowEdit.vue

@@ -15,15 +15,16 @@ let flowData = ref({
 	name: '', // 流程名称
 	name: '', // 流程名称
 	code: '', // 流程编码
 	code: '', // 流程编码
 	id: '', // 流程id
 	id: '', // 流程id
-	moduleName: '', // 模块名称
-	moduleCode: '', // 模块编码
+  description: '', // 流程描述
 	nodes: [  // 节点
 	nodes: [  // 节点
 		{
 		{
 			id: 'start',
 			id: 'start',
 			type: 'hotline:start',
 			type: 'hotline:start',
 			x: 780,
 			x: 780,
 			y: 120,
 			y: 120,
-			properties: {},
+			properties: {
+
+      },
 			text: {
 			text: {
 				x: 780,
 				x: 780,
 				y: 80,
 				y: 80,
@@ -35,7 +36,9 @@ let flowData = ref({
 			type: 'hotline:end',
 			type: 'hotline:end',
 			x: 780,
 			x: 780,
 			y: 400,
 			y: 400,
-			properties: <EmptyObjectType>{},
+			properties: <EmptyObjectType>{
+
+      },
 			text: {
 			text: {
 				x: 780,
 				x: 780,
 				y: 440,
 				y: 440,