From 57c4fcc6bcbdcb6bbf7e3c35838b6504d4d668eb Mon Sep 17 00:00:00 2001 From: oyo Date: Wed, 22 Oct 2025 15:03:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20knowledge.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 放开自定义字段的实现位置 --- knowledge.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/knowledge.md b/knowledge.md index 5629403..311667f 100644 --- a/knowledge.md +++ b/knowledge.md @@ -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 UserDtoService.getByUserNames(List userNames)。预定义方法内部基于外键关系自动生成复杂DTO数据的递归、Join拼装能力,直接返回DTO内部所有继承字段和扩展字段数据。自定义字段数据获取不自动生成,需在对应convert方法中编写代码。 +- **预定义方法:** 每个DTO基于根Entity的唯一索引自动生成预定义RPC方法及实现,预定义方法获取根Entity数据,通过RPC自动获取所有扩展字段数据并拼装。如实体user有唯一索引username,则为UserDto生成UserDto UserDtoService.getByUserName(String userName)和List UserDtoService.getByUserNames(List 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)或UserDtoBaseConverter.convertUserBaseDtoToUserDto(List) + - 建议在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 {