@ibiz-template/model-helper 0.7.41-alpha.124 → 0.7.41-alpha.126

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 (43) hide show
  1. package/dist/index.esm.js +152 -13
  2. package/dist/index.system.min.js +1 -1
  3. package/out/index.d.ts +2 -1
  4. package/out/index.d.ts.map +1 -1
  5. package/out/index.js +1 -1
  6. package/out/interface/i-model-handler.d.ts +20 -0
  7. package/out/interface/i-model-handler.d.ts.map +1 -0
  8. package/out/interface/i-model-handler.js +1 -0
  9. package/out/interface/index.d.ts +2 -0
  10. package/out/interface/index.d.ts.map +1 -0
  11. package/out/interface/index.js +1 -0
  12. package/out/locale/en/index.d.ts +3 -0
  13. package/out/locale/en/index.d.ts.map +1 -1
  14. package/out/locale/en/index.js +3 -0
  15. package/out/locale/zh-CN/index.d.ts +3 -0
  16. package/out/locale/zh-CN/index.d.ts.map +1 -1
  17. package/out/locale/zh-CN/index.js +3 -0
  18. package/out/model-util.d.ts +3 -2
  19. package/out/model-util.d.ts.map +1 -1
  20. package/out/model-util.js +20 -12
  21. package/out/utils/index.d.ts +3 -0
  22. package/out/utils/index.d.ts.map +1 -1
  23. package/out/utils/index.js +3 -0
  24. package/out/utils/model-transformer/model-handler.d.ts +32 -0
  25. package/out/utils/model-transformer/model-handler.d.ts.map +1 -0
  26. package/out/utils/model-transformer/model-handler.js +24 -0
  27. package/out/utils/model-transformer/model-register.d.ts +9 -0
  28. package/out/utils/model-transformer/model-register.d.ts.map +1 -0
  29. package/out/utils/model-transformer/model-register.js +10 -0
  30. package/out/utils/model-transformer/model-transformer.d.ts +55 -0
  31. package/out/utils/model-transformer/model-transformer.d.ts.map +1 -0
  32. package/out/utils/model-transformer/model-transformer.js +102 -0
  33. package/package.json +3 -3
  34. package/src/index.ts +6 -1
  35. package/src/interface/i-model-handler.ts +19 -0
  36. package/src/interface/index.ts +1 -0
  37. package/src/locale/en/index.ts +6 -0
  38. package/src/locale/zh-CN/index.ts +4 -0
  39. package/src/model-util.ts +28 -12
  40. package/src/utils/index.ts +3 -0
  41. package/src/utils/model-transformer/model-handler.ts +36 -0
  42. package/src/utils/model-transformer/model-register.ts +15 -0
  43. package/src/utils/model-transformer/model-transformer.ts +124 -0
package/src/model-util.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  import { calcUniqueTag } from '@ibiz/rt-model-api';
2
2
  import { IAppDERS } from '@ibiz/model-core';
3
3
  import { isEmpty } from 'ramda';
4
- import { formatPath, mergeModel, ServicePathUtil } from './utils';
4
+ import {
5
+ formatPath,
6
+ mergeModel,
7
+ ModelTransformer,
8
+ ServicePathUtil,
9
+ } from './utils';
5
10
  import { PSSysApp } from './model/PSSYSAPP';
6
11
 
7
12
  /**
@@ -388,38 +393,49 @@ export class ModelUtil {
388
393
  return this.modelCache.get(url)!;
389
394
  }
390
395
  const model = await this.get(url, params);
396
+ const filledModel = this.deepFillModel(model);
391
397
  if (!isParams) {
392
- this.modelCache.set(url, model);
398
+ this.modelCache.set(url, filledModel);
393
399
  }
394
- this.deepFillAppId(model);
395
- return model;
400
+ return filledModel;
396
401
  }
397
402
 
398
403
  /**
399
- * 递归填充应用标识
404
+ * 递归填充模型,包括填充模型appId、变换模型
400
405
  *
401
406
  * @author chitanda
402
407
  * @date 2023-08-21 10:08:41
403
408
  * @protected
404
409
  * @param {IModel} model
410
+ * @return {*} {IModel} 返回处理后的模型,若处理器返回新对象则替换原引用
405
411
  */
