|
@@ -563,6 +563,42 @@ let analyzer = {
|
|
|
str = str.replace(/f/g, "F"); // f换成F
|
|
|
return str;
|
|
|
},
|
|
|
+ getFArr: function (expr) {
|
|
|
+ let pattF = new RegExp(/F\d+/gi);
|
|
|
+ let arrF = expr.match(pattF);
|
|
|
+ return arrF ? arrF : [];
|
|
|
+ },
|
|
|
+ getAtIDArr: function (expr) {
|
|
|
+ let patt = new RegExp(/@\d+/gi);
|
|
|
+ let arr = expr.match(patt);
|
|
|
+ return arr ? arr : [];
|
|
|
+ },
|
|
|
+ getFID: function (FName) { // F3、F22
|
|
|
+ let me = this;
|
|
|
+ let idx = FName.slice(1) - 1;
|
|
|
+ let id = me.calcTemplate.calcItems[idx] ? me.calcTemplate.calcItems[idx].ID : null;
|
|
|
+ return id;
|
|
|
+ },
|
|
|
+ getFItem: function (FName){
|
|
|
+ let me = this;
|
|
|
+ let idx = FName.slice(1) - 1;
|
|
|
+ return me.calcTemplate.calcItems[idx];
|
|
|
+ },
|
|
|
+ isCycleCalc: function (expr) { // @5+@6 这里已经是ID引用
|
|
|
+ let me = this;
|
|
|
+
|
|
|
+ function checkCycle() {
|
|
|
+
|
|
|
+ }
|
|
|
+ let atIDArr = me.getAtIDArr(expr);
|
|
|
+ for (let atID of atIDArr){
|
|
|
+ let ID = atID.slice(1);
|
|
|
+ let item = me.calcTemplate.compiledCalcItems[ID];
|
|
|
+ let expression = item.expression;
|
|
|
+ if (expression.includes(atID)) return false;
|
|
|
+
|
|
|
+ };
|
|
|
+ },
|
|
|
isLegal: function (expr) {
|
|
|
let me = this;
|
|
|
let stdExpr = me.standard(expr);
|
|
@@ -590,20 +626,25 @@ let analyzer = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- let pattF = new RegExp(/F\d+/gi);
|
|
|
- let arrF = s.match(pattF);
|
|
|
+ // 行引用检测、行引用转ID引用
|
|
|
+ let arrF = me.getFArr(stdExpr);
|
|
|
for (let F of arrF){
|
|
|
let num = F.slice(1);
|
|
|
if (num > me.calcTemplate.calcItems.length){
|
|
|
- alert('表达式中 “F'+ num +'” 引用行号无效!');
|
|
|
+ alert('表达式中 “F'+ num +'” 行号引用错误!');
|
|
|
return false;
|
|
|
};
|
|
|
- let id = me.calcTemplate.calcItems[num - 1].ID;
|
|
|
+ let id = me.getFID(F);
|
|
|
+ let fn = new RegExp(F, "g");
|
|
|
+ stdExpr = stdExpr.replace(fn, '@' + id);
|
|
|
};
|
|
|
|
|
|
// 循环计算
|
|
|
+ if (me.isCycleCalc(stdExpr)){
|
|
|
+ alert('表达式中有循环计算!');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
},
|
|
|
-
|
|
|
analyzeCalcBase: function(expr){
|
|
|
// 前提:必须无空格、无特殊符号
|
|
|
function getCalcBase(expr){
|
|
@@ -1362,11 +1403,8 @@ class CalcProgram {
|
|
|
};
|
|
|
|
|
|
// 排除指定项的综合合价计算(用于带循环计算的情况)
|
|
|
- getTotalFee(excludeNodes){
|
|
|
- excludeNodes.push(calcTools.getNodeByFlag(fixedFlag.ENGINEERINGCOST));
|
|
|
- let me = this;
|
|
|
+ getTotalFee(baseNodes, excludeNodes){
|
|
|
let rst = 0;
|
|
|
-
|
|
|
function calcNodes(nodes) {
|
|
|
for (let node of nodes) {
|
|
|
if (!excludeNodes.includes(node)){
|
|
@@ -1381,8 +1419,17 @@ class CalcProgram {
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
- calcNodes(me.project.mainTree.roots);
|
|
|
+ calcNodes(baseNodes);
|
|
|
return rst;
|
|
|
};
|
|
|
+
|
|
|
+ // 税前工程造价
|
|
|
+ getBeforeTaxTotalFee(excludeNodes){
|
|
|
+ let baseNodes = [], me = this;
|
|
|
+ baseNodes.push(calcTools.getNodeByFlag(fixedFlag.SUB_ENGINERRING));
|
|
|
+ baseNodes.push(calcTools.getNodeByFlag(fixedFlag.MEASURE));
|
|
|
+ baseNodes.push(calcTools.getNodeByFlag(fixedFlag.OTHER));
|
|
|
+ baseNodes.push(calcTools.getNodeByFlag(fixedFlag.CHARGE));
|
|
|
+ return me.getTotalFee(baseNodes, excludeNodes);
|
|
|
+ };
|
|
|
};
|