更新 knowledge.md

放开自定义字段的实现位置
This commit is contained in:
oyo
2025-10-22 15:03:30 +08:00
parent a5e38099c6
commit 57c4fcc6bc

View File

@@ -260,7 +260,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内部所有继承字段和扩展字段数据。自定义字段数据获取不自动生成要在TOCO生成代码基础上编写额外代码实现实现时要注意代码的复用性以及避免N+1问题
- **公开性:** DTO可设置公开性DTO为公开时生成的预定义RPC方法也为公开RPC可被其他模块订阅调用DTO为非公开时生成的预定义RPC方法也为非公开RPC其他模块不可见。
- **跨模块依赖:** 如DTO内引用其他模块DTO需订阅其他模块RPC方法getBy${PrimaryKey}、getBy${PrimaryKey}s、getBy${foreignKey}等用于获取对应DTO。
- **复杂嵌套DTO获取流程:** 获取DTO有2种方式都可直接获取复杂嵌套DTO数据
@@ -301,7 +301,7 @@ meeting_with_room_dto无uuid为待创建DTO。meeting_base_dto和meeting_room
- **例子:**
* 如UserDto、UserDtoManager、UserDtoConverter extends UserDtoBaseConverter、UserDtoService名称为${DtoName}Service内部包含getBy${PrimaryKey}、getBy${PrimaryKey}s等方法。如Dto为UserBaseDto则生成类名为UserBaseDtoService
- **修改建议:**
- 建议在Service与BaseConverter中扩展代码不建议修改结构定义文件和Manager文件。DTO的自定义字段不直接派生自Entity一般对应取数逻辑代码。涉及数据获取、计算和拼装批量处理性能最好代码位置必须放在BaseConverter中已自动生成的列表转换方法中批量取数组装如UserBaseDtoBaseConverter.convertUserToUserBaseDto(List<User>)或UserDtoBaseConverter.convertUserBaseDtoToUserDto(List<UserBaseDto>)
- 建议在Service与BaseConverter中扩展代码不建议修改结构定义文件和Manager文件。DTO的自定义字段不直接派生自Entity一般对应取数逻辑代码。涉及数据获取、计算和拼装实现时要注意代码的复用性以及避免N+1问题。
#### **2.7 视图对象 (VO)**
- **定义与用途:** VO基于BaseDTO或指定的其他DTO派生通过外键关系关联多个BaseDTO的数据结构。用于视图层与前端数据传输作为HTTP API返回值或读方案返回值。不能作为接口参数或RPC返回值。
@@ -496,8 +496,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即这两个方法已**自动**获取所有**继承字段**和**扩展字段**数据。这2种方法代码生成在VO对应Converter类中。
- **字段数据获取:** 继承自DTO的字段及扩展字段TOCO在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
@@ -530,7 +530,7 @@ TOCO中判断使用方式的步骤
* **例子:**
* 如UserDetailVo、UserDetailVoConverter含convertToUserDetailVo、convertToUserDetailVoList、convertToUserDetailVoMap、convertAndAssembleData、convertAndAssembleDataList方法
- **修改建议:**
- 建议在Converter中扩展代码不建议修改结构定义文件。VO的**自定义字段**不直接派生自DTO一般对应取数逻辑代码。涉及数据获取、计算和拼装时批量处理性能最好,自定义字段对应代码位置**必须**放在Converter的**Map**基础转换方法convertTo${VoName}Map中批量取数组装如UserVoConverter.convertToUserVoMap
- 建议在Converter中扩展代码不建议修改结构定义文件。VO的**自定义字段**不直接派生自DTO一般对应取数逻辑代码。涉及数据获取、计算和拼装时要注意代码的复用性以及避免N+1问题。
#### **2.8 查询对象(WO)**
- **定义与用途:** WO基于Entity通过外键关系关联多个Entity的数据结构。WO表达数据取数拼装逻辑符合外键关系。WO作为ReadPlan查询上下文创建ReadPlan前需先创建WO对象。理解ReadPlan语义时需要WO作为上下文。
@@ -1024,7 +1024,7 @@ meeting_with_room_and_agenda_wo示例
- 字段选择:
- 按需选择字段
- 当CREATE操作的时候如果主键不又入参指定不勾选主键字段主键字段的值由框架分配如果勾选了主键但是不传递参数值会造成运行时异常
- 自定义字段除了来自实体的字段外还可以添加自定字段对生成物Bto对象进行扩展
- 自定义字段:除了来自实体的字段外,还可以添加自定字段对生成物Bto对象进行扩展
- **写方案设计元素表达:**
```json
{