From 4ea25f3d5b35492a0633dead3f1f8b90232712cc Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Wed, 12 Feb 2025 13:57:10 +0800 Subject: [PATCH 01/15] =?UTF-8?q?feat:=20=E5=8A=9E=E7=90=86=E4=BA=BA?= =?UTF-8?q?=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/NodeHandler.vue | 12 +- .../src/ProcessNodeTree.vue | 6 +- .../SimpleProcessDesignerV2/src/consts.ts | 17 ++ .../SimpleProcessDesignerV2/src/node.ts | 2 +- .../src/nodes-config/UserTaskNodeConfig.vue | 234 ++++++++++-------- .../src/nodes/UserTaskNode.vue | 2 +- 6 files changed, 164 insertions(+), 109 deletions(-) diff --git a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue index b3f62340a..c97f77de3 100644 --- a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue +++ b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue @@ -15,6 +15,12 @@
审批人
+
+
+ +
+
办理人
+
@@ -114,13 +120,13 @@ const addNode = (type: number) => { } popoverShow.value = false - if (type === NodeType.USER_TASK_NODE) { + if (type === NodeType.USER_TASK_NODE || type === NodeType.TRANSACTOR_NODE) { const id = 'Activity_' + generateUUID() const data: SimpleFlowNode = { id: id, - name: NODE_DEFAULT_NAME.get(NodeType.USER_TASK_NODE) as string, + name: NODE_DEFAULT_NAME.get(type) as string, showText: '', - type: NodeType.USER_TASK_NODE, + type: type, approveMethod: ApproveMethodType.SEQUENTIAL_APPROVE, // 超时处理 rejectHandler: { diff --git a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue index 048764c1a..cdb540322 100644 --- a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue +++ b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue @@ -6,7 +6,11 @@ /> () NODE_DEFAULT_NAME.set(NodeType.USER_TASK_NODE, '审批人') @@ -515,6 +521,7 @@ 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, '办理人') // 候选人策略。暂时不从字典中取。 后续可能调整。控制显示顺序 export const CANDIDATE_STRATEGY: DictDataVO[] = [ @@ -627,6 +634,16 @@ export const DEFAULT_BUTTON_SETTING: ButtonSetting[] = [ { id: OperationButtonType.RETURN, displayName: '退回', enable: true } ] +// 办理人默认的按钮权限设置 +export const TRANSACTOR_DEFAULT_BUTTON_SETTING: ButtonSetting[] = [ + { id: OperationButtonType.APPROVE, displayName: '办理', enable: true }, + { id: OperationButtonType.REJECT, displayName: '拒绝', enable: false }, + { id: OperationButtonType.TRANSFER, displayName: '转办', enable: false }, + { id: OperationButtonType.DELEGATE, displayName: '委派', enable: false }, + { id: OperationButtonType.ADD_SIGN, displayName: '加签', enable: false }, + { id: OperationButtonType.RETURN, displayName: '退回', enable: false } +] + // 发起人的按钮权限。暂时定死,不可以编辑 export const START_USER_BUTTON_SETTING: ButtonSetting[] = [ { id: OperationButtonType.APPROVE, displayName: '提交', enable: true }, diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts index 407fd4837..e415dc124 100644 --- a/src/components/SimpleProcessDesignerV2/src/node.ts +++ b/src/components/SimpleProcessDesignerV2/src/node.ts @@ -201,7 +201,7 @@ export function useNodeForm(nodeType: NodeType) { const deptTreeOptions = inject('deptTree', ref()) // 部门树 const formFields = inject>('formFields', ref([])) // 流程表单字段 const configForm = ref() - if (nodeType === NodeType.USER_TASK_NODE) { + if (nodeType === NodeType.USER_TASK_NODE || nodeType === NodeType.TRANSACTOR_NODE) { configForm.value = { candidateStrategy: CandidateStrategy.USER, approveMethod: ApproveMethodType.SEQUENTIAL_APPROVE, diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue index ca55e3b95..01a3c990e 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue @@ -25,7 +25,7 @@
-
+
审批类型 : - 审批人拒绝时 - - -
-
- +
+ 审批人拒绝时 + + +
+
+ +
-
- - - - - - - - - 审批人超时未处理时 - - - - - + + - + + + +
+ +
+ 审批人超时未处理时 + + - - - - 当超过 - - + + + + + + + 当超过 + + + + + @change="timeUnitChange" + > + + + 未处理 - - - - 未处理 - - - - + + +
审批人为空时 @@ -348,30 +357,44 @@ - 审批人与提交人为同一人时 - - -
-
- +
+ 审批人与提交人为同一人时 + + +
+
+ +
-
- - + + +
- 是否需要签名 - - - +
+ 是否需要签名 + + + +
- 审批意见 - - - +
+ 审批意见 + + + +
- +
操作按钮
@@ -485,7 +508,8 @@ import { ASSIGN_EMPTY_HANDLER_TYPES, AssignEmptyHandlerType, FieldPermissionType, - ProcessVariableEnum + ProcessVariableEnum, + TRANSACTOR_DEFAULT_BUTTON_SETTING } from '../consts' import { @@ -588,7 +612,7 @@ const { handleCandidateParam, parseCandidateParam, getShowText -} = useNodeForm(NodeType.USER_TASK_NODE) +} = useNodeForm(currentNode.value.type) const configForm = tempConfigForm as Ref // 改变审批人设置策略 @@ -733,13 +757,13 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => { configForm.value.approveRatio = node.approveRatio! } // 2.3 设置审批拒绝处理 - configForm.value.rejectHandlerType = node.rejectHandler!.type + configForm.value.rejectHandlerType = node.rejectHandler?.type configForm.value.returnNodeId = node.rejectHandler?.returnNodeId const matchNodeList = [] emits('find:returnTaskNodes', matchNodeList) returnTaskList.value = matchNodeList // 2.4 设置审批超时处理 - configForm.value.timeoutHandlerEnable = node.timeoutHandler!.enable + configForm.value.timeoutHandlerEnable = node.timeoutHandler?.enable if (node.timeoutHandler?.enable && node.timeoutHandler?.timeDuration) { const strTimeDuration = node.timeoutHandler.timeDuration let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1) @@ -755,7 +779,11 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => { // 2.6 设置用户任务的审批人与发起人相同时 configForm.value.assignStartUserHandlerType = node.assignStartUserHandlerType // 3. 操作按钮设置 - buttonsSetting.value = cloneDeep(node.buttonsSetting) || DEFAULT_BUTTON_SETTING + buttonsSetting.value = + cloneDeep(node.buttonsSetting) || + (node.type === NodeType.TRANSACTOR_NODE + ? TRANSACTOR_DEFAULT_BUTTON_SETTING + : DEFAULT_BUTTON_SETTING) // 4. 表单字段权限配置 getNodeConfigFormFields(node.fieldsPermission) // 5. 监听器 @@ -773,7 +801,7 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => { header: node.taskAssignListener?.header ?? [], body: node.taskAssignListener?.body ?? [] } - // 5.3 完成任务 + // 5.3 完成任务 configForm.value.taskCompleteListenerEnable = node.taskCompleteListener?.enable configForm.value.taskCompleteListenerPath = node.taskCompleteListener?.path configForm.value.taskCompleteListener = { diff --git a/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue b/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue index 47ef540cc..eac24ce82 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue @@ -28,7 +28,7 @@ {{ currentNode.showText }}
- {{ NODE_DEFAULT_TEXT.get(NodeType.USER_TASK_NODE) }} + {{ NODE_DEFAULT_TEXT.get(currentNode.type) }}
-- Gitee From a190a0b409fa30249c05c5378ab8f9a904f2fbc5 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Wed, 12 Feb 2025 14:08:54 +0800 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20=E5=8A=9E=E7=90=86=E4=BA=BA?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E9=AB=98=E4=BA=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue | 3 ++- .../bpm/processInstance/detail/ProcessInstanceTimeline.vue | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue b/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue index 69fd70141..8d1d3fc6e 100644 --- a/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue +++ b/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue @@ -84,7 +84,8 @@ const setSimpleModelNodeTaskStatus = ( // 审批节点 if ( simpleModel.type === NodeType.START_USER_NODE || - simpleModel.type === NodeType.USER_TASK_NODE + simpleModel.type === NodeType.USER_TASK_NODE || + simpleModel.type === NodeType.TRANSACTOR_NODE ) { simpleModel.activityStatus = TaskStatusEnum.NOT_START if (rejectedTaskActivityIds.includes(simpleModel.id)) { diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue b/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue index fcd5ec899..6ec45675a 100644 --- a/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue +++ b/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue @@ -240,6 +240,8 @@ const nodeTypeSvgMap = { [NodeType.START_USER_NODE]: { color: '#909398', svg: starterSvg }, // 审批人节点 [NodeType.USER_TASK_NODE]: { color: '#ff943e', svg: auditorSvg }, + // 办理人节点 + [NodeType.TRANSACTOR_NODE]: { color: '#ff943e', svg: auditorSvg }, // 抄送人节点 [NodeType.COPY_TASK_NODE]: { color: '#3296fb', svg: copySvg }, // 条件分支节点 @@ -264,6 +266,7 @@ const getApprovalNodeIcon = (taskStatus: number, nodeType: NodeType) => { if ( nodeType === NodeType.START_USER_NODE || nodeType === NodeType.USER_TASK_NODE || + nodeType === NodeType.TRANSACTOR_NODE || nodeType === NodeType.END_EVENT_NODE ) { return statusIconMap[taskStatus]?.icon -- Gitee From 666fb16db5037a18ba382f0ae22cefc419e25902 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 12 Feb 2025 18:46:30 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9A=E5=8A=9E=E7=90=86=E4=BA=BA?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/vite/optimize.ts | 3 +- .../src/NodeHandler.vue | 5 ++- .../src/nodes-config/UserTaskNodeConfig.vue | 40 ++++++++++++++++--- .../detail/ProcessInstanceOperationButton.vue | 1 + .../detail/ProcessInstanceTimeline.vue | 3 +- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/build/vite/optimize.ts b/build/vite/optimize.ts index aa7e68c9c..9de496a30 100644 --- a/build/vite/optimize.ts +++ b/build/vite/optimize.ts @@ -114,7 +114,8 @@ const include = [ 'element-plus/es/components/segmented/style/css', '@element-plus/icons-vue', 'element-plus/es/components/footer/style/css', - 'element-plus/es/components/empty/style/css' + 'element-plus/es/components/empty/style/css', + 'element-plus/es/components/mention/style/css' ] const exclude = ['@iconify/json'] diff --git a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue index c97f77de3..0dcd63e4d 100644 --- a/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue +++ b/src/components/SimpleProcessDesignerV2/src/NodeHandler.vue @@ -15,6 +15,7 @@
审批人
+
@@ -63,7 +64,7 @@
触发器
-
+
@@ -84,7 +85,7 @@ import { SimpleFlowNode, DEFAULT_CONDITION_GROUP_VALUE } from './consts' -import {generateUUID} from '@/utils' +import { generateUUID } from '@/utils' defineOptions({ name: 'NodeHandler' diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue index 01a3c990e..b0d10ff07 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue @@ -1,3 +1,4 @@ +