crabatool 1.0.407 → 1.0.410
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/apis/data.js +96 -65
- package/index.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +4 -3
- package/tool/gspxHash.js +90 -0
package/apis/data.js
CHANGED
|
@@ -198,71 +198,104 @@ class data {
|
|
|
198
198
|
var dataChange = this.pagesDataChanged[pageName]
|
|
199
199
|
|
|
200
200
|
var cs = this.getDataChangeItem(dataChange);
|
|
201
|
-
var map = this.findItemMapData(name, data, cs)
|
|
202
|
-
var
|
|
203
|
-
if (!
|
|
201
|
+
var map = this.findItemMapData(name, name, data, cs)
|
|
202
|
+
var actions = this.findActionByMatchCondition(map, dataChange)
|
|
203
|
+
if (!actions || actions.length == 0) {
|
|
204
204
|
return data;
|
|
205
205
|
}
|
|
206
206
|
//查找涉及的所有实体
|
|
207
207
|
var _this = this;
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
var
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
208
|
+
for(var i = 0 ; i < actions.length; i++){
|
|
209
|
+
var action = actions[i];
|
|
210
|
+
for(var j = 0 ; j < action.length ; j++){
|
|
211
|
+
var item = action[j];
|
|
212
|
+
if (item.type == 'external') {//外表处理
|
|
213
|
+
await _this.externalDataLinkage(req, name, data, item, reverseNumber);
|
|
214
|
+
} else {//内部处理
|
|
215
|
+
//从原始数据中获取对应字段的数据
|
|
216
|
+
var targetRef = _this.findFormateItem(item.filter.refField)
|
|
217
|
+
var targetRefField = _this.findFormateItem(`#[${item.ref}.${item.field}]`)
|
|
218
|
+
var targetValue = _this.findItemMapData(name, crabatool.stringUtils.getFullPinyinCode(item.ref), data, new Set([...targetRef, ...targetRefField]));
|
|
219
|
+
var refFieldName = this.matchFields(item.filter.refField)[0];
|
|
220
|
+
var refFieldNamePy = crabatool.stringUtils.getFullPinyinCode(refFieldName);
|
|
221
|
+
var targetArray = refFieldNamePy.split('.')
|
|
222
|
+
var refData = _this.findLayerData(targetValue, targetArray)
|
|
223
|
+
|
|
224
|
+
var filterCs = _this.findFormateItem(item.filter.refValue)
|
|
225
|
+
var tp = _this.findFormateItem(item.formate);
|
|
226
|
+
var sourceValue = _this.findItemMapData(name, crabatool.stringUtils.getFullPinyinCode(item.ref), data, new Set([...filterCs, ...tp]), reverseNumber);
|
|
227
|
+
var refValueName = this.matchFields(item.filter.refValue)[0];
|
|
228
|
+
var refValueNamePy = crabatool.stringUtils.getFullPinyinCode(refValueName);
|
|
229
|
+
var t = refValueNamePy.split('.')
|
|
230
|
+
var sourceData = _this.findLayerData(sourceValue, t)
|
|
231
|
+
|
|
232
|
+
//根据refData和sourceData计算结果
|
|
233
|
+
var refNamePy = crabatool.stringUtils.getFullPinyinCode(item.ref);
|
|
234
|
+
var fieldNamePy = crabatool.stringUtils.getFullPinyinCode(item.field);
|
|
235
|
+
Object.keys(refData).forEach(key => {
|
|
236
|
+
var target = refData[key][0];
|
|
237
|
+
//目标值为单一对象
|
|
238
|
+
if (!target[refNamePy]) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (oldData) {
|
|
242
|
+
if(name != refNamePy){
|
|
243
|
+
//传入了老数据,当前计算的值可以直接取老数据的对应值,因为它已经排除本单
|
|
244
|
+
var oldDataTemp = oldData[name][refNamePy];
|
|
245
|
+
if(oldDataTemp instanceof Array){
|
|
246
|
+
target[refNamePy][fieldNamePy] = oldDataTemp[0][fieldNamePy];//强制取第一行
|
|
247
|
+
} else {
|
|
248
|
+
target[refNamePy][fieldNamePy] = oldDataTemp[fieldNamePy] ? oldDataTemp[fieldNamePy] : 0;
|
|
249
|
+
}
|
|
250
|
+
} else {
|
|
251
|
+
//传入了老数据,当前计算的值可以直接取老数据的对应值,因为它已经排除本单
|
|
252
|
+
target[refNamePy][fieldNamePy] = oldData[refNamePy][fieldNamePy] ? oldData[refNamePy][fieldNamePy] : 0;
|
|
253
|
+
}
|
|
254
|
+
} else {
|
|
255
|
+
target[refNamePy][fieldNamePy] = target[refNamePy][fieldNamePy] ? target[refNamePy][fieldNamePy] : 0;
|
|
256
|
+
}
|
|
257
|
+
var tempSourceValue = sourceData[key];
|
|
258
|
+
var fieldData = 0;
|
|
259
|
+
for (var j = 0; j < tempSourceValue.length; j++) {
|
|
260
|
+
var value = tempSourceValue[j]
|
|
261
|
+
//还原结果数字,避免在公式中计算时带入右边公式,反复计算(如商品余量=商品余量+商品库存)
|
|
262
|
+
value[refNamePy] && (value[refNamePy][fieldNamePy] = target[refNamePy][fieldNamePy]);
|
|
263
|
+
fieldData += this.execFormate(item.formate, value, 0)
|
|
264
|
+
}
|
|
265
|
+
target[refNamePy][fieldNamePy] = fieldData;
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
//把计算结果赋值给原来的值,让带到后面去
|
|
270
|
+
var targetObj = data;
|
|
271
|
+
if (refNamePy != name) {
|
|
272
|
+
targetObj = data[refNamePy];
|
|
237
273
|
}
|
|
238
|
-
if
|
|
239
|
-
|
|
240
|
-
|
|
274
|
+
if(targetObj instanceof Array){
|
|
275
|
+
targetObj.forEach(titem => {
|
|
276
|
+
var primaryKey = titem[targetArray[1]];
|
|
277
|
+
if(!refData[primaryKey]){//没找到对应行,直接返回
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
var refDataTemp = refData[primaryKey][0][refNamePy];
|
|
281
|
+
Object.keys(refDataTemp).forEach(key => {
|
|
282
|
+
titem[key] = refDataTemp[key];
|
|
283
|
+
});
|
|
284
|
+
})
|
|
241
285
|
} else {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
var
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
286
|
+
var targetObj = data;
|
|
287
|
+
if (refNamePy == name) {
|
|
288
|
+
targetObj = data;
|
|
289
|
+
}
|
|
290
|
+
//将结果赋值给实体对象
|
|
291
|
+
var t = targetValue[refNamePy];
|
|
292
|
+
Object.keys(t).forEach(key => {
|
|
293
|
+
targetObj[key] = t[key];
|
|
294
|
+
});
|
|
251
295
|
}
|
|
252
|
-
target[refNamePy][fieldNamePy] = fieldData;
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
var targetObj = data;
|
|
256
|
-
if (crabatool.stringUtils.getFullPinyinCode(item.ref) == name) {
|
|
257
|
-
targetObj = data;
|
|
258
296
|
}
|
|
259
|
-
//将结果赋值给实体对象
|
|
260
|
-
var t = targetValue[crabatool.stringUtils.getFullPinyinCode(item.ref)];
|
|
261
|
-
Object.keys(t).forEach(key => {
|
|
262
|
-
targetObj[key] = t[key];
|
|
263
|
-
});
|
|
264
297
|
}
|
|
265
|
-
}
|
|
298
|
+
}
|
|
266
299
|
|
|
267
300
|
return data;
|
|
268
301
|
}
|
|
@@ -275,7 +308,7 @@ class data {
|
|
|
275
308
|
//获取本来数据源的数据
|
|
276
309
|
var filterCs = _this.findFormateItem(item.filter.refValue)
|
|
277
310
|
var tp = _this.findFormateItem(item.formate);
|
|
278
|
-
var allValue = _this.findItemMapData(name, data, new Set([...filterCs, ...tp]), reverseNumber);
|
|
311
|
+
var allValue = _this.findItemMapData(name, name, data, new Set([...filterCs, ...tp]), reverseNumber);
|
|
279
312
|
var filterValue = _this.findLayerData(allValue, crabatool.stringUtils.getFullPinyinCode(refValueFieldName).split('.'));
|
|
280
313
|
//根据filterValue取外表数据
|
|
281
314
|
var refPy = crabatool.stringUtils.getFullPinyinCode(item.ref)
|
|
@@ -283,14 +316,13 @@ class data {
|
|
|
283
316
|
var size = 100;
|
|
284
317
|
var rtSize = 0;
|
|
285
318
|
var changeRefData = [];
|
|
319
|
+
var db = this._getDb(req);
|
|
286
320
|
do {
|
|
287
321
|
//循环取外表数据
|
|
288
322
|
var page = 1;
|
|
289
|
-
var t = await
|
|
323
|
+
var t = await db.find(refPy, {
|
|
290
324
|
page: page,
|
|
291
325
|
pageSize: size,
|
|
292
|
-
|
|
293
|
-
|
|
294
326
|
filterFunc: function (row) {
|
|
295
327
|
if (filterValue[row[refFieldPy]]) {
|
|
296
328
|
changeRefData.push({
|
|
@@ -360,12 +392,12 @@ class data {
|
|
|
360
392
|
}
|
|
361
393
|
|
|
362
394
|
//查找项的映射链路数据值
|
|
363
|
-
findItemMapData(name, data, cs, reverseNumber) {
|
|
395
|
+
findItemMapData(name, itemName, data, cs, reverseNumber) {
|
|
364
396
|
//合并相同数据,只考虑2层
|
|
365
397
|
var rowMap = {};
|
|
366
398
|
cs.forEach(item => {
|
|
367
399
|
var arrays = item.split('.');
|
|
368
|
-
var pre =
|
|
400
|
+
var pre = itemName;
|
|
369
401
|
var field = "";
|
|
370
402
|
if (arrays.length == 2) {
|
|
371
403
|
pre = arrays[0];
|
|
@@ -417,13 +449,12 @@ class data {
|
|
|
417
449
|
//根据条件查找匹配的action
|
|
418
450
|
findActionByMatchCondition(map, dataChange) {
|
|
419
451
|
//对比条件,找到满足的条件的动作
|
|
420
|
-
var action =
|
|
452
|
+
var action = [];
|
|
421
453
|
for (var i = 0; i < dataChange.length; i++) {
|
|
422
454
|
var item = dataChange[i];
|
|
423
455
|
if (this.execFormate(item.condition, map)) {
|
|
424
456
|
//找到满足的条件
|
|
425
|
-
action
|
|
426
|
-
break;
|
|
457
|
+
action.push(item.action);
|
|
427
458
|
}
|
|
428
459
|
}
|
|
429
460
|
return action;
|
package/index.js
CHANGED
|
@@ -173,7 +173,7 @@ function checkFast(args) {
|
|
|
173
173
|
if (args.includes('-pageHash')) {
|
|
174
174
|
start.bindAndCheckConfig('-pageHash');
|
|
175
175
|
start.bindConfigByArgv('-ngp', 'boolean');
|
|
176
|
-
require('./tool/pageHash.js').start(); //
|
|
176
|
+
require('./tool/pageHash.js').start(); // 手动生成页面的hash,用于配置id
|
|
177
177
|
return false;
|
|
178
178
|
}
|
|
179
179
|
|
package/lib/utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crabatool",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.410",
|
|
4
4
|
"description": "crabatool",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
"makeHash": "node run.js -makeHash -webPath ./test/ -modName craba -files http://crabadoc.ca.com/js/utils/utils.js,F:/newcrabadoc/www/js/utils/utils.js,./test/test.js,./test/beefun.js,https://s5.vip.wpscdn.cn/web-libs/2t/js/userinfo-collect/1.0.3/vas2t-userinfo-collect.min.js?a=1 -outJson ./hash.json -hashName sha384",
|
|
28
28
|
"makeHash2": "node run.js -makeHash -webPath ./test/ -modName craba -files ./test/ -exts .js -outJson ./hash2.json -hashName sha384",
|
|
29
29
|
"pageHash": "node run.js -pageHash /Test/TestMasterDetail.gspx",
|
|
30
|
-
"addVersion":"node run.js -addVersion -file F:\\basicweb\\www\\index.html -exp AUTOVERSION"
|
|
30
|
+
"addVersion": "node run.js -addVersion -file F:\\basicweb\\www\\index.html -exp AUTOVERSION",
|
|
31
|
+
"gspxHash": "node run.js -gspxHash -webPath F:\\Beefun\\srcs\\Beefun"
|
|
31
32
|
},
|
|
32
33
|
"author": "wssf",
|
|
33
34
|
"dependencies": {
|
|
@@ -69,4 +70,4 @@
|
|
|
69
70
|
"crabatool"
|
|
70
71
|
],
|
|
71
72
|
"license": "UNLICENSED"
|
|
72
|
-
}
|
|
73
|
+
}
|
package/tool/gspxHash.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
|
|
2
|
+
var config = require('../lib/config.js');
|
|
3
|
+
var path = require('path');
|
|
4
|
+
var fs = require('fs');
|
|
5
|
+
var utils = require('../lib/utils.js');
|
|
6
|
+
var os = require('os');
|
|
7
|
+
const crypto = require('crypto');
|
|
8
|
+
var requestSync = require('sync-request');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
module.exports.start = function() {
|
|
12
|
+
if (!config.hashName) {
|
|
13
|
+
config.hashName = 'sha384';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (!config.files) {
|
|
17
|
+
config.files = [];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var results = {};
|
|
21
|
+
buildFiles(results, config.files);
|
|
22
|
+
|
|
23
|
+
utils.mkdirsSync(config.outJson);
|
|
24
|
+
fs.writeFileSync(config.outJson, JSON.stringify(results));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function buildFiles(results, files) {
|
|
28
|
+
files.forEach(function(f) {
|
|
29
|
+
console.log(f);
|
|
30
|
+
|
|
31
|
+
var content;
|
|
32
|
+
var isHttp = f.startsWith('http');
|
|
33
|
+
if (isHttp) {
|
|
34
|
+
var res = requestSync("GET", f);
|
|
35
|
+
content = res.getBody();
|
|
36
|
+
} else if (fs.existsSync(f)) {
|
|
37
|
+
|
|
38
|
+
// 磁盘目录
|
|
39
|
+
var statFs = fs.statSync(f);
|
|
40
|
+
if (!statFs.isFile()) {
|
|
41
|
+
var files2 = fs.readdirSync(f);
|
|
42
|
+
files2 = files2.map(function(s) {
|
|
43
|
+
return utils.join(f, s);
|
|
44
|
+
});
|
|
45
|
+
buildFiles(results, files2);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (config.exts && config.exts.length > 0) {
|
|
50
|
+
var ext = path.extname(f).toLowerCase();
|
|
51
|
+
if (!config.exts.includes(ext)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
content = fs.readFileSync(f);
|
|
57
|
+
} else {
|
|
58
|
+
console.error('文件不存在:' + f);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
var index = f.indexOf('?');
|
|
63
|
+
if (index > 0) {
|
|
64
|
+
f = f.substr(0, index);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 转为相对webPath的路径
|
|
68
|
+
if (!isHttp) {
|
|
69
|
+
f = path.resolve(f);
|
|
70
|
+
var webPath = path.resolve(config.webPath);
|
|
71
|
+
f = f.replace(webPath, '');
|
|
72
|
+
if (config.modName) {
|
|
73
|
+
f = path.join(config.modName, f);
|
|
74
|
+
}
|
|
75
|
+
f = f.replace(/\\/g, '/');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// SRI Hash Generator
|
|
79
|
+
// https://www.srihash.org/
|
|
80
|
+
|
|
81
|
+
var base64 = makeHash(content, config.hashName); // 将文件内容进行hash计算
|
|
82
|
+
results[f] = config.hashName + '-' + base64; // 使用 base64 编码 sha384 算法计算出摘要后的 integrity 值的示例
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function makeHash(str, name) {
|
|
87
|
+
const hash = crypto.createHash(name);
|
|
88
|
+
hash.update(str);
|
|
89
|
+
return hash.digest('base64');
|
|
90
|
+
}
|