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

"关联规划项目"弹窗可查全网数据,未按联系人电话与登录人匹配(Excel第4行)

类型:数据问题  严重性:严重  状态:5.1.已关闭(复测通过)

基本信息

问题描述项目基本信息表单页面的"关联规划项目"按钮,点击进入后可以查询到全网的数据,没有做权限控制,需要根据规划项目信息中的"联系人电话"字段与当前登录人电话进行匹配,匹配成功才可以展示出来
一级模块项目信息填报
二级模块/
涉及类型全部类型
是否阻断流程
处理人员洪陈解
复测情况复测通过

问题截图

row4 截图1
图1:"关联规划项目"弹窗数据列表

旧代码涉及的项目文件及行数(backup730/730backup)

前端弹窗组件:xnybw5f / backup730 / src/views/projectNew/components/baseInfo/dialog/planRelationSelector.vue
· 第280-297行:表格列 prop="iphone",直接渲染 scope.row.iphone(联系人电话),但 searchForm 中从未包含任何"当前登录人电话"字段
· 第440行:_getDataList() 调用 projectOrtherApi.getApplicationDataList(this.searchForm),searchForm 只有 provinces/municipal/type/voltageClasses/capacityKw/keyword,没有电话匹配参数
后端接口:xnybw5b / 730backup / src/main/java/cn/csg/so/oms/in/newenergy/project/controller/NePcPspNewNodeController.java 第66-79行:getApplicationDataList(PcPspParam pcPspParam)
· src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/NePcPspNewGridApplicationAppService.java 第46-97行:getApplicationDataList():  - 第83行 params.put("iphone", pcPspParam.getIphone()) —— iphone 过滤值来自**客户端请求体**而不是服务端登录会话(UserUtils.getUser()),且前端从不传该字段,等效于该过滤永远不生效
 - 第94行 records.forEach(o->o.setIphone("***********")) —— 返回前把手机号打码,说明后端其实知道这是敏感字段,但只做了"脱敏展示",没做"按手机号收口查询范围"

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

NePcPspNewGridApplicationAppService.java 第46-52行 getApplicationDataList() 方法入口

修复方案

根本原因:手机号匹配这层"是否只让我看跟我相关的规划项目"的过滤条件,设计上是可选的、且取值来自客户端请求体(pcPspParam.getIphone()),前端页面又从未真正填充这个字段,等于该权限过滤形同虚设——任何互联网登录用户打开"关联规划项目"弹窗都能看到全部规划项目的名称、地市、联系人电话等信息。

public IPage<NePcPspGridAppVO> getApplicationDataList(PcPspParam pcPspParam) {
    ...
    Map<String, Object> params = new HashMap<>();
    params.put("projectName", pcPspParam.getProjectName());
    ...
    // 修复:iphone 不再信任客户端传参,强制取自当前登录会话
    String currentUserPhone = UserUtils.getUser().getPhone();
    params.put("iphone", currentUserPhone);
    params.put("iphone", pcPspParam.getIphone());
    ...
}

同时 Mapper(NePcPspGridAppVO_selectApplicationPage / _selectApplicationCount)中 iphone 对应的 <if> 条件需要改为强制 AND CONTACT_PHONE = #{iphone}(非 <if test="iphone != null"> 可选片段),避免服务端仍然允许"不传即不过滤"。

前端 planRelationSelector.vue 无需再自行传手机号(改由后端会话获取),但需要在"暂无规划项目"兜底展示逻辑(第440-451行)中同步说明:匹配不到时应展示"暂无与您匹配的规划项目"而非空白列表,避免用户误以为系统故障。

该问题的字段设计(iphone 来自客户端请求体而非服务端会话)与 row3、row5、row9、row17 反映的是同一类"信任前端传参而非服务端强制收口"的权限设计缺陷,建议作为一类问题统一排查同一 appservice 包下其它接口。