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.
Files changed (159) hide show
  1. package/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
  2. package/.qoder/skills/midway-fatcms/02-crud-quick.md +375 -0
  3. package/.qoder/skills/midway-fatcms/03-crud-sharding.md +489 -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 +504 -0
  8. package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
  9. package/README.md +9 -9
  10. package/dist/configuration.d.ts +10 -0
  11. package/dist/configuration.js +26 -0
  12. package/dist/controller/base/BaseApiController.d.ts +1 -2
  13. package/dist/controller/base/BaseApiController.js +0 -4
  14. package/dist/controller/gateway/DocGatewayController.js +1 -1
  15. package/dist/controller/helpers.controller.d.ts +6 -0
  16. package/dist/controller/helpers.controller.js +19 -0
  17. package/dist/controller/manage/FlowConfigManageApi.js +4 -2
  18. package/dist/controller/manage/SysConfigMangeApi.js +6 -1
  19. package/dist/controller/manage/UserAccountManageApi.js +7 -2
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +2 -2
  22. package/dist/libs/crud-pro/CrudPro.d.ts +51 -3
  23. package/dist/libs/crud-pro/CrudPro.js +111 -4
  24. package/dist/libs/crud-pro/exceptions.d.ts +7 -0
  25. package/dist/libs/crud-pro/exceptions.js +7 -0
  26. package/dist/libs/crud-pro/interfaces.d.ts +83 -12
  27. package/dist/libs/crud-pro/models/CrudResult.d.ts +116 -0
  28. package/dist/libs/crud-pro/models/CrudResult.js +126 -0
  29. package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -2
  30. package/dist/libs/crud-pro/models/ServiceHub.d.ts +2 -0
  31. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +70 -2
  32. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +205 -13
  33. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
  34. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
  35. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +36 -0
  36. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +97 -4
  37. package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +2 -0
  38. package/dist/libs/crud-pro/services/CurdProServiceHub.js +6 -0
  39. package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +382 -0
  40. package/dist/libs/crud-pro-quick/CrudProQuick.js +689 -0
  41. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
  42. package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
  43. package/dist/libs/crud-pro-quick/index.d.ts +36 -0
  44. package/dist/libs/crud-pro-quick/index.js +49 -0
  45. package/dist/libs/crud-pro-quick/models.d.ts +33 -0
  46. package/dist/libs/crud-pro-quick/models.js +2 -0
  47. package/dist/libs/crud-sharding/ShardingBase.d.ts +78 -0
  48. package/dist/libs/crud-sharding/ShardingBase.js +179 -0
  49. package/dist/libs/crud-sharding/ShardingByCustomCrud.d.ts +35 -0
  50. package/dist/libs/crud-sharding/ShardingByCustomCrud.js +297 -0
  51. package/dist/libs/crud-sharding/ShardingByHashCrud.d.ts +38 -0
  52. package/dist/libs/crud-sharding/ShardingByHashCrud.js +86 -0
  53. package/dist/libs/crud-sharding/ShardingByKeyCrud.d.ts +39 -0
  54. package/dist/libs/crud-sharding/ShardingByKeyCrud.js +74 -0
  55. package/dist/libs/crud-sharding/ShardingByTimeCrud.d.ts +66 -0
  56. package/dist/libs/crud-sharding/ShardingByTimeCrud.js +524 -0
  57. package/dist/libs/crud-sharding/ShardingConfig.d.ts +25 -10
  58. package/dist/libs/crud-sharding/ShardingConfig.js +5 -5
  59. package/dist/libs/crud-sharding/ShardingMerger.d.ts +10 -18
  60. package/dist/libs/crud-sharding/ShardingMerger.js +27 -44
  61. package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
  62. package/dist/libs/crud-sharding/ShardingResult.js +16 -0
  63. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
  64. package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
  65. package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
  66. package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
  67. package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  68. package/dist/libs/crud-sharding/index.d.ts +13 -15
  69. package/dist/libs/crud-sharding/index.js +33 -17
  70. package/dist/models/RedisKeys.d.ts +1 -0
  71. package/dist/models/RedisKeys.js +1 -0
  72. package/dist/models/bizmodels.d.ts +2 -6
  73. package/dist/service/SysAppService.d.ts +2 -2
  74. package/dist/service/SysAppService.js +16 -5
  75. package/dist/service/SysConfigService.d.ts +1 -1
  76. package/dist/service/SysConfigService.js +7 -2
  77. package/dist/service/SysDictDataService.js +14 -4
  78. package/dist/service/SysMenuService.js +7 -2
  79. package/dist/service/TableMetaCacheRedisSubscriber.d.ts +31 -0
  80. package/dist/service/TableMetaCacheRedisSubscriber.js +98 -0
  81. package/dist/service/curd/CurdMixService.d.ts +6 -4
  82. package/dist/service/curd/CurdMixService.js +16 -2
  83. package/dist/service/curd/CurdProService.d.ts +149 -29
  84. package/dist/service/curd/CurdProService.js +157 -38
  85. package/dist/service/flow/FlowConfigService.js +7 -2
  86. package/dist/service/flow/FlowInstanceCrudService.js +22 -19
  87. package/package.json +1 -1
  88. package/src/configuration.ts +27 -0
  89. package/src/controller/base/BaseApiController.ts +0 -5
  90. package/src/controller/gateway/DocGatewayController.ts +1 -1
  91. package/src/controller/helpers.controller.ts +15 -0
  92. package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
  93. package/src/controller/manage/FlowConfigManageApi.ts +4 -2
  94. package/src/controller/manage/SysConfigMangeApi.ts +6 -1
  95. package/src/controller/manage/UserAccountManageApi.ts +7 -2
  96. package/src/index.ts +2 -2
  97. package/src/libs/crud-pro/CrudPro.ts +134 -7
  98. package/src/libs/crud-pro/exceptions.ts +8 -0
  99. package/src/libs/crud-pro/interfaces.ts +111 -15
  100. package/src/libs/crud-pro/models/CrudResult.ts +178 -0
  101. package/src/libs/crud-pro/models/RequestModel.ts +2 -2
  102. package/src/libs/crud-pro/models/ServiceHub.ts +4 -0
  103. package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +238 -15
  104. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
  105. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
  106. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +110 -3
  107. package/src/libs/crud-pro/services/CurdProServiceHub.ts +8 -0
  108. package/src/libs/crud-pro-quick/CrudProQuick.ts +782 -0
  109. package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
  110. package/src/libs/crud-pro-quick/index.ts +52 -0
  111. package/src/libs/crud-pro-quick/models.ts +35 -0
  112. package/src/libs/crud-sharding/ShardingBase.ts +256 -0
  113. package/src/libs/crud-sharding/ShardingByCustomCrud.ts +329 -0
  114. package/src/libs/crud-sharding/ShardingByHashCrud.ts +111 -0
  115. package/src/libs/crud-sharding/ShardingByKeyCrud.ts +97 -0
  116. package/src/libs/crud-sharding/ShardingByTimeCrud.ts +628 -0
  117. package/src/libs/crud-sharding/ShardingConfig.ts +28 -10
  118. package/src/libs/crud-sharding/ShardingMerger.ts +35 -63
  119. package/src/libs/crud-sharding/ShardingResult.ts +29 -0
  120. package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
  121. package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
  122. package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  123. package/src/libs/crud-sharding/index.ts +30 -16
  124. package/src/models/RedisKeys.ts +1 -0
  125. package/src/models/bizmodels.ts +4 -7
  126. package/src/service/SysAppService.ts +18 -7
  127. package/src/service/SysConfigService.ts +8 -3
  128. package/src/service/SysDictDataService.ts +14 -4
  129. package/src/service/SysMenuService.ts +7 -2
  130. package/src/service/TableMetaCacheRedisSubscriber.ts +105 -0
  131. package/src/service/crudstd/CrudStdService.ts +2 -2
  132. package/src/service/curd/CurdMixService.ts +26 -5
  133. package/src/service/curd/CurdProService.ts +186 -45
  134. package/src/service/flow/FlowConfigService.ts +7 -2
  135. package/src/service/flow/FlowInstanceCrudService.ts +23 -20
  136. package/.qoder/skills/midway-fatcms-crud/SKILL.md +0 -375
  137. package/.qoder/skills/midway-fatcms-crud/examples.md +0 -990
  138. package/.qoder/skills/midway-fatcms-crud/reference.md +0 -568
  139. package/dist/libs/crud-pro/README.md +0 -809
  140. package/dist/libs/crud-pro/README_FUNC.md +0 -193
  141. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  142. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +0 -363
  143. package/dist/libs/crud-sharding/ShardingCrudPro.js +0 -675
  144. package/dist/libs/crud-sharding/ShardingRouter.d.ts +0 -69
  145. package/dist/libs/crud-sharding/ShardingRouter.js +0 -377
  146. package/dist/models/StandardColumns.d.ts +0 -71
  147. package/dist/models/StandardColumns.js +0 -28
  148. package/dist/service/curd/CrudProQuick.d.ts +0 -190
  149. package/dist/service/curd/CrudProQuick.js +0 -319
  150. package/dist/service/curd/README.md +0 -1100
  151. package/dist/service/curd/fixSoftDelete.d.ts +0 -20
  152. package/src/libs/crud-pro/README.md +0 -809
  153. package/src/libs/crud-pro/README_FUNC.md +0 -193
  154. package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  155. package/src/libs/crud-sharding/ShardingCrudPro.ts +0 -835
  156. package/src/libs/crud-sharding/ShardingRouter.ts +0 -512
  157. package/src/models/StandardColumns.ts +0 -76
  158. package/src/service/curd/CrudProQuick.ts +0 -360
  159. package/src/service/curd/README.md +0 -1100
