更新 knowledge-design.md

This commit is contained in:
oyo
2025-08-28 15:22:43 +08:00
parent b54b3149a2
commit e9a6bc4d7e

View File

@@ -198,7 +198,7 @@ DateTime endTime; //结束时间
meeting_with_room_dto无uuid为待创建DTO。meeting_base_dto和meeting_room_with_meetings_dto为已存在DTO带uuid。
- **预定义方法:** 每个DTO基于根Entity的唯一索引自动生成预定义RPC方法及实现预定义方法获取根Entity数据通过RPC自动获取所有扩展字段数据并拼装。如实体user有唯一索引username则为UserDto生成UserDto UserDtoService.getByUserName(String userName)和List<UserDto> UserDtoService.getByUserNames(List<String> userNames)。预定义方法内部基于外键关系自动生成复杂DTO数据的递归、Join拼装能力直接返回DTO内部所有继承字段和扩展字段数据。自定义字段数据获取不自动生成需在对应convert方法中编写代码。
- **预定义方法:** 每个DTO基于根Entity的唯一索引自动生成预定义RPC方法及实现预定义方法获取根Entity数据通过RPC自动获取所有扩展字段数据并拼装。如实体user有唯一索引username则为UserDto生成UserDto UserDtoService.getByUserName(String userName)和List<UserDto> UserDtoService.getByUserNames(List<String> userNames)。预定义方法内部基于外键关系自动生成复杂DTO数据的递归、Join拼装能力直接返回DTO内部所有继承字段和扩展字段数据。
- **公开性:** DTO可设置公开性DTO为公开时生成的预定义RPC方法也为公开RPC可被其他模块订阅调用DTO为非公开时生成的预定义RPC方法也为非公开RPC其他模块不可见。
- **跨模块依赖:** 如DTO内引用其他模块DTO需订阅其他模块RPC方法getBy${PrimaryKey}、getBy${PrimaryKey}s、getBy${foreignKey}等用于获取对应DTO。
- **复杂嵌套DTO获取流程:** 获取DTO有2种方式都可直接获取复杂嵌套DTO数据
@@ -209,7 +209,7 @@ meeting_with_room_dto无uuid为待创建DTO。meeting_base_dto和meeting_room
- a. 查询DTO条件为主键或唯一索引的值或列表使用第1种方式
- b. 通过其他复杂查询条件采用第2种方式
判断使用方式时,只能根据查询条件判断是否使用读方案,禁止使用返回值是否需要数据拼装来判断!如现实代码和TOCO定义有冲突只能使用TOCO定义
判断使用方式时,只能根据查询条件判断是否使用读方案,禁止使用返回值是否需要数据拼装来判断!
#### **2.7 视图对象 (VO)**
- **定义与用途:** VO基于BaseDTO或指定的其他DTO派生通过外键关系关联多个BaseDTO的数据结构。用于视图层与前端数据传输作为HTTP API返回值或读方案返回值。不能作为接口参数或RPC返回值。
@@ -402,8 +402,8 @@ meeting_with_room_dto无uuid为待创建DTO。meeting_base_dto和meeting_room
meeting_with_room_vo为根VO无uuid为待创建根VO。meeting_room_with_meetings_vo和meeting_base_vo为meeting_with_room_vo的子VO无法被其他根VO引用无uuid。注意metting_with_room_vo的extendFieldList中create_user结构含vo因为派生源meeting_detail_dto中create_user字段为user_base_dto类型所以metting_with_room_vo中该继承字段类型需变为由user_base_dto派生出的VO结构注意metting_with_room_vo中create_user对应的user_base_vo**必须派生自**DTO字段的user_base_dto类型。
- **派生源默认使用BaseDTO:** 除非用户指定VO的派生源DTO否则创建VO时只可用**BaseDTO**为派生源。
- **与DTO的转换关系:** 创建**有派生源**的VO后TOCO生成代码时自动生成2种convert方法1.基础convert方法从DTO转换为VO仅转换结构及基本类型字段的get/set方法命名为convertTo${VoName}、convertTo${VoName}List、convertTo${VoName}Map其中**Map转换方法**为底层批量方法通常是自定义字段逻辑编写位置复用性好被其他convert方法调用单个和列表convert方法都通过**调用Map方法**实现2.带数据拼装逻辑的convert方法内部**自动**调用基础convert方法从DTO转换为VO并设置基本类型字段数据然后根据外键**自动**获取**扩展字段**数据拼装最终数据方法命名为convertAndAssembleData、convertAndAssembleDataList即这两个方法已**自动**获取所有**继承字段**和**扩展字段**数据。这2种方法代码生成在VO对应Converter类中。
- **字段数据获取:** 继承自DTO的字段及扩展字段TOCO在convert方法中自动生成数据获取代码,无需手动实现获取和拼装逻辑。自定义字段则**必须**在最底层convertTo${VoName}Map方法中实现对应获取和拼装逻辑便于其他convert方法**复用**这段逻辑。**禁止**在其他convert方法中实现自定义字段逻辑会导致某些场景下数据拼装不完整。
- **与DTO的转换关系:** 创建**有派生源**的VO后TOCO生成代码时自动生成2种convert方法1.基础convert方法从DTO转换为VO仅转换结构及基本类型字段的get/set方法命名为convertTo${VoName}、convertTo${VoName}List、convertTo${VoName}Map其中**Map转换方法**为底层批量方法通常是自定义字段逻辑编写位置复用性好被其他convert方法调用单个和列表convert方法都通过**调用Map方法**实现2.带数据拼装逻辑的convert方法内部**自动**调用基础convert方法从DTO转换为VO并设置基本类型字段数据然后根据外键**自动**获取**扩展字段**数据拼装最终数据方法命名为convertAndAssembleData、convertAndAssembleDataList即这两个方法已**自动**获取所有**继承字段**和**扩展字段**数据。
- **字段数据获取:** 继承自DTO的字段及扩展字段TOCO在convert方法中自动组装数据,无需手动实现获取和拼装逻辑。自定义字段则需要在coding阶段实现对应获取和拼装逻辑便于其他convert方法**复用**这段逻辑。**禁止**在其他convert方法中实现自定义字段逻辑会导致某些场景下数据拼装不完整。
- **跨模块依赖:** VO内存在由其他模块DTO派生出的子VO需订阅其他模块RPC(getBy${PrimaryKey},getBy${PrimaryKey}s,getBy${ForeignKey}s等)方法获取对应DTO再转换为子VO。
- **复杂嵌套VO获取流程:** 获取VO通常有3种方式3种方式都可直接获取复杂嵌套VO数据
- 第1种先通过预定义方法获取VO派生源BaseDTO再通过convertAndAssembleData或convertAndAssembleDataList方法转换成VO
@@ -415,7 +415,7 @@ TOCO中判断使用方式的步骤
- b. 通过其他复杂查询条件可采用第2种或第3种方式
- c. 用户上下文中有指定返回DTO的读方案符合条件使用第2种否则使用第3种
注意判断使用方式时,只能根据查询条件判断是否使用读方案,绝对禁止使用返回值是否需要数据拼装来判断!**现实代码编写方式和TOCO步骤冲突时只能使用TOCO定义**
注意判断使用方式时,只能根据查询条件判断是否使用读方案,绝对禁止使用返回值是否需要数据拼装来判断!
#### **2.8 查询对象(WO)**
- **定义与用途:** WO基于Entity通过外键关系关联多个Entity的数据结构。WO表达数据取数拼装逻辑符合外键关系。WO作为ReadPlan查询上下文创建ReadPlan前需先创建WO对象。理解ReadPlan语义时需要WO作为上下文。
@@ -579,7 +579,7 @@ meeting_with_room_and_agenda_wo示例
- 需求超出读方案能力时,必须使用自定义查询
- **特别注意** 根据主键获取单个或批量DTO/VO且不需过滤列表字段数据的需求必须使用DTO自动生成的预定义方法禁止使用读方案
- **关键配置:** 名称(小写字母+下划线不以read_plan结尾全局唯一)、返回结构(DTO/VO一个读方案只能返回一种类型)、查询条件自然语言描述、是否生成计数方法、排序字段、过滤字段及过滤条件
- **与RPC、代码的关系:** 返回DTO的读方案自动生成RPC方法参数为QTO返回值为DTO列表返回VO的读方案自动生成Java方法参数为QTO返回值为VO列表方法内部逻辑由TOCO完全实现
- **与RPC的关系:** 返回DTO的读方案自动生成RPC方法参数为QTO返回值为DTO列表返回VO的读方案自动生成Java方法参数为QTO返回值为VO列表方法内部逻辑由TOCO完全实现
- **生成的读方案RPC使用:** 读方案RPC属于对应模块其他模块需先订阅该RPC用adapter调用当前模块直接调用对应Service
- **创建方式:** 先创建或选择一种DTO或VO作为返回值类型然后定义查询条件自然语言描述、分页方式、是否生成计数方法、排序字段等
- **排序** 支持两种方式:
@@ -959,7 +959,7 @@ class CreateUserBto { //对应实体user
- **优先复用:** 用户需要创建RPC时有明确要求按要求创建。无明确要求时先判断能否通过读方案、写方案、DTO自动创建RPC最后考虑自定义RPC
- **自定义RPC和手写方法关系:** 两者都可手动实现服务层方法。区别需要被其他模块订阅用自定义RPC只是API私有调用不需要外部开放用手写方法
- **关键配置:** 类名(驼峰首字母大写以Service结尾)、是否公开、方法名(驼峰,首字母小写)、请求参数、返回值。分页查询参数为Qto类型时Qto已包含from、size、scrollId属性无需额外参数
- **TOCO中RPC存储:** RPC在TOCO中只存储方法签名不存储执行逻辑。了解实现逻辑需阅读RPC对应代码
- **TOCO中RPC存储:** RPC在TOCO中只存储方法签名不存储执行逻辑。
- **参数类型:** RPC参数**只能**为QTO、BTO、Enum、基本类型可为单值或列表。对象类型优先用QTO、BTO**禁用**VO和自定义结构如Object
- **返回值类型:** RPC返回值**只能**为DTO、Enum、基本类型可为单值或列表**禁用**VO、QTO、BTO、自定义结构如Object。对象类型优先用DTO
- **TOCO中json结构:** TOCO中DTO用json表示示例
@@ -986,7 +986,7 @@ class CreateUserBto { //对应实体user
#### **2.14 应用程序接口 (API)**
- **定义与用途:** API定义对外HTTP接口
- **创建方式:** 通过TOCO创建需指定参数和返回值
- **存储特点:** TOCO只存储URI和方法签名不存储执行逻辑。了解实现需阅读对应代码
- **存储特点:** TOCO只存储URI和方法签名不存储执行逻辑。
- **关键配置:** uri(/api/${moduleName}/xxx如/api/user/create全局唯一)、类名(以Controller结尾)、方法名(驼峰小写)、请求参数、返回值。分页查询参数为Qto时已包含from、size、scrollId属性无需额外参数
- **参数类型:** 只能为QTO、BTO、EO、Enum、基本类型可为单值或列表。对象类型优先用QTO、BTO。禁用DTO和自定义结构
- **返回值类型:** 脚手架自动包装返回值(code、message、data)。只能为VO、Enum、基本类型可为单值或列表。禁用DTO、QTO、BTO、自定义结构。对象类型优先用VO
@@ -1019,7 +1019,7 @@ class CreateUserBto { //对应实体user
关键字段requestParams为请求参数列表response为返回结构。参数和response结构相同name为参数名type为参数类型(Boolean,String,Integer,Long,Float,Double,BigDecimal,Date,ByteArray,Enum,Eo,List,PageResult,Vo,Qto,Bto,Void参数不能为Void和PageResult无返回值设为Void分页结果设为PageResult且innerType必为Vo对应VSQueryResult<XxxVo>)description为描述typeUuid为类结构UUID(type为Enum、Eo、Vo时传入对象uuidQto时传入读方案uuidBto时传入写方案uuid)innerType为List内部类型(type为List时包含)innerUuid为List或PageResult内部类结构UUID(type为List或PageResult且innerType为Enum、Eo、Vo时传入对象uuidinnerType为Qto时传入读方案uuidBto时传入写方案uuid)
#### **2.15 流程服务FunctionFlow)**
- **定义与用途:** TOCO将复杂业务拆解为流程节点基于业务逻辑内聚性合并功能构建工作流式逻辑流程提升代码可维护性。内嵌流程引擎执行生成代码。
- **定义与用途:** TOCO将复杂业务拆解为流程节点基于业务逻辑内聚性合并功能构建工作流式逻辑流程提升可维护性。
- **使用场景:**
- API/RPC涉及写服务超过3个时**必须**使用
- 用户要求使用时
@@ -1126,7 +1126,7 @@ class CreateUserBto { //对应实体user
- 读方案无法满足需求时,使用自定义查询
- 自定义查询使用复杂sql实现业务功能
- 数据访问层使用MyBatis、MyBatisPlus实现
- 自定义查询时框架不自动生成代码(需要手动编写全部代码)
- 自定义查询时框架不自动生成代码(需要在coding阶段手动编写)
### 3. TOCO 最佳实践