Browse Source

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

zhangweicheng 7 years ago
parent
commit
2f8fbdcb3f

+ 1 - 0
.gitignore

@@ -4,5 +4,6 @@ dist/
 .idea/
 tmp/*.xlsx
 tmp/*.pdf
+tmp/*.jsp
 test/unit/logs
 *.log

+ 2 - 2
modules/pm/models/templates/bills_template_model.js

@@ -25,7 +25,7 @@ class BillsTemplateModel extends BaseModel {
      */
     async getTemplateData (valuationId, engineering) {
         // 筛选字段
-        let field = {_id: 1, valuationId: 1, ID: 1, ParentID: 1, NextSiblingID: 1, code: 1, name: 1, unit: 1, flags: 1};
+        let field = {_id: 1, valuationId: 1, ID: 1, ParentID: 1, NextSiblingID: 1, code: 1, name: 1, unit: 1, flags: 1, calcBase: 1};
         let data = await this.findDataByCondition({valuationId: valuationId, engineering: engineering}, field, false);
 
         return data === null ? [] : data;
@@ -39,7 +39,7 @@ class BillsTemplateModel extends BaseModel {
      */
     async getTemplateDataForNewProj (valuationId, engineering) {
         // 筛选字段
-        let field = {_id: 0, ID: 1, ParentID: 1, NextSiblingID: 1, code: 1, name: 1, unit: 1, flags: 1,type:1};
+        let field = {_id: 0, ID: 1, ParentID: 1, NextSiblingID: 1, code: 1, name: 1, unit: 1, flags: 1,type:1, calcBase: 1};
         let data = await this.findDataByCondition({valuationId: valuationId, engineering: engineering}, field, false);
 
         return data === null ? [] : data;

+ 2 - 1
modules/pm/models/templates/schemas/bills_template.js

@@ -31,7 +31,8 @@ let BillsTemplateSchema = {
     valuationId: String,
     // 工程专业
     engineering: Number,
-    type:Number
+    type:Number,
+    calcBase: String
 };
 
 let model = mongoose.model(collectionName, new Schema(BillsTemplateSchema, {versionKey: false, collection: collectionName}));

+ 10 - 8
public/web/treeDataHelper.js

@@ -7,14 +7,14 @@ let tree_Data_Helper = {
     buildTreeNodeDirectly: function(data) {
         let topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
         let private_getTopNode = function (idArr) {
-            let rst = null;
+            let tmpNodeRst = null;
             for (let i = 0; i < idArr.length; i++) {
-                if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] === EMPTY_ID_VAL) {
-                    rst = tmpNodes[prefix + idArr[i]];
+                if (parseInt(tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID]) === EMPTY_ID_VAL) {
+                    tmpNodeRst = tmpNodes[prefix + idArr[i]];
                     break;
                 }
             }
-            return rst;
+            return tmpNodeRst;
         };
         let private_buildNodeData = function(parentItem, idArr) {
             let iter = [], nextNode = private_getTopNode(idArr);
@@ -37,15 +37,17 @@ let tree_Data_Helper = {
             data[i][ADHOC_PRE_ID] = EMPTY_ID_VAL;
             data[i][SUB_ID] = [];
             data[i][CHILDREN_NODE] = [];
-            if (data[i][P_ID] === EMPTY_ID_VAL) {
+            if (parseInt(data[i][P_ID]) === EMPTY_ID_VAL) {
                 topArr.push(data[i][NODE_ID]);
             }
         }
         for (let i = 0; i < data.length; i++) {
-            if (data[i][NEXT_ID] !== EMPTY_ID_VAL) {
-                tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
+            if (parseInt(data[i][NEXT_ID]) !== EMPTY_ID_VAL) {
+                if (tmpNodes[prefix + data[i][NEXT_ID]] !== undefined){
+                    tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
+                }
             }
-            if (data[i][P_ID] !== EMPTY_ID_VAL) {
+            if (parseInt(data[i][P_ID]) !== EMPTY_ID_VAL) {
                 tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
             }
         }

+ 1 - 1
test/unit/reports/test_tpl_09_1.js

@@ -136,7 +136,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
-                        // fsUtil.wirteObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.js");
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.jsp");
                     } else {
                         console.log("oh! no pages were created!");
                     }

+ 73 - 9
web/building_saas/main/js/models/calc_program.js

@@ -166,7 +166,7 @@ let cpFeeTypes = [
     {type: 'machineDiff', name: '机械价差'},
     {type: 'adjustLabour', name: '调整人工费'},
     {type: 'adjustMachineLabour', name: '调整机上人工费'},
-    {type: 'zangu', name: '暂估'},
+    {type: 'estimate', name: '暂估'},
     {type: 'fee1', name: '甲供材料费'},
     // 模拟用户新增
     {type: 'common', name: '工程造价'}
@@ -751,8 +751,8 @@ class CalcProgram {
         for (let node of treeNodes){delete node.changed};
         projectObj.mainController.refreshTreeNode(treeNodes);
 
-        if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
-            calcProgramObj.showData(me.project.mainTree.selected, false);
+        if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {    // 批量树结点计算后,计算程序早已今非昔比,所以这里要重新计算一下。
+            calcProgramObj.showData(me.project.mainTree.selected, true);
         };
     };
 
@@ -774,6 +774,7 @@ class CalcProgram {
         };
 
         function checkFee(treeNode, feeObj){
+            if (!feeObj) return;
             if (feeObj.fieldName == '') return;
 
             if (!treeNode.data.feesIndex[feeObj.fieldName]){
@@ -805,6 +806,66 @@ class CalcProgram {
             return ['labour', 'material', 'machine', 'mainMaterial', 'equipment'].indexOf(type) > -1;
         };
 
+        function estimateFee(treeNode){
+            if (!treeNode.data.gljList) return undefined;
+
+            let eTypes = [
+                gljType.GENERAL_MATERIAL, gljType.MAIN_MATERIAL, gljType.EQUIPMENT,
+                gljType.CONCRETE, gljType.MORTAR, gljType.MIX_RATIO,
+                gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR];
+            let eDetailTypes = [gljType.MAIN_MATERIAL, gljType.CONCRETE, gljType.MORTAR, gljType.MIX_RATIO];
+
+            let GLJObjs = [];
+            for (let glj of treeNode.data.gljList) {
+                if (eTypes.indexOf(glj.type) >= 0) {
+                    if (glj.isEstimate){
+                        GLJObjs.push({code: glj.code, quantity: glj.quantity, marketPrice: glj.marketPrice});
+                    }
+                    else{   // 组成物
+                        if (eDetailTypes.indexOf(glj.type) >= 0){
+                            let mds = projectObj.project.composition.getCompositionByGLJ(glj);
+                            if (!mds) mds = [];
+                            for (let md of mds){
+                                if (md.isEstimate){
+                                    let isExist = false;
+                                    let mdQ = (parseFloatPlus(glj.quantity) * parseFloatPlus(md.consumption)).toDecimal(decimalObj.process);
+
+                                    for (let obj of GLJObjs){
+                                        if (md.code == obj.code){
+                                            isExist = true;
+                                            obj.quantity = (parseFloatPlus(obj.quantity) + mdQ).toDecimal(decimalObj.process);
+                                            break;
+                                        }
+                                    };
+                                    if (!isExist)
+                                        GLJObjs.push({code: md.code, quantity: mdQ, marketPrice: md.marketPrice});
+                                }
+                            }
+                        }
+                    }
+                };
+            };
+
+            let sumU = 0, sumT = 0, unitFee = 0, totalFee = 0;
+            for (let obj of GLJObjs){
+                sumU = sumU + (parseFloatPlus(obj.quantity) * parseFloatPlus(obj.marketPrice)).toDecimal(decimalObj.process);
+                sumU = sumU.toDecimal(decimalObj.process);
+
+                let q = (parseFloatPlus(obj.quantity) * parseFloatPlus(treeNode.data.quantity)).toDecimal(decimalObj.process);
+                sumT = sumT + (q * parseFloatPlus(obj.marketPrice)).toDecimal(decimalObj.process);
+                sumT = sumT.toDecimal(decimalObj.process);
+            };
+            unitFee = sumU.toDecimal(decimalObj.bills.unitPrice);
+            if (projectObj.project.property.zanguCalcMode == zanguCalcType.common){
+                totalFee = (parseFloatPlus(treeNode.data.quantity) * unitFee).toDecimal(decimalObj.bills.totalPrice);
+            }
+            else if (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial){
+                totalFee = sumT.toDecimal(decimalObj.bills.totalPrice);
+            };
+
+            return {'fieldName': 'estimate', 'unitFee': unitFee, 'totalFee': totalFee};
+        };
+
         // 父清单汇总子项(定额或子清单)的费用类别
         if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees ||
             treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
@@ -1003,7 +1064,10 @@ class CalcProgram {
 
                     checkFee(treeNode, calcItem);
                 };
-            }
+            };
+
+            checkFee(treeNode, estimateFee(treeNode));
+
         };
 
         if (treeNode.changed && !changedArr.includes(treeNode)) changedArr.push(treeNode);
@@ -1035,11 +1099,11 @@ class CalcProgram {
         return changedNodes;
     };
 
-    /* 计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。
-    参数取值如下:
-    calcAllType.catAll       计算所有树结点 (不指定参数时的默认值)
-    calcAllType.catBills     计算所有清单 (改变项目属性中清单取费算法时会用到)
-    calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到) */
+    /* 计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。参数取值如下:
+        calcAllType.catAll       计算所有树结点 (不指定参数时的默认值)
+        calcAllType.catBills     计算所有清单 (改变项目属性中清单取费算法时会用到)
+        calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到)
+    */
     calcAllNodes(calcType = calcAllType.catAll){
         let me = this;
         let changedNodes = [];

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

@@ -152,7 +152,9 @@ let MainTreeCol = {
             return MainTreeCol.readOnly.glj(node) || MainTreeCol.readOnly.billsParent(node)
         },
         forMarketPrice: function (node) {
-            return MainTreeCol.readOnly.bills(node) || (node.sourceType === ModuleNames.ration && (node.data.type == rationType.ration||node.data.type== rationType.volumePrice)) || gljOprObj.marketPriceReadOnly(node);
+            return MainTreeCol.readOnly.bills(node) ||
+                (node.sourceType === ModuleNames.ration && node.data.type == rationType.ration) ||
+                gljOprObj.marketPriceReadOnly(node);
         },
         forContain:function (node) {
             return MainTreeCol.readOnly.non_ration(node)&&!MainTreeCol.readOnly.glj(node);

+ 9 - 7
web/building_saas/main/js/views/project_view.js

@@ -478,13 +478,15 @@ var projectObj = {
                     if(col.data.field ==='quantity'){
                         col.showHint = true;
                     }
-                    // for test digit. CSLAAAAA
-                    if (col.data.field.hasSubStr("totalFee"))
-                       col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.totalPrice, false)
-                    else if (col.data.field.hasSubStr("unitFee"))
-                        col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.unitPrice, false)
-                    else if (col.data.field == "quantity")
-                        col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.quantity, false);
+
+                    // 综合单价、综合合价,小数部分应补0对齐。  CSLAAAAA
+                    if (col.data.field.hasSubStr("common")){
+                        if (col.data.field.hasSubStr("totalFee"))
+                            col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.totalPrice, true)
+                        else if (col.data.field.hasSubStr("unitFee"))
+                            col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.unitPrice, true)
+                    }
+
                 });
 
                 that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), that.project.projSetting.mainGridSetting);

+ 1 - 1
web/building_saas/pm/js/pm_main.js

@@ -102,7 +102,7 @@ let ProjTreeSetting = {
                 getText: function (html, node, text) {
                     if(node.data.projType === projectType.tender){
                         // let engineeringCostText = node.data.engineeringCost ? node.data.engineeringCost : 0;
-                        let engineeringCostText = node.data.summaryFees ? node.data.summaryFees.totalFee : 0;
+                        let engineeringCostText = node.data.summaryFees ? parseFloat(node.data.summaryFees.totalFee).toFixed(2) : '0.00';
                         html.push(engineeringCostText);
                     }
                 }