Browse Source

reactor:流程调整;

zhangchong 1 year ago
parent
commit
6b4cc3bb33

+ 329 - 0
src/components/LogicFlow/PropertySetting/end.vue

@@ -0,0 +1,329 @@
+<template>
+  <div class="form">
+    <el-form :model="form" label-width="130px" ref="ruleFormRef">
+      <el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
+        <el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="节点编码" prop="code" :rules="[{ required: true, message: '请输入节点编码', trigger: 'blur' }]">
+        <el-input v-model="form.code" disabled placeholder="请输入节点编码" clearable></el-input>
+      </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-select>
+      </el-form-item>
+      <!-- 选择其他 -->
+      <el-form-item
+          v-if="[0, 1, 2].includes(form.handlerType)"
+          :label="itemName"
+          prop="handlerClassifiesOrgin"
+          :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
+      >
+        <el-select v-model="form.handlerClassifiesOrgin" 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-select>
+      </el-form-item>
+      <!-- 选择用户 -->
+      <el-form-item
+          v-if="[3].includes(form.handlerType)"
+          :label="itemName"
+          prop="handlerClassifiesOrgin"
+          :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
+      >
+        <el-select
+            v-model="form.handlerClassifiesOrgin"
+            multiple
+            filterable
+            remote
+            class="w100"
+            reserve-keyword
+            placeholder="请输入用户名称"
+            remote-show-suffix
+            :remote-method="remoteMethod"
+            :loading="loading"
+            @change="getSelectValue"
+            value-key="id"
+        >
+          <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item" />
+        </el-select>
+      </el-form-item>
+      <!-- 部门 -->
+      <el-form-item
+          v-if="[4].includes(form.handlerType)"
+          :label="itemName"
+          prop="handlerClassifiesOrgin"
+          :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
+      >
+        <el-tree-select
+            :props="{ label: 'orgName' }"
+            node-key="id"
+            class="w100"
+            ref="treeSelectRef"
+            v-model="form.handlerClassifiesOrgin"
+            :data="orgData"
+            multiple
+            :render-after-expand="false"
+            show-checkbox
+            @check-change="checkChange"
+            check-strictly
+            default-expand-all
+            filterable
+        />
+      </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-select>
+      </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-select>
+      </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-select>
+      </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-select>
+      </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>
+    </el-form>
+  </div>
+</template>
+<script lang="ts" setup name="flowNode">
+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 { getCanUseOrg } from '/@/api/system/user';
+const ruleFormRef = ref<RefType>();
+// 定义属性
+const props = defineProps<{
+  modelValue: any;
+}>();
+// 注意:ref不能与model一样,相同的话表单双向绑定将会失效
+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']); // 定义事件
+
+//
+const loading = ref(false); // 加载
+const nodesOptions = ref([] as any);  // 节点
+watch(
+    () => form,
+    () => {
+      emits('update:modelValue', Object.assign(props.modelValue, form));
+    },
+    { deep: true }
+);
+// 选择处理人获取数据
+// 处理人
+const handlerTypeOptions = ref<EmptyArrayType>() as any;
+// 下拉内容
+const selectList = ref<EmptyArrayType>() as any;
+// 会签
+const itemName = ref<string>('');
+const changeOptions = (e: any) => {
+  form.handlerClassifiesOrgin = [];
+  form.handlerClassifies = '[]';
+  itemName.value = handlerTypeOptions.value[e].label;
+  if ([0, 1, 2].includes(e)) {
+    getSelectList(e).then((res: any) => {
+      selectList.value = res.result ?? [];
+      selectList.value = selectList.value.map((item: any) => ({
+        id: item.key,
+        name: item.value,
+      }));
+    });
+  }
+  if (e === 4) {
+    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 remoteMethod = (query: string) => {
+  if (query !== '') {
+    loading.value = true;
+    queryUser({ name: query }).then((res: any) => {
+      loading.value = false;
+      const newUsers = res.result.map((item: any) => {
+        return {
+          ...item,
+          name: !item.name.includes('-') ? item.name + '-' + item.organization.orgName : item.name
+        };
+      });
+      userList.value = removeDuplicate([ ...newUsers,...userList.value], 'id');
+    });
+  }
+};
+// 获取选择对象
+const getSelectValue = (query: any) => {
+  let arr: EmptyArrayType;
+  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);
+};
+// 选择会签发起节点
+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 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;
+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) => ({
+    value: item.key,
+    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 ?? [];
+  // 合并表单
+  Object.assign(form, props.modelValue);
+  if(form.components.includes('[')){
+    form.componentsOrigin = JSON.parse(form.components);
+  }
+  if (form.handlerClassifies.includes('[')) {
+    switch (form.handlerType) {
+      case 0:
+      case 1:
+      case 2:
+        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        break;
+      case 3:
+        userList.value = form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        break;
+      case 4:
+        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies).map((v: any) => v.id);
+        break;
+      default:
+        break;
+    }
+  }
+  if ([0, 1, 2].includes(form.handlerType)) {
+    const res: any = await getSelectList(form.handlerType);
+    selectList.value = res.result ?? [];
+    selectList.value = selectList.value.map((item: any) => ({
+      id: item.key,
+      name: item.value,
+    }));
+    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+  } else if ([3].includes(form.handlerType)) {
+    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+  } else if ([4].includes(form.handlerType)) {
+    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    getOrgListFn();
+  }
+  nodesOptions.value = form.nodes ?? [];
+});
+// 导入属性及方法给外部调用
+defineExpose({
+  ruleFormRef,
+});
+</script>

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

