| 问题描述 | 列表需要有20条数据,分页栏只展示17条数据;集中式已投产查询出来列表有3条数据,分页栏展示0条。 |
| 所属模块 | 项目信息填报 |
| 严重程度 | 严重(阻断流程:否) |
| 涉及类型 | 全部类型 |
| 提出人 | 刘向诚 |
| 处理人 / 状态 | 周小龙 / 5.1.已关闭(复测通过) |


前端 total 与 list 同源赋值:xnybw5f · src/views/projectNew/utils/ListDataUtils.js 第 139-156 行:
ListDataUtils.listDataInit = (response) => {
let elTableData = { list: [], pages:0, current: 0, size: 20, total: 0 }
if (response.code == 200 || response.code == 0) {
elTableData.list = response.data.records // 列表数据
elTableData.total = response.data.total // 分页总数——与 list 来自同一个 IPage 响应体
}
return elTableData
}
后端 xnybw5b · src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/ProjectImplAppService.java 第 220-320 行 selectAll():list 和 total 分别来自两条独立维护的 SQL:
// 总记录数:走独立的 selectOne 查询
total = (Long) getCapBaseCommonDAO().selectOne(
"cn.csg.so.oms.in.newenergy.project.model.NePjImplVO_selectAllCount", param);
// 分页数据:走独立的分页查询
records = getCapBaseCommonDAO().queryList(
"cn.csg.so.oms.in.newenergy.project.model.NePjImplVO_selectAll",
param, param.getPageNum(), param.getPageSize());
IPage<NePjImplVO> queryVoPage = new cn.csg.so.oms.in.newenergy.common.page.Page<>(
param.getPageNum(), param.getPageSize(), total, records);
xnybw5b · .../dbconfig/NePjImplSQL_mysql.xml 中 NePjImplVO_selectAll(第161行起)与 NePjImplVO_selectAllCount(第324行起)是两段各约 80 行、独立手写维护的动态 SQL,过滤条件(provinces/municipals/types/typeSql/tj/projectStatus/adjustStatus/keyword…)几乎逐条复制:
-- selectAll 的数据来源子查询(带窗口函数,用于按 plan_name 分组取最新记录排序)
select t.*, max(create_time) over (partition by plan_name) as group_latest
from so_in_ne_pj_impl t where t.p_status in ('3','4','5')
-- selectAllCount 的数据来源子查询(普通过滤,无窗口函数)
select * from SO_IN_NE_PJ_IMPL where p_status IN ('3','4','5')
NePjImplVO_selectAll 和 NePjImplVO_selectAllCount 两条独立维护、各自约80行动态 <if> 条件的 SQL 语句执行得到,而不是用同一条 SQL + 分页插件(如 COUNT(*) OVER() 窗口函数或 MyBatis-Plus 物理分页拦截器)一次性返回。这种"一份过滤逻辑维护两份"的写法,任何一次需求变更(例如本次新增的"项目状态"多选过滤)只要有一处遗漏同步(哪怕是 <if> 条件顺序、参数类型细微差异),就会导致 total 和 list 的行数从两条不同路径计算出不一致的结果——这正是"20条数据分页栏显示17条""已投产3条数据分页栏显示0条"这类问题反复出现的结构性原因。修复文件:NePjImplSQL_mysql.xml / NePjImplSQL_dm.xml + ProjectImplAppService.java
<select id="NePjImplVO_selectAllWithCount" resultType="cn.csg.so.oms.in.newenergy.project.model.NePjImplVO">
select t.*, count(*) over() as total_count
from (
select t.*, max(create_time) over (partition by plan_name) as group_latest
from so_in_ne_pj_impl t where t.p_status in ('3','4','5')
) t
where 1=1
<!-- 原 selectAll 里的全部 <if> 过滤条件保留在此,只维护一份 -->
...
order by group_latest desc, create_time desc
limit #{offset}, #{pageSize}
</select>
// ProjectImplAppService.java:records 与 total 来自同一次查询,天然一致
List<NePjImplVO> records = getCapBaseCommonDAO().queryList(
"cn.csg.so.oms.in.newenergy.project.model.NePjImplVO_selectAllWithCount",
param, param.getPageNum(), param.getPageSize());
long total = records.isEmpty() ? 0L : records.get(0).getTotalCount();
IPage<NePjImplVO> queryVoPage = new cn.csg.so.oms.in.newenergy.common.page.Page<>(
param.getPageNum(), param.getPageSize(), total, records);
<sql id="commonWhere"> 片段,selectAll 和 selectAllCount 都通过 <include refid="commonWhere"/> 复用同一份条件定义,避免手工复制导致的遗漏:<sql id="commonWhere">
<if test="creatorPhone != null and creatorPhone != ''">and creator_phone = #{creatorPhone}</if>
... <!-- 全部过滤条件只写一份 -->
</sql>
<select id="NePjImplVO_selectAll" ...>
select ... from (...) t where 1=1 <include refid="commonWhere"/> order by ...
</select>
<select id="NePjImplVO_selectAllCount" ...>
select count(*) from (...) t where 1=1 <include refid="commonWhere"/>
</select>