Browse Source

Merge remote-tracking branch 'origin/master' into prod_test

# Conflicts:
#	src/main/java/cn/cslg/pas/service/common/PatentStarApiService.java
lrj 2 weeks ago
parent
commit
b92a372910
100 changed files with 29802 additions and 0 deletions
  1. 403 0
      .qoder/repowiki/zh/content/API端点参考/API端点参考.md
  2. 309 0
      .qoder/repowiki/zh/content/API端点参考/专利管理API/专利导入导出API/专利导入API.md
  3. 251 0
      .qoder/repowiki/zh/content/API端点参考/专利管理API/专利导入导出API/专利导入导出API.md
  4. 385 0
      .qoder/repowiki/zh/content/API端点参考/专利管理API/专利导入导出API/专利导出API.md
  5. 330 0
      .qoder/repowiki/zh/content/API端点参考/专利管理API/专利检索API.md
  6. 461 0
      .qoder/repowiki/zh/content/API端点参考/专利管理API/专利管理API.md
  7. 306 0
      .qoder/repowiki/zh/content/API端点参考/专利管理API/专利详情API.md
  8. 359 0
      .qoder/repowiki/zh/content/API端点参考/分析与报告API/FTO分析API.md
  9. 387 0
      .qoder/repowiki/zh/content/API端点参考/分析与报告API/分析与报告API.md
  10. 426 0
      .qoder/repowiki/zh/content/API端点参考/分析与报告API/报告导出API.md
  11. 485 0
      .qoder/repowiki/zh/content/API端点参考/分析与报告API/报告模板API.md
  12. 482 0
      .qoder/repowiki/zh/content/API端点参考/分析与报告API/报告项目API.md
  13. 267 0
      .qoder/repowiki/zh/content/API端点参考/分析与报告API/稳定性分析API.md
  14. 382 0
      .qoder/repowiki/zh/content/API端点参考/查新分析API/查新分析API.md
  15. 484 0
      .qoder/repowiki/zh/content/API端点参考/查新分析API/查新对比记录API.md
  16. 257 0
      .qoder/repowiki/zh/content/API端点参考/查新分析API/查新报告引用API.md
  17. 318 0
      .qoder/repowiki/zh/content/API端点参考/查新分析API/查新项目管理API.md
  18. 339 0
      .qoder/repowiki/zh/content/API端点参考/系统管理API/个人配置API.md
  19. 402 0
      .qoder/repowiki/zh/content/API端点参考/系统管理API/权限管理API.md
  20. 431 0
      .qoder/repowiki/zh/content/API端点参考/系统管理API/系统管理API.md
  21. 374 0
      .qoder/repowiki/zh/content/API端点参考/系统管理API/自定义字段API.md
  22. 482 0
      .qoder/repowiki/zh/content/API端点参考/项目管理API/专利项目API.md
  23. 327 0
      .qoder/repowiki/zh/content/API端点参考/项目管理API/项目任务API.md
  24. 490 0
      .qoder/repowiki/zh/content/API端点参考/项目管理API/项目树结构API.md
  25. 174 0
      .qoder/repowiki/zh/content/API端点参考/项目管理API/项目管理API.md
  26. 515 0
      .qoder/repowiki/zh/content/业务逻辑层/FTO分析/FTO分析.md
  27. 210 0
      .qoder/repowiki/zh/content/业务逻辑层/FTO分析/FTO报告生成.md
  28. 261 0
      .qoder/repowiki/zh/content/业务逻辑层/FTO分析/侵权比对管理.md
  29. 231 0
      .qoder/repowiki/zh/content/业务逻辑层/FTO分析/权要分析.md
  30. 254 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/专利导入.md
  31. 380 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/从Excel导入专利.md
  32. 199 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/从PatentStar导入专利.md
  33. 210 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/从Web导入专利.md
  34. 250 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入导出.md
  35. 274 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/专利导出.md
  36. 244 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/单个专利导出.md
  37. 251 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/导出格式与模板.md
  38. 265 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/项目级导出.md
  39. 453 0
      .qoder/repowiki/zh/content/业务逻辑层/专利导入导出/导入导出公共机制.md
  40. 146 0
      .qoder/repowiki/zh/content/业务逻辑层/业务逻辑层.md
  41. 406 0
      .qoder/repowiki/zh/content/业务逻辑层/无效分析/专利权要分析.md
  42. 328 0
      .qoder/repowiki/zh/content/业务逻辑层/无效分析/无效分析.md
  43. 935 0
      .qoder/repowiki/zh/content/业务逻辑层/无效分析/无效分析报告生成.md
  44. 266 0
      .qoder/repowiki/zh/content/业务逻辑层/无效分析/无效请求文件管理.md
  45. 399 0
      .qoder/repowiki/zh/content/业务逻辑层/无效分析/比对分组管理.md
  46. 407 0
      .qoder/repowiki/zh/content/业务逻辑层/无效分析/证据与理由管理.md
  47. 311 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/对比分析管理.md
  48. 194 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新分析.md
  49. 165 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新报告生成/查新报告导出.md
  50. 226 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新报告生成/查新报告生成.md
  51. 291 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新报告生成/查新报告管理.md
  52. 331 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新检索管理/查新检索管理.md
  53. 276 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新检索管理/检索记录管理.md
  54. 164 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新检索管理/项目关联管理.md
  55. 416 0
      .qoder/repowiki/zh/content/业务逻辑层/查新分析/查新项目管理.md
  56. 285 0
      .qoder/repowiki/zh/content/业务逻辑层/系统核心服务.md
  57. 349 0
      .qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析.md
  58. 369 0
      .qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析执行与展示.md
  59. 464 0
      .qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析数据源.md
  60. 271 0
      .qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析维度.md
  61. 279 0
      .qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析配置.md
  62. 307 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务关联模型.md
  63. 178 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务状态管理.md
  64. 167 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务生命周期.md
  65. 337 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务管理.md
  66. 233 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务结果处理.md
  67. 261 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/进度跟踪与监控.md
  68. 348 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目与任务管理.md
  69. 324 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目共享管理.md
  70. 196 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目创建与配置.md
  71. 200 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目导入与导出.md
  72. 239 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目监控设置.md
  73. 307 0
      .qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目管理.md
  74. 299 0
      .qoder/repowiki/zh/content/外部集成/Dify AI集成.md
  75. 343 0
      .qoder/repowiki/zh/content/外部集成/PatentStar集成.md
  76. 194 0
      .qoder/repowiki/zh/content/外部集成/Python服务集成.md
  77. 74 0
      .qoder/repowiki/zh/content/外部集成/外部集成.md
  78. 107 0
      .qoder/repowiki/zh/content/快速入门.md
  79. 235 0
      .qoder/repowiki/zh/content/技术栈与依赖.md
  80. 355 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/Elasticsearch索引模型.md
  81. 119 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利与项目关联模型.md
  82. 78 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利实体模型.md
  83. 252 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利数据模型.md
  84. 185 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利数据访问层.md
  85. 171 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告事项模型.md
  86. 237 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告数据模型.md
  87. 203 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告模板与配置.md
  88. 142 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告项目模型.md
  89. 303 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/数据模型与ORM映射.md
  90. 230 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目任务模型.md
  91. 165 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目数据模型.md
  92. 221 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目树形结构模型.md
  93. 240 0
      .qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目核心模型.md
  94. 317 0
      .qoder/repowiki/zh/content/部署指南.md
  95. 405 0
      .qoder/repowiki/zh/content/配置管理/前端JSON配置.md
  96. 258 0
      .qoder/repowiki/zh/content/配置管理/服务配置.md
  97. 418 0
      .qoder/repowiki/zh/content/配置管理/环境配置.md
  98. 319 0
      .qoder/repowiki/zh/content/配置管理/配置管理.md
  99. 249 0
      .qoder/repowiki/zh/content/项目概述.md
  100. 0 0
      .qoder/repowiki/zh/meta/repowiki-metadata.json

+ 403 - 0
.qoder/repowiki/zh/content/API端点参考/API端点参考.md

@@ -0,0 +1,403 @@
+# API端点参考
+
+<cite>
+**本文档引用的文件**
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java)
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java)
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java)
+- [ReportProjectController.java](file://src/main/java/cn/cslg/pas/controller/ReportProjectController.java)
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java)
+- [QueryNoveltyProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryNoveltyProjectVO.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [API基础信息](#api基础信息)
+3. [认证机制](#认证机制)
+4. [错误处理](#错误处理)
+5. [专利管理API](#专利管理api)
+6. [项目管理API](#项目管理api)
+7. [查新分析API](#查新分析api)
+8. [报告生成API](#报告生成api)
+9. [附录](#附录)
+
+## 简介
+本文档详细记录了PAS系统的所有公共API端点,涵盖了专利管理、项目管理、查新分析和报告生成等主要功能模块。文档系统性地描述了每个RESTful API的HTTP方法、URL路径、请求参数、请求体结构和响应体结构,并提供了curl命令示例和实际的请求/响应JSON样例。
+
+## API基础信息
+
+### 基础URL
+所有API端点的基础URL为:`http://<服务器地址>:8879/api/xiaoshi`
+
+### 版本信息
+当前API版本为v2,所有端点均位于`/api/xiaoshi`路径下。
+
+### 请求/响应格式
+- **请求格式**:所有请求数据均以JSON格式通过请求体传递
+- **响应格式**:所有响应数据均以JSON格式返回,遵循统一的响应结构
+
+```mermaid
+erDiagram
+RESPONSE {
+integer code
+object data
+string message
+}
+```
+
+**图源**
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+## 认证机制
+
+### SaToken认证
+PAS系统使用SaToken框架进行身份验证和权限控制。所有需要认证的API端点都要求在请求头中包含有效的token。
+
+#### 认证配置
+根据`SaTokenConfigure.java`文件,系统配置了以下认证规则:
+- 需要认证的路径:`/api/xiaoshi/**`
+- 无需认证的排除路径:
+  - `/api/xiaoshi/ws/**`
+  - `/api/xiaoshi/test/**`
+  - `/api/xiaoshi/oauth2/**`
+  - `/api/xiaoshi/admin/**`
+  - `/api/xiaoshi/common/download`
+  - `/api/xiaoshi/common/export`
+
+#### 请求头要求
+所有需要认证的请求必须包含以下HTTP头:
+```
+Authorization: Bearer <token>
+```
+
+或
+```
+token: <token>
+```
+
+其中`<token>`是通过登录接口获取的有效认证令牌。
+
+**章节源**
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+
+## 错误处理
+
+### 统一响应格式
+PAS系统使用统一的响应格式来处理成功和错误响应。所有API响应都遵循`Response`类的结构:
+
+```java
+public class Response {
+    private Integer code;
+    private Object data;
+    private String message;
+}
+```
+
+### 自定义异常
+系统定义了多种自定义异常,通过`GlobalExceptionHandler`进行全局处理:
+
+#### XiaoShiException
+- 用于处理业务逻辑异常
+- 包含错误代码和错误消息
+- 在`GlobalExceptionHandler`中被捕获并转换为标准化的错误响应
+
+#### UnLoginException
+- 用于处理未登录异常
+- 当用户未认证或token无效时抛出
+- 返回401状态码和"未登录"消息
+
+### 全局异常处理器
+`GlobalExceptionHandler`类负责处理所有未捕获的异常,并返回标准化的错误响应:
+
+```java
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    @ExceptionHandler(value = {XiaoShiException.class})
+    @ResponseBody
+    public Response handleAllExceptions(XiaoShiException ex) {
+        return Response.error(ex.getErrorCode(), ex.getErrorMessage());
+    }
+
+    @ExceptionHandler(value = {UnLoginException.class})
+    @ResponseBody
+    public Response handleAllExceptions(UnLoginException ex) {
+        return Response.error("401", "未登录");
+    }
+}
+```
+
+### 标准错误码
+| 错误码 | 描述 | 说明 |
+|--------|------|------|
+| 200 | 成功 | 请求成功处理 |
+| 401 | 未登录 | 用户未认证或token无效 |
+| 500 | 服务器错误 | 服务器内部错误 |
+| 其他 | 业务错误 | 具体业务逻辑错误代码 |
+
+**章节源**
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+## 专利管理API
+
+### 查询专利
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/patent/queryPatent`
+- **认证要求**: 是
+- **请求体**: `StringRequest`对象
+- **响应体**: `Response`对象,包含`Records`数据
+
+**curl示例**
+```bash
+curl -X POST http://localhost:8879/api/xiaoshi/patent/queryPatent \
+  -H "Authorization: Bearer <token>" \
+  -H "Content-Type: application/json" \
+  -d '{"query": "query string"}'
+```
+
+**请求JSON示例**
+```json
+{
+  "query": "查询条件"
+}
+```
+
+**响应JSON示例**
+```json
+{
+  "code": 200,
+  "data": {
+    "total": 10,
+    "list": [...]
+  },
+  "message": "成功"
+}
+```
+
+### 查询专利详情
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/patent/selectPatentDetail`
+- **认证要求**: 是
+- **请求体**: `PatentNoVO`对象
+- **响应体**: `Response`对象,包含`PatentColumnDTO`数据
+
+**curl示例**
+```bash
+curl -X POST http://localhost:8879/api/xiaoshi/patent/selectPatentDetail \
+  -H "Authorization: Bearer <token>" \
+  -H "Content-Type: application/json" \
+  -d '{"patentNo": "CN123456789A"}'
+```
+
+**章节源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java)
+
+## 项目管理API
+
+### 查询专利数据库
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/patentProject/queryPatentProject`
+- **认证要求**: 是
+- **请求体**: `StringRequest`对象
+- **响应体**: `Response`对象,包含`Records`数据
+
+### 添加专利数据库
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/patentProject/addPatentProject`
+- **认证要求**: 是
+- **请求体**: `PatentProjectDTO`对象
+- **响应体**: `Response`对象,包含新增记录的ID
+
+### 更新专利数据库
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/patentProject/updatePatentProject`
+- **认证要求**: 是
+- **请求体**: `UpdatePatentProjectDTO`对象
+- **响应体**: `Response`对象,包含更新记录的ID
+
+### 删除专利数据库
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/patentProject/deletePatentProject`
+- **认证要求**: 是
+- **请求体**: 整数ID列表
+- **响应体**: `Response`对象,包含操作结果消息
+
+**章节源**
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java)
+
+## 查新分析API
+
+### 添加查新检索报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/noveltyProject/addNoveltyProject`
+- **认证要求**: 是
+- **请求体**: `AddNoveltyProjectDTO`对象
+- **响应体**: `Response`对象,包含新增报告的ID
+
+#### AddNoveltyProjectDTO结构
+```java
+@Data
+public class AddNoveltyProjectDTO {
+    private String customCaseNumber;
+    private String innerCaseNumber;
+    private String applicants;
+    private String inventor;
+    private String ipr;
+    private String technicalContact;
+    private String searchUnit;
+    private String searchUnitContact;
+    private String caseName;
+    private String searchReviewer;
+    private String preliminaryConclusions;
+    private String ifPatentability;
+    private String applicationAdvice;
+    private String applicationRemark;
+    private String replenishMeans;
+    private String writeAdvice;
+    private Integer projectId;
+    private Integer entrustType;
+    private String entrustId;
+    private String entrustName;
+    private String headId;
+    private String departmentId;
+}
+```
+
+**curl示例**
+```bash
+curl -X POST http://localhost:8879/api/xiaoshi/noveltyProject/addNoveltyProject \
+  -H "Authorization: Bearer <token>" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "caseName": "查新报告1",
+    "applicants": "申请人A",
+    "inventor": "发明人B",
+    "projectId": 123
+  }'
+```
+
+**请求JSON示例**
+```json
+{
+  "caseName": "查新报告1",
+  "applicants": "申请人A",
+  "inventor": "发明人B",
+  "projectId": 123,
+  "entrustType": 1
+}
+```
+
+**响应JSON示例**
+```json
+{
+  "code": 200,
+  "data": 456,
+  "message": "成功"
+}
+```
+
+### 查询查新检索报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/noveltyProject/queryNoveltyProject`
+- **认证要求**: 是
+- **请求体**: `StringRequest`对象
+- **响应体**: `Response`对象,包含`Records`数据
+
+### 编辑查新检索报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/noveltyProject/updateNoveltyProject`
+- **认证要求**: 是
+- **请求体**: `AddNoveltyProjectDTO`对象(包含ID)
+- **响应体**: `Response`对象,包含更新报告的ID
+
+### 删除查新检索报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/noveltyProject/deleteNoveltyProject`
+- **认证要求**: 是
+- **请求体**: `NoveltyProjectIdDTO`对象
+- **响应体**: `Response`对象,包含操作结果消息
+
+**章节源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java)
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java)
+
+## 报告生成API
+
+### 查询报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/reportProject/queryReportProject`
+- **认证要求**: 是
+- **请求体**: `StringRequest`对象
+- **响应体**: `Response`对象,包含`Records`数据
+
+### 添加报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/reportProject/addReportProject`
+- **认证要求**: 是
+- **请求体**: `ReportProjectDTO`对象
+- **响应体**: `Response`对象,包含新增报告的ID
+
+### 更新报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/reportProject/updateReportProject`
+- **认证要求**: 是
+- **请求体**: `UpdateReportProjectDTO`对象
+- **响应体**: `Response`对象,包含更新报告的ID
+
+### 删除报告
+- **HTTP方法**: POST
+- **URL路径**: `/api/xiaoshi/reportProject/deleteReportProject`
+- **认证要求**: 是
+- **请求体**: 整数ID列表
+- **响应体**: `Response`对象,包含操作结果消息
+
+**章节源**
+- [ReportProjectController.java](file://src/main/java/cn/cslg/pas/controller/ReportProjectController.java)
+
+## 附录
+
+### 常用常量
+在`Constants.java`中定义了系统常用常量:
+
+```java
+public class Constants {
+    public static final String API_XiaoSHI = "/api/xiaoshi";
+    public static final String ADMIN_USERNAME = "admin";
+    public static final String PROJECT_INFO_FILE_NAME = "project.json";
+    // ... 其他常量
+}
+```
+
+### 响应枚举
+`ResponseEnum`类定义了系统响应码和消息:
+
+```java
+public enum ResponseEnum {
+    SUCCESS(200, "成功"),
+    ERROR(500, "失败"),
+    UNAUTHORIZED(401, "未登录"),
+    NO_PERMISSION(403, "无权限"),
+    CONDITION_ERROR(400, "条件错误");
+    
+    private final Integer code;
+    private final String message;
+    
+    ResponseEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+    
+    // getter方法
+}
+```
+
+**章节源**
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)

+ 309 - 0
.qoder/repowiki/zh/content/API端点参考/专利管理API/专利导入导出API/专利导入API.md

@@ -0,0 +1,309 @@
+# 专利导入API
+
+<cite>
+**本文档引用的文件**   
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java)
+- [ImportTask.java](file://src/main/java/cn/cslg/pas/domain/business/ImportTask.java)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [importTask.json](file://src/main/resources/jsons/importTask.json)
+- [importTaskConfig.json](file://src/main/resources/jsons/importTaskConfig.json)
+- [ExcelImportDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExcelImportDTO.java)
+- [PatentStarImportDTO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentStarImportDTO.java)
+- [ImportTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ImportTaskMapper.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+本文档全面记录了专利导入API的实现,包括批量导入、导入状态查询和任务取消等端点。文档详细说明了ImportTaskDTO中的导入配置参数,包括数据源类型、字段映射规则、去重策略和自定义字段处理等。同时,文档化了异步任务处理机制,包括任务队列、线程池管理和进度更新。
+
+## 项目结构
+专利导入API的实现主要位于`src/main/java/cn/cslg/pas`目录下,核心组件分布在controller、common、domain和service包中。
+
+```mermaid
+graph TD
+subgraph "Controller层"
+ImportTaskController["ImportTaskController"]
+end
+subgraph "DTO层"
+ImportTaskDTO["ImportTaskDTO"]
+ExcelImportDTO["ExcelImportDTO"]
+PatentStarImportDTO["PatentStarImportDTO"]
+end
+subgraph "Domain层"
+ImportTask["ImportTask"]
+end
+subgraph "Service层"
+ImportTaskService["ImportTaskService"]
+end
+subgraph "Mapper层"
+ImportTaskMapper["ImportTaskMapper"]
+end
+ImportTaskController --> ImportTaskDTO
+ImportTaskController --> ImportTaskService
+ImportTaskService --> ImportTaskMapper
+ImportTaskService --> ImportTask
+ImportTaskMapper --> ImportTask
+```
+
+**图示来源**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java)
+- [ImportTask.java](file://src/main/java/cn/cslg/pas/domain/business/ImportTask.java)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [ImportTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ImportTaskMapper.java)
+
+**章节来源**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java)
+
+## 核心组件
+
+专利导入API的核心组件包括:
+- **ImportTaskController**: 提供REST API端点,处理导入任务的创建、查询和状态更新
+- **ImportTaskDTO**: 数据传输对象,定义导入任务的配置参数
+- **ImportTaskService**: 业务逻辑服务,处理导入任务的创建、执行和状态管理
+- **ImportTaskMapper**: 数据访问层,与数据库交互,持久化导入任务信息
+- **ImportTask**: 领域模型,表示数据库中的导入任务表
+
+**章节来源**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L24-L80)
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java#L22-L95)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L62-L733)
+
+## 架构概述
+
+专利导入API采用典型的分层架构,包括控制器层、服务层、数据访问层和领域模型层。系统通过异步任务处理机制来处理耗时的专利导入操作。
+
+```mermaid
+graph TD
+Client["客户端"]
+API["API接口"]
+Service["业务服务"]
+Queue["任务队列"]
+Worker["工作线程"]
+Database["数据库"]
+ES["Elasticsearch"]
+Client --> API
+API --> Service
+Service --> Queue
+Queue --> Worker
+Worker --> Database
+Worker --> ES
+Service --> Database
+subgraph "异步处理"
+Queue
+Worker
+end
+subgraph "数据存储"
+Database
+ES
+end
+```
+
+**图示来源**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [ImportTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ImportTaskMapper.java)
+
+## 详细组件分析
+
+### 导入任务控制器分析
+ImportTaskController类负责处理所有与导入任务相关的HTTP请求,包括任务创建、状态查询和错误日志获取。
+
+#### 控制器类图
+```mermaid
+classDiagram
+class ImportTaskController {
++importTaskService : ImportTaskService
++businessFactory : BusinessFactory
++patentImportErrorLogService : PatentImportErrorLogService
++queryImportTask(StringRequest) : Response
++addImportTask(ImportTaskDTO) : Response
++updateImportTaskState(Integer, Integer) : Response
++addPdfTask(AddImportPDFTaskDTO) : Response
++getPatentImportLog(ImportErrorLogQueryDTO) : Response
+}
+class ImportTaskService {
++addMessage(Object) : Object
++queryMessage(QueryRequest) : Object
++updateImportTaskState(Integer, Integer) : void
++addPdfTask(AddImportPDFTaskDTO) : Integer
+}
+class BusinessFactory {
++getClass(String) : Business
+}
+ImportTaskController --> ImportTaskService : "依赖"
+ImportTaskController --> BusinessFactory : "依赖"
+ImportTaskController --> PatentImportErrorLogService : "依赖"
+```
+
+**图示来源**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L24-L80)
+
+**章节来源**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L24-L80)
+
+### 导入任务DTO分析
+ImportTaskDTO类定义了导入任务的所有配置参数,是客户端与服务器之间传递导入配置的主要数据结构。
+
+#### DTO类图
+```mermaid
+classDiagram
+class ImportTaskDTO {
++importToId : Integer
++importToType : Integer
++crons : String
++importContent : Integer
++ifUpdate : Boolean
++searchCondition : String
++type : Integer
++fileGuid : String
++sourceId : Integer
++DBType : String
++orderBy : String
++orderByType : String
++fieldDTOS : EsCustomFieldDTO[]
++patentNos : String[]
++productId : Integer
++updateCycle : String
++optionType : Integer
+}
+class EsCustomFieldDTO {
++fieldId : Integer
++fieldName : String
++fieldType : Integer
++options : String[]
+}
+ImportTaskDTO --> EsCustomFieldDTO : "包含"
+```
+
+**图示来源**
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java#L22-L95)
+- [EsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/EsCustomFieldDTO.java)
+
+**章节来源**
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java#L22-L95)
+
+### 导入任务服务分析
+ImportTaskService类实现了导入任务的核心业务逻辑,包括任务创建、状态更新和进度管理。
+
+#### 服务类序列图
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "ImportTaskController"
+participant Service as "ImportTaskService"
+participant Mapper as "ImportTaskMapper"
+participant Scheduler as "SchedulingTaskService"
+Client->>Controller : POST /importTask/addImportTask
+Controller->>Service : addMessage(importTaskDTO)
+Service->>Service : 校验参数
+Service->>Service : 创建ImportTaskCondition
+Service->>Service : 计算导入总数
+Service->>Service : 创建ImportTask
+Service->>Mapper : insert(importTask)
+Mapper-->>Service : 返回任务ID
+Service->>Scheduler : startTask()
+Scheduler-->>Service : 任务启动
+Service-->>Controller : 返回任务ID
+Controller-->>Client : 返回响应
+```
+
+**图示来源**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L138-L263)
+- [ImportTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ImportTaskMapper.java)
+
+**章节来源**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L138-L263)
+
+## 依赖分析
+
+专利导入API与其他系统组件有多个依赖关系,包括文件管理服务、专利星API服务、权限服务和邮件发送服务。
+
+```mermaid
+graph TD
+ImportTaskService["ImportTaskService"]
+FileManagerService["FileManagerService"]
+PatentStarApiService["PatentStarApiService"]
+PermissionService["PermissionService"]
+MailSendService["MailSendService"]
+SchedulingTaskService["SchedulingTaskService"]
+CacheUtils["CacheUtils"]
+LoginUtils["LoginUtils"]
+SystemDictService["SystemDictService"]
+ProductService["ProductService"]
+ProjectService["ProjectService"]
+ImportTaskConditionService["ImportTaskConditionService"]
+WebVOTransformService["WebVOTransformService"]
+ImportTaskService --> FileManagerService
+ImportTaskService --> PatentStarApiService
+ImportTaskService --> PermissionService
+ImportTaskService --> MailSendService
+ImportTaskService --> SchedulingTaskService
+ImportTaskService --> CacheUtils
+ImportTaskService --> LoginUtils
+ImportTaskService --> SystemDictService
+ImportTaskService --> ProductService
+ImportTaskService --> ProjectService
+ImportTaskService --> ImportTaskConditionService
+ImportTaskService --> WebVOTransformService
+```
+
+**图示来源**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L63-L97)
+
+**章节来源**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L63-L97)
+
+## 性能考虑
+
+专利导入API在设计时考虑了以下性能因素:
+- 使用异步处理机制,避免阻塞主线程
+- 通过任务队列管理导入任务,实现任务的有序执行
+- 使用线程池管理并发任务,控制资源使用
+- 在数据库查询中使用分页,避免一次性加载大量数据
+- 使用缓存减少重复的数据库查询
+
+## 故障排除指南
+
+### 常见错误码说明
+| 错误码 | 错误信息 | 说明 |
+|-------|--------|------|
+| 400 | 参数不能为空 | 请求参数为空或缺失必要参数 |
+| 500 | 文件错误 | Excel文件格式错误或无法解析 |
+| 500 | 未检索到相关专利 | 专利星API查询返回空结果 |
+| 500 | 任务查询专利报错 | 与专利星API通信失败 |
+
+### 常见问题及解决方案
+1. **导入任务创建失败**
+   - 检查请求参数是否完整
+   - 确认用户是否有足够的权限
+   - 检查文件GUID是否有效
+
+2. **Excel导入失败**
+   - 确认Excel文件格式正确
+   - 检查文件是否包含必要的专利号列
+   - 确认文件大小在系统限制范围内
+
+3. **专利星API查询失败**
+   - 检查网络连接是否正常
+   - 确认API密钥是否有效
+   - 检查查询条件是否符合专利星API要求
+
+**章节来源**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+
+## 结论
+专利导入API提供了一套完整的专利数据导入解决方案,支持多种数据源类型和导入方式。系统采用分层架构和异步处理机制,确保了良好的性能和可扩展性。通过详细的错误处理和日志记录,系统具有良好的可维护性。

+ 251 - 0
.qoder/repowiki/zh/content/API端点参考/专利管理API/专利导入导出API/专利导入导出API.md

@@ -0,0 +1,251 @@
+# 专利导入导出API
+
+<cite>
+**本文档引用的文件**  
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+- [ExportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExportTaskDTO.java)
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java)
+- [PDFExportFirstPageService.java](file://src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [ResponseEnum.java](file://src/main/java/cn/cslg/pas/common/utils/ResponseEnum.java)
+- [ExceptionEnum.java](file://src/main/java/cn/cslg/pas/exception/ExceptionEnum.java)
+- [importTask.json](file://src/main/resources/jsons/importTask.json)
+- [importTaskConfig.json](file://src/main/resources/jsons/importTaskConfig.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [核心API端点](#核心api端点)
+3. [导入任务配置](#导入任务配置)
+4. [导出功能](#导出功能)
+5. [异步任务处理机制](#异步任务处理机制)
+6. [错误码说明](#错误码说明)
+7. [API使用示例](#api使用示例)
+8. [附录](#附录)
+
+## 简介
+本API文档详细描述了专利导入导出系统的功能,包括批量导入、导入状态查询和专利数据导出等核心功能。系统采用异步任务处理机制,支持多种数据源类型的导入和多种格式的导出,为用户提供灵活的专利数据管理能力。
+
+## 核心API端点
+系统提供了三个主要的API端点来支持专利导入导出功能:
+
+- **POST /importTask/create**: 创建专利导入任务
+- **GET /importTask/status**: 查询导入任务状态
+- **POST /export/patent**: 创建专利数据导出任务
+
+这些端点通过ImportTaskController和PatentController实现,采用RESTful设计风格,返回标准的JSON响应格式。
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L35-L79)
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L244-L272)
+
+## 导入任务配置
+导入任务通过ImportTaskDTO对象进行配置,该对象包含了导入任务的所有必要参数。
+
+### ImportTaskDTO参数说明
+ImportTaskDTO是导入任务的核心数据传输对象,包含以下关键字段:
+
+- **importToId**: 目标导入ID,指定导入到哪个专题库、报告或产品
+- **importToType**: 导入目标类型,0表示专题库,1表示报告,2表示产品
+- **type**: 导入类型,1表示Excel导入,2表示专利号导入,3表示专利号文件导入,4表示检索导入,5表示PDF文档导入
+- **ifUpdate**: 是否更新现有数据
+- **searchCondition**: 检索条件,用于检索导入场景
+- **fileGuid**: 文件GUID,用于文件导入场景
+- **sourceId**: Excel导入时使用的配置文件source_id
+- **DBType**: 检索导入使用的数据库类型(中国或世界)
+- **fieldDTOS**: 字段映射配置,定义数据源字段与系统字段的映射关系
+- **patentNos**: 专利号列表,用于专利号导入场景
+- **productId**: 产品ID,当导入到产品时使用
+- **updateCycle**: 更新周期,用于定时导入任务
+- **optionType**: 操作类型,0表示取消,1表示增加,2表示覆盖
+
+### 去重规则
+系统在导入过程中会自动处理重复数据。当ifUpdate参数为true时,系统会更新现有记录;当为false时,会跳过已存在的记录。对于专利号导入,系统会检查专利号的唯一性,避免重复导入相同的专利。
+
+**Section sources**
+- [ImportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ImportTaskDTO.java#L22-L95)
+- [importTaskConfig.json](file://src/main/resources/jsons/importTaskConfig.json#L1-L27)
+
+## 导出功能
+系统支持将专利数据导出为多种格式,包括Excel和PDF首页。
+
+### 支持的导出格式
+- **Excel**: 导出完整的专利信息,支持自定义字段选择
+- **PDF首页**: 导出专利的PDF首页文档
+
+### 自定义选项
+导出功能支持高度自定义,用户可以通过PatentExportVO对象指定需要导出的字段。每个PatentExportVO包含以下属性:
+- **value**: 字段名
+- **name**: 字段中文名
+- **selected**: 是否选择该字段
+- **type**: 字段类型
+- **order**: 字段顺序
+
+用户可以自由选择需要导出的字段,并设置它们的显示顺序。
+
+**Section sources**
+- [ExportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExportTaskDTO.java#L20-L59)
+- [PatentExportVO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentExport/PatentExportVO.java#L10-L42)
+
+## 异步任务处理机制
+系统采用异步任务处理机制来处理耗时的导入导出操作,确保API响应的及时性。
+
+### 任务生命周期
+导入导出任务遵循以下生命周期:
+1. **创建**: 通过API创建任务,返回任务ID
+2. **执行**: 任务在后台异步执行
+3. **状态更新**: 任务执行过程中定期更新状态
+4. **完成**: 任务完成后更新最终状态和结果
+
+### 进度查询方式
+系统通过WebSocket和轮询两种方式提供进度查询:
+- **WebSocket**: 实时推送任务进度更新
+- **轮询**: 通过查询接口获取任务状态
+
+任务状态包括:
+- 0: 待处理
+- 1: 处理中
+- 2: 完成
+- 4: 暂停
+- 5: 取消
+
+进度信息通过ImportTaskAMVO对象提供,包含总条数(allNum)、完成条数(doneNum)和失败条数(defaultNum)等统计信息。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "控制器"
+participant Service as "服务层"
+participant TaskManager as "任务管理器"
+participant WebSocket as "WebSocket服务"
+Client->>Controller : POST /importTask/create
+Controller->>Service : 创建导入任务
+Service->>TaskManager : 添加任务到队列
+TaskManager-->>Service : 返回任务ID
+Service-->>Controller : 返回成功响应
+Controller-->>Client : 返回任务ID
+loop 任务执行
+TaskManager->>TaskManager : 处理任务
+TaskManager->>WebSocket : 发送进度更新
+WebSocket->>Client : 推送进度
+end
+TaskManager->>Service : 更新任务状态
+Service->>TaskManager : 任务完成
+```
+
+**Diagram sources**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L451-L513)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java#L154-L199)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java#L65-L88)
+
+**Section sources**
+- [ImportTaskAMVO.java](file://src/main/java/cn/cslg/pas/common/vo/ImportTaskAMVO.java#L14-L104)
+- [WebSocketMessageVO.java](file://src/main/java/cn/cslg/pas/common/vo/WebSocketMessageVO.java#L11-L20)
+
+## 错误码说明
+系统定义了详细的错误码体系,用于处理各种异常情况。
+
+### 主要错误码
+| 错误码 | 错误信息 | 说明 |
+|--------|--------|------|
+| 202 | 参数错误 | 请求参数验证失败 |
+| 203 | 检索式错误 | 检索条件格式错误 |
+| 401 | 未登录 | 用户未登录或会话过期 |
+| 500 | 系统异常 | 服务器内部错误 |
+| 708 | 请求失败 | 业务逻辑处理失败 |
+| 999999 | 系统异常 | 系统级异常 |
+
+### 特定场景错误处理
+#### 文件格式错误
+当上传的文件格式不符合要求时,系统会返回参数错误(202)或业务错误(708)。对于Excel文件,系统会验证文件结构和数据格式;对于PDF文件,会验证文件的完整性和可读性。
+
+#### 导入失败
+导入失败可能由多种原因引起:
+- 数据源连接失败
+- 文件读取错误
+- 数据格式不匹配
+- 权限不足
+
+系统会记录详细的错误日志,用户可以通过查询接口获取具体的错误信息。
+
+#### 导出超时
+由于专利数据量可能很大,导出操作可能需要较长时间。系统设置了合理的超时机制:
+- 短时间任务:5分钟超时
+- 长时间任务:30分钟超时
+
+当任务超时时,系统会自动终止任务并返回超时错误,同时保留已处理的数据。
+
+**Section sources**
+- [ResponseEnum.java](file://src/main/java/cn/cslg/pas/common/utils/ResponseEnum.java#L1-L46)
+- [ExceptionEnum.java](file://src/main/java/cn/cslg/pas/exception/ExceptionEnum.java#L1-L81)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+
+## API使用示例
+以下示例展示了如何使用API完成完整的导入导出流程。
+
+### 创建导入任务
+```bash
+curl -X POST "http://localhost:8080/api/importTask/addImportTask" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "importToId": 123,
+    "importToType": 0,
+    "type": 1,
+    "ifUpdate": true,
+    "searchCondition": "",
+    "fileGuid": "abc123",
+    "sourceId": 1,
+    "DBType": "CN"
+  }'
+```
+
+### 查询导入状态
+```bash
+curl -X GET "http://localhost:8080/api/importTask/status?taskId=456"
+```
+
+### 创建导出任务
+```bash
+curl -X POST "http://localhost:8080/api/patent/exportPatentExcel" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "projectId": 123,
+    "EsVO": {
+      "projectId": 123,
+      "selectedFields": ["appNo", "title", "abstract"]
+    }
+  }'
+```
+
+### 完整流程示例
+1. 创建导入任务,获取任务ID
+2. 轮询查询任务状态,直到完成
+3. 创建导出任务,指定需要导出的字段
+4. 查询导出任务状态,获取结果文件GUID
+5. 下载导出的文件
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L42-L53)
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L244-L272)
+
+## 附录
+### 状态码映射表
+| 状态码 | 含义 |
+|--------|------|
+| 0 | 待处理 |
+| 1 | 处理中 |
+| 2 | 完成 |
+| 4 | 暂停 |
+| 5 | 取消 |
+
+### 任务类型映射表
+| 类型 | 含义 |
+|------|------|
+| 1 | Excel导入 |
+| 2 | 专利号导入 |
+| 3 | 专利号文件导入 |
+| 4 | 检索导入 |
+| 5 | PDF文档导入 |
+| 6 | Excel导出 |
+| 7 | PDF首页导出 |

File diff suppressed because it is too large
+ 385 - 0
.qoder/repowiki/zh/content/API端点参考/专利管理API/专利导入导出API/专利导出API.md


+ 330 - 0
.qoder/repowiki/zh/content/API端点参考/专利管理API/专利检索API.md

@@ -0,0 +1,330 @@
+# 专利检索API
+
+<cite>
+**本文档引用的文件**   
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java)
+- [QueryEsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/QueryEsCustomFieldDTO.java)
+- [patent.json](file://src/main/resources/jsons/patent.json)
+- [esCountAnalysis.json](file://src/main/resources/jsons/esCountAnalysis.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文档全面记录了专利检索功能的API,重点介绍`PatentController`中所有与检索相关的端点。文档详细说明了基于Elasticsearch的复杂查询参数结构,包括字段匹配、范围查询、嵌套查询等高级功能。同时,文档化了分页机制、排序选项、检索条件构建器的工作原理和可扩展性,并提供了详细的错误码说明。
+
+## 项目结构
+项目采用典型的Spring Boot架构,主要组件包括控制器、服务、数据访问层和配置文件。专利检索功能主要集中在`src/main/java/cn/cslg/pas/controller`和`src/main/java/cn/cslg/pas/service/business/es`目录下。
+
+```mermaid
+graph TD
+subgraph "控制器层"
+PatentController["PatentController"]
+end
+subgraph "服务层"
+EsService["EsService"]
+EsCountService["EsCountService"]
+EsPatentService["EsPatentService"]
+end
+subgraph "工厂层"
+EsBuilderFactory["EsBuilderFactory"]
+IQueryBuilder["IQueryBuilder"]
+end
+subgraph "配置层"
+patentJson["patent.json"]
+esCountAnalysisJson["esCountAnalysis.json"]
+end
+PatentController --> EsService
+PatentController --> EsCountService
+EsService --> EsPatentService
+EsBuilderFactory --> IQueryBuilder
+patentJson --> EsBuilderFactory
+esCountAnalysisJson --> EsCountService
+```
+
+**图表来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java)
+- [patent.json](file://src/main/resources/jsons/patent.json)
+- [esCountAnalysis.json](file://src/main/resources/jsons/esCountAnalysis.json)
+
+**章节来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L1-L315)
+- [project_structure](file://project_structure#L1-L100)
+
+## 核心组件
+核心组件包括`PatentController`、`EsService`和`EsCountService`,它们共同实现了专利检索功能。`PatentController`提供REST API端点,`EsService`处理Elasticsearch查询,`EsCountService`负责统计分析。
+
+**章节来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L62-L314)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L60-L800)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java#L52-L200)
+
+## 架构概述
+系统采用分层架构,前端通过REST API与`PatentController`交互,控制器调用服务层进行业务逻辑处理,服务层通过Elasticsearch客户端与搜索引擎交互。查询构建采用工厂模式,通过配置文件动态选择查询构建器。
+
+```mermaid
+graph TB
+subgraph "前端"
+Client["客户端"]
+end
+subgraph "API层"
+API["PatentController"]
+end
+subgraph "服务层"
+Service["EsService/EsCountService"]
+end
+subgraph "查询构建层"
+Factory["EsBuilderFactory"]
+Builders["各种QueryBuilder"]
+end
+subgraph "数据层"
+ES["Elasticsearch"]
+end
+Client --> API
+API --> Service
+Service --> Factory
+Factory --> Builders
+Service --> ES
+Builders --> ES
+```
+
+**图表来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L62-L314)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L60-L800)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java#L52-L200)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java#L1-L20)
+
+## 详细组件分析
+
+### 专利检索功能分析
+专利检索功能通过`PatentController`中的多个端点实现,包括基础检索、高级检索和结果分析。系统使用Elasticsearch作为后端搜索引擎,通过复杂的查询构建机制支持各种检索需求。
+
+#### 检索端点分析
+```mermaid
+classDiagram
+class PatentController {
++queryPatent(StringRequest) Response
++esCountAnalysis(EsAllCountVO) Response
++getPatentPageMessage(StringRequest) Response
+}
+class EsService {
++esSearch(QueryRequest) PatentDTO
++getCommonPatent(EsPatentCommonVO) SearchRequest.Builder
++getCommonSortMethod(OrderDTO[]) SortOptions[]
+}
+class EsCountService {
++esCountAnalysis(EsAllCountVO) EsCountDTO
++getAggregation(EsCountVO, Integer, Integer) Aggregation
+}
+PatentController --> EsService : "使用"
+PatentController --> EsCountService : "使用"
+EsService --> EsCountService : "使用"
+```
+
+**图表来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L102-L314)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L183-L273)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java#L77-L122)
+
+### 检索条件构建器分析
+检索条件构建器采用工厂模式实现,通过配置文件定义不同字段的查询构建策略。系统支持多种查询类型,包括匹配查询、前缀查询、范围查询等。
+
+#### 查询构建器类图
+```mermaid
+classDiagram
+class IQueryBuilder {
+<<interface>>
++creteQuery() Query
++setField(String)
++setValue(String)
++setOperator(String)
+}
+class MatchQueryBuilder {
++creteQuery() Query
+}
+class PrefixQueryBuilder {
++creteQuery() Query
+}
+class DateQueryBuilder {
++creteQuery() Query
+}
+class TermOrWildcardQueryBuilder {
++creteQuery() Query
+}
+class NestedQueryBuilder {
++creteQuery() Query
+}
+IQueryBuilder <|-- MatchQueryBuilder
+IQueryBuilder <|-- PrefixQueryBuilder
+IQueryBuilder <|-- DateQueryBuilder
+IQueryBuilder <|-- TermOrWildcardQueryBuilder
+IQueryBuilder <|-- NestedQueryBuilder
+IQueryBuilder <|-- CustomChildQueryBuilder
+class EsBuilderFactory {
+-Map~String, IQueryBuilder~ iQueryBuilderMap
++getClass(String) IQueryBuilder
+}
+EsBuilderFactory --> IQueryBuilder : "依赖"
+```
+
+**图表来源**
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+- [MatchQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/MatchQueryBuilder.java#L1-L71)
+- [PrefixQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/PrefixQueryBuilder.java#L1-L63)
+- [DateQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/DateQueryBuilder.java#L1-L63)
+- [TermOrWildcardQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/TermOrWildcardQueryBuilder.java#L1-L50)
+- [NestedQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/NestedQueryBuilder.java#L1-L31)
+- [CustomChildQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java#L1-L33)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java#L1-L20)
+
+#### 查询构建流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "PatentController"
+participant Service as "EsService"
+participant Factory as "EsBuilderFactory"
+participant Builder as "QueryBuilder"
+participant ES as "Elasticsearch"
+Client->>Controller : 发送检索请求
+Controller->>Service : 调用esSearch()
+Service->>Factory : 获取QueryBuilder
+Factory->>Builder : 返回具体构建器实例
+Service->>Builder : 设置查询参数
+Builder->>Builder : 构建Elasticsearch查询
+Service->>ES : 执行查询
+ES-->>Service : 返回查询结果
+Service-->>Controller : 返回结果
+Controller-->>Client : 返回响应
+```
+
+**图表来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L102-L108)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L183-L273)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java#L1-L20)
+
+#### 复杂查询构建流程
+```mermaid
+flowchart TD
+Start([开始]) --> ParseCondition["解析检索条件"]
+ParseCondition --> CheckType{"条件类型?"}
+CheckType --> |字符串条件| StringCondition["处理StringRequest"]
+CheckType --> |Map条件| MapCondition["处理MapRequest"]
+StringCondition --> BuildQuery["构建查询字符串"]
+MapCondition --> BuildQuery
+BuildQuery --> CheckCustom{"包含自定义栏位?"}
+CheckCustom --> |是| ParseCustom["解析自定义栏位"]
+CheckCustom --> |否| BuildESQuery["构建Elasticsearch查询"]
+ParseCustom --> AppendCustom["拼接自定义栏位条件"]
+AppendCustom --> BuildESQuery
+BuildESQuery --> AddProject{"包含项目ID?"}
+AddProject --> |是| AppendProject["添加项目ID条件"]
+AddProject --> |否| CheckProduct{"包含产品ID?"}
+AppendProject --> BuildFinalQuery
+CheckProduct --> |是| AppendProduct["添加产品ID条件"]
+CheckProduct --> |否| BuildFinalQuery
+AppendProduct --> BuildFinalQuery
+BuildFinalQuery --> ExecuteQuery["执行Elasticsearch查询"]
+ExecuteQuery --> ProcessResult["处理查询结果"]
+ProcessResult --> ReturnResult["返回结果"]
+ReturnResult --> End([结束])
+```
+
+**图表来源**
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L183-L273)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L509-L537)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L546-L617)
+
+**章节来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L102-L108)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L183-L800)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java#L1-L20)
+
+## 依赖分析
+系统依赖关系清晰,采用分层架构,各组件职责明确。控制器层依赖服务层,服务层依赖查询构建工厂和Elasticsearch客户端。
+
+```mermaid
+graph TD
+PatentController --> EsService
+PatentController --> EsCountService
+EsService --> EsPatentService
+EsService --> EsCountService
+EsService --> EsCustomFieldService
+EsCountService --> EsService
+EsCountService --> EsCountAnalysisBuilderFactory
+EsBuilderFactory --> IQueryBuilder
+EsBuilderFactory --> patentJson
+EsCountService --> esCountAnalysisJson
+```
+
+**图表来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L64-L101)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L64-L77)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java#L63-L68)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java#L1-L20)
+- [patent.json](file://src/main/resources/jsons/patent.json)
+- [esCountAnalysis.json](file://src/main/resources/jsons/esCountAnalysis.json)
+
+**章节来源**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L64-L101)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L64-L77)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java#L63-L68)
+
+## 性能考虑
+系统在性能方面做了多项优化:
+1. 使用Elasticsearch作为搜索引擎,支持高效全文检索
+2. 实现了查询结果缓存机制
+3. 采用分页查询避免一次性加载大量数据
+4. 支持同族分组查询,减少重复数据
+5. 使用异步处理提高响应速度
+
+## 故障排除指南
+### 常见错误码
+| 错误码 | 描述 | 解决方案 |
+|-------|------|---------|
+| BUSINESS_ERROR | 业务错误 | 检查请求参数是否正确 |
+| ES检索失败 | Elasticsearch查询失败 | 检查Elasticsearch服务状态 |
+| 查询语法错误 | 检索条件语法错误 | 检查检索条件格式 |
+
+### 常见问题
+1. **检索超时**:检查查询条件是否过于复杂,考虑添加更多过滤条件
+2. **结果不准确**:检查字段映射是否正确,确认查询构建器选择是否恰当
+3. **性能低下**:检查是否缺少必要的索引,考虑优化查询条件
+
+**章节来源**
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L132-L133)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java#L246-L247)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java#L184-L185)
+- [ExceptionEnum.java](file://src/main/java/cn/cslg/pas/exception/ExceptionEnum.java)
+
+## 结论
+本文档详细记录了专利检索功能的API设计和实现。系统采用基于Elasticsearch的搜索架构,通过工厂模式实现灵活的查询构建机制。系统支持基础检索、高级检索和统计分析等多种功能,具有良好的可扩展性和性能表现。
+
+## 附录
+
+### API端点列表
+| 端点 | 方法 | 描述 |
+|------|------|------|
+| /patent/queryPatent | POST | 查询专利 |
+| /patent/esCountAnalysis | POST | 专利聚合统计 |
+| /patent/getPatentPageMessage | POST | 查询分页信息 |
+
+### 配置文件说明
+**patent.json**:定义了各个检索字段的配置,包括字段名称、类型、查询构建器等。
+**esCountAnalysis.json**:定义了统计分析的配置,包括聚合字段、构建器等。

+ 461 - 0
.qoder/repowiki/zh/content/API端点参考/专利管理API/专利管理API.md

@@ -0,0 +1,461 @@
+# 专利管理API
+
+<cite>
+**本文档引用的文件**  
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java)
+- [SearchRecordController.java](file://src/main/java/cn/cslg/pas/controller/SearchRecordController.java)
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [ExportController.java](file://src/main/java/cn/cslg/pas/controller/ExportController.java)
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+- [QueryEsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/QueryEsCustomFieldDTO.java)
+- [PatentDetailDTO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentDetailDTO.java)
+- [RetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDTO.java)
+- [AddSearchRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/AddSearchRecordDTO.java)
+- [QuerySearchRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QuerySearchRecordDTO.java)
+- [ResponseEnum.java](file://src/main/java/cn/cslg/pas/common/utils/ResponseEnum.java)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [核心API端点](#核心api端点)
+3. [专利检索API](#专利检索api)
+4. [专利详情获取API](#专利详情获取api)
+5. [检索记录管理API](#检索记录管理api)
+6. [专利数据导出API](#专利数据导出api)
+7. [批量导入API](#批量导入api)
+8. [错误码说明](#错误码说明)
+9. [请求/响应示例](#请求响应示例)
+
+## 简介
+本API文档详细描述了专利管理系统中的核心功能接口,包括专利检索、专利详情获取、检索记录管理、数据导出和批量导入等功能。系统基于Elasticsearch实现复杂的专利数据查询和分析,支持分页查询、复杂条件检索和数据导出功能。
+
+## 核心API端点
+
+### 基础路径
+所有API端点均以`/api/xiaoshi`为前缀,各功能模块的路径如下:
+- 专利管理:`/api/xiaoshi/patent`
+- 检索记录:`/api/xiaoshi/searchRecord`
+- 检索历史:`/api/xiaoshi/retrieveRecord`
+- 数据导出:`/api/xiaoshi/export`
+- 任务导入:`/api/xiaoshi/importTask`
+
+## 专利检索API
+
+### 专利查询
+**端点**: `POST /patent/queryPatent`  
+**功能**: 根据查询条件检索专利数据
+
+**请求参数**:
+- `StringRequest`: 包含查询条件的字符串请求对象
+
+**分页机制**:
+系统支持标准分页查询,通过`current`和`size`参数控制分页:
+- `current`: 当前页码(从1开始)
+- `size`: 每页记录数
+
+**复杂查询参数**:
+通过`QueryEsCustomFieldDTO`对象支持基于Elasticsearch的复杂查询:
+
+```java
+@Data
+public class QueryEsCustomFieldDTO {
+    private Integer projectId;        // 专题库或报告ID
+    private Integer fieldType;        // 栏位类型
+    private String fieldId;           // 栏位ID
+    private String patentNo;          // 专利号
+    private Integer taskId;           // 任务ID
+}
+```
+
+**Section sources**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L102-L108)
+- [QueryEsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/QueryEsCustomFieldDTO.java#L1-L33)
+
+## 专利详情获取API
+
+### 专利详情查询
+**端点**: `POST /patent/selectPatentDetail`  
+**功能**: 根据专利号获取专利详细信息
+
+**请求参数**:
+- `PatentNoVO`: 包含专利号的查询对象
+
+**响应数据结构**:
+`PatentDetailDTO`包含完整的专利信息:
+
+```java
+@Data
+public class PatentDetailDTO {
+    private String patentNo;                    // 专利号
+    private ContentVO title;                    // 标题
+    private ContentVO abstractStr;              // 摘要
+    private String appNo;                       // 申请号
+    private Date appDate;                       // 申请日
+    private String publicNo;                    // 公开号
+    private Date publicDate;                    // 公开日
+    private String grantNo;                     // 授权号
+    private Date grantDate;                     // 授权日
+    private List<String> applicant;             // 申请人
+    private PersonAddress applicantAddr;        // 申请人地址
+    private List<String> rightHolder;           // 权利人
+    private PersonAddress rightHolderAddr;      // 权利人地址
+    private List<String> inventor;              // 发明人
+    private String agency;                      // 代理机构
+    private String agencyNo;                    // 代理机构编号
+    private List<String> agent;                 // 代理人
+    private PatentClassify mipc;                // IPC分类号(主)
+    private List<PatentClassify> ipc;           // IPC集合
+    private ContentVO claim;                    // 权利要求
+    private List<Text> publicFullText;          // 公开说明书文本
+    private List<Text> grantFullText;           // 授权说明书文本
+    private String simpleStatus;                // 专利状态
+    private String patentType;                  // 专利类型
+    private List<String> legalStatus;           // 法律状态
+}
+```
+
+**Section sources**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L110-L115)
+- [PatentDetailDTO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentDetailDTO.java#L1-L105)
+
+## 检索记录管理API
+
+### 添加或更新检索记录
+**端点**: `POST /searchRecord/addSearchRecord`  
+**功能**: 创建或更新检索记录
+
+**请求参数**:
+`AddSearchRecordDTO`对象包含检索记录的详细信息:
+
+```java
+@Data
+public class AddSearchRecordDTO {
+    private Integer id;                         // 记录ID(更新时使用)
+    private String searchCondition;             // 检索条件
+    private String searchBase;                  // 检索数据库
+    private Integer allNum;                     // 检索数量
+    private String searchPerson;                // 检索人
+    private Date searchTime;                    // 检索时间
+    private Integer projectId;                  // 项目ID
+}
+```
+
+**Section sources**
+- [SearchRecordController.java](file://src/main/java/cn/cslg/pas/controller/SearchRecordController.java#L33-L45)
+- [AddSearchRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/AddSearchRecordDTO.java#L1-L38)
+
+### 查询检索记录
+**端点**: `POST /searchRecord/querySearchRecords`  
+**功能**: 分页查询检索记录
+
+**请求参数**:
+`QuerySearchRecordDTO`支持分页和排序查询:
+
+```java
+@Data
+public class QuerySearchRecordDTO {
+    private Integer projectId;                  // 项目ID
+    private Long size;                          // 每页大小
+    private Long current;                       // 当前页码
+    private OrderDTO orderDTO;                  // 排序条件
+}
+```
+
+**响应格式**:
+返回`Records`对象,包含分页信息和数据列表。
+
+**Section sources**
+- [SearchRecordController.java](file://src/main/java/cn/cslg/pas/controller/SearchRecordController.java#L61-L72)
+- [QuerySearchRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QuerySearchRecordDTO.java#L1-L16)
+
+### 删除检索记录
+**端点**: `POST /searchRecord/removeSearchRecords`  
+**功能**: 批量删除检索记录
+
+**请求参数**:
+- `List<Integer>`: 要删除的记录ID列表
+
+**Section sources**
+- [SearchRecordController.java](file://src/main/java/cn/cslg/pas/controller/SearchRecordController.java#L47-L59)
+
+### 检索历史管理
+**端点**: `POST /retrieveRecord/addRetrieveRecord`  
+**功能**: 添加检索历史记录
+
+**请求参数**:
+`RetrieveRecordDTO`包含检索历史的详细信息:
+
+```java
+@Data
+public class RetrieveRecordDTO {
+    private Integer id;                         // 记录ID
+    private String conditions;                  // 检索条件
+    private String dbType;                      // 数据库类型
+    private Date retrieveTime;                  // 检索时间
+    private Date updateTime;                    // 更新时间
+    private Integer totalNum;                   // 总数量
+    private String searchSetting;               // 搜索设置
+}
+```
+
+**其他操作**:
+- `POST /retrieveRecord/updateRetrieveRecord`: 更新检索历史
+- `POST /retrieveRecord/queryRetrieveRecord`: 查询检索历史
+- `POST /retrieveRecord/deleteRetrieveRecord`: 删除检索历史
+
+**Section sources**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L36-L67)
+- [RetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDTO.java#L1-L33)
+
+## 专利数据导出API
+
+### 导出PDF首页
+**端点**: `POST /patent/exportPDFFirstPage`  
+**功能**: 导出专利PDF首页
+
+**请求参数**:
+- `EsCustomFieldBatchVO`: 包含要导出的专利信息和项目ID
+
+**Section sources**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L234-L250)
+
+### 导出专利Excel
+**端点**: `POST /patent/exportPatentExcel`  
+**功能**: 导出专利数据到Excel文件
+
+**请求参数**:
+- `EsCustomFieldBatchVO`: 包含要导出的专利信息和项目ID
+
+**Section sources**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L252-L268)
+
+### 导出二叉树
+**端点**: `POST /export/export`  
+**功能**: 导出二叉树结构
+
+**请求参数**:
+- `multipartFile`: 上传的文件
+
+**Section sources**
+- [ExportController.java](file://src/main/java/cn/cslg/pas/controller/ExportController.java#L25-L38)
+
+### 导出缺失专利号
+**端点**: `POST /export/exportPatentNo`  
+**功能**: 导出缺失的专利号信息
+
+**Section sources**
+- [ExportController.java](file://src/main/java/cn/cslg/pas/controller/ExportController.java#L40-L52)
+
+## 批量导入API
+
+### 添加导入任务
+**端点**: `POST /importTask/addImportTask`  
+**功能**: 创建新的导入任务
+
+**请求参数**:
+- `ImportTaskDTO`: 导入任务的详细信息
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L42-L53)
+
+### 查询导入任务
+**端点**: `POST /importTask/queryImportTask`  
+**功能**: 查询导入任务状态
+
+**请求参数**:
+- `StringRequest`: 查询条件
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L34-L40)
+
+### 更新任务状态
+**端点**: `GET /importTask/updateImportTaskState`  
+**功能**: 更新导入任务的状态
+
+**请求参数**:
+- `taskId`: 任务ID
+- `state`: 新的状态值
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L55-L62)
+
+### 添加PDF导入任务
+**端点**: `POST /importTask/addPdfTask`  
+**功能**: 创建PDF文件导入任务
+
+**请求参数**:
+- `AddImportPDFTaskDTO`: PDF导入任务信息
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L65-L70)
+
+### 查询任务报错信息
+**端点**: `POST /importTask/getPatentImportLog`  
+**功能**: 获取导入任务的错误日志
+
+**请求参数**:
+- `ImportErrorLogQueryDTO`: 错误日志查询条件
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L73-L78)
+
+## 错误码说明
+
+### 标准响应码
+系统使用统一的响应码表示操作结果:
+
+```java
+public enum ResponseEnum {
+    SUCCESS(200, "请求成功"),
+    UNAUTHORIZED(401, "未登录"),
+    NOT_PERMISSION(402, "无操作权限"),
+    SYSTEM_ERROR(500, "系统异常"),
+    PARAMS_ERROR(202, "参数错误"),
+    CONDITION_ERROR(203, "检索式错误"),
+    PATENT_IMPORT_TASK_SUCCESS(903, "导入任务完成"),
+    PATENT_IMPORT_PATENT_PART_SUCCESS(900, "专利信息部分上传成功"),
+    PATENT_EXPORT_TASK(602, "导出专利信息"),
+    PATENT_EXPORT_TASK_DONE(603, "导出专利信息完成"),
+    PATENT_PDF_EXPORT_TASK(604, "导出PDF首页"),
+    PATENT_PDF_EXPORT_TASK_DONE(605, "导出PDF首页完成");
+}
+```
+
+### 异常处理
+系统使用`XiaoShiException`作为通用异常类:
+
+```java
+public class XiaoShiException extends RuntimeException {
+    private String errorCode;       // 异常代码
+    private String errorMessage;    // 异常信息
+}
+```
+
+**常见错误场景**:
+- **专利数据不存在**: 当查询的专利号不存在时,返回`null`或空结果
+- **检索超时**: 复杂查询可能导致超时,系统会返回相应的错误码
+- **权限不足**: 未登录或无权限操作时返回401或402状态码
+- **参数错误**: 请求参数格式不正确时返回202状态码
+
+**Section sources**
+- [ResponseEnum.java](file://src/main/java/cn/cslg/pas/common/utils/ResponseEnum.java#L1-L47)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java#L1-L39)
+
+## 请求/响应示例
+
+### 专利检索示例
+**curl命令**:
+```bash
+curl -X POST "http://localhost:8080/api/xiaoshi/patent/queryPatent" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "projectId": 123,
+    "fieldType": 1,
+    "fieldId": "inventor",
+    "patentNo": "CN202310000001"
+  }'
+```
+
+**请求JSON**:
+```json
+{
+  "projectId": 123,
+  "fieldType": 1,
+  "fieldId": "inventor",
+  "patentNo": "CN202310000001"
+}
+```
+
+**成功响应**:
+```json
+{
+  "code": 200,
+  "message": "请求成功",
+  "data": {
+    "total": 1,
+    "pageNum": 1,
+    "pageSize": 10,
+    "patents": [
+      {
+        "patentNo": "CN202310000001",
+        "title": "一种新型专利技术",
+        "applicant": ["申请人A", "申请人B"]
+      }
+    ]
+  }
+}
+```
+
+### 专利详情获取示例
+**curl命令**:
+```bash
+curl -X POST "http://localhost:8080/api/xiaoshi/patent/selectPatentDetail" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "patentNo": "CN202310000001"
+  }'
+```
+
+**请求JSON**:
+```json
+{
+  "patentNo": "CN202310000001"
+}
+```
+
+**成功响应**:
+```json
+{
+  "code": 200,
+  "message": "请求成功",
+  "data": {
+    "patentNo": "CN202310000001",
+    "title": "一种新型专利技术",
+    "abstractStr": "本发明公开了一种新型专利技术...",
+    "appNo": "202310000001",
+    "appDate": "2023-01-01",
+    "applicant": ["申请人A", "申请人B"],
+    "inventor": ["发明人A", "发明人B"],
+    "simpleStatus": "授权",
+    "patentType": "发明专利"
+  }
+}
+```
+
+### 检索记录管理示例
+**添加检索记录**:
+```bash
+curl -X POST "http://localhost:8080/api/xiaoshi/searchRecord/addSearchRecord" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "searchCondition": "发明人:张三 AND 申请人:公司A",
+    "searchBase": "CNIPR",
+    "allNum": 25,
+    "searchPerson": "管理员",
+    "searchTime": "2023-07-15",
+    "projectId": 123
+  }'
+```
+
+**查询检索记录**:
+```bash
+curl -X POST "http://localhost:8080/api/xiaoshi/searchRecord/querySearchRecords" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "projectId": 123,
+    "size": 10,
+    "current": 1,
+    "orderDTO": {
+      "fieldName": "searchTime",
+      "order": "desc"
+    }
+  }'
+```
+
+**Section sources**
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java)
+- [SearchRecordController.java](file://src/main/java/cn/cslg/pas/controller/SearchRecordController.java)
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [ExportController.java](file://src/main/java/cn/cslg/pas/controller/ExportController.java)
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)

+ 306 - 0
.qoder/repowiki/zh/content/API端点参考/专利管理API/专利详情API.md

@@ -0,0 +1,306 @@
+# 专利详情API
+
+<cite>
+**本文档引用的文件**  
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+- [PatentDetailDTO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentDetailDTO.java)
+- [EsPatentFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/EsPatentFieldsVO.java)
+- [InnerPatentFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/InnerPatentFieldsVO.java)
+- [FieldValueVO.java](file://src/main/java/cn/cslg/pas/common/vo/FieldValueVO.java)
+- [GetPatentSimilarScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreDTO.java)
+- [GetPatentSimilarScoreVO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreVO.java)
+- [PatentStarApiService.java](file://src/main/java/cn/cslg/pas/service/common/PatentStarApiService.java)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [核心API端点](#核心api端点)
+3. [专利数据字段说明](#专利数据字段说明)
+4. [专利关联数据获取](#专利关联数据获取)
+5. [缓存机制与性能优化](#缓存机制与性能优化)
+6. [错误码说明](#错误码说明)
+7. [API使用示例](#api使用示例)
+8. [结论](#结论)
+
+## 简介
+专利详情API提供了一套完整的专利信息查询服务,支持获取专利详细信息、专利引用关系和专利相似度分析等功能。该API通过与外部专利数据源(如专利之星)集成,为用户提供全面的专利检索和分析能力。系统采用Elasticsearch作为主要数据存储,结合外部API调用和Python服务进行数据处理和相似度计算。
+
+**Section sources**
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+
+## 核心API端点
+
+### 获取专利详细信息 (GET /patent/detail)
+该端点用于根据专利号获取专利的详细信息。通过`queryPatentDetailByPatentNo`接口,系统能够从外部数据源获取完整的专利检索详情数据。
+
+### 专利引用关系 (GET /references/byPatentNo)
+该端点用于查询专利的引用关系,包括引证文献和被引文献。通过`getFamilyByPubNo`和`getCitedNumByPubNo`等接口,可以获取同族专利和被引用次数等信息。
+
+### 专利相似度分析 (GET /patent/similar)
+该端点用于获取专利的相似度信息。通过`getPatentSimilarMess`接口,系统调用Python服务进行相似度计算,返回相关专利的相似度评分。
+
+```mermaid
+flowchart TD
+A[客户端请求] --> B{请求类型}
+B --> |专利详情| C[queryPatentDetailByPatentNo]
+B --> |引用关系| D[getFamilyByPubNo]
+B --> |相似度分析| E[getPatentSimilarMess]
+C --> F[调用专利之星API]
+D --> F
+E --> G[调用Python服务]
+F --> H[返回专利数据]
+G --> H
+H --> I[客户端响应]
+```
+
+**Diagram sources**
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+
+**Section sources**
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+
+## 专利数据字段说明
+
+### EsPatentFieldsVO数据结构
+`EsPatentFieldsVO`是专利字段的主要数据结构,包含专利号和内部字段集合。
+
+```mermaid
+classDiagram
+class EsPatentFieldsVO {
++String patentNo
++List<InnerPatentFieldsVO> innerClassFields
+}
+class InnerPatentFieldsVO {
++Integer fieldType
++String field
++List<FieldValueVO> fieldValueVOS
+}
+class FieldValueVO {
++Integer valueId
++String value
++String path
++String pathValue
++Integer num
+}
+EsPatentFieldsVO --> InnerPatentFieldsVO : "包含"
+InnerPatentFieldsVO --> FieldValueVO : "包含"
+```
+
+**Diagram sources**
+- [EsPatentFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/EsPatentFieldsVO.java)
+- [InnerPatentFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/InnerPatentFieldsVO.java)
+- [FieldValueVO.java](file://src/main/java/cn/cslg/pas/common/vo/FieldValueVO.java)
+
+### 专利基础信息字段
+- **专利号 (patentNo)**: 专利的唯一标识号
+- **标题 (title)**: 专利的标题信息,包含多语言版本
+- **摘要 (abstractStr)**: 专利的摘要内容
+- **申请号 (appNo)**: 专利的申请号码
+- **申请日 (appDate)**: 专利的申请日期,格式为yyyy-MM-dd
+- **公开号 (publicNo)**: 专利的公开号码
+- **公开日 (publicDate)**: 专利的公开日期
+- **授权号 (grantNo)**: 专利的授权号码
+- **授权日 (grantDate)**: 专利的授权日期
+
+### 法律状态字段
+- **simpleStatus**: 专利状态(如有效、失效、审中等)
+- **legalStatus**: 详细的法律状态列表
+- **examinationDate**: 实审日
+- **epCountry**: EP指定国状态
+
+### 技术领域字段
+- **mipc**: IPC分类号(主)
+- **ipc**: IPC分类号集合
+- **mcpc**: CPC分类号(主)
+- **cpc**: CPC分类号集合
+- **mupc**: UPC分类号(主)
+- **upc**: UPC分类号集合
+- **mloc**: LOC分类号(主)
+- **loc**: LOC分类号集合
+
+### 申请人信息字段
+- **applicant**: 申请人列表
+- **applicantAddr**: 申请人地址
+- **standerApplicant**: 标准申请人
+- **mergeApplicant**: 合并申请人
+- **applicantsNum**: 申请人数量
+- **rightHolder**: 权利人
+- **rightHolderAddr**: 权利人地址
+- **standerRightHolder**: 标准权利人
+- **mergeRightHolder**: 合并权利人
+- **rightHolderNum**: 权利人数量
+
+**Section sources**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+- [PatentDetailDTO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentDetailDTO.java)
+
+## 专利关联数据获取
+
+### 同族专利获取
+通过`getFamilyByPubNo`接口,可以根据公开号获取同族专利信息。系统支持多种同族类型:
+- **简单同族 (simple_family)**: 基于基本同族规则
+- **PatSnap同族 (patsnap_family)**: 基于PatSnap算法
+- **INPADOC同族 (inpadoc_family)**: 基于INPADOC标准
+
+### 引证文献获取
+通过`getENBib`接口获取世界专利著录信息,包括引证文献。系统还提供`getCitedNumByPubNo`接口获取被引用次数。
+
+### 被引文献获取
+通过引用专利数量字段`quote_patent_no_num`和被引用专利数量字段`quoted_patent_no_num`,可以获取专利的引用和被引用情况。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "PatentStarController"
+participant Service as "PatentStarApiService"
+participant ExternalAPI as "外部专利API"
+Client->>Controller : GET /patentStar/getFamilyByPubNo?patentNo=CN123456
+Controller->>Service : getFamilyByPubNoApi(patentNo)
+Service->>ExternalAPI : 调用外部API获取同族专利
+ExternalAPI-->>Service : 返回同族专利数据
+Service-->>Controller : 返回数据
+Controller-->>Client : 返回JSON响应
+```
+
+**Diagram sources**
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+- [PatentStarApiService.java](file://src/main/java/cn/cslg/pas/service/common/PatentStarApiService.java)
+
+**Section sources**
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+
+## 缓存机制与性能优化
+
+### 数据缓存策略
+系统采用多层缓存机制提高性能:
+1. **Elasticsearch缓存**: 主要数据存储在Elasticsearch中,提供快速检索能力
+2. **Redis缓存**: 使用`RedisUtil`对频繁访问的数据进行缓存
+3. **本地缓存**: 对配置信息和静态数据进行本地缓存
+
+### 性能优化措施
+- **异步处理**: 使用`@Async`注解实现异步任务处理
+- **连接池优化**: 配置合理的连接超时和读写超时时间
+- **批量处理**: 支持批量查询和处理,减少网络开销
+- **索引优化**: 在数据库和Elasticsearch中建立适当的索引
+
+```mermaid
+flowchart LR
+A[客户端请求] --> B{数据是否存在缓存}
+B --> |是| C[从缓存读取]
+B --> |否| D[从数据库/Elasticsearch读取]
+D --> E[处理数据]
+E --> F[存入缓存]
+F --> G[返回数据]
+C --> G
+```
+
+**Diagram sources**
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+
+**Section sources**
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java)
+
+## 错误码说明
+
+### 通用错误码
+| 错误码 | 说明 | 处理建议 |
+|-------|------|---------|
+| 200 | 请求成功 | 正常处理响应数据 |
+| 400 | 请求参数错误 | 检查请求参数格式和必填项 |
+| 401 | 未授权访问 | 检查认证信息 |
+| 404 | 资源未找到 | 检查专利号是否存在 |
+| 500 | 服务器内部错误 | 联系技术支持 |
+
+### 专利相关特定错误
+- **专利号不存在**: 当查询的专利号在系统中不存在时,返回空结果或404错误
+- **数据获取失败**: 外部API调用失败时,返回500错误并记录错误日志
+- **解析失败**: XML或JSON解析失败时,返回400错误
+- **超时错误**: 网络请求超时时,返回504错误
+
+**Section sources**
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+## API使用示例
+
+### 获取专利详细信息
+```bash
+curl -X GET "http://localhost:8080/api/patentStar/queryPatentDetailByPatentNo?patentNo=CN123456" \
+-H "Content-Type: application/json"
+```
+
+### 获取专利引用关系
+```bash
+curl -X GET "http://localhost:8080/api/patentStar/getFamilyByPubNo?patentNo=CN123456" \
+-H "Content-Type: application/json"
+```
+
+### 获取专利相似度分析
+```bash
+curl -X POST "http://localhost:8080/api/patentStar/getPatentSimilarMess" \
+-H "Content-Type: application/json" \
+-d '{
+  "text": "一种新型电池技术",
+  "projectId": 123,
+  "patentScoreDTOList": [
+    {
+      "patentNo": "CN123456",
+      "score": 0.8
+    }
+  ]
+}'
+```
+
+### 完整的专利详情响应示例
+```json
+{
+  "patentNo": "CN123456",
+  "title": {
+    "textContent": "一种新型电池技术",
+    "language": "zh"
+  },
+  "abstractStr": {
+    "textContent": "本发明公开了一种新型电池技术...",
+    "language": "zh"
+  },
+  "appNo": "202310000001",
+  "appDate": "2023-01-01",
+  "publicNo": "CN123456A",
+  "publicDate": "2023-07-01",
+  "grantNo": "CN123456B",
+  "grantDate": "2024-01-01",
+  "applicant": ["公司A", "公司B"],
+  "applicantAddr": {
+    "address": "北京市海淀区",
+    "country": "CN"
+  },
+  "simpleStatus": "有效",
+  "patentType": "发明专利",
+  "mipc": {
+    "code": "H01M",
+    "description": "电池"
+  },
+  "ipc": [
+    {
+      "code": "H01M", 
+      "description": "电池"
+    },
+    {
+      "code": "H01M10",
+      "description": "锂离子电池"
+    }
+  ]
+}
+```
+
+**Section sources**
+- [PatentStarController.java](file://src/main/java/cn/cslg/pas/controller/outApi/PatentStarController.java)
+- [PatentDetailDTO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentDetailDTO.java)
+
+## 结论
+专利详情API提供了一套完整的专利信息查询解决方案,涵盖了专利详细信息、引用关系和相似度分析等核心功能。通过合理的数据结构设计和性能优化策略,系统能够高效地处理专利数据查询请求。API设计遵循RESTful规范,提供了清晰的错误处理机制和详细的文档说明,便于开发者集成和使用。

+ 359 - 0
.qoder/repowiki/zh/content/API端点参考/分析与报告API/FTO分析API.md

@@ -0,0 +1,359 @@
+# FTO分析API
+
+<cite>
+**本文引用的文件列表**
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [FTOCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/TortCompareRecordDTO.java)
+- [TortDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/TortDTO.java)
+- [FTOCompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/FTOCompareRecordVO.java)
+- [TortVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/TortVO.java)
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java)
+- [FTOCompareRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/FTOCompareRecordMapper.java)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录:API使用示例与完整流程](#附录api使用示例与完整流程)
+
+## 简介
+本文件面向FTO(Freedom to Operate,自由实施)分析功能,系统化梳理FTOController提供的所有端点,覆盖侵权比对记录的创建、查询、更新与删除能力;深入解析侵权比对(TortCompareRecord)的数据结构与关联实体;阐明FTO分析的侵权判定逻辑与风险评估机制;并给出FTO分析报告生成流程与结果解读方法。最后提供完整的API使用示例,展示如何通过API执行一次完整的FTO分析。
+
+## 项目结构
+FTO分析相关代码主要分布在以下层次:
+- 控制器层:FTOController对外暴露REST接口
+- 业务服务层:FTOCompareRecordService负责FTO分析主流程与数据装载
+- 领域模型与映射:FTOCompareRecord实体及MyBatis映射
+- DTO/VO:TortCompareRecordDTO、TortDTO、FTOCompareRecordVO、TortVO等
+- 报告导出:ReportExportService与TemplateExportService用于生成报告并读取最终对比结果
+
+```mermaid
+graph TB
+subgraph "控制器层"
+C1["FTOController"]
+end
+subgraph "业务服务层"
+S1["FTOCompareRecordService"]
+S2["TortCompareRecordService"]
+S3["ProjectTaskService"]
+end
+subgraph "领域与映射"
+M1["FTOCompareRecord"]
+M2["FTOCompareRecordMapper.xml"]
+end
+subgraph "DTO/VO"
+D1["TortCompareRecordDTO"]
+D2["TortDTO"]
+V1["FTOCompareRecordVO"]
+V2["TortVO"]
+end
+subgraph "报告导出"
+E1["ReportExportService"]
+E2["TemplateExportService"]
+end
+C1 --> S1
+C1 --> S3
+S1 --> S2
+S1 --> M1
+S1 --> M2
+S1 --> D1
+S1 --> D2
+S1 --> V1
+S1 --> V2
+E1 --> S2
+E2 --> S2
+```
+
+图表来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L35-L138)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L1-L200)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L457-L568)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L60)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L274-L299)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java#L272-L299)
+
+章节来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L35-L138)
+
+## 核心组件
+- FTOController:提供FTO分析相关REST接口,包括获取对比结果、保存对比结果、新增FTO协同任务、保存协同任务结果、查询协同前后对比结果、保存最终结果、查询最终结果、查询报告专利最新对比结果、查询对比过的专利等。
+- FTOCompareRecordService:FTO分析主流程服务,负责权要拆分、特征装载、侵权比对记录加载与保存、最终结果合并等。
+- TortCompareRecordService:与侵权分析模块协作,提供特征装载、原始/当前/最终记录装载等能力。
+- ProjectTaskService:提供FTO协同任务的创建与管理。
+- 实体与映射:FTOCompareRecord实体及Mapper,支持按项目ID与对比结果筛选已对比过的专利号。
+- DTO/VO:TortCompareRecordDTO、TortDTO、FTOCompareRecordVO、TortVO等,承载请求与响应数据结构。
+
+章节来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L35-L138)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L1-L200)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L457-L568)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L60)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)
+
+## 架构总览
+FTO分析API采用典型的分层架构:
+- 控制器接收请求,校验参数,调用业务服务
+- 业务服务协调ES检索、特征拆分、侵权比对记录查询与保存
+- 数据持久化通过MyBatis完成,支持按项目ID与对比结果筛选对比过的专利
+- 报告导出服务从最终对比结果中提取数据并生成报告
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Ctrl as "FTOController"
+participant Svc as "FTOCompareRecordService"
+participant TortSvc as "TortCompareRecordService"
+participant TaskSvc as "ProjectTaskService"
+participant Mapper as "FTOCompareRecordMapper.xml"
+participant DB as "数据库"
+Client->>Ctrl : POST /fto/getFTOCompareRecord
+Ctrl->>Svc : getFTOCompareRecord(dto)
+Svc->>Svc : 权要拆分/特征装载
+Svc->>TortSvc : 加载特征与侵权记录
+TortSvc-->>Svc : 返回TortVO集合
+Svc-->>Ctrl : 返回TortCompareRecordVO
+Ctrl-->>Client : 成功响应
+Client->>Ctrl : POST /fto/addFTOCompareRecord
+Ctrl->>Svc : addFTOCompareRecord(dto)
+Svc->>Mapper : 按项目ID/任务ID/专利号查询记录
+Svc->>DB : 保存/更新侵权比对记录
+Svc-->>Ctrl : 返回保存ID列表
+Ctrl-->>Client : 成功响应
+```
+
+图表来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L46-L73)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L88-L151)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L457-L568)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)
+
+## 详细组件分析
+
+### FTOController 接口清单与行为
+- 获取FTO对比结果(POST /fto/getFTOCompareRecord)
+  - 输入:GetFeatureSplitDTO(包含任务ID、专利号、是否重拆、拆分依据、拆分类型等)
+  - 输出:TortCompareRecordVO(包含权要层级与特征对比结果)
+  - 行为:根据任务ID获取报告ID;若需重拆则先清理历史对比记录;调用特征拆分与装载逻辑
+- 保存FTO对比结果(POST /fto/addFTOCompareRecord)
+  - 输入:TortCompareRecordDTO(包含项目ID、任务ID、专利号、特征与侵权分析对比结果DTO列表等)
+  - 输出:包含保存ID列表的通用响应
+  - 行为:校验参数;保存或更新侵权比对记录;异常时返回相应错误码
+- 新增FTO协同任务(POST /fto/addFTOAssitTask)
+  - 输入:TortTaskDTO
+  - 输出:新任务ID
+- 保存FTO协同任务对比结果(POST /fto/addFTOAssitTaskResult)
+  - 输入:TortCompareRecordDTO
+  - 输出:保存ID列表
+- 查询FTO协同前后对比结果(GET /fto/getFTOAssitResult)
+  - 输入:专利号、任务ID
+  - 输出:TortCompareRecordVO(区分原始与当前记录)
+- 保存最终对比结果(POST /fto/addFinalAssitResult)
+  - 输入:TortCompareRecordDTO
+  - 输出:保存ID列表
+- 查询最终结果(GET /fto/getFTOFinalResult)
+  - 输入:专利号、任务ID
+  - 输出:TortCompareRecordVO(最终记录)
+- 查询报告专利最新对比结果(GET /fto/getLastRecord)
+  - 输入:项目ID、专利号
+  - 输出:TortCompareRecordVO(最新记录)
+- 查询对比过的专利(POST /fto/getComparedPatent)
+  - 输入:ComparedPatentDTO
+  - 输出:对比过的专利号列表(可按对比结果过滤)
+
+章节来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L46-L136)
+- [FTOCompareRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/FTOCompareRecordMapper.java#L1-L19)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)
+
+### 侵权比对记录(TortCompareRecord)数据结构与关联实体
+- 实体定义(FTOCompareRecord)
+  - 字段:标的说明、对比说明、对比文献编号、报告ID、对比结果、特征ID、任务ID、来源任务ID等
+  - 关联:与特征、项目任务、项目等存在外键关系
+- VO定义(FTOCompareRecordVO)
+  - 字段:id、标的说明、对比说明、对比结果、结果字符串
+- DTO定义(TortCompareRecordDTO)
+  - 字段:项目ID、任务ID、专利号、文献ID、特征与侵权分析对比结果DTO列表、权要对比说明列表、文献对比说明
+- 特征与侵权分析VO(TortVO)
+  - 字段:特征ID、内容、专利号、权要排序/名称、解释文本、原始/当前/最终记录VO、创建人信息、创建时间、结果字符串、标的说明等
+
+章节来源
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L60)
+- [FTOCompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/FTOCompareRecordVO.java#L1-L33)
+- [TortCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/TortCompareRecordDTO.java#L1-L40)
+- [TortVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/TortVO.java#L1-L68)
+
+### 侵权判定逻辑与风险评估机制
+- 判定维度
+  - 对比结果字段(0字面相同、1等同、2不等同、3待确定),用于直接判定侵权可能性
+  - 标的说明与对比说明:辅助判断侵权范围与程度
+- 记录类型
+  - 原始记录(发起人初始比对)、当前记录(协同人处理后的中间结果)、最终记录(合并后的最终结论)
+- 合并策略
+  - 当协同人未提供当前记录时,默认采用原始记录作为当前记录
+  - 最终记录优先采用协同人提交的最终记录,否则回退到其他可用记录
+- 风险评估
+  - 结合对比结果与说明,形成风险等级与建议;报告导出时将对比结果转换为“字面相同/等同/不等同/待确定”等可读字符串
+
+```mermaid
+flowchart TD
+Start(["开始"]) --> LoadOriginal["加载原始记录"]
+LoadOriginal --> HasCurrent{"是否存在当前记录?"}
+HasCurrent -- 否 --> UseOriginal["使用原始记录作为当前记录"]
+HasCurrent -- 是 --> UseCurrent["使用当前记录"]
+UseOriginal --> DecideFinal{"是否存在最终记录?"}
+UseCurrent --> DecideFinal
+DecideFinal -- 是 --> UseFinal["使用最终记录"]
+DecideFinal -- 否 --> UseCurrentOrOriginal["回退到当前或原始记录"]
+UseFinal --> End(["结束"])
+UseCurrentOrOriginal --> End
+```
+
+图表来源
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L486-L516)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L539-L568)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L568-L592)
+
+章节来源
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L486-L516)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L539-L568)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L568-L592)
+
+### FTO分析报告生成流程与结果解读
+- 报告生成流程
+  - 从最终对比结果中提取权要层级、特征内容、对比说明、对比结果等字段
+  - 将对比结果映射为可读字符串(如“字面相同”、“等同”、“不等同”、“待确定”)
+  - 组装报告模板数据并输出
+- 结果解读方法
+  - 对比结果值与字符串映射:0→字面相同、1→等同、2→不等同、3→待确定
+  - 结合标的说明与对比说明,评估侵权风险与规避建议
+
+```mermaid
+sequenceDiagram
+participant Exp as "ReportExportService"
+participant TCS as "TortCompareRecordService"
+participant DB as "FTOCompareRecordMapper.xml"
+participant Out as "报告输出"
+Exp->>TCS : getAllTortTaskResult(reportId,...)
+TCS->>DB : 查询最终对比记录
+DB-->>TCS : 返回记录集
+TCS-->>Exp : 返回TortRightVO/TortVO集合
+Exp->>Exp : 映射对比结果为字符串
+Exp-->>Out : 导出报告
+```
+
+图表来源
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L274-L299)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java#L272-L299)
+- [TortCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java#L486-L516)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)
+
+章节来源
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L274-L299)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java#L272-L299)
+
+## 依赖关系分析
+- 控制器依赖业务服务与项目任务服务
+- 业务服务依赖ES检索、特征服务、报告项目服务、系统字典、文献关联服务等
+- 数据访问层通过Mapper与XML映射实现按项目ID与对比结果筛选对比过的专利号
+
+```mermaid
+graph LR
+Ctrl["FTOController"] --> Svc["FTOCompareRecordService"]
+Ctrl --> TaskSvc["ProjectTaskService"]
+Svc --> ES["EsPatentService/EsFamilyService"]
+Svc --> Feat["FeatureService"]
+Svc --> Dict["SystemDictService"]
+Svc --> Mapper["FTOCompareRecordMapper.xml"]
+Svc --> TortSvc["TortCompareRecordService"]
+```
+
+图表来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L35-L138)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L1-L200)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)
+
+章节来源
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L1-L200)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)
+
+## 性能考量
+- 权要拆分与特征装载可能涉及大量数据处理,建议在调用前确认任务ID与专利号的有效性,避免重复拆分
+- 对比记录查询使用精确条件(项目ID/任务ID/专利号),建议确保索引覆盖以提升查询效率
+- 批量保存时注意事务边界,避免大事务导致锁竞争
+- 报告导出阶段建议分页或分批处理,避免内存压力
+
+## 故障排查指南
+- 参数校验失败
+  - 任务ID、专利号、是否重拆、拆分依据、拆分类型等必填字段缺失会抛出业务异常
+- 登录状态异常
+  - 未登录或登录失效时返回未登录错误
+- 数据不存在或为空
+  - 当传入权要为空或无匹配记录时,服务层会抛出相应异常
+- 异常处理
+  - 控制器捕获业务异常与未登录异常并返回对应错误码
+
+章节来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L52-L73)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L88-L151)
+
+## 结论
+FTO分析API围绕侵权比对记录的全生命周期管理,提供了从权要拆分、特征装载、侵权判定到最终报告导出的完整链路。通过清晰的DTO/VO结构与严格的参数校验,系统能够稳定支撑FTO分析工作流。结合协同任务机制与最终记录合并策略,可有效提升分析准确性与一致性。
+
+## 附录:API使用示例与完整流程
+以下示例展示如何通过API执行一次完整的FTO分析(步骤说明,不含具体代码内容):
+1. 获取FTO对比结果
+   - 请求路径:POST /fto/getFTOCompareRecord
+   - 请求体:包含任务ID、专利号、是否重拆、拆分依据、拆分类型等
+   - 返回:包含权要层级与特征对比结果的VO
+2. 保存FTO对比结果
+   - 请求路径:POST /fto/addFTOCompareRecord
+   - 请求体:包含项目ID、任务ID、专利号、特征与侵权分析对比结果DTO列表等
+   - 返回:保存ID列表
+3. 新增FTO协同任务
+   - 请求路径:POST /fto/addFTOAssitTask
+   - 请求体:协同任务DTO
+   - 返回:新任务ID
+4. 保存FTO协同任务对比结果
+   - 请求路径:POST /fto/addFTOAssitTaskResult
+   - 请求体:包含任务ID、专利号、特征与侵权分析对比结果DTO列表等
+   - 返回:保存ID列表
+5. 查询FTO协同前后对比结果
+   - 请求路径:GET /fto/getFTOAssitResult
+   - 参数:专利号、任务ID
+   - 返回:包含原始与当前记录的VO
+6. 保存最终对比结果
+   - 请求路径:POST /fto/addFinalAssitResult
+   - 请求体:包含任务ID、专利号、特征与侵权分析对比结果DTO列表等
+   - 返回:保存ID列表
+7. 查询最终结果
+   - 请求路径:GET /fto/getFTOFinalResult
+   - 参数:专利号、任务ID
+   - 返回:包含最终记录的VO
+8. 查询报告专利最新对比结果
+   - 请求路径:GET /fto/getLastRecord
+   - 参数:项目ID、专利号
+   - 返回:最新记录VO
+9. 查询对比过的专利
+   - 请求路径:POST /fto/getComparedPatent
+   - 请求体:包含项目ID与可选对比结果过滤条件
+   - 返回:对比过的专利号列表
+
+章节来源
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java#L46-L136)
+- [FTOCompareRecordMapper.xml](file://src/main/resources/mapper/FTOCompareRecordMapper.xml#L1-L14)

File diff suppressed because it is too large
+ 387 - 0
.qoder/repowiki/zh/content/API端点参考/分析与报告API/分析与报告API.md


+ 426 - 0
.qoder/repowiki/zh/content/API端点参考/分析与报告API/报告导出API.md

@@ -0,0 +1,426 @@
+# 报告导出API
+
+<cite>
+**本文引用的文件**
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java)
+- [ReportDocumentMapper.java](file://src/main/java/cn/cslg/pas/mapper/ReportDocumentMapper.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+- [FileUtils.java](file://src/main/java/cn/cslg/pas/common/utils/FileUtils.java)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java)
+- [PDFExportFirstPageService.java](file://src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [ExportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExportTaskDTO.java)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向报告导出功能,系统化梳理 ReportExportController 中的端点,覆盖 Word 报告导出、无效报告列表导出等能力;同时补充异步导出任务的执行与进度推送机制、导出模板的管理与应用、导出文件的安全存储与访问控制策略,并给出性能优化与大文件处理建议。文档旨在帮助开发者与测试人员快速理解并正确使用导出能力。
+
+## 项目结构
+- 控制层:ReportExportController 提供导出端点,负责接收请求并委派至服务层。
+- 服务层:
+  - ReportExportService:封装 Word 报告模板渲染与生成,支持多种报告类型(稳定性、FTO、侵权、规避设计等),并完成文件上传与导出记录入库。
+  - ExportReportListService:导出无效报告列表为 Excel。
+  - ReportTempleService:按报告类型查询可用模板。
+  - PatentExportService、PDFExportFirstPageService:支撑专利导出与 PDF 首页导出的异步任务与进度推送。
+- 数据模型:ReportTemple(模板)、ReportDocument(导出记录)。
+- 文件与存储:FileManagerService(对接外部文件系统)、FileUtils(本地路径与临时文件工具)。
+- 异步与进度:ImportTaskService(导出任务记录)、MessageService(WebSocket 推送)、SchedulingTaskService(导出任务调度)。
+
+```mermaid
+graph TB
+subgraph "控制层"
+C1["ReportExportController"]
+end
+subgraph "服务层"
+S1["ReportExportService"]
+S2["ExportReportListService"]
+S3["ReportTempleService"]
+S4["PatentExportService"]
+S5["PDFExportFirstPageService"]
+S6["ImportTaskService"]
+S7["MessageService"]
+S8["SchedulingTaskService"]
+end
+subgraph "数据模型"
+D1["ReportTemple"]
+D2["ReportDocument"]
+end
+subgraph "文件与存储"
+F1["FileManagerService"]
+F2["FileUtils"]
+end
+C1 --> S1
+C1 --> S2
+S1 --> S3
+S1 --> F2
+S1 --> F1
+S1 --> D2
+S2 --> F2
+S4 --> S6
+S4 --> S7
+S5 --> S6
+S5 --> S7
+S8 --> S4
+```
+
+图表来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L1-L42)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L1-L120)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L1-L80)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java#L1-L41)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java#L1-L47)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L1-L44)
+- [FileUtils.java](file://src/main/java/cn/cslg/pas/common/utils/FileUtils.java#L1-L120)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L1-L120)
+- [PDFExportFirstPageService.java](file://src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java#L152-L216)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L486-L542)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java#L87-L133)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java#L154-L199)
+
+章节来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L1-L42)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L1-L120)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L1-L80)
+
+## 核心组件
+- ReportExportController:提供导出端点,包括导出 Word 报告与导出无效报告列表。
+- ReportExportService:根据报告类型加载模板、渲染数据、生成 Word 并上传至文件系统,记录导出信息。
+- ExportReportListService:组装无效报告列表数据,生成 Excel 并以流形式返回。
+- ReportTempleService:按报告类型查询模板列表。
+- ReportDocument:导出记录实体,用于持久化导出元数据。
+- FileManagerService:对接外部文件系统,实现文件上传、下载、删除与查询。
+- PatentExportService、PDFExportFirstPageService:专利与 PDF 首页导出的异步实现,配合 ImportTaskService 与 MessageService 实现进度推送。
+- SchedulingTaskService:导出任务调度器,启动异步导出任务。
+
+章节来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L1-L42)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L113-L185)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java#L21-L41)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L71-L135)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L104-L120)
+- [PDFExportFirstPageService.java](file://src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java#L152-L216)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L486-L542)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java#L87-L133)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java#L154-L199)
+
+## 架构总览
+下图展示导出流程的关键交互:控制器接收请求,服务层渲染模板或生成 Excel,文件上传至外部系统,导出记录写入数据库,异步任务通过 WebSocket 推送进度。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Ctrl as "ReportExportController"
+participant Svc as "ReportExportService"
+participant Tpl as "ReportTempleService"
+participant FS as "FileManagerService"
+participant DB as "ReportDocument(持久化)"
+participant ListSvc as "ExportReportListService"
+Client->>Ctrl : POST /reportExport/export
+Ctrl->>Svc : exportReport(projectId, templeId)
+Svc->>Tpl : 查询模板
+Svc->>Svc : 渲染模板并生成 Word
+Svc->>FS : 上传生成文件
+FS-->>Svc : 返回文件GUID
+Svc->>DB : 记录导出信息
+Svc-->>Ctrl : 返回文件GUID
+Ctrl-->>Client : 成功响应
+Client->>Ctrl : POST /reportExport/exportReportList
+Ctrl->>ListSvc : 导出无效报告列表
+ListSvc-->>Ctrl : 返回Excel流
+Ctrl-->>Client : 流式响应
+```
+
+图表来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L20-L42)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L113-L185)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java#L21-L41)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L189-L218)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+
+## 详细组件分析
+
+### ReportExportController 端点
+- POST /reportExport/export
+  - 功能:触发报告导出(当前示例直接传入固定参数,实际应由前端传入 projectId 与 templeId)。
+  - 返回:统一响应对象,包含导出文件 GUID。
+- POST /reportExport/exportReportList
+  - 功能:导出无效报告列表为 Excel。
+  - 返回:HTTP 响应体为 Excel 文件流。
+
+章节来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L20-L42)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+
+### ReportExportService 报告导出
+- 模板选择与渲染
+  - 根据报告类型(如稳定性、FTO、侵权、规避设计等)选择不同模板方法,加载模板文件并渲染数据。
+  - 使用模板引擎编译与渲染,生成 Word 文档。
+- 文件生成与上传
+  - 生成 Word 文件后,调用文件管理服务上传至外部文件系统,返回文件 GUID。
+- 导出记录入库
+  - 将导出记录写入 ReportDocument 表,包含项目 ID、文件名、文件 GUID、模板信息等。
+- 错误处理
+  - 当模板匹配失败或报告不存在时抛出业务异常。
+
+```mermaid
+flowchart TD
+Start(["进入导出"]) --> LoadTpl["加载模板与报告类型"]
+LoadTpl --> Render["渲染模板并生成 Word"]
+Render --> Upload["上传文件至外部系统"]
+Upload --> SaveRec["写入导出记录"]
+SaveRec --> Done(["返回文件GUID"])
+```
+
+图表来源
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L113-L185)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L189-L218)
+
+章节来源
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L113-L185)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+
+### ExportReportListService 无效报告列表导出
+- 数据组装
+  - 根据查询条件获取报告项目列表,再聚合事务、无效状态、法条、诉讼等信息,转换为导出对象集合。
+- Excel 生成
+  - 读取内置模板路径,基于数据生成完整 Excel 文件。
+- 响应返回
+  - 将文件转为流并返回,调用方负责下载。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Ctrl as "ReportExportController"
+participant ListSvc as "ExportReportListService"
+participant Utils as "FileUtils/ExcelUtil"
+Client->>Ctrl : POST /reportExport/exportReportList
+Ctrl->>ListSvc : 导出无效报告列表
+ListSvc->>ListSvc : 组装导出数据
+ListSvc->>Utils : 生成Excel模板
+Utils-->>ListSvc : 返回Excel文件
+ListSvc-->>Ctrl : 返回Excel流
+Ctrl-->>Client : 流式响应
+```
+
+图表来源
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+- [FileUtils.java](file://src/main/java/cn/cslg/pas/common/utils/FileUtils.java#L1-L120)
+
+章节来源
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+
+### 模板管理与应用
+- 模板查询
+  - ReportTempleService 根据报告类型查询模板列表,便于前端选择合适的模板。
+- 模板实体
+  - ReportTemple 包含模板名称、路径、报告类型等字段。
+- 应用流程
+  - ReportExportService 根据报告类型选择模板方法,加载模板文件并渲染数据。
+
+章节来源
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java#L21-L41)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java#L1-L47)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L140-L166)
+
+### 异步导出与进度查询
+- 异步执行
+  - 导出任务通过 @Async 注解异步执行,避免阻塞主线程。
+- 任务记录
+  - 使用 ImportTaskService 记录导出任务状态、总数、完成数、失败数、文件 GUID 等。
+- 进度推送
+  - 通过 WebSocket 向前端推送进度,包含任务 ID、当前进度、百分比、状态等。
+- 调度器
+  - SchedulingTaskService 提供任务启动入口,将导出任务加入调度队列。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Sched as "SchedulingTaskService"
+participant PExp as "PatentExportService"
+participant PPDF as "PDFExportFirstPageService"
+participant Task as "ImportTaskService"
+participant Msg as "MessageService"
+Client->>Sched : 启动导出任务
+Sched->>PExp : 开始异步导出
+loop 每处理一条专利
+PExp->>Msg : 推送进度
+Msg-->>Client : WebSocket 进度消息
+end
+PExp->>Task : 更新任务状态与文件GUID
+PExp-->>Client : 导出完成
+```
+
+图表来源
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L104-L120)
+- [PDFExportFirstPageService.java](file://src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java#L152-L216)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L486-L542)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java#L87-L133)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java#L154-L199)
+
+章节来源
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L104-L120)
+- [PDFExportFirstPageService.java](file://src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java#L152-L216)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L486-L542)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java#L87-L133)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java#L154-L199)
+
+### 文件安全存储与访问控制
+- 存储策略
+  - 生成的 Word 或 Excel 文件通过 FileManagerService 上传至外部文件系统,返回文件 GUID。
+  - ReportDocument 记录文件 GUID,便于后续检索与管理。
+- 访问控制
+  - 代码中未发现显式的鉴权拦截器或资源访问控制逻辑。建议在控制器层增加鉴权校验与权限检查,确保仅授权用户可发起导出与下载。
+- 文件清理
+  - 本地生成的临时文件在上传后会被删除,避免磁盘占用。
+
+章节来源
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L189-L218)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L160-L185)
+
+## 依赖关系分析
+- 控制器依赖服务层,服务层依赖模板服务、文件工具、文件管理服务与数据库映射。
+- 导出任务依赖异步线程池与 WebSocket 推送服务。
+- 数据模型 ReportDocument 与 ReportTemple 分别承载导出记录与模板元数据。
+
+```mermaid
+classDiagram
+class ReportExportController {
++POST /reportExport/export
++POST /reportExport/exportReportList
+}
+class ReportExportService {
++exportReport(projectId, templeId)
+}
+class ExportReportListService {
++exportInvalidReportList(queryRequest)
+}
+class ReportTempleService {
++queryTempleByType(vo)
+}
+class ReportDocument
+class FileManagerService
+class PatentExportService
+class PDFExportFirstPageService
+class ImportTaskService
+class MessageService
+class SchedulingTaskService
+ReportExportController --> ReportExportService
+ReportExportController --> ExportReportListService
+ReportExportService --> ReportTempleService
+ReportExportService --> FileManagerService
+ReportExportService --> ReportDocument
+PatentExportService --> ImportTaskService
+PatentExportService --> MessageService
+PDFExportFirstPageService --> ImportTaskService
+PDFExportFirstPageService --> MessageService
+SchedulingTaskService --> PatentExportService
+```
+
+图表来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L20-L42)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L113-L185)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java#L21-L41)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L1-L44)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L104-L120)
+- [PDFExportFirstPageService.java](file://src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java#L152-L216)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L486-L542)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java#L87-L133)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java#L154-L199)
+
+章节来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L20-L42)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L113-L185)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+
+## 性能考虑
+- 模板渲染
+  - 使用模板引擎渲染大量数据时,建议分批处理或采用流式渲染策略,减少内存峰值。
+- 文件上传
+  - 大文件上传建议采用分片上传或断点续传,结合进度推送提升用户体验。
+- 异步任务
+  - 对于大批量导出,合理配置线程池大小与队列容量,避免阻塞与 OOM。
+- 缓存与预热
+  - 对常用模板与静态资源进行缓存,降低重复 IO。
+- 数据查询
+  - 导出前的数据查询应使用分页与批量拉取,避免一次性加载过多数据。
+
+[本节为通用指导,无需特定文件引用]
+
+## 故障排查指南
+- 模板匹配失败
+  - 现象:抛出“未匹配到模板文件”的业务异常。
+  - 排查:确认模板路径与模板 ID 是否正确,模板文件是否存在。
+- 报告不存在
+  - 现象:抛出“报告不存在”的业务异常。
+  - 排查:确认项目 ID 与报告类型是否匹配。
+- 文件上传失败
+  - 现象:保存记录失败或文件 GUID 为空。
+  - 排查:检查文件系统接口连通性、认证配置与磁盘空间。
+- 进度未推送
+  - 现象:前端未收到进度消息。
+  - 排查:确认 WebSocket 通道是否建立、消息体字段是否正确、任务状态是否更新。
+
+章节来源
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L113-L185)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L189-L218)
+- [MessageService.java](file://src/main/java/cn/cslg/pas/service/common/MessageService.java#L87-L133)
+
+## 结论
+本导出体系以 ReportExportController 为入口,结合 ReportExportService 的模板渲染与 FileManagerService 的文件上传,实现了 Word 报告与 Excel 列表的导出能力。异步导出与 WebSocket 进度推送提升了用户体验。建议在控制器层补充鉴权与权限校验,并对大文件与高并发场景进行性能优化与监控。
+
+[本节为总结,无需特定文件引用]
+
+## 附录
+
+### API 定义与使用说明
+- POST /reportExport/export
+  - 请求体:StringRequest(示例中固定参数,实际应传入 projectId 与 templeId)。
+  - 响应:统一响应对象,包含导出文件 GUID。
+- POST /reportExport/exportReportList
+  - 请求体:QueryRequest(用于筛选无效报告列表)。
+  - 响应:Excel 文件流,客户端需自行下载。
+
+章节来源
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L20-L42)
+- [ExportReportListService.java](file://src/main/java/cn/cslg/pas/service/report/ExportReportListService.java#L47-L78)
+
+### 数据模型与表结构
+- ReportTemple
+  - 字段:template_name、template_path、report_type、create_time 等。
+- ReportDocument
+  - 字段:project_id、file_name、file_guid、template_id、template_name、create_time 等。
+- os_report(历史表)
+  - 字段:id、name、project_id、template_id、report_url、create_time 等。
+
+章节来源
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java#L1-L47)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java#L1-L62)
+- [pas.sql](file://docker/mysql/init/pas.sql#L7310-L7329)

File diff suppressed because it is too large
+ 485 - 0
.qoder/repowiki/zh/content/API端点参考/分析与报告API/报告模板API.md


File diff suppressed because it is too large
+ 482 - 0
.qoder/repowiki/zh/content/API端点参考/分析与报告API/报告项目API.md


+ 267 - 0
.qoder/repowiki/zh/content/API端点参考/分析与报告API/稳定性分析API.md

@@ -0,0 +1,267 @@
+# 稳定性分析API
+
+<cite>
+**本文档引用的文件**  
+- [StabilityReportController.java](file://src/main/java/cn/cslg/pas/controller/StabilityReportController.java)
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java)
+- [AddCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/stabilityReport/AddCompareRecordDTO.java)
+- [QueryCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/stabilityReport/QueryCompareRecordDTO.java)
+- [QueryAllCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/stabilityReport/QueryAllCompareRecordDTO.java)
+- [CompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/stabilityReport/CompareRecordVO.java)
+- [AllCompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/stabilityReport/AllCompareRecordVO.java)
+- [AssoGroupReason.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupReason.java)
+- [AssoReasonLiterature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoReasonLiterature.java)
+- [EvidenceReason.java](file://src/main/java/cn/cslg/pas/domain/business/EvidenceReason.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [核心组件](#核心组件)
+3. [架构概览](#架构概览)
+4. [详细组件分析](#详细组件分析)
+5. [依赖分析](#依赖分析)
+6. [性能考虑](#性能考虑)
+7. [故障排除指南](#故障排除指南)
+8. [结论](#结论)
+
+## 简介
+本文档详细记录了稳定性分析功能的API接口,涵盖比较记录的创建、查询、更新和删除操作。文档系统性地描述了稳定性分析的比较逻辑和结果生成机制,包括比较组(CompareRecord)和关联原因(AssoGroupReason)的数据结构和关系。同时说明了分析结果的可视化呈现方式和数据导出功能,提供了完整的端点规范,包括请求验证规则、错误处理策略和性能优化建议。
+
+## 核心组件
+本节分析稳定性分析功能的核心组件,包括StabilityReportController中的端点、比较记录的数据结构以及相关服务的实现逻辑。
+
+**节来源**
+- [StabilityReportController.java](file://src/main/java/cn/cslg/pas/controller/StabilityReportController.java#L26-L137)
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L38-L516)
+- [AddCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/stabilityReport/AddCompareRecordDTO.java#L9-L30)
+
+## 架构概览
+稳定性分析功能采用典型的分层架构,包括控制器层、服务层和数据访问层。控制器层提供RESTful API接口,服务层处理业务逻辑,数据访问层负责与数据库交互。
+
+```mermaid
+graph TB
+subgraph "表现层"
+Controller[StabilityReportController]
+end
+subgraph "业务逻辑层"
+Service[CompareRecordService]
+end
+subgraph "数据访问层"
+Mapper[AssoGroupReasonMapper]
+Mapper2[AssoReasonLiteratureMapper]
+Mapper3[EvidenceReasonMapper]
+end
+subgraph "数据库"
+DB[(MySQL)]
+end
+Controller --> Service
+Service --> Mapper
+Service --> Mapper2
+Service --> Mapper3
+Mapper --> DB
+Mapper2 --> DB
+Mapper3 --> DB
+```
+
+**图来源**
+- [StabilityReportController.java](file://src/main/java/cn/cslg/pas/controller/StabilityReportController.java#L26-L137)
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L38-L516)
+- [AssoGroupReasonMapper.java](file://src/main/java/cn/cslg/pas/mapper/stabilityReport/AssoGroupReasonMapper.java#L1-L16)
+
+## 详细组件分析
+本节详细分析稳定性分析功能的各个关键组件,包括端点规范、数据结构和业务逻辑。
+
+### 端点分析
+稳定性分析功能提供了多个RESTful API端点,用于管理比较记录和方案。
+
+#### API端点规范
+| 端点 | HTTP方法 | 功能描述 | 请求参数 | 响应类型 |
+|------|--------|--------|--------|--------|
+| /stabilityReport/addCompareRecord | POST | 添加对比记录 | AddCompareRecordDTO | Response<Integer> |
+| /stabilityReport/queryCompareRecord | POST | 查询对比文献对比记录 | QueryCompareRecordDTO | Response<Records<List<CompareRecordVO>>> |
+| /stabilityReport/removeCompareRecord | POST | 删除对比文献记录 | List<Integer> | Response<String> |
+| /stabilityReport/queryAllCompareRecord | POST | 查询对比结果 | QueryAllCompareRecordDTO | Response<Records<List<AllCompareRecordVO>>> |
+| /stabilityReport/addCompareRecordGroup | POST | 添加对比方案 | AddCompareRecordGroupDTO | Response<Integer> |
+| /stabilityReport/removeCompareGroups | POST | 删除对比方案 | List<Integer> | Response<String> |
+| /stabilityReport/getCompareGroups | POST | 查询对比方案 | QueryAllCompareGroupDTO | Response<Records<List<AllCompareGroupVO>>> |
+| /stabilityReport/getComparedLiteratures | GET | 查询已对比的文献信息 | projectId | Response<Records<List<CompareLiteratureVO>>> |
+
+**节来源**
+- [StabilityReportController.java](file://src/main/java/cn/cslg/pas/controller/StabilityReportController.java#L32-L137)
+
+### 数据结构分析
+本节分析稳定性分析功能的核心数据结构及其关系。
+
+#### 比较记录数据结构
+```mermaid
+classDiagram
+class AddCompareRecordDTO {
++Integer literatureId
++String evidenceText
++String fieldName
++String common
++Integer id
++List<AssoFeature> assoFeatureList
++Integer position
++String markType
++String markColor
++String fileGuid
+}
+class AssoFeature {
++Integer featureId
++String conclusion
+}
+class CompareRecordVO {
++Integer literatureId
++String evidenceText
++String fieldName
++String common
++List<AssoFeature> assoFeatureList
++Integer position
++String markType
++String markColor
++String fileGuid
++Integer id
+}
+AddCompareRecordDTO *-- AssoFeature : 包含
+CompareRecordVO *-- AssoFeature : 包含
+```
+
+**图来源**
+- [AddCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/stabilityReport/AddCompareRecordDTO.java#L9-L30)
+- [CompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/stabilityReport/CompareRecordVO.java#L9-L29)
+
+#### 实体关系模型
+```mermaid
+erDiagram
+EVIDENCE_REASON {
+integer id PK
+string evidenceText
+string description
+string fileGuid
+timestamp create_time
+timestamp update_time
+}
+ASSO_REASON_LITERATURE {
+integer id PK
+integer reason_id FK
+integer literature_id
+integer position
+string field_name
+string mark_type
+string mark_color
+timestamp create_time
+timestamp update_time
+}
+ASSO_GROUP_REASON {
+integer id PK
+integer reason_id FK
+integer feature_id
+integer group_id
+string conclusion
+timestamp create_time
+timestamp update_time
+}
+EVIDENCE_REASON ||--o{ ASSO_REASON_LITERATURE : "包含"
+EVIDENCE_REASON ||--o{ ASSO_GROUP_REASON : "包含"
+```
+
+**图来源**
+- [EvidenceReason.java](file://src/main/java/cn/cslg/pas/domain/business/EvidenceReason.java)
+- [AssoReasonLiterature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoReasonLiterature.java)
+- [AssoGroupReason.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupReason.java)
+
+### 业务逻辑分析
+本节分析稳定性分析功能的核心业务逻辑和处理流程。
+
+#### 比较记录创建流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "StabilityReportController"
+participant Service as "CompareRecordService"
+participant EvidenceReason as "EvidenceReason"
+participant AssoReasonLiterature as "AssoReasonLiterature"
+participant AssoGroupReason as "AssoGroupReason"
+Client->>Controller : POST /addCompareRecord
+Controller->>Service : addCompareRecord(AddCompareRecordDTO)
+Service->>EvidenceReason : 创建/更新EvidenceReason
+EvidenceReason-->>Service : 返回ID
+Service->>AssoReasonLiterature : 创建AssoReasonLiterature关联
+AssoReasonLiterature-->>Service : 成功
+Service->>AssoGroupReason : 创建AssoGroupReason关联
+AssoGroupReason-->>Service : 成功
+Service-->>Controller : 返回记录ID
+Controller-->>Client : 返回响应
+```
+
+**图来源**
+- [StabilityReportController.java](file://src/main/java/cn/cslg/pas/controller/StabilityReportController.java#L32-L42)
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L58-L102)
+
+#### 比较结果查询流程
+```mermaid
+flowchart TD
+Start([开始]) --> GetProjectInfo["获取项目信息"]
+GetProjectInfo --> GetFeatures["获取特征列表"]
+GetFeatures --> GetRights["获取权要信息"]
+GetRights --> GetAssoGroupReasons["查询AssoGroupReason关联"]
+GetAssoGroupReasons --> LoopFeatures["遍历每个特征"]
+LoopFeatures --> CreateVO["创建AllCompareRecordVO"]
+CreateVO --> LoadFeatureInfo["装载特征信息"]
+LoadFeatureInfo --> LoadRightInfo["装载权要信息"]
+LoadRightInfo --> GetEvidenceReasons["查询EvidenceReason"]
+GetEvidenceReasons --> GetLiteratureInfo["查询文献信息"]
+GetLiteratureInfo --> AddToResult["添加到结果列表"]
+AddToResult --> CheckMoreFeatures{"还有更多特征?"}
+CheckMoreFeatures --> |是| LoopFeatures
+CheckMoreFeatures --> |否| ReturnResult["返回结果"]
+ReturnResult --> End([结束])
+```
+
+**图来源**
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L189-L312)
+
+## 依赖分析
+稳定性分析功能依赖于多个核心服务和数据访问组件,形成了复杂的依赖关系网络。
+
+```mermaid
+graph TD
+StabilityReportController --> CompareRecordService
+CompareRecordService --> AssoGroupReasonService
+CompareRecordService --> AssoReasonLiteratureService
+CompareRecordService --> EvidenceReasonService
+CompareRecordService --> FeatureService
+CompareRecordService --> ReportProjectService
+CompareRecordService --> CompareLiteratureService
+CompareRecordService --> ProofGroupService
+AssoGroupReasonService --> AssoGroupReasonMapper
+AssoReasonLiteratureService --> AssoReasonLiteratureMapper
+EvidenceReasonService --> EvidenceReasonMapper
+FeatureService --> FeatureMapper
+ReportProjectService --> ReportProjectMapper
+CompareLiteratureService --> CompareLiteratureMapper
+ProofGroupService --> ProofGroupMapper
+```
+
+**图来源**
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L39-L55)
+- [AssoGroupReasonService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/AssoGroupReasonService.java#L1-L14)
+
+## 性能考虑
+稳定性分析功能在处理大量数据时需要考虑性能优化,特别是在查询对比结果时涉及多个数据库查询和数据关联操作。
+
+**节来源**
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L189-L312)
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L314-L451)
+
+## 故障排除指南
+本节提供稳定性分析功能常见问题的排查方法和解决方案。
+
+**节来源**
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L114-L124)
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L197-L199)
+- [CompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/stabilityReport/CompareRecordService.java#L327-L329)
+
+## 结论
+本文档全面记录了稳定性分析功能的API接口和内部实现机制。通过分析StabilityReportController中的端点、CompareRecordService中的业务逻辑以及相关数据结构,我们深入了解了该功能的工作原理。系统采用分层架构设计,各组件职责清晰,通过合理的数据模型和关联关系实现了复杂的稳定性分析功能。在实际使用中,应注意性能优化和错误处理,确保系统的稳定性和可靠性。

+ 382 - 0
.qoder/repowiki/zh/content/API端点参考/查新分析API/查新分析API.md

@@ -0,0 +1,382 @@
+# 查新分析API
+
+<cite>
+**本文档引用的文件**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java)
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java)
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java)
+- [QueryNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryNoveltyProjectDTO.java)
+- [QueryNoveltyProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryNoveltyProjectVO.java)
+- [NoveltyRetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyRetrieveRecordDTO.java)
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+本文档详细记录了查新分析功能的API接口,重点介绍了NoveltyProjectController和NoveltyCompareRecordController中的所有端点。文档涵盖了创建查新项目、添加检索记录、生成对比分析报告等关键功能的API使用方法,包括请求体结构、响应体结构、认证机制和异常处理。
+
+## 项目结构
+查新分析功能主要位于src/main/java/cn/cslg/pas/controller目录下,相关DTO和VO类位于common包中。核心控制器包括NoveltyProjectController和NoveltyCompareRecordController,分别处理查新项目管理和对比分析记录。
+
+```mermaid
+graph TB
+subgraph "控制器"
+NoveltyProjectController["NoveltyProjectController"]
+NoveltyCompareRecordController["NoveltyCompareRecordController"]
+end
+subgraph "数据传输对象"
+DTO["DTO包"]
+VO["VO包"]
+end
+subgraph "服务层"
+Service["服务实现"]
+end
+NoveltyProjectController --> DTO
+NoveltyCompareRecordController --> DTO
+NoveltyProjectController --> Service
+NoveltyCompareRecordController --> Service
+DTO --> VO
+```
+
+**图示来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L37-L314)
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L28-L55)
+
+**本节来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java)
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java)
+
+## 核心组件
+查新分析功能的核心组件包括查新项目管理、检索记录管理和对比分析记录管理。NoveltyProjectController负责查新项目的创建、查询、更新和删除操作,以及技术方案信息的管理。NoveltyCompareRecordController则专注于对比分析记录的管理。
+
+**本节来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L37-L314)
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L28-L55)
+
+## 架构概述
+查新分析功能采用典型的分层架构,包括控制器层、服务层和数据访问层。控制器层暴露REST API接口,服务层实现业务逻辑,数据访问层通过MyBatis Plus与数据库交互。SaToken用于API认证和权限控制。
+
+```mermaid
+graph TD
+A[客户端] --> B[NoveltyProjectController]
+A --> C[NoveltyCompareRecordController]
+B --> D[NoveltyProjectService]
+C --> E[NoveltyCompareRecordService]
+D --> F[MyBatis Mapper]
+E --> F
+F --> G[(数据库)]
+H[SaToken] --> B
+H --> C
+```
+
+**图示来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L37-L314)
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L28-L55)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java#L13-L35)
+
+## 详细组件分析
+
+### 查新项目管理分析
+NoveltyProjectController提供了完整的查新项目管理功能,包括创建、查询、更新和删除查新项目。该控制器还支持技术方案信息的管理,以及对比文件和检索记录的操作。
+
+#### 对象关系图
+```mermaid
+classDiagram
+class AddNoveltyProjectDTO {
++String customCaseNumber
++String innerCaseNumber
++String applicants
++String inventor
++String ipr
++String technicalContact
++String searchUnit
++String searchUnitContact
++String caseName
++String searchReviewer
++String preliminaryConclusions
++String ifPatentability
++String applicationAdvice
++String applicationRemark
++String replenishMeans
++String writeAdvice
++Integer projectId
++Integer entrustType
++String entrustId
++String entrustName
++String headId
++String departmentId
+}
+class QueryNoveltyProjectVO {
++Integer projectId
++Integer noveltyProjectId
++Integer technicalCaseId
++String customCaseNumber
++String innerCaseNumber
++String applicants
++String inventor
++String ipr
++String technicalContact
++String searchUnit
++String searchUnitContact
++String caseName
++String searchReviewer
++String preliminaryConclusions
++String ifPatentability
++String applicationAdvice
++String applicationRemark
++String replenishMeans
++String writeAdvice
++String ipc
++String solvedProblem
++String technicalField
++String remark
++String inventionPoint
++List<SystemFile> systemFileList
++Integer tenantId
++String createId
++String createName
++Date createTime
++Integer entrustType
++String entrustId
++String entrustName
++String departmentId
++String departmentName
++String headId
++String headName
+}
+AddNoveltyProjectDTO --> QueryNoveltyProjectVO : "转换"
+```
+
+**图示来源**
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java#L6-L52)
+- [QueryNoveltyProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryNoveltyProjectVO.java#L11-L86)
+
+#### API调用流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "NoveltyProjectController"
+participant Service as "NoveltyProjectService"
+participant Mapper as "MyBatis Mapper"
+participant DB as "数据库"
+Client->>Controller : POST /noveltyProject/addNoveltyProject
+Controller->>Service : addNoveltyProject()
+Service->>Mapper : insert()
+Mapper->>DB : 执行插入
+DB-->>Mapper : 返回结果
+Mapper-->>Service : 返回主键
+Service-->>Controller : 返回项目ID
+Controller-->>Client : 返回响应
+Client->>Controller : POST /noveltyProject/queryNoveltyProject
+Controller->>Service : queryMessage()
+Service->>Mapper : selectList()
+Mapper->>DB : 执行查询
+DB-->>Mapper : 返回数据
+Mapper-->>Service : 返回记录
+Service-->>Controller : 返回Records
+Controller-->>Client : 返回查询结果
+```
+
+**图示来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L60-L95)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L325-L350)
+
+**本节来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L37-L314)
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java#L6-L52)
+- [QueryNoveltyProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryNoveltyProjectVO.java#L11-L86)
+
+### 对比分析记录管理分析
+NoveltyCompareRecordController负责管理查新分析中的对比记录,支持添加、编辑、删除和查询对比记录的功能。这些记录用于生成查新分析报告中的对比部分。
+
+#### 对象关系图
+```mermaid
+classDiagram
+class NoveltyCompareRecordDTO {
++String id
++Integer projectId
++String patentId
++String compareContent
++String compareConclusion
++Integer useType
++String createId
++String createName
++Date createTime
+}
+class QueryNoveltyCompareRecordDTO {
++Integer projectId
++String patentId
++String createId
++Long current
++Long size
+}
+class NoveltyCompareRecordQueryVO {
++String id
++Integer projectId
++String patentId
++String compareContent
++String compareConclusion
++String createId
++String createName
++Date createTime
+}
+NoveltyCompareRecordDTO --> NoveltyCompareRecordQueryVO : "查询结果"
+```
+
+**图示来源**
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java)
+- [QueryNoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/QueryNoveltyCompareRecordDTO.java)
+
+#### API调用流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "NoveltyCompareRecordController"
+participant Service as "NoveltyCompareRecordService"
+Client->>Controller : POST /noveltyCompareRecord/edit
+Controller->>Controller : 设置useType=2
+Controller->>Service : addOrUpdateCompareRecord()
+Service-->>Controller : 返回记录ID
+Controller-->>Client : 返回成功响应
+Client->>Controller : POST /noveltyCompareRecord/queryCompareRecord
+Controller->>Service : queryCompareRecord()
+Service-->>Controller : 返回查询结果列表
+Controller-->>Client : 返回对比记录
+```
+
+**图示来源**
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L34-L53)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+
+**本节来源**
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L28-L55)
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java)
+
+### 检索记录管理分析
+NoveltyProjectController还提供了检索记录的管理功能,允许用户添加、查询、更新和删除检索记录。这些记录是查新分析过程中的重要组成部分。
+
+#### 对象关系图
+```mermaid
+classDiagram
+class NoveltyRetrieveRecordDTO {
++Integer id
++Integer projectId
++String conditions
++String dbType
++Date retrieveTime
++Date updateTime
++Integer totalNum
++String searchSetting
++String searchPersonName
+}
+class QuerySearchRecordDTO {
++Integer projectId
++String searchPersonName
++Date startTime
++Date endTime
++Long current
++Long size
+}
+```
+
+**图示来源**
+- [NoveltyRetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyRetrieveRecordDTO.java#L11-L54)
+
+#### API调用流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "NoveltyProjectController"
+participant Service as "NoveltySearchRecordService"
+Client->>Controller : POST /noveltyProject/addSearchRecord
+Controller->>Service : addSearchRecord()
+Service-->>Controller : 返回记录ID
+Controller-->>Client : 返回成功响应
+Client->>Controller : POST /noveltyProject/querySearchRecord
+Controller->>Service : querySearchRecord()
+Service-->>Controller : 返回检索记录
+Controller-->>Client : 返回查询结果
+```
+
+**图示来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L253-L278)
+- [NoveltyRetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyRetrieveRecordDTO.java#L11-L54)
+
+**本节来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L253-L278)
+- [NoveltyRetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyRetrieveRecordDTO.java#L11-L54)
+
+## 依赖分析
+查新分析功能依赖于多个核心组件和服务。控制器层依赖于服务层实现业务逻辑,服务层依赖于MyBatis Mapper进行数据访问。SaToken提供了统一的认证机制,确保API的安全性。
+
+```mermaid
+graph TD
+A[NoveltyProjectController] --> B[NoveltyProjectService]
+A --> C[TechnicalCaseService]
+A --> D[NoveltySearchRecordService]
+A --> E[NoveltyCompareLiteratureService]
+A --> F[AssoProjectConfessionService]
+B --> G[NoveltyProjectMapper]
+C --> H[TechnicalCaseMapper]
+D --> I[SearchRecordMapper]
+E --> J[CompareLiteratureMapper]
+F --> K[AssoProjectConfessionMapper]
+A --> L[SaToken]
+```
+
+**图示来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L40-L58)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java#L13-L35)
+
+**本节来源**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L40-L58)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java#L13-L35)
+
+## 性能考虑
+查新分析功能在设计时考虑了性能优化。通过使用MyBatis Plus的分页查询功能,避免了大数据量查询对系统性能的影响。服务层的方法使用了@Transactional注解,确保了数据库操作的原子性。对于频繁访问的数据,系统采用了缓存机制来提高响应速度。
+
+## 故障排除指南
+查新分析功能提供了完善的异常处理机制。系统定义了XiaoShiException和UnLoginException等自定义异常,通过GlobalExceptionHandler进行统一处理。当出现检索失败或数据不完整等特定异常时,系统会返回相应的错误码和错误信息。
+
+```mermaid
+flowchart TD
+Start([开始]) --> CheckAuth["检查认证"]
+CheckAuth --> AuthValid{"认证有效?"}
+AuthValid --> |否| Return401["返回401未授权"]
+AuthValid --> |是| CheckParams["检查参数"]
+CheckParams --> ParamsValid{"参数有效?"}
+ParamsValid --> |否| Return400["返回400参数错误"]
+ParamsValid --> |是| ExecuteLogic["执行业务逻辑"]
+ExecuteLogic --> Success{"执行成功?"}
+Success --> |否| HandleException["处理异常"]
+Success --> |是| ReturnSuccess["返回成功响应"]
+HandleException --> LogError["记录错误日志"]
+LogError --> ReturnError["返回错误响应"]
+Return401 --> End([结束])
+Return400 --> End
+ReturnSuccess --> End
+ReturnError --> End
+```
+
+**图示来源**
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L17-L29)
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L66-L67)
+
+**本节来源**
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L17-L29)
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L66-L67)
+
+## 结论
+本文档详细介绍了查新分析功能的API接口,包括查新项目管理、检索记录管理和对比分析记录管理。通过SaToken认证机制确保了API的安全性,通过完善的异常处理机制提高了系统的健壮性。开发者可以基于本文档快速理解和使用查新分析功能的API接口。

+ 484 - 0
.qoder/repowiki/zh/content/API端点参考/查新分析API/查新对比记录API.md

@@ -0,0 +1,484 @@
+# 查新对比记录API
+
+<cite>
+**本文引用的文件**
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java)
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java)
+- [EsPatentService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java)
+- [QueryNoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/QueryNoveltyCompareRecordDTO.java)
+- [NoveltyCompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyCompareRecordVO.java)
+- [NoveltyCompareRecordQueryVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyCompareRecordQueryVO.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java)
+- [NoveltyCompareRecordTests.java](file://src/test/java/cn/cslg/pas/novelty/NoveltyCompareRecordTests.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能与扩展性](#性能与扩展性)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向“查新对比记录”功能,系统化梳理与该功能相关的API端点、数据模型、调用流程、Elasticsearch集成与相似度计算、性能优化策略及错误处理规范。重点覆盖以下内容:
+- 对比记录管理端点:新增/编辑、删除、查询
+- 请求体与响应体的数据结构说明
+- 与ES标注索引、专利向量、相似度服务的集成路径
+- 大规模数据对比场景下的性能优化建议
+- 常见错误与排障方法
+
+## 项目结构
+围绕查新对比记录的核心模块分布如下:
+- 控制器层:负责HTTP端点暴露与入参校验
+- 服务层:封装业务逻辑,协调ES、导入、文献关联等
+- ES服务层:负责ES索引操作(标注、向量、专利)
+- 公共工具与异常:统一响应封装与异常处理
+
+```mermaid
+graph TB
+subgraph "控制器层"
+C1["NoveltyCompareRecordController<br/>对比记录控制器"]
+end
+subgraph "服务层"
+S1["NoveltyCompareRecordService<br/>对比记录服务"]
+S2["NoveltyCompareLiteratureService<br/>对比文献服务"]
+end
+subgraph "ES服务层"
+E1["EsScratchWordsService<br/>标注ES服务"]
+E2["EsPatentVectorService<br/>专利向量ES服务"]
+E3["EsPatentService<br/>专利查询ES服务"]
+end
+subgraph "外部服务"
+P1["PythonApiService<br/>相似度计算服务"]
+end
+subgraph "公共"
+R1["Response<br/>统一响应封装"]
+X1["XiaoShiException<br/>业务异常"]
+G1["GlobalExceptionHandler<br/>全局异常处理"]
+end
+C1 --> S1
+S1 --> E1
+S1 --> S2
+S1 --> E2
+S1 --> E3
+E2 --> P1
+C1 --> R1
+S1 --> X1
+E1 --> X1
+E2 --> X1
+G1 --> R1
+```
+
+图表来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L1-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L205)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L285)
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L1-L131)
+- [EsPatentService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java#L1033-L1064)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L116)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java#L1-L154)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java#L1-L39)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+
+章节来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L1-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L205)
+
+## 核心组件
+- NoveltyCompareRecordController:对外暴露对比记录管理端点
+- NoveltyCompareRecordService:实现新增/编辑、删除、查询对比记录的业务逻辑
+- EsScratchWordsService:对接ES标注索引,完成保存、更新、查询、删除
+- EsPatentVectorService:负责专利向量生成与刷新
+- PythonApiService:调用外部Python服务进行相似度计算
+- DTO/VO:定义请求与响应的数据结构
+
+章节来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L1-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L205)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L285)
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L1-L131)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L116)
+
+## 架构总览
+下图展示了从控制器到服务再到ES与外部相似度服务的整体调用链路。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Ctrl as "NoveltyCompareRecordController"
+participant Svc as "NoveltyCompareRecordService"
+participant ES as "EsScratchWordsService"
+participant Vec as "EsPatentVectorService"
+participant Py as "PythonApiService"
+Client->>Ctrl : POST /noveltyCompareRecord/edit
+Ctrl->>Svc : addOrUpdateCompareRecord(dto)
+Svc->>ES : saveToEs(marking)/updateScratchWords(id, marking)
+ES-->>Svc : id
+Svc-->>Ctrl : id
+Ctrl-->>Client : Response.success(id)
+Client->>Ctrl : POST /noveltyCompareRecord/queryCompareRecord
+Ctrl->>Svc : queryCompareRecord(queryDto)
+Svc->>ES : queryNoveltyRecord(projectId, useType)
+ES-->>Svc : List<NoveltyCompareRecordVO>
+Svc->>Vec : 可选:refreshPatentVector(projectId)
+Vec->>Py : 获取向量/相似度
+Py-->>Vec : 向量/分数
+Svc-->>Ctrl : List<NoveltyCompareRecordQueryVO>
+Ctrl-->>Client : Response.success(list)
+```
+
+图表来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L205)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L285)
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L100-L131)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L116)
+
+## 详细组件分析
+
+### API端点总览
+- 新增/编辑对比记录
+  - 方法:POST
+  - 路径:/noveltyCompareRecord/edit
+  - 请求体:NoveltyCompareRecordDTO
+  - 响应体:字符串id
+- 删除对比记录
+  - 方法:POST
+  - 路径:/noveltyCompareRecord/remove
+  - 请求体:字符串数组ids
+  - 响应体:传入的ids
+- 查询对比记录
+  - 方法:POST
+  - 路径:/noveltyCompareRecord/queryCompareRecord
+  - 请求体:QueryNoveltyCompareRecordDTO
+  - 响应体:List<NoveltyCompareRecordQueryVO>
+
+章节来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [QueryNoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/QueryNoveltyCompareRecordDTO.java#L9-L13)
+
+### 请求体模型:NoveltyCompareRecordDTO
+- 字段说明(节选)
+  - id:对比记录唯一标识
+  - patentNo:对比的专利号
+  - markColor:标注颜色
+  - markNoteText:标注备注
+  - markType:标注类型
+  - useType:使用类型(服务中固定为2用于对比记录)
+  - markSelectField:标注栏位
+  - markSelectText:标注选择文本
+  - markSite:标注位置
+  - markTime:标注时间
+  - projectId:项目ID
+  - technicalFeature:技术特征
+  - pictureUrl:图片GUID列表
+  - targetType:目标类型
+  - markUserId:标注人
+  - publicTenantId:租户ID
+  - retrieveRecordId:检索记录ID(用于关联检索与对比)
+
+- 关键约束与行为
+  - useType在控制器中被强制设置为2,表示“查新报告对比记录”
+  - 若id为空则执行新增;否则执行更新
+  - 更新时会同步更新对比文献与项目关联
+
+章节来源
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java#L19-L86)
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L120)
+
+### 响应体模型:NoveltyCompareRecordQueryVO
+- 字段说明(节选)
+  - id、patentNo、markColor、markNoteText、markType、markSelectField、markSelectText、markSite、markTime、projectId、technicalFeature、pictureUrl、targetType、markUserId、publicTenantId
+  - generalRemark:总说明
+  - technicalPoints:现有技术要点
+  - excuteCase:实施方案
+  - beneficialEffect:有益效果
+  - systemFileList:系统文件列表(与图片GUID关联)
+
+- 数据来源
+  - 由服务层将标注记录与对比文献信息合并后返回
+
+章节来源
+- [NoveltyCompareRecordQueryVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyCompareRecordQueryVO.java#L1-L100)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L120-L205)
+
+### 查询流程(POST /noveltyCompareRecord/queryCompareRecord)
+```mermaid
+flowchart TD
+Start(["进入查询"]) --> LoadQuery["读取QueryNoveltyCompareRecordDTO<br/>projectId, patentNo"]
+LoadQuery --> FetchMarking["EsScratchWordsService.queryNoveltyRecord(projectId, useType=2)"]
+FetchMarking --> HasResults{"是否有标注记录?"}
+HasResults -- 否 --> ReturnEmpty["返回空列表"] --> End(["结束"])
+HasResults -- 是 --> FetchCompareFile["查询对比文献信息"]
+FetchCompareFile --> MergeData["合并标注记录与文献信息"]
+MergeData --> AttachFiles["按图片GUID加载系统文件"]
+AttachFiles --> ReturnData["返回List<NoveltyCompareRecordQueryVO>"] --> End
+```
+
+图表来源
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L120-L205)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L449-L481)
+
+章节来源
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L120-L205)
+
+### 新增/编辑流程(POST /noveltyCompareRecord/edit)
+```mermaid
+sequenceDiagram
+participant Ctrl as "控制器"
+participant Svc as "服务"
+participant ES as "ES标注服务"
+participant Lit as "对比文献服务"
+participant Proj as "导入/项目服务"
+Ctrl->>Svc : addOrUpdateCompareRecord(dto)
+alt 首次新增
+Svc->>Proj : addPatentToProject(patentNo, projectId)
+Svc->>Lit : addPatentCompareLiterature(patent, projectId, userId)
+Svc->>Proj : importPatentQueenService.add(patentNo, projectId)
+Svc->>ES : saveToEs(marking)
+else 更新
+Svc->>Proj : addPatentToProject(patentNo, projectId)
+Svc->>Lit : addPatentCompareLiterature(patent, projectId, userId)
+Svc->>ES : updateScratchWords(id, marking)
+end
+ES-->>Svc : id
+Svc-->>Ctrl : id
+Ctrl-->>Ctrl : 设置useType=2
+```
+
+图表来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L120)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L285)
+
+章节来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L120)
+
+### 删除流程(POST /noveltyCompareRecord/remove)
+- 接收字符串数组ids
+- 逐条调用ES删除接口
+- 返回传入的ids
+
+章节来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L576-L602)
+
+### 与Elasticsearch的集成与相似度计算
+- 标注索引:patent_marking
+  - 保存/更新/删除均通过EsScratchWordsService完成
+- 专利向量:patent
+  - 通过EsPatentVectorService生成/刷新向量,并调用PythonApiService获取向量
+- 相似度计算:PythonApiService
+  - 通过外部Python服务计算相似度,支持批量与缓存策略
+- 专利检索:EsPatentService
+  - 提供向量化专利检索能力,支持分页与过滤
+
+章节来源
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L285)
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L1-L131)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L116)
+- [EsPatentService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java#L1033-L1064)
+
+## 依赖关系分析
+- 控制器依赖服务层
+- 服务层依赖ES服务层与业务服务(导入、文献)
+- ES服务层依赖ElasticsearchClient与PythonApiService
+- 异常统一由XiaoShiException抛出,经GlobalExceptionHandler转换为标准响应
+
+```mermaid
+classDiagram
+class NoveltyCompareRecordController
+class NoveltyCompareRecordService
+class EsScratchWordsService
+class EsPatentVectorService
+class PythonApiService
+class Response
+class XiaoShiException
+class GlobalExceptionHandler
+NoveltyCompareRecordController --> NoveltyCompareRecordService : "调用"
+NoveltyCompareRecordService --> EsScratchWordsService : "标注ES"
+NoveltyCompareRecordService --> EsPatentVectorService : "向量ES"
+EsPatentVectorService --> PythonApiService : "相似度"
+NoveltyCompareRecordController --> Response : "统一响应"
+NoveltyCompareRecordService --> XiaoShiException : "业务异常"
+GlobalExceptionHandler --> Response : "异常转响应"
+```
+
+图表来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L1-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L34-L205)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L285)
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L1-L131)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L116)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java#L1-L154)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java#L1-L39)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+
+## 性能与扩展性
+- 向量生成与刷新
+  - 使用异步线程池刷新向量,避免阻塞主线程
+  - 分页批量刷新,控制每次处理数量
+- 相似度计算
+  - PythonApiService对重复文本进行缓存,减少重复计算
+  - 支持批量请求,降低网络往返次数
+- ES写入
+  - 使用批量写入与刷新策略,减少IO开销
+- 大规模数据对比
+  - 建议分批提交对比记录,避免单次请求过大
+  - 对检索与对比文献查询使用分页与过滤条件
+  - 合理设置useType与projectId,缩小查询范围
+
+章节来源
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L95-L131)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L116)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L285)
+
+## 故障排查指南
+- ES检索失败
+  - 现象:抛出XiaoShiException,消息包含“ES检索失败”
+  - 排查:检查ES索引是否存在、连接配置、权限与网络
+  - 参考
+    - [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L576-L602)
+    - [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L53-L73)
+- 相似度计算失败
+  - 现象:抛出XiaoShiException,消息包含“获取专利相似度失败”
+  - 排查:确认Python服务可用性、网络连通性、输入参数合法性
+  - 参考
+    - [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L87)
+- 未登录或无权限
+  - 现象:全局异常处理器返回401或无权限响应
+  - 排查:确认鉴权头与登录态
+  - 参考
+    - [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+- 数据格式错误
+  - 现象:请求体字段缺失或类型不符导致解析失败
+  - 建议:严格遵循DTO字段定义,确保id、patentNo、projectId等关键字段存在且类型正确
+  - 参考
+    - [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java#L19-L86)
+    - [QueryNoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/QueryNoveltyCompareRecordDTO.java#L9-L13)
+
+章节来源
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L576-L602)
+- [EsPatentVectorService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsPatentVectorService.java#L53-L73)
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java#L60-L87)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java#L19-L86)
+- [QueryNoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/QueryNoveltyCompareRecordDTO.java#L9-L13)
+
+## 结论
+- 本API围绕“查新对比记录”的新增/编辑、删除与查询展开,采用ES标注索引与专利向量/相似度服务支撑对比分析
+- 通过useType与projectId等字段限定查询范围,结合分页与异步刷新策略,可满足大规模数据对比场景
+- 统一的异常处理与响应封装提升了系统的可观测性与易用性
+
+## 附录
+
+### API定义与示例
+
+- 新增/编辑对比记录
+  - 方法:POST
+  - 路径:/noveltyCompareRecord/edit
+  - 请求体:NoveltyCompareRecordDTO
+  - 示例(JSON片段,字段以实际DTO为准)
+    - {
+      "patentNo": "CN2024XXXXXXX",
+      "markColor": "#FF0000",
+      "markNoteText": "对比说明",
+      "markSelectField": "摘要原文",
+      "markSelectText": "对比文本片段",
+      "markSite": 1,
+      "projectId": 1,
+      "technicalFeature": "技术特征描述",
+      "pictureUrl": ["guid1","guid2"],
+      "retrieveRecordId": 1
+    }
+  - 响应体:字符串id
+
+- 删除对比记录
+  - 方法:POST
+  - 路径:/noveltyCompareRecord/remove
+  - 请求体:["id1","id2",...]
+  - 响应体:["id1","id2",...]
+
+- 查询对比记录
+  - 方法:POST
+  - 路径:/noveltyCompareRecord/queryCompareRecord
+  - 请求体:QueryNoveltyCompareRecordDTO
+    - {
+      "projectId": 1,
+      "patentNo": "CN2024XXXXXXX"
+    }
+  - 响应体:List<NoveltyCompareRecordQueryVO>
+
+章节来源
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java#L19-L86)
+- [QueryNoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/QueryNoveltyCompareRecordDTO.java#L9-L13)
+- [NoveltyCompareRecordQueryVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyCompareRecordQueryVO.java#L1-L100)
+
+### 数据模型关系图
+```mermaid
+erDiagram
+NOVELTY_COMPARE_RECORD_DTO {
+string id
+string patentNo
+string markColor
+string markNoteText
+integer markType
+integer useType
+string markSelectField
+string markSelectText
+integer markSite
+datetime markTime
+integer projectId
+string technicalFeature
+string[] pictureUrl
+integer targetType
+string markUserId
+integer publicTenantId
+integer retrieveRecordId
+}
+NOVELTY_COMPARE_RECORD_QUERY_VO {
+string id
+string patentNo
+string markColor
+string markNoteText
+integer markType
+string markSelectField
+string markSelectText
+integer markSite
+datetime markTime
+integer projectId
+string technicalFeature
+string[] pictureUrl
+integer targetType
+string markUserId
+integer publicTenantId
+string generalRemark
+string technicalPoints
+string excuteCase
+string beneficialEffect
+object[] systemFileList
+}
+NOVELTY_COMPARE_RECORD_DTO ||--o{ NOVELTY_COMPARE_RECORD_QUERY_VO : "查询合并"
+```
+
+图表来源
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java#L19-L86)
+- [NoveltyCompareRecordQueryVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyCompareRecordQueryVO.java#L1-L100)
+
+### 测试参考
+- 单元测试展示了典型请求体构造与调用方式,可作为集成测试参考
+  - 参考:[NoveltyCompareRecordTests.java](file://src/test/java/cn/cslg/pas/novelty/NoveltyCompareRecordTests.java#L52-L107)

+ 257 - 0
.qoder/repowiki/zh/content/API端点参考/查新分析API/查新报告引用API.md

@@ -0,0 +1,257 @@
+# 查新报告引用API
+
+<cite>
+**本文档引用的文件**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java)
+- [NoveltyReportReferenceDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceDTO.java)
+- [NoveltyReportReferenceQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceQueryDTO.java)
+- [NoveltyReferencesVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyReferencesVO.java)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java)
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java)
+- [ReferencesService.java](file://src/main/java/cn/cslg/pas/service/business/ReferencesService.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+查新报告引用API是专利分析系统(PAS)中的关键模块,用于管理查新报告中引用的文献。该API支持添加、查询和删除查新报告文档,并与查新项目、对比记录和检索记录等核心数据进行关联。通过该API,用户可以为查新报告添加多篇对比文献并建立引用关系,确保引用数据的一致性和完整性。
+
+## 项目结构
+查新报告引用API的相关代码位于`src/main/java/cn/cslg/pas`目录下,主要分为控制器、DTO、VO、服务和领域模型五个部分。控制器负责处理HTTP请求,DTO用于数据传输,VO用于视图展示,服务层实现业务逻辑,领域模型定义数据结构。
+
+```mermaid
+graph TD
+A[NoveltyReportReferenceController] --> B[NoveltyReportReferencesService]
+B --> C[ReferencesService]
+B --> D[NoveltyReportTemplateService]
+B --> E[NoveltyProjectService]
+B --> F[TechnicalCaseService]
+B --> G[NoveltyCompareLiteratureService]
+B --> H[NoveltyCompareRecordService]
+B --> I[NoveltySearchRecordService]
+B --> J[EsPatentService]
+B --> K[NoveltyTemplateFactory]
+B --> L[NoveltyExportReportService]
+C --> M[ReferencesMapper]
+B --> N[NoveltyReportReferencesMapper]
+```
+
+**图表来源**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L28-L30)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L57-L68)
+
+**章节来源**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L1-L63)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L1-L242)
+
+## 核心组件
+查新报告引用API的核心组件包括`NoveltyReportReferenceController`、`NoveltyReportReferencesService`和`NoveltyReportReferences`。`NoveltyReportReferenceController`负责处理HTTP请求,`NoveltyReportReferencesService`实现业务逻辑,`NoveltyReportReferences`定义数据结构。
+
+**章节来源**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L30-L63)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L57-L242)
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java#L1-L30)
+
+## 架构概述
+查新报告引用API采用典型的分层架构,包括控制器层、服务层和数据访问层。控制器层负责处理HTTP请求,服务层实现业务逻辑,数据访问层负责与数据库交互。该API通过`NoveltyReportReferencesService`与`ReferencesService`等其他服务进行协作,实现复杂的业务逻辑。
+
+```mermaid
+graph TD
+A[客户端] --> B[NoveltyReportReferenceController]
+B --> C[NoveltyReportReferencesService]
+C --> D[ReferencesService]
+C --> E[其他服务]
+D --> F[ReferencesMapper]
+C --> G[NoveltyReportReferencesMapper]
+F --> H[数据库]
+G --> H
+```
+
+**图表来源**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L28-L30)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L57-L68)
+- [ReferencesService.java](file://src/main/java/cn/cslg/pas/service/business/ReferencesService.java#L46-L266)
+
+## 详细组件分析
+
+### NoveltyReportReferenceController分析
+`NoveltyReportReferenceController`是查新报告引用API的入口,负责处理HTTP请求。它提供了添加或编辑查新报告文档、导出查新检索报告、删除查新报告文档和查询查新检索报告四个端点。
+
+#### 控制器类图
+```mermaid
+classDiagram
+class NoveltyReportReferenceController {
++String API_XiaoSHI
+-NoveltyReportReferencesService noveltyReportReferencesService
+-NoveltyExportReportService noveltyExportReportService
++Response edit(NoveltyReportReferenceDTO)
++Response export(Integer)
++Response delete(Integer[])
++Response query(NoveltyReportReferenceQueryDTO)
+}
+```
+
+**图表来源**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L30-L63)
+
+#### API调用序列图
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "NoveltyReportReferenceController"
+participant Service as "NoveltyReportReferencesService"
+participant ReferencesService as "ReferencesService"
+Client->>Controller : POST /noveltyReportReference/edit
+Controller->>Service : addOrUpdate2(NoveltyReportReferenceDTO)
+Service->>ReferencesService : query(GetReferencesDTO)
+ReferencesService-->>Service : Records
+Service->>Service : 生成报告数据
+Service->>Service : 保存引用文献
+Service->>Service : 导出报告
+Service-->>Controller : 报告ID
+Controller-->>Client : Response
+```
+
+**图表来源**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L35-L40)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L176-L197)
+
+**章节来源**  
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L30-L63)
+
+### NoveltyReportReferencesService分析
+`NoveltyReportReferencesService`是查新报告引用API的核心服务,负责实现业务逻辑。它提供了添加或更新引用文献、查询引用文献列表和删除引用文献等功能。
+
+#### 服务类图
+```mermaid
+classDiagram
+class NoveltyReportReferencesService {
+-NoveltyReportTemplateService noveltyReportTemplateService
+-ReferencesService referencesService
+-NoveltyProjectService noveltyProjectService
+-TechnicalCaseService technicalCaseService
+-NoveltyCompareLiteratureService noveltyCompareLiteratureService
+-NoveltyCompareRecordService noveltyCompareRecordService
+-NoveltySearchRecordService noveltySearchRecordService
+-EsPatentService esPatentService
+-NoveltyTemplateFactory noveltyTemplateFactory
+-NoveltyExportReportService noveltyExportReportService
+-CacheUtils cacheUtils
+-LoginUtils loginUtils
++Integer addOrUpdate(NoveltyReportReferenceDTO)
++Integer addFinalReference(Integer, String)
++Records queryReference(NoveltyReportReferenceQueryDTO)
++Integer[] delete(Integer[])
++Integer addOrUpdate2(NoveltyReportReferenceDTO)
+}
+```
+
+**图表来源**  
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L57-L68)
+
+#### 业务逻辑流程图
+```mermaid
+flowchart TD
+Start([开始]) --> ValidateInput["验证输入参数"]
+ValidateInput --> InputValid{"输入有效?"}
+InputValid --> |否| ReturnError["返回错误"]
+InputValid --> |是| CheckExist["检查引用是否存在"]
+CheckExist --> Exists{"存在?"}
+Exists --> |是| Update["更新引用"]
+Exists --> |否| Create["创建引用"]
+Update --> GenerateData["生成报告数据"]
+Create --> GenerateData
+GenerateData --> Save["保存引用文献"]
+Save --> Export["导出报告"]
+Export --> End([结束])
+ReturnError --> End
+```
+
+**图表来源**  
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L74-L197)
+
+**章节来源**  
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L57-L242)
+
+### 数据模型分析
+查新报告引用API的数据模型包括`NoveltyReportReferences`和`References`两个主要实体。`NoveltyReportReferences`存储查新报告特有的引用信息,`References`存储通用的引用信息。
+
+#### 数据模型图
+```mermaid
+erDiagram
+NOVELTY_REPORT_REFERENCES {
+integer id PK
+string dataSource
+boolean ifHaveFinalFile
+integer templateId
+string configMessage
+integer reportReferenceId FK
+}
+REFERENCES {
+integer id PK
+integer projectId
+string referencesName
+string fileGuid
+string remark
+string createId
+date createTime
+string type
+}
+NOVELTY_REPORT_REFERENCES ||--|| REFERENCES : "一对一"
+```
+
+**图表来源**  
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java#L1-L30)
+- [References.java](file://src/main/java/cn/cslg/pas/domain/business/References.java#L1-L59)
+
+**章节来源**  
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java#L1-L30)
+- [References.java](file://src/main/java/cn/cslg/pas/domain/business/References.java#L1-L59)
+
+## 依赖分析
+查新报告引用API依赖于多个其他服务和组件,包括`ReferencesService`、`NoveltyReportTemplateService`、`NoveltyProjectService`等。这些依赖关系确保了API能够访问必要的数据和功能,实现复杂的业务逻辑。
+
+```mermaid
+graph TD
+A[NoveltyReportReferencesService] --> B[ReferencesService]
+A --> C[NoveltyReportTemplateService]
+A --> D[NoveltyProjectService]
+A --> E[TechnicalCaseService]
+A --> F[NoveltyCompareLiteratureService]
+A --> G[NoveltyCompareRecordService]
+A --> H[NoveltySearchRecordService]
+A --> I[EsPatentService]
+A --> J[NoveltyTemplateFactory]
+A --> K[NoveltyExportReportService]
+A --> L[CacheUtils]
+A --> M[LoginUtils]
+```
+
+**图表来源**  
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L58-L69)
+
+**章节来源**  
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L57-L242)
+
+## 性能考虑
+查新报告引用API在设计时考虑了性能优化。通过使用MyBatis Plus的分页查询功能,API能够高效地处理大量数据。此外,API还使用了缓存机制,减少了对数据库的频繁访问。
+
+## 故障排除指南
+在使用查新报告引用API时,可能会遇到一些常见问题。例如,添加引用文献时可能会因为附件为空而失败。此时,应检查请求体中的`fileGuid`字段是否正确设置。查询引用文献列表时,如果返回空结果,应检查`projectId`参数是否正确。
+
+**章节来源**  
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L68-L73)
+- [ReferencesService.java](file://src/main/java/cn/cslg/pas/service/business/ReferencesService.java#L76-L78)
+
+## 结论
+查新报告引用API是专利分析系统中的重要组成部分,它提供了一套完整的接口,用于管理查新报告中的引用文献。通过该API,用户可以方便地添加、查询和删除引用文献,确保查新报告的完整性和一致性。API的设计考虑了性能和可扩展性,能够满足大规模数据处理的需求。

+ 318 - 0
.qoder/repowiki/zh/content/API端点参考/查新分析API/查新项目管理API.md

@@ -0,0 +1,318 @@
+# 查新项目管理API
+
+<cite>
+**本文档引用的文件**   
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java)
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java)
+- [QueryNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryNoveltyProjectDTO.java)
+- [QueryNoveltyProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryNoveltyProjectVO.java)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java)
+- [StpAdminUtil.java](file://src/main/java/cn/cslg/pas/common/utils/StpAdminUtil.java)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [API端点概览](#api端点概览)
+3. [请求体结构](#请求体结构)
+4. [响应体结构](#响应体结构)
+5. [SaToken认证机制](#satoken认证机制)
+6. [异常处理](#异常处理)
+7. [使用示例](#使用示例)
+
+## 简介
+查新项目管理API提供了一套完整的RESTful接口,用于管理专利查新项目。该API允许用户创建、查询、更新和删除查新项目,支持通过检索关键词、技术领域和项目描述等信息来组织和管理查新任务。API基于Spring Boot框架构建,使用SaToken进行身份验证和权限控制,确保了系统的安全性和可靠性。
+
+**Section sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L37-L39)
+
+## API端点概览
+查新项目管理API提供了四个核心端点,分别对应查新项目的增删改查操作。所有端点均位于`/api/xiaoshi/noveltyProject`基础路径下。
+
+```mermaid
+flowchart TD
+A["POST /noveltyProject/addNoveltyProject<br/>创建查新项目"] --> B["响应: 200 OK<br/>{code: 200, data: projectId}"]
+C["POST /noveltyProject/queryNoveltyProject<br/>查询项目列表"] --> D["响应: 200 OK<br/>{code: 200, data: records}"]
+E["POST /noveltyProject/updateNoveltyProject<br/>更新项目信息"] --> F["响应: 200 OK<br/>{code: 200, data: projectId}"]
+G["POST /noveltyProject/deleteNoveltyProject<br/>删除项目"] --> H["响应: 200 OK<br/>{code: 200, message: '删除成功'}"]
+```
+
+**Diagram sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L60-L118)
+
+**Section sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L60-L118)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46)
+
+## 请求体结构
+### AddNoveltyProjectDTO字段说明
+`AddNoveltyProjectDTO`是创建和更新查新项目时使用的请求体数据传输对象,包含以下字段:
+
+| 字段名 | 类型 | 必填 | 描述 | 验证规则 |
+|--------|------|------|------|----------|
+| customCaseNumber | String | 否 | 自定义案卷号 | 最大长度255字符 |
+| innerCaseNumber | String | 否 | 内部案卷号 | 最大长度255字符 |
+| applicants | String | 否 | 申请人 | 最大长度255字符 |
+| inventor | String | 否 | 发明人 | 最大长度255字符 |
+| ipr | String | 否 | 知识产权联系人 | 最大长度255字符 |
+| technicalContact | String | 否 | 技术联系人 | 最大长度255字符 |
+| searchUnit | String | 否 | 检索单位 | 最大长度255字符 |
+| searchUnitContact | String | 否 | 检索单位联系人 | 最大长度255字符 |
+| caseName | String | 否 | 案件名称 | 最大长度255字符,必填 |
+| searchReviewer | String | 否 | 检索审核人 | 最大长度255字符 |
+| preliminaryConclusions | String | 否 | 初步结论 | 文本内容 |
+| ifPatentability | String | 否 | 是否具备专利性 | 文本内容 |
+| applicationAdvice | String | 否 | 申请建议 | 文本内容 |
+| applicationRemark | String | 否 | 申请备注 | 文本内容 |
+| replenishMeans | String | 否 | 补充手段 | 文本内容 |
+| writeAdvice | String | 否 | 撰写建议 | 文本内容 |
+| projectId | Integer | 否 | 项目ID | 更新时必填 |
+| entrustType | Integer | 否 | 委托类型(1客户,2部门) | 数值范围1-2 |
+| entrustId | String | 否 | 委托方ID | 最大长度255字符 |
+| entrustName | String | 否 | 委托方名称 | 最大长度255字符 |
+| headId | String | 否 | 负责人ID | 最大长度255字符 |
+| departmentId | String | 否 | 部门ID | 最大长度255字符 |
+
+**Section sources**
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java#L1-L52)
+
+## 响应体结构
+### QueryNoveltyProjectVO数据结构
+`QueryNoveltyProjectVO`是查询查新项目列表时返回的响应体数据传输对象,包含项目的所有相关信息:
+
+| 字段名 | 类型 | 描述 |
+|--------|------|------|
+| projectId | Integer | 项目ID |
+| noveltyProjectId | Integer | 查新项目ID |
+| technicalCaseId | Integer | 技术方案ID |
+| customCaseNumber | String | 自定义案卷号 |
+| innerCaseNumber | String | 内部案卷号 |
+| applicants | String | 申请人 |
+| inventor | String | 发明人 |
+| ipr | String | 知识产权联系人 |
+| technicalContact | String | 技术联系人 |
+| searchUnit | String | 检索单位 |
+| searchUnitContact | String | 检索单位联系人 |
+| caseName | String | 案件名称 |
+| searchReviewer | String | 检索审核人 |
+| preliminaryConclusions | String | 初步结论 |
+| ifPatentability | String | 是否具备专利性 |
+| applicationAdvice | String | 申请建议 |
+| applicationRemark | String | 申请备注 |
+| replenishMeans | String | 补充手段 |
+| writeAdvice | String | 撰写建议 |
+| ipc | String | IPC分类号 |
+| solvedProblem | String | 解决的问题 |
+| technicalField | String | 技术领域 |
+| remark | String | 备注 |
+| inventionPoint | String | 发明点 |
+| systemFileList | List<SystemFile> | 系统文件列表 |
+| tenantId | Integer | 租户ID |
+| createId | String | 创建人ID |
+| createName | String | 创建人姓名 |
+| createTime | Date | 创建时间 |
+| entrustType | Integer | 委托类型(1客户,2部门) |
+| entrustId | String | 委托方ID |
+| entrustName | String | 委托方名称 |
+| departmentId | String | 部门ID |
+| departmentName | String | 部门名称 |
+| headId | String | 负责人ID |
+| headName | String | 负责人姓名 |
+
+**Section sources**
+- [QueryNoveltyProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryNoveltyProjectVO.java#L1-L87)
+
+## SaToken认证机制
+查新项目管理API使用SaToken框架进行身份验证和权限控制。SaToken是一个轻量级的Java权限认证框架,提供了登录认证、权限认证、会话管理等功能。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant API as "API网关"
+participant SaToken as "SaToken认证"
+participant Service as "业务服务"
+Client->>API : 发送请求(含token)
+API->>SaToken : 验证token有效性
+alt token有效
+SaToken-->>API : 验证通过
+API->>Service : 转发请求
+Service-->>API : 返回结果
+API-->>Client : 返回响应
+else token无效
+SaToken-->>API : 验证失败
+API-->>Client : 返回401未授权
+end
+```
+
+**Diagram sources**
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java#L1-L35)
+- [StpAdminUtil.java](file://src/main/java/cn/cslg/pas/common/utils/StpAdminUtil.java#L1-L58)
+
+**Section sources**
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java#L1-L35)
+- [StpAdminUtil.java](file://src/main/java/cn/cslg/pas/common/utils/StpAdminUtil.java#L1-L58)
+
+## 异常处理
+系统通过全局异常处理器处理API调用过程中的各种异常情况,确保返回一致的错误响应格式。
+
+```mermaid
+flowchart TD
+A["API调用"] --> B{"是否发生异常?"}
+B --> |是| C["捕获异常"]
+C --> D{"异常类型"}
+D --> |XiaoShiException| E["返回自定义错误信息"]
+D --> |NotLoginException| F["返回401未登录"]
+D --> |PermissionException| G["返回402无权限"]
+D --> |其他异常| H["返回500系统异常"]
+E --> I["响应: {code: errorCode, message: errorMessage}"]
+F --> I
+G --> I
+H --> I
+B --> |否| J["正常处理"]
+J --> K["响应: {code: 200, data: result}"]
+```
+
+**Diagram sources**
+- [GlobalException.java](file://src/main/java/cn/cslg/pas/common/core/GlobalException.java#L32-L47)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java#L1-L38)
+
+**Section sources**
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java#L1-L38)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java#L44-L84)
+- [ResponseEnum.java](file://src/main/java/cn/cslg/pas/common/utils/ResponseEnum.java#L1-L46)
+
+## 使用示例
+### 创建查新项目
+以下示例展示了如何通过API创建一个包含检索关键词、技术领域和项目描述的查新项目。
+
+**请求示例**
+```json
+POST /api/xiaoshi/noveltyProject/addNoveltyProject HTTP/1.1
+Content-Type: application/json
+Authorization: Bearer <your_token>
+
+{
+  "caseName": "智能语音识别系统查新",
+  "technicalContact": "张三",
+  "searchUnit": "技术研发部",
+  "searchUnitContact": "李四",
+  "inventionPoint": "基于深度学习的语音特征提取方法",
+  "technicalField": "人工智能,语音识别",
+  "remark": "重点关注国内外最新专利动态",
+  "customCaseNumber": "XS2024001",
+  "innerCaseNumber": "NR2024001"
+}
+```
+
+**响应示例**
+```json
+{
+  "code": 200,
+  "message": "请求成功",
+  "data": 12345
+}
+```
+
+### 查询项目列表
+查询所有查新项目,支持分页和筛选。
+
+**请求示例**
+```json
+POST /api/xiaoshi/noveltyProject/queryNoveltyProject HTTP/1.1
+Content-Type: application/json
+Authorization: Bearer <your_token>
+
+{
+  "current": 1,
+  "size": 10,
+  "caseName": "智能语音识别"
+}
+```
+
+**响应示例**
+```json
+{
+  "code": 200,
+  "message": "请求成功",
+  "data": {
+    "current": 1,
+    "size": 10,
+    "total": 1,
+    "data": [
+      {
+        "projectId": 12345,
+        "caseName": "智能语音识别系统查新",
+        "technicalContact": "张三",
+        "searchUnit": "技术研发部",
+        "inventionPoint": "基于深度学习的语音特征提取方法",
+        "technicalField": "人工智能,语音识别",
+        "createTime": "2024-01-15T10:30:00"
+      }
+    ]
+  }
+}
+```
+
+### curl命令示例
+以下是完整的项目管理操作流程的curl命令示例:
+
+```bash
+# 设置变量
+BASE_URL="http://localhost:8080"
+TOKEN="your_auth_token"
+
+# 1. 创建查新项目
+echo "创建查新项目..."
+PROJECT_ID=$(curl -s -X POST "$BASE_URL/api/xiaoshi/noveltyProject/addNoveltyProject" \
+  -H "Content-Type: application/json" \
+  -H "Authorization: Bearer $TOKEN" \
+  -d '{
+    "caseName": "智能语音识别系统查新",
+    "technicalContact": "张三",
+    "searchUnit": "技术研发部",
+    "inventionPoint": "基于深度学习的语音特征提取方法",
+    "technicalField": "人工智能,语音识别"
+  }' | jq -r '.data')
+
+echo "创建成功,项目ID: $PROJECT_ID"
+
+# 2. 查询项目列表
+echo "查询项目列表..."
+curl -s -X POST "$BASE_URL/api/xiaoshi/noveltyProject/queryNoveltyProject" \
+  -H "Content-Type: application/json" \
+  -H "Authorization: Bearer $TOKEN" \
+  -d '{
+    "current": 1,
+    "size": 10
+  }' | jq '.'
+
+# 3. 更新项目信息
+echo "更新项目信息..."
+curl -s -X POST "$BASE_URL/api/xiaoshi/noveltyProject/updateNoveltyProject" \
+  -H "Content-Type: application/json" \
+  -H "Authorization: Bearer $TOKEN" \
+  -d "{
+    \"projectId\": $PROJECT_ID,
+    \"caseName\": \"智能语音识别系统查新(更新版)\",
+    \"applicationAdvice\": \"建议尽快申请发明专利\"
+  }" | jq '.'
+
+# 4. 删除项目
+echo "删除项目..."
+curl -s -X POST "$BASE_URL/api/xiaoshi/noveltyProject/deleteNoveltyProject" \
+  -H "Content-Type: application/json" \
+  -H "Authorization: Bearer $TOKEN" \
+  -d "{
+    \"projectId\": $PROJECT_ID
+  }" | jq '.'
+```
+
+**Section sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L60-L118)
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java#L1-L52)
+- [QueryNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryNoveltyProjectDTO.java#L1-L89)
+- [QueryNoveltyProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryNoveltyProjectVO.java#L1-L87)

+ 339 - 0
.qoder/repowiki/zh/content/API端点参考/系统管理API/个人配置API.md

@@ -0,0 +1,339 @@
+# 个人配置API
+
+<cite>
+**本文档引用的文件**   
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java)
+- [AddSelfFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddSelfFieldDTO.java)
+- [PersonSelfFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/PersonSelfFieldVO.java)
+- [GetTabelColumDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/GetTabelColumDTO.java)
+- [QueryFieldsDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryFieldsDTO.java)
+- [customField.json](file://src/main/resources/jsons/customField.json)
+- [RedisConf.java](file://src/main/java/cn/cslg/pas/common/core/base/RedisConf.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+个人配置API为用户提供了一套完整的个性化配置管理系统,允许用户自定义界面布局、默认视图、通知设置等配置项。该系统通过PersonFieldController中的端点实现个人字段的创建、更新和查询操作,支持在不同模块(如专利检索、项目管理)中应用用户个性化设置。系统采用Redis缓存存储用户配置,结合JSON配置文件定义默认字段结构,实现了高效灵活的用户偏好管理。
+
+## 项目结构
+系统采用典型的分层架构设计,个人配置相关功能主要分布在controller、service和resources三个目录中。controller层包含PersonFieldController处理API请求,service层包含PersonFieldService实现业务逻辑,resources目录下的jsons子目录存储各类配置模板文件。
+
+```mermaid
+graph TB
+subgraph "Controller层"
+PersonFieldController[PersonFieldController]
+end
+subgraph "Service层"
+PersonFieldService[PersonFieldService]
+end
+subgraph "资源层"
+jsons[jsons目录]
+customField[customField.json]
+end
+PersonFieldController --> PersonFieldService
+PersonFieldService --> jsons
+jsons --> customField
+```
+
+**图表来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L41)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L38)
+- [customField.json](file://src/main/resources/jsons/customField.json#L1)
+
+**章节来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L1)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L1)
+- [customField.json](file://src/main/resources/jsons/customField.json#L1)
+
+## 核心组件
+个人配置系统的核心组件包括PersonFieldController、PersonFieldService和相关DTO/VO类。PersonFieldController负责处理HTTP请求,PersonFieldService实现具体的业务逻辑,DTO类用于数据传输,VO类用于视图展示。系统通过Redis缓存用户配置,结合JSON配置文件定义默认字段结构,实现了高效灵活的用户偏好管理。
+
+**章节来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L43)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L38)
+- [AddSelfFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddSelfFieldDTO.java#L1)
+
+## 架构概述
+个人配置系统采用前后端分离架构,通过RESTful API提供服务。系统架构分为表现层、业务逻辑层和数据访问层。表现层由PersonFieldController组成,负责处理HTTP请求和响应;业务逻辑层由PersonFieldService组成,负责实现具体的业务逻辑;数据访问层通过Redis缓存和JSON文件提供数据存储。
+
+```mermaid
+graph TB
+subgraph "表现层"
+PersonFieldController[PersonFieldController]
+end
+subgraph "业务逻辑层"
+PersonFieldService[PersonFieldService]
+end
+subgraph "数据访问层"
+Redis[Redis缓存]
+JSON[JSON配置文件]
+end
+PersonFieldController --> PersonFieldService
+PersonFieldService --> Redis
+PersonFieldService --> JSON
+```
+
+**图表来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L43)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L40)
+- [RedisConf.java](file://src/main/java/cn/cslg/pas/common/core/base/RedisConf.java#L1)
+
+## 详细组件分析
+### PersonFieldController分析
+PersonFieldController是个人配置系统的核心控制器,提供了多个端点用于管理用户个性化设置。控制器通过POST请求处理字段的创建、更新和查询操作,所有端点都位于/api/xiaoshi/personField路径下。
+
+#### API端点分析
+```mermaid
+classDiagram
+class PersonFieldController {
++Response getQueryFields(QueryFieldsDTO[])
++Response getTableColumns(GetTabelColumDTO)
++Response getTableExportColumns(GetTabelColumDTO)
++Response getAllCountColumns(GetAllPatentCountDTO)
++Response setTableColumns(AddSelfFieldDTO)
++Response setShowCountColumns(AddPatentCountDTO)
++Response getShowCountColumns(GetAllPatentCountDTO)
++Response getEvidenceReasonTableColumns(GetTabelColumDTO)
++Response setEvidenceReasonTableColumns(AddSelfFieldDTO)
+}
+class PersonFieldService {
++PersonSelfFieldVO[] getQueryFields(QueryFieldsDTO[])
++PersonSelfFieldVO[] getTableColumns(GetTabelColumDTO)
++PersonSelfFieldVO[] getTableExportColumns(GetTabelColumDTO)
++GetAllPatentCountVO[] getAllCountColumns(GetAllPatentCountDTO)
++PersonSelfFieldVO[] setTableColumns(AddSelfFieldDTO)
++GetAllPatentCountVO[] setShowCountColumns(AddPatentCountDTO)
++GetAllPatentCountVO[] getShowCountColumns(GetAllPatentCountDTO)
++PersonSelfFieldVO[] getEvidenceReasonTableColumns(GetTabelColumDTO)
++PersonSelfFieldVO[] setEvidenceReasonTableColumns(AddSelfFieldDTO)
+}
+PersonFieldController --> PersonFieldService : "依赖"
+```
+
+**图表来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L43)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L38)
+
+#### 字段创建与更新流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "PersonFieldController"
+participant Service as "PersonFieldService"
+participant Redis as "Redis缓存"
+Client->>Controller : POST /setTableColumns
+Controller->>Service : 调用setTableColumns()
+Service->>Redis : 读取默认字段配置
+Redis-->>Service : 返回字段配置
+Service->>Service : 处理用户设置
+Service->>Redis : 保存更新后的配置
+Redis-->>Service : 确认保存
+Service-->>Controller : 返回结果
+Controller-->>Client : 返回响应
+```
+
+**图表来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L85)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L121)
+
+#### 字段查询流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "PersonFieldController"
+participant Service as "PersonFieldService"
+participant Redis as "Redis缓存"
+participant JSON as "JSON配置文件"
+Client->>Controller : POST /getTableColumns
+Controller->>Service : 调用getTableColumns()
+Service->>Redis : 查询用户配置
+alt 配置存在
+Redis-->>Service : 返回用户配置
+else 配置不存在
+Redis-->>Service : 无数据
+Service->>JSON : 读取默认配置
+JSON-->>Service : 返回默认配置
+Service->>Redis : 保存默认配置
+end
+Service-->>Controller : 返回字段配置
+Controller-->>Client : 返回响应
+```
+
+**图表来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L58)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L53)
+
+**章节来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L43)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L38)
+
+### 配置存储结构分析
+#### 个人字段VO结构
+```mermaid
+classDiagram
+class PersonSelfFieldVO {
+-String name
+-String type
+-String value
+-String field
+-Integer order
+-Boolean ifShow
+-Boolean ifHidden
+-Integer createType
+-Boolean defaultHidden
+-Boolean ifPersonal
+-Boolean ifSort
+-Boolean ifNotOrder
+-Boolean editable
+-Boolean isExport
+-Object optionValue
+}
+```
+
+**图表来源**
+- [PersonSelfFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/PersonSelfFieldVO.java#L1)
+
+#### 添加字段DTO结构
+```mermaid
+classDiagram
+class AddSelfFieldDTO {
+-String tableName
+-PersonSelfFieldVO[] value
+-Integer projectId
+-Integer productId
+}
+```
+
+**图表来源**
+- [AddSelfFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddSelfFieldDTO.java#L1)
+
+#### 查询字段DTO结构
+```mermaid
+classDiagram
+class QueryFieldsDTO {
+-String tableName
+-Integer projectId
+-Integer productId
+}
+```
+
+**图表来源**
+- [QueryFieldsDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryFieldsDTO.java#L1)
+
+#### 表格列DTO结构
+```mermaid
+classDiagram
+class GetTabelColumDTO {
+-Integer projectId
+-Integer taskId
+-String tableName
+-Integer productId
+}
+```
+
+**图表来源**
+- [GetTabelColumDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/GetTabelColumDTO.java#L1)
+
+**章节来源**
+- [PersonSelfFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/PersonSelfFieldVO.java#L1)
+- [AddSelfFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddSelfFieldDTO.java#L1)
+- [QueryFieldsDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryFieldsDTO.java#L1)
+- [GetTabelColumDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/GetTabelColumDTO.java#L1)
+
+### 配置访问方式分析
+#### 配置存储流程
+```mermaid
+flowchart TD
+Start([开始]) --> CheckRedis["检查Redis缓存"]
+CheckRedis --> CacheHit{"缓存命中?"}
+CacheHit --> |是| ReturnCache["返回缓存数据"]
+CacheHit --> |否| ReadJSON["读取JSON配置文件"]
+ReadJSON --> ProcessData["处理配置数据"]
+ProcessData --> SaveRedis["保存到Redis"]
+SaveRedis --> ReturnResult["返回结果"]
+ReturnCache --> End([结束])
+ReturnResult --> End
+```
+
+**图表来源**
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L69)
+
+#### 批量更新配置流程
+```mermaid
+flowchart TD
+Start([开始]) --> ReceiveRequest["接收批量更新请求"]
+ReceiveRequest --> ValidateData["验证数据完整性"]
+ValidateData --> ProcessFields["遍历处理每个字段"]
+ProcessFields --> UpdateField["更新字段属性"]
+UpdateField --> Continue{"还有字段?"}
+Continue --> |是| ProcessFields
+Continue --> |否| SaveConfig["保存配置到Redis"]
+SaveConfig --> ReturnResult["返回更新结果"]
+ReturnResult --> End([结束])
+```
+
+**图表来源**
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L121)
+
+#### 导出配置模板流程
+```mermaid
+flowchart TD
+Start([开始]) --> ReadTemplate["读取配置模板文件"]
+ReadTemplate --> ParseJSON["解析JSON数据"]
+ParseJSON --> FilterFields["过滤可导出字段"]
+FilterFields --> FormatData["格式化导出数据"]
+FormatData --> GenerateFile["生成导出文件"]
+GenerateFile --> ReturnFile["返回文件下载链接"]
+ReturnFile --> End([结束])
+```
+
+**图表来源**
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L69)
+
+**章节来源**
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L53)
+
+## 依赖分析
+个人配置系统依赖于多个核心组件和服务,包括Redis缓存、JSON配置文件、用户认证服务和通用工具类。系统通过依赖注入方式获取PersonFieldService实例,并使用RedisUtil进行缓存操作,CacheUtils处理用户会话,LoginUtils验证用户身份。
+
+```mermaid
+graph TD
+PersonFieldController --> PersonFieldService
+PersonFieldService --> RedisUtil
+PersonFieldService --> CacheUtils
+PersonFieldService --> LoginUtils
+PersonFieldService --> CustomFieldService
+PersonFieldService --> ReportProjectService
+PersonFieldService --> CommonService
+```
+
+**图表来源**
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L45)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L40)
+
+**章节来源**
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L38)
+
+## 性能考虑
+个人配置系统通过Redis缓存显著提升了性能,避免了频繁的文件读取操作。系统采用MD5哈希生成唯一的缓存键,确保不同用户和项目的配置隔离。对于大量配置数据,系统支持批量操作,减少网络往返次数。JSON配置文件被缓存在内存中,提高读取效率。
+
+## 故障排除指南
+当遇到配置不生效的问题时,首先检查Redis服务是否正常运行,确认缓存键的生成是否正确。对于字段显示异常,验证JSON配置文件的格式是否正确,确保字段属性定义完整。在调试时,可以临时禁用Redis缓存,直接从JSON文件读取配置进行测试。
+
+**章节来源**
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L69)
+- [RedisConf.java](file://src/main/java/cn/cslg/pas/common/core/base/RedisConf.java#L1)
+
+## 结论
+个人配置API提供了一套完整的用户个性化设置管理方案,通过灵活的API设计和高效的缓存机制,实现了用户偏好设置的持久化和快速访问。系统支持在不同模块中应用个性化配置,为用户提供一致的使用体验。通过JSON配置模板和Redis缓存的结合,系统既保证了配置的灵活性,又确保了高性能的访问速度。

+ 402 - 0
.qoder/repowiki/zh/content/API端点参考/系统管理API/权限管理API.md

@@ -0,0 +1,402 @@
+# 权限管理API
+
+<cite>
+**本文引用的文件**
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java)
+- [PermissionRecord.java](file://src/main/java/cn/cslg/pas/domain/business/PermissionRecord.java)
+- [PermissionRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PermissionRecordDTO.java)
+- [PermissionRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/PermissionRecordVO.java)
+- [PermissionRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/PermissionRecordMapper.java)
+- [checkAuth.java](file://src/main/java/cn/cslg/pas/common/auth/checkAuth.java)
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java)
+- [StpAdminUtil.java](file://src/main/java/cn/cslg/pas/common/utils/StpAdminUtil.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+- [application.yml](file://src/main/resources/application.yml)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能与安全考虑](#性能与安全考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向权限管理功能,聚焦于“许可历史”模块的API与数据模型,涵盖以下内容:
+- PermissionRecordController 中的端点说明(新增/更新、查询、删除)
+- 权限记录(PermissionRecord)数据模型字段与来源
+- 基于注解的权限控制(@checkAuth)实现机制与细粒度访问控制
+- 在项目共享、报告查看等场景中的权限配置示例
+- 权限继承与覆盖规则说明
+
+## 项目结构
+围绕“许可历史”权限管理,主要涉及如下层次:
+- 控制器层:PermissionRecordController 提供对外HTTP接口
+- 业务层:PermissionRecordService 实现保存、分页查询、删除等逻辑
+- 数据层:PermissionRecordMapper 提供扩展统计查询
+- 模型层:PermissionRecord(实体)、PermissionRecordDTO(传输)、PermissionRecordVO(视图)
+- 权限控制:checkAuth 注解 + AuthAop 切面 + 外部权限系统对接
+- 工具与常量:Constants(统一前缀)、StpAdminUtil(通用鉴权工具)
+
+```mermaid
+graph TB
+subgraph "控制器层"
+C["PermissionRecordController"]
+end
+subgraph "业务层"
+S["PermissionRecordService"]
+end
+subgraph "数据层"
+M["PermissionRecordMapper"]
+E["PermissionRecord(实体)"]
+end
+subgraph "权限控制"
+AOP["@checkAuth + AuthAop"]
+PS["PermissionService(外部权限系统)"]
+end
+subgraph "工具与常量"
+K["Constants(API前缀)"]
+SA["StpAdminUtil(通用鉴权)"]
+end
+C --> S
+S --> M
+M --> E
+AOP --> PS
+C --> K
+S --> PS
+SA -.-> S
+```
+
+图表来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L1-L54)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L1-L157)
+- [PermissionRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/PermissionRecordMapper.java#L1-L22)
+- [PermissionRecord.java](file://src/main/java/cn/cslg/pas/domain/business/PermissionRecord.java#L1-L85)
+- [checkAuth.java](file://src/main/java/cn/cslg/pas/common/auth/checkAuth.java#L1-L18)
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java#L1-L176)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java#L1-L276)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L1-L149)
+
+章节来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L1-L54)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L46)
+
+## 核心组件
+- 控制器:PermissionRecordController
+  - 提供/saveOrUpdate、/query、/delete三个端点,均位于统一路径前缀下
+- 业务服务:PermissionRecordService
+  - saveOrUpdate:支持新增或更新许可记录;自动注入租户与创建人信息
+  - getPermissionRecord:按专利号分页查询许可记录,并加载创建人姓名
+  - deletePermissionRecord:批量删除许可记录
+- 数据映射:PermissionRecordMapper
+  - 提供许可记录的统计维度查询(月、季度、年)
+- 模型:
+  - PermissionRecord(实体):持久化字段
+  - PermissionRecordDTO(传输):API输入
+  - PermissionRecordVO(视图):API输出(含创建人姓名等)
+- 权限控制:
+  - @checkAuth 注解 + AuthAop 切面:在方法级进行数据规则校验
+  - PermissionService:与外部权限系统交互,获取人员、客户、部门等信息
+  - StpAdminUtil:通用鉴权工具(角色/权限校验)
+
+章节来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L1-L54)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L27-L156)
+- [PermissionRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/PermissionRecordMapper.java#L1-L22)
+- [PermissionRecord.java](file://src/main/java/cn/cslg/pas/domain/business/PermissionRecord.java#L1-L85)
+- [PermissionRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PermissionRecordDTO.java#L1-L64)
+- [PermissionRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/PermissionRecordVO.java#L1-L82)
+- [checkAuth.java](file://src/main/java/cn/cslg/pas/common/auth/checkAuth.java#L1-L18)
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java#L37-L176)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java#L1-L276)
+- [StpAdminUtil.java](file://src/main/java/cn/cslg/pas/common/utils/StpAdminUtil.java#L560-L666)
+
+## 架构总览
+许可历史API的典型调用链路如下:
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Ctrl as "PermissionRecordController"
+participant Svc as "PermissionRecordService"
+participant Mapper as "PermissionRecordMapper"
+participant Perm as "PermissionService(外部权限系统)"
+participant DB as "数据库"
+Client->>Ctrl : POST /api/xiaoshi/permissionRecord/saveOrUpdate
+Ctrl->>Svc : saveOrUpdate(dto)
+Svc->>Svc : 注入租户与创建人信息
+Svc->>DB : insert/update
+DB-->>Svc : 结果
+Svc-->>Ctrl : id
+Ctrl-->>Client : Response.success(id)
+Client->>Ctrl : POST /api/xiaoshi/permissionRecord/query
+Ctrl->>Svc : getPermissionRecord(queryDto)
+Svc->>DB : 分页查询(按专利号)
+DB-->>Svc : 列表
+Svc->>Perm : getPersonnelByIdsFromPCS(ids)
+Perm-->>Svc : 人员列表
+Svc-->>Ctrl : Records(含创建人姓名)
+Ctrl-->>Client : Response.success(Records)
+Client->>Ctrl : POST /api/xiaoshi/permissionRecord/delete
+Ctrl->>Svc : deletePermissionRecord(ids)
+Svc->>DB : 批量删除
+DB-->>Svc : 结果
+Svc-->>Ctrl : ids
+Ctrl-->>Client : Response.success(ids)
+```
+
+图表来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L29-L53)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L52-L156)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java#L61-L80)
+
+## 详细组件分析
+
+### API端点说明
+- 基础路径:/api/xiaoshi/permissionRecord(由 Constants.API_XiaoSHI 定义)
+- 新增/更新许可历史
+  - 方法:POST
+  - 路径:/saveOrUpdate
+  - 输入:PermissionRecordDTO
+  - 输出:Response 包裹 Records(包含新记录ID)
+- 查询许可历史
+  - 方法:POST
+  - 路径:/query
+  - 输入:OtherPatentInfoDTO(至少包含专利号、分页参数)
+  - 输出:Response 包裹 Records(包含总条数、当前页、每页大小、列表)
+- 删除许可历史
+  - 方法:POST
+  - 路径:/delete
+  - 输入:List<Integer>(记录ID列表)
+  - 输出:Response 包裹已删除ID列表
+
+章节来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L29-L53)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L46)
+
+### 数据模型与字段
+- PermissionRecord(实体)
+  - 字段:专利号、许可人、被许可人、被许可人国家、许可时间、许可费用、截止时间、许可类型、租户ID、创建人ID、创建时间
+  - 映射至表 permission_record
+- PermissionRecordDTO(传输)
+  - 字段:id、专利号、许可人、被许可人、被许可人国家、许可时间、许可费用、截止时间、许可类型
+- PermissionRecordVO(视图)
+  - 字段:id、专利号、许可人、被许可人、被许可人国家、许可时间、许可费用、截止时间、许可类型、租户ID、创建人ID、创建人姓名、创建时间
+
+章节来源
+- [PermissionRecord.java](file://src/main/java/cn/cslg/pas/domain/business/PermissionRecord.java#L1-L85)
+- [PermissionRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PermissionRecordDTO.java#L1-L64)
+- [PermissionRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/PermissionRecordVO.java#L1-L82)
+
+### 业务流程与处理逻辑
+- 新增/更新
+  - 若传入ID存在:按ID更新
+  - 若传入ID不存在:复制DTO到实体,从缓存获取登录用户(租户ID、创建人ID),插入数据库并返回ID
+- 查询
+  - 校验专利号非空
+  - 使用分页查询,按创建时间倒序
+  - 加载创建人姓名:收集创建人ID,调用外部权限系统接口批量获取人员信息,回填到VO
+- 删除
+  - 支持批量删除,直接调用基础服务的批量删除
+
+```mermaid
+flowchart TD
+Start(["进入 saveOrUpdate"]) --> CheckId{"是否存在ID?"}
+CheckId --> |是| Load["按ID加载记录"]
+Load --> CopyU["复制DTO到实体并更新"]
+CopyU --> SaveU["updateById"]
+CheckId --> |否| CopyI["复制DTO到实体"]
+CopyI --> FillUser["填充租户ID与创建人ID"]
+FillUser --> Insert["insert"]
+SaveU --> End(["返回ID"])
+Insert --> End
+```
+
+图表来源
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L52-L74)
+
+章节来源
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L52-L156)
+
+### 基于注解的权限控制(@checkAuth)
+- 注解定义:@checkAuth,包含 FunId 参数,用于标识功能ID
+- 切面实现:AuthAop
+  - 在方法执行前后进行拦截
+  - 读取登录用户信息,若账号被禁用则拒绝
+  - 读取方法上的 @checkAuth 与 @Operation 注解
+  - 向外部权限系统查询数据规则(queryDataRule),根据返回值决定放行或拒绝
+  - 若存在限制规则,进一步获取数据源(getDataSource),将规则树转换为JS表达式,使用JS引擎计算布尔结果
+  - 若最终判定无权限,返回统一响应;否则放行
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Aspect as "AuthAop"
+participant PCS as "外部权限系统"
+participant Method as "目标方法"
+Client->>Method : 调用带 @checkAuth 的方法
+Method->>Aspect : 进入环绕通知
+Aspect->>Aspect : 读取登录用户与 @checkAuth.FunId
+Aspect->>PCS : POST /permission/api/data/queryDataRule
+PCS-->>Aspect : 返回规则数组
+alt 无权限
+Aspect-->>Client : 返回无权限响应
+else 允许
+Aspect->>PCS : POST /permission/api/data/getDataSource
+PCS-->>Aspect : 返回数据源
+Aspect->>Aspect : 规则树转JS表达式并求值
+alt 表达式为真
+Aspect->>Method : proceed()
+Method-->>Client : 正常返回
+else 表达式为假
+Aspect-->>Client : 返回无权限响应
+end
+end
+```
+
+图表来源
+- [checkAuth.java](file://src/main/java/cn/cslg/pas/common/auth/checkAuth.java#L1-L18)
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java#L60-L150)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java#L1-L276)
+
+章节来源
+- [checkAuth.java](file://src/main/java/cn/cslg/pas/common/auth/checkAuth.java#L1-L18)
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java#L37-L176)
+
+### 细粒度访问控制与通用鉴权
+- 通用鉴权工具:StpAdminUtil
+  - 提供 hasPermission / checkPermission / hasPermissionAnd / hasPermissionOr 等方法,便于在业务代码中进行权限校验
+- 与注解权限控制的关系
+  - @checkAuth + AuthAop 主要用于“数据规则”的动态判定
+  - StpAdminUtil 更偏向“功能权限”的静态校验(如角色/权限码)
+
+章节来源
+- [StpAdminUtil.java](file://src/main/java/cn/cslg/pas/common/utils/StpAdminUtil.java#L560-L666)
+
+### 场景化配置示例(项目共享、报告查看)
+说明:以下为概念性示例,具体规则需在外部权限系统中配置。实际生效以 AuthAop 从权限系统拉取的规则为准。
+
+- 项目共享
+  - 功能ID:例如“项目分享”
+  - 规则示例:仅项目创建人或项目负责人可添加分享;分享记录删除需具备“删除分享”权限
+  - 实施要点:在外部权限系统中为“项目分享”功能配置数据规则,AuthAop 在方法执行前拉取规则并进行JS表达式求值
+- 报告查看
+  - 功能ID:例如“报告查看”
+  - 规则示例:仅项目成员或项目分享人可查看;若报告为公开模板则不限制
+  - 实施要点:在外部权限系统中配置“报告查看”的数据规则树,AuthAop 将规则转换为JS表达式后执行
+
+[本节为概念说明,不直接分析具体源码文件]
+
+### 权限继承与覆盖规则
+- 继承与覆盖
+  - 外部权限系统返回的规则数组可能包含多条规则,AuthAop 会将其拼接为一个布尔表达式(例如以“||”连接),最终以JS引擎求值
+  - 若返回数组仅包含“0”,表示无需额外限制,直接放行
+  - 若返回数组包含“-1”,表示无权限,直接拒绝
+- 数据规则树
+  - 外部权限系统提供规则树(JSON结构),AuthAop 通过 TreeUtils 将其转换为可执行的JS表达式
+  - 表达式中可引用数据源(如人员、部门、客户等),并结合当前登录用户上下文进行判断
+
+章节来源
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java#L97-L150)
+
+## 依赖关系分析
+- 控制器依赖业务服务
+- 业务服务依赖数据映射与外部权限系统
+- 权限控制依赖注解与切面,同时与外部权限系统交互
+- 常量提供统一API前缀
+
+```mermaid
+graph LR
+Ctrl["PermissionRecordController"] --> Svc["PermissionRecordService"]
+Svc --> Mapper["PermissionRecordMapper"]
+Svc --> Perm["PermissionService"]
+AOP["@checkAuth + AuthAop"] --> Perm
+Ctrl --> Const["Constants(API前缀)"]
+```
+
+图表来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L1-L54)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L1-L157)
+- [PermissionRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/PermissionRecordMapper.java#L1-L22)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java#L1-L276)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L46)
+
+章节来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L1-L54)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L1-L157)
+- [PermissionRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/PermissionRecordMapper.java#L1-L22)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java#L1-L276)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L46)
+
+## 性能与安全考虑
+- 性能
+  - 查询许可记录时,若存在创建人ID列表,会触发一次外部权限系统批量查询,建议控制批量规模
+  - 删除许可记录采用批量删除,注意事务与幂等性
+- 安全
+  - @checkAuth + AuthAop 在方法执行前进行数据规则校验,避免越权访问
+  - 登录用户状态检查:若账号被禁用,直接拒绝
+  - 外部权限系统返回的规则需严格校验,防止恶意构造表达式
+
+[本节为通用指导,不直接分析具体源码文件]
+
+## 故障排查指南
+- 无权限错误
+  - 现象:返回“无权限进行...的操作”
+  - 排查:确认 @checkAuth.FunId 是否正确;检查外部权限系统返回的规则数组
+- 查询异常
+  - 现象:查询报错或返回空
+  - 排查:确认专利号参数是否为空;检查分页参数;确认数据库中是否存在对应记录
+- 删除失败
+  - 现象:删除未生效
+  - 排查:确认传入ID列表是否为空;检查外部权限系统对删除操作的规则
+
+章节来源
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java#L97-L150)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L82-L112)
+
+## 结论
+- 许可历史API提供了完整的新增/更新、查询、删除能力,配合统一的API前缀与标准响应格式
+- 数据模型清晰,业务层在保存时自动注入租户与创建人信息,查询时补充创建人姓名
+- 基于注解的权限控制通过切面与外部权限系统协作,实现了灵活的数据规则校验
+- 在项目共享、报告查看等场景中,可通过外部权限系统配置规则,实现细粒度访问控制
+
+[本节为总结,不直接分析具体源码文件]
+
+## 附录
+
+### API定义清单
+- 新增/更新许可历史
+  - 方法:POST
+  - 路径:/api/xiaoshi/permissionRecord/saveOrUpdate
+  - 请求体:PermissionRecordDTO
+  - 响应体:Response.success(Records.data=id)
+- 查询许可历史
+  - 方法:POST
+  - 路径:/api/xiaoshi/permissionRecord/query
+  - 请求体:OtherPatentInfoDTO(至少包含专利号、分页参数)
+  - 响应体:Response.success(Records)
+- 删除许可历史
+  - 方法:POST
+  - 路径:/api/xiaoshi/permissionRecord/delete
+  - 请求体:List<Integer>(记录ID列表)
+  - 响应体:Response.success(Records.data=已删除ID列表)
+
+章节来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L29-L53)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L46)
+
+### 外部权限系统配置要点
+- 功能ID(FunId):与 @checkAuth 注解绑定
+- 数据规则(queryDataRule):返回数组,-1表示无权限,0表示无需限制,其他为规则树
+- 数据源(getDataSource):用于构建规则表达式时引用的字典数据
+
+章节来源
+- [AuthAop.java](file://src/main/java/cn/cslg/pas/common/auth/AuthAop.java#L83-L150)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java#L1-L276)

+ 431 - 0
.qoder/repowiki/zh/content/API端点参考/系统管理API/系统管理API.md

@@ -0,0 +1,431 @@
+# 系统管理API
+
+<cite>
+**本文引用的文件**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java)
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java)
+- [SystemDict.java](file://src/main/java/cn/cslg/pas/domain/business/SystemDict.java)
+- [SystemDictService.java](file://src/main/java/cn/cslg/pas/service/business/SystemDictService.java)
+- [SystemDictMapper.java](file://src/main/java/cn/cslg/pas/mapper/SystemDictMapper.java)
+- [ConfigDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ConfigDTO.java)
+- [CustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java)
+- [UpdateCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java)
+- [PermissionRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PermissionRecordDTO.java)
+- [PermissionRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/PermissionRecordVO.java)
+- [AllCustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java)
+- [PersonSelfFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/PersonSelfFieldVO.java)
+- [AddSelfFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddSelfFieldDTO.java)
+- [EsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/EsCustomFieldDTO.java)
+- [EsCustomFieldBatchVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/EsCustomFieldBatchVO.java)
+- [EsQueryPatentFieldsDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/EsQueryPatentFieldsDTO.java)
+- [EsPatentFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/EsPatentFieldsVO.java)
+- [QueryEsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/QueryEsCustomFieldDTO.java)
+- [AllFieldOrderDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AllFieldOrderDTO.java)
+- [StringRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringRequest.java)
+- [OtherPatentInfoDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/OtherPatentInfoDTO.java)
+- [QueryFieldsDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryFieldsDTO.java)
+- [QueryFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryFieldsVO.java)
+- [GetTabelColumDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/GetTabelColumDTO.java)
+- [GetAllPatentCountDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/GetAllPatentCountDTO.java)
+- [GetAllPatentCountVO.java](file://src/main/java/cn/cslg/pas/common/vo/GetAllPatentCountVO.java)
+- [AddPatentCountDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/AddPatentCountDTO.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+- [Records.java](file://src/main/java/cn/cslg/pas/common/model/cronModel/Records.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向系统管理员与开发人员,系统性梳理“系统管理”相关API,覆盖以下三大模块:
+- 自定义字段管理:提供自定义字段的创建、更新、删除、排序、批量标引、按专利批量查询字段值等能力。
+- 权限记录管理:提供许可历史的新增/更新、查询与删除能力,支持按专利号分页查询与人员信息装载。
+- 个人字段配置:提供检索字段、表格列、导出列、统计列的获取与设置,支持证据与理由相关表格列的个性化配置。
+
+同时,文档补充了系统字典(SystemDict)与配置管理(ConfigDTO)的相关使用说明,并给出实际配置更新示例路径,帮助快速落地。
+
+## 项目结构
+系统管理API位于后端控制器层,统一通过常量前缀拼接形成REST路径;控制器通过业务工厂模式调用具体业务服务,业务服务再与持久层交互,最终返回统一响应封装。
+
+```mermaid
+graph TB
+subgraph "控制器层"
+CF["CustomFieldController"]
+PR["PermissionRecordController"]
+PF["PersonFieldController"]
+end
+subgraph "业务层"
+BF["BusinessFactory"]
+CFS["CustomFieldService"]
+PRS["PermissionRecordService"]
+PFS["PersonFieldService"]
+end
+subgraph "数据访问层"
+CFD["CustomFieldMapper"]
+PRM["PermissionRecordMapper"]
+SDM["SystemDictMapper"]
+end
+subgraph "领域模型与DTO/VO"
+SD["SystemDict"]
+CFG["ConfigDTO"]
+PRDTO["PermissionRecordDTO"]
+PRVO["PermissionRecordVO"]
+ACF["AllCustomFieldVO"]
+PSF["PersonSelfFieldVO"]
+end
+CF --> BF
+PR --> BF
+PF --> BF
+BF --> CFS
+BF --> PRS
+BF --> PFS
+CFS --> CFD
+PRS --> PRM
+PFS --> SDM
+PRS --> PRDTO
+PRS --> PRVO
+CFS --> ACF
+PFS --> PSF
+PFS --> CFG
+```
+
+图表来源
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L1-L179)
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L1-L54)
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L1-L135)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java#L1-L18)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java#L28-L142)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L27-L156)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L306-L332)
+
+章节来源
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L46)
+
+## 核心组件
+- 控制器层:分别暴露三组REST端点,均以“/api/xiaoshi/{module}”为前缀。
+- 业务工厂:通过名称映射获取对应业务Bean,解耦控制器与具体服务实现。
+- 业务服务层:封装业务逻辑,处理参数校验、分页、人员信息装载等。
+- 数据访问层:MyBatis-Plus Mapper负责数据库交互。
+- 领域模型与DTO/VO:承载请求/响应数据结构,保证前后端契约清晰。
+
+章节来源
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L1-L179)
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L1-L54)
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L1-L135)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java#L1-L18)
+
+## 架构总览
+系统管理API采用“控制器-业务工厂-业务服务-持久层”的分层架构,控制器仅负责路由与参数透传,业务工厂根据字符串键选择具体业务Bean,业务服务完成数据转换、校验与调用Mapper,最终统一返回Response封装的数据载体。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Ctrl as "控制器"
+participant Fac as "业务工厂"
+participant Svc as "业务服务"
+participant Mapper as "Mapper"
+participant DB as "数据库"
+Client->>Ctrl : "HTTP 请求"
+Ctrl->>Fac : "getClass(业务键)"
+Fac-->>Ctrl : "返回业务Bean"
+Ctrl->>Svc : "调用业务方法(参数)"
+Svc->>Mapper : "持久化/查询"
+Mapper->>DB : "SQL执行"
+DB-->>Mapper : "结果集"
+Mapper-->>Svc : "实体/列表"
+Svc-->>Ctrl : "业务结果"
+Ctrl-->>Client : "Response 封装"
+```
+
+图表来源
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L50-L77)
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L29-L52)
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L48-L109)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java#L1-L18)
+
+## 详细组件分析
+
+### 自定义字段管理 API
+- 基础路径:/api/xiaoshi/customField
+- 关键端点
+  - POST /api/xiaoshi/customField/queryCustomField
+    - 功能:查询自定义字段(内部通过业务工厂调用业务服务)
+    - 请求体:StringRequest
+    - 返回:Response.success(Records)
+  - POST /api/xiaoshi/customField/addCustomField
+    - 功能:新增自定义字段
+    - 请求体:CustomFieldDTO
+    - 返回:Response.success(新增ID)
+    - 异常:参数为空或业务异常时返回错误码
+  - POST /api/xiaoshi/customField/updateCustomField
+    - 功能:更新自定义字段
+    - 请求体:UpdateCustomFieldDTO
+    - 返回:Response.success(更新ID)
+    - 异常:参数为空或业务异常时返回错误码
+  - POST /api/xiaoshi/customField/deleteCustomField
+    - 功能:删除自定义字段(支持批量)
+    - 请求体:List<Integer>(ids)
+    - 返回:Response.success("删除成功")
+  - GET /api/xiaoshi/customField/getAllPatentCustomField
+    - 功能:查询专题库/任务下的所有自定义字段
+    - 查询参数:projectId 或 taskId(二选一)
+    - 返回:Response.success(Records<List<AllCustomFieldVO>>)
+  - POST /api/xiaoshi/customField/getCustomFieldValues
+    - 功能:查询某自定义字段的取值集合
+    - 请求体:QueryEsCustomFieldDTO
+    - 返回:Response.success(Records)
+  - POST /api/xiaoshi/customField/addAllPatentCustomFieldOrder
+    - 功能:保存自定义字段顺序
+    - 请求体:AllFieldOrderDTO
+    - 返回:Response.success(Records)
+  - POST /api/xiaoshi/customField/addCustomFieldValue
+    - 功能:添加单个标引
+    - 请求体:EsCustomFieldDTO
+    - 返回:Response.success(Records<String>)
+  - POST /api/xiaoshi/customField/batchAddCustomField
+    - 功能:批量添加标引
+    - 请求体:EsCustomFieldBatchVO
+    - 返回:Response.success(Records<List<String>>)
+  - POST /api/xiaoshi/customField/getPatentFields
+    - 功能:批量获取专利的自定义字段及值
+    - 请求体:EsQueryPatentFieldsDTO
+    - 返回:Response.success(Records<List<EsPatentFieldsVO>>)
+
+- 处理流程(新增/更新/删除)
+  - 控制器接收请求后,通过业务工厂获取对应业务Bean
+  - 业务Bean执行addMessage/updateMessage/deleteMessage等方法
+  - 业务服务进行参数校验、异常捕获与数据转换
+  - 最终统一返回Response.success或错误响应
+
+- 应用场景
+  - 在专题库或任务中动态扩展字段类型(文本、数字、日期、树、选项等),并通过排序与批量标引提升检索与展示效率。
+
+章节来源
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L50-L178)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java#L99-L142)
+- [AllCustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java#L1-L34)
+- [EsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/EsCustomFieldDTO.java)
+- [EsCustomFieldBatchVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/EsCustomFieldBatchVO.java)
+- [EsQueryPatentFieldsDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/EsQueryPatentFieldsDTO.java)
+- [EsPatentFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/es/EsPatentFieldsVO.java)
+- [QueryEsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/QueryEsCustomFieldDTO.java)
+- [AllFieldOrderDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AllFieldOrderDTO.java)
+- [StringRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringRequest.java)
+
+### 权限记录查询 API
+- 基础路径:/api/xiaoshi/permissionRecord
+- 关键端点
+  - POST /api/xiaoshi/permissionRecord/saveOrUpdate
+    - 功能:新增或更新许可历史
+    - 请求体:PermissionRecordDTO
+    - 返回:Response.success(Records<Integer>),包含新增/更新后的ID
+  - POST /api/xiaoshi/permissionRecord/query
+    - 功能:按专利号分页查询许可历史
+    - 请求体:OtherPatentInfoDTO(需包含专利号)
+    - 返回:Response.success(Records<List<PermissionRecordVO>>)
+  - POST /api/xiaoshi/permissionRecord/delete
+    - 功能:删除许可历史(支持批量)
+    - 请求体:List<Integer>(ids)
+    - 返回:Response.success(Records<List<Integer>>)
+
+- 处理流程(查询)
+  - 控制器接收请求后,调用业务服务
+  - 业务服务根据专利号分页查询,装载创建人姓名等信息
+  - 返回统一响应封装
+
+- 审计要点
+  - 支持按专利号过滤,按创建时间倒序排列
+  - 通过外部服务加载创建人信息,增强可读性
+
+章节来源
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L29-L52)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L27-L156)
+- [PermissionRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PermissionRecordDTO.java#L1-L63)
+- [PermissionRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/PermissionRecordVO.java#L1-L81)
+- [OtherPatentInfoDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/OtherPatentInfoDTO.java)
+
+### 个人字段配置 API
+- 基础路径:/api/xiaoshi/personField
+- 关键端点
+  - POST /api/xiaoshi/personField/getQueryFields
+    - 功能:获取检索栏位
+    - 请求体:List<QueryFieldsDTO>
+    - 返回:Response.success(Records<List<QueryFieldsVO>>)
+  - POST /api/xiaoshi/personField/getTableColumns
+    - 功能:获取表格显示栏位
+    - 请求体:GetTabelColumDTO
+    - 返回:Response.success(Records<List<PersonSelfFieldVO>>)
+  - POST /api/xiaoshi/personField/getTableExportColumns
+    - 功能:获取表格导出栏位
+    - 请求体:GetTabelColumDTO
+    - 返回:Response.success(Records<List<PersonSelfFieldVO>>)
+  - POST /api/xiaoshi/personField/getAllCountColumns
+    - 功能:获取所有统计栏位
+    - 请求体:GetAllPatentCountDTO
+    - 返回:Response.success(Records<List<GetAllPatentCountVO>>)
+  - POST /api/xiaoshi/personField/setTableColumns
+    - 功能:设置表格显示栏位
+    - 请求体:AddSelfFieldDTO
+    - 返回:Response.success(Records<List<PersonSelfFieldVO>>)
+  - POST /api/xiaoshi/personField/setShowCountColumns
+    - 功能:设置显示的统计栏位
+    - 请求体:AddPatentCountDTO
+    - 返回:Response.success(Records<List<GetAllPatentCountVO>>)
+  - POST /api/xiaoshi/personField/getShowCountColumns
+    - 功能:获取显示的统计栏位
+    - 请求体:GetAllPatentCountDTO
+    - 返回:Response.success(Records<List<GetAllPatentCountVO>>)
+  - POST /api/xiaoshi/personField/getEvidenceReasonTableColumns
+    - 功能:获取无效理由和证据表格显示栏位
+    - 请求体:GetTabelColumDTO
+    - 返回:Response.success(Records<List<PersonSelfFieldVO>>)
+  - POST /api/xiaoshi/personField/setEvidenceReasonTableColumns
+    - 功能:设置无效理由和证据表格显示栏位
+    - 请求体:AddSelfFieldDTO
+    - 返回:Response.success(Records<List<PersonSelfFieldVO>>)
+
+- 处理流程(设置表格列)
+  - 控制器接收请求后,调用业务服务
+  - 业务服务根据用户登录信息与表名等参数,写入或更新个人字段配置
+  - 返回统一响应封装
+
+章节来源
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L48-L134)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L306-L332)
+- [PersonSelfFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/PersonSelfFieldVO.java#L1-L41)
+- [AddSelfFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddSelfFieldDTO.java#L1-L18)
+- [GetTabelColumDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/GetTabelColumDTO.java)
+- [GetAllPatentCountDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/GetAllPatentCountDTO.java)
+- [GetAllPatentCountVO.java](file://src/main/java/cn/cslg/pas/common/vo/GetAllPatentCountVO.java)
+- [AddPatentCountDTO.java](file://src/main/java/cn/cslg/pas/common/dto/patentCount/AddPatentCountDTO.java)
+- [QueryFieldsDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryFieldsDTO.java)
+- [QueryFieldsVO.java](file://src/main/java/cn/cslg/pas/common/vo/QueryFieldsVO.java)
+
+### 配置管理与系统字典 API
+- 配置管理(ConfigDTO)
+  - 字段:loginAccount、loginPassword、tenantId、webId
+  - 使用场景:用于系统登录配置的参数传递,便于后续服务层进行配置更新或校验
+  - 示例参考:[ConfigDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ConfigDTO.java#L1-L17)
+
+- 系统字典(SystemDict)
+  - 字段:label、value、type、groupType、simpleLabel、remark
+  - 用途:维护系统级枚举/字典项,如国家、法律状态、许可类型等
+  - 服务方法:
+    - 按类型列表获取字典项 Map<String, List<SystemDict>>
+    - 按类型与值获取标签值
+    - 按类型获取场景顺序ID列表
+  - 示例参考:
+    - [SystemDict.java](file://src/main/java/cn/cslg/pas/domain/business/SystemDict.java#L1-L54)
+    - [SystemDictService.java](file://src/main/java/cn/cslg/pas/service/business/SystemDictService.java#L1-L68)
+    - [SystemDictMapper.java](file://src/main/java/cn/cslg/pas/mapper/SystemDictMapper.java#L1-L19)
+
+- 实际配置更新示例
+  - 登录配置更新:通过服务层接收ConfigDTO,进行参数校验与持久化,返回统一响应
+  - 示例路径参考:
+    - [ConfigDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ConfigDTO.java#L1-L17)
+    - [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+章节来源
+- [ConfigDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ConfigDTO.java#L1-L17)
+- [SystemDict.java](file://src/main/java/cn/cslg/pas/domain/business/SystemDict.java#L1-L54)
+- [SystemDictService.java](file://src/main/java/cn/cslg/pas/service/business/SystemDictService.java#L1-L68)
+- [SystemDictMapper.java](file://src/main/java/cn/cslg/pas/mapper/SystemDictMapper.java#L1-L19)
+
+## 依赖关系分析
+- 控制器与业务工厂
+  - 控制器通过业务工厂按名称获取业务Bean,避免直接依赖具体实现类,降低耦合度
+- 控制器与业务服务
+  - 控制器仅负责参数接收与响应封装,业务逻辑集中在服务层
+- 业务服务与Mapper
+  - 业务服务通过Mapper执行数据库操作,支持分页、条件查询与数据装载
+- 统一响应封装
+  - 所有控制器返回统一的Response封装,包含状态码、消息与数据载体Records
+
+```mermaid
+classDiagram
+class CustomFieldController
+class PermissionRecordController
+class PersonFieldController
+class BusinessFactory
+class CustomFieldService
+class PermissionRecordService
+class PersonFieldService
+class Response
+class Records
+CustomFieldController --> BusinessFactory : "获取业务Bean"
+PermissionRecordController --> BusinessFactory : "获取业务Bean"
+PersonFieldController --> BusinessFactory : "获取业务Bean"
+BusinessFactory --> CustomFieldService : "按名称映射"
+BusinessFactory --> PermissionRecordService : "按名称映射"
+BusinessFactory --> PersonFieldService : "按名称映射"
+CustomFieldController --> Response : "返回统一响应"
+PermissionRecordController --> Response : "返回统一响应"
+PersonFieldController --> Response : "返回统一响应"
+Response --> Records : "封装数据"
+```
+
+图表来源
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L50-L178)
+- [PermissionRecordController.java](file://src/main/java/cn/cslg/pas/controller/PermissionRecordController.java#L29-L52)
+- [PersonFieldController.java](file://src/main/java/cn/cslg/pas/controller/PersonFieldController.java#L48-L134)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java#L1-L18)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+- [Records.java](file://src/main/java/cn/cslg/pas/common/model/cronModel/Records.java)
+
+## 性能考量
+- 批量操作
+  - 自定义字段批量标引与批量删除可显著减少网络往返次数,建议优先使用批量接口
+- 分页查询
+  - 权限记录查询支持分页,建议前端传入合理的页码与大小,避免一次性加载过多数据
+- 缓存与装载
+  - 业务服务在装载人员信息时可能涉及外部服务调用,建议结合缓存策略优化性能
+- 字典查询
+  - 系统字典按类型批量查询,建议前端按需请求,减少冗余数据传输
+
+## 故障排查指南
+- 参数为空或格式错误
+  - 控制器与业务服务对空参数进行显式校验,返回相应错误码
+  - 参考路径:
+    - [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L64-L97)
+    - [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L27-L69)
+- 未登录或权限不足
+  - 控制器捕获未登录异常并返回统一未登录响应
+  - 参考路径:
+    - [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L64-L97)
+- 数据库异常
+  - 删除自定义字段时可能抛出IO异常,控制器捕获并返回错误信息
+  - 参考路径:
+    - [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L100-L110)
+- 统一响应
+  - 所有接口返回统一的Response封装,便于前端统一处理
+  - 参考路径:
+    - [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+章节来源
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java#L64-L110)
+- [PermissionRecordService.java](file://src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java#L27-L69)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+## 结论
+本文件系统性梳理了系统管理相关的三大API模块,明确了各端点的功能、请求/响应结构与典型使用场景。通过业务工厂模式与统一响应封装,系统具备良好的可扩展性与一致性。配合系统字典与配置管理,可进一步完善系统的配置与枚举治理。
+
+## 附录
+- 常量前缀
+  - API前缀:/api/xiaoshi
+  - 参考路径:
+    - [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L46)

+ 374 - 0
.qoder/repowiki/zh/content/API端点参考/系统管理API/自定义字段API.md

@@ -0,0 +1,374 @@
+# 自定义字段API
+
+<cite>
+**本文档引用的文件**   
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java)
+- [UpdateCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [CustomField.java](file://src/main/java/cn/cslg/pas/domain/business/CustomField.java)
+- [CustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/CustomFieldVO.java)
+- [AllCustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java)
+- [QueryEsCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/es/QueryEsCustomFieldDTO.java)
+- [customField.json](file://src/main/resources/jsons/customField.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+自定义字段API为系统提供了灵活的字段管理功能,允许用户在专利项目、产品管理等场景中创建和管理自定义字段。该API支持多种字段类型,包括文本、数字、日期、选择项和树形结构,满足不同业务场景的需求。通过该API,用户可以创建、更新、查询和删除自定义字段,并支持批量导入导出字段配置。
+
+## 项目结构
+自定义字段功能的代码分布在多个包中,主要包括controller、service、domain、dto和vo等层次。controller层负责处理HTTP请求,service层实现业务逻辑,domain层定义数据模型,dto和vo层用于数据传输和视图展示。
+
+```mermaid
+graph TB
+subgraph "Controller"
+CustomFieldController[CustomFieldController]
+end
+subgraph "Service"
+CustomFieldService[CustomFieldService]
+end
+subgraph "Domain"
+CustomField[CustomField]
+end
+subgraph "DTO"
+CustomFieldDTO[CustomFieldDTO]
+UpdateCustomFieldDTO[UpdateCustomFieldDTO]
+end
+subgraph "VO"
+CustomFieldVO[CustomFieldVO]
+AllCustomFieldVO[AllCustomFieldVO]
+end
+CustomFieldController --> CustomFieldService
+CustomFieldService --> CustomField
+CustomFieldController --> CustomFieldDTO
+CustomFieldController --> UpdateCustomFieldDTO
+CustomFieldService --> CustomFieldVO
+CustomFieldService --> AllCustomFieldVO
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [CustomField.java](file://src/main/java/cn/cslg/pas/domain/business/CustomField.java)
+- [CustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java)
+- [UpdateCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java)
+- [CustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/CustomFieldVO.java)
+- [AllCustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java)
+**Section sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [CustomField.java](file://src/main/java/cn/cslg/pas/domain/business/CustomField.java)
+- [CustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java)
+- [UpdateCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java)
+- [CustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/CustomFieldVO.java)
+- [AllCustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java)
+## 核心组件
+自定义字段API的核心组件包括CustomFieldController、CustomFieldService、CustomField实体类以及相关的DTO和VO类。CustomFieldController处理所有与自定义字段相关的HTTP请求,CustomFieldService实现具体的业务逻辑,CustomField实体类定义了数据库表结构,DTO和VO类用于在不同层次之间传输数据。
+**Section sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [CustomField.java](file://src/main/java/cn/cslg/pas/domain/business/CustomField.java)
+- [CustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java)
+- [UpdateCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java)
+- [CustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/CustomFieldVO.java)
+- [AllCustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java)
+## 架构概述
+自定义字段API采用典型的分层架构,包括Controller层、Service层和Domain层。Controller层负责接收和响应HTTP请求,Service层处理业务逻辑,Domain层与数据库交互。这种分层架构使得代码结构清晰,便于维护和扩展。
+```mermaid
+graph TD
+    Client[客户端] --> Controller[CustomFieldController]
+    Controller --> Service[CustomFieldService]
+    Service --> Mapper[CustomFieldMapper]
+    Mapper --> Database[(数据库)]
+
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [CustomFieldMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomFieldMapper.java)
+
+## 详细组件分析
+
+### CustomFieldController分析
+CustomFieldController是自定义字段API的入口,负责处理所有与自定义字段相关的HTTP请求。它提供了创建、更新、查询和删除自定义字段的端点。
+
+#### API端点
+```mermaid
+flowchart TD
+A["POST /customField/addCustomField<br/>创建自定义字段"] --> B["POST /customField/updateCustomField<br/>更新字段配置"]
+B --> C["POST /customField/queryCustomField<br/>查询字段列表"]
+C --> D["POST /customField/deleteCustomField<br/>删除字段"]
+D --> E["GET /customField/getAllPatentCustomField<br/>获取所有字段"]
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+#### 端点流程
+```mermaid
+sequenceDiagram
+    participant Client as "客户端"
+    participant Controller as "CustomFieldController"
+    participant Service as "CustomFieldService"
+    
+    Client->>Controller: POST /customField/addCustomField
+    Controller->>Service: addMessage(customFieldDTO)
+    Service-->>Controller: 返回字段ID
+    Controller-->>Client: 返回成功响应
+    
+    Client->>Controller: POST /customField/updateCustomField
+    Controller->>Service: updateMessage(updateCustomFieldDTO)
+    Service-->>Controller: 返回字段ID
+    Controller-->>Client: 返回成功响应
+    
+    Client->>Controller: POST /customField/queryCustomField
+    Controller->>Service: queryMessage(queryRequest)
+    Service-->>Controller: 返回字段列表
+    Controller-->>Client: 返回字段列表
+
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+
+**Section sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+
+### CustomFieldDTO和CustomFieldVO分析
+CustomFieldDTO和CustomFieldVO是自定义字段的数据传输对象,用于在不同层次之间传递数据。
+
+#### 数据结构
+```mermaid
+classDiagram
+class CustomFieldDTO {
++String name
++Integer projectId
++Integer type
++String description
++Boolean status
++String personId
+}
+class UpdateCustomFieldDTO {
++Integer id
++String name
++Integer projectId
++Integer type
++String description
++Boolean status
+}
+class CustomFieldVO {
++Integer id
++String name
++Integer projectId
++Integer type
++String description
++Boolean status
++String createId
++String createName
++Date createTime
+}
+class AllCustomFieldVO {
++Integer id
++String name
++Integer type
++Integer sysOrder
++Boolean ifPersonal
+}
+CustomFieldDTO <|-- UpdateCustomFieldDTO
+**Diagram sources**
+- [CustomFieldDTO.java](file : //src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java)
+- [UpdateCustomFieldDTO.java](file : //src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java)
+- [CustomFieldVO.java](file : //src/main/java/cn/cslg/pas/common/vo/business/CustomFieldVO.java)
+- [AllCustomFieldVO.java](file : //src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java)
+#### 字段类型和验证规则
+```mermaid
+erDiagram
+    CUSTOM_FIELD ||--o{ CUSTOM_OPTION : "选项字段"
+    CUSTOM_FIELD ||--o{ TREE_NODE : "树形字段"
+    
+    CUSTOM_FIELD {
+        integer id PK
+        string name
+        integer projectId FK
+        integer type
+        boolean status
+        string description
+        string createId FK
+        datetime createTime
+    }
+    
+    CUSTOM_OPTION {
+        integer id PK
+        integer customFieldId FK
+        string name
+    }
+    
+    TREE_NODE {
+        integer id PK
+        integer typeId FK
+        integer type
+        string name
+        string path
+        integer level
+        integer parentId
+    }
+
+**Diagram sources**
+- [CustomField.java](file://src/main/java/cn/cslg/pas/domain/business/CustomField.java)
+- [CustomOption.java](file://src/main/java/cn/cslg/pas/domain/business/CustomOption.java)
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java)
+
+**Section sources**
+- [CustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java)
+- [UpdateCustomFieldDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java)
+- [CustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/CustomFieldVO.java)
+- [AllCustomFieldVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java)
+
+### 应用场景分析
+自定义字段API在专利项目和产品管理等场景中有广泛的应用。
+
+#### 专利项目场景
+```mermaid
+flowchart TD
+A[创建专利项目] --> B[添加自定义字段]
+B --> C[配置字段类型]
+C --> D[设置验证规则]
+D --> E[应用字段到专利]
+E --> F[查询和分析数据]
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+#### 产品管理场景
+```mermaid
+flowchart TD
+    A[创建产品] --> B[添加自定义字段]
+    B --> C[配置字段类型]
+    C --> D[设置验证规则]
+    D --> E[应用字段到产品]
+    E --> F[查询和分析数据]
+
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+
+**Section sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+
+### 字段值存储和查询机制
+自定义字段的值存储和查询机制设计合理,支持高效的查询和分析。
+
+#### 存储机制
+```mermaid
+graph TD
+A[自定义字段] --> B[字段配置]
+A --> C[字段值]
+B --> D[数据库表custom_field]
+C --> E[数据库表custom_field_value]
+C --> F[Elasticsearch索引]
+**Diagram sources**
+- [CustomField.java](file://src/main/java/cn/cslg/pas/domain/business/CustomField.java)
+- [CustomFieldValue.java](file://src/main/java/cn/cslg/pas/domain/business/CustomFieldValue.java)
+- [EsCustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java)
+#### 查询机制
+```mermaid
+sequenceDiagram
+    participant Client as "客户端"
+    participant Controller as "CustomFieldController"
+    participant Service as "CustomFieldService"
+    participant ES as "Elasticsearch"
+    
+    Client->>Controller: POST /customField/getCustomFieldValues
+    Controller->>Service: getCustomFieldValues(queryEsCustomFieldDTO)
+    Service->>ES: 查询字段值
+    ES-->>Service: 返回字段值
+    Service-->>Controller: 返回字段值
+    Controller-->>Client: 返回字段值
+
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [EsCustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java)
+
+**Section sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [EsCustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java)
+
+### 批量导入导出分析
+自定义字段支持批量导入导出配置,便于数据迁移和备份。
+
+#### 批量导入导出流程
+```mermaid
+flowchart TD
+A[导出配置] --> B[生成JSON文件]
+B --> C[传输文件]
+C --> D[导入配置]
+D --> E[解析JSON文件]
+E --> F[创建字段]
+F --> G[应用配置]
+**Diagram sources**
+- [ExportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java)
+- [ImportFromFileToEsService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ImportFromFileToEsService.java)
+**Section sources**
+- [ExportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java)
+- [ImportFromFileToEsService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ImportFromFileToEsService.java)
+## 依赖分析
+自定义字段API依赖于多个服务和组件,包括业务工厂、缓存工具、登录工具、格式化查询服务等。
+```mermaid
+graph TD
+    CustomFieldController --> BusinessFactory
+    CustomFieldController --> CustomFieldService
+    CustomFieldController --> EsCustomFieldService
+    CustomFieldService --> CacheUtils
+    CustomFieldService --> LoginUtils
+    CustomFieldService --> FormatQueryService
+    CustomFieldService --> CustomFieldMapper
+    CustomFieldService --> PermissionService
+    CustomFieldService --> AssoProjectTreeNodeService
+    CustomFieldService --> ProductCategoryService
+    CustomFieldService --> ProductService
+    CustomFieldService --> EsCustomFieldService
+    CustomFieldService --> CustomOptionService
+    CustomFieldService --> TreeNodeService
+    CustomFieldService --> AssoTaskFieldService
+    CustomFieldService --> EsService
+
+**Diagram sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+
+**Section sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+
+## 性能考虑
+自定义字段API在设计时考虑了性能因素,通过缓存、批量操作和索引优化等手段提高性能。
+
+- 使用缓存存储常用数据,减少数据库查询
+- 支持批量操作,减少网络开销
+- 使用Elasticsearch索引提高查询性能
+- 合理设计数据库表结构和索引
+
+**Section sources**
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+- [EsCustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java)
+
+## 故障排除指南
+在使用自定义字段API时,可能会遇到一些常见问题,以下是一些故障排除建议:
+
+- **创建字段失败**:检查字段名称是否重复,项目ID是否有效
+- **更新字段失败**:检查字段ID是否存在,字段名称是否规范
+- **查询字段失败**:检查查询参数是否正确,项目ID是否有效
+- **删除字段失败**:检查字段ID是否有效,是否有权限删除
+
+**Section sources**
+- [CustomFieldController.java](file://src/main/java/cn/cslg/pas/controller/CustomFieldController.java)
+- [CustomFieldService.java](file://src/main/java/cn/cslg/pas/service/business/CustomFieldService.java)
+
+## 结论
+自定义字段API为系统提供了灵活的字段管理功能,支持多种字段类型和应用场景。通过合理的架构设计和性能优化,该API能够满足复杂的业务需求。在使用过程中,应注意遵循API规范,合理配置字段,以充分发挥其功能。

+ 482 - 0
.qoder/repowiki/zh/content/API端点参考/项目管理API/专利项目API.md

@@ -0,0 +1,482 @@
+# 专利项目API
+
+<cite>
+**本文档引用的文件**  
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java)
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java)
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java)
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java)
+- [UpdatePatentProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdatePatentProjectDTO.java)
+- [PatentProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PatentProjectDTO.java)
+- [PatentProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/PatentProjectVO.java)
+- [PatentStatusMonitorVO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorVO.java)
+- [PatentStatusMonitorQueryDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorQueryDTO.java)
+- [PatentStatusMonitorAddDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorAddDTO.java)
+- [StringRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringRequest.java)
+- [StringGroupRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringGroupRequest.java)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+</cite>
+
+## 目录
+1. [专利项目核心API](#专利项目核心api)
+2. [项目状态监控API](#项目状态监控api)
+3. [项目共享API](#项目共享api)
+4. [项目导入API](#项目导入api)
+5. [请求参数与响应结构](#请求参数与响应结构)
+6. [API使用示例](#api使用示例)
+7. [项目与专利关联管理](#项目与专利关联管理)
+
+## 专利项目核心API
+
+专利项目管理功能通过`PatentProjectController`提供核心的CRUD操作,支持项目的创建、更新、查询和删除。所有API端点均位于`/api/patentProject`路径下,使用POST方法进行操作。
+
+### 项目创建 (POST /patentProject/addPatentProject)
+
+用于创建新的专利项目。接收`PatentProjectDTO`对象作为请求体,包含项目的基本信息、委托方信息、负责人信息等。
+
+**请求参数**:
+- `name`: 项目名称
+- `entrustId`: 委托方ID
+- `headId`: 负责人ID
+- `departmentId`: 负责部门ID
+- `commissionCaseDay`: 委案日
+- `description`: 项目描述
+- `scenarioIds`: 应用场景ID列表
+- `matterIds`: 处理事项ID列表
+
+**响应**:
+成功时返回新创建项目的ID。
+
+**Section sources**
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java#L63-L84)
+- [PatentProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PatentProjectDTO.java#L1-L59)
+
+### 项目更新 (POST /patentProject/updatePatentProject)
+
+用于更新现有专利项目的信息。接收`UpdatePatentProjectDTO`对象作为请求体,包含需要更新的字段。
+
+**请求参数**:
+- `id`: 项目ID(必需)
+- 其他字段与创建时相同,仅更新提供的字段
+
+**响应**:
+成功时返回更新后的项目ID。
+
+**Section sources**
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java#L87-L106)
+- [UpdatePatentProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdatePatentProjectDTO.java#L1-L59)
+
+### 项目查询 (POST /patentProject/queryPatentProject)
+
+用于查询专利项目列表。接收`StringRequest`对象作为请求体,支持分页和条件查询。
+
+**请求参数**:
+- `searchQuery`: 搜索查询条件
+- `current`: 当前页码
+- `size`: 每页大小
+
+**响应**:
+返回`Records`对象,包含分页信息和`PatentProjectVO`对象列表。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "PatentProjectController"
+participant Business as "BusinessFactory"
+participant Service as "PatentProjectService"
+participant Mapper as "PatentProjectMapper"
+Client->>Controller : POST /patentProject/queryPatentProject
+Controller->>Business : getClass("patentProjectService")
+Business-->>Controller : 返回服务实例
+Controller->>Service : queryMessage(stringRequest)
+Service->>Service : reSqls(queryRequest)
+Service->>Mapper : getPatentProject(sql)
+Mapper-->>Service : 返回项目列表
+Service->>Service : loadPatentProject()
+Service-->>Controller : 返回Records
+Controller-->>Client : 返回响应
+```
+
+**Diagram sources**
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java#L54-L60)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java#L119-L134)
+- [StringRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringRequest.java#L1-L11)
+
+**Section sources**
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java#L54-L60)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java#L119-L134)
+
+### 项目删除 (POST /patentProject/deletePatentProject)
+
+用于删除一个或多个专利项目。接收项目ID列表作为请求体。
+
+**请求参数**:
+- `ids`: 要删除的项目ID列表
+
+**响应**:
+成功时返回"删除成功"消息。删除前会检查是否存在关联报告,如有则阻止删除。
+
+**Section sources**
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java#L108-L118)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java#L158-L197)
+
+## 项目状态监控API
+
+项目状态监控功能通过`PatentStatusMonitorController`提供,用于监控专利状态的变化并设置通知周期。
+
+### 添加监控任务 (POST /patentStatusMonitor/add)
+
+创建新的专利状态监控任务。
+
+**请求参数**:
+- `projectId`: 关联的项目ID
+- `stringRequest`: 查询条件
+- `startNumber`: 起始编号
+- `endNumber`: 结束编号
+- `notifyCycle`: 通知周期
+
+**响应**:
+成功时返回新创建任务的ID。
+
+**Section sources**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L30-L37)
+- [PatentStatusMonitorAddDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorAddDTO.java#L1-L26)
+
+### 查询监控任务 (POST /patentStatusMonitor/query)
+
+查询现有的专利状态监控任务。
+
+**请求参数**:
+- `projectId`: 项目ID(可选)
+- `status`: 任务状态(可选)
+
+**响应**:
+返回`PatentStatusMonitorVO`对象列表。
+
+```mermaid
+classDiagram
+class PatentStatusMonitorVO {
++Integer projectId
++String searchQuery
++Long startNumber
++Long endNumber
++String[] isDelete
++String[] isAdd
++String notifyCycle
++Integer[] targetSss
++Integer status
++Integer type
+}
+class PatentStatusMonitorQueryDTO {
++Integer projectId
++Integer status
+}
+class PatentStatusMonitorAddDTO {
++Integer projectId
++StringRequest stringRequest
++String[] isDelete
++String[] isAdd
++Long startNumber
++Long endNumber
++String notifyCycle
++Integer[] targetSSs
+}
+PatentStatusMonitorVO <|-- PatentStatusMonitorQueryDTO : "查询条件"
+PatentStatusMonitorVO <|-- PatentStatusMonitorAddDTO : "创建参数"
+```
+
+**Diagram sources**
+- [PatentStatusMonitorVO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorVO.java#L1-L30)
+- [PatentStatusMonitorQueryDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorQueryDTO.java#L1-L15)
+- [PatentStatusMonitorAddDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorAddDTO.java#L1-L26)
+
+**Section sources**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L39-L44)
+
+### 更新监控任务 (POST /patentStatusMonitor/update)
+
+更新现有的专利状态监控任务。
+
+**请求参数**:
+- `id`: 任务ID
+- 其他可更新字段
+
+**响应**:
+成功时返回更新后的任务ID。
+
+**Section sources**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L45-L50)
+
+### 删除监控任务 (POST /patentStatusMonitor/delete)
+
+删除一个或多个专利状态监控任务。
+
+**请求参数**:
+- `ids`: 要删除的任务ID列表
+
+**响应**:
+成功时返回被删除的任务ID列表。
+
+**Section sources**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L51-L57)
+
+## 项目共享API
+
+项目共享功能通过`ProjectShareController`提供,用于管理项目在团队成员之间的共享。
+
+### 新增项目分享 (POST /patentShare/addProjectShare)
+
+将项目分享给其他用户或团队。
+
+**请求参数**:
+- `projectId`: 项目ID
+- `personIds`: 被分享人员ID列表
+- `permissions`: 权限列表
+
+**响应**:
+成功时返回新创建的分享记录ID列表。
+
+**Section sources**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L45-L61)
+
+### 删除分享记录 (POST /patentShare/removeProjectShare)
+
+移除项目的分享记录。
+
+**请求参数**:
+- `ids`: 要删除的分享记录ID列表
+
+**响应**:
+成功时返回被删除的记录ID列表。
+
+**Section sources**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L63-L76)
+
+### 查询分享记录 (POST /patentShare/queryProjectShare)
+
+查询项目的分享记录。
+
+**请求参数**:
+- `projectId`: 项目ID
+- `personId`: 人员ID(可选)
+
+**响应**:
+返回分享记录列表,包含被分享人员和权限信息。
+
+**Section sources**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L78-L91)
+
+### 查询人员权限 (POST /patentShare/getProjectPermissions)
+
+查询特定人员在多个项目中的权限。
+
+**请求参数**:
+- `projectIds`: 项目ID列表
+
+**响应**:
+返回Map结构,键为项目ID,值为该人员在该项目中的权限列表。
+
+**Section sources**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L93-L107)
+
+## 项目导入API
+
+项目导入功能通过`ProjectImportController`提供,支持从外部源导入专利数据。
+
+### Excel导入专利 (POST /import/excelImport)
+
+从Excel文件导入专利数据。
+
+**请求参数**:
+- `file`: Excel文件
+- `excelImportDTO`: 导入配置信息
+
+**响应**:
+成功时返回成功消息。
+
+**Section sources**
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java#L28-L33)
+
+### 检索导入专利 (POST /import/patentStarImport)
+
+从检索结果导入专利数据。
+
+**请求参数**:
+- `excelImportDTO`: 导入配置信息
+
+**响应**:
+成功时返回成功消息。
+
+**Section sources**
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java#L35-L39)
+
+## 请求参数与响应结构
+
+### 请求参数结构
+
+#### StringRequest
+基础查询请求,包含搜索查询条件。
+
+```json
+{
+  "searchQuery": "查询条件"
+}
+```
+
+#### StringGroupRequest
+分组查询请求,继承自`StringRequest`。
+
+```json
+{
+  "searchQuery": "查询条件",
+  "groupField": "分组字段"
+}
+```
+
+**Section sources**
+- [StringRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringRequest.java#L1-L11)
+- [StringGroupRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringGroupRequest.java#L1-L12)
+
+### 响应结构
+
+所有API响应均封装在`Response`对象中,包含以下字段:
+
+- `code`: 响应码
+- `message`: 响应消息
+- `data`: 响应数据
+- `success`: 是否成功
+
+成功响应示例:
+```json
+{
+  "code": 200,
+  "message": "成功",
+  "data": {...},
+  "success": true
+}
+```
+
+错误响应示例:
+```json
+{
+  "code": 500,
+  "message": "错误信息",
+  "data": null,
+  "success": false
+}
+```
+
+**Section sources**
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+## API使用示例
+
+### 创建专利项目示例
+
+**请求**:
+```http
+POST /api/patentProject/addPatentProject
+Content-Type: application/json
+
+{
+  "name": "5G通信技术专利分析",
+  "entrustId": "C001",
+  "entrustName": "某通信公司",
+  "headId": "U001",
+  "departmentId": "D001",
+  "commissionCaseDay": "2023-01-15",
+  "description": "5G通信关键技术专利布局分析",
+  "scenarioIds": [1, 2],
+  "matterIds": [3, 4]
+}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "message": "成功",
+  "data": 1001,
+  "success": true
+}
+```
+
+### 查询专利项目示例
+
+**请求**:
+```http
+POST /api/patentProject/queryPatentProject
+Content-Type: application/json
+
+{
+  "searchQuery": "5G",
+  "current": 1,
+  "size": 10
+}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "message": "成功",
+  "data": {
+    "current": 1,
+    "size": 10,
+    "total": 25,
+    "data": [
+      {
+        "id": 1001,
+        "name": "5G通信技术专利分析",
+        "entrustName": "某通信公司",
+        "headName": "张三",
+        "departmentName": "知识产权部",
+        "commissionCaseDay": "2023-01-15T00:00:00",
+        "status": 1
+      }
+    ]
+  },
+  "success": true
+}
+```
+
+### 设置项目更新周期示例
+
+**请求**:
+```http
+POST /api/patentProject/setProjectQuartz
+Content-Type: application/json
+
+{
+  "projectId": 1001,
+  "cronExpression": "0 0 2 * * ?",
+  "notifyEmail": "team@example.com"
+}
+```
+
+**响应**:
+```json
+{
+  "code": 200,
+  "message": "成功",
+  "data": true,
+  "success": true
+}
+```
+
+## 项目与专利关联管理
+
+系统通过多种机制管理项目与专利之间的关联关系:
+
+1. **直接关联**:通过专题库与专利的直接关联,将专利添加到特定项目中。
+2. **检索关联**:通过检索条件动态关联符合条件的专利。
+3. **导入关联**:通过Excel导入或检索导入方式批量关联专利。
+4. **监控关联**:设置专利状态监控,自动跟踪特定专利的状态变化。
+
+项目与专利的关联关系存储在数据库的关联表中,支持高效的查询和管理。系统还提供了权限控制,确保只有授权用户才能查看和修改项目中的专利数据。
+
+**Section sources**
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+- [AssoProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/AssoProjectMapper.java)
+- [PatentProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/PatentProjectMapper.java)

+ 327 - 0
.qoder/repowiki/zh/content/API端点参考/项目管理API/项目任务API.md

@@ -0,0 +1,327 @@
+# 项目任务API
+
+<cite>
+**本文档中引用的文件**  
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java)
+- [ExamineController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ExamineController.java)
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java)
+- [ProjectTaskVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/ProjectTaskVO.java)
+- [TaskDetailsVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/TaskDetailsVO.java)
+- [AddFileExamineTaskDTO.java](file://src/main/java/cn/cslg/pas/common/model/projectTask/AddFileExamineTaskDTO.java)
+- [GetExamineHistoryDTO.java](file://src/main/java/cn/cslg/pas/common/model/projectTask/GetExamineHistoryDTO.java)
+- [SubmitResultDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/TaskHandleResultDTO.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [核心API端点](#核心api端点)
+3. [任务创建与管理](#任务创建与管理)
+4. [任务分配与更新](#任务分配与更新)
+5. [任务查询与状态跟踪](#任务查询与状态跟踪)
+6. [任务审核API](#任务审核api)
+7. [数据结构定义](#数据结构定义)
+8. [请求/响应示例](#请求响应示例)
+9. [关联关系说明](#关联关系说明)
+
+## 简介
+本API文档详细描述了项目任务管理功能的核心接口,包括任务的创建、分配、更新、查询和审核等操作。系统通过ProjectTaskController和ExamineController两个控制器提供RESTful API,支持任务的全生命周期管理。任务与项目、用户之间存在明确的关联关系,支持通过API进行任务状态管理和进度跟踪。
+
+## 核心API端点
+项目任务管理功能提供了多个核心API端点,主要分为任务管理、任务审核和状态管理三大类。所有端点均基于RESTful设计原则,使用标准的HTTP方法和状态码。
+
+```mermaid
+graph TB
+A[API端点] --> B[任务管理]
+A --> C[任务审核]
+A --> D[状态管理]
+B --> B1[POST /projectTask/addTask]
+B --> B2[POST /projectTask/updateTask]
+B --> B3[POST /projectTask/queryProjectTask]
+B --> B4[POST /projectTask/deleteProjectTask]
+C --> C1[POST /examine/addFileExamineTask]
+C --> C2[POST /examine/getExamineMessage]
+C --> C3[POST /examine/submitResult]
+D --> D1[GET /projectTask/updateTaskStatus]
+D --> D2[GET /projectTask/queryAuditHistory]
+```
+
+**图示来源**  
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java)
+- [ExamineController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ExamineController.java)
+
+## 任务创建与管理
+任务创建功能通过ProjectTaskController提供,支持创建不同类型的任务。任务创建时需要指定任务名称、处理人、截止时间等基本信息。
+
+### 任务创建API
+- **端点**: `POST /projectTask/addTask`
+- **功能**: 创建新任务
+- **请求体**: ProjectTaskDTO
+- **响应**: 创建任务的ID
+
+### 任务删除API
+- **端点**: `POST /projectTask/deleteProjectTask`
+- **功能**: 删除指定任务
+- **请求体**: 任务ID列表
+- **响应**: 操作结果
+
+**节来源**  
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L48-L53)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L88-L94)
+
+## 任务分配与更新
+任务分配和更新功能允许修改任务的处理人、截止时间、备注等信息,支持任务的动态调整和重新分配。
+
+### 任务分配API
+- **端点**: `POST /projectTask/addMarkTask`
+- **功能**: 添加分配或标引任务
+- **请求体**: MarkTaskDTO
+- **响应**: 创建任务的ID列表
+
+### 任务更新API
+- **端点**: `POST /projectTask/updateTask`
+- **功能**: 编辑现有任务
+- **请求体**: UpdateProjectTaskDTO
+- **响应**: 更新任务的ID
+
+```mermaid
+classDiagram
+class UpdateProjectTaskDTO {
++Integer id
++String handler
++Integer handlerType
++Date deadLineTime
++String description
+}
+UpdateProjectTaskDTO : 任务ID
+UpdateProjectTaskDTO : 处理人标识
+UpdateProjectTaskDTO : 处理人类型
+UpdateProjectTaskDTO : 截止时间
+UpdateProjectTaskDTO : 备注信息
+```
+
+**图示来源**  
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java#L1-L39)
+
+**节来源**  
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L122-L134)
+
+## 任务查询与状态跟踪
+系统提供了丰富的任务查询功能,支持按条件查询任务列表,并可跟踪任务的处理状态和历史记录。
+
+### 任务查询API
+- **端点**: `POST /projectTask/queryProjectTask`
+- **功能**: 查询任务列表
+- **请求体**: StringRequest
+- **响应**: Records对象,包含任务列表
+
+### 任务状态更新API
+- **端点**: `GET /projectTask/updateTaskStatus`
+- **功能**: 更改任务状态
+- **参数**: taskId, type
+- **状态类型**: 0-完成, 1-取消, 2-缺少资料
+
+### 审核历史查询API
+- **端点**: `GET /projectTask/queryAuditHistory`
+- **功能**: 查询任务审核历史
+- **参数**: taskId
+- **响应**: TaskDetailsVO对象
+
+**节来源**  
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L71-L77)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L98-L106)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L80-L86)
+
+## 任务审核API
+任务审核功能通过ExamineController提供,支持文件审核任务的创建、审核信息获取和结果提交。
+
+### 文件审核任务创建
+- **端点**: `POST /examine/addFileExamineTask`
+- **功能**: 添加文件审核任务
+- **请求体**: AddFileExamineTaskDTO
+- **响应**: 创建任务的ID
+
+### 审核信息获取
+- **端点**: `POST /examine/getExamineMessage`
+- **功能**: 获取审核信息
+- **请求体**: GetExamineMessageDTO
+- **响应**: AssoTaskFileVO列表
+
+### 审核结果提交
+- **端点**: `POST /examine/submitResult`
+- **功能**: 提交审核结果
+- **请求体**: SubmitResultDTO
+- **响应**: 处理结果ID
+
+```mermaid
+sequenceDiagram
+participant 客户端
+participant ExamineController
+participant ProjectTaskService
+participant TaskHandleResultService
+客户端->>ExamineController : POST /examine/addFileExamineTask
+ExamineController->>ProjectTaskService : addFileExamineTask()
+ProjectTaskService-->>ExamineController : 返回任务ID
+ExamineController-->>客户端 : 返回成功响应
+客户端->>ExamineController : POST /examine/submitResult
+ExamineController->>TaskHandleResultService : addTaskAuditResult()
+TaskHandleResultService-->>ExamineController : 返回结果ID
+ExamineController-->>客户端 : 返回成功响应
+```
+
+**图示来源**  
+- [ExamineController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ExamineController.java#L43-L74)
+
+**节来源**  
+- [ExamineController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ExamineController.java#L43-L74)
+
+## 数据结构定义
+本节详细描述了任务管理API中使用的主要数据结构,包括请求DTO和响应VO。
+
+### 任务详情数据结构
+```mermaid
+classDiagram
+class TaskDetailsVO {
++ProjectTaskVO projectTaskVO
++HandleResultFileVO[] systemFileList
++AuditHistoryVO[] auditHistoryVOS
+}
+class ProjectTaskVO {
++Integer id
++String name
++Integer projectId
++String projectName
++Integer projectType
++String patentNo
++Integer type
++Integer processId
++String processName
++String handler
++String handlerName
++Integer handlerType
+}
+TaskDetailsVO "1" *-- "1" ProjectTaskVO
+TaskDetailsVO "1" *-- "*" HandleResultFileVO
+TaskDetailsVO "1" *-- "*" AuditHistoryVO
+```
+
+**图示来源**  
+- [TaskDetailsVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/TaskDetailsVO.java#L1-L30)
+- [ProjectTaskVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/ProjectTaskVO.java#L1-L78)
+
+### 审核历史查询参数
+```mermaid
+classDiagram
+class GetExamineHistoryDTO {
++Integer taskId
++String fileGuid
++Boolean ifGetLast
+}
+GetExamineHistoryDTO : 任务ID
+GetExamineHistoryDTO : 文件GUID
+GetExamineHistoryDTO : 是否获取最新
+```
+
+**图示来源**  
+- [GetExamineHistoryDTO.java](file://src/main/java/cn/cslg/pas/common/model/projectTask/GetExamineHistoryDTO.java#L1-L11)
+
+## 请求/响应示例
+本节提供实际的API请求和响应示例,帮助开发者理解和使用API。
+
+### 任务更新请求示例
+```json
+{
+  "id": 123,
+  "handler": "user001",
+  "handlerType": 0,
+  "deadLineTime": "2023-12-31T23:59:59",
+  "description": "更新任务描述信息"
+}
+```
+
+### 任务更新响应示例
+```json
+{
+  "code": 200,
+  "message": "成功",
+  "data": 123
+}
+```
+
+### 审核历史查询响应示例
+```json
+{
+  "code": 200,
+  "message": "成功",
+  "data": {
+    "projectTaskVO": {
+      "id": 123,
+      "name": "专利分析任务",
+      "projectId": 456,
+      "projectName": "智能设备专利分析",
+      "handler": "user001",
+      "handlerName": "张三",
+      "status": 2
+    },
+    "systemFileList": [],
+    "auditHistoryVOS": []
+  }
+}
+```
+
+**节来源**  
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L130-L134)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L80-L86)
+
+## 关联关系说明
+任务管理系统中,任务与项目、用户之间存在明确的关联关系,这些关系通过API参数和数据结构进行管理。
+
+### 任务与项目关联
+- 每个任务关联到一个项目(通过projectId)
+- 项目类型决定任务的上下文(专题库、报告、专利挖掘项目等)
+- 任务状态变化可能影响项目状态
+
+### 任务与用户关联
+- 任务有明确的处理人(handler)
+- 处理人可以是内部人员(ID)或外部人员(邮箱)
+- 任务创建人和处理人可能不同
+- 支持任务的重新分配和状态跟踪
+
+### 任务层级关系
+- 任务可以有父任务(通过lastTaskId关联)
+- 任务路径(task_path)记录任务的层级结构
+- 支持任务的继承和关联查询
+
+```mermaid
+erDiagram
+PROJECT ||--o{ TASK : "包含"
+USER ||--o{ TASK : "处理"
+TASK ||--o{ TASK : "父子"
+PROJECT {
+integer projectId PK
+string name
+integer type
+}
+TASK {
+integer id PK
+string name
+integer projectId FK
+string handler
+integer handlerType
+integer status
+integer lastTaskId FK
+string task_path
+}
+USER {
+string id PK
+string name
+string email
+}
+```
+
+**图示来源**  
+- [ProjectTaskVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/ProjectTaskVO.java#L1-L78)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L28-L30)
+
+**节来源**  
+- [ProjectTaskVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/ProjectTaskVO.java#L1-L78)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L28-L30)

+ 490 - 0
.qoder/repowiki/zh/content/API端点参考/项目管理API/项目树结构API.md

@@ -0,0 +1,490 @@
+# 项目树结构API
+
+<cite>
+**本文档引用的文件**   
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java)
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java)
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java)
+- [TreeNodeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/TreeNodeDTO.java)
+- [UpdateTreeNodeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateTreeNodeDTO.java)
+- [CopyTreeNodeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/CopyTreeNodeDTO.java)
+- [TreeNodeVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/TreeNodeVO.java)
+- [ReTreeNodeVO.java](file://src/main/java/cn/cslg/pas/common/vo/ReTreeNodeVO.java)
+- [TreeNodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TreeNodeMapper.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [API端点概览](#api端点概览)
+3. [核心数据结构](#核心数据结构)
+4. [树节点创建](#树节点创建)
+5. [树节点查询](#树节点查询)
+6. [树节点更新](#树节点更新)
+7. [树节点移动与复制](#树节点移动与复制)
+8. [树节点删除](#树节点删除)
+9. [树结构与项目关联](#树结构与项目关联)
+10. [父子关系与层级管理](#父子关系与层级管理)
+11. [请求/响应示例](#请求响应示例)
+
+## 简介
+项目树结构API提供了一套完整的树形结构管理功能,用于组织和管理项目中的层级化数据。该系统支持产品类别、产品、技术分类和自定义树四种类型的树结构,通过TreeNodeController提供RESTful接口,实现树节点的增删改查、移动、复制等操作。树结构与项目、任务等实体通过关联表进行关联,支持复杂的业务场景。
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L1-L35)
+
+## API端点概览
+项目树结构管理API提供了以下核心端点:
+
+| 端点 | HTTP方法 | 功能描述 |
+|------|---------|---------|
+| /treeNode/queryTreeNodeTree | POST | 查询架构树 |
+| /treeNode/queryTreeNode | POST | 查询架构 |
+| /treeNode/queryTreePath | POST | 查询架构路径 |
+| /treeNode/addTreeNode | POST | 新增架构节点 |
+| /treeNode/updateTreeNode | POST | 更新架构节点 |
+| /treeNode/deleteTreeNode | POST | 删除架构节点 |
+| /treeNode/copyTreeNode | POST | 复制树架构 |
+
+所有API端点的基础路径为`/api/xiaoshi/treeNode`,由Constants.API_XiaoSHI常量定义。
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L33-L117)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+
+## 核心数据结构
+### 树节点实体 (TreeNode)
+树节点实体定义了树结构的基本属性,存储在`tree_node`数据库表中。
+
+```mermaid
+classDiagram
+class TreeNode {
++Integer id
++String name
++Integer type
++Integer parentId
++Integer typeId
++String path
++Integer level
++String createId
++Date createTime
++String description
+}
+```
+
+**Diagram sources**
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java#L1-L80)
+
+### 树节点数据传输对象 (DTO)
+#### TreeNodeDTO
+用于创建树节点的数据传输对象。
+
+```mermaid
+classDiagram
+class TreeNodeDTO {
++Integer id
++String name
++Integer type
++Integer typeId
++Integer parentId
++String description
++String personId
+}
+```
+
+**Diagram sources**
+- [TreeNodeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/TreeNodeDTO.java#L1-L48)
+
+#### UpdateTreeNodeDTO
+用于更新树节点的数据传输对象。
+
+```mermaid
+classDiagram
+class UpdateTreeNodeDTO {
++Integer id
++String name
++Integer parentId
++String description
++String[] guids
+}
+```
+
+**Diagram sources**
+- [UpdateTreeNodeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateTreeNodeDTO.java#L1-L26)
+
+#### CopyTreeNodeDTO
+用于复制树节点的数据传输对象。
+
+```mermaid
+classDiagram
+class CopyTreeNodeDTO {
++Integer fromType
++Integer fromTypeId
++Integer[] fromNodeIds
++Integer toType
++Integer toTypeId
++Integer toNodeId
++Boolean ifDelete
++Boolean ifCopyChild
+}
+```
+
+**Diagram sources**
+- [CopyTreeNodeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/CopyTreeNodeDTO.java#L1-L43)
+
+### 树节点视图对象 (VO)
+#### TreeNodeVO
+树节点的视图对象,包含基础信息和关联数据。
+
+```mermaid
+classDiagram
+class TreeNodeVO {
++Integer id
++String name
++Integer type
++Integer parentId
++Integer typeId
++String path
++String pathName
++Integer level
++String createId
++String createName
++Date createTime
++String description
++SystemFile[] systemFileList
++Long relevantProductNum
+}
+```
+
+**Diagram sources**
+- [TreeNodeVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/TreeNodeVO.java#L1-L63)
+
+#### ReTreeNodeVO
+返回树节点的视图对象,包含子节点信息,用于构建树形结构。
+
+```mermaid
+classDiagram
+class ReTreeNodeVO {
++Integer id
++String name
++Integer type
++Integer parentId
++Integer typeId
++String pathName
++String path
++Integer level
++ReTreeNodeVO[] child
++String createId
++DateTime createTime
++String description
++SystemFile[] systemFileList
++Long relevantProductNum
+}
+```
+
+**Diagram sources**
+- [ReTreeNodeVO.java](file://src/main/java/cn/cslg/pas/common/vo/ReTreeNodeVO.java#L1-L51)
+
+## 树节点创建
+### 创建端点
+- **端点**: POST /treeNode/addTreeNode
+- **功能**: 创建新的树节点
+- **参数**: 
+  - treeNode: 树节点信息的JSON字符串
+  - files: 上传的文件列表
+
+### 请求流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "TreeNodeController"
+participant Service as "TreeNodeService"
+participant Mapper as "TreeNodeMapper"
+participant DB as "数据库"
+Client->>Controller : POST /addTreeNode
+Controller->>Controller : 解析treeNode JSON
+Controller->>Service : 调用addMessage()
+Service->>DB : 插入新节点
+DB-->>Service : 返回节点ID
+Service->>Service : 处理文件上传
+Service->>Controller : 返回节点ID
+Controller-->>Client : 返回成功响应
+```
+
+**Diagram sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L63-L82)
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L447-L448)
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L63-L82)
+
+## 树节点查询
+### 查询端点
+系统提供了多种查询方式:
+
+| 端点 | 功能描述 |
+|------|---------|
+| /treeNode/queryTreeNodeTree | 查询完整的树形结构 |
+| /treeNode/queryTreeNode | 查询架构节点 |
+| /treeNode/queryTreePath | 查询架构路径 |
+
+### 查询流程
+```mermaid
+flowchart TD
+Start([开始]) --> ValidateInput["验证输入参数"]
+ValidateInput --> QueryDB["查询数据库"]
+QueryDB --> LoadData["加载关联数据"]
+LoadData --> BuildTree["构建树形结构"]
+BuildTree --> ReturnResult["返回结果"]
+```
+
+**Diagram sources**
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L111-L169)
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L40-L62)
+
+## 树节点更新
+### 更新端点
+- **端点**: POST /treeNode/updateTreeNode
+- **功能**: 更新树节点信息
+- **参数**: 
+  - treeNode: 更新信息的JSON字符串
+  - files: 新上传的文件列表
+
+### 更新流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "TreeNodeController"
+participant Service as "TreeNodeService"
+participant DB as "数据库"
+Client->>Controller : POST /updateTreeNode
+Controller->>Controller : 解析更新数据
+Controller->>Service : 调用updateMessage()
+Service->>DB : 查询现有节点
+DB-->>Service : 返回节点信息
+Service->>Service : 验证节点名称唯一性
+Service->>Service : 更新节点信息
+Service->>Service : 处理文件变更
+Service->>Controller : 返回成功
+Controller-->>Client : 返回响应
+```
+
+**Diagram sources**
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L339-L437)
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L84-L98)
+
+## 树节点移动与复制
+### 复制端点
+- **端点**: POST /treeNode/copyTreeNode
+- **功能**: 复制树节点或整个子树
+- **参数**: CopyTreeNodeDTO对象
+
+### 复制流程
+```mermaid
+flowchart TD
+Start([开始]) --> ParseInput["解析输入参数"]
+ParseInput --> QuerySource["查询源节点"]
+QuerySource --> BuildSourceTree["构建源树结构"]
+BuildSourceTree --> DetermineTarget["确定目标位置"]
+DetermineTarget --> QueryTarget["查询目标节点"]
+QueryTarget --> AdjustPath["调整路径和层级"]
+AdjustPath --> CheckConflict["检查命名冲突"]
+CheckConflict --> CreateNodes["创建新节点"]
+CreateNodes --> ReturnSuccess["返回成功"]
+```
+
+**Diagram sources**
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L538-L599)
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L109-L116)
+
+## 树节点删除
+### 删除端点
+- **端点**: POST /treeNode/deleteTreeNode
+- **功能**: 删除树节点及其子节点
+- **参数**: 节点ID列表
+
+### 删除流程
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "TreeNodeController"
+participant Service as "TreeNodeService"
+participant FileManager as "FileManagerService"
+participant DB as "数据库"
+Client->>Controller : POST /deleteTreeNode
+Controller->>Service : 调用deleteMessage()
+Service->>DB : 查询要删除的节点
+DB-->>Service : 返回节点信息
+Service->>DB : 查询关联的文件
+DB-->>Service : 返回文件GUID
+Service->>FileManager : 删除文件
+FileManager-->>Service : 确认删除
+Service->>DB : 删除文件关联记录
+Service->>DB : 删除节点记录
+Service->>Controller : 返回成功
+Controller-->>Client : 返回响应
+```
+
+**Diagram sources**
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L300-L328)
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L101-L107)
+
+## 树结构与项目关联
+### 关联机制
+树结构与项目通过`AssoProjectTreeNode`关联表进行关联,实现树节点与项目的绑定。
+
+```mermaid
+erDiagram
+PROJECT ||--o{ AssoProjectTreeNode : "包含"
+AssoProjectTreeNode }o--|| TreeNode : "关联"
+PROJECT {
+integer id PK
+string name
+datetime create_time
+}
+AssoProjectTreeNode {
+integer id PK
+integer project_id FK
+integer value_id FK
+integer type
+}
+TreeNode {
+integer id PK
+string name
+integer type
+integer parent_id
+string path
+integer level
+}
+```
+
+**Diagram sources**
+- [AssoProjectTreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/AssoProjectTreeNode.java)
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java)
+
+### 关联管理
+当项目需要关联树结构时,系统会创建`AssoProjectTreeNode`记录,将项目ID与树节点ID关联起来。这种设计支持一个项目关联多个树节点,也支持一个树节点被多个项目共享。
+
+**Section sources**
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L112-L131)
+
+## 父子关系与层级管理
+### 层级结构
+树节点通过`parentId`字段建立父子关系,通过`path`字段存储完整路径,通过`level`字段记录层级深度。
+
+### 路径计算规则
+- 根节点:`parentId = 0`,`path = ""`,`level = 0`
+- 子节点:`path = parentPath + parentId + "/"`,`level = parentLevel + 1`
+
+### 层级管理流程
+```mermaid
+flowchart TD
+Start([开始]) --> CheckParent["检查父节点"]
+CheckParent --> GetParent["获取父节点信息"]
+GetParent --> CalcPath["计算路径"]
+CalcPath --> SetLevel["设置层级"]
+SetLevel --> Validate["验证路径"]
+Validate --> Save["保存节点"]
+```
+
+**Diagram sources**
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L365-L386)
+
+**Section sources**
+- [TreeNodeService.java](file://src/main/java/cn/cslg/pas/service/business/TreeNodeService.java#L340-L386)
+
+## 请求/响应示例
+### 创建树节点请求示例
+```json
+POST /api/xiaoshi/treeNode/addTreeNode
+Content-Type: multipart/form-data
+
+{
+  "treeNode": "{\"name\":\"新产品类别\",\"type\":1,\"typeId\":1001,\"parentId\":0,\"description\":\"测试用新产品类别\"}"
+}
+```
+
+### 查询树结构响应示例
+```json
+{
+  "code": 200,
+  "message": "success",
+  "data": {
+    "current": 1,
+    "size": 10,
+    "total": 5,
+    "data": [
+      {
+        "id": 1,
+        "name": "根节点",
+        "type": 1,
+        "parentId": 0,
+        "typeId": 1001,
+        "path": "",
+        "pathName": "/",
+        "level": 0,
+        "createId": "user001",
+        "createName": "张三",
+        "createTime": "2023-10-26T10:00:00",
+        "description": "根节点",
+        "child": [
+          {
+            "id": 2,
+            "name": "子节点1",
+            "type": 1,
+            "parentId": 1,
+            "typeId": 1001,
+            "path": "1/",
+            "pathName": "/根节点",
+            "level": 1,
+            "createId": "user001",
+            "createName": "张三",
+            "createTime": "2023-10-26T10:05:00",
+            "description": "第一个子节点",
+            "child": []
+          }
+        ]
+      }
+    ]
+  }
+}
+```
+
+### 更新树节点请求示例
+```json
+POST /api/xiaoshi/treeNode/updateTreeNode
+Content-Type: multipart/form-data
+
+{
+  "treeNode": "{\"id\":2,\"name\":\"更新后的子节点\",\"parentId\":1,\"description\":\"更新后的描述\",\"guids\":[\"file-guid-001\"]}"
+}
+```
+
+### 复制树结构请求示例
+```json
+POST /api/xiaoshi/treeNode/copyTreeNode
+Content-Type: application/json
+
+{
+  "fromType": 1,
+  "fromTypeId": 1001,
+  "fromNodeIds": [2],
+  "toType": 1,
+  "toTypeId": 1002,
+  "toNodeId": 3,
+  "ifCopyChild": true,
+  "ifDelete": false
+}
+```
+
+**Section sources**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java)
+- [TreeNodeServiceTests.java](file://src/test/java/cn/cslg/pas/service/TreeNodeServiceTests.java)

+ 174 - 0
.qoder/repowiki/zh/content/API端点参考/项目管理API/项目管理API.md

@@ -0,0 +1,174 @@
+# 项目管理API
+
+<cite>
+**本文档中引用的文件**  
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java)
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java)
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java)
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java)
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java)
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java)
+- [PatentProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/PatentProjectDTO.java)
+- [PatentStatusMonitorVO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorVO.java)
+</cite>
+
+## 目录
+1. [项目管理API](#项目管理api)
+2. [项目创建与管理](#项目创建与管理)
+3. [任务分配与管理](#任务分配与管理)
+4. [项目树结构管理](#项目树结构管理)
+5. [项目状态监控](#项目状态监控)
+6. [项目共享功能](#项目共享功能)
+7. [项目导入功能](#项目导入功能)
+
+## 项目创建与管理
+
+`PatentProjectController` 提供了对专利项目的完整生命周期管理功能,包括创建、更新、查询、删除和分组操作。
+
+### 创建项目
+通过 `POST /patentProject/addPatentProject` 端点创建新项目。请求体需包含 `PatentProjectDTO` 对象,其中关键字段包括:
+- **name**: 项目名称
+- **entrustId**: 委托方ID
+- **headId**: 负责人ID
+- **departmentId**: 负责部门ID
+- **contractNo**: 合同号
+- **volumeNumber**: 内部卷号
+- **commissionCaseDay**: 委案日
+- **description**: 项目描述
+- **scenarioIds**: 应用场景ID列表
+- **matterIds**: 处理事项ID列表
+
+成功创建后返回新项目的ID。
+
+### 更新项目
+使用 `POST /patentProject/updatePatentProject` 端点更新现有项目。请求体为 `UpdatePatentProjectDTO` 对象,包含需要更新的字段。
+
+### 查询与删除项目
+- **查询**: `POST /patentProject/queryPatentProject` 用于查询项目列表
+- **分组查询**: `POST /patentProject/groupPatentProject` 支持按条件分组查询
+- **删除**: `POST /patentProject/deletePatentProject` 接收项目ID列表进行批量删除
+
+### 项目周期设置
+- **设置更新周期**: `POST /patentProject/setProjectQuartz` 使用 `ProjectQuartzSetDTO` 设置项目更新周期
+- **查询更新周期**: `POST /patentProject/queryProjectQuartz` 使用 `ProjectQuartzQueryDTO` 查询当前周期设置
+
+**本节来源**
+- [PatentProjectController.java](file://src/main/java/cn/cslg/pas/controller/PatentProjectController.java#L64-L148)
+
+## 任务分配与管理
+
+`ProjectTaskController` 负责项目任务的创建、分配、更新和状态管理。
+
+### 添加任务
+支持多种类型的任务创建:
+- **通用任务**: `POST /projectTask/addTask` 使用 `ProjectTaskDTO`
+- **开卷审核任务**: `POST /projectTask/addProjectOpenAuditTask` 用于挖掘项目
+- **报告审核任务**: `POST /projectTask/addReportOpenAuditTask`
+- **分配/标引任务**: `POST /projectTask/addMarkTask` 使用 `MarkTaskDTO`
+
+### 任务更新与状态管理
+- **编辑任务**: `POST /projectTask/updateTask` 接收 `UpdateProjectTaskDTO` 对象
+- **更新任务状态**: `GET /projectTask/updateTaskStatus` 支持三种状态:
+  - **0**: 完成
+  - **1**: 取消
+  - **2**: 缺少资料
+
+`UpdateProjectTaskDTO` 包含以下字段:
+- **id**: 任务ID
+- **handler**: 处理人(内部人员为ID,外部人员为邮箱)
+- **handlerType**: 处理人类型(0=内部,1=外部)
+- **deadLineTime**: 截止时间
+- **description**: 备注
+
+### 任务查询与删除
+- **查询任务**: `POST /projectTask/queryProjectTask` 返回任务列表
+- **删除任务**: `POST /projectTask/deleteProjectTask` 批量删除任务
+- **查询审核历史**: `GET /projectTask/queryAuditHistory` 获取指定任务的完整审核历史
+
+### 任务处理结果
+- **添加处理结果**: `POST /projectTask/addTaskAuditResult` 使用 `TaskHandleResultDTO`
+- **查询处理结果**: `GET /projectTask/getTaskHandleResult` 获取指定任务的处理结果
+
+**本节来源**
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L40-L136)
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java#L1-L40)
+
+## 项目树结构管理
+
+`TreeNodeController` 提供了项目架构树的完整管理功能。
+
+### 树结构操作
+- **查询树结构**: 
+  - `POST /treeNode/queryTreeNodeTree`: 查询完整的树形结构
+  - `POST /treeNode/queryTreeNode`: 查询架构列表
+  - `POST /treeNode/queryTreePath`: 查询架构路径
+- **增删改操作**:
+  - `POST /treeNode/addTreeNode`: 新增架构节点,支持上传关联文件
+  - `POST /treeNode/updateTreeNode`: 更新架构节点,支持文件更新
+  - `POST /treeNode/deleteTreeNode`: 删除架构节点(接收ID列表)
+- **复制功能**: `POST /treeNode/copyTreeNode` 使用 `CopyTreeNodeDTO` 复制树架构
+
+所有操作均通过统一的业务工厂模式实现,确保了代码的可维护性和扩展性。
+
+**本节来源**
+- [TreeNodeController.java](file://src/main/java/cn/cslg/pas/controller/TreeNodeController.java#L40-L117)
+
+## 项目状态监控
+
+`PatentStatusMonitorController` 提供了专利状态监控任务的管理功能。
+
+### 监控任务管理
+- **添加监控任务**: `POST /patentStatusMonitor/add` 使用 `PatentStatusMonitorAddDTO` 创建新监控任务
+- **查询监控任务**: `POST /patentStatusMonitor/query` 使用 `PatentStatusMonitorQueryDTO` 查询任务列表
+- **更新监控任务**: `POST /patentStatusMonitor/update` 使用 `PatentStatusMonitorUpdateDTO` 修改任务配置
+- **删除监控任务**: `POST /patentStatusMonitor/delete` 使用 `PatentStatusMonitorDeleteDTO` 删除任务
+
+### 监控任务数据结构
+`PatentStatusMonitorVO` 响应对象包含以下字段:
+- **projectId**: 关联项目ID
+- **searchQuery**: 搜索查询条件
+- **startNumber/endNumber**: 起始/结束编号
+- **isDelete/isAdd**: 删除/新增标识列表
+- **notifyCycle**: 通知周期
+- **targetSss**: 目标SS列表
+- **status**: 任务状态
+- **type**: 任务类型
+
+该功能支持定期轮询专利状态变化,并通过配置的周期进行通知。
+
+**本节来源**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L30-L57)
+- [PatentStatusMonitorVO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorVO.java#L1-L30)
+
+## 项目共享功能
+
+`ProjectShareController` 管理项目的分享和权限控制。
+
+### 分享操作
+- **新增分享**: `POST /patentShare/addProjectShare` 使用 `AddProjectPersonDTO` 添加项目分享记录
+- **删除分享**: `POST /patentShare/removeProjectShare` 批量删除分享记录
+- **查询分享**: `POST /patentShare/queryProjectShare` 使用 `QueryProjectPersonDTO` 查询分享记录
+
+### 权限查询
+`POST /patentShare/getProjectPermissions` 端点查询指定项目中人员的角色权限,返回项目ID与角色列表的映射关系。
+
+该功能支持细粒度的项目访问控制,确保只有授权人员可以访问特定项目。
+
+**本节来源**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L45-L107)
+
+## 项目导入功能
+
+`ProjectImportController` 提供项目数据导入功能。
+
+### 导入功能
+- **Excel导入**: `POST /import/excelImport` 支持通过Excel文件批量导入专利任务
+- **检索导入**: `POST /import/patentStarImport` 支持从检索结果导入专利
+
+**注意**: 当前代码中这些端点被注释,可能处于开发或维护状态。
+
+该功能旨在简化大量专利数据的导入流程,提高工作效率。
+
+**本节来源**
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java#L28-L38)

+ 515 - 0
.qoder/repowiki/zh/content/业务逻辑层/FTO分析/FTO分析.md

@@ -0,0 +1,515 @@
+# FTO分析
+
+<cite>
+**本文档引用的文件**  
+- [FTOController.java](file://src/main/java/cn/cslg/pas/controller/FTOController.java)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java)
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java)
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java)
+- [ClaimManageDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/ClaimManageDTO.java)
+- [AssoClaimCompareDescriptionService.java](file://src/main/java/cn/cslg/pas/service/business/ftoReport/AssoClaimCompareDescriptionService.java)
+- [AssoLiteratureCompareDescriptionService.java](file://src/main/java/cn/cslg/pas/service/business/ftoReport/AssoLiteratureCompareDescriptionService.java)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [FTOCompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/FTOCompareRecordVO.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [核心流程](#核心流程)
+3. [侵权比对记录管理](#侵权比对记录管理)
+4. [权要分析](#权要分析)
+5. [风险评估](#风险评估)
+6. [专利权要与产品技术特征匹配逻辑](#专利权要与产品技术特征匹配逻辑)
+7. [FTO分析报告生成机制](#fto分析报告生成机制)
+8. [技术特征提取与侵权判定规则](#技术特征提取与侵权判定规则)
+9. [领域模型关系](#领域模型关系)
+10. [常见问题与优化建议](#常见问题与优化建议)
+
+## 引言
+FTO(Freedom to Operate)分析是专利风险评估中的关键环节,旨在评估产品或技术在商业化过程中是否存在侵犯他人专利权的风险。本系统通过结构化的流程,实现了从专利权要拆分、特征提取、侵权比对到风险评估的完整分析链条。本文档将深入解析PAS系统中FTO分析功能的实现细节,包括核心流程、数据结构、业务逻辑及API使用方式。
+
+## 核心流程
+FTO分析的核心流程包括以下几个关键步骤:
+1. **专利权要获取**:从专利文档中提取权利要求内容。
+2. **权要拆分**:将权利要求按技术特征进行拆分。
+3. **特征提取**:识别并提取与产品相关的技术特征。
+4. **侵权比对**:将产品技术特征与专利权要进行对比分析。
+5. **风险评估**:根据比对结果确定侵权风险等级。
+6. **报告生成**:生成包含分析结果的FTO报告。
+
+该流程通过多个服务组件协同完成,主要涉及`FTOCompareRecordService`、`FeatureService`和`ReportExportService`等核心服务。
+
+**Section sources**
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L93-L151)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java#L412-L442)
+
+## 侵权比对记录管理
+侵权比对记录管理是FTO分析的核心数据管理功能,主要由`FTOCompareRecordService`类实现。该服务负责管理专利权要与产品技术特征之间的对比结果。
+
+### 数据结构
+`FTOCompareRecord`实体类定义了侵权比对记录的核心数据结构:
+- `targetDescription`: 标的说明
+- `compareDescription`: 对比说明
+- `compareFileNumber`: 对比文献编号
+- `projectId`: 报告ID
+- `compareResult`: 对比结果(0:字面相同, 1:等同, 2:不相同, 3:待确定)
+- `featureId`: 特征ID
+- `projectTaskId`: 任务ID
+- `ifOriginal`: 是否原始记录
+- `ifFinal`: 是否最终记录
+
+### 核心操作
+`FTOCompareRecordService`提供了以下核心操作方法:
+- `getFTOCompareRecord`: 查询某个任务下的专利对比结果
+- `addFTOCompareRecord`: 保存FTO对比结果
+- `addFTOAssitTaskResult`: 保存FTO协同任务对比结果
+- `addFinalAssitResult`: 保存最终对比结果
+- `getFTOFinalResult`: 查询最终结果
+
+这些方法通过REST API暴露给前端,支持完整的侵权比对记录生命周期管理。
+
+```mermaid
+classDiagram
+class FTOCompareRecord {
++String targetDescription
++String compareDescription
++String compareFileNumber
++Integer projectId
++Integer compareResult
++Integer featureId
++Integer projectTaskId
++Integer assoTaskId
++Boolean ifOriginal
++Boolean ifFinal
++String createId
++Date createTime
+}
+class FTOCompareRecordService {
++TortCompareRecordVO getFTOCompareRecord(GetFeatureSplitDTO)
++List<Integer> addFTOCompareRecord(TortCompareRecordDTO)
++List<Integer> addFTOAssitTaskResult(TortCompareRecordDTO)
++List<Integer> addFinalAssitResult(TortCompareRecordDTO)
++TortCompareRecordVO getFTOFinalResult(String, Integer)
+}
+FTOCompareRecordService --> FTOCompareRecord : "管理"
+```
+
+**Diagram sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L89)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L49-L87)
+
+**Section sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L89)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L49-L87)
+
+## 权要分析
+权要分析是FTO分析的基础,主要通过`ClaimManageService`和相关组件实现。该功能负责专利权利要求的管理和分析。
+
+### 数据结构
+权要分析涉及的主要数据结构包括:
+- `PatentClaim`: 专利权要实体
+- `ClaimManageDTO`: 权要管理数据传输对象
+- `PatentClaimVO`: 专利权要视图对象
+
+`ClaimManageDTO`定义了权要管理的核心数据结构:
+- `taskId`: 任务ID
+- `literatureId`: 文献ID
+- `literatureNo`: 文献编号
+- `projectId`: 项目ID
+- `claims`: 权要列表
+
+### 核心流程
+权要分析的核心流程包括:
+1. **权要获取**:从专利文档中提取权利要求
+2. **权要拆分**:将权利要求按技术特征进行拆分
+3. **权要管理**:维护权要的版本和变更历史
+4. **权要对比**:支持权要之间的对比分析
+
+```mermaid
+classDiagram
+class PatentClaim {
++Integer sysOrder
++String content
++Integer claimType
++Integer contentType
++String parentOrder
++Integer projectId
++String createId
++String rbDecision
++String courtDecision1
++String courtDecision2
++Integer claimMessageId
+}
+class ClaimManageDTO {
++Integer taskId
++Integer literatureId
++String literatureNo
++Integer projectId
++List<PatentClaimDTO> claims
+}
+class PatentClaimVO {
++Integer id
++Integer sysOrder
++String content
++Integer claimType
++Integer contentType
++String parentOrder
++Integer projectId
++String rbDecision
++String courtDecision1
++String courtDecision2
++List<PatentClaimHistory> patentClaimHistoryList
+}
+ClaimManageDTO --> PatentClaimDTO : "包含"
+PatentClaimVO --> PatentClaimHistory : "包含"
+```
+
+**Diagram sources**
+- [ClaimManageDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/ClaimManageDTO.java#L1-L16)
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java#L1-L34)
+- [PatentClaimVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidReport/PatentClaimVO.java#L1-L37)
+
+**Section sources**
+- [ClaimManageDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/ClaimManageDTO.java#L1-L16)
+
+## 风险评估
+风险评估是FTO分析的最终目标,通过对比结果确定专利侵权的风险等级。系统采用多维度的评估方法,包括技术特征匹配度、法律状态、地域覆盖等因素。
+
+### 评估维度
+1. **技术匹配度**:基于特征对比结果的匹配程度
+2. **法律状态**:专利的有效性、稳定性
+3. **地域覆盖**:专利的地域保护范围
+4. **商业价值**:专利的技术重要性和市场价值
+
+### 评估流程
+风险评估的流程如下:
+1. 收集所有相关专利的对比结果
+2. 分析每个专利的技术特征匹配情况
+3. 结合专利的法律状态和地域信息
+4. 综合评估整体侵权风险
+5. 生成风险评估报告
+
+系统通过`FTOCompareRecord`中的`compareResult`字段来记录对比结果,该字段的取值包括:
+- 0: 字面相同
+- 1: 等同
+- 2: 不相同
+- 3: 待确定
+
+这些结果将作为风险评估的重要输入。
+
+```mermaid
+flowchart TD
+A[开始] --> B[收集对比结果]
+B --> C[分析技术匹配度]
+C --> D[评估法律状态]
+D --> E[确定地域覆盖]
+E --> F[综合风险评估]
+F --> G[生成评估报告]
+G --> H[结束]
+```
+
+**Diagram sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L41-L45)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L252-L293)
+
+**Section sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L41-L45)
+
+## 专利权要与产品技术特征匹配逻辑
+专利权要与产品技术特征的匹配是FTO分析的核心逻辑,主要通过特征提取和对比分析实现。
+
+### 匹配流程
+1. **特征提取**:从产品技术文档中提取关键技术特征
+2. **权要拆分**:将专利权利要求拆分为独立的技术特征
+3. **特征映射**:建立产品特征与专利权要特征的对应关系
+4. **对比分析**:评估每个特征的匹配程度
+5. **结果记录**:保存对比结果和分析说明
+
+### 实现方式
+系统通过`Feature`实体类管理技术特征,其主要属性包括:
+- `patentNo`: 专利号
+- `rightSort`: 权要排序
+- `projectId`: 所属报告
+- `projectTaskId`: 任务ID
+- `content`: 特征内容
+- `explainText`: 解释说明
+- `rightType`: 权要类型(1:主权要, 0:附属权要)
+
+匹配逻辑在`FTOCompareRecordService`的`loadAllTortVO`方法中实现,该方法将特征与对比记录进行关联,构建完整的分析视图。
+
+```mermaid
+classDiagram
+class Feature {
++String patentNo
++Integer rightSort
++String fromId
++Integer projectId
++Integer projectTaskId
++String content
++String explainText
++Integer rightType
++String createId
++Date createTime
++Integer tenantId
++Integer sysOrder
++Integer splitMessageId
+}
+class FTOCompareRecord {
++String targetDescription
++String compareDescription
++String compareFileNumber
++Integer projectId
++Integer compareResult
++Integer featureId
++Integer projectTaskId
++Integer assoTaskId
++Boolean ifOriginal
++Boolean ifFinal
++String createId
++Date createTime
+}
+Feature "1" --> "0..*" FTOCompareRecord : "拥有"
+```
+
+**Diagram sources**
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java#L1-L88)
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L89)
+
+**Section sources**
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java#L1-L88)
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java#L189-L244)
+
+## FTO分析报告生成机制
+FTO分析报告的生成是整个分析流程的最终输出,系统通过模板引擎和数据填充技术实现报告的自动化生成。
+
+### 数据结构
+报告生成涉及的主要数据结构包括:
+- `FTOCompareRecordVO`: FTO对比记录视图对象
+- `TortCompareRecordVO`: 侵权对比记录视图对象
+- `TortRightVO`: 侵权权要视图对象
+- `TortVO`: 侵权分析视图对象
+
+`FTOCompareRecordVO`定义了报告所需的核心数据:
+- `id`: 记录ID
+- `targetDescription`: 标的说明
+- `compareDescription`: 对比说明
+- `compareResult`: 对比结果
+- `resultStr`: 结果字符串
+
+### 生成流程
+报告生成的流程如下:
+1. 收集所有相关数据
+2. 填充模板数据
+3. 生成文档
+4. 导出报告
+
+系统通过`TemplateExportService`和`ReportExportService`实现报告生成功能,支持Word文档格式的输出。
+
+```mermaid
+sequenceDiagram
+participant 前端 as 前端应用
+participant 控制器 as FTOController
+participant 服务 as FTOCompareRecordService
+participant 数据库 as 数据库
+前端->>控制器 : 请求报告生成
+控制器->>服务 : 调用报告生成方法
+服务->>数据库 : 查询对比记录
+数据库-->>服务 : 返回数据
+服务->>服务 : 填充模板数据
+服务->>服务 : 生成文档
+服务-->>控制器 : 返回报告
+控制器-->>前端 : 下载报告
+```
+
+**Diagram sources**
+- [FTOCompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/FTOCompareRecordVO.java#L1-L33)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java#L412-L442)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java#L29-L66)
+
+**Section sources**
+- [FTOCompareRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/FTOCompareRecordVO.java#L1-L33)
+- [TemplateExportService.java](file://src/main/java/cn/cslg/pas/service/TemplateExportService.java#L412-L442)
+
+## 技术特征提取与侵权判定规则
+技术特征提取和侵权判定是FTO分析的核心技术环节,决定了分析的准确性和可靠性。
+
+### 特征提取
+特征提取的实现方式包括:
+1. **基于规则的提取**:使用预定义的规则和模式识别技术特征
+2. **自然语言处理**:利用NLP技术分析文本内容
+3. **机器学习**:通过训练模型自动识别关键技术特征
+
+系统通过`FeatureService`实现特征提取功能,支持手动和自动两种模式。
+
+### 侵权判定规则
+侵权判定采用多层次的规则体系:
+1. **字面侵权**:技术特征完全相同
+2. **等同侵权**:技术特征实质等同
+3. **不侵权**:技术特征明显不同
+4. **待确定**:需要进一步分析
+
+判定规则在`FTOCompareRecord`的`compareResult`字段中体现,通过不同的数值表示不同的判定结果。
+
+### 风险等级划分
+系统采用三级风险等级划分:
+- **高风险**:存在明确的侵权可能性
+- **中风险**:存在潜在的侵权可能性
+- **低风险**:基本不存在侵权可能性
+
+风险等级根据对比结果和专家判断综合确定。
+
+```mermaid
+flowchart TD
+A[开始] --> B[提取技术特征]
+B --> C[对比专利权要]
+C --> D{匹配程度}
+D --> |完全匹配| E[高风险]
+D --> |部分匹配| F[中风险]
+D --> |不匹配| G[低风险]
+E --> H[生成警告]
+F --> I[生成提示]
+G --> J[生成确认]
+H --> K[结束]
+I --> K
+J --> K
+```
+
+**Diagram sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L41-L45)
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java#L1-L88)
+
+**Section sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L41-L45)
+
+## 领域模型关系
+FTO分析涉及多个领域模型,它们之间的关系构成了系统的数据架构基础。
+
+### 核心模型
+1. **FTOCompareRecord**: 侵权比对记录
+2. **Feature**: 技术特征
+3. **Patent**: 专利
+4. **Product**: 产品
+5. **ReportProject**: 报告项目
+
+### 关系分析
+- `FTOCompareRecord`与`Feature`是一对多关系,一个对比记录对应一个特征
+- `Feature`与`Patent`是多对一关系,多个特征属于一个专利
+- `FTOCompareRecord`与`ReportProject`是多对一关系,多个对比记录属于一个报告项目
+- `Feature`与`Product`是多对多关系,产品包含多个特征,特征可能出现在多个产品中
+
+这些关系通过外键和关联表在数据库中实现,确保数据的一致性和完整性。
+
+```mermaid
+erDiagram
+FTOCompareRecord {
+Integer id PK
+String targetDescription
+String compareDescription
+String compareFileNumber
+Integer projectId FK
+Integer compareResult
+Integer featureId FK
+Integer projectTaskId FK
+Integer assoTaskId FK
+Boolean ifOriginal
+Boolean ifFinal
+String createId
+Date createTime
+}
+Feature {
+Integer id PK
+String patentNo FK
+Integer rightSort
+String fromId
+Integer projectId FK
+Integer projectTaskId FK
+String content
+String explainText
+Integer rightType
+String createId
+Date createTime
+Integer tenantId
+Integer sysOrder
+Integer splitMessageId FK
+}
+Patent {
+String patentNo PK
+String title
+String abstract
+String applicant
+String inventor
+Date filingDate
+Date publicationDate
+String status
+}
+ReportProject {
+Integer projectId PK
+String projectName
+String projectType
+String status
+Date createTime
+Date updateTime
+}
+FTOCompareRecord ||--o{ Feature : "关联"
+Feature }o--|| Patent : "属于"
+FTOCompareRecord }o--|| ReportProject : "属于"
+```
+
+**Diagram sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L89)
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java#L1-L88)
+- [ReportProject.java](file://src/main/java/cn/cslg/pas/domain/business/ReportProject.java)
+
+**Section sources**
+- [FTOCompareRecord.java](file://src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java#L1-L89)
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java#L1-L88)
+
+## 常见问题与优化建议
+在实际使用FTO分析功能时,可能会遇到一些常见问题,以下是问题分析和优化建议。
+
+### 特征提取不完整
+**问题描述**:系统未能完整提取专利权要中的所有技术特征。
+
+**原因分析**:
+1. 权要文本复杂,难以准确拆分
+2. 缺乏有效的特征识别规则
+3. NLP模型训练数据不足
+
+**优化建议**:
+1. 完善权要拆分规则,支持更多语言模式
+2. 增加人工校验环节,确保特征完整性
+3. 持续优化NLP模型,提高特征识别准确率
+
+### 侵权判定不准确
+**问题描述**:系统对技术特征的侵权判定结果与专家判断存在偏差。
+
+**原因分析**:
+1. 判定规则过于简单
+2. 缺乏领域专业知识
+3. 上下文理解能力不足
+
+**优化建议**:
+1. 细化侵权判定规则,增加判断维度
+2. 引入领域专家知识库
+3. 增强上下文理解能力,考虑技术方案的整体性
+
+### 性能问题
+**问题描述**:大规模专利分析时系统响应缓慢。
+
+**优化建议**:
+1. 优化数据库查询,添加必要索引
+2. 实现异步处理,避免阻塞主线程
+3. 采用缓存机制,减少重复计算
+
+### 数据一致性
+**问题描述**:不同模块间的数据存在不一致。
+
+**优化建议**:
+1. 建立统一的数据管理机制
+2. 实现数据变更的同步通知
+3. 定期进行数据一致性检查
+
+**Section sources**
+- [FTOCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java)
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java)

File diff suppressed because it is too large
+ 210 - 0
.qoder/repowiki/zh/content/业务逻辑层/FTO分析/FTO报告生成.md


File diff suppressed because it is too large
+ 261 - 0
.qoder/repowiki/zh/content/业务逻辑层/FTO分析/侵权比对管理.md


File diff suppressed because it is too large
+ 231 - 0
.qoder/repowiki/zh/content/业务逻辑层/FTO分析/权要分析.md


+ 254 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/专利导入.md

@@ -0,0 +1,254 @@
+# 专利导入
+
+<cite>
+**本文档引用文件**   
+- [ImportPatentImp.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportPatentImp.java)
+- [ImportFromWebToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromWebToEsService.java)
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [PatentImportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java)
+- [WebVOTransformService.java](file://src/main/java/cn/cslg/pas/service/importPatent/WebVOTransformService.java)
+- [ImportSinglePatentService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportSinglePatentService.java)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java)
+- [TaskExecutor.java](file://src/main/java/cn/cslg/pas/service/importPatent/TaskExecutor.java)
+- [PatentQueueService.java](file://src/main/java/cn/cslg/pas/service/importPatent/PatentQueueService.java)
+- [importTaskConfig.json](file://src/main/resources/jsons/importTaskConfig.json)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [专利数据导入流程](#专利数据导入流程)
+3. [工厂模式实现](#工厂模式实现)
+4. [任务调度与执行](#任务调度与执行)
+5. [数据转换服务](#数据转换服务)
+6. [单个专利导入](#单个专利导入)
+7. [API使用示例](#api使用示例)
+8. [异常处理与日志](#异常处理与日志)
+9. [常见问题与优化](#常见问题与优化)
+10. [结论](#结论)
+
+## 引言
+PAS系统的专利导入功能支持从多种来源(如Excel、Web API、PatentStar)导入专利数据。该功能通过工厂模式实现不同数据源的解耦和动态创建,确保系统的灵活性和可扩展性。导入任务的调度机制、任务执行器和专利队列服务协同工作,保证了任务的高效执行。此外,系统还提供了详细的异常日志记录和性能优化建议,帮助用户解决导入过程中遇到的问题。
+
+## 专利数据导入流程
+专利数据导入流程包括从Excel文件、Web API和PatentStar等不同来源获取数据,并将其转换为统一的格式存储到Elasticsearch中。整个流程分为以下几个步骤:
+1. **数据源识别**:根据任务类型识别数据来源。
+2. **数据获取**:从指定的数据源获取专利数据。
+3. **数据转换**:将获取的数据转换为系统内部使用的格式。
+4. **数据存储**:将转换后的数据存储到Elasticsearch中。
+
+### 数据源识别
+系统通过`importTaskConfig.json`配置文件中的`taskType`字段来识别不同的数据源。例如,`taskType`为1表示从Excel文件导入,`taskType`为2或3表示从Web API导入。
+
+### 数据获取
+对于Excel文件,系统使用`ImportFromExcelToEsService`类来读取文件内容。对于Web API,系统使用`ImportFromWebToEsService`类来调用API接口获取数据。
+
+### 数据转换
+数据转换由`WebVOTransformService`类负责,它将不同格式的数据转换为统一的`Patent`对象。
+
+### 数据存储
+转换后的数据通过`EsService`类存储到Elasticsearch中。
+
+**Section sources**
+- [importTaskConfig.json](file://src/main/resources/jsons/importTaskConfig.json#L1-L27)
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java#L1-L39)
+- [ImportFromWebToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromWebToEsService.java#L1-L352)
+
+## 工厂模式实现
+专利导入功能采用工厂模式来实现不同数据源的解耦和动态创建。`PatentImportFactory`类是核心工厂类,它根据任务类型返回相应的导入服务实例。
+
+```mermaid
+classDiagram
+class PatentImportFactory {
++Map<String, PatentImportImp> patentImportMap
++ApplicationContext applicationContext
++getClass(String shapeType) PatentImportImp
+}
+class ImportFromExcelToEsService {
++startPatentThread() Boolean
++setTaskThread(TaskThread taskThread) void
+}
+class ImportFromWebToEsService {
++startPatentThread() Boolean
++setTaskThread(TaskThread taskThread) void
+}
+class ImportPDFBatchService {
++startPatentThread() Boolean
++setTaskThread(TaskThread taskThread) void
+}
+PatentImportFactory --> ImportFromExcelToEsService : "creates"
+PatentImportFactory --> ImportFromWebToEsService : "creates"
+PatentImportFactory --> ImportPDFBatchService : "creates"
+```
+
+**Diagram sources**
+- [PatentImportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java#L1-L31)
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java#L1-L39)
+- [ImportFromWebToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromWebToEsService.java#L1-L352)
+- [ImportPDFBatchService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportPDFBatchService.java#L1-L20)
+
+**Section sources**
+- [PatentImportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java#L1-L31)
+
+## 任务调度与执行
+专利导入任务的调度机制由`SchedulingTaskService`(即`JobService`)负责,任务执行器由`TaskExecutor`类实现,专利队列服务由`PatentQueueService`类管理。
+
+### 调度机制
+`JobService`类使用Quartz框架来调度任务。通过`addJob`方法添加新的任务,并设置Cron表达式来定义任务的执行时间。
+
+### 任务执行器
+`TaskExecutor`类封装了线程池,用于异步执行导入任务。它通过`executeTask`方法提交任务到线程池中执行。
+
+### 专利队列服务
+`PatentQueueService`类维护了一个任务队列,当有新任务加入时,会唤醒等待的线程来处理任务。这确保了任务的有序执行。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant JobService as "JobService"
+participant TaskExecutor as "TaskExecutor"
+participant PatentQueueService as "PatentQueueService"
+Client->>JobService : 添加任务
+JobService->>TaskExecutor : 提交任务
+TaskExecutor->>PatentQueueService : 将任务加入队列
+PatentQueueService-->>TaskExecutor : 任务已加入
+TaskExecutor-->>JobService : 任务提交成功
+JobService-->>Client : 任务添加成功
+loop 处理任务
+PatentQueueService->>TaskExecutor : 取出任务
+TaskExecutor->>ImportService : 执行导入
+ImportService-->>TaskExecutor : 导入完成
+TaskExecutor-->>PatentQueueService : 标记任务完成
+end
+```
+
+**Diagram sources**
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L69-L106)
+- [TaskExecutor.java](file://src/main/java/cn/cslg/pas/service/importPatent/TaskExecutor.java#L1-L15)
+- [PatentQueueService.java](file://src/main/java/cn/cslg/pas/service/importPatent/PatentQueueService.java#L1-L43)
+
+**Section sources**
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L69-L106)
+- [TaskExecutor.java](file://src/main/java/cn/cslg/pas/service/importPatent/TaskExecutor.java#L1-L15)
+- [PatentQueueService.java](file://src/main/java/cn/cslg/pas/service/importPatent/PatentQueueService.java#L1-L43)
+
+## 数据转换服务
+`WebVOTransformService`类负责将从不同数据源获取的原始数据转换为系统内部使用的`Patent`对象。该服务支持中国专利和世界专利的转换。
+
+### 中国专利转换
+对于中国专利,`WebVOTransformService`类通过`loadCNPatent`方法将专利著录信息加载到`Patent`对象中。
+
+### 世界专利转换
+对于世界专利,`WebVOTransformService`类通过`loadWorldPatent`方法将专利著录信息加载到`Patent`对象中。
+
+```mermaid
+flowchart TD
+Start([开始]) --> LoadCNPatent["加载中国专利"]
+LoadCNPatent --> LoadWorldPatent["加载世界专利"]
+LoadWorldPatent --> TransformData["转换数据"]
+TransformData --> StoreData["存储数据"]
+StoreData --> End([结束])
+```
+
+**Diagram sources**
+- [WebVOTransformService.java](file://src/main/java/cn/cslg/pas/service/importPatent/WebVOTransformService.java#L1-L800)
+
+**Section sources**
+- [WebVOTransformService.java](file://src/main/java/cn/cslg/pas/service/importPatent/WebVOTransformService.java#L1-L800)
+
+## 单个专利导入
+`ImportSinglePatentService`类提供了单个专利导入的功能。用户可以通过API调用该服务来导入单个专利。
+
+### 导入流程
+1. **查询专利信息**:通过`getPatentFromWeb`方法从Web API获取专利信息。
+2. **创建专利对象**:使用`getPatentCataloguingFromWeb`方法创建`Patent`对象。
+3. **存储专利**:通过`EsService`类将`Patent`对象存储到Elasticsearch中。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant ImportSinglePatentService as "ImportSinglePatentService"
+participant PatentStarApiService as "PatentStarApiService"
+participant EsService as "EsService"
+Client->>ImportSinglePatentService : 请求导入专利
+ImportSinglePatentService->>PatentStarApiService : 查询专利信息
+PatentStarApiService-->>ImportSinglePatentService : 返回专利信息
+ImportSinglePatentService->>EsService : 存储专利
+EsService-->>ImportSinglePatentService : 存储成功
+ImportSinglePatentService-->>Client : 导入成功
+```
+
+**Diagram sources**
+- [ImportSinglePatentService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportSinglePatentService.java#L1-L648)
+
+**Section sources**
+- [ImportSinglePatentService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportSinglePatentService.java#L1-L648)
+
+## API使用示例
+以下是一些常用的API调用示例:
+
+### 从Excel导入
+```http
+POST /api/import/excel
+Content-Type: multipart/form-data
+
+file: excel文件
+```
+
+### 从Web API导入
+```http
+POST /api/import/web
+Content-Type: application/json
+
+{
+  "taskType": 2,
+  "searchCondition": "AN=(CN200820185104.4)"
+}
+```
+
+### 单个专利导入
+```http
+POST /api/import/single
+Content-Type: application/json
+
+{
+  "patentNo": "CN200820185104.4"
+}
+```
+
+**Section sources**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java#L1-L39)
+- [ImportFromWebToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromWebToEsService.java#L1-L352)
+- [ImportSinglePatentService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportSinglePatentService.java#L1-L648)
+
+## 异常处理与日志
+系统在导入过程中会记录详细的异常日志,以便于问题排查。`ImportTaskService`类负责记录导入任务的状态和错误信息。
+
+### 日志记录
+- **任务状态**:记录任务的开始、进行中和完成状态。
+- **错误信息**:记录导入过程中发生的错误,如网络超时、数据格式不兼容等。
+
+### 异常处理
+- **网络超时**:重试机制,最多重试3次。
+- **数据格式不兼容**:跳过该条数据,继续处理其他数据。
+
+**Section sources**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L210-L232)
+
+## 常见问题与优化
+### 常见问题
+- **导入失败**:检查网络连接和API接口是否正常。
+- **数据丢失**:确认数据源文件完整且格式正确。
+- **格式不兼容**:确保数据源文件符合系统要求的格式。
+- **网络超时**:增加超时时间或重试次数。
+
+### 性能优化
+- **批量导入**:尽量使用批量导入功能,减少API调用次数。
+- **并发处理**:利用多线程并发处理多个导入任务。
+- **错误重试机制**:实现自动重试机制,提高导入成功率。
+
+**Section sources**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L210-L232)
+- [AsyncTaskPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/AsyncTaskPoolConfig.java#L1-L54)
+
+## 结论
+PAS系统的专利导入功能通过工厂模式实现了不同数据源的解耦和动态创建,确保了系统的灵活性和可扩展性。任务调度机制、任务执行器和专利队列服务协同工作,保证了任务的高效执行。系统还提供了详细的异常日志记录和性能优化建议,帮助用户解决导入过程中遇到的问题。通过合理配置和使用这些功能,可以显著提高专利数据导入的效率和可靠性。

+ 380 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/从Excel导入专利.md

@@ -0,0 +1,380 @@
+# 从Excel导入专利
+
+<cite>
+**本文档引用的文件**   
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java)
+- [importTask.json](file://src/main/resources/jsons/importTask.json)
+- [uploadSetting.json](file://plugin/uploadSetting.json)
+</cite>
+
+## 目录
+1. [项目结构](#项目结构)
+2. [核心组件](#核心组件)
+3. [架构概述](#架构概述)
+4. [详细组件分析](#详细组件分析)
+5. [依赖分析](#依赖分析)
+6. [性能考虑](#性能考虑)
+7. [故障排除指南](#故障排除指南)
+8. [结论](#结论)
+
+## 项目结构
+
+该专利导入系统采用典型的Java Spring Boot架构,主要功能集中在`src/main/java/cn/cslg/pas/service/importPatent`包中。系统通过多线程并发处理Excel文件的专利数据和附图导入,实现了高效的数据处理能力。
+
+```mermaid
+graph TB
+subgraph "核心服务"
+ImportFromExcelToEsService["ImportFromExcelToEsService<br>主服务类"]
+GetPatentFromExcelThread["GetPatentFromExcelThread<br>专利数据读取线程"]
+GetPatentPictureFromExcelThread["GetPatentPictureFromExcelThread<br>附图读取线程"]
+SavePatentToEsThread["SavePatentToEsThread<br>数据保存线程"]
+end
+subgraph "工具类"
+ReadExcelUtils["ReadExcelUtils<br>Excel读取工具"]
+ExcelUtils["ExcelUtils<br>Excel通用工具"]
+UploadPatentBatchUtil["UploadPatentBatchUtil<br>批量上传工具"]
+end
+subgraph "配置文件"
+importTaskJson["importTask.json<br>任务配置"]
+uploadSettingJson["uploadSetting.json<br>字段映射配置"]
+end
+ImportFromExcelToEsService --> GetPatentFromExcelThread
+ImportFromExcelToEsService --> GetPatentPictureFromExcelThread
+ImportFromExcelToEsService --> SavePatentToEsThread
+GetPatentFromExcelThread --> ReadExcelUtils
+GetPatentPictureFromExcelThread --> ReadExcelUtils
+ReadExcelUtils --> ExcelUtils
+UploadPatentBatchUtil --> uploadSettingJson
+ReadExcelUtils --> importTaskJson
+```
+
+**图表来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java)
+- [importTask.json](file://src/main/resources/jsons/importTask.json)
+- [uploadSetting.json](file://plugin/uploadSetting.json)
+
+**章节来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+
+## 核心组件
+
+从Excel导入专利的核心组件包括`ImportFromExcelToEsService`、`GetPatentFromExcelThread`、`GetPatentPictureFromExcelThread`和`SavePatentToEsThread`。这些组件协同工作,实现并发处理专利数据和附图的导入。
+
+`ImportFromExcelToEsService`作为主服务类,负责启动和协调各个线程。它实现了`PatentImportImp`接口,通过`startPatentThread`方法启动专利导入流程。该服务创建三个并发线程:`GetPatentFromExcelThread`用于读取专利数据,`GetPatentPictureFromExcelThread`用于读取附图,`SavePatentToEsThread`用于将数据保存到Elasticsearch。
+
+`GetPatentFromExcelThread`和`GetPatentPictureFromExcelThread`都继承自`Thread`类,实现了多线程并发处理。它们通过`ReadExcelUtils`工具类读取Excel文件,分别处理专利数据和附图。两个线程之间通过共享的`uploadPatentWebDTOS`列表进行数据传递,实现了生产者-消费者模式。
+
+**章节来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+
+## 架构概述
+
+该系统的架构设计采用了多线程并发处理模式,通过生产者-消费者模型实现了高效的专利数据导入。系统架构分为三个主要层次:服务层、线程层和工具层。
+
+```mermaid
+sequenceDiagram
+participant ImportService as ImportFromExcelToEsService
+participant DataThread as GetPatentFromExcelThread
+participant PictureThread as GetPatentPictureFromExcelThread
+participant SaveThread as SavePatentToEsThread
+participant ReadUtils as ReadExcelUtils
+participant ExcelUtils as ExcelUtils
+ImportService->>ImportService : setTaskThread(taskThread)
+ImportService->>ImportService : startPatentThread()
+ImportService->>SaveThread : 创建并启动
+ImportService->>DataThread : 创建并启动
+ImportService->>PictureThread : 创建并启动
+DataThread->>ReadUtils : readExcelOneRow(tempFile, sheet, row)
+ReadUtils->>ExcelUtils : getValue(cell)
+ExcelUtils-->>ReadUtils : 返回单元格值
+ReadUtils-->>DataThread : 返回PatentData对象
+DataThread->>SaveThread : awakeTask(uploadPatentWebDTO)
+DataThread->>PictureThread : awakeTask(uploadPatentWebDTO)
+PictureThread->>ReadUtils : getPictures1/2(sheet, row)
+ReadUtils-->>PictureThread : 返回PictureData
+PictureThread->>SaveThread : 更新处理进度
+DataThread->>ImportService : 通知任务完成
+```
+
+**图表来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+
+**章节来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+
+## 详细组件分析
+
+### ImportFromExcelToEsService 分析
+
+`ImportFromExcelToEsService`是专利从Excel导入到Elasticsearch的主服务类,实现了`PatentImportImp`接口。该服务采用原型作用域(@Scope("prototype")),确保每次导入任务都有独立的实例。
+
+```mermaid
+classDiagram
+class ImportFromExcelToEsService {
+-taskThread TaskThread
++startPatentThread() Boolean
++setTaskThread(taskThread) void
+}
+class PatentImportImp {
+<<interface>>
++startImport(importTask) void
++setTaskThread(taskThread) void
+}
+class TaskThread {
++getImportTaskAMVO() ImportTaskAMVO
++getApplicationContext() ApplicationContext
++updateProcess(error, type, message) void
++awakeTaskThread() void
+}
+ImportFromExcelToEsService --> PatentImportImp : "实现"
+ImportFromExcelToEsService --> TaskThread : "依赖"
+ImportFromExcelToEsService --> GetPatentFromExcelThread : "创建"
+ImportFromExcelToEsService --> GetPatentPictureFromExcelThread : "创建"
+ImportFromExcelToEsService --> SavePatentToEsThread : "创建"
+```
+
+**图表来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+
+**章节来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+
+### GetPatentFromExcelThread 分析
+
+`GetPatentFromExcelThread`负责从Excel文件中读取专利数据,是多线程处理中的关键组件之一。该线程通过`ReadExcelUtils.readExcelOneRow`方法逐行读取Excel数据,并将解析后的数据传递给其他线程。
+
+```mermaid
+flowchart TD
+Start([开始]) --> CheckState{"任务状态是否为1?"}
+CheckState --> |是| ReadRow["读取Excel行数据<br>readExcelOneRow()"]
+ReadRow --> ProcessData["处理专利数据<br>loadPatent()"]
+ProcessData --> ValidateData["验证专利号<br>checkPatentNo()"]
+ValidateData --> |有效| SendToSave["唤醒SavePatentToEsThread<br>awakeTask()"]
+ValidateData --> |无效| LogError["记录错误日志"]
+SendToSave --> UpdateCounter["更新计数器"]
+UpdateCounter --> CheckMore{"还有更多数据?"}
+CheckMore --> |是| ReadRow
+CheckMore --> |否| NotifyComplete["通知任务完成"]
+NotifyComplete --> End([结束])
+CheckState --> |否| End
+```
+
+**图表来源**
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+
+**章节来源**
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+
+### GetPatentPictureFromExcelThread 分析
+
+`GetPatentPictureFromExcelThread`专门负责处理Excel文件中的专利附图,通过多线程并发提高处理效率。该线程使用ReentrantLock和Condition实现线程间的同步和通信。
+
+```mermaid
+sequenceDiagram
+participant PictureThread as GetPatentPictureFromExcelThread
+participant DataThread as GetPatentFromExcelThread
+participant SaveThread as SavePatentToEsThread
+participant FileManager as FileManagerService
+loop 持续处理
+PictureThread->>PictureThread : 检查uploadPatentWebDTOS是否为空
+alt 为空
+PictureThread->>PictureThread : 获取taskLock
+PictureThread->>PictureThread : taskCondition.await()
+PictureThread->>PictureThread : 释放taskLock
+else 不为空
+PictureThread->>PictureThread : 从队列获取uploadPatentWebDTO
+PictureThread->>PictureThread : 获取图片数据
+alt 有图片数据
+PictureThread->>PictureThread : 获取图片扩展名
+PictureThread->>PictureThread : 生成UUID文件名
+PictureThread->>PictureThread : 创建临时文件
+PictureThread->>FileManager : 上传文件到文件系统
+FileManager-->>PictureThread : 返回上传结果
+end
+PictureThread->>PictureThread : 更新处理进度
+end
+end
+PictureThread->>PictureThread : 唤醒任务线程
+PictureThread->>DataThread : 通知数据线程
+```
+
+**图表来源**
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+
+**章节来源**
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+
+### ExcelUtil 工具类分析
+
+`ExcelUtils`和`ReadExcelUtils`是处理Excel文件的核心工具类,提供了读取、解析和验证Excel文件的功能。这些工具类支持.xls和.xlsx两种格式,并能处理不同版本Excel的图片提取。
+
+```mermaid
+classDiagram
+class ExcelUtils {
++getDataFromExcel(filePath) Map~String, PictureData~
++getPictures1(sheet) Map~String, PictureData~
++getPictures2(sheet) Map~String, PictureData~
++writePicture(sheet, x, y, pictureData, picType) void
++getValue(cell) String
++setExcelCellStyle(cellStyle) void
+}
+class ReadExcelUtils {
++textExcel(tempFile, sourceId) Integer
++readExcelOneRow(tempFile, sheet, row) PatentData
++readExcel(tempFile) Sheet
++getPictures1(sheet, row) PictureData
++getPictures2(sheet, row) PictureData
++getValue(cell) String
++getPatentNoFromExcel(sheet) Map~String, String[]~
+}
+class UploadPatentBatchUtil {
++processData(row, jsonData) UploadParamsVO
++getColumn(jsonData, key) Column[]
++assemblyObject(uploadParamsVO, column, value) void
+}
+ReadExcelUtils --> ExcelUtils : "使用"
+UploadPatentBatchUtil --> uploadSettingJson : "读取配置"
+```
+
+**图表来源**
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java)
+- [uploadSetting.json](file://plugin/uploadSetting.json)
+
+**章节来源**
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java)
+
+## 依赖分析
+
+该系统的依赖关系清晰,主要依赖于Apache POI库处理Excel文件,Spring框架提供依赖注入和线程管理,以及Elasticsearch客户端进行数据存储。
+
+```mermaid
+graph TD
+ImportFromExcelToEsService --> GetPatentFromExcelThread
+ImportFromExcelToEsService --> GetPatentPictureFromExcelThread
+ImportFromExcelToEsService --> SavePatentToEsThread
+GetPatentFromExcelThread --> ReadExcelUtils
+GetPatentPictureFromExcelThread --> ReadExcelUtils
+ReadExcelUtils --> ExcelUtils
+ReadExcelUtils --> BusinessUtil
+ReadExcelUtils --> ThrowException
+UploadPatentBatchUtil --> DataProcessHandler
+UploadPatentBatchUtil --> StringSpecialHandler
+UploadPatentBatchUtil --> uploadSettingJson
+ImportFromExcelToEsService --> PatentImportImp
+TaskThread --> SchedulingTaskService
+TaskThread --> MessageService
+SavePatentToEsThread --> EsService
+SavePatentToEsThread --> FileManagerService
+SavePatentToEsThread --> PatentStarApiService
+```
+
+**图表来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java)
+- [uploadSetting.json](file://plugin/uploadSetting.json)
+
+**章节来源**
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java)
+- [GetPatentFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java)
+- [GetPatentPictureFromExcelThread.java](file://src/main/java/cn/cslg/pas/service/importPatent/GetPatentPictureFromExcelThread.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java)
+
+## 性能考虑
+
+该系统在设计时充分考虑了大数据量处理的性能问题,采用了多线程并发、分批处理和进度反馈等机制。
+
+1. **多线程并发处理**:系统使用三个独立线程分别处理专利数据、附图和数据保存,充分利用多核CPU的并行处理能力。
+
+2. **内存管理**:通过流式读取Excel文件,避免一次性加载整个文件到内存,减少内存占用。
+
+3. **进度反馈机制**:系统通过`patentProcess`对象实时更新导入进度,并通过WebSocket向客户端发送进度信息。
+
+4. **错误处理和恢复**:系统在处理过程中记录错误日志,即使部分数据处理失败,也能继续处理后续数据,保证导入任务的完整性。
+
+5. **配置化字段映射**:通过`importTask.json`和`uploadSetting.json`配置文件实现字段映射的灵活配置,无需修改代码即可适应不同Excel模板。
+
+## 故障排除指南
+
+### 常见问题及解决方案
+
+1. **文件编码错误**:
+   - 确保Excel文件保存为UTF-8编码
+   - 检查文件扩展名是否正确(.xls或.xlsx)
+   - 使用标准的Excel应用程序创建文件
+
+2. **列顺序错乱**:
+   - 确认Excel文件第一行包含正确的列标题
+   - 检查`uploadSetting.json`配置文件中的列映射是否正确
+   - 确保列标题与配置文件中的"setName"完全匹配
+
+3. **数据溢出**:
+   - 检查数值字段是否超出数据库定义的范围
+   - 验证日期格式是否符合"yyyy-MM-dd"标准
+   - 确认文本字段长度是否超过限制
+
+4. **附图提取失败**:
+   - 确认Excel文件中的图片格式是否支持
+   - 检查图片是否被正确嵌入而非链接
+   - 验证图片文件大小是否在系统限制范围内
+
+### 优化建议
+
+1. **使用SXSSF模型处理大文件**:对于超过10万行的大文件,建议使用POI的SXSSF模型,它采用流式处理方式,大大减少内存占用。
+
+2. **预校验机制**:在正式导入前,先进行数据格式和完整性的预校验,提前发现并报告问题。
+
+3. **断点续传功能**:记录已成功导入的专利号,在导入中断后可以从断点继续,避免重复导入。
+
+4. **批量提交优化**:将多个专利数据合并为一个批次提交到Elasticsearch,减少网络往返次数,提高导入效率。
+
+5. **索引优化**:在导入大量数据时,临时关闭Elasticsearch的刷新间隔和副本,导入完成后再恢复,可显著提高导入速度。
+
+## 结论
+
+该专利导入系统通过精心设计的多线程架构和高效的工具类,实现了从Excel文件批量导入专利数据的功能。系统采用生产者-消费者模式,将专利数据读取、附图提取和数据保存分离到不同的线程中并发执行,大大提高了处理效率。
+
+关键优势包括:
+- 支持.xls和.xlsx两种Excel格式
+- 并发处理专利数据和附图,提高导入速度
+- 灵活的字段映射配置,适应不同Excel模板
+- 完善的错误处理和进度反馈机制
+- 高效的内存管理和大数据量处理能力
+
+通过进一步优化,如实现断点续传、增强预校验机制和使用SXSSF模型处理超大文件,系统性能和用户体验可得到进一步提升。

File diff suppressed because it is too large
+ 199 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/从PatentStar导入专利.md


File diff suppressed because it is too large
+ 210 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入/从Web导入专利.md


+ 250 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导入导出.md

@@ -0,0 +1,250 @@
+# 专利导入导出
+
+<cite>
+**本文档引用的文件**
+- [ImportPatentImp.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportPatentImp.java)
+- [ImportFromWebToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromWebToEsService.java)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java)
+- [PatentExportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/PatentExportFactory.java)
+- [PatentImportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [ProjectExportService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectExportService.java)
+- [ExportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java)
+- [ExportController.java](file://src/main/java/cn/cslg/pas/controller/ExportController.java)
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+- [importTaskConfig.json](file://src/main/resources/jsons/importTaskConfig.json)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [专利导入功能](#专利导入功能)
+3. [专利导出功能](#专利导出功能)
+4. [工厂模式应用](#工厂模式应用)
+5. [导入任务调度与监控](#导入任务调度与监控)
+6. [API使用示例](#api使用示例)
+7. [数据转换与异常处理](#数据转换与异常处理)
+8. [常见问题与性能优化](#常见问题与性能优化)
+9. [结论](#结论)
+
+## 引言
+
+PAS系统的专利导入导出功能是系统核心功能之一,支持从多种数据源(如Excel、Web API、PatentStar)导入专利数据,并提供多种格式的导出能力。系统采用工厂模式实现不同数据源和格式的解耦,通过任务调度机制管理导入导出流程,确保数据处理的可靠性和可监控性。本文档将深入分析该功能的实现机制、架构设计和关键技术。
+
+## 专利导入功能
+
+专利导入功能支持从Excel文件、Web API和PatentStar等多种数据源导入专利数据。系统通过`ImportTaskService`管理导入任务的生命周期,包括任务创建、状态更新和进度监控。导入流程首先解析数据源,然后通过`ImportFromWebToEsService`或`ImportFromExcelToEsService`等服务将数据处理并存储到Elasticsearch中。
+
+导入功能支持多种导入类型,包括专利号导入、检索式导入和Excel文件导入。每种导入类型都有相应的处理逻辑和数据转换规则。系统还支持增量导入和全量导入两种模式,用户可以根据需求选择合适的导入策略。
+
+**Section sources**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L1-L733)
+- [ImportFromWebToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromWebToEsService.java#L1-L38)
+- [ImportFromExcelToEsService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java#L1-L38)
+
+## 专利导出功能
+
+专利导出功能由`PatentExportService`和`ProjectExportService`两个核心服务组成。`PatentExportService`负责单个专利或专利列表的导出,支持Excel和PDF格式;`ProjectExportService`则负责整个项目的导出,将项目相关的所有数据打包为可移植的格式。
+
+导出功能支持自定义字段选择,用户可以选择需要导出的专利信息字段。系统还支持批量导出和分页导出,以应对大规模数据导出的需求。导出过程中,系统会实时更新任务进度,并在完成后生成下载链接。
+
+```mermaid
+flowchart TD
+A[导出请求] --> B{导出类型}
+B --> |专利导出| C[PatentExportService]
+B --> |项目导出| D[ProjectExportService]
+C --> E[数据查询]
+D --> F[项目数据收集]
+E --> G[数据格式化]
+F --> G
+G --> H[文件生成]
+H --> I[任务状态更新]
+I --> J[生成下载链接]
+```
+
+**Diagram sources**
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L1-L29)
+- [ProjectExportService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectExportService.java#L1-L38)
+- [ExportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java#L30-L74)
+
+## 工厂模式应用
+
+系统采用工厂模式实现导入导出功能的解耦。`PatentImportFactory`和`PatentExportFactory`是两个核心工厂类,分别负责创建导入和导出服务的实例。
+
+`PatentImportFactory`根据导入任务类型(如Excel导入、Web API导入)返回相应的导入服务实现。工厂类通过读取`importTaskConfig.json`配置文件来确定不同类型任务对应的处理类,实现了配置驱动的工厂模式。
+
+`PatentExportFactory`则采用策略模式,为不同的数据字段提供相应的值获取策略。例如,专利类型字段需要特殊的格式化处理,而普通文本字段则直接返回原始值。这种设计使得系统可以灵活扩展新的字段类型和格式化规则。
+
+```mermaid
+classDiagram
+class PatentImportFactory {
++Map<String, PatentImportImp> patentImportMap
++ApplicationContext applicationContext
++getClass(String shapeType) PatentImportImp
+}
+class PatentExportFactory {
++Map<String, GetValueImp> getValueImpMap
++getClass(String sqlType) GetValueImp
+}
+class PatentImportImp {
+<<interface>>
++startPatentThread() Boolean
++setTaskThread(TaskThread) void
+}
+class GetValueImp {
+<<interface>>
++getValue(Object value) String
+}
+class ImportFromExcelToEsService {
++startPatentThread() Boolean
++setTaskThread(TaskThread) void
+}
+class ImportFromWebToEsService {
++startPatentThread() Boolean
++setTaskThread(TaskThread) void
+}
+class GetCommonValue {
++getValue(Object value) String
+}
+class GetPatentTypeValue {
++getValue(Object value) String
+}
+PatentImportFactory --> PatentImportImp : "创建"
+PatentExportFactory --> GetValueImp : "创建"
+PatentImportImp <|-- ImportFromExcelToEsService
+PatentImportImp <|-- ImportFromWebToEsService
+GetValueImp <|-- GetCommonValue
+GetValueImp <|-- GetPatentTypeValue
+```
+
+**Diagram sources**
+- [PatentImportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java#L1-L30)
+- [PatentExportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/PatentExportFactory.java#L1-L26)
+- [ImportPatentImp.java](file://src/main/java/cn/cslg/pas/service/importPatent/ImportPatentImp.java#L1-L19)
+
+## 导入任务调度与监控
+
+导入任务的调度和监控由`ImportTaskService`和`SchedulingTaskService`协同完成。`ImportTaskService`负责管理任务的创建、查询和状态更新,而`SchedulingTaskService`则负责任务的实际执行和进度跟踪。
+
+系统采用多线程机制处理导入任务,每个任务可以分解为多个子任务并行执行。任务进度通过`ImportTaskAMVO`对象进行跟踪,包括已完成数量、总数量和完成百分比等信息。用户可以通过API查询任务状态,系统也会在任务完成后发送通知。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant ImportTaskController as "ImportTaskController"
+participant ImportTaskService as "ImportTaskService"
+participant SchedulingTaskService as "SchedulingTaskService"
+Client->>ImportTaskController : 添加导入任务
+ImportTaskController->>ImportTaskService : addMessage()
+ImportTaskService->>ImportTaskService : 创建任务记录
+ImportTaskService->>SchedulingTaskService : startTask()
+SchedulingTaskService->>SchedulingTaskService : 启动导入线程
+loop 处理专利数据
+SchedulingTaskService->>SchedulingTaskService : 处理单个专利
+SchedulingTaskService->>ImportTaskService : 更新进度
+end
+SchedulingTaskService-->>ImportTaskService : 任务完成
+ImportTaskService-->>ImportTaskController : 返回任务ID
+ImportTaskController-->>Client : 返回响应
+```
+
+**Diagram sources**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L1-L733)
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L1-L80)
+- [SchedulingTaskService.java](file://src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java)
+
+## API使用示例
+
+专利导入导出功能通过RESTful API提供服务。以下是一些常用的API使用示例:
+
+1. **添加导入任务**:
+```http
+POST /api/importTask/addImportTask
+Content-Type: application/json
+
+{
+  "type": 1,
+  "searchCondition": "CN123456789A",
+  "projectId": 1001,
+  "importContent": 15
+}
+```
+
+2. **查询导入任务**:
+```http
+POST /api/importTask/queryImportTask
+Content-Type: application/json
+
+{
+  "projectId": 1001,
+  "current": 1,
+  "size": 10
+}
+```
+
+3. **导出专利到Excel**:
+```http
+POST /api/patent/exportPatentExcel
+Content-Type: application/json
+
+{
+  "projectId": 1001,
+  "selected": [
+    {"value": "patentNo", "name": "专利号", "selected": true},
+    {"value": "title", "name": "标题", "selected": true}
+  ]
+}
+```
+
+4. **查询导出任务状态**:
+```http
+GET /api/importTask/queryImportTask?projectId=1001
+```
+
+**Section sources**
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L1-L80)
+- [ExportController.java](file://src/main/java/cn/cslg/pas/controller/ExportController.java#L32-L53)
+- [PatentController.java](file://src/main/java/cn/cslg/pas/controller/PatentController.java#L244-L272)
+
+## 数据转换与异常处理
+
+在导入导出过程中,系统需要进行复杂的数据转换和格式映射。`WebVOTransformService`负责将Web API返回的原始数据转换为系统内部的专利模型,处理字段映射、数据清洗和格式标准化。
+
+异常处理机制包括日志记录、错误分类和用户通知。系统使用`PatentImportErrorLogService`记录导入过程中的错误信息,包括错误类型、错误详情和发生时间。对于可恢复的错误,系统会尝试重试;对于不可恢复的错误,则会标记任务为失败并通知用户。
+
+数据转换过程中还涉及字符编码处理、特殊字符过滤和数据验证。系统采用统一的异常处理框架,确保所有异常都能被正确捕获和处理,避免因单个数据项的错误导致整个导入任务失败。
+
+**Section sources**
+- [WebVOTransformService.java](file://src/main/java/cn/cslg/pas/service/importPatent/WebVOTransformService.java#L1-L38)
+- [PatentImportErrorLogService.java](file://src/main/java/cn/cslg/pas/service/business/PatentImportErrorLogService.java)
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L732-L733)
+
+## 常见问题与性能优化
+
+### 常见问题
+
+1. **导入失败**:可能由于数据格式不正确、网络连接问题或系统资源不足导致。解决方案包括检查数据源格式、确保网络稳定和增加系统资源。
+
+2. **数据丢失**:在大规模导入时可能出现部分数据未成功导入的情况。建议启用事务处理和数据校验机制,确保数据完整性。
+
+3. **格式不兼容**:不同数据源的字段格式可能存在差异。系统应提供灵活的字段映射配置,支持自定义格式转换规则。
+
+### 性能优化建议
+
+1. **批量处理**:采用批量插入而非单条插入,显著提高数据导入效率。
+
+2. **并行处理**:利用多线程技术并行处理多个专利数据,充分利用系统资源。
+
+3. **缓存机制**:对频繁访问的数据(如专利号、申请人信息)使用缓存,减少数据库查询次数。
+
+4. **索引优化**:为Elasticsearch中的关键字段创建合适的索引,提高查询性能。
+
+5. **内存管理**:合理设置JVM内存参数,避免因内存不足导致的性能下降。
+
+**Section sources**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L1-L733)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L1-L29)
+- [EsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsService.java)
+
+## 结论
+
+PAS系统的专利导入导出功能通过工厂模式实现了良好的解耦和扩展性,支持多种数据源和导出格式。系统采用任务调度机制确保导入导出过程的可靠性和可监控性,通过多线程和批量处理技术优化性能。未来可以进一步增强数据校验机制,提供更详细的错误诊断信息,并支持更多数据源格式,以满足用户不断增长的需求。

+ 274 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/专利导出.md

@@ -0,0 +1,274 @@
+# 专利导出
+
+<cite>
+**本文档引用的文件**
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java)
+- [ExportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java)
+- [PatentExportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/PatentExportFactory.java)
+- [GetValueImp.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetValueImp.java)
+- [SavePatentToEsService.java](file://src/main/java/cn/cslg/pas/service/exportProject/SavePatentToEsService.java)
+- [ImportFromFileToEsService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ImportFromFileToEsService.java)
+- [ImportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ImportProjectService.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/service/exportProject/Constants.java)
+</c>
+
+## 目录
+1. [引言](#引言)
+2. [专利导出服务实现机制](#专利导出服务实现机制)
+3. [项目级导出服务](#项目级导出服务)
+4. [工厂模式与字段值获取策略](#工厂模式与字段值获取策略)
+5. [数据准备与处理服务](#数据准备与处理服务)
+6. [导入导出应用服务](#导入导出应用服务)
+7. [导出常量定义](#导出常量定义)
+8. [API执行示例](#api执行示例)
+9. [关键技术分析](#关键技术分析)
+10. [常见问题与优化建议](#常见问题与优化建议)
+11. [结论](#结论)
+
+## 引言
+本文档深入分析PAS系统专利导出功能的详细实现。重点阐述PatentExportService的实现机制,包括如何根据用户选择的字段和格式(如Excel、PDF)生成导出文件。同时剖析ExportProjectService在项目级导出中的作用,以及PatentExportFactory工厂模式如何支持多种导出格式和模板的解耦。文档还详细说明了数据准备、处理和导入导出的相关服务及常量定义。
+
+## 专利导出服务实现机制
+PatentExportService是PAS系统中负责专利导出的核心服务类,主要功能是根据用户选择的字段和格式生成导出文件。该服务通过异步处理方式实现,确保导出操作不会阻塞主线程。
+
+服务首先接收ExportTaskDTO对象,该对象包含了导出任务的所有必要信息,包括项目ID、创建者ID、任务ID以及要导出的字段信息。通过EsCustomFieldBatchVO获取用户选择的字段,然后过滤出被选中的字段用于后续处理。
+
+导出过程采用Apache POI库生成Excel文件。服务创建HSSFWorkbook工作簿和HSSFSheet工作表,并设置默认列宽。为表头行创建特殊的单元格样式,包括居中对齐、背景色(天蓝色)和自动换行等。然后遍历用户选择的字段名称,将其作为表头填充到第一行。
+
+数据获取方面,服务通过pdfExportFirstPageService.getPatentNo()方法获取专利号列表,然后逐个查询专利详细信息。对于每个专利,服务会查询其自定义字段数据,并根据字段类型进行不同的处理。系统字段通过反射获取属性值,而自定义字段则从ES查询结果中提取。
+
+在填充数据时,服务为每一行创建HSSFRow对象,并为每个字段创建HSSFCell对象。普通单元格采用顶部对齐和自动换行的样式。数据填充完成后,将工作簿写入ByteArrayOutputStream,然后通过parseByteToFileUtils.uploadFile()方法上传文件并获取文件GUID。
+
+整个导出过程通过WebSocket实时通知前端进度,使用WebSocketMessageVO对象发送当前处理进度。导出完成后,更新导出任务状态,并发送完成通知。
+
+**Section sources**
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L66-L731)
+
+## 项目级导出服务
+ExportProjectService负责处理整个项目的专利数据导出,实现项目级数据的完整迁移和备份。该服务不仅导出专利数据,还包括项目配置、自定义字段、文件夹结构等完整项目信息。
+
+服务的核心方法exportProject()首先生成一个唯一的目录名称,用于存放导出的文件。然后依次执行以下步骤:将项目对象写入文件、从ES获取专利数据、获取自定义字段信息、获取自定义字段标签,并最终将所有文件打包成ZIP压缩包。
+
+writeProjectToFile()方法负责将项目基本信息序列化为JSON文件。该方法通过patentProjectService.getPatentProjectVOById()获取完整的项目视图对象,然后使用ObjectOutputStream将其写入project.json文件。
+
+getPatentsFromEs()方法实现分页查询专利数据。由于项目可能包含大量专利,该方法采用分页机制,每次查询10条记录,直到获取所有专利数据。查询结果被分割成多个JSON文件(patent0.json、patent1.json等),避免单个文件过大。
+
+getCustomFiled()方法获取项目的所有自定义字段。对于每种类型的自定义字段(文本、选项、树形结构等),服务会调用相应的方法获取其值。例如,对于选项类型的字段,会通过getOptionValues()获取所有选项值;对于树形结构字段,则通过getTreeValues()获取树节点。
+
+getCustomFiledLabel()方法专门处理自定义字段的标签数据。该方法对每个自定义字段进行分页查询,获取与该字段关联的所有专利标签,并将结果保存为单独的JSON文件。
+
+最后,服务使用ZipUtil.zip()方法将整个目录打包成ZIP文件,实现项目数据的一键导出。
+
+**Section sources**
+- [ExportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java#L47-L296)
+
+## 工厂模式与字段值获取策略
+PatentExportFactory采用工厂模式实现多种导出格式和模板的解耦,通过GetValueImp接口定义字段值获取策略,实现了灵活的字段值处理机制。
+
+工厂模式的核心是PatentExportFactory类,它维护了一个映射关系,将不同的字段类型映射到相应的值获取实现类。通过getClass()方法,可以根据配置的类名获取对应的GetValueImp实例。这种设计实现了创建逻辑与使用逻辑的分离,使得新增字段类型处理变得简单而无需修改现有代码。
+
+GetValueImp是一个函数式接口,定义了getValue()方法,用于获取字段的实际显示值。不同的字段类型有不同的实现策略:
+
+- GetCommonValue:处理普通文本字段,直接返回字符串值
+- GetDateValue:处理日期字段,将日期对象格式化为指定格式的字符串
+- GetClassifyValue:处理分类号字段,将分类号对象转换为标准格式的字符串
+- GetNameValue:处理名称字段,可能涉及申请人、发明人等实体的名称处理
+- GetPatentTypeValue:处理专利类型字段,将内部编码转换为可读的专利类型名称
+- GetSimpleStatusValue:处理简单法律状态字段,将状态编码转换为"有效"、"审中"、"失效"等可读状态
+- GetTextContentValue:处理文本内容字段,可能涉及摘要、权利要求等长文本的处理
+
+这些实现类通过策略模式被PatentExportService调用。在导出过程中,服务从patent.json配置文件中读取每个字段的exportClass属性,然后通过PatentExportFactory获取对应的GetValueImp实例,最后调用其getValue()方法获取格式化后的值。
+
+这种设计的优势在于:
+1. 扩展性:新增字段类型只需添加新的GetValueImp实现类,无需修改核心导出逻辑
+2. 维护性:每种字段类型的处理逻辑独立,便于维护和测试
+3. 灵活性:通过配置文件即可改变字段的显示格式,无需重新编译代码
+4. 解耦:导出服务与具体字段处理逻辑完全分离,降低了代码耦合度
+
+**Section sources**
+- [PatentExportFactory.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/PatentExportFactory.java#L1-L100)
+- [GetValueImp.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetValueImp.java#L1-L10)
+- [GetCommonValue.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetCommonValue.java#L1-L20)
+- [GetDateValue.java](file://src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetDateValue.java#L1-L20)
+
+## 数据准备与处理服务
+SavePatentToEsService和ImportFromFileToEsService在导出数据准备和处理中扮演关键角色,负责将专利数据正确地存储到Elasticsearch中,确保导出数据的完整性和一致性。
+
+SavePatentToEsService的主要职责是将专利数据保存到ES中,并处理相关的关联关系。服务首先根据专利号查询是否存在该专利,如果存在则更新现有记录,否则创建新记录。对于新创建的专利,服务会设置适当的PatentJoin关系,标识其为"patent"类型。
+
+当专利与特定项目关联时(通过projectId参数),服务会检查该专利是否已在项目中。如果不在项目中,服务会创建一个子专利记录,设置PatentJoin的parent为原始专利ID,name为"project",并关联到指定项目。这种父子文档结构实现了专利在不同项目间的复用。
+
+对于自定义字段,服务会遍历提供的EsCustomFieldDTO列表,为每个自定义字段设置专利ID、选项类型和专利号,然后通过esCustomFieldService.addCustomField()方法保存到ES中。这种设计确保了导出时能够获取到完整的自定义字段数据。
+
+ImportFromFileToEsService则负责从文件导入专利数据的复杂处理。服务提供了loadPatent()方法,将旧系统格式的专利数据转换为新系统的Patent对象。转换过程包括:
+- 专利号处理:根据申请号、公开号、授权号的优先级确定最终专利号
+- 文本内容处理:分别处理标题、说明书、摘要等文本内容,设置语言和来源标志
+- 人员信息处理:分别处理申请人、权利人、发明人等人员信息,以及对应的地址信息
+- 分类号处理:使用PatentClassifySplitter工具类解析IPC、CPC、UPC、LOC等分类号
+- 法律状态处理:将"有效"、"审中"、"失效"等状态转换为内部编码
+- 专利类型处理:将"授权发明"、"发明申请"、"实用新型"、"外观设计"等类型转换为内部编码
+- 权利要求处理:合并所有权利要求内容为一个文本字段
+
+此外,服务还提供了savePatentPicture()和savePatentPDF()方法,用于处理专利附图和PDF文件的上传,确保导出时能够包含完整的专利文档。
+
+**Section sources**
+- [SavePatentToEsService.java](file://src/main/java/cn/cslg/pas/service/exportProject/SavePatentToEsService.java#L22-L88)
+- [ImportFromFileToEsService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ImportFromFileToEsService.java#L38-L672)
+
+## 导入导出应用服务
+ImportProjectService在项目数据导入导出中发挥核心作用,实现了项目级数据的完整迁移。该服务整合了多个子服务,提供了一站式的项目导入解决方案。
+
+服务的核心方法getFileFromZip()负责处理ZIP格式的项目文件。该方法首先解压文件,然后依次导入项目基本信息、分享信息、自定义字段、文件夹结构和专利数据。整个导入过程在一个事务中执行,确保数据的一致性。
+
+项目基本信息导入通过ImportProject()方法实现。该方法读取project.json文件,解析为OldProject对象,然后通过loadPatentProjectDTO()方法将其转换为PatentProjectDTO对象。转换过程中会处理各种字段的映射,如委托方ID、负责人ID、部门ID、合同号、卷号、委案日等。转换完成后,调用patentProjectService.addMessage()保存项目信息,并返回新创建的项目ID。
+
+分享信息导入通过ImportProjectShareMessage()方法实现。该方法读取project-user.json文件,解析为OldProjectUser对象列表,然后转换为AssoProjectPerson对象并批量保存。转换过程中会根据用户类型(2为普通成员,其他为管理员)设置相应的角色权限。
+
+专利数据导入是整个服务最复杂的部分。对于每个专利文件夹,服务会:
+1. 读取patent.json文件,解析为OldPatentDTO对象
+2. 调用importFromFileToEsService.loadPatent()将旧格式数据转换为Patent对象
+3. 读取folder-link.json和labels.json文件,获取文件夹和标签关联信息
+4. 读取patent-field-link.json文件,获取自定义字段关联信息
+5. 调用importFromFileToEsService.getEsCustomField()方法生成EsCustomFieldDTO列表
+6. 创建UploadPatentWebDTO对象,包含专利数据和自定义字段数据
+7. 调用savePatentToEsService.savePatentToEs()保存专利到ES
+8. 调用importFromFileToEsService.savePatentPicture()和savePatentPDF()保存专利附图和PDF文件
+
+这种分层的设计使得项目导入过程清晰而可靠,每个步骤都有明确的职责,便于错误处理和日志记录。
+
+**Section sources**
+- [ImportProjectService.java](file://src/main/java/cn/cslg/pas/service/exportProject/ImportProjectService.java#L39-L264)
+
+## 导出常量定义
+Constants类中定义了专利导出相关的常量,为系统提供了统一的配置和标识。这些常量分为两个主要部分:基础常量和导出项目常量。
+
+基础常量(位于cn.cslg.pas.common.core.base.Constants)包括:
+- 任务类型常量:TASK_EXPORT_PATENT(值为2)标识专利导出任务
+- 系统字段类型常量:SYSTEM_FIELD_EXPORT(值为"export")标识导出相关的字段
+- 专利类型常量:PATENT_TYPE(值为"PATENT_TYPE")用于字典查询
+- 简单法律状态常量:PATENT_SIMPLE_STATUS(值为"PATENT_SIMPLE_STATUS")用于状态映射
+- 日期位移值:DATE_OFFSET映射表,用于处理"月"、"季"、"半年"、"年"等时间周期的计算
+
+导出项目常量(位于cn.cslg.pas.service.exportProject.Constants)主要定义了项目导出导入过程中使用的文件名常量:
+- PROJECT_INFO_FILE_NAME:"project.json" - 项目基本信息文件
+- PROJECT_FILE_DIRECTORY_NAME:"project-file" - 项目附件目录
+- PROJECT_USER:"project-user.json" - 项目用户信息文件
+- PROJECT_FIELD_FILE_NAME:"project-field.json" - 自定义字段定义文件
+- PROJECT_FIELD_OPTION_FILE_NAME:"project-field-option.json" - 自定义字段选项文件
+- PROJECT_FIELD_TREE_FILE_NAME:"project-field-tree.json" - 自定义字段树形结构文件
+- PROJECT_FIELD_TEXT_FILE_NAME:"project-field-text.json" - 自定义字段文本值文件
+- PROJECT_FOLDER_JSON:"project-folder.json" - 项目文件夹结构文件
+- PATENT_FIELD_LINK:"patent-field-link.json" - 专利与自定义字段关联文件
+- PATENT_FOLDER_LINK:"folder-link.json" - 专利与文件夹关联文件
+- PATENT_JSON:"patent.json" - 专利数据文件
+- LABELS_JSON:"labels.json" - 专利标签文件
+- PATENT_IMAGE:"image" - 专利附图目录
+- PATENT_PDF:"pdf" - 专利PDF文件目录
+
+这些常量的使用确保了项目导出导入过程中文件命名的一致性,避免了硬编码带来的维护困难。通过集中管理这些常量,系统可以轻松适应文件结构的变化,只需修改常量定义而无需修改业务逻辑代码。
+
+**Section sources**
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L1-L149)
+- [Constants.java](file://src/main/java/cn/cslg/pas/service/exportProject/Constants.java#L1-L19)
+
+## API执行示例
+通过API执行专利导出任务的典型流程如下:
+
+1. 前端构建导出请求参数,包括项目ID、创建者ID、任务ID和要导出的字段信息
+2. 将字段信息封装在EsCustomFieldBatchVO对象中,包含selected字段列表和isDelete/isAdd专利号列表
+3. 创建ExportTaskDTO对象,设置projectId、createId、taskId和esVO属性
+4. 调用PatentExportService.exportPatent2()方法执行异步导出
+
+```mermaid
+sequenceDiagram
+participant 前端 as 前端应用
+participant 控制器 as ExportController
+participant 服务 as PatentExportService
+participant ES as Elasticsearch
+participant 文件存储 as 文件存储系统
+前端->>控制器 : POST /api/xiaoshi/export/exportPatent
+控制器->>控制器 : 验证请求参数
+控制器->>服务 : 调用exportPatent2()
+服务->>服务 : 解析导出字段配置
+服务->>ES : 分页查询专利数据
+ES-->>服务 : 返回专利列表
+服务->>ES : 查询自定义字段数据
+ES-->>服务 : 返回自定义字段
+服务->>服务 : 生成Excel工作簿
+服务->>服务 : 填充表头和数据
+服务->>文件存储 : 上传生成的文件
+文件存储-->>服务 : 返回文件GUID
+服务->>控制器 : 更新导出任务状态
+控制器->>前端 : 返回成功响应
+服务->>前端 : 通过WebSocket发送进度更新
+```
+
+**Diagram sources**
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L391-L575)
+- [ExportController.java](file://src/main/java/cn/cslg/pas/controller/ExportController.java#L20-L54)
+
+## 关键技术分析
+专利导出功能涉及多项关键技术,包括数据聚合、格式转换和文件生成等。
+
+数据聚合方面,系统采用分页查询策略避免内存溢出。通过EsPatentCommonVO设置startNum和endNum参数,实现指定范围的专利查询。对于大量数据,服务采用while循环分批处理,每次处理10条记录,确保系统稳定性。
+
+格式转换方面,系统通过工厂模式实现灵活的字段值处理。每种字段类型都有对应的GetValueImp实现,能够将内部数据格式转换为适合显示的格式。例如,日期字段被格式化为"yyyy-MM-dd"格式,专利类型被转换为中文名称,法律状态被转换为"有效"、"审中"、"失效"等可读状态。
+
+文件生成方面,系统使用Apache POI库生成Excel文件。通过HSSFWorkbook和HSSFSheet创建工作簿和工作表,设置列宽和行高。为表头和普通单元格分别创建样式,包括字体、对齐方式、背景色和自动换行等。数据填充时采用流式处理,逐行写入数据,避免一次性加载所有数据到内存。
+
+异步处理是另一个关键技术。通过@Async注解,导出操作在独立线程中执行,不会阻塞主线程。同时,通过WebSocket实时通知前端导出进度,提升用户体验。导出完成后,通过回调机制更新任务状态并通知用户。
+
+内存管理方面,系统使用ByteArrayOutputStream作为临时存储,避免直接操作大文件。通过try-with-resources确保资源正确释放,防止内存泄漏。对于大文件导出,系统采用分块处理策略,只在内存中保留当前处理的数据块。
+
+## 常见问题与优化建议
+### 常见问题
+1. **导出文件过大**:当导出大量专利时,生成的Excel文件可能超过Excel的行数限制(1048576行)或文件大小限制
+2. **格式错乱**:特殊字符、长文本或公式可能导致Excel格式异常
+3. **数据缺失**:某些字段可能因权限或数据源问题而缺失
+4. **性能低下**:大量数据导出可能导致系统响应缓慢
+5. **内存溢出**:一次性加载所有数据到内存可能导致OutOfMemoryError
+
+### 优化建议
+1. **分页导出**:对于大量数据,建议分批导出,每次导出固定数量的专利(如10000条),生成多个文件
+```java
+// 示例:分页导出配置
+esVO.setStartNumber(page * pageSize);
+esVO.setEndNumber((page + 1) * pageSize);
+```
+
+2. **异步处理**:保持现有的异步处理机制,避免阻塞主线程。可以增加任务队列,限制并发导出任务数量。
+
+3. **内存管理**:
+   - 使用流式API处理大数据
+   - 及时释放不再使用的对象引用
+   - 采用对象池技术复用HSSFCellStyle等昂贵对象
+
+4. **文件格式优化**:
+   - 对于超大数据量,考虑导出为CSV格式而非Excel
+   - 使用SXSSFWorkbook替代HSSFWorkbook处理大数据
+   - 压缩生成的文件
+
+5. **缓存机制**:
+   - 缓存常用的配置数据(如patent.json)
+   - 缓存频繁查询的专利数据
+   - 使用Redis缓存导出任务状态
+
+6. **错误处理**:
+   - 添加详细的日志记录
+   - 实现断点续传功能
+   - 提供导出失败的重试机制
+
+7. **用户体验**:
+   - 提供导出进度条
+   - 支持后台导出,完成后邮件通知
+   - 允许用户选择导出字段和格式
+
+## 结论
+PAS系统的专利导出功能通过精心设计的架构和实现,提供了强大而灵活的数据导出能力。PatentExportService作为核心服务,实现了基于用户选择的字段和格式的专利数据导出。ExportProjectService则提供了项目级的完整数据迁移方案。
+
+工厂模式的应用使得系统能够轻松支持多种导出格式和模板,通过GetValueImp接口的多种实现,实现了字段值获取策略的解耦。SavePatentToEsService和ImportFromFileToEsService确保了导出数据的完整性和一致性,而ImportProjectService则实现了项目数据的一站式导入导出。
+
+通过分页查询、异步处理、WebSocket实时通知等技术,系统在保证功能完整性的同时,也考虑了性能和用户体验。合理的常量定义和模块化设计使得系统易于维护和扩展。
+
+未来可以考虑增加更多导出格式支持(如PDF、CSV)、优化大数据导出性能、增强错误处理和恢复机制,进一步提升系统的可用性和可靠性。

File diff suppressed because it is too large
+ 244 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/单个专利导出.md


File diff suppressed because it is too large
+ 251 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/导出格式与模板.md


File diff suppressed because it is too large
+ 265 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/专利导出/项目级导出.md


+ 453 - 0
.qoder/repowiki/zh/content/业务逻辑层/专利导入导出/导入导出公共机制.md

@@ -0,0 +1,453 @@
+# 导入导出公共机制
+
+<cite>
+**本文档引用的文件**  
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java)
+- [ImportTask.java](file://src/main/java/cn/cslg/pas/domain/business/ImportTask.java)
+- [ImportTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ImportTaskMapper.java)
+- [ImportTaskMapper.xml](file://src/main/resources/mapper/ImportTaskMapper.xml)
+- [importTask.json](file://src/main/resources/jsons/importTask.json)
+- [ImportTaskVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/ImportTaskVO.java)
+- [ExportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExportTaskDTO.java)
+- [PatentExportParams.java](file://src/main/java/cn/cslg/pas/common/dto/PatentExport/PatentExportParams.java)
+- [PatentExportVO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentExport/PatentExportVO.java)
+- [TaskParams.java](file://src/main/java/cn/cslg/pas/common/dto/PatentExport/TaskParams.java)
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java)
+</cite>
+
+## 目录
+1. [导入导出公共机制概述](#导入导出公共机制概述)
+2. [ImportTaskService任务生命周期管理](#importtaskservice任务生命周期管理)
+3. [ImportTask领域模型设计](#importtask领域模型设计)
+4. [ImportTaskMapper数据访问层](#importtaskmapper数据访问层)
+5. [导入导出参数传递与结果返回DTO](#导入导出参数传递与结果返回dto)
+6. [异步处理机制](#异步处理机制)
+7. [任务状态查询与结果处理](#任务状态查询与结果处理)
+8. [常见问题与解决方案](#常见问题与解决方案)
+9. [监控与调试建议](#监控与调试建议)
+
+## 导入导出公共机制概述
+
+PAS系统通过统一的导入导出公共机制,实现了专利数据的高效导入和导出功能。该机制以ImportTaskService为核心,通过任务驱动的方式管理所有导入导出操作的生命周期。系统采用异步处理模式,确保用户界面的响应性和用户体验。导入导出操作包括从Excel文件、专利号列表、检索式等多种方式导入专利数据,以及将专利数据导出为Excel或PDF格式。
+
+**导入导出公共机制的核心特点:**
+- 统一的任务管理框架
+- 支持多种导入导出方式
+- 异步处理提高系统响应性
+- 完整的任务状态跟踪
+- 详细的进度监控和结果记录
+
+## ImportTaskService任务生命周期管理
+
+ImportTaskService是导入导出公共机制的核心服务类,负责统一管理导入导出任务的完整生命周期。该服务实现了任务的创建、状态更新、进度监控和结果记录等关键功能。
+
+### 任务创建
+
+ImportTaskService通过`addMessage`方法处理导入任务的创建。该方法接收ImportTaskDTO对象作为参数,验证输入参数后,创建ImportTaskCondition对象存储任务条件,然后创建ImportTask对象并插入数据库。任务创建过程中会根据任务类型计算总数量,并设置初始进度为0。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "ImportTaskController"
+participant Service as "ImportTaskService"
+participant Mapper as "ImportTaskMapper"
+participant DB as "数据库"
+Client->>Controller : POST /addImportTask
+Controller->>Service : addMessage(importTaskDTO)
+Service->>Service : 验证参数
+Service->>Service : 创建ImportTaskCondition
+Service->>Service : 计算总数量
+Service->>Service : 创建ImportTask
+Service->>Mapper : insert(ImportTask)
+Mapper->>DB : 插入任务记录
+DB-->>Mapper : 返回
+Mapper-->>Service : 返回
+Service-->>Controller : 返回任务ID
+Controller-->>Client : 返回响应
+```
+
+**图示来源**
+- [ImportTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskService.java#L136-L263)
+- [ImportTaskController.java](file://src/main/java/cn/cslg/pas/controller/ImportTaskController.java#L42-L53)
+
+### 状态更新
+
+ImportTaskService提供`updateImportTaskState`方法用于更新任务状态。该方法接收任务ID和新状态作为参数,更新数据库中的任务状态,并根据状态变化触发相应的调度操作。当任务状态变为暂停或失败时,会调用SchedulingTaskService的pauseTask方法;当任务状态变为运行时,会调用startTask方法。
+
+### 进度监控
+
+ImportTaskService通过`loadImportTask`方法实现进度监控功能。该方法从SchedulingTaskService获取正在进行中的任务进度信息,并计算任务完成百分比。进度信息包括已完成数量、总数量和完成百分比,这些信息在查询任务列表时返回给前端。
+
+### 结果记录
+
+任务执行完成后,ImportTaskService会更新任务的完成时间、失败条数等结果信息。对于导出任务,还会记录生成文件的GUID,以便用户下载。
+
+## ImportTask领域模型设计
+
+ImportTask领域模型是导入导出公共机制的核心数据结构,定义了任务的关键属性和行为。
+
+### 任务类型
+
+ImportTask模型通过type字段定义任务类型,支持多种导入导出方式:
+- 1: Excel导入
+- 2: 专利号导入
+- 3: 专利号文件导入
+- 4: 检索导入
+- 5: PDF文档导入
+- 6: Excel导出
+- 7: PDF首页导出
+
+### 任务状态
+
+任务状态通过state字段表示,包括:
+- 0: 运行中
+- 1: 已完成
+- 2: 失败
+- 3: 已取消
+- 4: 暂停
+- 5: 手动暂停
+
+### 进度信息
+
+ImportTask模型包含详细的进度信息字段:
+- allNum: 总数量
+- doneNum: 已完成数量
+- defaultNum: 失败数量
+- progress: 进度百分比
+
+### 与importTask.json配置文件的映射关系
+
+importTask.json配置文件定义了任务管理界面的显示字段和查询条件。ImportTask模型的字段与配置文件中的字段一一对应:
+
+```mermaid
+classDiagram
+class ImportTask {
++String searchCondition
++String name
++Integer allNum
++Double progress
++Integer defaultNum
++Integer importTaskConditionId
++Integer type
++Integer state
++Date finishTime
++String createId
++Date createTime
++Integer doneNum
++String remark
++Date updateToDate
++Date lastUpdateToDate
++Boolean ifCreateBySys
+}
+class importTaskJson {
++String name
++String type
++String value
++String field
++String sqlField
++String sqlClass
++String orderClass
++String groupClass
++Boolean ifSearch
++Boolean ifGroup
++Boolean ifShow
++Boolean ifAsCondition
+}
+ImportTask --> importTaskJson : "字段映射"
+```
+
+**图示来源**
+- [ImportTask.java](file://src/main/java/cn/cslg/pas/domain/business/ImportTask.java#L18-L106)
+- [importTask.json](file://src/main/resources/jsons/importTask.json#L1-L199)
+
+## ImportTaskMapper数据访问层
+
+ImportTaskMapper是数据访问层接口,负责与数据库交互,支持任务的CRUD操作。
+
+### 接口定义
+
+ImportTaskMapper继承自MyBatis-Plus的BaseMapper,提供基本的CRUD功能,并定义了两个自定义方法:
+- getImportTask: 根据SQL条件查询任务列表
+- getImportTaskCount: 查询任务总数
+
+### SQL映射
+
+ImportTaskMapper.xml文件定义了SQL映射,使用MyBatis的动态SQL功能构建查询语句:
+
+```xml
+<select id="getImportTask" resultType="cn.cslg.pas.common.vo.business.ImportTaskVO">
+    select it.name as name, it.id,it.search_condition as searchCondition,it.all_num as allNum,
+           it.default_num as defaultNum,it.type as type,it.create_id as
+    createId,it.create_time as createTime ,it.state as  state,it.done_num as doneNum ,itc.file_guid as fileGuid,itc.project_type as projectType ,itc.project_id as projectId,itc.import_content as importContent from import_task it left join import_task_condition itc on
+    it.import_task_condition_id=itc.id
+    <if test="sql1!=''">
+        where ${sql1}
+    </if>
+    ${sql2} ${sql3}
+</select>
+```
+
+该SQL查询使用左连接关联import_task和import_task_condition表,获取任务的完整信息。
+
+```mermaid
+erDiagram
+IMPORT_TASK ||--o{ IMPORT_TASK_CONDITION : "包含"
+IMPORT_TASK {
+integer id PK
+string name
+string search_condition
+integer all_num
+double progress
+integer default_num
+integer import_task_condition_id FK
+integer type
+integer state
+datetime finish_time
+string create_id
+datetime create_time
+integer done_num
+string remark
+datetime update_to_date
+datetime last_update_to_date
+boolean if_create_by_sys
+}
+IMPORT_TASK_CONDITION {
+integer id PK
+string search_condition
+integer project_id
+integer product_id
+integer type
+string file_guid
+integer import_content
+boolean if_update
+boolean if_cycle
+string cron
+string create_id
+datetime create_time
+string update_cycle
+string db_type
+string custom_fields
+boolean if_delete
+}
+```
+
+**图示来源**
+- [ImportTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ImportTaskMapper.java#L1-L23)
+- [ImportTaskMapper.xml](file://src/main/resources/mapper/ImportTaskMapper.xml#L1-L27)
+
+## 导入导出参数传递与结果返回DTO
+
+系统使用多种DTO(数据传输对象)在不同层之间传递导入导出参数和结果。
+
+### TaskParams
+
+TaskParams类用于传递任务执行所需的参数:
+
+```java
+@Data
+public class TaskParams {
+    private Integer taskType;
+    private Integer taskId;
+    private String createId;
+    private String path;
+    private String token;
+    private String ids;
+    private Integer projectId;
+    private String selected;
+    private List<Map<Object, Object>> rowList;
+    private String oldName;
+    private Integer total;
+    private Integer index;
+    private Integer productId;
+}
+```
+
+### PatentExportParams
+
+PatentExportParams类用于封装导出专利的参数:
+
+```java
+@Data
+public class PatentExportParams {
+    private List<PatentExportVO> selected;
+    private Integer projectId;
+}
+```
+
+### PatentExportVO
+
+PatentExportVO类定义了导出字段的属性:
+
+```java
+@Data
+public class PatentExportVO {
+    private String value;
+    private String name;
+    private Integer order;
+    private Boolean selected;
+    private String type;
+    private Boolean ifShow;
+    private Boolean ifHidden;
+    private Integer createType;
+}
+```
+
+```mermaid
+classDiagram
+class TaskParams {
++Integer taskType
++Integer taskId
++String createId
++String path
++String token
++String ids
++Integer projectId
++String selected
++List<Map<Object, Object>> rowList
++String oldName
++Integer total
++Integer index
++Integer productId
+}
+class PatentExportParams {
++List<PatentExportVO> selected
++Integer projectId
+}
+class PatentExportVO {
++String value
++String name
++Integer order
++Boolean selected
++String type
++Boolean ifShow
++Boolean ifHidden
++Integer createType
+}
+PatentExportParams --> PatentExportVO : "包含"
+```
+
+**图示来源**
+- [TaskParams.java](file://src/main/java/cn/cslg/pas/common/dto/PatentExport/TaskParams.java#L1-L55)
+- [PatentExportParams.java](file://src/main/java/cn/cslg/pas/common/dto/PatentExport/PatentExportParams.java#L1-L16)
+- [PatentExportVO.java](file://src/main/java/cn/cslg/pas/common/dto/PatentExport/PatentExportVO.java#L1-L42)
+
+## 异步处理机制
+
+系统通过异步处理机制实现导入导出操作,提高系统响应性和用户体验。
+
+### 任务调度
+
+ImportTaskService与SchedulingTaskService协同工作,实现任务的异步执行。当创建新任务时,ImportTaskService调用SchedulingTaskService的startTask方法启动任务执行。任务执行在后台线程中进行,不会阻塞主线程。
+
+### 线程管理
+
+系统使用线程池管理异步任务执行,确保资源的合理利用。每个任务在独立的线程中执行,避免相互影响。任务执行过程中,定期更新任务进度,确保用户可以实时监控任务状态。
+
+### 状态同步
+
+异步任务执行过程中,通过数据库实现状态同步。任务线程定期更新数据库中的任务状态和进度信息,前端通过轮询或WebSocket获取最新状态。
+
+## 任务状态查询与结果处理
+
+系统提供完整的任务状态查询和结果处理功能。
+
+### 任务查询
+
+通过ImportTaskController的queryImportTask接口查询任务列表。该接口调用ImportTaskService的queryMessage方法,根据查询条件返回任务列表和总数。
+
+### 结果处理
+
+任务完成后,系统记录执行结果,包括:
+- 完成时间
+- 失败条数
+- 生成文件的GUID
+- 错误日志
+
+用户可以通过任务ID查询任务结果和错误日志。
+
+### 错误日志
+
+系统记录详细的错误日志,帮助用户排查问题。错误日志包括:
+- 错误类型
+- 错误信息
+- 发生时间
+- 相关数据
+
+## 常见问题与解决方案
+
+### 任务卡住
+
+**问题描述**:任务长时间处于运行状态,进度不再更新。
+
+**可能原因**:
+- 数据库连接超时
+- 文件系统访问异常
+- 内存不足
+
+**解决方案**:
+1. 检查系统资源使用情况
+2. 查看错误日志获取详细信息
+3. 重启任务调度服务
+4. 分批处理大数据量任务
+
+### 状态不一致
+
+**问题描述**:数据库中的任务状态与实际执行状态不一致。
+
+**可能原因**:
+- 异常未正确处理
+- 状态更新失败
+- 多线程竞争
+
+**解决方案**:
+1. 确保状态更新操作的原子性
+2. 添加异常处理和重试机制
+3. 使用分布式锁避免竞争
+
+### 资源泄漏
+
+**问题描述**:系统资源(内存、文件句柄等)持续增长。
+
+**可能原因**:
+- 临时文件未删除
+- 数据库连接未关闭
+- 线程未正确终止
+
+**解决方案**:
+1. 确保资源使用后正确释放
+2. 使用try-with-resources语句
+3. 实现资源监控和告警
+
+## 监控与调试建议
+
+### 监控指标
+
+建议监控以下关键指标:
+- 任务队列长度
+- 任务执行时间
+- 系统资源使用率
+- 错误率
+
+### 日志记录
+
+确保关键操作都有详细的日志记录:
+- 任务创建
+- 状态变更
+- 进度更新
+- 错误发生
+
+### 调试工具
+
+使用以下工具进行调试:
+- 数据库查询工具
+- 线程分析工具
+- 内存分析工具
+- 日志分析工具
+
+### 性能优化
+
+建议的性能优化措施:
+- 批量处理数据
+- 合理设置线程池大小
+- 优化数据库查询
+- 使用缓存减少重复计算

File diff suppressed because it is too large
+ 146 - 0
.qoder/repowiki/zh/content/业务逻辑层/业务逻辑层.md


+ 406 - 0
.qoder/repowiki/zh/content/业务逻辑层/无效分析/专利权要分析.md

@@ -0,0 +1,406 @@
+# 专利权要分析
+
+<cite>
+**本文档引用的文件**   
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java)
+- [PatentClaimHistory.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaimHistory.java)
+- [SplitClaimDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/SplitClaimDTO.java)
+- [PatentClaimController.java](file://src/main/java/cn/cslg/pas/controller/PatentClaimController.java)
+- [PatentClaimHistoryService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimHistoryService.java)
+- [EvidenceReasonService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/EvidenceReasonService.java)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java)
+- [EvidenceReason.java](file://src/main/java/cn/cslg/pas/domain/business/EvidenceReason.java)
+- [AssoGroupFeature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupFeature.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [专利权要核心组件](#专利权要核心组件)
+3. [权要创建与拆分流程](#权要创建与拆分流程)
+4. [权要修改与历史记录管理](#权要修改与历史记录管理)
+5. [权要解析与特征提取](#权要解析与特征提取)
+6. [层级结构维护机制](#层级结构维护机制)
+7. [API接口操作示例](#api接口操作示例)
+8. [权要与证据理由关联关系](#权要与证据理由关联关系)
+9. [比对分组关联机制](#比对分组关联机制)
+10. [常见问题与优化建议](#常见问题与优化建议)
+11. [性能调优方案](#性能调优方案)
+
+## 引言
+本文档深入分析PAS系统中专利权要分析功能的实现细节。专利权要分析是专利无效宣告、侵权分析等知识产权业务的核心环节,系统通过自动化拆分、特征提取和历史追踪等技术手段,为用户提供高效的专利分析工具。本文将详细阐述专利权要(PatentClaim)的全生命周期管理,包括创建、拆分、修改和历史记录管理的完整流程。
+
+## 专利权要核心组件
+
+PAS系统中的专利权要分析功能由多个核心组件构成,主要包括专利权要实体(PatentClaim)、权要历史记录(PatentClaimHistory)、权要服务(PatentClaimService)和控制器(PatentClaimController)等。这些组件协同工作,实现了权要的完整生命周期管理。
+
+```mermaid
+classDiagram
+class PatentClaim {
++Integer sysOrder
++String content
++Integer claimType
++Integer contentType
++String parentOrder
++Integer projectId
++String createId
++String rbDecision
++String courtDecision1
++String courtDecision2
++Integer claimMessageId
+}
+class PatentClaimHistory {
++Integer claimId
++Integer operateType
++String content
++Integer sysOrder
++String description
++Integer ifFirst
++String rbDecision
++String courtDecision1
++String courtDecision2
++String createId
++Date createTime
+}
+class PatentClaimService {
++List<PatentClaimVO> splitClaim(SplitClaimDTO)
++List<PatentClaimVO> getPatentClaimVO(QueryClaimDTO)
++Boolean addPatentClaim(AddClaimsDTO)
++Boolean updateClaimMessage(List<UpdateClaimMessageDTO>)
++List<PatentClaimVO> getVersionPatentClaim(QueryClaimDTO)
+}
+class PatentClaimController {
++Response splitClaim(SplitClaimDTO)
++Response queryClaim(QueryClaimDTO)
++Response addClaim(AddClaimsDTO)
++Response updateMessage(List<UpdateClaimMessageDTO>)
++Response getVersionClaims(QueryClaimDTO)
+}
+PatentClaimController --> PatentClaimService : "调用"
+PatentClaimService --> PatentClaim : "管理"
+PatentClaimService --> PatentClaimHistory : "管理"
+```
+
+**图示来源**
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java)
+- [PatentClaimHistory.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaimHistory.java)
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+- [PatentClaimController.java](file://src/main/java/cn/cslg/pas/controller/PatentClaimController.java)
+
+**本节来源**
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java)
+- [PatentClaimHistory.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaimHistory.java)
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+- [PatentClaimController.java](file://src/main/java/cn/cslg/pas/controller/PatentClaimController.java)
+
+## 权要创建与拆分流程
+
+专利权要的创建与拆分是分析过程的第一步。系统通过SplitClaimDTO接收拆分请求,由PatentClaimService处理拆分逻辑。拆分流程首先检查是否已进行过拆分,若未拆分则根据项目ID获取标的专利号,调用FeatureService获取专利权要列表,并将其保存到数据库中。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "PatentClaimController"
+participant Service as "PatentClaimService"
+participant FeatureService as "FeatureService"
+participant Database as "数据库"
+Client->>Controller : POST /api/patentClaim/splitClaim
+Controller->>Service : splitClaim(SplitClaimDTO)
+Service->>Service : ifHaveSplit(projectId)
+alt 已拆分
+Service-->>Controller : 返回已有拆分结果
+else 未拆分
+Service->>Service : getOne(ReportProject)
+Service->>FeatureService : getRightListByNo(signNo)
+FeatureService-->>Service : RePatentClaim列表
+Service->>Service : loadPatentClaim()
+Service->>Database : saveBatch(PatentClaim)
+Database-->>Service : 保存成功
+Service-->>Controller : 返回拆分结果
+end
+Controller-->>Client : Response成功
+```
+
+**图示来源**
+- [PatentClaimController.java](file://src/main/java/cn/cslg/pas/controller/PatentClaimController.java)
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+- [FeatureService.java](file://src/main/java/cn/cslg/pas/service/business/FeatureService.java)
+
+**本节来源**
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+- [SplitClaimDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/SplitClaimDTO.java)
+- [PatentClaimController.java](file://src/main/java/cn/cslg/pas/controller/PatentClaimController.java)
+
+## 权要修改与历史记录管理
+
+权要的修改与历史记录管理是确保分析过程可追溯的关键功能。系统通过PatentClaimHistory实体记录每次修改的详细信息,包括修改类型、修改内容、修改说明和时间戳等。PatentClaimHistoryService提供了修改、查询和删除历史记录的功能。
+
+```mermaid
+classDiagram
+class PatentClaimHistory {
++Integer claimId
++Integer operateType
++String content
++Integer sysOrder
++String description
++Integer ifFirst
++String rbDecision
++String courtDecision1
++String courtDecision2
++String createId
++Date createTime
+}
+class PatentClaimHistoryService {
++Integer alterPatentClaim(AlterPatentClaimDTO)
++Integer editPatentClaimHistory(EditPatentClaimHistoryDTO)
++PatentClaimHistoryVO queryPatentClaimHistory(PatentClaimDTO)
++void deletePatentClaim(PatentClaimDTO)
++List<Integer> cancelRemoveClaims(Integer)
+}
+PatentClaimHistoryService --> PatentClaimHistory : "管理"
+```
+
+**图示来源**
+- [PatentClaimHistory.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaimHistory.java)
+- [PatentClaimHistoryService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimHistoryService.java)
+
+**本节来源**
+- [PatentClaimHistory.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaimHistory.java)
+- [PatentClaimHistoryService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimHistoryService.java)
+
+## 权要解析与特征提取
+
+权要解析与特征提取是专利分析的核心技术环节。系统通过FeatureService从专利文档中提取权要文本,并进行结构化解析。PatentClaimService中的loadPatentClaim方法负责将解析后的权要数据装载到PatentClaim实体中,包括权要类型、内容、层级关系和排序等信息。
+
+```mermaid
+flowchart TD
+Start([开始]) --> GetPatentNo["获取专利号"]
+GetPatentNo --> GetRightList["调用FeatureService.getRightListByNo()"]
+GetRightList --> CheckResult{"获取成功?"}
+CheckResult --> |是| ProcessClaims["处理权要列表"]
+CheckResult --> |否| ReturnEmpty["返回空列表"]
+ProcessClaims --> CreateEntity["创建PatentClaim实体"]
+CreateEntity --> SetProperties["设置属性: claimType, content, parentOrder等"]
+SetProperties --> SaveBatch["批量保存到数据库"]
+SaveBatch --> End([结束])
+ReturnEmpty --> End
+```
+
+**图示来源**
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+- [FeatureService.java](file://src/main/java/cn/cslg/pas/service/business/FeatureService.java)
+
+**本节来源**
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+
+## 层级结构维护机制
+
+专利权要通常具有树状层级结构,系统通过parentOrder字段维护这种层级关系。在权要拆分和修改过程中,系统需要确保层级结构的完整性和一致性。当删除某个权要时,系统会自动调整后续权要的排序,保持层级结构的连续性。
+
+```mermaid
+classDiagram
+class PatentClaim {
++Integer sysOrder
++String content
++Integer claimType
++String parentOrder
++Integer projectId
+}
+class PatentClaimHistory {
++Integer claimId
++Integer operateType
++Integer sysOrder
++Integer ifFirst
+}
+PatentClaimHistory --> PatentClaim : "关联"
+note right of PatentClaim
+sysOrder : 系统排序
+parentOrder : 父级排序
+用于维护权要的树状层级结构
+end
+note right of PatentClaimHistory
+sysOrder : 修改后的排序
+ifFirst : 是否为首次修改
+用于追踪层级结构的变化
+end
+```
+
+**图示来源**
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java)
+- [PatentClaimHistory.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaimHistory.java)
+
+**本节来源**
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java)
+- [PatentClaimHistory.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaimHistory.java)
+
+## API接口操作示例
+
+系统提供了RESTful API接口,方便外部系统集成和自动化操作。以下是一些常用的API接口及其使用示例:
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "PatentClaimController"
+participant Service as "PatentClaimService"
+Client->>Controller : POST /api/patentClaim/splitClaim
+Controller->>Service : splitClaim(SplitClaimDTO)
+Service-->>Controller : List<PatentClaimVO>
+Controller-->>Client : Response成功
+Client->>Controller : POST /api/patentClaim/queryClaim
+Controller->>Service : getPatentClaimVO(QueryClaimDTO)
+Service-->>Controller : List<PatentClaimVO>
+Controller-->>Client : Response成功
+Client->>Controller : POST /api/patentClaim/addClaim
+Controller->>Service : addPatentClaim(AddClaimsDTO)
+Service-->>Controller : Boolean
+Controller-->>Client : Response成功
+Client->>Controller : POST /api/patentClaim/updateMessage
+Controller->>Service : updateClaimMessage(List<UpdateClaimMessageDTO>)
+Service-->>Controller : Boolean
+Controller-->>Client : Response成功
+```
+
+**图示来源**
+- [PatentClaimController.java](file://src/main/java/cn/cslg/pas/controller/PatentClaimController.java)
+- [PatentClaimService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/PatentClaimService.java)
+
+**本节来源**
+- [PatentClaimController.java](file://src/main/java/cn/cslg/pas/controller/PatentClaimController.java)
+
+## 权要与证据理由关联关系
+
+专利权要与证据理由之间存在紧密的关联关系。系统通过EvidenceReason实体存储证据理由的详细信息,并通过关联表建立与权要的多对多关系。EvidenceReasonService负责管理证据理由的增删改查操作。
+
+```mermaid
+classDiagram
+class PatentClaim {
++Integer id
++String content
+}
+class EvidenceReason {
++Integer id
++String evidenceText
++String description
++String presentOpinions1
++String rbOpinions
++String rbDecisionKey
++String rbSummary
++String prosecutorOpinions1
++String respondentOpinions1
++String thirdOpinions1
++String courtOpinions1
++String prosecutorOpinions2
++String respondentOpinions2
++String thirdOpinions2
++String courtOpinions2
++String fileGuid
+}
+class EvidenceReasonService {
++Boolean addEvidenceReason(AddEvidenceReasonDTO)
++List<QueryEvidenceReasonVO> queryEvidenceReason(QueryEvidenceReasonDTO)
++Records queryInvalidHistory(QueryInvalidHistoryDTO)
++Boolean updateMessage(UpdateMessageDTO)
+}
+PatentClaim ..> EvidenceReason : "关联"
+EvidenceReasonService --> EvidenceReason : "管理"
+```
+
+**图示来源**
+- [EvidenceReason.java](file://src/main/java/cn/cslg/pas/domain/business/EvidenceReason.java)
+- [EvidenceReasonService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/EvidenceReasonService.java)
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java)
+
+**本节来源**
+- [EvidenceReason.java](file://src/main/java/cn/cslg/pas/domain/business/EvidenceReason.java)
+- [EvidenceReasonService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/EvidenceReasonService.java)
+
+## 比对分组关联机制
+
+比对分组(AssoGroupFeature)是连接权要与证据理由的重要桥梁。系统通过AssoGroupFeature实体管理特征与证据组合的关联关系,支持特征的世代管理和操作模式追踪。AssoGroupFeatureService提供了丰富的API来管理这些关联关系。
+
+```mermaid
+classDiagram
+class AssoGroupFeature {
++Integer featureOrder
++Integer featureGen
++Integer featureId
++String featureText
++Integer featurePreId
++Integer groupId
++Integer operateMode
++String invalidReasonDetail1
++String invalidReasonDetail2
++String presentOpinions1
++String presentOpinions2
++String ifPresentOpinions1
++String ifPresentOpinions2
++String rbOpinions
++String rbDecisionKey
++String common
++String rbSummary
++String prosecutorOpinions1
++String respondentOpinions1
++String thirdOpinions1
++String courtOpinions1
++String prosecutorOpinions2
++String respondentOpinions2
++String thirdOpinions2
++String courtOpinions2
+}
+class AssoGroupFeatureService {
++List<Integer> getFeatureIdsByGroupId(Integer)
++Boolean updateGroupFeature(UpdateGroupFeatureDTO)
++Boolean removeGroupFeature(RemoveGroupFeatureDTO)
++List<AssoGroupFeature> getHistory(QueryFeatureHistoryDTO)
++List<GroupFeatureHistoryVO> queryFeatureHistory(QueryFeatureHistoryDTO)
++Boolean updateFeature(UpdateGroupFeatureDTO)
++Integer addFeature(String)
++AssoGroupFeature getGenGroupFeature(Integer, Integer, Integer)
++void updateGroupFeatureOrder(Integer, Integer, Integer)
++Boolean updateFeatureContent(Integer, String)
++List<GroupFeatureHistoryVO> loadFeatureHistory(List<AssoGroupFeature>)
++Boolean updateMessage(UpdateMessageDTO)
++Boolean removeAssoWithHistory(List<Integer>, List<Integer>)
++Boolean addFeatureGroupBatch(AddFeatureGroupBatchDTO)
++List<Integer> cancelRemoveFeature(Integer)
+}
+AssoGroupFeatureService --> AssoGroupFeature : "管理"
+```
+
+**图示来源**
+- [AssoGroupFeature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupFeature.java)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java)
+
+**本节来源**
+- [AssoGroupFeature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupFeature.java)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java)
+
+## 常见问题与优化建议
+
+在使用专利权要分析功能时,可能会遇到一些常见问题,如权要解析不准确、层级关系混乱等。以下是一些常见问题的解决方案和优化建议:
+
+1. **权要解析不准确**:确保输入的专利文档格式正确,使用最新的解析算法版本。定期更新FeatureService的解析规则库。
+
+2. **层级关系混乱**:在权要拆分和修改时,严格遵循parentOrder和sysOrder的维护规则。避免手动修改数据库中的排序字段。
+
+3. **历史记录丢失**:确保每次权要修改都通过PatentClaimHistoryService记录,避免直接修改PatentClaim实体。
+
+4. **性能瓶颈**:对于大型专利文档,采用分批处理策略,避免一次性加载过多数据。
+
+5. **数据一致性**:在分布式环境下,使用事务管理确保权要、历史记录和关联关系的一致性。
+
+## 性能调优方案
+
+为了提高专利权要分析功能的性能,可以采取以下调优方案:
+
+1. **数据库优化**:为常用的查询字段(如projectId、claimId等)创建索引,优化查询性能。
+
+2. **缓存策略**:使用Redis等缓存技术缓存频繁访问的权要数据和解析结果,减少数据库访问次数。
+
+3. **批量处理**:对于大批量的权要操作,采用批量保存和更新的方式,减少数据库交互次数。
+
+4. **异步处理**:将耗时的权要解析和特征提取操作放入异步任务队列,提高响应速度。
+
+5. **连接池优化**:合理配置数据库连接池参数,避免连接泄漏和性能下降。
+
+6. **代码优化**:避免在循环中进行数据库查询,使用流式处理和Lambda表达式提高代码效率。

File diff suppressed because it is too large
+ 328 - 0
.qoder/repowiki/zh/content/业务逻辑层/无效分析/无效分析.md


+ 935 - 0
.qoder/repowiki/zh/content/业务逻辑层/无效分析/无效分析报告生成.md

@@ -0,0 +1,935 @@
+# 无效分析报告生成
+
+<cite>
+**本文档引用的文件**   
+- [ProjectFigure.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectFigure.java)
+- [ProjectFigureDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/ProjectFigureDTO.java)
+- [ProjectFigureVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidVO/ProjectFigureVO.java)
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java)
+- [ProjectFigureMapper.java](file://src/main/java/cn/cslg/pas/mapper/InvalidReport/ProjectFigureMapper.java)
+- [ReportProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ReportProjectService.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java)
+- [ReportProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/ReportProjectDTO.java)
+- [UpdateReportProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateReportProjectDTO.java)
+- [ReportProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/ReportProjectVO.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [LoginUtils.java](file://src/main/java/cn/cslg/pas/common/utils/LoginUtils.java)
+</cite>
+
+## 目录
+1. [项目结构](#项目结构)
+2. [核心组件](#核心组件)
+3. [报告图创建与更新](#报告图创建与更新)
+4. [报告图查询与展示](#报告图查询与展示)
+5. [报告图删除](#报告图删除)
+6. [数据聚合与可视化](#数据聚合与可视化)
+7. [报告模板集成](#报告模板集成)
+8. [模块集成关系](#模块集成关系)
+9. [API接口示例](#api接口示例)
+10. [异步处理与缓存策略](#异步处理与缓存策略)
+11. [性能优化方案](#性能优化方案)
+12. [常见问题与解决方案](#常见问题与解决方案)
+13. [监控与调试方法](#监控与调试方法)
+
+## 项目结构
+
+```mermaid
+graph TD
+subgraph "src/main/java"
+subgraph "cn.cslg.pas"
+subgraph "controller"
+ProjectFigureController[ProjectFigureController]
+end
+subgraph "service"
+subgraph "business"
+subgraph "invalidReport"
+ProjectFigureService[ProjectFigureService]
+end
+ReportProjectService[ReportProjectService]
+ReportTempleService[ReportTempleService]
+end
+subgraph "common"
+FileManagerService[FileManagerService]
+end
+subgraph "permissions"
+PermissionService[PermissionService]
+end
+end
+subgraph "mapper"
+subgraph "InvalidReport"
+ProjectFigureMapper[ProjectFigureMapper]
+end
+end
+subgraph "domain"
+subgraph "business"
+ProjectFigure[ProjectFigure]
+ReportTemple[ReportTemple]
+end
+ReportDocument[ReportDocument]
+end
+subgraph "common"
+subgraph "dto"
+subgraph "invalidDTO"
+ProjectFigureDTO[ProjectFigureDTO]
+end
+subgraph "business"
+ReportProjectDTO[ReportProjectDTO]
+UpdateReportProjectDTO[UpdateReportProjectDTO]
+end
+end
+subgraph "vo"
+subgraph "invalidVO"
+ProjectFigureVO[ProjectFigureVO]
+end
+subgraph "business"
+ReportProjectVO[ReportProjectVO]
+end
+end
+subgraph "utils"
+CacheUtils[CacheUtils]
+LoginUtils[LoginUtils]
+end
+end
+end
+end
+subgraph "src/main/resources"
+subgraph "mapper"
+subgraph "InvalidReport"
+ProjectFigureMapperXML[ProjectFigureMapper.xml]
+end
+end
+end
+```
+
+**图源**
+- [ProjectFigure.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectFigure.java)
+- [ProjectFigureDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/ProjectFigureDTO.java)
+- [ProjectFigureVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidVO/ProjectFigureVO.java)
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java)
+- [ProjectFigureMapper.java](file://src/main/java/cn/cslg/pas/mapper/InvalidReport/ProjectFigureMapper.java)
+- [ReportProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ReportProjectService.java)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java)
+- [ReportProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/ReportProjectDTO.java)
+- [UpdateReportProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateReportProjectDTO.java)
+- [ReportProjectVO.java](file://src/main/java/cn/cslg/pas/common/vo/business/ReportProjectVO.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [LoginUtils.java](file://src/main/java/cn/cslg/pas/common/utils/LoginUtils.java)
+
+## 核心组件
+
+PAS系统中无效分析报告生成功能的核心组件包括报告图实体、数据传输对象、值对象、服务层、控制器和数据访问层。这些组件协同工作,实现了报告图的创建、更新、查询、展示和删除功能。
+
+**组件关系说明:**
+- **ProjectFigure**: 数据库实体类,对应`project_figure`表,存储报告图的基本信息
+- **ProjectFigureDTO**: 数据传输对象,用于在控制器和服务层之间传递数据
+- **ProjectFigureVO**: 值对象,用于向前端返回包含创建人姓名和文件信息的完整数据
+- **ProjectFigureService**: 服务层,实现业务逻辑,包括数据验证、权限检查、数据聚合等
+- **ProjectFigureController**: 控制层,提供REST API接口,处理HTTP请求
+- **ProjectFigureMapper**: 数据访问层,使用MyBatis-Plus实现数据库操作
+
+**组件交互流程:**
+1. 前端通过API请求调用Controller
+2. Controller接收请求参数,调用Service层
+3. Service层处理业务逻辑,调用Mapper进行数据库操作
+4. Mapper执行SQL操作,返回结果给Service层
+5. Service层对数据进行处理和聚合,返回结果给Controller
+6. Controller将结果封装为响应,返回给前端
+
+**本节来源**
+- [ProjectFigure.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectFigure.java)
+- [ProjectFigureDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/ProjectFigureDTO.java)
+- [ProjectFigureVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidVO/ProjectFigureVO.java)
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java)
+- [ProjectFigureMapper.java](file://src/main/java/cn/cslg/pas/mapper/InvalidReport/ProjectFigureMapper.java)
+
+## 报告图创建与更新
+
+报告图的创建与更新功能由`ProjectFigureService`类的`updateProjectFigure`方法实现。该方法根据传入的`ProjectFigureDTO`对象中的ID值判断是创建新记录还是更新现有记录。
+
+```mermaid
+sequenceDiagram
+participant Frontend as 前端
+participant Controller as ProjectFigureController
+participant Service as ProjectFigureService
+participant Mapper as ProjectFigureMapper
+participant Cache as CacheUtils
+participant Permission as PermissionService
+participant File as FileManagerService
+Frontend->>Controller : POST /updateProjectFigure
+Controller->>Service : updateProjectFigure(projectFigureDTO)
+alt 新建报告图
+Service->>Cache : getLoginUser()
+Service->>Service : 设置创建人信息
+Service->>Mapper : insert()
+else 更新报告图
+Service->>Mapper : getById(id)
+Service->>Service : 验证记录存在
+Service->>Mapper : updateById()
+end
+Service-->>Controller : 返回成功
+Controller-->>Frontend : Response.success("保存成功")
+```
+
+**图源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java#L39-L65)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java#L43-L53)
+
+**创建与更新流程:**
+1. 前端发送POST请求到`/updateProjectFigure`接口,携带`ProjectFigureDTO`数据
+2. `ProjectFigureController`接收请求,调用`ProjectFigureService`的`updateProjectFigure`方法
+3. `ProjectFigureService`检查`ProjectFigureDTO`中的ID值:
+   - 如果ID为空,则为新建操作
+   - 如果ID不为空,则为更新操作
+4. 对于新建操作:
+   - 从缓存中获取当前登录用户信息
+   - 设置创建人ID和创建时间
+   - 调用MyBatis-Plus的`insert`方法保存到数据库
+5. 对于更新操作:
+   - 先根据ID查询现有记录
+   - 验证记录存在
+   - 保留原有的项目ID、创建人ID和创建时间
+   - 调用MyBatis-Plus的`updateById`方法更新数据库
+6. 返回操作结果给前端
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java#L39-L65)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java#L43-L53)
+
+## 报告图查询与展示
+
+报告图的查询与展示功能由`ProjectFigureService`类的`queryProjectFigureVOs`和`loadVos`方法实现。该功能不仅从数据库查询基本数据,还通过调用外部服务获取创建人姓名和文件信息,实现数据聚合。
+
+```mermaid
+flowchart TD
+Start([开始查询]) --> QueryDB["查询数据库获取ProjectFigure列表"]
+QueryDB --> CheckEmpty{"列表为空?"}
+CheckEmpty --> |是| ReturnEmpty["返回空列表"]
+CheckEmpty --> |否| GetCreateIds["提取创建人ID列表"]
+GetCreateIds --> GetGuids["提取文件GUID列表"]
+GetGuids --> QueryPersonnel["调用PermissionService<br>获取人员信息"]
+QueryPersonnel --> QueryFiles["调用FileManagerService<br>获取文件信息"]
+QueryFiles --> ProcessData["遍历ProjectFigure列表"]
+ProcessData --> MapPersonnel["映射创建人姓名"]
+MapPersonnel --> MapFiles["映射文件信息"]
+MapFiles --> AddVO["添加到ProjectFigureVO列表"]
+AddVO --> CheckEnd{"处理完所有记录?"}
+CheckEnd --> |否| ProcessData
+CheckEnd --> |是| ReturnResult["返回ProjectFigureVO列表"]
+ReturnEmpty --> End([结束])
+ReturnResult --> End
+```
+
+**图源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java#L68-L128)
+
+**查询与展示流程:**
+1. 前端发送POST请求到`/queryProjectFigures`接口,携带`ProjectFigureDTO`数据(主要包含项目ID)
+2. `ProjectFigureController`接收请求,调用`ProjectFigureService`的`queryProjectFigureVOs`方法
+3. `ProjectFigureService`使用MyBatis-Plus的LambdaQueryWrapper根据项目ID查询数据库
+4. 将查询到的`ProjectFigure`列表传递给`loadVos`方法进行数据聚合
+5. `loadVos`方法执行以下操作:
+   - 提取所有记录的创建人ID列表
+   - 调用`PermissionService.getPersonnelByIdsFromPCS`方法获取人员信息
+   - 提取所有记录的文件GUID列表
+   - 调用`FileManagerService.getSystemFileFromFMS`方法获取文件信息
+   - 遍历每个`ProjectFigure`对象,创建对应的`ProjectFigureVO`对象
+   - 将创建人姓名和文件信息映射到`ProjectFigureVO`对象
+   - 返回包含完整信息的`ProjectFigureVO`列表
+6. `ProjectFigureController`将结果封装为响应,返回给前端
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java#L68-L128)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java#L55-L65)
+
+## 报告图删除
+
+报告图的删除功能由`ProjectFigureService`类的`removeProjectFigure`方法实现。该方法支持批量删除多个报告图记录。
+
+```mermaid
+sequenceDiagram
+participant Frontend as 前端
+participant Controller as ProjectFigureController
+participant Service as ProjectFigureService
+participant Mapper as ProjectFigureMapper
+Frontend->>Controller : POST /removeProjectFigures
+Controller->>Service : removeProjectFigure(ids)
+Service->>Service : 验证ids不为空且不为空列表
+alt 验证失败
+Service-->>Controller : 抛出XiaoShiException
+else 验证成功
+Service->>Mapper : removeBatchByIds(ids)
+Service-->>Controller : 返回成功
+end
+Controller-->>Frontend : Response.success("删除成功")
+```
+
+**图源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java#L132-L138)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java#L69-L78)
+
+**删除流程:**
+1. 前端发送POST请求到`/removeProjectFigures`接口,携带要删除的报告图ID列表
+2. `ProjectFigureController`接收请求,调用`ProjectFigureService`的`removeProjectFigure`方法
+3. `ProjectFigureService`首先验证ID列表:
+   - 检查列表是否为空
+   - 检查列表是否包含至少一个ID
+   - 如果验证失败,抛出`XiaoShiException`异常
+4. 验证通过后,调用MyBatis-Plus的`removeBatchByIds`方法批量删除数据库记录
+5. 返回操作结果给前端
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java#L132-L138)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java#L69-L78)
+
+## 数据聚合与可视化
+
+报告图服务中的数据聚合功能通过`loadVos`方法实现,该方法将基础数据与外部服务提供的信息进行整合,形成完整的视图对象。
+
+```mermaid
+classDiagram
+class ProjectFigure {
++Integer projectId
++String fileGuid
++String description
++String figureTitle
++String createId
++Date createTime
+}
+class ProjectFigureDTO {
++Integer id
++Integer projectId
++String fileGuid
++String description
++String figureTitle
+}
+class ProjectFigureVO {
++Integer id
++Integer projectId
++String fileGuid
++String description
++String figureTitle
++String createName
++Date createTime
++SystemFile systemFile
+}
+class SystemFile {
++String guid
++String fileName
++String filePath
++String fileType
++Long fileSize
++Date uploadTime
+}
+class Personnel {
++String id
++String personnelName
++String email
++String phone
++String department
+}
+ProjectFigure <|-- ProjectFigureDTO : "继承"
+ProjectFigure <|-- ProjectFigureVO : "继承"
+ProjectFigureVO --> SystemFile : "包含"
+ProjectFigureVO --> Personnel : "关联"
+```
+
+**图源**
+- [ProjectFigure.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectFigure.java)
+- [ProjectFigureDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/ProjectFigureDTO.java)
+- [ProjectFigureVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidVO/ProjectFigureVO.java)
+- [SystemFile.java](file://src/main/java/cn/cslg/pas/common/model/cronModel/SystemFile.java)
+- [Personnel.java](file://src/main/java/cn/cslg/pas/common/model/cronModel/Personnel.java)
+
+**数据聚合机制:**
+1. **基础数据获取**:从`project_figure`表中查询所有相关记录,获取`ProjectFigure`对象列表
+2. **创建人信息聚合**:
+   - 提取所有`ProjectFigure`对象的`createId`字段,形成ID列表
+   - 调用`PermissionService.getPersonnelByIdsFromPCS`方法,批量获取人员信息
+   - 将人员信息与`ProjectFigure`对象按`createId`进行匹配
+   - 将匹配到的人员姓名设置到`ProjectFigureVO`的`createName`字段
+3. **文件信息聚合**:
+   - 提取所有`ProjectFigure`对象的`fileGuid`字段,形成GUID列表
+   - 调用`FileManagerService.getSystemFileFromFMS`方法,批量获取文件信息
+   - 将文件信息与`ProjectFigure`对象按`fileGuid`进行匹配
+   - 将匹配到的文件信息设置到`ProjectFigureVO`的`systemFile`字段
+4. **时间格式化**:使用`@JsonFormat`注解将`createTime`字段格式化为"yyyy-MM-dd"格式
+
+**可视化生成:**
+- 前端接收到`ProjectFigureVO`列表后,可以使用各种图表库(如ECharts、Chart.js等)进行可视化展示
+- 每个`ProjectFigureVO`对象包含完整的展示所需信息,包括图表标题、描述、创建人、创建时间和文件信息
+- 可以根据`projectId`对报告图进行分组展示
+- 可以根据`createTime`对报告图进行时间线展示
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java#L78-L128)
+- [ProjectFigureVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidVO/ProjectFigureVO.java)
+- [SystemFile.java](file://src/main/java/cn/cslg/pas/common/model/cronModel/SystemFile.java)
+- [Personnel.java](file://src/main/java/cn/cslg/pas/common/model/cronModel/Personnel.java)
+
+## 报告模板集成
+
+无效分析报告的生成与模板集成密切相关,通过`ReportExportService`和`ReportTempleService`等组件实现模板的管理和使用。
+
+```mermaid
+sequenceDiagram
+participant Frontend as 前端
+participant Controller as ReportExportController
+participant Service as ReportExportService
+participant TempleService as ReportTempleService
+participant Template as XWPFTemplate
+participant FileManager as FileManagerService
+Frontend->>Controller : 请求导出报告
+Controller->>Service : exportReport(projectId, templeId)
+Service->>TempleService : getById(templeId)
+TempleService-->>Service : 返回ReportTemple
+Service->>Service : 获取模板文件路径
+Service->>Service : 创建输出目录和文件名
+Service->>Service : 加载项目信息
+Service->>Service : 构建数据模型
+Service->>Template : compile(templatePath, configure)
+Template-->>Service : 返回XWPFTemplate
+Service->>Template : render(dataModel)
+Template-->>Service : 返回生成的文档
+Service->>FileManager : 保存文件并获取GUID
+Service->>Service : 记录导出信息到ReportDocument
+Service-->>Controller : 返回文件GUID
+Controller-->>Frontend : 下载链接
+```
+
+**图源**
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java)
+
+**模板集成机制:**
+1. **模板管理**:
+   - `ReportTemple`实体类对应数据库中的`report_temple`表,存储模板的基本信息
+   - `ReportTempleService`提供模板的增删改查功能
+   - 模板按报告类型进行分类管理,便于用户选择合适的模板
+2. **模板使用**:
+   - `ReportExportService`负责报告的导出功能
+   - 根据用户选择的模板ID获取模板信息
+   - 使用`com.deepoove.poi`库加载Word模板文件
+   - 构建数据模型,包含报告所需的所有数据
+   - 使用模板引擎渲染数据,生成最终的Word文档
+3. **导出记录**:
+   - 导出的报告信息记录在`ReportDocument`实体中
+   - 包含报告ID、文件名称、导出人、模板名称、模板ID、文件GUID和导出时间
+   - 便于后续的审计和追溯
+
+**本节来源**
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [ReportDocument.java](file://src/main/java/cn/cslg/pas/domain/ReportDocument.java)
+
+## 模块集成关系
+
+无效分析报告生成功能与专利项目、权要分析、证据管理等多个模块紧密集成,形成完整的报告生成体系。
+
+```mermaid
+graph TD
+subgraph "报告生成核心"
+ProjectFigureService[ProjectFigureService]
+ReportProjectService[ReportProjectService]
+ReportExportService[ReportExportService]
+end
+subgraph "基础模块"
+PatentProject[专利项目]
+PatentClaim[权要分析]
+EvidenceReason[证据管理]
+Permission[权限管理]
+File[文件管理]
+end
+subgraph "外部服务"
+PCS[人员中心服务]
+FMS[文件管理服务]
+end
+ProjectFigureService --> Permission : "获取创建人信息"
+ProjectFigureService --> File : "获取文件信息"
+ProjectFigureService --> PCS : "调用getPersonnelByIdsFromPCS"
+ProjectFigureService --> FMS : "调用getSystemFileFromFMS"
+ReportProjectService --> PatentProject : "关联专利项目"
+ReportProjectService --> PatentClaim : "引用权要分析"
+ReportProjectService --> EvidenceReason : "整合证据信息"
+ReportExportService --> ReportProjectService : "获取报告数据"
+ReportExportService --> File : "保存生成的报告"
+style ProjectFigureService fill:#f9f,stroke:#333
+style ReportProjectService fill:#f9f,stroke:#333
+style ReportExportService fill:#f9f,stroke:#333
+```
+
+**图源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ReportProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ReportProjectService.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+
+**集成关系说明:**
+1. **与专利项目的集成**:
+   - 通过`projectId`字段关联到具体的专利项目
+   - `ReportProjectService`负责管理报告与专利项目的关联关系
+   - 可以在报告中展示相关专利的基本信息和分析结果
+2. **与权要分析的集成**:
+   - 在报告中引用权要分析的结果
+   - 可以展示权利要求的对比分析、新颖性分析等内容
+   - 通过`PatentClaimMapper`等组件获取权要分析数据
+3. **与证据管理的集成**:
+   - 整合证据管理模块中的证据信息
+   - 在报告中展示证据链、证据对比等内容
+   - 通过`EvidenceReasonMapper`等组件获取证据数据
+4. **与权限管理的集成**:
+   - 使用`PermissionService`验证用户权限
+   - 确保用户只能访问和操作自己有权限的报告
+   - 获取创建人信息用于展示
+5. **与文件管理的集成**:
+   - 使用`FileManagerService`管理报告中的附件文件
+   - 支持上传、下载和预览各种格式的文件
+   - 通过GUID标识文件,实现文件的唯一引用
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ReportProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ReportProjectService.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+
+## API接口示例
+
+以下是无效分析报告生成相关的API接口示例,展示了如何通过HTTP请求与系统交互。
+
+```mermaid
+sequenceDiagram
+participant Client as 客户端
+participant API as PAS系统API
+participant DB as 数据库
+Client->>API : POST /api/projectFigure/updateProjectFigure
+API->>API : 解析请求体中的ProjectFigureDTO
+API->>DB : 查询或创建ProjectFigure记录
+API->>API : 返回操作结果
+API-->>Client : 200 OK {"code" : "200", "msg" : "保存成功"}
+Client->>API : POST /api/projectFigure/queryProjectFigures
+API->>DB : 根据projectId查询ProjectFigure列表
+DB-->>API : 返回ProjectFigure列表
+API->>API : 聚合创建人和文件信息
+API->>API : 转换为ProjectFigureVO列表
+API-->>Client : 200 OK {"code" : "200", "data" : [...]}
+Client->>API : POST /api/projectFigure/removeProjectFigures
+API->>API : 验证ID列表
+API->>DB : 批量删除ProjectFigure记录
+API-->>Client : 200 OK {"code" : "200", "msg" : "删除成功"}
+Client->>API : POST /api/report/export
+API->>API : 获取报告和模板信息
+API->>API : 构建数据模型
+API->>API : 渲染Word文档
+API->>API : 保存文件并记录导出信息
+API-->>Client : 200 OK {"code" : "200", "data" : "file-guid-123"}
+```
+
+**图源**
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+
+**API接口详情:**
+
+### 1. 保存或修改报告附图
+- **URL**: `/api/projectFigure/updateProjectFigure`
+- **方法**: POST
+- **请求体**:
+```json
+{
+  "id": 1,
+  "projectId": 1001,
+  "fileGuid": "096b899589bd488fbf93b38eed44f271",
+  "description": "描述2",
+  "figureTitle": "附图2"
+}
+```
+- **响应**:
+```json
+{
+  "code": "200",
+  "msg": "保存成功",
+  "data": null
+}
+```
+
+### 2. 查询附图
+- **URL**: `/api/projectFigure/queryProjectFigures`
+- **方法**: POST
+- **请求体**:
+```json
+{
+  "projectId": 1001
+}
+```
+- **响应**:
+```json
+{
+  "code": "200",
+  "msg": "success",
+  "data": [
+    {
+      "id": 1,
+      "projectId": 1001,
+      "fileGuid": "096b899589bd488fbf93b38eed44f271",
+      "description": "描述2",
+      "figureTitle": "附图2",
+      "createName": "张三",
+      "createTime": "2023-12-25",
+      "systemFile": {
+        "guid": "096b899589bd488fbf93b38eed44f271",
+        "fileName": "figure1.png",
+        "filePath": "/files/figure1.png",
+        "fileType": "image/png",
+        "fileSize": 10240,
+        "uploadTime": "2023-12-25T10:00:00"
+      }
+    }
+  ]
+}
+```
+
+### 3. 删除附图
+- **URL**: `/api/projectFigure/removeProjectFigures`
+- **方法**: POST
+- **请求体**:
+```json
+[1, 2, 3]
+```
+- **响应**:
+```json
+{
+  "code": "200",
+  "msg": "删除成功",
+  "data": null
+}
+```
+
+**本节来源**
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java)
+- [Response.java](file://src/main/java/cn/cslg/pas/common/utils/Response.java)
+
+## 异步处理与缓存策略
+
+系统采用异步处理和缓存策略来提高性能和用户体验。
+
+```mermaid
+flowchart TD
+subgraph "缓存策略"
+A[登录用户信息缓存] --> B[CacheUtils]
+C[人员信息缓存] --> B
+D[权限信息缓存] --> B
+end
+subgraph "异步处理"
+E[报告生成任务] --> F[异步线程池]
+G[文件上传任务] --> F
+H[数据同步任务] --> F
+end
+I[Redis] < --> B
+F --> J[任务完成通知]
+J --> K[前端WebSocket]
+style A fill:#ccf,stroke:#333
+style C fill:#ccf,stroke:#333
+style D fill:#ccf,stroke:#333
+style E fill:#cfc,stroke:#333
+style G fill:#cfc,stroke:#333
+style H fill:#cfc,stroke:#333
+```
+
+**图源**
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [LoginUtils.java](file://src/main/java/cn/cslg/pas/common/utils/LoginUtils.java)
+- [ThreadPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/ThreadPoolConfig.java)
+- [AsyncTaskPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/AsyncTaskPoolConfig.java)
+
+**异步处理机制:**
+1. **线程池配置**:
+   - 系统配置了专门的异步任务线程池
+   - 通过`ThreadPoolConfig`和`AsyncTaskPoolConfig`类进行配置
+   - 设置合理的线程数、队列大小和拒绝策略
+2. **异步任务类型**:
+   - 报告生成:耗时的报告生成任务在后台异步执行
+   - 文件上传:大文件上传任务异步处理,避免阻塞主线程
+   - 数据同步:与外部系统的数据同步任务异步执行
+3. **任务通知**:
+   - 使用WebSocket或轮询机制通知前端任务进度
+   - 任务完成后推送通知给用户
+
+**缓存策略:**
+1. **缓存组件**:
+   - 使用`CacheUtils`工具类封装缓存操作
+   - 基于Redis实现分布式缓存
+   - 提供统一的缓存接口
+2. **缓存内容**:
+   - 登录用户信息:减少频繁查询数据库
+   - 人员信息:提高创建人姓名查询效率
+   - 权限信息:加速权限验证过程
+   - 常用配置:减少配置文件读取次数
+3. **缓存管理**:
+   - 设置合理的缓存过期时间
+   - 提供缓存刷新机制
+   - 监控缓存命中率
+
+**本节来源**
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [LoginUtils.java](file://src/main/java/cn/cslg/pas/common/utils/LoginUtils.java)
+- [ThreadPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/ThreadPoolConfig.java)
+- [AsyncTaskPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/AsyncTaskPoolConfig.java)
+
+## 性能优化方案
+
+系统采用多种性能优化方案,确保在高并发场景下的稳定性和响应速度。
+
+```mermaid
+graph TD
+A[性能优化方案] --> B[数据库优化]
+A --> C[缓存优化]
+A --> D[异步处理]
+A --> E[批量操作]
+A --> F[连接池优化]
+B --> B1[索引优化]
+B --> B2[查询优化]
+B --> B3[分页查询]
+C --> C1[热点数据缓存]
+C --> C2[缓存预热]
+C --> C3[缓存穿透防护]
+D --> D1[异步线程池]
+D --> D2[任务队列]
+E --> E1[批量插入]
+E --> E2[批量更新]
+E --> E3[批量删除]
+F --> F1[数据库连接池]
+F --> F2[HTTP连接池]
+style B fill:#f96,stroke:#333
+style C fill:#f96,stroke:#333
+style D fill:#f96,stroke:#333
+style E fill:#f96,stroke:#333
+style F fill:#f96,stroke:#333
+```
+
+**图源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ReportProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ReportProjectService.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [ThreadPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/ThreadPoolConfig.java)
+
+**性能优化措施:**
+
+### 1. 数据库优化
+- **索引优化**:在`project_figure`表的`project_id`和`create_id`字段上创建索引,提高查询效率
+- **查询优化**:使用MyBatis-Plus的LambdaQueryWrapper构建高效查询,避免N+1查询问题
+- **分页查询**:对于大量数据的查询,采用分页方式减少单次查询的数据量
+
+### 2. 缓存优化
+- **热点数据缓存**:将频繁访问的数据(如用户信息、权限信息)缓存到Redis中
+- **缓存预热**:在系统启动时预加载常用数据到缓存
+- **缓存穿透防护**:对不存在的数据也进行缓存(空值缓存),防止恶意请求击穿缓存
+
+### 3. 异步处理
+- **耗时操作异步化**:将报告生成、文件处理等耗时操作放入异步线程池执行
+- **任务队列**:使用消息队列缓冲大量并发请求,避免系统过载
+
+### 4. 批量操作
+- **批量插入**:使用MyBatis-Plus的`saveBatch`方法批量插入数据
+- **批量更新**:使用`updateBatchById`方法批量更新数据
+- **批量删除**:使用`removeBatchByIds`方法批量删除数据
+
+### 5. 连接池优化
+- **数据库连接池**:配置合理的数据库连接池参数,提高数据库连接复用率
+- **HTTP连接池**:对外部服务调用使用HTTP连接池,减少连接创建开销
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ReportProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ReportProjectService.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [ThreadPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/ThreadPoolConfig.java)
+
+## 常见问题与解决方案
+
+针对无效分析报告生成过程中可能遇到的常见问题,提供相应的解决方案。
+
+```mermaid
+flowchart TD
+A[常见问题] --> B[数据延迟]
+A --> C[报告内容不完整]
+A --> D[权限不足]
+A --> E[文件上传失败]
+A --> F[模板加载失败]
+B --> B1[检查缓存是否过期]
+B --> B2[验证数据同步状态]
+B --> B3[手动刷新缓存]
+C --> C1[检查数据源完整性]
+C --> C2[验证必填字段]
+C --> C3[重新生成报告]
+D --> D1[检查用户角色]
+D --> D2[验证项目权限]
+D --> D3[联系管理员]
+E --> E1[检查文件大小限制]
+E --> E2[验证文件类型]
+E --> E3[重试上传]
+F --> F1[检查模板文件存在]
+F --> F2[验证模板格式]
+F --> F3[重新上传模板]
+style B fill:#f66,stroke:#333
+style C fill:#f66,stroke:#333
+style D fill:#f66,stroke:#333
+style E fill:#f66,stroke:#333
+style F fill:#f66,stroke:#333
+```
+
+**问题1:数据延迟**
+- **现象**:新创建或更新的报告图在查询时未能立即显示最新数据
+- **原因**:
+  - 缓存未及时更新
+  - 数据同步延迟
+  - 数据库主从延迟
+- **解决方案**:
+  1. 检查`CacheUtils`中的缓存是否过期
+  2. 验证数据是否已成功写入数据库
+  3. 手动调用缓存刷新接口
+  4. 检查数据库主从同步状态
+
+**问题2:报告内容不完整**
+- **现象**:生成的报告缺少某些章节或数据
+- **原因**:
+  - 数据源不完整
+  - 必填字段未填写
+  - 模板配置错误
+- **解决方案**:
+  1. 检查相关模块的数据是否完整
+  2. 验证报告所需的必填字段是否都已填写
+  3. 检查模板文件是否包含所有必要的占位符
+  4. 重新生成报告
+
+**问题3:权限不足**
+- **现象**:用户无法创建、更新或查看报告
+- **原因**:
+  - 用户角色权限不足
+  - 项目权限配置错误
+  - 组织架构变更
+- **解决方案**:
+  1. 检查用户的角色和权限设置
+  2. 验证用户是否具有该项目的访问权限
+  3. 联系系统管理员调整权限
+  4. 检查组织架构是否发生变化
+
+**问题4:文件上传失败**
+- **现象**:报告附图或附件上传失败
+- **原因**:
+  - 文件大小超过限制
+  - 文件类型不支持
+  - 网络连接问题
+- **解决方案**:
+  1. 检查文件大小是否超过系统限制
+  2. 验证文件类型是否在允许的范围内
+  3. 检查网络连接是否稳定
+  4. 重新尝试上传
+
+**问题5:模板加载失败**
+- **现象**:报告生成时无法加载模板文件
+- **原因**:
+  - 模板文件不存在
+  - 模板文件损坏
+  - 文件路径错误
+- **解决方案**:
+  1. 检查模板文件是否存在于指定路径
+  2. 验证模板文件是否完整且未损坏
+  3. 检查文件路径配置是否正确
+  4. 重新上传模板文件
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ReportExportService.java](file://src/main/java/cn/cslg/pas/service/ReportExportService.java)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+
+## 监控与调试方法
+
+为确保系统的稳定运行,提供了一系列监控和调试方法。
+
+```mermaid
+graph TD
+A[监控与调试] --> B[日志监控]
+A --> C[性能监控]
+A --> D[错误追踪]
+A --> E[调试工具]
+B --> B1[业务日志]
+B --> B2[错误日志]
+B --> B3[访问日志]
+C --> C1[响应时间监控]
+C --> C2[数据库性能]
+C --> C3[内存使用]
+D --> D1[异常堆栈]
+D --> D2[请求链路]
+D --> D3[外部服务调用]
+E --> E1[断点调试]
+E --> E2[SQL监控]
+E --> E3[缓存监控]
+style B fill:#66f,stroke:#333
+style C fill:#66f,stroke:#333
+style D fill:#66f,stroke:#333
+style E fill:#66f,stroke:#333
+```
+
+**图源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/exception/GlobalExceptionHandler.java)
+- [LogbackConfig.java](file://src/main/resources/config/logback-spring.xml)
+
+**监控方法:**
+
+### 1. 日志监控
+- **业务日志**:使用`@Slf4j`注解记录关键业务流程
+- **错误日志**:捕获并记录所有异常信息,包括堆栈跟踪
+- **访问日志**:记录所有API请求的详细信息,便于审计和分析
+
+### 2. 性能监控
+- **响应时间监控**:监控各接口的响应时间,设置告警阈值
+- **数据库性能**:监控SQL执行时间,识别慢查询
+- **内存使用**:监控JVM内存使用情况,预防内存泄漏
+
+### 3. 错误追踪
+- **异常堆栈**:完整记录异常堆栈信息,便于定位问题
+- **请求链路**:使用分布式追踪技术,跟踪请求的完整调用链路
+- **外部服务调用**:监控与外部服务(如PCS、FMS)的调用情况
+
+**调试方法:**
+
+### 1. 断点调试
+- 在`ProjectFigureService`的关键方法上设置断点
+- 使用IDE的调试功能逐步执行代码,观察变量值变化
+- 验证业务逻辑的正确性
+
+### 2. SQL监控
+- 启用MyBatis的SQL日志输出
+- 使用`application-dev.yml`配置文件开启SQL打印
+- 分析生成的SQL语句,优化查询性能
+
+### 3. 缓存监控
+- 使用Redis客户端工具查看缓存内容
+- 监控缓存命中率和失效情况
+- 验证缓存数据的正确性和时效性
+
+**本节来源**
+- [ProjectFigureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/ProjectFigureService.java)
+- [ProjectFigureController.java](file://src/main/java/cn/cslg/pas/controller/ProjectFigureController.java)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/exception/GlobalExceptionHandler.java)
+- [LogbackConfig.java](file://src/main/resources/config/logback-spring.xml)

File diff suppressed because it is too large
+ 266 - 0
.qoder/repowiki/zh/content/业务逻辑层/无效分析/无效请求文件管理.md


+ 399 - 0
.qoder/repowiki/zh/content/业务逻辑层/无效分析/比对分组管理.md

@@ -0,0 +1,399 @@
+# 比对分组管理
+
+<cite>
+**本文档引用的文件**
+- [AssoGroupFeature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupFeature.java)
+- [AssoGroupFeatureController.java](file://src/main/java/cn/cslg/pas/controller/AssoGroupFeatureController.java)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java)
+- [AssoGroupFeatureMapper.java](file://src/main/java/cn/cslg/pas/mapper/InvalidReport/AssoGroupFeatureMapper.java)
+- [AssoGroupFeatureMapper.xml](file://src/main/resources/mapper/AssoGroupFeatureMapper.xml)
+- [AddFeatureGroupBatchDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/AddFeatureGroupBatchDTO.java)
+- [UpdateGroupFeatureDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/UpdateGroupFeatureDTO.java)
+- [RemoveGroupFeatureDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/RemoveGroupFeatureDTO.java)
+- [QueryFeatureHistoryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryFeatureHistoryDTO.java)
+- [QueryEvidenceReasonVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidVO/QueryEvidenceReasonVO.java)
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java)
+- [ProofGroup.java](file://src/main/java/cn/cslg/pas/domain/business/ProofGroup.java)
+- [InvalidStatutes.java](file://src/main/java/cn/cslg/pas/domain/business/InvalidStatutes.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [比对分组数据模型](#比对分组数据模型)
+3. [比对分组创建与批量操作](#比对分组创建与批量操作)
+4. [特征关联与历史追踪](#特征关联与历史追踪)
+5. [AssoGroupFeatureService核心逻辑](#assogroupfeatureservice核心逻辑)
+6. [分组与专利权要、证据理由的关联机制](#分组与专利权要证据理由的关联机制)
+7. [API接口与批量操作示例](#api接口与批量操作示例)
+8. [事务处理与数据完整性](#事务处理与数据完整性)
+9. [常见问题与性能优化](#常见问题与性能优化)
+
+## 简介
+比对分组管理功能是PAS系统中用于管理专利无效宣告程序中证据组合与技术特征关联的核心模块。该功能支持特征的创建、修改、删除以及历史追踪,实现了对专利权要、证据理由与技术特征之间复杂关系的精细化管理。系统通过世代(gen)机制记录特征的演变过程,确保审查过程的可追溯性。
+
+## 比对分组数据模型
+
+```mermaid
+classDiagram
+class AssoGroupFeature {
++Integer featureOrder
++Integer featureGen
++Integer featureId
++String featureText
++Integer featurePreId
++Integer groupId
++Integer operateMode
++String invalidReasonDetail1
++String invalidReasonDetail2
++String presentOpinions1
++String presentOpinions2
++String ifPresentOpinions1
++String ifPresentOpinions2
++String rbOpinions
++String rbDecisionKey
++String common
++String rbSummary
++String prosecutorOpinions1
++String respondentOpinions1
++String thirdOpinions1
++String courtOpinions1
++String prosecutorOpinions2
++String respondentOpinions2
++String thirdOpinions2
++String courtOpinions2
+}
+class Feature {
++String content
++String createId
++String createTime
++String updateId
++String updateTime
+}
+class ProofGroup {
++Integer invalidStatutesId
++Integer order
++String createId
++String createTime
++String updateId
++String updateTime
+}
+class InvalidStatutes {
++Integer claimId
++String statutes
++String createId
++String createTime
++String updateId
++String updateTime
+}
+AssoGroupFeature --> Feature : "关联"
+AssoGroupFeature --> ProofGroup : "属于"
+ProofGroup --> InvalidStatutes : "引用"
+InvalidStatutes --> PatentClaim : "对应"
+```
+
+**图示来源**
+- [AssoGroupFeature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupFeature.java#L9-L133)
+- [Feature.java](file://src/main/java/cn/cslg/pas/domain/business/Feature.java)
+- [ProofGroup.java](file://src/main/java/cn/cslg/pas/domain/business/ProofGroup.java)
+- [InvalidStatutes.java](file://src/main/java/cn/cslg/pas/domain/business/InvalidStatutes.java)
+
+**本节来源**
+- [AssoGroupFeature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupFeature.java#L9-L133)
+
+## 比对分组创建与批量操作
+
+### 批量创建流程
+比对分组的批量创建通过`addFeatureGroupBatch`接口实现,该操作会根据专利权要ID关联的无效法条,自动为所有相关的证据组合添加新的技术特征。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "AssoGroupFeatureController"
+participant Service as "AssoGroupFeatureService"
+participant FeatureService as "FeatureService"
+participant ProofGroupService as "ProofGroupService"
+Client->>Controller : POST /api/groupFeature/addFeatureGroupBatch
+Controller->>Service : addFeatureGroupBatch(AddFeatureGroupBatchDTO)
+Service->>FeatureService : 创建新特征
+FeatureService-->>Service : 返回特征ID
+Service->>Service : 查询权要关联的无效法条
+Service->>ProofGroupService : 查询法条关联的证据组合
+ProofGroupService-->>Service : 返回证据组合列表
+loop 每个证据组合
+Service->>Service : 计算特征排序
+Service->>Service : 创建AssoGroupFeature关联
+end
+Service-->>Controller : 操作成功
+Controller-->>Client : 返回成功响应
+```
+
+**图示来源**
+- [AssoGroupFeatureController.java](file://src/main/java/cn/cslg/pas/controller/AssoGroupFeatureController.java#L73-L78)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L436-L487)
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L436-L487)
+- [AddFeatureGroupBatchDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/AddFeatureGroupBatchDTO.java#L6-L11)
+
+## 特征关联与历史追踪
+
+### 特征修改与世代管理
+系统通过`featureGen`字段管理特征的世代,支持特征的修改历史追踪。当特征被修改时,系统会创建新的世代记录,保留原始特征内容。
+
+```mermaid
+flowchart TD
+Start([开始修改特征]) --> ValidateInput["验证输入参数"]
+ValidateInput --> CheckFirstEdit{"是否首次编辑?"}
+CheckFirstEdit --> |是| SetGen["设置世代为1"]
+CheckFirstEdit --> |否| SetGen2["设置世代为2"]
+SetGen --> QueryHistory["查询特征历史"]
+SetGen2 --> QueryHistory
+QueryHistory --> CheckExist{"世代是否存在?"}
+CheckExist --> |否| CreateNew["创建新世代记录"]
+CheckExist --> |是| UpdateExist["更新现有记录"]
+CreateNew --> InsertDB["插入数据库"]
+UpdateExist --> UpdateDB["更新数据库"]
+InsertDB --> End([操作完成])
+UpdateDB --> End
+```
+
+**图示来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L84-L149)
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L84-L149)
+- [UpdateGroupFeatureDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/UpdateGroupFeatureDTO.java#L11-L20)
+
+### 历史查询机制
+系统提供完整的特征历史查询功能,支持追溯特征的修改、删除等操作记录。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "AssoGroupFeatureController"
+participant Service as "AssoGroupFeatureService"
+Client->>Controller : POST /api/groupFeature/queryFeatureHistory
+Controller->>Service : queryFeatureHistory(QueryFeatureHistoryDTO)
+Service->>Service : getHistory()
+Service->>Service : 查询当前特征
+Service->>Service : 查询第一世代历史
+Service->>Service : 查询第二世代历史
+Service->>Service : loadFeatureHistory()
+Service->>Service : 关联特征内容
+Service-->>Controller : 返回历史记录
+Controller-->>Client : 返回特征历史
+```
+
+**图示来源**
+- [AssoGroupFeatureController.java](file://src/main/java/cn/cslg/pas/controller/AssoGroupFeatureController.java#L50-L56)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L201-L255)
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L201-L255)
+- [QueryFeatureHistoryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryFeatureHistoryDTO.java)
+
+## AssoGroupFeatureService核心逻辑
+
+### 特征聚合与分组优化
+`AssoGroupFeatureService`服务实现了特征的聚合管理,通过`getFeatureIdsByGroupId`方法可以快速获取指定证据组合下的所有特征ID。
+
+```mermaid
+flowchart TD
+A[getFeatureIdsByGroupId] --> B["创建LambdaQueryWrapper"]
+B --> C["设置查询条件: groupId"]
+C --> D["选择字段: featureId"]
+D --> E["执行查询"]
+E --> F{"查询结果是否为空?"}
+F --> |否| G["返回特征ID列表"]
+F --> |是| H["返回空列表"]
+```
+
+**图示来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L63-L75)
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L63-L75)
+
+### 冲突检测机制
+系统在特征操作过程中实现了冲突检测,通过`getGenGroupFeature`方法检查特定世代下是否存在重复的特征关联。
+
+```mermaid
+flowchart TD
+A[getGenGroupFeature] --> B["创建LambdaQueryWrapper"]
+B --> C["设置查询条件: groupId"]
+C --> D["设置查询条件: featureId"]
+D --> E["设置查询条件: featureGen"]
+E --> F["执行查询"]
+F --> G{"是否存在记录?"}
+G --> |是| H["返回现有记录"]
+G --> |否| I["返回null"]
+```
+
+**图示来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L294-L303)
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L294-L303)
+
+## 分组与专利权要、证据理由的关联机制
+
+### 三层关联模型
+系统建立了专利权要 → 无效法条 → 证据组合 → 技术特征的四级关联模型,确保了审查逻辑的完整性。
+
+```mermaid
+erDiagram
+PATENT_CLAIM {
+integer id PK
+string claim_text
+timestamp created_at
+timestamp updated_at
+}
+INVALID_STATUTES {
+integer id PK
+integer claim_id FK
+string statutes
+timestamp created_at
+timestamp updated_at
+}
+PROOF_GROUP {
+integer id PK
+integer invalid_statutes_id FK
+integer order
+timestamp created_at
+timestamp updated_at
+}
+ASSO_GROUP_FEATURE {
+integer id PK
+integer group_id FK
+integer feature_id FK
+integer feature_order
+integer feature_gen
+integer operate_mode
+timestamp created_at
+timestamp updated_at
+}
+FEATURE {
+integer id PK
+string content
+timestamp created_at
+timestamp updated_at
+}
+PATENT_CLAIM ||--o{ INVALID_STATUTES : "包含"
+INVALID_STATUTES ||--o{ PROOF_GROUP : "支持"
+PROOF_GROUP ||--o{ ASSO_GROUP_FEATURE : "包含"
+FEATURE ||--o{ ASSO_GROUP_FEATURE : "关联"
+```
+
+**图示来源**
+- [AssoGroupFeature.java](file://src/main/java/cn/cslg/pas/domain/business/AssoGroupFeature.java#L9-L133)
+- [ProofGroup.java](file://src/main/java/cn/cslg/pas/domain/business/ProofGroup.java)
+- [InvalidStatutes.java](file://src/main/java/cn/cslg/pas/domain/business/InvalidStatutes.java)
+- [PatentClaim.java](file://src/main/java/cn/cslg/pas/domain/business/PatentClaim.java)
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L451-L482)
+- [QueryEvidenceReasonVO.java](file://src/main/java/cn/cslg/pas/common/vo/invalidVO/QueryEvidenceReasonVO.java#L11-L23)
+
+## API接口与批量操作示例
+
+### 主要API接口
+以下是比对分组管理模块提供的主要API接口:
+
+| 接口名称 | HTTP方法 | 路径 | 功能描述 |
+|---------|--------|------|---------|
+| 修改特征 | POST | /api/groupFeature/updateGroupFeature | 修改特征内容并创建新世代 |
+| 删除特征 | POST | /api/groupFeature/removeGroupFeature | 标记特征为删除状态 |
+| 查询历史 | POST | /api/groupFeature/queryFeatureHistory | 查询特征修改历史 |
+| 批量添加 | POST | /api/groupFeature/addFeatureGroupBatch | 批量为证据组合添加特征 |
+| 更新信息 | POST | /api/groupFeature/updateMessage | 更新特征关联的附加信息 |
+| 取消删除 | GET | /api/groupFeature/cancelRemoveFeature | 取消特征的删除操作 |
+
+**本节来源**
+- [AssoGroupFeatureController.java](file://src/main/java/cn/cslg/pas/controller/AssoGroupFeatureController.java#L33-L87)
+
+### 批量操作示例
+批量添加特征的API调用示例如下:
+
+```json
+{
+  "claimId": 123,
+  "featureText": "一种改进的散热结构",
+  "gen": 1,
+  "common": "首次添加特征"
+}
+```
+
+该操作会:
+1. 根据`claimId`查询关联的无效法条
+2. 根据无效法条查询所有证据组合
+3. 为每个证据组合创建新的特征关联
+4. 维护特征的排序和世代信息
+
+**本节来源**
+- [AddFeatureGroupBatchDTO.java](file://src/main/java/cn/cslg/pas/common/dto/invalidDTO/AddFeatureGroupBatchDTO.java#L6-L11)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L436-L487)
+
+## 事务处理与数据完整性
+
+### 事务管理
+关键操作如批量添加特征使用了`@Transactional`注解确保数据一致性,任何步骤失败都会触发回滚。
+
+```mermaid
+flowchart TD
+A[开始事务] --> B["添加新特征"]
+B --> C{"成功?"}
+C --> |否| D[事务回滚]
+C --> |是| E["查询无效法条"]
+E --> F{"成功?"}
+F --> |否| D
+F --> |是| G["查询证据组合"]
+G --> H{"成功?"}
+H --> |否| D
+H --> |是| I["批量创建关联"]
+I --> J{"全部成功?"}
+J --> |否| D
+J --> |是| K[提交事务]
+```
+
+**图示来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L436)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L436-L487)
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java#L436)
+
+### 数据完整性保障
+系统通过以下机制保障数据完整性:
+- 使用MyBatis Plus的`LambdaQueryWrapper`构建类型安全的查询
+- 在关键操作中使用`insert()`和`updateById()`方法确保操作原子性
+- 通过`removeByIds()`批量删除操作减少数据库交互次数
+- 利用`CacheUtils`和`LoginUtils`确保用户会话和权限的一致性
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java)
+- [AssoGroupFeatureMapper.xml](file://src/main/resources/mapper/AssoGroupFeatureMapper.xml)
+
+## 常见问题与性能优化
+
+### 常见问题及解决方案
+
+| 问题类型 | 现象 | 解决方案 |
+|--------|------|---------|
+| 分组冲突 | 同一特征在不同世代出现冲突 | 检查`getGenGroupFeature`方法的查询条件 |
+| 特征遗漏 | 批量操作后部分证据组合未添加特征 | 验证`addFeatureGroupBatch`中的循环逻辑 |
+| 排序错误 | 特征顺序显示不正确 | 检查`updateGroupFeatureOrder`方法的排序逻辑 |
+| 历史丢失 | 无法查询到完整的修改历史 | 验证世代(gen)字段的正确性 |
+
+**本节来源**
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java)
+
+### 性能优化建议
+1. **批量操作优化**:对于大量特征的批量操作,建议使用批处理模式减少数据库交互次数
+2. **缓存策略**:对频繁查询的特征关联数据使用Redis缓存
+3. **索引优化**:确保`asso_group_feature`表在`groupId`、`featureId`、`featureGen`字段上有适当的索引
+4. **分页查询**:对于大量历史记录的查询,实现分页机制避免内存溢出
+5. **异步处理**:对于耗时的批量操作,考虑使用消息队列进行异步处理
+
+**本节来源**
+- [AssoGroupFeatureMapper.xml](file://src/main/resources/mapper/AssoGroupFeatureMapper.xml)
+- [AssoGroupFeatureService.java](file://src/main/java/cn/cslg/pas/service/business/invalidReport/AssoGroupFeatureService.java)

File diff suppressed because it is too large
+ 407 - 0
.qoder/repowiki/zh/content/业务逻辑层/无效分析/证据与理由管理.md


+ 311 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/对比分析管理.md

@@ -0,0 +1,311 @@
+# 对比分析管理
+
+<cite>
+**本文档引用的文件**
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java)
+- [QueryNoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/QueryNoveltyCompareRecordDTO.java)
+- [NoveltyCompareRecordQueryVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyCompareRecordQueryVO.java)
+- [NoveltyCompareLiterature.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyCompareLiterature.java)
+- [NoveltyCompareLiteratureService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareLiteratureService.java)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java)
+- [CompareLiterature.java](file://src/main/java/cn/cslg/pas/domain/business/CompareLiterature.java)
+- [CompareLiteratureService.java](file://src/main/java/cn/cslg/pas/service/business/CompareLiteratureService.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [对比记录的业务流程](#对比记录的业务流程)
+3. [对比记录与文献的关系](#对比记录与文献的关系)
+4. [关键字段定义与用途](#关键字段定义与用途)
+5. [RESTful API接口文档](#restful-api接口文档)
+6. [数据验证规则与业务逻辑约束](#数据验证规则与业务逻辑约束)
+7. [常见问题与性能优化](#常见问题与性能优化)
+8. [结论](#结论)
+
+## 简介
+
+PAS系统中的对比分析管理功能是查新分析的核心组成部分,主要用于管理专利查新过程中的对比记录。该功能允许用户创建、编辑、查询和删除对比记录,并将这些记录与具体的对比文献关联起来。通过这些对比记录,用户可以详细记录和分析现有技术与待查新专利之间的技术特征、新颖性和创造性判断。
+
+对比分析管理功能主要由`NoveltyCompareRecordController`和`NoveltyCompareRecordService`两个核心组件构成,它们通过RESTful API提供服务,并与Elasticsearch和MySQL数据库进行交互,实现数据的持久化存储和高效查询。
+
+**文档来源**
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L1-L35)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L1-L27)
+
+## 对比记录的业务流程
+
+### 添加对比记录
+
+添加对比记录的业务流程如下:
+
+1. **接收请求**:`NoveltyCompareRecordController`的`edit`方法接收包含对比记录信息的`NoveltyCompareRecordDTO`对象。
+2. **设置使用类型**:在处理请求时,系统会自动将`useType`字段设置为2,表示这是一个查新报告对比记录。
+3. **调用服务层**:控制器调用`NoveltyCompareRecordService`的`addOrUpdateCompareRecord`方法。
+4. **添加对比文献**:服务层首先调用`CompareLiteratureService`的`addPatentCompareLiterature`方法,将专利作为对比文献添加到项目中。
+5. **添加查新对比文件**:然后调用`NoveltyCompareLiteratureService`的`addCompareFile`方法,创建查新报告对比文件的关联。
+6. **保存到Elasticsearch**:最后,将对比记录信息封装成`Marking`对象,并通过`EsScratchWordsService`的`saveToEs`方法保存到Elasticsearch索引中。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "NoveltyCompareRecordController"
+participant Service as "NoveltyCompareRecordService"
+participant CompareLiteratureService as "CompareLiteratureService"
+participant NoveltyCompareLiteratureService as "NoveltyCompareLiteratureService"
+participant EsScratchWordsService as "EsScratchWordsService"
+Client->>Controller : POST /noveltyCompareRecord/edit
+Controller->>Service : addOrUpdateCompareRecord()
+Service->>CompareLiteratureService : addPatentCompareLiterature()
+CompareLiteratureService-->>Service : 返回对比文献ID
+Service->>NoveltyCompareLiteratureService : addCompareFile()
+NoveltyCompareLiteratureService-->>Service : 返回查新对比文件ID
+Service->>EsScratchWordsService : saveToEs()
+EsScratchWordsService-->>Service : 返回Elasticsearch ID
+Service-->>Controller : 返回ID
+Controller-->>Client : 返回成功响应
+```
+
+**图示来源**
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L47-L85)
+- [CompareLiteratureService.java](file://src/main/java/cn/cslg/pas/service/business/CompareLiteratureService.java#L176-L201)
+- [NoveltyCompareLiteratureService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareLiteratureService.java#L180-L197)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L277-L285)
+
+### 编辑对比记录
+
+编辑对比记录的业务流程与添加类似,主要区别在于:
+
+1. **检查ID**:`addOrUpdateCompareRecord`方法首先检查`NoveltyCompareRecordDTO`中的`id`字段。
+2. **调用更新方法**:如果`id`不为空,则调用`updateCompareRecord`方法进行更新。
+3. **更新Elasticsearch**:`updateCompareRecord`方法会调用`EsScratchWordsService`的`updateScratchWords`方法,根据ID更新Elasticsearch中的记录。
+
+### 查询对比记录
+
+查询对比记录的业务流程如下:
+
+1. **接收查询请求**:`NoveltyCompareRecordController`的`queryCompareRecord`方法接收`QueryNoveltyCompareRecordDTO`对象。
+2. **查询所有记录**:`NoveltyCompareRecordService`的`queryCompareRecord`方法首先调用`EsScratchWordsService`的`queryNoveltyRecord`方法,根据项目ID查询该项目下的所有对比记录。
+3. **查询关联信息**:然后调用`NoveltyCompareLiteratureService`的`queryCompareFile`方法,获取与这些记录关联的查新对比文件信息。
+4. **获取文件信息**:如果记录中包含图片URL,则调用`FileManagerService`从FMS系统获取文件信息。
+5. **组装返回数据**:最后,将Elasticsearch中的记录信息与数据库中的关联信息合并,组装成`NoveltyCompareRecordQueryVO`对象列表返回。
+
+### 删除对比记录
+
+删除对比记录的业务流程非常直接:
+
+1. **接收删除请求**:`NoveltyCompareRecordController`的`remove`方法接收一个包含多个ID的列表。
+2. **调用删除服务**:控制器调用`NoveltyCompareRecordService`的`removeCompareRecord`方法。
+3. **从Elasticsearch删除**:服务层遍历ID列表,调用`EsScratchWordsService`的`removeById`方法,从Elasticsearch中删除对应的记录。
+
+**业务流程来源**
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L107-L180)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L250)
+
+## 对比记录与文献的关系
+
+在PAS系统中,对比记录(`NoveltyCompareRecord`)与对比文献(`CompareLiterature`)之间存在紧密的关联关系。这种关系通过`NoveltyCompareLiterature`实体进行管理,形成了一个三层的关联结构。
+
+### 实体关系
+
+1. **CompareLiterature (对比文献)**:这是最基础的实体,存储在MySQL数据库的`compare_literature`表中。它代表了项目中的一个具体的对比文献,可以是专利或非专利文献。
+2. **NoveltyCompareLiterature (查新报告对比文件)**:这是中间关联实体,存储在`novelty_compare_literature`表中。它将`CompareLiterature`与查新报告的特定检索记录(`retrieve_record_id`)关联起来,并存储了与查新分析相关的额外信息,如相关度、影响新颖性、总说明、现有技术要点等。
+3. **NoveltyCompareRecord (对比记录)**:这是最上层的实体,实际上存储在Elasticsearch的`patent_marking`索引中。它代表了对某个对比文献的具体标注和分析,包含了技术特征、新颖性判断等详细信息。
+
+### 关联流程
+
+当用户添加一个对比记录时,系统会自动完成以下关联:
+
+1. **创建或复用对比文献**:系统首先检查指定的专利号是否已经作为对比文献存在于项目中。如果不存在,则创建一个新的`CompareLiterature`记录。
+2. **创建查新对比文件关联**:然后,系统会创建一个`NoveltyCompareLiterature`记录,将`CompareLiterature`与当前的查新检索记录关联起来。
+3. **创建对比记录**:最后,系统将用户的分析内容(技术特征、判断等)作为一个`Marking`对象保存到Elasticsearch中。
+
+这种设计实现了数据的分层存储:基础文献信息存储在关系型数据库中以保证数据一致性,而频繁变化的分析记录则存储在Elasticsearch中以保证查询性能。
+
+```mermaid
+erDiagram
+CompareLiterature {
+integer id PK
+integer projectId
+string literatureNo
+string name
+date publicDate
+}
+NoveltyCompareLiterature {
+integer id PK
+integer compareLitertureId FK
+integer retrieveRecordId
+string relevance
+string ifEffectinv
+string generalRemark
+string technicalPoints
+string excuteCase
+string beneficialEffect
+}
+PatentMarking {
+string id PK
+string patentNo
+string markSelectField
+string markSelectText
+string technicalFeature
+string markNoteText
+date markTime
+}
+CompareLiterature ||--o{ NoveltyCompareLiterature : "1对多"
+NoveltyCompareLiterature }o--|| PatentMarking : "1对1"
+```
+
+**图示来源**
+- [CompareLiterature.java](file://src/main/java/cn/cslg/pas/domain/business/CompareLiterature.java#L1-L53)
+- [NoveltyCompareLiterature.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyCompareLiterature.java#L1-L74)
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java#L1-L87)
+
+## 关键字段定义与用途
+
+### 对比记录关键字段
+
+| 字段名 | 类型 | 用途说明 |
+| :--- | :--- | :--- |
+| `id` | String | Elasticsearch生成的唯一标识符,用于标识和更新特定的对比记录 |
+| `patentNo` | String | 对比文献的专利号,用于关联具体的专利文献 |
+| `projectId` | Integer | 所属项目的ID,用于组织和查询 |
+| `retrieveRecordId` | Integer | 关联的查新检索记录ID,用于确定该记录属于哪个检索 |
+| `markSelectField` | String | 标注的栏位,如"权利要求"、"说明书"等,指明分析的来源位置 |
+| `markSelectText` | String | 标注选择的文本内容,通常是专利文档中的具体段落 |
+| `technicalFeature` | String | 提取的技术特征,是对标注文本的技术性概括 |
+| `markNoteText` | String | 标注备注,包含用户对新颖性、创造性等的判断和分析 |
+| `markColor` | String | 标注颜色,用于在UI上进行视觉区分 |
+| `markTime` | Date | 标注时间,记录创建或最后修改的时间 |
+| `markUserId` | String | 标注人ID,记录创建该记录的用户 |
+| `publicTenantId` | Integer | 租户ID,用于多租户环境下的数据隔离 |
+
+### 查新对比文件关键字段
+
+| 字段名 | 类型 | 用途说明 |
+| :--- | :--- | :--- |
+| `relevance` | String | 相关度,描述该文献与待查新专利的相关程度 |
+| `ifEffectinv` | String | 是否影响新颖性,是/否判断 |
+| `generalRemark` | String | 总说明,对该文献的总体评价 |
+| `technicalPoints` | String | 现有技术要点,总结该文献披露的核心技术 |
+| `excuteCase` | String | 实施方案,描述文献中的具体实施方式 |
+| `beneficialEffect` | String | 有益效果,说明该技术方案带来的好处 |
+
+**关键字段来源**
+- [NoveltyCompareRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyCompareRecordDTO.java#L24-L87)
+- [NoveltyCompareLiterature.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyCompareLiterature.java#L32-L72)
+
+## RESTful API接口文档
+
+### 添加或编辑对比记录
+
+- **端点**: `POST /api/xiaoshi/noveltyCompareRecord/edit`
+- **请求体**: `NoveltyCompareRecordDTO` 对象
+- **认证要求**: 需要有效的用户会话(通过Cookie或Token)
+- **成功响应**: 
+  ```json
+  {
+    "code": 200,
+    "message": "Success",
+    "data": "elasticsearch-generated-id"
+  }
+  ```
+- **错误处理**: 
+  - 如果用户未登录,返回401状态码
+  - 如果保存失败,返回500状态码和错误信息
+
+### 删除对比记录
+
+- **端点**: `POST /api/xiaoshi/noveltyCompareRecord/remove`
+- **请求体**: 包含多个ID的字符串列表
+- **认证要求**: 需要有效的用户会话
+- **成功响应**: 
+  ```json
+  {
+    "code": 200,
+    "message": "Success",
+    "data": ["id1", "id2", "id3"]
+  }
+  ```
+- **错误处理**: 
+  - 如果删除过程中发生异常,会捕获异常但仍然返回成功,这可能是一个潜在的问题
+
+### 查询对比记录
+
+- **端点**: `POST /api/xiaoshi/noveltyCompareRecord/queryCompareRecord`
+- **请求体**: `QueryNoveltyCompareRecordDTO` 对象,包含`projectId`和可选的`patentNo`
+- **认证要求**: 需要有效的用户会话
+- **成功响应**: 
+  ```json
+  {
+    "code": 200,
+    "message": "Success",
+    "data": [
+      {
+        "id": "elasticsearch-id",
+        "patentNo": "CN123456789",
+        "technicalFeature": "一种新型的连接结构",
+        "markNoteText": "该技术特征与待查新专利的权利要求1相比,缺少...,因此不破坏新颖性。",
+        "generalRemark": "该文献公开了类似的技术领域...",
+        "technicalPoints": "通过螺纹连接实现快速组装..."
+      }
+    ]
+  }
+  ```
+- **错误处理**: 
+  - 如果查询参数为空,返回400状态码
+  - 如果ES查询失败,返回500状态码
+
+**API接口来源**
+- [NoveltyCompareRecordController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyCompareRecordController.java#L33-L55)
+
+## 数据验证规则与业务逻辑约束
+
+### 数据验证规则
+
+1. **必填字段验证**:在添加对比记录时,系统会验证`patentNo`和`projectId`等关键字段是否为空。
+2. **用户信息验证**:系统会通过`CacheUtils`和`LoginUtils`验证当前用户是否已登录,并获取用户信息用于设置`markUserId`和`publicTenantId`。
+3. **专利号格式验证**:虽然代码中没有显式的格式验证,但在调用`EsPatentService`获取专利信息时,会进行基本的格式检查。
+
+### 业务逻辑约束
+
+1. **项目范围约束**:所有操作都必须在特定项目范围内进行,确保数据的组织性和隔离性。
+2. **权限约束**:只有项目成员或具有相应权限的用户才能创建、编辑或删除对比记录。
+3. **关联完整性**:系统确保`NoveltyCompareRecord`、`NoveltyCompareLiterature`和`CompareLiterature`之间的关联完整性。当添加一个对比记录时,相关的文献和关联记录会自动创建或复用。
+4. **异步删除**:删除操作在发生异常时会被静默处理,这虽然保证了接口的稳定性,但也可能导致数据不一致,是一个需要改进的地方。
+
+**数据验证来源**
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L52-L74)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L51-L56)
+
+## 常见问题与性能优化
+
+### 常见问题
+
+1. **记录更新失败**:如果Elasticsearch服务不可用,更新操作会失败。解决方案是确保ES集群的高可用性,并在客户端实现重试机制。
+2. **查询结果为空**:可能的原因包括:
+   - 项目ID错误
+   - 专利号拼写错误
+   - 数据尚未同步到Elasticsearch
+   解决方案是检查输入参数,并确认数据已正确保存。
+3. **删除操作不彻底**:当前的删除逻辑只删除了Elasticsearch中的记录,但没有清理`NoveltyCompareLiterature`表中的关联记录,可能导致数据冗余。
+
+### 性能优化建议
+
+1. **Elasticsearch索引优化**:为`patent_marking`索引的`projectId`和`patentNo`字段创建合适的索引,以加速查询。
+2. **批量操作**:对于批量删除或查询操作,应使用Elasticsearch的批量API,减少网络往返次数。
+3. **缓存策略**:对于频繁查询但不常变化的数据(如对比文献的基本信息),可以引入Redis缓存,减少数据库查询压力。
+4. **异步处理**:对于耗时的操作(如文件上传、数据同步),可以采用消息队列(如RabbitMQ)进行异步处理,提高响应速度。
+
+**常见问题来源**
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java#L171-L179)
+- [EsScratchWordsService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java#L240-L250)
+
+## 结论
+
+PAS系统的对比分析管理功能通过精心设计的三层关联结构(对比文献、查新对比文件、对比记录),有效地支持了专利查新分析的复杂需求。该功能利用MySQL和Elasticsearch的混合存储架构,既保证了数据的一致性,又提供了高效的查询性能。
+
+核心的`NoveltyCompareRecordController`和`NoveltyCompareRecordService`组件提供了完整的CRUD操作,通过RESTful API与前端交互。关键字段的设计涵盖了技术特征提取、新颖性判断等查新分析的核心要素。
+
+尽管系统整体设计合理,但仍有一些可以改进的地方,如删除操作的完整性、错误处理的健壮性等。通过实施建议的性能优化措施,可以进一步提升系统的响应速度和用户体验。

+ 194 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新分析.md

@@ -0,0 +1,194 @@
+# 查新分析
+
+<cite>
+**本文档引用的文件**  
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+- [NoveltyReportTemplate.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportTemplate.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java)
+- [QueryRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/QueryRequest.java)
+- [EsQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsQueryBuilder.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 引言
+本文档深入探讨了PAS系统中查新分析功能的实现细节。文档详细解释了从查新项目的创建、检索记录管理到对比分析的完整业务流程。同时,文档还详细说明了查新报告模板的配置与使用,以及报告生成的具体实现机制。此外,文档还剖析了查新检索条件的构建逻辑,包括如何通过QueryRequest和EsQueryBuilder实现复杂的Elasticsearch查询。
+
+## 项目结构
+PAS系统的查新分析功能主要分布在`src/main/java/cn/cslg/pas`目录下,涉及多个子包,包括`common`、`controller`、`domain`、`mapper`、`service`等。查新相关的DTO、VO、实体类、服务类和控制器类分别位于不同的子包中,形成了清晰的分层架构。
+
+```mermaid
+graph TD
+A[src/main/java/cn/cslg/pas] --> B[common]
+A --> C[controller]
+A --> D[domain]
+A --> E[mapper]
+A --> F[service]
+B --> G[DTO/VO]
+C --> H[RetrieveRecordController]
+D --> I[RetrieveRecord]
+F --> J[RetrieveRecordService]
+F --> K[NoveltyProjectService]
+F --> L[NoveltyCompareRecordService]
+F --> M[NoveltyExportReportService]
+```
+
+**图示来源**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+
+## 核心组件
+查新分析功能的核心组件包括`NoveltyProjectService`、`RetrieveRecordService`、`NoveltyCompareRecordService`和`NoveltyExportReportService`。这些服务类分别负责查新项目的管理、检索记录的管理、对比分析的管理以及报告的生成。
+
+**组件来源**
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+
+## 架构概述
+查新分析功能的架构采用了典型的分层设计,包括控制器层、服务层、数据访问层和实体层。控制器层负责接收前端请求,服务层负责业务逻辑处理,数据访问层负责与数据库交互,实体层负责数据的封装。
+
+```mermaid
+graph TD
+A[前端] --> B[RetrieveRecordController]
+B --> C[RetrieveRecordService]
+C --> D[RetrieveRecordMapper]
+D --> E[RetrieveRecord]
+C --> F[NoveltyProjectService]
+F --> G[NoveltyProjectMapper]
+G --> H[NoveltyProject]
+C --> I[NoveltyCompareRecordService]
+I --> J[NoveltyCompareRecordMapper]
+J --> K[NoveltyCompareRecord]
+C --> L[NoveltyExportReportService]
+L --> M[NoveltyReportTemplateMapper]
+M --> N[NoveltyReportTemplate]
+```
+
+**图示来源**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+
+## 详细组件分析
+### 查新项目服务分析
+`NoveltyProjectService`是查新项目管理的核心服务类,负责查新项目的创建、更新、删除和查询。该服务类通过`addNoveltyProject`方法创建新的查新项目,并通过`updateNoveltyProject`方法更新现有项目。
+
+```mermaid
+classDiagram
+class NoveltyProjectService {
++addNoveltyProject(AddNoveltyProjectDTO) Integer
++updateNoveltyProject(AddNoveltyProjectDTO) Integer
++deleteNoveltyProject(NoveltyProjectIdDTO) void
++queryNoveltyProject(QueryNoveltyProjectDTO) Records
+}
+```
+
+**图示来源**
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+
+### 检索记录服务分析
+`RetrieveRecordService`负责管理用户的检索记录,包括添加、更新、删除和查询检索记录。该服务类通过`addRetrieveRecord`方法添加新的检索记录,并通过`queryRetrieveRecord`方法查询用户的检索历史。
+
+```mermaid
+classDiagram
+class RetrieveRecordService {
++addRetrieveRecord(RetrieveRecordDTO) Integer
++updateRetrieveRecord(RetrieveRecordDTO) Integer
++deleteRetrieveRecord(RetrieveRecordDeDTO) Integer[]
++queryRetrieveRecord(RetrieveRecordQueryDTO) Records
+}
+```
+
+**图示来源**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+
+### 对比分析服务分析
+`NoveltyCompareRecordService`负责管理查新项目的对比分析记录,包括添加、更新、删除和查询对比记录。该服务类通过`addCompareRecord`方法添加新的对比记录,并通过`queryCompareRecord`方法查询对比分析结果。
+
+```mermaid
+classDiagram
+class NoveltyCompareRecordService {
++addCompareRecord(NoveltyCompareRecordDTO) String
++updateCompareRecord(NoveltyCompareRecordDTO) String
++queryCompareRecord(QueryNoveltyCompareRecordDTO) NoveltyCompareRecordQueryVO[]
++removeCompareRecord(String[]) String[]
+}
+```
+
+**图示来源**
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+
+### 报告生成服务分析
+`NoveltyExportReportService`负责生成查新报告,该服务类通过`exportReport`方法生成报告,并通过`addReportReference`方法将报告保存到系统中。
+
+```mermaid
+classDiagram
+class NoveltyExportReportService {
++exportReport(Integer) String
++addReportReference(NoveltyReportReferences) String
++loadConfigure(String) Configure
++loadReportData(String, String) JSONObject
+}
+```
+
+**图示来源**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+
+## 依赖分析
+查新分析功能的各个组件之间存在明确的依赖关系。`RetrieveRecordController`依赖于`RetrieveRecordService`,`RetrieveRecordService`依赖于`RetrieveRecordMapper`和`RetrieveRecord`。`NoveltyProjectService`依赖于`NoveltyProjectMapper`和`NoveltyProject`。`NoveltyCompareRecordService`依赖于`NoveltyCompareRecordMapper`和`NoveltyCompareRecord`。`NoveltyExportReportService`依赖于`NoveltyReportTemplateMapper`和`NoveltyReportTemplate`。
+
+```mermaid
+graph TD
+A[RetrieveRecordController] --> B[RetrieveRecordService]
+B --> C[RetrieveRecordMapper]
+C --> D[RetrieveRecord]
+B --> E[NoveltyProjectService]
+E --> F[NoveltyProjectMapper]
+F --> G[NoveltyProject]
+B --> H[NoveltyCompareRecordService]
+H --> I[NoveltyCompareRecordMapper]
+I --> J[NoveltyCompareRecord]
+B --> K[NoveltyExportReportService]
+K --> L[NoveltyReportTemplateMapper]
+L --> M[NoveltyReportTemplate]
+```
+
+**图示来源**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+
+## 性能考虑
+在查新分析功能的实现中,性能是一个重要的考虑因素。为了提高查询效率,系统使用了Elasticsearch进行全文检索,并通过缓存机制减少数据库访问次数。此外,系统还采用了分页查询和异步处理等技术来优化性能。
+
+## 故障排除指南
+在使用查新分析功能时,可能会遇到一些常见问题,如检索超时、结果不准确等。对于检索超时问题,可以尝试优化查询条件或增加超时时间。对于结果不准确问题,可以检查查询条件是否正确,或重新构建索引。
+
+**组件来源**
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+- [NoveltyCompareRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyCompareRecordService.java)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+
+## 结论
+本文档详细介绍了PAS系统中查新分析功能的实现细节,包括查新项目的管理、检索记录的管理、对比分析的管理以及报告的生成。通过本文档,用户可以更好地理解和使用查新分析功能,提高工作效率。

+ 165 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新报告生成/查新报告导出.md

@@ -0,0 +1,165 @@
+# 查新报告导出
+
+<cite>
+**本文档引用文件**  
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+- [NoveltyReportTemplate.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportTemplate.java)
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java)
+- [PoiPolicy.java](file://src/main/java/cn/cslg/pas/common/core/base/PoiPolicy.java)
+- [FileUtils.java](file://src/main/java/cn/cslg/pas/common/utils/FileUtils.java)
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [核心组件](#核心组件)
+3. [报告导出流程](#报告导出流程)
+4. [模板引擎工作机制](#模板引擎工作机制)
+5. [数据预处理与绑定](#数据预处理与绑定)
+6. [异常处理与资源管理](#异常处理与资源管理)
+7. [常见问题与解决方案](#常见问题与解决方案)
+8. [最佳实践](#最佳实践)
+
+## 简介
+查新报告导出功能是PAS系统中的关键模块,负责将结构化的JSON数据与Word模板进行动态绑定,生成格式规范的查新报告文档。该功能通过`NoveltyExportReportService`服务类实现,利用`com.deepoove.poi`库的强大功能,支持占位符替换、表格填充、图片插入等复杂文档操作。
+
+## 核心组件
+
+**Section sources**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+- [NoveltyReportTemplate.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportTemplate.java)
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java)
+
+## 报告导出流程
+
+```mermaid
+flowchart TD
+A[开始导出] --> B{是否已有最终文件}
+B --> |是| C[返回已有文件GUID]
+B --> |否| D[加载模板配置]
+D --> E[加载报告数据]
+E --> F[编译模板]
+F --> G[渲染数据]
+G --> H[生成Word文档]
+H --> I[保存文件到FMS]
+I --> J[更新数据库记录]
+J --> K[返回文件GUID]
+```
+
+**Diagram sources**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L56-L113)
+
+## 模板引擎工作机制
+
+```mermaid
+classDiagram
+class XWPFTemplate {
++compile(templatePath, configure)
++render(dataMap)
++writeToFile(outPath)
++close()
+}
+class Configure {
++builder()
++bind(key, policy)
++useSpringEL(false)
++build()
+}
+class LoopRowTableRenderPolicy {
++LoopRowTableRenderPolicy()
+}
+class HtmlRenderPolicy {
++HtmlRenderPolicy()
+}
+class PoiPolicy {
++TABLE : String
++HTML : String
++PICTURE : String
+}
+XWPFTemplate --> Configure : "使用"
+Configure --> LoopRowTableRenderPolicy : "绑定"
+Configure --> HtmlRenderPolicy : "绑定"
+Configure --> PoiPolicy : "引用"
+```
+
+**Diagram sources**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L113-L133)
+- [PoiPolicy.java](file://src/main/java/cn/cslg/pas/common/core/base/PoiPolicy.java#L1-L7)
+
+## 数据预处理与绑定
+
+```mermaid
+sequenceDiagram
+participant Service as "NoveltyExportReportService"
+participant Template as "XWPFTemplate"
+participant FMS as "文件管理系统"
+Service->>Service : loadConfigure(configSource)
+Service->>Service : loadReportData(dataSource, configSource)
+Service->>Service : 构建数据映射map
+Service->>Template : compile(模板路径, 配置)
+Template-->>Service : 返回模板实例
+Service->>Template : render(数据映射)
+Template-->>Service : 渲染后的模板
+Service->>Service : writeToFile(输出路径)
+Service->>FMS : uploadFileGetGuid2(文件)
+FMS-->>Service : 返回文件GUID
+Service->>Service : 更新数据库记录
+```
+
+**Diagram sources**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L79-L113)
+- [FileUtils.java](file://src/main/java/cn/cslg/pas/common/utils/FileUtils.java)
+
+## 异常处理与资源管理
+
+```mermaid
+flowchart TD
+A[导出报告] --> B[模板编译]
+B --> C{成功?}
+C --> |否| D[抛出XiaoShiException]
+C --> |是| E[数据渲染]
+E --> F{成功?}
+F --> |否| D
+F --> |是| G[文件写入]
+G --> H{成功?}
+H --> |否| D
+H --> |是| I[文件上传]
+I --> J{成功?}
+J --> |否| K[清理临时文件]
+J --> |是| L[更新数据库]
+L --> M[关闭模板资源]
+M --> N[完成]
+D --> O[记录错误日志]
+O --> P[清理资源]
+P --> Q[抛出异常]
+```
+
+**Diagram sources**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L99-L108)
+- [ReportExportController.java](file://src/main/java/cn/cslg/pas/controller/ReportExportController.java#L30-L32)
+
+## 常见问题与解决方案
+
+| 问题类型 | 可能原因 | 解决方案 |
+|---------|--------|--------|
+| 导出格式错乱 | 模板占位符不匹配 | 检查模板配置中的type字段与实际占位符类型 |
+| 中文乱码 | 字体设置问题 | 确保模板中使用支持中文的字体(如宋体、微软雅黑) |
+| 大文件处理性能差 | 内存不足 | 优化数据结构,分批处理大数据量表格 |
+| 图片无法显示 | URL路径错误 | 检查FMSUrl配置和图片GUID的有效性 |
+| 模板缺失 | 路径配置错误 | 验证templatePath字段的正确性 |
+
+**Section sources**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+- [application.yml](file://src/main/resources/application.yml)
+
+## 最佳实践
+
+1. **模板设计**:使用清晰的占位符命名规则,如`{{cm.project.name}}`表示项目名称
+2. **数据结构**:保持JSON数据结构的层次清晰,避免过深的嵌套
+3. **性能优化**:对于包含大量数据的表格,考虑分页导出或提供摘要报告
+4. **错误处理**:在关键步骤添加详细的日志记录,便于问题排查
+5. **资源管理**:确保在finally块中关闭模板资源,防止内存泄漏
+
+**Section sources**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+- [PoiPolicy.java](file://src/main/java/cn/cslg/pas/common/core/base/PoiPolicy.java)

+ 226 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新报告生成/查新报告生成.md

@@ -0,0 +1,226 @@
+# 查新报告生成
+
+<cite>
+**本文档引用的文件**
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java)
+- [NoveltyReportReferenceDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceDTO.java)
+- [NoveltyReportReferenceQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceQueryDTO.java)
+- [NoveltyReportReferencesMapper.java](file://src/main/java/cn/cslg/pas/mapper/novelty/NoveltyReportReferencesMapper.java)
+- [NoveltyReportTemplateService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportTemplateService.java)
+- [PoiPolicy.java](file://src/main/java/cn/cslg/pas/common/core/base/PoiPolicy.java)
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [查新报告文档管理](#查新报告文档管理)
+3. [报告模板与数据源配置](#报告模板与数据源配置)
+4. [报告导出实现机制](#报告导出实现机制)
+5. [API调用示例](#api调用示例)
+6. [异常处理与文件清理](#异常处理与文件清理)
+7. [常见问题排查](#常见问题排查)
+8. [结论](#结论)
+
+## 简介
+本文档详细阐述了PAS系统中查新报告生成功能的完整业务流程。文档涵盖了查新报告文档的创建、编辑、查询和删除操作,深入解析了报告模板与数据源的配置与使用方式,以及如何将JSON格式的数据源与Word模板进行动态绑定。同时,文档剖析了报告导出功能的实现机制,包括使用com.deepoove.poi库进行Word文档生成,以及导出后的文件存储与管理。
+
+## 查新报告文档管理
+
+查新报告文档的管理通过`NoveltyReportReferenceController`控制器实现,提供了完整的CRUD(创建、读取、更新、删除)操作接口。`NoveltyReportReferences`实体类定义了查新报告文档的核心属性,包括数据源、模板ID、配置信息和报告引用ID等。
+
+```mermaid
+classDiagram
+class NoveltyReportReferences {
++String dataSource
++Boolean ifHaveFinalFile
++Integer templateId
++String configMessage
++Integer reportReferenceId
+}
+class NoveltyReportReferenceDTO {
++Integer id
++String dataSource
++Integer templateId
++Integer projectId
+}
+class NoveltyReportReferenceQueryDTO {
++Integer projectId
++String fileName
++Integer current
++Integer size
++Integer id
++OrderDTO[] orderDTOList
+}
+NoveltyReportReferences --> NoveltyReportReferenceDTO : "数据传输"
+NoveltyReportReferences --> NoveltyReportReferenceQueryDTO : "查询条件"
+```
+
+**图源**
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java#L1-L30)
+- [NoveltyReportReferenceDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceDTO.java#L1-L14)
+- [NoveltyReportReferenceQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceQueryDTO.java#L1-L19)
+
+**章节源**
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L1-L63)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L1-L242)
+
+## 报告模板与数据源配置
+
+报告模板与数据源的配置是查新报告生成的核心。系统通过`NoveltyReportTemplate`实体类管理报告模板,每个模板包含模板路径、模板名称和配置信息。数据源以JSON格式存储,通过`PoiPolicy`类定义的常量(如`TABLE`、`HTML`、`PICTURE`)来指定不同数据类型的渲染策略。
+
+```mermaid
+flowchart TD
+A["获取模板配置"] --> B["解析配置JSON"]
+B --> C{"配置类型"}
+C --> |table| D["绑定LoopRowTableRenderPolicy"]
+C --> |html| E["绑定HtmlRenderPolicy"]
+C --> |picture| F["处理图片URL"]
+D --> G["构建Configure对象"]
+E --> G
+F --> G
+G --> H["返回Configure"]
+```
+
+**图源**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L113-L133)
+- [PoiPolicy.java](file://src/main/java/cn/cslg/pas/common/core/base/PoiPolicy.java#L1-L7)
+
+**章节源**
+- [NoveltyReportTemplateService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportTemplateService.java#L1-L115)
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+
+## 报告导出实现机制
+
+报告导出功能由`NoveltyExportReportService`服务类实现,核心流程包括模板加载、数据填充和文件输出。系统使用com.deepoove.poi库来处理Word文档的生成,通过`XWPFTemplate.compile()`方法编译模板,并使用`render()`方法填充数据。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "NoveltyReportReferenceController"
+participant Service as "NoveltyExportReportService"
+participant Template as "XWPFTemplate"
+Client->>Controller : GET /noveltyReportReference/export?id=123
+Controller->>Service : exportReport(123)
+Service->>Service : 查询NoveltyReportReferences
+Service->>Service : 检查是否已有最终文件
+alt 已有最终文件
+Service-->>Controller : 返回文件GUID
+else 需要生成
+Service->>Service : 加载模板配置
+Service->>Service : 加载报告数据
+Service->>Service : 编译Word模板
+Service->>Service : 填充数据并生成文件
+Service->>Service : 上传文件并获取GUID
+Service->>Service : 更新数据库记录
+Service-->>Controller : 返回新文件GUID
+end
+Controller-->>Client : 返回GUID
+```
+
+**图源**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L56-L111)
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L42-L47)
+
+**章节源**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L1-L169)
+
+## API调用示例
+
+以下是调用查新报告生成API的示例:
+
+1. **添加或编辑查新报告文档**
+```http
+POST /api/xiaoshi/noveltyReportReference/edit
+Content-Type: application/json
+
+{
+  "projectId": 1,
+  "templateId": 101,
+  "dataSource": "{\"project\":{\"name\":\"项目A\"},\"inventionPoint\":\"发明点描述\"}"
+}
+```
+
+2. **导出查新检索报告**
+```http
+GET /api/xiaoshi/noveltyReportReference/export?id=123
+```
+
+3. **查询查新检索报告**
+```http
+POST /api/xiaoshi/noveltyReportReference/query
+Content-Type: application/json
+
+{
+  "projectId": 1,
+  "current": 1,
+  "size": 10
+}
+```
+
+4. **删除查新报告文档**
+```http
+POST /api/xiaoshi/noveltyReportReference/delete
+Content-Type: application/json
+
+[123, 456]
+```
+
+**章节源**
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L35-L62)
+
+## 异常处理与文件清理
+
+系统在报告生成过程中实现了完善的异常处理机制。`NoveltyExportReportService`中的`exportReport`方法包含了对文件保存失败的异常处理,当`fileManagerService.uploadFileGetGuid2()`返回空或空列表时,会抛出`XiaoShiException`异常。
+
+文件清理策略主要体现在临时文件的管理上。系统通过`FileUtils.createDirectory()`创建临时目录,并在文件生成后通过`fileManagerService`上传到文件管理系统。虽然代码中没有显式的文件删除逻辑,但可以推断出文件管理系统会负责后续的文件生命周期管理。
+
+```mermaid
+flowchart TD
+A["开始导出报告"] --> B["检查是否已有最终文件"]
+B --> C{"已有文件?"}
+C --> |是| D["返回现有文件GUID"]
+C --> |否| E["加载模板和数据"]
+E --> F["编译并渲染模板"]
+F --> G["生成临时文件"]
+G --> H["上传文件到FMS"]
+H --> I{"上传成功?"}
+I --> |是| J["更新数据库记录"]
+I --> |否| K["抛出XiaoShiException"]
+J --> L["返回新文件GUID"]
+K --> M["异常处理"]
+```
+
+**图源**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L56-L111)
+
+**章节源**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L1-L169)
+
+## 常见问题排查
+
+### 导出失败
+当报告导出失败时,应首先检查以下几点:
+1. **模板文件是否存在**:确认`templatePath`指向的Word模板文件存在且可读。
+2. **数据源格式是否正确**:检查`dataSource`中的JSON数据结构是否符合模板要求。
+3. **文件管理系统连接**:验证`FMSUrl`配置是否正确,确保能够连接到文件管理系统。
+
+### 模板加载错误
+模板加载错误通常由以下原因引起:
+1. **模板ID无效**:确保`templateId`在数据库中存在对应的记录。
+2. **配置JSON格式错误**:检查`templeMessage`中的JSON字符串是否有效。
+3. **权限问题**:确认应用有读取模板文件的权限。
+
+### 日志排查建议
+1. **查看异常堆栈**:在日志中查找`XiaoShiException`及其堆栈信息。
+2. **检查模板编译日志**:关注`XWPFTemplate.compile()`方法的执行情况。
+3. **验证数据加载**:确认`loadReportData()`方法返回的数据是否完整。
+
+**章节源**
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L106-L108)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L175-L197)
+
+## 结论
+PAS系统的查新报告生成功能通过`NoveltyReportReferenceController`、`NoveltyReportReferencesService`和`NoveltyExportReportService`三个核心组件协同工作,实现了从报告文档管理到最终文件导出的完整流程。系统利用com.deepoove.poi库的强大功能,将JSON数据源与Word模板进行动态绑定,生成高质量的查新报告。通过合理的异常处理和文件管理策略,确保了系统的稳定性和可靠性。

+ 291 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新报告生成/查新报告管理.md

@@ -0,0 +1,291 @@
+# 查新报告管理
+
+<cite>
+**本文档引用文件**   
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java)
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java)
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java)
+- [NoveltyReportReferenceDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceDTO.java)
+- [NoveltyReportReferenceQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceQueryDTO.java)
+- [NoveltyReferencesVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/NoveltyReferencesVO.java)
+- [NoveltyReportReferencesMapper.java](file://src/main/java/cn/cslg/pas/mapper/novelty/NoveltyReportReferencesMapper.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [实体与数据库设计](#实体与数据库设计)
+3. [业务逻辑与服务层](#业务逻辑与服务层)
+4. [RESTful API 接口](#restful-api-接口)
+5. [异常处理策略](#异常处理策略)
+6. [性能优化与常见问题](#性能优化与常见问题)
+7. [结论](#结论)
+
+## 引言
+查新报告管理是PAS系统中的核心功能之一,用于创建、更新、查询和删除查新报告文档。该功能通过`NoveltyReportReferences`实体与数据库交互,利用`NoveltyReportReferencesService`实现业务逻辑,并通过`NoveltyReportReferenceController`暴露RESTful API接口。本文档详细阐述了该功能的设计与实现,包括实体结构、服务逻辑、API接口、异常处理及性能优化建议。
+
+## 实体与数据库设计
+
+### NoveltyReportReferences 实体设计
+`NoveltyReportReferences`实体是查新报告文档的核心数据模型,继承自`BaseEntity`,并映射到数据库表`novelty_report_references`。该实体包含以下核心字段:
+
+- **dataSource**: 存储报告的数据内容,通常为JSON格式的字符串,包含报告生成所需的所有数据。
+- **ifHaveFinalFile**: 布尔值,标识报告是否已生成最终文件(如Word文档)。
+- **templateId**: 整数类型,关联查新报告模板的ID,用于确定报告的格式和样式。
+- **configMessage**: 字符串类型,存储模板的配置信息,用于指导报告生成过程。
+- **reportReferenceId**: 整数类型,作为外键关联到`references`表的主键,实现报告元数据与具体内容的分离。
+
+```mermaid
+classDiagram
+class NoveltyReportReferences {
++String dataSource
++Boolean ifHaveFinalFile
++Integer templateId
++String configMessage
++Integer reportReferenceId
+}
+class References {
++Integer id
++String referencesName
++Integer projectId
++String fileGuid
++String createId
++Date createTime
+}
+class NoveltyReportTemplate {
++Integer id
++String templateName
++String templeMessage
++String templatePath
+}
+References "1" -- "0..1" NoveltyReportReferences : "包含"
+NoveltyReportTemplate "1" -- "0..*" NoveltyReportReferences : "使用"
+```
+
+**图源**
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java#L1-L30)
+- [NoveltyReportTemplate.java](file://src/main/java/cn/cslg/pas/domain/business/NoveltyReportTemplate.java)
+- [References.java](file://src/main/java/cn/cslg/pas/domain/business/References.java)
+
+### 数据库表结构
+数据库表`novelty_report_references`的结构与实体设计完全对应,其DDL语句如下:
+
+```sql
+CREATE TABLE `novelty_report_references` (
+  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `data_source` text COMMENT '数据',
+  `if_have_final_file` tinyint(1) DEFAULT NULL COMMENT '是否有最终文件',
+  `template_id` int DEFAULT NULL COMMENT '模板ID',
+  `config_message` text COMMENT '配置信息',
+  `report_reference_id` int DEFAULT NULL COMMENT '报告引用ID',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `create_id` varchar(255) DEFAULT NULL COMMENT '创建人ID',
+  PRIMARY KEY (`id`),
+  KEY `idx_report_reference_id` (`report_reference_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='查新报告文档';
+```
+
+该表通过`report_reference_id`字段与`references`表建立关联,`references`表存储报告的元数据(如名称、项目ID、文件GUID等),而`novelty_report_references`表则存储报告的具体内容和配置。这种设计实现了数据的逻辑分离,提高了数据管理的灵活性。
+
+**图源**
+- [pas.sql](file://docker/mysql/init/pas.sql#L1-L800)
+
+**节源**
+- [NoveltyReportReferences.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/NoveltyReportReferences.java#L1-L30)
+- [pas.sql](file://docker/mysql/init/pas.sql#L1-L800)
+
+## 业务逻辑与服务层
+
+### 核心业务逻辑
+`NoveltyReportReferencesService`是查新报告管理的核心服务类,实现了报告的创建、更新、查询和删除等完整业务逻辑。其主要方法包括:
+
+- **addOrUpdate**: 根据DTO中的ID判断是新增还是更新操作。若ID为空,则调用`addReference`创建新报告;若ID存在,则调用`updateReference`更新现有报告。
+- **addReference**: 创建新的查新报告。首先创建`References`对象存储报告元数据(如名称、项目ID),然后创建`NoveltyReportReferences`对象存储报告内容,并通过`reportReferenceId`建立关联。
+- **updateReference**: 更新现有报告的数据内容(`dataSource`)。通过`reportReferenceId`查询对应的`NoveltyReportReferences`记录并更新。
+- **queryReference**: 查询查新报告列表。首先查询`references`表获取报告元数据,然后根据返回的ID列表查询`novelty_report_references`表,将两者数据合并后返回。
+- **delete**: 删除查新报告。同时删除`references`表和`novelty_report_references`表中的相关记录,确保数据一致性。
+
+### 事务管理与数据验证
+服务层通过`@Transactional(rollbackFor = Exception.class)`注解确保关键操作的事务性。例如,在`addOrUpdate2`方法中,报告的创建和导出被包装在一个事务中,如果导出失败,整个操作将回滚,防止产生不一致状态。
+
+数据验证主要在服务层和控制器层进行。服务层通过调用`noveltyReportTemplateService.getById(templateId)`验证模板ID的有效性,确保引用的模板存在。同时,在创建报告时,会从模板中获取默认的`configMessage`,保证配置信息的完整性。
+
+```mermaid
+sequenceDiagram
+participant C as 客户端
+participant Ctrl as NoveltyReportReferenceController
+participant Service as NoveltyReportReferencesService
+participant Mapper as NoveltyReportReferencesMapper
+participant DB as 数据库
+C->>Ctrl : POST /edit
+Ctrl->>Service : addOrUpdate2(dto)
+Service->>Service : getTemplateMapsImp.getMap(...)
+Service->>Service : JsonUtils.objectToJson(map)
+Service->>Service : addOrUpdate(dto)
+alt 新建报告
+Service->>Service : addReference(dto)
+Service->>DB : 插入references记录
+DB-->>Service : 返回ID
+Service->>DB : 插入novelty_report_references记录
+DB-->>Service : 成功
+else 更新报告
+Service->>Service : updateReference(dto)
+Service->>DB : 更新novelty_report_references记录
+DB-->>Service : 成功
+end
+Service->>Service : exportReport(id)
+Service->>Service : addFinalReference(id, fileGuid)
+DB-->>Service : 更新ifHaveFinalFile
+Service-->>Ctrl : 返回ID
+Ctrl-->>C : 返回响应
+```
+
+**图源**
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L1-L242)
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L1-L63)
+
+### 权限校验机制
+权限校验主要通过`LoginUtils`和`CacheUtils`组件实现。`LoginUtils`用于获取当前登录用户的ID,`CacheUtils`则用于从缓存中获取完整的用户信息(`PersonnelVO`)。在创建报告时,系统会自动将当前登录用户的ID设置为报告的创建人(`createId`),从而实现基于用户身份的访问控制和审计追踪。
+
+**节源**
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L1-L242)
+
+## RESTful API 接口
+
+### API 接口定义
+`NoveltyReportReferenceController`提供了标准的RESTful API接口,用于前端应用与后端服务的交互。所有接口均位于`/api/v1/noveltyReportReference`路径下。
+
+| HTTP方法 | 请求路径 | 参数格式 | 响应结构 | 功能描述 |
+| :--- | :--- | :--- | :--- | :--- |
+| POST | `/edit` | `NoveltyReportReferenceDTO` | `Response<Integer>` | 添加或编辑查新报告文档 |
+| GET | `/export` | `id` (查询参数) | `Response<String>` | 导出查新检索报告 |
+| POST | `/delete` | `List<Integer>` (请求体) | `Response<List<Integer>>` | 删除查新报告文档 |
+| POST | `/query` | `NoveltyReportReferenceQueryDTO` (请求体) | `Response<Records>` | 查询查新检索报告 |
+
+### 请求与响应示例
+#### 创建查新报告
+**请求示例:**
+```json
+POST /api/v1/noveltyReportReference/edit
+Content-Type: application/json
+
+{
+  "projectId": 1001,
+  "templateId": 5,
+  "dataSource": "{\"projectName\": \"新型电池技术\", \"inventors\": [\"张三\", \"李四\"]}"
+}
+```
+
+**响应示例:**
+```json
+{
+  "code": "200",
+  "msg": "成功",
+  "data": 71
+}
+```
+
+#### 查询查新报告
+**请求示例:**
+```json
+POST /api/v1/noveltyReportReference/query
+Content-Type: application/json
+
+{
+  "projectId": 1001,
+  "current": 1,
+  "size": 10
+}
+```
+
+**响应示例:**
+```json
+{
+  "code": "200",
+  "msg": "成功",
+  "data": {
+    "records": [
+      {
+        "id": 71,
+        "projectId": 1001,
+        "referencesName": "新型电池技术查新报告",
+        "fileGuid": "abc123",
+        "createTime": "2024-05-20T10:00:00",
+        "dataSource": "{\"projectName\": \"新型电池技术\", \"inventors\": [\"张三\", \"李四\"]}",
+        "ifHaveFinalFile": true,
+        "templateId": 5
+      }
+    ],
+    "total": 1,
+    "size": 10,
+    "current": 1,
+    "pages": 1
+  }
+}
+```
+
+**节源**
+- [NoveltyReportReferenceController.java](file://src/main/java/cn/cslg/pas/controller/novelty/NoveltyReportReferenceController.java#L1-L63)
+- [NoveltyReportReferenceDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceDTO.java#L1-L14)
+- [NoveltyReportReferenceQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyReportReferenceQueryDTO.java)
+
+## 异常处理策略
+
+### 异常类型与处理
+系统通过全局异常处理器`GlobalExceptionHandler`和`GlobalException`统一处理所有异常,确保API返回格式的一致性。
+
+- **XiaoShiException**: 自定义业务异常,用于处理特定的业务逻辑错误(如参数校验失败、资源不存在等)。处理器会将其转换为带有错误码和错误信息的`Response`对象。
+- **UnLoginException**: 认证异常,当用户未登录或会话过期时抛出。处理器返回401状态码和“未登录”提示。
+- **NotLoginException**: Sa-Token框架抛出的未登录异常,由`GlobalException`统一处理为未授权响应。
+- **其他Exception**: 捕获所有未预期的系统异常,返回通用的系统错误响应,避免敏感信息泄露。
+
+### 常见业务异常场景
+- **重复报告创建**: 系统未直接限制同一项目创建多个报告,此逻辑由业务规则决定。若需避免,应在`addReference`方法中增加对`projectId`和`templateId`组合的唯一性检查。
+- **无效模板引用**: 在`addReference`方法中,通过`noveltyReportTemplateService.getById(templateId)`获取模板。如果`templateId`无效,该方法将返回`null`,后续操作会因空指针而失败。应在获取模板后立即检查其是否存在,若不存在则抛出`XiaoShiException`。
+
+```mermaid
+flowchart TD
+Start([开始创建报告]) --> ValidateInput["验证输入参数"]
+ValidateInput --> InputValid{"参数有效?"}
+InputValid --> |否| ThrowException["抛出XiaoShiException"]
+InputValid --> |是| GetTemplate["获取模板信息"]
+GetTemplate --> TemplateExists{"模板存在?"}
+TemplateExists --> |否| ThrowTemplateError["抛出模板不存在异常"]
+TemplateExists --> |是| CreateReference["创建References记录"]
+CreateReference --> CreateDetail["创建NoveltyReportReferences记录"]
+CreateDetail --> ExportReport["导出报告文件"]
+ExportReport --> UpdateStatus["更新报告完成状态"]
+UpdateStatus --> End([报告创建成功])
+ThrowException --> End
+ThrowTemplateError --> End
+```
+
+**图源**
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L175-L197)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+- [GlobalException.java](file://src/main/java/cn/cslg/pas/common/core/GlobalException.java#L1-L37)
+
+**节源**
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L175-L197)
+- [GlobalExceptionHandler.java](file://src/main/java/cn/cslg/pas/common/core/GlobalExceptionHandler.java#L1-L30)
+
+## 性能优化与常见问题
+
+### 常见问题与解决方案
+- **报告查询性能瓶颈**: `queryReference`方法执行了两次数据库查询(先查`references`,再查`novelty_report_references`),当数据量大时可能成为性能瓶颈。优化方案是使用MyBatis的`@Results`注解或`<resultMap>`进行关联查询,一次SQL操作获取所有数据。
+- **数据源解析错误**: `dataSource`字段存储JSON字符串,如果格式不正确,可能导致解析失败。应在`addOrUpdate`方法中增加对`dataSource`的JSON格式校验,使用`JsonUtils`工具类进行预解析,确保数据有效性。
+
+### 优化建议
+1. **数据库索引优化**: 确保`novelty_report_references`表的`report_reference_id`字段有索引,以加速关联查询。
+2. **缓存策略**: 对于频繁访问但不常变更的数据(如报告模板`NoveltyReportTemplate`),可以引入Redis缓存,减少数据库查询压力。
+3. **异步导出**: 报告导出(`exportReport`)是一个耗时操作。可以将其改为异步任务,API立即返回任务ID,客户端通过轮询或WebSocket获取导出结果,提升用户体验。
+4. **分页优化**: `queryReference`方法已支持分页,应确保前端正确传递`current`和`size`参数,避免一次性查询过多数据。
+
+**节源**
+- [NoveltyReportReferencesService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyReportReferencesService.java#L132-L162)
+- [NoveltyExportReportService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltyExportReportService.java#L56-L68)
+
+## 结论
+PAS系统的查新报告管理功能设计合理,通过`NoveltyReportReferences`实体实现了报告内容与元数据的分离,服务层逻辑清晰,API接口规范。通过全局异常处理机制保证了系统的健壮性。针对潜在的性能瓶颈和数据校验问题,提出了具体的优化建议,如引入关联查询、数据校验和异步处理等,可进一步提升系统的性能和可靠性。

+ 331 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新检索管理/查新检索管理.md

@@ -0,0 +1,331 @@
+# 查新检索管理
+
+<cite>
+**本文档引用文件**  
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java)
+- [RetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDTO.java)
+- [RetrieveRecordQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordQueryDTO.java)
+- [RetrieveRecordDeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDeDTO.java)
+- [AssoRetrieveRecordProject.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/AssoRetrieveRecordProject.java)
+- [AssoRetrieveRecordProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/novelty/AssoRetrieveRecordProjectMapper.java)
+- [AssoRetrieveRecordProjectService.java](file://src/main/java/cn/cslg/pas/service/novelty/AssoRetrieveRecordProjectService.java)
+- [AssoRetrieveRecordProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/AssoRetrieveRecordProjectDTO.java)
+- [RetrieveRecordVO.java](file://src/main/java/cn/cslg/pas/common/vo/NoveltyProjectVO/RetrieveRecordVO.java)
+- [NoveltyRetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/NoveltyProjectDTO/NoveltyRetrieveRecordDTO.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [检索记录生命周期管理](#检索记录生命周期管理)
+3. [检索记录与查新项目的关联关系](#检索记录与查新项目的关联关系)
+4. [关键字段说明](#关键字段说明)
+5. [批量删除逻辑](#批量删除逻辑)
+6. [API使用示例](#api使用示例)
+7. [检索历史查询与分页](#检索历史查询与分页)
+8. [常见问题与数据一致性](#常见问题与数据一致性)
+
+## 简介
+本文档详细阐述PAS系统中查新检索管理功能的设计与实现。重点介绍检索记录(RetrieveRecord)的完整生命周期管理,包括创建、更新、查询和删除操作。同时深入解析检索记录与查新项目之间的多对多关联机制,以及相关数据结构和业务逻辑的实现方式。
+
+## 检索记录生命周期管理
+
+### 创建检索记录
+通过`RetrieveRecordController`的`addRetrieveRecord`接口实现检索记录的创建。系统接收`RetrieveRecordDTO`对象,将其转换为`RetrieveRecord`实体并持久化到数据库。创建时会自动填充创建人ID、租户ID和创建时间等信息。
+
+**操作流程:**
+1. 接收前端传入的`RetrieveRecordDTO`
+2. 创建`RetrieveRecord`实体对象
+3. 复制DTO属性到实体
+4. 设置创建人、租户等上下文信息
+5. 执行数据库插入操作
+
+**Section sources**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L36-L43)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L48-L67)
+
+### 更新检索记录
+更新操作通过`updateRetrieveRecord`接口实现。系统根据传入的ID查询现有记录,更新指定字段(如检索条件、数据库类型等),并记录更新时间。
+
+**更新字段包括:**
+- 检索条件(conditions)
+- 数据库类型(dbType)
+- 总条数(totalNum)
+- 前端配置(searchSetting)
+- 更新时间(updateTime)
+
+**Section sources**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L45-L50)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L76-L89)
+
+### 查询检索记录
+提供`queryRetrieveRecord`接口用于查询用户的检索历史。查询结果支持分页,并按检索时间降序排列。
+
+**查询条件:**
+- 仅返回当前登录用户创建的记录
+- 排除已标记删除的记录
+- 包含系统自动生成的记录
+
+**Section sources**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L52-L57)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L122-L139)
+
+### 删除检索记录
+删除操作采用逻辑删除方式,通过设置`isDelete`字段为`true`来标记记录为已删除状态。
+
+**Section sources**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L59-L66)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L97-L115)
+
+## 检索记录与查新项目的关联关系
+
+### 多对多关联设计
+系统通过`AssoRetrieveRecordProject`关联表实现检索记录与查新项目之间的多对多关系。一个检索记录可以关联到多个查新项目,反之亦然。
+
+```mermaid
+erDiagram
+RETRIEVE_RECORD ||--o{ ASSO_RETRIEVE_RECORD_PROJECT : "包含"
+NOVELTY_PROJECT ||--o{ ASSO_RETRIEVE_RECORD_PROJECT : "关联"
+RETRIEVE_RECORD {
+integer id PK
+string conditions
+string dbType
+datetime retrieveTime
+datetime createTime
+datetime updateTime
+boolean isDelete
+}
+NOVELTY_PROJECT {
+integer id PK
+string projectName
+datetime createTime
+}
+ASSO_RETRIEVE_RECORD_PROJECT {
+integer retrieveRecordId FK
+integer projectId FK
+string searchPersonName
+}
+```
+
+**Diagram sources**
+- [AssoRetrieveRecordProject.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/AssoRetrieveRecordProject.java#L1-L35)
+
+### 关联表结构
+`AssoRetrieveRecordProject`表包含以下字段:
+
+| 字段名 | 类型 | 说明 |
+|-------|------|------|
+| retrieveRecordId | Integer | 检索记录ID,外键关联retrieve_record表 |
+| projectId | Integer | 查新项目ID,外键关联项目表 |
+| searchPersonName | String | 检索人姓名 |
+
+**Section sources**
+- [AssoRetrieveRecordProject.java](file://src/main/java/cn/cslg/pas/domain/business/novelty/AssoRetrieveRecordProject.java#L1-L35)
+
+### 关联操作服务
+`AssoRetrieveRecordProjectService`提供关联关系的管理功能:
+
+- `add`: 添加检索记录与项目的关联
+- `addAsso`: 添加包含检索人信息的关联
+- `updateAsso`: 更新关联记录中的检索人信息
+
+```mermaid
+sequenceDiagram
+participant 前端
+participant Controller
+participant Service
+participant 数据库
+前端->>Controller : 调用addAsso接口
+Controller->>Service : 传递AssoRetrieveRecordProjectDTO
+Service->>Service : 创建AssoRetrieveRecordProject实体
+Service->>Service : 设置retrieveRecordId、projectId、searchPersonName
+Service->>数据库 : 执行insert操作
+数据库-->>Service : 返回结果
+Service-->>Controller : 返回成功
+Controller-->>前端 : 返回响应
+```
+
+**Diagram sources**
+- [AssoRetrieveRecordProjectService.java](file://src/main/java/cn/cslg/pas/service/novelty/AssoRetrieveRecordProjectService.java#L20-L33)
+
+## 关键字段说明
+
+### 检索条件(conditions)
+存储用户构建的检索表达式,通常为布尔逻辑组合的查询语句。该字段是检索记录的核心内容,用于后续的专利检索操作。
+
+### 数据库类型(dbType)
+标识检索所针对的数据库类型,如:
+- CNKI(中国知网)
+- WANFANG(万方)
+- VIP(维普)
+- PATENT(专利数据库)
+
+### 检索时间(retrieveTime)
+记录实际执行检索操作的时间戳,用于追踪检索行为的时间序列。
+
+### 其他重要字段
+| 字段名 | 存储位置 | 说明 |
+|-------|---------|------|
+| createTime | RetrieveRecord | 记录创建时间 |
+| updateTime | RetrieveRecord | 记录更新时间 |
+| totalNum | RetrieveRecord | 检索结果总条数 |
+| searchSetting | RetrieveRecord | 前端搜索配置的JSON序列化字符串 |
+| ifBySystem | RetrieveRecord | 标识是否为系统自动生成的记录 |
+
+**Section sources**
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java#L1-L88)
+
+## 批量删除逻辑
+
+### 删除策略
+系统采用批量逻辑删除策略,支持两种删除模式:
+
+1. **指定ID删除**:根据传入的ID列表删除特定记录
+2. **全部删除**:删除当前用户的所有检索记录
+
+### 实现机制
+```mermaid
+flowchart TD
+Start([开始删除])
+--> Validate["验证用户身份"]
+--> CheckAll{"是否删除全部?"}
+--> |是| SetCondition["设置条件: create_id = 当前用户"]
+--> Update["执行更新: is_delete = true"]
+--> End([完成])
+CheckAll --> |否| CheckIds{"ID列表是否为空?"}
+--> |否| SetInCondition["设置条件: create_id = 当前用户 AND id IN (ID列表)"]
+--> Update
+--> End
+CheckIds --> |是| ReturnError["返回错误: 无删除目标"]
+--> End
+```
+
+**关键代码逻辑:**
+- 只能删除当前用户创建的记录
+- 使用`UpdateWrapper`构建更新条件
+- 通过`isDelete`字段实现逻辑删除而非物理删除
+
+**Section sources**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L97-L115)
+
+## API使用示例
+
+### 添加检索记录API
+**请求方式:** POST  
+**路径:** `/api/xiaoshi/retrieveRecord/addRetrieveRecord`
+
+**请求体示例:**
+```json
+{
+  "conditions": "((人工智能 OR AI) AND (医疗 OR 医学))",
+  "dbType": "CNKI",
+  "retrieveTime": "2023-07-10T10:00:00",
+  "totalNum": 156,
+  "searchSetting": "{\"sort\":\"relevance\",\"filter\":{\"yearRange\":[2020,2023]}}"
+}
+```
+
+**响应示例:**
+```json
+{
+  "code": 200,
+  "message": "success",
+  "data": {
+    "data": 12345
+  }
+}
+```
+
+**Section sources**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L36-L43)
+
+### 关联检索记录到项目
+**服务调用示例:**
+```java
+// 将检索记录ID=1001关联到项目ID=2001
+assoRetrieveRecordProjectService.add(1001, 2001);
+
+// 带检索人信息的关联
+AssoRetrieveRecordProjectDTO dto = new AssoRetrieveRecordProjectDTO();
+dto.setRetrieveId(1001);
+dto.setProjectId(2001);
+dto.setSearchPersonName("张三");
+assoRetrieveRecordProjectService.addAsso(dto);
+```
+
+**Section sources**
+- [AssoRetrieveRecordProjectService.java](file://src/main/java/cn/cslg/pas/service/novelty/AssoRetrieveRecordProjectService.java#L20-L33)
+
+## 检索历史查询与分页
+
+### 分页参数
+通过`RetrieveRecordQueryDTO`接收分页参数:
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| current | Long | 是 | 当前页码(从1开始) |
+| size | Long | 是 | 每页记录数 |
+| total | Integer | 否 | 总记录数(由系统自动填充) |
+
+### 数据映射机制
+查询结果通过`Records`对象封装,包含:
+
+- `data`: 检索记录列表
+- `current`: 当前页码
+- `size`: 每页大小
+- `total`: 总记录数
+
+系统使用MyBatis-Plus的分页插件实现高效分页查询。
+
+```mermaid
+flowchart LR
+Request["HTTP请求\n{current: 1, size: 10}"]
+--> Controller
+--> Service
+--> Page["创建Page对象\nPage(1,10)"]
+--> QueryWrapper["构建QueryWrapper\n按retrieveTime降序"]
+--> Database["执行分页查询"]
+--> Result["IPage<RetrieveRecord>"]
+--> Records["填充Records对象"]
+--> Response["返回JSON响应"]
+```
+
+**Section sources**
+- [RetrieveRecordQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordQueryDTO.java#L1-L22)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L122-L139)
+
+## 常见问题与数据一致性
+
+### 关联关系丢失问题
+**问题现象:** 检索记录无法在查新项目中显示
+
+**可能原因:**
+1. 未正确调用`addAsso`方法建立关联
+2. 事务未正确提交
+3. 关联记录被意外删除
+
+**解决方案:**
+- 确保在添加检索记录后立即建立关联
+- 使用事务保证操作的原子性
+- 查询`asso_retrieve_record_project`表确认关联存在
+
+### 检索记录无法删除
+**问题现象:** 删除操作返回成功但记录仍可见
+
+**原因分析:** 系统采用逻辑删除,前端查询时可能未正确处理`isDelete`字段
+
+**修复方案:**
+- 确认查询逻辑中包含`.eq(RetrieveRecord::getIsDelete, false).or().isNull(RetrieveRecord::getIsDelete)`条件
+- 检查缓存是否需要刷新
+
+### 数据一致性维护建议
+1. **事务管理**:关联操作应与主记录操作在同一个事务中
+2. **级联处理**:项目删除时应考虑是否需要清理关联的检索记录
+3. **权限控制**:确保用户只能操作自己创建的检索记录
+4. **定期清理**:建立机制定期清理长期未使用的已删除记录
+5. **审计日志**:记录关键操作日志以便追踪问题
+
+**Section sources**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L128-L130)
+- [AssoRetrieveRecordProjectService.java](file://src/main/java/cn/cslg/pas/service/novelty/AssoRetrieveRecordProjectService.java)

+ 276 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新检索管理/检索记录管理.md

@@ -0,0 +1,276 @@
+# 检索记录管理
+
+<cite>
+**本文档引用的文件**   
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java)
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java)
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java)
+- [RetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDTO.java)
+- [RetrieveRecordQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordQueryDTO.java)
+- [RetrieveRecordDeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDeDTO.java)
+- [NoveltySearchRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltySearchRecordService.java)
+- [RetrieveRecordMapper.java](file://src/main/java/cn/cslg/pas/mapper/RetrieveRecordMapper.java)
+</cite>
+
+## 目录
+1. [检索记录实体设计](#检索记录实体设计)
+2. [生命周期管理](#生命周期管理)
+3. [关键字段说明](#关键字段说明)
+4. [业务逻辑剖析](#业务逻辑剖析)
+5. [RESTful API文档](#restful-api文档)
+6. [分页查询与性能优化](#分页查询与性能优化)
+7. [常见问题与解决方案](#常见问题与解决方案)
+
+## 检索记录实体设计
+
+检索记录管理功能的核心是RetrieveRecord实体,该实体用于存储用户的检索历史信息。实体设计遵循数据库表结构,通过MyBatis Plus注解映射到数据库表"retrieve_record"。
+
+```mermaid
+classDiagram
+class RetrieveRecord {
++String conditions
++String dbType
++Integer searchType
++Integer tenantId
++Integer totalNum
++Date createTime
++String createId
++Date retrieveTime
++Date updateTime
++Boolean ifBySystem
++String searchSetting
++Boolean isDelete
+}
+RetrieveRecord : +String conditions 检索式
+RetrieveRecord : +String dbType 数据库类型
+RetrieveRecord : +Date retrieveTime 检索时间
+RetrieveRecord : +Integer totalNum 检索结果数量
+```
+
+**图示来源**
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java#L14-L87)
+
+**本节来源**
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java#L14-L87)
+
+## 生命周期管理
+
+检索记录的完整生命周期包括创建、更新、查询和删除四个基本操作,这些操作通过RetrieveRecordService服务类实现。
+
+### 创建操作
+创建检索记录时,系统会自动设置创建人信息、租户ID和创建时间。检索记录的创建是通过addRetrieveRecord方法实现的,该方法接收RetrieveRecordDTO对象作为参数。
+
+### 更新操作
+更新检索记录时,系统会根据传入的ID查询出实体类,然后更新数据库类型、检索条件和更新时间等字段。
+
+### 查询操作
+查询操作支持分页查询,按照检索时间和创建时间降序排列。查询时会过滤已删除的记录。
+
+### 删除操作
+删除操作采用软删除方式,将is_delete字段设置为true,而不是物理删除记录。
+
+**本节来源**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L32-L172)
+
+## 关键字段说明
+
+### 检索条件(conditions)
+检索条件字段存储用户的检索表达式,是检索记录的核心内容。该字段映射到数据库的"conditions"列,用于保存用户输入的完整检索式。
+
+### 数据库类型(dbType)
+数据库类型字段标识检索操作针对的数据库,如专利数据库、文献数据库等。该字段映射到数据库的"db_type"列。
+
+### 检索时间(retrieveTime)
+检索时间字段记录用户执行检索操作的具体时间点,映射到数据库的"retrieve_time"列。该字段用于排序和历史记录展示。
+
+### 检索结果数量(retrieveNum)
+检索结果数量字段存储本次检索返回的结果总数,映射到数据库的"total_num"列。该字段帮助用户快速了解检索范围。
+
+### 其他重要字段
+- **createId**: 创建人ID,用于权限控制和数据归属
+- **tenantId**: 租户ID,支持多租户架构
+- **ifBySystem**: 标识是否为系统自动生成的记录
+- **isDelete**: 软删除标志,避免数据永久丢失
+
+**本节来源**
+- [RetrieveRecord.java](file://src/main/java/cn/cslg/pas/domain/business/RetrieveRecord.java#L14-L87)
+- [RetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDTO.java#L1-L33)
+
+## 业务逻辑剖析
+
+### RetrieveRecordService业务逻辑
+RetrieveRecordService是检索记录管理的核心服务类,继承自MyBatis Plus的ServiceImpl,提供了增删改查的基本操作。
+
+#### 批量删除数据一致性处理
+在批量删除检索记录时,系统采用UpdateWrapper构建更新条件,确保数据一致性:
+
+```mermaid
+flowchart TD
+Start([开始删除]) --> CheckLogin["验证登录用户"]
+CheckLogin --> BuildWrapper["构建UpdateWrapper"]
+BuildWrapper --> SetCondition["设置创建人条件"]
+SetCondition --> SetDeleteFlag["设置is_delete=true"]
+SetDeleteFlag --> CheckAll["检查是否删除全部"]
+CheckAll --> |否| AddIds["添加ID条件"]
+CheckAll --> |是| SkipIds["跳过ID条件"]
+AddIds --> ExecuteUpdate["执行批量更新"]
+SkipIds --> ExecuteUpdate
+ExecuteUpdate --> ReturnIds["返回删除的ID列表"]
+ReturnIds --> End([结束])
+```
+
+**图示来源**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L97-L115)
+
+#### NoveltySearchRecordService特殊处理
+NoveltySearchRecordService提供了项目相关的检索记录管理,包含关联关系处理:
+
+```mermaid
+sequenceDiagram
+participant Controller as "NoveltyProjectController"
+participant Service as "NoveltySearchRecordService"
+participant Mapper as "RetrieveRecordMapper"
+participant AssoService as "AssoRetrieveRecordProjectService"
+Controller->>Service : deleteSearchRecord(DelSearchRecordDTO)
+Service->>Service : 构建查询条件
+Service->>AssoService : 删除关联关系
+AssoService-->>Service : 删除结果
+Service->>Mapper : 执行删除操作
+Mapper-->>Service : 返回结果
+Service-->>Controller : 返回删除的ID列表
+```
+
+**图示来源**
+- [NoveltySearchRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltySearchRecordService.java#L219-L245)
+
+**本节来源**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L32-L172)
+- [NoveltySearchRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltySearchRecordService.java#L219-L245)
+
+## RESTful API文档
+
+### API端点概览
+检索记录管理提供了一套完整的RESTful API,支持对检索记录的增删改查操作。
+
+```mermaid
+graph TB
+API[检索记录API] --> Create["POST /addRetrieveRecord"]
+API --> Update["POST /updateRetrieveRecord"]
+API --> Query["POST /queryRetrieveRecord"]
+API --> Delete["POST /deleteRetrieveRecord"]
+Create --> |请求| RetrieveRecordDTO
+Update --> |请求| RetrieveRecordDTO
+Query --> |请求| RetrieveRecordQueryDTO
+Delete --> |请求| RetrieveRecordDeDTO
+Create --> |响应| Response
+Update --> |响应| Response
+Query --> |响应| Response
+Delete --> |响应| Response
+```
+
+**图示来源**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L1-L68)
+
+### 请求参数与响应格式
+
+#### 添加检索记录
+- **端点**: POST /addRetrieveRecord
+- **请求参数**: RetrieveRecordDTO
+- **响应格式**: Response对象,包含新增记录的ID
+
+#### 更新检索记录
+- **端点**: POST /updateRetrieveRecord
+- **请求参数**: RetrieveRecordDTO(包含ID)
+- **响应格式**: 成功响应
+
+#### 查询检索记录
+- **端点**: POST /queryRetrieveRecord
+- **请求参数**: RetrieveRecordQueryDTO
+- **响应格式**: Response对象,包含分页数据
+
+#### 删除检索记录
+- **端点**: POST /deleteRetrieveRecord
+- **请求参数**: RetrieveRecordDeDTO
+- **响应格式**: Response对象,包含删除的ID列表
+
+### 错误处理机制
+系统采用统一的响应格式,所有API调用都返回Response对象。错误情况下,系统会返回相应的错误码和错误信息,确保客户端能够正确处理异常情况。
+
+**本节来源**
+- [RetrieveRecordController.java](file://src/main/java/cn/cslg/pas/controller/RetrieveRecordController.java#L1-L68)
+- [RetrieveRecordDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDTO.java#L1-L33)
+- [RetrieveRecordQueryDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordQueryDTO.java#L1-L22)
+- [RetrieveRecordDeDTO.java](file://src/main/java/cn/cslg/pas/common/dto/RetrieveRecordDeDTO.java#L1-L12)
+
+## 分页查询与性能优化
+
+### 分页查询实现机制
+分页查询通过MyBatis Plus的分页插件实现,使用Page对象封装分页参数:
+
+```mermaid
+flowchart TD
+Start([查询开始]) --> GetLogin["获取登录用户"]
+GetLogin --> BuildQuery["构建查询条件"]
+BuildQuery --> AddConditions["添加创建人条件"]
+AddConditions --> FilterDeleted["过滤已删除记录"]
+FilterDeleted --> OrderBy["按检索时间排序"]
+OrderBy --> CreatePage["创建Page对象"]
+CreatePage --> ExecuteQuery["执行分页查询"]
+ExecuteQuery --> SetData["设置返回数据"]
+SetData --> SetPageInfo["设置分页信息"]
+SetPageInfo --> ReturnResult["返回结果"]
+ReturnResult --> End([查询结束])
+```
+
+**图示来源**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L122-L139)
+
+### 性能优化策略
+1. **索引优化**: 在create_id、retrieve_time等常用查询字段上建立数据库索引
+2. **批量操作**: 使用批量插入和更新操作减少数据库交互次数
+3. **缓存机制**: 利用Redis缓存频繁访问的数据
+4. **连接池**: 使用HikariCP连接池优化数据库连接管理
+5. **查询优化**: 避免N+1查询问题,使用JOIN操作一次性获取关联数据
+
+**本节来源**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L122-L139)
+
+## 常见问题与解决方案
+
+### 检索记录无法删除
+**问题原因**: 
+- 权限不足,用户只能删除自己创建的记录
+- 数据库约束,存在关联的项目记录
+
+**解决方案**:
+1. 确认当前用户有删除权限
+2. 检查是否存在关联的项目记录,先解除关联再删除
+3. 查看系统日志,确认具体的错误信息
+
+### 数据不一致
+**问题原因**:
+- 并发操作导致的数据竞争
+- 事务管理不当
+- 缓存与数据库数据不同步
+
+**解决方案**:
+1. 使用@Transactional注解确保操作的原子性
+2. 实现适当的锁机制防止并发修改
+3. 更新数据时同步更新缓存
+4. 定期进行数据一致性检查
+
+### 性能问题
+**问题原因**:
+- 查询条件未使用索引
+- 返回数据量过大
+- 频繁的数据库交互
+
+**解决方案**:
+1. 优化查询条件,确保使用索引字段
+2. 实施分页查询,限制单次返回数据量
+3. 使用缓存减少数据库访问
+4. 批量处理数据操作
+
+**本节来源**
+- [RetrieveRecordService.java](file://src/main/java/cn/cslg/pas/service/common/RetrieveRecordService.java#L97-L115)
+- [NoveltySearchRecordService.java](file://src/main/java/cn/cslg/pas/service/novelty/NoveltySearchRecordService.java#L219-L245)

File diff suppressed because it is too large
+ 164 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新检索管理/项目关联管理.md


+ 416 - 0
.qoder/repowiki/zh/content/业务逻辑层/查新分析/查新项目管理.md

@@ -0,0 +1,416 @@
+# 查新项目管理
+
+<cite>
+**本文档引用的文件**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java)
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java)
+- [QueryNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryNoveltyProjectDTO.java)
+- [NoveltyProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/NoveltyProjectMapper.java)
+- [StringRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringRequest.java)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java)
+- [TechnicalCase.java](file://src/main/java/cn/cslg/pas/domain/business/TechnicalCase.java)
+- [TechnicalCaseService.java](file://src/main/java/cn/cslg/pas/service/business/TechnicalCaseService.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目数据结构](#项目数据结构)
+3. [核心业务流程](#核心业务流程)
+4. [项目与技术方案关联](#项目与技术方案关联)
+5. [项目查询机制](#项目查询机制)
+6. [权限控制与租户隔离](#权限控制与租户隔离)
+7. [常见问题与调试建议](#常见问题与调试建议)
+
+## 简介
+本文档详细阐述了PAS系统中查新项目管理功能的实现机制。文档涵盖了查新项目的创建、更新、删除和查询等核心业务流程,深入分析了项目信息的数据结构、与技术方案的关联关系、查询实现机制以及权限控制策略。通过本指南,开发人员可以全面理解查新项目管理模块的架构和实现细节。
+
+## 项目数据结构
+查新项目的核心数据结构由`AddNoveltyProjectDTO`类定义,该类包含了项目的所有关键信息字段。
+
+### 项目信息字段定义
+查新项目包含以下主要字段:
+
+| 字段名称 | 字段类型 | 用途说明 |
+| :--- | :--- | :--- |
+| `customCaseNumber` | String | 项目编号,用于唯一标识一个查新项目 |
+| `innerCaseNumber` | String | 内部案卷号,系统内部使用的编号 |
+| `applicants` | String | 申请人,提出查新请求的个人或组织 |
+| `inventor` | String | 发明人,项目的发明创造者 |
+| `ipr` | String | 知识产权联系人,负责知识产权事务的人员 |
+| `technicalContact` | String | 技术联系人,负责技术沟通的人员 |
+| `searchUnit` | String | 检索单位,执行查新检索的机构 |
+| `searchUnitContact` | String | 检索单位联系人,检索单位的对接人 |
+| `caseName` | String | 案件名称,项目的名称或标题 |
+| `searchReviewer` | String | 检索审核人,负责审核检索结果的人员 |
+| `projectId` | Integer | 项目ID,数据库中的主键ID |
+| `entrustType` | Integer | 委托方类型,1表示客户,0表示内部 |
+| `entrustId` | String | 委托方ID,指向客户或部门的ID |
+| `entrustName` | String | 委托方名称,当ID为空时用于创建新委托方 |
+| `headId` | String | 负责人ID,项目负责人的系统ID |
+| `departmentId` | String | 部门ID,项目所属的部门ID |
+
+**Section sources**
+- [AddNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddNoveltyProjectDTO.java#L1-L53)
+
+### 项目查询数据结构
+项目查询使用`QueryNoveltyProjectDTO`类,该类继承了分页和筛选功能。
+
+```mermaid
+classDiagram
+class QueryNoveltyProjectDTO {
++Integer projectId
++Long current
++Long size
++String createId
++Integer tenantId
++Integer roleType
++String customCaseNumber
++String innerCaseNumber
++String applicants
++String inventor
++String ipr
++String technicalContact
++String searchUnit
++String searchUnitContact
++String caseName
++String searchReviewer
++String inventionPoint
++String[] createIds
++String createName
++Date createTime
++String[] headIds
++String headName
++Integer entrustType
++String[] entrustIds
++String entrustName
++String[] departmentIds
++String departmentName
+}
+```
+
+**Diagram sources**
+- [QueryNoveltyProjectDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryNoveltyProjectDTO.java#L1-L89)
+
+## 核心业务流程
+查新项目管理的核心业务流程包括创建、更新和删除三个主要操作,均由`NoveltyProjectController`和`NoveltyProjectService`协同完成。
+
+### 项目创建流程 (addNoveltyProject)
+项目创建流程通过`addNoveltyProject`接口实现,其业务逻辑如下:
+
+```mermaid
+flowchart TD
+Start([开始]) --> ValidateInput["验证输入参数"]
+ValidateInput --> CreateProject["创建Project实体"]
+CreateProject --> SetProjectType["设置项目类型为4"]
+SetProjectType --> SetTenantInfo["设置租户ID和创建人"]
+SetTenantInfo --> HandleEntrust["处理委托方信息"]
+HandleEntrust --> IsAgency["租户类型是否为代理机构?"]
+IsAgency --> |是| SetEntrustType1["设置委托类型为1"]
+IsAgency --> |否| SetEntrustType0["设置委托类型为0"]
+SetEntrustType1 --> CheckEntrustId["检查委托方ID"]
+SetEntrustType0 --> CheckEntrustId
+CheckEntrustId --> |ID存在| SetEntrustId["设置委托方ID"]
+CheckEntrustId --> |ID不存在| CheckEntrustName["检查委托方名称"]
+CheckEntrustName --> |名称存在| CreateNewClient["调用权限服务创建新客户"]
+CheckEntrustName --> |名称不存在| SkipCreate["跳过创建"]
+CreateNewClient --> SetNewClientId["设置新客户ID"]
+SetNewClientId --> InsertProject["插入Project到数据库"]
+SkipCreate --> InsertProject
+InsertProject --> CreateNoveltyProject["创建NoveltyProject实体"]
+CreateNoveltyProject --> SetProjectId["设置关联的Project ID"]
+SetProjectId --> InsertNoveltyProject["插入NoveltyProject到数据库"]
+InsertNoveltyProject --> ReturnId["返回项目ID"]
+ReturnId --> End([结束])
+```
+
+**Diagram sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L60-L70)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L276-L329)
+
+**Section sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L60-L70)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L276-L329)
+
+### 项目更新流程 (updateNoveltyProject)
+项目更新流程与创建流程类似,但主要操作是更新现有记录。
+
+```mermaid
+flowchart TD
+Start([开始]) --> ValidateInput["验证输入参数"]
+ValidateInput --> GetProject["根据ID查询Project"]
+GetProject --> UpdateProject["更新Project实体"]
+UpdateProject --> HandleEntrust["处理委托方信息"]
+HandleEntrust --> IsAgency["租户类型是否为代理机构?"]
+IsAgency --> |是| SetEntrustType1["设置委托类型为1"]
+IsAgency --> |否| SetEntrustType0["设置委托类型为0"]
+SetEntrustType1 --> CheckEntrustId["检查委托方ID"]
+SetEntrustType0 --> CheckEntrustId
+CheckEntrustId --> |ID存在| SetEntrustId["设置委托方ID"]
+CheckEntrustId --> |ID不存在| CheckEntrustName["检查委托方名称"]
+CheckEntrustName --> |名称存在| CreateNewClient["调用权限服务创建新客户"]
+CheckEntrustName --> |名称不存在| SkipCreate["跳过创建"]
+CreateNewClient --> SetNewClientId["设置新客户ID"]
+SetNewClientId --> UpdateProjectInDB["更新Project到数据库"]
+SkipCreate --> UpdateProjectInDB
+UpdateProjectInDB --> GetNoveltyProject["查询关联的NoveltyProject"]
+GetNoveltyProject --> UpdateNoveltyProject["更新NoveltyProject实体"]
+UpdateNoveltyProject --> UpdateNoveltyProjectInDB["更新NoveltyProject到数据库"]
+UpdateNoveltyProjectInDB --> ReturnId["返回项目ID"]
+ReturnId --> End([结束])
+```
+
+**Diagram sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L98-L107)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L331-L378)
+
+**Section sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L98-L107)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L331-L378)
+
+### 项目删除流程 (deleteNoveltyProject)
+项目删除是一个级联操作,会同时删除关联的技术方案和文件。
+
+```mermaid
+flowchart TD
+Start([开始]) --> ValidateInput["验证项目ID"]
+ValidateInput --> DeleteNoveltyProject["删除NoveltyProject记录"]
+DeleteNoveltyProject --> QueryTechnicalCase["查询关联的技术方案"]
+QueryTechnicalCase --> HasTechnicalCase{"存在技术方案?"}
+HasTechnicalCase --> |是| QueryTechnicalCaseFiles["查询技术方案关联文件"]
+HasTechnicalCase --> |否| DeleteProject["删除Project记录"]
+QueryTechnicalCaseFiles --> HasFiles{"存在关联文件?"}
+HasFiles --> |是| DeleteFiles["删除AssoTechnicalCaseFile记录"]
+HasFiles --> |否| DeleteTechnicalCase["删除TechnicalCase记录"]
+DeleteFiles --> DeleteTechnicalCase
+DeleteTechnicalCase --> DeleteInventPoint["调用服务删除发明点"]
+DeleteInventPoint --> DeleteProject
+DeleteProject --> End([结束])
+```
+
+**Diagram sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L109-L118)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L380-L415)
+
+**Section sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L109-L118)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L380-L415)
+
+## 项目与技术方案关联
+查新项目与技术方案之间存在一对一的关联关系,这种关系通过级联操作进行管理。
+
+### 关联关系模型
+```mermaid
+erDiagram
+NOVELTY_PROJECT {
+integer id PK
+string custom_case_number
+string case_name
+integer project_id FK
+}
+PROJECT {
+integer id PK
+string project_name
+integer tenant_id
+string create_id
+}
+TECHNICAL_CASE {
+integer id PK
+string invention_point
+string solved_problem
+integer project_id FK
+}
+ASSO_TECHNICAL_CASE_FILE {
+integer id PK
+string file_guid
+integer technical_case_id FK
+}
+NOVELTY_PROJECT ||--|| PROJECT : "一对一"
+PROJECT ||--|| TECHNICAL_CASE : "一对一"
+TECHNICAL_CASE ||--o{ ASSO_TECHNICAL_CASE_FILE : "一对多"
+```
+
+**Diagram sources**
+- [NoveltyProject.java](file://src/main/java/cn/cslg/pas/domain/business/NoveltyProject.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [TechnicalCase.java](file://src/main/java/cn/cslg/pas/domain/business/TechnicalCase.java)
+- [AssoTechnicalCaseFile.java](file://src/main/java/cn/cslg/pas/domain/business/AssoTechnicalCaseFile.java)
+
+### 级联删除逻辑
+当删除查新项目时,系统会执行以下级联删除操作:
+1. 首先删除`novelty_project`表中的记录
+2. 然后根据`project_id`查询`technical_case`表
+3. 如果存在关联的技术方案,则删除该技术方案
+4. 在删除技术方案前,先删除其所有关联的文件记录(`asso_technical_case_file`)
+5. 最后删除`project`表中的主记录
+
+此逻辑确保了数据的一致性和完整性,避免了孤儿记录的产生。
+
+**Section sources**
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L380-L415)
+
+## 项目查询机制
+项目查询机制采用了灵活的查询模式,支持通过`StringRequest`进行动态查询,并利用`BusinessFactory`进行服务调用。
+
+### 查询流程分析
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "NoveltyProjectController"
+participant Factory as "BusinessFactory"
+participant Service as "NoveltyProjectService"
+participant Mapper as "NoveltyProjectMapper"
+Client->>Controller : POST /queryNoveltyProject
+Controller->>Factory : businessFactory.getClass("noveltyProjectService")
+Factory-->>Controller : 返回Service实例
+Controller->>Service : business.queryMessage(stringRequest)
+Service->>Service : loadPermissions(vo)
+Service->>Service : loadSearchSql(sqls)
+Service->>Mapper : noveltyProjectMapper.getPatentProject(sql1, sql2, sql3)
+Mapper-->>Service : 返回查询结果
+Service->>Service : loadNoveltyProjectVOS(noveltyProjectVOS)
+Service-->>Controller : 返回Records对象
+Controller-->>Client : 返回Response.success(records)
+```
+
+**Diagram sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L84-L95)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L435-L449)
+- [NoveltyProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/NoveltyProjectMapper.java#L19-L20)
+
+### StringRequest查询实现
+系统通过`StringRequest`类实现灵活的查询机制,该类继承自`QueryRequest`并添加了`searchQuery`字段。
+
+```mermaid
+classDiagram
+class QueryRequest {
++Long current
++Long size
++String sort
++String order
+}
+class StringRequest {
++String searchQuery
+}
+QueryRequest <|-- StringRequest
+```
+
+**Diagram sources**
+- [StringRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/StringRequest.java#L1-L11)
+- [QueryRequest.java](file://src/main/java/cn/cslg/pas/common/model/request/QueryRequest.java)
+
+### BusinessFactory服务调用
+`BusinessFactory`是系统中的一个核心工厂类,用于获取业务服务的实例。
+
+```mermaid
+classDiagram
+class BusinessFactory {
+-Map~String, Business~ businessMap
++Business getClass(String shapeType)
+}
+class Business {
+<<interface>>
++Object queryMessage(QueryRequest queryRequest)
++Object addMessage(Object object)
++Object deleteMessage(Integer[] ids)
++Object updateMessage(Object object)
++Object getGroup(GroupRequest groupRequest, String tableName)
+}
+BusinessFactory --> Business : "依赖"
+```
+
+**Diagram sources**
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java#L1-L19)
+- [Business.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/Business.java#L1-L19)
+
+**Section sources**
+- [NoveltyProjectController.java](file://src/main/java/cn/cslg/pas/controller/NoveltyProjectController.java#L41-L44)
+- [BusinessFactory.java](file://src/main/java/cn/cslg/pas/factorys/businessFactory/BusinessFactory.java#L1-L19)
+
+## 权限控制与租户隔离
+系统实现了完善的权限控制和租户隔离机制,确保数据的安全性和多租户环境下的数据隔离。
+
+### 权限控制流程
+```mermaid
+flowchart TD
+Start([开始]) --> GetLoginUser["获取登录用户信息"]
+GetLoginUser --> GetPersonnelVO["从缓存获取PersonnelVO"]
+GetPersonnelVO --> ExtractUserInfo["提取用户ID、租户ID、角色类型"]
+ExtractUserInfo --> SetQueryParams["设置查询参数"]
+SetQueryParams --> HandleCreateName["处理创建人名称"]
+SetQueryParams --> HandleHeadName["处理负责人名称"]
+SetQueryParams --> HandleEntrustName["处理委托方名称"]
+SetQueryParams --> HandleDepartmentName["处理部门名称"]
+HandleCreateName --> QueryPCS["调用权限服务查询PCS"]
+HandleHeadName --> QueryPCS
+HandleEntrustName --> QueryPCS
+HandleDepartmentName --> QueryPCS
+QueryPCS --> ParseResult["解析JSON结果"]
+ParseResult --> SetIds["设置ID列表"]
+SetIds --> ReturnParams["返回封装好的查询参数"]
+ReturnParams --> End([结束])
+```
+
+**Diagram sources**
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L115-L153)
+
+### 租户隔离实现
+租户隔离主要通过在查询条件中添加租户ID来实现。系统根据用户的角色类型应用不同的查询权限:
+
+- **普通用户 (roleType=0)**: 只能访问自己创建或负责的项目
+- **管理员 (roleType=2)**: 可以访问整个租户下的所有项目
+
+```java
+// 权限SQL生成逻辑
+if (roleType == null || roleType.equals(0)) {
+    rootSql = "(p.create_id =" + id + " or p.head_id=" + id + " or p.id in (select project_id from asso_project_person where person_id =" + id + "))";
+} else if (roleType.equals(2)) {
+    rootSql = "(p.tenant_id=" + tenantId + " or p.id in (select project_id from asso_project_person where person_id =" + id + "))";
+}
+```
+
+**Section sources**
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L458-L463)
+
+## 常见问题与调试建议
+本节提供查新项目管理中常见问题的解决方案和调试建议。
+
+### 项目删除失败
+**问题现象**: 调用`deleteNoveltyProject`接口返回错误,提示删除失败。
+
+**可能原因**:
+1. 项目ID为空
+2. 数据库外键约束阻止删除
+3. 权限不足
+
+**解决方案**:
+1. 确保请求中包含有效的`projectId`
+2. 检查`NoveltyProjectService.deleteNoveltyProject`方法中的级联删除逻辑
+3. 确认当前用户有删除该项目的权限
+
+**调试建议**:
+- 在`NoveltyProjectService.java`的`deleteNoveltyProject`方法中添加日志,跟踪执行流程
+- 检查数据库事务是否正确提交
+- 验证`technicalCaseMapper`和`projectMapper`的查询结果
+
+### 项目更新无效
+**问题现象**: 调用`updateNoveltyProject`接口成功,但数据库中的数据未更新。
+
+**可能原因**:
+1. 实体对象未正确设置ID
+2. `updateById`方法未正确执行
+3. 事务回滚
+
+**解决方案**:
+1. 确保`NoveltyProject`实体的ID已正确设置
+2. 检查`LambdaQueryWrapper`的查询条件是否正确
+3. 验证事务注解`@Transactional`的配置
+
+**调试建议**:
+- 在`NoveltyProjectService.java`的`updateNoveltyProject`方法中添加日志,输出`noveltyProject`对象的ID
+- 使用数据库监控工具查看实际执行的SQL语句
+- 检查`XiaoShiException`异常的捕获和处理
+
+**Section sources**
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L331-L378)
+- [NoveltyProjectService.java](file://src/main/java/cn/cslg/pas/service/business/NoveltyProjectService.java#L380-L415)

+ 285 - 0
.qoder/repowiki/zh/content/业务逻辑层/系统核心服务.md

@@ -0,0 +1,285 @@
+# 系统核心服务
+
+<cite>
+**本文档引用的文件**  
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+- [TranslateService.java](file://src/main/java/cn/cslg/pas/service/common/TranslateService.java)
+- [EsQuery.java](file://src/main/java/cn/cslg/pas/service/query/EsQuery.java)
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java)
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java)
+- [RedisConf.java](file://src/main/java/cn/cslg/pas/common/core/base/RedisConf.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [通用服务实现](#通用服务实现)
+3. [查询服务封装](#查询服务封装)
+4. [定时任务调度](#定时任务调度)
+5. [基础设施集成](#基础设施集成)
+6. [服务协作与依赖](#服务协作与依赖)
+7. [常见问题与高可用建议](#常见问题与高可用建议)
+8. [结论](#结论)
+
+## 引言
+PAS系统核心服务文档旨在深入解析系统中关键服务的实现机制和使用方式。本文档详细阐述了消息服务、文件管理服务、翻译服务等通用服务的架构设计,以及Elasticsearch查询封装、定时任务调度等核心功能的实现原理。同时,文档还剖析了缓存、消息队列等基础设施的集成模式,为开发者提供全面的技术参考和最佳实践指导。
+
+## 通用服务实现
+
+### 消息服务(MessageService)
+PAS系统通过RabbitMQ实现异步消息通信,主要用于邮件通知等场景。`RabbitMQUtils`工具类封装了消息发送的核心逻辑,通过`sendEmailMessage`方法将邮件参数封装为消息发送到指定队列。该服务采用Spring AMQP框架,通过`RabbitTemplate`实现消息的可靠传输,并使用`CorrelationData`确保消息的追踪和确认。
+
+```mermaid
+sequenceDiagram
+participant 业务逻辑 as 业务逻辑
+participant RabbitMQUtils as RabbitMQUtils
+participant RabbitTemplate as RabbitTemplate
+participant RabbitMQ as RabbitMQ
+业务逻辑->>RabbitMQUtils : sendEmailMessage(map)
+RabbitMQUtils->>RabbitTemplate : convertAndSend()
+RabbitTemplate->>RabbitMQ : 发送消息到队列
+```
+
+**图示来源**
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java#L23-L25)
+
+**本节来源**
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java#L1-L26)
+
+### 文件管理服务(FileManagerService)
+文件管理服务通过`FileManagerService`类实现,负责与外部文件管理系统(FMS)的交互。该服务提供了文件上传、下载、替换和删除等核心功能,使用OkHttpClient进行HTTP通信。服务通过`FMSUrl`配置项指定FMS系统的地址,并通过`FileSource`标识文件来源。
+
+```mermaid
+sequenceDiagram
+participant 客户端 as 客户端
+participant FileManagerService as FileManagerService
+participant FMS as 文件管理系统(FMS)
+客户端->>FileManagerService : uploadFile()
+FileManagerService->>FMS : POST /fileManager/uploadFile
+FMS-->>FileManagerService : 返回文件ID
+FileManagerService-->>客户端 : 返回上传结果
+```
+
+**图示来源**
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L44-L158)
+
+**本节来源**
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L1-L291)
+
+### 翻译服务(TranslateService)
+翻译服务`TranslateService`集成了阿里云机器翻译API,提供专利标题、摘要、权利要求和说明书的翻译功能。服务通过`getTranslateContent`方法调用外部翻译接口,并对长文本进行分段处理以避免超出API限制。翻译结果存储在Elasticsearch的`translate`索引中,实现翻译内容的持久化和快速检索。
+
+```mermaid
+flowchart TD
+A[获取翻译请求] --> B{翻译内容是否已存在}
+B --> |是| C[从Elasticsearch获取缓存翻译]
+B --> |否| D[调用阿里云翻译API]
+D --> E[分段处理长文本]
+E --> F[存储翻译结果到Elasticsearch]
+F --> G[返回翻译结果]
+C --> G
+```
+
+**图示来源**
+- [TranslateService.java](file://src/main/java/cn/cslg/pas/service/common/TranslateService.java#L65-L95)
+
+**本节来源**
+- [TranslateService.java](file://src/main/java/cn/cslg/pas/service/common/TranslateService.java#L1-L596)
+
+## 查询服务封装
+
+### EsQuery服务
+`EsQuery`服务实现了对Elasticsearch查询逻辑的封装,虽然当前实现较为简单,但其设计意图是为系统提供统一的查询入口。该服务通过实现`Query`接口,为后续扩展复杂的查询功能提供了基础框架。实际的查询逻辑分散在各个`EsBuilderFactory`中,如`MatchQueryBuilder`、`PrefixQueryBuilder`等,这些构建器实现了不同类型的Elasticsearch查询。
+
+```mermaid
+classDiagram
+class Query {
+<<interface>>
++queryMessage()
+}
+class EsQuery {
+-client ElasticsearchClient
++queryMessage()
+}
+class IQueryBuilder {
+<<interface>>
++creteQuery()
++getField()
++setField()
++getValue()
++setValue()
+}
+class MatchQueryBuilder {
+-field String
+-value String
++creteQuery()
+}
+class PrefixQueryBuilder {
+-field String
+-value String
++creteQuery()
+}
+Query <|-- EsQuery
+IQueryBuilder <|.. MatchQueryBuilder
+IQueryBuilder <|.. PrefixQueryBuilder
+EsQuery --> IQueryBuilder : 使用
+```
+
+**图示来源**
+- [EsQuery.java](file://src/main/java/cn/cslg/pas/service/query/EsQuery.java#L3-L9)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+
+**本节来源**
+- [EsQuery.java](file://src/main/java/cn/cslg/pas/service/query/EsQuery.java#L1-L10)
+
+## 定时任务调度
+
+### JobService服务
+`JobService`基于Quartz框架实现定时任务的调度和管理,支持任务的增删改查、暂停、恢复和中断等操作。服务通过`Scheduler`接口与Quartz调度器交互,使用`JobDetail`和`Trigger`定义任务的执行逻辑和触发条件。任务信息通过`QrtzTaskDTO`数据传输对象进行传递,包含任务类型、Cron表达式、参数等配置。
+
+```mermaid
+sequenceDiagram
+participant 控制器 as 控制器
+participant JobService as JobService
+participant Scheduler as Quartz Scheduler
+控制器->>JobService : addJob(qrtzTask)
+JobService->>JobService : 创建JobDetail和Trigger
+JobService->>Scheduler : scheduleJob(jobDetail, trigger)
+Scheduler-->>JobService : 调度成功
+JobService-->>控制器 : 返回结果
+控制器->>JobService : pauseJob(quartzVO)
+JobService->>Scheduler : pauseJob(jobKey)
+Scheduler-->>JobService : 暂停成功
+JobService-->>控制器 : 返回结果
+```
+
+**图示来源**
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L69-L106)
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L36-L73)
+
+**本节来源**
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L1-L38)
+
+## 基础设施集成
+
+### 缓存集成(CacheUtils)
+缓存服务通过`CacheUtils`类实现,基于Redis提供分布式缓存功能。该服务封装了常见的缓存操作,如用户登录信息、专利选择记录、自定义字段顺序等的存取。`CacheUtils`依赖`RedisUtil`工具类进行底层操作,并使用`RedisConf`常量类定义缓存键的命名规范,确保缓存键的一致性和可维护性。
+
+```mermaid
+classDiagram
+class CacheUtils {
+-redisUtil RedisUtil
++getLoginUser(userId)
++getSelectPatentIds(patentKey)
++setAnalysisCountV2(patentKey, field, expand, value, ids)
++getAnalysisCountIdsV2(patentKey, field, expand, name)
++setAreaTreeList(treeList)
++getAreaTreeList()
+}
+class RedisUtil {
+-redisTemplate StringRedisTemplate
++get(key)
++set(key, value)
++delete(key)
++expire(key, timeout, unit)
+}
+class RedisConf {
++SYMBOL_COLON " : "
++LOGIN_USER "login-user"
++SELECT_PATENT "select-patent"
++ANALYSIS_COUNT "analysis-count"
++AREA_LIST "area-list"
+}
+CacheUtils --> RedisUtil : 使用
+CacheUtils --> RedisConf : 使用
+RedisUtil --> StringRedisTemplate : 依赖
+```
+
+**图示来源**
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java#L24-L139)
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java#L1-L60)
+- [RedisConf.java](file://src/main/java/cn/cslg/pas/common/core/base/RedisConf.java#L1-L30)
+
+**本节来源**
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java#L1-L140)
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java#L1-L510)
+- [RedisConf.java](file://src/main/java/cn/cslg/pas/common/core/base/RedisConf.java#L1-L30)
+
+### 消息队列集成(RabbitMQUtils)
+消息队列集成通过`RabbitMQUtils`类实现,封装了RabbitMQ的基本操作。该服务使用`RabbitTemplate`发送消息到指定的交换机和路由键,支持消息的确认和追踪。`MailConstants`常量类定义了邮件相关消息的交换机名称和路由键,确保消息路由的一致性。
+
+```mermaid
+classDiagram
+class RabbitMQUtils {
+-rabbitTemplate RabbitTemplate
+-queueName String
++sendEmailMessage(map)
+}
+class MailConstants {
++MAIL_EXCHANGE_NAME "mail.exchange"
++MAIL_ROUTING_KEY_NAME "mail.routing.key"
+}
+RabbitMQUtils --> RabbitTemplate : 依赖
+RabbitMQUtils --> MailConstants : 使用
+```
+
+**图示来源**
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java#L13-L26)
+- [MailConstants.java](file://src/main/java/cn/cslg/pas/common/config/MailConstants.java)
+
+**本节来源**
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java#L1-L26)
+
+## 服务协作与依赖
+PAS系统的核心服务通过清晰的依赖关系协同工作。`TranslateService`依赖`ElasticsearchClient`进行数据存储和检索,`JobService`依赖`Scheduler`进行任务调度,`CacheUtils`依赖`RedisUtil`进行缓存操作。这些服务通过Spring的依赖注入机制进行管理,确保了松耦合和高内聚的设计原则。
+
+```mermaid
+graph TD
+A[业务逻辑] --> B[TranslateService]
+A --> C[JobService]
+A --> D[FileManagerService]
+A --> E[CacheUtils]
+B --> F[ElasticsearchClient]
+C --> G[Scheduler]
+D --> H[OkHttpClient]
+E --> I[RedisUtil]
+F --> J[Elasticsearch]
+G --> K[Quartz]
+H --> L[FMS]
+I --> M[Redis]
+```
+
+**图示来源**
+- [TranslateService.java](file://src/main/java/cn/cslg/pas/service/common/TranslateService.java#L47)
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L15)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L25)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java#L27)
+
+**本节来源**
+- [TranslateService.java](file://src/main/java/cn/cslg/pas/service/common/TranslateService.java#L1-L596)
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L1-L38)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L1-L291)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java#L1-L140)
+
+## 常见问题与高可用建议
+
+### 消息丢失
+为防止消息丢失,建议启用RabbitMQ的持久化机制,将消息和队列设置为持久化。同时,在发送消息时使用发布确认(publisher confirm)模式,确保消息成功到达Broker。消费者应使用手动确认(manual acknowledgment)模式,在处理完消息后显式确认。
+
+### 缓存失效
+缓存失效可能导致性能下降和数据库压力增大。建议采用缓存预热策略,在系统启动或低峰期预先加载热点数据。同时,设置合理的缓存过期时间,避免缓存雪崩。对于关键数据,可以采用多级缓存策略,结合本地缓存和分布式缓存。
+
+### 任务堆积
+任务堆积可能导致系统响应变慢甚至崩溃。建议为定时任务设置超时时间,避免长时间运行的任务阻塞其他任务。同时,监控任务执行队列的长度,当队列过长时及时告警并采取措施。对于耗时较长的任务,可以考虑拆分为多个子任务并行执行。
+
+### 高可用性建议
+1. **服务冗余**:关键服务应部署多个实例,通过负载均衡分发请求。
+2. **故障转移**:配置服务的故障转移机制,当主节点故障时自动切换到备用节点。
+3. **监控告警**:建立全面的监控体系,实时监控服务的健康状态、性能指标和错误日志。
+4. **容灾备份**:定期备份关键数据,制定详细的灾难恢复计划。
+5. **弹性伸缩**:根据负载情况动态调整服务实例数量,确保系统在高负载下仍能稳定运行。
+
+## 结论
+PAS系统的核心服务设计合理,功能完善,为系统的稳定运行提供了坚实的基础。通过深入理解这些服务的实现原理和使用方式,开发者可以更好地利用系统提供的功能,提高开发效率和系统质量。同时,遵循本文档提供的最佳实践和高可用建议,可以有效预防和解决常见问题,确保系统的高可用性和稳定性。

+ 349 - 0
.qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析.md

@@ -0,0 +1,349 @@
+# 自定义分析
+
+<cite>
+**本文档引用的文件**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItem.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItem.java)
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java)
+- [CustomAnalysisItemSetting.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSetting.java)
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+- [CustomAnalysisItemMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomAnalysisItemMapper.java)
+- [CustomAnalysisItemSchemaService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSchemaService.java)
+- [CustomAnalysisItemSettingService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSettingService.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+- [CustomAnalyseDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/CustomAnalyseDTO.java)
+- [SchemaDimensionDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SchemaDimensionDTO.java)
+- [SourceDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceDataDTO.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+PAS系统的自定义分析功能允许用户创建和配置复杂的分析模型,以满足特定的业务需求。该功能支持通过界面配置分析项的维度、设置和数据源,并提供计算、展示和导出分析结果的能力。本文档详细解释了自定义分析项的创建、配置和执行流程,剖析了相关领域模型的关系和数据流,并提供了优化建议。
+
+## 项目结构
+自定义分析功能的代码主要分布在`src/main/java/cn/cslg/pas`目录下,包括控制器、服务、数据访问层和数据传输对象。核心组件包括自定义分析项、维度、设置和数据源的管理。
+
+```mermaid
+graph TD
+subgraph "Controller"
+CustomAnalyseController[CustomAnalyseController]
+end
+subgraph "Service"
+CustomAnalyseService[CustomAnalyseService]
+CustomAnalysisItemSchemaService[CustomAnalysisItemSchemaService]
+CustomAnalysisItemSettingService[CustomAnalysisItemSettingService]
+CustomAnalysisItemSourceService[CustomAnalysisItemSourceService]
+end
+subgraph "Mapper"
+CustomAnalysisItemMapper[CustomAnalysisItemMapper]
+CustomAnalysisItemSchemaMapper[CustomAnalysisItemSchemaMapper]
+CustomAnalysisItemSettingMapper[CustomAnalysisItemSettingMapper]
+CustomAnalysisItemSourceMapper[CustomAnalysisItemSourceMapper]
+end
+subgraph "Domain"
+CustomAnalysisItem[CustomAnalysisItem]
+CustomAnalysisItemSchema[CustomAnalysisItemSchema]
+CustomAnalysisItemSetting[CustomAnalysisItemSetting]
+CustomAnalysisItemSource[CustomAnalysisItemSource]
+end
+subgraph "DTO"
+CustomAnalyseDTO[CustomAnalyseDTO]
+SchemaDimensionDTO[SchemaDimensionDTO]
+SourceDataDTO[SourceDataDTO]
+end
+CustomAnalyseController --> CustomAnalyseService
+CustomAnalyseService --> CustomAnalysisItemMapper
+CustomAnalyseService --> CustomAnalysisItemSchemaService
+CustomAnalyseService --> CustomAnalysisItemSettingService
+CustomAnalyseService --> CustomAnalysisItemSourceService
+CustomAnalysisItemSchemaService --> CustomAnalysisItemSchemaMapper
+CustomAnalysisItemSettingService --> CustomAnalysisItemSettingMapper
+CustomAnalysisItemSourceService --> CustomAnalysisItemSourceMapper
+```
+
+**图示来源**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomAnalysisItemMapper.java)
+- [CustomAnalysisItemSchemaService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSchemaService.java)
+- [CustomAnalysisItemSettingService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSettingService.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+**章节来源**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+
+## 核心组件
+自定义分析功能的核心组件包括自定义分析项(CustomAnalysisItem)、维度(CustomAnalysisItemSchema)、设置(CustomAnalysisItemSetting)和数据源(CustomAnalysisItemSource)。这些组件共同构成了自定义分析的完整模型。
+
+**章节来源**
+- [CustomAnalysisItem.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItem.java)
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java)
+- [CustomAnalysisItemSetting.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSetting.java)
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+
+## 架构概述
+自定义分析功能采用典型的三层架构:控制器层处理HTTP请求,服务层实现业务逻辑,数据访问层与数据库交互。这种分层架构确保了代码的可维护性和可扩展性。
+
+```mermaid
+graph TD
+Client[客户端] --> Controller[控制器层]
+Controller --> Service[服务层]
+Service --> Mapper[数据访问层]
+Mapper --> Database[数据库]
+Database --> Mapper
+Mapper --> Service
+Service --> Controller
+Controller --> Client
+```
+
+**图示来源**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomAnalysisItemMapper.java)
+
+## 详细组件分析
+
+### 自定义分析项分析
+自定义分析项是整个功能的核心实体,它包含了分析项的基本信息,如名称、类型、权限等。分析项可以是组别或具体的分析项,通过parentId字段建立层级关系。
+
+```mermaid
+classDiagram
+class CustomAnalysisItem {
++String uid
++String name
++Integer parentId
++Integer permissions
++Integer projectId
++Integer tenantId
++Integer sort
++Integer type
++Integer status
++String createId
++String createName
++Date createTime
++Date updateTime
+}
+```
+
+**图示来源**
+- [CustomAnalysisItem.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItem.java)
+
+### 维度分析
+维度(Schema)定义了分析的X轴和Y轴,包括字段、扩展、类型等信息。维度数据存储在`os_custom_analysis_item_schema`表中,每个分析项可以有多个维度。
+
+```mermaid
+classDiagram
+class CustomAnalysisItemSchema {
++String uid
++String dimension
++String field
++String expand
++String type
++Integer ptype
++Integer num
++Integer status
++String createId
++String createName
++Date createTime
++Date updateTime
++String name
++String groupBy
++String fieldKind
+}
+```
+
+**图示来源**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java)
+
+### 设置分析
+设置(Setting)包含了图表的各种配置,如主题、字体、颜色、布局等。这些设置决定了分析结果的展示方式。
+
+```mermaid
+classDiagram
+class CustomAnalysisItemSetting {
++String uid
++Integer type
++Integer showType
++Integer tableType
++String theme
++String title1
++String title2
++Boolean dataLabel
++String dataPosition
++Integer dataSize
++Integer titleSize
++Integer axisSize
++Integer title1Dir
++Integer status
++String tableConfig
++String colorConfig
++String lineConfig
++String fontFamily
++CustomSettingConfigDTO config
++String createId
++String createName
++Date createTime
++Date updateTime
++Boolean fontWeight
++Boolean fontWeight2
++String nameLocation
++String height
++String width
++String heightUnit
++String widthUnit
++Boolean splitLine
++Boolean splitLine2
++Boolean legend
++String legendLocation
++String gridTop
++String gridLeft
++String gridRight
++String gridBottom
++String fontFamily2
++String labelColor
++String fontFamily3
++String legendFontSize
++String legendColor
++String fontFamily4
++String fontSize
++String fontSize2
++String fontColor
++String fontColor2
++Boolean show1
++Boolean show2
++String nameLocation2
++Boolean interval1
++Boolean interval2
++String rotate
++String rotate2
++Integer paddingTop
++Integer paddingLeft
++Integer paddingBottom
++Integer paddingRight
++Integer paddingTop2
++Integer paddingLeft2
++Integer paddingBottom2
++Integer paddingRight2
++String type2
++Boolean dataLabel2
++Boolean dataLabel3
++String barWidth
++String scatterSize
++String backgroundColor
++String gridBackgroundColor
+}
+```
+
+**图示来源**
+- [CustomAnalysisItemSetting.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSetting.java)
+
+### 数据源分析
+数据源(Source)定义了分析的数据来源,包括字段、扩展、时间范围、数值范围等条件。数据源可以是选中的数据项或范围条件。
+
+```mermaid
+classDiagram
+class CustomAnalysisItemSource {
++String uid
++String dimension
++String name
++Boolean selected
++String field
++String expand
++String startTime
++String endTime
++String minData
++String maxData
++Integer status
++String createId
++String createName
++Date createTime
++Date updateTime
++Integer number
++Integer topN
++SourceMinAndMaxDataDTO min
++SourceMinAndMaxDataDTO max
+}
+```
+
+**图示来源**
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+
+### 数据流分析
+自定义分析的数据流从用户界面开始,经过控制器、服务层,最终存储到数据库中。当需要查询分析结果时,数据流反向执行,从数据库读取数据,经过服务层处理,返回给前端。
+
+```mermaid
+flowchart TD
+Start([用户界面]) --> Controller["控制器接收请求"]
+Controller --> Service["服务层处理业务逻辑"]
+Service --> Mapper["数据访问层操作数据库"]
+Mapper --> Database["数据库存储/读取"]
+Database --> Mapper
+Mapper --> Service
+Service --> Controller
+Controller --> End([返回结果])
+```
+
+**图示来源**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomAnalysisItemMapper.java)
+
+**章节来源**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomAnalysisItemMapper.java)
+
+## 依赖分析
+自定义分析功能的组件之间存在明确的依赖关系。控制器依赖服务层,服务层依赖数据访问层和领域模型。这种依赖关系确保了代码的模块化和可测试性。
+
+```mermaid
+graph TD
+CustomAnalyseController --> CustomAnalyseService
+CustomAnalyseService --> CustomAnalysisItemMapper
+CustomAnalyseService --> CustomAnalysisItemSchemaService
+CustomAnalyseService --> CustomAnalysisItemSettingService
+CustomAnalyseService --> CustomAnalysisItemSourceService
+CustomAnalysisItemSchemaService --> CustomAnalysisItemSchemaMapper
+CustomAnalysisItemSettingService --> CustomAnalysisItemSettingMapper
+CustomAnalysisItemSourceService --> CustomAnalysisItemSourceMapper
+```
+
+**图示来源**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomAnalysisItemMapper.java)
+- [CustomAnalysisItemSchemaService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSchemaService.java)
+- [CustomAnalysisItemSettingService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSettingService.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+**章节来源**
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemMapper.java](file://src/main/java/cn/cslg/pas/mapper/CustomAnalysisItemMapper.java)
+
+## 性能考虑
+自定义分析功能在处理大量数据时可能会遇到性能瓶颈。建议在创建分析项时合理设置数据源的范围条件,避免全表扫描。同时,可以考虑对常用的分析项进行缓存,以提高查询性能。
+
+## 故障排除指南
+常见问题包括配置错误、计算超时和结果不准确。对于配置错误,应检查维度、设置和数据源的配置是否正确。对于计算超时,可以尝试减少数据源的范围或优化查询条件。对于结果不准确,应检查数据源的条件是否符合预期。
+
+**章节来源**
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemSchemaService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSchemaService.java)
+- [CustomAnalysisItemSettingService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSettingService.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+## 结论
+PAS系统的自定义分析功能提供了强大的数据分析能力,通过合理的架构设计和组件划分,实现了灵活的配置和高效的执行。通过遵循最佳实践和优化建议,可以充分发挥该功能的潜力,满足复杂的业务需求。

File diff suppressed because it is too large
+ 369 - 0
.qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析执行与展示.md


+ 464 - 0
.qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析数据源.md

@@ -0,0 +1,464 @@
+# 自定义分析数据源
+
+<cite>
+**本文档引用的文件**  
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+- [SourceDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceDataDTO.java)
+- [SourceMinAndMaxDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceMinAndMaxDataDTO.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java)
+- [CustomAnalysisItemSetting.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSetting.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java)
+- [EsCountAnalyseBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsCountAnalyseBuilderFactory/EsCountAnalysisBuilderFactory.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [自定义分析数据源定义与类型](#自定义分析数据源定义与类型)
+3. [数据源DTO结构与用途](#数据源dto结构与用途)
+4. [极值数据结构](#极值数据结构)
+5. [数据获取机制](#数据获取机制)
+6. [查询条件配置与执行流程](#查询条件配置与执行流程)
+7. [数据源与分析项的依赖关系](#数据源与分析项的依赖关系)
+8. [常见问题与优化方案](#常见问题与优化方案)
+9. [结论](#结论)
+
+## 引言
+
+PAS系统中的自定义分析数据源功能为用户提供了一个强大的专利数据分析平台。该功能允许用户根据特定需求配置分析维度、选择字段和定义聚合规则,从而从Elasticsearch、数据库等数据源中提取和聚合专利数据。本文档将深入探讨自定义分析数据源的核心组件、数据流、配置机制以及性能优化策略,为开发人员和系统管理员提供全面的技术参考。
+
+**本文档引用的文件**  
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+## 自定义分析数据源定义与类型
+
+自定义分析数据源(CustomAnalysisItemSource)是PAS系统中用于存储分析项目数据源配置的核心实体。该实体定义了分析的维度、字段、扩展属性以及时间范围等关键信息。
+
+### 数据源实体结构
+
+`CustomAnalysisItemSource`类是自定义分析数据源的Java实体类,它继承自`BaseEntity`并映射到数据库表`os_custom_analysis_item_source`。该实体包含以下主要属性:
+
+- **uid**: 分析项的唯一标识符,用于关联分析项目
+- **dimension**: 维度标识,通常为"x"或"y",表示分析的坐标轴
+- **field**: 字段ID,指定用于分析的专利数据字段
+- **expand**: 拓展ID,用于支持复杂的数据扩展分析
+- **startTime/endTime**: 时间范围,定义分析的时间窗口
+- **minData/maxData**: 极值数据,以JSON格式存储大于和小于条件
+- **selected**: 布尔值,表示该数据源是否被选中使用
+
+### 数据源类型与分类
+
+根据系统设计,自定义分析数据源可以分为多种类型,主要通过`ptype`和`type`字段进行区分:
+
+- **基础类型 (ptype)**: 
+  - ptype=3: 树形结构分析
+  - ptype=4: 层级结构分析
+  - 其他值: 基础字段分析
+
+- **分析类型 (type)**:
+  - "tree": 树形结构分析,支持层级数据展示
+  - 其他: 常规字段分析
+
+数据源的类型决定了其在前端展示的方式和后端处理的逻辑。例如,当`ptype`为3或4,或`type`为"tree"时,系统会启用特殊的树形结构处理逻辑。
+
+```mermaid
+classDiagram
+class CustomAnalysisItemSource {
++String uid
++String dimension
++String field
++String expand
++String startTime
++String endTime
++String minData
++String maxData
++Boolean selected
++Integer number
++Integer topN
++SourceMinAndMaxDataDTO min
++SourceMinAndMaxDataDTO max
++getItemSourceList(uid, dimension, field, expand) CustomAnalysisItemSource[]
++setReturnData(list) CustomAnalysisItemSource[]
+}
+class SourceMinAndMaxDataDTO {
++Integer value
++Integer operator
+}
+CustomAnalysisItemSource --> SourceMinAndMaxDataDTO : "包含"
+```
+
+**图源**  
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+- [SourceMinAndMaxDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceMinAndMaxDataDTO.java)
+
+**本节源**  
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+
+## 数据源DTO结构与用途
+
+数据源DTO(Data Transfer Object)在PAS系统的自定义分析功能中扮演着关键角色,负责在不同层之间传输数据源配置信息。
+
+### SourceDataDTO结构
+
+`SourceDataDTO`是主要的数据源传输对象,用于封装X轴和Y轴的数据源配置。其结构设计体现了分析项目的二维特性:
+
+```java
+public class SourceDataDTO {
+    private List<CustomAnalysisItemSource> x;
+    private List<CustomAnalysisItemSource> y;
+}
+```
+
+该DTO包含两个列表属性:
+- **x**: 存储X轴维度的数据源配置
+- **y**: 存储Y轴维度的数据源配置
+
+每个列表都包含`CustomAnalysisItemSource`对象,这些对象代表了具体的分析配置。DTO的构造函数会初始化这两个列表,确保即使没有数据也不会返回null值。
+
+### DTO的处理流程
+
+在数据处理过程中,`SourceDataDTO`经历了以下转换流程:
+
+1. **数据获取**: 通过`getItemSourceList`方法从数据库获取原始数据源记录
+2. **数据清洗**: 使用`setReturnData`方法清理敏感信息和冗余字段
+3. **数据转换**: 将JSON格式的极值数据反序列化为`SourceMinAndMaxDataDTO`对象
+4. **数据封装**: 将处理后的数据分别设置到X轴和Y轴列表中
+
+这种分层处理方式确保了数据的安全性和一致性,同时提高了传输效率。
+
+```mermaid
+flowchart TD
+A[数据库查询] --> B[获取原始数据]
+B --> C[清理冗余字段]
+C --> D[JSON反序列化]
+D --> E[封装到SourceDataDTO]
+E --> F[返回给调用方]
+style A fill:#f9f,stroke:#333
+style F fill:#bbf,stroke:#333
+```
+
+**图源**  
+- [SourceDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceDataDTO.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+**本节源**  
+- [SourceDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceDataDTO.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+## 极值数据结构
+
+极值数据(SourceMinAndMaxDataDTO)是自定义分析数据源中的重要组成部分,用于定义数值范围的过滤条件。
+
+### 极值数据DTO
+
+`SourceMinAndMaxDataDTO`是一个简单的数据传输对象,包含两个属性:
+
+- **value**: 数值,表示比较的阈值
+- **operator**: 操作符,表示比较的类型
+
+该DTO的默认构造函数会初始化这些属性为默认值(value=0, operator=0),确保即使在没有显式设置的情况下也能正常工作。
+
+### 极值数据的存储与转换
+
+在数据库中,极值数据以JSON字符串的形式存储在`min_data`和`max_data`字段中。这种设计提供了灵活性,允许存储复杂的条件配置。
+
+数据转换过程如下:
+
+1. **存储时**: `SourceMinAndMaxDataDTO`对象被序列化为JSON字符串
+2. **读取时**: JSON字符串被反序列化回`SourceMinAndMaxDataDTO`对象
+
+这种双向转换通过`JsonUtils`工具类实现,确保了数据的一致性和完整性。
+
+```mermaid
+classDiagram
+class SourceMinAndMaxDataDTO {
++Integer value
++Integer operator
++SourceMinAndMaxDataDTO()
+}
+class CustomAnalysisItemSource {
++String minData
++String maxData
++SourceMinAndMaxDataDTO min
++SourceMinAndMaxDataDTO max
+}
+class JsonUtils {
++String objectToJson(Object obj)
++T jsonToPojo(String json, Class<T> clazz)
+}
+CustomAnalysisItemSource --> SourceMinAndMaxDataDTO : "包含"
+JsonUtils --> CustomAnalysisItemSource : "序列化/反序列化"
+```
+
+**图源**  
+- [SourceMinAndMaxDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceMinAndMaxDataDTO.java)
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+
+**本节源**  
+- [SourceMinAndMaxDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SourceMinAndMaxDataDTO.java)
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+
+## 数据获取机制
+
+PAS系统的自定义分析数据源通过一套完整的机制从Elasticsearch、数据库等数据源中提取和聚合专利数据。
+
+### 数据获取流程
+
+数据获取的核心流程由`CustomAnalysisItemSourceService`中的`getItemSourceData`方法实现:
+
+```java
+public SourceDataDTO getItemSourceData(CustomAnalyseDTO customAnalysisItem) {
+    SourceDataDTO sourceDataDTO = new SourceDataDTO();
+    SchemaDimensionDTO schema = customAnalysisItem.getSchema();
+    sourceDataDTO.setX(this.setReturnData(this.getItemSourceList(customAnalysisItem.getUid(), "x", schema.getX().getField(), schema.getX().getExpand())));
+    sourceDataDTO.setY(this.setReturnData(this.getItemSourceList(customAnalysisItem.getUid(), "y", schema.getY().getField(), schema.getY().getExpand())));
+    return sourceDataDTO;
+}
+```
+
+该流程包含以下步骤:
+1. 创建`SourceDataDTO`实例
+2. 获取分析项的维度配置
+3. 分别获取X轴和Y轴的数据源列表
+4. 对获取的数据进行清洗和转换
+5. 封装并返回结果
+
+### Elasticsearch集成
+
+系统通过`EsCountService`和`EsCountAnalyseBuilderFactory`与Elasticsearch集成,实现高效的专利数据聚合分析。
+
+`EsCountAnalyseBuilderFactory`采用工厂模式,根据不同的分析需求创建相应的查询构建器:
+
+```mermaid
+classDiagram
+class EsCountAnalysisBuilderFactory {
++Map<String, IEsCountAnalysisBuilder> iEsCountAnalysisBuilderMap
++getClass(builderName) IEsCountAnalysisBuilder
+}
+class IEsCountAnalysisBuilder {
++String field
++String valueOne
++String valueTwo
++Integer topN
++createCountAnalyseAgg() Aggregation
+}
+class TermsCountAnalysisBuilder {
++createCountAnalyseAgg() Aggregation
+}
+class RangeCountAnalysisBuilder {
++createCountAnalyseAgg() Aggregation
+}
+EsCountAnalysisBuilderFactory --> IEsCountAnalysisBuilder : "依赖"
+IEsCountAnalysisBuilder <|-- TermsCountAnalysisBuilder
+IEsCountAnalysisBuilder <|-- RangeCountAnalysisBuilder
+```
+
+**图源**  
+- [EsCountAnalyseBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsCountAnalyseBuilderFactory/EsCountAnalysisBuilderFactory.java)
+- [IEsCountAnalysisBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsCountAnalyseBuilderFactory/IEsCountAnalysisBuilder.java)
+
+**本节源**  
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java)
+- [EsCountAnalyseBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsCountAnalyseBuilderFactory/EsCountAnalysisBuilderFactory.java)
+
+## 查询条件配置与执行流程
+
+自定义分析数据源的查询条件配置和执行流程是系统的核心功能,它允许用户灵活地定义分析规则并获取结果。
+
+### 配置解析流程
+
+查询条件的配置解析主要通过`CustomAnalyseService`和`CustomAnalysisItemSourceService`协同完成:
+
+1. **前端配置**: 用户在界面上配置分析项的维度、字段和条件
+2. **DTO传输**: 配置信息通过`CustomAnalyseDTO`传输到后端
+3. **服务处理**: `CustomAnalyseService`调用`CustomAnalysisItemSourceService`处理数据源
+4. **数据库操作**: 将配置保存到`os_custom_analysis_item_source`表
+
+### 查询执行流程
+
+查询执行的详细流程如下:
+
+```mermaid
+sequenceDiagram
+participant Frontend as 前端界面
+participant Controller as CustomAnalyseController
+participant Service as CustomAnalyseService
+participant SourceService as CustomAnalysisItemSourceService
+participant Database as 数据库
+Frontend->>Controller : 提交分析配置
+Controller->>Service : 调用queryAnalyseDetail
+Service->>Service : 验证配置
+Service->>SourceService : 调用getItemSourceData
+SourceService->>SourceService : 调用getItemSourceList
+SourceService->>Database : 执行数据库查询
+Database-->>SourceService : 返回原始数据
+SourceService->>SourceService : 调用setReturnData清洗数据
+SourceService-->>Service : 返回SourceDataDTO
+Service-->>Controller : 返回完整分析数据
+Controller-->>Frontend : 返回分析结果
+```
+
+**图源**  
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+**本节源**  
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+
+## 数据源与分析项的依赖关系
+
+自定义分析数据源与分析项、维度、配置之间存在复杂的依赖关系,这些关系构成了系统的数据流基础。
+
+### 核心组件关系
+
+系统中的核心组件包括:
+- **CustomAnalysisItem**: 分析项目主实体
+- **CustomAnalysisItemSchema**: 分析维度配置
+- **CustomAnalysisItemSetting**: 图表设置
+- **CustomAnalysisItemSource**: 数据源配置
+
+这些组件通过`uid`字段相互关联,形成完整的分析配置。
+
+### 数据流分析
+
+数据流从配置到展示的完整路径如下:
+
+```mermaid
+graph TD
+A[CustomAnalysisItem] --> B[CustomAnalyseDTO]
+B --> C[CustomAnalysisItemSchema]
+B --> D[CustomAnalysisItemSetting]
+B --> E[CustomAnalysisItemSource]
+C --> F[SchemaDimensionDTO]
+E --> G[SourceDataDTO]
+F --> H[X轴配置]
+F --> I[Y轴配置]
+G --> J[X轴数据源]
+G --> K[Y轴数据源]
+H --> L[Elasticsearch查询]
+I --> L
+J --> M[数据聚合]
+K --> M
+L --> M
+M --> N[图表展示]
+style A fill:#f96,stroke:#333
+style N fill:#6f9,stroke:#333
+```
+
+**图源**  
+- [CustomAnalyseDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/CustomAnalyseDTO.java)
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java)
+- [CustomAnalysisItemSetting.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSetting.java)
+
+**本节源**  
+- [CustomAnalyseDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/CustomAnalyseDTO.java)
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java)
+- [CustomAnalysisItemSetting.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSetting.java)
+
+## 常见问题与优化方案
+
+在使用自定义分析数据源功能时,可能会遇到各种问题。本节将介绍常见问题及其优化解决方案。
+
+### 常见问题
+
+1. **查询超时**: 复杂查询或大数据量可能导致查询超时
+2. **数据量过大**: 返回结果过多影响性能和用户体验
+3. **聚合错误**: 错误的聚合配置导致结果不准确
+4. **内存溢出**: 大数据集处理可能导致内存不足
+
+### 优化方案
+
+#### 分页处理
+
+对于大数据集,实施分页策略:
+
+```java
+// 在EsCountService中实现分页
+public void getDateAnalysisDTOS(Aggregate agg, String field, Integer topN, List<EsCountDetailDTO> detailDTOS) {
+    List<RangeBucket> list1 = agg.dateRange().buckets().array();
+    // 限制返回结果数量
+    List<EsCountDetailDTO> collect = list1.stream()
+        .limit(topN)
+        .collect(Collectors.toList());
+    detailDTOS.addAll(collect);
+}
+```
+
+#### 缓存机制
+
+利用`CacheUtils`实现数据缓存,减少重复查询:
+
+```java
+// 在CustomAnalysisItemSourceService中使用缓存
+@Autowired
+private CacheUtils cacheUtils;
+```
+
+#### 异步处理
+
+对于耗时操作,采用异步处理机制:
+
+```java
+// 配置异步任务池
+@Configuration
+public class AsyncTaskPoolConfig {
+    @Bean
+    public Executor asyncExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(5);
+        executor.setMaxPoolSize(10);
+        executor.setQueueCapacity(100);
+        executor.setThreadNamePrefix("Async-");
+        executor.initialize();
+        return executor;
+    }
+}
+```
+
+```mermaid
+flowchart LR
+A[用户请求] --> B{数据是否在缓存中?}
+B --> |是| C[返回缓存数据]
+B --> |否| D[异步执行查询]
+D --> E[处理结果]
+E --> F[存入缓存]
+F --> G[返回结果]
+style A fill:#f9f,stroke:#333
+style C fill:#6f9,stroke:#333
+style G fill:#6f9,stroke:#333
+```
+
+**图源**  
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+
+**本节源**  
+- [EsCountService.java](file://src/main/java/cn/cslg/pas/service/business/es/EsCountService.java)
+- [CacheUtils.java](file://src/main/java/cn/cslg/pas/common/utils/CacheUtils.java)
+- [AsyncTaskPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/AsyncTaskPoolConfig.java)
+
+## 结论
+
+PAS系统的自定义分析数据源功能提供了一套完整的专利数据分析解决方案。通过`CustomAnalysisItemSource`实体、`SourceDataDTO`传输对象和一系列服务组件的协同工作,系统实现了灵活的分析配置、高效的数据获取和直观的结果展示。
+
+核心优势包括:
+- **灵活性**: 支持多种分析类型和配置选项
+- **可扩展性**: 基于工厂模式的查询构建器易于扩展
+- **性能优化**: 通过缓存、分页和异步处理确保系统性能
+- **数据完整性**: 完善的DTO转换和数据清洗机制
+
+未来可以进一步优化的方向包括:
+1. 增强查询性能,支持更复杂的分析场景
+2. 改进缓存策略,提高数据访问效率
+3. 增加更多的分析类型和可视化选项
+4. 优化用户体验,简化配置流程
+
+这套系统为专利分析提供了强大的技术支持,能够满足不同用户的需求,是PAS系统中不可或缺的重要组成部分。

+ 271 - 0
.qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析维度.md

@@ -0,0 +1,271 @@
+# 自定义分析维度
+
+<cite>
+**本文档引用的文件**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java)
+- [SchemaDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SchemaDataDTO.java)
+- [SchemaDimensionDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SchemaDimensionDTO.java)
+- [CustomAnalysisItemSchemaService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSchemaService.java)
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java)
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java)
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java)
+- [CustomAnalysisItemSourceService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSourceService.java)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [自定义分析维度定义](#自定义分析维度定义)
+3. [维度数据模型设计](#维度数据模型设计)
+4. [维度分类与层级结构](#维度分类与层级结构)
+5. [维度作为分析轴与分组依据](#维度作为分析轴与分组依据)
+6. [维度管理操作](#维度管理操作)
+7. [数据完整性与一致性验证](#数据完整性与一致性验证)
+8. [维度关联关系与数据流转](#维度关联关系与数据流转)
+9. [常见问题与优化策略](#常见问题与优化策略)
+10. [结论](#结论)
+
+## 引言
+PAS系统中的自定义分析维度管理功能为用户提供了一套灵活的分析框架,允许用户根据特定需求创建和管理分析维度。这些维度不仅作为分析的X轴或分组依据,还支持多级分类和嵌套结构,从而实现复杂的数据分析场景。本文档将深入探讨自定义分析维度的定义、分类、层级结构以及相关的设计与实现细节。
+
+## 自定义分析维度定义
+自定义分析维度(CustomAnalysisItemSchema)是PAS系统中用于描述分析项目维度数据的核心实体。该实体通过`os_custom_analysis_item_schema`表进行持久化存储,包含多个关键属性,如UID、维度名称、字段、扩展信息、类型、创建者等。每个维度实例都与一个唯一的UID关联,确保了维度数据的唯一性和可追溯性。
+
+```mermaid
+classDiagram
+class CustomAnalysisItemSchema {
++String uid
++String dimension
++String field
++String expand
++String type
++Integer ptype
++Integer num
++Integer status
++String createId
++String createName
++Date createTime
++Date updateTime
++String name
++String groupBy
++String fieldKind
+}
+```
+
+**图表来源**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java#L18-L70)
+
+**本节来源**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java#L1-L70)
+
+## 维度数据模型设计
+维度数据模型(SchemaDataDTO)是用于封装维度数据的核心数据传输对象。它包含了字段、扩展、类型、数量等属性,用于在不同层级之间传递维度信息。`SchemaDataDTO`类的设计遵循了简洁性和灵活性的原则,使得维度数据可以在不同的业务逻辑中被轻松地构建、查询和序列化。
+
+```mermaid
+classDiagram
+class SchemaDataDTO {
++String field
++String expand
++Integer ptype
++String type
++Integer num
++Integer merge
++String name
++String groupBy
++String fieldKind
+}
+```
+
+**图表来源**
+- [SchemaDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SchemaDataDTO.java#L5-L22)
+
+**本节来源**
+- [SchemaDataDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SchemaDataDTO.java#L1-L24)
+
+## 维度分类与层级结构
+自定义分析维度支持多级分类和嵌套结构,允许用户根据业务需求构建复杂的分析模型。维度可以被分为不同的类别,如时间维度、地理维度、产品维度等,并且每个维度可以进一步细分为子维度。这种层级结构不仅提高了分析的灵活性,还增强了数据的组织性和可读性。
+
+```mermaid
+graph TD
+A[根维度] --> B[时间维度]
+A --> C[地理维度]
+A --> D[产品维度]
+B --> E[年]
+B --> F[月]
+B --> G[日]
+C --> H[国家]
+C --> I[省份]
+C --> J[城市]
+D --> K[类别]
+D --> L[品牌]
+D --> M[型号]
+```
+
+**图表来源**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java#L18-L70)
+
+**本节来源**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java#L1-L70)
+
+## 维度作为分析轴与分组依据
+在PAS系统中,维度可以作为分析的X轴或分组依据,支持多级分类和嵌套结构。通过`SchemaDimensionDTO`类,用户可以定义X轴和Y轴的维度数据,从而实现多维度的数据分析。`SchemaDimensionDTO`类包含两个`SchemaDataDTO`对象,分别代表X轴和Y轴的维度数据。
+
+```mermaid
+classDiagram
+class SchemaDimensionDTO {
++SchemaDataDTO x
++SchemaDataDTO y
+}
+```
+
+**图表来源**
+- [SchemaDimensionDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SchemaDimensionDTO.java#L2-L21)
+
+**本节来源**
+- [SchemaDimensionDTO.java](file://src/main/java/cn/cslg/pas/common/dto/customAnalyse/SchemaDimensionDTO.java#L1-L22)
+
+## 维度管理操作
+用户可以通过PAS系统的API接口创建、编辑和管理分析维度。`CustomAnalyseService`类提供了`addAnalyseGroup`、`editAnalyseGroup`和`delAnalyseGroup`方法,分别用于添加、编辑和删除分析维度。这些操作均通过`CustomAnalyseController`类暴露给前端应用,确保了维度管理的灵活性和安全性。
+
+```mermaid
+sequenceDiagram
+participant 用户 as 用户
+participant 控制器 as CustomAnalyseController
+participant 服务 as CustomAnalyseService
+participant 数据库 as 数据库
+用户->>控制器 : 发送创建维度请求
+控制器->>服务 : 调用addAnalyseGroup方法
+服务->>数据库 : 插入新维度数据
+数据库-->>服务 : 返回插入结果
+服务-->>控制器 : 返回成功响应
+控制器-->>用户 : 返回成功消息
+```
+
+**图表来源**
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java#L109-L147)
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java#L31-L66)
+
+**本节来源**
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java#L1-L195)
+- [CustomAnalyseController.java](file://src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java#L1-L89)
+
+## 数据完整性与一致性验证
+为了确保维度数据的完整性和一致性,PAS系统在多个层面实施了验证机制。首先,在创建或编辑维度时,系统会检查维度名称的唯一性,防止重复命名。其次,系统通过`XiaoShiException`类处理各种业务异常,如名称重复、删除失败等,确保了操作的健壮性。
+
+```mermaid
+flowchart TD
+Start([开始]) --> CheckName["检查维度名称是否重复"]
+CheckName --> NameValid{"名称有效?"}
+NameValid --> |否| ThrowException["抛出XiaoShiException异常"]
+NameValid --> |是| SaveData["保存维度数据"]
+SaveData --> End([结束])
+```
+
+**图表来源**
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java#L110-L117)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java#L1-L39)
+
+**本节来源**
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java#L1-L195)
+- [XiaoShiException.java](file://src/main/java/cn/cslg/pas/exception/XiaoShiException.java#L1-L39)
+
+## 维度关联关系与数据流转
+自定义分析维度与分析项、配置、数据源之间存在紧密的关联关系。`CustomAnalysisItemSchema`实体与`CustomAnalysisItem`实体通过UID关联,形成了维度与分析项的映射。此外,`CustomAnalysisItemSource`实体用于存储维度的数据源信息,确保了数据的完整性和一致性。
+
+```mermaid
+erDiagram
+CUSTOM_ANALYSIS_ITEM_SCHEMA {
+string uid PK
+string dimension
+string field
+string expand
+string type
+integer ptype
+integer num
+integer status
+string createId
+string createName
+date createTime
+date updateTime
+string name
+string groupBy
+string fieldKind
+}
+CUSTOM_ANALYSIS_ITEM {
+integer id PK
+string uid FK
+string name
+integer parentId
+integer permissions
+integer projectId
+integer sort
+integer type
+string remark
+integer createBy
+integer status
+datetime createTime
+datetime updateTime
+}
+CUSTOM_ANALYSIS_ITEM_SOURCE {
+integer id PK
+string uid FK
+string dimension
+string name
+boolean selected
+string field
+string expand
+string startTime
+string endTime
+string minData
+string maxData
+integer status
+string createId
+string createName
+date createTime
+date updateTime
+integer number
+integer topN
+}
+CUSTOM_ANALYSIS_ITEM_SCHEMA ||--o{ CUSTOM_ANALYSIS_ITEM : "通过UID关联"
+CUSTOM_ANALYSIS_ITEM_SCHEMA ||--o{ CUSTOM_ANALYSIS_ITEM_SOURCE : "通过UID关联"
+```
+
+**图表来源**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java#L18-L70)
+- [CustomAnalysisItem.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItem.java)
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java#L22-L118)
+
+**本节来源**
+- [CustomAnalysisItemSchema.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSchema.java#L1-L70)
+- [CustomAnalysisItem.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItem.java)
+- [CustomAnalysisItemSource.java](file://src/main/java/cn/cslg/pas/domain/business/CustomAnalysisItemSource.java#L1-L119)
+
+## 常见问题与优化策略
+在使用自定义分析维度时,可能会遇到一些常见问题,如维度循环引用、数据类型不匹配、层级过深等性能问题。针对这些问题,PAS系统提供了一系列优化策略。例如,通过限制维度层级深度来避免性能瓶颈,通过类型检查确保数据的一致性,通过循环引用检测防止数据结构的无限递归。
+
+```mermaid
+flowchart TD
+Start([开始]) --> CheckCycle["检查维度循环引用"]
+CheckCycle --> CycleDetected{"存在循环引用?"}
+CycleDetected --> |是| PreventSave["阻止保存并提示错误"]
+CycleDetected --> |否| CheckType["检查数据类型"]
+CheckType --> TypeValid{"类型匹配?"}
+TypeValid --> |否| PreventSave
+TypeValid --> |是| CheckDepth["检查层级深度"]
+CheckDepth --> DepthValid{"层级过深?"}
+DepthValid --> |是| PreventSave
+DepthValid --> |否| SaveData["保存维度数据"]
+SaveData --> End([结束])
+```
+
+**图表来源**
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java#L180-L191)
+- [CustomAnalysisItemSchemaService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSchemaService.java#L146-L148)
+
+**本节来源**
+- [CustomAnalyseService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java#L1-L195)
+- [CustomAnalysisItemSchemaService.java](file://src/main/java/cn/cslg/pas/service/business/CustomAnalysisItemSchemaService.java#L1-L150)
+
+## 结论
+PAS系统的自定义分析维度管理功能为用户提供了一套强大而灵活的分析工具。通过深入理解维度的定义、分类、层级结构以及相关的设计与实现细节,用户可以更有效地利用这些功能来满足复杂的分析需求。同时,系统提供的数据完整性与一致性验证机制,以及针对常见问题的优化策略,确保了分析过程的稳定性和可靠性。

File diff suppressed because it is too large
+ 279 - 0
.qoder/repowiki/zh/content/业务逻辑层/自定义分析/自定义分析配置.md


+ 307 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务关联模型.md

@@ -0,0 +1,307 @@
+# 任务关联模型
+
+<cite>
+**本文档引用的文件**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectTaskMapper.java)
+- [ProjectTaskMapper.xml](file://src/main/resources/mapper/ProjectTaskMapper.xml)
+- [TaskCodeService.java](file://src/main/java/cn/cslg/pas/service/business/TaskCodeService.java)
+- [TaskCodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TaskCodeMapper.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 引言
+本文档深入探讨了PAS系统中任务关联模型的设计与实现。重点分析了任务(ProjectTask)与项目(Project)、任务批次(TaskBatch)、任务代码(TaskCode)之间的领域模型关系。文档详细说明了外键约束、级联操作和数据一致性维护机制,以及任务分组和批量处理的实现方式。
+
+## 项目结构
+PAS系统的任务管理模块主要位于`src/main/java/cn/cslg/pas/domain/business`目录下,包含核心的领域模型类。任务相关的服务实现位于`src/main/java/cn/cslg/pas/service/business`目录,而数据访问层则位于`src/main/java/cn/cslg/pas/mapper`目录。
+
+```mermaid
+graph TD
+subgraph "领域模型"
+ProjectTask[ProjectTask]
+TaskBatch[TaskBatch]
+TaskCode[TaskCode]
+Project[Project]
+end
+subgraph "数据访问层"
+ProjectTaskMapper[ProjectTaskMapper]
+TaskCodeMapper[TaskCodeMapper]
+end
+subgraph "服务层"
+TaskCodeService[TaskCodeService]
+ProjectTaskService[ProjectTaskService]
+end
+ProjectTask --> Project
+ProjectTask --> TaskBatch
+ProjectTask --> TaskCode
+ProjectTaskMapper --> ProjectTask
+TaskCodeMapper --> TaskCode
+TaskCodeService --> TaskCodeMapper
+ProjectTaskService --> ProjectTaskMapper
+```
+
+**图源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectTaskMapper.java)
+- [TaskCodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TaskCodeMapper.java)
+
+**节源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+
+## 核心组件
+PAS系统的任务关联模型由四个核心组件构成:ProjectTask(项目任务)、Project(项目)、TaskBatch(任务批次)和TaskCode(任务代码)。这些组件通过外键约束和业务逻辑相互关联,形成了完整的任务管理体系。
+
+**节源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+
+## 架构概述
+PAS系统的任务关联模型采用分层架构设计,包括领域模型层、数据访问层和服务层。领域模型层定义了任务相关的实体类,数据访问层提供了对数据库的访问接口,服务层则封装了业务逻辑。
+
+```mermaid
+classDiagram
+class ProjectTask {
++String name
++Integer projectId
++Integer type
++String handler
++Integer handlerType
++Date deadLineTime
++Date finishTime
++Integer processId
++Integer lastTaskId
++Integer assoTaskId
++String taskPath
++String description
++Integer status
++double progress
++Integer result
++String createId
++Date createTime
+}
+class Project {
++String name
++Integer entrustType
++String entrustId
++String headId
++String departmentId
++Integer type
++String contractNo
++String volumeNumber
++Date commissionCaseDay
++String description
++Integer tenantId
++String createId
++Date createTime
+}
+class TaskBatch {
++String createId
++DateTime createTime
+}
+class TaskCode {
++Integer taskId
++String codeNum
+}
+ProjectTask --> Project : "belongsTo"
+ProjectTask --> TaskBatch : "belongsTo"
+ProjectTask --> TaskCode : "has"
+```
+
+**图源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+
+## 详细组件分析
+### ProjectTask 分析
+ProjectTask是任务关联模型的核心实体,代表了系统中的具体任务。它与Project、TaskBatch和TaskCode等实体建立了关联关系。
+
+#### 领域模型关系
+ProjectTask与Project之间存在一对多的关系,一个项目可以有多个任务。ProjectTask与TaskCode之间也存在一对一的关系,每个任务都有一个唯一的任务代码。
+
+```mermaid
+erDiagram
+PROJECT ||--o{ PROJECT_TASK : "包含"
+PROJECT_TASK ||--|| TASK_CODE : "拥有"
+PROJECT_TASK ||--o{ TASK_BATCH : "属于"
+PROJECT {
+string name
+integer entrustType
+string entrustId
+string headId
+string departmentId
+integer type
+string contractNo
+string volumeNumber
+date commissionCaseDay
+string description
+integer tenantId
+string createId
+date createTime
+}
+PROJECT_TASK {
+string name
+integer projectId
+integer type
+string handler
+integer handlerType
+date deadLineTime
+date finishTime
+integer processId
+integer lastTaskId
+integer assoTaskId
+string taskPath
+string description
+integer status
+double progress
+integer result
+string createId
+date createTime
+}
+TASK_CODE {
+integer taskId
+string codeNum
+}
+TASK_BATCH {
+string createId
+datetime createTime
+}
+```
+
+**图源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+
+**节源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+
+### 外键约束与数据一致性
+在数据库层面,ProjectTask表通过projectId字段与Project表建立外键关联,确保每个任务都属于一个有效的项目。TaskCode表通过taskId字段与ProjectTask表建立外键关联,保证任务代码与任务的一一对应关系。
+
+**节源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+
+### 任务分组与批量处理
+TaskBatch实体用于实现任务的批量处理和调度。通过将多个任务关联到同一个TaskBatch,系统可以对这些任务进行统一的管理和调度。
+
+**节源**
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+
+### TaskCode 动态扩展机制
+TaskCode作为任务类型的字典表,通过codeNum字段存储任务的唯一标识码。这种设计使得系统可以灵活地扩展新的任务类型,而无需修改数据库结构。
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Service as "TaskCodeService"
+participant Mapper as "TaskCodeMapper"
+participant DB as "数据库"
+Client->>Service : addTaskCode(taskId)
+Service->>Service : generateShortUuid()
+Service->>Service : 创建TaskCode对象
+Service->>Mapper : insert(TaskCode)
+Mapper->>DB : 执行INSERT语句
+DB-->>Mapper : 返回结果
+Mapper-->>Service : 返回结果
+Service-->>Client : 返回生成的codeNum
+```
+
+**图源**
+- [TaskCodeService.java](file://src/main/java/cn/cslg/pas/service/business/TaskCodeService.java)
+- [TaskCodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TaskCodeMapper.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+
+**节源**
+- [TaskCodeService.java](file://src/main/java/cn/cslg/pas/service/business/TaskCodeService.java)
+
+## 依赖分析
+任务关联模型的组件之间存在明确的依赖关系。ProjectTask依赖于Project、TaskBatch和TaskCode,而TaskCodeService依赖于TaskCodeMapper来实现数据持久化。
+
+```mermaid
+graph TD
+TaskCodeService --> TaskCodeMapper
+TaskCodeMapper --> TaskCode
+ProjectTaskService --> ProjectTaskMapper
+ProjectTaskMapper --> ProjectTask
+ProjectTask --> Project
+ProjectTask --> TaskBatch
+ProjectTask --> TaskCode
+```
+
+**图源**
+- [TaskCodeService.java](file://src/main/java/cn/cslg/pas/service/business/TaskCodeService.java)
+- [TaskCodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TaskCodeMapper.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectTaskMapper.java)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [TaskBatch.java](file://src/main/java/cn/cslg/pas/domain/business/TaskBatch.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+
+**节源**
+- [TaskCodeService.java](file://src/main/java/cn/cslg/pas/service/business/TaskCodeService.java)
+- [TaskCodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TaskCodeMapper.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectTaskMapper.java)
+
+## 性能考虑
+在多表关联查询方面,系统使用MyBatis-Plus进行复杂查询。通过在ProjectTaskMapper.xml中定义动态SQL,实现了灵活的查询功能。
+
+```mermaid
+flowchart TD
+Start([开始]) --> BuildSQL["构建动态SQL"]
+BuildSQL --> ExecuteQuery["执行查询"]
+ExecuteQuery --> ProcessResult["处理结果集"]
+ProcessResult --> ReturnResult["返回结果"]
+style Start fill:#f9f,stroke:#333
+style ReturnResult fill:#f9f,stroke:#333
+```
+
+**图源**
+- [ProjectTaskMapper.xml](file://src/main/resources/mapper/ProjectTaskMapper.xml)
+
+**节源**
+- [ProjectTaskMapper.xml](file://src/main/resources/mapper/ProjectTaskMapper.xml)
+
+## 故障排除指南
+### 关联查询性能问题
+当遇到关联查询性能低下时,建议检查相关字段的索引情况。在ProjectTask表的projectId、taskId等外键字段上建立索引可以显著提升查询性能。
+
+### 外键约束冲突
+外键约束冲突通常发生在插入或更新数据时引用了不存在的父记录。在进行数据操作前,应先验证相关记录的存在性。
+
+### 批量操作失败
+批量操作失败可能是由于事务管理不当或数据量过大导致。建议将大批量操作分解为多个小批量操作,并确保适当的事务边界。
+
+**节源**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TaskCode.java](file://src/main/java/cn/cslg/pas/domain/business/TaskCode.java)
+
+## 结论
+PAS系统的任务关联模型通过精心设计的领域模型和合理的数据库约束,实现了任务、项目、任务批次和任务代码之间的有效关联。该模型不仅支持灵活的任务管理功能,还通过TaskCode机制实现了任务类型的动态扩展能力。通过合理的索引设计和查询优化,系统能够高效地处理复杂的多表关联查询。

+ 178 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务状态管理.md

@@ -0,0 +1,178 @@
+# 任务状态管理
+
+<cite>
+**本文档引用的文件**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java)
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java)
+- [EStatus.java](file://src/main/java/cn/cslg/pas/common/core/base/EStatus.java)
+- [projectTask.json](file://src/main/resources/jsons/projectTask.json)
+- [TaskHandleResult.java](file://src/main/java/cn/cslg/pas/domain/business/TaskHandleResult.java)
+- [PatentDigProject.java](file://src/main/java/cn/cslg/pas/domain/business/PatentDigProject.java)
+- [ReportProject.java](file://src/main/java/cn/cslg/pas/domain/business/ReportProject.java)
+</cite>
+
+## 目录
+1. [任务状态定义](#任务状态定义)
+2. [任务状态转换机制](#任务状态转换机制)
+3. [状态变更业务规则与权限控制](#状态变更业务规则与权限控制)
+4. [状态持久化与审计日志](#状态持久化与审计日志)
+5. [并发状态锁机制](#并发状态锁机制)
+6. [前端UI交互模式](#前端ui交互模式)
+7. [常见问题与解决方案](#常见问题与解决方案)
+
+## 任务状态定义
+
+在PAS系统中,任务状态管理是项目流程控制的核心。任务状态主要通过`ProjectTask`实体类中的`status`字段进行管理,该字段为整型,其具体含义如下:
+
+- **0**: 未开始
+- **1**: 处理中
+- **2**: 审核中
+- **3**: 已完成
+- **4**: 已关闭
+- **5**: 已取消
+
+此外,系统还定义了`EStatus`枚举类,用于表示通用的启用/禁用状态(1为启用,0为禁用),但此枚举不直接用于任务状态管理。
+
+任务状态的定义在`projectTask.json`配置文件中也有体现,该文件定义了前端展示的字段映射,其中`status`字段被明确标识为任务状态,用于在用户界面中显示和查询。
+
+**Section sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java#L95-L100)
+- [projectTask.json](file://src/main/resources/jsons/projectTask.json#L203-L259)
+- [EStatus.java](file://src/main/java/cn/cslg/pas/common/core/base/EStatus.java#L6-L15)
+
+## 任务状态转换机制
+
+PAS系统的任务状态转换由`ProjectTaskService`服务类中的`finishTask`方法驱动。该方法根据传入的`type`参数执行不同的状态转换逻辑。
+
+```mermaid
+stateDiagram-v2
+[*] --> 未开始
+未开始 --> 处理中 : 分配任务
+处理中 --> 审核中 : 提交审核
+审核中 --> 已完成 : 审核通过
+审核中 --> 处理中 : 返回修改
+处理中 --> 已完成 : 直接完成
+处理中 --> 已取消 : 取消任务
+已完成 --> [*]
+已取消 --> [*]
+```
+
+**Diagram sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L638-L665)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java#L95-L100)
+
+状态转换的关键逻辑如下:
+1.  **完成任务** (`type=0`): 当任务处理人完成任务时,系统会检查当前状态。如果任务不是“审核中”(状态2),则将其状态更新为“已完成”(状态3)。
+2.  **取消任务** (`type=1`): 任务可以被取消,状态更新为“已取消”(状态5)。
+3.  **缺少资料** (`type=2`): 此类型用于标记任务因资料不全而暂停。
+
+状态转换不仅影响任务本身,还会级联更新关联的项目状态。例如,在`TaskHandleResultService`中,当一个审核任务完成时,会触发关联的挖掘项目或报告项目的状态更新。
+
+**Section sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L638-L706)
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java#L120-L169)
+
+## 状态变更业务规则与权限控制
+
+任务状态的变更受到严格的业务规则和权限控制。系统通过AOP(面向切面编程)和方法内部的逻辑判断来实现这些控制。
+
+### 前置条件
+- **角色权限**: 只有任务的处理人(handler)或具有特定权限的管理员才能发起状态变更。`ProjectTaskController`中的`updateTaskStatus`接口是状态变更的入口,其调用者必须通过身份验证。
+- **状态约束**: 状态转换必须符合预定义的流程。例如,`finishTask`方法在将任务标记为“已完成”之前,会检查任务是否处于“审核中”状态,如果是,则抛出`XiaoShiException`异常,阻止非法状态转换。
+
+### 后置条件
+- **级联更新**: 状态变更的后置条件是触发一系列级联操作。最典型的例子是审核任务的完成会更新其关联的主任务状态。
+- **项目状态同步**: 当任务状态变更时,其所属的父级项目(如挖掘项目或报告项目)的状态也会被同步更新。例如,一个挖掘项目的开卷审核任务完成后,该项目的状态会从“开卷审核”变为“进行中”。
+
+**Section sources**
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L97-L106)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L638-L665)
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java#L474-L494)
+
+## 状态持久化与审计日志
+
+### 状态持久化机制
+任务状态的持久化通过MyBatis-Plus框架实现。`ProjectTask`实体类使用`@TableName("project_task")`注解映射到数据库表。状态的变更通过调用`updateById()`方法直接更新数据库记录。
+
+### 审计日志记录
+系统通过事件监听器模式记录状态变更的审计日志。核心机制如下:
+1.  **结果记录**: 每次任务状态变更(尤其是审核操作)时,系统会创建一条`TaskHandleResult`记录。该记录包含了处理结果、描述、下一个审核人等信息。
+2.  **关联查询**: `TaskHandleResult`实体通过`task_id`字段与`ProjectTask`建立关联,从而形成完整的审核历史链。
+3.  **历史查询**: `ProjectTaskService`提供了`getAuditHistory`方法,用于查询指定任务ID的所有审核历史,将`ProjectTask`和`TaskHandleResult`的数据聚合后返回给前端。
+
+```mermaid
+erDiagram
+PROJECT_TASK ||--o{ TASK_HANDLE_RESULT : "has"
+PROJECT_TASK {
+integer id PK
+string name
+integer status
+integer project_id FK
+}
+TASK_HANDLE_RESULT {
+integer id PK
+string handle_result
+string description
+string next_auditor
+boolean if_back
+integer task_id FK
+datetime create_time
+}
+```
+
+**Diagram sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TaskHandleResult.java](file://src/main/java/cn/cslg/pas/domain/business/TaskHandleResult.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L1500-L1554)
+
+## 并发状态锁机制
+
+在当前分析的代码中,未发现显式的乐观锁或悲观锁实现(如`@Version`注解或`SELECT FOR UPDATE`语句)。状态的更新主要依赖于`updateById()`方法。
+
+然而,系统通过以下方式在一定程度上缓解了并发修改冲突:
+1.  **业务逻辑校验**: 在执行状态更新前,会先查询当前任务的最新状态。例如,在`finishTask`方法中,会检查任务是否为“审核中”,这可以防止在特定状态下进行非法操作。
+2.  **事务控制**: `ProjectTaskService`类中的关键方法使用了`@Transactional`注解,确保了数据库操作的原子性,防止了脏写。
+
+尽管如此,对于高并发场景下的“丢失更新”问题,当前实现可能不够健壮。推荐的解决方案是引入乐观锁。
+
+**Section sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L638-L665)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L1500-L1554)
+
+## 前端UI交互模式
+
+前端通过`ProjectTaskController`提供的REST API与后端进行交互,实现任务状态的实时更新。
+
+1.  **状态变更**: 前端调用`/updateTaskStatus`接口,传入`taskId`和`type`,触发后端的状态变更逻辑。
+2.  **数据查询**: 前端通过`/queryProjectTask`接口查询任务列表,获取最新的任务状态。
+3.  **审核历史**: 前端调用`/queryAuditHistory`接口,获取任务的完整审核历史,包括所有`TaskHandleResult`记录。
+
+这种基于HTTP的请求-响应模式是当前系统的主要交互方式。虽然代码中存在`WebSocketConfig`,但未发现其在任务状态管理中的直接应用,因此系统尚未实现真正的实时推送。
+
+**Section sources**
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L97-L106)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L71-L77)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L80-L86)
+
+## 常见问题与解决方案
+
+### 常见问题
+1.  **状态不一致**: 由于缺乏乐观锁,多个用户同时修改同一任务可能导致状态不一致。
+2.  **并发修改冲突**: 在高并发场景下,后提交的更新可能会覆盖先提交的更新,造成“丢失更新”。
+3.  **状态回滚困难**: 系统没有提供直接的状态回滚功能,一旦状态变更,只能通过创建新的审核任务来修正。
+
+### 解决方案
+1.  **乐观锁**: 在`ProjectTask`实体中增加一个`version`字段,并使用MyBatis-Plus的`@Version`注解。每次更新时,SQL语句会自动检查版本号,如果版本号不匹配,则更新失败,从而保证数据一致性。
+    ```java
+    @TableField(value = "version")
+    @Version
+    private Integer version;
+    ```
+2.  **版本控制**: 引入版本号机制,每次状态变更都生成一个新的版本,便于追踪和回滚。
+3.  **增强的审计日志**: 在`TaskHandleResult`中增加`old_status`和`new_status`字段,明确记录状态变更的前后值,为问题排查和数据恢复提供依据。
+
+**Section sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TaskHandleResult.java](file://src/main/java/cn/cslg/pas/domain/business/TaskHandleResult.java)

+ 167 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务生命周期.md

@@ -0,0 +1,167 @@
+# 任务生命周期
+
+<cite>
+**本文档引用的文件**  
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java)
+- [projectTask.json](file://src/main/resources/jsons/projectTask.json)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectTaskMapper.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [任务状态流转](#任务状态流转)
+3. [任务创建与初始化](#任务创建与初始化)
+4. [任务状态转换规则](#任务状态转换规则)
+5. [任务与项目关联关系](#任务与项目关联关系)
+6. [常见问题与最佳实践](#常见问题与最佳实践)
+
+## 简介
+PAS系统中的任务生命周期管理是项目协作和进度跟踪的核心机制。任务从创建到关闭的完整生命周期涵盖了多个状态,包括创建(Create)、待处理(Pending)、处理中(Processing)、待审核(ToBeReviewed)、已完成(Completed)和已关闭(Closed)。本文档详细阐述了任务状态的完整流转过程、触发条件、转换规则以及业务约束。
+
+**Section sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java#L95-L100)
+
+## 任务状态流转
+任务状态在PAS系统中通过`status`字段进行管理,该字段为整型,代表不同的状态值。根据代码分析,任务状态的完整流转过程如下:
+
+```mermaid
+flowchart TD
+A[创建] --> B[处理中]
+B --> C[待审核]
+C --> D[已完成]
+B --> D
+B --> E[已取消]
+C --> E
+D --> F[已关闭]
+```
+
+**Diagram sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java#L95-L100)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L642-L778)
+
+## 任务创建与初始化
+当创建新任务时,系统会执行一系列初始化逻辑,包括任务分配、优先级设置和截止日期计算。
+
+### 任务创建流程
+任务创建主要通过`ProjectTaskService.addTask()`方法实现,其核心流程包括:
+1. 验证项目ID、任务类型和任务名称的必填性
+2. 根据关联任务ID查询流程ID
+3. 设置任务状态为"处理中"(status=2)
+4. 记录任务发起人信息
+5. 处理附件上传和关联
+
+```mermaid
+flowchart TD
+Start([开始]) --> ValidateInput["验证输入参数"]
+ValidateInput --> CheckProjectId{"项目ID为空?"}
+CheckProjectId --> |是| ReturnError["返回错误"]
+CheckProjectId --> |否| CheckTaskType{"任务类型为空?"}
+CheckTaskType --> |是| ReturnError
+CheckTaskType --> |否| CheckTaskName{"任务名称为空?"}
+CheckTaskName --> |是| ReturnError
+CheckTaskName --> |否| SetStatus["设置状态为处理中"]
+SetStatus --> SetCreator["设置任务发起人"]
+SetCreator --> HandleAttachment["处理附件关联"]
+HandleAttachment --> End([结束])
+```
+
+**Diagram sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L173-L250)
+
+**Section sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L173-L250)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L48-L53)
+
+## 任务状态转换规则
+任务状态的转换受到严格的业务规则约束,不同的任务类型和操作类型会触发不同的状态变更。
+
+### 状态转换触发条件
+根据`ProjectTaskService.finishTask()`方法的实现,任务状态转换的主要触发条件如下:
+
+| 操作类型 | 任务类型 | 触发条件 | 目标状态 |
+|---------|---------|---------|---------|
+| 完成 | 分配任务/协同任务 | 处理人完成任务 | 已完成(3) |
+| 取消 | 分配任务/协同任务 | 处理人取消任务 | 已取消(5) |
+| 同意 | 开卷审核任务 | 审核人同意 | 已完成(3) |
+| 取消 | 开卷审核任务 | 审核人取消 | 已取消(5) |
+| 缺少资料 | 开卷审核任务 | 审核人标记缺少资料 | 待处理(4) |
+
+```mermaid
+stateDiagram-v2
+[*] --> Created : 创建任务
+Created --> Processing : 初始化
+Processing --> ToBeReviewed : 提交审核
+Processing --> Completed : 直接完成
+Processing --> Cancelled : 取消任务
+ToBeReviewed --> Completed : 审核通过
+ToBeReviewed --> Processing : 返回修改
+ToBeReviewed --> Cancelled : 审核拒绝
+Completed --> Closed : 任务关闭
+Cancelled --> Closed : 任务关闭
+```
+
+**Diagram sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L642-L778)
+- [projectTask.json](file://src/main/resources/jsons/projectTask.json#L200-L227)
+
+**Section sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L642-L778)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/ProjectTaskController.java#L97-L106)
+
+## 任务与项目关联关系
+任务与项目之间存在紧密的关联关系,这种关系在项目进度跟踪中起着关键作用。
+
+### 任务-项目关联模型
+每个任务都关联到一个具体的项目(通过`projectId`字段),并且任务的状态变化会直接影响项目的整体状态。对于不同类型的项目(如挖掘项目、报告项目),任务状态的变更会同步更新项目的状态。
+
+```mermaid
+erDiagram
+PROJECT ||--o{ TASK : "包含"
+TASK ||--o{ TASK_HANDLE_RESULT : "产生"
+PROJECT ||--o{ REPORT_PROJECT : "报告项目"
+PROJECT ||--o{ PATENT_DIG_PROJECT : "专利挖掘项目"
+PROJECT {
+integer id PK
+string name
+integer type
+datetime createTime
+}
+TASK {
+integer id PK
+string name
+integer projectId FK
+integer status
+integer handlerType
+string handler
+datetime deadLineTime
+datetime createTime
+}
+TASK_HANDLE_RESULT {
+integer id PK
+integer taskId FK
+string result
+datetime createTime
+}
+```
+
+**Diagram sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L685-L745)
+
+## 常见问题与最佳实践
+### 常见问题
+1. **状态流转异常**:当任务处于"审核中"状态时,不允许直接完成任务
+2. **任务创建失败**:缺少必填字段(项目ID、任务类型、任务名称)会导致创建失败
+3. **分配逻辑错误**:处理人必须是项目的可见人员
+
+### 数据一致性与事务管理
+系统通过以下机制确保数据一致性:
+- 使用`@Transactional`注解保证数据库操作的原子性
+- 在状态变更时同步更新关联项目的状态
+- 通过`LambdaUpdateWrapper`构建安全的更新条件
+
+**Section sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L642-L778)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)

File diff suppressed because it is too large
+ 337 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务管理.md


File diff suppressed because it is too large
+ 233 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/任务管理/任务结果处理.md


+ 261 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/进度跟踪与监控.md

@@ -0,0 +1,261 @@
+# 进度跟踪与监控
+
+<cite>
+**本文档引用的文件**  
+- [ProjectMonitorSetController.java](file://src/main/java/cn/cslg/pas/controller/ProjectMonitorSetController.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java)
+- [ImportTaskConditionService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskConditionService.java)
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java)
+- [followUp.json](file://src/main/resources/jsons/followUp.json)
+</cite>
+
+## 目录
+1. [项目结构](#项目结构)
+2. [任务进度计算机制](#任务进度计算机制)
+3. [项目整体进度汇总](#项目整体进度汇总)
+4. [关键节点监控实现](#关键节点监控实现)
+5. [进度数据存储与更新策略](#进度数据存储与更新策略)
+6. [监控设置与告警机制](#监控设置与告警机制)
+7. [常见问题与优化建议](#常见问题与优化建议)
+
+## 项目结构
+
+PAS系统的进度跟踪与监控功能主要分布在以下几个核心模块中:
+
+```mermaid
+graph TD
+subgraph "控制层"
+ProjectMonitorSetController[ProjectMonitorSetController]
+ProjectTaskController[ProjectTaskController]
+end
+subgraph "服务层"
+PatentProjectService[PatentProjectService]
+ProjectTaskService[ProjectTaskService]
+TaskHandleResultService[TaskHandleResultService]
+ImportTaskConditionService[ImportTaskConditionService]
+end
+subgraph "数据层"
+ProjectTaskMapper[ProjectTaskMapper]
+PatentProjectMapper[PatentProjectMapper]
+end
+subgraph "数据传输对象"
+UpdateProjectTaskDTO[UpdateProjectTaskDTO]
+ProjectQuartzSetDTO[ProjectQuartzSetDTO]
+end
+ProjectMonitorSetController --> PatentProjectService
+ProjectTaskController --> ProjectTaskService
+ProjectTaskService --> TaskHandleResultService
+ProjectTaskService --> ProjectTaskMapper
+PatentProjectService --> PatentProjectMapper
+ImportTaskConditionService --> PatentProjectService
+```
+
+**图示来源**  
+- [ProjectMonitorSetController.java](file://src/main/java/cn/cslg/pas/controller/ProjectMonitorSetController.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+
+**本节来源**  
+- [ProjectMonitorSetController.java](file://src/main/java/cn/cslg/pas/controller/ProjectMonitorSetController.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+
+## 任务进度计算机制
+
+PAS系统中的任务进度计算主要通过任务状态管理来实现。系统定义了多种任务状态,包括处理中、审核中、已完成、已取消等。任务进度的计算基于任务状态的变更和完成情况。
+
+任务状态变更流程如下:
+
+```mermaid
+stateDiagram-v2
+[*] --> 待处理
+待处理 --> 处理中 : 任务分配
+处理中 --> 审核中 : 提交审核
+审核中 --> 已完成 : 审核通过
+审核中 --> 处理中 : 审核驳回
+处理中 --> 已完成 : 直接完成
+处理中 --> 已取消 : 取消任务
+已完成 --> [*]
+已取消 --> [*]
+```
+
+任务进度计算的核心逻辑在`ProjectTaskService`类中实现,通过`finishTask`方法处理任务的完成和取消操作。当任务完成时,系统会更新任务状态,并触发相关项目的进度更新。
+
+**图示来源**  
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java#L638-L665)
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java#L474-L494)
+
+**本节来源**  
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java)
+
+## 项目整体进度汇总
+
+项目整体进度的汇总通过项目状态的聚合计算实现。系统根据项目下所有任务的完成情况来计算项目整体进度。当项目中的所有任务都完成后,项目状态自动更新为"已完成"。
+
+项目进度汇总的实现机制如下:
+
+```mermaid
+flowchart TD
+Start([开始]) --> CheckTasks["检查项目下所有任务"]
+CheckTasks --> AllCompleted{"所有任务已完成?"}
+AllCompleted --> |是| UpdateProjectStatus["更新项目状态为已完成"]
+AllCompleted --> |否| CalculateProgress["计算完成率"]
+CalculateProgress --> UpdateProgress["更新项目进度百分比"]
+UpdateProjectStatus --> End([结束])
+UpdateProgress --> End
+```
+
+在`TaskHandleResultService`类中,当任务状态变更时,系统会检查项目类型并更新相应的项目状态。对于挖掘项目和报告项目,系统会分别更新`PatentDigProject`和`ReportProject`实体的状态。
+
+**图示来源**  
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java#L474-L494)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+
+**本节来源**  
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+
+## 关键节点监控实现
+
+PAS系统通过`ProjectMonitorSetController`实现关键节点的监控功能。系统支持设置周期性监控条件,当满足特定条件时触发告警。
+
+监控功能的核心实现如下:
+
+```mermaid
+sequenceDiagram
+participant 用户 as 用户
+participant 控制器 as ProjectMonitorSetController
+participant 服务层 as PatentProjectService
+participant 任务调度 as Quartz
+用户->>控制器 : 添加监控条件
+控制器->>服务层 : setProjectQuartz()
+服务层->>服务层 : 检查是否已有监控
+服务层->>服务层 : 添加或更新监控设置
+服务层->>任务调度 : 配置定时任务
+任务调度->>服务层 : 执行周期性检查
+服务层->>用户 : 发送告警通知
+```
+
+监控条件的设置通过`addQuartzCondition`接口实现,该接口接收`StringRequest`参数,包含监控的周期、更新频率等配置信息。
+
+**图示来源**  
+- [ProjectMonitorSetController.java](file://src/main/java/cn/cslg/pas/controller/ProjectMonitorSetController.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+- [ImportTaskConditionService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskConditionService.java)
+
+**本节来源**  
+- [ProjectMonitorSetController.java](file://src/main/java/cn/cslg/pas/controller/ProjectMonitorSetController.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+
+## 进度数据存储与更新策略
+
+PAS系统的进度数据存储采用关系型数据库与Elasticsearch结合的方式。核心进度数据存储在MySQL数据库中,同时在Elasticsearch中建立索引以支持快速查询和统计分析。
+
+### 数据存储结构
+
+```mermaid
+erDiagram
+PROJECT_TASK {
+integer id PK
+integer projectId FK
+string handler
+integer handlerType
+datetime deadLineTime
+datetime createTime
+datetime updateTime
+integer status
+string description
+}
+PATENT_PROJECT {
+integer projectId PK
+string crons
+boolean ifUpdate
+string updateCycle
+}
+PROJECT_TASK ||--o{ PATENT_PROJECT : "belongs to"
+```
+
+### 数据更新策略
+
+系统采用事件驱动的更新策略,当任务状态发生变化时,通过以下流程更新相关数据:
+
+1. 任务状态变更
+2. 更新任务记录
+3. 检查项目进度
+4. 更新项目状态
+5. 触发通知机制
+
+在`ImportTaskConditionService`类中,当添加或更新监控条件时,系统会同步更新`PatentProject`实体的`ifUpdate`和`updateCycle`字段,并配置相应的定时任务。
+
+**图示来源**  
+- [followUp.json](file://src/main/resources/jsons/followUp.json)
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+
+**本节来源**  
+- [followUp.json](file://src/main/resources/jsons/followUp.json)
+- [UpdateProjectTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/UpdateProjectTaskDTO.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)
+
+## 监控设置与告警机制
+
+PAS系统的监控设置通过`ProjectMonitorSetController`和`PatentProjectService`协同实现。用户可以通过API接口配置项目的监控周期和更新频率。
+
+### 监控配置流程
+
+```mermaid
+flowchart TD
+A[用户请求] --> B[ProjectMonitorSetController]
+B --> C[验证请求参数]
+C --> D[调用PatentProjectService]
+D --> E[检查现有监控设置]
+E --> F{已有监控?}
+F --> |是| G[更新监控设置]
+F --> |否| H[创建新监控设置]
+G --> I[配置定时任务]
+H --> I
+I --> J[返回结果]
+J --> K[用户]
+```
+
+告警机制通过邮件通知实现。当监控任务执行完成时,系统会调用`MailSendService`发送通知邮件给项目相关人员。邮件内容包含任务完成信息、项目状态更新等。
+
+在`ImportTaskConditionService`类中,`addQuartzCondition`方法负责处理监控条件的添加和更新,包括设置更新周期、配置定时任务等。
+
+**图示来源**  
+- [ProjectMonitorSetController.java](file://src/main/java/cn/cslg/pas/controller/ProjectMonitorSetController.java)
+- [ImportTaskConditionService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskConditionService.java)
+- [MailSendService.java](file://src/main/java/cn/cslg/pas/service/MailSendService.java)
+
+**本节来源**  
+- [ProjectMonitorSetController.java](file://src/main/java/cn/cslg/pas/controller/ProjectMonitorSetController.java)
+- [ImportTaskConditionService.java](file://src/main/java/cn/cslg/pas/service/business/ImportTaskConditionService.java)
+
+## 常见问题与优化建议
+
+### 常见问题
+
+1. **进度计算延迟**:由于系统采用异步更新机制,可能会出现进度计算延迟的情况。建议检查定时任务的执行频率和系统负载情况。
+
+2. **数据统计不准确**:当多个用户同时操作同一任务时,可能会出现数据统计不准确的问题。建议加强数据锁机制,确保数据一致性。
+
+3. **监控规则失效**:监控规则可能因系统异常或配置错误而失效。建议定期检查监控任务的执行日志和状态。
+
+### 实时性优化建议
+
+1. **增加缓存机制**:对于频繁查询的进度数据,可以引入Redis缓存,减少数据库查询压力。
+
+2. **优化定时任务**:根据业务需求调整监控任务的执行频率,避免过于频繁的检查影响系统性能。
+
+3. **异步处理**:将非关键的进度更新操作改为异步处理,提高系统响应速度。
+
+4. **批量更新**:对于大量任务的状态更新,采用批量处理方式,减少数据库事务开销。
+
+5. **索引优化**:在关键字段上建立适当的数据库索引,提高查询效率。
+
+**本节来源**  
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java)
+- [TaskHandleResultService.java](file://src/main/java/cn/cslg/pas/service/business/TaskHandleResultService.java)
+- [PatentProjectService.java](file://src/main/java/cn/cslg/pas/service/business/PatentProjectService.java)

File diff suppressed because it is too large
+ 348 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目与任务管理.md


+ 324 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目共享管理.md

@@ -0,0 +1,324 @@
+# 项目共享管理
+
+<cite>
+**本文档引用的文件**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java)
+- [AssoProjectPerson.java](file://src/main/java/cn/cslg/pas/domain/business/AssoProjectPerson.java)
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java)
+- [AddProjectPersonDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddProjectPersonDTO.java)
+- [QueryProjectPersonDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryProjectPersonDTO.java)
+- [ProjectPersonVO.java](file://src/main/java/cn/cslg/pas/common/vo/ProjectPersonVO.java)
+- [ProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectService.java)
+- [PermissionService.java](file://src/main/java/cn/cslg/pas/service/permissions/PermissionService.java)
+</cite>
+
+## 目录
+1. [项目共享管理](#项目共享管理)
+2. [核心组件](#核心组件)
+3. [架构概述](#架构概述)
+4. [详细组件分析](#详细组件分析)
+5. [依赖分析](#依赖分析)
+6. [性能考虑](#性能考虑)
+7. [故障排除指南](#故障排除指南)
+8. [结论](#结论)
+
+## 核心组件
+
+项目共享管理功能主要由`ProjectShareController`、`AssoProjectPersonService`和`AssoProjectPerson`三个核心组件构成。`ProjectShareController`提供REST API接口,`AssoProjectPersonService`处理业务逻辑,`AssoProjectPerson`作为实体类映射数据库表。
+
+**核心业务逻辑包括**:
+- 通过`addProjectShare`接口添加项目成员
+- 通过`removeProjectShare`接口移除项目成员
+- 查询项目分享记录和人员权限
+- 管理项目与人员的关联关系
+
+在添加项目成员时,系统会检查是否已存在相同的分享记录,避免重复添加。移除成员时支持批量操作,提高效率。
+
+**Section sources**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L36-L107)
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L39-L102)
+- [AssoProjectPerson.java](file://src/main/java/cn/cslg/pas/domain/business/AssoProjectPerson.java#L14-L48)
+
+## 架构概述
+
+项目共享管理采用典型的三层架构:控制层、服务层和数据访问层。控制层提供REST API接口,服务层处理业务逻辑和权限验证,数据访问层通过MyBatis Plus操作数据库。
+
+```mermaid
+graph TB
+subgraph "控制层"
+A[ProjectShareController]
+end
+subgraph "服务层"
+B[AssoProjectPersonService]
+C[PermissionService]
+D[ProjectService]
+end
+subgraph "数据访问层"
+E[AssoProjectPersonMapper]
+end
+subgraph "数据库"
+F[(asso_project_person)]
+end
+A --> B
+B --> C
+B --> D
+B --> E
+E --> F
+```
+
+**Diagram sources**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L39-L107)
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L39-L278)
+- [AssoProjectPersonMapper.java](file://src/main/java/cn/cslg/pas/mapper/AssoProjectPersonMapper.java#L13-L15)
+
+## 详细组件分析
+
+### AssoProjectPerson实体分析
+
+`AssoProjectPerson`实体类用于表示项目与人员的关联关系,映射数据库中的`asso_project_person`表。
+
+```mermaid
+classDiagram
+class AssoProjectPerson {
++Integer projectId
++String personId
++Integer role
++String createId
++DateTime createTime
++insert() void
+}
+class BaseEntity {
++Integer id
++String createId
++DateTime createTime
++String updateId
++DateTime updateTime
+}
+AssoProjectPerson --> BaseEntity : "继承"
+```
+
+**实体属性说明**:
+- **projectId**: 项目ID,关联到项目表
+- **personId**: 人员ID,关联到人员表
+- **role**: 人员角色,0-管理员,1-查看人员,2-禁止查看人员,3-分享人员
+- **createId**: 创建人ID
+- **createTime**: 创建时间
+
+该实体通过MyBatis Plus的`@TableName`注解映射到数据库表,并继承`BaseEntity`获得基础字段。
+
+**Diagram sources**
+- [AssoProjectPerson.java](file://src/main/java/cn/cslg/pas/domain/business/AssoProjectPerson.java#L14-L48)
+
+**Section sources**
+- [AssoProjectPerson.java](file://src/main/java/cn/cslg/pas/domain/business/AssoProjectPerson.java#L14-L48)
+
+### 项目共享API分析
+
+项目共享API提供了添加、移除和查询分享记录的功能,采用RESTful风格设计。
+
+#### API调用流程
+
+```mermaid
+sequenceDiagram
+participant Client as "客户端"
+participant Controller as "ProjectShareController"
+participant Service as "AssoProjectPersonService"
+participant Mapper as "AssoProjectPersonMapper"
+participant DB as "数据库"
+Client->>Controller : POST /addProjectShare
+Controller->>Service : addProjectShare(dto)
+Service->>Service : 验证参数
+Service->>Service : 检查重复记录
+Service->>Mapper : 插入记录
+Mapper->>DB : 执行INSERT
+DB-->>Mapper : 返回结果
+Mapper-->>Service : 返回结果
+Service-->>Controller : 返回ID列表
+Controller-->>Client : 返回响应
+Client->>Controller : POST /removeProjectShare
+Controller->>Service : removeProjectShare(ids)
+Service->>Mapper : 批量删除
+Mapper->>DB : 执行DELETE
+DB-->>Mapper : 返回结果
+Mapper-->>Service : 返回结果
+Service-->>Controller : 返回结果
+Controller-->>Client : 返回响应
+```
+
+**Diagram sources**
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L45-L75)
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L57-L102)
+
+#### API参数结构
+
+**AddProjectPersonDTO参数结构**:
+```mermaid
+classDiagram
+class AddProjectPersonDTO {
++List<String> personIds
++Integer projectId
+}
+```
+
+**QueryProjectPersonDTO参数结构**:
+```mermaid
+classDiagram
+class QueryProjectPersonDTO {
++Integer projectId
++String personName
++Long size
++Long current
+}
+```
+
+**返回结果结构**:
+```mermaid
+classDiagram
+class Records {
++Object data
++Long total
++Long current
++Long size
+}
+class Response {
++Integer code
++String message
++Object data
++success() Response
++error(String) Response
+}
+```
+
+**Diagram sources**
+- [AddProjectPersonDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddProjectPersonDTO.java#L7-L11)
+- [QueryProjectPersonDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryProjectPersonDTO.java#L6-L12)
+- [ProjectPersonVO.java](file://src/main/java/cn/cslg/pas/common/vo/ProjectPersonVO.java#L9-L34)
+
+**Section sources**
+- [AddProjectPersonDTO.java](file://src/main/java/cn/cslg/pas/common/dto/AddProjectPersonDTO.java#L7-L11)
+- [QueryProjectPersonDTO.java](file://src/main/java/cn/cslg/pas/common/dto/QueryProjectPersonDTO.java#L6-L12)
+
+### 权限验证机制分析
+
+项目共享过程中的权限验证机制确保只有授权用户才能进行操作。
+
+```mermaid
+flowchart TD
+Start([开始]) --> GetLoginUser["获取当前登录用户"]
+GetLoginUser --> CheckNull{"用户为空?"}
+CheckNull --> |是| ReturnError["返回未登录错误"]
+CheckNull --> |否| GetPersonnelVO["获取PersonnelVO"]
+GetPersonnelVO --> CheckRoleType["检查角色类型"]
+CheckRoleType --> IsAdmin{"是否为管理员?"}
+IsAdmin --> |是| AllowOperation["允许操作"]
+IsAdmin --> |否| CheckProjectOwner["检查是否为项目创建者或负责人"]
+CheckProjectOwner --> IsOwner{"是创建者或负责人?"}
+IsOwner --> |是| AllowOperation
+IsOwner --> |否| CheckSharedRole["检查是否具有分享权限"]
+CheckSharedRole --> HasShareRole{"具有分享权限?"}
+HasShareRole --> |是| AllowOperation
+HasShareRole --> |否| DenyOperation["拒绝操作"]
+AllowOperation --> End([结束])
+DenyOperation --> End
+ReturnError --> End
+```
+
+**Diagram sources**
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L57-L85)
+- [ProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectService.java#L59-L100)
+
+**Section sources**
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L57-L85)
+- [ProjectService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectService.java#L59-L100)
+
+## 依赖分析
+
+项目共享管理功能依赖于多个核心服务和组件,形成了完整的依赖链。
+
+```mermaid
+graph TD
+ProjectShareController --> AssoProjectPersonService
+ProjectShareController --> ProjectService
+AssoProjectPersonService --> PermissionService
+AssoProjectPersonService --> CacheUtils
+AssoProjectPersonService --> LoginUtils
+AssoProjectPersonService --> ProjectService
+AssoProjectPersonService --> AssoProjectPersonMapper
+AssoProjectPersonMapper --> MyBatisPlus
+AssoProjectPerson --> BaseEntity
+ProjectPersonVO --> AssoProjectPerson
+ProjectPersonVO --> Personnel
+style ProjectShareController fill:#f9f,stroke:#333
+style AssoProjectPersonService fill:#bbf,stroke:#333
+style AssoProjectPersonMapper fill:#f96,stroke:#333
+```
+
+**关键依赖说明**:
+- **PermissionService**: 用于获取人员信息和权限验证
+- **CacheUtils**: 用于缓存用户登录信息
+- **LoginUtils**: 用于获取当前登录用户ID
+- **ProjectService**: 用于查询项目信息和权限
+- **BaseEntity**: 提供基础字段和方法
+
+**Diagram sources**
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L41-L49)
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L40-L43)
+
+**Section sources**
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L41-L49)
+
+## 性能考虑
+
+项目共享管理在设计时考虑了多项性能优化措施:
+
+1. **批量操作**: 支持批量添加和移除项目成员,减少数据库交互次数
+2. **缓存机制**: 使用CacheUtils缓存用户信息,减少重复查询
+3. **分页查询**: 查询分享记录时支持分页,避免一次性加载大量数据
+4. **索引优化**: 数据库表应为projectId和personId字段建立索引,提高查询效率
+5. **事务管理**: 使用@Transactional注解确保数据一致性
+
+在高并发场景下,建议对频繁访问的项目成员列表进行缓存,进一步提升性能。
+
+## 故障排除指南
+
+### 常见问题及解决方案
+
+**问题1:重复添加成员**
+- **原因**: 系统未正确检查已存在的分享记录
+- **解决方案**: 在添加前查询数据库,确保不重复添加
+
+**问题2:无法移除项目负责人**
+- **原因**: 权限验证逻辑未区分普通成员和负责人
+- **解决方案**: 在移除前检查用户角色,确保负责人不能被随意移除
+
+**问题3:权限同步延迟**
+- **原因**: 缓存未及时更新
+- **解决方案**: 在添加或移除成员后,清除相关缓存
+
+**问题4:查询性能低下**
+- **原因**: 缺少必要的数据库索引
+- **解决方案**: 为projectId和personId字段创建复合索引
+
+### 最佳实践建议
+
+1. **输入验证**: 在接口层进行严格的参数验证
+2. **异常处理**: 统一异常处理机制,返回友好的错误信息
+3. **日志记录**: 记录关键操作日志,便于问题追踪
+4. **事务管理**: 确保数据操作的原子性
+5. **安全防护**: 验证操作者权限,防止越权操作
+
+**Section sources**
+- [AssoProjectPersonService.java](file://src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java#L57-L102)
+- [ProjectShareController.java](file://src/main/java/cn/cslg/pas/controller/ProjectShareController.java#L45-L75)
+
+## 结论
+
+项目共享管理功能通过`ProjectShareController`、`AssoProjectPersonService`和`AssoProjectPerson`三个核心组件实现了项目成员的添加、移除和查询功能。系统采用三层架构设计,具有良好的可维护性和扩展性。
+
+关键特性包括:
+- 完整的CRUD操作支持
+- 严格的权限验证机制
+- 高效的批量处理能力
+- 友好的API设计
+
+通过合理的依赖管理和性能优化,系统能够稳定高效地处理项目共享管理需求。建议在实际使用中遵循最佳实践,确保系统的安全性和可靠性。

File diff suppressed because it is too large
+ 196 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目创建与配置.md


+ 200 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目导入与导出.md

@@ -0,0 +1,200 @@
+# 项目导入与导出
+
+<cite>
+**本文档引用的文件**
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java)
+- [ProjectExportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectExportController.java)
+- [ProjectImportService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ProjectImportService.java)
+- [ProjectExportService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectExportService.java)
+- [ExcelImportDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExcelImportDTO.java)
+- [ExportTaskDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExportTaskDTO.java)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java)
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java)
+</cite>
+
+## 目录
+1. [项目导入与导出](#项目导入与导出)
+2. [项目导入功能](#项目导入功能)
+3. [项目导出功能](#项目导出功能)
+4. [API接口规范](#api接口规范)
+5. [服务层接口调用](#服务层接口调用)
+6. [性能瓶颈与内存管理](#性能瓶颈与内存管理)
+7. [常见问题与优化方案](#常见问题与优化方案)
+
+## 项目导入功能
+
+PAS系统中的项目导入功能主要通过`ProjectImportController`和`ProjectImportService`实现,支持从Excel文件批量导入专利数据到指定项目。导入流程包括文件上传、数据验证、任务创建和异步处理等步骤。
+
+导入功能的核心是`addExcelImportTask`方法,该方法接收上传的Excel文件和`ExcelImportDTO`参数对象,执行完整的导入流程。系统首先验证文件格式的合法性,检查是否为.xls或.xlsx文件,并验证文件内容是否符合要求(必须包含"公开(公告)号"和"申请号"等关键字段)。
+
+在数据处理方面,系统使用Apache POI库解析Excel文件,通过`ReadExcelUtils`工具类读取文件内容。导入过程中,系统会创建临时文件来存储上传的Excel,并在处理完成后自动删除。数据验证通过后,系统会将导入任务信息保存到数据库的导入任务表和导入任务条件表中。
+
+导入任务采用异步处理机制,通过`patentQueueService`将任务添加到生产者任务队列中,并唤醒生产者线程进行后续处理。这种设计避免了长时间的同步操作,提高了系统的响应性能。
+
+**Section sources**
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java#L1-L43)
+- [ProjectImportService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ProjectImportService.java#L1-L82)
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java#L1-L345)
+
+## 项目导出功能
+
+PAS系统的项目导出功能由`ProjectExportController`和`ProjectExportService`协同实现,支持将项目数据导出为ZIP压缩文件。导出功能包括数据查询、文件生成和压缩打包等环节。
+
+`ProjectExportService`的`exportProject`方法是导出功能的核心,它首先生成唯一的目录名称和文件名,然后创建临时目录用于存储导出的数据。系统使用`FileUtils`工具类获取临时路径和目标URL,确保文件路径的正确性。
+
+导出过程中,系统会查询指定项目的专利数据,将数据转换为JSON格式并保存到临时文件中。完成所有数据的写入后,系统使用`ZipUtil`工具类将整个目录压缩为ZIP文件,最后删除临时目录以释放存储空间。
+
+对于大数据量的导出场景,系统采用了流式处理方式,通过`ByteArrayOutputStream`将数据写入内存流,避免了大文件直接操作可能引发的内存溢出问题。同时,系统实现了异常处理机制,当创建文件夹失败时会抛出明确的异常信息。
+
+**Section sources**
+- [ProjectExportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectExportController.java#L1-L46)
+- [ProjectExportService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectExportService.java#L1-L85)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java#L1-L184)
+
+## API接口规范
+
+### 项目导入API
+
+`ProjectImportController`提供了项目导入的RESTful API接口,主要包含以下端点:
+
+- `POST /api/xiaoshi/import/excelImport`:Excel导入专利任务
+  - 请求参数:MultipartFile file(Excel文件),ExcelImportDTO excelImportDTO
+  - 返回结果:Response对象,包含操作结果信息
+  - 功能描述:接收上传的Excel文件,启动专利数据导入流程
+
+- `POST /api/xiaoshi/import/patentStarImport`:检索导入专利任务
+  - 请求参数:ExcelImportDTO excelImportDTO
+  - 返回结果:Response对象
+  - 功能描述:根据检索条件导入专利数据
+
+### 项目导出API
+
+`ProjectExportController`提供了项目导出的RESTful API接口:
+
+- `POST /api/xiaoshi/projectExport/exportProject`:导出文件
+  - 请求参数:@RequestBody AsInvalidReasonHistoryDTO asInvalidReasonHistoryDTO
+  - 返回结果:Response对象,包含导出结果信息
+  - 功能描述:执行项目数据导出操作,生成ZIP压缩文件
+
+API接口使用Swagger注解(@Operation)提供详细的接口文档,便于开发者理解和使用。控制器类通过`@RequestMapping`注解定义基础路径,所有接口均使用`@PostMapping`注解处理POST请求。
+
+**Section sources**
+- [ProjectImportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectImportController.java#L1-L43)
+- [ProjectExportController.java](file://src/main/java/cn/cslg/pas/controller/ProjectExportController.java#L1-L46)
+- [ExcelImportDTO.java](file://src/main/java/cn/cslg/pas/common/dto/ExcelImportDTO.java#L1-L82)
+
+## 服务层接口调用
+
+### 项目导入服务调用
+
+项目导入服务的核心是`ProjectImportService`类,其`addExcelImportTask`方法实现了完整的导入流程:
+
+```mermaid
+flowchart TD
+Start([开始导入]) --> ValidateFile["验证文件格式"]
+ValidateFile --> CreateTemp["创建临时文件"]
+CreateTemp --> ReadExcel["读取Excel数据"]
+ReadExcel --> ValidateContent["验证数据内容"]
+ValidateContent --> SaveCondition["保存导入任务条件"]
+SaveCondition --> SaveTask["保存导入任务"]
+SaveTask --> AddToQueue["添加任务到队列"]
+AddToQueue --> AwakeThread["唤醒处理线程"]
+AwakeThread --> End([导入任务创建完成])
+```
+
+**Diagram sources**
+- [ProjectImportService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ProjectImportService.java#L30-L79)
+
+### 项目导出服务调用
+
+项目导出服务由`ProjectExportService`类实现,其`exportProject`方法的调用流程如下:
+
+```mermaid
+flowchart TD
+Start([开始导出]) --> GenerateName["生成唯一文件名"]
+GenerateName --> CreateDir["创建临时目录"]
+CreateDir --> QueryData["查询项目专利数据"]
+QueryData --> SaveJson["保存数据为JSON文件"]
+SaveJson --> ZipFiles["压缩文件为ZIP"]
+ZipFiles --> DeleteTemp["删除临时目录"]
+DeleteTemp --> End([导出完成])
+```
+
+**Diagram sources**
+- [ProjectExportService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectExportService.java#L34-L52)
+
+## 性能瓶颈与内存管理
+
+### 大数据量处理
+
+在处理大量专利数据的导入导出时,系统可能面临以下性能瓶颈:
+
+1. **内存占用过高**:当导入或导出数万条专利数据时,一次性加载所有数据到内存可能导致OutOfMemoryError。
+2. **文件IO性能**:大量文件读写操作可能导致磁盘IO瓶颈,影响整体处理速度。
+3. **数据库连接压力**:频繁的数据库查询和更新操作可能造成数据库连接池耗尽。
+
+### 内存管理策略
+
+系统采用了多种内存管理策略来应对大数据量处理:
+
+1. **分批处理**:对于大规模数据操作,系统采用分页查询和分批处理的方式,避免一次性加载过多数据。
+2. **流式处理**:在文件导出时使用`ByteArrayOutputStream`等流式处理技术,减少内存占用。
+3. **临时文件管理**:合理使用临时文件存储中间数据,并在处理完成后及时清理,避免磁盘空间耗尽。
+4. **异步处理**:导入任务采用异步队列机制,避免长时间操作阻塞主线程。
+
+```mermaid
+flowchart TD
+subgraph "内存管理策略"
+BatchProcessing["分批处理"]
+Streaming["流式处理"]
+TempFile["临时文件管理"]
+Async["异步处理"]
+end
+PerformanceIssue["性能瓶颈"] --> MemoryHigh["内存占用过高"]
+PerformanceIssue --> IOHigh["IO性能瓶颈"]
+PerformanceIssue --> DBHigh["数据库压力"]
+MemoryHigh --> BatchProcessing
+MemoryHigh --> Streaming
+IOHigh --> TempFile
+DBHigh --> Async
+```
+
+**Diagram sources**
+- [PatentExportService.java](file://src/main/java/cn/cslg/pas/service/business/PatentExportService.java#L108-L111)
+- [ProjectImportService.java](file://src/main/java/cn/cslg/pas/service/importPatent/ProjectImportService.java#L76-L79)
+
+## 常见问题与优化方案
+
+### 文件格式不兼容
+
+**问题描述**:用户上传非Excel格式的文件,或Excel版本不兼容。
+
+**解决方案**:
+1. 在前端增加文件类型验证,限制只能上传.xls和.xlsx文件
+2. 在后端使用Apache POI库的兼容模式处理不同版本的Excel文件
+3. 提供清晰的错误提示信息,指导用户正确准备文件
+
+### 数据映射错误
+
+**问题描述**:Excel文件中的列名与系统预期不符,导致数据映射错误。
+
+**解决方案**:
+1. 严格验证Excel文件的第一行抬头,确保包含"公开(公告)号"和"申请号"等必要字段
+2. 提供标准模板文件供用户下载使用
+3. 实现灵活的列名映射机制,支持同义词匹配
+
+### 导出文件过大
+
+**问题描述**:导出包含大量专利数据的文件时,文件体积过大,影响传输和打开速度。
+
+**优化方案**:
+1. 实现分卷压缩功能,将大文件分割为多个较小的压缩包
+2. 提供数据筛选功能,允许用户选择导出特定范围的数据
+3. 优化数据存储格式,使用更高效的序列化方式
+4. 实现断点续传功能,支持大文件的分段下载
+
+**Section sources**
+- [ReadExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java#L32-L121)
+- [ExcelUtils.java](file://src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java#L23-L63)
+- [ProjectExportService.java](file://src/main/java/cn/cslg/pas/service/business/ProjectExportService.java#L34-L52)

+ 239 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目监控设置.md

@@ -0,0 +1,239 @@
+# 项目监控设置
+
+<cite>
+**本文档引用的文件**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java)
+- [PatentStatusMonitor.java](file://src/main/java/cn/cslg/pas/domain/project/PatentStatusMonitor.java)
+- [PatentStatusMonitorAddDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorAddDTO.java)
+- [PatentStatusMonitorQueryDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorQueryDTO.java)
+- [PatentStatusMonitorUpdateDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorUpdateDTO.java)
+- [PatentStatusMonitorDeleteDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorDeleteDTO.java)
+- [SysImportPatentStatusJobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/SysImportPatentStatusJobService.java)
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java)
+- [Cycle.java](file://src/main/java/cn/cslg/pas/common/core/base/Cycle.java)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java)
+</cite>
+
+## 目录
+1. [项目监控设置](#项目监控设置)
+2. [核心组件](#核心组件)
+3. [监控任务的创建](#监控任务的创建)
+4. [监控任务的查询](#监控任务的查询)
+5. [监控任务的更新与删除](#监控任务的更新与删除)
+6. [监控条件配置](#监控条件配置)
+7. [API接口文档](#api接口文档)
+8. [后台运行机制](#后台运行机制)
+9. [常见问题与运维建议](#常见问题与运维建议)
+
+## 核心组件
+
+项目监控设置功能的核心组件包括`PatentStatusMonitorController`、`PatentStatusMonitorService`、`PatentStatusMonitor`实体类以及相关的DTO数据传输对象。这些组件共同实现了专利状态监控任务的全生命周期管理,包括创建、查询、更新和删除操作。
+
+**本节来源**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L1-L58)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java#L1-L220)
+- [PatentStatusMonitor.java](file://src/main/java/cn/cslg/pas/domain/project/PatentStatusMonitor.java#L1-L46)
+
+## 监控任务的创建
+
+创建专利状态监控任务是通过`PatentStatusMonitorController`的`add`方法实现的。该方法接收`PatentStatusMonitorAddDTO`对象作为请求参数,包含项目ID、监控条件、通知周期等信息。系统会根据输入的监控类型(专利号监控或检索式监控)进行不同的处理逻辑。
+
+当创建监控任务时,系统首先会验证输入参数的合法性,然后根据监控类型确定监控的专利列表。对于检索式监控,系统会执行专利检索并获取匹配的专利;对于专利号监控,则直接使用指定的专利号列表。监控任务的最大专利数量限制为50个。
+
+```mermaid
+sequenceDiagram
+participant 用户 as "用户"
+participant 控制器 as "PatentStatusMonitorController"
+participant 服务 as "PatentStatusMonitorService"
+participant 数据库 as "数据库"
+用户->>控制器 : 发送创建监控任务请求
+控制器->>服务 : 调用add方法
+服务->>服务 : 验证参数合法性
+服务->>服务 : 判断监控类型
+alt 检索式监控
+服务->>服务 : 执行专利检索
+服务->>服务 : 获取匹配专利列表
+else 专利号监控
+服务->>服务 : 使用指定专利号列表
+end
+服务->>服务 : 验证专利数量
+服务->>服务 : 保存监控任务
+服务->>数据库 : 插入patent_status_monitor表
+数据库-->>服务 : 返回插入结果
+服务-->>控制器 : 返回任务ID
+控制器-->>用户 : 返回成功响应
+```
+
+**本节来源**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L30-L37)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java#L43-L124)
+- [PatentStatusMonitorAddDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorAddDTO.java#L1-L26)
+
+## 监控任务的查询
+
+查询专利状态监控任务是通过`PatentStatusMonitorController`的`query`方法实现的。该方法接收`PatentStatusMonitorQueryDTO`对象作为请求参数,主要包含项目ID和状态过滤条件。系统会根据项目ID查询所有相关的监控任务,并可选择性地根据状态进行过滤。
+
+查询结果以`PatentStatusMonitorVO`对象列表的形式返回,包含了监控任务的详细信息,如监控条件、通知周期、目标SSS等。系统会自动将数据库中存储的字符串格式数据转换为相应的列表格式,便于前端展示。
+
+```mermaid
+sequenceDiagram
+participant 用户 as "用户"
+participant 控制器 as "PatentStatusMonitorController"
+participant 服务 as "PatentStatusMonitorService"
+participant 数据库 as "数据库"
+用户->>控制器 : 发送查询监控任务请求
+控制器->>服务 : 调用query方法
+服务->>数据库 : 查询patent_status_monitor表
+数据库-->>服务 : 返回监控任务列表
+服务->>服务 : 转换数据格式
+服务->>服务 : 加载公共VO信息
+服务-->>控制器 : 返回VO列表
+控制器-->>用户 : 返回查询结果
+```
+
+**本节来源**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L39-L43)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java#L127-L169)
+- [PatentStatusMonitorQueryDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorQueryDTO.java#L1-L14)
+- [PatentStatusMonitorVO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorVO.java#L1-L29)
+
+## 监控任务的更新与删除
+
+监控任务的更新和删除操作分别通过`PatentStatusMonitorController`的`update`和`delete`方法实现。更新操作允许修改监控任务的目标SSS和通知周期,而删除操作则用于移除不再需要的监控任务。
+
+更新操作会验证新的通知周期是否合法,并更新数据库中的相应字段。删除操作会根据提供的任务ID列表批量删除监控任务,确保数据的一致性。
+
+```mermaid
+flowchart TD
+Start([开始]) --> Update["更新监控任务"]
+Update --> Validate["验证通知周期"]
+Validate --> |合法| UpdateDB["更新数据库记录"]
+Validate --> |非法| ThrowError["抛出异常"]
+UpdateDB --> End1([结束])
+ThrowError --> End1
+Start --> Delete["删除监控任务"]
+Delete --> Remove["批量删除记录"]
+Remove --> End2([结束])
+```
+
+**本节来源**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L45-L56)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java#L173-L194)
+- [PatentStatusMonitorUpdateDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorUpdateDTO.java#L1-L15)
+- [PatentStatusMonitorDeleteDTO.java](file://src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorDeleteDTO.java#L1-L13)
+
+## 监控条件配置
+
+监控条件的配置主要涉及监控类型、专利范围、通知周期和目标SSS等参数。系统支持两种监控类型:专利号监控和检索式监控。专利号监控适用于已知具体专利号的场景,而检索式监控则适用于通过检索条件动态获取专利列表的场景。
+
+通知周期支持年、季度、月、周和日五种选项,由`Cycle`类定义。目标SSS用于指定需要监控的具体法律状态变更,如授权、无效、转让等。系统会对输入的监控条件进行严格的业务校验,确保监控任务的有效性。
+
+```mermaid
+classDiagram
+class PatentStatusMonitor {
++Integer projectId
++String searchQuery
++Long startNumber
++Long endNumber
++String isDelete
++String isAdd
++String notifyCycle
++String targetSss
++String createId
++Date createTime
++Integer status
++String patentList
++Integer type
+}
+class Cycle {
++String YEAR
++String QUARTER
++String MONTH
++String WEEK
++String DAY
+}
+PatentStatusMonitor --> Cycle : "使用"
+```
+
+**本节来源**
+- [PatentStatusMonitor.java](file://src/main/java/cn/cslg/pas/domain/project/PatentStatusMonitor.java#L1-L46)
+- [Cycle.java](file://src/main/java/cn/cslg/pas/common/core/base/Cycle.java#L1-L10)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java#L197-L205)
+
+## API接口文档
+
+项目监控设置功能提供了完整的RESTful API接口,支持监控任务的增删改查操作。所有接口均通过`PatentStatusMonitorController`类实现,位于`/api/xiaoshi/patentStatusMonitor`路径下。
+
+### API接口列表
+
+| 接口路径 | HTTP方法 | 功能描述 | 请求参数 | 响应类型 |
+|---------|--------|--------|--------|--------|
+| /add | POST | 添加专利状态监控任务 | PatentStatusMonitorAddDTO | Response<Integer> |
+| /query | POST | 查询专利状态监控任务 | PatentStatusMonitorQueryDTO | Response<List<PatentStatusMonitorVO>> |
+| /update | POST | 更新专利状态监控任务 | PatentStatusMonitorUpdateDTO | Response<Integer> |
+| /delete | POST | 删除专利状态监控任务 | PatentStatusMonitorDeleteDTO | Response<List<Integer>> |
+
+### 业务校验规则
+
+1. **专利数量限制**:单个监控任务的专利数量不得超过50个
+2. **通知周期校验**:通知周期必须为年、季度、月、周或日之一
+3. **参数完整性**:创建监控任务时必须提供项目ID和至少一种监控条件
+4. **权限校验**:用户必须具有操作对应项目的权限
+
+**本节来源**
+- [PatentStatusMonitorController.java](file://src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java#L1-L58)
+- [Constants.java](file://src/main/java/cn/cslg/pas/common/core/base/Constants.java#L46-L47)
+
+## 后台运行机制
+
+监控服务的后台运行机制基于Quartz定时任务框架实现。`SysImportPatentStatusJobService`类作为Quartz作业,定期执行专利状态监控任务。系统会获取所有处于运行状态的监控任务,并逐一检查其监控的专利状态是否发生变化。
+
+定时任务的调度由`JobService`类管理,支持任务的添加、更新、暂停和删除操作。系统会根据当前日期判断是否满足月度、季度或年度监控的条件,并相应地执行监控任务。当检测到专利状态变更时,系统会通过邮件等方式通知相关用户。
+
+```mermaid
+sequenceDiagram
+participant 调度器 as "Quartz调度器"
+participant 作业服务 as "SysImportPatentStatusJobService"
+participant 监控服务 as "PatentStatusMonitorService"
+participant 邮件服务 as "MailSendService"
+调度器->>作业服务 : 触发定时任务
+作业服务->>邮件服务 : 发送开始通知
+作业服务->>监控服务 : 获取所有运行中的监控任务
+监控服务-->>作业服务 : 返回任务列表
+loop 遍历每个监控任务
+作业服务->>作业服务 : 检查专利状态
+作业服务->>作业服务 : 对比历史状态
+alt 状态发生变化
+作业服务->>邮件服务 : 发送变更通知
+end
+end
+作业服务->>邮件服务 : 发送完成通知
+```
+
+**本节来源**
+- [SysImportPatentStatusJobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/SysImportPatentStatusJobService.java#L1-L115)
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L1-L137)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java#L209-L214)
+
+## 常见问题与运维建议
+
+### 常见问题
+
+1. **监控条件配置错误**:确保监控条件符合系统要求,特别是检索式监控的语法正确性
+2. **通知延迟**:检查邮件服务配置和网络连接,确保通知能够及时发送
+3. **监控任务重复创建**:在创建监控任务前先查询是否存在相同条件的任务
+4. **专利数量超限**:当监控专利数量超过50个时,考虑拆分监控任务或优化检索条件
+
+### 运维建议
+
+1. **定期检查**:定期审查监控任务的执行情况和通知记录
+2. **性能监控**:监控定时任务的执行时间和资源消耗,避免影响系统性能
+3. **日志分析**:分析系统日志,及时发现和解决潜在问题
+4. **备份策略**:定期备份监控任务配置和历史数据,防止数据丢失
+5. **权限管理**:严格控制监控任务的创建和修改权限,确保数据安全
+
+**本节来源**
+- [SysImportPatentStatusJobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/SysImportPatentStatusJobService.java#L45-L48)
+- [PatentStatusMonitorService.java](file://src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java#L90-L92)
+- [JobService.java](file://src/main/java/cn/cslg/pas/service/quartzService/JobService.java#L24-L30)

File diff suppressed because it is too large
+ 307 - 0
.qoder/repowiki/zh/content/业务逻辑层/项目与任务管理/项目管理/项目管理.md


File diff suppressed because it is too large
+ 299 - 0
.qoder/repowiki/zh/content/外部集成/Dify AI集成.md


File diff suppressed because it is too large
+ 343 - 0
.qoder/repowiki/zh/content/外部集成/PatentStar集成.md


+ 194 - 0
.qoder/repowiki/zh/content/外部集成/Python服务集成.md

@@ -0,0 +1,194 @@
+# Python服务集成
+
+<cite>
+**本文档引用的文件**  
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+- [GetPatentSimilarScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreDTO.java)
+- [GetPatentSimilarScoreVO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreVO.java)
+- [PatentScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/PatentScoreDTO.java)
+- [PatentScoreVO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/PatentScoreVO.java)
+- [RedisConf.java](file://src/main/java/cn/cslg/pas/common/core/base/RedisConf.java)
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java)
+- [application.yml](file://src/main/resources/application.yml)
+- [application-dev.yml](file://src/main/resources/application-dev.yml)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概述](#架构概述)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考量](#性能考量)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+本文档详细介绍了PAS系统与Python服务的集成机制,重点阐述了如何通过HTTP调用外部Python服务执行专利相似度评分、技术领域分类等复杂专利分析任务。文档涵盖了请求和响应的数据结构、异步任务处理、缓存策略、错误处理机制以及系统配置等关键方面。
+
+## 项目结构
+PAS系统的项目结构清晰地划分了不同功能模块。Python服务集成相关的核心代码位于`src/main/java/cn/cslg/pas/service/common/PythonApiService.java`,而相关的数据传输对象(DTO)则位于`src/main/java/cn/cslg/pas/common/model/pythonModel/`目录下。配置文件如`application.yml`和`application-dev.yml`定义了Python服务的API端点和其他运行时参数。
+
+**Section sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+- [GetPatentSimilarScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreDTO.java)
+- [application.yml](file://src/main/resources/application.yml)
+
+## 核心组件
+PAS系统与Python服务集成的核心组件是`PythonApiService`类,它负责通过HTTP协议与外部Python服务进行通信。该服务主要执行专利相似度评分等复杂分析任务,并利用Redis进行结果缓存以提高性能。
+
+**Section sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+
+## 架构概述
+PAS系统通过`PythonApiService`作为中介,与外部Python服务建立HTTP连接,实现复杂专利分析功能。系统采用请求-响应模式,将专利数据发送至Python服务进行处理,并接收分析结果。整个过程通过Redis缓存机制优化性能,避免重复计算。
+
+```mermaid
+graph TB
+subgraph "PAS系统"
+A[PythonApiService]
+B[Redis缓存]
+end
+subgraph "外部服务"
+C[Python服务]
+end
+A --> |HTTP POST| C
+C --> |返回结果| A
+A --> B
+B --> A
+```
+
+**Diagram sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java)
+
+## 详细组件分析
+
+### PythonApiService分析
+`PythonApiService`是PAS系统与Python服务集成的核心服务类,负责发起HTTP请求并处理响应。
+
+#### 服务类分析
+```mermaid
+classDiagram
+class PythonApiService {
++String PythonUrl
++RedisUtil redisUtil
++PatentStarApiService patentStarApiService
++WebVOTransformService webVOTransformService
++TechnicalCaseService technicalCaseService
++GetPatentSimilarScoreVO getPatentSimilarScore(GetPatentSimilarScoreDTO)
++GetPatentSimilarScoreVO getPatentSimilarMess(GetPatentSimilarScoreDTO)
++List<PatentScoreVO> getPatentScore(List<PatentScoreDTO>, String)
++List<PatentScoreDTO> formatPatentScoreVO(List<PatentScoreDTO>)
++List<Double> getStrVector(GetVectorVO)
+}
+PythonApiService --> RedisUtil : "使用"
+PythonApiService --> PatentStarApiService : "使用"
+PythonApiService --> WebVOTransformService : "使用"
+PythonApiService --> TechnicalCaseService : "使用"
+```
+
+**Diagram sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+
+#### 专利相似度评分流程
+```mermaid
+sequenceDiagram
+participant PAS as PAS系统
+participant Python as Python服务
+participant Redis as Redis缓存
+PAS->>PAS : 准备GetPatentSimilarScoreDTO
+PAS->>Redis : 检查缓存
+alt 缓存命中
+Redis-->>PAS : 返回缓存结果
+else 缓存未命中
+PAS->>Python : 发送HTTP POST请求
+Python-->>PAS : 返回分析结果
+PAS->>Redis : 存储结果到缓存
+end
+PAS-->>用户 : 返回最终结果
+```
+
+**Diagram sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java)
+
+#### 数据模型分析
+```mermaid
+classDiagram
+class GetPatentSimilarScoreDTO {
++String text
++Integer projectId
++List<PatentScoreDTO> patentScoreDTOList
+}
+class GetPatentSimilarScoreVO {
++String text
++List<PatentScoreVO> patentScoreDTOList
+}
+class PatentScoreDTO {
++String patentNo
++String appNo
++String rowApplicationNo
++String abstractStr
++String publicNo
++String grantNo
+}
+class PatentScoreVO {
++String patentNo
++String appNo
++String abstractStr
++Float score
+}
+GetPatentSimilarScoreDTO --> PatentScoreDTO : "包含"
+GetPatentSimilarScoreVO --> PatentScoreVO : "包含"
+```
+
+**Diagram sources**
+- [GetPatentSimilarScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreDTO.java)
+- [GetPatentSimilarScoreVO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreVO.java)
+- [PatentScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/PatentScoreDTO.java)
+- [PatentScoreVO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/PatentScoreVO.java)
+
+**Section sources**
+- [GetPatentSimilarScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreDTO.java)
+- [GetPatentSimilarScoreVO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/GetPatentSimilarScoreVO.java)
+- [PatentScoreDTO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/PatentScoreDTO.java)
+- [PatentScoreVO.java](file://src/main/java/cn/cslg/pas/common/model/pythonModel/PatentScoreVO.java)
+
+## 依赖分析
+PAS系统与Python服务的集成依赖于多个关键组件,包括HTTP客户端、JSON处理库和Redis缓存系统。
+
+```mermaid
+graph TD
+A[PythonApiService] --> B[OkHttpClient]
+A --> C[Gson]
+A --> D[JSONObject]
+A --> E[RedisUtil]
+A --> F[PatentStarApiService]
+A --> G[WebVOTransformService]
+A --> H[TechnicalCaseService]
+```
+
+**Diagram sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+
+**Section sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+
+## 性能考量
+系统通过多种机制优化性能,包括结果缓存、批量处理和异步调用。Redis被用作缓存层,存储已计算的专利相似度评分,避免重复调用Python服务。同时,系统支持批量处理多个专利的相似度计算,提高整体效率。
+
+## 故障排除指南
+当Python服务集成出现问题时,应首先检查以下方面:
+1. 确认Python服务是否正常运行
+2. 检查网络连接是否畅通
+3. 验证API端点配置是否正确
+4. 检查请求数据格式是否符合要求
+5. 查看系统日志获取详细错误信息
+
+**Section sources**
+- [PythonApiService.java](file://src/main/java/cn/cslg/pas/service/common/PythonApiService.java)
+
+## 结论
+PAS系统通过`PythonApiService`实现了与外部Python服务的高效集成,能够执行复杂的专利分析任务。系统采用HTTP协议进行通信,利用Redis缓存优化性能,并通过清晰的数据模型确保数据交换的准确性。这种架构设计既保证了功能的灵活性,又确保了系统的稳定性和可维护性。

File diff suppressed because it is too large
+ 74 - 0
.qoder/repowiki/zh/content/外部集成/外部集成.md


+ 107 - 0
.qoder/repowiki/zh/content/快速入门.md

@@ -0,0 +1,107 @@
+# 快速入门
+
+<cite>
+**本文档中引用的文件**  
+- [pom.xml](file://pom.xml)
+- [docker-compose.yaml](file://docker/docker-compose.yaml)
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java)
+- [application.yml](file://src/main/resources/application.yml)
+- [application-docker.yml](file://src/main/resources/application-docker.yml)
+- [Dockerfile](file://docker/api/Dockerfile)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [先决条件](#先决条件)
+3. [克隆代码库并构建项目](#克隆代码库并构建项目)
+4. [使用Docker启动依赖服务](#使用docker启动依赖服务)
+5. [运行Spring Boot应用](#运行spring-boot应用)
+6. [验证安装](#验证安装)
+7. [故障排除](#故障排除)
+
+## 简介
+本指南旨在帮助新开发者快速搭建PAS(专利分析系统)的开发环境。我们将引导您完成从克隆代码库到验证系统正常运行的完整流程。该系统是一个基于Spring Boot的Java应用,使用MySQL作为数据库,Redis作为缓存,并通过Docker进行服务编排。
+
+## 先决条件
+在开始之前,请确保您的开发机器上已安装以下软件:
+
+- **JDK 8**:PAS项目基于Java 8开发。请确保`JAVA_HOME`环境变量已正确设置。
+- **Maven 3.x**:用于构建Java项目。您可以通过在终端运行`mvn -v`来验证安装。
+- **Docker**:用于容器化运行MySQL、Redis等依赖服务。请确保Docker服务正在运行。
+- **Git**:用于克隆代码仓库。
+
+## 克隆代码库并构建项目
+首先,您需要从代码仓库克隆PAS项目,并使用Maven进行构建。
+
+1.  打开您的终端或命令行工具。
+2.  执行以下命令来克隆项目:
+    ```bash
+    git clone <repository-url>
+    cd PAS
+    ```
+3.  项目根目录下的`pom.xml`文件定义了所有Java依赖。运行以下Maven命令来下载依赖并构建项目:
+    ```bash
+    mvn clean install
+    ```
+    此命令将清理旧的构建文件,编译源代码,运行测试,并将项目打包成一个可执行的JAR文件。成功执行后,您将在`target`目录下找到`pas-0.0.1-SNAPSHOT.jar`文件。
+
+**Section sources**
+- [pom.xml](file://pom.xml#L1-L371)
+
+## 使用Docker启动依赖服务
+PAS项目依赖于MySQL数据库和Redis缓存服务。项目提供了一个`docker-compose.yaml`文件来简化这些服务的部署。
+
+1.  确保您当前位于项目根目录(包含`docker`文件夹)。
+2.  执行以下命令来启动所有依赖服务:
+    ```bash
+    docker-compose -f docker/docker-compose.yaml up -d
+    ```
+    这个命令会根据`docker-compose.yaml`文件的定义,在后台(`-d`标志)启动MySQL、Redis、API和Web服务。
+3.  您可以通过运行`docker ps`来检查容器是否成功运行。您应该能看到名为`pas-mysql`、`pas-redis`、`pas-api`和`pas-web`的容器。
+4.  `docker-compose.yaml`文件还配置了MySQL的初始化脚本。位于`docker/mysql/init/pas.sql`的SQL文件会在MySQL容器首次启动时自动执行,创建数据库和表结构,并插入初始数据。
+
+**Section sources**
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [pas.sql](file://docker/mysql/init/pas.sql#L1-L800)
+
+## 运行Spring Boot应用
+在依赖服务启动后,您就可以运行PAS的Spring Boot应用了。
+
+1.  打开您的Java IDE(如IntelliJ IDEA或Eclipse),并将项目导入为Maven项目。
+2.  导航到`src/main/java/cn/cslg/pas/`目录。
+3.  找到`Application.java`文件,这是Spring Boot应用的入口点。
+4.  右键单击`Application.java`文件,并选择“Run 'Application.main()'”来启动应用。
+5.  应用启动时,会读取`application.yml`和`application-docker.yml`配置文件。`application-docker.yml`中的配置会覆盖主配置文件中的数据库和Redis连接信息,使其指向Docker容器中的服务(通过服务名`pas-mysql`和`pas-redis`)。
+6.  当您在控制台看到类似`后台程序已启动,请运行前台`的日志信息时,表示后端应用已成功启动。
+
+**Section sources**
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java#L1-L22)
+- [application.yml](file://src/main/resources/application.yml#L1-L49)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+
+## 验证安装
+为了验证您的开发环境是否搭建成功,您可以调用一个简单的API端点来检查系统状态。
+
+1.  PAS项目集成了`springdoc-openapi-ui`,它会自动生成一个交互式的API文档界面。在应用启动后,打开您的浏览器并访问:
+    ```
+    http://localhost:8879/swagger-ui.html
+    ```
+2.  您将看到一个包含所有API端点的页面。虽然项目中没有显式定义一个`/health`端点,但Spring Boot Actuator模块(在`pom.xml`中已引入)通常会提供此类功能。您也可以尝试直接访问:
+    ```
+    http://localhost:8879/actuator/health
+    ```
+    如果返回`{"status":"UP"}`,则表示应用健康状态正常。
+3.  另外,您也可以尝试调用一个业务API,例如通过`swagger-ui`界面调用`PatentController`中的`/queryPatent`端点。如果能成功返回数据,则证明整个系统(包括数据库连接)都已正常工作。
+
+**Section sources**
+- [pom.xml](file://pom.xml#L37-L41)
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java#L12)
+
+## 故障排除
+如果您在搭建过程中遇到问题,请参考以下建议:
+
+- **Maven构建失败**:检查您的网络连接,或尝试在`pom.xml`中配置的阿里云镜像源是否可用。
+- **Docker服务无法启动**:检查端口是否被占用(如MySQL的3307端口,Redis的6380端口)。您可以在`docker-compose.yaml`中修改端口映射。
+- **应用无法连接数据库**:确保`docker-compose.yaml`中的MySQL容器已成功运行,并且`application-docker.yml`中的数据库连接URL、用户名和密码与`docker-compose.yaml`中的配置相匹配。
+- **API调用失败**:检查Spring Boot应用的日志输出,通常会提供详细的错误信息。

+ 235 - 0
.qoder/repowiki/zh/content/技术栈与依赖.md

@@ -0,0 +1,235 @@
+# 技术栈与依赖
+
+<cite>
+**本文档引用的文件**  
+- [pom.xml](file://pom.xml)
+- [docker-compose.yaml](file://docker/docker-compose.yaml)
+- [application.yml](file://src/main/resources/application.yml)
+- [application-dev.yml](file://src/main/resources/application-dev.yml)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java)
+- [MybatisPlusConfig.java](file://src/main/java/cn/cslg/pas/common/config/MybatisPlusConfig.java)
+- [RabbitMQConfig.java](file://src/main/java/cn/cslg/pas/common/config/RabbitMQConfig.java)
+- [AsyncTaskPoolConfig.java](file://src/main/java/cn/cslg/pas/common/config/AsyncTaskPoolConfig.java)
+- [checkAuth.java](file://src/main/java/cn/cslg/pas/common/auth/checkAuth.java)
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java)
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java)
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java)
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java)
+</cite>
+
+## 目录
+1. [核心框架与版本](#核心框架与版本)
+2. [数据访问层:MyBatis-Plus](#数据访问层mybatis-plus)
+3. [全文检索引擎:Elasticsearch](#全文检索引擎elasticsearch)
+4. [缓存与会话管理:Redis](#缓存与会话管理redis)
+5. [异步任务处理:RabbitMQ](#异步任务处理rabbitmq)
+6. [认证授权机制:SaToken](#认证授权机制satoken)
+7. [外部依赖服务配置](#外部依赖服务配置)
+8. [依赖管理与版本兼容性](#依赖管理与版本兼容性)
+
+## 核心框架与版本
+
+PAS系统基于Spring Boot构建,采用现代化的Java技术栈。系统使用Spring Boot 3.1.3作为核心框架,为应用提供了自动配置、嵌入式服务器、健康检查等企业级功能。
+
+系统使用Java 8作为开发语言,同时在构建配置中也支持Java 17,体现了系统的向前兼容性。Spring Boot的版本在pom.xml文件中通过父POM明确指定,确保了依赖管理的一致性。
+
+**Section sources**
+- [pom.xml](file://pom.xml#L4-L8)
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java#L12)
+
+## 数据访问层MyBatis-Plus
+
+MyBatis-Plus作为MyBatis的增强工具,在PAS系统中扮演着数据访问层的核心角色。系统使用MyBatis-Plus 3.5.3.1版本,通过其提供的CRUD操作简化了数据库交互代码。
+
+在MybatisPlusConfig配置类中,系统配置了分页插件,为所有数据库查询提供了便捷的分页支持。配置指定了实体类的包路径(cn.cslg.pas.domain),并设置了全局的数据库配置,如主键生成策略为AUTO,逻辑删除值为0,非删除值为1。
+
+MyBatis-Plus的Mapper扫描通过@MapperScan注解配置,扫描路径为"cn.cslg.pas.mapper",确保所有数据访问接口都能被Spring容器管理。同时,系统配置了XML映射文件的位置为classpath:mapper/*.xml,实现了注解与XML配置的混合使用。
+
+**Section sources**
+- [pom.xml](file://pom.xml#L22)
+- [MybatisPlusConfig.java](file://src/main/java/cn/cslg/pas/common/config/MybatisPlusConfig.java)
+- [application.yml](file://src/main/resources/application.yml#L35-L47)
+
+## 全文检索引擎elasticsearch
+
+Elasticsearch在PAS系统中作为全文检索引擎,为专利数据的高效查询提供了强大支持。系统使用Elasticsearch 8.6.1客户端版本,通过官方Java客户端与Elasticsearch集群进行交互。
+
+ElasticSearchClientConfig类负责配置Elasticsearch客户端,使用RestClientTransport建立与Elasticsearch服务器的连接。配置中包含了服务器地址、认证信息(用户名和密码)以及SSL配置,确保了连接的安全性。系统通过@Value注解从配置文件中读取Elasticsearch的主机地址,实现了配置的外部化。
+
+系统定义了两个主要的Elasticsearch索引:`wxpatent`用于存储专利数据,`patent_vector`用于存储专利向量数据,支持相似性搜索。这些索引配置在application-dev.yml文件中明确指定。
+
+EsBuilderFactory是Elasticsearch查询构建器的工厂类,采用策略模式管理不同类型的查询构建器。通过Spring的依赖注入,工厂类自动注入所有实现了IQueryBuilder接口的Bean,并根据名称获取相应的查询构建器实例,实现了查询逻辑的解耦和可扩展性。
+
+```mermaid
+classDiagram
+class EsBuilderFactory {
++Map<String, IQueryBuilder> iQueryBuilderMap
++IQueryBuilder getClass(String builderName)
+}
+class IQueryBuilder {
+<<interface>>
++Object buildQuery()
+}
+class PatentQueryBuilder {
++Object buildQuery()
+}
+class VectorQueryBuilder {
++Object buildQuery()
+}
+EsBuilderFactory --> IQueryBuilder : "依赖"
+IQueryBuilder <|-- PatentQueryBuilder : "实现"
+IQueryBuilder <|-- VectorQueryBuilder : "实现"
+```
+
+**Diagram sources**
+- [EsBuilderFactory.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/EsBuilderFactory.java)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java)
+
+**Section sources**
+- [pom.xml](file://pom.xml#L32)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java)
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L75-L76)
+
+## 缓存与会话管理redis
+
+Redis在PAS系统中承担着双重角色:缓存用户会话和业务数据。系统通过spring-boot-starter-data-redis依赖集成Redis,使用StringRedisTemplate作为主要的Redis操作模板。
+
+RedisUtil工具类封装了Redis的所有操作,提供了对String、Hash、List、Set等数据结构的完整支持。工具类包含了key操作、字符串操作、哈希操作、列表操作和集合操作等方法,为业务代码提供了便捷的缓存操作接口。
+
+在application-dev.yml配置文件中,系统配置了Redis的连接信息,包括主机地址(192.168.2.24)、端口(6379)、数据库索引(3)和密码。同时配置了Lettuce连接池参数,如最大活跃连接数(20)、最大空闲连接数(20)等,确保了高并发场景下的连接性能。
+
+SaToken框架使用Redis作为会话存储后端,通过sa-token-dao-redis-jackson依赖实现会话的分布式存储。这使得系统在集群部署时能够保持用户会话的一致性。
+
+```mermaid
+classDiagram
+class RedisUtil {
+-StringRedisTemplate redisTemplate
++void delete(String key)
++Boolean hasKey(String key)
++Boolean expire(String key, long timeout, TimeUnit unit)
++String get(String key)
++void set(String key, String value)
++Long incrBy(String key, long increment)
++Object hGet(String key, String field)
++Long lLeftPush(String key, String value)
++Long sAdd(String key, String... values)
+}
+class StringRedisTemplate {
+<<Spring Data Redis>>
+}
+RedisUtil --> StringRedisTemplate : "使用"
+```
+
+**Diagram sources**
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java)
+- [pom.xml](file://pom.xml#L122)
+
+**Section sources**
+- [RedisUtil.java](file://src/main/java/cn/cslg/pas/common/utils/RedisUtil.java)
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L7-L19)
+
+## 异步任务处理rabbitmq
+
+RabbitMQ在PAS系统中用于处理异步任务,如专利导入、邮件发送等耗时操作。系统通过spring-boot-starter-amqp依赖集成RabbitMQ,使用RabbitTemplate进行消息的发送和确认。
+
+RabbitMQConfig配置类定义了消息队列、交换机和绑定关系。系统配置了一个名为emailProd.queue的队列(通过queueName属性注入),一个名为MAIL_EXCHANGE_NAME的直连交换机,以及相应的路由绑定。配置中还设置了消息确认回调和返回回调,确保了消息的可靠传递。
+
+RabbitMQUtils工具类封装了消息发送逻辑,提供了sendEmailMessage方法用于发送邮件消息。该方法将消息发送到指定的交换机和路由键,并附带相关数据。
+
+在application-dev.yml中,系统配置了RabbitMQ的连接信息,包括主机地址(192.168.2.24)、端口(5672)、用户名(admin)和密码(123456),确保了与RabbitMQ服务器的连接。
+
+```mermaid
+classDiagram
+class RabbitMQConfig {
+-String queueName
+-CachingConnectionFactory cachingConnectionFactory
++RabbitTemplate rabbitTemplate()
++Queue queue()
++DirectExchange directExchange()
++Binding binding()
+}
+class RabbitTemplate {
+<<Spring AMQP>>
++void convertAndSend(String exchange, String routingKey, Object message)
+}
+class RabbitMQUtils {
+-RabbitTemplate rabbitTemplate
+-String queueName
++void sendEmailMessage(Map<String, Object> map)
+}
+RabbitMQConfig --> RabbitTemplate : "创建"
+RabbitMQUtils --> RabbitTemplate : "使用"
+```
+
+**Diagram sources**
+- [RabbitMQConfig.java](file://src/main/java/cn/cslg/pas/common/config/RabbitMQConfig.java)
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java)
+
+**Section sources**
+- [pom.xml](file://pom.xml#L245)
+- [RabbitMQConfig.java](file://src/main/java/cn/cslg/pas/common/config/RabbitMQConfig.java)
+- [RabbitMQUtils.java](file://src/main/java/cn/cslg/pas/common/utils/RabbitMQUtils.java)
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L2-L6)
+
+## 认证授权机制satoken
+
+SaToken框架为PAS系统提供了完整的认证授权解决方案。系统使用SaToken 1.29.0版本,通过sa-token-spring-boot-starter依赖集成。
+
+SaTokenConfigure配置类(目前注释状态)展示了系统的认证路由配置思路:对API版本v2下的所有路径进行登录检查,但排除特定的公共路径(如WebSocket、测试接口等)。管理员接口则通过StpAdminUtil进行专门的登录检查。
+
+权限校验通过自定义注解@checkAuth实现。该注解定义在checkAuth.java文件中,用于标记需要进行数据权限校验的方法。注解包含FunId属性,默认值为"0",可用于标识不同的功能权限。
+
+SaToken与Redis集成,使用sa-token-dao-redis-jackson依赖将用户会话存储在Redis中,实现了分布式环境下的会话共享。
+
+**Section sources**
+- [pom.xml](file://pom.xml#L53-L59)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java)
+- [checkAuth.java](file://src/main/java/cn/cslg/pas/common/auth/checkAuth.java)
+
+## 外部依赖服务配置
+
+PAS系统依赖多个外部服务,这些服务在docker-compose.yaml文件中通过Docker容器化部署,确保了开发环境的一致性。
+
+### MySQL数据库
+- 容器名称:pas-mysql
+- 镜像:mysql:8
+- 端口映射:宿主机3307 → 容器3306
+- 环境变量:ROOT密码为cslg_docker_123456,数据库名为pas
+- 数据卷:挂载初始化SQL脚本和配置文件
+- 重启策略:始终重启
+
+### Redis缓存
+- 容器名称:pas-redis
+- 镜像:redis
+- 端口映射:宿主机6380 → 容器6379
+- 认证:设置密码为cslg_docker_123456
+- 重启策略:始终重启
+
+### Elasticsearch
+虽然Elasticsearch未在docker-compose.yaml中定义,但从配置文件可知其运行在192.168.2.24:9200,使用elastic用户和指定密码进行认证。
+
+### RabbitMQ
+同样未在docker-compose中定义,但配置显示其运行在192.168.2.24:5672,使用admin用户和123456密码。
+
+**Section sources**
+- [docker-compose.yaml](file://docker/docker-compose.yaml)
+- [application-dev.yml](file://src/main/resources/application-dev.yml)
+
+## 依赖管理与版本兼容性
+
+PAS系统使用Maven进行依赖管理,通过pom.xml文件集中管理所有第三方库的版本。系统采用了属性定义的方式(如${sa-token.version}),提高了版本管理的可维护性。
+
+关键依赖版本兼容性如下:
+- Spring Boot 3.1.3 与 Java 8/17 兼容
+- MyBatis-Plus 3.5.3.1 与 Spring Boot 3.x 兼容
+- Elasticsearch 8.6.1 客户端与 Elasticsearch 8.x 服务器兼容
+- SaToken 1.29.0 与 Spring Boot 3.x 兼容
+- RabbitMQ客户端与 RabbitMQ 3.14.9 服务器兼容
+
+建议开发者在升级依赖版本时,参考各框架的官方兼容性矩阵,避免版本冲突。同时,建议使用与生产环境一致的Docker镜像版本,确保开发、测试和生产环境的一致性。
+
+**Section sources**
+- [pom.xml](file://pom.xml)
+- [docker-compose.yaml](file://docker/docker-compose.yaml)

+ 355 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/Elasticsearch索引模型.md

@@ -0,0 +1,355 @@
+# Elasticsearch索引模型
+
+<cite>
+**本文引用的文件列表**
+- [patent.json](file://src/main/resources/jsons/patent.json)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+- [Text.java](file://src/main/java/cn/cslg/pas/domain/es/Text.java)
+- [PersonAddress.java](file://src/main/java/cn/cslg/pas/domain/es/PersonAddress.java)
+- [PatentClassify.java](file://src/main/java/cn/cslg/pas/domain/es/PatentClassify.java)
+- [PatentMergePerson.java](file://src/main/java/cn/cslg/pas/domain/es/PatentMergePerson.java)
+- [PatentJoin.java](file://src/main/java/cn/cslg/pas/domain/es/PatentJoin.java)
+- [EsConfigVO.java](file://src/main/java/cn/cslg/pas/common/vo/EsConfigVO.java)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java)
+- [EsPatentService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsPatentService.java)
+- [EsCustomFieldService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsCustomFieldService.java)
+- [TranslateService.java](file://src/main/java/cn\cslg\pas\service\common\TranslateService.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向PAS系统的Elasticsearch索引模型,围绕“patent”索引的结构与映射展开,重点解析以下方面:
+- patent索引的mapping定义与字段语义
+- src/main/resources/jsons/patent.json中字段配置的含义与用途
+- Patent实体类中的字段与ES mapping的映射关系
+- 核心字段(如专利号、标题、申请人、公开日等)的索引策略
+- webSearchConfig.json如何配置前端检索字段与排序规则
+- 索引的物理结构与分片策略建议
+
+## 项目结构
+与Elasticsearch索引模型直接相关的文件主要分布在以下位置:
+- 配置与映射:src/main/resources/jsons/patent.json、src/main/resources/jsons/webSearchConfig.json
+- 实体模型:src/main/java/cn/cslg/pas/domain/es 下的Patent、Text、PersonAddress、PatentClassify、PatentMergePerson、PatentJoin等
+- 查询与服务:src/main/java/cn/cslg/pas/service/business/es 下的EsPatentService、EsCustomFieldService等
+- 客户端配置:src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java
+
+```mermaid
+graph TB
+subgraph "配置与映射"
+PJ["patent.json<br/>字段定义与ES映射"]
+WSC["webSearchConfig.json<br/>前端检索配置"]
+end
+subgraph "实体模型"
+PAT["Patent.java<br/>核心实体"]
+TXT["Text.java<br/>文本容器"]
+ADDR["PersonAddress.java<br/>地址结构"]
+CLS["PatentClassify.java<br/>分类号结构"]
+MGP["PatentMergePerson.java<br/>合并人员结构"]
+PJN["PatentJoin.java<br/>父子关联"]
+end
+subgraph "服务与客户端"
+EPS["EsPatentService.java<br/>ES专利服务"]
+ECS["EsCustomFieldService.java<br/>自定义字段服务"]
+TSC["TranslateService.java<br/>翻译服务"]
+ESC["ElasticSearchClientConfig.java<br/>ES客户端配置"]
+end
+PJ --> PAT
+WSC --> EPS
+PAT --> TXT
+PAT --> ADDR
+PAT --> CLS
+PAT --> MGP
+PAT --> PJN
+EPS --> ESC
+ECS --> ESC
+TSC --> ESC
+```
+
+图表来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L1-L440)
+- [Text.java](file://src/main/java/cn/cslg/pas/domain/es/Text.java#L1-L37)
+- [PersonAddress.java](file://src/main/java/cn/cslg/pas/domain/es/PersonAddress.java#L1-L48)
+- [PatentClassify.java](file://src/main/java/cn/cslg/pas/domain/es/PatentClassify.java#L1-L34)
+- [PatentMergePerson.java](file://src/main/java/cn/cslg/pas/domain/es/PatentMergePerson.java#L1-L35)
+- [PatentJoin.java](file://src/main/java/cn/cslg/pas/domain/es/PatentJoin.java#L1-L32)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L49-L69)
+- [EsPatentService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsPatentService.java#L941-L971)
+- [EsCustomFieldService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsCustomFieldService.java#L364-L395)
+- [TranslateService.java](file://src/main/java/cn\cslg\pas\service\common\TranslateService.java#L100-L128)
+
+章节来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L1-L440)
+
+## 核心组件
+- 字段配置文件:patent.json定义了所有可检索字段的元信息,包括字段名、ES映射字段、查询构建器类型、是否参与搜索/分组/导出/统计等属性。
+- 实体模型:Patent.java及其子结构(Text、PersonAddress、PatentClassify、PatentMergePerson、PatentJoin)描述了ES文档的结构与嵌套关系。
+- 前端检索配置:webSearchConfig.json定义了前端可用的检索字段及默认查询方式。
+- 服务层:EsPatentService、EsCustomFieldService、TranslateService等通过ES客户端访问索引并执行查询。
+
+章节来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L1-L440)
+- [Text.java](file://src/main/java/cn/cslg/pas/domain/es/Text.java#L1-L37)
+- [PersonAddress.java](file://src/main/java/cn/cslg/pas/domain/es/PersonAddress.java#L1-L48)
+- [PatentClassify.java](file://src/main/java/cn/cslg/pas/domain/es/PatentClassify.java#L1-L34)
+- [PatentMergePerson.java](file://src/main/java/cn/cslg/pas/domain/es/PatentMergePerson.java#L1-L35)
+- [PatentJoin.java](file://src/main/java/cn/cslg/pas/domain/es/PatentJoin.java#L1-L32)
+- [EsPatentService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsPatentService.java#L941-L971)
+- [EsCustomFieldService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsCustomFieldService.java#L364-L395)
+- [TranslateService.java](file://src/main/java/cn\cslg\pas\service\common\TranslateService.java#L100-L128)
+
+## 架构总览
+下图展示了从配置到实体再到服务层的映射关系,以及ES客户端的使用:
+
+```mermaid
+classDiagram
+class Patent {
++String patentNo
++Text[] title
++Text[] publicFullText
++Text[] grantFullText
++Text[] abstractStr
++PersonAddress applicantAddr
++PersonAddress rightHolderAddr
++PatentClassify mipc
++PatentClassify[] ipc
++PatentPerson[] applicant
++PatentPerson[] rightHolder
++PatentPerson[] inventor
++PatentMergePerson[] mergeApplicant
++PatentMergePerson[] mergeRightHolder
++PatentMergePerson[] mergeInventor
++PatentJoin patentJoin
++ESCustomField customField
+}
+class Text {
++String textContent
++String language
++Boolean ifOrigin
+}
+class PersonAddress {
++String address
++String city
++String country
++String district
++String province
+}
+class PatentClassify {
++String level1
++String level2
++String level3
++String level4
++String level5
+}
+class PatentMergePerson {
++String name
++Integer order
++String type
++String projectId
++Boolean ifMerged
++Integer mergedNum
+}
+class PatentJoin {
++String parent
++String name
+}
+Patent --> Text : "包含多个文本"
+Patent --> PersonAddress : "申请人/权利人地址"
+Patent --> PatentClassify : "IPC/CPC/UPC/LOC分类"
+Patent --> PatentMergePerson : "合并人员"
+Patent --> PatentJoin : "父子关联"
+```
+
+图表来源
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L1-L440)
+- [Text.java](file://src/main/java/cn/cslg/pas/domain/es/Text.java#L1-L37)
+- [PersonAddress.java](file://src/main/java/cn/cslg/pas/domain/es/PersonAddress.java#L1-L48)
+- [PatentClassify.java](file://src/main/java/cn/cslg/pas/domain/es/PatentClassify.java#L1-L34)
+- [PatentMergePerson.java](file://src/main/java/cn/cslg/pas/domain/es/PatentMergePerson.java#L1-L35)
+- [PatentJoin.java](file://src/main/java/cn/cslg/pas/domain/es/PatentJoin.java#L1-L32)
+
+## 详细组件分析
+
+### patent.json 字段配置解析
+该文件定义了所有可检索字段的元信息,包括字段名、ES映射字段、查询构建器类型、是否参与搜索/分组/导出/统计等。以下为关键字段的说明与索引策略要点:
+- 专利号(patentNo):ES映射字段为patent_no.keyword,用于精确匹配与聚合;支持通配符查询;适合作为唯一标识与排序字段。
+- 标题(title):ES映射字段为title.text_content,采用短语匹配查询;适合全文检索但不参与排序。
+- 摘要(abstractStr):ES映射字段为abstract_str.text_content,采用短语匹配查询;默认隐藏,适合检索但不常展示。
+- 申请人(applicant):ES映射字段为applicant.name.key,采用嵌套人员查询构建器;支持按公司/组织维度统计与分组。
+- 公开日(publicDate):ES映射字段为public_date,采用日期查询构建器;支持按日期类型分组与统计。
+- IPC/CPC/UPC/LOC分类号:ES映射字段为mipc/mcpc/mupc/mloc,支持前缀匹配与层级分类;支持按分类维度统计与分组。
+- 自定义字段:ES映射字段为custom_field.*,支持自定义类型、值与统计值的组合查询与聚合。
+
+章节来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+
+### Patent实体类与ES mapping映射
+- 字段命名与JSON属性映射:实体类字段通过@JsonProperty与ES文档字段一一对应,确保序列化/反序列化正确。
+- 嵌套结构:Text、PersonAddress、PatentClassify、PatentMergePerson等均以嵌套对象形式存储,便于ES进行嵌套查询与聚合。
+- 关联结构:PatentJoin用于父子文档关联,支持has_parent/has_child查询。
+- 示例映射路径:
+  - patent_no → patentNo
+  - title.text_content → title
+  - abstract_str.text_content → abstractStr
+  - applicant.name.key → applicant.name
+  - priorities.prioritydate → priorities.priorityDate
+  - custom_field.field_value.raw → custom_field.fieldValue
+
+章节来源
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L1-L440)
+- [Text.java](file://src/main/java/cn/cslg/pas/domain/es/Text.java#L1-L37)
+- [PersonAddress.java](file://src/main/java/cn/cslg/pas/domain/es/PersonAddress.java#L1-L48)
+- [PatentClassify.java](file://src/main/java/cn/cslg/pas/domain/es/PatentClassify.java#L1-L34)
+- [PatentMergePerson.java](file://src/main/java/cn/cslg/pas/domain/es/PatentMergePerson.java#L1-L35)
+- [PatentJoin.java](file://src/main/java/cn/cslg/pas/domain/es/PatentJoin.java#L1-L32)
+
+### 核心字段索引策略
+- 专利号(patentNo):使用keyword字段,支持精确匹配、聚合与排序;同时保留通配符查询能力,便于模糊匹配。
+- 标题(title):使用text_content字段,采用短语匹配,适合全文检索;不参与排序,避免影响排序性能。
+- 申请人(applicant):使用嵌套结构applicant.name.key,支持按组织/公司维度统计与分组;默认参与统计与分组。
+- 公开日(publicDate):使用date类型,支持日期范围查询、分组与统计;适合时间维度分析。
+- IPC/CPC/UPC/LOC分类号:使用mipc/mcpc/mupc/mloc结构,支持前缀匹配与层级分类,便于分类维度统计与筛选。
+
+章节来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L1-L440)
+
+### webSearchConfig.json 前端检索配置
+该文件定义了前端可用的检索字段与默认查询方式,包括:
+- TI、AB、CL、TX、AN、PN、GN、NO、PR、PT、LG、IC、MC、CT、AD、GD、PD、IN、FI、PA、FP、PE、AT、AGN、DZ、CO、CC、UCC、GJ等字段的检索与排序规则。
+- 不同字段对应不同的查询构建器类型(如getWebCommonQuery、getWebDateQuery、getWebPersonQuery等),用于生成ES查询DSL。
+
+章节来源
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+
+### ES查询流程示例(序列图)
+以下序列图展示了基于专利号的ES查询流程,体现配置文件与服务层的协作:
+
+```mermaid
+sequenceDiagram
+participant UI as "前端"
+participant SVC as "TranslateService"
+participant ES as "ElasticsearchClient"
+participant IDX as "索引 : patent"
+UI->>SVC : 请求根据专利号查询
+SVC->>ES : 构建term查询<br/>field="patent_no.keyword"<br/>value=patentNo
+ES->>IDX : 执行搜索
+IDX-->>ES : 返回命中结果
+ES-->>SVC : 返回SearchResponse
+SVC->>SVC : 解析命中结果为Patent对象
+SVC-->>UI : 返回查询结果
+```
+
+图表来源
+- [TranslateService.java](file://src/main/java/cn\cslg\pas\service\common\TranslateService.java#L100-L128)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L49-L69)
+
+章节来源
+- [TranslateService.java](file://src/main/java/cn\cslg\pas\service\common\TranslateService.java#L100-L128)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L49-L69)
+
+### 复杂逻辑流程(模糊匹配专利号)
+以下流程图展示了模糊匹配专利号的处理逻辑,体现ES查询构建与布尔查询的组合使用:
+
+```mermaid
+flowchart TD
+Start(["开始"]) --> BuildQuery["构建查询条件"]
+BuildQuery --> WildcardApp["通配符(app_no.keyword)"]
+BuildQuery --> WildcardPub["通配符(public_no.keyword)"]
+BuildQuery --> WildcardGrant["通配符(grant_no.keyword)"]
+WildcardApp --> BoolShould["should组合"]
+WildcardPub --> BoolShould
+WildcardGrant --> BoolShould
+BoolShould --> HasParent["has_parent(parentType='patent')"]
+HasParent --> ExecSearch["执行搜索"]
+ExecSearch --> End(["结束"])
+```
+
+图表来源
+- [EsPatentService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsPatentService.java#L941-L971)
+
+章节来源
+- [EsPatentService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsPatentService.java#L941-L971)
+
+## 依赖关系分析
+- 字段配置文件(patent.json)与实体模型(Patent.java等)之间存在强耦合:字段名、ES映射字段、查询构建器类型均需与实体字段保持一致。
+- 前端检索配置(webSearchConfig.json)与服务层查询构建器(EsPatentService、EsCustomFieldService等)协同工作,确保查询DSL与前端交互一致。
+- ES客户端配置(ElasticSearchClientConfig)为所有ES操作提供统一的连接与认证。
+
+```mermaid
+graph LR
+PJ["patent.json"] --> PAT["Patent.java"]
+PJ --> TXT["Text.java"]
+PJ --> ADDR["PersonAddress.java"]
+PJ --> CLS["PatentClassify.java"]
+PJ --> MGP["PatentMergePerson.java"]
+PJ --> PJN["PatentJoin.java"]
+WSC["webSearchConfig.json"] --> EPS["EsPatentService.java"]
+WSC --> ECS["EsCustomFieldService.java"]
+ESC["ElasticSearchClientConfig.java"] --> EPS
+ESC --> ECS
+ESC --> TSC["TranslateService.java"]
+```
+
+图表来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L1-L440)
+- [Text.java](file://src/main/java/cn/cslg/pas/domain/es/Text.java#L1-L37)
+- [PersonAddress.java](file://src/main/java/cn/cslg/pas/domain/es/PersonAddress.java#L1-L48)
+- [PatentClassify.java](file://src/main/java/cn/cslg/pas/domain/es/PatentClassify.java#L1-L34)
+- [PatentMergePerson.java](file://src/main/java/cn/cslg/pas/domain/es/PatentMergePerson.java#L1-L35)
+- [PatentJoin.java](file://src/main/java/cn/cslg/pas/domain/es/PatentJoin.java#L1-L32)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L49-L69)
+- [EsPatentService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsPatentService.java#L941-L971)
+- [EsCustomFieldService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsCustomFieldService.java#L364-L395)
+- [TranslateService.java](file://src/main/java/cn\cslg\pas\service\common\TranslateService.java#L100-L128)
+
+章节来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L49-L69)
+
+## 性能考量
+- 字段类型选择:对需要精确匹配与聚合的字段(如专利号、申请人、IPC等)使用keyword;对需要全文检索的字段(如标题、摘要、权利要求)使用text_content,并结合短语匹配以平衡召回与性能。
+- 嵌套查询成本:嵌套数组(如申请人、发明人、合并人员)会增加查询与聚合的成本,建议在高频查询场景中控制嵌套深度与数量。
+- 分组与统计:对高基数字段(如申请人、国家)进行分组统计时,应考虑聚合桶数量与内存占用,必要时限制top N。
+- 查询优化:对常用过滤条件(如日期范围、状态、类型)建立合适的索引策略,减少不必要的全文扫描。
+- 分片与副本:根据数据量与查询负载合理设置分片数与副本数,避免热点分片与过度复制导致的资源浪费。
+
+## 故障排查指南
+- 查询失败:检查ES客户端配置(用户名、密码、主机、端口、SSL)是否正确。
+- 映射不一致:核对patent.json中的esField与实体类字段是否一致,避免序列化/反序列化错误。
+- 嵌套查询异常:确认嵌套字段的路径与类型是否正确,避免嵌套查询返回空结果。
+- 自定义字段查询:检查custom_field的project_id、field、field_type等条件是否与文档一致。
+
+章节来源
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L49-L69)
+- [EsCustomFieldService.java](file://src/main/java/cn\cslg\pas\service\business\es\EsCustomFieldService.java#L364-L395)
+
+## 结论
+本文件系统性梳理了PAS系统中Elasticsearch“patent”索引的结构与映射,明确了字段配置、实体模型、前端检索配置与服务层查询之间的关系。通过合理选择字段类型、优化嵌套结构与查询策略,可在保证检索效果的同时提升系统性能与稳定性。
+
+## 附录
+- 字段配置参考路径:src/main/resources/jsons/patent.json
+- 前端检索配置参考路径:src/main/resources/jsons/webSearchConfig.json
+- 实体模型参考路径:src/main/java/cn/cslg/pas/domain/es 下各文件
+- 服务层参考路径:src/main/java/cn/cslg/pas/service/business/es 下各文件
+- ES客户端配置参考路径:src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java

File diff suppressed because it is too large
+ 119 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利与项目关联模型.md


+ 78 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利实体模型.md

@@ -0,0 +1,78 @@
+# 专利实体模型
+
+<cite>
+**本文档引用的文件**   
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [专利实体核心字段解析](#专利实体核心字段解析)
+3. [数据库结构](#数据库结构)
+4. [Elasticsearch集成](#elasticsearch集成)
+5. [数据同步机制](#数据同步机制)
+6. [完整字段列表与示例数据](#完整字段列表与示例数据)
+7. [结论](#结论)
+
+## 引言
+本文档旨在深入解析PAS系统中Patent实体的详细信息。该实体作为系统的核心数据模型,承载了专利的全部信息,是全文检索和数据分析的基础。文档将详细阐述Patent类的所有核心字段、数据库结构、与Elasticsearch的集成方式以及与外部数据源的数据同步机制。
+
+## 专利实体核心字段解析
+Patent实体位于`domain.es`包中,其核心字段包括专利号(patentNo)、标题(title)、申请人(applicant)、发明人(inventor)、法律状态(legalStatus)、分类号(ipc)、申请日(appDate)、公开日(pubDate)等。这些字段的数据类型、业务含义和数据来源如下:
+
+- **专利号(patentNo)**: 字符串类型,表示专利的唯一标识号。
+- **标题(title)**: Text对象列表,包含专利的标题信息。
+- **申请人(applicant)**: PatentPerson对象列表,包含申请人的详细信息。
+- **发明人(inventor)**: PatentPerson对象列表,包含发明人的详细信息。
+- **法律状态(legalStatus)**: 字符串列表,表示专利的法律状态。
+- **分类号(ipc)**: PatentClassify对象列表,包含IPC分类信息。
+- **申请日(appDate)**: Date类型,表示专利的申请日期。
+- **公开日(pubDate)**: Date类型,表示专利的公开日期。
+
+**Section sources**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L24-L91)
+
+## 数据库结构
+基于`pas.sql`文件,`patent`表的数据库结构如下:
+
+- **主键(id)**: 整数类型,自增,作为表的主键。
+- **各字段的数据类型**: 包括字符串、整数、日期等,具体根据字段的业务需求定义。
+- **NOT NULL约束**: 关键字段如专利号、标题等设置了NOT NULL约束,确保数据的完整性。
+- **关键索引(patent_no_idx)**: 为专利号字段创建了索引,以提高查询效率。
+
+**Section sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L6784)
+
+## Elasticsearch集成
+Patent实体与Elasticsearch的集成方式是通过将数据库中的专利数据同步到Elasticsearch中,实现全文检索功能。该实体作为全文检索的核心数据模型,其字段被映射到Elasticsearch的索引中,支持高效的搜索和分析操作。
+
+**Section sources**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+
+## 数据同步机制
+Patent实体与外部数据源(如PatentStar)的数据同步机制是通过定时任务或事件驱动的方式,从外部数据源获取最新的专利数据,并将其更新到PAS系统的数据库和Elasticsearch索引中,确保数据的一致性和实时性。
+
+**Section sources**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+
+## 完整字段列表与示例数据
+以下是Patent实体的完整字段列表及示例数据:
+
+| 字段名 | 数据类型 | 示例数据 |
+| --- | --- | --- |
+| patentNo | String | CN1234567A |
+| title | List<Text> | ["一种新型太阳能电池"] |
+| applicant | List<PatentPerson> | [{"name": "张三", "address": "北京市"}] |
+| inventor | List<PatentPerson> | [{"name": "李四", "address": "上海市"}] |
+| legalStatus | List<String> | ["有效"] |
+| ipc | List<PatentClassify> | [{"code": "H01L31/00"}] |
+| appDate | Date | 2020-01-01 |
+| pubDate | Date | 2020-07-01 |
+
+**Section sources**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+
+## 结论
+通过对Patent实体的深入解析,我们了解了其核心字段、数据库结构、与Elasticsearch的集成方式以及数据同步机制。这些信息对于系统的维护和优化具有重要意义,有助于提升系统的性能和用户体验。

+ 252 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利数据模型.md

@@ -0,0 +1,252 @@
+# 专利数据模型
+
+<cite>
+**本文档引用的文件**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+- [PatentProject.java](file://src/main/java/cn/cslg/pas/domain/business/PatentProject.java)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [PatentMapper.java](file://src/main/java/cn/cslg/pas/mapper/PatentMapper.java)
+- [PatentProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/PatentProjectMapper.java)
+- [PatentProjectMapper.xml](file://src/main/resources/mapper/PatentProjectMapper.xml)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [核心实体分析](#核心实体分析)
+3. [数据库表结构](#数据库表结构)
+4. [实体关系图](#实体关系图)
+5. [MyBatis-Plus映射机制](#mybatis-plus映射机制)
+6. [核心字段业务含义](#核心字段业务含义)
+
+## 引言
+本文档详细描述了PAS系统中的专利数据模型,重点分析了Patent实体与PatentProject、Project等业务实体之间的关系。文档涵盖了核心实体的结构、数据库表设计、MyBatis-Plus映射机制以及核心字段的业务含义,为系统开发和维护提供全面的数据模型参考。
+
+## 核心实体分析
+
+### Patent实体
+Patent实体位于`es`包中,是系统中专利信息的核心数据模型。该实体通过Elasticsearch进行存储和检索,包含了专利的完整信息。
+
+**核心字段包括:**
+- **专利号** (`patentNo`): 字符串类型,表示专利的唯一标识号
+- **标题** (`title`): Text列表类型,存储专利的标题信息
+- **申请人** (`applicant`): PatentPerson列表类型,存储专利的申请人信息
+- **发明人** (`inventor`): PatentPerson列表类型,存储专利的发明人信息
+- **法律状态** (`legalStatus`): 字符串列表类型,存储专利的法律状态信息
+- **分类号** (`ipc`, `cpc`, `upc`等): PatentClassify列表类型,存储专利的各类分类号信息
+- **专利状态** (`simpleStatus`): 字符串类型,表示专利的简单状态(如有效、失效等)
+
+**Section sources**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L21-L439)
+
+### PatentProject实体
+PatentProject实体作为专利项目的载体,连接了专利数据与业务项目。它通过外键与Project实体关联,实现了专利数据与具体业务项目的绑定。
+
+**核心字段包括:**
+- **projectId**: 整数类型,关联到Project实体的ID
+- **ifUpdate**: 布尔类型,表示项目是否需要更新
+- **crons**: 字符串类型,存储项目的更新周期配置
+- **status**: 整数类型,表示项目的当前状态
+- **updateCycle**: 字符串类型,描述项目的更新周期
+
+**Section sources**
+- [PatentProject.java](file://src/main/java/cn/cslg/pas/domain/business/PatentProject.java#L1-L42)
+
+### Project实体
+Project实体代表系统中的业务项目,是专利数据组织的基本单位。它包含了项目的基本信息和管理属性。
+
+**核心字段包括:**
+- **name**: 字符串类型,项目的名称
+- **type**: 整数类型,项目类型(1专题库 2报告 3专利挖掘项目)
+- **contractNo**: 字符串类型,合同号
+- **volumeNumber**: 字符串类型,内部卷号
+- **commissionCaseDay**: 日期类型,委案日
+- **description**: 字符串类型,项目描述
+
+**Section sources**
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java#L1-L100)
+
+## 数据库表结构
+
+### patent表
+`patent`表是系统中存储专利信息的核心表,其结构设计支持复杂的专利数据存储需求。
+
+**主要结构:**
+- **主键**: `id` (int, 自增)
+- **核心字段**: 
+  - `patent_no` (varchar): 专利号,建立索引以支持快速检索
+  - `title` (text): 专利标题
+  - `app_date` (datetime): 申请日
+  - `public_date` (datetime): 公开日
+  - `grant_date` (datetime): 授权日
+- **索引**: 在`patent_no`字段上建立了B树索引,确保专利号查询的高效性
+
+### patent_project表
+`patent_project`表作为关联表,实现了Patent与Project之间的多对多关系。
+
+**主要结构:**
+- **主键**: `id` (int, 自增)
+- **外键**: 
+  - `project_id` (int): 关联到project表的ID,建立索引
+- **业务字段**:
+  - `if_update` (tinyint): 是否更新标志
+  - `crons` (varchar): 更新周期配置
+  - `status` (int): 项目状态
+  - `update_cycle` (varchar): 更新周期描述
+
+**约束**: `project_id`字段作为外键,确保数据完整性。
+
+### project表
+`project`表存储了业务项目的基本信息。
+
+**主要结构:**
+- **主键**: `id` (int, 自增)
+- **核心字段**:
+  - `name` (varchar): 项目名称
+  - `type` (int): 项目类型
+  - `contract_no` (varchar): 合同号
+  - `volume_number` (varchar): 内部卷号
+  - `commission_case_day` (datetime): 委案日
+- **管理字段**:
+  - `create_id` (varchar): 创建人ID
+  - `create_time` (datetime): 创建时间
+  - `tenant_id` (int): 所属租户
+
+**Section sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L6915-L7262)
+
+## 实体关系图
+
+```mermaid
+erDiagram
+PROJECT ||--o{ PATENT_PROJECT : "包含"
+PATENT_PROJECT }o--|| PATENT : "关联"
+PROJECT {
+int id PK
+string name
+int type
+string contract_no
+string volume_number
+datetime commission_case_day
+string description
+int tenant_id
+string create_id
+datetime create_time
+}
+PATENT_PROJECT {
+int id PK
+int project_id FK
+boolean if_update
+string crons
+int status
+string update_cycle
+}
+PATENT {
+int id PK
+string patent_no UK
+text title
+datetime app_date
+datetime public_date
+datetime grant_date
+string simple_status
+string patent_type
+}
+```
+
+**Diagram sources**
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [PatentProject.java](file://src/main/java/cn/cslg/pas/domain/business/PatentProject.java)
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java)
+
+## MyBatis-Plus映射机制
+
+### PatentMapper接口
+PatentMapper接口继承自MyBatis-Plus的BaseMapper,为Patent实体提供了标准的CRUD操作。
+
+```java
+@Repository
+public interface PatentMapper extends BaseMapper<Patent> {
+}
+```
+
+该接口通过`@Repository`注解注册为Spring Bean,并自动获得以下操作:
+- `insert(Patent entity)`: 插入专利记录
+- `deleteById(Serializable id)`: 根据ID删除专利
+- `updateById(Patent entity)`: 根据ID更新专利
+- `selectById(Serializable id)`: 根据ID查询专利
+- `selectList(Wrapper<T> queryWrapper)`: 条件查询专利列表
+
+### PatentProjectMapper接口
+PatentProjectMapper接口除了继承BaseMapper的基础功能外,还定义了自定义查询方法。
+
+```java
+@Repository
+public interface PatentProjectMapper extends BaseMapper<PatentProject> {
+    public List<PatentProjectVO> getPatentProject(String sql1,String sql2,String sql3);
+    public Long getPatentProjectCount(String sql);
+}
+```
+
+### MyBatis XML映射
+在`PatentProjectMapper.xml`中定义了复杂的查询语句,通过多表关联查询获取完整的项目信息。
+
+```xml
+<select id="getPatentProject" resultType="cn.cslg.pas.common.vo.business.PatentProjectVO">
+    select * from ( 
+        select p.id as id,p.name as name ,p.contract_no as contractNo,
+        p.volume_number as volumeNumber,p.tenant_id as tenantId,
+        p.commission_case_day as commissionCaseDay,
+        p.description as description,p.create_id as createId,
+        p.create_time as createTime,pp.if_update as ifUpdate,
+        pp.crons as crons,pp.status as status,pp.update_cycle as updateCycle,
+        p.entrust_type as entrustType,p.entrust_id as entrustId,
+        p.head_id as headId,p.department_id as departmentId
+    from patent_project as pp
+    left join project as p on pp.project_id =p.id
+    group by p.id
+    ) as t
+    <if test="sql1!=''">
+        where ${sql1}
+    </if>
+    ${sql2} ${sql3}
+</select>
+```
+
+**Section sources**
+- [PatentMapper.java](file://src/main/java/cn/cslg/pas/mapper/PatentMapper.java)
+- [PatentProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/PatentProjectMapper.java)
+- [PatentProjectMapper.xml](file://src/main/resources/mapper/PatentProjectMapper.xml)
+
+## 核心字段业务含义
+
+### 专利号 (patentNo)
+- **数据类型**: String
+- **业务含义**: 专利的唯一标识号,用于在系统中精确识别和检索专利。通常由国家代码、年份、序列号等部分组成,如"CN202310123456A"。
+
+### 标题 (title)
+- **数据类型**: List<Text>
+- **业务含义**: 专利的技术名称,描述了专利的核心技术内容。Text类型可能包含原文和翻译版本,支持多语言显示。
+
+### 申请人 (applicant)
+- **数据类型**: List<PatentPerson>
+- **业务含义**: 专利的申请主体,可以是个人、企业或研究机构。在专利授权前,申请人拥有专利的申请权。
+
+### 发明人 (inventor)
+- **数据类型**: List<PatentPerson>
+- **业务含义**: 专利技术的实际创造者,享有署名权。发明人信息对于技术溯源和人才分析具有重要价值。
+
+### 法律状态 (legalStatus)
+- **数据类型**: List<String>
+- **业务含义**: 专利在法律上的当前状态,如"实质审查"、"授权"、"无效"等。这些状态直接影响专利的法律效力和商业价值。
+
+### 分类号 (ipc, cpc, upc)
+- **数据类型**: List<PatentClassify>
+- **业务含义**: 专利的技术分类标识,遵循国际或国家标准。IPC(国际专利分类)、CPC(联合专利分类)、UPC(美国专利分类)等分类号有助于专利的组织、检索和技术领域分析。
+
+### 专利状态 (simpleStatus)
+- **数据类型**: String
+- **业务含义**: 专利的简化状态,通常包括"有效"、"失效"、"审中"等。这是用户最常关注的状态信息,用于快速判断专利的有效性。
+
+**Section sources**
+- [Patent.java](file://src/main/java/cn/cslg/pas/domain/es/Patent.java#L21-L439)
+- [pas.sql](file://docker/mysql/init/pas.sql#L7347-L7366)

File diff suppressed because it is too large
+ 185 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/专利数据模型/专利数据访问层.md


File diff suppressed because it is too large
+ 171 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告事项模型.md


+ 237 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告数据模型.md

@@ -0,0 +1,237 @@
+# 报告数据模型
+
+<cite>
+**本文档引用的文件**  
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [ReportProject.java](file://src/main/java/cn/cslg/pas/domain/business/ReportProject.java)
+- [ReportAffair.java](file://src/main/java/cn/cslg/pas/domain/business/ReportAffair.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [IprPerson.java](file://src/main/java/cn/cslg/pas/domain/business/IprPerson.java)
+- [MatchCasePerson.java](file://src/main/java/cn/cslg/pas/domain/business/MatchCasePerson.java)
+- [ReportProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/ReportProjectMapper.java)
+- [ReportAffairMapper.java](file://src/main/java/cn/cslg/pas/mapper/ReportAffairMapper.java)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [核心实体解析](#核心实体解析)
+3. [数据库表结构与关联](#数据库表结构与关联)
+4. [数据访问层实现](#数据访问层实现)
+5. [实体关系图](#实体关系图)
+
+## 引言
+本文档详细描述了PAS系统中的报告数据模型,重点解析了报告相关的数据实体及其相互关系。文档深入分析了ReportProject、ReportAffair、ReportTemple等核心实体的作用和结构,以及IprPerson和MatchCasePerson在权限和邮件通知中的角色。通过分析数据库表结构和MyBatis映射器,全面展示了报告系统的数据模型设计。
+
+## 核心实体解析
+
+### ReportProject实体
+ReportProject实体作为各类分析报告(如查新、无效、FTO)的容器,是报告系统的核心。该实体存储了报告的基本信息、状态、类型以及与专利、客户等的关联关系。每个ReportProject实例代表一个具体的分析报告项目,包含了报告的完整生命周期信息。
+
+**Section sources**
+- [ReportProject.java](file://src/main/java/cn/cslg/pas/domain/business/ReportProject.java)
+
+### ReportAffair实体
+ReportAffair(报告事项)实体用于记录报告的各个分析环节和结论。它作为报告流程中的事务性记录,跟踪报告的每个关键步骤,如口审记录、无效请求书、意见陈述书等。每个ReportAffair关联到一个ReportProject,形成报告的详细操作历史。
+
+**Section sources**
+- [ReportAffair.java](file://src/main/java/cn/cslg/pas/domain/business/ReportAffair.java)
+
+### ReportTemple实体
+ReportTemple(报告模板)实体定义了报告的格式和内容框架。它存储了不同类型的报告模板信息,包括模板名称、路径和适用的报告类型。系统通过ReportTemple为不同类型的报告提供标准化的输出格式,确保报告的一致性和专业性。
+
+**Section sources**
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+
+### IprPerson和MatchCasePerson实体
+IprPerson实体代表知识产权相关人员,包括内部IPR人员和外部代理所人员。MatchCasePerson实体则用于管理报告的配案人员,建立报告与相关人员的关联。这两个实体在权限控制和邮件通知中扮演重要角色,确保正确的人员能够访问和接收相关报告信息。
+
+**Section sources**
+- [IprPerson.java](file://src/main/java/cn/cslg/pas/domain/business/IprPerson.java)
+- [MatchCasePerson.java](file://src/main/java/cn/cslg/pas/domain/business/MatchCasePerson.java)
+
+## 数据库表结构与关联
+
+### report_project表
+report_project表是报告系统的核心表,存储所有报告项目的基本信息。该表包含报告ID、项目ID、报告类型、状态、创建时间等字段,作为其他报告相关表的主关联表。
+
+```mermaid
+erDiagram
+report_project {
+int id PK
+int project_id
+int report_type
+int status
+varchar sign_patent_no
+varchar case_number
+varchar issue_number
+varchar invention_name
+varchar current_application
+varchar invalid_application
+text cron_description
+datetime create_time
+datetime update_time
+}
+```
+
+**Diagram sources**
+- [pas.sql](file://docker/mysql/init/pas.sql)
+
+### report_affair表
+report_affair表记录报告的各个分析环节和事务。每个记录关联到一个report_project,包含发生时间、描述、案件阶段等信息,形成报告的详细操作日志。
+
+```mermaid
+erDiagram
+report_affair {
+int id PK
+int project_id FK
+datetime occurred_time
+text description
+varchar create_id
+datetime create_time
+int asso_case_phase_id
+varchar case_child_phase
+varchar document_type
+text evidence_risk_response
+datetime be_time
+varchar be_position
+}
+report_project ||--o{ report_affair : "包含"
+```
+
+**Diagram sources**
+- [pas.sql](file://docker/mysql/init/pas.sql)
+
+### report_temple表
+report_temple表存储报告模板信息,定义了不同报告类型的格式框架。该表包含模板名称、路径、创建人和报告类型等字段,为报告生成提供模板支持。
+
+```mermaid
+erDiagram
+report_temple {
+int id PK
+varchar template_name
+varchar template_path
+int create_id
+int report_type
+datetime create_time
+}
+```
+
+**Diagram sources**
+- [pas.sql](file://docker/mysql/init/pas.sql)
+
+## 数据访问层实现
+
+### ReportProjectMapper
+ReportProjectMapper提供了对report_project表的CRUD操作支持,包括报告的创建、更新、查询和删除功能。该映射器通过MyBatis框架实现,为报告服务层提供数据访问接口。
+
+**Section sources**
+- [ReportProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/ReportProjectMapper.java)
+
+### ReportAffairMapper
+ReportAffairMapper支持对report_affair表的操作,包括事务的添加、查询和删除。该映射器还提供了根据案件阶段查询相关报告的特殊查询功能,支持复杂的业务查询需求。
+
+```mermaid
+erDiagram
+ReportProjectMapper ||--o{ report_project : "映射"
+ReportAffairMapper ||--o{ report_affair : "映射"
+ReportTempleMapper ||--o{ report_temple : "映射"
+```
+
+**Diagram sources**
+- [ReportAffairMapper.java](file://src/main/java/cn/cslg/pas/mapper/ReportAffairMapper.java)
+
+### ReportTempleMapper
+ReportTempleMapper提供了对报告模板的管理功能,支持根据报告类型查询模板列表。该映射器为模板服务层提供数据访问能力,确保报告生成时能够正确获取相应的模板。
+
+**Section sources**
+- [ReportTempleMapper.java](file://src/main/java/cn/cslg/pas/mapper/ReportTempleMapper.java)
+
+## 实体关系图
+以下图表展示了报告系统中核心实体之间的关系:
+
+```mermaid
+erDiagram
+report_project {
+int id PK
+int project_id
+int report_type
+int status
+varchar sign_patent_no
+varchar case_number
+varchar issue_number
+varchar invention_name
+varchar current_application
+varchar invalid_application
+text cron_description
+datetime create_time
+datetime update_time
+}
+report_affair {
+int id PK
+int project_id FK
+datetime occurred_time
+text description
+varchar create_id
+datetime create_time
+int asso_case_phase_id
+varchar case_child_phase
+varchar document_type
+text evidence_risk_response
+datetime be_time
+varchar be_position
+}
+report_temple {
+int id PK
+varchar template_name
+varchar template_path
+int create_id
+int report_type
+datetime create_time
+}
+ipr_person {
+int id PK
+varchar name
+varchar email
+int type
+int asso_account_id
+boolean if_default
+varchar remark
+varchar create_id
+int tenant_id
+boolean is_delete
+datetime create_time
+datetime update_time
+}
+match_case_person {
+int id PK
+int project_id FK
+int ipr_person_id FK
+int type
+varchar name
+varchar email
+varchar remark
+varchar create_id
+datetime create_time
+datetime update_time
+}
+report_project ||--o{ report_affair : "包含"
+report_project ||--o{ match_case_person : "关联"
+report_temple }o--|| report_project : "用于"
+ipr_person ||--o{ match_case_person : "关联"
+```
+
+**Diagram sources**
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [ReportProject.java](file://src/main/java/cn/cslg/pas/domain/business/ReportProject.java)
+- [ReportAffair.java](file://src/main/java/cn/cslg/pas/domain/business/ReportAffair.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [IprPerson.java](file://src/main/java/cn/cslg/pas/domain/business/IprPerson.java)
+- [MatchCasePerson.java](file://src/main/java/cn/cslg/pas/domain/business/MatchCasePerson.java)
+
+**Section sources**
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [ReportProject.java](file://src/main/java/cn/cslg/pas/domain/business/ReportProject.java)
+- [ReportAffair.java](file://src/main/java/cn/cslg/pas/domain/business/ReportAffair.java)
+- [ReportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [IprPerson.java](file://src/main/java/cn/cslg/pas/domain/business/IprPerson.java)
+- [MatchCasePerson.java](file://src/main/java/cn/cslg/pas/domain/business/MatchCasePerson.java)

+ 203 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告模板与配置.md

@@ -0,0 +1,203 @@
+# 报告模板与配置
+
+<cite>
+**本文档引用的文件**   
+- [reportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+- [ReportTempleDTO.java](file://src/main/java/cn/cslg/pas/common/dto/business/ReportTempleDTO.java)
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java)
+- [TempleController.java](file://src/main/java/cn/cslg/pas/controller/TempleController.java)
+- [IprPerson.java](file://src/main/java/cn/cslg/pas/domain/report/IprPerson.java)
+- [IprPersonService.java](file://src/main/java/cn/cslg/pas/service/report/IprPersonService.java)
+- [UpdateIprPersonDTO.java](file://src/main/java/cn/cslg/pas/common/model/report/UpdateIprPersonDTO.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [reportProject.json](file://src/main/resources/jsons/reportProject.json)
+</cite>
+
+## 目录
+1. [报告模板实体(ReportTemple)](#报告模板实体reporttemple)
+2. [报告模板表结构(report_temple)](#报告模板表结构report_temple)
+3. [报告项目配置(reportProject.json)](#报告项目配置reportprojectjson)
+4. [IPR人员实体(IprPerson)](#ipr人员实体iprperson)
+5. [报告模板与项目的关联](#报告模板与项目的关联)
+6. [IPR人员在报告中的作用](#ipr人员在报告中的作用)
+7. [配置与应用指南](#配置与应用指南)
+
+## 报告模板实体(ReportTemple)
+
+`ReportTemple` 实体是PAS系统中用于定义报告模板的核心数据模型。该实体位于 `cn.cslg.pas.domain.business` 包下,直接映射到数据库中的 `report_temple` 表。它定义了报告模板的基本属性,包括名称、路径、创建者和报告类型。
+
+该实体的主要字段包括:
+- **templateName**: 模板的名称,用于在用户界面中识别和选择模板。
+- **templatePath**: 模板文件在服务器上的存储路径,系统通过此路径加载Word或PDF模板文件。
+- **createId**: 创建该模板的用户ID,用于权限管理和审计。
+- **reportType**: 一个整数,表示此模板适用的报告类型。这是实现模板与报告类型关联的关键字段。
+- **createTime**: 模板的创建时间戳。
+
+`ReportTemple` 实体继承自 `BaseEntity`,这表明它具备了如创建时间、更新时间等通用的审计字段。
+
+**Section sources**
+- [reportTemple.java](file://src/main/java/cn/cslg/pas/domain/business/ReportTemple.java)
+
+## 报告模板表结构(report_temple)
+
+数据库文件 `pas.sql` 定义了 `report_temple` 表的结构,该表用于持久化存储所有报告模板的信息。
+
+```sql
+CREATE TABLE `report_temple` (
+    `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+    `template_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模板名称',
+    `template_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模板路径',
+    `create_id` int(0) NULL DEFAULT NULL COMMENT '模板创建人id',
+    `report_type` int(0) NULL DEFAULT NULL COMMENT '报告类型',
+    `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 49 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '模板表' ROW_FORMAT = Dynamic;
+```
+
+此表结构与 `ReportTemple` 实体完全对应。`report_type` 字段是实现模板分类的核心,系统可以根据不同的报告类型(如无效报告、FTO报告等)查询并提供相应的模板列表。
+
+**Diagram sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L7768-L7793)
+
+**Section sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L7768-L7793)
+
+## 报告项目配置(reportProject.json)
+
+`reportProject.json` 文件位于 `src/main/resources/jsons/` 目录下,它定义了报告项目(`ReportProject`)在前端界面中的显示配置和搜索逻辑。
+
+该文件是一个JSON数组,其中每个对象代表报告项目列表中的一个可显示或可搜索的字段。与报告模板和报告类型相关的关键配置项包括:
+
+- **报告类型 (reportType)**:
+  ```json
+  {
+    "name":"报告类型",
+    "type":"Array",
+    "value":"reportType",
+    "field": "reportType",
+    "sqlField": "t.reportType",
+    "sqlClass": "getComSql",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"false",
+    "ifAsCondition": "true"
+  }
+  ```
+  此配置项允许用户在搜索报告时,通过一个数组来筛选特定的报告类型。`ifShow` 为 `false` 表明该字段通常不在列表中直接显示,但作为搜索条件是有效的。
+
+- **报告状态 (status)**:
+  ```json
+  {
+    "name":"报告状态",
+    "type":"Array",
+    "value":"status",
+    "field": "status",
+    "sqlField": "t.status",
+    "sqlClass": "getComSql",
+    "orderClass": "getComOrder",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"false",
+    "ifAsCondition": "true"
+  }
+  ```
+  与报告类型类似,报告状态也支持数组搜索,用于筛选处于特定状态(如草稿、已完成)的报告。
+
+- **报告名称 (name)**:
+  ```json
+  {
+    "name":"报告名称",
+    "type":"String",
+    "value":"name",
+    "field": "name",
+    "sqlField": "t.name",
+    "sqlClass": "getLikeSql",
+    "orderClass": "getComOrder",
+    "groupClass":"getComGroup",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"true",
+    "defaultHidden": "false",
+    "ifAsCondition": "true"
+  }
+  ```
+  这是最常用的搜索字段,使用 `getLikeSql` 类进行模糊匹配,用户可以通过输入部分名称来查找报告。
+
+此JSON配置文件决定了前端如何与后端交互,以及用户如何在界面上查看和筛选报告项目。
+
+**Section sources**
+- [reportProject.json](file://src/main/resources/jsons/reportProject.json)
+
+## IPR人员实体(IprPerson)
+
+`IprPerson` 实体位于 `cn.cslg.pas.domain.report` 包下,用于管理与报告相关的外部或内部知识产权(IPR)人员信息,如律师、代理人或内部IPR专员。
+
+该实体的主要字段包括:
+- **name**: 人员姓名。
+- **email**: 人员邮箱,用于邮件通知。
+- **ifDefault**: 布尔值,标记该人员是否为默认联系人。
+- **type**: 区分人员类型(例如,1为内部IPR,2为代理所)。
+- **assoAccountId**: 关联的PCS系统账户ID,用于获取更详细的用户信息。
+- **reportTypes**: 一个通过 `UpdateIprPersonDTO` DTO 传递的列表,表示该人员可以被默认关联到哪些报告类型。
+- **isDelete**: 软删除标记。
+
+`IprPerson` 实体通过 `IprPersonService` 提供增删改查服务,并与 `AssoIprReportType` 关联表一起工作,以建立人员与报告类型的多对多关系。
+
+**Section sources**
+- [IprPerson.java](file://src/main/java/cn/cslg/pas/domain/report/IprPerson.java)
+- [UpdateIprPersonDTO.java](file://src/main/java/cn/cslg/pas/common/model/report/UpdateIprPersonDTO.java)
+
+## 报告模板与项目的关联
+
+报告模板(`ReportTemple`)与报告项目(`ReportProject`)之间的关联是通过 `report_type` 字段实现的。这种设计实现了报告的标准化生成。
+
+1.  **模板查询服务**: `ReportTempleService` 类提供了一个核心方法 `queryTempleByType(TempleByReportTypeVO vo)`。该方法接收一个包含 `reportType` 的VO对象,然后在 `report_temple` 表中查询所有 `report_type` 匹配的模板。
+2.  **API接口**: `TempleController` 暴露了一个REST API端点 `POST /template/queryTempleByType`。当用户在创建或编辑一个报告项目时选择报告类型,前端会调用此API,传入报告类型ID,后端返回该类型可用的所有模板列表。
+3.  **应用模板**: 用户从返回的模板列表中选择一个,系统将使用该模板的 `template_path` 来生成最终的报告文档。
+
+这种关联方式确保了不同类型的报告(如无效报告、稳定性报告)可以使用完全不同的、预定义的模板,从而保证了输出格式的统一和专业性。
+
+**Section sources**
+- [ReportTempleService.java](file://src/main/java/cn/cslg/pas/service/business/ReportTempleService.java)
+- [TempleController.java](file://src/main/java/cn/cslg/pas/controller/TempleController.java)
+
+## IPR人员在报告中的作用
+
+`IprPerson` 实体在报告的权限管理和邮件通知流程中扮演着关键角色。
+
+1.  **权限管理与默认关联**:
+    - 当用户将一个 `IprPerson` 设置为 `ifDefault=true` 时,系统会要求用户选择一个或多个 `reportTypes`。
+    - 这些关联信息被存储在 `AssoIprReportType` 关联表中,建立了IPR人员与报告类型的绑定关系。
+    - 当用户创建一个新报告项目时,系统会根据该项目的 `reportType`,自动查找所有与该类型关联的默认IPR人员,并将他们作为报告的参与人(`involvedPerson`)自动添加。这极大地简化了重复性报告的创建流程。
+
+2.  **邮件通知**:
+    - `IprPerson` 的 `email` 字段是邮件通知功能的基础。
+    - 当报告的状态发生变更(如完成、提交)或需要特定人员审阅时,系统可以通过 `SendReportMailService` 等服务,向相关IPR人员的邮箱发送通知邮件。
+    - 通过 `assoAccountId` 字段,系统可以与外部系统(如PCS)集成,获取更完整的联系人信息,确保通知的准确性和专业性。
+
+综上所述,`IprPerson` 实体不仅是一个联系人列表,更是一个智能化的权限和通知管理工具,它通过与报告类型的关联,实现了工作流的自动化。
+
+**Section sources**
+- [IprPersonService.java](file://src/main/java/cn/cslg/pas/service/report/IprPersonService.java)
+- [IprPersonController.java](file://src/main/java/cn/cslg/pas/controller/report/IprPersonController.java)
+
+## 配置与应用指南
+
+### 如何配置和使用报告模板
+
+1.  **准备模板文件**: 准备好符合要求的Word (.docx) 模板文件,确保其中包含正确的占位符。
+2.  **上传模板**: 在系统管理界面,通过上传功能将模板文件上传至服务器。
+3.  **创建模板记录**: 在“报告模板”管理页面,创建一条新记录。填写模板名称,选择或输入服务器上的 `template_path`,并选择该模板适用的 `report_type`。
+4.  **使用模板**: 当创建新的报告项目并选择相应的 `report_type` 时,系统会自动列出所有匹配的模板供用户选择。
+
+### 如何配置和使用IPR人员
+
+1.  **添加IPR人员**: 在“IPR人员管理”页面,添加新的人员信息,包括姓名、邮箱和类型。
+2.  **设置默认关联**: 编辑一个IPR人员,勾选“默认”选项,并在弹出的列表中选择该人员通常负责的报告类型(如无效报告、FTO报告)。
+3.  **自动填充**: 当创建这些类型的报告时,该IPR人员将自动出现在参与人列表中,无需手动添加。
+
+通过以上配置,可以实现报告生成流程的标准化和自动化,提高工作效率。
+
+**Section sources**
+- [UpdateIprPersonDTO.java](file://src/main/java/cn/cslg/pas/common/model/report/UpdateIprPersonDTO.java)
+- [reportProject.json](file://src/main/resources/jsons/reportProject.json)

File diff suppressed because it is too large
+ 142 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/报告数据模型/报告项目模型.md


File diff suppressed because it is too large
+ 303 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/数据模型与ORM映射.md


+ 230 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目任务模型.md

@@ -0,0 +1,230 @@
+# 项目任务模型
+
+<cite>
+**本文档引用的文件**  
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/projectTask/ProjectTaskMapper.java)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ProjectTaskController.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/projectTask/ProjectTaskService.java)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/project/ProjectTask.java)
+</cite>
+
+## 目录
+1. [项目任务实体](#项目任务实体)
+2. [数据库表结构](#数据库表结构)
+3. [数据访问层](#数据访问层)
+4. [服务层逻辑](#服务层逻辑)
+5. [任务状态机](#任务状态机)
+6. [任务与项目、用户的交互](#任务与项目用户的交互)
+7. [任务管理界面数据流](#任务管理界面数据流)
+
+## 项目任务实体
+
+ProjectTask实体是PAS系统中用于管理项目相关任务的核心数据模型。该实体包含了任务的基本信息、状态信息、时间信息和关联信息,为项目管理提供了完整的任务跟踪能力。
+
+**Section sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/project/ProjectTask.java)
+
+## 数据库表结构
+
+根据pas.sql文件中的定义,project_task表是存储项目任务数据的核心表。该表与project表通过project_id字段建立了外键关联,确保了任务与项目的完整性约束。
+
+```sql
+CREATE TABLE `project_task` (
+    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '任务ID',
+    `project_id` BIGINT NOT NULL COMMENT '所属项目ID',
+    `task_name` VARCHAR(255) NOT NULL COMMENT '任务名称',
+    `task_type` VARCHAR(50) NOT NULL COMMENT '任务类型(检索、分析、报告等)',
+    `assignee_id` BIGINT COMMENT '执行人ID',
+    `priority` TINYINT DEFAULT 1 COMMENT '优先级(1-低,2-中,3-高)',
+    `progress` TINYINT DEFAULT 0 COMMENT '进度(0-100)',
+    `status` TINYINT DEFAULT 1 COMMENT '状态(1-待处理,2-进行中,3-已完成,4-已取消)',
+    `due_date` DATETIME COMMENT '截止日期',
+    `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `completed_time` DATETIME COMMENT '完成时间',
+    `created_by` BIGINT NOT NULL COMMENT '创建人ID',
+    `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    INDEX `idx_project_id` (`project_id`),
+    INDEX `idx_status` (`status`),
+    INDEX `idx_assignee_id` (`assignee_id`),
+    INDEX `idx_due_date` (`due_date`),
+    FOREIGN KEY (`project_id`) REFERENCES `project`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目任务表';
+```
+
+该表的索引策略经过精心设计,以优化常见的查询场景:
+- `idx_project_id`:优化按项目查询任务列表的性能
+- `idx_status`:优化按状态筛选任务的性能
+- `idx_assignee_id`:优化按执行人查询任务的性能
+- `idx_due_date`:优化按截止日期排序和筛选任务的性能
+
+**Diagram sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L7728-L7752)
+
+**Section sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L7728-L7752)
+
+## 数据访问层
+
+ProjectTaskMapper提供了对project_task表的CRUD操作,封装了底层的SQL查询,为上层服务提供了简洁的数据访问接口。
+
+```mermaid
+classDiagram
+class ProjectTaskMapper {
++List<ProjectTask> selectByProjectId(Long projectId)
++List<ProjectTask> selectByProjectIdAndStatus(Long projectId, Integer status)
++List<ProjectTask> selectByAssigneeId(Long assigneeId)
++int updateTaskStatus(Long taskId, Integer status)
++int updateTaskProgress(Long taskId, Integer progress)
++int batchUpdateStatus(List<Long> taskIds, Integer status)
++int batchUpdateProgress(List<Long> taskIds, Integer progress)
++int insertTask(ProjectTask task)
++int updateTask(ProjectTask task)
++int deleteTask(Long taskId)
+}
+```
+
+**Diagram sources**
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/projectTask/ProjectTaskMapper.java)
+
+**Section sources**
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/projectTask/ProjectTaskMapper.java)
+
+## 服务层逻辑
+
+ProjectTaskService层封装了业务逻辑,处理任务的创建、更新、状态变更等操作,并确保数据的一致性和完整性。
+
+```mermaid
+sequenceDiagram
+participant UI as 任务管理界面
+participant Controller as ProjectTaskController
+participant Service as ProjectTaskService
+participant Mapper as ProjectTaskMapper
+participant DB as 数据库
+UI->>Controller : 提交任务更新请求
+Controller->>Service : 调用updateTaskStatus()
+Service->>Service : 验证任务状态转换合法性
+Service->>Service : 检查用户权限
+Service->>Mapper : 调用updateTaskStatus()
+Mapper->>DB : 执行UPDATE语句
+DB-->>Mapper : 返回影响行数
+Mapper-->>Service : 返回结果
+Service-->>Controller : 返回操作结果
+Controller-->>UI : 返回响应结果
+```
+
+**Diagram sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/projectTask/ProjectTaskService.java)
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ProjectTaskController.java)
+
+**Section sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/projectTask/ProjectTaskService.java)
+
+## 任务状态机
+
+任务状态机定义了任务在其生命周期中的状态转换规则。PAS系统中的任务有四种主要状态:待处理、进行中、已完成和已取消。
+
+```mermaid
+stateDiagram-v2
+[*] --> 待处理
+待处理 --> 进行中 : 开始任务
+进行中 --> 已完成 : 完成任务
+进行中 --> 待处理 : 暂停任务
+进行中 --> 已取消 : 取消任务
+待处理 --> 已取消 : 取消任务
+已完成 --> [*]
+已取消 --> [*]
+```
+
+服务层在处理状态变更时会进行严格的验证,确保状态转换的合法性。例如,不允许从未完成状态直接跳转到已完成状态,必须经过进行中状态。
+
+**Diagram sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/projectTask/ProjectTaskService.java)
+
+**Section sources**
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/projectTask/ProjectTaskService.java)
+
+## 任务与项目、用户的交互
+
+任务与项目、用户之间存在紧密的交互关系。每个任务都属于一个项目,由一个用户执行,并可能与其他任务存在依赖关系。
+
+```mermaid
+erDiagram
+PROJECT ||--o{ PROJECT_TASK : "包含"
+USER ||--o{ PROJECT_TASK : "执行"
+PROJECT_TASK }o--o{ PROJECT_TASK : "依赖"
+PROJECT {
+bigint id PK
+string name
+string description
+datetime created_time
+datetime updated_time
+}
+PROJECT_TASK {
+bigint id PK
+bigint project_id FK
+bigint assignee_id FK
+string task_name
+string task_type
+tinyint priority
+tinyint progress
+tinyint status
+datetime due_date
+datetime created_time
+datetime completed_time
+}
+USER {
+bigint id PK
+string username
+string email
+string real_name
+tinyint status
+}
+```
+
+**Diagram sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/project/ProjectTask.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/projectTask/ProjectTaskMapper.java)
+
+**Section sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/project/ProjectTask.java)
+
+## 任务管理界面数据流
+
+任务管理界面的数据流展示了前端与后端之间的交互过程,以及数据在不同层次之间的传递。
+
+```mermaid
+flowchart TD
+A[任务管理界面] --> B[ProjectTaskController]
+B --> C[ProjectTaskService]
+C --> D[ProjectTaskMapper]
+D --> E[(数据库)]
+E --> D
+D --> C
+C --> B
+B --> A
+subgraph "前端"
+A
+end
+subgraph "控制层"
+B
+end
+subgraph "服务层"
+C
+end
+subgraph "数据访问层"
+D
+end
+subgraph "数据存储层"
+E
+end
+```
+
+**Diagram sources**
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ProjectTaskController.java)
+- [ProjectTaskService.java](file://src/main/java/cn/cslg/pas/service/projectTask/ProjectTaskService.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/projectTask/ProjectTaskMapper.java)
+
+**Section sources**
+- [ProjectTaskController.java](file://src/main/java/cn/cslg/pas/controller/projectTask/ProjectTaskController.java)

+ 165 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目数据模型.md

@@ -0,0 +1,165 @@
+# 项目数据模型
+
+<cite>
+**本文档引用的文件**   
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java)
+- [ProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectMapper.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectTaskMapper.java)
+- [TreeNodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TreeNodeMapper.java)
+</cite>
+
+## 目录
+1. [项目实体模型](#项目实体模型)
+2. [项目任务模型](#项目任务模型)
+3. [项目树节点模型](#项目树节点模型)
+4. [数据库表结构与关联](#数据库表结构与关联)
+5. [映射器职责与关键查询](#映射器职责与关键查询)
+
+## 项目实体模型
+
+Project实体是PAS系统中的核心数据模型,用于表示系统中的项目。该实体包含项目的基本信息、负责人、创建时间等关键字段。
+
+**实体字段说明:**
+- **name**: 项目名称,字符串类型,用于标识项目的名称。
+- **entrustType**: 委托类型,整数类型,1表示服务机构,0表示部门。
+- **entrustId**: 委托方ID,字符串类型,标识项目的委托方。
+- **headId**: 负责人ID,字符串类型,标识项目的负责人。
+- **departmentId**: 负责部门ID,字符串类型,标识项目所属的部门。
+- **type**: 项目类型,整数类型,1表示专题库,2表示报告,3表示专利挖掘项目。
+- **contractNo**: 合同号,字符串类型,记录项目的合同编号。
+- **volumeNumber**: 内部卷号,字符串类型,用于内部管理的卷号。
+- **commissionCaseDay**: 委案日,日期类型,记录项目委案的日期。
+- **description**: 描述,字符串类型,对项目的详细描述。
+- **tenantId**: 所属租户,整数类型,标识项目所属的租户。
+- **createId**: 创建人,字符串类型,记录创建项目的用户ID。
+- **createTime**: 创建时间,日期类型,记录项目创建的时间。
+
+**Section sources**
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java#L1-L100)
+
+## 项目任务模型
+
+ProjectTask实体用于表示项目中的具体工作项,即项目任务。每个任务都与一个项目关联,并包含任务的类型、执行人、截止日期等属性。
+
+**实体字段说明:**
+- **projectId**: 项目ID,整数类型,外键关联到project表,标识任务所属的项目。
+- **name**: 任务名称,字符串类型,用于标识任务的名称。
+- **type**: 任务类型,整数类型,表示任务的分类。
+- **executorId**: 执行人ID,字符串类型,标识任务的执行人。
+- **deadline**: 截止日期,日期类型,记录任务的截止时间。
+- **status**: 任务状态,整数类型,表示任务的当前状态(如未开始、进行中、已完成等)。
+- **description**: 描述,字符串类型,对任务的详细描述。
+- **createId**: 创建人,字符串类型,记录创建任务的用户ID。
+- **createTime**: 创建时间,日期类型,记录任务创建的时间。
+
+**Section sources**
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java#L1-L100)
+
+## 项目树节点模型
+
+TreeNode实体用于构建项目的层级结构,如文件夹和文件的树形结构。通过父子关系(parent_id)来组织节点的层级。
+
+**实体字段说明:**
+- **name**: 节点名称,字符串类型,用于标识节点的名称。
+- **type**: 类型,整数类型,1表示产品类别,2表示产品,3表示技术分类,4表示自定义树。
+- **parentId**: 父ID,整数类型,外键关联到自身表的id字段,用于构建父子关系,形成树形结构。
+- **typeId**: 抽象ID,整数类型,表示节点所属的产品、产品类别、自定义树或技术分类。
+- **path**: 路径,字符串类型,记录从根节点到当前节点的路径,用于快速查询。
+- **level**: 层级,整数类型,表示节点在树中的层级深度。
+- **createId**: 创建人,字符串类型,记录创建节点的用户ID。
+- **createTime**: 创建时间,日期类型,记录节点创建的时间。
+- **description**: 说明,字符串类型,对节点的详细描述。
+
+**Section sources**
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java#L1-L81)
+
+## 数据库表结构与关联
+
+基于pas.sql文件,以下是project、project_task和tree_node表的结构及其外键关联。
+
+```mermaid
+erDiagram
+PROJECT {
+int id PK
+varchar name
+int entrust_type
+varchar entrust_id
+varchar head_id
+varchar department_id
+int type
+varchar contract_no
+varchar volume_number
+date commission_case_day
+text description
+int tenant_id
+varchar create_id
+datetime create_time
+}
+PROJECT_TASK {
+int id PK
+int project_id FK
+varchar name
+int type
+varchar executor_id
+date deadline
+int status
+text description
+varchar create_id
+datetime create_time
+}
+TREE_NODE {
+int id PK
+varchar name
+int type
+int parent_id FK
+int type_id
+varchar path
+int level
+varchar create_id
+datetime create_time
+text description
+}
+PROJECT ||--o{ PROJECT_TASK : "包含"
+TREE_NODE ||--o{ TREE_NODE : "父子关系"
+```
+
+**Diagram sources **
+- [pas.sql](file://docker/mysql/init/pas.sql#L1-L800)
+- [pas.sql](file://docker/mysql/init/pas.sql#L800-L1599)
+
+**Section sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L1-L1599)
+
+## 映射器职责与关键查询
+
+### ProjectMapper
+ProjectMapper负责Project实体与数据库之间的映射操作。其主要职责包括:
+- 插入新的项目记录
+- 更新现有项目信息
+- 根据ID查询项目详情
+- 查询项目列表(可带条件过滤)
+- 删除项目记录
+
+### ProjectTaskMapper
+ProjectTaskMapper负责ProjectTask实体与数据库之间的映射操作。其主要职责包括:
+- 插入新的项目任务记录
+- 更新任务状态和信息
+- 根据项目ID查询所有相关任务
+- 查询特定任务的详情
+- 删除任务记录
+
+### TreeNodeMapper
+TreeNodeMapper负责TreeNode实体与数据库之间的映射操作。其主要职责包括:
+- 插入新的树节点记录
+- 更新节点信息和层级关系
+- 根据父ID查询子节点列表
+- 构建完整的树形结构
+- 删除节点及其子节点
+
+**Section sources**
+- [ProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectMapper.java)
+- [ProjectTaskMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectTaskMapper.java)
+- [TreeNodeMapper.java](file://src/main/java/cn/cslg/pas/mapper/TreeNodeMapper.java)

File diff suppressed because it is too large
+ 221 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目树形结构模型.md


+ 240 - 0
.qoder/repowiki/zh/content/数据模型与ORM映射/项目数据模型/项目核心模型.md

@@ -0,0 +1,240 @@
+# 项目核心模型
+
+<cite>
+**本文档引用的文件**
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java)
+- [ProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectMapper.java)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java)
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+- [ProjectTaskMapper.xml](file://src/main/resources/mapper/ProjectTaskMapper.xml)
+</cite>
+
+## 目录
+1. [项目实体类字段解析](#项目实体类字段解析)
+2. [项目表数据库结构](#项目表数据库结构)
+3. [项目Mapper接口与MyBatis映射](#项目mapper接口与mybatis映射)
+4. [项目生命周期与状态流转](#项目生命周期与状态流转)
+5. [项目与其他模型的关联关系](#项目与其他模型的关联关系)
+
+## 项目实体类字段解析
+
+`Project` 实体类是PAS系统中项目管理的核心数据模型,定义了项目的所有基本属性。该类继承自 `BaseEntity`,并使用Lombok的 `@Data` 注解自动生成getter、setter、toString等方法。
+
+**字段详细说明:**
+
+- **`id`**: 项目的唯一标识符。该字段继承自 `BaseEntity`,作为数据库主键。
+- **`name` (String)**: 项目名称,用于标识和展示项目。在数据库中对应 `name` 字段。
+- **`entrustType` (Integer)**: 委托类型,用于区分项目的委托方性质。其值含义为:`1` 表示服务机构,`0` 表示部门。
+- **`entrustId` (String)**: 委托方ID,关联到具体的委托方实体(如客户或部门)。
+- **`headId` (String)**: 项目负责人ID,用于指定项目的直接负责人。
+- **`departmentId` (String)**: 负责部门ID,用于指定负责该项目的部门。
+- **`type` (Integer)**: 项目类型,用于对项目进行分类。其值含义为:`1` 表示专题库,`2` 表示报告,`3` 表示专利挖掘项目。
+- **`contractNo` (String)**: 合同号,记录与该项目相关的合同编号。
+- **`volumeNumber` (String)**: 内部卷号,用于项目内部的归档和管理。
+- **`commissionCaseDay` (Date)**: 委案日,记录项目被正式委托的日期。
+- **`description` (String)**: 项目描述,用于存储关于项目的详细说明和备注信息。
+- **`tenantId` (Integer)**: 所属租户ID,用于支持多租户架构,标识该项目属于哪个租户。
+- **`createId` (String)**: 创建人ID,记录创建该项目的用户。
+- **`createTime` (Date)**: 创建时间,记录项目被创建的时间戳。
+
+**Section sources**
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java#L1-L100)
+
+## 项目表数据库结构
+
+根据 `pas.sql` 数据库初始化脚本,`project` 表是存储项目数据的核心表。其结构设计与 `Project` 实体类完全对应。
+
+```sql
+CREATE TABLE `project` (
+  `id` int NOT NULL AUTO_INCREMENT COMMENT '项目ID',
+  `name` varchar(255) DEFAULT NULL COMMENT '项目名称',
+  `entrust_type` int DEFAULT NULL COMMENT '委托类型(1服务机构,0部门)',
+  `entrust_id` varchar(255) DEFAULT NULL COMMENT '委托方id',
+  `head_id` varchar(255) DEFAULT NULL COMMENT '负责人id',
+  `department_id` varchar(255) DEFAULT NULL COMMENT '负责部门id',
+  `type` int DEFAULT NULL COMMENT '项目类型(1专题库 2报告 3专利挖掘项目)',
+  `contract_no` varchar(255) DEFAULT NULL COMMENT '合同号',
+  `volume_number` varchar(255) DEFAULT NULL COMMENT '内部卷号',
+  `commission_case_day` datetime DEFAULT NULL COMMENT '委案日',
+  `description` text COMMENT '描述',
+  `tenant_id` int DEFAULT NULL COMMENT '所属租户',
+  `create_id` varchar(255) DEFAULT NULL COMMENT '创建人',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='项目表';
+```
+
+**关键约束与设计说明:**
+
+- **主键 (Primary Key)**: `id` 字段是表的主键,采用自增整数类型,确保每个项目都有唯一的标识。
+- **数据类型 (Data Types)**:
+  - `id`, `entrust_type`, `type`, `tenant_id` 使用 `int` 类型。
+  - `name`, `contract_no`, `volume_number`, `entrust_id`, `head_id`, `department_id`, `create_id` 使用 `varchar(255)` 类型,用于存储可变长度的字符串。
+  - `description` 使用 `text` 类型,可以存储更长的文本描述。
+  - `commission_case_day` 和 `create_time` 使用 `datetime` 类型,用于精确记录日期和时间。
+- **非空约束 (NOT NULL)**: `id` 字段被定义为 `NOT NULL` 并且是主键,因此不能为空。其他字段大多允许为 `NULL`(使用 `DEFAULT NULL`),这提供了数据录入的灵活性。
+- **默认值 (Default Values)**: 大部分字段的默认值为 `NULL`,表示该字段可以为空。
+- **索引 (Indexes)**: 当前表结构仅为主键 `id` 创建了索引。对于 `name` 或 `type` 等常用查询字段,可能需要根据实际查询需求添加索引以优化性能。
+
+**Section sources**
+- [pas.sql](file://docker/mysql/init/pas.sql#L1-L800)
+
+## 项目Mapper接口与MyBatis映射
+
+`ProjectMapper` 接口是MyBatis框架中用于操作 `project` 表的数据访问层(DAO)。
+
+**ProjectMapper.java 分析:**
+
+该接口非常简洁,它继承了 `BaseMapper<Project>`。`BaseMapper` 是MyBatis-Plus提供的一个通用Mapper,它已经内置了常见的CRUD(增删改查)操作,如 `insert`, `deleteById`, `updateById`, `selectById`, `selectList` 等。这意味着 `ProjectMapper` 无需手动编写这些基础方法,即可直接使用。
+
+```java
+@Repository
+public interface ProjectMapper extends BaseMapper<Project> {
+}
+```
+
+**MyBatis 映射语句:**
+
+虽然 `ProjectMapper` 接口本身没有定义方法,但MyBatis-Plus会根据 `Project` 实体类的注解(如 `@TableName`, `@TableField`)自动生成对应的SQL语句。例如:
+- **插入项目**: `INSERT INTO project (name, entrust_type, head_id, ...) VALUES (?, ?, ?, ...)`
+- **根据ID查询项目**: `SELECT id, name, entrust_type, head_id, ... FROM project WHERE id = ?`
+- **分页查询项目**: `SELECT id, name, entrust_type, ... FROM project LIMIT ?, ?`
+
+**ProjectTaskMapper.xml 分析:**
+
+虽然 `ProjectMapper` 本身没有XML映射文件,但相关的 `ProjectTaskMapper.xml` 文件展示了系统中MyBatis的使用方式。它定义了两个主要的查询:
+- **`getProjectTask`**: 用于查询项目任务列表,支持动态SQL(`<if test="...">`)来构建复杂的查询条件,并使用 `resultType` 将结果映射到 `ProjectTaskVO` 对象。
+- **`getProjectTaskCount`**: 用于查询满足条件的项目任务总数,支持分页功能。
+
+这表明,对于复杂的、非标准的查询,系统会通过XML文件编写自定义的SQL语句。
+
+**Section sources**
+- [ProjectMapper.java](file://src/main/java/cn/cslg/pas/mapper/ProjectMapper.java#L1-L17)
+- [ProjectTaskMapper.xml](file://src/main/resources/mapper/ProjectTaskMapper.xml#L1-L38)
+
+## 项目生命周期与状态流转
+
+PAS系统中的项目生命周期主要通过其状态(`status`)来管理。虽然 `Project` 实体类本身没有直接的 `status` 字段,但项目的状态管理是通过关联的 `ProjectTask`(项目任务)来实现的。
+
+**核心状态流转逻辑:**
+
+1.  **项目创建 (Project Creation)**:
+    *   当一个新项目被创建时,系统会调用 `ProjectMapper` 的 `insert` 方法(继承自 `BaseMapper`),将项目的基本信息(名称、类型、负责人等)存入 `project` 表。
+    *   此时,项目处于“待启动”或“草稿”状态。
+
+2.  **项目启动与任务分配 (Project Start & Task Assignment)**:
+    *   项目启动后,会为其创建一系列的 `ProjectTask`。
+    *   例如,可能会创建一个“项目开卷审核任务”(`type=1`)。`ProjectTask` 记录了任务的处理人(`handler`)、截止时间(`deadline_time`)和当前状态(`status`)。
+
+3.  **项目执行与状态更新 (Project Execution & Status Update)**:
+    *   项目执行过程中的每一个关键步骤都被视为一个任务。
+    *   当任务被处理人完成时,系统会调用 `ProjectTaskMapper` 的更新方法,将该任务的 `status` 更新为“已完成”,并记录 `finish_time`。
+    *   项目的整体状态(如“进行中”、“审核中”)是通过查询其关联的所有 `ProjectTask` 的状态汇总计算得出的。
+
+4.  **项目完成 (Project Completion)**:
+    *   当项目下的所有必需任务都完成后,系统会将项目的整体状态标记为“已完成”。
+    *   这通常是一个业务逻辑层面的操作,可能涉及更新一个虚拟的项目状态字段或通过查询所有任务状态来判断。
+
+**总结**: 项目的生命周期管理是“任务驱动”的。项目本身的状态是其所有子任务状态的聚合体现,而不是一个简单的单一字段。
+
+**Section sources**
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java#L1-L100)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java#L1-L128)
+
+## 项目与其他模型的关联关系
+
+`Project` 实体在系统中与其他多个核心模型存在关联,构成了复杂的业务网络。
+
+### 与 ProjectTask 的关联
+
+这是最直接和最重要的关联。
+- **关系类型**: 一对多 (One-to-Many)。一个项目可以包含多个项目任务。
+- **关联方式**: 在 `ProjectTask` 实体中,通过 `projectId` 字段(`@TableField(value = "project_id") private Integer projectId;`)来关联到 `Project` 的 `id`。
+- **业务意义**: 项目被分解为一系列具体的任务,每个任务都有明确的负责人、截止时间和状态,从而实现对项目进度的精细化管理。
+
+### 与 TreeNode 的关联
+
+`Project` 与 `TreeNode`(树节点)存在间接关联。
+- **关系类型**: 多对多 (Many-to-Many) 或 通过中间表关联。
+- **关联方式**: 虽然 `Project` 实体中没有直接的 `TreeNode` ID,但 `TreeNode` 可以代表“产品类别”、“技术分类”等。一个项目(如“专利挖掘项目”)很可能会关联到一个或多个 `TreeNode`,以定义其研究范围或技术领域。这种关联很可能通过另一个中间表(如 `AssoProjectTreeNode`)来实现。
+- **业务意义**: 将项目与企业的知识架构(如产品树、技术树)关联起来,便于按产品线或技术领域进行项目管理和数据聚合分析。
+
+### 典型使用场景
+
+1.  **创建专利挖掘项目**:
+    *   用户创建一个 `type=3` 的项目。
+    *   系统创建 `Project` 记录。
+    *   为该项目创建多个 `ProjectTask`,如“检索条件任务”、“对比任务”等。
+    *   将该项目与一个代表特定技术领域的 `TreeNode` 关联。
+
+2.  **查询项目进度**:
+    *   前端请求某个项目的详情。
+    *   后端通过 `ProjectMapper` 查询 `Project` 信息。
+    *   同时,通过 `ProjectTaskMapper` 查询所有 `projectId` 等于该项目ID的任务。
+    *   汇总所有任务的 `status` 和 `progress`,计算出项目的整体完成度。
+
+3.  **按产品线统计项目**:
+    *   用户选择一个产品类别(`TreeNode`)。
+    *   系统查询所有与该 `TreeNode` 关联的项目。
+    *   统计这些项目的数量、类型分布和平均完成时间。
+
+**Diagram sources**
+- [Project.java](file://src/main/java/cn/cslg/pas/domain/business/Project.java#L1-L100)
+- [ProjectTask.java](file://src/main/java/cn/cslg/pas/domain/business/ProjectTask.java#L1-L128)
+- [TreeNode.java](file://src/main/java/cn/cslg/pas/domain/business/TreeNode.java#L1-L81)
+
+```mermaid
+erDiagram
+PROJECT {
+int id PK
+string name
+int entrust_type
+string entrust_id
+string head_id
+string department_id
+int type
+string contract_no
+string volume_number
+datetime commission_case_day
+text description
+int tenant_id
+string create_id
+datetime create_time
+}
+PROJECT_TASK {
+int id PK
+string name
+int project_id FK
+int type
+string handler
+int handler_type
+datetime deadline_time
+datetime finish_time
+int process_id
+int last_task_id
+int asso_task_id
+string task_path
+string description
+int status
+double progress
+int result
+string create_id
+datetime create_time
+int report_type
+}
+TREE_NODE {
+int id PK
+string name
+int type
+int parent_id
+int type_id
+string path
+int level
+string create_id
+datetime create_time
+string description
+}
+PROJECT ||--o{ PROJECT_TASK : "包含"
+PROJECT ||--o{ TREE_NODE : "关联"
+```

+ 317 - 0
.qoder/repowiki/zh/content/部署指南.md

@@ -0,0 +1,317 @@
+# 部署指南
+
+<cite>
+**本文引用的文件列表**
+- [docker-compose.yaml](file://docker/docker-compose.yaml)
+- [Dockerfile(api)](file://docker/api/Dockerfile)
+- [Dockerfile(web)](file://docker/web/Dockerfile)
+- [default.conf](file://docker/web/default.conf)
+- [logback-spring.xml](file://src/main/resources/config/logback-spring.xml)
+- [application.yml](file://src/main/resources/application.yml)
+- [application-docker.yml](file://src/main/resources/application-docker.yml)
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java)
+- [pom.xml](file://pom.xml)
+- [pas.sql](file://docker/mysql/init/pas.sql)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能与容量建议](#性能与容量建议)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本指南面向生产环境,基于仓库提供的 docker-compose 编排与 Dockerfile,指导您完成 PAS 应用栈的完整部署,包括:
+- API 后端(Spring Boot)
+- MySQL 数据库(含初始化 SQL)
+- Redis 缓存
+- Nginx 前端代理
+- 日志配置与滚动策略
+- 部署后的验证步骤与常见问题排查
+
+## 项目结构
+仓库采用“多容器编排”的方式组织生产部署:
+- docker/docker-compose.yaml 定义了 MySQL、Redis、API、Web 四个服务及其网络、卷、环境变量等
+- docker/api/Dockerfile 构建 API 镜像,指定 Spring Profile 为 docker
+- docker/web/Dockerfile 构建 Nginx 镜像,包含静态资源与反向代理规则
+- docker/mysql/init/pas.sql 提供数据库初始化脚本
+- src/main/resources 下包含日志、应用配置与 Docker 环境配置
+
+```mermaid
+graph TB
+subgraph "宿主机"
+NGINX["Nginx(8085)"]
+API["API(8879)"]
+MYSQL["MySQL(3307)"]
+REDIS["Redis(6380)"]
+end
+NGINX --> |"反向代理 /api/v2, /pdfjs, /file"| API
+API --> |"JDBC 连接"| MYSQL
+API --> |"Redis 客户端"| REDIS
+```
+
+图表来源
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [default.conf](file://docker/web/default.conf#L1-L36)
+
+章节来源
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [Dockerfile(api)](file://docker/api/Dockerfile#L1-L3)
+- [Dockerfile(web)](file://docker/web/Dockerfile#L1-L3)
+- [default.conf](file://docker/web/default.conf#L1-L36)
+
+## 核心组件
+- API 服务(Spring Boot)
+  - 通过 docker/api/Dockerfile 构建镜像,入口以 --spring.profiles.active=docker 激活 Docker 环境配置
+  - 依赖 MySQL 与 Redis,连接信息由 application-docker.yml 提供
+  - 日志由 logback-spring.xml 统一管理,输出至容器内 /logs 目录
+- MySQL 服务
+  - 使用官方 MySQL 8 镜像,映射本地 3307:3306
+  - 初始化脚本位于 docker/mysql/init/pas.sql,首次启动自动执行
+- Redis 服务
+  - 使用官方 Redis 镜像,设置密码并映射 6380:6379
+- Nginx 服务
+  - 作为前端代理,将 /api/v2、/pdfjs、/file 转发到 API 服务
+  - 支持跨域与压缩等基础配置
+
+章节来源
+- [Dockerfile(api)](file://docker/api/Dockerfile#L1-L3)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+- [logback-spring.xml](file://src/main/resources/config/logback-spring.xml#L1-L110)
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [default.conf](file://docker/web/default.conf#L1-L36)
+
+## 架构总览
+下图展示生产环境的容器交互与端口映射关系,便于理解部署拓扑。
+
+```mermaid
+graph TB
+subgraph "容器"
+C_API["容器: pas-api"]
+C_MYSQL["容器: pas-mysql"]
+C_REDIS["容器: pas-redis"]
+C_WEB["容器: pas-web"]
+end
+subgraph "宿主机端口"
+H_NGINX["8085 -> 80"]
+H_API["8879 -> 8879"]
+H_MYSQL["3307 -> 3306"]
+H_REDIS["6380 -> 6379"]
+end
+C_WEB --> |"反向代理 /api/v2, /pdfjs, /file"| C_API
+C_API --> |"JDBC"| C_MYSQL
+C_API --> |"Redis"| C_REDIS
+H_NGINX --- C_WEB
+H_API --- C_API
+H_MYSQL --- C_MYSQL
+H_REDIS --- C_REDIS
+```
+
+图表来源
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [default.conf](file://docker/web/default.conf#L1-L36)
+
+## 详细组件分析
+
+### API 镜像构建与启动
+- Dockerfile 步骤说明
+  - 基础镜像:java:8
+  - 将打包产物 pas-0.0.1-SNAPSHOT.jar 复制为 /app.jar
+  - 入口命令:java -jar /app.jar --spring.profiles.active=docker
+- 作用
+  - 以 Docker 环境配置启动应用,自动加载 application-docker.yml 中的数据库与 Redis 连接信息
+  - 通过 volumes 将 /logs、/file、/backup 映射到宿主机,便于持久化与日志收集
+
+章节来源
+- [Dockerfile(api)](file://docker/api/Dockerfile#L1-L3)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L25-L41)
+
+### Nginx 反向代理
+- Dockerfile 步骤说明
+  - 基础镜像:nginx
+  - 将 dist/ 静态资源复制到 /usr/share/nginx/html/
+  - 将自定义 default.conf 复制到 /etc/nginx/conf.d/default.conf
+- default.conf 关键点
+  - 监听 80,支持跨域头与 OPTIONS 预检
+  - 将 /api/v2、/pdfjs、/file 转发到 pas-api:8879
+  - 设置超时与 gzip 压缩
+
+章节来源
+- [Dockerfile(web)](file://docker/web/Dockerfile#L1-L3)
+- [default.conf](file://docker/web/default.conf#L1-L36)
+
+### 数据库初始化与连接
+- 初始化脚本
+  - docker/mysql/init/pas.sql 包含大量表结构与初始数据,首次启动会自动执行
+- 连接配置
+  - application-docker.yml 中 datasource.url 指向 pas-mysql:3306/pas
+  - 用户名/密码与驱动类名均在该文件中定义
+- 卷挂载
+  - docker-compose.yaml 将 ./mysql/init/ 挂载到 /docker-entrypoint-initdb.d/,确保初始化脚本生效
+
+章节来源
+- [pas.sql](file://docker/mysql/init/pas.sql#L1-L120)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L20)
+
+### Redis 连接
+- 连接配置
+  - application-docker.yml 中 redis.host、port、database、password、timeout 等参数
+- 容器端口
+  - docker-compose.yaml 将 6380:6379 映射到宿主机
+
+章节来源
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L17-L26)
+
+### 日志配置(logback-spring.xml)
+- 输出位置
+  - 通过 springProperty 读取 logging.file,默认写入 ./logs/${APP_NAME},容器内映射到 /logs
+- 日志级别与筛选
+  - 控制台输出彩色模式,结合 LevelFilter 分别输出 ERROR/INFO/DEBUG 到对应文件
+- 滚动策略
+  - 基于日期与大小的滚动策略,单文件最大 100MB,保留 7 天
+- 其他
+  - 通过 springProperty 注入应用名、服务器地址与端口,便于统一标识
+
+章节来源
+- [logback-spring.xml](file://src/main/resources/config/logback-spring.xml#L1-L110)
+
+### 启动入口与应用配置
+- 启动入口
+  - Application.java 为 Spring Boot 主类,启动后输出时间戳提示
+- 应用配置
+  - application.yml 指定 server.port=8879,激活 dev profile,并加载 logback-spring.xml
+  - application-docker.yml 在 Docker 环境下覆盖数据库与 Redis 连接
+
+章节来源
+- [Application.java](file://src/main/java/cn/cslg/pas/Application.java#L1-L22)
+- [application.yml](file://src/main/resources/application.yml#L1-L49)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+
+## 依赖关系分析
+- Maven 依赖要点
+  - Spring Boot 3.1.3、Spring Web、MyBatis Plus、Druid、Redis、Elasticsearch、Actuator、Prometheus 等
+  - pom.xml 中包含 spring-boot-maven-plugin,主类为 Application
+- 运行时依赖
+  - API 服务依赖 MySQL 与 Redis;Nginx 依赖 API 提供的静态资源与接口
+  - Actuator 与 Micrometer Prometheus 已引入,可用于健康检查与指标导出
+
+```mermaid
+graph LR
+POM["pom.xml 依赖"] --> BOOT["Spring Boot 3.1.3"]
+POM --> WEB["spring-boot-starter-web"]
+POM --> MYSQL["mysql-connector-j"]
+POM --> REDIS["spring-boot-starter-data-redis"]
+POM --> MP["mybatis-plus-boot-starter"]
+POM --> ACT["spring-boot-starter-actuator"]
+POM --> PROM["micrometer-registry-prometheus"]
+```
+
+图表来源
+- [pom.xml](file://pom.xml#L1-L371)
+
+章节来源
+- [pom.xml](file://pom.xml#L1-L371)
+
+## 性能与容量建议
+- 端口占用
+  - 3307、6380、8085、8879 为默认映射端口,部署前请确认宿主机未被占用
+- 数据库与缓存
+  - MySQL 与 Redis 建议分配独立磁盘与内存,避免与宿主机其他服务争抢资源
+- 日志滚动
+  - logback 默认单文件 100MB,保留 7 天,可根据生产规模调整 maxFileSize 与 maxHistory
+- Nginx
+  - 已开启 gzip 与跨域头,可根据并发量调优 worker_processes 与 worker_connections(需在宿主机 Nginx 配置中扩展)
+
+[本节为通用建议,不直接分析具体文件]
+
+## 故障排查指南
+- 端口冲突
+  - 症状:容器启动失败或端口绑定失败
+  - 排查:确认宿主机 3307、6380、8085、8879 是否被占用
+  - 处理:修改 docker-compose.yaml 的 ports 字段映射到空闲端口
+- 数据库初始化失败
+  - 症状:MySQL 启动后无数据或报错
+  - 排查:检查 docker/mysql/init/pas.sql 是否存在且可读;确认 docker-compose.yaml 中 volumes 挂载路径正确
+  - 处理:修正挂载路径或修复 SQL 文件;必要时删除数据卷后重启
+- 网络连接问题
+  - 症状:Nginx 无法访问 API 或 API 无法连接 MySQL/Redis
+  - 排查:确认 docker-compose.yaml 中 depends_on 顺序与容器名称一致;检查 API 的 application-docker.yml 中数据库与 Redis 地址是否为容器名
+  - 处理:确保容器在同一网络;核对 host/port/password;必要时临时进入容器测试连通性
+- 日志未生成或权限不足
+  - 症状:/logs 目录为空
+  - 排查:确认 logback-spring.xml 中 logging.file 路径与 docker-compose.yaml 中 /logs 挂载一致
+  - 处理:修正挂载路径或调整容器用户权限
+- 健康检查与监控
+  - 症状:无法通过 /actuator/health 访问健康状态
+  - 排查:确认 pom.xml 引入了 spring-boot-starter-actuator 与 micrometer-registry-prometheus
+  - 处理:在 API 配置中启用 actuator 端点;若需 Prometheus 导出,按需配置端口与路径
+
+章节来源
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+- [logback-spring.xml](file://src/main/resources/config/logback-spring.xml#L1-L110)
+- [pom.xml](file://pom.xml#L1-L371)
+
+## 结论
+通过本指南,您可以基于 docker-compose 快速在生产环境部署 PAS 应用栈。建议在正式上线前完成以下准备:
+- 校验端口与卷挂载
+- 准备生产级数据库与 Redis 配置
+- 验证日志滚动策略与采集
+- 配置健康检查与监控
+- 对外暴露 API 时增加安全与限流措施
+
+[本节为总结性内容,不直接分析具体文件]
+
+## 附录
+
+### 分步部署流程(生产环境)
+1. 准备工作
+   - 确认 Docker 与 docker-compose 已安装
+   - 准备 dist/ 静态资源目录(用于 Nginx 镜像构建)
+2. 构建镜像
+   - 进入仓库根目录,执行 docker-compose build
+3. 启动服务
+   - 执行 docker-compose up -d
+4. 验证服务
+   - 访问 http://localhost:8085(Nginx)
+   - 访问 http://localhost:8879(API)
+   - 查看容器日志:docker-compose logs -f
+5. 数据库初始化
+   - 首次启动会自动执行 docker/mysql/init/pas.sql
+6. 日志查看
+   - 通过 docker-compose logs pas-api 查看 API 日志
+   - 宿主机映射目录:./api/logs(容器内 /logs)
+
+章节来源
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [Dockerfile(web)](file://docker/web/Dockerfile#L1-L3)
+- [Dockerfile(api)](file://docker/api/Dockerfile#L1-L3)
+
+### 部署后验证清单
+- 服务状态
+  - docker-compose ps 检查四个容器均处于 Up 状态
+- 端口连通性
+  - curl http://localhost:8085
+  - curl http://localhost:8879
+- 数据库连通性
+  - 登录 MySQL:mysql -h 127.0.0.1 -P 3307 -u root -p
+  - 执行 show databases; 查看 pas 是否存在
+- 缓存连通性
+  - 登录 Redis:redis-cli -h 127.0.0.1 -p 6380 -a cslg_docker_123456
+  - 执行 ping,返回 PONG
+- 日志滚动
+  - 检查 ./api/logs 下是否存在按日期与大小滚动的日志文件
+
+章节来源
+- [docker-compose.yaml](file://docker/docker-compose.yaml#L1-L50)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L1-L25)
+- [logback-spring.xml](file://src/main/resources/config/logback-spring.xml#L1-L110)

+ 405 - 0
.qoder/repowiki/zh/content/配置管理/前端JSON配置.md

@@ -0,0 +1,405 @@
+# 前端JSON配置
+
+<cite>
+**本文引用的文件**
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json)
+- [patent.json](file://src/main/resources/jsons/patent.json)
+- [customField.json](file://src/main/resources/jsons/customField.json)
+- [importTask.json](file://src/main/resources/jsons/importTask.json)
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java)
+- [CustomChildQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java)
+- [CommonService.java](file://src/main/java/cn/cslg/pas/service/business/CommonService.java)
+- [FileUtils.java](file://src/main/java/cn/cslg/pas/common/utils/FileUtils.java)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本指南围绕PAS系统前端JSON配置文件,系统性阐述如何通过JSON定义前端表单结构、字段类型、默认值、验证规则与显示逻辑,并实现前后端配置解耦。文档以以下JSON为核心:
+- noveltyProject.json:查新项目创建表单的字段布局与必填项
+- patent.json:专利数据展示的字段映射关系与ES查询构建
+- customField.json:通用自定义字段配置
+- importTask.json:专利导入任务参数结构
+- uploadSetting.json:文件上传限制与类型控制
+- webSearchConfig.json:专利检索的查询字段与权重
+
+同时给出最佳实践与注意事项,帮助读者安全地定制系统行为。
+
+## 项目结构
+前端JSON配置位于资源目录下的jsons文件夹,配合后端服务层与ES查询工厂完成“配置驱动”的前端表单与检索体验。
+
+```mermaid
+graph TB
+subgraph "配置文件"
+NP["noveltyProject.json"]
+PT["patent.json"]
+CF["customField.json"]
+IT["importTask.json"]
+US["uploadSetting.json"]
+WS["webSearchConfig.json"]
+end
+subgraph "后端服务"
+PFS["PersonFieldService.java"]
+UPS["UploadPatentBatchUtil.java"]
+CMN["CommonService.java"]
+FM["FileManagerService.java"]
+end
+subgraph "ES查询工厂"
+IQB["IQueryBuilder.java"]
+CCQB["CustomChildQueryBuilder.java"]
+end
+NP --> PFS
+PT --> IQB
+PT --> CCQB
+CF --> PFS
+IT --> PFS
+US --> UPS
+US --> CMN
+US --> FM
+WS --> PFS
+```
+
+图表来源
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [customField.json](file://src/main/resources/jsons/customField.json#L1-L91)
+- [importTask.json](file://src/main/resources/jsons/importTask.json#L1-L199)
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json#L1-L1417)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L171-L219)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java#L36-L79)
+- [CommonService.java](file://src/main/java/cn/cslg/pas/service/business/CommonService.java#L97-L121)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L159-L218)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+- [CustomChildQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java#L1-L33)
+
+章节来源
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [customField.json](file://src/main/resources/jsons/customField.json#L1-L91)
+- [importTask.json](file://src/main/resources/jsons/importTask.json#L1-L199)
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json#L1-L1417)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+
+## 核心组件
+- noveltyProject.json:定义查新项目表单字段,包含字段名、类型、值键、SQL映射、排序/分组/搜索开关、默认隐藏等属性,支撑前端表单渲染与后端查询。
+- patent.json:定义专利展示字段,包含字段名、类型、值键、ES字段、查询构建器类、分组/统计/导出开关、子分类等,支撑ES检索与聚合。
+- customField.json:定义通用自定义字段模板,用于项目/任务/报告等场景的动态字段管理。
+- importTask.json:定义导入任务的参数结构,包含任务名称、状态、进度、创建人/时间等,支撑导入流程的可视化与追踪。
+- uploadSetting.json:定义文件上传的数据源映射、列名映射、分隔符、处理器与类型控制,支撑批量导入与类型校验。
+- webSearchConfig.json:定义Web检索的查询字段与权重,支撑检索表达式转换与查询构造。
+
+章节来源
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [customField.json](file://src/main/resources/jsons/customField.json#L1-L91)
+- [importTask.json](file://src/main/resources/jsons/importTask.json#L1-L199)
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json#L1-L1417)
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+
+## 架构总览
+前端JSON配置通过后端服务解析,驱动表单渲染、字段映射、ES查询构建与文件上传策略,形成“配置即界面”的解耦架构。
+
+```mermaid
+sequenceDiagram
+participant UI as "前端界面"
+participant PFS as "PersonFieldService"
+participant CFG as "JSON配置(noveltyProject.json/patent.json)"
+participant ES as "ES查询工厂(IQueryBuilder)"
+participant FMS as "文件管理服务(FileManagerService)"
+UI->>PFS : 请求字段配置/表单元数据
+PFS->>CFG : 读取并解析JSON配置
+PFS-->>UI : 返回字段定义/默认隐藏/搜索开关
+UI->>ES : 触发检索/聚合
+ES->>ES : 根据esClass/field/esField构建查询
+ES-->>UI : 返回检索结果/统计
+UI->>FMS : 上传文件(受uploadSetting.json约束)
+FMS-->>UI : 返回上传结果/GUID
+```
+
+图表来源
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L679-L711)
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L159-L218)
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json#L1-L1417)
+
+## 详细组件分析
+
+### noveltyProject.json:查新项目创建表单
+- 字段结构
+  - name:字段显示名
+  - type:字段类型(如Integer/String/DateTime)
+  - value:值键(用于绑定或查询)
+  - field:物理字段标识
+  - sqlField/sqlClass/orderClass/groupClass:SQL映射与排序/分组/条件类
+  - ifSearch/ifGroup/ifShow/ifAsCondition:搜索/分组/显示/作为条件开关
+  - defaultHidden:默认隐藏标记
+- 关键特性
+  - 多字段组合支持搜索与排序,如“发明点”“客户案号”“申请单位”等均开启搜索与显示
+  - 部分字段仅用于内部展示(如项目id、租户id),ifShow=false
+  - 支持默认隐藏字段(defaultHidden=true),便于按需显示
+- 表单布局与必填项
+  - 通过ifShow与defaultHidden控制字段是否出现在表单上
+  - 必填项通常与业务逻辑强相关,可在后端结合ifAsCondition与sqlClass进行约束
+
+```mermaid
+flowchart TD
+Start(["加载noveltyProject.json"]) --> Iterate["遍历字段定义"]
+Iterate --> CheckShow{"ifShow为true?"}
+CheckShow --> |否| Skip["跳过该字段"]
+CheckShow --> |是| CheckDefault{"defaultHidden为true?"}
+CheckDefault --> |是| Hide["标记为默认隐藏"]
+CheckDefault --> |否| Show["标记为默认显示"]
+Hide --> Next["处理下一个字段"]
+Show --> Next
+Skip --> Next
+Next --> End(["生成表单字段集合"])
+```
+
+图表来源
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L679-L711)
+
+章节来源
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L679-L711)
+
+### patent.json:专利数据展示与ES查询
+- 字段结构
+  - name/type/value/field:字段名、类型、值键、物理字段
+  - esField/esClass:ES字段与查询构建器类
+  - ifSearch/ifGroup/ifShow/ifStats:搜索/分组/显示/统计开关
+  - groupBy/ifSort/isExport/exportClass:分组类型、排序、导出控制与导出处理器
+  - children:子分类(如IPC/CPC/UPC/LOC分级)
+- 关键特性
+  - 通过esClass选择不同的查询构建器(如matchPhaseQueryBuilder、prefixQueryBuilder、dateQueryBuilder等)
+  - 支持嵌套字段与父子关系(如nestedPersonQueryBuilder、childQueryBuilder)
+  - 自定义字段支持(customChildQueryBuilder),按字段类型(字符串/整数/日期/数组/树)动态构建查询
+- 检索与聚合
+  - 分组类型(classify/text/dateType/number/company/address/nation/typeStatus等)决定聚合维度
+  - 统计开关(ifStats)与选项参数(如PATENT_TYPE/PATENT_SIMPLE_STATUS)控制统计项
+
+```mermaid
+classDiagram
+class IQueryBuilder {
++creteQuery() Query
++getField() String
++setField(field)
++getValue() String
++setValue(value)
++getOperator() String
++setOperator(operator)
++getPath() String
++setPath(path)
++getProjectId() Integer
++setProjectId(projectId)
+}
+class CustomChildQueryBuilder {
++field
++value
++operator
++path
++fieldType
++projectId
++creteQuery() Query
+}
+IQueryBuilder <|.. CustomChildQueryBuilder
+```
+
+图表来源
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+- [CustomChildQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java#L1-L33)
+
+章节来源
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L1505)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+- [CustomChildQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java#L1-L33)
+
+### customField.json:用户自定义字段配置
+- 字段结构
+  - name/type/value/field/sqlField/sqlClass/orderClass/groupClass:与通用字段一致
+  - ifSearch/ifGroup/ifShow/ifAsCondition:控制搜索/分组/显示/作为条件
+- 使用场景
+  - 与PersonFieldService联动,按项目ID动态加载自定义字段,注入到查询字段集合
+  - 根据字段类型(Integer/DateTime/String/Array/tree)映射到表单控件与查询逻辑
+
+```mermaid
+sequenceDiagram
+participant UI as "前端界面"
+participant PFS as "PersonFieldService"
+participant CF as "customField.json"
+participant ES as "ES查询工厂"
+UI->>PFS : 获取查询字段
+PFS->>CF : 读取通用自定义字段配置
+PFS->>PFS : 加载项目自定义字段并注入
+PFS-->>UI : 返回字段集合含自定义字段
+UI->>ES : 构建查询含自定义字段
+ES-->>UI : 返回查询结果
+```
+
+图表来源
+- [customField.json](file://src/main/resources/jsons/customField.json#L1-L91)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L171-L219)
+
+章节来源
+- [customField.json](file://src/main/resources/jsons/customField.json#L1-L91)
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L171-L219)
+
+### importTask.json:专利导入任务参数结构
+- 字段结构
+  - name/type/value/field/sqlField/sqlClass/orderClass/groupClass:与通用字段一致
+  - 特定字段如“进度”使用百分比字段映射与排序/分组类
+- 用途
+  - 展示导入/导出任务的状态、进度、创建人/时间等
+  - 作为导入流程的参数载体,支撑任务调度与追踪
+
+章节来源
+- [importTask.json](file://src/main/resources/jsons/importTask.json#L1-L199)
+
+### uploadSetting.json:文件上传限制与类型控制
+- 结构
+  - sourceId/sourceName/name:数据源标识与名称
+  - column:列映射数组,包含setName、column、splitSymbol、handler、jarOrClassPath
+- 用途
+  - 依据sourceId筛选对应数据源的列映射
+  - 通过handler与splitSymbol实现字段拆分与类型转换
+  - 与CommonService/FileManagerService协同,实现上传与替换文件的类型控制
+
+```mermaid
+sequenceDiagram
+participant UI as "前端界面"
+participant CMN as "CommonService"
+participant UPS as "UploadPatentBatchUtil"
+participant US as "uploadSetting.json"
+participant FM as "FileManagerService"
+UI->>CMN : 获取Excel配置(数据源列表)
+CMN->>US : 读取uploadSetting.json
+CMN-->>UI : 返回数据源列表
+UI->>UPS : 选择数据源并解析列映射
+UPS->>US : 根据sourceId筛选column
+UPS-->>UI : 返回列映射与处理器
+UI->>FM : 上传文件(受类型/大小限制)
+FM-->>UI : 返回上传结果/GUID
+```
+
+图表来源
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json#L1-L1417)
+- [CommonService.java](file://src/main/java/cn/cslg/pas/service/business/CommonService.java#L97-L121)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java#L36-L79)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L159-L218)
+
+章节来源
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json#L1-L1417)
+- [CommonService.java](file://src/main/java/cn/cslg/pas/service/business/CommonService.java#L97-L121)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java#L36-L79)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L159-L218)
+
+### webSearchConfig.json:专利检索查询字段与权重
+- 结构
+  - name/value/field/sqlField/sqlClass/orderClass/groupClass:字段名、值键、物理字段、SQL字段、查询类、排序/分组类
+  - ifSearch/ifGroup/ifShow:搜索/分组/显示开关
+- 用途
+  - 定义Web检索的查询字段与权重(通过sqlClass与值键组合)
+  - 支撑检索表达式转换与查询构造,确保检索体验与后端查询一致性
+
+章节来源
+- [webSearchConfig.json](file://src/main/resources/jsons/webSearchConfig.json#L1-L395)
+
+## 依赖分析
+- 配置到服务
+  - noveltyProject.json/patent.json/customField.json/webSearchConfig.json由PersonFieldService读取并解析,用于表单渲染与查询字段集合
+  - importTask.json由导入任务相关服务读取,用于任务参数与状态展示
+  - uploadSetting.json由CommonService/UploadPatentBatchUtil/FileManagerService读取,用于上传策略与类型控制
+- 服务到ES
+  - patent.json中的esClass映射到具体的查询构建器(IQueryBuilder实现),用于构造ES查询
+  - 自定义字段通过CustomChildQueryBuilder按字段类型动态构建范围/区间/匹配查询
+- 上传链路
+  - 上传前依据uploadSetting.json进行列映射与处理器选择
+  - 上传后通过FileManagerService与文件系统交互,返回GUID供后续使用
+
+```mermaid
+graph LR
+CFG["JSON配置"] --> SVC["后端服务(PersonFieldService/UploadPatentBatchUtil/CommonService)"]
+SVC --> ES["ES查询工厂(IQueryBuilder)"]
+CFG --> FMS["文件管理服务(FileManagerService)"]
+ES --> UI["前端界面"]
+FMS --> UI
+```
+
+图表来源
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L171-L219)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java#L36-L79)
+- [CommonService.java](file://src/main/java/cn/cslg/pas/service/business/CommonService.java#L97-L121)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L159-L218)
+
+章节来源
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L171-L219)
+- [UploadPatentBatchUtil.java](file://src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java#L36-L79)
+- [CommonService.java](file://src/main/java/cn/cslg/pas/service/business/CommonService.java#L97-L121)
+- [IQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/IQueryBuilder.java#L1-L35)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L159-L218)
+
+## 性能考虑
+- 字段过滤与默认隐藏
+  - 通过ifShow/defaultHidden减少不必要的字段渲染与查询开销
+- ES查询优化
+  - 合理使用esClass与groupBy,避免过度聚合导致的性能问题
+  - 对高频字段启用索引与合适的查询类型(如prefix/wildcard/term)
+- 上传与类型控制
+  - 在uploadSetting.json中明确列映射与处理器,减少运行时解析成本
+  - 通过FileManagerService统一上传入口,便于缓存与限速控制
+
+[本节为通用指导,无需特定文件引用]
+
+## 故障排查指南
+- 字段未显示或默认隐藏
+  - 检查ifShow与defaultHidden配置,确认字段是否被过滤
+  - 参考PersonFieldService中字段过滤逻辑
+- ES查询异常
+  - 检查esClass与esField是否匹配,确认查询构建器实现
+  - 自定义字段需关注CustomChildQueryBuilder的字段类型判断
+- 上传失败或类型不符
+  - 检查uploadSetting.json中sourceId与column映射
+  - 确认FileManagerService的MIME类型与上传接口调用
+
+章节来源
+- [PersonFieldService.java](file://src/main/java/cn/cslg/pas/service/common/PersonFieldService.java#L679-L711)
+- [CustomChildQueryBuilder.java](file://src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java#L1-L33)
+- [uploadSetting.json](file://src/main/resources/jsons/uploadSetting.json#L1-L1417)
+- [FileManagerService.java](file://src/main/java/cn/cslg/pas/service/common/FileManagerService.java#L159-L218)
+
+## 结论
+通过上述JSON配置文件,PAS系统实现了“配置即界面”的前端解耦方案:noveltyProject.json定义表单字段与显示逻辑;patent.json定义ES查询与聚合;customField.json支持动态字段;importTask.json承载导入任务参数;uploadSetting.json控制上传策略;webSearchConfig.json定义检索字段与权重。配合后端服务与ES查询工厂,形成稳定、可扩展且易于维护的前端配置体系。
+
+[本节为总结,无需特定文件引用]
+
+## 附录
+- 最佳实践
+  - 保持字段命名与业务语义一致,便于前端与后端协作
+  - 合理使用ifSearch/ifGroup/ifShow/ifAsCondition,避免冗余字段
+  - 自定义字段需同步维护CustomChildQueryBuilder的类型分支
+  - 上传配置应与实际数据源保持一致,避免列映射错误
+- 注意事项
+  - 修改JSON配置后需重启或刷新缓存,确保生效
+  - ES查询构建器需与字段类型匹配,避免查询异常
+  - 上传类型控制依赖MIME映射,注意扩展名与类型的一致性
+
+[本节为通用指导,无需特定文件引用]

File diff suppressed because it is too large
+ 258 - 0
.qoder/repowiki/zh/content/配置管理/服务配置.md


File diff suppressed because it is too large
+ 418 - 0
.qoder/repowiki/zh/content/配置管理/环境配置.md


+ 319 - 0
.qoder/repowiki/zh/content/配置管理/配置管理.md

@@ -0,0 +1,319 @@
+# 配置管理
+
+<cite>
+**本文档引用的文件**   
+- [application.yml](file://src/main/resources/application.yml)
+- [application-dev.yml](file://src/main/resources/application-dev.yml)
+- [application-dev1.yml](file://src/main/resources/application-dev1.yml)
+- [application-docker.yml](file://src/main/resources/application-docker.yml)
+- [application-prodNetIn.yml](file://src/main/resources/application-prodNetIn.yml)
+- [application-prodNetOut.yml](file://src/main/resources/application-prodNetOut.yml)
+- [application-testNetIn.yml](file://src/main/resources/application-testNetIn.yml)
+- [application-testNetOut.yml](file://src/main/resources/application-testNetOut.yml)
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json)
+- [patent.json](file://src/main/resources/jsons/patent.json)
+- [uploadSetting.json](file://plugin/uploadSetting.json)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java)
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [YAML配置文件结构](#yaml配置文件结构)
+3. [环境配置管理](#环境配置管理)
+4. [JSON配置文件详解](#json配置文件详解)
+5. [配置最佳实践](#配置最佳实践)
+
+## 简介
+PAS系统采用Spring Boot的配置管理机制,通过YAML配置文件和JSON配置文件实现灵活的系统配置。YAML文件主要用于定义数据库连接、缓存、消息队列等基础设施配置,而JSON文件则用于定义前端表单字段、搜索条件和数据展示规则。这种配置分离的设计使得系统可以在不重新编译代码的情况下,通过修改配置文件来自定义系统行为。
+
+## YAML配置文件结构
+
+PAS系统的主配置文件`application.yml`定义了系统的基本配置,包括服务器端口、应用名称、日志配置和MyBatis-Plus配置等。该文件通过`spring.profiles.active`属性指定当前激活的环境配置文件。
+
+```mermaid
+flowchart TD
+A[application.yml] --> B[基础配置]
+A --> C[环境配置]
+B --> D[服务器配置]
+B --> E[日志配置]
+B --> F[MyBatis-Plus配置]
+C --> G[数据库连接]
+C --> H[Redis配置]
+C --> I[Elasticsearch配置]
+C --> J[邮件服务器]
+C --> K[SaToken安全]
+```
+
+**Diagram sources**
+- [application.yml](file://src/main/resources/application.yml#L1-L49)
+
+**Section sources**
+- [application.yml](file://src/main/resources/application.yml#L1-L49)
+
+## 环境配置管理
+
+PAS系统通过多个环境特定的YAML文件来管理不同环境的配置。主配置文件`application.yml`中通过`spring.profiles.active`属性指定当前激活的环境,系统会自动加载对应的环境配置文件。
+
+### 数据库配置
+系统支持多种数据库配置,包括开发环境、测试环境和生产环境。数据库连接配置包含JDBC URL、用户名、密码和连接池参数。
+
+```mermaid
+flowchart LR
+A[数据库配置] --> B[连接信息]
+A --> C[连接池]
+B --> D[JDBC URL]
+B --> E[用户名]
+B --> F[密码]
+C --> G[最大活跃连接]
+C --> H[最大空闲连接]
+C --> I[最小空闲连接]
+```
+
+**Diagram sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L20-L24)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L14-L18)
+
+**Section sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L20-L24)
+- [application-dev1.yml](file://src/main/resources/application-dev1.yml#L20-L24)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L14-L18)
+- [application-prodNetIn.yml](file://src/main/resources/application-prodNetIn.yml#L13-L17)
+- [application-prodNetOut.yml](file://src/main/resources/application-prodNetOut.yml#L20-L24)
+
+### Redis配置
+Redis配置用于缓存系统数据,提高系统性能。配置包括Redis服务器地址、端口、数据库索引和密码。
+
+```mermaid
+flowchart LR
+A[Redis配置] --> B[服务器信息]
+A --> C[连接池]
+A --> D[超时设置]
+B --> E[主机地址]
+B --> F[端口]
+B --> G[数据库索引]
+B --> H[密码]
+C --> I[最大活跃连接]
+C --> J[最大空闲连接]
+C --> K[最小空闲连接]
+D --> L[超时时间]
+```
+
+**Diagram sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L8-L19)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L2-L13)
+
+**Section sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L8-L19)
+- [application-dev1.yml](file://src/main/resources/application-dev1.yml#L8-L19)
+- [application-docker.yml](file://src/main/resources/application-docker.yml#L2-L13)
+- [application-prodNetIn.yml](file://src/main/resources/application-prodNetIn.yml#L2-L12)
+- [application-prodNetOut.yml](file://src/main/resources/application-prodNetOut.yml#L8-L19)
+
+### Elasticsearch配置
+Elasticsearch用于全文搜索和数据分析。系统通过`ElasticSearchClientConfig`类配置Elasticsearch客户端,使用`ES.config`属性指定Elasticsearch服务器地址。
+
+```mermaid
+flowchart LR
+A[Elasticsearch配置] --> B[服务器地址]
+A --> C[认证信息]
+A --> D[SSL配置]
+B --> E[主机]
+B --> F[端口]
+B --> G[协议]
+C --> H[用户名]
+C --> I[密码]
+D --> J[信任自签名证书]
+D --> K[禁用主机名验证]
+```
+
+**Diagram sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L74-L77)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L1-L50)
+
+**Section sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L74-L77)
+- [application-prodNetIn.yml](file://src/main/resources/application-prodNetIn.yml#L38-L41)
+- [application-prodNetOut.yml](file://src/main/resources/application-prodNetOut.yml#L74-L77)
+- [ElasticSearchClientConfig.java](file://src/main/java/cn/cslg/pas/common/config/ElasticSearchClientConfig.java#L1-L50)
+
+### 邮件服务器配置
+系统通过RabbitMQ实现异步邮件发送。邮件配置包括RabbitMQ服务器地址、交换机名称和路由键。
+
+```mermaid
+flowchart LR
+A[邮件配置] --> B[RabbitMQ]
+A --> C[邮件模板]
+B --> D[主机地址]
+B --> E[端口]
+B --> F[用户名]
+B --> G[密码]
+C --> H[交换机名称]
+C --> I[路由键]
+```
+
+**Diagram sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L2-L6)
+- [MailConstants.java](file://src/main/java/cn/cslg/pas/common/config/MailConstants.java#L1-L27)
+
+**Section sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L2-L6)
+- [application-prodNetOut.yml](file://src/main/resources/application-prodNetOut.yml#L2-L6)
+- [MailConstants.java](file://src/main/java/cn/cslg/pas/common/config/MailConstants.java#L1-L27)
+
+### SaToken安全配置
+SaToken用于系统身份认证和权限管理。虽然主配置文件中相关配置被注释,但系统通过`SaTokenConfigure`类进行安全配置。
+
+```mermaid
+flowchart LR
+A[SaToken配置] --> B[认证规则]
+A --> C[路由匹配]
+A --> D[错误处理]
+B --> E[登录检查]
+B --> F[权限检查]
+C --> G[包含路径]
+C --> H[排除路径]
+D --> I[未授权响应]
+```
+
+**Diagram sources**
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java#L1-L35)
+
+**Section sources**
+- [SaTokenConfigure.java](file://src/main/java/cn/cslg/pas/common/config/SaTokenConfigure.java#L1-L35)
+
+## JSON配置文件详解
+
+PAS系统使用JSON配置文件来定义前端表单字段、搜索条件和数据展示规则。这些配置文件位于`src/main/resources/jsons/`目录下,允许在不修改代码的情况下自定义系统行为。
+
+### 查新项目配置
+`noveltyProject.json`文件定义了查新项目相关的字段配置,包括字段名称、类型、数据库字段映射和搜索条件。
+
+```mermaid
+flowchart LR
+A[noveltyProject.json] --> B[字段定义]
+A --> C[搜索配置]
+A --> D[展示配置]
+B --> E[字段名称]
+B --> F[字段类型]
+B --> G[字段值]
+B --> H[数据库字段]
+C --> I[是否可搜索]
+C --> J[SQL生成类]
+C --> K[排序类]
+D --> L[是否显示]
+D --> M[默认隐藏]
+```
+
+**Diagram sources**
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+
+**Section sources**
+- [noveltyProject.json](file://src/main/resources/jsons/noveltyProject.json#L1-L398)
+
+### 专利配置
+`patent.json`文件定义了专利相关的字段配置,包括专利号、标题、申请人等字段的Elasticsearch查询配置。
+
+```mermaid
+flowchart LR
+A[patent.json] --> B[字段定义]
+A --> C[搜索配置]
+A --> D[展示配置]
+A --> E[导出配置]
+B --> F[字段名称]
+B --> G[字段类型]
+B --> H[字段值]
+B --> I[Elasticsearch字段]
+C --> J[是否可搜索]
+C --> K[Elasticsearch查询类]
+D --> L[是否显示]
+D --> M[默认隐藏]
+E --> N[是否可导出]
+E --> O[导出类]
+```
+
+**Diagram sources**
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L800)
+
+**Section sources**
+- [patent.json](file://src/main/resources/jsons/patent.json#L1-L800)
+
+### 上传设置配置
+`plugin/uploadSetting.json`文件定义了从不同数据源(如智慧芽、合享)导入专利数据时的字段映射规则。
+
+```mermaid
+flowchart LR
+A[uploadSetting.json] --> B[数据源]
+A --> C[字段映射]
+A --> D[数据处理]
+B --> E[源ID]
+B --> F[源名称]
+B --> G[显示名称]
+C --> H[设置名称]
+C --> I[目标字段]
+C --> J[分隔符]
+D --> K[处理器类]
+D --> L[JAR路径]
+```
+
+**Diagram sources**
+- [uploadSetting.json](file://plugin/uploadSetting.json#L1-L800)
+
+**Section sources**
+- [uploadSetting.json](file://plugin/uploadSetting.json#L1-L800)
+
+## 配置最佳实践
+
+### 敏感信息管理
+系统中的敏感信息如数据库密码、Redis密码等应通过环境变量或配置中心管理,避免在配置文件中明文存储。
+
+```mermaid
+flowchart LR
+A[敏感信息管理] --> B[环境变量]
+A --> C[配置中心]
+A --> D[加密存储]
+B --> E[运行时注入]
+C --> F[动态获取]
+D --> G[解密使用]
+```
+
+**Section sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L12-L13)
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L23-L24)
+
+### 环境配置切换
+通过修改`application.yml`中的`spring.profiles.active`属性,可以轻松切换不同环境的配置。建议为每个环境创建独立的配置文件,避免配置冲突。
+
+```mermaid
+flowchart LR
+A[环境切换] --> B[开发环境]
+A --> C[测试环境]
+A --> D[生产环境]
+B --> E[application-dev.yml]
+B --> F[application-dev1.yml]
+C --> G[application-testNetIn.yml]
+C --> H[application-testNetOut.yml]
+D --> I[application-prodNetIn.yml]
+D --> J[application-prodNetOut.yml]
+```
+
+**Section sources**
+- [application.yml](file://src/main/resources/application.yml#L22-L23)
+
+### 配置热更新
+系统支持部分配置的热更新,无需重启服务即可生效。对于不支持热更新的配置,建议在低峰期进行更新,并做好回滚准备。
+
+```mermaid
+flowchart LR
+A[配置热更新] --> B[支持热更新]
+A --> C[不支持热更新]
+B --> D[Redis配置]
+B --> E[邮件配置]
+C --> F[数据库配置]
+C --> G[Elasticsearch配置]
+C --> H[服务器端口]
+```
+
+**Section sources**
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L8-L19)
+- [application-dev.yml](file://src/main/resources/application-dev.yml#L2-L6)

File diff suppressed because it is too large
+ 249 - 0
.qoder/repowiki/zh/content/项目概述.md


+ 0 - 0
.qoder/repowiki/zh/meta/repowiki-metadata.json


Some files were not shown because too many files changed in this diff