@@ -7,6 +7,7 @@
 				:extendAttrConfig="props.extendAttrConfig || {}"
 				ref="ruleFormRef"
 				@countersignStartStepCodeChange="countersignStartStepCodeChange"
+        :baseData="baseDataResult"
 			/>
 			<template #footer>
 				<div style="flex: auto">
@@ -18,19 +19,22 @@
 	</div>
 </template>
 <script lang="ts" setup name="flowMain">
-import { reactive, ref, computed, defineAsyncComponent, unref } from 'vue';
+import {reactive, ref, computed, defineAsyncComponent, unref, onMounted} from 'vue';
 import { NodeTypeEnum } from '../enums';
+import {baseData} from "/@/api/system/workflow";
 const task = defineAsyncComponent(() => import('./task.vue'));
-const summary = defineAsyncComponent(() => import('./summary.vue'));
+const start = defineAsyncComponent(() => import('./start.vue'));
+const end = defineAsyncComponent(() => import('./end.vue'));
 const showDrawer = ref(false);  // 是否显示抽屉
 const drawerRef = ref(null);  // 抽屉ref
 let formData = reactive<any>({} as any);  // 表单数据
 const ruleFormRef = ref<RefType>(); // 表单ref
-const NODE_NAME_LIST = ['hotline:summary', 'hotline:task'] as string[];
+const NODE_NAME_LIST = ['hotline:start', 'hotline:task','hotline:end'] as string[];
 // 组件列表
 const COMPONENT_LIST:any = {
 	task,
-	summary,
+  start,
+  end
 };
 // 事件
 const emits = defineEmits(['change', 'changeOther']);
@@ -92,13 +96,14 @@ const propertyKeys:Array<string> = [
 	'name',
 	'code',
 	'id',
-	'moduleName',
-	'moduleCode',
+	'description',
 	// 节点属性
 	'name',
 	'code',
-	'handlerClassifies',
-	'handlerType',
+  'stepType',
+  'businessType',
+  'handlerType',
+	'handlerTypeItems',
 	'countersignMode',
 	'form',
 	'countersignStartStepCode',
@@ -141,6 +146,12 @@ const confirmClick = (formEl: any | undefined) => {
     showDrawer.value = false;
   });
 };
