Browse Source

Merge branch 'master' into olym

olym 7 years ago
parent
commit
a5647700b8

+ 226 - 68
web/building_saas/main/js/models/calc_base.js

@@ -51,6 +51,9 @@ let cbTools = {
     isNum: function (v) {
         return this.isDef(v) && !isNaN(v) && v !== Infinity;
     },
+    isFlag: function (v) {
+        return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed);
+    },
     returnV: function (v, r) {
         if(this.isDef(v)){
             return v;
@@ -72,12 +75,25 @@ let cbTools = {
             if(this.isDef(bills[i].flagsIndex.fixed)){
                 for(let flag in fixedFlag){
                     if(fixedFlag[flag] === bills[i].flagsIndex.fixed.flag){
-                        billsObj[fixedFlag[flag]] = bills[i];
+                        billsObj[fixedFlag[flag]] = Object.create(null);
+                        billsObj[fixedFlag[flag]]['base']  = Object.create(null);
+                        billsObj[fixedFlag[flag]]['bill']  = bills[i];
                     }
                 }
             }
         }
     },
+    //清单基数设置所属固定清单属性
+    setBaseBills: function (baseFigure, fixedBills) {
+        for(let i in baseFigure){
+            let calcBase = baseFigure[i];
+            calcBase.fixedBill = null;
+            if(cbTools.isDef(fixedBills[calcBase.fixedFlag])){
+                fixedBills[calcBase.fixedFlag]['base'][i] = calcBase;
+                calcBase.fixedBill = fixedBills[calcBase.fixedFlag];
+            }
+        }
+    },
     //生成清单基数计算分类模板
     setBaseFigureClass: function (baseFigures, mapObj) {
         mapObj['CONSTRUCTION_ORGANIZATION'] = Object.create(null);
@@ -87,68 +103,169 @@ let cbTools = {
         mapObj['OTHERS'] = Object.create(null);
         let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ'];
         for(let figure in baseFigures){
-            if(filter.indexOf(baseFigures[figure]) === -1){
+            if(filter.indexOf(baseFigures[figure]['base']) === -1){
                 mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure] !== 'QTXMF'){
+            if(baseFigures[figure]['base'] !== 'QTXMF'){
                 mapObj['OTHER'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure] !== 'GF'){
+            if(baseFigures[figure]['base'] !== 'GF'){
                 mapObj['CHARGE'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure] !== 'SJ'){
+            if(baseFigures[figure]['base'] !== 'SJ'){
                 mapObj['TAX'][figure] = baseFigures[figure];
             }
             mapObj['OTHERS'][figure] = baseFigures[figure];
         }
+    },
+    getFigure: function (node) {
+        let calcBase = projectObj.project.calcBase;
+        let parent = node.parent;
+        if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
+            || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
+            //node.data.baseFigureClass = null;
+            return null;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
+            //node.data.baseFigureClass = 'CONSTRUCTION_ORGANIZATION';
+            return calcBase.baseFigureClass.CONSTRUCTION_ORGANIZATION;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.OTHER){
+            //node.data.baseFigureClass = 'OTHER';
+            return calcBase.baseFigureClass.OTHER;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CHARGE){
+            //node.data.baseFigureClass = 'CHARGE';
+            return calcBase.baseFigureClass.CHARGE;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.TAX){
+            //node.data.baseFigureClass = 'TAX';
+            return calcBase.baseFigureClass.TAX;
+        }
+        else {
+            if(!parent){
+                //node.data.baseFigureClass = 'OTHERS';
+                return calcBase.baseFigureClass.OTHERS;
+            }
+            else {
+                return this.getFigure(parent);
+            }
+        }
+    },
+    getBaseBill: function (node) {
+        let calcBase = projectObj.project.calcBase;
+        let parent = node.parent;
+        if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
+            || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.OTHER){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CHARGE){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.TAX){
+            return node;
+        }
+        else {
+            if(!parent){
+                return node;
+            }
+            else {
+                return this.getBaseBill(parent);
+            }
+        }
+    },
+    //获取清单(有基数计算)引用了的其他清单,(循环引用栈中的一块)
+    getStackBlock: function (billID) {
+        let tempBases = [], block = [];//存引用的清单ID
+        let node = getBill(billID);
+        if(!node){
+            return tempBases;
+        }
+        else {
+            getBase(node);
+            let bases = Array.from(new Set(tempBases));
+            for(let i = 0, len = bases.length; i < len; i++){
+                if(cbTools.isDef(calcBase.baseFigures[bases[i]])){
+                    block.push(calcBase.baseFigures[bases[i]]['fixedBill']['bill']['ID']);
+                }
+            }
+            return Array.from(new Set(block));
+        }
+        function getBase(node){
+            if(node && node.children.length === 0){
+                if(cbTools.isDef(node.data.calcBase)){
+                    let figures = cbParser.getFigure(node.data.calcBase);
+                    tempBases = tempBases.concat(figures);
+                }
+            }
+            else if(node && node.children.length > 0) {
+                for(let i = 0, len = node.children.length; i < len; i++){
+                    getBase(node.children[i]);
+                }
+            }
+        }
+        function getBill(ID){
+            for(let i = 0, len = calcBase.project.mainTree.items.length; i < len; i++){
+                if(calcBase.project.mainTree.items[i].data.ID === ID && calcBase.project.mainTree.items[i].sourceType === calcBase.project.Bills.getSourceType()){
+                    return calcBase.project.mainTree.items[i];
+                }
+            }
+            return null;
+        }
     }
 };
 
 let baseFigureTemplate = {
     'FBFXGCF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'FBFXDEJJRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.labour.totalFee || 0;
     },
     'FBFXDEJJCLF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.material.totalFee || 0;
     },
     'FBFXDEJJJXF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.machine.totalFee || 0;
     },
     'FBFXTZRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustLabour.totalFee || 0;
     },
     'FBFXTZJSRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustMachineLabour.totalFee || 0;
     },
     'FBFXZCF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.mainMaterial.totalFee || 0;
     },
     'FBFXSBF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.mainMaterial.totalFee || 0;
