本文档引用的文件
本文档详细阐述了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
项目查询使用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
查新项目管理的核心业务流程包括创建、更新和删除三个主要操作,均由NoveltyProjectController和NoveltyProjectService协同完成。
项目创建流程通过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
Section sources
项目更新流程与创建流程类似,但主要操作是更新现有记录。
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
Section sources
项目删除是一个级联操作,会同时删除关联的技术方案和文件。
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
Section sources
查新项目与技术方案之间存在一对一的关联关系,这种关系通过级联操作进行管理。
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
当删除查新项目时,系统会执行以下级联删除操作:
novelty_project表中的记录project_id查询technical_case表asso_technical_case_file)project表中的主记录此逻辑确保了数据的一致性和完整性,避免了孤儿记录的产生。
Section sources
项目查询机制采用了灵活的查询模式,支持通过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
系统通过StringRequest类实现灵活的查询机制,该类继承自QueryRequest并添加了searchQuery字段。
classDiagram
class QueryRequest {
+Long current
+Long size
+String sort
+String order
}
class StringRequest {
+String searchQuery
}
QueryRequest <|-- StringRequest
Diagram sources
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
Section sources
系统实现了完善的权限控制和租户隔离机制,确保数据的安全性和多租户环境下的数据隔离。
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
租户隔离主要通过在查询条件中添加租户ID来实现。系统根据用户的角色类型应用不同的查询权限:
// 权限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
本节提供查新项目管理中常见问题的解决方案和调试建议。
问题现象: 调用deleteNoveltyProject接口返回错误,提示删除失败。
可能原因:
解决方案:
projectIdNoveltyProjectService.deleteNoveltyProject方法中的级联删除逻辑调试建议:
NoveltyProjectService.java的deleteNoveltyProject方法中添加日志,跟踪执行流程technicalCaseMapper和projectMapper的查询结果问题现象: 调用updateNoveltyProject接口成功,但数据库中的数据未更新。
可能原因:
updateById方法未正确执行解决方案:
NoveltyProject实体的ID已正确设置LambdaQueryWrapper的查询条件是否正确@Transactional的配置调试建议:
NoveltyProjectService.java的updateNoveltyProject方法中添加日志,输出noveltyProject对象的IDXiaoShiException异常的捕获和处理Section sources