+const baseDataResult = ref<EmptyObjectType>({});
+onMounted(async () => {
+  // 获取页面基础数据
+  const {result} = await baseData();
+  baseDataResult.value = result;
+})
 // 导入属性及方法给外部调用
 defineExpose({
 	show,

+ 329 - 0
src/components/LogicFlow/PropertySetting/start.vue

@@ -0,0 +1,329 @@
+<template>
+  <div class="form">
+    <el-form :model="form" label-width="130px" ref="ruleFormRef">
+      <el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
+        <el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="节点编码" prop="code" :rules="[{ required: true, message: '请输入节点编码', trigger: 'blur' }]">
+        <el-input v-model="form.code" disabled placeholder="请输入节点编码" clearable></el-input>
+      </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-select>
+      </el-form-item>
+      <!-- 选择其他 -->
+      <el-form-item
+          v-if="[0, 1, 2].includes(form.handlerType)"
+          :label="itemName"
+          prop="handlerClassifiesOrgin"
+          :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
+      >
+        <el-select v-model="form.handlerClassifiesOrgin" 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-select>
+      </el-form-item>
+      <!-- 选择用户 -->
+      <el-form-item
+          v-if="[3].includes(form.handlerType)"
+          :label="itemName"
+          prop="handlerClassifiesOrgin"
+          :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
+      >
+        <el-select
+            v-model="form.handlerClassifiesOrgin"
+            multiple
+            filterable
+            remote
+            class="w100"
+            reserve-keyword
+            placeholder="请输入用户名称"
+            remote-show-suffix
+            :remote-method="remoteMethod"
+            :loading="loading"
+            @change="getSelectValue"
+            value-key="id"
+        >
+          <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item" />
+        </el-select>
+      </el-form-item>
+      <!-- 部门 -->
+      <el-form-item
+          v-if="[4].includes(form.handlerType)"
+          :label="itemName"
+          prop="handlerClassifiesOrgin"
+          :rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
+      >
+        <el-tree-select
+            :props="{ label: 'orgName' }"
+            node-key="id"
+            class="w100"
+            ref="treeSelectRef"
+            v-model="form.handlerClassifiesOrgin"
+            :data="orgData"
+            multiple
+            :render-after-expand="false"
+            show-checkbox
+            @check-change="checkChange"
+            check-strictly
+            default-expand-all
+            filterable
+        />
+      </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-select>
+      </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-select>
+      </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-select>
+      </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-select>
+      </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>
+    </el-form>
+  </div>
+</template>
+<script lang="ts" setup name="flowNode">
+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 { getCanUseOrg } from '/@/api/system/user';
+const ruleFormRef = ref<RefType>();
+// 定义属性
+const props = defineProps<{
+  modelValue: any;
+}>();
+// 注意:ref不能与model一样,相同的话表单双向绑定将会失效
+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']); // 定义事件
+
+//
+const loading = ref(false); // 加载
+const nodesOptions = ref([] as any);  // 节点
+watch(
+    () => form,
+    () => {
+      emits('update:modelValue', Object.assign(props.modelValue, form));
+    },
+    { deep: true }
+);
+// 选择处理人获取数据
+// 处理人
+const handlerTypeOptions = ref<EmptyArrayType>() as any;
+// 下拉内容
+const selectList = ref<EmptyArrayType>() as any;
+// 会签
+const itemName = ref<string>('');
+const changeOptions = (e: any) => {
+  form.handlerClassifiesOrgin = [];
+  form.handlerClassifies = '[]';
+  itemName.value = handlerTypeOptions.value[e].label;
+  if ([0, 1, 2].includes(e)) {
+    getSelectList(e).then((res: any) => {
+      selectList.value = res.result ?? [];
+      selectList.value = selectList.value.map((item: any) => ({
+        id: item.key,
+        name: item.value,
+      }));
+    });
+  }
+  if (e === 4) {
+    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 remoteMethod = (query: string) => {
+  if (query !== '') {
+    loading.value = true;
+    queryUser({ name: query }).then((res: any) => {
+      loading.value = false;
+      const newUsers = res.result.map((item: any) => {
+        return {
+          ...item,
+          name: !item.name.includes('-') ? item.name + '-' + item.organization.orgName : item.name
+        };
+      });
+      userList.value = removeDuplicate([ ...newUsers,...userList.value], 'id');
+    });
+  }
+};
+// 获取选择对象
+const getSelectValue = (query: any) => {
+  let arr: EmptyArrayType;
+  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);
+};
+// 选择会签发起节点
+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 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;
+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) => ({
+    value: item.key,
+    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 ?? [];
+  // 合并表单
+  Object.assign(form, props.modelValue);
+  if(form.components.includes('[')){
+    form.componentsOrigin = JSON.parse(form.components);
+  }
+  if (form.handlerClassifies.includes('[')) {
+    switch (form.handlerType) {
+      case 0:
+      case 1:
+      case 2:
+        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        break;
+      case 3:
+        userList.value = form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+        break;
+      case 4:
+        form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies).map((v: any) => v.id);
+        break;
+      default:
+        break;
+    }
+  }
+  if ([0, 1, 2].includes(form.handlerType)) {
+    const res: any = await getSelectList(form.handlerType);
+    selectList.value = res.result ?? [];
+    selectList.value = selectList.value.map((item: any) => ({
+      id: item.key,
+      name: item.value,
+    }));
+    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+  } else if ([3].includes(form.handlerType)) {
+    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+  } else if ([4].includes(form.handlerType)) {
+    if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+    getOrgListFn();
+  }
+  nodesOptions.value = form.nodes ?? [];
+});
+// 导入属性及方法给外部调用
+defineExpose({
+  ruleFormRef,
+});
+</script>

+ 0 - 329
src/components/LogicFlow/PropertySetting/summary.vue

@@ -1,329 +0,0 @@
-<template>
-	<div class="form">
-		<el-form :model="form" label-width="130px" ref="ruleFormRef">
-			<el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
-				<el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
-			</el-form-item>
-			<el-form-item label="节点编码" prop="code" :rules="[{ required: true, message: '请输入节点编码', trigger: 'blur' }]">
-				<el-input v-model="form.code" disabled placeholder="请输入节点编码" clearable></el-input>
-			</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-select>
-			</el-form-item>
-			<!-- 选择其他 -->
-			<el-form-item
-				v-if="[0, 1, 2].includes(form.handlerType)"
-				:label="itemName"
-				prop="handlerClassifiesOrgin"
-				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
-			>
-				<el-select v-model="form.handlerClassifiesOrgin" 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-select>
-			</el-form-item>
-			<!-- 选择用户 -->
-			<el-form-item
-				v-if="[3].includes(form.handlerType)"
-				:label="itemName"
-				prop="handlerClassifiesOrgin"
-				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
-			>
-				<el-select
-					v-model="form.handlerClassifiesOrgin"
-					multiple
-					filterable
-					remote
-					class="w100"
-					reserve-keyword
-					placeholder="请输入用户名称"
-					remote-show-suffix
-					:remote-method="remoteMethod"
-					:loading="loading"
-					@change="getSelectValue"
-					value-key="id"
-				>
-					<el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item" />
-				</el-select>
-			</el-form-item>
-			<!-- 部门 -->
-			<el-form-item
-				v-if="[4].includes(form.handlerType)"
-				:label="itemName"
-				prop="handlerClassifiesOrgin"
-				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
-			>
-				<el-tree-select
-					:props="{ label: 'orgName' }"
-					node-key="id"
-					class="w100"
-					ref="treeSelectRef"
-					v-model="form.handlerClassifiesOrgin"
-					:data="orgData"
-					multiple
-					:render-after-expand="false"
-					show-checkbox
-					@check-change="checkChange"
-					check-strictly
-					default-expand-all
-					filterable
-				/>
-			</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-select>
-      </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-select>
-      </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-select>
-			</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-select>
-			</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>
-		</el-form>
-	</div>
-</template>
-<script lang="ts" setup name="flowNode">
-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 { getCanUseOrg } from '/@/api/system/user';
-const ruleFormRef = ref<RefType>();
-// 定义属性
-const props = defineProps<{
-	modelValue: any;
-}>();
-// 注意:ref不能与model一样,相同的话表单双向绑定将会失效
-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']); // 定义事件
-
-//
-const loading = ref(false); // 加载
-const nodesOptions = ref([] as any);  // 节点
-watch(
-	() => form,
-	() => {
-		emits('update:modelValue', Object.assign(props.modelValue, form));
-	},
-	{ deep: true }
-);
-// 选择处理人获取数据
-// 处理人
-const handlerTypeOptions = ref<EmptyArrayType>() as any;
-// 下拉内容
-const selectList = ref<EmptyArrayType>() as any;
-// 会签
-const itemName = ref<string>('');
-const changeOptions = (e: any) => {
-	form.handlerClassifiesOrgin = [];
-	form.handlerClassifies = '[]';
-	itemName.value = handlerTypeOptions.value[e].label;
-	if ([0, 1, 2].includes(e)) {
-		getSelectList(e).then((res: any) => {
-			selectList.value = res.result ?? [];
-			selectList.value = selectList.value.map((item: any) => ({
-				id: item.key,
-				name: item.value,
-			}));
-		});
-	}
-	if (e === 4) {
-		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 remoteMethod = (query: string) => {
-	if (query !== '') {
-		loading.value = true;
-		queryUser({ name: query }).then((res: any) => {
-			loading.value = false;
-			const newUsers = res.result.map((item: any) => {
-				return {
-					...item,
-					name: !item.name.includes('-') ? item.name + '-' + item.organization.orgName : item.name
-				};
-			});
-			userList.value = removeDuplicate([ ...newUsers,...userList.value], 'id');
-		});
-	}
-};
-// 获取选择对象
-const getSelectValue = (query: any) => {
-	let arr: EmptyArrayType;
-	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);
-};
-// 选择会签发起节点
-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 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;
-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) => ({
-		value: item.key,
-		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 ?? [];
-	// 合并表单
-	Object.assign(form, props.modelValue);
-  if(form.components.includes('[')){
-    form.componentsOrigin = JSON.parse(form.components);
-  }
-	if (form.handlerClassifies.includes('[')) {
-		switch (form.handlerType) {
-			case 0:
-			case 1:
-			case 2:
-				form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
-				break;
-			case 3:
-				userList.value = form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
-				break;
-			case 4:
-				form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies).map((v: any) => v.id);
-				break;
-			default:
-				break;
-		}
-	}
-	if ([0, 1, 2].includes(form.handlerType)) {
-		const res: any = await getSelectList(form.handlerType);
-		selectList.value = res.result ?? [];
-		selectList.value = selectList.value.map((item: any) => ({
-			id: item.key,
-			name: item.value,
-		}));
-		if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
-	} else if ([3].includes(form.handlerType)) {
-		if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
-	} else if ([4].includes(form.handlerType)) {
-		if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
-		getOrgListFn();
-	}
-	nodesOptions.value = form.nodes ?? [];
-});
-// 导入属性及方法给外部调用
-defineExpose({
-	ruleFormRef,
-});
-</script>

