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
@@ -0,0 +1,30 @@
1
+ import { KeysOfSimpleSQL } from "../../libs/crud-pro/models/keys";
2
+ import { IRequestModel, IVisitor } from "../../libs/crud-pro/interfaces";
3
+ import { IRequestCfgModel2 } from "./models";
4
+ /**
5
+ * 软删除需要的用户信息(最小子集)
6
+ */
7
+ interface ISoftDeleteUserInfo {
8
+ accountId: string;
9
+ }
10
+ /**
11
+ * 获取当前用户信息的函数类型
12
+ */
13
+ declare type GetCurrentUserFunc = () => ISoftDeleteUserInfo | null | undefined;
14
+ /**
15
+ * 软删除处理函数
16
+ *
17
+ * 当 cfgModel.enableSoftDelete === true 时,自动处理软删除逻辑:
18
+ *
19
+ * 1. INSERT 操作:自动设置 deleted_at = 0
20
+ * 2. DELETE 操作:转为 UPDATE,设置 deleted_at = 时间戳, deleted_by = 当前用户
21
+ * 3. QUERY 操作:自动添加 deleted_at = 0 条件
22
+ *
23
+ * @param oldSqlSimpleName 原始 SQL 类型
24
+ * @param cfgModel 配置模型
25
+ * @param params 请求参数(会被修改)
26
+ * @param visitor 获取当前用户信息的函数(用于软删除时记录删除人)
27
+ */
28
+ declare function fixSoftDelete(oldSqlSimpleName: KeysOfSimpleSQL, cfgModel: IRequestCfgModel2, params: IRequestModel, visitor?: IVisitor): void;
29
+ export { fixSoftDelete, };
30
+ export type { ISoftDeleteUserInfo, GetCurrentUserFunc };
@@ -14,10 +14,9 @@ const keys_1 = require("../../libs/crud-pro/models/keys");
14
14
  * @param oldSqlSimpleName 原始 SQL 类型
15
15
  * @param cfgModel 配置模型
16
16
  * @param params 请求参数(会被修改)
17
- * @param ctx 请求上下文(用于获取当前用户信息)
17
+ * @param visitor 获取当前用户信息的函数(用于软删除时记录删除人)
18
18
  */
