|
|
@@ -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)
|