+ 155 - 116
src/components/LogicFlow/PropertySetting/task.vue

@@ -4,22 +4,32 @@
 			<el-form-item label="节点名称" prop="name" :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]">
 				<el-input v-model="form.name" placeholder="请输入节点名称" clearable></el-input>
 			</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-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="stepType" :rules="[{ required: true, message: '请选择节点类型', trigger: 'change' }]">
+				<el-select v-model="form.stepType" class="w100" placeholder="请选择节点类型">
+					<el-option v-for="item in baseData.stepTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
+				</el-select>
+			</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-form-item>
 			<!-- 选择其他 -->
 			<el-form-item
 				v-if="[0, 1, 2].includes(form.handlerType)"
 				:label="itemName"
-				prop="handlerClassifiesOrgin"
+				prop="handlerTypeItemsOrgin"
 				: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.handlerTypeItemsOrgin" 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-select>
 			</el-form-item>
@@ -27,11 +37,11 @@
 			<el-form-item
 				v-if="[3].includes(form.handlerType)"
 				:label="itemName"
-				prop="handlerClassifiesOrgin"
+				prop="handlerTypeItemsOrgin"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 			>
 				<el-select
-					v-model="form.handlerClassifiesOrgin"
+					v-model="form.handlerTypeItemsOrgin"
 					multiple
 					filterable
 					remote
