midway-fatcms 0.0.17 → 0.0.18
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/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +2 -37
- package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +137 -213
- package/dist/libs/crud-pro/utils/MixinUtils.d.ts +2 -17
- package/dist/libs/crud-pro/utils/MixinUtils.js +4 -84
- package/dist/libs/crud-pro/utils/idgene/generateSnowflakeId.d.ts +12 -0
- package/dist/libs/crud-pro/utils/idgene/generateSnowflakeId.js +61 -0
- package/dist/libs/crud-pro/utils/idgene/generateSnowflakeIdExt.d.ts +19 -0
- package/dist/libs/crud-pro/utils/idgene/generateSnowflakeIdExt.js +89 -0
- package/dist/libs/crud-pro/utils/idgene/index.d.ts +3 -0
- package/dist/libs/crud-pro/utils/idgene/index.js +10 -0
- package/dist/libs/crud-pro/utils/idgene/uuid.d.ts +7 -0
- package/dist/libs/crud-pro/utils/idgene/uuid.js +28 -0
- package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +0 -17
- package/dist/libs/crud-pro-quick/fixSoftDelete.js +55 -5
- package/dist/libs/crud-pro-quick/models.d.ts +11 -1
- package/dist/service/SysAppService.d.ts +0 -3
- package/dist/service/SysAppService.js +0 -15
- package/dist/service/SysConfigService.d.ts +0 -1
- package/dist/service/SysConfigService.js +0 -6
- package/dist/service/SysDictDataService.d.ts +0 -2
- package/dist/service/SysDictDataService.js +0 -12
- package/dist/service/SysMenuService.d.ts +0 -1
- package/dist/service/SysMenuService.js +0 -3
- package/dist/service/WorkbenchService.d.ts +0 -1
- package/dist/service/WorkbenchService.js +0 -3
- package/dist/service/base/bizmemcache/BizMemCacheService.js +4 -2
- package/dist/service/base/bizmemcache/BizMemCacheStore.js +10 -9
- package/dist/service/crudstd/CrudStdService.js +1 -1
- package/dist/service/curd/fixCfgModel.js +21 -1
- package/package.json +1 -1
- package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +149 -219
- package/src/libs/crud-pro/utils/MixinUtils.ts +309 -400
- package/src/libs/crud-pro/utils/idgene/generateSnowflakeId.ts +65 -0
- package/src/libs/crud-pro/utils/idgene/generateSnowflakeIdExt.ts +99 -0
- package/src/libs/crud-pro/utils/idgene/index.ts +3 -0
- package/src/libs/crud-pro/utils/idgene/uuid.ts +26 -0
- package/src/libs/crud-pro-quick/fixSoftDelete.ts +84 -18
- package/src/libs/crud-pro-quick/models.ts +15 -3
- package/src/service/SysAppService.ts +0 -18
- package/src/service/SysConfigService.ts +0 -8
- package/src/service/SysDictDataService.ts +0 -14
- package/src/service/SysMenuService.ts +0 -4
- package/src/service/WorkbenchService.ts +0 -5
- package/src/service/base/bizmemcache/BizMemCacheService.ts +4 -2
- package/src/service/base/bizmemcache/BizMemCacheStore.ts +10 -9
- package/src/service/crudstd/CrudStdService.ts +3 -2
- package/src/service/curd/fixCfgModel.ts +145 -125
|
@@ -2,46 +2,11 @@ import { CrudProServiceBase } from './CrudProServiceBase';
|
|
|
2
2
|
import { RequestModel } from '../models/RequestModel';
|
|
3
3
|
import { RequestCfgModel } from '../models/RequestCfgModel';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* 鎸夋暟鎹簱鍒嗙被锛?
|
|
9
|
-
* - PostgreSQL 涓撴湁锛欰RRAY 鍒?鈫?PG 鏁扮粍瀛楅潰閲?
|
|
10
|
-
* - 涓夊簱閫氱敤锛堝€肩被鍨嬮┍鍔級锛氬璞?鏁扮粍 鈫?JSON.stringify()锛岃鐩?json/jsonb/longtext瀛楯SON 绛夋墍鏈夊満鏅?
|
|
11
|
-
* - 涓夊簱閫氱敤锛氭煡璇㈡潯浠剁被鍨嬪己杞紝闃叉绱㈠紩澶辨晥
|
|
5
|
+
* 数据类型转换服务
|
|
6
|
+
* data/condition 类型强转、PG ARRAY 字面量、对象/数组 JSON 序列化
|
|
12
7
|
*/
|
|
13
8
|
declare class CrudProDataTypeConvertService extends CrudProServiceBase {
|
|
14
|
-
/**
|
|
15
|
-
* INSERT/UPDATE 鏃讹細鏍规嵁琛ㄧ粨鏋勫瓧娈电被鍨嬭嚜鍔ㄨ浆鎹?reqModel.data 涓殑鏁版嵁鏍煎紡
|
|
16
|
-
*
|
|
17
|
-
* 瀹炵幇姝ラ锛?
|
|
18
|
-
* 1. 鍒ゆ柇鎿嶄綔绫诲瀷鏄惁涓?INSERT/UPDATE锛屽惁鍒欒烦杩?
|
|
19
|
-
* 2. PostgreSQL锛氳幏鍙栬〃鍏冩暟鎹紝璇嗗埆 ARRAY 绫诲瀷瀛楁锛屽皢 JS 鏁扮粍杞负 PG 鏁扮粍瀛楅潰閲?
|
|
20
|
-
* 3. 涓夊簱閫氱敤锛氶亶鍘?data 涓墍鏈夊€硷紝灏嗗璞?鏁扮粍鑷姩 JSON.stringify()
|
|
21
|
-
* 涓嶄緷璧栧垪绫诲瀷鍒ゆ柇锛屽洜涓?longtext/varchar 绛夐潪 JSON 鍒椾篃鍙兘瀛?JSON 瀵硅薄
|
|
22
|
-
*
|
|
23
|
-
* @param reqModel 璇锋眰妯″瀷
|
|
24
|
-
* @param cfgModel 閰嶇疆妯″瀷
|
|
25
|
-
*/
|
|
26
9
|
convertDataTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
* SELECT/DELETE/UPDATE 鏃讹細鏍规嵁琛ㄧ粨鏋勫瓧娈电被鍨嬭嚜鍔ㄨ浆鎹?condition 涓殑鏁版嵁鏍煎紡
|
|
29
|
-
* 闃叉鏁版嵁搴撻殣寮忕被鍨嬭浆鎹㈠鑷寸储寮曞け鏁堬紙MySQL / PostgreSQL / SQL Server 涓夊簱閫氱敤锛?
|
|
30
|
-
*
|
|
31
|
-
* 瀹炵幇姝ラ锛?
|
|
32
|
-
* 1. 鍒ゆ柇鎿嶄綔绫诲瀷鏄惁涓烘煡璇?鍒犻櫎/鏇存柊锛堣繖浜涙搷浣滃寘鍚?WHERE 鏉′欢锛?
|
|
33
|
-
* 2. 鑾峰彇琛ㄥ厓鏁版嵁锛屾瀯寤哄瓧娈靛悕鈫掔被鍨嬫槧灏?
|
|
34
|
-
* 3. 閫掑綊閬嶅巻 condition锛堟敮鎸?$or/$and 宓屽锛夛紝鎸夊瓧娈电被鍨嬭浆鎹㈠€?
|
|
35
|
-
*
|
|
36
|
-
* 杞崲瑙勫垯锛堝弻鍚戜繚鎶わ紝浠呭鐞嗘渶甯稿缓绱㈠紩鐨勫垪绫诲瀷锛夛細
|
|
37
|
-
* - 鏁存暟鍒?int/bigint/smallint/tinyint/mediumint) + 瀛楃涓插€?鈫?number
|
|
38
|
-
* - 鏁存暟鍒?+ 甯冨皵鍊?鈫?0/1
|
|
39
|
-
* - 瀛楃涓插垪(varchar/char/text绛? + 鏁板瓧鍊?鈫?string
|
|
40
|
-
* - 瀛楃涓插垪 + 甯冨皵鍊?鈫?string
|
|
41
|
-
*
|
|
42
|
-
* @param reqModel 璇锋眰妯″瀷
|
|
43
|
-
* @param cfgModel 閰嶇疆妯″瀷
|
|
44
|
-
*/
|
|
45
10
|
convertConditionTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void>;
|
|
46
11
|
}
|
|
47
12
|
export { CrudProDataTypeConvertService };
|
|
@@ -3,14 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CrudProDataTypeConvertService = void 0;
|
|
4
4
|
const CrudProServiceBase_1 = require("./CrudProServiceBase");
|
|
5
5
|
const keys_1 = require("../models/keys");
|
|
6
|
-
// ============
|
|
7
|
-
/**
|
|
6
|
+
// ============ 常量定义 ============
|
|
7
|
+
/** 整数类型正则(MySQL/PostgreSQL/SQL Server) */
|
|
8
8
|
const REGEX_INTEGER_TYPE = /^(int|int2|int4|int8|bigint|smallint|smallserial|tinyint|mediumint|integer|serial|bigserial)/;
|
|
9
|
-
/**
|
|
9
|
+
/** BIGINT 类型正则 */
|
|
10
10
|
const REGEX_BIGINT_TYPE = /^(bigint|int8|bigserial)/;
|
|
11
|
-
/**
|
|
11
|
+
/** 字符串类型正则(MySQL/PostgreSQL/SQL Server) */
|
|
12
12
|
const REGEX_STRING_TYPE = /^(varchar|char|text|longtext|mediumtext|tinytext|nvarchar|nchar|ntext|character varying|character)/;
|
|
13
|
-
/**
|
|
13
|
+
/** PG / MySQL 原生 boolean 列名 */
|
|
14
|
+
const REGEX_NATIVE_BOOLEAN_TYPE = /^(boolean|bool)$/;
|
|
15
|
+
/** 含 WHERE 条件的操作类型(查询/删除/更新) */
|
|
14
16
|
const CONDITION_TYPES = new Set([
|
|
15
17
|
keys_1.KeysOfSimpleSQL.SIMPLE_QUERY,
|
|
16
18
|
keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_ONE,
|
|
@@ -20,7 +22,7 @@ const CONDITION_TYPES = new Set([
|
|
|
20
22
|
keys_1.KeysOfSimpleSQL.SIMPLE_DELETE,
|
|
21
23
|
keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
|
|
22
24
|
]);
|
|
23
|
-
/** INSERT/UPDATE
|
|
25
|
+
/** INSERT/UPDATE 操作类型 */
|
|
24
26
|
const INSERT_OR_UPDATE_TYPES = new Set([
|
|
25
27
|
keys_1.KeysOfSimpleSQL.SIMPLE_INSERT,
|
|
26
28
|
keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
|
|
@@ -28,34 +30,50 @@ const INSERT_OR_UPDATE_TYPES = new Set([
|
|
|
28
30
|
keys_1.KeysOfSimpleSQL.SIMPLE_INSERT_OR_UPDATE,
|
|
29
31
|
keys_1.KeysOfSimpleSQL.SIMPLE_BATCH_INSERT,
|
|
30
32
|
]);
|
|
31
|
-
// ============
|
|
32
|
-
/** 鍒ゆ柇瀛楁绫诲瀷鏄惁涓烘暣鏁扮被鍨嬶紙瑕嗙洊 MySQL/PostgreSQL/SQL Server锛?*/
|
|
33
|
+
// ============ 工具函数 ============
|
|
33
34
|
function isIntegerType(type) {
|
|
34
35
|
return REGEX_INTEGER_TYPE.test(type);
|
|
35
36
|
}
|
|
36
|
-
/**
|
|
37
|
+
/** BIGINT 列不转 number,避免 JS 精度丢失 */
|
|
37
38
|
function isBigintType(type) {
|
|
38
39
|
return REGEX_BIGINT_TYPE.test(type);
|
|
39
40
|
}
|
|
40
|
-
/** 鍒ゆ柇瀛楁绫诲瀷鏄惁涓哄瓧绗︿覆绫诲瀷锛堣鐩?MySQL/PostgreSQL/SQL Server锛?*/
|
|
41
41
|
function isStringType(type) {
|
|
42
42
|
return REGEX_STRING_TYPE.test(type);
|
|
43
43
|
}
|
|
44
|
-
/**
|
|
44
|
+
/** 驱动原生支持 JS boolean 绑定的列:PG boolean;SQL Server bit(MySQL tinyint(1) 仍转 0/1) */
|
|
45
|
+
function shouldKeepBooleanValue(type, sqlDbType) {
|
|
46
|
+
const t = type.toLowerCase().trim();
|
|
47
|
+
if (sqlDbType === keys_1.SqlDbType.postgres && REGEX_NATIVE_BOOLEAN_TYPE.test(t)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (sqlDbType === keys_1.SqlDbType.sqlserver && t === 'bit') {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
/** MySQL 布尔列(boolean/bool/tinyint(1)),底层存 0/1,需转 number */
|
|
56
|
+
function isMysqlBooleanColumn(type) {
|
|
57
|
+
const t = type.toLowerCase().trim();
|
|
58
|
+
return REGEX_NATIVE_BOOLEAN_TYPE.test(t) || /^tinyint\s*\(\s*1\s*\)/.test(t);
|
|
59
|
+
}
|
|
60
|
+
/** 需转为 number 的整型列(含 MySQL boolean/bool/tinyint(1));排除 BIGINT,避免 JS 精度丢失 */
|
|
61
|
+
function isIntegerLikeColumn(type, sqlDbType) {
|
|
62
|
+
if (isIntegerType(type) && !isBigintType(type)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
return sqlDbType === keys_1.SqlDbType.mysql && isMysqlBooleanColumn(type);
|
|
66
|
+
}
|
|
45
67
|
function isConditionType(sqlSimpleName) {
|
|
46
68
|
return !!sqlSimpleName && CONDITION_TYPES.has(sqlSimpleName);
|
|
47
69
|
}
|
|
48
|
-
/** 鍒ゆ柇鍊兼槸鍚︿负鍩烘湰绫诲瀷锛坰tring | number | boolean锛?*/
|
|
49
70
|
function isBasicType(value) {
|
|
50
71
|
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
51
72
|
}
|
|
52
|
-
/** 鍒ゆ柇 sqlSimpleName 鏄惁涓?INSERT/UPDATE 绫诲瀷 */
|
|
53
73
|
function isInsertOrUpdateType(sqlSimpleName) {
|
|
54
74
|
return !!sqlSimpleName && INSERT_OR_UPDATE_TYPES.has(sqlSimpleName);
|
|
55
75
|
}
|
|
56
|
-
/**
|
|
57
|
-
* 鑾峰彇琛ㄥ厓鏁版嵁锛岃幏鍙栧け璐ユ椂杈撳嚭 warn 鏃ュ織骞惰繑鍥?null
|
|
58
|
-
*/
|
|
76
|
+
/** 获取表元数据,失败时 warn 并返回 null */
|
|
59
77
|
async function getTableMetaOrWarn(serviceHub, logger, cfgModel, actionName) {
|
|
60
78
|
const query = {
|
|
61
79
|
sqlTable: cfgModel.sqlTable,
|
|
@@ -65,33 +83,66 @@ async function getTableMetaOrWarn(serviceHub, logger, cfgModel, actionName) {
|
|
|
65
83
|
};
|
|
66
84
|
const tableMeta = await serviceHub.getTableMeta(query);
|
|
67
85
|
if (!tableMeta || !tableMeta.columnDetails || tableMeta.columnDetails.length === 0) {
|
|
68
|
-
logger.warn('CrudProDataTypeConvertService:
|
|
86
|
+
logger.warn('CrudProDataTypeConvertService: 无法获取表结构信息,跳过' + actionName, cfgModel.sqlTable);
|
|
69
87
|
return null;
|
|
70
88
|
}
|
|
71
89
|
return tableMeta;
|
|
72
90
|
}
|
|
73
|
-
|
|
91
|
+
function buildColumnTypeMap(tableMeta) {
|
|
92
|
+
const typeMap = new Map();
|
|
93
|
+
for (const col of tableMeta.columnDetails) {
|
|
94
|
+
typeMap.set(col.name, ('' + col.type).toLowerCase());
|
|
95
|
+
}
|
|
96
|
+
return typeMap;
|
|
97
|
+
}
|
|
74
98
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
99
|
+
* 按字段类型转换单个值:
|
|
100
|
+
* PG boolean / SS bit 保持 boolean;整数列(含 MySQL tinyint(1))boolean→0/1;字符串列 number/boolean→string
|
|
77
101
|
*/
|
|
102
|
+
function convertBasicValueByFieldType(value, fieldType, sqlDbType) {
|
|
103
|
+
if (value === null || value === undefined) {
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
const valueType = typeof value;
|
|
107
|
+
// PG boolean / SS bit:驱动原生支持 boolean 绑定
|
|
108
|
+
if (valueType === 'boolean' && shouldKeepBooleanValue(fieldType, sqlDbType)) {
|
|
109
|
+
return value;
|
|
110
|
+
}
|
|
111
|
+
// 非 BIGINT 整型列(含 MySQL boolean/bool/tinyint(1)):string→number;boolean→0/1
|
|
112
|
+
// BIGINT 不在此转换,由驱动参数化在 DB 端匹配,避免雪花 ID 等精度丢失
|
|
113
|
+
if (isIntegerLikeColumn(fieldType, sqlDbType)) {
|
|
114
|
+
if (valueType === 'string') {
|
|
115
|
+
const num = Number(value);
|
|
116
|
+
if (!isNaN(num) && Number.isInteger(num)) {
|
|
117
|
+
// 超 MAX_SAFE_INTEGER 保持 string,避免精度丢失
|
|
118
|
+
if (num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER) {
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
return num;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (valueType === 'boolean') {
|
|
125
|
+
return value ? 1 : 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (isStringType(fieldType)) {
|
|
129
|
+
if (valueType === 'number') {
|
|
130
|
+
return '' + value;
|
|
131
|
+
}
|
|
132
|
+
if (valueType === 'boolean') {
|
|
133
|
+
return value ? 'true' : 'false';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
// ============ Data 转换 ============
|
|
139
|
+
/** INSERT/UPDATE 数据转换:类型强转、PG ARRAY 字面量、对象/数组 JSON 序列化 */
|
|
78
140
|
class DataConvertHandler {
|
|
79
141
|
constructor(serviceHub, logger) {
|
|
80
142
|
this.serviceHub = serviceHub;
|
|
81
143
|
this.logger = logger;
|
|
82
144
|
}
|
|
83
|
-
/**
|
|
84
|
-
* INSERT/UPDATE 鏃讹細鏍规嵁琛ㄧ粨鏋勫瓧娈电被鍨嬭嚜鍔ㄨ浆鎹?reqModel.data 涓殑鏁版嵁鏍煎紡
|
|
85
|
-
*
|
|
86
|
-
* 瀹炵幇姝ラ锛?
|
|
87
|
-
* 1. 鍒ゆ柇鎿嶄綔绫诲瀷鏄惁涓?INSERT/UPDATE锛屽惁鍒欒烦杩?
|
|
88
|
-
* 2. PostgreSQL锛氳幏鍙栬〃鍏冩暟鎹紝璇嗗埆 ARRAY 绫诲瀷瀛楁锛屽皢 JS 鏁扮粍杞负 PG 鏁扮粍瀛楅潰閲?
|
|
89
|
-
* 3. 涓夊簱閫氱敤锛氶亶鍘?data 涓墍鏈夊€硷紝灏嗗璞?鏁扮粍鑷姩 JSON.stringify()
|
|
90
|
-
* 涓嶄緷璧栧垪绫诲瀷鍒ゆ柇锛屽洜涓?longtext/varchar 绛夐潪 JSON 鍒椾篃鍙兘瀛?JSON 瀵硅薄
|
|
91
|
-
*
|
|
92
|
-
* @param reqModel 璇锋眰妯″瀷
|
|
93
|
-
* @param cfgModel 閰嶇疆妯″瀷
|
|
94
|
-
*/
|
|
145
|
+
/** 按表字段类型转换 reqModel.data */
|
|
95
146
|
async convertDataTypeByTableMeta(reqModel, cfgModel) {
|
|
96
147
|
if (!isInsertOrUpdateType(cfgModel.sqlSimpleName)) {
|
|
97
148
|
return;
|
|
@@ -101,10 +152,19 @@ class DataConvertHandler {
|
|
|
101
152
|
}
|
|
102
153
|
const data = reqModel.data;
|
|
103
154
|
const isBatch = Array.isArray(data);
|
|
104
|
-
|
|
105
|
-
if (
|
|
106
|
-
const
|
|
107
|
-
|
|
155
|
+
const tableMeta = await getTableMetaOrWarn(this.serviceHub, this.logger, cfgModel, 'data类型转换');
|
|
156
|
+
if (tableMeta) {
|
|
157
|
+
const typeMap = buildColumnTypeMap(tableMeta);
|
|
158
|
+
// 按列类型强转基础值(boolean 等适配实际 DB 字段)
|
|
159
|
+
if (isBatch) {
|
|
160
|
+
for (const row of data)
|
|
161
|
+
this.convertDataFieldsByType(row, typeMap, cfgModel.sqlDbType);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.convertDataFieldsByType(data, typeMap, cfgModel.sqlDbType);
|
|
165
|
+
}
|
|
166
|
+
// PostgreSQL:ARRAY 列 JS 数组 → PG 数组字面量
|
|
167
|
+
if (cfgModel.sqlDbType === keys_1.SqlDbType.postgres) {
|
|
108
168
|
const arrayFieldSet = new Set();
|
|
109
169
|
for (const col of tableMeta.columnDetails) {
|
|
110
170
|
if (('' + col.type).toLowerCase() === 'array') {
|
|
@@ -122,9 +182,7 @@ class DataConvertHandler {
|
|
|
122
182
|
}
|
|
123
183
|
}
|
|
124
184
|
}
|
|
125
|
-
//
|
|
126
|
-
// 涓嶄緷璧栧垪绫诲瀷鍒ゆ柇锛歭ongtext/varchar 瀛?JSON銆丮ySQL json銆丳G jsonb 绛夊満鏅粺涓€瑕嗙洊
|
|
127
|
-
// PG ARRAY 鍒楃殑鍊煎凡鍦ㄤ笂闈㈡楠よ浆涓哄瓧绗︿覆锛屾澶勪笉浼氳搴忓垪鍖?
|
|
185
|
+
// 三库通用:对象/数组 → JSON.stringify(不依赖列类型)
|
|
128
186
|
if (isBatch) {
|
|
129
187
|
for (const row of data)
|
|
130
188
|
this.serializeObjectValues(row);
|
|
@@ -133,13 +191,27 @@ class DataConvertHandler {
|
|
|
133
191
|
this.serializeObjectValues(data);
|
|
134
192
|
}
|
|
135
193
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
194
|
+
/** 按表字段类型转换 data 中的基础类型值 */
|
|
195
|
+
convertDataFieldsByType(dataObj, typeMap, sqlDbType) {
|
|
196
|
+
for (const key of Object.keys(dataObj)) {
|
|
197
|
+
const value = dataObj[key];
|
|
198
|
+
if (value === null || value === undefined) {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
// $sqlFunc 表达式由 SqlFuncUtils 在 SQL 生成阶段处理
|
|
202
|
+
if (typeof value === 'object' && typeof value['$sqlFunc'] === 'string') {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const fieldType = typeMap.get(key);
|
|
206
|
+
if (!fieldType) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (isBasicType(value)) {
|
|
210
|
+
dataObj[key] = convertBasicValueByFieldType(value, fieldType, sqlDbType);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** JS 数组 → PG 数组字面量,如 [1,2,3] → '{1,2,3}' */
|
|
143
215
|
convertPgArrayFields(dataObj, arrayFieldSet) {
|
|
144
216
|
const keys = Object.keys(dataObj);
|
|
145
217
|
for (const key of keys) {
|
|
@@ -153,10 +225,7 @@ class DataConvertHandler {
|
|
|
153
225
|
}
|
|
154
226
|
}
|
|
155
227
|
}
|
|
156
|
-
/**
|
|
157
|
-
* 灏濊瘯灏嗗€艰В鏋愪负鏁扮粍
|
|
158
|
-
* 鏀寔锛氭暟缁勫璞°€丣SON 鏁扮粍瀛楃涓诧紙濡?'["a","b"]'锛?
|
|
159
|
-
*/
|
|
228
|
+
/** 解析为数组,支持数组对象和 JSON 数组字符串 */
|
|
160
229
|
tryParseArray(value) {
|
|
161
230
|
if (value === null || value === undefined) {
|
|
162
231
|
return null;
|
|
@@ -177,16 +246,7 @@ class DataConvertHandler {
|
|
|
177
246
|
}
|
|
178
247
|
return null;
|
|
179
248
|
}
|
|
180
|
-
/**
|
|
181
|
-
* 灏?JS 鏁扮粍杞负 PostgreSQL 鏁扮粍瀛楅潰閲忔牸寮?
|
|
182
|
-
*
|
|
183
|
-
* PG 鏁扮粍瀛楅潰閲忚鍒欙細
|
|
184
|
-
* - 瀛楃涓诧細鍙屽紩鍙峰寘瑁癸紝鍐呴儴 " 杞箟涓?\"锛孿 杞箟涓?\\ 渚嬶細{"hello","world"}
|
|
185
|
-
* - 鏁板瓧锛氫笉鍔犲紩鍙? 渚嬶細{1,2,3}
|
|
186
|
-
* - 甯冨皵锛氳浆涓?t/f 涓嶅姞寮曞彿 渚嬶細{t,f}
|
|
187
|
-
* - null/undefined锛氳緭鍑?NULL 涓嶅姞寮曞彿 渚嬶細{1,NULL,3}
|
|
188
|
-
* - 绌烘暟缁勶細杈撳嚭 {}
|
|
189
|
-
*/
|
|
249
|
+
/** JS 数组 → PG 数组字面量格式 */
|
|
190
250
|
toPgArrayLiteral(arr) {
|
|
191
251
|
if (arr.length === 0) {
|
|
192
252
|
return '{}';
|
|
@@ -194,7 +254,7 @@ class DataConvertHandler {
|
|
|
194
254
|
const items = arr.map(v => this.toPgArrayItem(v));
|
|
195
255
|
return '{' + items.join(',') + '}';
|
|
196
256
|
}
|
|
197
|
-
/**
|
|
257
|
+
/** 单个值 → PG 数组元素字面量 */
|
|
198
258
|
toPgArrayItem(value) {
|
|
199
259
|
if (value === null || value === undefined) {
|
|
200
260
|
return 'NULL';
|
|
@@ -205,27 +265,12 @@ class DataConvertHandler {
|
|
|
205
265
|
if (typeof value === 'boolean') {
|
|
206
266
|
return value ? 't' : 'f';
|
|
207
267
|
}
|
|
208
|
-
// 瀛楃涓插強鍏跺畠绫诲瀷锛氳浆涔夊悗鐢ㄥ弻寮曞彿鍖呰9
|
|
209
268
|
const escaped = ('' + value)
|
|
210
269
|
.replace(/\\/g, '\\\\')
|
|
211
270
|
.replace(/"/g, '\\"');
|
|
212
271
|
return '"' + escaped + '"';
|
|
213
272
|
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* 閬嶅巻鏁版嵁瀵硅薄涓殑鎵€鏈夊€硷紝灏嗗璞?鏁扮粍鑷姩搴忓垪鍖栦负 JSON 瀛楃涓?
|
|
217
|
-
*
|
|
218
|
-
* 涓嶄緷璧栧垪绫诲瀷鍒ゆ柇锛屽師鍥狅細
|
|
219
|
-
* - longtext/varchar 鍒椾篃鍙兘瀛?JSON 瀵硅薄锛屾寜鍒楃被鍨嬭繃婊や細婕忔帀
|
|
220
|
-
* - 鍙鍊兼槸瀵硅薄鎴栨暟缁勶紝椹卞姩閮芥棤娉曠洿鎺ュ鐞嗭紙.toString() 杈撳嚭 [object Object]锛夛紝
|
|
221
|
-
* 鍞竴鍚堢悊鐨勬搷浣滃氨鏄?JSON.stringify()
|
|
222
|
-
*
|
|
223
|
-
* 杞崲瑙勫垯锛?
|
|
224
|
-
* - 瀵硅薄锛坱ypeof === 'object' 涓旈潪 null銆侀潪 Date銆侀潪 Buffer锛夆啋 JSON.stringify()
|
|
225
|
-
* - 鏁扮粍锛圥G ARRAY 鍒楃殑鍊煎凡鍦ㄥ墠闈㈡楠よ浆涓哄瓧绗︿覆锛屾澶勯亣鍒扮殑閮芥槸闇€瑕佸簭鍒楀寲鐨勬櫘閫氭暟缁勶級鈫?JSON.stringify()
|
|
226
|
-
* - 宸茬粡鏄瓧绗︿覆鐨勫€间笉閲嶅搴忓垪鍖栵紙璋冪敤鏂瑰彲鑳藉凡鎵嬪姩 JSON.stringify()锛?
|
|
227
|
-
* - null / undefined / Date / Buffer 涓嶅鐞?
|
|
228
|
-
*/
|
|
273
|
+
/** 对象/数组 → JSON 字符串,跳过 $sqlFunc、Date、Buffer */
|
|
229
274
|
serializeObjectValues(dataObj) {
|
|
230
275
|
const keys = Object.keys(dataObj);
|
|
231
276
|
for (const key of keys) {
|
|
@@ -233,55 +278,31 @@ class DataConvertHandler {
|
|
|
233
278
|
if (value === null || value === undefined) {
|
|
234
279
|
continue;
|
|
235
280
|
}
|
|
236
|
-
// 宸茬粡鏄瓧绗︿覆锛岃鏄庤皟鐢ㄦ柟宸叉墜鍔?JSON.stringify()锛屼笉閲嶅搴忓垪鍖?
|
|
237
281
|
if (typeof value === 'string') {
|
|
238
282
|
continue;
|
|
239
283
|
}
|
|
240
|
-
//
|
|
241
|
-
// 杩欑被瀵硅薄灏嗗湪 SQL 鐢熸垚闃舵鐢?SqlFuncUtils 瑙f瀽涓?SQL 鐗囨
|
|
284
|
+
// $sqlFunc 表达式由 SqlFuncUtils 在 SQL 生成阶段处理
|
|
242
285
|
if (typeof value === 'object' && typeof value['$sqlFunc'] === 'string') {
|
|
243
286
|
continue;
|
|
244
287
|
}
|
|
245
|
-
// 鏁扮粍锛歅G ARRAY 鍒楀凡鍦ㄥ墠搴忔楠よ浆涓?PG 鏁扮粍瀛楅潰閲忓瓧绗︿覆锛屾澶勯亣鍒扮殑鍧囦负闇€搴忓垪鍖栫殑鏅€氭暟缁?
|
|
246
288
|
if (Array.isArray(value)) {
|
|
247
289
|
dataObj[key] = JSON.stringify(value);
|
|
248
290
|
continue;
|
|
249
291
|
}
|
|
250
|
-
// 绾璞★紙闈?Date銆侀潪 Buffer锛夆啋 搴忓垪鍖?
|
|
251
292
|
if (typeof value === 'object' && !(value instanceof Date) && !Buffer.isBuffer(value)) {
|
|
252
293
|
dataObj[key] = JSON.stringify(value);
|
|
253
294
|
}
|
|
254
295
|
}
|
|
255
296
|
}
|
|
256
297
|
}
|
|
257
|
-
// ============ Condition
|
|
258
|
-
/**
|
|
259
|
-
* SELECT/DELETE/UPDATE 鏉′欢杞崲澶勭悊鍣?
|
|
260
|
-
* 璐熻矗 condition 鐨勭被鍨嬪己杞紝闃叉闅愬紡绫诲瀷杞崲瀵艰嚧绱㈠紩澶辨晥
|
|
261
|
-
*/
|
|
298
|
+
// ============ Condition 转换 ============
|
|
299
|
+
/** 查询/删除/更新条件类型强转,防止隐式转换导致索引失效 */
|
|
262
300
|
class ConditionConvertHandler {
|
|
263
301
|
constructor(serviceHub, logger) {
|
|
264
302
|
this.serviceHub = serviceHub;
|
|
265
303
|
this.logger = logger;
|
|
266
304
|
}
|
|
267
|
-
/**
|
|
268
|
-
* SELECT/DELETE/UPDATE 鏃讹細鏍规嵁琛ㄧ粨鏋勫瓧娈电被鍨嬭嚜鍔ㄨ浆鎹?condition 涓殑鏁版嵁鏍煎紡
|
|
269
|
-
* 闃叉鏁版嵁搴撻殣寮忕被鍨嬭浆鎹㈠鑷寸储寮曞け鏁堬紙MySQL / PostgreSQL / SQL Server 涓夊簱閫氱敤锛?
|
|
270
|
-
*
|
|
271
|
-
* 瀹炵幇姝ラ锛?
|
|
272
|
-
* 1. 鍒ゆ柇鎿嶄綔绫诲瀷鏄惁涓烘煡璇?鍒犻櫎/鏇存柊锛堣繖浜涙搷浣滃寘鍚?WHERE 鏉′欢锛?
|
|
273
|
-
* 2. 鑾峰彇琛ㄥ厓鏁版嵁锛屾瀯寤哄瓧娈靛悕鈫掔被鍨嬫槧灏?
|
|
274
|
-
* 3. 閫掑綊閬嶅巻 condition锛堟敮鎸?$or/$and 宓屽锛夛紝鎸夊瓧娈电被鍨嬭浆鎹㈠€?
|
|
275
|
-
*
|
|
276
|
-
* 杞崲瑙勫垯锛堝弻鍚戜繚鎶わ紝浠呭鐞嗘渶甯稿缓绱㈠紩鐨勫垪绫诲瀷锛夛細
|
|
277
|
-
* - 鏁存暟鍒?int/bigint/smallint/tinyint/mediumint) + 瀛楃涓插€?鈫?number
|
|
278
|
-
* - 鏁存暟鍒?+ 甯冨皵鍊?鈫?0/1
|
|
279
|
-
* - 瀛楃涓插垪(varchar/char/text绛? + 鏁板瓧鍊?鈫?string
|
|
280
|
-
* - 瀛楃涓插垪 + 甯冨皵鍊?鈫?string
|
|
281
|
-
*
|
|
282
|
-
* @param reqModel 璇锋眰妯″瀷
|
|
283
|
-
* @param cfgModel 閰嶇疆妯″瀷
|
|
284
|
-
*/
|
|
305
|
+
/** 按表字段类型转换 reqModel.condition */
|
|
285
306
|
async convertConditionTypeByTableMeta(reqModel, cfgModel) {
|
|
286
307
|
if (!isConditionType(cfgModel.sqlSimpleName)) {
|
|
287
308
|
return;
|
|
@@ -289,33 +310,20 @@ class ConditionConvertHandler {
|
|
|
289
310
|
if (!reqModel.condition || Object.keys(reqModel.condition).length === 0) {
|
|
290
311
|
return;
|
|
291
312
|
}
|
|
292
|
-
const tableMeta = await getTableMetaOrWarn(this.serviceHub, this.logger, cfgModel, '
|
|
313
|
+
const tableMeta = await getTableMetaOrWarn(this.serviceHub, this.logger, cfgModel, '条件类型转换');
|
|
293
314
|
if (!tableMeta) {
|
|
294
315
|
return;
|
|
295
316
|
}
|
|
296
|
-
|
|
297
|
-
const typeMap = new Map();
|
|
298
|
-
for (const col of tableMeta.columnDetails) {
|
|
299
|
-
typeMap.set(col.name, ('' + col.type).toLowerCase());
|
|
300
|
-
}
|
|
317
|
+
const typeMap = buildColumnTypeMap(tableMeta);
|
|
301
318
|
this.convertConditionFields(reqModel.condition, typeMap, cfgModel.sqlDbType);
|
|
302
319
|
}
|
|
303
|
-
/**
|
|
304
|
-
* 閫掑綊閬嶅巻 condition锛屽姣忎釜瀛楁鍊煎仛绫诲瀷杞崲
|
|
305
|
-
*
|
|
306
|
-
* 瀹炵幇姝ラ锛?
|
|
307
|
-
* 1. 閬嶅巻 condition 鐨勬瘡涓?key
|
|
308
|
-
* 2. 鑻?key 涓?$or/$and 閫昏緫鎿嶄綔绗︼紝閫掑綊澶勭悊瀛愭潯浠舵暟缁?
|
|
309
|
-
* 3. 鑻?key 涓哄瓧娈靛悕涓斿€间负鍩烘湰绫诲瀷锛岀洿鎺ヨ浆鎹?
|
|
310
|
-
* 4. 鑻?key 涓哄瓧娈靛悕涓斿€间负姣旇緝鎿嶄綔绗﹀璞?$gt/$in绛?锛岄亶鍘嗘搷浣滅閫愬€艰浆鎹?
|
|
311
|
-
*/
|
|
320
|
+
/** 递归遍历 condition,支持 $or/$and 嵌套 */
|
|
312
321
|
convertConditionFields(condition, typeMap, sqlDbType) {
|
|
313
322
|
if (!condition || typeof condition !== 'object') {
|
|
314
323
|
return;
|
|
315
324
|
}
|
|
316
325
|
for (const key of Object.keys(condition)) {
|
|
317
326
|
const value = condition[key];
|
|
318
|
-
// $or / $and 閫昏緫鎿嶄綔绗︼細閫掑綊澶勭悊姣忎釜瀛愭潯浠?
|
|
319
327
|
if (key === keys_1.KeysOfConditions.$OR || key === keys_1.KeysOfConditions.$AND) {
|
|
320
328
|
if (Array.isArray(value)) {
|
|
321
329
|
for (const subCondition of value) {
|
|
@@ -324,132 +332,48 @@ class ConditionConvertHandler {
|
|
|
324
332
|
}
|
|
325
333
|
continue;
|
|
326
334
|
}
|
|
327
|
-
// 濡傛灉 key 鏄瘮杈冩搷浣滅锛堝嚭鐜板湪鍐呭眰锛夛紝璺宠繃
|
|
328
335
|
if (keys_1.KeysOfConditions.COMPARE_KEYS.has(key)) {
|
|
329
336
|
continue;
|
|
330
337
|
}
|
|
331
|
-
// key 鏄瓧娈靛悕
|
|
332
338
|
const fieldType = typeMap.get(key);
|
|
333
339
|
if (!fieldType) {
|
|
334
|
-
continue;
|
|
340
|
+
continue;
|
|
335
341
|
}
|
|
336
342
|
if (isBasicType(value)) {
|
|
337
|
-
|
|
338
|
-
condition[key] = this.convertValueByType(value, fieldType, sqlDbType);
|
|
343
|
+
condition[key] = convertBasicValueByFieldType(value, fieldType, sqlDbType);
|
|
339
344
|
}
|
|
340
345
|
else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
341
|
-
// 姣旇緝鎿嶄綔绗︽潯浠讹細{ age: { "$gt": "18", "$lt": "30" } }
|
|
342
346
|
for (const opKey of Object.keys(value)) {
|
|
343
347
|
if (keys_1.KeysOfConditions.COMPARE_KEYS.has(opKey)) {
|
|
344
348
|
const opValue = value[opKey];
|
|
345
349
|
if (opKey === keys_1.KeysOfConditions.$IN || opKey === keys_1.KeysOfConditions.$NIN) {
|
|
346
|
-
// $in/$nin 鐨勫€兼槸鏁扮粍锛岄€愪釜杞崲
|
|
347
350
|
if (Array.isArray(opValue)) {
|
|
348
|
-
value[opKey] = opValue.map(v =>
|
|
351
|
+
value[opKey] = opValue.map(v => convertBasicValueByFieldType(v, fieldType, sqlDbType));
|
|
349
352
|
}
|
|
350
353
|
}
|
|
351
354
|
else if (opKey === keys_1.KeysOfConditions.$RANGE) {
|
|
352
|
-
// $range 鐨勫€兼槸 [min, max]
|
|
353
355
|
if (Array.isArray(opValue)) {
|
|
354
|
-
value[opKey] = opValue.map(v =>
|
|
356
|
+
value[opKey] = opValue.map(v => convertBasicValueByFieldType(v, fieldType, sqlDbType));
|
|
355
357
|
}
|
|
356
358
|
}
|
|
357
359
|
else {
|
|
358
|
-
value[opKey] =
|
|
360
|
+
value[opKey] = convertBasicValueByFieldType(opValue, fieldType, sqlDbType);
|
|
359
361
|
}
|
|
360
362
|
}
|
|
361
363
|
}
|
|
362
364
|
}
|
|
363
365
|
}
|
|
364
366
|
}
|
|
365
|
-
/**
|
|
366
|
-
* 鏍规嵁瀛楁绫诲瀷杞崲鍗曚釜鍊硷紝闃叉闅愬紡绫诲瀷杞崲瀵艰嚧绱㈠紩澶辨晥
|
|
367
|
-
*
|
|
368
|
-
* 杞崲瑙勫垯锛堝弻鍚戜繚鎶わ級锛?
|
|
369
|
-
* - 鏁存暟鍒?+ 瀛楃涓插€?鈫?number锛圵HERE int_col = '123' 绱㈠紩澶辨晥锛?
|
|
370
|
-
* - 鏁存暟鍒?+ 甯冨皵鍊?鈫?0/1
|
|
371
|
-
* - 瀛楃涓插垪 + 鏁板瓧鍊?鈫?string锛圵HERE varchar_col = 123 绱㈠紩澶辨晥锛?
|
|
372
|
-
* - 瀛楃涓插垪 + 甯冨皵鍊?鈫?string
|
|
373
|
-
*/
|
|
374
|
-
convertValueByType(value, fieldType, sqlDbType) {
|
|
375
|
-
if (value === null || value === undefined) {
|
|
376
|
-
return value;
|
|
377
|
-
}
|
|
378
|
-
const valueType = typeof value;
|
|
379
|
-
// 鏁存暟鍒楋細string 鈫?number, boolean 鈫?0/1
|
|
380
|
-
// BIGINT 绫诲瀷涓嶈浆鎹紙isBigintType 鎺掗櫎锛夛紝鐢遍┍鍔ㄥ弬鏁板寲鏌ヨ鍦?DB 鏈嶅姟绔鐞嗙被鍨嬪尮閰嶏紝
|
|
381
|
-
// 閬垮厤 JS Number 绮惧害涓㈠け锛堥洩鑺盜D绾?2^41~2^63锛?
|
|
382
|
-
// 闈?BIGINT 鏁存暟鍒楃殑瀹夊叏缃戯細鑻ュ€兼剰澶栬秴杩?MAX_SAFE_INTEGER锛屼篃淇濇寔 string
|
|
383
|
-
if (isIntegerType(fieldType) && !isBigintType(fieldType)) {
|
|
384
|
-
if (valueType === 'string') {
|
|
385
|
-
const num = Number(value);
|
|
386
|
-
if (!isNaN(num) && Number.isInteger(num)) {
|
|
387
|
-
if (num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER) {
|
|
388
|
-
return value; // 瓒呭畨鍏ㄦ暣鏁拌寖鍥达紝淇濇寔 string 閬垮厤绮惧害涓㈠け
|
|
389
|
-
}
|
|
390
|
-
return num;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
if (valueType === 'boolean') {
|
|
394
|
-
return value ? 1 : 0;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
// 瀛楃涓插垪锛歯umber 鈫?string, boolean 鈫?string
|
|
398
|
-
if (isStringType(fieldType)) {
|
|
399
|
-
if (valueType === 'number') {
|
|
400
|
-
return '' + value;
|
|
401
|
-
}
|
|
402
|
-
if (valueType === 'boolean') {
|
|
403
|
-
return value ? 'true' : 'false';
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
return value;
|
|
407
|
-
}
|
|
408
367
|
}
|
|
409
|
-
// ============
|
|
368
|
+
// ============ 入口 ============
|
|
410
369
|
/**
|
|
411
|
-
*
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
* 鎸夋暟鎹簱鍒嗙被锛?
|
|
415
|
-
* - PostgreSQL 涓撴湁锛欰RRAY 鍒?鈫?PG 鏁扮粍瀛楅潰閲?
|
|
416
|
-
* - 涓夊簱閫氱敤锛堝€肩被鍨嬮┍鍔級锛氬璞?鏁扮粍 鈫?JSON.stringify()锛岃鐩?json/jsonb/longtext瀛楯SON 绛夋墍鏈夊満鏅?
|
|
417
|
-
* - 涓夊簱閫氱敤锛氭煡璇㈡潯浠剁被鍨嬪己杞紝闃叉绱㈠紩澶辨晥
|
|
370
|
+
* 数据类型转换服务
|
|
371
|
+
* data/condition 类型强转、PG ARRAY 字面量、对象/数组 JSON 序列化
|
|
418
372
|
*/
|
|
419
373
|
class CrudProDataTypeConvertService extends CrudProServiceBase_1.CrudProServiceBase {
|
|
420
|
-
/**
|
|
421
|
-
* INSERT/UPDATE 鏃讹細鏍规嵁琛ㄧ粨鏋勫瓧娈电被鍨嬭嚜鍔ㄨ浆鎹?reqModel.data 涓殑鏁版嵁鏍煎紡
|
|
422
|
-
*
|
|
423
|
-
* 瀹炵幇姝ラ锛?
|
|
424
|
-
* 1. 鍒ゆ柇鎿嶄綔绫诲瀷鏄惁涓?INSERT/UPDATE锛屽惁鍒欒烦杩?
|
|
425
|
-
* 2. PostgreSQL锛氳幏鍙栬〃鍏冩暟鎹紝璇嗗埆 ARRAY 绫诲瀷瀛楁锛屽皢 JS 鏁扮粍杞负 PG 鏁扮粍瀛楅潰閲?
|
|
426
|
-
* 3. 涓夊簱閫氱敤锛氶亶鍘?data 涓墍鏈夊€硷紝灏嗗璞?鏁扮粍鑷姩 JSON.stringify()
|
|
427
|
-
* 涓嶄緷璧栧垪绫诲瀷鍒ゆ柇锛屽洜涓?longtext/varchar 绛夐潪 JSON 鍒椾篃鍙兘瀛?JSON 瀵硅薄
|
|
428
|
-
*
|
|
429
|
-
* @param reqModel 璇锋眰妯″瀷
|
|
430
|
-
* @param cfgModel 閰嶇疆妯″瀷
|
|
431
|
-
*/
|
|
432
374
|
async convertDataTypeByTableMeta(reqModel, cfgModel) {
|
|
433
375
|
return new DataConvertHandler(this.serviceHub, this.logger).convertDataTypeByTableMeta(reqModel, cfgModel);
|
|
434
376
|
}
|
|
435
|
-
/**
|
|
436
|
-
* SELECT/DELETE/UPDATE 鏃讹細鏍规嵁琛ㄧ粨鏋勫瓧娈电被鍨嬭嚜鍔ㄨ浆鎹?condition 涓殑鏁版嵁鏍煎紡
|
|
437
|
-
* 闃叉鏁版嵁搴撻殣寮忕被鍨嬭浆鎹㈠鑷寸储寮曞け鏁堬紙MySQL / PostgreSQL / SQL Server 涓夊簱閫氱敤锛?
|
|
438
|
-
*
|
|
439
|
-
* 瀹炵幇姝ラ锛?
|
|
440
|
-
* 1. 鍒ゆ柇鎿嶄綔绫诲瀷鏄惁涓烘煡璇?鍒犻櫎/鏇存柊锛堣繖浜涙搷浣滃寘鍚?WHERE 鏉′欢锛?
|
|
441
|
-
* 2. 鑾峰彇琛ㄥ厓鏁版嵁锛屾瀯寤哄瓧娈靛悕鈫掔被鍨嬫槧灏?
|
|
442
|
-
* 3. 閫掑綊閬嶅巻 condition锛堟敮鎸?$or/$and 宓屽锛夛紝鎸夊瓧娈电被鍨嬭浆鎹㈠€?
|
|
443
|
-
*
|
|
444
|
-
* 杞崲瑙勫垯锛堝弻鍚戜繚鎶わ紝浠呭鐞嗘渶甯稿缓绱㈠紩鐨勫垪绫诲瀷锛夛細
|
|
445
|
-
* - 鏁存暟鍒?int/bigint/smallint/tinyint/mediumint) + 瀛楃涓插€?鈫?number
|
|
446
|
-
* - 鏁存暟鍒?+ 甯冨皵鍊?鈫?0/1
|
|
447
|
-
* - 瀛楃涓插垪(varchar/char/text绛? + 鏁板瓧鍊?鈫?string
|
|
448
|
-
* - 瀛楃涓插垪 + 甯冨皵鍊?鈫?string
|
|
449
|
-
*
|
|
450
|
-
* @param reqModel 璇锋眰妯″瀷
|
|
451
|
-
* @param cfgModel 閰嶇疆妯″瀷
|
|
452
|
-
*/
|
|
453
377
|
async convertConditionTypeByTableMeta(reqModel, cfgModel) {
|
|
454
378
|
return new ConditionConvertHandler(this.serviceHub, this.logger).convertConditionTypeByTableMeta(reqModel, cfgModel);
|
|
455
379
|
}
|
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* 生成雪花ID(64位整数,JS 中以 string 返回)
|
|
3
|
-
* 结构:1位符号 + 41位时间戳(ms) + 10位机器ID + 12位序列号
|
|
4
|
-
* - 时间戳:相对于 2024-01-01 00:00:00 的毫秒偏移,可用约 69 年
|
|
5
|
-
* - 机器ID:0-1023,优先取参数 > 环境变量 SNOWFLAKE_MACHINE_ID > process.pid 低10位
|
|
6
|
-
* - 序列号:0-4095,同一毫秒内自增
|
|
7
|
-
*
|
|
8
|
-
* @param machineId 机器ID(0-1023),不传则依次从环境变量 SNOWFLAKE_MACHINE_ID、process.pid 获取
|
|
9
|
-
* @returns 雪花ID字符串
|
|
10
|
-
*/
|
|
11
|
-
declare function generateSnowflakeId(machineId?: number): string;
|
|
12
|
-
/**
|
|
13
|
-
* 生成 UUID v4 字符串(纯随机,无外部依赖)
|
|
14
|
-
* 格式:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,其中 y 为 8/9/a/b 之一
|
|
15
|
-
* @returns 符合 RFC 4122 v4 规范的 UUID 字符串
|
|
16
|
-
*/
|
|
17
|
-
declare function uuid(): string;
|
|
1
|
+
import { generateSnowflakeId, uuid, generateSnowflakeIdExt } from './idgene';
|
|
18
2
|
declare const MixinUtils: {
|
|
19
3
|
isNil(obj: any): boolean;
|
|
20
4
|
isNotNil(obj: any): boolean;
|
|
@@ -68,5 +52,6 @@ declare const MixinUtils: {
|
|
|
68
52
|
* @returns 雪花ID字符串
|
|
69
53
|
*/
|
|
70
54
|
generateSnowflakeId: typeof generateSnowflakeId;
|
|
55
|
+
generateSnowflakeIdExt: typeof generateSnowflakeIdExt;
|
|
71
56
|
};
|
|
72
57
|
export { MixinUtils };
|