Forráskód Böngészése

feat: 支持流程审批角色分配给自己

wuwenyi 1 hete
szülő
commit
51185a68b0

+ 13 - 2
src/views/flow/designer/DesignerPropertyPanel.vue

@@ -9,12 +9,23 @@
         <el-input v-model="nodeName" @blur="updateNodeName" />
       </el-form-item>
       <template v-if="selectedNode.type === 'approval-node'">
-        <el-form-item label="审批员工">
+        <el-form-item label="审批对象类型">
+          <el-select
+            v-model="nodeProps.assigneeType"
+            placeholder="请选择审批对象类型"
+            style="width: 100%"
+            @change="nodeProps.assigneeValue = ''"
+          >
+            <el-option label="审批角色" value="ROLE" />
+            <el-option label="发起人自己" value="SELF" />
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="nodeProps.assigneeType === 'ROLE'" label="审批角色">
           <el-select
             v-model="nodeProps.assigneeValue"
             filterable
             clearable
-            placeholder="请选择审批角色中的成员"
+            placeholder="请选择审批角色"
             style="width: 100%"
           >
             <el-option

+ 16 - 7
src/views/flow/designer/useFlowDesigner.ts

@@ -41,6 +41,7 @@ export function useFlowDesigner(lfContainer: Ref<HTMLDivElement | undefined>) {
     approveMode: 'or',
     timeoutHours: undefined as number | undefined,
     timeoutAction: 'remind',
+    approveTimeField: '',
     ccUsers: '',
   })
 
@@ -138,7 +139,7 @@ export function useFlowDesigner(lfContainer: Ref<HTMLDivElement | undefined>) {
       // 只保存当前节点类型相关的属性,避免不同类型节点属性互相污染
       const props: Record<string, any> = JSON.parse(JSON.stringify(defaultProps))
       if (type === 'approval-node') {
-        props.assigneeType = 'ROLE'
+        props.assigneeType = nodeProps.assigneeType ?? 'ROLE'
         props.assigneeValue = nodeProps.assigneeValue ?? ''
         props.approveMode = nodeProps.approveMode ?? 'or'
         props.timeoutHours = nodeProps.timeoutHours
@@ -158,14 +159,21 @@ export function useFlowDesigner(lfContainer: Ref<HTMLDivElement | undefined>) {
     Object.assign(nodeProps, getDefaultProps(data.type))
     // 兼容旧格式:approver + approveType -> 新格式
     if (data.type === 'approval-node') {
-      const assigneeType = 'ROLE'
+      const supportedTypes = ['ROLE', 'SELF']
+      let assigneeType = cloned.assigneeType ?? 'ROLE'
       let assigneeValue = cloned.assigneeValue ?? ''
       const approveMode = cloned.approveMode ?? cloned.approveType ?? 'or'
-      if (!cloned.assigneeValue && cloned.approver) {
+      if (!cloned.assigneeType && !cloned.assigneeValue && cloned.approver) {
+        assigneeType = 'ROLE'
         assigneeValue = cloned.approver
       }
-      // 旧数据中的 USER/SELF/LEADER 不再支持,统一清空让用户重新选择员工角色
-      if (cloned.assigneeType && cloned.assigneeType !== 'ROLE') {
+      // 当前设计器只支持 ROLE / SELF,其它旧类型降级为 ROLE 并清空值
+      if (!supportedTypes.includes(assigneeType)) {
+        assigneeType = 'ROLE'
+        assigneeValue = ''
+      }
+      // SELF 不需要审批角色值
+      if (assigneeType === 'SELF') {
         assigneeValue = ''
       }
       nodeProps.assigneeType = assigneeType
@@ -591,12 +599,13 @@ export function useFlowDesigner(lfContainer: Ref<HTMLDivElement | undefined>) {
     if (startNodes.length === 0) return '流程图缺少开始节点'
     if (endNodes.length === 0) return '流程图缺少结束节点'
     if (startNodes.length > 1) return '流程图只能有一个开始节点'
-    // 检查审批节点是否选择了审批角色
+    // 检查审批节点是否配置了审批对象
     for (const node of nodes) {
       if (node.type === 'approval-node' || node.type === 'approval') {
         const props = node.properties || {}
+        const assigneeType = props.assigneeType ?? 'ROLE'
         const assigneeValue = props.assigneeValue || props.approver
-        if (!assigneeValue) {
+        if (assigneeType === 'ROLE' && !assigneeValue) {
           return `审批节点 "${node.text || node.name}" 未选择审批角色`
         }
       }