midway-fatcms 0.0.5 → 0.0.7
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.
- package/.qoder/skills/midway-fatcms-crud/SKILL.md +375 -0
- package/.qoder/skills/midway-fatcms-crud/examples.md +990 -0
- package/.qoder/skills/midway-fatcms-crud/reference.md +568 -0
- package/README.md +377 -134
- package/dist/controller/manage/CrudStandardDesignApi.d.ts +0 -2
- package/dist/controller/manage/CrudStandardDesignApi.js +11 -85
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/libs/crud-pro/CrudPro.d.ts +9 -1
- package/dist/libs/crud-pro/CrudPro.js +15 -0
- package/dist/libs/crud-pro/README.md +809 -0
- package/dist/libs/crud-pro/README_FUNC.md +193 -0
- package/dist/libs/crud-pro/exceptions.d.ts +2 -0
- package/dist/libs/crud-pro/exceptions.js +2 -0
- package/dist/libs/crud-pro/interfaces.d.ts +34 -1
- package/dist/libs/crud-pro/models/ExecuteContext.d.ts +3 -3
- package/dist/libs/crud-pro/models/ExecuteContext.js +2 -0
- package/dist/libs/crud-pro/models/RequestModel.d.ts +6 -2
- package/dist/libs/crud-pro/models/RequestModel.js +20 -53
- package/dist/libs/crud-pro/models/ResModel.d.ts +6 -4
- package/dist/libs/crud-pro/models/ServiceHub.d.ts +1 -0
- package/dist/libs/crud-pro/models/keys.d.ts +6 -1
- package/dist/libs/crud-pro/models/keys.js +5 -0
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +52 -0
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +158 -0
- package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +20 -1
- package/dist/libs/crud-pro/services/CrudProFieldValidateService.d.ts +7 -0
- package/dist/libs/crud-pro/services/CrudProFieldValidateService.js +32 -0
- package/dist/libs/crud-pro/services/CrudProGenSqlService.d.ts +13 -0
- package/dist/libs/crud-pro/services/CrudProGenSqlService.js +44 -7
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.d.ts +43 -0
- package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +132 -1
- package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +15 -1
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +107 -0
- package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +5 -1
- package/dist/libs/crud-pro/services/CurdProServiceHub.js +11 -0
- package/dist/libs/crud-pro/utils/DateTimeUtils.d.ts +1 -0
- package/dist/libs/crud-pro/utils/DateTimeUtils.js +3 -0
- package/dist/libs/crud-pro/utils/MixinUtils.d.ts +32 -0
- package/dist/libs/crud-pro/utils/MixinUtils.js +85 -1
- package/dist/libs/crud-pro/utils/OrderByUtils.d.ts +70 -0
- package/dist/libs/crud-pro/utils/OrderByUtils.js +158 -0
- package/dist/libs/crud-pro/utils/ValidateUtils.js +1 -1
- package/dist/libs/crud-sharding/ROUTING_LOGIC.md +944 -0
- package/dist/libs/crud-sharding/ShardingConfig.d.ts +218 -0
- package/dist/libs/crud-sharding/ShardingConfig.js +32 -0
- package/dist/libs/crud-sharding/ShardingCountCache.d.ts +69 -0
- package/dist/libs/crud-sharding/ShardingCountCache.js +160 -0
- package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +363 -0
- package/dist/libs/crud-sharding/ShardingCrudPro.js +675 -0
- package/dist/libs/crud-sharding/ShardingMerger.d.ts +130 -0
- package/dist/libs/crud-sharding/ShardingMerger.js +282 -0
- package/dist/libs/crud-sharding/ShardingRouter.d.ts +69 -0
- package/dist/libs/crud-sharding/ShardingRouter.js +377 -0
- package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +146 -0
- package/dist/libs/crud-sharding/ShardingTableCreator.js +805 -0
- package/dist/libs/crud-sharding/ShardingUtils.d.ts +38 -0
- package/dist/libs/crud-sharding/ShardingUtils.js +77 -0
- package/dist/libs/crud-sharding/index.d.ts +45 -0
- package/dist/libs/crud-sharding/index.js +55 -0
- package/dist/models/StandardColumns.d.ts +71 -0
- package/dist/models/StandardColumns.js +28 -0
- package/dist/service/SysAppService.js +2 -2
- package/dist/service/SysConfigService.js +1 -1
- package/dist/service/SysDictDataService.js +2 -2
- package/dist/service/SysMenuService.js +1 -1
- package/dist/service/UserAccountService.d.ts +1 -1
- package/dist/service/crudstd/CrudStdService.d.ts +0 -1
- package/dist/service/crudstd/CrudStdService.js +0 -27
- package/dist/service/curd/CrudProQuick.d.ts +134 -4
- package/dist/service/curd/CrudProQuick.js +155 -3
- package/dist/service/curd/CurdMixService.d.ts +2 -1
- package/dist/service/curd/CurdMixService.js +5 -1
- package/dist/service/curd/CurdProService.d.ts +44 -2
- package/dist/service/curd/CurdProService.js +53 -1
- package/dist/service/curd/README.md +1100 -0
- package/dist/service/curd/fixSoftDelete.d.ts +14 -0
- package/dist/service/curd/fixSoftDelete.js +29 -11
- package/dist/service/flow/FlowConfigService.js +1 -1
- package/dist/service/flow/FlowInstanceCrudService.js +1 -1
- package/package.json +4 -1
- package/src/controller/gateway/AsyncTaskController.ts +1 -1
- package/src/controller/manage/CrudStandardDesignApi.ts +16 -100
- package/src/index.ts +3 -0
- package/src/libs/crud-pro/CrudPro.ts +19 -1
- package/src/libs/crud-pro/README.md +809 -0
- package/src/libs/crud-pro/README_FUNC.md +193 -0
- package/src/libs/crud-pro/exceptions.ts +2 -0
- package/src/libs/crud-pro/interfaces.ts +38 -1
- package/src/libs/crud-pro/models/ExecuteContext.ts +6 -3
- package/src/libs/crud-pro/models/RequestModel.ts +23 -65
- package/src/libs/crud-pro/models/ResModel.ts +10 -4
- package/src/libs/crud-pro/models/ServiceHub.ts +2 -0
- package/src/libs/crud-pro/models/keys.ts +5 -0
- package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +171 -0
- package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +24 -1
- package/src/libs/crud-pro/services/CrudProFieldValidateService.ts +53 -1
- package/src/libs/crud-pro/services/CrudProGenSqlService.ts +51 -7
- package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +159 -2
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +139 -1
- package/src/libs/crud-pro/services/CurdProServiceHub.ts +16 -1
- package/src/libs/crud-pro/utils/DateTimeUtils.ts +3 -0
- package/src/libs/crud-pro/utils/MixinUtils.ts +97 -1
- package/src/libs/crud-pro/utils/OrderByUtils.ts +169 -0
- package/src/libs/crud-pro/utils/ValidateUtils.ts +1 -1
- package/src/libs/crud-sharding/ROUTING_LOGIC.md +944 -0
- package/src/libs/crud-sharding/ShardingConfig.ts +240 -0
- package/src/libs/crud-sharding/ShardingCountCache.ts +200 -0
- package/src/libs/crud-sharding/ShardingCrudPro.ts +835 -0
- package/src/libs/crud-sharding/ShardingMerger.ts +384 -0
- package/src/libs/crud-sharding/ShardingRouter.ts +512 -0
- package/src/libs/crud-sharding/ShardingTableCreator.ts +1007 -0
- package/src/libs/crud-sharding/ShardingUtils.ts +84 -0
- package/src/libs/crud-sharding/index.ts +64 -0
- package/src/models/StandardColumns.ts +76 -0
- package/src/service/FileCenterService.ts +1 -1
- package/src/service/SysAppService.ts +2 -2
- package/src/service/SysConfigService.ts +1 -1
- package/src/service/SysDictDataService.ts +2 -2
- package/src/service/SysMenuService.ts +2 -2
- package/src/service/WorkbenchService.ts +1 -1
- package/src/service/anyapi/AnyApiService.ts +1 -1
- package/src/service/asyncTask/AsyncTaskRunnerService.ts +1 -1
- package/src/service/crudstd/CrudStdService.ts +0 -32
- package/src/service/curd/CrudProQuick.ts +164 -5
- package/src/service/curd/CurdMixService.ts +7 -2
- package/src/service/curd/CurdProService.ts +62 -3
- package/src/service/curd/README.md +1100 -0
- package/src/service/curd/fixCfgModel.ts +1 -2
- package/src/service/curd/fixSoftDelete.ts +38 -16
- package/src/service/flow/FlowConfigService.ts +1 -1
- package/src/service/flow/FlowInstanceCrudService.ts +1 -1
|
@@ -0,0 +1,384 @@
|
|
|
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 { KeysOfSimpleSQL } from '@/libs/crud-pro/models/keys';
|
|
5
|
+
import { ShardingCountCache, shardingHashCondition } from './ShardingCountCache';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 分页查询结果
|
|
9
|
+
*/
|
|
10
|
+
export interface IShardingPageQueryResult {
|
|
11
|
+
rows: any[];
|
|
12
|
+
total_count: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 分表查询结果合并器
|
|
17
|
+
*
|
|
18
|
+
* 处理跨多个分表的查询结果合并:
|
|
19
|
+
* - 分页查询:顺序累计查询 + 结果合并
|
|
20
|
+
* - 列表查询:并行查询 + 结果合并
|
|
21
|
+
*
|
|
22
|
+
* 使用约束(时间分表专用):
|
|
23
|
+
* - 排序字段必须是分表字段(timeColumn/created_at)
|
|
24
|
+
* - 排序方向支持 DESC(最新在前)和 ASC(最旧在前)
|
|
25
|
+
* - DESC 时表顺序为 新→旧,ASC 时表顺序为 旧→新(由 ShardingCrudPro 保证)
|
|
26
|
+
*
|
|
27
|
+
* 在上述约束下,无需内存排序,直接按表顺序拼接即可。
|
|
28
|
+
*/
|
|
29
|
+
export class ShardingMerger {
|
|
30
|
+
private countCache: ShardingCountCache | undefined;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 设置 COUNT 缓存实例
|
|
34
|
+
*/
|
|
35
|
+
public setCountCache(cache: ShardingCountCache): void {
|
|
36
|
+
this.countCache = cache;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 合并多表分页查询结果(时间分表专用,按表顺序拼接优化)
|
|
40
|
+
*
|
|
41
|
+
* 前提条件:
|
|
42
|
+
* - DESC 时 tables 已按时间倒序排列(新→旧),ASC 时已按时间正序排列(旧→新)
|
|
43
|
+
* - orderBy 为 timeColumn DESC 或 timeColumn ASC
|
|
44
|
+
*
|
|
45
|
+
* 执行流程:
|
|
46
|
+
* 1. 并行统计各分表记录数
|
|
47
|
+
* 2. 根据累计数量直接定位目标表,跳过无关表
|
|
48
|
+
* 3. 只查询包含目标数据的分表,精确计算表内偏移
|
|
49
|
+
*
|
|
50
|
+
* @param crudPro CrudPro 实例
|
|
51
|
+
* @param tables 分表列表(DESC: 新→旧,ASC: 旧→新)
|
|
52
|
+
* @param reqJson 请求参数
|
|
53
|
+
* @param cfgJson 配置
|
|
54
|
+
* @returns 分页结果
|
|
55
|
+
*/
|
|
56
|
+
public async mergePageQuery(
|
|
57
|
+
crudPro: CrudPro,
|
|
58
|
+
tables: string[],
|
|
59
|
+
reqJson: IRequestModel,
|
|
60
|
+
cfgJson: IRequestCfgModel
|
|
61
|
+
): Promise<IShardingPageQueryResult> {
|
|
62
|
+
const { pageNo = 1, pageSize = 10 } = reqJson;
|
|
63
|
+
const offset = (pageNo - 1) * pageSize;
|
|
64
|
+
const targetEnd = offset + pageSize; // 需要取到第几条
|
|
65
|
+
|
|
66
|
+
// 1. 并行查询所有分表的记录数
|
|
67
|
+
const countPromises = tables.map(table =>
|
|
68
|
+
this.queryCountSafe(crudPro, table, reqJson, cfgJson)
|
|
69
|
+
);
|
|
70
|
+
const counts = await Promise.all(countPromises);
|
|
71
|
+
const totalCount = counts.reduce((sum, c) => sum + c, 0);
|
|
72
|
+
|
|
73
|
+
// 总数为0,直接返回
|
|
74
|
+
if (totalCount === 0) {
|
|
75
|
+
return { rows: [], total_count: 0 };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// 2. 根据累计数量直接定位目标表
|
|
79
|
+
const targetTables = this.locateTargetTables(tables, counts, offset, targetEnd);
|
|
80
|
+
|
|
81
|
+
// 3. 只查询包含目标数据的分表
|
|
82
|
+
let allRows: any[] = [];
|
|
83
|
+
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);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
rows: allRows,
|
|
93
|
+
total_count: totalCount,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 合并多表普通查询结果(时间分表专用,按表顺序拼接优化)
|
|
99
|
+
*
|
|
100
|
+
* 前提条件:
|
|
101
|
+
* - DESC 时 tables 已按时间倒序排列(新→旧),ASC 时已按时间正序排列(旧→新)
|
|
102
|
+
* - orderBy 为 timeColumn DESC 或 timeColumn ASC
|
|
103
|
+
*
|
|
104
|
+
* 执行流程:
|
|
105
|
+
* 1. 串行查询分表,按表顺序拼接
|
|
106
|
+
* 2. 达到 maxRows 上限后立即停止,避免查询无关表
|
|
107
|
+
*
|
|
108
|
+
* @param crudPro CrudPro 实例
|
|
109
|
+
* @param tables 分表列表(DESC: 新→旧,ASC: 旧→新)
|
|
110
|
+
* @param reqJson 请求参数
|
|
111
|
+
* @param cfgJson 配置
|
|
112
|
+
* @param maxRows 最大返回行数(默认 10000,防止 OOM)
|
|
113
|
+
* @returns 数据列表
|
|
114
|
+
*/
|
|
115
|
+
public async mergeQuery(
|
|
116
|
+
crudPro: CrudPro,
|
|
117
|
+
tables: string[],
|
|
118
|
+
reqJson: IRequestModel,
|
|
119
|
+
cfgJson: IRequestCfgModel,
|
|
120
|
+
maxRows: number = 10000
|
|
121
|
+
): Promise<any[]> {
|
|
122
|
+
// 串行查询分表,按表顺序拼接,达到上限即停
|
|
123
|
+
let allRows: any[] = [];
|
|
124
|
+
|
|
125
|
+
for (const table of tables) {
|
|
126
|
+
const needMore = maxRows - allRows.length;
|
|
127
|
+
if (needMore <= 0) {
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const rows = await this.queryRowsSafe(crudPro, table, reqJson, cfgJson, needMore);
|
|
132
|
+
allRows = allRows.concat(rows);
|
|
133
|
+
|
|
134
|
+
// 达到上限后停止,不再查询后续表
|
|
135
|
+
if (allRows.length >= maxRows) {
|
|
136
|
+
allRows = allRows.slice(0, maxRows);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return allRows;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ============ 私有方法:分页定位 ============
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 根据各表数量和分页偏移,直接定位目标表
|
|
148
|
+
*
|
|
149
|
+
* 核心优化:跳过不包含目标数据的分表,只返回需要查询的表及其表内偏移
|
|
150
|
+
*
|
|
151
|
+
* 示例:
|
|
152
|
+
* tables: [t_order_202403, t_order_202402, t_order_202401]
|
|
153
|
+
* counts: [5, 20, 1000]
|
|
154
|
+
* 累计: [5, 25, 1025]
|
|
155
|
+
*
|
|
156
|
+
* offset=990, targetEnd=1000
|
|
157
|
+
* → 202403 累计5 < 990,跳过
|
|
158
|
+
* → 202402 累计25 < 990,跳过
|
|
159
|
+
* → 202401 累计1025 >= 990,命中
|
|
160
|
+
* innerOffset = 990 - 25 = 965
|
|
161
|
+
* innerLimit = min(1000-25, 1025-990) = 10
|
|
162
|
+
*
|
|
163
|
+
* @param tables 分表列表
|
|
164
|
+
* @param counts 各表记录数
|
|
165
|
+
* @param offset 全局偏移
|
|
166
|
+
* @param targetEnd 全局截止位置
|
|
167
|
+
*/
|
|
168
|
+
private locateTargetTables(
|
|
169
|
+
tables: string[],
|
|
170
|
+
counts: number[],
|
|
171
|
+
offset: number,
|
|
172
|
+
targetEnd: number
|
|
173
|
+
): Array<{ table: string; innerOffset: number; innerLimit: number }> {
|
|
174
|
+
const result: Array<{ table: string; innerOffset: number; innerLimit: number }> = [];
|
|
175
|
+
let accumulated = 0; // 累计已跳过的记录数
|
|
176
|
+
|
|
177
|
+
for (let i = 0; i < tables.length; i++) {
|
|
178
|
+
const count = counts[i];
|
|
179
|
+
|
|
180
|
+
// 跳过空表
|
|
181
|
+
if (count === 0) continue;
|
|
182
|
+
|
|
183
|
+
// 当前表的累计终点
|
|
184
|
+
const tableEnd = accumulated + count;
|
|
185
|
+
|
|
186
|
+
// 当前表完全在目标范围之前,跳过
|
|
187
|
+
if (tableEnd <= offset) {
|
|
188
|
+
accumulated = tableEnd;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// 当前表完全在目标范围之后,停止
|
|
193
|
+
if (accumulated >= targetEnd) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 当前表与目标范围有交集,计算表内偏移
|
|
198
|
+
const innerOffset = Math.max(0, offset - accumulated);
|
|
199
|
+
const innerEnd = Math.min(count, targetEnd - accumulated);
|
|
200
|
+
const innerLimit = innerEnd - innerOffset;
|
|
201
|
+
|
|
202
|
+
result.push({
|
|
203
|
+
table: tables[i],
|
|
204
|
+
innerOffset,
|
|
205
|
+
innerLimit,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
accumulated = tableEnd;
|
|
209
|
+
|
|
210
|
+
// 已经取够数据,停止
|
|
211
|
+
if (accumulated >= targetEnd) {
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// ============ 私有方法:查询执行 ============
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 安全查询记录数(表不存在时返回0)
|
|
223
|
+
*
|
|
224
|
+
* 支持 COUNT 缓存:历史时间分表使用缓存,当前表实时查询
|
|
225
|
+
*/
|
|
226
|
+
private async queryCountSafe(
|
|
227
|
+
crudPro: CrudPro,
|
|
228
|
+
table: string,
|
|
229
|
+
reqJson: IRequestModel,
|
|
230
|
+
cfgJson: IRequestCfgModel
|
|
231
|
+
): Promise<number> {
|
|
232
|
+
const conditionHash = shardingHashCondition(reqJson.condition);
|
|
233
|
+
|
|
234
|
+
// 尝试从缓存获取(历史表)
|
|
235
|
+
if (this.countCache) {
|
|
236
|
+
const cachedCount = this.countCache.get(table, conditionHash);
|
|
237
|
+
if (cachedCount !== undefined) {
|
|
238
|
+
return cachedCount;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// 缓存未命中或当前表,执行真实查询
|
|
243
|
+
try {
|
|
244
|
+
const ctx = await this.executeCountQuery(crudPro, table, reqJson, cfgJson);
|
|
245
|
+
const count = ctx.getResModelItem('total_count') || 0;
|
|
246
|
+
|
|
247
|
+
// 写入缓存(仅历史表会被缓存)
|
|
248
|
+
if (this.countCache) {
|
|
249
|
+
this.countCache.set(table, conditionHash, count);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return count;
|
|
253
|
+
} catch (e) {
|
|
254
|
+
// 表不存在或其他错误,返回0
|
|
255
|
+
return 0;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
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
|
+
/**
|
|
308
|
+
* 执行 COUNT 查询
|
|
309
|
+
*/
|
|
310
|
+
private async executeCountQuery(
|
|
311
|
+
crudPro: CrudPro,
|
|
312
|
+
table: string,
|
|
313
|
+
reqJson: IRequestModel,
|
|
314
|
+
cfgJson: IRequestCfgModel
|
|
315
|
+
): Promise<ExecuteContext> {
|
|
316
|
+
const tempCfg: IRequestCfgModel = {
|
|
317
|
+
...cfgJson,
|
|
318
|
+
sqlTable: table,
|
|
319
|
+
sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY_COUNT,
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
return crudPro.executeCrudByCfg({ condition: reqJson.condition }, tempCfg);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* 执行数据查询
|
|
327
|
+
*/
|
|
328
|
+
private async executeQuery(
|
|
329
|
+
crudPro: CrudPro,
|
|
330
|
+
table: string,
|
|
331
|
+
reqJson: IRequestModel,
|
|
332
|
+
cfgJson: IRequestCfgModel,
|
|
333
|
+
limit?: number
|
|
334
|
+
): Promise<ExecuteContext> {
|
|
335
|
+
const tempCfg: IRequestCfgModel = {
|
|
336
|
+
...cfgJson,
|
|
337
|
+
sqlTable: table,
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
const queryReq: IRequestModel = {
|
|
341
|
+
condition: reqJson.condition,
|
|
342
|
+
columns: reqJson.columns,
|
|
343
|
+
orderBy: reqJson.orderBy,
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
// 设置查询限制
|
|
347
|
+
if (limit) {
|
|
348
|
+
queryReq.pageNo = 1;
|
|
349
|
+
queryReq.pageSize = limit;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return crudPro.executeCrudByCfg(queryReq, tempCfg);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* 执行数据查询(带表内偏移)
|
|
357
|
+
*
|
|
358
|
+
* 用于分页定位后,直接从指定偏移处取数据
|
|
359
|
+
* innerOffset=965, innerLimit=10 表示跳过该表前 965 条,取 10 条
|
|
360
|
+
*/
|
|
361
|
+
private async executeQueryWithOffset(
|
|
362
|
+
crudPro: CrudPro,
|
|
363
|
+
table: string,
|
|
364
|
+
reqJson: IRequestModel,
|
|
365
|
+
cfgJson: IRequestCfgModel,
|
|
366
|
+
innerOffset: number,
|
|
367
|
+
innerLimit: number
|
|
368
|
+
): Promise<ExecuteContext> {
|
|
369
|
+
const tempCfg: IRequestCfgModel = {
|
|
370
|
+
...cfgJson,
|
|
371
|
+
sqlTable: table,
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
const queryReq: IRequestModel = {
|
|
375
|
+
condition: reqJson.condition,
|
|
376
|
+
columns: reqJson.columns,
|
|
377
|
+
orderBy: reqJson.orderBy,
|
|
378
|
+
offset: innerOffset,
|
|
379
|
+
limit: innerLimit,
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
return crudPro.executeCrudByCfg(queryReq, tempCfg);
|
|
383
|
+
}
|
|
384
|
+
}
|