@@ -51,76 +61,110 @@
 			<el-form-item
 				v-if="[4].includes(form.handlerType)"
 				:label="itemName"
-				prop="handlerClassifiesOrgin"
+				prop="handlerTypeItemsOrgin"
 				:rules="[{ required: true, message: `请选择${itemName}`, trigger: 'change' }]"
 			>
 				<el-tree-select
-					:props="{ label: 'orgName' }"
+					:props="{ label: 'name' }"
 					node-key="id"
 					class="w100"
 					ref="treeSelectRef"
-					v-model="form.handlerClassifiesOrgin"
+					v-model="form.handlerTypeItemsOrgin"
 					:data="orgData"
 					multiple
 					:render-after-expand="false"
 					show-checkbox
-					@check-change="checkChange"
 					check-strictly
 					default-expand-all
 					filterable
 				/>
 			</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-form-item>
+			<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="请选择会签策略" @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-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-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="instancePolicy" :rules="[{ required: true, message: '请选择动态策略', trigger: 'change' }]" v-if="form.instanceMode === 1">
+        <el-select v-model="form.instancePolicy" 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="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="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.dynamicPolicyOptions" :key="item.key" :label="item.value" :value="item.key" />
         </el-select>
       </el-form-item>
-			<el-form-item label="会签结束节点" prop="countersignEndStepCode" v-if="form.countersignEndStepCode">
-				<el-select v-model="form.countersignEndStepCode" class="w100" disabled>
-					<el-option v-for="item in nodesOptions" :key="item.id" :label="item.text.value" :value="item.id" />
-				</el-select>
+			<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 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>
 		</el-form>
 	</div>
 </template>
 <script lang="ts" setup name="flowNode">
 import { reactive, watch, onMounted, ref } from 'vue';
-import { baseData, getSelectList,queryUser } from '/@/api/system/workflow';
+import { getSelectList, queryUser } from '/@/api/system/workflow';
 import { getCanUseOrg } from '/@/api/system/user';
 import { removeDuplicate } from '/@/utils/arrayOperation';
+import {ElInput} from "element-plus";
 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;
+		};
+	};
 }>();
 // 注意:ref不能与model一样,相同的话表单双向绑定将会失效
 const form = reactive<Record<string, any>>({
-  ...props.modelValue,  // 传入的数据
-  handlerClassifiesOrgin: [], // 选择的数据
-  handlerClassifies: [],  // 选择的数据
-  handlerType: '',  // 处理人类型
-  businessProperty: '', // 节点属性
-  countersignMode: '',  // 会签
-  countersignStartStepCode: '', // 会签开始节点
-  countersignEndStepCode: '',  // 会签结束节点
-  pathPolicy: null, // 节点过滤策略
-  componentsOrigin: [], // 组件配置
-  components:[], //组件配置
+	...props.modelValue, // 传入的数据
+	handlerTypeItemsOrgin: [], // 选择的数据
+	handlerTypeItems: [], // 选择的数据
+	handlerType: '', // 处理人类型
+	businessProperty: '', // 节点属性
+	countersignMode: '', // 会签
+	countersignStartStepCode: '', // 会签开始节点
+	countersignEndStepCode: '', // 会签结束节点
+	pathPolicy: null, // 节点过滤策略
+	componentsOrigin: [], // 组件配置
+	components: [], //组件配置
 });
 const emits = defineEmits(['update:modelValue']); // 定义事件
 const loading = ref(false); // 加载
