midway-fatcms 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +635 -352
- 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 +41 -1
- package/dist/libs/crud-pro/models/RequestModel.js +103 -39
- 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/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 +699 -0
- package/dist/libs/crud-sharding/ShardingMerger.d.ts +130 -0
- package/dist/libs/crud-sharding/ShardingMerger.js +280 -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 +1001 -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 +3 -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 +108 -44
- 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/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 +856 -0
- package/src/libs/crud-sharding/ShardingMerger.ts +382 -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 +1001 -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,84 @@
|
|
|
1
|
+
import { ShardingType } from './ShardingConfig';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 时间粒度类型
|
|
5
|
+
*/
|
|
6
|
+
export type ShardingTimeGranularity = 'year' | 'month' | 'day';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 将 ShardingType 转换为时间粒度
|
|
10
|
+
*/
|
|
11
|
+
export function shardingTypeToGranularity(type: ShardingType): ShardingTimeGranularity | undefined {
|
|
12
|
+
switch (type) {
|
|
13
|
+
case ShardingType.YEAR:
|
|
14
|
+
return 'year';
|
|
15
|
+
case ShardingType.MONTH:
|
|
16
|
+
return 'month';
|
|
17
|
+
case ShardingType.DAY:
|
|
18
|
+
return 'day';
|
|
19
|
+
default:
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 获取日期对应的时间后缀
|
|
26
|
+
*
|
|
27
|
+
* @param date 日期
|
|
28
|
+
* @param granularity 时间粒度(year/month/day)
|
|
29
|
+
* @returns 时间后缀字符串
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* getTimeSuffix(new Date('2024-03-15'), 'year') // "2024"
|
|
33
|
+
* getTimeSuffix(new Date('2024-03-15'), 'month') // "202403"
|
|
34
|
+
* getTimeSuffix(new Date('2024-03-15'), 'day') // "20240315"
|
|
35
|
+
*/
|
|
36
|
+
export function getTimeSuffix(date: Date, granularity: ShardingTimeGranularity): string {
|
|
37
|
+
const year = date.getFullYear();
|
|
38
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
39
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
40
|
+
|
|
41
|
+
switch (granularity) {
|
|
42
|
+
case 'year':
|
|
43
|
+
return String(year);
|
|
44
|
+
case 'month':
|
|
45
|
+
return `${year}${month}`;
|
|
46
|
+
case 'day':
|
|
47
|
+
return `${year}${month}${day}`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 获取当前时间周期的后缀(用于识别"当前表")
|
|
53
|
+
*
|
|
54
|
+
* @param shardingType 分表类型
|
|
55
|
+
* @returns 当前时间后缀,非时间分表返回空字符串
|
|
56
|
+
*/
|
|
57
|
+
export function getCurrentSuffix(shardingType: ShardingType | undefined): string {
|
|
58
|
+
const granularity = shardingTypeToGranularity(shardingType);
|
|
59
|
+
if (!granularity) {
|
|
60
|
+
return '';
|
|
61
|
+
}
|
|
62
|
+
return getTimeSuffix(new Date(), granularity);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 判断表名是否为当前时间周期的表
|
|
67
|
+
*
|
|
68
|
+
* @param tableName 完整表名(如 t_order_202404)
|
|
69
|
+
* @param baseTable 基础表名(如 t_order)
|
|
70
|
+
* @param shardingType 分表类型
|
|
71
|
+
* @returns 是否为当前表
|
|
72
|
+
*/
|
|
73
|
+
export function isCurrentTable(
|
|
74
|
+
tableName: string,
|
|
75
|
+
baseTable: string,
|
|
76
|
+
shardingType: ShardingType | undefined
|
|
77
|
+
): boolean {
|
|
78
|
+
const currentSuffix = getCurrentSuffix(shardingType);
|
|
79
|
+
if (!currentSuffix) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
const expectedTableName = `${baseTable}_${currentSuffix}`;
|
|
83
|
+
return tableName === expectedTableName;
|
|
84
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 分表 CRUD 功能模块
|
|
3
|
+
*
|
|
4
|
+
* 在 CrudPro 之上封装分表功能,提供透明的分表路由和多表查询结果合并能力。
|
|
5
|
+
*
|
|
6
|
+
* 支持的分表策略:
|
|
7
|
+
* - YEAR: 按年分表,如 order_2024, order_2025
|
|
8
|
+
* - MONTH: 按月分表,如 order_202401, order_202402
|
|
9
|
+
* - DAY: 按日分表,如 order_20240101
|
|
10
|
+
* - RANGE: 按范围分表,如 user_0 ~ user_99
|
|
11
|
+
* - HASH: 按哈希分表,如 order_01 ~ order_16
|
|
12
|
+
* - CUSTOM: 自定义分表规则
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* import { ShardingCrudPro, ShardingType } from '@/libs/crud-sharding';
|
|
16
|
+
*
|
|
17
|
+
* // 创建分表操作器
|
|
18
|
+
* const sharding = new ShardingCrudPro(crudPro, {
|
|
19
|
+
* type: ShardingType.MONTH,
|
|
20
|
+
* baseTable: 't_order',
|
|
21
|
+
* timeColumn: 'created_at',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // 插入数据(自动路由)
|
|
25
|
+
* await sharding.insert({
|
|
26
|
+
* data: { order_id: '001', amount: 100, created_at: '2024-03-15' },
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // 分页查询(自动合并多表结果)
|
|
30
|
+
* const result = await sharding.queryPage({
|
|
31
|
+
* condition: { created_at: { $gte: '2024-01-01', $lte: '2024-03-31' } },
|
|
32
|
+
* pageNo: 1,
|
|
33
|
+
* pageSize: 10,
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
// 核心类
|
|
38
|
+
export { ShardingCrudPro } from './ShardingCrudPro';
|
|
39
|
+
export { ShardingRouter } from './ShardingRouter';
|
|
40
|
+
export { ShardingMerger } from './ShardingMerger';
|
|
41
|
+
|
|
42
|
+
// 配置和类型
|
|
43
|
+
export { ShardingType } from './ShardingConfig';
|
|
44
|
+
export type {
|
|
45
|
+
IShardingConfig,
|
|
46
|
+
IShardingRouterContext,
|
|
47
|
+
IShardingRouterFunc,
|
|
48
|
+
IShardingTimeRange,
|
|
49
|
+
IShardingTableCreateOptions,
|
|
50
|
+
IShardingTableCreateResult,
|
|
51
|
+
IShardingCountCacheConfig,
|
|
52
|
+
} from './ShardingConfig';
|
|
53
|
+
|
|
54
|
+
// 结果类型
|
|
55
|
+
export type { IShardingPageQueryResult } from './ShardingMerger';
|
|
56
|
+
export type { IShardingSmartBatchInsertResult } from './ShardingCrudPro';
|
|
57
|
+
|
|
58
|
+
// 分表创建器
|
|
59
|
+
export { ShardingTableCreator } from './ShardingTableCreator';
|
|
60
|
+
|
|
61
|
+
// COUNT 缓存
|
|
62
|
+
export { ShardingCountCache, shardingHashCondition } from './ShardingCountCache';
|
|
63
|
+
|
|
64
|
+
export type { ShardingTimeGranularity } from './ShardingUtils';
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 标准表结构字段类型定义
|
|
3
|
+
*
|
|
4
|
+
* 常用标准字段(推荐所有表都包含):
|
|
5
|
+
* - deleted_at: 软删除标记,0=未删除,时间戳=已删除
|
|
6
|
+
* - deleted_by: 删除人ID
|
|
7
|
+
* - created_by: 创建人ID
|
|
8
|
+
* - created_at: 创建时间
|
|
9
|
+
* - modified_by: 最后修改人ID
|
|
10
|
+
* - modified_at: 最后修改时间
|
|
11
|
+
*
|
|
12
|
+
* 完整标准字段(需要记录详细用户信息时使用):
|
|
13
|
+
* - created_account_type: 创建人账号类型
|
|
14
|
+
* - created_avatar: 创建人头像
|
|
15
|
+
* - created_nickname: 创建人昵称
|
|
16
|
+
* - modified_account_type: 修改人账号类型
|
|
17
|
+
* - modified_avatar: 修改人头像
|
|
18
|
+
* - modified_nickname: 修改人昵称
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 常用标准表结构字段(6个字段)
|
|
23
|
+
*
|
|
24
|
+
* 推荐所有业务表都包含这些字段:
|
|
25
|
+
* - deleted_at: 删除时间戳,0=未删除
|
|
26
|
+
* - deleted_by: 删除人ID
|
|
27
|
+
* - created_by: 创建人ID
|
|
28
|
+
* - created_at: 创建时间(毫秒时间戳)
|
|
29
|
+
* - modified_by: 修改人ID
|
|
30
|
+
* - modified_at: 修改时间(毫秒时间戳)
|
|
31
|
+
*/
|
|
32
|
+
export interface ICommonStandardColumns {
|
|
33
|
+
deleted_at?: number;
|
|
34
|
+
deleted_by?: string;
|
|
35
|
+
created_by?: string;
|
|
36
|
+
created_at?: number;
|
|
37
|
+
modified_by?: string;
|
|
38
|
+
modified_at?: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 完整标准表结构字段(12个字段)
|
|
43
|
+
*
|
|
44
|
+
* 在常用字段基础上增加用户详细信息:
|
|
45
|
+
* - created_account_type: 创建人账号类型
|
|
46
|
+
* - created_avatar: 创建人头像URL
|
|
47
|
+
* - created_nickname: 创建人昵称
|
|
48
|
+
* - modified_account_type: 修改人账号类型
|
|
49
|
+
* - modified_avatar: 修改人头像URL
|
|
50
|
+
* - modified_nickname: 修改人昵称
|
|
51
|
+
*/
|
|
52
|
+
export interface IFullStandardColumns extends ICommonStandardColumns {
|
|
53
|
+
created_account_type?: string;
|
|
54
|
+
created_avatar?: string;
|
|
55
|
+
created_nickname?: string;
|
|
56
|
+
modified_account_type?: string;
|
|
57
|
+
modified_avatar?: string;
|
|
58
|
+
modified_nickname?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 包含常用标准字段的数据模型
|
|
63
|
+
*/
|
|
64
|
+
export type StandardDataModel<T = {}> = T & ICommonStandardColumns;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 包含完整标准字段的数据模型
|
|
68
|
+
*/
|
|
69
|
+
export type FullStandardDataModel<T = {}> = T & IFullStandardColumns;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 未删除查询条件
|
|
73
|
+
*/
|
|
74
|
+
export const NotDeletedCondition: { deleted_at: 0 } = {
|
|
75
|
+
deleted_at: 0,
|
|
76
|
+
};
|
|
@@ -17,12 +17,12 @@ export class SysAppService extends BaseService {
|
|
|
17
17
|
|
|
18
18
|
private get sysAppDao() {
|
|
19
19
|
const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
|
|
20
|
-
return this.curdProService.
|
|
20
|
+
return this.curdProService.getQuickCrud(SystemDbName, SystemDbType, SystemTables.sys_app)
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
private get sysAppPageDao() {
|
|
24
24
|
const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
|
|
25
|
-
return this.curdProService.
|
|
25
|
+
return this.curdProService.getQuickCrud(SystemDbName, SystemDbType, SystemTables.sys_app_page)
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
|
|
@@ -20,7 +20,7 @@ export class SysConfigService extends BaseService {
|
|
|
20
20
|
|
|
21
21
|
private get sysConfigsDao(){
|
|
22
22
|
const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
|
|
23
|
-
return this.curdProService.
|
|
23
|
+
return this.curdProService.getQuickCrud(SystemDbName, SystemDbType, SystemTables.sys_configs)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
async getSysConfigOne(config_code: string): Promise<any> {
|
|
@@ -17,12 +17,12 @@ export class SysDictDataService extends BaseService {
|
|
|
17
17
|
|
|
18
18
|
private get sys_data_dict_item() {
|
|
19
19
|
const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
|
|
20
|
-
return this.curdProService.
|
|
20
|
+
return this.curdProService.getQuickCrud(SystemDbName, SystemDbType, SystemTables.sys_data_dict_item)
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
// private get sys_data_dict(){
|
|
24
24
|
// const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
|
|
25
|
-
// return this.curdProService.
|
|
25
|
+
// return this.curdProService.getQuickCrud(SystemDbName, SystemDbType, SystemTables.sys_data_dict)
|
|
26
26
|
// }
|
|
27
27
|
|
|
28
28
|
|
|
@@ -57,13 +57,13 @@ export class SysMenuService extends BaseService {
|
|
|
57
57
|
|
|
58
58
|
private get sys_menus_table() {
|
|
59
59
|
const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
|
|
60
|
-
return this.curdProService.
|
|
60
|
+
return this.curdProService.getQuickCrud(SystemDbName, SystemDbType, SystemTables.sys_menus)
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
/**
|
|
65
65
|
* 获取所有菜单列表
|
|
66
|
-
* @returns
|
|
66
|
+
* @returns
|
|
67
67
|
*/
|
|
68
68
|
async getCachedMenusList(): Promise<SysMenus[]> {
|
|
69
69
|
return await this.cacheServiceFactory.getJsonObjectCache({
|
|
@@ -70,7 +70,7 @@ export class WorkbenchService extends BaseService implements IScheduleService {
|
|
|
70
70
|
sqlDatabase: SystemDbName,
|
|
71
71
|
sqlDbType: SystemDbType,
|
|
72
72
|
});
|
|
73
|
-
const listData = res.getResRows();
|
|
73
|
+
const listData = res.getResRows() as IWorkbenchEntity[];
|
|
74
74
|
|
|
75
75
|
const domainMap1 = MixinUtils.toMap(listData, (e: any) => e.workbench_domain); // 主域名。其他两个域名。
|
|
76
76
|
const domainMap2 = MixinUtils.toMap(listData, (e: any) => e.workbench_domain2);
|
|
@@ -259,7 +259,7 @@ export class AsyncTaskRunnerService extends BaseService implements IScheduleServ
|
|
|
259
259
|
}
|
|
260
260
|
);
|
|
261
261
|
|
|
262
|
-
const taskList = queryRes.getResRows();
|
|
262
|
+
const taskList = queryRes.getResRows() as SysAsyncTaskEntity[];
|
|
263
263
|
|
|
264
264
|
if (taskList.length === 0) {
|
|
265
265
|
return Promise.resolve();
|
|
@@ -15,7 +15,6 @@ import { CrudStdRelationService } from './CrudStdRelationService';
|
|
|
15
15
|
import { ApiBaseService } from '../base/ApiBaseService';
|
|
16
16
|
import { parseDatabaseName } from '@/libs/crud-pro/utils/DatabaseName';
|
|
17
17
|
import { GLOBAL_STATIC_CONFIG } from '@/libs/global-config/global-config';
|
|
18
|
-
import { MixinUtils } from '@/libs/crud-pro/utils/MixinUtils';
|
|
19
18
|
import { SysAppService } from "@/service/SysAppService";
|
|
20
19
|
|
|
21
20
|
|
|
@@ -141,9 +140,6 @@ export class CrudStdService extends ApiBaseService {
|
|
|
141
140
|
// 根据用户配置的keepSubmitData字段修改提交的数据
|
|
142
141
|
await this.fixSubmitDataByKeepSubmitData(params, cfgModel, appInfo, { dbType, dbName });
|
|
143
142
|
|
|
144
|
-
// 根据表结构的数据类型,修正数据类型
|
|
145
|
-
await this.fixDataFieldTypeBySqlTableField(params, cfgModel, appInfo, { dbType, dbName });
|
|
146
|
-
|
|
147
143
|
// 业务系统自定义的修改:查询前的查询条件:cfgModel
|
|
148
144
|
await GLOBAL_STATIC_CONFIG.getConfig().bizUpdateCfgModelForCrudStd(params, cfgModel, appInfo, this.ctx);
|
|
149
145
|
|
|
@@ -394,32 +390,4 @@ export class CrudStdService extends ApiBaseService {
|
|
|
394
390
|
}
|
|
395
391
|
|
|
396
392
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
private async fixDataFieldTypeBySqlTableField(params: IRequestModel, cfgModel: IRequestCfgModel, appInfo: ICrudStdAppInfoForSettingKey, arg3: { dbType: SqlDbType; dbName: string }) {
|
|
400
|
-
const tableFields = _.get(appInfo, 'stdCrudCfgObj.tableFields');
|
|
401
|
-
|
|
402
|
-
const tableFieldMap = MixinUtils.toMap(tableFields, (e: any) => {
|
|
403
|
-
return e.fieldIndex;
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
if (arg3.dbType === SqlDbType.postgres) {
|
|
407
|
-
if (cfgModel.sqlSimpleName === KeysOfSimpleSQL.SIMPLE_INSERT || cfgModel.sqlSimpleName === KeysOfSimpleSQL.SIMPLE_UPDATE) {
|
|
408
|
-
const data = params.data || {};
|
|
409
|
-
const dataKeys = Object.keys(data);
|
|
410
|
-
for (let index = 0; index < dataKeys.length; index++) {
|
|
411
|
-
const dataKey = dataKeys[index];
|
|
412
|
-
const dataValue = data[dataKey];
|
|
413
|
-
const fieldInfo = tableFieldMap[dataKey];
|
|
414
|
-
const fieldType = ('' + _.get(fieldInfo, 'type')).toUpperCase();
|
|
415
|
-
if (fieldType === 'ARRAY') {
|
|
416
|
-
const dataValueArray = parseJsonObject(dataValue);
|
|
417
|
-
if (Array.isArray(dataValueArray)) {
|
|
418
|
-
data[dataKey] = `{${dataValueArray.map(v => `"${v}"`).join(',')}}`;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
393
|
}
|
|
@@ -2,7 +2,11 @@ import { KeysOfSimpleSQL, SqlDbType } from '@/libs/crud-pro/models/keys';
|
|
|
2
2
|
import { IRequestCfgModel, IRequestModel, ISqlCfgModel } from '@/libs/crud-pro/interfaces';
|
|
3
3
|
import { IRequestCfgModel2 } from '@/models/bizmodels';
|
|
4
4
|
import { CrudPro } from '@/libs/crud-pro/CrudPro';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
ResModelAffected,
|
|
7
|
+
ResModelPageQuery,
|
|
8
|
+
ResModelStandard
|
|
9
|
+
} from '@/libs/crud-pro/models/ResModel';
|
|
6
10
|
import { fixSoftDelete } from "@/service/curd/fixSoftDelete";
|
|
7
11
|
import { Context } from "@midwayjs/koa";
|
|
8
12
|
|
|
@@ -31,6 +35,11 @@ export class CrudProQuick {
|
|
|
31
35
|
this.sqlTable = args.sqlTable; // 全局sqlTable为空时,单独调用时就必须传sqlTable参数。
|
|
32
36
|
}
|
|
33
37
|
|
|
38
|
+
/**
|
|
39
|
+
* 设置基础配置模型,合并到实例的 baseCfgModel 中,后续所有 CRUD 操作都会携带这些配置
|
|
40
|
+
* 例如可以统一设置 maxLimit、sqlSimpleName 等公共参数,避免每次调用都重复传入
|
|
41
|
+
* @param baseCfgModel 要合并的配置项
|
|
42
|
+
*/
|
|
34
43
|
public setBaseCfgModel(baseCfgModel: IRequestCfgModel2) {
|
|
35
44
|
Object.assign(this.baseCfgModel, baseCfgModel);
|
|
36
45
|
}
|
|
@@ -115,6 +124,13 @@ export class CrudProQuick {
|
|
|
115
124
|
return res.getResRows();
|
|
116
125
|
}
|
|
117
126
|
|
|
127
|
+
/**
|
|
128
|
+
* 分页查询数据列表,返回包含 rows 和 total_count 的分页结果
|
|
129
|
+
* 内部使用 SIMPLE_QUERY_PAGE 模式,reqJson 中可传入 pageNo、pageSize 控制分页
|
|
130
|
+
* @param reqJson 请求参数,支持 condition(查询条件)、pageNo、pageSize 等
|
|
131
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
132
|
+
* @returns ResModelPageQuery 包含 rows(数据行数组)和 total_count(总记录数)
|
|
133
|
+
*/
|
|
118
134
|
public async getListPage(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelPageQuery> {
|
|
119
135
|
const cfgModel: IRequestCfgModel = {
|
|
120
136
|
sqlTable,
|
|
@@ -124,6 +140,29 @@ export class CrudProQuick {
|
|
|
124
140
|
return res.getResModelForQueryPage();
|
|
125
141
|
}
|
|
126
142
|
|
|
143
|
+
/**
|
|
144
|
+
* 判断满足条件的记录是否存在
|
|
145
|
+
* 内部使用 SIMPLE_QUERY_EXIST 模式,通过 SELECT EXISTS 子查询实现,找到首条匹配即返回,比 COUNT(*) 更高效
|
|
146
|
+
* @param reqJson 请求参数,通过 condition 指定查询条件
|
|
147
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
148
|
+
* @returns boolean 存在返回 true,不存在返回 false
|
|
149
|
+
*/
|
|
150
|
+
public async isExist(reqJson: IRequestModel, sqlTable?: string): Promise<boolean> {
|
|
151
|
+
const cfgModel: IRequestCfgModel = {
|
|
152
|
+
sqlTable,
|
|
153
|
+
sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY_EXIST,
|
|
154
|
+
};
|
|
155
|
+
const res = await this.executeCrudByCfg(reqJson, cfgModel);
|
|
156
|
+
return res.getResModel().is_exist;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 查询满足条件的记录总数
|
|
161
|
+
* 内部使用 SIMPLE_QUERY_COUNT 模式,仅返回 count 结果
|
|
162
|
+
* @param reqJson 请求参数,通过 condition 指定查询条件
|
|
163
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
164
|
+
* @returns number 满足条件的记录总数
|
|
165
|
+
*/
|
|
127
166
|
public async getTotalCount(reqJson: IRequestModel, sqlTable?: string): Promise<number> {
|
|
128
167
|
const cfgModel: IRequestCfgModel = {
|
|
129
168
|
sqlTable,
|
|
@@ -133,6 +172,13 @@ export class CrudProQuick {
|
|
|
133
172
|
return res.getResModel().total_count;
|
|
134
173
|
}
|
|
135
174
|
|
|
175
|
+
/**
|
|
176
|
+
* 插入一条数据记录
|
|
177
|
+
* 内部使用 SIMPLE_INSERT 模式,通过 reqJson.data 传入要插入的字段和值
|
|
178
|
+
* @param reqJson 请求参数,data 字段中包含要插入的键值对
|
|
179
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
180
|
+
* @returns ResModelAffected 包含受影响的行数信息
|
|
181
|
+
*/
|
|
136
182
|
public async insertObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected> {
|
|
137
183
|
const cfgModel: IRequestCfgModel = {
|
|
138
184
|
sqlTable,
|
|
@@ -142,6 +188,37 @@ export class CrudProQuick {
|
|
|
142
188
|
return res.getResModel().affected;
|
|
143
189
|
}
|
|
144
190
|
|
|
191
|
+
/**
|
|
192
|
+
* 批量插入数据记录
|
|
193
|
+
* 内部使用 SIMPLE_BATCH_INSERT 模式,单条 SQL 插入多行数据,效率远高于循环单条插入
|
|
194
|
+
*
|
|
195
|
+
* @param reqJson 请求参数,data 为对象数组 [{name:'a'},{name:'b'}]
|
|
196
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
197
|
+
* @returns ResModelAffected 包含受影响的行数信息
|
|
198
|
+
*
|
|
199
|
+
* 注意事项:
|
|
200
|
+
* - affectedRows: 返回实际插入的行数,所有数据库均正确返回
|
|
201
|
+
* - insertId: 仅返回第一条记录的自增ID,后续记录的ID需通过 insertId + index 推算
|
|
202
|
+
* - MySQL: 返回第一条的 insertId
|
|
203
|
+
* - PostgreSQL: RETURNING * 返回所有行,但仅取第一条的 id
|
|
204
|
+
* - SQL Server: OUTPUT 返回所有行,但仅取第一条的 id
|
|
205
|
+
*/
|
|
206
|
+
public async batchInsert(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected> {
|
|
207
|
+
const cfgModel: IRequestCfgModel = {
|
|
208
|
+
sqlTable,
|
|
209
|
+
sqlSimpleName: KeysOfSimpleSQL.SIMPLE_BATCH_INSERT,
|
|
210
|
+
};
|
|
211
|
+
const res = await this.executeCrudByCfg(reqJson, cfgModel);
|
|
212
|
+
return res.getResModel().affected;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* 更新数据记录
|
|
217
|
+
* 内部使用 SIMPLE_UPDATE 模式,通过 reqJson.data 传入要更新的字段和值,通过 reqJson.condition 指定更新条件
|
|
218
|
+
* @param reqJson 请求参数,data 为更新内容,condition 为更新条件
|
|
219
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
220
|
+
* @returns ResModelAffected 包含受影响的行数信息
|
|
221
|
+
*/
|
|
145
222
|
public async updateObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected> {
|
|
146
223
|
const cfgModel: IRequestCfgModel = {
|
|
147
224
|
sqlTable,
|
|
@@ -151,6 +228,13 @@ export class CrudProQuick {
|
|
|
151
228
|
return res.getResModel().affected;
|
|
152
229
|
}
|
|
153
230
|
|
|
231
|
+
/**
|
|
232
|
+
* 插入或更新数据记录(upsert)
|
|
233
|
+
* 内部使用 SIMPLE_INSERT_OR_UPDATE 模式,若记录已存在则更新,不存在则插入
|
|
234
|
+
* @param reqJson 请求参数,data 为要插入/更新的内容,condition 为判断条件
|
|
235
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
236
|
+
* @returns ResModelStandard 返回完整的结果模型,包含 affected、insertId 等多种返回值
|
|
237
|
+
*/
|
|
154
238
|
public async insertOrUpdate(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelStandard> {
|
|
155
239
|
const cfgModel: IRequestCfgModel = {
|
|
156
240
|
sqlTable,
|
|
@@ -160,6 +244,38 @@ export class CrudProQuick {
|
|
|
160
244
|
return res.getResModel(); // 因为它有三个返回值
|
|
161
245
|
}
|
|
162
246
|
|
|
247
|
+
/**
|
|
248
|
+
* 使用数据库原生 upsert 语法插入或更新(ON DUPLICATE KEY UPDATE / ON CONFLICT / MERGE)
|
|
249
|
+
* 内部使用 SIMPLE_INSERT_ON_DUPLICATE_UPDATE 模式,单条 SQL 完成 upsert,效率更高
|
|
250
|
+
*
|
|
251
|
+
* 数据库差异:
|
|
252
|
+
* - MySQL: ON DUPLICATE KEY UPDATE(依赖唯一索引/主键)
|
|
253
|
+
* - PostgreSQL: ON CONFLICT (...) DO UPDATE(需配置 uniqueColumn)
|
|
254
|
+
* - SQL Server: IF EXISTS ... ELSE ...(需配置 uniqueColumn,仅支持单列)
|
|
255
|
+
*
|
|
256
|
+
* @param reqJson 请求参数,data 为要插入/更新的内容
|
|
257
|
+
* @param uniqueColumn 唯一列名(PostgreSQL/SQL Server 必需),PostgreSQL 支持多列,SQL Server 仅支持单列
|
|
258
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
259
|
+
* @returns ResModelAffected 包含受影响的行数信息
|
|
260
|
+
*/
|
|
261
|
+
public async insertOnDuplicate(reqJson: IRequestModel, uniqueColumn?: string[], sqlTable?: string): Promise<ResModelAffected> {
|
|
262
|
+
const cfgModel: IRequestCfgModel = {
|
|
263
|
+
sqlTable,
|
|
264
|
+
sqlSimpleName: KeysOfSimpleSQL.SIMPLE_INSERT_ON_DUPLICATE_UPDATE,
|
|
265
|
+
uniqueColumn,
|
|
266
|
+
};
|
|
267
|
+
const res = await this.executeCrudByCfg(reqJson, cfgModel);
|
|
268
|
+
return res.getResModel().affected;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* 删除数据记录
|
|
273
|
+
* 内部使用 SIMPLE_DELETE 模式,通过 reqJson.condition 指定删除条件
|
|
274
|
+
* 注意:如果启用了软删除,实际执行的是更新操作而非物理删除
|
|
275
|
+
* @param reqJson 请求参数,condition 为删除条件
|
|
276
|
+
* @param sqlTable 数据库表名,若构造实例时已设置全局 sqlTable 则可省略
|
|
277
|
+
* @returns ResModelAffected 包含受影响的行数信息
|
|
278
|
+
*/
|
|
163
279
|
public async deleteObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected> {
|
|
164
280
|
const cfgModel: IRequestCfgModel = {
|
|
165
281
|
sqlTable,
|
|
@@ -169,6 +285,13 @@ export class CrudProQuick {
|
|
|
169
285
|
return res.getResModel().affected;
|
|
170
286
|
}
|
|
171
287
|
|
|
288
|
+
/**
|
|
289
|
+
* 执行自定义 SQL 语句(经 CrudPro 框架封装处理)
|
|
290
|
+
* 与 executeNativeSQL 不同,此方法执行的 SQL 会经过框架的参数绑定等安全处理
|
|
291
|
+
* @param executeSql 要执行的 SQL 语句,支持参数占位符
|
|
292
|
+
* @param args SQL 参数数组,与占位符一一对应
|
|
293
|
+
* @returns any SQL 执行结果
|
|
294
|
+
*/
|
|
172
295
|
public async executeSQL(executeSql: string, args?: any[]): Promise<any> {
|
|
173
296
|
const sqlCfgModel: ISqlCfgModel = {
|
|
174
297
|
executeSql: executeSql,
|
|
@@ -182,11 +305,47 @@ export class CrudProQuick {
|
|
|
182
305
|
|
|
183
306
|
|
|
184
307
|
/**
|
|
185
|
-
* 执行数据库的原生SQL
|
|
186
|
-
*
|
|
187
|
-
*
|
|
308
|
+
* 执行数据库的原生SQL语句,不做任何封装
|
|
309
|
+
*
|
|
310
|
+
* 返回值结构取决于 SQL 类型和数据库类型:
|
|
311
|
+
*
|
|
312
|
+
* **SELECT 查询**: 返回行数据数组
|
|
313
|
+
*
|
|
314
|
+
* **INSERT/UPDATE/DELETE**: 返回数据库驱动的原始结果
|
|
315
|
+
* - MySQL: `NativeSqlResultMySQL` - 包含 insertId、affectedRows、changedRows 等
|
|
316
|
+
* - PostgreSQL: 空数组(pg 驱动返回 rows 为空)
|
|
317
|
+
* - SQL Server: 空数组(mssql 驱动返回 recordset 为空)
|
|
318
|
+
*
|
|
319
|
+
* **注意**:
|
|
320
|
+
* - 使用 `?` 作为占位符,框架会自动转换为对应数据库的占位符
|
|
321
|
+
* - PostgreSQL/SQL Server 会将 `?` 转换为 `$1, $2, ...` 或 `@fatcms_ms1, @fatcms_ms2, ...`
|
|
322
|
+
*
|
|
323
|
+
* @typeParam T 返回值类型,默认 any。
|
|
324
|
+
* 预定义类型位于 `@/libs/crud-pro/models/ResModel`:
|
|
325
|
+
* - `NativeSqlSelectResult` - SELECT 查询返回的行数组
|
|
326
|
+
* - `NativeSqlResultMySQL` - MySQL INSERT/UPDATE/DELETE 返回结果
|
|
327
|
+
* - 或自定义行类型数组,如 `{id: number, name: string}[]`
|
|
328
|
+
*
|
|
329
|
+
* @param executeNativeSql 原生 SQL 语句,使用 `?` 作为参数占位符
|
|
330
|
+
* @param args 参数数组,与 SQL 中的 `?` 一一对应
|
|
331
|
+
* @returns 根据 SQL 类型返回对应结果
|
|
332
|
+
*
|
|
333
|
+
* @example
|
|
334
|
+
* // SELECT 查询 - 使用自定义行类型
|
|
335
|
+
* const rows = await crudProQuick.executeNativeSQL<{id: number, name: string}[]>(
|
|
336
|
+
* 'SELECT id, name FROM user WHERE age > ?',
|
|
337
|
+
* [18]
|
|
338
|
+
* );
|
|
339
|
+
*
|
|
340
|
+
* // INSERT - MySQL 返回 NativeSqlResultMySQL
|
|
341
|
+
* // 需先导入: import { NativeSqlResultMySQL } from '@/libs/crud-pro/models/ResModel';
|
|
342
|
+
* const result = await crudProQuick.executeNativeSQL<NativeSqlResultMySQL>(
|
|
343
|
+
* 'INSERT INTO user (name, age) VALUES (?, ?)',
|
|
344
|
+
* ['张三', 20]
|
|
345
|
+
* );
|
|
346
|
+
* console.log(result.insertId, result.affectedRows);
|
|
188
347
|
*/
|
|
189
|
-
public async executeNativeSQL(executeNativeSql: string, args?: any[]): Promise<
|
|
348
|
+
public async executeNativeSQL<T = any>(executeNativeSql: string, args?: any[]): Promise<T> {
|
|
190
349
|
const sqlCfgModel: ISqlCfgModel = {
|
|
191
350
|
isNativeSQL: true,
|
|
192
351
|
executeSql: executeNativeSql,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Inject, Provide } from '@midwayjs/core';
|
|
2
2
|
import { CurdProService } from './CurdProService';
|
|
3
3
|
import { CurdMixByDictService } from './CurdMixByDictService';
|
|
4
|
-
import { ColumnRelation, IRequestCfgModel, IRequestModel, ISqlCfgModel } from '@/libs/crud-pro/interfaces';
|
|
4
|
+
import { ColumnRelation, IRequestCfgModel, IRequestModel, ISqlCfgModel, ITableListResult, ITableNamesOptions, ITableNamesQuery } from '@/libs/crud-pro/interfaces';
|
|
5
5
|
import { CurdMixBySysConfigService } from './CurdMixBySysConfigService';
|
|
6
6
|
import { CurdMixByAccountService } from './CurdMixByAccountService';
|
|
7
7
|
import { RelatedType } from './CurdMixUtils';
|
|
@@ -50,7 +50,7 @@ export class CurdMixService {
|
|
|
50
50
|
|
|
51
51
|
getBbUtil(sqlDatabase: string, sqlDbType: SqlDbType, sqlTable?: string) {
|
|
52
52
|
this.prepare();
|
|
53
|
-
return this.curdProService.
|
|
53
|
+
return this.curdProService.getQuickCrud(sqlDatabase, sqlDbType, sqlTable);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
async executeSQL(sqlCfgModel: ISqlCfgModel) {
|
|
@@ -94,4 +94,9 @@ export class CurdMixService {
|
|
|
94
94
|
await handler.handleExecuteContext(exeCtx);
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
+
|
|
98
|
+
public async getAllTableInfos(query: ITableNamesQuery, options?: ITableNamesOptions): Promise<ITableListResult> {
|
|
99
|
+
this.prepare();
|
|
100
|
+
return this.curdProService.getAllTableInfos(query, options);
|
|
101
|
+
}
|
|
97
102
|
}
|