Переглянути джерело

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

zhongzewei 6 роки тому
батько
коміт
042a193e19
30 змінених файлів з 199 додано та 45 видалено
  1. 1 1
      modules/all_models/project_glj.js
  2. 1 1
      modules/glj/controllers/glj_controller.js
  3. 8 1
      modules/glj/models/glj_list_model.js
  4. 1 1
      modules/reports/controllers/rpt_controller.js
  5. 89 0
      modules/reports/util/rpt_construct_data_util.js
  6. 2 2
      public/web/gljUtil.js
  7. 1 0
      public/web/scMathUtil.js
  8. 1 1
      test/unit/reports/test_cover_01.js
  9. 1 1
      test/unit/reports/test_cover_02.js
  10. 1 1
      test/unit/reports/test_rpt_11_2.js
  11. 10 5
      test/unit/reports/test_rpt_test_template.js
  12. 1 1
      test/unit/reports/test_summary.js
  13. 1 1
      test/unit/reports/test_svg_data.js
  14. 1 1
      test/unit/reports/test_tpl_05.js
  15. 1 1
      test/unit/reports/test_tpl_07.js
  16. 1 1
      test/unit/reports/test_tpl_09.js
  17. 1 1
      test/unit/reports/test_tpl_09_1.js
  18. 1 1
      test/unit/reports/test_tpl_10.js
  19. 1 1
      test/unit/reports/test_tpl_11.js
  20. 1 1
      web/building_saas/main/html/main.html
  21. 5 2
      web/building_saas/main/js/controllers/block_controller.js
  22. 17 1
      web/building_saas/main/js/models/bills.js
  23. 9 1
      web/building_saas/main/js/models/calc_program.js
  24. 1 1
      web/building_saas/main/js/models/composition.js
  25. 2 1
      web/building_saas/main/js/models/project.js
  26. 20 9
      web/building_saas/main/js/models/quantity_detail.js
  27. 1 1
      web/building_saas/main/js/views/project_glj_view.js
  28. 8 0
      web/building_saas/main/js/views/quantity_edit_view.js
  29. 2 1
      web/building_saas/main/js/views/zlfb_view.js
  30. 9 5
      web/building_saas/pm/js/pm_newMain.js

+ 1 - 1
modules/all_models/project_glj.js

@@ -100,7 +100,7 @@ let modelSchema = {
     // 是否主要材料 (0为否 1为是)
     is_main_material: {
         type: Number,
-        default: 0
+        default: 1
     },
     //以下仅普通材料可用
     grossWeightCoe: Number, //毛重系数

+ 1 - 1
modules/glj/controllers/glj_controller.js

@@ -145,7 +145,7 @@ class GLJController extends BaseController {
                             }
                         }
                         let unitPriceUpdate = {
-                            base_price: basePrice,
+                           // base_price: basePrice, ---- 20190218 修改机械台班的组成物,仅重新计算机械预算价,定额价保持不变。
                             market_price: marketPrice
                         };
                         let unitPriceModel = new UnitPriceModel();

+ 8 - 1
modules/glj/models/glj_list_model.js

@@ -786,7 +786,14 @@ class GLJListModel extends BaseModel {
             let u_index = this.getIndex(tmp,['code','name','specs','unit','type']);
             unitPriceData[u_index] = tmp;
         }
-        return [gljData,mixRatioData,unitPriceData];
+        let c_gljData = [];
+        for(let g of gljData){//过滤掉不是组成物的工料机
+            let g_index =  this.getIndex(g,['code','name','specs','unit','type']);
+            if(mixRatioData[g_index]) c_gljData.push(g);
+        }
+
+
+        return [c_gljData,mixRatioData,unitPriceData];
 
     }
 

+ 1 - 1
modules/reports/controllers/rpt_controller.js

@@ -22,7 +22,7 @@ import rpt_pdf_util from "../util/rpt_pdf_util";
 import rpt_svg_util from "../util/rpt_svg_util";
 import fs from "fs";
 import strUtil from "../../../public/stringUtil";
