!130 Merge remote-tracking branch 'yudao/dev' into dev
Merge pull request !130 from Jason/devpull/131/head
						commit
						28807fa61b
					
				|  | @ -27,14 +27,13 @@ import { | |||
|   TreeSelect, | ||||
| } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmModelFormType } from '#/utils'; | ||||
| import { BpmModelFormType, BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   CANDIDATE_STRATEGY, | ||||
|   CandidateStrategy, | ||||
|   FieldPermissionType, | ||||
|   MULTI_LEVEL_DEPT, | ||||
|   NodeType, | ||||
| } from '../../consts'; | ||||
| import { | ||||
|   useFormFieldsPermission, | ||||
|  | @ -77,7 +76,7 @@ const currentNode = useWatchNode(props); | |||
| 
 | ||||
| // 节点名称 | ||||
| const { nodeName, showInput, clickIcon, blurEvent } = useNodeName( | ||||
|   NodeType.COPY_TASK_NODE, | ||||
|   BpmNodeTypeEnum.COPY_TASK_NODE, | ||||
| ); | ||||
| 
 | ||||
| // 激活的 Tab 标签页 | ||||
|  | @ -137,7 +136,7 @@ const { | |||
|   getShowText, | ||||
|   handleCandidateParam, | ||||
|   parseCandidateParam, | ||||
| } = useNodeForm(NodeType.COPY_TASK_NODE); | ||||
| } = useNodeForm(BpmNodeTypeEnum.COPY_TASK_NODE); | ||||
| 
 | ||||
