更新 llms-full.txt

This commit is contained in:
ycl
2025-08-14 11:07:23 +08:00
parent 337ba0ea99
commit 73ccf32447

View File

@@ -38,7 +38,7 @@
* **生成产物**在common模块中生成一个Java类
* **职责:** 表达Enum的数据结构
* **命名规则**类名以Enum结尾
* **类路径:** 位于 ```**.common.enums``` 包路径下
* **类路径:** 位于 <code>**.common.enums</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Enum在TOCO中的uuid}|ENUM|DEFINITION
- **生成代码:** Enum会在common层生成Enum文件如StatusEnum
- **修改建议:** 不建议修改
@@ -78,7 +78,7 @@
* **生成产物**在persist层生成结构定义类文如AddressEo
* **职责:** 表达POJO数据结构
* **命名规则**类名以Eo结尾
* **类路径:** 位于 ```**.persist.eo``` 包路径下
* **类路径:** 位于 <code>**.persist.eo</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Eo在TOCO中的uuid}|EO|DEFINITION
- **修改建议:** 不建议修改
#### **2.4 实体关系 (ER / Entity)**
@@ -89,25 +89,25 @@
- 结构定义
* **生成产物**Java类按照Mybatis-plus的要求生成
* **职责:** 按照Mybatis-plus的要求生成结构定义类文件
* **类路径:** 位于 ```**.persist.dos``` 包路径下
* **类路径:** 位于 <code>**.persist.dos</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Entity在TOCO中的uuid}|ENTITY|DEFINITION
- Mapper
* **生成产物**在persist层生成Mybatis-plus的Mapper类
* **职责:** 提供Mapper给Mybatis-plus框架
* **命名规则**类名以Mapper结尾(${entityName}Mapper)
* **类路径:** 位于 ```**.persist.mapper.mybatis``` 包路径下
* **类路径:** 位于 <code>**.persist.mapper.mybatis</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Eo在TOCO中的uuid}
- Dao接口
* **生成产物**在persist层生成Dao接口
* **职责:** 提供Entity数据的查询接口为service层提供数据访问入口
* **命名规则**类名以Dao结尾(${entityName}Dao)
* **类路径:** 位于 ```**.persist.mapper``` 包路径下
* **类路径:** 位于<code>**.persist.mapper</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Entity在TOCO中的uuid}|ENTITY|IDAO
- Dao实现
* **生成产物**在persist层生成Dao接口的实现类文件
* **职责:** 通过调用Mapper实现实现Dao接口
* **命名规则**类名以DaoImpl结尾(${entityName}DaoImpl)
* **类路径:** 位于 ```**.persist.mapper``` 包路径下
* **类路径:** 位于 <code>**.persist.mapper</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Entity在TOCO中的uuid}|ENTITY|DAO
- **修改建议:** 不建议修改
#### **2.5 聚合对象 (BO/业务对象)**
@@ -123,14 +123,14 @@
* **生成产物**在Manager层生成聚合对象类文件符合Hibernate的标准
* **职责:** 定义聚合对象,多个聚合对象组合成层级结构实现充血模型,支持写链路上的数据变更,监听数据变更,支持数据校验
* **命名规则**类名以BO结尾(${entityName}BO)
* **类路径:** 位于 ```**.manager.bo``` 包路径下
* **类路径:** 位于 <code>**.manager.bo</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Entity在TOCO中的uuid}|BO|DEFINITION
- **修改建议:** 建议修改BO中的validateAggregate或valid方法。不建议修改检验方法以外的其他代码如果发现需求中有业务不变性校验**注意** 上述的校验方法,在写方案内部由框架触发调用,而不是业务代码显式调用
- BaseBO
* **生成产物**对于存在子BO的聚合对象封装不变的代码部分
* **职责:** 定义聚合对象,多个聚合对象组合成层级结构实现充血模型,支持写链路上的数据变更,监听数据变更,支持数据校验
* **命名规则**类名以BO结尾(${entityName}BO)
* **类路径:** 位于 ```**.manager.bo``` 包路径下
* **类路径:** 位于<code>**.manager.bo</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定 ,uuid规则: ${Entity在TOCO中的uuid}|BO|DEFINITION
- **修改建议:** 建议修改BO中的validateAggregate或valid方法如果发现需求中有业务不变性校验;不建议修改检验方法以外的其他代码
#### **2.6 数据传输对象 (DTO)**
@@ -139,7 +139,7 @@
- **关键配置:** 名称(BaseDTO以BaseDto结尾其他DTO以Dto结尾,全局唯一)、根Entity、字段列表。DTO中的字段分为三种a.继承Entity或BaseDTO的字段和Entity及BaseDTO的字段类型一样b.扩展字段含正向替换和反向注入字段类型为DTO或List<DTO>;c.自定义字段类型为基本类型、Eo、Enum、DTO类型。BaseDTO中一般包含Entity的全部字段,DTO中一般包含BaseDTO中的全部字段不进行字段裁剪可以根据外键关系扩展其他Entity(详见**字段扩展方式**)在明确无法扩展外部Entity的情况下可增加对应的自定义字段。
- **字段扩展方式:**TOCO定义了一个DTO组装方法适用于DTO通过外键关系替换/注入对应Entity的信息对象化表达有外键关系的Entity信息。只要存在外键关系且满足以下条件即可扩展a.对于正向替换当前实体存在指向其他实体的外键字段b.对于反向注入:其他实体存在指向当前实体的外键字段。
例如有两个Entity
```
<code>
MeetingRoom{ //会议室
Long id;// 会议室id,主键
String name;// 会议室名称
@@ -152,12 +152,12 @@ String title; //会议标题
DateTime startTime //会议开始时间
DateTime endTime //会议结束时间
}
```
</code>
其中Meeting和MeetingRoom是n:1关系。即多个会议室会占用同一个会议室。
当组装对象以某Entity为根时那么首先它将拥有和该Entity一样的数据结构并将通过下面的“正向替换”“反向注入”的行为递归的将多个互相之间有外键关系的Entity的信息组装到该组装对象中。
定义“正向替换”这个行为,选定一个表,这张表存在到另外一张表的一个或多个外键。选择和需求相关的具体的外键属性,将该外键属性替换为另一张表为根的组装对象。这样就可以获取基于某些外键且包含另一张表更详细的属性数据。
例如需要会议和其占用会议室时将Meeting表中的roomid外键替换为以MeetingRoom为根的组装对象而backupRoomid对应的候选会议室具体信息和本需求无关不做任何替换。如下
```
<code>
MeetingWithRoomDto {
Long id;// 会议id
MeetingRoomDto room { //正向替换该会议用的会议室信息,是一个以会议室为根的对象
@@ -169,11 +169,11 @@ String title; //会议标题
DateTime startTime //会议开始时间
DateTime endTime //会议结束时间
}
```
</code>
又例如需要会议和其候选会议室时将Meeting表中的backupRoomid进行正向替换。
又例如需要会议且即需要其占用会议室也需要候选会议室时将Meeting表中的roomidbackupRoomid都进行正向替换。
同时TOCO还定义了“反向注入”这个行为选定一个表如果有另外的表到前表有外键选择和需求相关的具体的外键属性在选定表中增加一个以另外表为根的组合对象(当外键关系是1:1时)或者组合对象的列表(当外键关系是n:1时)。需求是“获取会议室和占用它的会议信息”需要选定MeetingRoom那么基于另外的表Meeting中存在字段roomid为到MeetingRoom的n:1关系外键。可以将List<MeetingBaseDto>反向注入到MeetingRoom中最终生成一个以Meeting为根的组装对象生成
```
<code>
MeetingRoomWithMeetingDto {
Long id;// 会议室id
String name;// 会议室名称
@@ -184,11 +184,11 @@ DateTime startTime //会议开始时间
DateTime endTime //会议结束时间
}
}
```
</code>
这种“正向替换”和“反向注入”可以按需递归调用去将多个互相之间有外键关系的对象组装成最终对象。例如还有另外一张表MeetingAgenda到Meeting有n:1的外键和另外一张表AgendaAttendance到MeetingAgenda有n:1外键。那么如果我要去组装以Meeting开始包含MeetingRoom, MeetingAgenda, AgendaAttendance的组装对象首先发现MeetingRoom是可以正向扩展到Meeting的反向注入MeetingAgenda而AgendaAttendance需要先反向注入到MeetingAgenda中。
- **TOCO中DTO的json结构描述:** 在TOCO中DTO使用一个json结构表示该结构可用于理解DTO的含义或作为创建、更新DTO工具的参数。部分字段的含义为dto的uuid为唯一标识如果需要创建DTO则设置为null如果需要复用则填入其uuid。expandList为正向替换reverseExpandList为反向注入customFieldList为自定义字段。expandListList中foreignKeyInThisEntity为正向替换对应的本表外键字段的名字dtoFieldName为正向替换之后给该字段的起的新名字reverseExpandList中foreignKeyInOtherEntity为反向注入对应的他表外键字段的名字dtoFieldName为反向注入之后给该字段的起的新名字customFieldList中uuid为自定义字段特有的UUID创建DTO的时候不需要填入因为TOCO会自动为其分配UUID更新DTO的时候需要传入用于定位需要更新的自定义字段typeUuid参数对应类结构的UUID当type为Enum、Eo时包含该字段innerType为List内部类型当type为List时包含该字段innerUuid为List内部类结构的UUID当type为List且innerType=Enum、Eo时包含该字段。示例如下
- meeting_with_room_dto
```json
<code>
{
"dto": {
"uuid": null,
@@ -218,9 +218,9 @@ DateTime endTime //会议结束时间
]
}
}
```
</code>
- meeting_room_with_meetings_dto
```json
<code>
{
"dto": {
"uuid": "d05c7b3d-1c92-45a1-2113-a01b245813c1",
@@ -241,7 +241,7 @@ DateTime endTime //会议结束时间
]
}
}
```
</code>
示例中meeting_with_room_dto没有uuid为待创建的DTO。meeting_base_dto和meeting_room_with_meetings_dto为已存在的DTO带有uuid。
- **预定义方法:** 对于每一个DTOTOCO会自动其根Entity的唯一索引生成一些预定义的RPC方法及实现预定义方法不仅获取了根Entity的数据还通过RPC调用的方式**自动**获取了**所有扩展字段**的数据并对数据进行了拼装处理。如实体user有unique index(username)则会针对UserDto生成UserDto UserDtoService.getByUserName(String userName)和List<UserDto> UserDtoService.getByUserNames(List<String> userNames)。预定义方法内部根据外键关系自动生成了复杂DTO数据的递归、Join拼装的能力会直接返回DTO内部的所有继承字段和扩展字段的数据。注意自定义字段的数据获取不会自动生成需要在对应的convert方法中编写代码。
@@ -262,13 +262,13 @@ DateTime endTime //会议结束时间
* **职责:** 表达DTO的数据结构
* **命名规则**类名以Dto结尾
* **禁止** 修改该类
* **类路径:** 位于 ```**.manager.dto``` 包路径下
* **类路径:** 位于 <code>**.manager.dto</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${DTO在TOCO中的uuid}|DTO|DEFINITION
- **Manager**
* **生成产物:** Java接口以及实现类
* **命名规则:** 接口类名以Manager结尾、实现类名以ManagerImpl结尾(${DtoName}Manager)、基类以名ManagerBaseImpl结尾(${DtoName}ManagerImpl)
* **职责:** 提供了DTO数据的获取的接口包括根据id单个、id列表批量获取、以及根据DTO对应的实体的数据库索引获取
* **类路径:** 位于 ```**.manager``` 包路径下
* **类路径:** 位于<code>**.manager</code> 包路径下
* **禁止** 删除该类中的任何系统自动生成的函数
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${DTO在TOCO中的uuid}|DTO|MANAGER
- **Converter**
@@ -276,7 +276,7 @@ DateTime endTime //会议结束时间
* **禁止** 删除该类中的任何系统自动生成的函数
* **命名规则:** 实现类名以Converter结尾(${DtoName}Converter)、基类名以BaseConverter结尾(${DtoName}BaseConverter)
* **职责:** Entity转换到BaseDTO或则BaseDTO转化为普通DTO从Entity转为BaseDTO的方法命名为convert${EntityName}To${DtoName}从BaseDTO转换为DTO的方法命名为convert${BaseDtoName}To${DtoName}
* **类路径:** 位于 ```**.manager.converter``` 包路径下
* **类路径:** 位于 <code>**.manager.converter</code> 包路径下
* **唯一标识符位置:**
* 实现类Converter 其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${DTO在TOCO中的uuid}|DTO|CONVERTER
* 基类BaseConverter 其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${DTO在TOCO中的uuid}|DTO|BASE_CONVERTER
@@ -294,7 +294,7 @@ DateTime endTime //会议结束时间
- **根VO和子VO:**TOCO中的VO分为两种1.根VO指最外层的VO结构需要经由TOCO创建有uuid作为唯一标识根VO可被其他根VO或子VO引用2.子VO某个根VO的内部嵌套VO通过外键关系关联BaseDTO之后由TOCO自动创建只附属于某个根VO只能被这一个根VO引用且没有uuid。所以在TOCO中我们需要描述VO要的字段、扩展关系并通过**创建根VO**的行为使TOCO**自动创建**其子VO或引用其他根VO即可完成一个复杂嵌套VO的创建过程无需单独创建子VO。
- **字段扩展方式:**同DTO的字段扩展方式可以通过任意**一个**派生源BaseDTO即可经过外键扩展成为复杂嵌套VO。只要存在外键关系且满足以下条件即可扩展对于正向替换当前实体存在指向其他实体的外键字段对于反向注入其他实体存在指向当前实体的外键字段。
例如有两个BaseDTO
```
<code>
MeetingRoomBaseDto{ //会议室
Long id;// 会议室id,主键
String name;// 会议室名称
@@ -307,10 +307,10 @@ DateTime endTime //会议结束时间
DateTime startTime //会议开始时间
DateTime endTime //会议结束时间
}
```
</code>
其中Meeting和MeetingRoom是n:1关系。即多个会议室会占用同一个会议室。
通过“正向替换”这个行为可以组装出如下VO
```
<code>
MeetingWithRoomVo { //根VO需要通过TOCO创建
Long id;// 会议id
MeetingRoomVo room { //正向替换该会议用的会议室信息TOCO自动生成的内部VO派生自MeetingRoomBaseDto
@@ -322,9 +322,9 @@ DateTime endTime //会议结束时间
DateTime startTime //会议开始时间
DateTime endTime //会议结束时间
}
```
</code>
通过“反向注入”这个行为,可以生成:
```
<code>
MeetingRoomWithMeetingVo{
Long id;// 会议室id
String name;// 会议室名称
@@ -335,11 +335,11 @@ DateTime endTime //会议结束时间
DateTime endTime //会议结束时间
}
}
```
</code>
- **TOCO中VO的json结构描述:** 在TOCO中VO使用一个json结构表示该结构可用于理解VO的含义或作为创建、更新VO工具的参数。部分字段的含义为expandList为正向替换reverseExpandList为反向注入extendFieldList为来自派生源DTO的字段customFieldList为自定义字段。expandListList中foreignKeyInThisEntity为正向替换对应的本表外键字段的名字voFieldName为正向替换之后给该字段的起的新名字reverseExpandList中foreignKeyInOtherEntity为反向注入对应的他表外键字段的名字voFieldName为反向注入之后给该字段的起的新名字customFieldList中uuid为自定义字段特有的UUID创建DTO的时候不需要填入因为TOCO会自动为其分配UUID更新DTO的时候需要传入用于定位需要更新的自定义字段typeUuid参数对应类结构的UUID当type为List且innerType=Enum、Eo时会包含该字段extendFieldList中name为继承字段的名称如果要继承的DTO字段不是DTO类型则VO中的字段类型将与DTO字段一致如果DTO中的字段为DTO或List<DTO>类型由于VO中的字段类型不能为DTO**必须**将该DTO转换为VO才可作为VO字段使用所以extendFieldList中会有**一个vo结构**用来表示该字段DTO类型派生出的VO定义注意该VO字段中的VO类型必须派生自继承的DTO字段类型
示例如下:
系统中存在meeting_detail_dto
```json
<code>
{
"uuid": "cd55c96b-aa67-bfb2-7614-70b503a8f8bf",
"name": "meeting_detail_dto",
@@ -358,9 +358,9 @@ DateTime endTime //会议结束时间
}
]
}
```
</code>
- meeting_with_room_vo由meeting_detail_dto派生并继承了id和create_user字段
```json
<code>
{
"vo": {
"uuid": null,
@@ -471,7 +471,7 @@ DateTime endTime //会议结束时间
]
}
}
```
</code>
示例中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类型。
@@ -496,12 +496,12 @@ DateTime endTime //会议结束时间
* **生成产物:** 在controller层生成一个Java类
* **命名规则:** 类名以Vo结尾
* **职责:** 表达VO的数据结构
* **类路径:** 位于 ```**.entrance.web.vo``` 包路径下
* **类路径:** 位于 <code>**.entrance.web.vo</code> 包路径下
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${VO在TOCO中的uuid}|VO|DEFINITION
- **Converter**
* **生成产物:** 在controller层生成一个Java类(**有派生源**的VO才有Converter)和基类
* **命名规则:** 实现类名以Converter结尾(${VoName}Converter)基类名以BaseConverter结尾(${VoName}BaseConverter)
* **类路径:** 位于 ```**.entrance.web.converter``` 包路径下
* **类路径:** 位于 <code>**.entrance.web.converter</code> 包路径下
* **职责:** 把DTO转换成VOConverter中包含2种convert方法1.基础convert方法从DTO转换为VO仅转换结构方法命名为convertTo${VoName}、convertTo${VoName}List、convertTo${VoName}Map其中**Map转换方法**为底层批量方法单个和列表convert方法都通过**调用Map方法**来实现;2.带数据拼装逻辑的convert方法内部会调用基础convert方法从DTO转换为VO然后再根据外键获取拼装最终数据方法命名为convertAndAssembleData、convertAndAssembleDataList)
* **唯一标识符位置:**
* 实现类Converter其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${VO在TOCO中的uuid}|VO|CONVERTER
@@ -567,7 +567,7 @@ DateTime endTime //会议结束时间
- **关键配置:** Wo中的字段分为三种a.继承Entity的字段和Entity的字段类型一样b.扩展字段含正向替换和反向注入字段类型为WO或List<WO>;
- **字段扩展方式:** TOCO定义了一个WO组装方法适用于WO通过外键关系替换/注入对应Entity的信息对象化表达有外键关系的Entity信息。只要存在外键关系且满足以下条件即可扩展a.对于正向替换当前实体存在指向其他实体的外键字段b.对于反向注入:其他实体存在指向当前实体的外键字段。
例如有两个Entity
```
<code>
MeetingRoom{ //会议室
Long id;// 会议室id,主键
String name;// 会议室名称
@@ -580,12 +580,12 @@ DateTime endTime //会议结束时间
DateTime startTime; //会议开始时间
DateTime endTime; //会议结束时间
}
```
</code>
其中Meeting和MeetingRoom是n:1关系。即多个会议室会占用同一个会议室。
当组装对象以某Entity为根时那么首先它将拥有和该Entity一样的数据结构并将通过下面的“正向替换”“反向注入”的行为递归的将多个互相之间有外键关系的Entity的信息组装到该组装对象中。
定义“正向替换”这个行为,选定一个表,这张表存在到另外一张表的一个或多个外键。选择和需求相关的具体的外键属性,将该外键属性替换为另一张表为根的组装对象。这样就可以获取基于某些外键且包含另一张表更详细的属性数据。
例如需要会议和其占用会议室时将Meeting表中的roomid外键替换为以MeetingRoom为根的组装对象而backupRoomid对应的候选会议室具体信息和本需求无关不做任何替换。如下
```
<code>
MeetingWithRoomWo {
Long id;// 会议id
MeetingRoomWo room { //正向替换该会议用的会议室信息,是一个以会议室为根的对象
@@ -597,11 +597,11 @@ DateTime endTime //会议结束时间
DateTime startTime //会议开始时间
DateTime endTime //会议结束时间
}
```
</code>
又例如需要会议和其候选会议室时将Meeting表中的backupRoomid进行正向替换。
又例如需要会议且即需要其占用会议室也需要候选会议室时将Meeting表中的roomidbackupRoomid都进行正向替换。
同时TOCO还定义了“反向注入”这个行为选定一个表如果有另外的表到前表有外键选择和需求相关的具体的外键属性在选定表中增加一个以另外表为根的组合对象(当外键关系是1:1时)或者组合对象的列表(当外键关系是n:1时)。需求是“获取会议室和占用它的会议信息”需要选定MeetingRoom那么基于另外的表Meeting中存在字段roomid为到MeetingRoom的n:1关系外键。可以将List<MeetingBaseDto>反向注入到MeetingRoom中最终生成一个以Meeting为根的组装对象生成
```
<code>
MeetingRoomWithMeetingWo {
Long id;// 会议室id
String name;// 会议室名称
@@ -612,10 +612,10 @@ DateTime endTime //会议结束时间
DateTime endTime //会议结束时间
}
}
```
</code>
这种“正向替换”和“反向注入”可以按需递归调用去将多个互相之间有外键关系的对象组装成最终对象。例如还有另外一张表MeetingAgenda到Meeting有n:1的外键,那么如果我要去组装以Meeting开始包含MeetingRoom, MeetingAgenda的查询对象首先发现MeetingRoom是可以正向扩展到Meeting的并且可以反向注入MeetingAgenda
- meeting_with_room_and_agenda_wo
```json
<code>
{
"wo": {
"uuid": null,
@@ -647,7 +647,7 @@ DateTime endTime //会议结束时间
]
}
}
```
</code>
#### **2.9 读方案 (ReadPlan)**
- **定义与用途:** 在TOCO中针对DTO和VO读方案描述了如何基于查询对象从数据库获取DTO和VO列表数据主要提供了两个能力
- 根据查询条件返回符合条件的DTO或VO的id列表
@@ -690,7 +690,7 @@ DateTime endTime //会议结束时间
- 禁止使用filter语法
- 禁止使用has语法
- 语法定义:使用 lezer 定义了如下语法
```
<code>
@top Program { expression? }
@skip { spaces | newline | LineComment }
@precedence {
@@ -761,7 +761,7 @@ DateTime endTime //会议结束时间
"."
}
@detectDelim
```
</code>
- **读方案设计元素的表达**
- 以json格式表达json schema 定义如下
```json
@@ -858,7 +858,7 @@ DateTime endTime //会议结束时间
- 用户需求
获取一段时间未被使用的会议室(包含当前会议已选择的会议室),并且根据会议名称会议信息,最后分页返回。
- 对应的读方案定义
```json
<code>
{
"name": "get_unused_meeting_room_list",
"description": "获取未使用的会议室(包含当前会议已选择的会议室)",
@@ -876,24 +876,24 @@ DateTime endTime //会议结束时间
}
]
}
```
</code>
- **代码产物和修改建议**
- **查询传输对象(QTO)**
* **生成产物:** 在Service层生成一个Java类
* **命名规则:** 类名以Qto结尾(${ReadPlanName}Qto)
* **类路径:** 位于 ```**.persist.qto```包路径下
* **类路径:** 位于<code>**.persist.qto</code>包路径下
* **职责:** 读方案的查询参数结构,通常可作为API的参数API接收到参数后可直接透传给内部的RPC进行调用
* **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${ReadPlan在TOCO中的uuid}|QTO|DEFINITION
* **内部结构:** QTO内部包含了如下分页相关的字段:
```
<code>
private String scrollId; //瀑布流分页时用作游标
private Integer size; //页码分页时用作每页记录的数量
private Integer from; //页码分页时用作开始的记录位置
```
</code>
- **Dao**
- **生成产物:** 在Dao层生成一个Java类
- **命名规则:** 类名以Dao结尾(${ReadPlanName}Dao)
- **类路径:** 位于 ```**.persist.mapper```包路径下
- **类路径:** 位于 <code>**.persist.mapper</code>包路径下
- **职责:** 读方案对应的数据库查询方法
- **唯一标识符位置:** 其对应的唯一标志在类注解@AutoGenerated中指定,uuid规则: ${ReadPlan在TOCO中的uuid}|QTO|DAO
- **QueryExecutor**
@@ -903,7 +903,7 @@ DateTime endTime //会议结束时间
- 瀑布流,会生成一个,**Waterfall函数返回VSQueryResult<XxxVo>
- 查询数量, 会生成一个 **Count函数返回Integer
- **命名规则:** 类名以QueryExecutor结尾(${VoName}QueryExecutor)
- **类路径:** 位于 ```**.entrance.web.query.executor```包路径下
- **类路径:** 位于<code>**.entrance.web.query.executor</code>包路径下
- **职责:** 提供针对VO的查询入口把QtoService返回的id数据转化成目标**VO**
- **QueryService**
- **生成产物** 对于返回**DTO**的查询方案在service层生成一个Java类,对于分页查询、不分页返回全量、瀑布流查询、计数都有后独立的函数实现
@@ -912,12 +912,12 @@ DateTime endTime //会议结束时间
- 瀑布流,会生成一个,**Waterfall函数, 返回VSQueryResult<XxxDto>
- 查询数量, 会生成一个 **Count函数,返回Integer
- **命名规则:** 类名以QueryService结尾(${DtoName}QueryService)
- **类路径:** 位于 ```**.service.index.entity```包路径下
- **类路径:** 位于<code>**.service.index.entity</code>包路径下
- **职责:** 提供对DTO查询入口把QtoService返回的id数据转化成目标**DTO**,或返回符合条件的记录数量
- **VSQueryResult说明**
- VSQueryResult为一个写死的类全路径为com.vs.es.query.VSQueryResult存在于jar中可以直接使用禁止再创建新的VSQueryResult类!
- VSQueryResult代码结构如下
```
<code>
package com.vs.es.query;
import lombok.Data;
@@ -934,7 +934,7 @@ DateTime endTime //会议结束时间
private String scrollId; //瀑布流查询游标
private boolean hasMore; //瀑布流查询时表示是否有下一页
}
```
</code>
- **例子:**
* 根据用户名称查询用户列表返回UserDTO则生成UserNameQto、UserNameQtoService、UserNameQtoDao、UserNameQueryService; UserNameQueryService调用UserNameQtoServiceUserNameQtoService调用UserNameQtoDao
- **修改建议:**
@@ -1050,10 +1050,10 @@ DateTime endTime //会议结束时间
String nickname;//昵称
Long friend_count;//好友数量
}
```
</code>
- **需求:** 创建会议
- 对应的写方案定义:
```json
<code>
{
"name": "create_meeting",
"description": "创建会议",
@@ -1077,18 +1077,18 @@ DateTime endTime //会议结束时间
* **函数命名规则:** 和写方案同名
* **职责:** 按需对入参进行转换调用BaseBOService里的函数完成对聚合对象的操作, 实现对数据库的写操作;
* **返回值:** 操作的聚合根实体记录的主键字段的值
* **BOService的类路径:** ```**.service```
* **BOService的类路径:** <code>**.service</code>
* **唯一标识符位置:** 其对应的标识符在函数的注解@AutoGenerated中指定, uuid规则: ${WritePlan在TOCO中的uuid}
- **BaseBOService**
- **生成产物:** 在对应的聚合的BaseBOService里生成一系列函数根据入参完成对聚合对象的变更
- **职责** 增对每个实体的生成增删改的函数,并且根据参数的结构以及聚合的结构,构建嵌套的调用逻辑,完成对一个聚合对象的变更,记录并且返回对应的变更情况
- **类路径:** ```**.service.base```
- **类路径:** <code>**.service.base</code>
- **禁止** 修改该类
- **BTO (业务变更传输对象)**
* **生成产物:** 一个Java类以内部类的方式表示层级结构, **注意** BTO只能由写方案生成不能凭空创建
* **命名规则:** 一个Bto结尾(${WritePlanName}Bto驼峰展示)
* **禁止** 修改该类
* **类路径:** 位于```**.service.bto```包路径下
* **类路径:** 位于<code>**.service.bto</code>包路径下
* **职责:** 在**TOCO**中BTO为写方案的参数结构每个写方案会对应一个BTO写方案调用方按照BTO的结构向写方案生成的RPC方法传入需要查询的实体字段值完成对数据库的变更
* **唯一标识符位置:** 其对应的唯一标识符在类注解@AutoGenerated中指定, uuid规则: ${WritePlan在TOCO中的uuid}|BTO|DEFINITION
- **例子:**
@@ -1096,7 +1096,7 @@ DateTime endTime //会议结束时间
- **修改建议:**
- 不能修改BaseBOService中的函数不建议修改BTO文件。建议在BOService中进行手动代码扩展处理可能被复用的修改前后的逻辑如修改数据库的前后值对比、或常被复用的校验逻辑业务不变性校验逻辑除外、需要经常在一个事务内执行的其他写操作等。
- 父类函数会返回一个BoResult类此类记录了各个Bto和Bo实例的对应关系以及各个Bto实例的操作结果, 可以通过以下接口获取。 例如在创建用户的写方案中BoService里的入参为CreateUserBto 例如在创建用户的写方案中BoService里的入参为CreateUserBto,用户id由数据库生成如果需要返回创建用户id那么通过boResult.getAddedResult(createUserBto).getBo().getId()可以返回新建的用户id
```
<code>
/**
* 获取更新成功的bto结果
*
@@ -1118,8 +1118,8 @@ DateTime endTime //会议结束时间
* @return
*/
public DeletedBto getDeletedResult(final Object btoObj)
```
```
</code>
<code>
public class UpdatedBto<Bto,Entity,BO> {
//Bto 入参
private Bto bto;
@@ -1128,8 +1128,8 @@ DateTime endTime //会议结束时间
//bo后项
private BO bo;
}
```
```
</code>
<code>
//记录删除记录的情况
@Setter
@Getter
@@ -1139,8 +1139,8 @@ DateTime endTime //会议结束时间
//Bto 对应的Entity前项
private Entity entity;
}
```
```
</code>
<code>
//记录Bto创建的前后值
@Setter
@Getter
@@ -1150,13 +1150,13 @@ DateTime endTime //会议结束时间
//bo 后项
private BO bo;
}
```
</code>
#### **2.12 业务变更传输对象(BTO)**
- **定义与用途:** 在TOCO中BTO为写方案自动生成的参数结构每个写方案会生成一个BTO。BTO为写方案选定的操作实体根据关系形成的树形集合最外层为聚合根。写方案调用方按照BTO的结构向写方案生成的RPC方法传入需要操作的实体字段值完成对数据库的写操作
- **如何创建/生成:** BTO只能由写方案自动创建不能单独新建任何BTO。在创建写方案后TOCO会自动生成一个BTO作为该写方案传入的参数结构。
- **关键配置:** 名称(${WritePlanName}Bto驼峰展示嵌套的树形实体和字段列表BTO内部的字段全部都来自Entity。以下为一个示例
```
<code>
class CreateUserBto { //对应实体user
Long id; //来自于user.id
String name; //来自于user.name
@@ -1165,7 +1165,7 @@ DateTime endTime //会议结束时间
String url; //来自于picture.url
}
}
```
</code>
- **与API的关系:** BTO通常可作为API的参数API接收到参数后可直接透传给内部的RPC进行调用注意BTO只用作写操作的参数**禁止用作查询参数结构**
- **复杂场景处理:** 对于涉及多个写方案的复杂API可以
a. 如果接口有一个主要的写场景则创建一个主要的写方案让其自动生成的BTO作为API参数然后再增加其他基本类型的参数或EO
@@ -1295,7 +1295,7 @@ requestParams为请求参数列表response为返回结构requestParams中
}
```
- 例子:用户注册流程
```
<code>
{
"moduleName":"user",//该流程所属的模块
"name":"user_register",//定义该流程的功能
@@ -1343,29 +1343,29 @@ requestParams为请求参数列表response为返回结构requestParams中
}
]
}
```
</code>
- **代码产物和修改建议**
- **FlowConfig**
* **生成产物:** 每个模块在service层的生成一个Java类负责注册模块下的所有流程到执行器
* **命名规则:** 类名为${moduleName}FlowConfig
* **职责:** 在应用启动的时候注册模块内的所有的流程服务到执行器
* **类路径:** ```**.service.flow```
* **类路径:** <code>**.service.flow</code>
- **Service**
* **生成产物:** 在service层的以模块名为类名前缀的${moduleName}FlowService中生成一个流程的入口函数
* **函数命名规则:** 流程名为方法名为后缀pubic void invoke${functionFlowName}(${functionFlowName}Context context)
* **职责:** 在代码逻辑中,使用该流程需要以该函数作为调用入口
* **类路径:** ```**.service```
* **类路径:** <code>**.service</code>
* **唯一标识符位置:** 其对应的标识符在函数的注解@AutoGenerated中指定, uuid规则: ${FunctionFlow在TOCO中的uuid}|FLOW|METHOD
- **FlowNode**
* **生成产物:** 在service层生成一个Java类 **注意** 每个FunctionFlow的开始节点(StartNode)不生成
* **类命名规则:** ${nodeName}Node
* **入口函数命名:** pubic void process()
* **职责:** 用于封装内聚性的业务逻辑
* **类路径:** ```service.flow.node.${functionFlowName}```
* **类路径:** <code>service.flow.node.${functionFlowName}</code>
- **FlowContext**
* **函数命名规则:** {nodeName}Node
* **职责:** 作为流程节点之间的参数传递(包括出参和入参),在实现业务逻辑的时候,按需在这个上下文类中添加所需的字段
* **类路径:** ```**.service.flow.context```
* **类路径:** <code>**.service.flow.context</code>
* **唯一标识符位置:** 其对应的标识符在类注解@AutoGenerated中指定, uuid规则: ${FunctionFlow在TOCO中的uuid}|FLOW|CONTEXT
- **例子:**
- 用户登录在UserFlowService中生成一个函数invokeLoginFlow该函数通过流程框架根据流程定义调用LoginNodeLoginNode中封装了用户登录的逻辑LoginFlowContext中封装了用户登录的参数和结果。
@@ -1380,8 +1380,8 @@ requestParams为请求参数列表response为返回结构requestParams中
- **3.1 支持的语言/框架**
Java、SpringBoot、MyBatis-plus(读)、Hibernate(写)
- **3.2 项目结构与导航**
```
TOCO生成的项目是一个多模块的SpringBoot项目,包括主模块和子模块,它的子模块位于根目录下的/modules目录中**注意** 获取子模块代码文件路径的时候需要从根目录开始所以必须从modules节点开始例如子模块module1下的的java类路径应该是`modules/module1/src/main/java...`
<dir>
|──main_module
│ ├── common # 项目级别公共的基础模块
│ │ ├──config/ # 中间件配置
@@ -1424,7 +1424,7 @@ requestParams为请求参数列表response为返回结构requestParams中
├── query/ # 查询方案的service层入口调用persist层的查询实现
└── base/ # 每个BOService对应的基类
在一个子模块的内它的依赖层级为entrance -> service -> manager -> persist, 同时各个层都依赖 common
```
</dir>
- **3.3 标准查找流程**
1. **API查找** → `modules/{模块名}/entrance/web/controller/`
2. **DTO查找** → `modules/{模块名}/manager/dto/`