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
@@ -13,6 +13,7 @@ export interface ITableColumn {
13
13
  type: string;
14
14
  isNullable: boolean;
15
15
  isPrimaryKey?: boolean;
16
+ isIdentity?: boolean;
16
17
  defaultValue?: any;
17
18
  maxLength?: number;
18
19
  comment?: string;
@@ -45,7 +46,7 @@ export interface IPoolConnectionClient {
45
46
  export interface IRequestModel {
46
47
  method?: string;
47
48
  columns?: string | string[];
48
- condition?: Record<string, any>;
49
+ condition?: IRequestCondition;
49
50
  data?: Record<string, any> | Record<string, any>[];
50
51
  orderBy?: string | IOrderByItem[];
51
52
  limit?: number;
@@ -54,21 +55,42 @@ export interface IRequestModel {
54
55
  pageNo?: number;
55
56
  }
56
57
  declare type IBasicType = boolean | string | number;
58
+ /**
59
+ * 比较操作符条件
60
+ * 支持 MongoDB 风格的所有查询操作符
61
+ */
57
62
  export interface ICompareCondition {
58
- $gt?: IBasicType;
59
- $gte?: IBasicType;
63
+ $ne?: IBasicType;
60
64
  $lt?: IBasicType;
61
65
  $lte?: IBasicType;
62
- $ne?: IBasicType;
63
- $in?: IRequestCondition[];
64
- $nin?: IRequestCondition[];
65
- $like?: IBasicType;
66
- $match?: IBasicType;
67
- $matchBool?: IBasicType;
68
- $range?: number[];
69
- }
70
- export interface IRequestCondition extends Record<string, any>, ICompareCondition {
66
+ $gt?: IBasicType;
67
+ $gte?: IBasicType;
68
+ $in?: IBasicType[];
69
+ $nin?: IBasicType[];
70
+ $range?: [number, number];
71
+ $like?: string;
72
+ $notLike?: string;
73
+ $likeInclude?: string;
74
+ $notLikeInclude?: string;
75
+ $match?: string;
76
+ $matchBool?: string | boolean;
77
+ $null?: boolean;
78
+ $notNull?: boolean;
79
+ $jsonArrayContains?: string;
80
+ }
81
+ /**
82
+ * 逻辑操作符条件
83
+ */
84
+ export interface ILogicalCondition {
71
85
  $or?: IRequestCondition[];
86
+ $and?: IRequestCondition[];
87
+ }
88
+ /**
89
+ * 查询条件类型
90
+ * 支持字段值直接匹配或比较操作符
91
+ * 支持 $or, $and 逻辑组合
92
+ */
93
+ export interface IRequestCondition extends Record<string, IBasicType | ICompareCondition | ILogicalCondition | IRequestCondition[] | undefined>, ILogicalCondition {
72
94
  }
73
95
  /**
74
96
  * 用户基本信息
@@ -139,6 +161,55 @@ export interface ISqlCfgModel extends IBaseCfgModel {
139
161
  executeSqlArgs?: any[];
140
162
  crudType?: string;
141
163
  }
164
+ /**
165
+ * executeSQL 的返回结果类型说明(未被包装的直接结果)
166
+ *
167
+ * 注意:executeSQL 返回的是数据库查询的原始结果,没有 {code, data, message} 包装层。
168
+ * 返回类型取决于 resPicker 配置,请根据实际 SQL 类型选择合适的类型断言。
169
+ *
170
+ * 使用示例:
171
+ * // 查询列表 - 返回数组
172
+ * const rows = await executeSQL({ executeSql: 'SELECT * FROM users', resPicker: KeysOfSqlResPicker.RESULT_ROWS }) as ExecuteSQLRowResult<User>;
173
+ *
174
+ * // 查询单行 - 返回对象或null
175
+ * const user = await executeSQL({ executeSql: 'SELECT * FROM users WHERE id=?', executeSqlArgs: [1], resPicker: KeysOfSqlResPicker.RESULT_FIRST_ROW }) as ExecuteSQLSingleResult<User>;
176
+ *
177
+ * // 查询总数 - 返回数字
178
+ * const count = await executeSQL({ executeSql: 'SELECT COUNT(*) as total_count FROM users', resPicker: KeysOfSqlResPicker.RESULT_TOTAL_COUNT }) as ExecuteSQLCountResult;
179
+ *
180
+ * // 判断存在 - 返回布尔
181
+ * const exists = await executeSQL({ executeSql: 'SELECT 1 as is_exist FROM users WHERE id=?', executeSqlArgs: [1], resPicker: KeysOfSqlResPicker.RESULT_IS_EXIST }) as ExecuteSQLExistResult;
182
+ *
183
+ * // 增删改操作 - 返回受影响行数信息
184
+ * const result = await executeSQL({ executeSql: 'INSERT INTO users(name) VALUES(?)', executeSqlArgs: ['张三'], resPicker: KeysOfSqlResPicker.UPDATE_RESULT }) as ExecuteSQLUpdateResult;
185
+ */
186
+ /** 查询多行时的返回类型(默认情况):原始数据行数组,无包装 */
187
+ export declare type ExecuteSQLRowsResult<T = Record<string, any>> = T[];
188
+ /** 查询单行时的返回类型:首行对象或null,无包装 */
189
+ export declare type ExecuteSQLSingleResult<T = Record<string, any>> = T | null;
190
+ /** 查询数量时的返回类型:数字,无包装 */
191
+ export declare type ExecuteSQLCountResult = number;
192
+ /** 判断存在时的返回类型:布尔值,无包装 */
193
+ export declare type ExecuteSQLExistResult = boolean;
194
+ /** 增删改操作时的返回类型:包含 insertId 和 affectedRows,无包装 */
195
+ export interface ExecuteSQLUpdateResult {
196
+ /** 插入记录的自增ID(仅INSERT操作有效) */
197
+ insertId: any;
198
+ /** 受影响的行数 */
199
+ affectedRows: number;
200
+ }
201
+ /**
202
+ * executeSQL 的通用返回类型(未被包装的直接结果)
203
+ * 根据 resPicker 的不同配置,实际返回类型可能是:
204
+ * - ExecuteSQLRowResult<T> : 多行数据(默认)
205
+ * - ExecuteSQLSingleResult<T> : 单行数据或null
206
+ * - ExecuteSQLCountResult : 数字
207
+ * - ExecuteSQLExistResult : 布尔值
208
+ * - ExecuteSQLUpdateResult : 增删改结果
209
+ *
210
+ * 警告:此类型为联合类型,使用时建议根据实际 resPicker 进行类型断言以获得精确类型提示
211
+ */
212
+ export declare type ExecuteSQLResult<T = Record<string, any>> = ExecuteSQLRowsResult<T> | ExecuteSQLSingleResult<T> | ExecuteSQLCountResult | ExecuteSQLExistResult | ExecuteSQLUpdateResult;
142
213
  /**
143
214
  * 自定义校验函数。如果不正确请抛出异常。{code:'xxx',message:'xxx'}
144
215
  */
@@ -0,0 +1,116 @@
1
+ import { ResModelAffected } from './ResModel';
2
+ import { ExecuteContext } from './ExecuteContext';
3
+ /**
4
+ * 结果基类的辅助定位信息
5
+ * 用于错误排查和日志记录
6
+ */
7
+ export interface CrudResultDebugInfo {
8
+ /** 数据库名 */
9
+ sqlDatabase?: string;
10
+ /** 表名 */
11
+ sqlTable?: string;
12
+ /** 方法名(配置中的 method 字段) */
13
+ method?: string;
14
+ /** 查询条件(用于定位问题) */
15
+ condition?: Record<string, any>;
16
+ }
17
+ /**
18
+ * 结果基类
19
+ *
20
+ * 使用 ES2022 私有字段 #rawContext 存储 ExecuteContext 引用。
21
+ * ES2022 私有字段特性:JSON.stringify 不会序列化 # 开头的私有字段。
22
+ * 因此结果对象可直接返回给 API 前端,自动过滤掉内部上下文。
23
+ *
24
+ * Node.js 兼容性:Node.js 14.6+ 完全支持 ES2022 私有字段。
25
+ */
26
+ declare abstract class CrudResultBase {
27
+ #private;
28
+ /** 辅助定位信息,用于错误排查 */
29
+ readonly debugInfo: CrudResultDebugInfo;
30
+ constructor(rawContext: ExecuteContext, debugInfo?: CrudResultDebugInfo);
31
+ getRawContext(): ExecuteContext;
32
+ /**
33
+ * 生成带辅助定位信息的错误消息
34
+ * @param baseMessage 基础错误信息
35
+ * @returns 包含定位信息的完整错误消息
36
+ */
37
+ protected buildErrorMessage(baseMessage: string): string;
38
+ }
39
+ /** 写操作结果(INSERT/UPDATE/DELETE) */
40
+ declare class CrudWriteResult extends CrudResultBase {
41
+ readonly affectedRows: number;
42
+ readonly insertId?: string | number;
43
+ constructor(data: {
44
+ affectedRows: number;
45
+ insertId?: string | number;
46
+ rawContext: ExecuteContext;
47
+ debugInfo?: CrudResultDebugInfo;
48
+ });
49
+ }
50
+ /** 单条查询结果 */
51
+ declare class CrudQueryOneResult<T = Record<string, any>> extends CrudResultBase {
52
+ readonly row: T | null;
53
+ readonly found: boolean;
54
+ /** 数据来源的物理表名(分表场景下为实际分表名,如 t_order_202403) */
55
+ readonly fromTable: string;
56
+ constructor(data: {
57
+ row: T | null;
58
+ rawContext: ExecuteContext;
59
+ debugInfo?: CrudResultDebugInfo;
60
+ fromTable: string;
61
+ });
62
+ }
63
+ /** 列表查询结果 */
64
+ declare class CrudQueryListResult<T = Record<string, any>> extends CrudResultBase {
65
+ readonly rows: T[];
66
+ readonly count: number;
67
+ constructor(data: {
68
+ rows: T[];
69
+ rawContext: ExecuteContext;
70
+ debugInfo?: CrudResultDebugInfo;
71
+ });
72
+ }
73
+ /** 分页查询结果 */
74
+ declare class CrudQueryPageResult<T = Record<string, any>> extends CrudResultBase {
75
+ readonly rows: T[];
76
+ readonly totalCount: number;
77
+ readonly count: number;
78
+ constructor(data: {
79
+ rows: T[];
80
+ totalCount: number;
81
+ rawContext: ExecuteContext;
82
+ debugInfo?: CrudResultDebugInfo;
83
+ });
84
+ }
85
+ /** 存在性判断结果 */
86
+ declare class CrudExistResult extends CrudResultBase {
87
+ readonly exists: boolean;
88
+ constructor(data: {
89
+ exists: boolean;
90
+ rawContext: ExecuteContext;
91
+ debugInfo?: CrudResultDebugInfo;
92
+ });
93
+ }
94
+ /** 计数结果 */
95
+ declare class CrudCountResult extends CrudResultBase {
96
+ readonly count: number;
97
+ constructor(data: {
98
+ count: number;
99
+ rawContext: ExecuteContext;
100
+ debugInfo?: CrudResultDebugInfo;
101
+ });
102
+ }
103
+ /** InsertOrUpdate 结果 */
104
+ declare class CrudUpsertResult extends CrudResultBase {
105
+ readonly insertAffected?: ResModelAffected;
106
+ readonly updateAffected?: ResModelAffected;
107
+ readonly isExist: boolean;
108
+ constructor(data: {
109
+ insertAffected?: ResModelAffected;
110
+ updateAffected?: ResModelAffected;
111
+ isExist: boolean;
112
+ rawContext: ExecuteContext;
113
+ debugInfo?: CrudResultDebugInfo;
114
+ });
115
+ }
116
+ export { CrudResultBase, CrudWriteResult, CrudQueryOneResult, CrudQueryListResult, CrudQueryPageResult, CrudExistResult, CrudCountResult, CrudUpsertResult, };
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _CrudResultBase_rawContext;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CrudUpsertResult = exports.CrudCountResult = exports.CrudExistResult = exports.CrudQueryPageResult = exports.CrudQueryListResult = exports.CrudQueryOneResult = exports.CrudWriteResult = exports.CrudResultBase = void 0;
16
+ /**
17
+ * 结果基类
18
+ *
19
+ * 使用 ES2022 私有字段 #rawContext 存储 ExecuteContext 引用。
20
+ * ES2022 私有字段特性:JSON.stringify 不会序列化 # 开头的私有字段。
21
+ * 因此结果对象可直接返回给 API 前端,自动过滤掉内部上下文。
22
+ *
23
+ * Node.js 兼容性:Node.js 14.6+ 完全支持 ES2022 私有字段。
24
+ */
25
+ class CrudResultBase {
26
+ constructor(rawContext, debugInfo) {
27
+ _CrudResultBase_rawContext.set(this, void 0);
28
+ __classPrivateFieldSet(this, _CrudResultBase_rawContext, rawContext, "f");
29
+ this.debugInfo = debugInfo || {};
30
+ }
31
+ getRawContext() {
32
+ return __classPrivateFieldGet(this, _CrudResultBase_rawContext, "f");
33
+ }
34
+ /**
35
+ * 生成带辅助定位信息的错误消息
36
+ * @param baseMessage 基础错误信息
37
+ * @returns 包含定位信息的完整错误消息
38
+ */
39
+ buildErrorMessage(baseMessage) {
40
+ const parts = [baseMessage];
41
+ if (this.debugInfo.sqlDatabase) {
42
+ parts.push(`数据库: ${this.debugInfo.sqlDatabase}`);
43
+ }
44
+ if (this.debugInfo.sqlTable) {
45
+ parts.push(`表: ${this.debugInfo.sqlTable}`);
46
+ }
47
+ if (this.debugInfo.method) {
48
+ parts.push(`方法: ${this.debugInfo.method}`);
49
+ }
50
+ if (this.debugInfo.condition) {
51
+ try {
52
+ parts.push(`条件: ${JSON.stringify(this.debugInfo.condition)}`);
53
+ }
54
+ catch (_a) {
55
+ parts.push(`条件: [无法序列化]`);
56
+ }
57
+ }
58
+ return parts.join(' | ');
59
+ }
60
+ }
61
+ exports.CrudResultBase = CrudResultBase;
62
+ _CrudResultBase_rawContext = new WeakMap();
63
+ /** 写操作结果(INSERT/UPDATE/DELETE) */
64
+ class CrudWriteResult extends CrudResultBase {
65
+ constructor(data) {
66
+ super(data.rawContext, data.debugInfo);
67
+ this.affectedRows = data.affectedRows;
68
+ this.insertId = data.insertId;
69
+ }
70
+ }
71
+ exports.CrudWriteResult = CrudWriteResult;
72
+ /** 单条查询结果 */
73
+ class CrudQueryOneResult extends CrudResultBase {
74
+ constructor(data) {
75
+ super(data.rawContext, data.debugInfo);
76
+ this.row = data.row;
77
+ this.found = (this.row !== null && this.row !== undefined);
78
+ this.fromTable = data.fromTable;
79
+ }
80
+ }
81
+ exports.CrudQueryOneResult = CrudQueryOneResult;
82
+ /** 列表查询结果 */
83
+ class CrudQueryListResult extends CrudResultBase {
84
+ constructor(data) {
85
+ super(data.rawContext, data.debugInfo);
86
+ this.rows = data.rows || [];
87
+ this.count = this.rows.length;
88
+ }
89
+ }
90
+ exports.CrudQueryListResult = CrudQueryListResult;
91
+ /** 分页查询结果 */
92
+ class CrudQueryPageResult extends CrudResultBase {
93
+ constructor(data) {
94
+ super(data.rawContext, data.debugInfo);
95
+ this.rows = data.rows || [];
96
+ this.totalCount = data.totalCount;
97
+ this.count = this.rows.length;
98
+ }
99
+ }
100
+ exports.CrudQueryPageResult = CrudQueryPageResult;
101
+ /** 存在性判断结果 */
102
+ class CrudExistResult extends CrudResultBase {
103
+ constructor(data) {
104
+ super(data.rawContext, data.debugInfo);
105
+ this.exists = data.exists;
106
+ }
107
+ }
108
+ exports.CrudExistResult = CrudExistResult;
109
+ /** 计数结果 */
110
+ class CrudCountResult extends CrudResultBase {
111
+ constructor(data) {
112
+ super(data.rawContext, data.debugInfo);
113
+ this.count = data.count;
114
+ }
115
+ }
116
+ exports.CrudCountResult = CrudCountResult;
117
+ /** InsertOrUpdate 结果 */
118
+ class CrudUpsertResult extends CrudResultBase {
119
+ constructor(data) {
120
+ super(data.rawContext, data.debugInfo);
121
+ this.insertAffected = data.insertAffected;
122
+ this.updateAffected = data.updateAffected;
123
+ this.isExist = data.isExist;
124
+ }
125
+ }
126
+ exports.CrudUpsertResult = CrudUpsertResult;
@@ -1,9 +1,9 @@
1
- import { IOrderByItem, IRequestModel, IVisitor } from '../interfaces';
1
+ import { IOrderByItem, IRequestModel, IVisitor, IRequestCondition } from '../interfaces';
2
2
  declare class RequestModel {
3
3
  visitor: IVisitor;
4
4
  method: string;
5
5
  columns?: string[];
6
- condition?: Record<string, any>;
6
+ condition?: IRequestCondition;
7
7
  data?: Record<string, any> | Record<string, any>[];
8
8
  limit: number;
9
9
  offset: number;
@@ -17,5 +17,7 @@ export interface ICurdProServiceHub {
17
17
  convertOriginToExecuteSql(sqlCfgModel: SqlCfgModel): Promise<void>;
18
18
  executeFuncCfg(tmpFunCfg: IFuncCfgModel, exeFunCtx: FuncContext): string;
19
19
  getTableMeta(query: ITableMetaQuery): Promise<ITableMeta>;
20
+ getPrimaryKeyColumns(query: ITableMetaQuery): Promise<string[]>;
20
21
  convertDataTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void>;
22
+ convertConditionTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void>;
21
23
  }
@@ -3,10 +3,11 @@ import { RequestModel } from '../models/RequestModel';
3
3
  import { RequestCfgModel } from '../models/RequestCfgModel';
4
4
  /**
5
5
  * 数据类型转换服务
6
- * 根据表结构字段类型,在 INSERT/UPDATE 操作前自动转换数据格式,确保数据与数据库方言兼容
6
+ * 根据表结构字段类型,自动转换数据格式,确保数据与数据库方言兼容,防止隐式类型转换导致索引失效
7
7
  *
8
8
  * 当前支持的转换:
9
- * - PostgreSQL ARRAY 类型:JSON 数组 → PG 数组字面量 {"a","b","c"}
9
+ * - PostgreSQL ARRAY 类型(INSERT/UPDATE data):JSON 数组 → PG 数组字面量 {"a","b","c"}
10
+ * - 查询条件类型强转(SELECT/DELETE/UPDATE condition):字符串 → 数字/布尔,防止隐式类型转换导致索引失效
10
11
  */
11
12
  declare class CrudProDataTypeConvertService extends CrudProServiceBase {
12
13
  /**
@@ -44,6 +45,73 @@ declare class CrudProDataTypeConvertService extends CrudProServiceBase {
44
45
  * 将单个 JS 值转为 PG 数组元素的字面量表示
45
46
  */
46
47
  private toPgArrayItem;
48
+ /**
49
+ * 查询时:根据表结构字段类型,自动转换 condition 中的数据格式
50
+ * 防止数据库隐式类型转换导致索引失效
51
+ *
52
+ * 实现步骤:
53
+ * 1. 判断操作类型是否为查询/删除/更新(这些操作包含 WHERE 条件)
54
+ * 2. 获取表元数据,构建字段名→类型映射
55
+ * 3. 递归遍历 condition(支持 $or/$and 嵌套),按字段类型转换值
56
+ *
57
+ * 转换规则(双向保护,仅处理最常建索引的列类型):
58
+ * - 整数列(int/bigint/smallint/tinyint/mediumint) + 字符串值 → number
59
+ * - 整数列 + 布尔值 → 0/1
60
+ * - 字符串列(varchar/char/text等) + 数字值 → string
61
+ * - 字符串列 + 布尔值 → string
62
+ *
63
+ * @param reqModel 请求模型
64
+ * @param cfgModel 配置模型
65
+ */
66
+ convertConditionTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void>;
67
+ /**
68
+ * 递归遍历 condition,对每个字段值做类型转换
69
+ *
70
+ * 实现步骤:
71
+ * 1. 遍历 condition 的每个 key
72
+ * 2. 若 key 为 $or/$and 逻辑操作符,递归处理子条件数组
73
+ * 3. 若 key 为字段名且值为基本类型,直接转换
74
+ * 4. 若 key 为字段名且值为比较操作符对象($gt/$in等),遍历操作符逐值转换
75
+ *
76
+ * @param condition 查询条件对象
77
+ * @param typeMap 字段名→类型映射
78
+ * @param sqlDbType 数据库类型
79
+ */
80
+ private convertConditionFields;
81
+ /**
82
+ * 根据字段类型转换单个值,防止隐式类型转换导致索引失效
83
+ *
84
+ * 转换规则(双向保护):
85
+ * - 整数列 + 字符串值 → number(WHERE int_col = '123' 索引失效)
86
+ * - 整数列 + 布尔值 → 0/1
87
+ * - 字符串列 + 数字值 → string(WHERE varchar_col = 123 索引失效)
88
+ * - 字符串列 + 布尔值 → string
89
+ *
90
+ * @param value 原始值
91
+ * @param fieldType 字段类型(小写)
92
+ * @param sqlDbType 数据库类型
93
+ * @returns 转换后的值
94
+ */
95
+ private convertValueByType;
96
+ /**
97
+ * 判断字段类型是否为整数类型
98
+ * 覆盖 MySQL/PostgreSQL/SQL Server 三种数据库的整数类型名
99
+ */
100
+ private isIntegerType;
101
+ /**
102
+ * 判断字段类型是否为字符串类型
103
+ * 覆盖 MySQL/PostgreSQL/SQL Server 三种数据库的字符串类型名
104
+ */
105
+ private isStringType;
106
+ /**
107
+ * 判断 sqlSimpleName 是否为包含 WHERE 条件的操作类型(查询/删除/更新)
108
+ * 这些操作的 condition 会参与 WHERE 子句,索引失效问题同样存在
109
+ */
110
+ private isConditionType;
111
+ /**
112
+ * 判断值是否为基本类型(string | number | boolean)
113
+ */
114
+ private isBasicType;
47
115
  /**
48
116
  * 判断 sqlSimpleName 是否为 INSERT/UPDATE 类型
49
117
  */