midway-fatcms 0.0.7 → 0.0.8

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.
Files changed (120) hide show
  1. package/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
  2. package/.qoder/skills/midway-fatcms/02-crud-quick.md +337 -0
  3. package/.qoder/skills/midway-fatcms/03-crud-sharding.md +488 -0
  4. package/.qoder/skills/midway-fatcms/04-condition-operators.md +93 -0
  5. package/.qoder/skills/midway-fatcms/05-configuration.md +290 -0
  6. package/.qoder/skills/midway-fatcms/06-builtin-functions.md +241 -0
  7. package/.qoder/skills/midway-fatcms/07-examples.md +500 -0
  8. package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
  9. package/README.md +9 -9
  10. package/dist/controller/base/BaseApiController.d.ts +1 -2
  11. package/dist/controller/base/BaseApiController.js +0 -4
  12. package/dist/controller/gateway/DocGatewayController.js +1 -1
  13. package/dist/controller/manage/FlowConfigManageApi.js +4 -2
  14. package/dist/controller/manage/SysConfigMangeApi.js +6 -1
  15. package/dist/controller/manage/UserAccountManageApi.js +7 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +2 -2
  18. package/dist/libs/crud-pro/CrudPro.d.ts +23 -2
  19. package/dist/libs/crud-pro/CrudPro.js +53 -2
  20. package/dist/libs/crud-pro/interfaces.d.ts +82 -12
  21. package/dist/libs/crud-pro/models/CrudResult.d.ts +115 -0
  22. package/dist/libs/crud-pro/models/CrudResult.js +126 -0
  23. package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -2
  24. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
  25. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
  26. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +1 -2
  27. package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +295 -0
  28. package/dist/libs/crud-pro-quick/CrudProQuick.js +529 -0
  29. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
  30. package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
  31. package/dist/libs/crud-pro-quick/index.d.ts +36 -0
  32. package/dist/libs/crud-pro-quick/index.js +49 -0
  33. package/dist/libs/crud-pro-quick/models.d.ts +33 -0
  34. package/dist/libs/crud-pro-quick/models.js +2 -0
  35. package/dist/libs/crud-sharding/ShardingConfig.d.ts +15 -2
  36. package/dist/libs/crud-sharding/ShardingConfig.js +2 -2
  37. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +119 -274
  38. package/dist/libs/crud-sharding/ShardingCrudPro.js +544 -340
  39. package/dist/libs/crud-sharding/ShardingMerger.d.ts +10 -18
  40. package/dist/libs/crud-sharding/ShardingMerger.js +27 -44
  41. package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
  42. package/dist/libs/crud-sharding/ShardingResult.js +16 -0
  43. package/dist/libs/crud-sharding/ShardingRouter.d.ts +1 -0
  44. package/dist/libs/crud-sharding/ShardingRouter.js +25 -6
  45. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
  46. package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
  47. package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
  48. package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
  49. package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  50. package/dist/libs/crud-sharding/index.d.ts +4 -3
  51. package/dist/libs/crud-sharding/index.js +14 -2
  52. package/dist/models/bizmodels.d.ts +2 -6
  53. package/dist/service/SysAppService.d.ts +2 -2
  54. package/dist/service/SysAppService.js +16 -5
  55. package/dist/service/SysConfigService.d.ts +1 -1
  56. package/dist/service/SysConfigService.js +7 -2
  57. package/dist/service/SysDictDataService.js +14 -4
  58. package/dist/service/SysMenuService.js +7 -2
  59. package/dist/service/curd/CurdMixService.d.ts +6 -4
  60. package/dist/service/curd/CurdMixService.js +16 -2
  61. package/dist/service/curd/CurdProService.d.ts +43 -27
  62. package/dist/service/curd/CurdProService.js +32 -33
  63. package/dist/service/flow/FlowConfigService.js +7 -2
  64. package/dist/service/flow/FlowInstanceCrudService.js +22 -19
  65. package/package.json +1 -1
  66. package/src/controller/base/BaseApiController.ts +0 -5
  67. package/src/controller/gateway/DocGatewayController.ts +1 -1
  68. package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
  69. package/src/controller/manage/FlowConfigManageApi.ts +4 -2
  70. package/src/controller/manage/SysConfigMangeApi.ts +6 -1
  71. package/src/controller/manage/UserAccountManageApi.ts +7 -2
  72. package/src/index.ts +2 -2
  73. package/src/libs/crud-pro/CrudPro.ts +62 -4
  74. package/src/libs/crud-pro/interfaces.ts +110 -15
  75. package/src/libs/crud-pro/models/CrudResult.ts +178 -0
  76. package/src/libs/crud-pro/models/RequestModel.ts +2 -2
  77. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
  78. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
  79. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +1 -2
  80. package/src/libs/crud-pro-quick/CrudProQuick.ts +594 -0
  81. package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
  82. package/src/libs/crud-pro-quick/index.ts +52 -0
  83. package/src/libs/crud-pro-quick/models.ts +35 -0
  84. package/src/libs/crud-sharding/ShardingConfig.ts +18 -2
  85. package/src/libs/crud-sharding/ShardingCrudPro.ts +660 -390
  86. package/src/libs/crud-sharding/ShardingMerger.ts +35 -63
  87. package/src/libs/crud-sharding/ShardingResult.ts +29 -0
  88. package/src/libs/crud-sharding/ShardingRouter.ts +27 -6
  89. package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
  90. package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
  91. package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  92. package/src/libs/crud-sharding/index.ts +14 -3
  93. package/src/models/bizmodels.ts +4 -7
  94. package/src/service/SysAppService.ts +18 -7
  95. package/src/service/SysConfigService.ts +8 -3
  96. package/src/service/SysDictDataService.ts +14 -4
  97. package/src/service/SysMenuService.ts +7 -2
  98. package/src/service/crudstd/CrudStdService.ts +2 -2
  99. package/src/service/curd/CurdMixService.ts +26 -5
  100. package/src/service/curd/CurdProService.ts +58 -39
  101. package/src/service/flow/FlowConfigService.ts +7 -2
  102. package/src/service/flow/FlowInstanceCrudService.ts +23 -20
  103. package/.qoder/skills/midway-fatcms-crud/SKILL.md +0 -375
  104. package/.qoder/skills/midway-fatcms-crud/examples.md +0 -990
  105. package/.qoder/skills/midway-fatcms-crud/reference.md +0 -568
  106. package/dist/libs/crud-pro/README.md +0 -809
  107. package/dist/libs/crud-pro/README_FUNC.md +0 -193
  108. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  109. package/dist/models/StandardColumns.d.ts +0 -71
  110. package/dist/models/StandardColumns.js +0 -28
  111. package/dist/service/curd/CrudProQuick.d.ts +0 -190
  112. package/dist/service/curd/CrudProQuick.js +0 -319
  113. package/dist/service/curd/README.md +0 -1100
  114. package/dist/service/curd/fixSoftDelete.d.ts +0 -20
  115. package/src/libs/crud-pro/README.md +0 -809
  116. package/src/libs/crud-pro/README_FUNC.md +0 -193
  117. package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  118. package/src/models/StandardColumns.ts +0 -76
  119. package/src/service/curd/CrudProQuick.ts +0 -360
  120. 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
+ > **注意**:自定义函数优先级高于内置函数,可覆盖同名内置函数。