更新 llms-full.txt
This commit is contained in:
400
llms-full.txt
400
llms-full.txt
@@ -189,56 +189,56 @@ DateTime endTime; //会议结束时间
|
|||||||
- meeting_with_room_dto
|
- meeting_with_room_dto
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"dto": {
|
"dto": {
|
||||||
"uuid": null,
|
"uuid": null,
|
||||||
"name": "meeting_with_room_dto",
|
"name": "meeting_with_room_dto",
|
||||||
"description": "会议详情,包含会议室信息,以及其中的会议列表",
|
"description": "会议详情,包含会议室信息,以及其中的会议列表",
|
||||||
"fromEntity": "meeting",
|
"fromEntity": "meeting",
|
||||||
"expandList": [
|
"expandList": [
|
||||||
{
|
{
|
||||||
"foreignKeyInThisEntity": "room_id",
|
"foreignKeyInThisEntity": "room_id",
|
||||||
"dtoFieldName": "meeting_room",
|
"dtoFieldName": "meeting_room",
|
||||||
"dto": {
|
"dto": {
|
||||||
"uuid": "d05c7b3d-1c92-45a1-2113-a01b245813c1",
|
"uuid": "d05c7b3d-1c92-45a1-2113-a01b245813c1",
|
||||||
"name": "meeting_room_with_meetings_dto",
|
"name": "meeting_room_with_meetings_dto",
|
||||||
"fromEntity": "meeting_room",
|
"fromEntity": "meeting_room",
|
||||||
"description": "会议室信息,包含会议列表"
|
"description": "会议室信息,包含会议列表"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"customFieldList":[
|
"customFieldList":[
|
||||||
{
|
{
|
||||||
"uuid": "自定义字段的唯一标识,更新DTO的时候需要传入",
|
"uuid": "自定义字段的唯一标识,更新DTO的时候需要传入",
|
||||||
"name": "status",
|
"name": "status",
|
||||||
"type": "Enum",
|
"type": "Enum",
|
||||||
"typeUuid": "对应Enum的uuid",
|
"typeUuid": "对应Enum的uuid",
|
||||||
"description": "当前状态"
|
"description": "当前状态"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- meeting_room_with_meetings_dto
|
- meeting_room_with_meetings_dto
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"dto": {
|
"dto": {
|
||||||
"uuid": "d05c7b3d-1c92-45a1-2113-a01b245813c1",
|
"uuid": "d05c7b3d-1c92-45a1-2113-a01b245813c1",
|
||||||
"name": "meeting_room_with_meetings_dto",
|
"name": "meeting_room_with_meetings_dto",
|
||||||
"description": "会议室详情,包含会议室信息,以及其中的会议信息",
|
"description": "会议室详情,包含会议室信息,以及其中的会议信息",
|
||||||
"fromEntity": "meeting",
|
"fromEntity": "meeting",
|
||||||
"reverseExpandList": [
|
"reverseExpandList": [
|
||||||
{
|
{
|
||||||
"foreignKeyInOtherEntity": "room_id",
|
"foreignKeyInOtherEntity": "room_id",
|
||||||
"dto": {
|
"dto": {
|
||||||
"uuid": "ffeec02d-2a32-1531-1ce1-b9bfc1993765",
|
"uuid": "ffeec02d-2a32-1531-1ce1-b9bfc1993765",
|
||||||
"name": "meeting_base_dto",
|
"name": "meeting_base_dto",
|
||||||
"description": "会议基本信息",
|
"description": "会议基本信息",
|
||||||
"fromEntity": "meeting"
|
"fromEntity": "meeting"
|
||||||
},
|
},
|
||||||
"dtoFieldName": "meeting_list"
|
"dtoFieldName": "meeting_list"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
示例中meeting_with_room_dto没有uuid,为待创建的DTO。meeting_base_dto和meeting_room_with_meetings_dto为已存在的DTO,带有uuid。
|
示例中meeting_with_room_dto没有uuid,为待创建的DTO。meeting_base_dto和meeting_room_with_meetings_dto为已存在的DTO,带有uuid。
|
||||||
@@ -333,8 +333,8 @@ DateTime endTime; //会议结束时间
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
- **TOCO中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字段类型!
|
- **TOCO中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
|
系统中存在meeting_detail_dto
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"uuid": "cd55c96b-aa67-bfb2-7614-70b503a8f8bf",
|
"uuid": "cd55c96b-aa67-bfb2-7614-70b503a8f8bf",
|
||||||
@@ -508,6 +508,16 @@ DateTime endTime; //会议结束时间
|
|||||||
- 建议在Converter中进行代码扩展,不建议修改结构定义文件。其中VO的**自定义字段**由于不直接派生自DTO,所以一般会对应取数逻辑代码。通常如果涉及到数据获取、计算和拼装,批量处理的性能最好,所以自定义字段对应的代码位置**必须**放在Converter的**Map**基础转换方法convertTo${VoName}Map中,批量取数组装,如UserVoConverter.convertToUserVoMap
|
- 建议在Converter中进行代码扩展,不建议修改结构定义文件。其中VO的**自定义字段**由于不直接派生自DTO,所以一般会对应取数逻辑代码。通常如果涉及到数据获取、计算和拼装,批量处理的性能最好,所以自定义字段对应的代码位置**必须**放在Converter的**Map**基础转换方法convertTo${VoName}Map中,批量取数组装,如UserVoConverter.convertToUserVoMap
|
||||||
#### **2.8 查询对象(WO)**
|
#### **2.8 查询对象(WO)**
|
||||||
- **定义与用途:** 在TOCO中,WO表达某个Entity为基本,通过外键关系不断关联多个Entity的数据结构。WO还隐式表达了数据的取数拼装,这种拼装符合外键关系. WO作为ReadPlan的查询上下文使用,所以在创建ReadPlan之前需要先创建WO对象。在理解一个ReadPlan的语义的时候需要以WO作为上下文。
|
- **定义与用途:** 在TOCO中,WO表达某个Entity为基本,通过外键关系不断关联多个Entity的数据结构。WO还隐式表达了数据的取数拼装,这种拼装符合外键关系. WO作为ReadPlan的查询上下文使用,所以在创建ReadPlan之前需要先创建WO对象。在理解一个ReadPlan的语义的时候需要以WO作为上下文。
|
||||||
|
如果对应的需求,在返回DTO|VO的时候需要对DTO|VO的列表属性进行过滤,则需要根据对应的DTO|VO的结构定义,扩展出对应的WO对象(需要过滤的字段名需要和DTO|VO的字段名保持一致),例如:
|
||||||
|
查询DTO
|
||||||
|
```java
|
||||||
|
class MeetingDto {
|
||||||
|
String meetingId;
|
||||||
|
String meetingName;
|
||||||
|
List<MeetingAgenda> agendaList;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
需求是需要根据会议名称查询会议列表,并且根据会议议程信息过滤掉部分议程,那在定义查询对象的时候就需要包含议程信息,并且扩展字段的名称要定义为**agendaList**
|
||||||
- **查询对象案设计元素的表达**
|
- **查询对象案设计元素的表达**
|
||||||
- 以json格式表达,json schema 定义如下
|
- 以json格式表达,json schema 定义如下
|
||||||
```json
|
```json
|
||||||
@@ -546,21 +556,24 @@ DateTime endTime; //会议结束时间
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
- **如何创建/生成:**
|
- **如何创建/生成:**
|
||||||
- **关键配置:** Wo中的字段分为三种:a.继承Entity的字段,和Entity的字段类型一样;b.扩展字段,含正向替换和反向注入字段,类型为WO或List<WO>;
|
- **创建思路** 按照需要查询返回的DTO|VO的结构,构建出同构的WO对象(扩展和反向扩展的字段名保持一致),然后根据查询需求和过滤需求对WO进行二次裁剪或和扩展:
|
||||||
- **字段扩展方式:**TOCO定义了一个WO组装方法,适用于WO通过外键关系替换/注入对应Entity的信息,对象化表达有外键关系的Entity信息。只要存在外键关系且满足以下条件即可扩展:a.对于正向替换:当前实体存在指向其他实体的外键字段;b.对于反向注入:其他实体存在指向当前实体的外键字段。
|
- 去掉过滤和查询都不需要的扩展
|
||||||
例如:有两个Entity
|
- 补全查询或者字段过滤需要扩展
|
||||||
|
- **关键配置:** Wo中的字段分为三种:a.继承Entity的字段,和Entity的字段类型一样;b.扩展字段,含正向替换和反向注入字段,类型为WO或List<WO>;
|
||||||
|
- **字段扩展方式:** TOCO定义了一个WO组装方法,适用于WO通过外键关系替换/注入对应Entity的信息,对象化表达有外键关系的Entity信息。只要存在外键关系且满足以下条件即可扩展:a.对于正向替换:当前实体存在指向其他实体的外键字段;b.对于反向注入:其他实体存在指向当前实体的外键字段。
|
||||||
|
例如:有两个Entity
|
||||||
```
|
```
|
||||||
MeetingRoom{ //会议室
|
MeetingRoom{ //会议室
|
||||||
Long id;// 会议室id,主键
|
Long id;// 会议室id,主键
|
||||||
String name;// 会议室名称
|
String name;// 会议室名称
|
||||||
}
|
}
|
||||||
Meeting { //会议
|
Meeting { //会议
|
||||||
Long id;// 会议id,主键
|
Long id;// 会议id,主键
|
||||||
Long roomid; //占用的会议室id,到MeetingRoom的外键,n:1关系
|
Long roomid; //占用的会议室id,到MeetingRoom的外键,n:1关系
|
||||||
Long backupRoomid; //备用的会议室id,到MeetingRoom的外键,n:1关系
|
Long backupRoomid; //备用的会议室id,到MeetingRoom的外键,n:1关系
|
||||||
String title; //会议标题
|
String title; //会议标题
|
||||||
DateTime startTime; //会议开始时间
|
DateTime startTime; //会议开始时间
|
||||||
DateTime endTime; //会议结束时间
|
DateTime endTime; //会议结束时间
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
其中Meeting和MeetingRoom是n:1关系。即多个会议室会占用同一个会议室。
|
其中Meeting和MeetingRoom是n:1关系。即多个会议室会占用同一个会议室。
|
||||||
@@ -580,9 +593,9 @@ DateTime endTime; //会议结束时间
|
|||||||
DateTime endTime; //会议结束时间
|
DateTime endTime; //会议结束时间
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
又例如:需要会议和其候选会议室时,将Meeting表中的backupRoomid进行正向替换。
|
又例如:需要会议和其候选会议室时,将Meeting表中的backupRoomid进行正向替换。
|
||||||
又例如:需要会议,且即需要其占用会议室,也需要候选会议室时,将Meeting表中的roomid,backupRoomid都进行正向替换。
|
又例如:需要会议,且即需要其占用会议室,也需要候选会议室时,将Meeting表中的roomid,backupRoomid都进行正向替换。
|
||||||
同时TOCO还定义了“反向注入”这个行为,选定一个表,如果有另外的表到前表有外键,选择和需求相关的具体的外键属性在选定表中增加一个以另外表为根的组合对象(当外键关系是1:1时)或者组合对象的列表(当外键关系是n:1时)。需求是:“获取会议室,和占用它的会议信息”,需要选定MeetingRoom,那么基于另外的表Meeting中存在字段roomid,为到MeetingRoom的n:1关系外键。可以将List<MeetingBaseDto>反向注入到MeetingRoom中,最终生成一个以Meeting为根的组装对象,生成:
|
同时TOCO还定义了“反向注入”这个行为,选定一个表,如果有另外的表到前表有外键,选择和需求相关的具体的外键属性在选定表中增加一个以另外表为根的组合对象(当外键关系是1:1时)或者组合对象的列表(当外键关系是n:1时)。需求是:“获取会议室,和占用它的会议信息”,需要选定MeetingRoom,那么基于另外的表Meeting中存在字段roomid,为到MeetingRoom的n:1关系外键。可以将List<MeetingBaseDto>反向注入到MeetingRoom中,最终生成一个以Meeting为根的组装对象,生成:
|
||||||
```
|
```
|
||||||
MeetingRoomWithMeetingWo {
|
MeetingRoomWithMeetingWo {
|
||||||
Long id;// 会议室id
|
Long id;// 会议室id
|
||||||
@@ -630,12 +643,19 @@ DateTime endTime; //会议结束时间
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
#### **2.9 读方案 (ReadPlan)**
|
#### **2.9 读方案 (ReadPlan)**
|
||||||
- **定义与用途:** 在TOCO中,读方案描述了一种数据库查询方案,查询条件为一个面向对象的查询语句,其中可以包含存在外键关系的多个实体的字段(如age=18 and name like #nameLike and school.name like #schoolNameLike,其中以#开头的是自定义参数,会自动生成一个QTO结构,由查询调用方动态传入),结果为符合查询条件的**一种**DTO或VO列表。读方案内部会将该面向对象的查询条件转化为复杂的join sql语句,来实现对数据库的查询,以及返回的复杂DTO和VO数据的组装。读方案可以指定其分页方式(不分页、页码分页、瀑布流分页),以及是否生成计数方法(用于返回符合条件的记录数量)。
|
- **定义与用途:** 在TOCO中,针对DTO和VO,读方案描述了如何基于查询对象从数据库获取DTO和VO列表数据,主要提供了两个能力
|
||||||
- **使用建议:** 如果查询条件只有主键,则建议使用预定义的getBy${PrimaryKey}或getBy${PrimaryKey}s方法来获取DTO(参照DTO的**预定义方法**)或VO(参照**复杂嵌套VO获取流程**),不建议使用读方案。非主键查询或多条件查询建议使用读方案。
|
- 根据查询条件,返回符合条件的DTO或VO的id列表
|
||||||
- **关键配置:** 名称(小写字母+下划线,不要以read_plan结尾)、返回结构(DTO/VO,一个读方案**不能**同时返回多种DTO或VO)、查询条件的自然语言描述、是否生成计数方法、排序字段(如果选择不分页,则不需要)
|
- 根据字段过滤条件,对DTO和VO的列表字段数据进行过滤
|
||||||
|
- **关键配置:** 名称(小写字母+下划线,不要以read_plan结尾)、返回结构(DTO/VO,一个读方案**不能**同时返回多种DTO或VO)、查询条件的自然语言描述、是否生成计数方法、排序字段(如果选择不分页,则不需要)、过滤字段以及过滤条件。
|
||||||
- **与RPC、代码的关系:** 对于每一个返回DTO的读方案,TOCO会为每种分页方式自动生成一个RPC方法,其参数为对应的QTO,返回值为DTO列表;如果选择了生成计数方法,则还会生成一个RPC,参数为QTO,返回值为符合条件的DTO数量。同样,对于每一个返回VO的读方案,TOCO会自动生成一个Java方法,其参数为对应的QTO,返回值为VO列表,方法内部逻辑已经由TOCO完全实现;如果选择了生成计数方法,则还会生成一个count方法,参数为QTO,返回值为符合条件的DTO数量,方法内部逻辑已经由TOCO完全实现
|
- **与RPC、代码的关系:** 对于每一个返回DTO的读方案,TOCO会为每种分页方式自动生成一个RPC方法,其参数为对应的QTO,返回值为DTO列表;如果选择了生成计数方法,则还会生成一个RPC,参数为QTO,返回值为符合条件的DTO数量。同样,对于每一个返回VO的读方案,TOCO会自动生成一个Java方法,其参数为对应的QTO,返回值为VO列表,方法内部逻辑已经由TOCO完全实现;如果选择了生成计数方法,则还会生成一个count方法,参数为QTO,返回值为符合条件的DTO数量,方法内部逻辑已经由TOCO完全实现
|
||||||
- **如何创建/生成:** 在创建读方案时,必须先调用工具创建或选择现有的**一种**DTO或VO作为返回值类型,然后再定义查询条件的自然语言描述(如:根据用户姓名、年龄、学校名称,查询用户列表),分页方式、是否生成计数方法、排序字段等。
|
- **如何创建/生成:** 在创建读方案时,必须先调用工具创建或选择现有的**一种**DTO或VO作为返回值类型,然后再定义查询条件的自然语言描述(如:根据用户姓名、年龄、学校名称,查询用户列表),分页方式、是否生成计数方法、排序字段等。
|
||||||
- 你需要提取需求中的查询部分信息,以输入的查询对象作为查询上下文件,构建一个查询语句
|
- **排序** 对于返回列表数据的排序,排序规则和SQL的排序类似(通过指定字段以及升序|降序,字段可以组合;ReadPlan支持有**两种**方式:
|
||||||
|
- **默认排序**:指定默认排序字段(不需要入参指定排序字段)
|
||||||
|
- **自定义排序**:指定排序字段(需要入参指定排序字段),这种方式通常能很好的满足列表头动态指定排序的需求
|
||||||
|
- **排序字段的来源**:并不是查询字段中的所有字段都能作为排序字段,因为返回的根DTO|VO的id去重列表,所以排序字段只能来源自根WO(不包括列表WO属性: 比如MeetingWO包含了List<MeetingAgendaWO> agendaList属性, 那么agendaList不能作为排序字段),以及根WO扩展出来的非列表属性的WO的字段(比如MeetingWO包含了MeetingRoomWO,那么MeetingRoomWO的属性也能作为排序字段),**注意**:为了唯一确定是给按照那个字段进行排序,排序字段是一个从根节点到当前属性的路径,例如:ADto包含了BDto bDto,BDto具备属性name,如果指定对BDto的name字段排序,则字段路径为:bDto.name
|
||||||
|
- 你需要提取需求中的查询部分信息,以输入的查询对象作为查询上下文件,构建一个查询语句
|
||||||
|
- 如果有列表属性过滤需求(如果没有filter,对每个列表属性都是放回全部数据,例如:MeetingDto的MeetingAgendaDtoList属性,如果不设置MeetingAgendaDtoList的filter,则返回该会议的全部议程信息):你需要提取需求中的过滤部分信息,以输入的查询对象作为查询上下文件,针对可过滤字段(列表属性)分别创建过滤条件, **注意** 过滤条件不能使用列表属性作为查询条件属性(即不能使用contains语法),为了唯一确定是给那个列表属性的指定过滤条件,属性字段是一个从根节点属性到当前属性的路径,例如:ADto包含了List<BDto> bDtoList;BDto包含了List<CDto> cDtoList,如果对cDtoList使用Filter,则字段路径为:bDtoList.cDtoList
|
||||||
|
- 查询语法和过滤语法
|
||||||
- 基本语法格式是 属性名 操作符 变量或常量,变量表示了这个数据是外部传入的,用 #变量名为格式;如果是枚举类型常量,需要使用'符号包起来,例如: 男性枚举类型 'MALE'
|
- 基本语法格式是 属性名 操作符 变量或常量,变量表示了这个数据是外部传入的,用 #变量名为格式;如果是枚举类型常量,需要使用'符号包起来,例如: 男性枚举类型 'MALE'
|
||||||
- 对于数值、时间类型属性有:!=, ==, >, <,<=,>=, in,notIn, isNullOrNot 这些操作符
|
- 对于数值、时间类型属性有:!=, ==, >, <,<=,>=, in,notIn, isNullOrNot 这些操作符
|
||||||
- 对于文本类型属性有:like, isNotNull, isNull,!=, ==, in,notIn, isNullOrNot 这些操作符
|
- 对于文本类型属性有:like, isNotNull, isNull,!=, ==, in,notIn, isNullOrNot 这些操作符
|
||||||
@@ -652,78 +672,78 @@ DateTime endTime; //会议结束时间
|
|||||||
- 禁止使用filter语法
|
- 禁止使用filter语法
|
||||||
- 禁止使用has语法
|
- 禁止使用has语法
|
||||||
- 语法定义:使用 lezer 定义了如下语法
|
- 语法定义:使用 lezer 定义了如下语法
|
||||||
```
|
```
|
||||||
@top Program { expression? }
|
@top Program { expression? }
|
||||||
@skip { spaces | newline | LineComment }
|
@skip { spaces | newline | LineComment }
|
||||||
@precedence {
|
@precedence {
|
||||||
member,
|
member,
|
||||||
and @left,
|
and @left,
|
||||||
or @left
|
or @left
|
||||||
|
}
|
||||||
|
kw<term> { @specialize[@name={term}]<identifier, term> }
|
||||||
|
boolean { @specialize[@name=Boolean]<identifier, "true" | "false"> }
|
||||||
|
@skip {} {
|
||||||
|
String[isolate] {
|
||||||
|
'"' (stringContentDouble | Escape)* ('"' | "\n") |
|
||||||
|
"'" (stringContentSingle | Escape)* ("'" | "\n")
|
||||||
}
|
}
|
||||||
kw<term> { @specialize[@name={term}]<identifier, term> }
|
}
|
||||||
boolean { @specialize[@name=Boolean]<identifier, "true" | "false"> }
|
commaSep<content> {
|
||||||
@skip {} {
|
content ("," content)*
|
||||||
String[isolate] {
|
}
|
||||||
'"' (stringContentDouble | Escape)* ('"' | "\n") |
|
List {
|
||||||
"'" (stringContentSingle | Escape)* ("'" | "\n")
|
"[" commaSep<Value> ~destructure "]"
|
||||||
}
|
}
|
||||||
|
Value { String | Number | List | boolean }
|
||||||
|
Field { identifier ~arrow }
|
||||||
|
Member { Field !member "." (Member | Field) }
|
||||||
|
Input { "#" identifier ~arrow }
|
||||||
|
expression {
|
||||||
|
TupleExpression | BinaryExpression | NotExpression | ParenthesizedExpression | ListExpression
|
||||||
|
}
|
||||||
|
TupleExpression { TwoTupleExpression | ThreeTupleExpression }
|
||||||
|
TwoTupleExpression { (Field | Member) TwoOperator }
|
||||||
|
ThreeTupleExpression { (Field | Member) ThreeOperator (Input | Value) }
|
||||||
|
ListExpression { (Field | Member) ListOperator ParenthesizedExpression }
|
||||||
|
BinaryExpression {
|
||||||
|
expression !and (kw<'AND'> | kw<'and'>) expression |
|
||||||
|
expression !or (kw<'OR'> | kw<'or'>) expression
|
||||||
|
}
|
||||||
|
NotExpression { (kw<'NOT'> | kw<'not'>) ParenthesizedExpression }
|
||||||
|
ParenthesizedExpression { "(" expression ")" }
|
||||||
|
@tokens {
|
||||||
|
spaces[@export] { $[\u0009 \u000b\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]+ }
|
||||||
|
newline[@export] { $[\r\n\u2028\u2029] }
|
||||||
|
identifierChar { @asciiLetter | $[_$\u{a1}-\u{10ffff}] }
|
||||||
|
word { identifierChar (identifierChar | @digit)* }
|
||||||
|
identifier { word }
|
||||||
|
hex { @digit | $[a-fA-F] }
|
||||||
|
stringContentSingle { ![\\\n']+ }
|
||||||
|
stringContentDouble { ![\\\n"]+ }
|
||||||
|
@precedence { spaces, newline, identifier }
|
||||||
|
Escape {
|
||||||
|
"\\" ("x" hex hex | "u" ("{" hex+ "}" | hex hex hex hex) | ![xu])
|
||||||
}
|
}
|
||||||
commaSep<content> {
|
Number {
|
||||||
content ("," content)*
|
(@digit ("_" | @digit)* ("." ("_" | @digit)*)? | "." @digit ("_" | @digit)*)
|
||||||
|
(("e" | "E") ("+" | "-")? ("_" | @digit)+)? |
|
||||||
|
@digit ("_" | @digit)* "n" |
|
||||||
|
"0x" (hex | "_")+ "n"? |
|
||||||
|
"0b" $[01_]+ "n"? |
|
||||||
|
"0o" $[0-7_]+ "n"?
|
||||||
}
|
}
|
||||||
List {
|
|
||||||
"[" commaSep<Value> ~destructure "]"
|
|
||||||
}
|
|
||||||
Value { String | Number | List | boolean }
|
|
||||||
Field { identifier ~arrow }
|
|
||||||
Member { Field !member "." (Member | Field) }
|
|
||||||
Input { "#" identifier ~arrow }
|
|
||||||
expression {
|
|
||||||
TupleExpression | BinaryExpression | NotExpression | ParenthesizedExpression | ListExpression
|
|
||||||
}
|
|
||||||
TupleExpression { TwoTupleExpression | ThreeTupleExpression }
|
|
||||||
TwoTupleExpression { (Field | Member) TwoOperator }
|
|
||||||
ThreeTupleExpression { (Field | Member) ThreeOperator (Input | Value) }
|
|
||||||
ListExpression { (Field | Member) ListOperator ParenthesizedExpression }
|
|
||||||
BinaryExpression {
|
|
||||||
expression !and (kw<'AND'> | kw<'and'>) expression |
|
|
||||||
expression !or (kw<'OR'> | kw<'or'>) expression
|
|
||||||
}
|
|
||||||
NotExpression { (kw<'NOT'> | kw<'not'>) ParenthesizedExpression }
|
|
||||||
ParenthesizedExpression { "(" expression ")" }
|
|
||||||
@tokens {
|
|
||||||
spaces[@export] { $[\u0009 \u000b\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]+ }
|
|
||||||
newline[@export] { $[\r\n\u2028\u2029] }
|
|
||||||
identifierChar { @asciiLetter | $[_$\u{a1}-\u{10ffff}] }
|
|
||||||
word { identifierChar (identifierChar | @digit)* }
|
|
||||||
identifier { word }
|
|
||||||
hex { @digit | $[a-fA-F] }
|
|
||||||
stringContentSingle { ![\\\n']+ }
|
|
||||||
stringContentDouble { ![\\\n"]+ }
|
|
||||||
@precedence { spaces, newline, identifier }
|
|
||||||
Escape {
|
|
||||||
"\\" ("x" hex hex | "u" ("{" hex+ "}" | hex hex hex hex) | ![xu])
|
|
||||||
}
|
|
||||||
Number {
|
|
||||||
(@digit ("_" | @digit)* ("." ("_" | @digit)*)? | "." @digit ("_" | @digit)*)
|
|
||||||
(("e" | "E") ("+" | "-")? ("_" | @digit)+)? |
|
|
||||||
@digit ("_" | @digit)* "n" |
|
|
||||||
"0x" (hex | "_")+ "n"? |
|
|
||||||
"0b" $[01_]+ "n"? |
|
|
||||||
"0o" $[0-7_]+ "n"?
|
|
||||||
}
|
|
||||||
|
|
||||||
@precedence { Number "." }
|
@precedence { Number "." }
|
||||||
ThreeOperator { "in" | "notIn" | "!=" | "==" | ">" | ">=" | "<" | "<=" | "isNullOrNot" | "like" | "has" }
|
ThreeOperator { "in" | "notIn" | "!=" | "==" | ">" | ">=" | "<" | "<=" | "isNullOrNot" | "like" | "has" }
|
||||||
TwoOperator { "isNull" | "isNotNull" }
|
TwoOperator { "isNull" | "isNotNull" }
|
||||||
ListOperator { "contains" | "filter" }
|
ListOperator { "contains" | "filter" }
|
||||||
LineComment[isolate] { "//" ![\n]* }
|
LineComment[isolate] { "//" ![\n]* }
|
||||||
"(" ")"
|
"(" ")"
|
||||||
"[" "]"
|
"[" "]"
|
||||||
"."
|
"."
|
||||||
}
|
}
|
||||||
@detectDelim
|
@detectDelim
|
||||||
```
|
```
|
||||||
- **读方案设计元素的表达**
|
- **读方案设计元素的表达**
|
||||||
- 以json格式表达,json schema 定义如下
|
- 以json格式表达,json schema 定义如下
|
||||||
```json
|
```json
|
||||||
@@ -742,12 +762,28 @@ DateTime endTime; //会议结束时间
|
|||||||
"supportUnPage":{"type":"boolean", "description":"如果不需要分页,一次性返回部数据,则返回true"},
|
"supportUnPage":{"type":"boolean", "description":"如果不需要分页,一次性返回部数据,则返回true"},
|
||||||
"supportWaterfall":{"type":"boolean","description":"是否需要瀑布流"},
|
"supportWaterfall":{"type":"boolean","description":"是否需要瀑布流"},
|
||||||
"query":{"type":"string","description":"查询语句,符合前述语法定义"},
|
"query":{"type":"string","description":"查询语句,符合前述语法定义"},
|
||||||
"voOrDtoId":{"type":"string","description":"返回数据对象(VO或DTO)的uuid,创建的时候必须指定,更新的时候不传递"}
|
"voOrDtoId":{"type":"string","description":"返回数据对象(VO或DTO)的uuid,创建的时候必须指定,更新的时候不传递"},
|
||||||
|
"outOrder":{"type":"array","description":"入参排序方式定义",
|
||||||
|
"items":{"type":"object","description":"定义字段排序方式","required":["field", "incr"],
|
||||||
|
"properties":{"fieldPath": {"type":"string","description":"字段名路径"},"incr": {"type":"boolean","description":"是否升序"}}}
|
||||||
|
},
|
||||||
|
"defaultOrder": {"type":"array","description":"默认排序方式定义",
|
||||||
|
"items": {"type":"object","description":"定义字段排序方式","required":["field", "incr"],
|
||||||
|
"properties":{"fieldPath": {"type":"string","description":"字段名"},"incr": {"type":"boolean","description":"是否升序"}}}
|
||||||
|
},
|
||||||
|
"filters": {"type": "array", "description":"过滤条件定义",
|
||||||
|
"items": {"type":"object","description":"定义过滤条件","required":["field", "filter"],
|
||||||
|
"properties":{
|
||||||
|
"fieldPath": {"type":"string","description":"需要过滤的列表字段路径"},
|
||||||
|
"filter": {"type":"object","description":"过滤语法,符合前述的语法定义,不能使用contains语法"}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"required":["name","description","query"]
|
"required":["name","description","query"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required":["qto"]
|
"required":["qto"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- **举例**
|
- **举例**
|
||||||
@@ -755,7 +791,6 @@ DateTime endTime; //会议结束时间
|
|||||||
```java
|
```java
|
||||||
public class meeting_room {
|
public class meeting_room {
|
||||||
storey storey; // 楼层id
|
storey storey; // 楼层id
|
||||||
List<image_storage_info_eo> picture; // 照片
|
|
||||||
String name; // 名称
|
String name; // 名称
|
||||||
room_type_enum room_type; // 会议室类型
|
room_type_enum room_type; // 会议室类型
|
||||||
List<equipment_enum> equipment; // 设备
|
List<equipment_enum> equipment; // 设备
|
||||||
@@ -764,21 +799,14 @@ DateTime endTime; //会议结束时间
|
|||||||
String description; // 说明
|
String description; // 说明
|
||||||
Boolean enable_indicator; // 是否启用
|
Boolean enable_indicator; // 是否启用
|
||||||
String input_code; // 输入码
|
String input_code; // 输入码
|
||||||
Date created_at; // 创建时间
|
|
||||||
Date updated_at; // 更新时间
|
|
||||||
Long storey_id; // 楼层id
|
Long storey_id; // 楼层id
|
||||||
Long lock_version; // 乐观锁字段
|
|
||||||
Long contact_staff_id; // 联系员工ID
|
Long contact_staff_id; // 联系员工ID
|
||||||
List<meeting> meeting;
|
List<meeting> meeting; //注意:该字段可添加过滤条件
|
||||||
Long deleted_at; // 删除时间
|
|
||||||
class storey { // 建筑的楼层
|
class storey { // 建筑的楼层
|
||||||
location location; // 位置id
|
location location; // 位置id
|
||||||
String name; // 楼层
|
String name; // 楼层
|
||||||
Long id; // 主键
|
Long id; // 主键
|
||||||
Long sort_number; // 排序号
|
Long sort_number; // 排序号
|
||||||
Date created_at; // 创建时间
|
|
||||||
Date updated_at; // 更新时间
|
|
||||||
Long deleted_at; // 删除时间
|
|
||||||
Long location_id; // 位置id
|
Long location_id; // 位置id
|
||||||
}
|
}
|
||||||
class meeting {
|
class meeting {
|
||||||
@@ -789,18 +817,12 @@ DateTime endTime; //会议结束时间
|
|||||||
Long room_id; // 会议室id
|
Long room_id; // 会议室id
|
||||||
String description; // 描述
|
String description; // 描述
|
||||||
Long create_user_id; // 创建人id
|
Long create_user_id; // 创建人id
|
||||||
Date created_at; // 创建时间
|
|
||||||
Date updated_at; // 更新时间
|
|
||||||
Long deleted_at; // 删除时间
|
|
||||||
}
|
}
|
||||||
class location { // 位置信息,如楼栋
|
class location { // 位置信息,如楼栋
|
||||||
String name; // 名称
|
String name; // 名称
|
||||||
Long id; // 主键
|
Long id; // 主键
|
||||||
String description; // 描述
|
String description; // 描述
|
||||||
Long sort_number; // 排序号
|
Long sort_number; // 排序号
|
||||||
Date created_at; // 创建时间
|
|
||||||
Date updated_at; // 更新时间
|
|
||||||
Long deleted_at; // 删除时间
|
|
||||||
}
|
}
|
||||||
enum room_type_enum { //
|
enum room_type_enum { //
|
||||||
SMALL, //小会议室
|
SMALL, //小会议室
|
||||||
@@ -816,23 +838,27 @@ DateTime endTime; //会议结束时间
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
- 用户需求
|
- 用户需求
|
||||||
获取一段时间未被使用的会议室(包含当前会议已选择的会议室),分页返回
|
获取一段时间未被使用的会议室(包含当前会议已选择的会议室),并且根据会议名称会议信息,最后分页返回。
|
||||||
- 对应的读方案定义
|
- 对应的读方案定义
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"qto": {
|
|
||||||
"name": "get_unused_meeting_room_list",
|
"name": "get_unused_meeting_room_list",
|
||||||
"description": "获取未使用的会议室(包含当前会议已选择的会议室)",
|
"description": "获取未使用的会议室(包含当前会议已选择的会议室)",
|
||||||
"woId":"759bedd4-4540-4de6-b65d-d44912fb0991",
|
"woId":"759bedd4-4540-4de6-b65d-d44912fb0991",
|
||||||
"dtoOrVoId":"e50c02c3-f336-4dc6-88e1-24ffe3dea1e2"
|
"dtoOrVoId":"e50c02c3-f336-4dc6-88e1-24ffe3dea1e2",
|
||||||
"generateCountApi": true,
|
"generateCountApi": true,
|
||||||
"supportPaginate": true,
|
"supportPaginate": true,
|
||||||
"supportUnPage": false,
|
"supportUnPage": false,
|
||||||
"supportWaterfall": false,
|
"supportWaterfall": false,
|
||||||
"query": "enable_indicator == true AND ( id == #idIs OR meeting isNull OR NOT ( meeting contains ( start_time <= #meetingEndTime AND end_time >= #meetingStartTime ) ) )"
|
"query": "enable_indicator == true AND ( id == #idIs OR meeting isNull OR NOT ( meeting contains ( start_time <= #meetingEndTime AND end_time >= #meetingStartTime ) ) )",
|
||||||
}
|
"filters": [
|
||||||
|
{
|
||||||
|
"filteredField": "meeting",
|
||||||
|
"filter": "title like #meetingTitleLike"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
- **代码产物和修改建议**
|
- **代码产物和修改建议**
|
||||||
- **Service**
|
- **Service**
|
||||||
* **生成产物:** 在Service层生成一个Java类
|
* **生成产物:** 在Service层生成一个Java类
|
||||||
@@ -1040,20 +1066,20 @@ DateTime endTime; //会议结束时间
|
|||||||
- **TOCO中json结构描述:** 在TOCO中,DTO使用一个json结构表示,示例如下:
|
- **TOCO中json结构描述:** 在TOCO中,DTO使用一个json结构表示,示例如下:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"methodName": "saveUsers",
|
"methodName": "saveUsers",
|
||||||
"className": "UserSaveService",
|
"className": "UserSaveService",
|
||||||
"requestParams":[
|
"requestParams":[
|
||||||
{
|
{
|
||||||
"name": "saveUserBtoList",
|
"name": "saveUserBtoList",
|
||||||
"description": "批量保存用户参数",
|
"description": "批量保存用户参数",
|
||||||
"type": "List",
|
"type": "List",
|
||||||
"innerType": "Bto",
|
"innerType": "Bto",
|
||||||
"innerUuid": "dbvvc4d4-0063-442f-abd7-vrfded656988"
|
"innerUuid": "dbvvc4d4-0063-442f-abd7-vrfded656988"
|
||||||
}
|
|
||||||
],
|
|
||||||
"response": {
|
|
||||||
"type": "Boolean"
|
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"response": {
|
||||||
|
"type": "Boolean"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
结构中一些关键字段描述如下:
|
结构中一些关键字段描述如下:
|
||||||
@@ -1070,26 +1096,26 @@ requestParams为请求参数列表,response为返回结构,requestParams中
|
|||||||
- **TOCO中json结构描述:** 在TOCO中,API使用一个json结构表示,示例如下:
|
- **TOCO中json结构描述:** 在TOCO中,API使用一个json结构表示,示例如下:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"methodName": "getUserMeetingList",
|
"methodName": "getUserMeetingList",
|
||||||
"className": "MeetingQueryController",
|
"className": "MeetingQueryController",
|
||||||
"requestParams":[
|
"requestParams":[
|
||||||
{
|
{
|
||||||
"name": "getMeetingListByUserId74Qto",
|
"name": "getMeetingListByUserId74Qto",
|
||||||
"description": "查询参数",
|
"description": "查询参数",
|
||||||
"type": "Qto",
|
"type": "Qto",
|
||||||
"uuid": "6351a4d4-0063-442f-abd7-a2df6d656988"
|
"uuid": "6351a4d4-0063-442f-abd7-a2df6d656988"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"description": "是否为测试请求",
|
"description": "是否为测试请求",
|
||||||
"type": "Boolean"
|
"type": "Boolean"
|
||||||
}
|
|
||||||
],
|
|
||||||
"response": {
|
|
||||||
"type": "List",
|
|
||||||
"innerType": "Vo",
|
|
||||||
"innerUuid": "1d58352b-5333-4509-aec2-1abc3fac9122"
|
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"response": {
|
||||||
|
"type": "List",
|
||||||
|
"innerType": "Vo",
|
||||||
|
"innerUuid": "1d58352b-5333-4509-aec2-1abc3fac9122"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
结构中一些关键字段描述如下:
|
结构中一些关键字段描述如下:
|
||||||
|
|||||||
Reference in New Issue
Block a user