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.
Files changed (47) hide show
  1. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +2 -37
  2. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +137 -213
  3. package/dist/libs/crud-pro/utils/MixinUtils.d.ts +2 -17
  4. package/dist/libs/crud-pro/utils/MixinUtils.js +4 -84
  5. package/dist/libs/crud-pro/utils/idgene/generateSnowflakeId.d.ts +12 -0
  6. package/dist/libs/crud-pro/utils/idgene/generateSnowflakeId.js +61 -0
  7. package/dist/libs/crud-pro/utils/idgene/generateSnowflakeIdExt.d.ts +19 -0
  8. package/dist/libs/crud-pro/utils/idgene/generateSnowflakeIdExt.js +89 -0
  9. package/dist/libs/crud-pro/utils/idgene/index.d.ts +3 -0
  10. package/dist/libs/crud-pro/utils/idgene/index.js +10 -0
  11. package/dist/libs/crud-pro/utils/idgene/uuid.d.ts +7 -0
  12. package/dist/libs/crud-pro/utils/idgene/uuid.js +28 -0
  13. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +0 -17
  14. package/dist/libs/crud-pro-quick/fixSoftDelete.js +55 -5
  15. package/dist/libs/crud-pro-quick/models.d.ts +11 -1
  16. package/dist/service/SysAppService.d.ts +0 -3
  17. package/dist/service/SysAppService.js +0 -15
  18. package/dist/service/SysConfigService.d.ts +0 -1
  19. package/dist/service/SysConfigService.js +0 -6
  20. package/dist/service/SysDictDataService.d.ts +0 -2
  21. package/dist/service/SysDictDataService.js +0 -12
  22. package/dist/service/SysMenuService.d.ts +0 -1
  23. package/dist/service/SysMenuService.js +0 -3
  24. package/dist/service/WorkbenchService.d.ts +0 -1
  25. package/dist/service/WorkbenchService.js +0 -3
  26. package/dist/service/base/bizmemcache/BizMemCacheService.js +4 -2
  27. package/dist/service/base/bizmemcache/BizMemCacheStore.js +10 -9
  28. package/dist/service/crudstd/CrudStdService.js +1 -1
  29. package/dist/service/curd/fixCfgModel.js +21 -1
  30. package/package.json +1 -1
  31. package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +149 -219
  32. package/src/libs/crud-pro/utils/MixinUtils.ts +309 -400
  33. package/src/libs/crud-pro/utils/idgene/generateSnowflakeId.ts +65 -0
  34. package/src/libs/crud-pro/utils/idgene/generateSnowflakeIdExt.ts +99 -0
  35. package/src/libs/crud-pro/utils/idgene/index.ts +3 -0
  36. package/src/libs/crud-pro/utils/idgene/uuid.ts +26 -0
  37. package/src/libs/crud-pro-quick/fixSoftDelete.ts +84 -18
  38. package/src/libs/crud-pro-quick/models.ts +15 -3
  39. package/src/service/SysAppService.ts +0 -18
  40. package/src/service/SysConfigService.ts +0 -8
  41. package/src/service/SysDictDataService.ts +0 -14
  42. package/src/service/SysMenuService.ts +0 -4
  43. package/src/service/WorkbenchService.ts +0 -5
  44. package/src/service/base/bizmemcache/BizMemCacheService.ts +4 -2
  45. package/src/service/base/bizmemcache/BizMemCacheStore.ts +10 -9
  46. package/src/service/crudstd/CrudStdService.ts +3 -2
  47. 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
- /** 棰勭紪璇戞鍒欙細鏁存暟绫诲瀷锛圡ySQL/PostgreSQL/SQL Server锛?*/
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
- /** 棰勭紪璇戞鍒欙細BIGINT绫诲瀷锛圡ySQL/PostgreSQL/SQL Server锛?*/
9
+ /** BIGINT 类型正则 */
10
10
  const REGEX_BIGINT_TYPE = /^(bigint|int8|bigserial)/;
11
- /** 棰勭紪璇戞鍒欙細瀛楃涓茬被鍨嬶紙MySQL/PostgreSQL/SQL Server锛?*/
11
+ /** 字符串类型正则(MySQL/PostgreSQL/SQL Server) */
12
12
  const REGEX_STRING_TYPE = /^(varchar|char|text|longtext|mediumtext|tinytext|nvarchar|nchar|ntext|character varying|character)/;
