① 基本信息
| 问题描述 | 外网侧提交后,审核人是自己 |
|---|---|
| 一级模块 | 实际并网流程 |
| 二级模块 | 实际并网审核 |
| 涉及类型 | 集中式新能源 |
| 严重性 | 严重 |
| 当前状态 | 2.1.待开发 |
| 研发处理人 | 何佳星 |
| 处理状态 | 待调整 |
② 问题截图
③ 旧代码涉及的项目文件及行数(backup730 分支)
xnybw5f / src/views/projectNew/components/actualInfo/components/tabItem.vue
第 415-533 行(提交实际并网流程:先弹出人员选择器 userSelect,随后 batchAuditFlow 中又用 cascadeQuery 结果覆盖人员选择)
④ 代码现状与修复方案
提交"编制→中调审核"(flowstatus == '2')时,前端先正常打开了一个人员选择弹窗,让用户手动挑选中调审核人:
if (flowstatus == '2') {
let params = {flowtype: flows.flowType, biz_id: flows.id, sendtype: "发送", flowstatus, company: this.plantItem.company};
this.$refs.userSelect.open({
params,
callback: result => {
if (result.action == 'OK') {
let params = { ..., userList: result.users, flowOpinion: result.flowopinion, oldFlowStatus: flowstatus, nextFlowStatus: result.flowstatus, id: flows.id }
this.batchAuditFlow({ dataList: [params] }); // 第438行:带着用户手选的userList进入batchAuditFlow
}
}
});
}
但在 batchAuditFlow() 内部,如果判断本次是"编制→中调审核"(oldFlowStatus == '2'),会再发起一次 cascadeQuery 请求,用其中的 todoUser/todoUserId 字段把刚才用户手动选择的 userList 整个覆盖掉:
if (data.dataList[0].oldFlowStatus == '2') {
projectActualApi.cascadeQuery({ id: resReId.data }).then(res => {
const todoUser = res.data.todoUser.split(',');
const todoUserId = res.data.todoUserId.split(',');
const userList = todoUser.map((item, index) => ({
USERALIAS: item, USERID: todoUserId[index], checked: true,
}))
data.dataList[0].userList = userList; // 第505行:覆盖了result.users人工选择的结果!
delete data.dataList[0].oldFlowStatus
projectActualApi.batchAuditFlow(data)... // 用被覆盖后的userList提交
})
}
cascadeQuery 返回的 todoUser/todoUserId,从命名和调用时机(提交前查询"当前记录关联的待办人")来看,更像是查询"当前这条记录眼下挂在谁的待办上",而在流程还没有真正流转之前,这条记录的待办人当然还是正在编制、准备提交的用户自己。这段代码把它误当成"提交后下一节点该指派给谁"来使用,把用户在弹窗里手动选好的中调审核人整个覆盖成了提交人自己,这正是"目标环节处理人=自己"这一现象的直接成因。
建议修复方式:提交到"中调审核"时不应该再用 cascadeQuery 的 todoUser 覆盖用户在人员选择弹窗里的选择,直接使用 userSelect 回调里 result.users 对应生成的 userList 即可:
if (data.dataList[0].oldFlowStatus == '2') { projectActualApi.cascadeQuery({ id: resReId.data }).then(res => { const todoUser = res.data.todoUser.split(','); const todoUserId = res.data.todoUserId.split(','); const userList = todoUser.map((item, index) => ({ USERALIAS: item, USERID: todoUserId[index], checked: true })) data.dataList[0].userList = userList; delete data.dataList[0].oldFlowStatus projectActualApi.batchAuditFlow(data)... }) } else { ... } // 直接沿用 userSelect 弹窗里用户手动选择的 userList,不再用 cascadeQuery 的 todoUser 覆盖 delete data.dataList[0].oldFlowStatus projectActualApi.batchAuditFlow(data)...
如果保留 cascadeQuery 调用另有其它必要副作用(如刷新 resReId/关联ID),应把它拆分为"仅取ID、不覆盖人员"的独立调用,避免人员数据被意外覆盖。