-import rptDataExtractor from "../util/rpt_construct_data_util";
+import rptDataExtractor from "../util/rpt_yanghu_data_util";
 
 //统一回调函数
 let callback = function(req, res, err, data){

+ 89 - 0
modules/reports/util/rpt_construct_data_util.js

@@ -8,6 +8,8 @@ let consts = require('../../../modules/main/models/project_consts');
 
 let fsUtil = require("../../../public/fsUtil");
 let stringUtil = require("../../../public/stringUtil");
+let scMathUtil = require("../../../public/scMathUtil");
+let _ = require("lodash");
 
 let treeUtil = require('../../../public/treeUtil');
 let projectConst = consts.projectConst;
@@ -220,6 +222,12 @@ class Rpt_Data_Extractor {
                 }
             }
         }
+        if (rst.indexOf(projectConst.RATION) >= 0 &&
+            rst.indexOf(projectConst.RATION_GLJ) >= 0 && rst.indexOf(projectConst.RATION_COE) < 0) {
+            rst.push(projectConst.RATION_COE);
+            //备注:在此情况下,根据业务特点,有可能需要额外计算project工料机的基价单价及市场单价,需要用到一些额外信息处理。
+            //     这里也不精细控制,直接多加一个请求类型。以后说不定还有其他类型的请求,到时候再加。
+        }
         if (rst.length === 0) {
             rst.push(projectConst.RATION_ASS);
         }
@@ -276,6 +284,15 @@ class Rpt_Data_Extractor {
                 setupFunc($PROJECT.SUMMARY, `SegmentDetail`, {"data": rawDataObj.SegmentDetail});
             }
         }
+        //综合费率
+        let feeRate = getModuleDataByKey(rawDataObj.prjData, "feeRate");
+        if (feeRate) {
+            //把综合费率树结构数据拉扁
+            // console.log(feeRate);
+            let newFeeRates = setupFeeRate(feeRate.data._doc);
+            // console.log(newFeeRates);
+            feeRate.data._doc.rates = newFeeRates;
+        }
 
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
             for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
@@ -311,6 +328,28 @@ class Rpt_Data_Extractor {
                 }
             }
         }
+        //一些计算(不保存数据,需要动态计算的)
+        if (rawDataObj.hasOwnProperty(`prj`)) {
+            let calcOptions = rawDataObj.prj._doc.property.calcOptions;
+            let decimalObj = rawDataObj.prj._doc.property.decimal;
+            let labourCoeDatas =  getModuleDataByKey(rawDataObj.prjData, "labour_coe");
+            let prjGLJDatas = getModuleDataByKey(rawDataObj.prjData, "projectGLJ");
+            let rationDatas = getModuleDataByKey(rawDataObj.prjData, "ration");
+            if (calcOptions && decimalObj && labourCoeDatas && labourCoeDatas && prjGLJDatas && rationDatas) {
+                for (let rationItem of rationDatas.data) {
+                    let glj = _.find(prjGLJDatas.data.gljList, {'id': rationItem.projectGLJID});
+                    if (glj) {
+                        let newGlj = gljUtil.getGLJPrice(glj, prjGLJDatas.data, calcOptions, labourCoeDatas, decimalObj, false, _, scMathUtil);
+                        rationItem.marketPrice = newGlj.marketPrice;
+                        rationItem.basePrice =  newGlj.basePrice;
+                        rationItem.adjustPrice = newGlj.adjustPrice;
+                        rationItem.marketUnitFee = newGlj.marketPrice;//更新树节点市场单价列的值
+                    }
+                }
+            }
+            // console.log("重新计算!");
+        }
+        //
         let rptDataObj = {};
         rptDataObj[JV.DATA_DISCRETE_DATA] = [];
         rptDataObj[JV.DATA_MASTER_DATA] = [];
@@ -1143,6 +1182,43 @@ function setupMainFunc(obj, prop, ownRawObj) {
     obj[prop].getFee = ext_mainGetFee;
 }
 
