352 lines
11 KiB
Vue
352 lines
11 KiB
Vue
<script setup lang="ts">
|
|
import type { SimpleFlowNode } from '../../consts';
|
|
|
|
import { inject, ref } from 'vue';
|
|
|
|
import { IconifyIcon } from '@vben/icons';
|
|
import { cloneDeep, buildShortUUID as generateUUID } from '@vben/utils';
|
|
|
|
import { message, Popover } from 'ant-design-vue';
|
|
|
|
import { BpmNodeTypeEnum } from '#/utils';
|
|
|
|
import {
|
|
ApproveMethodType,
|
|
AssignEmptyHandlerType,
|
|
AssignStartUserHandlerType,
|
|
ConditionType,
|
|
DEFAULT_CONDITION_GROUP_VALUE,
|
|
NODE_DEFAULT_NAME,
|
|
RejectHandlerType,
|
|
} from '../../consts';
|
|
|
|
defineOptions({
|
|
name: 'NodeHandler',
|
|
});
|
|
|
|
const props = defineProps({
|
|
childNode: {
|
|
type: Object as () => SimpleFlowNode,
|
|
default: null,
|
|
},
|
|
currentNode: {
|
|
type: Object as () => SimpleFlowNode,
|
|
required: true,
|
|
},
|
|
});
|
|
|
|
const emits = defineEmits(['update:childNode']);
|
|
const popoverShow = ref(false);
|
|
const readonly = inject<Boolean>('readonly'); // 是否只读
|
|
|
|
function addNode(type: number) {
|
|
// 校验:条件分支、包容分支后面,不允许直接添加并行分支
|
|
if (
|
|
type === BpmNodeTypeEnum.PARALLEL_BRANCH_NODE &&
|
|
[
|
|
BpmNodeTypeEnum.CONDITION_BRANCH_NODE,
|
|
BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE,
|
|
].includes(props.currentNode?.type)
|
|
) {
|
|
message.error('条件分支、包容分支后面,不允许直接添加并行分支');
|
|
return;
|
|
}
|
|
|
|
popoverShow.value = false;
|
|
if (
|
|
type === BpmNodeTypeEnum.USER_TASK_NODE ||
|
|
type === BpmNodeTypeEnum.TRANSACTOR_NODE
|
|
) {
|
|
const id = `Activity_${generateUUID()}`;
|
|
const data: SimpleFlowNode = {
|
|
id,
|
|
name: NODE_DEFAULT_NAME.get(type) as string,
|
|
showText: '',
|
|
type,
|
|
approveMethod: ApproveMethodType.SEQUENTIAL_APPROVE,
|
|
// 超时处理
|
|
rejectHandler: {
|
|
type: RejectHandlerType.FINISH_PROCESS,
|
|
},
|
|
timeoutHandler: {
|
|
enable: false,
|
|
},
|
|
assignEmptyHandler: {
|
|
type: AssignEmptyHandlerType.APPROVE,
|
|
},
|
|
assignStartUserHandlerType: AssignStartUserHandlerType.START_USER_AUDIT,
|
|
childNode: props.childNode,
|
|
taskCreateListener: {
|
|
enable: false,
|
|
},
|
|
taskAssignListener: {
|
|
enable: false,
|
|
},
|
|
taskCompleteListener: {
|
|
enable: false,
|
|
},
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.COPY_TASK_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
id: `Activity_${generateUUID()}`,
|
|
name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.COPY_TASK_NODE) as string,
|
|
showText: '',
|
|
type: BpmNodeTypeEnum.COPY_TASK_NODE,
|
|
childNode: props.childNode,
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.CONDITION_BRANCH_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
name: '条件分支',
|
|
type: BpmNodeTypeEnum.CONDITION_BRANCH_NODE,
|
|
id: `GateWay_${generateUUID()}`,
|
|
childNode: props.childNode,
|
|
conditionNodes: [
|
|
{
|
|
id: `Flow_${generateUUID()}`,
|
|
name: '条件1',
|
|
showText: '',
|
|
type: BpmNodeTypeEnum.CONDITION_NODE,
|
|
childNode: undefined,
|
|
conditionSetting: {
|
|
defaultFlow: false,
|
|
conditionType: ConditionType.RULE,
|
|
conditionGroups: cloneDeep(DEFAULT_CONDITION_GROUP_VALUE),
|
|
},
|
|
},
|
|
{
|
|
id: `Flow_${generateUUID()}`,
|
|
name: '其它情况',
|
|
showText: '未满足其它条件时,将进入此分支',
|
|
type: BpmNodeTypeEnum.CONDITION_NODE,
|
|
childNode: undefined,
|
|
conditionSetting: {
|
|
defaultFlow: true,
|
|
},
|
|
},
|
|
],
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.PARALLEL_BRANCH_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
name: '并行分支',
|
|
type: BpmNodeTypeEnum.PARALLEL_BRANCH_NODE,
|
|
id: `GateWay_${generateUUID()}`,
|
|
childNode: props.childNode,
|
|
conditionNodes: [
|
|
{
|
|
id: `Flow_${generateUUID()}`,
|
|
name: '并行1',
|
|
showText: '无需配置条件同时执行',
|
|
type: BpmNodeTypeEnum.CONDITION_NODE,
|
|
childNode: undefined,
|
|
},
|
|
{
|
|
id: `Flow_${generateUUID()}`,
|
|
name: '并行2',
|
|
showText: '无需配置条件同时执行',
|
|
type: BpmNodeTypeEnum.CONDITION_NODE,
|
|
childNode: undefined,
|
|
},
|
|
],
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
name: '包容分支',
|
|
type: BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE,
|
|
id: `GateWay_${generateUUID()}`,
|
|
childNode: props.childNode,
|
|
conditionNodes: [
|
|
{
|
|
id: `Flow_${generateUUID()}`,
|
|
name: '包容条件1',
|
|
showText: '',
|
|
type: BpmNodeTypeEnum.CONDITION_NODE,
|
|
childNode: undefined,
|
|
conditionSetting: {
|
|
defaultFlow: false,
|
|
conditionType: ConditionType.RULE,
|
|
conditionGroups: cloneDeep(DEFAULT_CONDITION_GROUP_VALUE),
|
|
},
|
|
},
|
|
{
|
|
id: `Flow_${generateUUID()}`,
|
|
name: '其它情况',
|
|
showText: '未满足其它条件时,将进入此分支',
|
|
type: BpmNodeTypeEnum.CONDITION_NODE,
|
|
childNode: undefined,
|
|
conditionSetting: {
|
|
defaultFlow: true,
|
|
},
|
|
},
|
|
],
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.DELAY_TIMER_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
id: `Activity_${generateUUID()}`,
|
|
name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.DELAY_TIMER_NODE) as string,
|
|
showText: '',
|
|
type: BpmNodeTypeEnum.DELAY_TIMER_NODE,
|
|
childNode: props.childNode,
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.ROUTER_BRANCH_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
id: `GateWay_${generateUUID()}`,
|
|
name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.ROUTER_BRANCH_NODE) as string,
|
|
showText: '',
|
|
type: BpmNodeTypeEnum.ROUTER_BRANCH_NODE,
|
|
childNode: props.childNode,
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.TRIGGER_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
id: `Activity_${generateUUID()}`,
|
|
name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.TRIGGER_NODE) as string,
|
|
showText: '',
|
|
type: BpmNodeTypeEnum.TRIGGER_NODE,
|
|
childNode: props.childNode,
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
if (type === BpmNodeTypeEnum.CHILD_PROCESS_NODE) {
|
|
const data: SimpleFlowNode = {
|
|
id: `Activity_${generateUUID()}`,
|
|
name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.CHILD_PROCESS_NODE) as string,
|
|
showText: '',
|
|
type: BpmNodeTypeEnum.CHILD_PROCESS_NODE,
|
|
childNode: props.childNode,
|
|
childProcessSetting: {
|
|
calledProcessDefinitionKey: '',
|
|
calledProcessDefinitionName: '',
|
|
async: false,
|
|
skipStartUserNode: false,
|
|
startUserSetting: {
|
|
type: 1,
|
|
},
|
|
timeoutSetting: {
|
|
enable: false,
|
|
},
|
|
multiInstanceSetting: {
|
|
enable: false,
|
|
},
|
|
},
|
|
};
|
|
emits('update:childNode', data);
|
|
}
|
|
}
|
|
</script>
|
|
<template>
|
|
<div class="node-handler-wrapper">
|
|
<div class="node-handler">
|
|
<Popover trigger="hover" placement="right" width="auto" v-if="!readonly">
|
|
<template #content>
|
|
<div class="handler-item-wrapper">
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.USER_TASK_NODE)"
|
|
>
|
|
<div class="approve handler-item-icon">
|
|
<span class="iconfont icon-approve icon-size"></span>
|
|
</div>
|
|
<div class="handler-item-text">审批人</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.TRANSACTOR_NODE)"
|
|
>
|
|
<div class="transactor handler-item-icon">
|
|
<span class="iconfont icon-transactor icon-size"></span>
|
|
</div>
|
|
<div class="handler-item-text">办理人</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.COPY_TASK_NODE)"
|
|
>
|
|
<div class="handler-item-icon copy">
|
|
<span class="iconfont icon-size icon-copy"></span>
|
|
</div>
|
|
<div class="handler-item-text">抄送</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.CONDITION_BRANCH_NODE)"
|
|
>
|
|
<div class="handler-item-icon condition">
|
|
<span class="iconfont icon-size icon-exclusive"></span>
|
|
</div>
|
|
<div class="handler-item-text">条件分支</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.PARALLEL_BRANCH_NODE)"
|
|
>
|
|
<div class="handler-item-icon parallel">
|
|
<span class="iconfont icon-size icon-parallel"></span>
|
|
</div>
|
|
<div class="handler-item-text">并行分支</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE)"
|
|
>
|
|
<div class="handler-item-icon inclusive">
|
|
<span class="iconfont icon-size icon-inclusive"></span>
|
|
</div>
|
|
<div class="handler-item-text">包容分支</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.DELAY_TIMER_NODE)"
|
|
>
|
|
<div class="handler-item-icon delay">
|
|
<span class="iconfont icon-size icon-delay"></span>
|
|
</div>
|
|
<div class="handler-item-text">延迟器</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.ROUTER_BRANCH_NODE)"
|
|
>
|
|
<div class="handler-item-icon router">
|
|
<span class="iconfont icon-size icon-router"></span>
|
|
</div>
|
|
<div class="handler-item-text">路由分支</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.TRIGGER_NODE)"
|
|
>
|
|
<div class="handler-item-icon trigger">
|
|
<span class="iconfont icon-size icon-trigger"></span>
|
|
</div>
|
|
<div class="handler-item-text">触发器</div>
|
|
</div>
|
|
<div
|
|
class="handler-item"
|
|
@click="addNode(BpmNodeTypeEnum.CHILD_PROCESS_NODE)"
|
|
>
|
|
<div class="handler-item-icon child-process">
|
|
<span class="iconfont icon-size icon-child-process"></span>
|
|
</div>
|
|
<div class="handler-item-text">子流程</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<div class="add-icon"><IconifyIcon icon="lucide:plus" /></div>
|
|
</Popover>
|
|
</div>
|
|
</div>
|
|
</template>
|