13
- /** 鍖呭惈 WHERE 鏉′欢鐨勬搷浣滅被鍨嬮泦鍚堬紙鏌ヨ/鍒犻櫎/鏇存柊锛?*/
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
- /** 鍒ゆ柇瀛楁绫诲瀷鏄惁涓?BIGINT 绫诲瀷锛圝S Number 绮惧害涓嶅锛宑ondition 鍊间笉杞崲锛?*/
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
- /** 鍒ゆ柇 sqlSimpleName 鏄惁涓哄寘鍚?WHERE 鏉′欢鐨勬搷浣滅被鍨嬶紙鏌ヨ/鍒犻櫎/鏇存柊锛?*/
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: 鏃犳硶鑾峰彇琛ㄧ粨鏋勪俊鎭紝璺宠繃' + actionName, cfgModel.sqlTable);
86
+ logger.warn('CrudProDataTypeConvertService: 无法获取表结构信息,跳过' + actionName, cfgModel.sqlTable);
69
87
  return null;
70
88
  }
71
89
  return tableMeta;
72
90
  }
73
- // ============ Data 杞崲澶勭悊鍣?============
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
- * INSERT/UPDATE 鏁版嵁杞崲澶勭悊鍣?
76
- * 璐熻矗 data 鐨勭被鍨嬭浆鎹細PG ARRAY 瀛楅潰閲忋€佸璞?鏁扮粍 JSON 搴忓垪鍖?
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
- // ---- PostgreSQL 涓撴湁锛欰RRAY 绫诲瀷杞崲锛堥渶瑕佽〃鍏冩暟鎹瘑鍒?ARRAY 鍒楋級 ----
105
- if (cfgModel.sqlDbType === keys_1.SqlDbType.postgres) {
106
- const tableMeta = await getTableMetaOrWarn(this.serviceHub, this.logger, cfgModel, 'PG ARRAY杞崲');
107
- if (tableMeta) {
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
- // ---- 涓夊簱閫氱敤锛氬璞?鏁扮粍鍊艰嚜鍔?JSON 搴忓垪鍖?----
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
- // ---- PostgreSQL 涓撴湁锛欰RRAY 鍒楄浆鎹?----
137
- /**
138
- * 閬嶅巻鏁版嵁瀵硅薄涓殑 PG ARRAY 绫诲瀷瀛楁锛屽皢 JS 鏁扮粍杞负 PG 鏁扮粍瀛楅潰閲忔牸寮?
139
- *
140
- * 杞崲娴佺▼锛欽S 鏁扮粍 鈫?tryParseArray() 鈫?toPgArrayLiteral() 鈫?PG 鏁扮粍瀛楅潰閲?
141
- * 渚嬶細[1, 2, 3] 鈫?'{1,2,3}'锛孾"a", "b"] 鈫?'{"a","b"}'
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
- /** 灏嗗崟涓?JS 鍊艰浆涓?PG 鏁扮粍鍏冪礌鐨勫瓧闈㈤噺琛ㄧず */
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
- // ---- 涓夊簱閫氱敤锛氬璞?鏁扮粍鍊艰嚜鍔?JSON 搴忓垪鍖?----
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
- // 璺宠繃 $sqlFunc 琛ㄨ揪寮忓璞★紙INC/DEC/MUL/NOW 绛夛級锛屼笉鍋?JSON.stringify
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; // condition 涓紩鐢ㄧ殑瀛楁涓嶅湪琛ㄧ粨鏋勪腑锛屼笉鍋氳浆鎹?
340
+ continue;
335
341
  }
336
342
  if (isBasicType(value)) {
337
- // 绠€鍗曠瓑鍊兼潯浠讹細{ age: "18" } 鈫?{ age: 18 }
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 => this.convertValueByType(v, fieldType, sqlDbType));
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 => this.convertValueByType(v, fieldType, sqlDbType));
356
+ value[opKey] = opValue.map(v => convertBasicValueByFieldType(v, fieldType, sqlDbType));
355
357
  }
356
358
  }
357
359
  else {
358
- value[opKey] = this.convertValueByType(opValue, fieldType, sqlDbType);
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 };