406
- protected deepFillAppId(model: IModel): void {
407
- model.appId = this.appId;
408
- const keys = Object.keys(model);
412
+ protected deepFillModel(model: IModel): IModel {
413
+ // 变换模型
414
+ let result = model;
415
+ if (model.dynaModelFilePath) {
416
+ result = ModelTransformer.getInstance().transform(
417
+ model.dynaModelFilePath,
418
+ model,
419
+ );
420
+ }
421
+ // 填充模型appId
422
+ result.appId = this.appId;
423
+ const keys = Object.keys(result);
409
424
  keys.forEach(key => {
410
- const value = model[key];
425
+ const value = result[key];
411
426
  if (value && typeof value === 'object') {
412
427
  if (Array.isArray(value)) {
413
- value.forEach(item => {
428
+ value.forEach((item, index) => {
414
429
  if (item && typeof item === 'object') {
415
- this.deepFillAppId(item);
430
+ value[index] = this.deepFillModel(item);
416
431
  }
417
432
  });
418
433
  } else {
419
- this.deepFillAppId(value);
434
+ result[key] = this.deepFillModel(value);
420
435
  }
421
436
  }
422
437
  });
438
+ return result;
423
439
  }
424
440
 
425
441
  /**
@@ -7,3 +7,6 @@ export {
7
7
  ServicePathUtil,
8
8
  } from './service-path-util/service-path-util';
9
9
  export { MergeSubModelHelper } from './merge-model/merge-model-helper';
10
+ export { ModelHandler } from './model-transformer/model-handler';
11
+ export { ModelTransformer } from './model-transformer/model-transformer';
12
+ export { registerModelHandler } from './model-transformer/model-register';
@@ -0,0 +1,36 @@
1
+ import { IModelHandler } from '../../interface';
2
+
3
+ /**
4
+ * @description 模型变换处理器
5
+ * @export
6
+ * @abstract
7
+ * @class ModelHandler
8
+ * @implements {IModelHandler}
9
+ */
10
+ export abstract class ModelHandler implements IModelHandler {
11
+ /**
12
+ * @description 优先级,默认值为1
13
+ * @public
14
+ * @type {number}
15
+ * @memberof ModelHandler
16
+ */
17
+ public priority: number = 1;
18
+
19
+ /**
20
+ * Creates an instance of ModelHandler.
21
+ * @param {number} [priority=1] 优先级,数值越小越先执行
22
+ * @memberof ModelHandler
23
+ */
24
+ constructor(priority: number = 1) {
25
+ this.priority = priority;
26
+ }
27
+
28
+ /**
29
+ * @description 执行器
30
+ * @abstract
31
+ * @param {IModel} model
32
+ * @returns {*} {IModel}
33
+ * @memberof ModelHandler
34
+ */
35
+ abstract execute(model: IModel): IModel;
36
+ }
@@ -0,0 +1,15 @@
1
+ import { ModelHandler } from './model-handler';
2
+ import { ModelTransformer } from './model-transformer';
3
+
4
+ /**
5
+ * @description 注册模型处理器
6
+ * @export
7
+ * @param {string} dynaModelFilePath 模型路径
8
+ * @param {ModelHandler} handler 模型处理器
9
+ */
10
+ export function registerModelHandler(
11
+ dynaModelFilePath: string,
12
+ handler: ModelHandler,
13
+ ): void {
14
+ ModelTransformer.getInstance().registerHandler(dynaModelFilePath, handler);
15
+ }
@@ -0,0 +1,124 @@
1
+ import { ModelHandler } from './model-handler';
2
+
3
+ /**
4
+ * @description 模型变换器
5
+ * @author tony001
6
+ * @date 2026-08-13 09:08:03
7
+ * @export
8
+ * @class ModelTransformer
9
+ */
10
+ export class ModelTransformer {
11
+ /**
12
+ * @description 单例变量声明
13
+ * @private
14
+ * @static
15
+ * @type {ModelTransformer}
16
+ * @memberof ModelTransformer
17
+ */
18
+ private static modelTransformer: ModelTransformer;
19
+
20
+ /**
21
+ * @description 获取 ModelTransformer 单例对象
22
+ * @static
23
+ * @returns {*} {ModelTransformer}
24
+ * @memberof ModelTransformer
25
+ */
26
+ public static getInstance(): ModelTransformer {
27
+ if (!this.modelTransformer) {
28
+ this.modelTransformer = new ModelTransformer();
29
+ }
30
+ return this.modelTransformer;
31
+ }
32
+
33
+ /**
34
+ * @description 模型处理器Map
35
+ * @private
36
+ * @type {Map<string, ModelHandler[]>}
37
+ * @memberof ModelTransformer
38
+ */
39
+ private handlerMap: Map<string, ModelHandler[]> = new Map();
40
+
41
+ /**
42
+ * @description 模型缓存Map
43
+ * @private
44
+ * @type {Map<string, IModel>}
45
+ * @memberof ModelTransformer
46
+ */
47
+ private modelCacheMap: Map<string, IModel> = new Map();
48
+
49
+ /**
50
+ * @description 注册模型处理器
51
+ * @param {string} dynaModelFilePath 模型路径
52
+ * @param {IModelHandler} handler 执行器
53
+ * @memberof ModelTransformer
54
+ */
55
+ public registerHandler(
56
+ dynaModelFilePath: string,
57
+ handler: ModelHandler,
58
+ ): void {
59
+ const handlers = this.handlerMap.get(dynaModelFilePath);
60
+ if (handlers) {
61
+ handlers.push(handler);
62
+ } else {
63
+ this.handlerMap.set(dynaModelFilePath, [handler]);
64
+ }
65
+ // 注册新处理器后清除该路径的模型缓存,确保新处理器能生效
66
+ this.modelCacheMap.delete(dynaModelFilePath);
67
+ }
68
+
69
+ /**
70
+ * @description 变换模型
71
+ * @param {string} dynaModelFilePath 模型路径
72
+ * @param {IModel} model 原始模型
73
+ * @returns {*} {IModel}
74
+ * @memberof ModelTransformer
75
+ */
76
+ public transform(dynaModelFilePath: string, model: IModel): IModel {
77
+ ibiz.log.debug(
78
+ ibiz.i18n.t('modelHelper.utils.tryGetModel', {
79
+ dynaModelFilePath,
80
+ }),
81
+ );
82
+ if (this.modelCacheMap.has(dynaModelFilePath)) {
83
+ return this.modelCacheMap.get(dynaModelFilePath)!;
84
+ }
85
+ const handlers = this.handlerMap.get(dynaModelFilePath);
86
+ if (!handlers || handlers.length === 0) {
87
+ this.modelCacheMap.set(dynaModelFilePath, model);
88
+ return model;
89
+ }
90
+ // 按照优先级升序排序,优先级高的后执行
91
+ const sortedHandlers = [...handlers].sort(
92
+ (a: ModelHandler, b: ModelHandler) => a.priority - b.priority,
93
+ );
94
+ // 模型处理
95
+ let result = model;
96
+ for (const handler of sortedHandlers) {
97
+ try {
98
+ const next = handler.execute(result);
99
+ if (next) {
100
+ result = next;
101
+ } else {
102
+ ibiz.log.error(
103
+ ibiz.i18n.t('modelHelper.utils.transformNoModelData', {
104
+ dynaModelFilePath,
105
+ }),
106
+ );
107
+ // 未返回模型数据时返回传入的原始模型,防止界面异常
108
+ return model;
109
+ }
110
+ } catch (error) {
111
+ ibiz.log.error(
112
+ ibiz.i18n.t('modelHelper.utils.transformException', {
113
+ dynaModelFilePath,
114
+ }),
115
+ error,
116
+ );
117
+ // 执行异常时返回传入的原始模型,防止界面异常
118
+ return model;
119
+ }
120
+ }
121
+ this.modelCacheMap.set(dynaModelFilePath, result);
122
+ return result;
123
+ }
124
+ }