@@ -163,13 +280,13 @@ let baseFigureTemplate = {
         return this['FBFXDEJJRGF']() + this['FBFXDEJJCLF']() + this['FBFXDEJJJXF']();
     },
     'CSXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.MEASURE];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.MEASURE]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'ZZCSXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
@@ -178,61 +295,61 @@ let baseFigureTemplate = {
         return this['ZZCSXMDEJJRGF']() + this['ZZCSXMDEJJCLF']() + this['ZZCSXMDEJJJXF']()
     },
     'ZZCSXMDEJJRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.labour.totalFee || 0;
     },
     'ZZCSXMDEJJCLF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.material.totalFee || 0;
     },
     'ZZCSXMDEJJJXF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.machine.totalFee || 0;
     },
     'JSCSXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'JSCSXMDEJJRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.labour.totalFee || 0;
     },
     'JSCSXMDEJJCLF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.material.totalFee || 0;
     },
     'JSCSXMDEJJJXF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.machine.totalFee || 0;
     },
     'JSCSXMTZRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustLabour.totalFee || 0;
     },
     'JSCSXMTZJSRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustMachineLabour.totalFee || 0;
     },
     'JSCSXMZCF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.mainMaterial.totalFee || 0;
@@ -250,19 +367,19 @@ let baseFigureTemplate = {
         return this['JSCSXMDEJJRGF']() + this['JSCSXMDEJJCLF']() + this['JSCSXMDEJJJXF']();
     },
     'QTXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.OTHER];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.OTHER]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'GF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CHARGE];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CHARGE]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'SJ': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.TAX];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.TAX]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
