Explorar o código

子节点逻辑修改

ye-zhaojia hai 1 día
pai
achega
6c4df7f139

+ 94 - 66
src/views/flow/designer/DesignerPropertyPanel.vue

@@ -9,71 +9,80 @@
         <el-input v-model="nodeName" @blur="updateNodeName" />
       </el-form-item>
       <template v-if="selectedNode.type === 'approval-node'">
-        <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="请选择审批角色"
-            style="width: 100%"
-          >
-            <el-option
-              v-for="role in roleList"
-              :key="role.id"
-              :label="role.roleName"
-              :value="role.roleCode"
+        <template v-if="!nodeProps.subNodesEnabled">
+          <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="请选择审批角色"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="role in roleList"
+                :key="role.id"
+                :label="role.roleName"
+                :value="role.roleCode"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="审批方式">
+            <el-select v-model="nodeProps.approveMode" placeholder="请选择" style="width: 100%">
+              <el-option label="或签(一人通过即可)" value="or" />
+              <el-option label="会签(全部通过)" value="and" />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <template #label>
+              审批时限
+              <el-tooltip placement="top" content="单位:小时,为空则不计算超时">
+                <el-icon style="margin-left: 4px; cursor: help;"><QuestionFilled /></el-icon>
+              </el-tooltip>
+            </template>
+            <el-input-number
+              v-model="nodeProps.timeoutHours"
+              :min="1"
+              :max="720"
+              :precision="0"
+              placeholder="不填表示无限制"
+              controls-position="right"
+              style="width: 100%"
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="审批方式">
-          <el-select v-model="nodeProps.approveMode" placeholder="请选择" style="width: 100%">
-            <el-option label="或签(一人通过即可)" value="or" />
-            <el-option label="会签(全部通过)" value="and" />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <template #label>
-            审批时限
-            <el-tooltip placement="top" content="单位:小时,为空则不计算超时">
-              <el-icon style="margin-left: 4px; cursor: help;"><QuestionFilled /></el-icon>
-            </el-tooltip>
-          </template>
-          <el-input-number
-            v-model="nodeProps.timeoutHours"
-            :min="1"
-            :max="720"
-            :precision="0"
-            placeholder="不填表示无限制"
-            controls-position="right"
-            style="width: 100%"
-          />
-        </el-form-item>
-        <el-form-item label="超时动作">
-          <el-select v-model="nodeProps.timeoutAction" placeholder="请选择" style="width: 100%">
-            <el-option label="提醒" value="remind" />
-            <el-option label="无" value="" />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <template #label>
-            审批时间字段
-            <el-tooltip placement="top" content="导入时按此字段的值作为该节点的审批时间,Excel 列名需与此一致">
-              <el-icon style="margin-left: 4px; cursor: help;"><QuestionFilled /></el-icon>
-            </el-tooltip>
-          </template>
-          <el-input v-model="nodeProps.approveTimeField" placeholder="如:审批时间" />
-        </el-form-item>
+          </el-form-item>
+          <el-form-item label="超时动作">
+            <el-select v-model="nodeProps.timeoutAction" placeholder="请选择" style="width: 100%">
+              <el-option label="提醒" value="remind" />
+              <el-option label="无" value="" />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <template #label>
+              审批时间字段
+              <el-tooltip placement="top" content="导入时按此字段的值作为该节点的审批时间,Excel 列名需与此一致">
+                <el-icon style="margin-left: 4px; cursor: help;"><QuestionFilled /></el-icon>
+              </el-tooltip>
+            </template>
+            <el-input v-model="nodeProps.approveTimeField" placeholder="如:审批时间" />
+          </el-form-item>
+        </template>
+        <template v-else>
+          <el-alert type="info" :closable="false" show-icon style="margin-bottom: 12px;">
+            <template #title>
+              已启用子节点,该节点的审批由子节点完成,无需配置审批对象。
+            </template>
+          </el-alert>
+        </template>
 
         <!-- 子节点配置 -->
         <el-form-item label="启用子节点">
@@ -116,7 +125,7 @@
                 <div class="row-info">
                   <div class="row-name">{{ sub.name || `子节点 ${index + 1}` }}</div>
                   <div class="row-role">
-                    {{ getRoleName(sub.assigneeValue) || '未设置审批角色' }}
+                    {{ getSubNodeAssigneeDisplay(sub) }}
                     <span v-if="sub.approveMode === 'and'"> · 会签</span>
                     <span v-else> · 或签</span>
                   </div>
