소스 검색

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

zhongzewei 7 년 전
부모
커밋
69e0d15cf8

+ 70 - 43
modules/reports/util/rpt_construct_data_util.js

@@ -136,11 +136,25 @@ class Rpt_Data_Extractor {
                             if (key === projectConst.RATION_GLJ && (rst.indexOf(projectConst.PROJECTGLJ) < 0)) {
                                 rst.push(projectConst.PROJECTGLJ);
                             }
-                            if (key === projectConst.PROJECTGLJ && (rst.indexOf(projectConst.RATION_GLJ) < 0)) {
-                                rst.push(projectConst.RATION_GLJ);
+                            if (key === projectConst.PROJECTGLJ) {
+                                if (rst.indexOf(projectConst.RATION_GLJ) < 0) rst.push(projectConst.RATION_GLJ);
+                                if (field[JV.PROP_FIELD_EXP_MAP].indexOf("'quantity'") > 0 ||
+                                    field[JV.PROP_FIELD_EXP_MAP].indexOf("'subdivisionQuantity'") > 0 ||
+                                    field[JV.PROP_FIELD_EXP_MAP].indexOf("'techQuantity'") > 0 ) {
+                                    if (rst.indexOf(projectConst.RATION) < 0) rst.push(projectConst.RATION);
+                                    if (rst.indexOf(projectConst.BILLS) < 0) rst.push(projectConst.BILLS);
+                                }
                             }
                         }
                     }
+                } else if (key === projectConst.PROJECTGLJ) {
+                    if (rst.indexOf(projectConst.RATION_GLJ) < 0) rst.push(projectConst.RATION_GLJ);
+                    if (field[JV.PROP_FIELD_EXP_MAP].indexOf("'quantity'") > 0 ||
+                        field[JV.PROP_FIELD_EXP_MAP].indexOf("'subdivisionQuantity'") > 0 ||
+                        field[JV.PROP_FIELD_EXP_MAP].indexOf("'techQuantity'") > 0 ) {
+                        if (rst.indexOf(projectConst.RATION) < 0) rst.push(projectConst.RATION);
+                        if (rst.indexOf(projectConst.BILLS) < 0) rst.push(projectConst.BILLS);
+                    }
                 }
             }
         };
