From fec35cd7d550d14135af50780c2ebf6dc70c6ed3 Mon Sep 17 00:00:00 2001
From: chenchuchuan <13554600537@163.com>
Date: Thu, 8 Oct 2026 11:44:39 +0800
Subject: [PATCH] =?UTF-8?q?feat(openapi):=20=E6=8C=89=E8=A1=A8=E5=8D=95?=
=?UTF-8?q?=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2=E6=96=87=E4=BB=B6=E6=B8=85?=
=?UTF-8?q?=E5=8D=95=E6=8E=A5=E5=8F=A3=E6=94=B9=E9=80=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 将文件清单查询接口改为分页模式,支持pageNo和pageSize参数
- 返回数据结构从列表改为分页对象,包含list/pageNo/pageSize/total/hasMore字段
- 添加分页查询逻辑,每次只返回一页数据,通过hasMore判断是否继续翻页
- 移除原来的全量查询和扫描限制机制,改为标准分页实现
- 保留所有主表记录,无附件记录的files字段为空数组而非被丢弃
- 添加页码和页面大小参数验证,默认值为1和500,上限1000
---
.../openapi/controller/OpenApiKbController.java | 14 +--
.../common/openapi/dto/OpenApiKbFileQueryDto.java | 8 ++
.../common/openapi/service/OpenApiKbService.java | 14 +--
.../openapi/service/impl/OpenApiKbServiceImpl.java | 110 ++++++++++++---------
4 files changed, 89 insertions(+), 57 deletions(-)
diff --git a/common/common-openapi/src/main/java/apelet/common/openapi/controller/OpenApiKbController.java b/common/common-openapi/src/main/java/apelet/common/openapi/controller/OpenApiKbController.java
index 9fd7966..3e5afaa 100644
--- a/common/common-openapi/src/main/java/apelet/common/openapi/controller/OpenApiKbController.java
+++ b/common/common-openapi/src/main/java/apelet/common/openapi/controller/OpenApiKbController.java
@@ -2,7 +2,7 @@ package apelet.common.openapi.controller;
import apelet.common.core.constant.ErrorCodeEnum;
import apelet.common.core.object.ResponseResult;
-import apelet.common.openapi.dto.OpenApiKbFileNodeDto;
+import apelet.common.openapi.dto.OpenApiKbFilePageDto;
import apelet.common.openapi.dto.OpenApiKbFileQueryDto;
import apelet.common.openapi.dto.OpenApiKbPageNodeDto;
import apelet.common.openapi.dto.OpenApiKbTreeQueryDto;
@@ -56,17 +56,19 @@ public class OpenApiKbController {
}
/**
- * 按表单(可选按附件字段)查询全部文件清单,供消费侧做增量比对后再逐个下载。清单不分页。
+ * 按表单(可选按附件字段)分页查询文件清单,供消费侧做增量比对后再逐个下载。
+ *
每次只返回一页,翻页由调用方用 pageNo 递增驱动,翻页只认 hasMore。返回的记录含全部主表记录,
+ * 没有附件的记录 files 为空数组(不是被丢弃),因此本页条数与 pageSize 一致(末页除外)。
*
- * @param queryDto 查询入参(formId 必填,fieldName 可缺省)。
- * @return data 直接为记录节点数组(元素含 files 子数组)。
+ * @param queryDto 查询入参(formId 必填,fieldName/pageNo/pageSize 可缺省)。
+ * @return data 为分页对象(list/pageNo/pageSize/total/hasMore)。
*/
@PostMapping("/files")
- public ResponseResult> files(@RequestBody(required = false) OpenApiKbFileQueryDto queryDto) {
+ public ResponseResult files(@RequestBody(required = false) OpenApiKbFileQueryDto queryDto) {
if (queryDto == null) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST, "请求体不能为空!");
}
- return openApiKbService.getFileList(queryDto.getFormId(), queryDto.getFieldName());
+ return openApiKbService.getFileList(queryDto.getFormId(), queryDto.getFieldName(), queryDto.getPageNo(), queryDto.getPageSize());
}
/**
diff --git a/common/common-openapi/src/main/java/apelet/common/openapi/dto/OpenApiKbFileQueryDto.java b/common/common-openapi/src/main/java/apelet/common/openapi/dto/OpenApiKbFileQueryDto.java
index 71218d7..b84cb56 100644
--- a/common/common-openapi/src/main/java/apelet/common/openapi/dto/OpenApiKbFileQueryDto.java
+++ b/common/common-openapi/src/main/java/apelet/common/openapi/dto/OpenApiKbFileQueryDto.java
@@ -18,4 +18,12 @@ public class OpenApiKbFileQueryDto {
* 附件字段的数据库列名,选填;不传时返回该表单全部文件字段的附件。
*/
private String fieldName;
+ /**
+ * 页码,选填,从 1 开始;不传或非法按 1 处理。
+ */
+ private Integer pageNo;
+ /**
+ * 单页记录数,选填;不传或非法按 500 处理,上限 1000。
+ */
+ private Integer pageSize;
}
diff --git a/common/common-openapi/src/main/java/apelet/common/openapi/service/OpenApiKbService.java b/common/common-openapi/src/main/java/apelet/common/openapi/service/OpenApiKbService.java
index 433f2b8..0c4d963 100644
--- a/common/common-openapi/src/main/java/apelet/common/openapi/service/OpenApiKbService.java
+++ b/common/common-openapi/src/main/java/apelet/common/openapi/service/OpenApiKbService.java
@@ -1,7 +1,7 @@
package apelet.common.openapi.service;
import apelet.common.core.object.ResponseResult;
-import apelet.common.openapi.dto.OpenApiKbFileNodeDto;
+import apelet.common.openapi.dto.OpenApiKbFilePageDto;
import apelet.common.openapi.dto.OpenApiKbPageNodeDto;
import javax.servlet.http.HttpServletResponse;
@@ -26,15 +26,17 @@ public interface OpenApiKbService {
List getPageFormTree(String keyword, Boolean onlyReady);
/**
- * 按表单(可选按附件字段)查询全部文件清单,供消费侧做增量比对后再逐个下载。
- * 清单不分页:消费侧靠它做增量比对,只给一页会让其余记录的文档被误判成"已删除"。内部按 1000 条一页翻完,
- * 记录数超过 {@code SCAN_LIMIT} 时截断并记 warn 日志。
+ * 按表单(可选按附件字段)分页查询文件清单,每次只返回一页,翻页由调用方驱动。
+ * 只认返回的 hasMore 判断是否到底,不要用"本页条数不足 pageSize"或"本页为空"判断。返回的记录含全部主表记录,
+ * 没有附件的记录 files 为空数组,因此本页条数与 pageSize 一致(末页除外)。
*
* @param formId 在线表单主键Id。
* @param fieldName 附件字段的数据库列名,为空时返回该表单全部文件字段的附件。
- * @return 记录节点列表(含 files 子数组),直接作为响应的 data。
+ * @param pageNo 页码,从 1 开始;为空或非法按 1 处理。
+ * @param pageSize 单页记录数;为空或非法按 500 处理,上限 1000。
+ * @return 分页对象(list/pageNo/pageSize/total/hasMore)作为响应的 data。
*/
- ResponseResult> getFileList(Long formId, String fieldName);
+ ResponseResult getFileList(Long formId, String fieldName, Integer pageNo, Integer pageSize);
/**
* 下载指定记录指定附件字段下的单个附件,直接写出二进制流。
diff --git a/common/common-openapi/src/main/java/apelet/common/openapi/service/impl/OpenApiKbServiceImpl.java b/common/common-openapi/src/main/java/apelet/common/openapi/service/impl/OpenApiKbServiceImpl.java
index 3dba0f4..a3b631a 100644
--- a/common/common-openapi/src/main/java/apelet/common/openapi/service/impl/OpenApiKbServiceImpl.java
+++ b/common/common-openapi/src/main/java/apelet/common/openapi/service/impl/OpenApiKbServiceImpl.java
@@ -1,6 +1,7 @@
package apelet.common.openapi.service.impl;
import apelet.common.core.constant.ErrorCodeEnum;
+import apelet.common.core.object.MyOrderParam;
import apelet.common.core.object.MyPageParam;
import apelet.common.core.object.ObjectValue;
import apelet.common.core.object.ResponseResult;
@@ -47,13 +48,13 @@ public class OpenApiKbServiceImpl implements OpenApiKbService {
*/
private static final String UPDATE_TIME_COLUMN = "update_time";
/**
- * 单次翻页大小,取在线列表引擎上限。
+ * 缺省单页记录数,与接口文档示例一致。
*/
- private static final int PAGE_SIZE = 1000;
+ private static final int DEFAULT_PAGE_SIZE = 500;
/**
- * 单次调用最多扫描的记录数,兜底防止一次拉爆内存;正常表单远达不到。
+ * 单页记录数上限,取在线列表引擎上限。
*/
- private static final int SCAN_LIMIT = 50000;
+ private static final int MAX_PAGE_SIZE = 1000;
@Autowired
private OnlinePageService onlinePageService;
@@ -270,10 +271,12 @@ public class OpenApiKbServiceImpl implements OpenApiKbService {
// ============ 接口2:文件清单 ============
@Override
- public ResponseResult> getFileList(Long formId, String fieldName) {
+ public ResponseResult getFileList(Long formId, String fieldName, Integer pageNo, Integer pageSize) {
if (formId == null) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST, "formId 不能为空!");
}
+ int effectivePageNo = this.toIntParam(pageNo, 1, 1, Integer.MAX_VALUE);
+ int effectivePageSize = this.toIntParam(pageSize, DEFAULT_PAGE_SIZE, 1, MAX_PAGE_SIZE);
OnlineForm form = onlineFormService.getOnlineFormFromCache(formId);
if (form == null) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, "在线表单不存在!");
@@ -311,60 +314,79 @@ public class OpenApiKbServiceImpl implements OpenApiKbService {
if (datasourceResult.getData() == null || datasourceResult.getData().getMasterTable() == null) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, "表单主表不存在!");
}
- List