فهرست منبع

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhangweicheng 7 سال پیش
والد
کامیت
9da0c283f4

+ 3 - 3
modules/bills_lib/models/bills_lib_schemas.js

@@ -37,9 +37,9 @@ let itemsSchema = mongoose.Schema({
     {versionKey: false});
 
 let billsSchema = mongoose.Schema({
-        ID: Number,
-        ParentID: Number,
-        NextSiblingID: Number,
+        ID: String,
+        ParentID: String,
+        NextSiblingID: String,
         code: String,
         name: String,
         unit: String,

+ 8 - 8
public/web/id_tree.js

@@ -422,7 +422,7 @@ var idTree = {
             }
         })();
         Tree.prototype.newNodeID = function () {
-            if (this.rangeNodeID() === -1) {
+            if (this.rangeNodeID() == -1) {
                 return this.maxNodeID() + 1;
             } else {
                 if (this.maxNodeID() < this.rangeNodeID()) {
@@ -460,7 +460,7 @@ var idTree = {
             // set parent by pid, set nextSibling by nid
             datas.forEach(function (data) {
                 node = that.nodes[prefix + data[that.setting.id]];
-                if (data[that.setting.pid] === that.setting.rootId) {
+                if (data[that.setting.pid] == that.setting.rootId) {
                     that.roots.push(node);
                 } else {
                     parent = that.nodes[prefix + data[that.setting.pid]];
@@ -500,8 +500,8 @@ var idTree = {
 
         Tree.prototype.insert = function (parentID, nextSiblingID) {
             var newID = this.newNodeID(), node = null, data = {};
-            var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID === -1 ? null: this.nodes[this.prefix + nextSiblingID];
+            var parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
+            var nextSibling = nextSiblingID == -1 ? null: this.nodes[this.prefix + nextSiblingID];
             if (newID !== -1) {
                 data = {};
                 data[this.setting.id] = newID;
@@ -522,8 +522,8 @@ var idTree = {
         Tree.prototype.getInsertData = function (parentID, nextSiblingID, uid = null) {
             var data = [];
             var newID = uid ? uuid.v1() : this.newNodeID();
-            var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID === -1 ? null: this.nodes[this.prefix + nextSiblingID];
+            var parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
+            var nextSibling = nextSiblingID == -1 ? null: this.nodes[this.prefix + nextSiblingID];
             if (newID != -1) {
                 data.push({type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, nextSibling ? nextSibling.getID() : this.setting.rootId)});
 
@@ -538,8 +538,8 @@ var idTree = {
             return data;
         };
         Tree.prototype.insertByData = function (data, parentID, nextSiblingID, uid = null) {
-            var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID === -1 ? null : this.nodes[this.prefix + nextSiblingID];
+            var parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
+            var nextSibling = nextSiblingID == -1 ? null : this.nodes[this.prefix + nextSiblingID];
             var node = this.nodes[this.prefix + data[this.setting.id]];
             if (node) {
                 return node;

+ 78 - 26
web/building_saas/main/js/models/calc_program.js

@@ -412,13 +412,13 @@ let executeObj = {
     HJ: function () {
         let me = this;
         let p = me.treeNode.data.calcBaseValue ? me.treeNode.data.calcBaseValue : 0;
-        let q = treeNodeTools.uiQuantity(me.treeNode) ? treeNodeTools.uiQuantity(me.treeNode) : 1;
+        let q = nodeTools.uiQuantity(me.treeNode) ? nodeTools.uiQuantity(me.treeNode) : 1;
         let u = (p / q).toDecimal(decimalObj.decimal('unitPrice', me.treeNode));
         return u;
     }
 };
 
-let treeNodeTools = {
+let nodeTools = {
     isBill: function(treeNode){
         return treeNode.sourceType === ModuleNames.bills;
     },
@@ -530,6 +530,24 @@ let treeNodeTools = {
     },
     uiQuantity(treeNode){
         return parseFloatPlus(treeNode.data.quantity).toDecimal(decimalObj.decimal("quantity", treeNode));
+    },
+
+    getFee(treeNode, fieldName) {    // fieldName: 'common.totalFee'、'equipment.unitFee'
+        let ns = fieldName.split(".");
+        if (ns.length != 2)
+            return 0
+        else if (treeNode.data.feesIndex[ns[0]] && treeNode.data.feesIndex[ns[0]][ns[1]])
+            return parseFloat(treeNode.data.feesIndex[ns[0]][ns[1]])
+        else
+            return 0;
+    },
+    getNodeByFlag(flag) {
+         let bill = cbTools.findBill(flag);
+         if (bill) return this.getNodeByID(bill.ID)
+         else return null;
+    },
+    getNodeByID(ID){
+        return cbTools.getNodeByID(ID);
     }
 };
 
@@ -791,7 +809,7 @@ class CalcProgram {
         // 仅用作树节点显示的工料机不能参与计算。
         if (treeNode.sourceType === me.project.ration_glj.getSourceType()) return;
 
-        treeNode.calcType = treeNodeTools.getCalcType(treeNode);
+        treeNode.calcType = nodeTools.getCalcType(treeNode);
         // if (treeNode.calcType == treeNodeCalcType.ctCalcBaseValue) return;
 
         function isBaseFeeType(type){
@@ -802,10 +820,10 @@ class CalcProgram {
         function calcEstimateFee(treeNode){
             let sumU = 0, sumT = 0;
 
-            if (treeNodeTools.isTotalCostBill(treeNode)){
+            if (nodeTools.isTotalCostBill(treeNode)){
                 let nodes = projectObj.project.mainTree.roots;
                 for (let node of nodes){
-                    if (treeNodeTools.isTotalCostBill(node)) break;
+                    if (nodeTools.isTotalCostBill(node)) break;
                     let eU = 0, eT = 0;
                     if (node.data.feesIndex && node.data.feesIndex.estimate){
                         eU = node.data.feesIndex.estimate.unitFee;
@@ -865,14 +883,14 @@ class CalcProgram {
                 };
                 sumU = sumU.toDecimal(decimalObj.bills.unitPrice);
                 if (projectObj.project.property.zanguCalcMode == zanguCalcType.common){
-                    sumT = (treeNodeTools.uiQuantity(treeNode) * sumU).toDecimal(decimalObj.bills.totalPrice);
+                    sumT = (nodeTools.uiQuantity(treeNode) * sumU).toDecimal(decimalObj.bills.totalPrice);
                 }
                 else if (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial){
                     sumT = sumT.toDecimal(decimalObj.bills.totalPrice);
                 };
             };
 
-            treeNodeTools.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
+            nodeTools.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
         };
 
         // 删掉多余的费用。例如:从其它计算方式切换到公式计算方式,会多出其它的费(不光是common)
@@ -888,7 +906,7 @@ class CalcProgram {
                 }
             }
             else{   // 总造价清单只留common, estimate两个费用类别。其它公式清单只留common。
-                let reserveArr = treeNodeTools.isTotalCostBill(treeNode)? ['common', 'estimate']:['common'];
+                let reserveArr = nodeTools.isTotalCostBill(treeNode)? ['common', 'estimate']:['common'];
                 if (treeNode.data.fees && treeNode.data.fees.length > 0){
                     let feesArr = treeNode.data.fees;
                     for (let i = 0; i < feesArr.length; i++) {
@@ -905,7 +923,7 @@ class CalcProgram {
         // 父清单汇总子项(子清单或定额)的费用类别
         if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees || treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){
             treeNode.data.programID = null;
-            treeNodeTools.initFees(treeNode);
+            nodeTools.initFees(treeNode);
             let nodes = (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees) ? treeNode.children : me.project.Ration.getRationNodes(treeNode);
             let rst = [];
             for (let ft of cpFeeTypes) {
@@ -926,9 +944,9 @@ class CalcProgram {
                 }
                 else if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){     // 这里的算法要配合冷姐姐的神图才能看懂^_^
                     let sum_rtf = 0, sum_rttf = 0;
-                    let bq = treeNodeTools.uiQuantity(treeNode) ? treeNodeTools.uiQuantity(treeNode) : 1;
+                    let bq = nodeTools.uiQuantity(treeNode) ? nodeTools.uiQuantity(treeNode) : 1;
                     for (let node of nodes) {
-                        let rq = treeNodeTools.uiQuantity(node) ? treeNodeTools.uiQuantity(node) : 0;
+                        let rq = nodeTools.uiQuantity(node) ? nodeTools.uiQuantity(node) : 0;
                         let ruf = 0, rtuf = 0, rtf = 0, rttf = 0;
                         if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
                             ruf = parseFloat(node.data.feesIndex[ft.type].unitFee);
@@ -964,7 +982,7 @@ class CalcProgram {
                 ftObj.totalFee = btf.toDecimal(decimalObj.bills.totalPrice);
                 ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
                 ftObj.tenderTotalFee = bttf.toDecimal(decimalObj.bills.totalPrice);
-                treeNodeTools.checkFeeField(treeNode, ftObj);
+                nodeTools.checkFeeField(treeNode, ftObj);
 
                 rst.push(ftObj);
             };
@@ -1007,26 +1025,24 @@ class CalcProgram {
             }
 
             let f = treeNode.data.feeRate ? treeNode.data.feeRate : 100;
-            let q = treeNodeTools.uiQuantity(treeNode) ? treeNodeTools.uiQuantity(treeNode) : 1;
+            let q = nodeTools.uiQuantity(treeNode) ? nodeTools.uiQuantity(treeNode) : 1;
             let b = treeNode.data.calcBaseValue ? treeNode.data.calcBaseValue : 0;
             let uf = (b * f * q / 100).toDecimal(decimalObj.bills.unitPrice);
             let tuf = uf;
             let tf = (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice) ? (b * f / 100).toDecimal(decimalObj.bills.totalPrice) : (uf * q).toDecimal(decimalObj.bills.totalPrice);
             let ttf = tf;
             deleteUselessFees(treeNode);
-            treeNodeTools.checkFeeField(treeNode, {'fieldName': 'common', 'unitFee': uf, 'totalFee': tf});
+            nodeTools.checkFeeField(treeNode, {'fieldName': 'common', 'unitFee': uf, 'totalFee': tf});
 
             // 总造价清单还要做单项工程、建设项目的四大项金额汇总
-            if (treeNodeTools.isTotalCostBill(treeNode)){
+            if (nodeTools.isTotalCostBill(treeNode)){
                 // 公式叶子清单没有暂估费,但总造价清单除外。
                 calcEstimateFee(treeNode);
-                treeNodeTools.initSummaryFee(treeNode);
+                nodeTools.initSummaryFee(treeNode);
                 treeNode.data.summaryFees.totalFee = tf;
-                treeNode.data.summaryFees.estimateFee = (treeNode.data.feesIndex && treeNode.data.feesIndex.estimate) ? treeNode.data.feesIndex.estimate.totalFee:0;
-                let bill_safe = cbTools.findBill(fixedFlag.SAFETY_CONSTRUCTION);
-                treeNode.data.summaryFees.safetyFee = (bill_safe && bill_safe.feesIndex && bill_safe.feesIndex.common)?bill_safe.feesIndex.common.totalFee:0;
-                let bill_charge = cbTools.findBill(fixedFlag.CHARGE);
-                treeNode.data.summaryFees.chargeFee = (bill_charge && bill_charge.feesIndex && bill_charge.feesIndex.common)?bill_charge.feesIndex.common.totalFee:0;
+                treeNode.data.summaryFees.estimateFee = nodeTools.getFee(treeNode, 'estimate.totalFee');
+                treeNode.data.summaryFees.safetyFee = nodeTools.getFee(nodeTools.getNodeByFlag(fixedFlag.SAFETY_CONSTRUCTION), 'common.totalFee');
+                treeNode.data.summaryFees.chargeFee = nodeTools.getFee(nodeTools.getNodeByFlag(fixedFlag.CHARGE), 'common.totalFee');
             }
 
             treeNode.data.calcTemplate = {"calcItems": []};
@@ -1038,7 +1054,7 @@ class CalcProgram {
                 if (treeNode.data.type == rationType.volumePrice){
                     delete treeNode.data.gljList;
                     let muf = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
-                    let q = treeNodeTools.uiQuantity(treeNode) ? treeNodeTools.uiQuantity(treeNode) : 0;
+                    let q = nodeTools.uiQuantity(treeNode) ? nodeTools.uiQuantity(treeNode) : 0;
                     treeNode.data.marketTotalFee = (muf * q).toDecimal(decimalObj.ration.totalPrice);
                 }
                 else if (treeNode.data.type == rationType.gljRation){
@@ -1077,19 +1093,19 @@ class CalcProgram {
                 $CE.template = template;
                 $CE.calcBase = me.compiledCalcBases;
 
-                treeNodeTools.initFees(treeNode);
+                nodeTools.initFees(treeNode);
 
                 for (let idx of template.compiledSeq) {
                     let calcItem = template.calcItems[idx];
                     let feeRate = parseFloatPlus(calcItem.feeRate) ? parseFloatPlus(calcItem.feeRate).toDecimal(decimalObj.feeRate) : 100;  // 100%
                     calcItem.unitFee = (eval(calcItem.compiledExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));   // 如果eval()对清单树有影响,就换成小麦的Expression对象再试
 
-                    let q = treeNodeTools.uiQuantity(treeNode) ? treeNodeTools.uiQuantity(treeNode) : 0;
+                    let q = nodeTools.uiQuantity(treeNode) ? nodeTools.uiQuantity(treeNode) : 0;
                     calcItem.totalFee = (calcItem.unitFee * q).toDecimal(decimalObj.decimal('totalPrice', treeNode));
 
                     if (calcItem.fieldName) {
                         fnArr.push(calcItem.fieldName);
-                        treeNodeTools.checkFeeField(treeNode, calcItem);
+                        nodeTools.checkFeeField(treeNode, calcItem);
                     };
                 };
                 deleteUselessFees(treeNode, fnArr);
@@ -1179,7 +1195,7 @@ class CalcProgram {
     // 计算叶子清单下的所有子结点、自身、所有父结点、公式引用结点(即跟该叶子清单相关的所有结点)。最后打包存储。
     calcLeafAndSave(treeNode){
         let me = this;
-        if(!treeNodeTools.isLeafBill(treeNode)) return;
+        if(!nodeTools.isLeafBill(treeNode)) return;
         if (treeNode.children && treeNode.children.length > 0) {
             let changedNodes = [];
             for (let child of treeNode.children){
@@ -1231,4 +1247,40 @@ class CalcProgram {
         let changedNodes = this.calcAllNodes(calcType);
         this.saveNodes(changedNodes);
     };
+
+    // 排除指定项的综合合价计算(用于带循环计算的情况)
+    getTotalFee(excludeNodes){
+        excludeNodes.push(nodeTools.getNodeByFlag(fixedFlag.ENGINEERINGCOST));
+        let me = this;
+        let rst = 0;
+
+        function calcNodes(nodes) {
+            /*for (let node of nodes) {
+                if (node.children.length > 0) {
+                    calcNodes(node.children);
+                }
+                else{
+                    if (!excludeNodes.includes(node) && node.sourceType != ModuleNames.ration_glj) {
+                        rst = (rst + nodeTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
+                    };
+                }
+            }*/
+
+            for (let node of nodes) {
+                if (!excludeNodes.includes(node)){
+                    if (node.children.length > 0) {
+                        calcNodes(node.children);
+                    }
+                    else{
+                        if (node.sourceType != ModuleNames.ration_glj) {
+                            rst = (rst + nodeTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
+                        };
+                    }
+                }
+            }
+        };
+
+        calcNodes(me.project.mainTree.roots);
+        return rst;
+    };
 }

+ 6 - 6
web/building_saas/main/js/views/main_tree_col.js

@@ -25,7 +25,7 @@ let MainTreeCol = {
           if(node.sourceType === projectObj.project.ration_glj.getSourceType()){
               return gljOprObj.getTotalQuantity(node.data);
           }else {
-              return treeNodeTools.uiQuantity(node)?treeNodeTools.uiQuantity(node):null;
+              return nodeTools.uiQuantity(node)?nodeTools.uiQuantity(node):null;
           }
         },
         // CSL, 2017-11-28
@@ -67,7 +67,7 @@ let MainTreeCol = {
         calcProgramName: function (node) {
             if (
                 node.sourceType === projectObj.project.Ration.getSourceType() ||
-                (treeNodeTools.isLeafBill(node) && projectObj.project.property.billsCalcMode === leafBillGetFeeType.billsPrice)
+                (nodeTools.isLeafBill(node) && projectObj.project.property.billsCalcMode === leafBillGetFeeType.billsPrice)
             ) return false
             else return true;
         },
@@ -75,7 +75,7 @@ let MainTreeCol = {
             return node.data.subType != 201 && node.data.subType != 4 && node.data.subType != 5
         },
         commonUnitFee: function (node) {
-            return !treeNodeTools.isNullBill(node);
+            return !nodeTools.isNullBill(node);
         },
         //根据节点、父节点类型判断是否可用计算基数
         calcBaseType: function (node) {
@@ -109,7 +109,7 @@ let MainTreeCol = {
             return node.sourceType === projectObj.project.Bills.getSourceType();
         },
         ration: function (node) {
-            return treeNodeTools.isRation(node);
+            return nodeTools.isRation(node);
         },
         glj: function (node) {
             return node.sourceType == projectObj.project.ration_glj.getSourceType();
@@ -173,7 +173,7 @@ let MainTreeCol = {
             if(MainTreeCol.readOnly.bills(node)&&(node.data.type==billType.DXFY||node.data.type==billType.FB)){//在大项费用、分部行,计量单位只读。
                 return true;
             }else {
-               return treeNodeTools.isRation(node);
+               return nodeTools.isRation(node);
             }
         }
     },
@@ -202,7 +202,7 @@ let MainTreeCol = {
         calcProgramName: function (node) {
             if (
                 node.sourceType === projectObj.project.Ration.getSourceType() ||
-                (treeNodeTools.isLeafBill(node) && projectObj.project.property.billsCalcMode === leafBillGetFeeType.billsPrice)
+                (nodeTools.isLeafBill(node) && projectObj.project.property.billsCalcMode === leafBillGetFeeType.billsPrice)
             ) {
                 // var names = new GC.Spread.Sheets.CellTypes.ComboBox();
                 var names = sheetCommonObj.getDynamicCombo();

+ 2 - 2
web/building_saas/main/js/views/project_view.js

@@ -312,11 +312,11 @@ var projectObj = {
         if(node.sourceType==project.ration_glj.getSourceType()){
             project.ration_glj.updateFromMainSpread(value,node,fieldName);
         }
-        else if(treeNodeTools.isGljRation(node)){
+        else if(nodeTools.isGljRation(node)){
             gljOprObj.updateRationTypeGLJ(value,node,fieldName);
         }
         else if (value !== calcFees.getFee(node.data, fieldName)||fieldName == 'quantity') {//工程量需要进行转换,所以做特殊处理
-            if (fieldName === 'code' && !treeNodeTools.isVolumePrice(node)) {
+            if (fieldName === 'code' && !nodeTools.isVolumePrice(node)) {
                 projectObj.updateCode(node, value);
             }
             else if(fieldName ==='feeRate'){

+ 1 - 1
web/building_saas/main/js/views/std_bills_lib.js

@@ -80,7 +80,7 @@ var billsLibObj = {
         var findData = function (value, field, Array) {
             var i = 0;
             for (i = 0; i < Array.length; i++) {
-                if (value[field] === Array[i][field]) {
+                if (value[field] == Array[i][field]) {
                     return Array[i];
                 }
             }