| const configForm = tempConfigForm as Ref<CopyTaskFormType>; | ||||
| // 抄送人策略, 去掉发起人自选 和 发起人自己 | ||||
|  |  | |||
|  | @ -22,10 +22,11 @@ import { | |||
|   SelectOption, | ||||
| } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   DELAY_TYPE, | ||||
|   DelayTypeEnum, | ||||
|   NodeType, | ||||
|   TIME_UNIT_TYPES, | ||||
|   TimeUnitType, | ||||
| } from '../../consts'; | ||||
|  | @ -45,7 +46,7 @@ const props = defineProps({ | |||
| const currentNode = useWatchNode(props); | ||||
| // 节点名称 | ||||
| const { nodeName, showInput, clickIcon, blurEvent } = useNodeName( | ||||
|   NodeType.DELAY_TIMER_NODE, | ||||
|   BpmNodeTypeEnum.DELAY_TIMER_NODE, | ||||
| ); | ||||
| // 抄送人表单配置 | ||||
| const formRef = ref(); // 表单 Ref | ||||
|  |  | |||
|  | @ -21,7 +21,9 @@ import { | |||
|   SelectOption, | ||||
| } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { ConditionType, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { ConditionType } from '../../consts'; | ||||
| import { useNodeName, useWatchNode } from '../../helpers'; | ||||
| import Condition from './modules/condition.vue'; | ||||
| 
 | ||||
|  | @ -40,7 +42,7 @@ const processNodeTree = inject<Ref<SimpleFlowNode>>('processNodeTree'); | |||
| const currentNode = useWatchNode(props); | ||||
| /** 节点名称 */ | ||||
| const { nodeName, showInput, clickIcon, blurEvent } = useNodeName( | ||||
|   NodeType.ROUTER_BRANCH_NODE, | ||||
|   BpmNodeTypeEnum.ROUTER_BRANCH_NODE, | ||||
| ); | ||||
| const routerGroups = ref<RouterSetting[]>([]); | ||||
| const nodeOptions = ref<any[]>([]); | ||||
|  | @ -176,15 +178,15 @@ function getRouterNode(node: any) { | |||
|   while (true) { | ||||
|     if (!node) break; | ||||
|     if ( | ||||
|       node.type !== NodeType.ROUTER_BRANCH_NODE && | ||||
|       node.type !== NodeType.CONDITION_NODE | ||||
|       node.type !== BpmNodeTypeEnum.ROUTER_BRANCH_NODE && | ||||
|       node.type !== BpmNodeTypeEnum.CONDITION_NODE | ||||
|     ) { | ||||
|       nodeOptions.value.push({ | ||||
|         label: node.name, | ||||
|         value: node.id, | ||||
|       }); | ||||
|     } | ||||
|     if (!node.childNode || node.type === NodeType.END_EVENT_NODE) { | ||||
|     if (!node.childNode || node.type === BpmNodeTypeEnum.END_EVENT_NODE) { | ||||
|       break; | ||||
|     } | ||||
|     if (node.conditionNodes && node.conditionNodes.length > 0) { | ||||
|  |  | |||
|  | @ -23,13 +23,9 @@ import { | |||
|   TypographyText, | ||||
| } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmModelFormType } from '#/utils'; | ||||
| import { BpmModelFormType, BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   FieldPermissionType, | ||||
|   NodeType, | ||||
|   START_USER_BUTTON_SETTING, | ||||
| } from '../../consts'; | ||||
| import { FieldPermissionType, START_USER_BUTTON_SETTING } from '../../consts'; | ||||
| import { | ||||
|   useFormFieldsPermission, | ||||
|   useNodeName, | ||||
|  | @ -57,7 +53,7 @@ const deptOptions = inject<Ref<SystemDeptApi.Dept[]>>('deptList'); | |||
| const currentNode = useWatchNode(props); | ||||
| // 节点名称 | ||||
| const { nodeName, showInput, clickIcon, blurEvent } = useNodeName( | ||||
|   NodeType.COPY_TASK_NODE, | ||||
|   BpmNodeTypeEnum.START_USER_NODE, | ||||
| ); | ||||
| // 激活的 Tab 标签页 | ||||
| const activeTabName = ref('user'); | ||||
|  |  | |||
|  | @ -29,9 +29,10 @@ import { | |||
|   Tag, | ||||
| } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   DEFAULT_CONDITION_GROUP_VALUE, | ||||
|   NodeType, | ||||
|   TRIGGER_TYPES, | ||||
|   TriggerTypeEnum, | ||||
| } from '../../consts'; | ||||
|  | @ -72,7 +73,7 @@ const [Drawer, drawerApi] = useVbenDrawer({ | |||
| const currentNode = useWatchNode(props); | ||||
| // 节点名称 | ||||
| const { nodeName, showInput, clickIcon, blurEvent } = useNodeName( | ||||
|   NodeType.TRIGGER_NODE, | ||||
|   BpmNodeTypeEnum.TRIGGER_NODE, | ||||
| ); | ||||
| // 触发器表单配置 | ||||
| const formRef = ref(); // 表单 Ref | ||||
|  |  | |||
|  | @ -34,7 +34,11 @@ import { | |||
|   TypographyText, | ||||
| } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmModelFormType } from '#/utils'; | ||||
| import { | ||||
|   BpmModelFormType, | ||||
|   BpmNodeTypeEnum, | ||||
|   ProcessVariableEnum, | ||||
| } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   APPROVE_METHODS, | ||||
|  | @ -49,9 +53,7 @@ import { | |||
|   DEFAULT_BUTTON_SETTING, | ||||
|   FieldPermissionType, | ||||
|   MULTI_LEVEL_DEPT, | ||||
|   NodeType, | ||||
|   OPERATION_BUTTON_NAME, | ||||
|   ProcessVariableEnum, | ||||
|   REJECT_HANDLER_TYPES, | ||||
|   RejectHandlerType, | ||||
|   TIME_UNIT_TYPES, | ||||
|  | @ -113,7 +115,7 @@ const [Drawer, drawerApi] = useVbenDrawer({ | |||
| 
 | ||||
| // 节点名称配置 | ||||
| const { nodeName, showInput, clickIcon, blurEvent } = useNodeName( | ||||
|   NodeType.USER_TASK_NODE, | ||||
|   BpmNodeTypeEnum.USER_TASK_NODE, | ||||
| ); | ||||
| 
 | ||||
| // 激活的 Tab 标签页 | ||||
|  | @ -245,7 +247,9 @@ const userTaskListenerRef = ref(); | |||
| 
 | ||||
| /** 节点类型名称 */ | ||||
| const nodeTypeName = computed(() => { | ||||
|   return currentNode.value.type === NodeType.TRANSACTOR_NODE ? '办理' : '审批'; | ||||
|   return currentNode.value.type === BpmNodeTypeEnum.TRANSACTOR_NODE | ||||
|     ? '办理' | ||||
|     : '审批'; | ||||
| }); | ||||
| 
 | ||||
| /** 校验节点配置 */ | ||||
|  | @ -407,7 +411,7 @@ function showUserTaskNodeConfig(node: SimpleFlowNode) { | |||
|   // 3. 操作按钮设置 | ||||
|   buttonsSetting.value = | ||||
|     cloneDeep(node.buttonsSetting) || | ||||
|     (node.type === NodeType.TRANSACTOR_NODE | ||||
|     (node.type === BpmNodeTypeEnum.TRANSACTOR_NODE | ||||
|       ? TRANSACTOR_DEFAULT_BUTTON_SETTING | ||||
|       : DEFAULT_BUTTON_SETTING); | ||||
|   // 4. 表单字段权限配置 | ||||
|  | @ -595,7 +599,7 @@ onMounted(() => { | |||
|       </div> | ||||
|     </template> | ||||
|     <div | ||||
|       v-if="currentNode.type === NodeType.USER_TASK_NODE" | ||||
|       v-if="currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE" | ||||
|       class="mb-3 flex items-center" | ||||
|     > | ||||
|       <span class="mr-3 text-[16px]">审批类型 :</span> | ||||
|  | @ -860,7 +864,7 @@ onMounted(() => { | |||
|               </RadioGroup> | ||||
|             </FormItem> | ||||
| 
 | ||||
|             <div v-if="currentNode.type === NodeType.USER_TASK_NODE"> | ||||
|             <div v-if="currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE"> | ||||
|               <Divider content-position="left">审批人拒绝时</Divider> | ||||
|               <FormItem name="rejectHandlerType"> | ||||
|                 <RadioGroup | ||||
|  | @ -902,7 +906,7 @@ onMounted(() => { | |||
|               </FormItem> | ||||
|             </div> | ||||
| 
 | ||||
|             <div v-if="currentNode.type === NodeType.USER_TASK_NODE"> | ||||
|             <div v-if="currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE"> | ||||
|               <Divider content-position="left">审批人超时未处理时</Divider> | ||||
|               <FormItem | ||||
|                 label="启用开关" | ||||
|  | @ -1047,7 +1051,7 @@ onMounted(() => { | |||
|               </Select> | ||||
|             </FormItem> | ||||
| 
 | ||||
|             <div v-if="currentNode.type === NodeType.USER_TASK_NODE"> | ||||
|             <div v-if="currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE"> | ||||
|               <Divider content-position="left"> | ||||
|                 审批人与提交人为同一人时 | ||||
|               </Divider> | ||||
|  | @ -1081,7 +1085,7 @@ onMounted(() => { | |||
|               </FormItem> | ||||
|             </div> | ||||
| 
 | ||||
|             <div v-if="currentNode.type === NodeType.USER_TASK_NODE"> | ||||
|             <div v-if="currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE"> | ||||
|               <Divider content-position="left">审批意见</Divider> | ||||
|               <FormItem name="reasonRequire"> | ||||
|                 <Switch | ||||
|  | @ -1096,7 +1100,7 @@ onMounted(() => { | |||
|       </TabPane> | ||||
|       <TabPane | ||||
|         tab="操作按钮设置" | ||||
|         v-if="currentNode.type === NodeType.USER_TASK_NODE" | ||||
|         v-if="currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE" | ||||
|         key="buttons" | ||||
|       > | ||||
|         <div class="p-1"> | ||||
|  |  | |||
|  | @ -7,7 +7,9 @@ import { IconifyIcon } from '@vben/icons'; | |||
| 
 | ||||
| import { Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../../consts'; | ||||
| import { useNodeName2, useTaskStatusClass, useWatchNode } from '../../helpers'; | ||||
| import CopyTaskNodeConfig from '../nodes-config/copy-task-node-config.vue'; | ||||
| import NodeHandler from './node-handler.vue'; | ||||
|  | @ -32,7 +34,7 @@ const currentNode = useWatchNode(props); | |||
| // 节点名称编辑 | ||||
| const { showInput, blurEvent, clickTitle } = useNodeName2( | ||||
|   currentNode, | ||||
|   NodeType.COPY_TASK_NODE, | ||||
|   BpmNodeTypeEnum.COPY_TASK_NODE, | ||||
| ); | ||||
| 
 | ||||
| const nodeSetting = ref(); | ||||
|  | @ -85,7 +87,7 @@ function deleteNode() { | |||
|             {{ currentNode.showText }} | ||||
|           </div> | ||||
|           <div class="node-text" v-else> | ||||
|             {{ NODE_DEFAULT_TEXT.get(NodeType.COPY_TASK_NODE) }} | ||||
|             {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.COPY_TASK_NODE) }} | ||||
|           </div> | ||||
|           <IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" /> | ||||
|         </div> | ||||
|  |  | |||
|  | @ -7,7 +7,9 @@ import { IconifyIcon } from '@vben/icons'; | |||
| 
 | ||||
| import { Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../../consts'; | ||||
| import { useNodeName2, useTaskStatusClass, useWatchNode } from '../../helpers'; | ||||
| import DelayTimerNodeConfig from '../nodes-config/delay-timer-node-config.vue'; | ||||
| import NodeHandler from './node-handler.vue'; | ||||
|  | @ -30,7 +32,7 @@ const currentNode = useWatchNode(props); | |||
| // 节点名称编辑 | ||||
| const { showInput, blurEvent, clickTitle } = useNodeName2( | ||||
|   currentNode, | ||||
|   NodeType.DELAY_TIMER_NODE, | ||||
|   BpmNodeTypeEnum.DELAY_TIMER_NODE, | ||||
| ); | ||||
| 
 | ||||
| const nodeSetting = ref(); | ||||
|  | @ -82,7 +84,7 @@ function deleteNode() { | |||
|             {{ currentNode.showText }} | ||||
|           </div> | ||||
|           <div class="node-text" v-else> | ||||
|             {{ NODE_DEFAULT_TEXT.get(NodeType.DELAY_TIMER_NODE) }} | ||||
|             {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.DELAY_TIMER_NODE) }} | ||||
|           </div> | ||||
|           <IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" /> | ||||
|         </div> | ||||
|  |  | |||
|  | @ -8,11 +8,12 @@ import { cloneDeep, buildShortUUID as generateUUID } from '@vben/utils'; | |||
| 
 | ||||
| import { Button, Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   ConditionType, | ||||
|   DEFAULT_CONDITION_GROUP_VALUE, | ||||
|   NODE_DEFAULT_TEXT, | ||||
|   NodeType, | ||||
| } from '../../consts'; | ||||
| import { getDefaultConditionNodeName, useTaskStatusClass } from '../../helpers'; | ||||
| import ConditionNodeConfig from '../nodes-config/condition-node-config.vue'; | ||||
|  | @ -90,7 +91,7 @@ function addCondition() { | |||
|       id: `Flow_${generateUUID()}`, | ||||
|       name: `条件${len}`, | ||||
|       showText: '', | ||||
|       type: NodeType.CONDITION_NODE, | ||||
|       type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|       childNode: undefined, | ||||
|       conditionNodes: [], | ||||
|       conditionSetting: { | ||||
|  | @ -138,7 +139,7 @@ function recursiveFindParentNode( | |||
|   node: SimpleFlowNode, | ||||
|   nodeType: number, | ||||
| ) { | ||||
|   if (!node || node.type === NodeType.START_USER_NODE) { | ||||
|   if (!node || node.type === BpmNodeTypeEnum.START_USER_NODE) { | ||||
|     return; | ||||
|   } | ||||
|   if (node.type === nodeType) { | ||||
|  | @ -210,7 +211,7 @@ function recursiveFindParentNode( | |||
|                   {{ item.showText }} | ||||
|                 </div> | ||||
|                 <div class="branch-node-text" v-else> | ||||
|                   {{ NODE_DEFAULT_TEXT.get(NodeType.CONDITION_NODE) }} | ||||
|                   {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.CONDITION_NODE) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div | ||||
|  |  | |||
|  | @ -8,11 +8,12 @@ import { cloneDeep, buildShortUUID as generateUUID } from '@vben/utils'; | |||
| 
 | ||||
| import { Button, Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   ConditionType, | ||||
|   DEFAULT_CONDITION_GROUP_VALUE, | ||||
|   NODE_DEFAULT_TEXT, | ||||
|   NodeType, | ||||
| } from '../../consts'; | ||||
| import { | ||||
|   getDefaultInclusiveConditionNodeName, | ||||
|  | @ -95,7 +96,7 @@ function addCondition() { | |||
|       id: `Flow_${generateUUID()}`, | ||||
|       name: `包容条件${len}`, | ||||
|       showText: '', | ||||
|       type: NodeType.CONDITION_NODE, | ||||
|       type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|       childNode: undefined, | ||||
|       conditionNodes: [], | ||||
|       conditionSetting: { | ||||
|  | @ -143,7 +144,7 @@ function recursiveFindParentNode( | |||
|   node: SimpleFlowNode, | ||||
|   nodeType: number, | ||||
| ) { | ||||
|   if (!node || node.type === NodeType.START_USER_NODE) { | ||||
|   if (!node || node.type === BpmNodeTypeEnum.START_USER_NODE) { | ||||
|     return; | ||||
|   } | ||||
|   if (node.type === nodeType) { | ||||
|  | @ -213,7 +214,7 @@ function recursiveFindParentNode( | |||
|                   {{ item.showText }} | ||||
|                 </div> | ||||
|                 <div class="branch-node-text" v-else> | ||||
|                   {{ NODE_DEFAULT_TEXT.get(NodeType.CONDITION_NODE) }} | ||||
|                   {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.CONDITION_NODE) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div | ||||
|  |  | |||
|  | @ -8,6 +8,8 @@ import { cloneDeep, buildShortUUID as generateUUID } from '@vben/utils'; | |||
| 
 | ||||
| import { message, Popover } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   ApproveMethodType, | ||||
|   AssignEmptyHandlerType, | ||||
|  | @ -15,7 +17,6 @@ import { | |||
|   ConditionType, | ||||
|   DEFAULT_CONDITION_GROUP_VALUE, | ||||
|   NODE_DEFAULT_NAME, | ||||
|   NodeType, | ||||
|   RejectHandlerType, | ||||
| } from '../../consts'; | ||||
| 
 | ||||
|  | @ -41,17 +42,21 @@ const readonly = inject<Boolean>('readonly'); // 是否只读 | |||
| function addNode(type: number) { | ||||
|   // 校验:条件分支、包容分支后面,不允许直接添加并行分支 | ||||
|   if ( | ||||
|     type === NodeType.PARALLEL_BRANCH_NODE && | ||||
|     [NodeType.CONDITION_BRANCH_NODE, NodeType.INCLUSIVE_BRANCH_NODE].includes( | ||||
|       props.currentNode?.type, | ||||
|     ) | ||||
|     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 === NodeType.USER_TASK_NODE || type === NodeType.TRANSACTOR_NODE) { | ||||
|   if ( | ||||
|     type === BpmNodeTypeEnum.USER_TASK_NODE || | ||||
|     type === BpmNodeTypeEnum.TRANSACTOR_NODE | ||||
|   ) { | ||||
|     const id = `Activity_${generateUUID()}`; | ||||
|     const data: SimpleFlowNode = { | ||||
|       id, | ||||
|  | @ -83,20 +88,20 @@ function addNode(type: number) { | |||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.COPY_TASK_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.COPY_TASK_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       id: `Activity_${generateUUID()}`, | ||||
|       name: NODE_DEFAULT_NAME.get(NodeType.COPY_TASK_NODE) as string, | ||||
|       name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.COPY_TASK_NODE) as string, | ||||
|       showText: '', | ||||
|       type: NodeType.COPY_TASK_NODE, | ||||
|       type: BpmNodeTypeEnum.COPY_TASK_NODE, | ||||
|       childNode: props.childNode, | ||||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.CONDITION_BRANCH_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.CONDITION_BRANCH_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       name: '条件分支', | ||||
|       type: NodeType.CONDITION_BRANCH_NODE, | ||||
|       type: BpmNodeTypeEnum.CONDITION_BRANCH_NODE, | ||||
|       id: `GateWay_${generateUUID()}`, | ||||
|       childNode: props.childNode, | ||||
|       conditionNodes: [ | ||||
|  | @ -104,7 +109,7 @@ function addNode(type: number) { | |||
|           id: `Flow_${generateUUID()}`, | ||||
|           name: '条件1', | ||||
|           showText: '', | ||||
|           type: NodeType.CONDITION_NODE, | ||||
|           type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|           childNode: undefined, | ||||
|           conditionSetting: { | ||||
|             defaultFlow: false, | ||||
|  | @ -116,7 +121,7 @@ function addNode(type: number) { | |||
|           id: `Flow_${generateUUID()}`, | ||||
|           name: '其它情况', | ||||
|           showText: '未满足其它条件时,将进入此分支', | ||||
|           type: NodeType.CONDITION_NODE, | ||||
|           type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|           childNode: undefined, | ||||
|           conditionSetting: { | ||||
|             defaultFlow: true, | ||||
|  | @ -126,10 +131,10 @@ function addNode(type: number) { | |||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.PARALLEL_BRANCH_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.PARALLEL_BRANCH_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       name: '并行分支', | ||||
|       type: NodeType.PARALLEL_BRANCH_NODE, | ||||
|       type: BpmNodeTypeEnum.PARALLEL_BRANCH_NODE, | ||||
|       id: `GateWay_${generateUUID()}`, | ||||
|       childNode: props.childNode, | ||||
|       conditionNodes: [ | ||||
|  | @ -137,24 +142,24 @@ function addNode(type: number) { | |||
|           id: `Flow_${generateUUID()}`, | ||||
|           name: '并行1', | ||||
|           showText: '无需配置条件同时执行', | ||||
|           type: NodeType.CONDITION_NODE, | ||||
|           type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|           childNode: undefined, | ||||
|         }, | ||||
|         { | ||||
|           id: `Flow_${generateUUID()}`, | ||||
|           name: '并行2', | ||||
|           showText: '无需配置条件同时执行', | ||||
|           type: NodeType.CONDITION_NODE, | ||||
|           type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|           childNode: undefined, | ||||
|         }, | ||||
|       ], | ||||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.INCLUSIVE_BRANCH_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       name: '包容分支', | ||||
|       type: NodeType.INCLUSIVE_BRANCH_NODE, | ||||
|       type: BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE, | ||||
|       id: `GateWay_${generateUUID()}`, | ||||
|       childNode: props.childNode, | ||||
|       conditionNodes: [ | ||||
|  | @ -162,7 +167,7 @@ function addNode(type: number) { | |||
|           id: `Flow_${generateUUID()}`, | ||||
|           name: '包容条件1', | ||||
|           showText: '', | ||||
|           type: NodeType.CONDITION_NODE, | ||||
|           type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|           childNode: undefined, | ||||
|           conditionSetting: { | ||||
|             defaultFlow: false, | ||||
|  | @ -174,7 +179,7 @@ function addNode(type: number) { | |||
|           id: `Flow_${generateUUID()}`, | ||||
|           name: '其它情况', | ||||
|           showText: '未满足其它条件时,将进入此分支', | ||||
|           type: NodeType.CONDITION_NODE, | ||||
|           type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|           childNode: undefined, | ||||
|           conditionSetting: { | ||||
|             defaultFlow: true, | ||||
|  | @ -184,42 +189,42 @@ function addNode(type: number) { | |||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.DELAY_TIMER_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.DELAY_TIMER_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       id: `Activity_${generateUUID()}`, | ||||
|       name: NODE_DEFAULT_NAME.get(NodeType.DELAY_TIMER_NODE) as string, | ||||
|       name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.DELAY_TIMER_NODE) as string, | ||||
|       showText: '', | ||||
|       type: NodeType.DELAY_TIMER_NODE, | ||||
|       type: BpmNodeTypeEnum.DELAY_TIMER_NODE, | ||||
|       childNode: props.childNode, | ||||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.ROUTER_BRANCH_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.ROUTER_BRANCH_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       id: `GateWay_${generateUUID()}`, | ||||
|       name: NODE_DEFAULT_NAME.get(NodeType.ROUTER_BRANCH_NODE) as string, | ||||
|       name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.ROUTER_BRANCH_NODE) as string, | ||||
|       showText: '', | ||||
|       type: NodeType.ROUTER_BRANCH_NODE, | ||||
|       type: BpmNodeTypeEnum.ROUTER_BRANCH_NODE, | ||||
|       childNode: props.childNode, | ||||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.TRIGGER_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.TRIGGER_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       id: `Activity_${generateUUID()}`, | ||||
|       name: NODE_DEFAULT_NAME.get(NodeType.TRIGGER_NODE) as string, | ||||
|       name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.TRIGGER_NODE) as string, | ||||
|       showText: '', | ||||
|       type: NodeType.TRIGGER_NODE, | ||||
|       type: BpmNodeTypeEnum.TRIGGER_NODE, | ||||
|       childNode: props.childNode, | ||||
|     }; | ||||
|     emits('update:childNode', data); | ||||
|   } | ||||
|   if (type === NodeType.CHILD_PROCESS_NODE) { | ||||
|   if (type === BpmNodeTypeEnum.CHILD_PROCESS_NODE) { | ||||
|     const data: SimpleFlowNode = { | ||||
|       id: `Activity_${generateUUID()}`, | ||||
|       name: NODE_DEFAULT_NAME.get(NodeType.CHILD_PROCESS_NODE) as string, | ||||
|       name: NODE_DEFAULT_NAME.get(BpmNodeTypeEnum.CHILD_PROCESS_NODE) as string, | ||||
|       showText: '', | ||||
|       type: NodeType.CHILD_PROCESS_NODE, | ||||
|       type: BpmNodeTypeEnum.CHILD_PROCESS_NODE, | ||||
|       childNode: props.childNode, | ||||
|       childProcessSetting: { | ||||
|         calledProcessDefinitionKey: '', | ||||
|  | @ -247,7 +252,10 @@ function addNode(type: number) { | |||
|       <Popover trigger="hover" placement="right" width="auto" v-if="!readonly"> | ||||
|         <template #content> | ||||
|           <div class="handler-item-wrapper"> | ||||
|             <div class="handler-item" @click="addNode(NodeType.USER_TASK_NODE)"> | ||||
|             <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> | ||||
|  | @ -255,14 +263,17 @@ function addNode(type: number) { | |||
|             </div> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(NodeType.TRANSACTOR_NODE)" | ||||
|               @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(NodeType.COPY_TASK_NODE)"> | ||||
|             <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> | ||||
|  | @ -270,7 +281,7 @@ function addNode(type: number) { | |||
|             </div> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(NodeType.CONDITION_BRANCH_NODE)" | ||||
|               @click="addNode(BpmNodeTypeEnum.CONDITION_BRANCH_NODE)" | ||||
|             > | ||||
|               <div class="handler-item-icon condition"> | ||||
|                 <span class="iconfont icon-size icon-exclusive"></span> | ||||
|  | @ -279,7 +290,7 @@ function addNode(type: number) { | |||
|             </div> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(NodeType.PARALLEL_BRANCH_NODE)" | ||||
|               @click="addNode(BpmNodeTypeEnum.PARALLEL_BRANCH_NODE)" | ||||
|             > | ||||
|               <div class="handler-item-icon parallel"> | ||||
|                 <span class="iconfont icon-size icon-parallel"></span> | ||||
|  | @ -288,7 +299,7 @@ function addNode(type: number) { | |||
|             </div> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(NodeType.INCLUSIVE_BRANCH_NODE)" | ||||
|               @click="addNode(BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE)" | ||||
|             > | ||||
|               <div class="handler-item-icon inclusive"> | ||||
|                 <span class="iconfont icon-size icon-inclusive"></span> | ||||
|  | @ -297,7 +308,7 @@ function addNode(type: number) { | |||
|             </div> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(NodeType.DELAY_TIMER_NODE)" | ||||
|               @click="addNode(BpmNodeTypeEnum.DELAY_TIMER_NODE)" | ||||
|             > | ||||
|               <div class="handler-item-icon delay"> | ||||
|                 <span class="iconfont icon-size icon-delay"></span> | ||||
|  | @ -306,14 +317,17 @@ function addNode(type: number) { | |||
|             </div> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(NodeType.ROUTER_BRANCH_NODE)" | ||||
|               @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(NodeType.TRIGGER_NODE)"> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(BpmNodeTypeEnum.TRIGGER_NODE)" | ||||
|             > | ||||
|               <div class="handler-item-icon trigger"> | ||||
|                 <span class="iconfont icon-size icon-trigger"></span> | ||||
|               </div> | ||||
|  | @ -321,7 +335,7 @@ function addNode(type: number) { | |||
|             </div> | ||||
|             <div | ||||
|               class="handler-item" | ||||
|               @click="addNode(NodeType.CHILD_PROCESS_NODE)" | ||||
|               @click="addNode(BpmNodeTypeEnum.CHILD_PROCESS_NODE)" | ||||
|             > | ||||
|               <div class="handler-item-icon child-process"> | ||||
|                 <span class="iconfont icon-size icon-child-process"></span> | ||||
|  |  | |||
|  | @ -8,7 +8,9 @@ import { buildShortUUID as generateUUID } from '@vben/utils'; | |||
| 
 | ||||
| import { Button, Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../../consts'; | ||||
| import { useTaskStatusClass } from '../../helpers'; | ||||
| import ProcessNodeTree from '../process-node-tree.vue'; | ||||
| import NodeHandler from './node-handler.vue'; | ||||
|  | @ -70,7 +72,7 @@ function addCondition() { | |||
|       id: `Flow_${generateUUID()}`, | ||||
|       name: `并行${len}`, | ||||
|       showText: '无需配置条件同时执行', | ||||
|       type: NodeType.CONDITION_NODE, | ||||
|       type: BpmNodeTypeEnum.CONDITION_NODE, | ||||
|       childNode: undefined, | ||||
|       conditionNodes: [], | ||||
|     }; | ||||
|  | @ -97,7 +99,7 @@ function recursiveFindParentNode( | |||
|   node: SimpleFlowNode, | ||||
|   nodeType: number, | ||||
| ) { | ||||
|   if (!node || node.type === NodeType.START_USER_NODE) { | ||||
|   if (!node || node.type === BpmNodeTypeEnum.START_USER_NODE) { | ||||
|     return; | ||||
|   } | ||||
|   if (node.type === nodeType) { | ||||
|  | @ -168,7 +170,7 @@ function recursiveFindParentNode( | |||
|                   {{ item.showText }} | ||||
|                 </div> | ||||
|                 <div class="branch-node-text" v-else> | ||||
|                   {{ NODE_DEFAULT_TEXT.get(NodeType.CONDITION_NODE) }} | ||||
|                   {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.CONDITION_NODE) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div v-if="!readonly" class="node-toolbar"> | ||||
|  |  | |||
|  | @ -7,7 +7,9 @@ import { IconifyIcon } from '@vben/icons'; | |||
| 
 | ||||
| import { Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../../consts'; | ||||
| import { useNodeName2, useTaskStatusClass, useWatchNode } from '../../helpers'; | ||||
| import RouterNodeConfig from '../nodes-config/router-node-config.vue'; | ||||
| import NodeHandler from './node-handler.vue'; | ||||
|  | @ -33,7 +35,7 @@ const currentNode = useWatchNode(props); | |||
| // 节点名称编辑 | ||||
| const { showInput, blurEvent, clickTitle } = useNodeName2( | ||||
|   currentNode, | ||||
|   NodeType.ROUTER_BRANCH_NODE, | ||||
|   BpmNodeTypeEnum.ROUTER_BRANCH_NODE, | ||||
| ); | ||||
| 
 | ||||
| const nodeSetting = ref(); | ||||
|  | @ -85,7 +87,7 @@ function deleteNode() { | |||
|             {{ currentNode.showText }} | ||||
|           </div> | ||||
|           <div class="node-text" v-else> | ||||
|             {{ NODE_DEFAULT_TEXT.get(NodeType.ROUTER_BRANCH_NODE) }} | ||||
|             {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.ROUTER_BRANCH_NODE) }} | ||||
|           </div> | ||||
|           <IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" /> | ||||
|         </div> | ||||
|  |  | |||
|  | @ -9,7 +9,9 @@ import { IconifyIcon } from '@vben/icons'; | |||
| 
 | ||||
| import { Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../../consts'; | ||||
| import { useNodeName2, useTaskStatusClass, useWatchNode } from '../../helpers'; | ||||
| import StartUserNodeConfig from '../nodes-config/start-user-node-config.vue'; | ||||
| import NodeHandler from './node-handler.vue'; | ||||
|  | @ -36,7 +38,7 @@ const currentNode = useWatchNode(props); | |||
| // 节点名称编辑 | ||||
| const { showInput, blurEvent, clickTitle } = useNodeName2( | ||||
|   currentNode, | ||||
|   NodeType.START_USER_NODE, | ||||
|   BpmNodeTypeEnum.START_USER_NODE, | ||||
| ); | ||||
| 
 | ||||
| const nodeSetting = ref(); | ||||
|  | @ -98,7 +100,7 @@ function nodeClick() { | |||
|             {{ currentNode.showText }} | ||||
|           </div> | ||||
|           <div class="node-text" v-else> | ||||
|             {{ NODE_DEFAULT_TEXT.get(NodeType.START_USER_NODE) }} | ||||
|             {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.START_USER_NODE) }} | ||||
|           </div> | ||||
|           <IconifyIcon icon="ep:arrow-right-bold" v-if="!readonly" /> | ||||
|         </div> | ||||
|  |  | |||
|  | @ -7,7 +7,9 @@ import { IconifyIcon } from '@vben/icons'; | |||
| 
 | ||||
| import { Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../../consts'; | ||||
| import { useNodeName2, useTaskStatusClass, useWatchNode } from '../../helpers'; | ||||
| import TriggerNodeConfig from '../nodes-config/trigger-node-config.vue'; | ||||
| import NodeHandler from './node-handler.vue'; | ||||
|  | @ -35,7 +37,7 @@ const currentNode = useWatchNode(props); | |||
| // 节点名称编辑 | ||||
| const { showInput, blurEvent, clickTitle } = useNodeName2( | ||||
|   currentNode, | ||||
|   NodeType.TRIGGER_NODE, | ||||
|   BpmNodeTypeEnum.TRIGGER_NODE, | ||||
| ); | ||||
| 
 | ||||
| const nodeSetting = ref(); | ||||
|  | @ -87,7 +89,7 @@ function deleteNode() { | |||
|             {{ currentNode.showText }} | ||||
|           </div> | ||||
|           <div class="node-text" v-else> | ||||
|             {{ NODE_DEFAULT_TEXT.get(NodeType.TRIGGER_NODE) }} | ||||
|             {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.TRIGGER_NODE) }} | ||||
|           </div> | ||||
|           <IconifyIcon v-if="!readonly" icon="ep:arrow-right-bold" /> | ||||
|         </div> | ||||
|  |  | |||
|  | @ -9,7 +9,9 @@ import { IconifyIcon } from '@vben/icons'; | |||
| 
 | ||||
| import { Input } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../../consts'; | ||||
| import { useNodeName2, useTaskStatusClass, useWatchNode } from '../../helpers'; | ||||
| import UserTaskNodeConfig from '../nodes-config/user-task-node-config.vue'; | ||||
| import NodeHandler from './node-handler.vue'; | ||||
|  | @ -24,7 +26,7 @@ const props = defineProps({ | |||
| }); | ||||
| 
 | ||||
| const emits = defineEmits<{ | ||||
|   findParentNode: [nodeList: SimpleFlowNode[], nodeType: NodeType]; | ||||
|   findParentNode: [nodeList: SimpleFlowNode[], nodeType: BpmNodeTypeEnum]; | ||||
|   'update:flowNode': [node: SimpleFlowNode | undefined]; | ||||
| }>(); | ||||
| 
 | ||||
|  | @ -36,7 +38,7 @@ const currentNode = useWatchNode(props); | |||
| // 节点名称编辑 | ||||
| const { showInput, blurEvent, clickTitle } = useNodeName2( | ||||
|   currentNode, | ||||
|   NodeType.START_USER_NODE, | ||||
|   BpmNodeTypeEnum.USER_TASK_NODE, | ||||
| ); | ||||
| const nodeSetting = ref(); | ||||
| 
 | ||||
|  | @ -60,7 +62,7 @@ function findReturnTaskNodes( | |||
|   matchNodeList: SimpleFlowNode[], // 匹配的节点 | ||||
| ) { | ||||
|   // 从父节点查找 | ||||
|   emits('findParentNode', matchNodeList, NodeType.USER_TASK_NODE); | ||||
|   emits('findParentNode', matchNodeList, BpmNodeTypeEnum.USER_TASK_NODE); | ||||
| } | ||||
| 
 | ||||
| // const selectTasks = ref<any[] | undefined>([]); // 选中的任务数组 | ||||
|  | @ -77,10 +79,10 @@ function findReturnTaskNodes( | |||
|       > | ||||
|         <div class="node-title-container"> | ||||
|           <div | ||||
|             :class="`node-title-icon ${currentNode.type === NodeType.TRANSACTOR_NODE ? 'transactor-task' : 'user-task'}`" | ||||
|             :class="`node-title-icon ${currentNode.type === BpmNodeTypeEnum.TRANSACTOR_NODE ? 'transactor-task' : 'user-task'}`" | ||||
|           > | ||||
|             <span | ||||
|               :class="`iconfont ${currentNode.type === NodeType.TRANSACTOR_NODE ? 'icon-transactor' : 'icon-approve'}`" | ||||
|               :class="`iconfont ${currentNode.type === BpmNodeTypeEnum.TRANSACTOR_NODE ? 'icon-transactor' : 'icon-approve'}`" | ||||
|             > | ||||
|             </span> | ||||
|           </div> | ||||
|  |  | |||
|  | @ -1,7 +1,8 @@ | |||
| <script setup lang="ts"> | ||||
| import type { SimpleFlowNode } from '../consts'; | ||||
| 
 | ||||
| import { NodeType } from '../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { useWatchNode } from '../helpers'; | ||||
| import CopyTaskNode from './nodes/copy-task-node.vue'; | ||||
| import DelayTimerNode from './nodes/delay-timer-node.vue'; | ||||
|  | @ -57,7 +58,7 @@ function recursiveFindParentNode( | |||
|   if (!findNode) { | ||||
|     return; | ||||
|   } | ||||
|   if (findNode.type === NodeType.START_USER_NODE) { | ||||
|   if (findNode.type === BpmNodeTypeEnum.START_USER_NODE) { | ||||
|     nodeList.push(findNode); | ||||
|     return; | ||||
|   } | ||||
|  | @ -71,15 +72,15 @@ function recursiveFindParentNode( | |||
| <template> | ||||
|   <!-- 发起人节点 --> | ||||
|   <StartUserNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.START_USER_NODE" | ||||
|     v-if="currentNode && currentNode.type === BpmNodeTypeEnum.START_USER_NODE" | ||||
|     :flow-node="currentNode" | ||||
|   /> | ||||
|   <!-- 审批节点 --> | ||||
|   <UserTaskNode | ||||
|     v-if=" | ||||
|       currentNode && | ||||
|       (currentNode.type === NodeType.USER_TASK_NODE || | ||||
|         currentNode.type === NodeType.TRANSACTOR_NODE) | ||||
|       (currentNode.type === BpmNodeTypeEnum.USER_TASK_NODE || | ||||
|         currentNode.type === BpmNodeTypeEnum.TRANSACTOR_NODE) | ||||
|     " | ||||
|     :flow-node="currentNode" | ||||
|     @update:flow-node="handleModelValueUpdate" | ||||
|  | @ -87,46 +88,54 @@ function recursiveFindParentNode( | |||
|   /> | ||||
|   <!-- 抄送节点 --> | ||||
|   <CopyTaskNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.COPY_TASK_NODE" | ||||
|     v-if="currentNode && currentNode.type === BpmNodeTypeEnum.COPY_TASK_NODE" | ||||
|     :flow-node="currentNode" | ||||
|     @update:flow-node="handleModelValueUpdate" | ||||
|   /> | ||||
|   <!-- 条件节点 --> | ||||
|   <ExclusiveNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.CONDITION_BRANCH_NODE" | ||||
|     v-if=" | ||||
|       currentNode && currentNode.type === BpmNodeTypeEnum.CONDITION_BRANCH_NODE | ||||
|     " | ||||
|     :flow-node="currentNode" | ||||
|     @update:model-value="handleModelValueUpdate" | ||||
|     @find-parent-node="findParentNode" | ||||
|   /> | ||||
|   <!-- 并行节点 --> | ||||
|   <ParallelNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.PARALLEL_BRANCH_NODE" | ||||
|     v-if=" | ||||
|       currentNode && currentNode.type === BpmNodeTypeEnum.PARALLEL_BRANCH_NODE | ||||
|     " | ||||
|     :flow-node="currentNode" | ||||
|     @update:model-value="handleModelValueUpdate" | ||||
|     @find-parent-node="findParentNode" | ||||
|   /> | ||||
|   <!-- 包容分支节点 --> | ||||
|   <InclusiveNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.INCLUSIVE_BRANCH_NODE" | ||||
|     v-if=" | ||||
|       currentNode && currentNode.type === BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE | ||||
|     " | ||||
|     :flow-node="currentNode" | ||||
|     @update:model-value="handleModelValueUpdate" | ||||
|     @find-parent-node="findParentNode" | ||||
|   /> | ||||
|   <!-- 延迟器节点 --> | ||||
|   <DelayTimerNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.DELAY_TIMER_NODE" | ||||
|     v-if="currentNode && currentNode.type === BpmNodeTypeEnum.DELAY_TIMER_NODE" | ||||
|     :flow-node="currentNode" | ||||
|     @update:flow-node="handleModelValueUpdate" | ||||
|   /> | ||||
|   <!-- 路由分支节点 --> | ||||
|   <RouterNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.ROUTER_BRANCH_NODE" | ||||
|     v-if=" | ||||
|       currentNode && currentNode.type === BpmNodeTypeEnum.ROUTER_BRANCH_NODE | ||||
|     " | ||||
|     :flow-node="currentNode" | ||||
|     @update:flow-node="handleModelValueUpdate" | ||||
|   /> | ||||
|   <!-- 触发器节点 --> | ||||
|   <TriggerNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.TRIGGER_NODE" | ||||
|     v-if="currentNode && currentNode.type === BpmNodeTypeEnum.TRIGGER_NODE" | ||||
|     :flow-node="currentNode" | ||||
|     @update:flow-node="handleModelValueUpdate" | ||||
|   /> | ||||
|  | @ -146,7 +155,7 @@ function recursiveFindParentNode( | |||
| 
 | ||||
|   <!-- 结束节点 --> | ||||
|   <EndEventNode | ||||
|     v-if="currentNode && currentNode.type === NodeType.END_EVENT_NODE" | ||||
|     v-if="currentNode && currentNode.type === BpmNodeTypeEnum.END_EVENT_NODE" | ||||
|     :flow-node="currentNode" | ||||
|   /> | ||||
| </template> | ||||
|  |  | |||
|  | @ -22,9 +22,9 @@ import { getSimpleDeptList } from '#/api/system/dept'; | |||
| import { getSimplePostList } from '#/api/system/post'; | ||||
| import { getSimpleRoleList } from '#/api/system/role'; | ||||
| import { getSimpleUserList } from '#/api/system/user'; | ||||
| import { BpmModelFormType } from '#/utils/constants'; | ||||
| import { BpmModelFormType, BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeId, NodeType } from '../consts'; | ||||
| import { NODE_DEFAULT_TEXT, NodeId } from '../consts'; | ||||
| import SimpleProcessModel from './simple-process-model.vue'; | ||||
| 
 | ||||
| defineOptions({ | ||||
|  | @ -124,13 +124,13 @@ function updateModel() { | |||
|   if (!processNodeTree.value) { | ||||
|     processNodeTree.value = { | ||||
|       name: '发起人', | ||||
|       type: NodeType.START_USER_NODE, | ||||
|       type: BpmNodeTypeEnum.START_USER_NODE, | ||||
|       id: NodeId.START_USER_NODE_ID, | ||||
|       showText: '默认配置', | ||||
|       childNode: { | ||||
|         id: NodeId.END_EVENT_NODE_ID, | ||||
|         name: '结束', | ||||
|         type: NodeType.END_EVENT_NODE, | ||||
|         type: BpmNodeTypeEnum.END_EVENT_NODE, | ||||
|       }, | ||||
|     }; | ||||
|     // 初始化时也触发一次保存 | ||||
|  | @ -162,14 +162,14 @@ function validateNode( | |||
| ) { | ||||
|   if (node) { | ||||
|     const { type, showText, conditionNodes } = node; | ||||
|     if (type === NodeType.END_EVENT_NODE) { | ||||
|     if (type === BpmNodeTypeEnum.END_EVENT_NODE) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     if ( | ||||
|       type === NodeType.CONDITION_BRANCH_NODE || | ||||
|       type === NodeType.PARALLEL_BRANCH_NODE || | ||||
|       type === NodeType.INCLUSIVE_BRANCH_NODE | ||||
|       type === BpmNodeTypeEnum.CONDITION_BRANCH_NODE || | ||||
|       type === BpmNodeTypeEnum.PARALLEL_BRANCH_NODE || | ||||
|       type === BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE | ||||
|     ) { | ||||
|       // 1. 分支节点, 先校验各个分支 | ||||
|       conditionNodes?.forEach((item) => { | ||||
|  |  | |||
|  | @ -8,7 +8,9 @@ import { downloadFileFromBlob, isString } from '@vben/utils'; | |||
| 
 | ||||
| import { Button, ButtonGroup, Modal, Row } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT, NodeType } from '../consts'; | ||||
| import { BpmNodeTypeEnum } from '#/utils'; | ||||
| 
 | ||||
| import { NODE_DEFAULT_TEXT } from '../consts'; | ||||
| import { useWatchNode } from '../helpers'; | ||||
| import ProcessNodeTree from './process-node-tree.vue'; | ||||
| 
 | ||||
|  | @ -113,18 +115,18 @@ function validateNode( | |||
| ) { | ||||
|   if (node) { | ||||
|     const { type, showText, conditionNodes } = node; | ||||
|     if (type === NodeType.END_EVENT_NODE) { | ||||
|     if (type === BpmNodeTypeEnum.END_EVENT_NODE) { | ||||
|       return; | ||||
|     } | ||||
|     if (type === NodeType.START_USER_NODE) { | ||||
|     if (type === BpmNodeTypeEnum.START_USER_NODE) { | ||||
|       // 发起人节点暂时不用校验,直接校验孩子节点 | ||||
|       validateNode(node.childNode, errorNodes); | ||||
|     } | ||||
| 
 | ||||
|     if ( | ||||
|       type === NodeType.USER_TASK_NODE || | ||||
|       type === NodeType.COPY_TASK_NODE || | ||||
|       type === NodeType.CONDITION_NODE | ||||
|       type === BpmNodeTypeEnum.USER_TASK_NODE || | ||||
|       type === BpmNodeTypeEnum.COPY_TASK_NODE || | ||||
|       type === BpmNodeTypeEnum.CONDITION_NODE | ||||
|     ) { | ||||
|       if (!showText) { | ||||
|         errorNodes.push(node); | ||||
|  | @ -133,9 +135,9 @@ function validateNode( | |||
|     } | ||||
| 
 | ||||
|     if ( | ||||
|       type === NodeType.CONDITION_BRANCH_NODE || | ||||
|       type === NodeType.PARALLEL_BRANCH_NODE || | ||||
|       type === NodeType.INCLUSIVE_BRANCH_NODE | ||||
|       type === BpmNodeTypeEnum.CONDITION_BRANCH_NODE || | ||||
|       type === BpmNodeTypeEnum.PARALLEL_BRANCH_NODE || | ||||
|       type === BpmNodeTypeEnum.INCLUSIVE_BRANCH_NODE | ||||
|     ) { | ||||
|       // 分支节点 | ||||
|       // 1. 先校验各个分支 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| // TODO 芋艿 这些 常量是不是可以共享
 | ||||
| import { BpmNodeTypeEnum, BpmTaskStatusEnum } from '#/utils'; | ||||
| 
 | ||||
| interface DictDataType { | ||||
|   label: string; | ||||
|  | @ -43,112 +43,6 @@ export enum ApproveMethodType { | |||
|   SEQUENTIAL_APPROVE = 4, | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * 任务状态枚举 | ||||
|  */ | ||||
| export enum TaskStatusEnum { | ||||
|   /** | ||||
|    * 审批通过 | ||||
|    */ | ||||
|   APPROVE = 2, | ||||
| 
 | ||||
|   /** | ||||
|    * 审批通过中 | ||||
|    */ | ||||
|   APPROVING = 7, | ||||
|   /** | ||||
|    * 已取消 | ||||
|    */ | ||||
|   CANCEL = 4, | ||||
|   /** | ||||
|    * 未开始 | ||||
|    */ | ||||
|   NOT_START = -1, | ||||
| 
 | ||||
|   /** | ||||
|    * 审批不通过 | ||||
|    */ | ||||
|   REJECT = 3, | ||||
| 
 | ||||
|   /** | ||||
|    * 已退回 | ||||
|    */ | ||||
|   RETURN = 5, | ||||
|   /** | ||||
|    * 审批中 | ||||
|    */ | ||||
|   RUNNING = 1, | ||||
|   /** | ||||
|    * 待审批 | ||||
|    */ | ||||
|   WAIT = 0, | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * 节点类型 | ||||
|  */ | ||||
| export enum NodeType { | ||||
|   /** | ||||
|    * 子流程节点 | ||||
|    */ | ||||
|   CHILD_PROCESS_NODE = 20, | ||||
|   /** | ||||
|    * 条件分支节点 (对应排他网关) | ||||
|    */ | ||||
|   CONDITION_BRANCH_NODE = 51, | ||||
|   /** | ||||
|    * 条件节点 | ||||
|    */ | ||||
|   CONDITION_NODE = 50, | ||||
| 
 | ||||
|   /** | ||||
|    * 抄送人节点 | ||||
|    */ | ||||
|   COPY_TASK_NODE = 12, | ||||
| 
 | ||||
|   /** | ||||
|    * 延迟器节点 | ||||
|    */ | ||||
|   DELAY_TIMER_NODE = 14, | ||||
| 
 | ||||
|   /** | ||||
|    * 结束节点 | ||||
|    */ | ||||
|   END_EVENT_NODE = 1, | ||||
| 
 | ||||
|   /** | ||||
|    * 包容分支节点 (对应包容网关) | ||||
|    */ | ||||
|   INCLUSIVE_BRANCH_NODE = 53, | ||||
| 
 | ||||
|   /** | ||||
|    * 并行分支节点 (对应并行网关) | ||||
|    */ | ||||
|   PARALLEL_BRANCH_NODE = 52, | ||||
| 
 | ||||
|   /** | ||||
|    * 路由分支节点 | ||||
|    */ | ||||
|   ROUTER_BRANCH_NODE = 54, | ||||
|   /** | ||||
|    * 发起人节点 | ||||
|    */ | ||||
|   START_USER_NODE = 10, | ||||
|   /** | ||||
|    * 办理人节点 | ||||
|    */ | ||||
|   TRANSACTOR_NODE = 13, | ||||
| 
 | ||||
|   /** | ||||
|    * 触发器节点 | ||||
|    */ | ||||
|   TRIGGER_NODE = 15, | ||||
|   /** | ||||
|    * 审批人节点 | ||||
|    */ | ||||
|   USER_TASK_NODE = 11, | ||||
| } | ||||
| 
 | ||||
| export enum NodeId { | ||||
|   /** | ||||
|    * 发起人节点 Id | ||||
|  | @ -660,7 +554,7 @@ export type ChildProcessSetting = { | |||
|  */ | ||||
| export interface SimpleFlowNode { | ||||
|   id: string; | ||||
|   type: NodeType; | ||||
|   type: BpmNodeTypeEnum; | ||||
|   name: string; | ||||
|   showText?: string; | ||||
|   // 孩子节点
 | ||||
|  | @ -698,7 +592,7 @@ export interface SimpleFlowNode { | |||
|   // 条件设置
 | ||||
|   conditionSetting?: ConditionSetting; | ||||
|   // 活动的状态,用于前端节点状态展示
 | ||||
|   activityStatus?: TaskStatusEnum; | ||||
|   activityStatus?: BpmTaskStatusEnum; | ||||
|   // 延迟设置
 | ||||
|   delaySetting?: DelaySetting; | ||||
|   // 路由分支
 | ||||
|  | @ -734,26 +628,26 @@ export const DEFAULT_CONDITION_GROUP_VALUE = { | |||
| }; | ||||
| 
 | ||||
| export const NODE_DEFAULT_TEXT = new Map<number, string>(); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.USER_TASK_NODE, '请配置审批人'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.COPY_TASK_NODE, '请配置抄送人'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.CONDITION_NODE, '请设置条件'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.START_USER_NODE, '请设置发起人'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.DELAY_TIMER_NODE, '请设置延迟器'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.ROUTER_BRANCH_NODE, '请设置路由节点'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.TRIGGER_NODE, '请设置触发器'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.TRANSACTOR_NODE, '请设置办理人'); | ||||
| NODE_DEFAULT_TEXT.set(NodeType.CHILD_PROCESS_NODE, '请设置子流程'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.USER_TASK_NODE, '请配置审批人'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.COPY_TASK_NODE, '请配置抄送人'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.CONDITION_NODE, '请设置条件'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.START_USER_NODE, '请设置发起人'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.DELAY_TIMER_NODE, '请设置延迟器'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.ROUTER_BRANCH_NODE, '请设置路由节点'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.TRIGGER_NODE, '请设置触发器'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.TRANSACTOR_NODE, '请设置办理人'); | ||||
| NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.CHILD_PROCESS_NODE, '请设置子流程'); | ||||
| 
 | ||||
| export const NODE_DEFAULT_NAME = new Map<number, string>(); | ||||
| NODE_DEFAULT_NAME.set(NodeType.USER_TASK_NODE, '审批人'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.COPY_TASK_NODE, '抄送人'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.CONDITION_NODE, '条件'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.START_USER_NODE, '发起人'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.DELAY_TIMER_NODE, '延迟器'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.ROUTER_BRANCH_NODE, '路由分支'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.TRIGGER_NODE, '触发器'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.TRANSACTOR_NODE, '办理人'); | ||||
| NODE_DEFAULT_NAME.set(NodeType.CHILD_PROCESS_NODE, '子流程'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.USER_TASK_NODE, '审批人'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.COPY_TASK_NODE, '抄送人'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.CONDITION_NODE, '条件'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.START_USER_NODE, '发起人'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.DELAY_TIMER_NODE, '延迟器'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.ROUTER_BRANCH_NODE, '路由分支'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.TRIGGER_NODE, '触发器'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.TRANSACTOR_NODE, '办理人'); | ||||
| NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.CHILD_PROCESS_NODE, '子流程'); | ||||
| 
 | ||||
| // 候选人策略。暂时不从字典中取。 后续可能调整。控制显示顺序
 | ||||
| export const CANDIDATE_STRATEGY: DictDataType[] = [ | ||||
|  | @ -930,24 +824,6 @@ export const MULTI_LEVEL_DEPT: DictDataType[] = [ | |||
|   { label: '第 15 级部门', value: 15 }, | ||||
| ]; | ||||
| 
 | ||||
| /** | ||||
|  * 流程实例的变量枚举 | ||||
|  */ | ||||
| export enum ProcessVariableEnum { | ||||
|   /** | ||||
|    * 流程定义名称 | ||||
|    */ | ||||
|   PROCESS_DEFINITION_NAME = 'PROCESS_DEFINITION_NAME', | ||||
|   /** | ||||
|    * 发起时间 | ||||
|    */ | ||||
|   START_TIME = 'PROCESS_START_TIME', | ||||
|   /** | ||||
|    * 发起用户 ID | ||||
|    */ | ||||
|   START_USER_ID = 'PROCESS_START_USER_ID', | ||||
| } | ||||
| 
 | ||||
| export const DELAY_TYPE = [ | ||||
|   { label: '固定时长', value: DelayTypeEnum.FIXED_TIME_DURATION }, | ||||
|   { label: '固定日期', value: DelayTypeEnum.FIXED_DATE_TIME }, | ||||
|  |  | |||
|  | @ -14,6 +14,12 @@ import type { SystemUserApi } from '#/api/system/user'; | |||
| 
 | ||||
| import { inject, ref, toRaw, unref, watch } from 'vue'; | ||||
| 
 | ||||
| import { | ||||
|   BpmNodeTypeEnum, | ||||
|   BpmTaskStatusEnum, | ||||
|   ProcessVariableEnum, | ||||
| } from '#/utils'; | ||||
| 
 | ||||
| import { | ||||
|   ApproveMethodType, | ||||
|   AssignEmptyHandlerType, | ||||
|  | @ -23,10 +29,7 @@ import { | |||
|   ConditionType, | ||||
|   FieldPermissionType, | ||||
|   NODE_DEFAULT_NAME, | ||||
|   NodeType, | ||||
|   ProcessVariableEnum, | ||||
|   RejectHandlerType, | ||||
|   TaskStatusEnum, | ||||
| } from './consts'; | ||||
| 
 | ||||
| export function useWatchNode(props: { | ||||
|  | @ -252,7 +255,7 @@ export type CopyTaskFormType = { | |||
| /** | ||||
|  * @description 节点表单数据。 用于审批节点、抄送节点 | ||||
|  */ | ||||
| export function useNodeForm(nodeType: NodeType) { | ||||
| export function useNodeForm(nodeType: BpmNodeTypeEnum) { | ||||
|   const roleOptions = inject<Ref<SystemRoleApi.Role[]>>('roleList', ref([])); // 角色列表
 | ||||
|   const postOptions = inject<Ref<SystemPostApi.Post[]>>('postList', ref([])); // 岗位列表
 | ||||
|   const userOptions = inject<Ref<SystemUserApi.User[]>>('userList', ref([])); // 用户列表
 | ||||
|  | @ -269,8 +272,8 @@ export function useNodeForm(nodeType: NodeType) { | |||
|   const configForm = ref<any | CopyTaskFormType | UserTaskFormType>(); | ||||
| 
 | ||||
|   if ( | ||||
|     nodeType === NodeType.USER_TASK_NODE || | ||||
|     nodeType === NodeType.TRANSACTOR_NODE | ||||
|     nodeType === BpmNodeTypeEnum.USER_TASK_NODE || | ||||
|     nodeType === BpmNodeTypeEnum.TRANSACTOR_NODE | ||||
|   ) { | ||||
|     configForm.value = { | ||||
|       candidateStrategy: CandidateStrategy.USER, | ||||
|  | @ -614,7 +617,7 @@ export function useDrawer() { | |||
| /** | ||||
|  * @description 节点名称配置 | ||||
|  */ | ||||
| export function useNodeName(nodeType: NodeType) { | ||||
| export function useNodeName(nodeType: BpmNodeTypeEnum) { | ||||
|   // 节点名称
 | ||||
|   const nodeName = ref<string>(); | ||||
|   // 节点名称输入框
 | ||||
|  | @ -637,7 +640,10 @@ export function useNodeName(nodeType: NodeType) { | |||
|   }; | ||||
| } | ||||
| 
 | ||||
| export function useNodeName2(node: Ref<SimpleFlowNode>, nodeType: NodeType) { | ||||
| export function useNodeName2( | ||||
|   node: Ref<SimpleFlowNode>, | ||||
|   nodeType: BpmNodeTypeEnum, | ||||
| ) { | ||||
|   // 显示节点名称输入框
 | ||||
|   const showInput = ref(false); | ||||
|   // 节点名称输入框失去焦点
 | ||||
|  | @ -661,21 +667,21 @@ export function useNodeName2(node: Ref<SimpleFlowNode>, nodeType: NodeType) { | |||
|  * @description 根据节点任务状态,获取节点任务状态样式 | ||||
|  */ | ||||
| export function useTaskStatusClass( | ||||
|   taskStatus: TaskStatusEnum | undefined, | ||||
|   taskStatus: BpmTaskStatusEnum | undefined, | ||||
| ): string { | ||||
|   if (!taskStatus) { | ||||
|     return ''; | ||||
|   } | ||||
|   if (taskStatus === TaskStatusEnum.APPROVE) { | ||||
|   if (taskStatus === BpmTaskStatusEnum.APPROVE) { | ||||
|     return 'status-pass'; | ||||
|   } | ||||
|   if (taskStatus === TaskStatusEnum.RUNNING) { | ||||
|   if (taskStatus === BpmTaskStatusEnum.RUNNING) { | ||||
|     return 'status-running'; | ||||
|   } | ||||
|   if (taskStatus === TaskStatusEnum.REJECT) { | ||||
|   if (taskStatus === BpmTaskStatusEnum.REJECT) { | ||||
|     return 'status-reject'; | ||||
|   } | ||||
|   if (taskStatus === TaskStatusEnum.CANCEL) { | ||||
|   if (taskStatus === BpmTaskStatusEnum.CANCEL) { | ||||
|     return 'status-cancel'; | ||||
|   } | ||||
|   return ''; | ||||
|  |  | |||
|  | @ -1,3 +1,7 @@ | |||
| import './styles/simple-process-designer.scss'; | ||||
| 
 | ||||
| export { default as HttpRequestSetting } from './components/nodes-config/modules/http-request-setting.vue'; | ||||
| 
 | ||||
| export { default as SimpleProcessDesigner } from './components/simple-process-designer.vue'; | ||||
| 
 | ||||
| export { parseFormFields } from './helpers'; | ||||
|  |  | |||
|  | @ -725,3 +725,21 @@ OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.DELEGATE, '委派'); | |||
| OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.ADD_SIGN, '加签'); | ||||
| OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.RETURN, '退回'); | ||||
| OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.COPY, '抄送'); | ||||
| 
 | ||||
| /** | ||||
|  * 流程实例的变量枚举 | ||||
|  */ | ||||
| export enum ProcessVariableEnum { | ||||
|   /** | ||||
|    * 流程定义名称 | ||||
|    */ | ||||
|   PROCESS_DEFINITION_NAME = 'PROCESS_DEFINITION_NAME', | ||||
|   /** | ||||
|    * 发起时间 | ||||
|    */ | ||||
|   START_TIME = 'PROCESS_START_TIME', | ||||
|   /** | ||||
|    * 发起用户 ID | ||||
|    */ | ||||
|   START_USER_ID = 'PROCESS_START_USER_ID', | ||||
| } | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ import { getSimpleUserList } from '#/api/system/user'; | |||
| import { BpmAutoApproveType, BpmModelFormType, BpmModelType } from '#/utils'; | ||||
| 
 | ||||
| import BasicInfo from './modules/basic-info.vue'; | ||||
| import ExtraSetting from './modules/extra-setting.vue'; | ||||
| import FormDesign from './modules/form-design.vue'; | ||||
| import ProcessDesign from './modules/process-design.vue'; | ||||
| 
 | ||||
|  | @ -55,6 +56,8 @@ const basicInfoRef = ref<InstanceType<typeof BasicInfo>>(); | |||
| const formDesignRef = ref<InstanceType<typeof FormDesign>>(); | ||||
| // 流程设计组件引用 | ||||
| const processDesignRef = ref<InstanceType<typeof ProcessDesign>>(); | ||||
| // 更多设置组件引用 | ||||
| const extraSettingRef = ref<InstanceType<typeof ExtraSetting>>(); | ||||
| 
 | ||||
| /** 步骤校验函数 */ | ||||
| const validateBasic = async () => { | ||||
|  | @ -71,13 +74,18 @@ const validateProcess = async () => { | |||
|   await processDesignRef.value?.validate(); | ||||
| }; | ||||
| 
 | ||||
| /** 更多设置校验 */ | ||||
| const validateExtra = async () => { | ||||
|   await extraSettingRef.value?.validate(); | ||||
| }; | ||||
| 
 | ||||
| const currentStep = ref(-1); // 步骤控制。-1 用于,一开始全部不展示等当前页面数据初始化完成 | ||||
| 
 | ||||
| const steps = [ | ||||
|   { title: '基本信息', validator: validateBasic }, | ||||
|   { title: '表单设计', validator: validateForm }, | ||||
|   { title: '流程设计', validator: validateProcess }, | ||||
|   { title: '更多设置', validator: null }, | ||||
|   { title: '更多设置', validator: validateExtra }, | ||||
| ]; | ||||
| 
 | ||||
| // 表单数据 | ||||
|  | @ -190,8 +198,8 @@ const initData = async () => { | |||
|   // 最终,设置 currentStep 切换到第一步 | ||||
|   currentStep.value = 0; | ||||
| 
 | ||||
|   // TODO 兼容,以前未配置更多设置的流程 | ||||
|   // extraSettingsRef.value.initData() | ||||
|   // 以前未配置更多设置的流程 | ||||
|   extraSettingRef.value?.initData(); | ||||
| }; | ||||
| 
 | ||||
| /** 根据类型切换流程数据 */ | ||||
|  | @ -237,7 +245,13 @@ const validateAllSteps = async () => { | |||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   // TODO 更多设置校验 | ||||
|   // 更多设置校验 | ||||
|   try { | ||||
|     await validateExtra(); | ||||
|   } catch { | ||||
|     currentStep.value = 3; | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   return true; | ||||
| }; | ||||
|  | @ -345,6 +359,9 @@ const handleStepClick = async (index: number) => { | |||
|     if (index !== 2) { | ||||
|       await validateProcess(); | ||||
|     } | ||||
|     if (index !== 3) { | ||||
|       await validateExtra(); | ||||
|     } | ||||
|     // 切换步骤 | ||||
|     currentStep.value = index; | ||||
|   } catch (error) { | ||||
|  | @ -475,8 +492,10 @@ onBeforeUnmount(() => { | |||
|             ref="processDesignRef" | ||||
|           /> | ||||
| 
 | ||||
|           <!-- 第四步:更多设置 TODO --> | ||||
|           <div v-if="currentStep === 3" class="mx-auto w-4/6"></div> | ||||
|           <!-- 第四步:更多设置 --> | ||||
|           <div v-if="currentStep === 3" class="mx-auto w-4/6"> | ||||
|             <ExtraSetting v-model="formData" ref="extraSettingRef" /> | ||||
|           </div> | ||||
|         </div> | ||||
|       </Card> | ||||
|     </div> | ||||
|  |  | |||
|  | @ -0,0 +1,498 @@ | |||
| <script setup lang="ts"> | ||||
| import { computed, ref, watch } from 'vue'; | ||||
| 
 | ||||
| import { CircleHelp } from '@vben/icons'; | ||||
| 
 | ||||
| import { | ||||
|   Checkbox, | ||||
|   Col, | ||||
|   Form, | ||||
|   FormItem, | ||||
|   Input, | ||||
|   InputNumber, | ||||
|   Mentions, | ||||
|   Radio, | ||||
|   RadioGroup, | ||||
|   Row, | ||||
|   Select, | ||||
|   Switch, | ||||
|   Tooltip, | ||||
|   TypographyText, | ||||
| } from 'ant-design-vue'; | ||||
| import dayjs from 'dayjs'; | ||||
| 
 | ||||
| import * as FormApi from '#/api/bpm/form'; | ||||
| import { | ||||
|   HttpRequestSetting, | ||||
|   parseFormFields, | ||||
| } from '#/components/simple-process-design'; | ||||
| import { ProcessVariableEnum } from '#/utils'; | ||||
| import { BpmAutoApproveType, BpmModelFormType } from '#/utils/constants'; | ||||
| 
 | ||||
| const modelData = defineModel<any>(); | ||||
| 
 | ||||
| /** 自定义 ID 流程编码 */ | ||||
| const timeOptions = ref([ | ||||
|   { | ||||
|     value: '', | ||||
|     label: '无', | ||||
|   }, | ||||
|   { | ||||
|     value: 'DAY', | ||||
|     label: '精确到日', | ||||
|   }, | ||||
|   { | ||||
|     value: 'HOUR', | ||||
|     label: '精确到时', | ||||
|   }, | ||||
|   { | ||||
|     value: 'MINUTE', | ||||
|     label: '精确到分', | ||||
|   }, | ||||
|   { | ||||
|     value: 'SECOND', | ||||
|     label: '精确到秒', | ||||
|   }, | ||||
| ]); | ||||
| const numberExample = computed(() => { | ||||
|   if (modelData.value.processIdRule.enable) { | ||||
|     let infix = ''; | ||||
|     switch (modelData.value.processIdRule.infix) { | ||||
|       case 'DAY': { | ||||
|         infix = dayjs().format('YYYYMMDD'); | ||||
|         break; | ||||
|       } | ||||
|       case 'HOUR': { | ||||
|         infix = dayjs().format('YYYYMMDDHH'); | ||||
|         break; | ||||
|       } | ||||
|       case 'MINUTE': { | ||||
|         infix = dayjs().format('YYYYMMDDHHmm'); | ||||
|         break; | ||||
|       } | ||||
|       case 'SECOND': { | ||||
|         infix = dayjs().format('YYYYMMDDHHmmss'); | ||||
|         break; | ||||
|       } | ||||
|       default: { | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|     return ( | ||||
|       modelData.value.processIdRule.prefix + | ||||
|       infix + | ||||
|       modelData.value.processIdRule.postfix + | ||||
|       '1'.padStart(modelData.value.processIdRule.length - 1, '0') | ||||
|     ); | ||||
|   } else { | ||||
|     return ''; | ||||
|   } | ||||
| }); | ||||
| 
 | ||||
| /** 是否开启流程前置通知 */ | ||||
| const processBeforeTriggerEnable = ref(false); | ||||
| const handleProcessBeforeTriggerEnableChange = ( | ||||
|   val: boolean | number | string, | ||||
| ) => { | ||||
|   modelData.value.processBeforeTriggerSetting = val | ||||
|     ? { | ||||
|         url: '', | ||||
|         header: [], | ||||
|         body: [], | ||||
|         response: [], | ||||
|       } | ||||
|     : null; | ||||
| }; | ||||
| 
 | ||||
| /** 是否开启流程后置通知 */ | ||||
| const processAfterTriggerEnable = ref(false); | ||||
| const handleProcessAfterTriggerEnableChange = ( | ||||
|   val: boolean | number | string, | ||||
| ) => { | ||||
|   modelData.value.processAfterTriggerSetting = val | ||||
|     ? { | ||||
|         url: '', | ||||
|         header: [], | ||||
|         body: [], | ||||
|         response: [], | ||||
|       } | ||||
|     : null; | ||||
| }; | ||||
| 
 | ||||
| /** 是否开启任务前置通知 */ | ||||
| const taskBeforeTriggerEnable = ref(false); | ||||
| const handleTaskBeforeTriggerEnableChange = ( | ||||
|   val: boolean | number | string, | ||||
| ) => { | ||||
|   modelData.value.taskBeforeTriggerSetting = val | ||||
|     ? { | ||||
|         url: '', | ||||
|         header: [], | ||||
|         body: [], | ||||
|         response: [], | ||||
|       } | ||||
|     : null; | ||||
| }; | ||||
| 
 | ||||
| /** 是否开启任务后置通知 */ | ||||
| const taskAfterTriggerEnable = ref(false); | ||||
| const handleTaskAfterTriggerEnableChange = (val: boolean | number | string) => { | ||||
|   modelData.value.taskAfterTriggerSetting = val | ||||
|     ? { | ||||
|         url: '', | ||||
|         header: [], | ||||
|         body: [], | ||||
|         response: [], | ||||
|       } | ||||
|     : null; | ||||
| }; | ||||
| 
 | ||||
| /** 表单选项 */ | ||||
| const formField = ref<Array<{ field: string; title: string }>>([]); | ||||
| const formFieldOptions4Title = computed(() => { | ||||
|   const cloneFormField = formField.value.map((item) => { | ||||
|     return { | ||||
|       label: item.title, | ||||
|       value: item.field, | ||||
|     }; | ||||
|   }); | ||||
|   // 固定添加发起人 ID 字段 | ||||
|   cloneFormField.unshift({ | ||||
|     label: '流程名称', | ||||
|     value: ProcessVariableEnum.PROCESS_DEFINITION_NAME, | ||||
|   }); | ||||
|   cloneFormField.unshift({ | ||||
|     label: '发起时间', | ||||
|     value: ProcessVariableEnum.START_TIME, | ||||
|   }); | ||||
|   cloneFormField.unshift({ | ||||
|     label: '发起人', | ||||
|     value: ProcessVariableEnum.START_USER_ID, | ||||
|   }); | ||||
|   return cloneFormField; | ||||
| }); | ||||
| const formFieldOptions4Summary = computed(() => { | ||||
|   return formField.value.map((item) => { | ||||
|     return { | ||||
|       label: item.title, | ||||
|       value: item.field, | ||||
|     }; | ||||
|   }); | ||||
| }); | ||||
| 
 | ||||
| /** 兼容以前未配置更多设置的流程 */ | ||||
| const initData = () => { | ||||
|   if (!modelData.value.processIdRule) { | ||||
|     modelData.value.processIdRule = { | ||||
|       enable: false, | ||||
|       prefix: '', | ||||
|       infix: '', | ||||
|       postfix: '', | ||||
|       length: 5, | ||||
|     }; | ||||
|   } | ||||
|   if (!modelData.value.autoApprovalType) { | ||||
|     modelData.value.autoApprovalType = BpmAutoApproveType.NONE; | ||||
|   } | ||||
|   if (!modelData.value.titleSetting) { | ||||
|     modelData.value.titleSetting = { | ||||
|       enable: false, | ||||
|       title: '', | ||||
|     }; | ||||
|   } | ||||
|   if (!modelData.value.summarySetting) { | ||||
|     modelData.value.summarySetting = { | ||||
|       enable: false, | ||||
|       summary: [], | ||||
|     }; | ||||
|   } | ||||
|   if (modelData.value.processBeforeTriggerSetting) { | ||||
|     processBeforeTriggerEnable.value = true; | ||||
|   } | ||||
|   if (modelData.value.processAfterTriggerSetting) { | ||||
|     processAfterTriggerEnable.value = true; | ||||
|   } | ||||
|   if (modelData.value.taskBeforeTriggerSetting) { | ||||
|     taskBeforeTriggerEnable.value = true; | ||||
|   } | ||||
|   if (modelData.value.taskAfterTriggerSetting) { | ||||
|     taskAfterTriggerEnable.value = true; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** 监听表单 ID 变化,加载表单数据 */ | ||||
| watch( | ||||
|   () => modelData.value.formId, | ||||
|   async (newFormId) => { | ||||
|     if (newFormId && modelData.value.formType === BpmModelFormType.NORMAL) { | ||||
|       const data = await FormApi.getFormDetail(newFormId); | ||||
|       const result: Array<{ field: string; title: string }> = []; | ||||
|       if (data.fields) { | ||||
|         data.fields.forEach((fieldStr: string) => { | ||||
|           parseFormFields(JSON.parse(fieldStr), result); | ||||
|         }); | ||||
|       } | ||||
|       formField.value = result; | ||||
|     } else { | ||||
|       formField.value = []; | ||||
|     } | ||||
|   }, | ||||
|   { immediate: true }, | ||||
| ); | ||||
| // 表单引用 | ||||
| const formRef = ref(); | ||||
| /** 表单校验 */ | ||||
| const validate = async () => { | ||||
|   await formRef.value?.validate(); | ||||
| }; | ||||
| 
 | ||||
| defineExpose({ initData, validate }); | ||||
| </script> | ||||
| <template> | ||||
|   <Form | ||||
|     ref="formRef" | ||||
|     :model="modelData" | ||||
|     :label-col="{ span: 4 }" | ||||
|     :wrapper-col="{ span: 20 }" | ||||
|     class="mt-5 px-5" | ||||
|   > | ||||
|     <FormItem class="mb-5" label="提交人权限"> | ||||
|       <div class="mt-1 flex flex-col"> | ||||
|         <Checkbox v-model:checked="modelData.allowCancelRunningProcess"> | ||||
|           允许撤销审批中的申请 | ||||
|         </Checkbox> | ||||
|         <div class="ml-6"> | ||||
|           <TypographyText type="warning"> | ||||
|             第一个审批节点通过后,提交人仍可撤销申请 | ||||
|           </TypographyText> | ||||
|         </div> | ||||
|       </div> | ||||
|     </FormItem> | ||||
|     <FormItem v-if="modelData.processIdRule" class="mb-5" label="流程编码"> | ||||
|       <Row :gutter="8" align="middle"> | ||||
|         <Col :span="1"> | ||||
|           <Checkbox v-model:checked="modelData.processIdRule.enable" /> | ||||
|         </Col> | ||||
|         <Col :span="5"> | ||||
|           <Input | ||||
|             v-model:value="modelData.processIdRule.prefix" | ||||
|             placeholder="前缀" | ||||
|             :disabled="!modelData.processIdRule.enable" | ||||
|           /> | ||||
|         </Col> | ||||
|         <Col :span="6"> | ||||
|           <Select | ||||
|             v-model:value="modelData.processIdRule.infix" | ||||
|             allow-clear | ||||
|             placeholder="中缀" | ||||
|             :disabled="!modelData.processIdRule.enable" | ||||
|             :options="timeOptions" | ||||
|           /> | ||||
|         </Col> | ||||
|         <Col :span="4"> | ||||
|           <Input | ||||
|             v-model:value="modelData.processIdRule.postfix" | ||||
|             placeholder="后缀" | ||||
|             :disabled="!modelData.processIdRule.enable" | ||||
|           /> | ||||
|         </Col> | ||||
|         <Col :span="4"> | ||||
|           <InputNumber | ||||
|             v-model:value="modelData.processIdRule.length" | ||||
|             :min="5" | ||||
|             :disabled="!modelData.processIdRule.enable" | ||||
|           /> | ||||
|         </Col> | ||||
|       </Row> | ||||
|       <div class="ml-6 mt-2" v-if="modelData.processIdRule.enable"> | ||||
|         <TypographyText type="success"> | ||||
|           编码示例:{{ numberExample }} | ||||
|         </TypographyText> | ||||
|       </div> | ||||
|     </FormItem> | ||||
|     <FormItem class="mb-5" label="自动去重"> | ||||
|       <div class="mt-1"> | ||||
|         <TypographyText class="mb-2 block"> | ||||
|           同一审批人在流程中重复出现时: | ||||
|         </TypographyText> | ||||
|         <RadioGroup v-model:value="modelData.autoApprovalType"> | ||||
|           <Row :gutter="[0, 8]"> | ||||
|             <Col :span="24"> | ||||
|               <Radio :value="0">不自动通过</Radio> | ||||
|             </Col> | ||||
|             <Col :span="24"> | ||||
|               <Radio :value="1"> | ||||
|                 仅审批一次,后续重复的审批节点均自动通过 | ||||
|               </Radio> | ||||
|             </Col> | ||||
|             <Col :span="24"> | ||||
|               <Radio :value="2">仅针对连续审批的节点自动通过</Radio> | ||||
|             </Col> | ||||
|           </Row> | ||||
|         </RadioGroup> | ||||
|       </div> | ||||
|     </FormItem> | ||||
|     <FormItem v-if="modelData.titleSetting" class="mb-5" label="标题设置"> | ||||
|       <div class="mt-1"> | ||||
|         <RadioGroup v-model:value="modelData.titleSetting.enable"> | ||||
|           <Row :gutter="[0, 8]"> | ||||
|             <Col :span="24"> | ||||
|               <Radio :value="false"> | ||||
|                 系统默认 | ||||
|                 <TypographyText type="success"> 展示流程名称 </TypographyText> | ||||
|               </Radio> | ||||
|             </Col> | ||||
|             <Col :span="24"> | ||||
|               <Radio :value="true"> | ||||
|                 <div class="inline-flex items-center"> | ||||
|                   自定义标题 | ||||
|                   <Tooltip | ||||
|                     title="输入字符 '{' 即可插入表单字段" | ||||
|                     placement="top" | ||||
|                   > | ||||
|                     <CircleHelp class="ml-1 size-4 text-gray-500" /> | ||||
|                   </Tooltip> | ||||
|                 </div> | ||||
|               </Radio> | ||||
|             </Col> | ||||
|           </Row> | ||||
|         </RadioGroup> | ||||
|         <div class="mt-2"> | ||||
|           <Mentions | ||||
|             v-if="modelData.titleSetting.enable" | ||||
|             v-model:value="modelData.titleSetting.title" | ||||
|             style="width: 100%; max-width: 600px" | ||||
|             type="textarea" | ||||
|             prefix="{" | ||||
|             split="}" | ||||
|             :options="formFieldOptions4Title" | ||||
|             placeholder="请插入表单字段(输入 '{' 可以选择表单字段)或输入文本" | ||||
|           /> | ||||
|         </div> | ||||
|       </div> | ||||
|     </FormItem> | ||||
|     <FormItem | ||||
|       v-if=" | ||||
|         modelData.summarySetting && | ||||
|         modelData.formType === BpmModelFormType.NORMAL | ||||
|       " | ||||
|       class="mb-5" | ||||
|       label="摘要设置" | ||||
|     > | ||||
|       <div class="mt-1"> | ||||
|         <RadioGroup v-model:value="modelData.summarySetting.enable"> | ||||
|           <Row :gutter="[0, 8]"> | ||||
|             <Col :span="24"> | ||||
|               <Radio :value="false"> | ||||
|                 系统默认 | ||||
|                 <TypographyText type="secondary"> | ||||
|                   展示表单前 3 个字段 | ||||
|                 </TypographyText> | ||||
|               </Radio> | ||||
|             </Col> | ||||
|             <Col :span="24"> | ||||
|               <Radio :value="true"> 自定义摘要 </Radio> | ||||
|             </Col> | ||||
|           </Row> | ||||
|         </RadioGroup> | ||||
|         <div class="mt-2"> | ||||
|           <Select | ||||
|             v-if="modelData.summarySetting.enable" | ||||
|             v-model:value="modelData.summarySetting.summary" | ||||
|             mode="multiple" | ||||
|             placeholder="请选择要展示的表单字段" | ||||
|             :options="formFieldOptions4Summary" | ||||
|           /> | ||||
|         </div> | ||||
|       </div> | ||||
|     </FormItem> | ||||
|     <FormItem class="mb-5" label="流程前置通知"> | ||||
|       <Row class="mt-1"> | ||||
|         <Col :span="24"> | ||||
|           <div class="flex items-center"> | ||||
|             <Switch | ||||
|               v-model:checked="processBeforeTriggerEnable" | ||||
|               @change="handleProcessBeforeTriggerEnableChange" | ||||
|             /> | ||||
|             <span class="ml-4">流程启动后通知</span> | ||||
|           </div> | ||||
|         </Col> | ||||
|       </Row> | ||||
|       <Row v-if="processBeforeTriggerEnable"> | ||||
|         <Col :span="24" class="mt-6"> | ||||
|           <HttpRequestSetting | ||||
|             v-model:setting="modelData.processBeforeTriggerSetting" | ||||
|             :response-enable="true" | ||||
|             form-item-prefix="processBeforeTriggerSetting" | ||||
|           /> | ||||
|         </Col> | ||||
|       </Row> | ||||
|     </FormItem> | ||||
|     <FormItem class="mb-5" label="流程后置通知"> | ||||
|       <Row class="mt-1"> | ||||
|         <Col :span="24"> | ||||
|           <div class="flex items-center"> | ||||
|             <Switch | ||||
|               v-model:checked="processAfterTriggerEnable" | ||||
|               @change="handleProcessAfterTriggerEnableChange" | ||||
|             /> | ||||
|             <span class="ml-4">流程结束后通知</span> | ||||
|           </div> | ||||
|         </Col> | ||||
|       </Row> | ||||
|       <Row v-if="processAfterTriggerEnable" class="mt-2"> | ||||
|         <Col :span="24"> | ||||
|           <HttpRequestSetting | ||||
|             v-model:setting="modelData.processAfterTriggerSetting" | ||||
|             :response-enable="true" | ||||
|             form-item-prefix="processAfterTriggerSetting" | ||||
|           /> | ||||
|         </Col> | ||||
|       </Row> | ||||
|     </FormItem> | ||||
|     <FormItem class="mb-5" label="任务前置通知"> | ||||
|       <Row class="mt-1"> | ||||
|         <Col :span="24"> | ||||
|           <div class="flex items-center"> | ||||
|             <Switch | ||||
|               v-model:checked="taskBeforeTriggerEnable" | ||||
|               @change="handleTaskBeforeTriggerEnableChange" | ||||
|             /> | ||||
|             <span class="ml-4">任务执行时通知</span> | ||||
|           </div> | ||||
|         </Col> | ||||
|       </Row> | ||||
|       <Row v-if="taskBeforeTriggerEnable" class="mt-2"> | ||||
|         <Col :span="24"> | ||||
|           <HttpRequestSetting | ||||
|             v-model:setting="modelData.taskBeforeTriggerSetting" | ||||
|             :response-enable="true" | ||||
|             form-item-prefix="taskBeforeTriggerSetting" | ||||
|           /> | ||||
|         </Col> | ||||
|       </Row> | ||||
|     </FormItem> | ||||
|     <FormItem class="mb-5" label="任务后置通知"> | ||||
|       <Row class="mt-1"> | ||||
|         <Col :span="24"> | ||||
|           <div class="flex items-center"> | ||||
|             <Switch | ||||
|               v-model:checked="taskAfterTriggerEnable" | ||||
|               @change="handleTaskAfterTriggerEnableChange" | ||||
|             /> | ||||
|             <span class="ml-4">任务结束后通知</span> | ||||
|           </div> | ||||
|         </Col> | ||||
|       </Row> | ||||
|       <Row v-if="taskAfterTriggerEnable" class="mt-2"> | ||||
|         <Col :span="24"> | ||||
|           <HttpRequestSetting | ||||
|             v-model:setting="modelData.taskAfterTriggerSetting" | ||||
|             :response-enable="true" | ||||
|             form-item-prefix="taskAfterTriggerSetting" | ||||
|           /> | ||||
|         </Col> | ||||
|       </Row> | ||||
|     </FormItem> | ||||
|   </Form> | ||||
| </template> | ||||
		Loading…
	
		Reference in New Issue
	
	 xingyu
						xingyu