查新项目管理.md 18 KB

查新项目管理

本文档引用的文件

  • NoveltyProjectController.java
  • NoveltyProjectService.java
  • AddNoveltyProjectDTO.java
  • QueryNoveltyProjectDTO.java
  • NoveltyProjectMapper.java
  • StringRequest.java
  • BusinessFactory.java
  • TechnicalCase.java
  • TechnicalCaseService.java

目录

  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

项目查询数据结构

项目查询使用QueryNoveltyProjectDTO类,该类继承了分页和筛选功能。

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

核心业务流程

查新项目管理的核心业务流程包括创建、更新和删除三个主要操作,均由NoveltyProjectControllerNoveltyProjectService协同完成。

项目创建流程 (addNoveltyProject)

项目创建流程通过addNoveltyProject接口实现,其业务逻辑如下:

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
  • NoveltyProjectService.java

Section sources

  • NoveltyProjectController.java
  • NoveltyProjectService.java

项目更新流程 (updateNoveltyProject)

项目更新流程与创建流程类似,但主要操作是更新现有记录。

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
  • NoveltyProjectService.java

Section sources

  • NoveltyProjectController.java
  • NoveltyProjectService.java

项目删除流程 (deleteNoveltyProject)

项目删除是一个级联操作,会同时删除关联的技术方案和文件。

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
  • NoveltyProjectService.java

Section sources

  • NoveltyProjectController.java
  • NoveltyProjectService.java

项目与技术方案关联

查新项目与技术方案之间存在一对一的关联关系,这种关系通过级联操作进行管理。

关联关系模型

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
  • Project.java
  • TechnicalCase.java
  • AssoTechnicalCaseFile.java

级联删除逻辑

当删除查新项目时,系统会执行以下级联删除操作:

  1. 首先删除novelty_project表中的记录
  2. 然后根据project_id查询technical_case
  3. 如果存在关联的技术方案,则删除该技术方案
  4. 在删除技术方案前,先删除其所有关联的文件记录(asso_technical_case_file
  5. 最后删除project表中的主记录

此逻辑确保了数据的一致性和完整性,避免了孤儿记录的产生。

Section sources

  • NoveltyProjectService.java

项目查询机制

项目查询机制采用了灵活的查询模式,支持通过StringRequest进行动态查询,并利用BusinessFactory进行服务调用。

查询流程分析

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
  • NoveltyProjectService.java
  • NoveltyProjectMapper.java

StringRequest查询实现

系统通过StringRequest类实现灵活的查询机制,该类继承自QueryRequest并添加了searchQuery字段。

classDiagram
class QueryRequest {
+Long current
+Long size
+String sort
+String order
}
class StringRequest {
+String searchQuery
}
QueryRequest <|-- StringRequest

Diagram sources

  • StringRequest.java
  • QueryRequest.java

BusinessFactory服务调用

BusinessFactory是系统中的一个核心工厂类,用于获取业务服务的实例。

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
  • Business.java

Section sources

  • NoveltyProjectController.java
  • BusinessFactory.java

权限控制与租户隔离

系统实现了完善的权限控制和租户隔离机制,确保数据的安全性和多租户环境下的数据隔离。

权限控制流程

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

租户隔离实现

租户隔离主要通过在查询条件中添加租户ID来实现。系统根据用户的角色类型应用不同的查询权限:

  • 普通用户 (roleType=0): 只能访问自己创建或负责的项目
  • 管理员 (roleType=2): 可以访问整个租户下的所有项目
// 权限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

常见问题与调试建议

本节提供查新项目管理中常见问题的解决方案和调试建议。

项目删除失败

问题现象: 调用deleteNoveltyProject接口返回错误,提示删除失败。

可能原因:

  1. 项目ID为空
  2. 数据库外键约束阻止删除
  3. 权限不足

解决方案:

  1. 确保请求中包含有效的projectId
  2. 检查NoveltyProjectService.deleteNoveltyProject方法中的级联删除逻辑
  3. 确认当前用户有删除该项目的权限

调试建议:

  • NoveltyProjectService.javadeleteNoveltyProject方法中添加日志,跟踪执行流程
  • 检查数据库事务是否正确提交
  • 验证technicalCaseMapperprojectMapper的查询结果

项目更新无效

问题现象: 调用updateNoveltyProject接口成功,但数据库中的数据未更新。

可能原因:

  1. 实体对象未正确设置ID
  2. updateById方法未正确执行
  3. 事务回滚

解决方案:

  1. 确保NoveltyProject实体的ID已正确设置
  2. 检查LambdaQueryWrapper的查询条件是否正确
  3. 验证事务注解@Transactional的配置

调试建议:

  • NoveltyProjectService.javaupdateNoveltyProject方法中添加日志,输出noveltyProject对象的ID
  • 使用数据库监控工具查看实际执行的SQL语句
  • 检查XiaoShiException异常的捕获和处理

Section sources

  • NoveltyProjectService.java
  • NoveltyProjectService.java