|
@@ -719,22 +719,22 @@ let analyzer = {
|
|
|
return arrBase ? arrBase : [];
|
|
|
},
|
|
|
|
|
|
- getID: function (FName, calcTemplate) { // F13 → 4
|
|
|
+ getID: function (FName, template) { // F13 → 4
|
|
|
let idx = FName.slice(1) - 1;
|
|
|
- let id = calcTemplate.calcItems[idx] ? calcTemplate.calcItems[idx].ID : null;
|
|
|
+ let id = template.calcItems[idx] ? template.calcItems[idx].ID : null;
|
|
|
return id;
|
|
|
},
|
|
|
- getFName: function (atID, calcTemplate) { // @3 → F7
|
|
|
- for (var i = 0; i < calcTemplate.calcItems.length; i++) {
|
|
|
- if (calcTemplate.calcItems[i].ID == atID.slice(1)) {
|
|
|
+ getFName: function (atID, template) { // @3 → F7
|
|
|
+ for (var i = 0; i < template.calcItems.length; i++) {
|
|
|
+ if (template.calcItems[i].ID == atID.slice(1)) {
|
|
|
return 'F'+ (i + 1);
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
},
|
|
|
- getItem: function (FName, calcTemplate){ // F3 → calcItems[2] → {Object}
|
|
|
+ getItem: function (FName, template){ // F3 → calcItems[2] → {Object}
|
|
|
let idx = FName.slice(1) - 1;
|
|
|
- return calcTemplate.calcItems[idx];
|
|
|
+ return template.calcItems[idx];
|
|
|
},
|
|
|
isCycleCalc: function (expression, ID, template) { // 这里判断expression,是ID引用: @5+@6
|
|
|
if (expression.includes(`@${ID}`))
|
|
@@ -749,7 +749,7 @@ let analyzer = {
|
|
|
|
|
|
return false;
|
|
|
},
|
|
|
- isLegal: function (dispExpr, itemID, calcTemplate) { // 检测包括:无效字符、基数是否中括号、基数是否定义、行引用、循环计算
|
|
|
+ isLegal: function (dispExpr, itemID, template) { // 检测包括:无效字符、基数是否中括号、基数是否定义、行引用、循环计算
|
|
|
let me = analyzer;
|
|
|
let expr = me.standard(dispExpr);
|
|
|
let invalidChars = /[^0-9\u4e00-\u9fa5\+\-\*\/\(\)\.\[\]FL%]/g;
|
|
@@ -791,14 +791,14 @@ let analyzer = {
|
|
|
let arrF = me.getFArr(expr);
|
|
|
for (let F of arrF){
|
|
|
let num = F.slice(1);
|
|
|
- if (num > calcTemplate.calcItems.length){
|
|
|
+ if (num > template.calcItems.length){
|
|
|
alert('表达式中 “F'+ num +'” 行号引用错误!');
|
|
|
return false;
|
|
|
};
|
|
|
};
|
|
|
|
|
|
- let expression = me.getExpression(expr, calcTemplate);
|
|
|
- if (me.isCycleCalc(expression, itemID, calcTemplate)){
|
|
|
+ let expression = me.getExpression(expr, template);
|
|
|
+ if (me.isCycleCalc(expression, itemID, template)){
|
|
|
alert('表达式中有循环计算!');
|
|
|
return false;
|
|
|
}
|
|
@@ -835,11 +835,11 @@ let analyzer = {
|
|
|
};
|
|
|
return rst;
|
|
|
},
|
|
|
- getDispExpr: function (expression, calcTemplate) {
|
|
|
- return analyzer.refIDToLines(expression, calcTemplate);
|
|
|
+ getDispExpr: function (expression, template) {
|
|
|
+ return analyzer.refIDToLines(expression, template);
|
|
|
},
|
|
|
- getExpression: function (dispExpr, calcTemplate) {
|
|
|
- return analyzer.refLineToIDs(dispExpr, calcTemplate);
|
|
|
+ getExpression: function (dispExpr, template) {
|
|
|
+ return analyzer.refLineToIDs(dispExpr, template);
|
|
|
},
|
|
|
getDispExprUser: function (dispExpr, labourCoe) { // labourCoe 是 str 类型
|
|
|
let rst = analyzer.standard(dispExpr);
|
|
@@ -862,6 +862,60 @@ let analyzer = {
|
|
|
rst = rst.replace(/\]/g, "')");
|
|
|
rst = rst.replace(/L/g, labourCoe);
|
|
|
return rst;
|
|
|
+ },
|
|
|
+
|
|
|
+ calcItemMaxID: function(template){
|
|
|
+ let MaxID = 0;
|
|
|
+ for (let item of template.calcItems){
|
|
|
+ if (item.ID > MaxID)
|
|
|
+ MaxID = item.ID;
|
|
|
+ };
|
|
|
+ return MaxID;
|
|
|
+ },
|
|
|
+ calcItemIsUsed: function(template, calcItem){
|
|
|
+ let atID = '@' + calcItem.ID;
|
|
|
+ for (var i = 0; i < template.calcItems.length; i++) {
|
|
|
+ let item = template.calcItems[i];
|
|
|
+ let atIDArr = analyzer.getAtIDArr(item.expression);
|
|
|
+ if (atIDArr.indexOf(atID) >= 0){
|
|
|
+ calcItem.tempUsed = i;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ },
|
|
|
+ calcItemNew: function(template, idx){
|
|
|
+ let newItem = {};
|
|
|
+ newItem.ID = analyzer.calcItemMaxID(template) + 1;
|
|
|
+ newItem.statement = '用户自定义';
|
|
|
+ newItem.expression = '0';
|
|
|
+ template.calcItems.splice(idx + 1, 0, newItem);
|
|
|
+ projectObj.project.calcProgram.compileTemplate(template);
|
|
|
+ },
|
|
|
+ calcItemDelete: function(template, idx){
|
|
|
+ let item = template.calcItems[idx];
|
|
|
+ if (analyzer.calcItemIsUsed(template, item)){
|
|
|
+ alert(`第 ${idx + 1} 行“${item.name}”已被第 ${item.tempUsed + 1} 行引用,不允许删除!`);
|
|
|
+ delete item.tempUsed;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ template.calcItems.splice(idx, 1);
|
|
|
+ projectObj.project.calcProgram.compileTemplate(template);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ calcItemLabourCoe: function(calcItem){
|
|
|
+ let lc = 0;
|
|
|
+ if (calcItem.labourCoeID)
|
|
|
+ lc = projectObj.project.calcProgram.compiledLabourCoes[calcItem.labourCoeID].coe.toString();
|
|
|
+ return lc;
|
|
|
+ },
|
|
|
+ templateRefresh: function(template){
|
|
|
+ for (let item of template){
|
|
|
+ item.dispExpr = analyzer.getDispExpr(item.expression, template);
|
|
|
+ item.dispExprUser = analyzer.getDispExprUser(item.dispExpr, me.calcItemLabourCoe(item));
|
|
|
+ };
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -993,53 +1047,6 @@ class CalcProgram {
|
|
|
template.hasCompiled = false;
|
|
|
template.errs = [];
|
|
|
|
|
|
- /*let private_extract_ID = function(str, idx){
|
|
|
- let rst = '', lBracket = 0, rBracket = 0, firstIdx = idx, lastIdx = 0;
|
|
|
- for (let i = idx; i < str.length; i++) {
|
|
|
- if (str[i] === '(') {
|
|
|
- lBracket++;
|
|
|
- if (lBracket == 1) firstIdx = i + 1;
|
|
|
- }
|
|
|
- if (str[i] === ')') {
|
|
|
- rBracket++;
|
|
|
- if (lBracket == rBracket) {
|
|
|
- lastIdx = i - 1;
|
|
|
- if (lastIdx > firstIdx) {
|
|
|
- if (str[firstIdx] === "'") firstIdx++;
|
|
|
- if (str[lastIdx] !== "'") lastIdx++;
|
|
|
- if (lastIdx > firstIdx) {
|
|
|
- rst = str.slice(firstIdx, lastIdx);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return rst;
|
|
|
- };*/
|
|
|
- /*let private_parse_ref = function(item, itemIdx){
|
|
|
- let idx = item.expression.indexOf('@(', 0);
|
|
|
- while (idx >= 0) {
|
|
|
- let ID = private_extract_ID(item.expression, idx);
|
|
|
- if (ID.length > 0) {
|
|
|
- let subItem = template.compiledCalcItems[ID];
|
|
|
- if (subItem) {
|
|
|
- if (subItem.ID !== item.ID) {
|
|
|
- private_parse_ref(subItem, template.compiledCalcItems[ID + "_idx"]);
|
|
|
- } else {
|
|
|
- template.errs.push("There exists the self refer ID: " + ID);
|
|
|
- }
|
|
|
- } else {
|
|
|
- template.errs.push("There exists the invalid ID by which could not find the item: " + ID);
|
|
|
- console.log('invalid ID: ' + ID);
|
|
|
- }
|
|
|
- }
|
|
|
- idx = item.expression.indexOf('@(', idx + ID.length + 3);
|
|
|
- }
|
|
|
- if (template.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
- template.compiledSeq.push(itemIdx);
|
|
|
- }
|
|
|
- };*/
|
|
|
let private_extract_ID = function(str, idx){
|
|
|
let subStr = str.slice(idx);
|
|
|
let patt = new RegExp(/@\d+/);
|
|
@@ -1075,7 +1082,7 @@ class CalcProgram {
|
|
|
for (let idx of template.compiledSeq) {
|
|
|
let item = template.calcItems[idx];
|
|
|
|
|
|
- let lc = me.getLabourCoe(item);
|
|
|
+ let lc = analyzer.calcItemLabourCoe(item);
|
|
|
// 用于界面显示。disExpr是公式模板,不允许修改:人工系数占位符被修改后变成数值,第二次无法正确替换。
|
|
|
item.dispExprUser = analyzer.getDispExprUser(item.dispExpr, lc);
|
|
|
if (item.expression == 'HJ')
|
|
@@ -1125,22 +1132,6 @@ class CalcProgram {
|
|
|
}
|
|
|
};
|
|
|
};
|
|
|
-
|
|
|
- refreshTemplate(template){
|
|
|
- let me = this;
|
|
|
- for (let item of template){
|
|
|
- item.dispExpr = analyzer.getDispExpr(item.expression, template);
|
|
|
- item.dispExprUser = analyzer.getDispExprUser(item.dispExpr, me.getLabourCoe(item));
|
|
|
- };
|
|
|
- };
|
|
|
-
|
|
|
- getLabourCoe(calcItem){
|
|
|
- let me = this;
|
|
|
- let lc = 0;
|
|
|
- if (calcItem.labourCoeID)
|
|
|
- lc = me.compiledLabourCoes[calcItem.labourCoeID].coe.toString();
|
|
|
- return lc;
|
|
|
- };
|
|
|
|
|
|
// 存储、刷新零散的多个结点。
|
|
|
saveNodes(treeNodes, callback){
|