@@ -270,37 +387,37 @@ let baseFigureTemplate = {
 };
 
 let baseFigureMap = {
-    '分部分项工程费': 'FBFXGCF',
-    '分部分项定额基价人工费': 'FBFXDEJJRGF',
-    '分部分项定额基价材料费': 'FBFXDEJJCLF',
-    '分部分项定额基价机械费': 'FBFXDEJJJXF',
-    '分部分项调整人工费': 'FBFXTZRGF',
-    '分部分项调整机上人工费': 'FBFXTZJSRGF',
-    '分部分项主材费': 'FBFXZCF',
-    '分部分项设备费': 'FBFXSBF',
-    '分部分项未计价材料费': 'FBFXWJJCLF',
-    '分部分项人工工日': 'FBFXRGGR',
-    '分部分项工程量清单中的基价直接工程费': 'FBFXGCLQDJJZJGCF',
-    '措施项目费': 'CSXMF',
-    '组织措施项目费': 'ZZCSXMF',
-    '组织措施项目定额基价直接工程费': 'ZZCSXMDEJJZJGCF',
-    '组织措施项目定额基价人工费': 'ZZCSXMDEJJRGF',
-    '组织措施项目定额基价材料费': 'ZZCSXMDEJJCLF',
-    '组织措施项目定额基价机械费': 'ZZCSXMDEJJJXF',
-    '技术措施项目费': 'JSCSXMF',
-    '技术措施项目定额基价人工费': 'JSCSXMDEJJRGF',
-    '技术措施项目定额基价材料费': 'JSCSXMDEJJCLF',
-    '技术措施项目定额基价机械费': 'JSCSXMDEJJJXF',
-    '技术措施项目调整人工费': 'JSCSXMTZRGF',
-    '技术措施项目调整机上人工费': 'JSCSXMTZJSRGF',
-    '技术措施项目主材费': 'JSCSXMZCF',
-    '技术措施项目设备费': 'JSCSXMSBF',
-    '技术措施项目未计价材料费': 'JSCSXMWJJCLF',
-    '技术措施项目人工工日': 'JSCSXMRGGR',
-    '技术措施项目清单中的定额基价直接工程费': 'JSCSXMQDDEJJZJGCF',
-    '其他项目费': 'QTXMF',
-    '规费': 'GF',
-    '税金': 'SJ'
+    '分部分项工程费': {base: 'FBFXGCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项定额基价人工费': {base: 'FBFXDEJJRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项定额基价材料费': {base: 'FBFXDEJJCLF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项定额基价机械费': {base: 'FBFXDEJJJXF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项调整人工费': {base: 'FBFXTZRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项调整机上人工费': {base: 'FBFXTZJSRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项主材费': {base: 'FBFXZCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项设备费': {base: 'FBFXSBF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项未计价材料费': {base: 'FBFXWJJCLF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项人工工日': {base: 'FBFXRGGR', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项工程量清单中的基价直接工程费': {base: 'FBFXGCLQDJJZJGCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '措施项目费': {base: 'CSXMF', fixedFlag: fixedFlag.MEASURE},
+    '组织措施项目费': {base: 'ZZCSXMF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价直接工程费': {base: 'ZZCSXMDEJJZJGCF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价人工费': {base: 'ZZCSXMDEJJRGF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价材料费': {base: 'ZZCSXMDEJJCLF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价机械费': {base: 'ZZCSXMDEJJJXF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '技术措施项目费': {base: 'JSCSXMF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目定额基价人工费': {base: 'JSCSXMDEJJRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目定额基价材料费': {base: 'JSCSXMDEJJCLF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目定额基价机械费': {base: 'JSCSXMDEJJJXF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目调整人工费': {base: 'JSCSXMTZRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目调整机上人工费': {base: 'JSCSXMTZJSRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目主材费': {base: 'JSCSXMZCF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目设备费': {base: 'JSCSXMSBF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目未计价材料费': {base: 'JSCSXMWJJCLF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目人工工日': {base: 'JSCSXMRGGR', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目清单中的定额基价直接工程费': {base: 'JSCSXMQDDEJJZJGCF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '其他项目费': {base: 'QTXMF',  fixedFlag: fixedFlag.OTHER},
+    '规费': {base: 'GF', fixedFlag: fixedFlag.CHARGE},
+    '税金': {base: 'SJ', fixedFlag: fixedFlag.TAX}
 };
 
 //输入式分析器
@@ -329,18 +446,55 @@ let cbAnalyzer = {
         }
         return true;
     },
+    //循环计算
+    cycleCalc: function (node, baseFigures, exp) {
+        let stack = [];
+        if(node.sourceType !== calcBase.project.Bills.getSourceType()){
+            return false;
+        }
+        let sbillID = cbTools.getBaseBill(node).data.ID;
+        let expFigures = cbParser.getFigure(exp);
+        for(let i = 0, len = expFigures.length; i < len; i++){
+            let figure = expFigures[i];
+            if(cbTools.isDef(baseFigures[figure])){
+                let bill = baseFigures[figure]['fixedBill']['bill'];
+                if(checkStack(getRefStack([bill.ID]), sbillID)){
+                    console.log('循环计算');
+                    return true;
+                }
+            }
+        }
+        return false;
+        function checkStack(stack, startBillID){
+            //引用栈发现了初始引用
+            return stack.indexOf(startBillID) !== -1;
+        }
+        function getRefStack(billIDs){
+            stack = Array.from(new Set(stack.concat(billIDs)));
+            for(let i = 0, len = billIDs.length; i < len; i++){
+                let block = cbTools.getStackBlock(billIDs[i]);
+                if(block.length > 0){
+                    stack = Array.from(new Set(stack.concat(block)));
+                    getRefStack(block);
+                }
+            }
+            return stack;
+        }
+    },
     //四则运算合法性,前端控制不允许重复出现运算符,这里主要判断()的使用问题,这里再判断一次
     arithmeticLeagl: function (exp) {
         let ilegalRex = /[\+,\-,\*,\/]{2}/g;
         return !ilegalRex.test(exp);
     },
     //
-    legalExp: function (exp) {
-        exp = this.standar(exp);
+    legalExp: function (node) {
+        let exp = this.standar(node.data.userCalcBase);
         if(this.inputLegal(exp)){
-            if(this.baseLegal(calcBase.baseFigures, exp)){
-                if(this.arithmeticLeagl(exp)){
-                    return exp;
+            if(this.baseLegal(cbTools.getFigure(node), exp)){
+                if(!this.cycleCalc(node, cbTools.getFigure(node), exp)){
+                    if(this.arithmeticLeagl(exp)){
+                        return exp;
+                    }
                 }
             }
             return null;
@@ -390,7 +544,7 @@ let cbParser = {
 let cbCalctor = {
     //计算基数
     base: function (figure) {
-        return baseFigureTemplate[calcBase.baseFigures[figure]]();
+        return baseFigureTemplate[calcBase.baseFigures[figure]['base']]();
     },
     //计算
     exec: function () {
@@ -414,13 +568,17 @@ let calcBase = {
         me.fixedFlag = fixedFlag;
         cbTools.setFixedBills(project, me.fixedBills, me.fixedFlag);
         me.baseFigures = baseFigureMap;
+        cbTools.setBaseBills(me.baseFigures, me.fixedBills);
         //me.baseFigures.fixedBills = me.fixedBills;
         cbTools.setBaseFigureClass(me.baseFigures, me.baseFigureClass);
     },
     getBase: function (figure) {
-       return  cbCalctor.base(figure);
+       return cbCalctor.base(figure);
 
     },
+    getBaseByClass: function (node) {
+        return cbTools.getFigure(node);
+    },
     calculate: function (node) {
         let me = calcBase,
             $CBA = cbAnalyzer,
@@ -429,7 +587,7 @@ let calcBase = {
         try {
             me.success = false;
             //分析输入式合法性
-            let exp = $CBA.legalExp(node.data.userCalcBase);
+            let exp = $CBA.legalExp(node);
             if(!exp){
                 throw '表达式不正确';
             }
@@ -449,7 +607,7 @@ let calcBase = {
             me.project.calcProgram.saveNode(node);
         }
         catch (err){
-            alert('表达式不正确');
+            alert(err);
         }
     },
 };

+ 1 - 30
web/building_saas/main/js/views/calc_base_view.js

@@ -118,35 +118,6 @@ let calcBaseView = {
     canBase: function (node) {
         return node.sourceType === projectObj.project.Bills.getSourceType() && node.children.length === 0;
     },
-    //根据节点获取可用计算基数
-    getFigure: function (node) {
-        let calcBase = projectObj.project.calcBase;
-        let parent = node.parent;
-        if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
-            || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
-            return null;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
-            return calcBase.baseFigureClass.CONSTRUCTION_ORGANIZATION;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.OTHER){
-            return calcBase.baseFigureClass.OTHER;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CHARGE){
-            return calcBase.baseFigureClass.CHARGE;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.TAX){
-            return calcBase.baseFigureClass.TAX;
-        }
-        else {
-            if(!parent){
-                return calcBase.baseFigureClass.OTHERS;
-            }
-            else {
-                return this.getFigure(parent);
-            }
-        }
-    },
     //计算基数转换为显示数据Obj to Array
     toViewData: function (obj) {
         let rst = [];
@@ -166,7 +137,7 @@ let calcBaseView = {
             me.inputExpr.val(node.data.calcBase);
         }
         me.buildSheet();
-        let baseObj = me.getFigure(node);
+        let baseObj = projectObj.project.calcBase.getBaseByClass(node);
         me.showData(me.toViewData(baseObj));
 
     },

+ 2 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -70,7 +70,8 @@ let MainTreeCol = {
                     return this.calcBaseType(parent);
                 }
             }
-        },        bills: function (node) {
+        },
+        bills: function (node) {
             return node.sourceType === projectObj.project.Bills.getSourceType();
         },
         ration: function (node) {