midway-fatcms 0.0.4 → 0.0.6

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 (126) hide show
  1. package/README.md +635 -352
  2. package/dist/controller/manage/CrudStandardDesignApi.d.ts +0 -2
  3. package/dist/controller/manage/CrudStandardDesignApi.js +11 -85
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.js +2 -0
  6. package/dist/libs/crud-pro/CrudPro.d.ts +9 -1
  7. package/dist/libs/crud-pro/CrudPro.js +15 -0
  8. package/dist/libs/crud-pro/README.md +809 -0
  9. package/dist/libs/crud-pro/README_FUNC.md +193 -0
  10. package/dist/libs/crud-pro/exceptions.d.ts +2 -0
  11. package/dist/libs/crud-pro/exceptions.js +2 -0
  12. package/dist/libs/crud-pro/interfaces.d.ts +34 -1
  13. package/dist/libs/crud-pro/models/ExecuteContext.d.ts +3 -3
  14. package/dist/libs/crud-pro/models/ExecuteContext.js +2 -0
  15. package/dist/libs/crud-pro/models/RequestModel.d.ts +41 -1
  16. package/dist/libs/crud-pro/models/RequestModel.js +103 -39
  17. package/dist/libs/crud-pro/models/ResModel.d.ts +6 -4
  18. package/dist/libs/crud-pro/models/ServiceHub.d.ts +1 -0
  19. package/dist/libs/crud-pro/models/keys.d.ts +6 -1
  20. package/dist/libs/crud-pro/models/keys.js +5 -0
  21. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +52 -0
  22. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +158 -0
  23. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +20 -1
  24. package/dist/libs/crud-pro/services/CrudProFieldValidateService.d.ts +7 -0
  25. package/dist/libs/crud-pro/services/CrudProFieldValidateService.js +32 -0
  26. package/dist/libs/crud-pro/services/CrudProGenSqlService.d.ts +13 -0
  27. package/dist/libs/crud-pro/services/CrudProGenSqlService.js +44 -7
  28. package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.d.ts +43 -0
  29. package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +132 -1
  30. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +15 -1
  31. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +107 -0
  32. package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +5 -1
  33. package/dist/libs/crud-pro/services/CurdProServiceHub.js +11 -0
  34. package/dist/libs/crud-pro/utils/DateTimeUtils.d.ts +1 -0
  35. package/dist/libs/crud-pro/utils/DateTimeUtils.js +3 -0
  36. package/dist/libs/crud-pro/utils/MixinUtils.d.ts +32 -0
  37. package/dist/libs/crud-pro/utils/MixinUtils.js +85 -1
  38. package/dist/libs/crud-pro/utils/ValidateUtils.js +1 -1
  39. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +944 -0
  40. package/dist/libs/crud-sharding/ShardingConfig.d.ts +218 -0
  41. package/dist/libs/crud-sharding/ShardingConfig.js +32 -0
  42. package/dist/libs/crud-sharding/ShardingCountCache.d.ts +69 -0
  43. package/dist/libs/crud-sharding/ShardingCountCache.js +160 -0
  44. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +363 -0
  45. package/dist/libs/crud-sharding/ShardingCrudPro.js +699 -0
  46. package/dist/libs/crud-sharding/ShardingMerger.d.ts +130 -0
  47. package/dist/libs/crud-sharding/ShardingMerger.js +280 -0
  48. package/dist/libs/crud-sharding/ShardingRouter.d.ts +69 -0
  49. package/dist/libs/crud-sharding/ShardingRouter.js +377 -0
  50. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +146 -0
  51. package/dist/libs/crud-sharding/ShardingTableCreator.js +805 -0
  52. package/dist/libs/crud-sharding/ShardingUtils.d.ts +38 -0
  53. package/dist/libs/crud-sharding/ShardingUtils.js +77 -0
  54. package/dist/libs/crud-sharding/index.d.ts +45 -0
  55. package/dist/libs/crud-sharding/index.js +55 -0
  56. package/dist/models/StandardColumns.d.ts +71 -0
  57. package/dist/models/StandardColumns.js +28 -0
  58. package/dist/service/SysAppService.js +2 -2
  59. package/dist/service/SysConfigService.js +1 -1
  60. package/dist/service/SysDictDataService.js +2 -2
  61. package/dist/service/SysMenuService.js +1 -1
  62. package/dist/service/UserAccountService.d.ts +1 -1
  63. package/dist/service/crudstd/CrudStdService.d.ts +0 -1
  64. package/dist/service/crudstd/CrudStdService.js +0 -27
  65. package/dist/service/curd/CrudProQuick.d.ts +134 -4
  66. package/dist/service/curd/CrudProQuick.js +155 -3
  67. package/dist/service/curd/CurdMixService.d.ts +2 -1
  68. package/dist/service/curd/CurdMixService.js +5 -1
  69. package/dist/service/curd/CurdProService.d.ts +44 -2
  70. package/dist/service/curd/CurdProService.js +53 -1
  71. package/dist/service/curd/README.md +1001 -0
  72. package/dist/service/curd/fixSoftDelete.d.ts +14 -0
  73. package/dist/service/curd/fixSoftDelete.js +29 -11
  74. package/dist/service/flow/FlowConfigService.js +1 -1
  75. package/dist/service/flow/FlowInstanceCrudService.js +1 -1
  76. package/package.json +3 -1
  77. package/src/controller/gateway/AsyncTaskController.ts +1 -1
  78. package/src/controller/manage/CrudStandardDesignApi.ts +16 -100
  79. package/src/index.ts +3 -0
  80. package/src/libs/crud-pro/CrudPro.ts +19 -1
  81. package/src/libs/crud-pro/README.md +809 -0
  82. package/src/libs/crud-pro/README_FUNC.md +193 -0
  83. package/src/libs/crud-pro/exceptions.ts +2 -0
  84. package/src/libs/crud-pro/interfaces.ts +38 -1
  85. package/src/libs/crud-pro/models/ExecuteContext.ts +6 -3
  86. package/src/libs/crud-pro/models/RequestModel.ts +108 -44
  87. package/src/libs/crud-pro/models/ResModel.ts +10 -4
  88. package/src/libs/crud-pro/models/ServiceHub.ts +2 -0
  89. package/src/libs/crud-pro/models/keys.ts +5 -0
  90. package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +171 -0
  91. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +24 -1
  92. package/src/libs/crud-pro/services/CrudProFieldValidateService.ts +53 -1
  93. package/src/libs/crud-pro/services/CrudProGenSqlService.ts +51 -7
  94. package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +159 -2
  95. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +139 -1
  96. package/src/libs/crud-pro/services/CurdProServiceHub.ts +16 -1
  97. package/src/libs/crud-pro/utils/DateTimeUtils.ts +3 -0
  98. package/src/libs/crud-pro/utils/MixinUtils.ts +97 -1
  99. package/src/libs/crud-pro/utils/ValidateUtils.ts +1 -1
  100. package/src/libs/crud-sharding/ROUTING_LOGIC.md +944 -0
  101. package/src/libs/crud-sharding/ShardingConfig.ts +240 -0
  102. package/src/libs/crud-sharding/ShardingCountCache.ts +200 -0
  103. package/src/libs/crud-sharding/ShardingCrudPro.ts +856 -0
  104. package/src/libs/crud-sharding/ShardingMerger.ts +382 -0
  105. package/src/libs/crud-sharding/ShardingRouter.ts +512 -0
  106. package/src/libs/crud-sharding/ShardingTableCreator.ts +1007 -0
  107. package/src/libs/crud-sharding/ShardingUtils.ts +84 -0
  108. package/src/libs/crud-sharding/index.ts +64 -0
  109. package/src/models/StandardColumns.ts +76 -0
  110. package/src/service/FileCenterService.ts +1 -1
  111. package/src/service/SysAppService.ts +2 -2
  112. package/src/service/SysConfigService.ts +1 -1
  113. package/src/service/SysDictDataService.ts +2 -2
  114. package/src/service/SysMenuService.ts +2 -2
  115. package/src/service/WorkbenchService.ts +1 -1
  116. package/src/service/anyapi/AnyApiService.ts +1 -1
  117. package/src/service/asyncTask/AsyncTaskRunnerService.ts +1 -1
  118. package/src/service/crudstd/CrudStdService.ts +0 -32
  119. package/src/service/curd/CrudProQuick.ts +164 -5
  120. package/src/service/curd/CurdMixService.ts +7 -2
  121. package/src/service/curd/CurdProService.ts +62 -3
  122. package/src/service/curd/README.md +1001 -0
  123. package/src/service/curd/fixCfgModel.ts +1 -2
  124. package/src/service/curd/fixSoftDelete.ts +38 -16
  125. package/src/service/flow/FlowConfigService.ts +1 -1
  126. package/src/service/flow/FlowInstanceCrudService.ts +1 -1
