生成时间: 2026-08-02 · 数据来源: xnybw平台需求及工作计划.xlsx(南网在线绿能云缺陷跟踪表)· 仅针对 backup730/730backup 分支代码

① 基本信息

问题描述并网资料提交后,因为存在三五区数据同步的等待时间,互联网提交后页面仍然存在提交权限(建议在提交后增加一个loading页)
一级模块并网资料流程
二级模块并网资料流程
涉及类型全部类型
所属区域五区
严重性一般
当前状态2.1.待开发
研发处理人陈键泽
处理说明待调整

② 问题截图

并网资料审批确认弹窗
点击"提交"后弹出"请确认是否同意所选资料通过审批?"确认框,确认后触发跨三/五区的流程流转,期间该行"提交"按钮未进入禁用/loading态

③ 旧代码涉及的项目文件及行数

xnybw5f / src/views/projectNew/components/baseInfo/components/batchInfo.vue 第 2 行(组件级 v-loading 声明);第 3224-3288 行 submitFlow 方法中"专业领导审批"分支(与截图弹窗文案完全一致)
<div v-loading="loading" element-loading-text="正在处理数据,请稍后..." class="batch-info-container">
  ...

submitFlow(row, rowIndex, item) {
  ...
  if ((row.informationFlow && row.informationFlow.taskName === '专业领导审批') || ...) {
    this.$confirm('请确认是否同意所选资料通过审批?', '提示', {
      confirmButtonText: '同意', cancelButtonText: '取消', type: 'warning'
    }).then(() => {
      this.loading = true                          // 只锁住整个组件短暂的接口请求区间
      projectGridApi.cascadeQuery({ id: row.bwzlReId }).then(ress => {
        soWorkFlowEvent.send(true, ress.data, '/th-new-energy-grid-three-web', '同意', async () => {
          // 内部经由 cloudDesktopLoadTodoVO 触发三/五区之间的数据交互,
          // 这一步存在真实的跨区数据同步延迟
          ...
        }).then((res) => {
          if (res) {
            approvalApi.sendTask(param).then(async res => {
              this.loading = false                  // 接口一返回就立即关闭loading,
                                                       // 不等待下游三/五区同步真正完成
              this.refreshInformationFlow()
            }).catch((error) => { ...; this.loading = false })
          }
        }).catch(err => { this.loading = false })
      }).catch((error) => {
        console.log('查询数据错误异常', error)        // 注意:cascadeQuery失败时未重置this.loading,
                                                       // 是另一处潜在的loading卡死风险,与本条问题相关但非本条核心
      })
    }).catch(() => {})
  } else {
    this.sendLoading = true                          // 非"专业领导审批"分支才会锁住按钮自身的loading态
    this.loading = true
    ...
  }
}
关键点:this.loading 绑定的是整个 batchInfo.vue 组件容器的 v-loading 遮罩,理论上应该能阻止用户在请求期间继续点击;但它只覆盖"发起请求 → 接口返回"这一段很短的时间窗口(approvalApi.sendTask.then 回调里立刻 this.loading = false),并不覆盖截图弹窗描述的"三/五区数据同步等待时间"——这段同步发生在接口返回之后、下游异步生效之前。this.loading 关闭后遮罩消失,此时同步尚未完成,行的"状态/当前处理人"仍是旧值,用户看到的仍是"可以提交"的样子,从而具备了重复点击的条件。

④ 修复代码涉及的项目文件及行数

xnybw5f / src/views/projectNew/components/baseInfo/components/batchInfo.vue 第 3257-3288 行 submitFlow "专业领导审批"分支:延长 loading 覆盖区间 + 提交后短暂禁用整行操作
this.$confirm('请确认是否同意所选资料通过审批?', '提示', {...}).then(() => {
  this.loading = true
  this.$set(row, 'submitPending', true)   // 新增:标记该行"提交处理中"
  projectGridApi.cascadeQuery({ id: row.bwzlReId }).then(ress => {
    soWorkFlowEvent.send(true, ress.data, '/th-new-energy-grid-three-web', '同意', async () => { ... })
      .then((res) => {
        if (res) {
          approvalApi.sendTask(param).then(async res => {
-           this.loading = false
-           this.refreshInformationFlow()
+           await this.refreshInformationFlow()   // 等刷新到最新的流程状态/当前处理人后再关闭loading
+           this.loading = false
+           this.$set(row, 'submitPending', false)
          }).catch((error) => {
            this.$message.error('调用接口出错:' + error)
            this.loading = false
            this.$set(row, 'submitPending', false)
          })
        }
      })
  }).catch((error) => {
    console.log('查询数据错误异常', error)
+   this.loading = false           // 补上异常分支的loading复位,避免卡死
+   this.$set(row, 'submitPending', false)
  })
})
xnybw5f / src/views/projectNew/components/baseInfo/components/batchInfo.vue 第 494/502 行"提交"按钮:叠加 submitPending 禁用态
<th-button v-if="!scope.row.folderFlag && allButtonShow && (...)" type="text"
-          :loading="sendLoading" @click="submitFlow(scope.row, scope.$index, infoItem)">提交</th-button>
+          :loading="sendLoading || scope.row.submitPending"
+          :disabled="scope.row.submitPending"
+          @click="submitFlow(scope.row, scope.$index, infoItem)">提交</th-button>

⑤ 修复方案

本条属于"填报需求"类的体验优化(严重性=一般,不阻断流程),核心诉求是"提交动作发出后到跨区数据真正同步完成之前,页面应该明确处于不可再次提交的等待态"。结合代码定位,问题不是完全没有 loading 机制,而是现有 this.loading 只覆盖了 HTTP 请求本身的往返时间,没有覆盖 soWorkFlowEvent.send 触发的跨三/五区异步同步窗口。修复方案分两层:

  1. 延长既有 loading 的生命周期:把 this.loading = false 挪到 refreshInformationFlow()(重新拉取该行最新流程状态)完成之后再执行,让遮罩多停留一段时间,直到页面上展示的状态确实是同步后的最新值;
  2. 行级按钮禁用:新增 row.submitPending 标记,提交发起后立即置 true,绑定到"提交"按钮的 :disabled,从交互上物理阻止用户在该行状态刷新完成前重复点击,而不仅仅依赖视觉上的 loading 遮罩;
  3. 顺带修复了 cascadeQuery 请求失败分支遗漏重置 this.loading 的问题(会导致遮罩卡死,需要刷新页面才能恢复),一并在本次修改中处理。
该方案不涉及后端接口改造,纯前端状态管理调整,风险可控,建议随下一版本一起排期。