@@ -208,7 +222,7 @@ class Rpt_Data_Extractor {
         let rationGLJDatas = getModuleDataByKey(rawDataObj.prjData, "ration_glj");
         let rationDatas = getModuleDataByKey(rawDataObj.prjData, "ration");
         let billsDatas = getModuleDataByKey(rawDataObj.prjData, "bills");
-        if (projectGLJDatas && rationGLJDatas, rationDatas, billsDatas) {
+        if (projectGLJDatas && rationGLJDatas && rationDatas && billsDatas) {
             gljUtil.calcProjectGLJQuantity(projectGLJDatas.data, rationGLJDatas.data, rationDatas.data, billsDatas.data, 4);
         }
 
@@ -302,7 +316,7 @@ function getModuleDataByKey(prjData, key) {
 function summaryData(sourceData, handleCfg, prjData){
     let rstArr = [], tempRstArr = [];
     let curParentPrjData = {};
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
             tempRstArr.push(item._doc);
         } else {
@@ -378,14 +392,13 @@ function summaryData(sourceData, handleCfg, prjData){
             }
         }
     }
-    delete sourceData.data;
-    sourceData.data = rstArr;
+    replaceActDataArr(sourceData, rstArr);
     // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sumRst.jsp");
 }
 
 function filterData(sourceData, handleCfg, prjData) {
     let rstArr = [], tempRstArr = [];
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
             tempRstArr.push(item._doc);
         } else {
@@ -472,11 +485,7 @@ function filterData(sourceData, handleCfg, prjData) {
             curComparePrjData = getModuleDataByKey(prjData, targetDataKey);
             try {
                 if (curComparePrjData !== null) {
-                    if (targetDataKey === "projectGLJ") {
-                        objDataArr = curComparePrjData.data.gljList;
-                    } else {
-                        objDataArr = curComparePrjData.data;
-                    }
+                    objDataArr = getActDataArr(curComparePrjData);
                     for (let dtl of objDataArr) {
                         if (item[refKey] === dtl[targetPropertyKey]) {
                             rst = dtl;
@@ -533,7 +542,7 @@ function filterData(sourceData, handleCfg, prjData) {
                     if (!compareObj.hasOwnProperty(cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString())) {
                         compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()] = [];
                         compareArr = compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()];
-                        for (let data of curComparePrjData.data) {
+                        for (let data of getActDataArr(curComparePrjData)) {
                             if (compareArr.indexOf(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]) < 0) {
                                 compareArr.push(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]);
                             }
@@ -543,13 +552,16 @@ function filterData(sourceData, handleCfg, prjData) {
                     }
                     compRst = private_chkVal(item[cfg.key], compareArr, cfg[JV.PROP_FILTER_CONDITION]);
                 } else {
-                    for (let data of curComparePrjData.data) {
+                    for (let data of getActDataArr(curComparePrjData)) {
                         compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
                         if (compRst) break;
                     }
                 }
             }
             startIdx++;
+            if (!compRst) {
+                break; //由不符合条件的数据则退出(这里的判断条件是and关系)
+            }
         }
         return compRst;
     };
@@ -572,14 +584,13 @@ function filterData(sourceData, handleCfg, prjData) {
         }
         rstArr = newRstArr;
     }
-    delete sourceData.data;
-    sourceData.data = rstArr;
+    replaceActDataArr(sourceData, rstArr);
     // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/filteredRst.js");
 }
 
 function adjustData(sourceData, adjustCfg) {
     let rstArr = [];
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
             rstArr.push(item._doc);
         } else {
@@ -595,8 +606,7 @@ function adjustData(sourceData, adjustCfg) {
             }
         }
     }
-    delete sourceData.data;
-    sourceData.data = rstArr;
+    replaceActDataArr(sourceData, rstArr);
 }
 
 function moveRationData(rationData, rawDataObj) {
@@ -605,7 +615,7 @@ function moveRationData(rationData, rawDataObj) {
         let rationGljData = getModuleDataByKey(rawDataObj.prjData, projectConst.RATION_GLJ);
         let prjGljData = getModuleDataByKey(rawDataObj.prjData, projectConst.PROJECTGLJ);
         let dummyCode = " ", dummyPRJID = 10101010;
-        for (let rationItem of rationData.data) {
+        for (let rationItem of getActDataArr(rationData)) {
             if (rationItem.type === 2 || rationItem.type === 3) {
                 //2: 量材(人工/材料/机械/主材/设备) 3:材料(材料/主材/设备)
                 let copyItem = {};
@@ -682,7 +692,7 @@ function getDupGrpKeyVals(sourceData, segKeys) {
 
 function addDummyData(sourceData, addCfg) {
     let rstArr = [], tempRstArr = [];
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
             tempRstArr.push(item._doc);
         } else {
@@ -715,8 +725,7 @@ function addDummyData(sourceData, addCfg) {
         }
     }
     rstArr = rstArr.concat(tempRstArr);
-    delete sourceData.data;
-    sourceData.data = rstArr;
+    replaceActDataArr(sourceData, rstArr);
 }
 
 function getGLJBizType(orgType, orgCode, orgName) {
@@ -756,9 +765,10 @@ function getGLJBizType(orgType, orgCode, orgName) {
 }
 
 function sortData(sourceData, sortCfg, prjData) {
-    let rst = sourceData.data, tempRstArr = [];
+    let rst = getActDataArr(sourceData), tempRstArr = [];
     let sortType = sortCfg[JV.PROP_SORT_TYPE];
-    for (let item of sourceData.data) {
+    let srcData = getActDataArr(sourceData);
+    for (let item of srcData) {
         if (item._doc) {
             tempRstArr.push(item._doc);
         } else {
@@ -859,14 +869,12 @@ function sortData(sourceData, sortCfg, prjData) {
             }
             let destArr = [];
             treeUtil.getFlatArray(newTopArr, destArr);
-            delete sourceData.data;
-            sourceData.data = destArr;
+            replaceActDataArr(sourceData, destArr);
             // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sortedAndFlattedRst.jsp");
             break;
         case "normal":
             private_normal_sort(tempRstArr, sortCfg[JV.PROP_SORT_KEYS]);
-            delete sourceData.data;
-            sourceData.data = tempRstArr;
+            replaceActDataArr(sourceData, tempRstArr);
             // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/normalSortedRst.jsp");
             break;
         case "accord_to_parent":
@@ -874,7 +882,7 @@ function sortData(sourceData, sortCfg, prjData) {
             let parentSrcData = getModuleDataByKey(prjData, pcKey[JV.PROP_PARENT_DATA_KEY]);
             if (parentSrcData) {
                 let tempParentArr = [];
-                for (let item of parentSrcData.data) {
+                for (let item of getActDataArr(parentSrcData)) {
                     if (item._doc) {
                         tempParentArr.push(item._doc);
                     } else {
@@ -906,8 +914,7 @@ function sortData(sourceData, sortCfg, prjData) {
                     }
                 }
             }
-            delete sourceData.data;
-            sourceData.data = tempRstArr;
+            replaceActDataArr(sourceData, tempRstArr);
             break;
         case "self_define":
             if (sortCfg[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC]) {
@@ -915,8 +922,7 @@ function sortData(sourceData, sortCfg, prjData) {
                 eval('selfDefFunc = ' + sortCfg[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC]);
                 tempRstArr.sort(selfDefFunc);
             }
-            delete sourceData.data;
-            sourceData.data = tempRstArr;
+            replaceActDataArr(sourceData, tempRstArr);
             break;
         default:
             //
@@ -1020,7 +1026,7 @@ function ext_getPropety(propKey) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     if (propKey && dtObj) {
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
             if (propKey instanceof Array) {
                 for (let pi = 0; pi < propKey.length; pi++) {
@@ -1054,7 +1060,7 @@ function ext_getPropertyByRefId(baseKey, refIDKey, propertyKey){
     let dtObj = parentObj["myOwnRawDataObj"];
     let orgDtObj = parentObj["myOwnOrgRawDataObj"];
     if (baseKey && refIDKey && propertyKey && dtObj) {
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
             let tmpRst = doc[baseKey];
             if (typeof tmpRst === "string" && tmpRst[0] === "@") {
@@ -1108,7 +1114,7 @@ function ext_getFee(feeKey, dtlFeeKey) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     if (feeKey && dtObj) {
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             rst.push(pri_getFee(dItem, feeKey, dtlFeeKey));
         }
     }
@@ -1219,7 +1225,7 @@ function ext_getArrayValues(itemKey) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     let keysArr = itemKey.split(".");
-    for (let dataItem of dtObj.data) {
+    for (let dataItem of getActDataArr(dtObj)) {
         let itemArr = [];
         if (keysArr.length <= 2) {
             if (dataItem[keysArr[0]] instanceof Array) {
@@ -1279,7 +1285,8 @@ function ext_getBlank(dftVal) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     if (dtObj) {
-        for (let i = 0; i < dtObj.data.length; i++) {
+        let dtData = getActDataArr(dtObj);
+        for (let i = 0; i < dtData.length; i++) {
             if (dftVal !== null && dftVal !== undefined) {
                 rst.push(dftVal)
             } else rst.push('');
@@ -1293,7 +1300,7 @@ function ext_getPropertyByFlag(flagVal, rstKey, dftValIfEmpty) {
     let dtObj = parentObj["myOwnRawDataObj"];
     if (flagVal && rstKey && dtObj) {
         let isArr = (flagVal instanceof Array);
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             let doc = (dItem._doc)?dItem._doc:dItem;
             if (doc.hasOwnProperty("flags")) {
                 let bFlag = false;
@@ -1335,8 +1342,7 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
         if (foreignIdVal instanceof Array) {
             for (let idVal of foreignIdVal) {
                 isFound = false;
-                let dataArr = dtObj.data;
-                if (dtObj.moduleName === "projectGLJ") dataArr = dtObj.data.gljList;
+                let dataArr = getActDataArr(dtObj);
                 for (let i = 0; i < dataArr.length; i++) {
                     let item = (dataArr[i]._doc)?dataArr[i]._doc:dataArr[i];
                     if (item[IdKey] === idVal) {
@@ -1367,7 +1373,7 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
                 }
             }
         } else {
-            for (let item of dtObj.data) {
+            for (let item of getActDataArr(dtObj)) {
                 if (item[IdKey] === foreignIdVal) {
                     rst.push(item[propKey]);
                     isFound = true;
@@ -1382,4 +1388,25 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
     return rst;
 }
 
+function getActDataArr(dtObj) {
+    let rst = null;
+    if (dtObj) {
+        rst = dtObj.data;
+        if (dtObj.moduleName === "projectGLJ") {
+            rst = dtObj.data.gljList;
+        }
+    }
+    return rst;
+}
+
+function replaceActDataArr(dtObj, newArr) {
+    if (dtObj.moduleName === "projectGLJ") {
+        delete dtObj.data.gljList;
+        dtObj.data.gljList = newArr;
+    } else {
+        delete dtObj.data;
+        dtObj.data = newArr;
+    }
+}
+
 export default Rpt_Data_Extractor;

+ 14 - 12
public/web/gljUtil.js

@@ -14,7 +14,6 @@ let gljUtil = {
         let quantityMap={};
         let rationGljGroup = _.groupBy(rationGLJDatas,'projectGLJID');
         let IDarray =  this.getSubdivisionAndTechBillsLeavesID(billsDatas);//分别取分部分项和技术措施项目的所有叶子清单ID
-        console.log(IDarray);
         let billIDs = IDarray[0],tech_billIDS = IDarray[1];
         for(let pglj of project_gljs ){
             let pg_index = this.getIndex(pglj,this.gljKeyArray);
@@ -36,12 +35,15 @@ let gljUtil = {
                 let m_glj = quantityMap[m_index];
                 let p_glj = quantityMap[pkey];
                 if(m_glj&&p_glj){
-                    let quantity = scMathUtil.roundForObj(p_glj.quantity*parseFloat(m.consumption),q_decimal);
-                    let techQuantity = scMathUtil.roundForObj(p_glj.techQuantity*parseFloat(m.consumption),q_decimal);
-                    let subdivisionQuantity = scMathUtil.roundForObj(p_glj.subdivisionQuantity*parseFloat(m.consumption),q_decimal);
-                    m_glj.quantity =  scMathUtil.roundForObj(m_glj.quantity+quantity,q_decimal);
-                    m_glj.techQuantity =  scMathUtil.roundForObj(m_glj.techQuantity+techQuantity,q_decimal);
-                    m_glj.subdivisionQuantity =  scMathUtil.roundForObj(m_glj.subdivisionQuantity+subdivisionQuantity,q_decimal);
+                    let quantity = scMathUtil.roundForObj(parseFloat(p_glj.quantity)*parseFloat(m.consumption),q_decimal);
+                    let techQuantity = scMathUtil.roundForObj(parseFloat(p_glj.techQuantity)*parseFloat(m.consumption),q_decimal);
+                    let subdivisionQuantity = scMathUtil.roundForObj(parseFloat(p_glj.subdivisionQuantity)*parseFloat(m.consumption),q_decimal);
+                    m_glj.quantity =  scMathUtil.roundForObj(parseFloat(m_glj.quantity)+quantity,q_decimal);
+                    m_glj.techQuantity =  scMathUtil.roundForObj(parseFloat(m_glj.techQuantity)+techQuantity,q_decimal);
+                    m_glj.subdivisionQuantity =  scMathUtil.roundForObj(parseFloat(m_glj.subdivisionQuantity)+subdivisionQuantity,q_decimal);
+                    if(m_glj.id == 6832){
+                        console.log(m_glj.quantity)
+                    }
                 }
             }
         }
@@ -87,9 +89,9 @@ let gljUtil = {
         return result;
     },
     getSubdivisionAndTechBillsLeavesID:function (billsDatas) {//分别取分部分项和技术措施项目的所有叶子清单ID
-        // if(projectObj){//存在,说明在前端调用
-        //     return [projectObj.project.Bills.getSubdivisionProjectLeavesID(),projectObj.project.Bills.getTechLeavesID()];
-        // }
+         if(typeof (projectObj) !== 'undefined'){//存在,说明在前端调用
+             return [projectObj.project.Bills.getSubdivisionProjectLeavesID(),projectObj.project.Bills.getTechLeavesID()];
+         }
         let parentMap ={};
         let subdivisionBillID  = null,techBillID = null,sIDs = [],tIDS = [];
         for(let b of billsDatas){
@@ -98,7 +100,7 @@ let gljUtil = {
             }else {
                 parentMap[b.ParentID]= [b];
             }
-            let flag = this.getFalg(b);
+            let flag = this.getFlag(b);
             if(this.isDef(flag)&&flag.flag == this.fixedFlag.SUB_ENGINERRING){
                 subdivisionBillID = b.ID;
             }
@@ -124,7 +126,7 @@ let gljUtil = {
             }
         }
     },
-    getFalg:function (b) {
+    getFlag:function (b) {
         return _.find(b.flags,{"fieldName":"fixed"});
 
     },

+ 3 - 0
public/web/scMathUtil.js

@@ -205,6 +205,9 @@ let scMathUtil = {
             value = null;
         }
         return value;
+    },
+    isDef:function (v) {
+        return v !== undefined && v !== null;
     }
 };
 

+ 107 - 0
test/unit/reports/test_rpt_11_2.js

@@ -0,0 +1,107 @@
+/**
+ * Created by Tony on 2018/6/11.
+ */
+
+let test = require('tape');
+import JpcEx from "../../../modules/reports/rpt_component/jpc_ex";
+import JV from "../../../modules/reports/rpt_component/jpc_value_define";
+let config = require("../../../config/config.js");
+config.setupDb(process.env.NODE_ENV);
+let mongoose = require("mongoose");
+let fileUtils = require("../../../modules/common/fileUtils");
+let path = require('path');
+let dbm = require("../../../config/db/db_manager");
+let rpt_cfg = require('./rpt_cfg');
+dbm.connect(process.env.NODE_ENV);
+
+//统一引用models
+fileUtils.getGlobbedFiles('../../../modules/all_models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+});
+
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
+
+let fsUtil = require("../../../public/fsUtil");
+
+let demoPrjId = - 1;
+let demoRptId = 292, pagesize = "A4"; //11-2表(新)
+
+// let userId_Leng = "59cdf14a0034a1000ba52b97"; //小冷User Id 换成_id了 QQ号
+let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
+// demoPrjId = 720; //QA: DW3
+//demoPrjId = 1626; //QA:
+demoPrjId = 2260; //QA:
+//*/
+let userId_Dft = userId_Leng;
+/*/
+ 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";
+
+let fs = require('fs');
+//设置Date Format函数
+fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
+    eval(data);
+});
+
+test('测试 - 测试模板啦: ', function (t) {
+    rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
+        let rptDataUtil = new rptDataExtractor();
+        rptDataUtil.initialize(rptTpl._doc);
+        let filter = rptDataUtil.getDataRequestFilter();
+        console.log(filter);
+        //正常应该根据报表模板定义的数据类型来请求数据
+        rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
+            if (!err) {
+                try {
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_建筑11-2表.jsp");
+                    let tplData = rptDataUtil.assembleData(rawDataObj);
+                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataAfterCacl_建筑11-2表.jsp");
+                    // fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_建筑11-2表.jsp");
+                    //it's time to build the report!!!
+                    let printCom = JpcEx.createNew();
+                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
+                    let defProperties = rpt_cfg;
+                    let dftOption = JV.PAGING_OPTION_NORMAL;
+                    printCom.initialize(rptTpl);
+                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
+                    let maxPages = printCom.totalPages;
+                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                    if (pageRst) {
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_建筑11-2表.jsp");
+                    } else {
+                        console.log("oh! no pages were created!");
+                    }
+                } catch (ex) {
+                    console.log(ex);
+                    t.pass('pass with exception!');
+                    t.end();
+                }
+
+                t.pass('pass succeeded!');
+                t.end();
+            } else {
+                console.log(msg);
+                t.pass('pass with error!');
+                t.end();
+            }
+        })
+    });
+});
+
+test('close the connection', function (t) {
+    setTimeout(function () {
+        mongoose.disconnect();
+        t.pass('closing db connection');
+        t.end();
+    }, 1000);
+    // mongoose.disconnect();
+    // t.pass('closing db connection');
+    // t.end();
+});

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

@@ -59,8 +59,9 @@ test('测试 - 测试模板啦: ', function (t) {
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
                 try {
-                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_建筑09-1表.jsp");
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_建筑09-1表.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
+                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataAfterCacl_建筑09-1表.jsp");
                     // fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_建筑09-1表.jsp");
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();

+ 6 - 6
web/building_saas/main/html/tender_price.html

@@ -1,11 +1,11 @@
 <div class="toolsbar px-1">
     <div class="btn-toolbar py-1">
-
-        <select class="form-control mr-2" style="width: auto; font-size: .875rem" id="calcPriceOption">
-            <option value="coeBase">根据调整系数计算报价</option>
-            <option value="priceBase" >根据报价计算调整系数</option>
-        </select>
-
+        <div class="input-group input-group-sm mr-2">
+            <select class="form-control form-control-sm" style="width: auto; font-size: .875rem" id="calcPriceOption">
+                <option value="coeBase">根据调整系数计算报价</option>
+                <option value="priceBase" >根据报价计算调整系数</option>
+            </select>
+        </div>
         <div class="input-group input-group-sm mr-2" style="width:240px">
             <div class="input-group-prepend">
                 <span class="input-group-text" id="inputGroup-sizing-sm">工料机单价调整系数</span>

+ 5 - 4
web/building_saas/main/js/views/project_view.js

@@ -1100,11 +1100,12 @@ var projectObj = {
     },
 
     //根据节点获取行style(颜色、字体加粗)
-    getNodeColorStyle: function (sheet, node, colSetting = null) {
+    getNodeColorStyle: function (sheet, node, tree) {
         let colorSetting = optionsOprObj.getOption(optionsOprObj.optionsTypes.COLOROPTS);
         let mapping = {DEFAULT: 'DEFAULT', SELECTED: 'SELECTED', DXFY: 'DXFY', FB: 'FB', UNLEAFBILL: 'UNLEAFBILL',
             FX: 'FX', BX: 'BX', UNCBBILL: 'UNCBBILL', CBBILL: 'CBBILL', ZCSB: 'ZCSB'};
         let styleMap = null;
+        tree?'':tree =  this.project.mainTree;
         //中文字段名,由于同一节点中,中文字体大小和数字字体大小不同
         if(colorSetting == null){
             return null;
@@ -1187,7 +1188,7 @@ var projectObj = {
             }*/
         }
         //选中行-替换底色
-        if(node === this.project.mainTree.selected){
+        if(node === tree.selected){
              style.backColor = colorSetting[mapping.SELECTED]['backColor'];
         }
         style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
@@ -1225,12 +1226,12 @@ var projectObj = {
         return style;
     },
    //设置节点style
-    setNodesStyle: function (sheet, nodes) {
+    setNodesStyle: function (sheet, nodes,tree) {
         let me = this;
         TREE_SHEET_HELPER.massOperationSheet(sheet, function () {
             for(let node of nodes){
                 if(node && node.serialNo()!= -1){
-                    sheet.getRange(node.serialNo(), -1, 1, -1).backColor(me.getNodeColorStyle(sheet, node).backColor);
+                    sheet.getRange(node.serialNo(), -1, 1, -1).backColor(me.getNodeColorStyle(sheet, node,tree).backColor);
                 }
             }
         });

+ 73 - 6
web/building_saas/main/js/views/tender_price_view.js

@@ -51,7 +51,7 @@ let tender_obj={
         this.tenderController = TREE_SHEET_CONTROLLER.createNew(this.tenderTree, this.tenderSheet, this.tenderTreeSetting);
         this.tenderSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
         this.tenderSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEditStarting);
-
+        this.tenderController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, this.treeSelectedChanged);
        // this.tenderController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, this.onSelectionChange);
     },
     createTenderTreeSetting:function () {
@@ -104,6 +104,9 @@ let tender_obj={
             }else if(value == false){
                 value = 0;
             }
+            if(value == 1){
+                updateData = me.cleanTenderCoe(updateData,node);//打勾不调价后清空消耗量调整系数
+            }
             me.updateChildrenValue(node,dataCode,value,datas,nodes);
         }
         if(updateData&&dataCode.indexOf("Coe") != -1 ){//如果是调整系统项,级联更新子项
@@ -134,15 +137,53 @@ let tender_obj={
     updateChildrenValue:function (node,dataCode,value,datas,nodes) {
          if(node.children.length > 0){
             for(let c of node.children){
+                this.updateChildrenValue(c,dataCode,value,datas,nodes);
                 let updateData = {type:c.sourceType,data:{'ID' : c.data.ID}};
                 updateData.data[dataCode] = value;
+                if(dataCode == 'is_adjust_price' && value == 1){
+                    updateData = this.cleanTenderCoe(updateData,c);
+                }else if(dataCode.indexOf("Coe")!= -1 && c.data.is_adjust_price == 1){//更新调整系数时忽略不调价的行
+                    continue;
+                }
                 datas.push(updateData);
                 nodes.push(c);
-                this.updateChildrenValue(c,dataCode,value,datas,nodes);
             }
          }
 
     },
+    cleanTenderCoe:function (updateData,node) {//清空调整系数
+        scMathUtil.isDef(node.data.rationQuantityCoe)?updateData.data["rationQuantityCoe"] = null:'';
+        if(scMathUtil.isDef(node.data.quantityCoe)){
+            scMathUtil.isDef(node.data.quantityCoe.labour)?updateData.data["quantityCoe.labour"] = null:'';
+            scMathUtil.isDef(node.data.quantityCoe.material)?updateData.data["quantityCoe.material"] = null:'';
+            scMathUtil.isDef(node.data.quantityCoe.machine)?updateData.data["quantityCoe.machine"] = null:'';
+            scMathUtil.isDef(node.data.quantityCoe.main)?updateData.data["quantityCoe.main"] = null:'';
+            scMathUtil.isDef(node.data.quantityCoe.equipment)?updateData.data["quantityCoe.equipment"] = null:'';
+        }
+        return updateData;
+    },
+    cleanTargetPrice:function (updateData,node) {//清空目标报价
+        scMathUtil.isDef(node.data.targetUnitFee)?updateData.data["targetUnitFee"] = null:'';
+        scMathUtil.isDef(node.data.targetTotalFee)?updateData.data["targetTotalFee"] = null:'';
+        return updateData;
+    },
+    calcOptionsChecking:function (option) {//调整选项检查,返回需要更新的数组
+        let datas = [];
+        let me = tender_obj;
+        for(let node of me.tenderTree.items){
+            let tem_updateData = {type:node.sourceType,data:{}};
+            if(option == 'coeBase') { //当值为“根据调整系数计算报价”时,清空目标报价。
+                me.cleanTargetPrice(tem_updateData,node);
+            }else if(option == 'priceBase'){//当值为“根据报价计算调整系数”时,清空调整系数。
+                me.cleanTenderCoe(tem_updateData,node);
+            }
+            if(!_.isEmpty(tem_updateData.data)){//如果需要更新
+                tem_updateData.data.ID = node.data.ID;
+                datas.push(tem_updateData);
+            }
+        }
+        return datas;
+    },
 
     updateTenderData:function (datas,callback) {
         let me = tender_obj;
@@ -173,8 +214,20 @@ let tender_obj={
             $.bootstrapLoading.end();
         })
     },
-
-
+    treeSelectedChanged:function (node) {
+        let me = tender_obj;
+        //设置选中行底色和恢复前选中行底色
+        let refreshNodes = [node];
+        if(!me.tenderTree.preSelected){
+            refreshNodes.push(me.tenderTree.items[0]);
+        }
+        else {
+            refreshNodes.push(me.tenderTree.preSelected);
+        }
+        me.tenderTree.preSelected = node;
+        projectObj.setNodesStyle(me.tenderSheet, refreshNodes,me.tenderTree);
+        //console.log(node);
+    },
     onEditStarting:function (sender,args) {
         let me = tender_obj, row = args.row, col = args.col;
         if(me.editChecking(row,col) == false){
@@ -245,14 +298,28 @@ $(function () {
     });
 
     $('#tenderGLJQuantity').bind('click',function () {
-        console.log($('#gljPriceTenderCoe').val()) ;
+        //console.log($('#gljPriceTenderCoe').val()) ;
+    });
+
+    $('#cleanTender').bind('click',function () {
+       console.log("clean tender")
     });
 
     $('#calcPriceOption').change(function(){
         let me = tender_obj;
         let newVal = $(this).val();
+        let datas = me.calcOptionsChecking(newVal);
         let updateData = {type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.tenderSetting.calcPriceOption':newVal}};
-        me.updateTenderData([updateData],function () {
+        datas.push(updateData);
+        me.updateTenderData(datas,function () {
+            let nodes = [];
+            for(let d of datas){
+                if(d.type == ModuleNames.bills || d.type == ModuleNames.ration){
+                    let node = me.tenderTree.getNodeByID(d.data.ID);
+                    node?nodes.push(node):'';
+                }
+            }
+            me.tenderController.refreshTreeNode(nodes);
             me.initPageContent();
         });
     });