midway-fatcms 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
- package/.qoder/skills/midway-fatcms/02-crud-quick.md +375 -0
- package/.qoder/skills/midway-fatcms/03-crud-sharding.md +489 -0
- package/.qoder/skills/midway-fatcms/04-condition-operators.md +93 -0
- package/.qoder/skills/midway-fatcms/05-configuration.md +290 -0
- package/.qoder/skills/midway-fatcms/06-builtin-functions.md +241 -0
- package/.qoder/skills/midway-fatcms/07-examples.md +504 -0
- package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
- package/README.md +9 -9
- package/dist/configuration.d.ts +10 -0
- package/dist/configuration.js +26 -0
- package/dist/controller/base/BaseApiController.d.ts +1 -2
- package/dist/controller/base/BaseApiController.js +0 -4
- package/dist/controller/gateway/DocGatewayController.js +1 -1
- package/dist/controller/helpers.controller.d.ts +6 -0
- package/dist/controller/helpers.controller.js +19 -0
- package/dist/controller/manage/FlowConfigManageApi.js +4 -2
- package/dist/controller/manage/SysConfigMangeApi.js +6 -1
- package/dist/controller/manage/UserAccountManageApi.js +7 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/libs/crud-pro/CrudPro.d.ts +51 -3
- package/dist/libs/crud-pro/CrudPro.js +111 -4
- package/dist/libs/crud-pro/exceptions.d.ts +7 -0
- package/dist/libs/crud-pro/exceptions.js +7 -0
- package/dist/libs/crud-pro/interfaces.d.ts +83 -12
- package/dist/libs/crud-pro/models/CrudResult.d.ts +116 -0
- package/dist/libs/crud-pro/models/CrudResult.js +126 -0
- package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -2
- package/dist/libs/crud-pro/models/ServiceHub.d.ts +2 -0
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +70 -2
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +205 -13
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
- package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
- package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +36 -0
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +97 -4
- package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +2 -0
- package/dist/libs/crud-pro/services/CurdProServiceHub.js +6 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +382 -0
- package/dist/libs/crud-pro-quick/CrudProQuick.js +689 -0
- package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
- package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
- package/dist/libs/crud-pro-quick/index.d.ts +36 -0
- package/dist/libs/crud-pro-quick/index.js +49 -0
- package/dist/libs/crud-pro-quick/models.d.ts +33 -0
- package/dist/libs/crud-pro-quick/models.js +2 -0
- package/dist/libs/crud-sharding/ShardingBase.d.ts +78 -0
- package/dist/libs/crud-sharding/ShardingBase.js +179 -0
- package/dist/libs/crud-sharding/ShardingByCustomCrud.d.ts +35 -0
- package/dist/libs/crud-sharding/ShardingByCustomCrud.js +297 -0
- package/dist/libs/crud-sharding/ShardingByHashCrud.d.ts +38 -0
- package/dist/libs/crud-sharding/ShardingByHashCrud.js +86 -0
- package/dist/libs/crud-sharding/ShardingByKeyCrud.d.ts +39 -0
- package/dist/libs/crud-sharding/ShardingByKeyCrud.js +74 -0
- package/dist/libs/crud-sharding/ShardingByTimeCrud.d.ts +66 -0
- package/dist/libs/crud-sharding/ShardingByTimeCrud.js +524 -0
- package/dist/libs/crud-sharding/ShardingConfig.d.ts +25 -10
- package/dist/libs/crud-sharding/ShardingConfig.js +5 -5
- package/dist/libs/crud-sharding/ShardingMerger.d.ts +10 -18
- package/dist/libs/crud-sharding/ShardingMerger.js +27 -44
- package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
- package/dist/libs/crud-sharding/ShardingResult.js +16 -0
- package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
- package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
- package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
- package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
- package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
- package/dist/libs/crud-sharding/index.d.ts +13 -15
- package/dist/libs/crud-sharding/index.js +33 -17
- package/dist/models/RedisKeys.d.ts +1 -0
- package/dist/models/RedisKeys.js +1 -0
- package/dist/models/bizmodels.d.ts +2 -6
- package/dist/service/SysAppService.d.ts +2 -2
- package/dist/service/SysAppService.js +16 -5
- package/dist/service/SysConfigService.d.ts +1 -1
- package/dist/service/SysConfigService.js +7 -2
- package/dist/service/SysDictDataService.js +14 -4
- package/dist/service/SysMenuService.js +7 -2
- package/dist/service/TableMetaCacheRedisSubscriber.d.ts +31 -0
- package/dist/service/TableMetaCacheRedisSubscriber.js +98 -0
- package/dist/service/curd/CurdMixService.d.ts +6 -4
- package/dist/service/curd/CurdMixService.js +16 -2
- package/dist/service/curd/CurdProService.d.ts +149 -29
- package/dist/service/curd/CurdProService.js +157 -38
- package/dist/service/flow/FlowConfigService.js +7 -2
- package/dist/service/flow/FlowInstanceCrudService.js +22 -19
- package/package.json +1 -1
- package/src/configuration.ts +27 -0
- package/src/controller/base/BaseApiController.ts +0 -5
- package/src/controller/gateway/DocGatewayController.ts +1 -1
- package/src/controller/helpers.controller.ts +15 -0
- package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
- package/src/controller/manage/FlowConfigManageApi.ts +4 -2
- package/src/controller/manage/SysConfigMangeApi.ts +6 -1
- package/src/controller/manage/UserAccountManageApi.ts +7 -2
- package/src/index.ts +2 -2
- package/src/libs/crud-pro/CrudPro.ts +134 -7
- package/src/libs/crud-pro/exceptions.ts +8 -0
- package/src/libs/crud-pro/interfaces.ts +111 -15
- package/src/libs/crud-pro/models/CrudResult.ts +178 -0
- package/src/libs/crud-pro/models/RequestModel.ts +2 -2
- package/src/libs/crud-pro/models/ServiceHub.ts +4 -0
- package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +238 -15
- package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
- package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +110 -3
- package/src/libs/crud-pro/services/CurdProServiceHub.ts +8 -0
- package/src/libs/crud-pro-quick/CrudProQuick.ts +782 -0
- package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
- package/src/libs/crud-pro-quick/index.ts +52 -0
- package/src/libs/crud-pro-quick/models.ts +35 -0
- package/src/libs/crud-sharding/ShardingBase.ts +256 -0
- package/src/libs/crud-sharding/ShardingByCustomCrud.ts +329 -0
- package/src/libs/crud-sharding/ShardingByHashCrud.ts +111 -0
- package/src/libs/crud-sharding/ShardingByKeyCrud.ts +97 -0
- package/src/libs/crud-sharding/ShardingByTimeCrud.ts +628 -0
- package/src/libs/crud-sharding/ShardingConfig.ts +28 -10
- package/src/libs/crud-sharding/ShardingMerger.ts +35 -63
- package/src/libs/crud-sharding/ShardingResult.ts +29 -0
- package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
- package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
- package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
- package/src/libs/crud-sharding/index.ts +30 -16
- package/src/models/RedisKeys.ts +1 -0
- package/src/models/bizmodels.ts +4 -7
- package/src/service/SysAppService.ts +18 -7
- package/src/service/SysConfigService.ts +8 -3
- package/src/service/SysDictDataService.ts +14 -4
- package/src/service/SysMenuService.ts +7 -2
- package/src/service/TableMetaCacheRedisSubscriber.ts +105 -0
- package/src/service/crudstd/CrudStdService.ts +2 -2
- package/src/service/curd/CurdMixService.ts +26 -5
- package/src/service/curd/CurdProService.ts +186 -45
- package/src/service/flow/FlowConfigService.ts +7 -2
- package/src/service/flow/FlowInstanceCrudService.ts +23 -20
- package/.qoder/skills/midway-fatcms-crud/SKILL.md +0 -375
- package/.qoder/skills/midway-fatcms-crud/examples.md +0 -990
- package/.qoder/skills/midway-fatcms-crud/reference.md +0 -568
- package/dist/libs/crud-pro/README.md +0 -809
- package/dist/libs/crud-pro/README_FUNC.md +0 -193
- package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
- package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +0 -363
- package/dist/libs/crud-sharding/ShardingCrudPro.js +0 -675
- package/dist/libs/crud-sharding/ShardingRouter.d.ts +0 -69
- package/dist/libs/crud-sharding/ShardingRouter.js +0 -377
- package/dist/models/StandardColumns.d.ts +0 -71
- package/dist/models/StandardColumns.js +0 -28
- package/dist/service/curd/CrudProQuick.d.ts +0 -190
- package/dist/service/curd/CrudProQuick.js +0 -319
- package/dist/service/curd/README.md +0 -1100
- package/dist/service/curd/fixSoftDelete.d.ts +0 -20
- package/src/libs/crud-pro/README.md +0 -809
- package/src/libs/crud-pro/README_FUNC.md +0 -193
- package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
- package/src/libs/crud-sharding/ShardingCrudPro.ts +0 -835
- package/src/libs/crud-sharding/ShardingRouter.ts +0 -512
- package/src/models/StandardColumns.ts +0 -76
- package/src/service/curd/CrudProQuick.ts +0 -360
- package/src/service/curd/README.md +0 -1100
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
# 配置模型与返回类型
|
|
2
|
+
|
|
3
|
+
## 请求参数结构
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
interface IRequestModel {
|
|
7
|
+
method?: string;
|
|
8
|
+
condition?: IRequestCondition; // 查询条件(支持比较操作符、逻辑组合)
|
|
9
|
+
data?: Record<string, any> | any[]; // 单条或批量插入/更新的数据
|
|
10
|
+
pageNo?: number;
|
|
11
|
+
pageSize?: number;
|
|
12
|
+
orderBy?: string | IOrderByItem[];
|
|
13
|
+
columns?: string | string[];
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 条件类型定义
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
type IBasicType = boolean | string | number;
|
|
21
|
+
|
|
22
|
+
// 比较操作符条件
|
|
23
|
+
interface ICompareCondition {
|
|
24
|
+
$ne?: IBasicType; // 不等于
|
|
25
|
+
$lt?: IBasicType; // 小于
|
|
26
|
+
$lte?: IBasicType; // 小于或等于
|
|
27
|
+
$gt?: IBasicType; // 大于
|
|
28
|
+
$gte?: IBasicType; // 大于或等于
|
|
29
|
+
$in?: IBasicType[]; // 在集合中
|
|
30
|
+
$nin?: IBasicType[]; // 不在集合中
|
|
31
|
+
$range?: [number, number]; // BETWEEN ... AND
|
|
32
|
+
$like?: string; // 前缀匹配 A%
|
|
33
|
+
$notLike?: string; // 非前缀匹配
|
|
34
|
+
$likeInclude?: string; // 包含匹配 %A%
|
|
35
|
+
$notLikeInclude?: string; // 不包含匹配
|
|
36
|
+
$match?: string; // MySQL 全文索引
|
|
37
|
+
$matchBool?: string | boolean; // MySQL 布尔全文索引
|
|
38
|
+
$null?: boolean; // IS NULL(仅 true 生效)
|
|
39
|
+
$notNull?: boolean; // IS NOT NULL(仅 true 生效)
|
|
40
|
+
$jsonArrayContains?: string; // JSON 数组包含
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 逻辑操作符条件
|
|
44
|
+
interface ILogicalCondition {
|
|
45
|
+
$or?: IRequestCondition[]; // 逻辑或
|
|
46
|
+
$and?: IRequestCondition[]; // 逻辑与
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 查询条件类型(字段值匹配 + 比较操作符 + 逻辑组合)
|
|
50
|
+
interface IRequestCondition extends Record<string, IBasicType | ICompareCondition | ILogicalCondition | IRequestCondition[] | undefined>, ILogicalCondition {
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## SQL 操作类型
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
enum KeysOfSimpleSQL {
|
|
58
|
+
SIMPLE_QUERY // SELECT 带条件
|
|
59
|
+
SIMPLE_QUERY_ONE // SELECT ... LIMIT 1
|
|
60
|
+
SIMPLE_QUERY_PAGE // 分页查询
|
|
61
|
+
SIMPLE_QUERY_COUNT // COUNT 查询
|
|
62
|
+
SIMPLE_QUERY_EXIST // EXISTS 查询
|
|
63
|
+
SIMPLE_INSERT // 插入单条
|
|
64
|
+
SIMPLE_BATCH_INSERT // 批量插入
|
|
65
|
+
SIMPLE_UPDATE // 更新
|
|
66
|
+
SIMPLE_DELETE // 删除
|
|
67
|
+
SIMPLE_INSERT_OR_UPDATE // 先查再插/更
|
|
68
|
+
SIMPLE_INSERT_ON_DUPLICATE_UPDATE // 原生 upsert
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 返回类型
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// 写操作
|
|
76
|
+
interface CrudWriteResult {
|
|
77
|
+
affectedRows: number;
|
|
78
|
+
insertId?: string | number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 单条查询
|
|
82
|
+
interface CrudQueryOneResult<T> {
|
|
83
|
+
row: T | null;
|
|
84
|
+
found: boolean;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 列表查询
|
|
88
|
+
interface CrudQueryListResult<T> {
|
|
89
|
+
rows: T[];
|
|
90
|
+
count: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// 分页查询
|
|
94
|
+
interface CrudQueryPageResult<T> {
|
|
95
|
+
rows: T[];
|
|
96
|
+
totalCount: number;
|
|
97
|
+
count: number;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 存在性
|
|
101
|
+
interface CrudExistResult {
|
|
102
|
+
exists: boolean;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Upsert
|
|
106
|
+
interface CrudUpsertResult {
|
|
107
|
+
insertAffected?: { affectedRows: number; insertId?: number };
|
|
108
|
+
updateAffected?: { affectedRows: number };
|
|
109
|
+
isExist: boolean;
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 关联配置(columnsRelation)
|
|
114
|
+
|
|
115
|
+
`columnsRelation` 用于配置关联数据填充,实现字典翻译、用户信息填充等功能。
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
interface ColumnRelation {
|
|
119
|
+
relatedType: 'dict' | 'sysCfgEnum' | 'accountBasic' | 'workbenchBasic' | 'linkToCustom';
|
|
120
|
+
relatedCode?: string; // 关联编码(dict/sysCfgEnum/linkToCustom 时必填)
|
|
121
|
+
sourceColumn: string; // 从结果行中取值的字段名
|
|
122
|
+
targetColumns?: CopyAttr[]; // 映射规则
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
interface CopyAttr {
|
|
126
|
+
from: string; // 关联数据中的字段名,支持 '*' 表示整体赋值
|
|
127
|
+
to: string; // 写入结果行的目标路径(支持嵌套,如 'user_info.name')
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 关联类型详解
|
|
132
|
+
|
|
133
|
+
#### dict - 数据字典
|
|
134
|
+
|
|
135
|
+
从 `sys_data_dict_item` 表查询字典数据,按 `dict_code` + `value` 匹配。
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
{
|
|
139
|
+
relatedType: 'dict',
|
|
140
|
+
relatedCode: 'OrderStatusEnum', // 字典编码
|
|
141
|
+
sourceColumn: 'status', // 结果行中的 status 字段值作为字典 value
|
|
142
|
+
targetColumns: [
|
|
143
|
+
{ from: 'label', to: 'status_text' }, // 字典 label → status_text
|
|
144
|
+
{ from: 'color', to: 'status_color' }, // 字典 color → status_color
|
|
145
|
+
],
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### sysCfgEnum - 系统配置枚举
|
|
150
|
+
|
|
151
|
+
从 `sys_configs` 表查询配置,按 `code` 列作为唯一键匹配。
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
{
|
|
155
|
+
relatedType: 'sysCfgEnum',
|
|
156
|
+
relatedCode: 'OrderStatus', // 配置 code
|
|
157
|
+
sourceColumn: 'order_status',
|
|
158
|
+
targetColumns: [
|
|
159
|
+
{ from: 'label', to: 'order_status_info.label' },
|
|
160
|
+
{ from: 'style', to: 'order_status_info.style' },
|
|
161
|
+
],
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
#### accountBasic - 用户账号信息
|
|
166
|
+
|
|
167
|
+
根据 `sourceColumn` 中的用户 ID,查询用户基本信息(昵称、头像等)。
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
{
|
|
171
|
+
relatedType: 'accountBasic',
|
|
172
|
+
sourceColumn: 'created_by', // 用户 ID 字段
|
|
173
|
+
targetColumns: [], // 空数组使用默认映射
|
|
174
|
+
}
|
|
175
|
+
// 自动填充字段:created_by_nickname, created_by_avatar, created_by_account_type
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**用户 ID 适配**:支持数字、字符串、JSON 数组等多种 ID 格式,自动转换。
|
|
179
|
+
|
|
180
|
+
#### workbenchBasic - 工作台站点信息
|
|
181
|
+
|
|
182
|
+
根据 `workbench_code` 查询站点信息。
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
{
|
|
186
|
+
relatedType: 'workbenchBasic',
|
|
187
|
+
sourceColumn: 'workbench_code',
|
|
188
|
+
targetColumns: [
|
|
189
|
+
{ from: 'workbench_domain', to: 'workbench_info.workbench_domain' },
|
|
190
|
+
{ from: 'workbench_name', to: 'workbench_info.workbench_name' },
|
|
191
|
+
],
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
支持数组字段(如 `workbench_code_array`),目标路径使用 `$ARRAY_INDEX` 占位符:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
{
|
|
199
|
+
relatedType: 'workbenchBasic',
|
|
200
|
+
sourceColumn: 'workbench_code_array',
|
|
201
|
+
targetColumns: [
|
|
202
|
+
{ from: 'workbench_domain', to: 'workbench_info_array[$ARRAY_INDEX].workbench_domain' },
|
|
203
|
+
],
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
#### linkToCustom - 自定义表关联
|
|
208
|
+
|
|
209
|
+
关联任意自定义表,需在 `sys_configs` 中配置关联规则。
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
{
|
|
213
|
+
relatedType: 'linkToCustom',
|
|
214
|
+
relatedCode: 'categoryLinkConfig', // 关联配置编码
|
|
215
|
+
sourceColumn: 'category_id',
|
|
216
|
+
targetColumns: [], // 使用配置中的默认映射
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 使用示例
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
const cfgModel = {
|
|
224
|
+
method: 'order.list',
|
|
225
|
+
sqlTable: 't_order',
|
|
226
|
+
sqlSimpleName: 'SIMPLE_QUERY_PAGE',
|
|
227
|
+
columnsRelation: [
|
|
228
|
+
// 订单状态字典翻译
|
|
229
|
+
{
|
|
230
|
+
relatedType: 'dict',
|
|
231
|
+
relatedCode: 'OrderStatusEnum',
|
|
232
|
+
sourceColumn: 'status',
|
|
233
|
+
targetColumns: [{ from: 'label', to: 'status_text' }],
|
|
234
|
+
},
|
|
235
|
+
// 创建者信息填充
|
|
236
|
+
{
|
|
237
|
+
relatedType: 'accountBasic',
|
|
238
|
+
sourceColumn: 'created_by',
|
|
239
|
+
targetColumns: [], // 使用默认映射
|
|
240
|
+
},
|
|
241
|
+
// 所属站点信息
|
|
242
|
+
{
|
|
243
|
+
relatedType: 'workbenchBasic',
|
|
244
|
+
sourceColumn: 'workbench_code',
|
|
245
|
+
targetColumns: [
|
|
246
|
+
{ from: 'workbench_name', to: 'site_name' },
|
|
247
|
+
],
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const ctx = await this.curdMixService.executeCrudByCfg(
|
|
253
|
+
{ condition: {}, pageNo: 1, pageSize: 10, orderBy: 'created_at DESC' },
|
|
254
|
+
cfgModel
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
const { rows } = ctx.getResModelForQueryPage();
|
|
258
|
+
// rows 自动包含 status_text、created_by_nickname、site_name 等字段
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 独立关联填充
|
|
262
|
+
|
|
263
|
+
对已有数据(如从缓存获取的)执行关联填充:
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
await this.curdMixService.linkColumnRelationDatas(rows, {
|
|
267
|
+
columnsRelations: [
|
|
268
|
+
{
|
|
269
|
+
relatedType: 'dict',
|
|
270
|
+
relatedCode: 'OrderStatusEnum',
|
|
271
|
+
sourceColumn: 'status',
|
|
272
|
+
targetColumns: [{ from: 'label', to: 'status_text' }],
|
|
273
|
+
},
|
|
274
|
+
],
|
|
275
|
+
});
|
|
276
|
+
// rows 中的每行自动追加 status_text 字段
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## 标准字段
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
interface StandardDataModel {
|
|
283
|
+
deleted_at?: number;
|
|
284
|
+
deleted_by?: string;
|
|
285
|
+
created_by?: string;
|
|
286
|
+
created_at?: number;
|
|
287
|
+
modified_by?: string;
|
|
288
|
+
modified_at?: number;
|
|
289
|
+
}
|
|
290
|
+
```
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# 内置函数参考
|
|
2
|
+
|
|
3
|
+
CrudPro 的 `IFuncCfgModel` 支持 `functionName` 方式调用内置函数。内置函数由四个工具类注册:`DateTimeUtils`、`CompareUtils`、`MixinUtils`、`TypeUtils`。
|
|
4
|
+
|
|
5
|
+
## 调用方式
|
|
6
|
+
|
|
7
|
+
### 无参调用
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
'data.created_at': { functionName: 'getCurrentTimeString' }
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### 带参调用
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
'data.order_date': {
|
|
17
|
+
functionName: 'getCurrentDateFormat',
|
|
18
|
+
functionParams: ['YYYYMMDD']
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`functionParams` 支持嵌套 `IFuncCfgModel`:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
{
|
|
26
|
+
functionName: 'eq',
|
|
27
|
+
functionParams: [
|
|
28
|
+
{ contextAsBool: 'res.is_exist' },
|
|
29
|
+
{ constBool: false }
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## DateTimeUtils — 日期时间
|
|
37
|
+
|
|
38
|
+
| 函数名 | 参数 | 返回值 | 说明 |
|
|
39
|
+
|--------|------|--------|------|
|
|
40
|
+
| `getCurrentTimeStampMs` | 无 | `number` | 当前时间戳(毫秒) |
|
|
41
|
+
| `getCurrentTimeStampSecond` | 无 | `number` | 当前时间戳(秒) |
|
|
42
|
+
| `getCurrentTimeString` | 无 | `string` | `YYYY-MM-DD HH:mm:ss` |
|
|
43
|
+
| `getCurrentDateFormat` | `format: string` | `string` | 按格式返回当前时间 |
|
|
44
|
+
| `getYesterdayDateFormat` | `format: string` | `string` | 按格式返回昨天时间 |
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
updateCfg: {
|
|
48
|
+
'data.created_at': { functionName: 'getCurrentTimeString' },
|
|
49
|
+
'data.created_ts': { functionName: 'getCurrentTimeStampMs' },
|
|
50
|
+
'data.order_date': {
|
|
51
|
+
functionName: 'getCurrentDateFormat',
|
|
52
|
+
functionParams: ['YYYYMMDD']
|
|
53
|
+
},
|
|
54
|
+
'data.yesterday': {
|
|
55
|
+
functionName: 'getYesterdayDateFormat',
|
|
56
|
+
functionParams: ['YYYY-MM-DD']
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## CompareUtils — 比较运算
|
|
64
|
+
|
|
65
|
+
| 函数名 | 参数 | 返回值 | 说明 |
|
|
66
|
+
|--------|------|--------|------|
|
|
67
|
+
| `eq` | `a, b` | `boolean` | 相等(`==`) |
|
|
68
|
+
| `ne` | `a, b` | `boolean` | 不相等 |
|
|
69
|
+
| `gt` | `a, b` | `boolean` | 大于 |
|
|
70
|
+
| `gte` | `a, b` | `boolean` | 大于等于 |
|
|
71
|
+
| `lt` | `a, b` | `boolean` | 小于 |
|
|
72
|
+
| `lte` | `a, b` | `boolean` | 小于等于 |
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// executeWhen:仅当 is_exist 为 false 时执行
|
|
76
|
+
executeWhen: {
|
|
77
|
+
functionName: 'eq',
|
|
78
|
+
functionParams: [{ contextAsBool: 'res.is_exist' }, { constBool: false }]
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// validate:确保数量大于 0
|
|
82
|
+
validate: {
|
|
83
|
+
functionName: 'gt',
|
|
84
|
+
functionParams: [{ context: '$current' }, { constNumber: 0 }],
|
|
85
|
+
message: '数量必须大于0'
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## MixinUtils — 通用工具
|
|
92
|
+
|
|
93
|
+
| 函数名 | 参数 | 返回值 | 说明 |
|
|
94
|
+
|--------|------|--------|------|
|
|
95
|
+
| `isNil` | `obj` | `boolean` | 是否为 null/undefined |
|
|
96
|
+
| `isNotNil` | `obj` | `boolean` | 不为 null 且不为 undefined |
|
|
97
|
+
| `isEmpty` | `obj` | `boolean` | 是否为空(null/空字符串/空数组/空对象) |
|
|
98
|
+
| `isNotEmpty` | `obj` | `boolean` | 是否非空 |
|
|
99
|
+
| `equals` | `a, b` | `boolean` | 严格相等(`===`) |
|
|
100
|
+
| `equalsIgnoreCase` | `str1, str2` | `boolean` | 忽略大小写比较 |
|
|
101
|
+
| `startsWith` | `str1, str2` | `boolean` | 字符串前缀判断 |
|
|
102
|
+
| `selectNotEmpty` | `a, b` | `any` | 返回第一个非空值 |
|
|
103
|
+
| `hasAny` | `a[], b[]` | `boolean` | A 是否包含 B 中任意元素 |
|
|
104
|
+
| `parseValueByType` | `value, type` | `any` | 按类型转换(string/number/boolean/array/JSONObject) |
|
|
105
|
+
| `sleepMs` | `ms` | `Promise` | 延时等待 |
|
|
106
|
+
| `uuid` | 无 | `string` | UUID v4 |
|
|
107
|
+
| `generateSnowflakeId` | `machineId?` | `string` | 雪花ID(64位整数字符串) |
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
updateCfg: {
|
|
111
|
+
// UUID v4
|
|
112
|
+
'data.id': { functionName: 'uuid' },
|
|
113
|
+
|
|
114
|
+
// 雪花ID(时间有序)
|
|
115
|
+
'data.order_id': { functionName: 'generateSnowflakeId' },
|
|
116
|
+
|
|
117
|
+
// 雪花ID + 机器ID(多实例部署)
|
|
118
|
+
'data.trace_id': {
|
|
119
|
+
functionName: 'generateSnowflakeId',
|
|
120
|
+
functionParams: [1] // 0-1023
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
> **雪花ID machineId 优先级**:函数参数 > 环境变量 `SNOWFLAKE_MACHINE_ID` > `process.pid` 低10位
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## TypeUtils — 类型判断
|
|
130
|
+
|
|
131
|
+
| 函数名 | 参数 | 返回值 | 说明 |
|
|
132
|
+
|--------|------|--------|------|
|
|
133
|
+
| `isBasicType` | `value` | `boolean` | 基础类型(boolean/string/number/null) |
|
|
134
|
+
| `isBoolean` | `value` | `boolean` | 布尔值 |
|
|
135
|
+
| `isString` | `value` | `boolean` | 字符串 |
|
|
136
|
+
| `isInteger` | `value` | `boolean` | 整数 |
|
|
137
|
+
| `isNumber` | `value` | `boolean` | 数字 |
|
|
138
|
+
| `isNumeric` | `value` | `boolean` | 数字或可转换数字的字符串 |
|
|
139
|
+
| `isValidName` | `value` | `boolean` | 合法命名(字母开头,字母/数字/下划线) |
|
|
140
|
+
| `isChinesePhone` | `value` | `boolean` | 中文手机号 |
|
|
141
|
+
| `isEmailStrValid` | `value` | `boolean` | 合法邮箱地址 |
|
|
142
|
+
| `pickNumber` | `s: string` | `number | null` | 从字符串提取数字 |
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 上下文取值
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
updateCfg: {
|
|
150
|
+
'data.created_by': { context: 'visitor.accountId' },
|
|
151
|
+
'data.created_nickname': { context: 'visitor.nickName' },
|
|
152
|
+
'data.created_avatar': { context: 'visitor.avatar' },
|
|
153
|
+
'data.workbench_code': { context: 'workbenchCode' },
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**常用上下文路径:**
|
|
158
|
+
|
|
159
|
+
| 路径 | 说明 |
|
|
160
|
+
|------|------|
|
|
161
|
+
| `visitor.accountId` | 当前用户ID |
|
|
162
|
+
| `visitor.nickName` | 当前用户昵称 |
|
|
163
|
+
| `visitor.avatar` | 当前用户头像 |
|
|
164
|
+
| `visitor.accountType` | 用户类型 |
|
|
165
|
+
| `workbenchCode` | 当前工作台编码 |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 校验器
|
|
170
|
+
|
|
171
|
+
| 校验器 | 说明 |
|
|
172
|
+
|--------|------|
|
|
173
|
+
| `required` | 必填 |
|
|
174
|
+
| `string` | 字符串 |
|
|
175
|
+
| `number` | 数字 |
|
|
176
|
+
| `integer` | 整数 |
|
|
177
|
+
| `boolean` | 布尔值 |
|
|
178
|
+
| `email` | 邮箱格式 |
|
|
179
|
+
| `phone:cn` | 中国手机号 |
|
|
180
|
+
| `array` | 数组 |
|
|
181
|
+
| `array:string` | 字符串数组 |
|
|
182
|
+
| `array:number` | 数字数组 |
|
|
183
|
+
| `length:1,50` | 长度范围 |
|
|
184
|
+
| `scale:[1,3]` | 数值范围 |
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
validateCfg: {
|
|
188
|
+
'data.name': ['required', 'string', 'length:2,50'],
|
|
189
|
+
'data.email': ['required', 'email'],
|
|
190
|
+
'data.age': ['integer', 'scale:[0,150]'],
|
|
191
|
+
'data.phone': ['phone:cn'],
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 自定义函数扩展
|
|
198
|
+
|
|
199
|
+
继承 `BaseExecuteContextFunc`,覆写 `getFunctionMap()`:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
import { BaseExecuteContextFunc } from 'midway-fatcms';
|
|
203
|
+
|
|
204
|
+
class MyContextFunc extends BaseExecuteContextFunc {
|
|
205
|
+
getFunctionMap(): any {
|
|
206
|
+
return {
|
|
207
|
+
// 无参函数
|
|
208
|
+
generateOrderNo: (prefix: string) => {
|
|
209
|
+
return prefix + Date.now().toString(36).toUpperCase();
|
|
210
|
+
},
|
|
211
|
+
|
|
212
|
+
// 带参函数
|
|
213
|
+
formatAmount: (amount: number, currency: string) => {
|
|
214
|
+
return currency + ' ' + amount.toFixed(2);
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
// 访问上下文(必须用普通 function,不能用箭头函数)
|
|
218
|
+
getVisitorName: function(this: any) {
|
|
219
|
+
return this.reqModel?.visitor?.nickName || 'anonymous';
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**使用自定义函数:**
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
const cfgJson = {
|
|
230
|
+
method: 'order.create',
|
|
231
|
+
sqlSimpleName: 'SIMPLE_INSERT',
|
|
232
|
+
updateCfg: {
|
|
233
|
+
'data.order_no': {
|
|
234
|
+
functionName: 'generateOrderNo',
|
|
235
|
+
functionParams: ['ORD']
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
> **注意**:自定义函数优先级高于内置函数,可覆盖同名内置函数。
|