@ibiz-template/model-helper 0.7.41-alpha.13 → 0.7.41-alpha.131
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/index.esm.js +9770 -3196
- package/dist/index.system.min.js +1 -1
- package/out/index.d.ts +2 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js +1 -1
- package/out/interface/i-model-handler.d.ts +20 -0
- package/out/interface/i-model-handler.d.ts.map +1 -0
- package/out/interface/i-model-handler.js +1 -0
- package/out/interface/index.d.ts +2 -0
- package/out/interface/index.d.ts.map +1 -0
- package/out/interface/index.js +1 -0
- package/out/locale/en/index.d.ts +4 -0
- package/out/locale/en/index.d.ts.map +1 -1
- package/out/locale/en/index.js +4 -0
- package/out/locale/zh-CN/index.d.ts +4 -0
- package/out/locale/zh-CN/index.d.ts.map +1 -1
- package/out/locale/zh-CN/index.js +4 -0
- package/out/model-helper.d.ts +13 -1
- package/out/model-helper.d.ts.map +1 -1
- package/out/model-helper.js +47 -4
- package/out/model-loader.d.ts +3 -1
- package/out/model-loader.d.ts.map +1 -1
- package/out/model-loader.js +6 -0
- package/out/model-util.d.ts +3 -2
- package/out/model-util.d.ts.map +1 -1
- package/out/model-util.js +28 -20
- package/out/utils/index.d.ts +3 -0
- package/out/utils/index.d.ts.map +1 -1
- package/out/utils/index.js +3 -0
- package/out/utils/merge-model/merge-app-codelist.d.ts +8 -0
- package/out/utils/merge-model/merge-app-codelist.d.ts.map +1 -0
- package/out/utils/merge-model/merge-app-codelist.js +35 -0
- package/out/utils/merge-model/merge-app-menu.d.ts.map +1 -1
- package/out/utils/merge-model/merge-app-menu.js +8 -3
- package/out/utils/merge-model/merge-app-uiaction-group.d.ts +7 -0
- package/out/utils/merge-model/merge-app-uiaction-group.d.ts.map +1 -1
- package/out/utils/merge-model/merge-app-uiaction-group.js +54 -2
- package/out/utils/merge-model/merge-de-drcontrol.d.ts +8 -0
- package/out/utils/merge-model/merge-de-drcontrol.d.ts.map +1 -1
- package/out/utils/merge-model/merge-de-drcontrol.js +87 -4
- package/out/utils/merge-model/merge-de-form.d.ts +15 -0
- package/out/utils/merge-model/merge-de-form.d.ts.map +1 -1
- package/out/utils/merge-model/merge-de-form.js +56 -0
- package/out/utils/merge-model/merge-model-helper.d.ts +15 -1
- package/out/utils/merge-model/merge-model-helper.d.ts.map +1 -1
- package/out/utils/merge-model/merge-model-helper.js +101 -9
- package/out/utils/merge-model/merge-treeview.d.ts.map +1 -1
- package/out/utils/merge-model/merge-treeview.js +142 -6
- package/out/utils/model-transformer/model-handler.d.ts +32 -0
- package/out/utils/model-transformer/model-handler.d.ts.map +1 -0
- package/out/utils/model-transformer/model-handler.js +24 -0
- package/out/utils/model-transformer/model-register.d.ts +9 -0
- package/out/utils/model-transformer/model-register.d.ts.map +1 -0
- package/out/utils/model-transformer/model-register.js +10 -0
- package/out/utils/model-transformer/model-transformer.d.ts +63 -0
- package/out/utils/model-transformer/model-transformer.d.ts.map +1 -0
- package/out/utils/model-transformer/model-transformer.js +125 -0
- package/package.json +8 -6
- package/src/index.ts +12 -0
- package/src/interface/i-model-handler.ts +19 -0
- package/src/interface/index.ts +1 -0
- package/src/locale/en/index.ts +24 -0
- package/src/locale/index.ts +2 -0
- package/src/locale/zh-CN/index.ts +20 -0
- package/src/model/PSSYSAPP.ts +12 -0
- package/src/model-helper.ts +804 -0
- package/src/model-loader.ts +95 -0
- package/src/model-util.ts +483 -0
- package/src/utils/format-path/format-path.ts +9 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/merge-model/merge-app-codelist.ts +42 -0
- package/src/utils/merge-model/merge-app-menu.ts +136 -0
- package/src/utils/merge-model/merge-app-uiaction-group.ts +85 -0
- package/src/utils/merge-model/merge-de-drcontrol.ts +175 -0
- package/src/utils/merge-model/merge-de-form.ts +326 -0
- package/src/utils/merge-model/merge-model-helper.ts +602 -0
- package/src/utils/merge-model/merge-model.ts +20 -0
- package/src/utils/merge-model/merge-treeview.ts +197 -0
- package/src/utils/model-transformer/model-handler.ts +36 -0
- package/src/utils/model-transformer/model-register.ts +15 -0
- package/src/utils/model-transformer/model-transformer.ts +147 -0
- package/src/utils/plural/plural.ts +30 -0
- package/src/utils/service-path-util/service-path-util.ts +361 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/* eslint-disable no-case-declarations */
|
|
2
|
+
import { IDETree, IDETreeNodeRS } from '@ibiz/model-core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 合并树部件
|
|
6
|
+
*
|
|
7
|
+
* @author tony001
|
|
8
|
+
* @date 2024-09-26 17:09:25
|
|
9
|
+
* @export
|
|
10
|
+
* @param {IDETree} dst
|
|
11
|
+
* @param {IDETree} source
|
|
12
|
+
*/
|
|
13
|
+
export function mergeTreeView(dst: IDETree, source: IDETree): void {
|
|
14
|
+
if (!dst || !source) return;
|
|
15
|
+
// 合并树节点
|
|
16
|
+
if (source.detreeNodes && source.detreeNodes.length > 0) {
|
|
17
|
+
if (!dst.detreeNodes) {
|
|
18
|
+
dst.detreeNodes = [];
|
|
19
|
+
}
|
|
20
|
+
source.detreeNodes.forEach(sourceNode => {
|
|
21
|
+
const item = dst.detreeNodes!.find(dstNode => {
|
|
22
|
+
return dstNode.id === sourceNode.id;
|
|
23
|
+
});
|
|
24
|
+
if (!item) {
|
|
25
|
+
dst.detreeNodes?.push(sourceNode);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// 合并树节点关系
|
|
30
|
+
if (source.detreeNodeRSs && source.detreeNodeRSs.length > 0) {
|
|
31
|
+
if (!dst.detreeNodeRSs) {
|
|
32
|
+
dst.detreeNodeRSs = [];
|
|
33
|
+
}
|
|
34
|
+
source.detreeNodeRSs.forEach(sourceNodeRs => {
|
|
35
|
+
// 若配置了用户标记(dynamic_overlay:before|after|replace|delete|start|end:noderesid),则需根据用户标记进行合并,否则原始数据没有则直接附加末尾
|
|
36
|
+
if (
|
|
37
|
+
(sourceNodeRs as IModel).userTag &&
|
|
38
|
+
(sourceNodeRs as IModel).userTag.startsWith('dynamic_overlay') &&
|
|
39
|
+
(sourceNodeRs as IModel).userTag.split(':').length === 3
|
|
40
|
+
) {
|
|
41
|
+
mergeSubAppTreeNodeResToDst(dst, sourceNodeRs);
|
|
42
|
+
} else {
|
|
43
|
+
const itemIndex = dst.detreeNodeRSs!.findIndex(dstNodeRs => {
|
|
44
|
+
return (
|
|
45
|
+
dstNodeRs.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId &&
|
|
46
|
+
dstNodeRs.childDETreeNodeId === sourceNodeRs.childDETreeNodeId
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
// 若存在end标记,则需要添加到第一个end标记节点关系前面,保证end标记节点关系始终添加到最后
|
|
50
|
+
const endIndex = dst.detreeNodeRSs!.findIndex(dstNodeRs => {
|
|
51
|
+
if (
|
|
52
|
+
dstNodeRs.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId
|
|
53
|
+
) {
|
|
54
|
+
const tags = (sourceNodeRs as IModel).userTag?.split(':');
|
|
55
|
+
if (!tags || tags.length !== 3 || tags[1] !== 'end') return false;
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
});
|
|
60
|
+
if (itemIndex === -1) {
|
|
61
|
+
if (endIndex === -1) {
|
|
62
|
+
dst.detreeNodeRSs?.push(sourceNodeRs);
|
|
63
|
+
} else {
|
|
64
|
+
dst.detreeNodeRSs!.splice(endIndex, 0, sourceNodeRs);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 合并指定子应用树节点关系到主应用树指定位置
|
|
74
|
+
* @param dst 原始树
|
|
75
|
+
* @param sourceNode 子应用树节点关系
|
|
76
|
+
*/
|
|
77
|
+
function mergeSubAppTreeNodeResToDst(
|
|
78
|
+
dst: IDETree,
|
|
79
|
+
sourceNodeRs: IDETreeNodeRS,
|
|
80
|
+
): void {
|
|
81
|
+
// dynamic_overlay:before|after|replace|delete|start|end:nodeid 定义附加位置
|
|
82
|
+
const [dynamicOverlay, targetPosition, targetTag] = (
|
|
83
|
+
sourceNodeRs as IModel
|
|
84
|
+
).userTag.split(':');
|
|
85
|
+
if (!dynamicOverlay || !targetPosition || !targetTag) return;
|
|
86
|
+
switch (targetPosition) {
|
|
87
|
+
case 'before':
|
|
88
|
+
// 在目标节点之前,dynamic_overlay:before:childnodeid,这儿最后一节拼接的是子节点标识
|
|
89
|
+
const beforeIndex = dst.detreeNodeRSs!.findIndex(dstNode => {
|
|
90
|
+
return (
|
|
91
|
+
dstNode.childDETreeNodeId === targetTag &&
|
|
92
|
+
dstNode.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
if (beforeIndex !== -1) {
|
|
96
|
+
dst.detreeNodeRSs!.splice(beforeIndex, 0, sourceNodeRs);
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
case 'after':
|
|
100
|
+
// 在目标节点之后,格式如:dynamic_overlay:after:childnodeid,最后一节拼接的是子节点标识
|
|
101
|
+
const afterIndex = dst.detreeNodeRSs!.findIndex(dstNode => {
|
|
102
|
+
return (
|
|
103
|
+
dstNode.childDETreeNodeId === targetTag &&
|
|
104
|
+
dstNode.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
if (afterIndex !== -1) {
|
|
108
|
+
dst.detreeNodeRSs!.splice(afterIndex + 1, 0, sourceNodeRs);
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case 'replace':
|
|
112
|
+
// 替换目标节点,格式如:dynamic_overlay:replace:childnodeid,最后一节拼接的是子节点标识
|
|
113
|
+
const replaceIndex = dst.detreeNodeRSs!.findIndex(dstNode => {
|
|
114
|
+
return (
|
|
115
|
+
dstNode.childDETreeNodeId === targetTag &&
|
|
116
|
+
dstNode.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
if (replaceIndex !== -1) {
|
|
120
|
+
dst.detreeNodeRSs!.splice(replaceIndex, 1, sourceNodeRs);
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
case 'delete':
|
|
124
|
+
// 删除目标节点,格式如:dynamic_overlay:delete:childnodeid,最后一节拼接的是子节点标识
|
|
125
|
+
const deleteIndex = dst.detreeNodeRSs!.findIndex(dstNode => {
|
|
126
|
+
return (
|
|
127
|
+
dstNode.childDETreeNodeId === targetTag &&
|
|
128
|
+
dstNode.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
if (deleteIndex !== -1) {
|
|
132
|
+
dst.detreeNodeRSs!.splice(deleteIndex, 1);
|
|
133
|
+
}
|
|
134
|
+
break;
|
|
135
|
+
case 'start':
|
|
136
|
+
// 在目标节点内部开始,格式如:dynamic_overlay:start:随机字符,最后一节拼接的是随机字符,读的是当前节点关系的父节点标识
|
|
137
|
+
const startIndex = dst.detreeNodeRSs!.findIndex(dstNode => {
|
|
138
|
+
return dstNode.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId;
|
|
139
|
+
});
|
|
140
|
+
if (startIndex !== -1) {
|
|
141
|
+
dst.detreeNodeRSs!.splice(startIndex, 0, sourceNodeRs);
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
case 'end':
|
|
145
|
+
// 在目标节点内部结束,格式如:dynamic_overlay:end:随机字符,最后一节拼接的是随机字符,读的是当前节点关系的父节点标识
|
|
146
|
+
const endIndex = getLastIndex(dst.detreeNodeRSs!, dstNode => {
|
|
147
|
+
return dstNode.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId;
|
|
148
|
+
});
|
|
149
|
+
if (endIndex !== -1) {
|
|
150
|
+
dst.detreeNodeRSs!.splice(endIndex + 1, 0, sourceNodeRs);
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
default:
|
|
154
|
+
// 未识别位置,若源树不存在该关系,则直接附加到最后
|
|
155
|
+
const defaultIndex = dst.detreeNodeRSs!.findIndex(dstNodeRs => {
|
|
156
|
+
return (
|
|
157
|
+
dstNodeRs.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId &&
|
|
158
|
+
dstNodeRs.childDETreeNodeId === sourceNodeRs.childDETreeNodeId
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
// 若存在end标记,则需要添加到第一个end标记节点关系前面,保证end标记节点关系始终添加到最后
|
|
162
|
+
const defaultEndIndex = dst.detreeNodeRSs!.findIndex(dstNodeRs => {
|
|
163
|
+
if (dstNodeRs.parentDETreeNodeId === sourceNodeRs.parentDETreeNodeId) {
|
|
164
|
+
const tags = (sourceNodeRs as IModel).userTag?.split(':');
|
|
165
|
+
if (!tags || tags.length !== 3 || tags[1] !== 'end') return false;
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
});
|
|
170
|
+
if (defaultIndex === -1) {
|
|
171
|
+
if (defaultEndIndex === -1) {
|
|
172
|
+
dst.detreeNodeRSs?.push(sourceNodeRs);
|
|
173
|
+
} else {
|
|
174
|
+
dst.detreeNodeRSs!.splice(defaultEndIndex, 0, sourceNodeRs);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* 获取指定数组中满足条件的最后一个元素
|
|
183
|
+
* @param arr 指定数组
|
|
184
|
+
* @param predicate 过滤条件
|
|
185
|
+
* @returns 找到则返回指定元素下标,反之返回-1
|
|
186
|
+
*/
|
|
187
|
+
function getLastIndex(
|
|
188
|
+
arr: IModel[],
|
|
189
|
+
predicate: (item: IModel) => boolean,
|
|
190
|
+
): number {
|
|
191
|
+
for (let i = arr.length - 1; i >= 0; i--) {
|
|
192
|
+
if (predicate(arr[i])) {
|
|
193
|
+
return i;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return -1;
|
|
197
|
+
}
|
|
@@ -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} pathPattern 路径表达式
|
|
8
|
+
* @param {ModelHandler} handler 模型处理器
|
|
9
|
+
*/
|
|
10
|
+
export function registerModelHandler(
|
|
11
|
+
pathPattern: string,
|
|
12
|
+
handler: ModelHandler,
|
|
13
|
+
): void {
|
|
14
|
+
ModelTransformer.getInstance().registerHandler(pathPattern, handler);
|
|
15
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import AntPathMatcher from '@maxbilbow/ant-path-matcher';
|
|
2
|
+
import { ModelHandler } from './model-handler';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @description 模型变换器
|
|
6
|
+
* @author tony001
|
|
7
|
+
* @date 2026-08-13 09:08:03
|
|
8
|
+
* @export
|
|
9
|
+
* @class ModelTransformer
|
|
10
|
+
*/
|
|
11
|
+
export class ModelTransformer {
|
|
12
|
+
/**
|
|
13
|
+
* @description 单例变量声明
|
|
14
|
+
* @private
|
|
15
|
+
* @static
|
|
16
|
+
* @type {ModelTransformer}
|
|
17
|
+
* @memberof ModelTransformer
|
|
18
|
+
*/
|
|
19
|
+
private static modelTransformer: ModelTransformer;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @description 获取 ModelTransformer 单例对象
|
|
23
|
+
* @static
|
|
24
|
+
* @returns {*} {ModelTransformer}
|
|
25
|
+
* @memberof ModelTransformer
|
|
26
|
+
*/
|
|
27
|
+
public static getInstance(): ModelTransformer {
|
|
28
|
+
if (!this.modelTransformer) {
|
|
29
|
+
this.modelTransformer = new ModelTransformer();
|
|
30
|
+
}
|
|
31
|
+
return this.modelTransformer;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @description 模型处理器Map
|
|
36
|
+
* @private
|
|
37
|
+
* @type {Map<string, ModelHandler[]>}
|
|
38
|
+
* @memberof ModelTransformer
|
|
39
|
+
*/
|
|
40
|
+
private handlerMap: Map<string, ModelHandler[]> = new Map();
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @description 路径匹配器(支持通配符路径匹配)
|
|
44
|
+
* @private
|
|
45
|
+
* @type {ReturnType<typeof AntPathMatcher>}
|
|
46
|
+
* @memberof ModelTransformer
|
|
47
|
+
*/
|
|
48
|
+
private pathMatcher = AntPathMatcher();
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @description 注册模型处理器
|
|
52
|
+
* @param {string} pathPattern 路径表达式(奇数位路径段支持通配符)
|
|
53
|
+
* @param {IModelHandler} handler 执行器
|
|
54
|
+
* @memberof ModelTransformer
|
|
55
|
+
*/
|
|
56
|
+
public registerHandler(pathPattern: string, handler: ModelHandler): void {
|
|
57
|
+
if (!this.validatePattern(pathPattern)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const handlers = this.handlerMap.get(pathPattern);
|
|
61
|
+
if (handlers) {
|
|
62
|
+
handlers.push(handler);
|
|
63
|
+
} else {
|
|
64
|
+
this.handlerMap.set(pathPattern, [handler]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @description 校验模型路径,从0开始数,偶数位路径段(如PSSYSAPPS、PSAPPDATAENTITIES等类型段)不允许使用通配符,奇数位路径段可使用
|
|
70
|
+
* @private
|
|
71
|
+
* @param {string} pathPattern 路径表达式
|
|
72
|
+
* @returns {*} {boolean}
|
|
73
|
+
* @memberof ModelTransformer
|
|
74
|
+
*/
|
|
75
|
+
private validatePattern(pathPattern: string): boolean {
|
|
76
|
+
const segments = pathPattern.split('/');
|
|
77
|
+
const isValid = segments.every((segment: string, index: number) => {
|
|
78
|
+
// 偶数位不允许出现通配符,奇数位有无通配符均可
|
|
79
|
+
return index % 2 === 1 || !/[*?]/.test(segment);
|
|
80
|
+
});
|
|
81
|
+
if (!isValid) {
|
|
82
|
+
ibiz.log.error(
|
|
83
|
+
ibiz.i18n.t('modelHelper.utils.invalidPathPattern', {
|
|
84
|
+
pathPattern,
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return isValid;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @description 变换模型
|
|
93
|
+
* @param {string} dynaModelFilePath 模型路径
|
|
94
|
+
* @param {IModel} model 原始模型
|
|
95
|
+
* @returns {*} {IModel}
|
|
96
|
+
* @memberof ModelTransformer
|
|
97
|
+
*/
|
|
98
|
+
public transform(dynaModelFilePath: string, model: IModel): IModel {
|
|
99
|
+
ibiz.log.debug(
|
|
100
|
+
ibiz.i18n.t('modelHelper.utils.tryGetModel', {
|
|
101
|
+
dynaModelFilePath,
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
// 收集所有匹配当前路径的处理器(支持通配符路径)
|
|
105
|
+
const matchedHandlers: ModelHandler[] = [];
|
|
106
|
+
this.handlerMap.forEach((handlers: ModelHandler[], pattern: string) => {
|
|
107
|
+
if (this.pathMatcher.match(pattern, dynaModelFilePath)) {
|
|
108
|
+
matchedHandlers.push(...handlers);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
if (matchedHandlers.length === 0) {
|
|
112
|
+
return model;
|
|
113
|
+
}
|
|
114
|
+
// 按照优先级升序排序,优先级高的后执行
|
|
115
|
+
const sortedHandlers = [...matchedHandlers].sort(
|
|
116
|
+
(a: ModelHandler, b: ModelHandler) => a.priority - b.priority,
|
|
117
|
+
);
|
|
118
|
+
// 模型处理
|
|
119
|
+
let result = model;
|
|
120
|
+
for (const handler of sortedHandlers) {
|
|
121
|
+
try {
|
|
122
|
+
const next = handler.execute(result);
|
|
123
|
+
if (next) {
|
|
124
|
+
result = next;
|
|
125
|
+
} else {
|
|
126
|
+
ibiz.log.error(
|
|
127
|
+
ibiz.i18n.t('modelHelper.utils.transformNoModelData', {
|
|
128
|
+
dynaModelFilePath,
|
|
129
|
+
}),
|
|
130
|
+
);
|
|
131
|
+
// 未返回模型数据时返回传入的原始模型,防止界面异常
|
|
132
|
+
return model;
|
|
133
|
+
}
|
|
134
|
+
} catch (error) {
|
|
135
|
+
ibiz.log.error(
|
|
136
|
+
ibiz.i18n.t('modelHelper.utils.transformException', {
|
|
137
|
+
dynaModelFilePath,
|
|
138
|
+
}),
|
|
139
|
+
error,
|
|
140
|
+
);
|
|
141
|
+
// 执行异常时返回传入的原始模型,防止界面异常
|
|
142
|
+
return model;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import pluralize from 'pluralize';
|
|
2
|
+
|
|
3
|
+
// 补充特殊转换规则
|
|
4
|
+
pluralize.addPluralRule(/(matr|vert|ind)ix|ex$/, '$1ices');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 英文转复数写法
|
|
8
|
+
*
|
|
9
|
+
* @author chitanda
|
|
10
|
+
* @date 2022-08-25 18:08:41
|
|
11
|
+
* @export
|
|
12
|
+
* @param {string} key
|
|
13
|
+
* @return {*} {string}
|
|
14
|
+
*/
|
|
15
|
+
export function plural(key: string): string {
|
|
16
|
+
return pluralize(key);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 英文转复数写法并转全小写
|
|
21
|
+
*
|
|
22
|
+
* @author chitanda
|
|
23
|
+
* @date 2022-08-25 18:08:23
|
|
24
|
+
* @export
|
|
25
|
+
* @param {string} key
|
|
26
|
+
* @return {*} {string}
|
|
27
|
+
*/
|
|
28
|
+
export function pluralLower(key: string): string {
|
|
29
|
+
return plural(key).toLowerCase();
|
|
30
|
+
}
|