@@ -132,16 +176,14 @@ watch(
 	{ deep: true }
 );
 // 选择处理人获取数据
-// 处理人
-const handlerTypeOptions = ref<EmptyArrayType>() as any;
 // 下拉内容
 const selectList = ref<EmptyArrayType>() as any;
 // 会签
 const itemName = ref<string>('');
 const changeOptions = (e: any) => {
-	form.handlerClassifiesOrgin = [];
-	form.handlerClassifies = '[]';
-	itemName.value = handlerTypeOptions.value[e].label;
+	form.handlerTypeItemsOrgin = [];
+	form.handlerTypeItems = '[]';
+	itemName.value = baseData.handlerTypeOptions[e].label;
 	if ([0, 1, 2].includes(e)) {
 		getSelectList(e).then((res: any) => {
 			selectList.value = res.result ?? [];
@@ -157,102 +199,99 @@ const changeOptions = (e: any) => {
 };
 // 远程搜索用户名称
 // 指定用户列表
-const userList = ref<any>();
+const userList = ref<EmptyArrayType>([]);
 const remoteMethod = (query: string) => {
-  if (query !== '') {
-    loading.value = true;
-    queryUser({ name: query }).then((res: any) => {
-      loading.value = false;
-      const newUsers = res.result.map((item: any) => {
-        return {
-          ...item,
-          name: !item.name.includes('-') ? item.name + '-' + item.organization.orgName : item.name
-        };
-      });
-      userList.value = removeDuplicate([ ...newUsers,...userList.value], 'id');
-    });
-  }
+	if (query !== '') {
+		loading.value = true;
+		queryUser({ name: query }).then((res: any) => {
+			loading.value = false;
+			const newUsers = res.result.map((item: any) => {
+				return {
+					...item,
+					name: !item.name.includes('-') ? item.name + '-' + item.organization.name : item.name,
+				};
+			});
+			userList.value = removeDuplicate([...newUsers, ...userList.value], 'id');
+		});
+	}
 };
 
 // 获取可用组织
 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,
-		};
+	getCanUseOrg().then((res: any) => {
+		orgData.value = res?.result ?? [];
 	});
-	// 使用模板字符串
-	form.handlerClassifies = `${JSON.stringify(arr)}`;
 };
+const treeSelectRef = ref<RefType>();
 const selectComponent = (val: any) => {
-  form.components = JSON.stringify(val);
+	form.components = JSON.stringify(val);
 };
 // 获取选择对象
 const getSelectValue = (query: any[]) => {
-	let arr:EmptyArrayType;
+	let arr: EmptyArrayType;
 	arr = query.map((item: any) => ({ name: item.name, id: item.id }));
 	// 使用模板字符串
-	form.handlerClassifies = `${JSON.stringify(arr)}`;
+	form.handlerTypeItems = `${JSON.stringify(arr)}`;
 };
-// 会签
-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 selectCountersignPolicy = ()=>{
+
+}
+const baseData = reactive<any>({
+	businessTypeOptions: <EmptyArrayType>[], // 业务类型
+	countersignMode: <EmptyArrayType>[], // 会签
+	handlerTypeOptions: <EmptyArrayType>[], // 办理者类型
+});
 // 会签结束节点
 const nodesOptions = ref([] as any);
 onMounted(async () => {
-	// 获取页面基础数据
-	const res: any = await baseData();
-	handlerTypeOptions.value = res.result?.handlerTypeOptions ?? [];
-	handlerTypeOptions.value = handlerTypeOptions.value.map((item: any) => ({
+	console.log(props.baseData, '21');
+	const {
+		stepTypeOptions,
+		businessTypeOptions,
+		handlerTypeOptions,
+		countersignMode,
+		dynamicPolicyOptions,
+		executeModeOptions,
+		instanceModeOptions,
+		moduleOptions,
+		stepPropertiesOptions,
+	} = props.baseData;
+	baseData.businessTypeOptions = businessTypeOptions; // 业务类型
+	baseData.stepTypeOptions = stepTypeOptions; // 节点类型
+	baseData.handlerTypeOptions = handlerTypeOptions.map((item: any) => ({
+		// 办理者类型
 		value: item.key,
 		label: item.value,
 	}));
-	countersignModeList.value = res.result?.countersignMode ?? [];
-	countersignModeList.value = countersignModeList.value.map((item: any) => ({
-		value: item.key,
-		label: item.value,
-	}));
-  businessPropertyOptions.value = res.result?.businessPropertyOptions ?? [];
-  businessPropertyOptions.value = businessPropertyOptions.value.map((item: any) => ({
-    value: item.key,
-    label: item.value,
-  }));
-  stepPropertiesOptions.value = res.result?.stepPropertiesOptions ?? [];
-  pathPolicyOptions.value = res.result?.pathPolicyOptions ?? [];
+  baseData.executeModeOptions = executeModeOptions; // 执行模式
+  baseData.countersignMode = countersignMode;// 支持发起会签
+  baseData.dynamicPolicyOptions = dynamicPolicyOptions; // 节点过滤策略
+  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);
-  if(form.components.includes('[')){
-    form.componentsOrigin = JSON.parse(form.components);
-  }
-	if (form.handlerClassifies.includes('[')) {
+	if (form.components.includes('[')) {
+		form.componentsOrigin = JSON.parse(form.components);
+	}
+	if (form.handlerTypeItems.includes('[')) {
 		switch (form.handlerType) {
 			case 0:
 			case 1:
 			case 2:
-				form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+				form.handlerTypeItemsOrgin = JSON.parse(form.handlerTypeItems);
 				break;
 			case 3:
-        userList.value = form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies);
+				userList.value = form.handlerTypeItemsOrgin = JSON.parse(form.handlerTypeItems);
 				break;
 			case 4:
-				form.handlerClassifiesOrgin = JSON.parse(form.handlerClassifies).map((v: any) => v.id);
+				form.handlerTypeItemsOrgin = JSON.parse(form.handlerTypeItems).map((v: any) => v.id);
 				break;
 			default:
 				break;
@@ -265,11 +304,11 @@ onMounted(async () => {
 			id: item.key,
 			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)) {
-		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)) {
-		if (handlerTypeOptions.value.length) itemName.value = handlerTypeOptions.value[form.handlerType].label;
+		if (baseData.handlerTypeOptions.length) itemName.value = baseData.handlerTypeOptions[form.handlerType].label;
 		getOrgListFn();
 	}
 	nodesOptions.value = form.summaryNodes ?? [];

+ 17 - 36
src/components/LogicFlow/index.vue

@@ -14,14 +14,15 @@
 							<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="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>
 			<!-- 流程图画布内容 -->
 			<div class="border w100" style="position: relative; flex: 1">
-				<!-- <el-radio-group v-model="radio1" @change="changeSizeType" style="position: absolute; top: 10px; left: 100px; z-index: 1000">
-					<el-radio-button label="hotline:transition">连接线</el-radio-button>
-					<el-radio-button label="hotline:returnTransition">退回线</el-radio-button>
-				</el-radio-group> -->
 				<div class="w100 h100" ref="lfElRef" style="height: 100%"></div>
 			</div>
 			<!-- 节点内容弹窗 -->
@@ -113,8 +114,6 @@ watch(
 const lfElRef: Ref = ref(null);
 // 定义LogicFlow实例
 const lfInstance = ref(null) as Ref<LogicFlow | null>;
-//
-const moduleList = ref([] as any);
 const init = async () => {
 	// 画布配置
 	LogicFlow.use(Snapshot);
@@ -145,9 +144,6 @@ const init = async () => {
 	reRender(props.modelValue as any);
 	// 初始化事件
 	initEvent();
-	// 获取页面基础信息
-	const res: any = await baseData();
-	moduleList.value = res.result?.moduleOptions ?? [];
 };
 // 初始化操作
 const initOp = () => {
@@ -247,7 +243,11 @@ const initOp = () => {
 			type: 'hotline:start',
 			text: '开始',
 			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==',
 		},
 		{
@@ -262,22 +262,15 @@ const initOp = () => {
 			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',
 		},
-		{
-			type: 'hotline:summary',
-			text: '汇总节点',
-			label: '汇总节点',
-			properties: {
-				countersignMode: '',
-				handlerClassifies: [],
-				handlerType: '',
-			},
-			icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAqBJREFUSEvFVU9IFFEc/n5vVbplB0/pzkweCvpDUGStYyREl4SdDRQ7ZJqXCqEOBd1cz0F0q4sYXZIM9gldKiHJ0RIKpD9Qh5wZrXN2k82dX7zZXRvX2V0Xkeb0ePPe973f933v9wg7/NEO4+P/E5y0HL0O6LelkQ5X2550RuoJY9PScCupULEC0/KGAU6D+TGI+gAeyYPRMJjHQDRAJK7NZOIPy5FUIXBfK1BbGtNmyusCc18enybsjDbRnnRvgbhnVhonaiYwk04bhBgF+0OKIAogYS2eExAvAO4st2ZTBR2ppV5m/yaAtsLpA+3Pdn/fnc02xNW4oSG7NDXR+luN2y1vjMD9ABYAkrbUCjIWxAyfLHFhURO+cJlxm8n/OCf3vVT/170g+hKsZz4IULoIpiohFkeIcDe3Fmt++7zlZxF3QwUqGUTUbEt9sLjATHndYH4Koh6le0AYMZc/iPsV4PFw4jZJZFouF8HOWE7jGugXQMdtqX0IV2ta3jGA39eB90xLY8VMuVfAGLWlvgEzgsBJM4Q2K7WBhOUcFaBxW+oHokxWJ/bBvXPSWMh74Xul96Uiwenk8mFf+E/sjHYokiDlfRa+uPhmsuVTDQT/JFLJWf0TWwnrX+rNrvpco0rUliQqmNxkS/36OpDlpIObG/KhqH84xlsy+VTX8t5YXe6Hiikht2BPtk5tSA3wrUC8P1zVlmOqNicsp1+ALoOoCew/K5qmEpUF9OCiAa5KTslFmycS92cy8fGwX2V7UdAqiN5VagNBq6DYPfj+oD1pzEcFoVqzUwR3KjU7Ipy3pd5Zc7NTGzpSS1eZ/QcMepTvNzzChFUC3QDTK4AvlRpdSlT1RYt6cNRcjDGw7QenXNm1zFetoBawmk3eLrja/xcF0F4o2GZDawAAAABJRU5ErkJggg==',
-		},
 		{
 			type: 'hotline:end',
 			text: '结束',
 			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',
 		},
 	]);
@@ -311,9 +304,9 @@ const initEvent = () => {
 			return item.type === 'hotline:summary';
 		});
 		nodes = nodes.filter((item: any) => {
-			return item.type === 'hotline:task' || item.type === 'hotline:start';
+			return item.type === 'hotline:task' || item.type === 'hotline:start' || item.type === 'hotline:end';
 		});
-		if (args.data.type == 'hotline:summary' || args.data.type == 'hotline:task') {
+		if (['hotline:start','hotline:task','hotline:end'].includes(args.data.type)) {
 			currentOpId.value = args.data.id;
 			propertySettingRef.value.show({
 				...args.data.properties,
@@ -338,12 +331,6 @@ const initEvent = () => {
 	// })
 	// })
 };
-// 选择业务模块
-const changeModule = (args: any) => {
-	moduleList.value.forEach((item: any) => {
-		if (item.key === args) form.moduleName = item.value;
-	});
-};
 // 暂存(保存为草稿)
 const saveOnly = throttle((formEl: FormInstance | undefined) => {
 	const lf = unref(lfInstance);
@@ -442,12 +429,6 @@ const release = throttle((formEl: FormInstance | undefined) => {
     emits('on-save', getGraphData());
   })
 }, 300);
-// 设置线类型
-const changeSizeType = (type: EdgeType) => {
-	const lf = unref(lfInstance);
-	if (!lf) return;
-	lf.setDefaultEdgeType(type as EdgeType);
-};
 // 重新渲染
 const reRender = (data: any): void => {
 	const lf = unref(lfInstance);

+ 4 - 4
src/views/knowledge/knowledge/index.vue

@@ -23,13 +23,13 @@
 									:data="state.orgData"
 									highlight-current
 									:expand-on-click-node="false"
-									:props="{ children: 'children', label: 'orgName' }"
+									:props="{ children: 'children', label: 'name' }"
 									@node-click="handleNodeClick"
 									ref="orgRef"
 									v-loading="state.loading"
 									:filter-node-method="filterNode"
 									node-key="orgCode"
-                  :style="state.activeName === '0'? 'display:inline-block' : 'display:none'"
+                  :style="state.activeName === '0'? '' : 'display:none'"
 									:default-expanded-keys="state.defaultExpandedOrgKeys"
 								>
 								</el-tree>
@@ -43,7 +43,7 @@
                     v-loading="state.loading"
                     :filter-node-method="filterNodeType"
                     node-key="id"
-                    :style="state.activeName === '1'? 'display:inline-block' : 'display:none'"
+                    :style="state.activeName === '1'? '' : 'display:none'"
                     :default-expanded-keys="state.defaultExpandedTypeKeys"
                 >
                 </el-tree>
@@ -59,7 +59,7 @@
                     ref="hotRef"
                     :filter-node-method="filterNodeHot"
                     :expand-on-click-node="false"
-                    :style="state.activeName === '2'? 'display:inline-block' : 'display:none'"
+                    :style="state.activeName === '2'? '' : 'display:none'"
                 >
                   <template #default="{ data }">
 										<span :title="data.hotSpotName">