① 基本信息
| 问题描述 | 并网资料提交后,因为存在三五区数据同步的等待时间,互联网提交后页面仍然存在提交权限(建议在提交后增加一个loading页) |
|---|---|
| 一级模块 | 并网资料流程 |
| 二级模块 | 并网资料流程 |
| 涉及类型 | 全部类型 |
| 所属区域 | 五区 |
| 严重性 | 一般 |
| 当前状态 | 2.1.待开发 |
| 研发处理人 | 陈键泽 |
| 处理说明 | 待调整 |
② 问题截图
③ 旧代码涉及的项目文件及行数
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 触发的跨三/五区异步同步窗口。修复方案分两层:
- 延长既有 loading 的生命周期:把
this.loading = false挪到refreshInformationFlow()(重新拉取该行最新流程状态)完成之后再执行,让遮罩多停留一段时间,直到页面上展示的状态确实是同步后的最新值; - 行级按钮禁用:新增
row.submitPending标记,提交发起后立即置 true,绑定到"提交"按钮的:disabled,从交互上物理阻止用户在该行状态刷新完成前重复点击,而不仅仅依赖视觉上的 loading 遮罩; - 顺带修复了
cascadeQuery请求失败分支遗漏重置this.loading的问题(会导致遮罩卡死,需要刷新页面才能恢复),一并在本次修改中处理。
该方案不涉及后端接口改造,纯前端状态管理调整,风险可控,建议随下一版本一起排期。