@@ -1,3 +1,12 @@
1
+ import { CrudPro } from '@/libs/crud-pro/CrudPro';
2
+ import { KeysOfSimpleSQL } from '../crud-pro/models/keys';
3
+
4
+ /**
5
+ * CrudPro 工厂函数类型
6
+ * 每次调用返回新的 CrudPro 实例,避免状态污染
7
+ */
8
+ export type CrudProFactory = () => CrudPro;
9
+
1
10
  /**
2
11
  * 分表配置模型
3
12
  *
@@ -5,8 +14,8 @@
5
14
  * - YEAR: 按年分表,如 order_2024, order_2025
6
15
  * - MONTH: 按月分表,如 order_202401, order_202402
7
16
  * - DAY: 按日分表,如 order_20240101
8
- * - RANGE: 按范围分表,如 user_0 ~ user_99
9
17
  * - HASH: 按哈希分表,如 order_01 ~ order_16
18
+ * - KEY: 按键值分表,字段原值=表后缀,如 order_east, order_west
10
19
  * - CUSTOM: 自定义分表规则
11
20
  */
12
21
 
@@ -20,10 +29,10 @@ export enum ShardingType {
20
29
  MONTH = 'month',
21
30
  /** 按日分表:table_20240101 */
22
31
  DAY = 'day',
23
- /** 按范围分表:table_0 ~ table_99 */
24
- RANGE = 'range',
25
32
  /** 按哈希分表:table_01 ~ table_16 */
26
33
  HASH = 'hash',
34
+ /** 按键值分表:字段原值=表后缀,如 table_east, table_west */
35
+ KEY = 'key',
27
36
  /** 自定义分表规则 */
28
37
  CUSTOM = 'custom',
29
38
  }
