|
@@ -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 ?? [];
|