19
- function fixSoftDelete(oldSqlSimpleName, cfgModel, params, ctx) {
20
- var _a;
19
+ function fixSoftDelete(oldSqlSimpleName, cfgModel, params, visitor) {
21
20
  // 没有开启软删除,不做处理,直接物理删除
22
21
  if (cfgModel.enableSoftDelete !== true) {
23
22
  return;
@@ -36,15 +35,13 @@ function fixSoftDelete(oldSqlSimpleName, cfgModel, params, ctx) {
36
35
  if (!params.condition || Object.keys(params.condition).length === 0) {
37
36
  throw new Error('执行删除操作,必须指定删除条件');
38
37
  }
39
- // 获取当前用户信息
40
- const sessionInfo = (_a = ctx === null || ctx === void 0 ? void 0 : ctx.userSession) === null || _a === void 0 ? void 0 : _a.getSessionInfo();
41
38
  // 在原有 data 对象上添加软删除字段
42
39
  if (!params.data) {
43
40
  params.data = {};
44
41
  }
45
42
  const dataObj = params.data;
46
43
  dataObj.deleted_at = Date.now();
47
- dataObj.deleted_by = (sessionInfo === null || sessionInfo === void 0 ? void 0 : sessionInfo.accountId) || '';
44
+ dataObj.deleted_by = (visitor === null || visitor === void 0 ? void 0 : visitor.accountId) || '';
48
45
  // 改为执行 UPDATE 操作
49
46
  cfgModel.sqlSimpleName = keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE;
50
47
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 快捷 CRUD 操作模块
3
+ *
4
+ * 在 CrudPro 之上封装便捷方法,提供简洁的 API 进行单表 CRUD 操作。
5
+ * 内部使用工厂函数模式,每次操作都会获取新的 CrudPro 实例,因此**可以安全复用**。
6
+ *
7
+ * **与 CrudPro 的关系:**
8
+ * - CrudPro 是有状态执行器,禁止复用
9
+ * - CrudProQuick 内部每次调用工厂函数获取新 CrudPro,可以安全复用
10
+ *
11
+ * **使用方式:**
12
+ * 必须通过 CurdProService.getQuickCrud() 获取实例,不要直接构造。
13
+ *
14
+ * @example
15
+ * // 通过 CurdProService 获取实例
16
+ * const quick = curdProService.getQuickCrud('mydb', SqlDbType.mysql, 't_user');
17
+ *
18
+ * // 设置公共配置
19
+ * quick.setBaseCfgModel({
20
+ * enableSoftDelete: true,
21
+ * enableStandardUpdateCfg: true,
22
+ * });
23
+ *
24
+ * // 查询列表(新 API)
25
+ * const result = await quick.findList({ condition: { status: 1 } });
26
+ * console.log(result.rows, result.count);
27
+ *
28
+ * // 插入数据(新 API)
29
+ * const insertResult = await quick.insert({ data: { name: '张三', age: 20 } });
30
+ * console.log(insertResult.affectedRows, insertResult.insertId);
31
+ */
32
+ export { CrudProQuick } from './CrudProQuick';
33
+ export type { ICrudProQuickFactory } from './CrudProQuick';
34
+ export type { IRequestCfgModel2, ICommonStandardColumns } from './models';
35
+ export { fixSoftDelete } from './fixSoftDelete';
36
+ export { CrudWriteResult, CrudQueryOneResult, CrudQueryListResult, CrudQueryPageResult, CrudExistResult, CrudCountResult, CrudUpsertResult, } from '../../libs/crud-pro/models/CrudResult';
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * 快捷 CRUD 操作模块
4
+ *
5
+ * 在 CrudPro 之上封装便捷方法,提供简洁的 API 进行单表 CRUD 操作。
6
+ * 内部使用工厂函数模式,每次操作都会获取新的 CrudPro 实例,因此**可以安全复用**。
7
+ *
8
+ * **与 CrudPro 的关系:**
9
+ * - CrudPro 是有状态执行器,禁止复用
10
+ * - CrudProQuick 内部每次调用工厂函数获取新 CrudPro,可以安全复用
11
+ *
12
+ * **使用方式:**
13
+ * 必须通过 CurdProService.getQuickCrud() 获取实例,不要直接构造。
14
+ *
15
+ * @example
16
+ * // 通过 CurdProService 获取实例
17
+ * const quick = curdProService.getQuickCrud('mydb', SqlDbType.mysql, 't_user');
18
+ *
19
+ * // 设置公共配置
20
+ * quick.setBaseCfgModel({
21
+ * enableSoftDelete: true,
22
+ * enableStandardUpdateCfg: true,
23
+ * });
24
+ *
25
+ * // 查询列表(新 API)
26
+ * const result = await quick.findList({ condition: { status: 1 } });
27
+ * console.log(result.rows, result.count);
28
+ *
29
+ * // 插入数据(新 API)
30
+ * const insertResult = await quick.insert({ data: { name: '张三', age: 20 } });
31
+ * console.log(insertResult.affectedRows, insertResult.insertId);
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.CrudUpsertResult = exports.CrudCountResult = exports.CrudExistResult = exports.CrudQueryPageResult = exports.CrudQueryListResult = exports.CrudQueryOneResult = exports.CrudWriteResult = exports.fixSoftDelete = exports.CrudProQuick = void 0;
35
+ // 核心类
36
+ var CrudProQuick_1 = require("./CrudProQuick");
37
+ Object.defineProperty(exports, "CrudProQuick", { enumerable: true, get: function () { return CrudProQuick_1.CrudProQuick; } });
38
+ // 工具函数
39
+ var fixSoftDelete_1 = require("./fixSoftDelete");
40
+ Object.defineProperty(exports, "fixSoftDelete", { enumerable: true, get: function () { return fixSoftDelete_1.fixSoftDelete; } });
41
+ // 重新导出结果类型
42
+ var CrudResult_1 = require("../../libs/crud-pro/models/CrudResult");
43
+ Object.defineProperty(exports, "CrudWriteResult", { enumerable: true, get: function () { return CrudResult_1.CrudWriteResult; } });
44
+ Object.defineProperty(exports, "CrudQueryOneResult", { enumerable: true, get: function () { return CrudResult_1.CrudQueryOneResult; } });
45
+ Object.defineProperty(exports, "CrudQueryListResult", { enumerable: true, get: function () { return CrudResult_1.CrudQueryListResult; } });
46
+ Object.defineProperty(exports, "CrudQueryPageResult", { enumerable: true, get: function () { return CrudResult_1.CrudQueryPageResult; } });
47
+ Object.defineProperty(exports, "CrudExistResult", { enumerable: true, get: function () { return CrudResult_1.CrudExistResult; } });
48
+ Object.defineProperty(exports, "CrudCountResult", { enumerable: true, get: function () { return CrudResult_1.CrudCountResult; } });
49
+ Object.defineProperty(exports, "CrudUpsertResult", { enumerable: true, get: function () { return CrudResult_1.CrudUpsertResult; } });
@@ -0,0 +1,33 @@
1
+ import { IRequestCfgModel } from '../../libs/crud-pro/interfaces';
2
+ /**
3
+ * 常用标准表结构字段(6个字段)
4
+ *
5
+ * 用于软删除和审计跟踪:
6
+ * - deleted_at: 删除时间戳,0=未删除
7
+ * - deleted_by: 删除人ID
8
+ * - created_by: 创建人ID
9
+ * - created_at: 创建时间(毫秒时间戳)
10
+ * - modified_by: 修改人ID
11
+ * - modified_at: 修改时间(毫秒时间戳)
12
+ */
13
+ export interface ICommonStandardColumns {
14
+ deleted_at?: number;
15
+ deleted_by?: string;
16
+ created_by?: string;
17
+ created_at?: number;
18
+ modified_by?: string;
19
+ modified_at?: number;
20
+ }
21
+ /**
22
+ * 扩展的请求配置模型
23
+ *
24
+ * 在 IRequestCfgModel 基础上添加了业务层常用的配置项:
25
+ * - enableStandardUpdateCfg: 启用标准字段自动填充
26
+ * - enableStandardUpdateCfgCondition: 启用标准字段条件注入
27
+ * - enableSoftDelete: 启用软删除
28
+ */
29
+ export interface IRequestCfgModel2 extends IRequestCfgModel {
30
+ enableStandardUpdateCfg?: boolean | string[];
31
+ enableStandardUpdateCfgCondition?: boolean | string[];
32
+ enableSoftDelete?: boolean;
33
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,78 @@
1
+ import { IRequestModel, IRequestCfgModel } from '../../libs/crud-pro/interfaces';
2
+ import { ExecuteContext } from '../../libs/crud-pro/models/ExecuteContext';
3
+ import { KeysOfSimpleSQL } from '../../libs/crud-pro/models/keys';
4
+ import { IShardingConfig, IShardingRouterContext, CrudProFactory } from './ShardingConfig';
5
+ import { ShardingTableCreator } from './ShardingTableCreator';
6
+ import { CrudWriteResult, CrudQueryOneResult, CrudQueryListResult, CrudQueryPageResult, CrudExistResult, CrudCountResult, CrudUpsertResult } from '../../libs/crud-pro/models/CrudResult';
7
+ import { ShardingBatchInsertResult } from './ShardingResult';
8
+ /**
9
+ * 分表 CRUD 基类
10
+ *
11
+ * 提供所有分表子类共用的基础设施方法,不包含任何路由逻辑。
12
+ * 路由逻辑由各子类自行实现。
13
+ *
14
+ * 子类:
15
+ * - ShardingByTimeCrud: 时间分表(YEAR/MONTH/DAY)
16
+ * - ShardingByHashCrud: 哈希分表
17
+ * - ShardingByKeyCrud: 键值分表
18
+ * - ShardingByCustomCrud: 自定义分表
19
+ */
20
+ export declare abstract class ShardingBase {
21
+ protected readonly crudProFactory: CrudProFactory;
22
+ protected readonly config: IShardingConfig;
23
+ protected readonly tableCreator: ShardingTableCreator;
24
+ protected baseCfg: Partial<IRequestCfgModel>;
25
+ protected enableSoftDelete: boolean;
26
+ constructor(crudProFactory: CrudProFactory, config: IShardingConfig);
27
+ setBaseCfg(cfg: Partial<IRequestCfgModel>): this;
28
+ getConfig(): IShardingConfig;
29
+ setEnableSoftDelete(enable: boolean): this;
30
+ abstract insert(reqJson: IRequestModel): Promise<CrudWriteResult>;
31
+ abstract batchInsert(reqJson: IRequestModel): Promise<ShardingBatchInsertResult>;
32
+ abstract update(reqJson: IRequestModel): Promise<CrudWriteResult>;
33
+ abstract delete(reqJson: IRequestModel): Promise<CrudWriteResult>;
34
+ abstract restore(reqJson: IRequestModel): Promise<CrudWriteResult>;
35
+ abstract insertOrUpdate(reqJson: IRequestModel): Promise<CrudUpsertResult>;
36
+ abstract findOne<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryOneResult<T>>;
37
+ abstract findUniqueOne<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryOneResult<T>>;
38
+ abstract findList<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryListResult<T>>;
39
+ abstract findPage<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryPageResult<T>>;
40
+ abstract findCount(reqJson: IRequestModel): Promise<CrudCountResult>;
41
+ abstract isExist(reqJson: IRequestModel): Promise<CrudExistResult>;
42
+ /**
43
+ * 判断当前路由上下文是否处于「插入阶段」(应从 data 提取分表字段)
44
+ *
45
+ * - INSERT / BATCH_INSERT → 始终从 data
46
+ * - 其余操作(QUERY / UPDATE / DELETE / INSERT_OR_UPDATE)→ 从 condition
47
+ */
48
+ protected static isInsertPhase(ctx: IShardingRouterContext): boolean;
49
+ protected buildCfg(sqlSimpleName: KeysOfSimpleSQL): IRequestCfgModel & {
50
+ enableSoftDelete?: boolean;
51
+ };
52
+ protected executeOnTable(table: string, reqJson: IRequestModel, sqlSimpleName: KeysOfSimpleSQL, extraCfg?: Partial<IRequestCfgModel>): Promise<ExecuteContext>;
53
+ protected findCountFromTable(table: string, reqJson: IRequestModel): Promise<{
54
+ count: number;
55
+ ctx: ExecuteContext | null;
56
+ }>;
57
+ protected isExistInTable(table: string, reqJson: IRequestModel): Promise<{
58
+ exists: boolean;
59
+ ctx: ExecuteContext | null;
60
+ }>;
61
+ protected getExistingTablesSet(skipCache?: boolean): Promise<Set<string>>;
62
+ protected isTableExists(tableName: string): Promise<boolean>;
63
+ protected createShardingTableIfNeeded(tableName: string): Promise<void>;
64
+ protected buildDebugInfo(sqlTable: string | undefined, condition: Record<string, any> | undefined): {
65
+ sqlDatabase: string;
66
+ sqlTable: string;
67
+ condition?: Record<string, any>;
68
+ };
69
+ protected formatUniqueError(foundCount: number, tables: string | string[], condition: Record<string, any> | undefined, isMultiTable?: boolean): string;
70
+ /**
71
+ * 获取所有以 baseTable_ 开头的已存在分表(按字典序排序)
72
+ */
73
+ protected getAllExistingShardingTables(): Promise<string[]>;
74
+ /**
75
+ * 过滤出真实存在的分表
76
+ */
77
+ protected filterExistingTables(candidateTables: string[]): Promise<string[]>;
78
+ }
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ShardingBase = void 0;
4
+ const keys_1 = require("../../libs/crud-pro/models/keys");
5
+ const fixSoftDelete_1 = require("../../libs/crud-pro-quick/fixSoftDelete");
6
+ const ShardingTableCreator_1 = require("./ShardingTableCreator");
7
+ /**
8
+ * 分表 CRUD 基类
9
+ *
10
+ * 提供所有分表子类共用的基础设施方法,不包含任何路由逻辑。
11
+ * 路由逻辑由各子类自行实现。
12
+ *
13
+ * 子类:
14
+ * - ShardingByTimeCrud: 时间分表(YEAR/MONTH/DAY)
15
+ * - ShardingByHashCrud: 哈希分表
16
+ * - ShardingByKeyCrud: 键值分表
17
+ * - ShardingByCustomCrud: 自定义分表
18
+ */
19
+ class ShardingBase {
20
+ constructor(crudProFactory, config) {
21
+ this.baseCfg = {};
22
+ this.enableSoftDelete = false;
23
+ this.config = config;
24
+ if (typeof crudProFactory === 'function') {
25
+ this.crudProFactory = crudProFactory;
26
+ }
27
+ else {
28
+ throw new Error('[ShardingBase] 请使用 CrudProFactory 工厂函数模式');
29
+ }
30
+ this.tableCreator = new ShardingTableCreator_1.ShardingTableCreator(this.crudProFactory, config);
31
+ }
32
+ // ============ 配置方法 ============
33
+ setBaseCfg(cfg) {
34
+ this.baseCfg = { ...this.baseCfg, ...cfg };
35
+ return this;
36
+ }
37
+ getConfig() {
38
+ return this.config;
39
+ }
40
+ setEnableSoftDelete(enable) {
41
+ this.enableSoftDelete = enable;
42
+ return this;
43
+ }
44
+ /**
45
+ * 判断当前路由上下文是否处于「插入阶段」(应从 data 提取分表字段)
46
+ *
47
+ * - INSERT / BATCH_INSERT → 始终从 data
48
+ * - 其余操作(QUERY / UPDATE / DELETE / INSERT_OR_UPDATE)→ 从 condition
49
+ */
50
+ static isInsertPhase(ctx) {
51
+ return [keys_1.KeysOfSimpleSQL.SIMPLE_INSERT, keys_1.KeysOfSimpleSQL.SIMPLE_BATCH_INSERT].includes(ctx.sqlSimpleName);
52
+ }
53
+ // ============ 执行基础设施 ============
54
+ buildCfg(sqlSimpleName) {
55
+ return {
56
+ method: `ShardingCrudProAnonymous_${sqlSimpleName}`,
57
+ ...this.baseCfg,
58
+ sqlTable: this.config.baseTable,
59
+ sqlSimpleName,
60
+ };
61
+ }
62
+ async executeOnTable(table, reqJson, sqlSimpleName, extraCfg) {
63
+ const cfg = this.buildCfg(sqlSimpleName);
64
+ cfg.sqlTable = table;
65
+ cfg.enableSoftDelete = this.enableSoftDelete;
66
+ if (extraCfg) {
67
+ Object.assign(cfg, extraCfg);
68
+ }
69
+ const crudPro = this.crudProFactory();
70
+ (0, fixSoftDelete_1.fixSoftDelete)(sqlSimpleName, cfg, reqJson, crudPro.getVisitor());
71
+ return crudPro.executeCrudByCfg(reqJson, cfg);
72
+ }
73
+ // ============ 单表查询辅助 ============
74
+ async findCountFromTable(table, reqJson) {
75
+ try {
76
+ const ctx = await this.executeOnTable(table, reqJson, keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_COUNT);
77
+ return { count: ctx.getResModelItem('total_count') || 0, ctx };
78
+ }
79
+ catch (e) {
80
+ return { count: 0, ctx: null };
81
+ }
82
+ }
83
+ async isExistInTable(table, reqJson) {
84
+ try {
85
+ const ctx = await this.executeOnTable(table, reqJson, keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_EXIST);
86
+ return { exists: ctx.getResModelItem('is_exist') === true, ctx };
87
+ }
88
+ catch (e) {
89
+ return { exists: false, ctx: null };
90
+ }
91
+ }
92
+ // ============ 表管理 ============
93
+ async getExistingTablesSet(skipCache = false) {
94
+ const { sqlDatabase, sqlDbType } = this.baseCfg;
95
+ if (!sqlDatabase || !sqlDbType) {
96
+ throw new Error('[ShardingBase] 未配置 sqlDatabase 或 sqlDbType');
97
+ }
98
+ const { tables } = await this.crudProFactory().getAllTableInfos({ sqlDatabase, sqlDbType: sqlDbType }, { skipCache });
99
+ return new Set(tables.map(t => t.name));
100
+ }
101
+ async isTableExists(tableName) {
102
+ const existingSet = await this.getExistingTablesSet();
103
+ return existingSet.has(tableName);
104
+ }
105
+ async createShardingTableIfNeeded(tableName) {
106
+ if (!this.config.autoCreateTable) {
107
+ if (!(await this.isTableExists(tableName))) {
108
+ throw new Error(`[ShardingBase] 分表 ${tableName} 不存在。请先创建分表,或设置 autoCreateTable: true 自动创建`);
109
+ }
110
+ return;
111
+ }
112
+ if (!this.baseCfg.sqlDatabase || !this.baseCfg.sqlDbType) {
113
+ throw new Error('[ShardingBase] 请先调用 setBaseCfg 设置数据库配置');
114
+ }
115
+ const result = await this.tableCreator.createTableIfNeeded(tableName, {
116
+ sqlDatabase: this.baseCfg.sqlDatabase,
117
+ sqlDbType: this.baseCfg.sqlDbType,
118
+ }, this.config.tableCreateOptions);
119
+ if (!result.success) {
120
+ throw result.error || new Error(`[ShardingBase] 创建分表 ${tableName} 失败`);
121
+ }
122
+ if (result.createSql) {
123
+ await this.getExistingTablesSet(true);
124
+ }
125
+ }
126
+ // ============ 辅助方法 ============
127
+ buildDebugInfo(sqlTable, condition) {
128
+ const info = {
129
+ sqlDatabase: this.baseCfg.sqlDatabase || 'unknown',
130
+ sqlTable: sqlTable || this.config.baseTable,
131
+ };
132
+ if (condition) {
133
+ info.condition = condition;
134
+ }
135
+ return info;
136
+ }
137
+ formatUniqueError(foundCount, tables, condition, isMultiTable = false) {
138
+ const parts = [
139
+ `[ShardingBase] findUniqueOne 期望唯一一条记录,但查询到 ${foundCount} 条`,
140
+ ];
141
+ if (this.baseCfg.sqlDatabase) {
142
+ parts.push(`数据库: ${this.baseCfg.sqlDatabase}`);
143
+ }
144
+ if (isMultiTable && Array.isArray(tables)) {
145
+ parts.push(`基表: ${this.config.baseTable}`);
146
+ parts.push(`分表: [${tables.join(', ')}]`);
147
+ }
148
+ else {
149
+ parts.push(`表: ${typeof tables === 'string' ? tables : tables[0]}`);
150
+ }
151
+ if (condition) {
152
+ try {
153
+ parts.push(`条件: ${JSON.stringify(condition)}`);
154
+ }
155
+ catch (_a) {
156
+ parts.push(`条件: [无法序列化]`);
157
+ }
158
+ }
159
+ return parts.join(' | ');
160
+ }
161
+ /**
162
+ * 获取所有以 baseTable_ 开头的已存在分表(按字典序排序)
163
+ */
164
+ async getAllExistingShardingTables() {
165
+ const existingTables = await this.getExistingTablesSet();
166
+ const prefix = `${this.config.baseTable}_`;
167
+ const tables = Array.from(existingTables).filter(t => t.startsWith(prefix));
168
+ tables.sort();
169
+ return tables;
170
+ }
171
+ /**
172
+ * 过滤出真实存在的分表
173
+ */
174
+ async filterExistingTables(candidateTables) {
175
+ const existingTables = await this.getExistingTablesSet();
176
+ return candidateTables.filter(table => existingTables.has(table));
177
+ }
178
+ }
179
+ exports.ShardingBase = ShardingBase;
@@ -0,0 +1,35 @@
1
+ import { IRequestModel } from '../../libs/crud-pro/interfaces';
2
+ import { IShardingConfig, CrudProFactory } from './ShardingConfig';
3
+ import { ShardingBase } from './ShardingBase';
4
+ import { CrudWriteResult, CrudQueryOneResult, CrudQueryListResult, CrudQueryPageResult, CrudExistResult, CrudCountResult, CrudUpsertResult } from '../../libs/crud-pro/models/CrudResult';
5
+ import { ShardingBatchInsertResult } from './ShardingResult';
6
+ /**
7
+ * 自定义分表 CRUD
8
+ *
9
+ * 分表名称完全由用户提供的 customRouter 函数决定。
10
+ * 适用于无法用时间/哈希/键值覆盖的复杂场景(如原 RANGE 分表)。
11
+ *
12
+ * 特性:
13
+ * - 路由:customRouter({ config, data?, condition? }) → 表名或表名数组
14
+ * - 插入:customRouter 返回单个表名
15
+ * - 查询:customRouter 返回表名数组 → 过滤已存在表
16
+ * - insertOrUpdate:统一由 condition 路由定位分表,查找与插入在同一分表
17
+ */
18
+ export declare class ShardingByCustomCrud extends ShardingBase {
19
+ constructor(crudProFactory: CrudProFactory, config: IShardingConfig);
20
+ private resolveTableForInsert;
21
+ private resolveTableForCondition;
22
+ private resolveFindTables;
23
+ insert(reqJson: IRequestModel): Promise<CrudWriteResult>;
24
+ batchInsert(reqJson: IRequestModel): Promise<ShardingBatchInsertResult>;
25
+ update(reqJson: IRequestModel): Promise<CrudWriteResult>;
26
+ delete(reqJson: IRequestModel): Promise<CrudWriteResult>;
27
+ restore(reqJson: IRequestModel): Promise<CrudWriteResult>;
28
+ insertOrUpdate(reqJson: IRequestModel): Promise<CrudUpsertResult>;
29
+ findOne<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryOneResult<T>>;
30
+ findUniqueOne<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryOneResult<T>>;
31
+ findList<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryListResult<T>>;
32
+ findPage<T = Record<string, any>>(reqJson: IRequestModel): Promise<CrudQueryPageResult<T>>;
33
+ findCount(reqJson: IRequestModel): Promise<CrudCountResult>;
34
+ isExist(reqJson: IRequestModel): Promise<CrudExistResult>;
35
+ }