@@ -45,15 +54,16 @@ export interface IShardingConfig {
45
54
 
46
55
  /**
47
56
  * 分表数量
48
- * 用于 RANGE 和 HASH 类型
49
- * 默认值:RANGE 为 10,HASH 为 16
57
+ * 用于 HASH 类型,指定哈希取模的分表总数
50
58
  */
51
59
  tableCount?: number;
52
60
 
53
61
  /**
54
62
  * 分表字段
55
- * 用于 RANGEHASH 类型,根据字段值计算分表
56
- * 例如:user_id, order_id
63
+ * 用于 HASHKEY 类型,根据字段值计算分表
64
+ * - HASH: hash(shardingColumn) % tableCount
65
+ * - KEY: 字段原值直接作为表后缀
66
+ * 例如:user_id, region
57
67
  */
58
68
  shardingColumn?: string;
59
69
 
@@ -63,6 +73,14 @@ export interface IShardingConfig {
63
73
  */
64
74
  timeColumn?: string;
65
75
 
76
+ /**
77
+ * 主键字段
78
+ * 用于时间分表场景下,当 condition 中包含主键时,时间字段仅用于路由定位分表,
79
+ * 不参与具体表的查询条件(避免时间精度损失导致查询失败)
80
+ * 例如:id, order_id
81
+ */
82
+ primaryKey?: string;
83
+
66
84
  /**
67
85
  * 自定义分表路由函数
68
86
  * 用于 CUSTOM 类型
@@ -86,8 +104,8 @@ export interface IShardingConfig {
86
104
  * 适用于时间分表类型(YEAR/MONTH/DAY)。
87
105
  *
88
106
  * 默认值:
89
- * - YEAR: 3(最近3年)
90
- * - MONTH: 12(最近12个月)
107
+ * - YEAR: 2(最近2年)
108
+ * - MONTH: 3(最近3个月)
91
109
  * - DAY: 7(最近7天)
92
110
  *
93
111
  * @example
@@ -228,7 +246,7 @@ export interface IShardingRouterContext {
228
246
  * SQL 简单名称
229
247
  * 用于判断具体的查询类型
230
248
  */
231
- sqlSimpleName?: string;
249
+ sqlSimpleName: KeysOfSimpleSQL;
232
250
  }
233
251
 
234
252
  /**
@@ -10,6 +10,15 @@ import { ShardingCountCache, shardingHashCondition } from './ShardingCountCache'
10
10
  export interface IShardingPageQueryResult {
11
11
  rows: any[];
12
12
  total_count: number;
13
+ lastCtx: ExecuteContext | null;
14
+ }
15
+
16
+ /**
17
+ * 列表查询结果
18
+ */
19
+ export interface IShardingListQueryResult {
20
+ rows: any[];
21
+ lastCtx: ExecuteContext | null;
13
22
  }
14
23
 
15
24
  /**
@@ -63,16 +72,17 @@ export class ShardingMerger {
63
72
  const offset = (pageNo - 1) * pageSize;
64
73
  const targetEnd = offset + pageSize; // 需要取到第几条
65
74
 
66
- // 1. 并行查询所有分表的记录数
67
- const countPromises = tables.map(table =>
68
- this.queryCountSafe(crudPro, table, reqJson, cfgJson)
69
- );
70
- const counts = await Promise.all(countPromises);
75
+ // 1. 串行查询所有分表的记录数
76
+ const counts: number[] = [];
77
+ for (const table of tables) {
78
+ const count = await this.queryCountSafe(crudPro, table, reqJson, cfgJson);
79
+ counts.push(count);
80
+ }
71
81
  const totalCount = counts.reduce((sum, c) => sum + c, 0);
72
82
 
73
83
  // 总数为0,直接返回
74
84
  if (totalCount === 0) {
75
- return { rows: [], total_count: 0 };
85
+ return { rows: [], total_count: 0, lastCtx: null };
76
86
  }
77
87
 
78
88
  // 2. 根据累计数量直接定位目标表
@@ -80,17 +90,21 @@ export class ShardingMerger {
80
90
 
81
91
  // 3. 只查询包含目标数据的分表
82
92
  let allRows: any[] = [];
93
+ let lastCtx: ExecuteContext | null = null;
83
94
  for (const target of targetTables) {
84
- const rows = await this.queryRowsSafeWithOffset(
85
- crudPro, target.table, reqJson, cfgJson,
86
- target.innerOffset, target.innerLimit
87
- );
88
- allRows = allRows.concat(rows);
95
+ try {
96
+ const ctx = await this.executeQueryWithOffset(crudPro, target.table, reqJson, cfgJson, target.innerOffset, target.innerLimit);
97
+ lastCtx = ctx;
98
+ allRows = allRows.concat(ctx.getResRows() || []);
99
+ } catch (e) {
100
+ // 表不存在或其他错误,跳过
101
+ }
89
102
  }
90
103
 
91
104
  return {
92
105
  rows: allRows,
93
106
  total_count: totalCount,
107
+ lastCtx,
94
108
  };
95
109
  }
96
110
 
@@ -118,9 +132,10 @@ export class ShardingMerger {
118
132
  reqJson: IRequestModel,
119
133
  cfgJson: IRequestCfgModel,
120
134
  maxRows: number = 10000
121
- ): Promise<any[]> {
135
+ ): Promise<IShardingListQueryResult> {
122
136
  // 串行查询分表,按表顺序拼接,达到上限即停
123
137
  let allRows: any[] = [];
138
+ let lastCtx: ExecuteContext | null = null;
124
139
 
125
140
  for (const table of tables) {
126
141
  const needMore = maxRows - allRows.length;
@@ -128,8 +143,13 @@ export class ShardingMerger {
128
143
  break;
129
144
  }
130
145
 
131
- const rows = await this.queryRowsSafe(crudPro, table, reqJson, cfgJson, needMore);
132
- allRows = allRows.concat(rows);
146
+ try {
147
+ const ctx = await this.executeQuery(crudPro, table, reqJson, cfgJson, needMore);
148
+ lastCtx = ctx;
149
+ allRows = allRows.concat(ctx.getResRows() || []);
150
+ } catch (e) {
151
+ // 表不存在或其他错误,跳过
152
+ }
133
153
 
134
154
  // 达到上限后停止,不再查询后续表
135
155
  if (allRows.length >= maxRows) {
@@ -138,7 +158,7 @@ export class ShardingMerger {
138
158
  }
139
159
  }
140
160
 
141
- return allRows;
161
+ return { rows: allRows, lastCtx };
142
162
  }
143
163
 
144
164
  // ============ 私有方法:分页定位 ============
@@ -256,54 +276,6 @@ export class ShardingMerger {
256
276
  }
257
277
  }
258
278
 
259
- /**
260
- * 安全查询数据行(表不存在时返回空数组)
261
- */
262
- private async queryRowsSafe(
263
- crudPro: CrudPro,
264
- table: string,
265
- reqJson: IRequestModel,
266
- cfgJson: IRequestCfgModel,
267
- limit?: number
268
- ): Promise<any[]> {
269
- try {
270
- const ctx = await this.executeQuery(crudPro, table, reqJson, cfgJson, limit);
271
- return ctx.getResRows() || [];
272
- } catch (e) {
273
- // 表不存在或其他错误,返回空数组
274
- return [];
275
- }
276
- }
277
-
278
- /**
279
- * 安全查询数据行(支持表内偏移,表不存在时返回空数组)
280
- *
281
- * 用于分页定位后,直接从某张表指定偏移处取数据
282
- *
283
- * @param crudPro CrudPro 实例
284
- * @param table 分表名
285
- * @param reqJson 请求参数
286
- * @param cfgJson 配置
287
- * @param innerOffset 表内偏移(跳过前 N 条)
288
- * @param innerLimit 取多少条
289
- */
290
- private async queryRowsSafeWithOffset(
291
- crudPro: CrudPro,
292
- table: string,
293
- reqJson: IRequestModel,
294
- cfgJson: IRequestCfgModel,
295
- innerOffset: number,
296
- innerLimit: number
297
- ): Promise<any[]> {
298
- try {
299
- const ctx = await this.executeQueryWithOffset(crudPro, table, reqJson, cfgJson, innerOffset, innerLimit);
300
- return ctx.getResRows() || [];
301
- } catch (e) {
302
- // 表不存在或其他错误,返回空数组
303
- return [];
304
- }
305
- }
306
-
307
279
  /**
308
280
  * 执行 COUNT 查询
309
281
  */
@@ -0,0 +1,29 @@
1
+ import { ExecuteContext } from '@/libs/crud-pro/models/ExecuteContext';
2
+ import { CrudResultBase } from '@/libs/crud-pro/models/CrudResult';
3
+
4
+ /** 分表批量插入结果 */
5
+ class ShardingBatchInsertResult extends CrudResultBase {
6
+ readonly totalAffected: number;
7
+ readonly tableResults: Array<{ table: string; affected: number; rowCount: number }>;
8
+ readonly tableCount: number;
9
+ readonly success: boolean;
10
+ readonly errors: Array<{ table: string; error: Error }>;
11
+
12
+ constructor(data: {
13
+ totalAffected: number;
14
+ tableResults: Array<{ table: string; affected: number; rowCount: number }>;
15
+ tableCount: number;
16
+ success: boolean;
17
+ errors: Array<{ table: string; error: Error }>;
18
+ lastContext: ExecuteContext;
19
+ }) {
20
+ super(data.lastContext);
21
+ this.totalAffected = data.totalAffected;
22
+ this.tableResults = data.tableResults;
23
+ this.tableCount = data.tableCount;
24
+ this.success = data.success;
25
+ this.errors = data.errors;
26
+ }
27
+ }
28
+
29
+ export { ShardingBatchInsertResult };