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

① 基本信息

问题描述外网侧提交后,审核人是自己
一级模块实际并网流程
二级模块实际并网审核
涉及类型集中式新能源
严重性严重
当前状态2.1.待开发
研发处理人何佳星
处理状态待调整

② 问题截图

流程信息弹窗,编制→中调审核目标处理人是自己
"流程信息"弹窗第2条记录:环节"编制→中调审核","目标环节处理人"仍显示提交人自己的手机号"18675159263",而不是真正的中调审核人

③ 旧代码涉及的项目文件及行数(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,从命名和调用时机(提交前查询"当前记录关联的待办人")来看,更像是查询"当前这条记录眼下挂在谁的待办上",而在流程还没有真正流转之前,这条记录的待办人当然还是正在编制、准备提交的用户自己。这段代码把它误当成"提交后下一节点该指派给谁"来使用,把用户在弹窗里手动选好的中调审核人整个覆盖成了提交人自己,这正是"目标环节处理人=自己"这一现象的直接成因。

建议修复方式:提交到"中调审核"时不应该再用 cascadeQuerytodoUser 覆盖用户在人员选择弹窗里的选择,直接使用 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、不覆盖人员"的独立调用,避免人员数据被意外覆盖。