@@ -0,0 +1,363 @@
1
+ import { CrudPro } from '../../libs/crud-pro/CrudPro';
2
+ import { IRequestModel, IRequestCfgModel } from '../../libs/crud-pro/interfaces';
3
+ import { ExecuteContext } from '../../libs/crud-pro/models/ExecuteContext';
4
+ import { IShardingConfig } from './ShardingConfig';
5
+ import { IShardingPageQueryResult } from './ShardingMerger';
6
+ /**
7
+ * 智能批量插入结果
8
+ */
9
+ export interface IShardingSmartBatchInsertResult {
10
+ /** 总插入条数 */
11
+ totalAffected: number;
12
+ /** 各分表插入结果 */
13
+ tableResults: Array<{
14
+ table: string;
15
+ affected: number;
16
+ rowCount: number;
17
+ }>;
18
+ /** 涉及的分表数量 */
19
+ tableCount: number;
20
+ /** 是否全部成功 */
21
+ success: boolean;
22
+ /** 错误信息(如果有) */
23
+ errors: Array<{
24
+ table: string;
25
+ error: Error;
26
+ }>;
27
+ }
28
+ /**
29
+ * 分表 CRUD 操作封装器
30
+ *
31
+ * 在 CrudPro 之上封装分表功能,不修改 CrudPro 内部代码。
32
+ * 提供透明的分表路由和多表查询结果合并能力。
33
+ *
34
+ * 支持的分表策略:
35
+ * - YEAR: 按年分表,如 order_2024, order_2025
36
+ * - MONTH: 按月分表,如 order_202401, order_202402
37
+ * - DAY: 按日分表,如 order_20240101
38
+ * - RANGE: 按范围分表,如 user_0 ~ user_99
39
+ * - HASH: 按哈希分表,如 order_01 ~ order_16
40
+ * - CUSTOM: 自定义分表规则
41
+ *
42
+ * @example
43
+ * // 按月分表
44
+ * const sharding = new ShardingCrudPro(crudPro, {
45
+ * type: ShardingType.MONTH,
46
+ * baseTable: 't_order',
47
+ * timeColumn: 'created_at',
48
+ * });
49
+ *
50
+ * // 插入数据(自动路由到正确分表)
51
+ * await sharding.insert({ data: { order_id: '001', amount: 100, created_at: '2024-03-15' } });
52
+ *
53
+ * // 分页查询(自动合并多表结果)
54
+ * const result = await sharding.queryPage({
55
+ * condition: { created_at: { $gte: '2024-01-01', $lte: '2024-03-31' } },
56
+ * pageNo: 1,
57
+ * pageSize: 10,
58
+ * });
59
+ */
60
+ export declare class ShardingCrudPro {
61
+ private readonly crudPro;
62
+ private readonly config;
63
+ private readonly router;
64
+ private readonly merger;
65
+ private readonly tableCreator;
66
+ private baseCfg;
67
+ constructor(crudPro: CrudPro, config: IShardingConfig);
68
+ /**
69
+ * 设置基础配置(会应用到所有操作)
70
+ *
71
+ * @param cfg 配置项,如 sqlDatabase、sqlDbType 等
72
+ * @returns this,支持链式调用
73
+ *
74
+ * @example
75
+ * sharding.setBaseCfg({
76
+ * sqlDatabase: 'mydb',
77
+ * sqlDbType: SqlDbType.mysql,
78
+ * });
79
+ */
80
+ setBaseCfg(cfg: Partial<IRequestCfgModel>): this;
81
+ /**
82
+ * 获取分表配置
83
+ */
84
+ getConfig(): IShardingConfig;
85
+ /**
86
+ * 插入数据
87
+ *
88
+ * 根据分表规则自动路由到目标分表。
89
+ * 对于时间分表,需要确保 data 中包含时间字段。
90
+ * 对于哈希/范围分表,需要确保 data 中包含分表字段。
91
+ *
92
+ * 如果目标分表不存在且配置了 autoCreateTable,会自动创建分表。
93
+ *
94
+ * @param reqJson 请求参数,data 为要插入的数据
95
+ * @returns 执行上下文
96
+ *
97
+ * @example
98
+ * await sharding.insert({
99
+ * data: {
100
+ * order_id: 'ORD001',
101
+ * amount: 100,
102
+ * created_at: '2024-03-15 10:00:00',
103
+ * },
104
+ * });
105
+ */
106
+ insert(reqJson: IRequestModel): Promise<ExecuteContext>;
107
+ /**
108
+ * 批量插入数据(支持跨分表)
109
+ *
110
+ * 自动将数据按分表分组,并行插入到对应的分表。
111
+ *
112
+ * @param reqJson 请求参数,data 为要插入的数据数组
113
+ * @returns 批量插入结果
114
+ *
115
+ * 执行流程:
116
+ * 1. 遍历所有数据,根据分表字段计算目标分表
117
+ * 2. 将数据按分表分组
118
+ * 3. 并行执行各分表的批量插入
119
+ * 4. 汇总结果返回
120
+ *
121
+ * @example
122
+ * // 数据分布在不同月份的分表
123
+ * const result = await sharding.batchInsert({
124
+ * data: [
125
+ * { order_id: '001', amount: 100, created_at: '2024-01-15' }, // -> t_order_202401
126
+ * { order_id: '002', amount: 200, created_at: '2024-01-20' }, // -> t_order_202401
127
+ * { order_id: '003', amount: 150, created_at: '2024-02-10' }, // -> t_order_202402
128
+ * { order_id: '004', amount: 300, created_at: '2024-03-05' }, // -> t_order_202403
129
+ * ],
130
+ * });
131
+ *
132
+ * console.log(result.totalAffected); // 4
133
+ * console.log(result.tableCount); // 3
134
+ * console.log(result.tableResults);
135
+ * // [
136
+ * // { table: 't_order_202401', affected: 2, rowCount: 2 },
137
+ * // { table: 't_order_202402', affected: 1, rowCount: 1 },
138
+ * // { table: 't_order_202403', affected: 1, rowCount: 1 },
139
+ * // ]
140
+ */
141
+ batchInsert(reqJson: IRequestModel): Promise<IShardingSmartBatchInsertResult>;
142
+ /**
143
+ * 更新数据
144
+ *
145
+ * 根据条件中的分表字段自动路由到目标分表。
146
+ *
147
+ * @param reqJson 请求参数,condition 为更新条件,data 为更新数据
148
+ * @returns 执行上下文
149
+ *
150
+ * @example
151
+ * await sharding.update({
152
+ * condition: { order_id: 'ORD001', created_at: '2024-03-15' },
153
+ * data: { amount: 200 },
154
+ * });
155
+ */
156
+ update(reqJson: IRequestModel): Promise<ExecuteContext>;
157
+ /**
158
+ * 删除数据
159
+ *
160
+ * 根据条件中的分表字段自动路由到目标分表。
161
+ *
162
+ * @param reqJson 请求参数,condition 为删除条件
163
+ * @returns 执行上下文
164
+ */
165
+ delete(reqJson: IRequestModel): Promise<ExecuteContext>;
166
+ /**
167
+ * 插入或更新(存在则更新,不存在则插入)
168
+ *
169
+ * 路由逻辑:根据 condition 路由(先查询是否存在)
170
+ *
171
+ * @param reqJson 请求参数
172
+ * @returns 执行上下文
173
+ */
174
+ insertOrUpdate(reqJson: IRequestModel): Promise<ExecuteContext>;
175
+ /**
176
+ * 插入或更新(ON DUPLICATE KEY UPDATE)
177
+ *
178
+ * 路由逻辑:根据 condition 路由(先查询是否存在)
179
+ *
180
+ * @param reqJson 请求参数
181
+ * @returns 执行上下文
182
+ */
183
+ insertOnDuplicateUpdate(reqJson: IRequestModel): Promise<ExecuteContext>;
184
+ /**
185
+ * 查询单条记录
186
+ *
187
+ * 如果能根据条件确定单一分表,则查询单表;
188
+ * 否则按顺序查询各分表,返回第一条匹配记录。
189
+ *
190
+ * @param reqJson 请求参数,condition 为查询条件
191
+ * @returns 单条记录,未找到返回 null
192
+ *
193
+ * @example
194
+ * const order = await sharding.queryOne({
195
+ * condition: { order_id: 'ORD001' },
196
+ * });
197
+ */
198
+ queryOne(reqJson: IRequestModel): Promise<any>;
199
+ /**
200
+ * 查询列表
201
+ *
202
+ * 可能涉及多个分表,结果会自动合并。
203
+ *
204
+ * 使用约束:
205
+ * - 必须传 orderBy 参数
206
+ * - orderBy 必须为 timeColumn DESC 或 timeColumn ASC(如 'created_at DESC' / 'created_at ASC')
207
+ *
208
+ * @param reqJson 请求参数
209
+ * @returns 数据列表
210
+ *
211
+ * @example
212
+ * const orders = await sharding.query({
213
+ * condition: { created_at: { $gte: '2024-01-01', $lte: '2024-03-31' } },
214
+ * orderBy: 'created_at DESC', // 或 'created_at ASC'
215
+ * });
216
+ */
217
+ query(reqJson: IRequestModel): Promise<any[]>;
218
+ /**
219
+ * 分页查询
220
+ *
221
+ * 自动处理跨分表的分页:
222
+ * 1. 顺序累计查询各分表
223
+ * 2. 截取目标数据(无需排序)
224
+ *
225
+ * 使用约束:
226
+ * - 必须传 orderBy 参数
227
+ * - orderBy 必须为 timeColumn DESC 或 timeColumn ASC(如 'created_at DESC' / 'created_at ASC')
228
+ *
229
+ * @param reqJson 请求参数,包含 pageNo、pageSize 和 orderBy
230
+ * @returns 分页结果,包含 rows 和 total_count
231
+ *
232
+ * @example
233
+ * const result = await sharding.queryPage({
234
+ * condition: { created_at: { $gte: '2024-01-01', $lte: '2024-03-31' } },
235
+ * pageNo: 1,
236
+ * pageSize: 10,
237
+ * orderBy: 'created_at DESC', // 或 'created_at ASC'
238
+ * });
239
+ * console.log(result.rows, result.total_count);
240
+ */
241
+ queryPage(reqJson: IRequestModel): Promise<IShardingPageQueryResult>;
242
+ /**
243
+ * 查询记录总数
244
+ *
245
+ * 如果涉及多个分表,会并行查询各分表并汇总。
246
+ *
247
+ * @param reqJson 请求参数
248
+ * @returns 记录总数
249
+ */
250
+ queryCount(reqJson: IRequestModel): Promise<number>;
251
+ /**
252
+ * 判断记录是否存在
253
+ *
254
+ * 如果涉及多个分表,会并行查询,任一分表存在即返回 true。
255
+ *
256
+ * @param reqJson 请求参数
257
+ * @returns 是否存在
258
+ */
259
+ isExist(reqJson: IRequestModel): Promise<boolean>;
260
+ /**
261
+ * 【batchInsert 专用】按分表对数据进行分组
262
+ *
263
+ * 仅用于 batchInsert 方法,遍历所有数据项,
264
+ * 根据分表规则计算每条数据的目标分表,将相同分表的数据归为一组。
265
+ *
266
+ * @param dataArray 数据数组
267
+ * @returns 分表 -> 数据列表 的映射
268
+ */
269
+ private batchInsertGroupDataByTable;
270
+ private batchInsertResolveTableForData;
271
+ /**
272
+ * 解析单个目标表
273
+ *
274
+ * 写操作必须确定单一目标表,否则抛出异常。
275
+ */
276
+ private resolveSingleTable;
277
+ /**
278
+ * 获取分表字段提示
279
+ */
280
+ private getShardingColumnHint;
281
+ /**
282
+ * 构建配置
283
+ */
284
+ private buildCfg;
285
+ /**
286
+ * 在指定表上执行操作
287
+ */
288
+ private executeOnTable;
289
+ /**
290
+ * 从指定表查询单条
291
+ */
292
+ private queryOneFromTable;
293
+ /**
294
+ * 从指定表查询数量
295
+ */
296
+ private queryCountFromTable;
297
+ /**
298
+ * 判断指定表中是否存在记录
299
+ */
300
+ private isExistInTable;
301
+ /**
302
+ * 获取数据库中真实存在的表名集合
303
+ */
304
+ private getExistingTablesSet;
305
+ /**
306
+ * 检查表是否存在
307
+ */
308
+ private isTableExists;
309
+ /**
310
+ * 创建分表(如果需要)
311
+ *
312
+ * 根据配置检查分表是否存在:
313
+ * - 如果分表已存在,直接返回
314
+ * - 如果分表不存在且 autoCreateTable=true,自动创建
315
+ * - 如果分表不存在且 autoCreateTable=false,抛出异常
316
+ *
317
+ * @param tableName 目标分表名
318
+ */
319
+ private createShardingTableIfNeeded;
320
+ /**
321
+ * 校验查询参数的 orderBy 是否符合约束
322
+ *
323
+ * 约束条件:
324
+ * - 必须传 orderBy 参数
325
+ * - orderBy 必须为 timeColumn DESC 或 timeColumn ASC(如 'created_at DESC' / 'created_at ASC')
326
+ *
327
+ * 这是时间分表查询的核心约束:
328
+ * - 排序字段必须是分表字段(timeColumn),不允许其他字段
329
+ * - DESC 时表顺序为 新→旧,ASC 时表顺序为 旧→新(由调用方反转)
330
+ * - 这样无需内存排序,直接按表顺序拼接即可
331
+ *
332
+ * @param reqJson 请求参数
333
+ */
334
+ private validateQueryOrderBy;
335
+ /**
336
+ * 判断 orderBy 是否为 ASC 方向
337
+ *
338
+ * 前提:validateQueryOrderBy 已通过校验,orderBy 格式合法
339
+ *
340
+ * @param reqJson 请求参数
341
+ * @returns true 表示 ASC,false 表示 DESC
342
+ */
343
+ private isAscOrderBy;
344
+ /**
345
+ * 根据排序方向对分表列表进行排序
346
+ *
347
+ * 分表名后缀为时间格式(如 202403、20240101),字典序即时间序。
348
+ * - DESC:降序排列(新→旧)
349
+ * - ASC:升序排列(旧→新)
350
+ *
351
+ * @param tables 分表列表
352
+ * @param reqJson 请求参数
353
+ * @returns 排序后的分表列表(新数组,不修改原数组)
354
+ */
355
+ private sortTablesForOrderBy;
356
+ /**
357
+ * 解析查询表(带真实表过滤)
358
+ *
359
+ * 将查询路由委托给 ShardingRouter.resolveQuery,
360
+ * 由 ShardingRouter 统一处理所有查询路由逻辑。
361
+ */
362
+ private resolveQueryTables;
363
+ }