+function setupFeeRate(feeRateData){
+    let cacheObj = {}, topArr = [], rstArr = [], id_pre = 'ID_';
+    const rateProperties = [];
+    for (let rate of feeRateData.rates) {
+        cacheObj[id_pre + rate._doc.ID] = {"obj": rate._doc, "items": []};
+        // cacheObj[id_pre + rate.ID].items = [];
+        if (rate._doc.ParentID === null || rate._doc.ParentID === undefined) {
+            topArr.push(cacheObj[id_pre + rate._doc.ID]);
+        }
+    }
+    for (let rate of feeRateData.rates) {
+        if (rate._doc.ParentID && cacheObj[id_pre + rate._doc.ParentID]) {
+            cacheObj[id_pre + rate._doc.ParentID].items.push(cacheObj[id_pre + rate._doc.ID]);
+            if (rateProperties.indexOf(rate._doc.name) < 0) {
+                rateProperties.push(rate._doc.name);
+            }
+        }
+    }
+    let pri_func_set_property_rate = function (orgRateItem, rstRateItem) {
+        rstRateItem[orgRateItem.obj.name] = orgRateItem.obj.rate;
+        for (let subOrgRateItem of orgRateItem.items) {
+            pri_func_set_property_rate(subOrgRateItem, rstRateItem);
+        }
+    };
+    for (let topRate of topArr) {
+        let rstItem = {"name": topRate.obj.name};
+        for (let property of rateProperties) {
+            rstItem[property] = 0;
+        }
+        for (let dtlRateItem of topRate.items) {
+            pri_func_set_property_rate(dtlRateItem, rstItem);
+        }
+        rstArr.push(rstItem);
+    }
+    return rstArr;
+}
+
 function setupFunc(obj, prop, ownRawObj) {
     obj[prop] = {};
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
@@ -1154,6 +1230,8 @@ function setupFunc(obj, prop, ownRawObj) {
     obj[prop].getArrayValues = ext_getArrayValues;
     obj[prop].getArrayItemByKey = ext_getArrayItemByKey;
     obj[prop].getPropertyByFlag = ext_getPropertyByFlag;
+    obj[prop].getSubRateProperty = ext_getRateProperty;
+    obj[prop].getRateProperty = ext_getRateProperty;
     obj[prop].getBlank = ext_getBlank;
     if (prop === projectConst.CALC_PROGRAM) obj[prop].getCalcProperty = ext_getCalcProperty;
     if (prop === projectConst.FEERATE) obj[prop].getFeeRate = ext_getFeeRate;
@@ -1250,6 +1328,17 @@ function ext_mainGetPropety(propKey) {
     return rst;
 }
 
+function ext_getRateProperty(propKey) {
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (propKey && dtObj) {
+        for (let rate of dtObj.data._doc.rates) {
+            rst.push(rate[propKey]);
+        }
+    }
+    return rst;
+}
+
 function ext_getPropety(propKey) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];

+ 2 - 2
public/web/gljUtil.js

@@ -311,9 +311,9 @@ let gljUtil = {
     },
     //项目工料机 混凝土、砂浆、配合比排序与定额工料机不一样,同时,type取值的地方不一样
     sortProjectGLJ:function (list) {
-        let specialMap = {202:9,203:10,204:11};//混凝土、砂浆、配合比 排到最后
+        let specialMap = {1:-1,303:0,202:9,203:10,204:11};//,人工、机械工排在最前,混凝土、砂浆、配合比 排到最后
         list = _.sortByAll(list, [function (item) {
-            if(gljUtil.isConcreteType(item.unit_price.type)) return specialMap[item.unit_price.type];
+            if(specialMap[item.unit_price.type] != undefined) return specialMap[item.unit_price.type];
             return gljUtil.getMainType(item.unit_price.type);
         }, "code"]);
         return list;

+ 1 - 0
public/web/scMathUtil.js

@@ -192,6 +192,7 @@ let scMathUtil = {
     },
     isNumOrFormula:function (text) {
         let value = Number(text);
+        if(value ==0 ) return value;
         if (!value) {
             try {
                 let exp = new Expression('');

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

@@ -40,7 +40,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

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

@@ -38,7 +38,7 @@ let userId_Leng = "59cdf14a0034a1000ba52b97"; //小冷User Id 换成_id了
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

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

@@ -42,7 +42,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

+ 10 - 5
test/unit/reports/test_rpt_test_template.js

@@ -30,7 +30,10 @@ let demoPrjId = - 1;
 // let demoRptId = 6; //封面
 // let demoRptId = 22; //03
 // let demoRptId = 26; //07
-let demoRptId = 28; //09
+// let demoRptId = 28; //09
+// let demoRptId = 24; //05
+// let demoRptId = 20; //01
+let demoRptId = 23; //04 综合费率表
 
 let pagesize = "A4";
 //288: 11-2表(新)
@@ -43,7 +46,8 @@ let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 //demoPrjId = 1626; //QA:
 // demoPrjId = 2260; //QA:
 // demoPrjId = 410; //QA:
-demoPrjId = 313; //PROD:
+// demoPrjId = 313; //PROD:
+demoPrjId = 446; //PROD:
 // demoPrjId = 4107; //UAT:
 //*/
 let userId_Dft = userId_Leng;
@@ -55,7 +59,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 import rpt_xl_util from "../../../modules/reports/util/rpt_excel_util";
 import rpt_pdf_util from "../../../modules/reports/util/rpt_pdf_util";
 
@@ -71,7 +75,8 @@ test('测试 - 测试模板啦: ', function (t) {
         rptDataUtil.initialize(rptTpl._doc);
         let filter = rptDataUtil.getDataRequestFilter();
         // filter.push('ration');  //临时用
-        // filter.push('feeRate'); //临时用2
+        filter.push('feeRate'); //临时用2
+        // filter.push('projectGLJ'); //临时用3
         console.log(filter);
         //正常应该根据报表模板定义的数据类型来请求数据
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
@@ -79,7 +84,7 @@ test('测试 - 测试模板啦: ', function (t) {
                 try {
                     fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataObject_测试模板.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
-                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
+                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/YangHuCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
                     // fsUtil.writeObjToFile(tplData, "D:/GitHome/YangHuCost/tmp/rptTplAssembledData_测试模板.jsp");
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();

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

@@ -57,7 +57,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-let rptDataExtractor = require("../../../modules/reports/util/rpt_construct_data_util");
+let rptDataExtractor = require("../../../modules/reports/util/rpt_yanghu_data_util");
 let rpt_xl_util = require("../../../modules/reports/util/rpt_excel_util");
 let rpt_pdf_util = require("../../../modules/reports/util/rpt_pdf_util");
 

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

@@ -40,7 +40,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 import rpt_svg_util from "../../../modules/reports/util/rpt_svg_util";
 
 let fs = require('fs');

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

@@ -45,7 +45,7 @@ let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade"
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 let pm_facade = require('../../../modules/pm/facade/pm_facade');
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

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

@@ -39,7 +39,7 @@ let userId_Dft = "595328da1934dc327cad08eb";
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

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

@@ -40,7 +40,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

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

@@ -46,7 +46,7 @@ let userId_Dft = userId_HaiZhu;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

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

@@ -45,7 +45,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

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

@@ -43,7 +43,7 @@ let userId_Dft = userId_Leng;
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
-import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rptDataExtractor from "../../../modules/reports/util/rpt_yanghu_data_util";
 
 let fs = require('fs');
 //设置Date Format函数

+ 1 - 1
web/building_saas/main/html/main.html

@@ -255,7 +255,7 @@
                                           <div class=" main-data-bottom ovf-hidden col-auto p-0" id="gljItemTab" style="width: 30px">
                                               <div class="rn-nav d-flex align-items-start flex-column gljSubTab">
                                                   <div id="zmhs_toogle">
-                                                      <div class="tn-nav d-flex align-items-start flex-column" data-toggle="tooltip" data-placement="left" title="" data-original-title="打开子目换算">
+                                                      <div class="d-flex align-items-start flex-column" data-toggle="tooltip" data-placement="left" title="" data-original-title="打开子目换算">
                                                           <span class="mt-3 ml-2 text-primary">子目换算</span>
                                                           <i class="fa fa-arrow-left mt-auto mb-3 text-primary ml-2"></i>
                                                       </div>

+ 5 - 2
web/building_saas/main/js/controllers/block_controller.js

@@ -537,10 +537,13 @@ let BlockController = {
 
         function createBillsData(billsData) { //ID、重新生成code
             let temData = _.cloneDeep(billsData);
+            console.log(temData.children);
             //删除旧数据
+            if(temData.children && temData.children.length>0){//如果是有子项,说明是计算得到的,要删除重新计算,没有子项,但是fees有值,说明是自已输入的,值要一起粘贴
+                delete  temData.fees;
+                delete  temData.feesIndex;
+            }
             delete  temData._id;
-            delete  temData.fees;
-            delete  temData.feesIndex;
             delete  temData.children;
             delete  temData.quantity_details;
             delete  temData.__v;

+ 17 - 1
web/building_saas/main/js/models/bills.js

@@ -597,6 +597,13 @@ var Bills = {
                 return false;
             }
         };
+        bills.prototype.isTotalCost = function (node) {//判断这个节点是否是总造价
+            if(isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.TOTAL_COST){
+                return true;
+            }else {
+                return false;
+            }
+        };
         bills.prototype.calcEngineeringCostNode=function(controller){
             let roots =  controller.tree.roots;
             for(let root of roots){
@@ -614,6 +621,15 @@ var Bills = {
                 }
             }
         };
+        bills.prototype.getTotalCostNode=function(controller){//取工程造价总金额节点
+            let roots =  controller.tree.roots;
+            for(let root of roots){
+                if(project.Bills.isTotalCost(root)==true){
+                    return root;
+                }
+            }
+        };
+
         bills.prototype.getFBFXNode = function (controller) {//取分部分项工程节点
             let roots =  controller.tree.roots;
             for(let root of roots){
@@ -730,7 +746,7 @@ var Bills = {
                     }
                 }
                 if(m_node.parent==null&&includeRootNode==false){//删除的节点中包含了根节点,要重新计算工程造价,并且工程造价节点只要加入一次就行了
-                    parentNodes.push(me.getEngineeringCostNode(controller));
+                    parentNodes.push(me.getTotalCostNode(controller));
                     includeRootNode=true
                 }else {
                     m_node.parent?parentNodes.push(m_node.parent):"";

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

@@ -233,6 +233,10 @@ let calcTools = {
             if (treeNode.data.feesIndex[arr[1]][arr[2]] != value) {
                 treeNode.data.feesIndex[arr[1]][arr[2]] = value;
                 treeNode.updateData.feesIndex = treeNode.data.feesIndex;
+                if(fieldName == 'feesIndex.common.unitFee'){
+                    let fee = _.find(treeNode.updateData.fees,{'fieldName':arr[1]});
+                    if(fee) fee[arr[2]] = value;
+                }
                 treeNode.changed = true;
             }
         }
@@ -1645,7 +1649,11 @@ class CalcProgram {
 
                 if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
                     for (let node of nodes) {
-                        if (node.data.feesIndex && node.data.feesIndex[ft.type]) { // 父清单不要汇总综合单价。
+                        if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
+                            if (projectObj.project.property.valuationType === 'bill') { // 预算
+                                buf = (buf + parseFloatPlus(node.data.feesIndex[ft.type].unitFee)).toDecimal(decimalObj.process);
+                                btuf = (btuf + parseFloatPlus(node.data.feesIndex[ft.type].tenderUnitFee)).toDecimal(decimalObj.process);
+                            };
                             btf = (btf + parseFloatPlus(node.data.feesIndex[ft.type].totalFee)).toDecimal(decimalObj.process);
                             bttf = (bttf + parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee)).toDecimal(decimalObj.process);
                         };

+ 1 - 1
web/building_saas/main/js/models/composition.js

@@ -133,7 +133,7 @@ Composition.prototype.updateConsumptionInCache = function (pid,recode,updateData
         }
         // 设置父级3个价格
         parentGlj.unit_price.market_price =  updateData.market_price;
-        parentGlj.unit_price.base_price =  updateData.base_price;
+       // parentGlj.unit_price.base_price =  updateData.base_price;
         return mglj.id;
     }
 }

+ 2 - 1
web/building_saas/main/js/models/project.js

@@ -327,7 +327,8 @@ var PROJECT = {
             let me = this;
             let  changeMark = projectInfoObj.projectInfo.changeMark;
             if(changeMark&&changeMark!=''){
-                this.Bills.getEngineeringCostNode(projectObj.mainController).changed = true;
+                let totalNode = this.Bills.getTotalCostNode(projectObj.mainController);
+                if(totalNode) totalNode.changed = true;
                 this.calcProgram.calcAllNodesAndSave();
                 CommonAjax.post("/project/removeProjectMark",{projectID:me.ID()},function (data) {
                     delete projectInfoObj.projectInfo.changeMark;

+ 20 - 9
web/building_saas/main/js/models/quantity_detail.js

@@ -723,9 +723,7 @@ var quantity_detail = {
                 me.updateRationQuantity(value,node,null,editingText);
             }
         };
-
-
-        quantity_detail.prototype.updateBillQuantity=function (value,node,quantityEXP,editingText) {
+        quantity_detail.prototype.updateBillQuantity=function (value,node,quantityEXP,editingText,batchGLGL = false) {//batchGLLC是否批量更新公路公里为单位的所有清单
             let oldQuantityEXP =  node.data.quantityEXP;
             node.updateData.quantityEXP = quantityEXP?quantityEXP:editingText;
             value = scMathUtil.roundForObj(value,getDecimal("quantity",node));
@@ -737,7 +735,10 @@ var quantity_detail = {
             node.updateData.quantity = newQuantity;
             let needUpdateChildren = [];//需更新的子定额
             let gljNodes=[];//当定额工程量改变时需刷新的子工料机
-            if(node.children.length>0){//如果有子项
+            let batchBillNodes = [];
+            if(batchGLGL==true){//批量更新公路公里的时候不考虑清单下的子定额工程量的更新
+                this.batchUpdateGLGLNodes(batchBillNodes,node);
+            }else if(node.children.length>0){//如果有子项
                 for(let rationNode of node.children){
                     let EXPString = rationNode.data.quantityEXP+"";
                     if(EXPString.indexOf("QDL")!=-1){//包含了清单量的定额才要再重新计算
@@ -770,9 +771,6 @@ var quantity_detail = {
             }
             if(needUpdateChildren.length>0){//清单下的定额工程量发生了改变
                 node.changed = true;//本身发生了改变,需要存储。
-                /*project.calcProgram.calcNodesAndSave(needUpdateChildren, function () {
-                    project.projectGLJ.loadData();
-                });*/
                 needUpdateChildren.push(node);
                 project.calcProgram.calcNodesAndSave(needUpdateChildren, function () {
                     project.projectGLJ.calcQuantity();
@@ -786,10 +784,10 @@ var quantity_detail = {
                         });
                     }
                 });
-
             }else {
                 node.changed = true;
-                project.calcProgram.calcAndSave(node, function () {
+                batchBillNodes.push(node);
+                project.calcProgram.calcNodesAndSave(batchBillNodes, function () {
                     project.projectGLJ.calcQuantity();
                 });
             }
@@ -798,6 +796,19 @@ var quantity_detail = {
             }
             gljOprObj.refreshView();
         };
+
+        quantity_detail.prototype.batchUpdateGLGLNodes = function (batchUpdateGLGLNodes,node) {
+            for(let b of projectObj.project.Bills.datas){
+                if(b.ID == node.data.ID) continue;
+                let bNode =  projectObj.project.mainTree.getNodeByID(b.ID);
+                if(bNode && b.unit == "公路公里"){
+                    bNode.updateData.quantityEXP = node.updateData.quantityEXP;
+                    bNode.updateData.quantity = node.updateData.quantity;
+                    bNode.changed = true;
+                    batchUpdateGLGLNodes.push(bNode);
+                }
+            }
+        };
         quantity_detail.prototype.updateRationQuantity=function(value,node,quantityEXP,editingText){
             let oldQuantityEXP =  node.data.quantityEXP;
             node.updateData.quantityEXP = quantityEXP?quantityEXP:editingText;

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

@@ -767,7 +767,7 @@ projectGljObject={
         }
         value = scMathUtil.roundToString(value,getDecimal("glj.quantity"));
         let [parentMarketPrice, parentBasePrice] = me.getCompositionSumPrice('modify', row, value);
-        let updateData ={id: recode.mix_ratio_id, field: 'mix_ratio.' + dataCode, value: value, market_price: parentMarketPrice, base_price: parentBasePrice};
+        let updateData ={id: recode.mix_ratio_id, field: 'mix_ratio.' + dataCode, value: value, market_price: parentMarketPrice};//, base_price: parentBasePrice ---20190218 修改机械台班的组成物,仅重新计算机械预算价,定额价保持不变。
         let prow = parentSheet.getActiveRowIndex();//取父机械或组成物的下标
         let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
         composition.updateConsumption(updateData,recode,prowData.id,function (sid) {

+ 8 - 0
web/building_saas/main/js/views/quantity_edit_view.js

@@ -190,6 +190,14 @@ let quantityEditObj = {
         let quantity_detail = projectObj.project.quantity_detail;
         quantity_detail.cleanQuantityDetail(node,true);
         if(node.sourceType === ModuleNames.bills){
+            if(quantityEXP!=""&& node.data.unit == "公路公里"){
+                hintBox.infoBox('操作确认', '是否将所有单位等于"公路公里"的项目的工程量都设为该值?', 2, function () {
+                    quantity_detail.updateBillQuantity(value,node,quantityEXP,quantityEXP,true);
+                }, function () {
+                    quantity_detail.updateBillQuantity(value,node,quantityEXP,quantityEXP);
+                },['是','否']);
+                return;
+            }
             quantity_detail.updateBillQuantity(value,node,quantityEXP,quantityEXP);
         }else {
             quantity_detail.updateRationQuantity(value,node,quantityEXP,quantityEXP);

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

@@ -288,7 +288,8 @@ let zlfb_object={
             cbTools.refreshFormulaNodes();
             projectObj.project.installation_fee.calcInstallationFee(function () {
                 //重新计算
-                projectObj.project.Bills.getEngineeringCostNode(controller).changed = true;
+                let toNode =  projectObj.project.Bills.getTotalCostNode(controller);
+                if(toNode) toNode.changed = true;
                 projectObj.project.calcProgram.calcAllNodesAndSave();
             });
         },function () {

+ 9 - 5
web/building_saas/pm/js/pm_newMain.js

@@ -1001,6 +1001,13 @@ const projTreeObj = {
         }
         return new TreeNodeCellType();
     },
+    setFileSelectButton:function (row,col,node,sheet,setting) {
+        if(!setting) setting = this.setting;
+        let dataCode = setting.header[col]['dataCode'];
+        if(node.data.projType == "Tender" && (dataCode=="feeRateFile" || dataCode == "unitPriceFile")){
+            sheet.setCellType(row, col,sheetCommonObj.getCusButtonCellType(projTreeObj.cusButtonClick,false),GC.Spread.Sheets.SheetArea.viewport);
+        }
+    },
     setCellValue: function (cell, node,sheet,setting) {
         //const sheet = this.workBook.getActiveSheet();
         if(!setting) setting = this.setting;
@@ -1043,11 +1050,7 @@ const projTreeObj = {
                         sheet.getCell(i, j).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
                     }
                     me.setCellValue({row: i, col: j}, nodes[i],sheet,setting);
-                    let dataCode = headers[j].dataCode;
-                    if(nodes[i].data.projType == "Tender" && (dataCode=="feeRateFile" || dataCode == "unitPriceFile")) {
-                        sheet.setCellType(i, j,sheetCommonObj.getCusButtonCellType(me.cusButtonClick,false),GC.Spread.Sheets.SheetArea.viewport);
-                    }
-                    //sheet.setValue(i, j, nodes[i]['data'][dataCode]);
+                    me.setFileSelectButton(i,j,nodes[i],sheet,setting);
                 }
                 sheet.getCell(i, 1,GC.Spread.Sheets.SheetArea.viewport).locked(true);
             }
@@ -1072,6 +1075,7 @@ const projTreeObj = {
             let rIdx = me.tree.items.indexOf(n);
             for(let i = 0; i < header.length; i++){
                 me.setCellValue({row: rIdx, col: i}, n,sheet);
+                me.setFileSelectButton(rIdx,i,n,sheet);
             }
         }