@@ -150,7 +159,18 @@
               <el-form-item label="子节点名称">
                 <el-input v-model="nodeProps.subNodes[selectedSubNodeIndex].name" placeholder="如:初审" />
               </el-form-item>
-              <el-form-item label="审批角色">
+              <el-form-item label="审批对象类型">
+                <el-select
+                  v-model="nodeProps.subNodes[selectedSubNodeIndex].assigneeType"
+                  placeholder="请选择审批对象类型"
+                  style="width: 100%"
+                  @change="nodeProps.subNodes[selectedSubNodeIndex].assigneeValue = ''"
+                >
+                  <el-option label="审批角色" value="ROLE" />
+                  <el-option label="发起人自己" value="SELF" />
+                </el-select>
+              </el-form-item>
+              <el-form-item v-if="nodeProps.subNodes[selectedSubNodeIndex].assigneeType === 'ROLE'" label="审批角色">
                 <el-select
                   v-model="nodeProps.subNodes[selectedSubNodeIndex].assigneeValue"
                   filterable
@@ -321,6 +341,13 @@ function getRoleName(roleCode?: string): string {
   return role ? role.roleName : roleCode
 }
 
+function getSubNodeAssigneeDisplay(sub: any): string {
+  const type = sub.assigneeType || 'ROLE'
+  if (type === 'SELF') return '发起人自己'
+  if (type === 'USER') return sub.assigneeValue ? `指定用户:${sub.assigneeValue}` : '未设置指定用户'
+  return getRoleName(sub.assigneeValue) || '未设置审批角色'
+}
+
 function onSubNodesEnabledChange(enabled: boolean | string | number) {
   if (enabled && !Array.isArray(nodeProps.value.subNodes)) {
     nodeProps.value.subNodes = []
@@ -338,6 +365,7 @@ function addSubNode() {
   nodeProps.value.subNodes.push({
     id: generateSubNodeId(),
     name: '',
+    assigneeType: 'ROLE',
     assigneeValue: '',
     approveMode: 'or',
     timeoutHours: undefined,

+ 8 - 1
src/views/flow/designer/SubNodeDrawer.vue

@@ -24,7 +24,7 @@
               <div class="card-index">{{ index + 1 }}</div>
               <div class="card-info">
                 <div class="card-name">{{ sub.name || `子节点 ${index + 1}` }}</div>
-                <div class="card-role">{{ getRoleName(sub.assigneeValue) || '未设置审批角色' }}</div>
+                <div class="card-role">{{ getSubNodeAssigneeDisplay(sub) }}</div>
               </div>
               <div class="card-actions" @click.stop>
                 <el-icon class="delete-icon" @click="emit('remove', index)">
@@ -118,6 +118,13 @@ function getRoleName(roleCode?: string): string {
   return role ? role.roleName : roleCode
 }
 
+function getSubNodeAssigneeDisplay(sub: any): string {
+  const type = sub.assigneeType || 'ROLE'
+  if (type === 'SELF') return '发起人自己'
+  if (type === 'USER') return sub.assigneeValue ? `指定用户:${sub.assigneeValue}` : '未设置指定用户'
+  return getRoleName(sub.assigneeValue) || '未设置审批角色'
+}
+
 function computePosition() {
   if (!props.lf || !props.node?.id) return
   try {

+ 1 - 0
src/views/flow/designer/index.vue

@@ -130,6 +130,7 @@ function addSubNodeFromCanvas() {
   nodeProps.subNodes.push({
     id: generateSubNodeId(),
     name: '',
+    assigneeType: 'ROLE',
     assigneeValue: '',
     approveMode: 'or',
     timeoutHours: undefined,

+ 1 - 0
src/views/flow/designer/useFlowDesigner.ts

@@ -225,6 +225,7 @@ export function useFlowDesigner(lfContainer: Ref<HTMLDivElement | undefined>) {
         ? cloned.subNodes.map((s: any) => ({
             id: s.id || generateSubNodeId(),
             name: s.name || '',
+            assigneeType: s.assigneeType ?? 'ROLE',
             assigneeValue: s.assigneeValue ?? '',
             approveMode: s.approveMode ?? 'or',
             timeoutHours: s.timeoutHours ?? undefined,