Преглед изворни кода

check in for rounding function tuning

TonyKang пре 7 година
родитељ
комит
794f7a13ea

+ 1 - 0
modules/reports/models/rpt_template.js

@@ -16,6 +16,7 @@ let RptTemplateSchema = new Schema({
         "主数据指标_拓展集合": Array,
         "从数据指标_拓展集合": Array
     },
+    "映射数据预处理": Array,
     "布局框_集合": Array,
     "流水式表_信息": Schema.Types.Mixed,
     "流水式表_拓展信息": Schema.Types.Mixed,

+ 1 - 0
modules/reports/rpt_component/jpc_ex.js

@@ -157,6 +157,7 @@ JpcExSrv.prototype.createNew = function(){
                 let expression = me.formulas[i][JV.PROP_EXPRESSION];
                 if (expression) {
                     let $ME = me.formulas[i];
+                    console.log(expression);
                     eval(expression);
                 }
             }

+ 183 - 2
modules/reports/util/rpt_construct_data_util.js

@@ -5,6 +5,10 @@
 let JV = require('../rpt_component/jpc_value_define');
 let $JE = require('../rpt_component/jpc_rte');
 let consts = require('../../../modules/main/models/project_consts');
+
+let fsUtil = require("../../../public/fsUtil");
+
+let treeUtil = require('../../../public/treeUtil');
 let projectConst = consts.projectConst;
 let projectConstList = consts.projectConstList;
 
@@ -86,13 +90,19 @@ class Rpt_Data_Extractor {
         $PROJECT.DETAIL.getRationPropertyByID = ext_getRationPropertyByID;
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
             for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
+                let srcData = getModuleDataByKey(rawDataObj.prjData, preHandle[JV.PROP_DATA_KEY]);
                 switch(preHandle[JV.PROP_HANDLE_TYPE]) {
                     case JV.PROP_HANDLE_TYPE_SORT:
+                        sortData(srcData, preHandle);
                         break;
                     case JV.PROP_HANDLE_TYPE_FILTER:
+                        filterData(srcData, preHandle, rawDataObj.prjData);
                         break;
                     case JV.PROP_HANDLE_TYPE_SUM:
-                        //
+                        summaryData(srcData, preHandle, rawDataObj.prjData);
+                        break;
+                    default:
+                        break;
                 }
             }
         }
@@ -120,10 +130,181 @@ class Rpt_Data_Extractor {
         assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX], rptDataObj[JV.DATA_DETAIL_DATA_EX], $PROJECT);
         // console.log(JV.DATA_DETAIL_DATA_EX);
         // console.log(rptDataObj[JV.DATA_DETAIL_DATA_EX]);
+        return rptDataObj;
     };
 
 }
 
+function getModuleDataByKey(prjData, key) {
+    let rst = null;
+    for (let item of prjData) {
+        if (item.moduleName === key) {
+            rst = item;
+            break;
+        }
+    }
+    return rst;
+}
+
+function summaryData(sourceData, handleCfg, prjData){
+    let rstArr = [], tempRstArr = [];
+    let curParentPrjData = {};
+    for (let item of sourceData.data) {
+        if (item._doc) {
+            tempRstArr.push(item._doc);
+        } else {
+            tempRstArr.push(item);
+        }
+    }
+    let private_get_grp_key = function (item) {
+        let keys = [];
+        for (let cfg of handleCfg[JV.PROP_SUM_GROUP_KEYS]) {
+            if (typeof cfg === "string") {
+                keys.push(item[cfg]);
+            } else {
+                if (!curParentPrjData[cfg["seeking_parent"]]) curParentPrjData[cfg["seeking_parent"]] = getModuleDataByKey(prjData, cfg["seeking_parent"]);
+                for (let pDataItem of curParentPrjData[cfg["seeking_parent"]].data) {
+                    let data = (pDataItem._doc)?pDataItem._doc:pDataItem;
+                    if (item[cfg["seeking_key"]] === data[cfg["parent_key"]]) {
+                        keys.push(data[cfg["parent_grp_key"]]);
+                        break;
+                    }
+                }
+            }
+        }
+        return ( "grp_key_" + keys.join('_'));
+    }
+    let sumObj = {};
+    for (let dtl of tempRstArr) {
+        let grpKey = private_get_grp_key(dtl);
+        if (sumObj[grpKey] === null || sumObj[grpKey] === undefined) {
+            sumObj[grpKey] = dtl;
+            rstArr.push(dtl);
+        } else {
+            for (let sumKey of handleCfg[JV.PROP_SUM_SUM_KEYS]) {
+                if (dtl[sumKey]) {
+                    sumObj[grpKey][sumKey] += dtl[sumKey];
+                }
+            }
+        }
+    }
+    delete sourceData.data;
+    sourceData.data = rstArr;
+    // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sumRst.js");
+}
+
+function filterData(sourceData, handleCfg, prjData) {
+    let rstArr = [], tempRstArr = [];
+    for (let item of sourceData.data) {
+        if (item._doc) {
+            tempRstArr.push(item._doc);
+        } else {
+            tempRstArr.push(item);
+        }
+    }
+    let private_chkVal = function (src, dest, compStr) {
+        let rst = true;
+        switch (compStr) {
+            case "==" :
+                rst = (src == dest);
+                break;
+            case "===" :
+                rst = (src === dest);
+                break;
+            case ">" :
+                rst = (src > dest);
+                break;
+            case ">=" :
+                rst = (src >= dest);
+                break;
+            case "<" :
+                rst = (src < dest);
+                break;
+            case "<=" :
+                rst = (src <= dest);
+                break;
+            case "!=" :
+                rst = (src != dest);
+                break;
+            case "!==" :
+                rst = (src !== dest);
+                break;
+            default:
+                rst = true;
+        }
+        return rst;
+    }
+    for (let item of tempRstArr) {
+        let compRst = true;
+        let curComparePrjData = null;
+        for (let cfg of handleCfg[JV.PROP_FILTER_KEY]) {
+            if (cfg[JV.PROP_FILTER_COMPARE_VAL]) {
+                //比较key值
+                compRst = private_chkVal(item[cfg.key], cfg[JV.PROP_FILTER_COMPARE_VAL], cfg[JV.PROP_FILTER_CONDITION]);
+            } else if (cfg[JV.PROP_FILTER_COMPARE_OBJ] && cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]){
+                //通过其他对象来过滤
+                if (!curComparePrjData) {
+                    curComparePrjData = getModuleDataByKey(prjData, cfg[JV.PROP_FILTER_COMPARE_OBJ]);
+                }
+                for (let data of curComparePrjData.data) {
+                    compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
+                    if (compRst) break;
+                }
+            }
+        }
+        if (compRst) {
+            rstArr.push(item);
+        }
+    }
+    delete sourceData.data;
+    sourceData.data = rstArr;
+    // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/filteredRst.js");
+}
+
+function sortData(sourceData, sortCfg) {
+    let rst = sourceData.data, tempRstArr = [];
+    let sortType = sortCfg[JV.PROP_SORT_TYPE];
+    for (let item of sourceData.data) {
+        if (item._doc) {
+            tempRstArr.push(item._doc);
+        } else {
+            tempRstArr.push(item);
+        }
+    }
+    switch (sortType) {
+        case "tree":
+            rst = treeUtil.buildTreeNodeDirectly(tempRstArr);
+            let destArr = [];
+            treeUtil.getFlatArray(rst, destArr);
+            delete sourceData.data;
+            sourceData.data = destArr;
+            // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sortedAndFlattedRst.js");
+            break;
+        case "normal":
+            tempRstArr.sort(function(a, b){
+                let compRst = 0;
+                for (let comp of sortCfg[JV.PROP_SORT_KEYS]) {
+                    let reverse = (comp.order === 'ascend')?1:(-1);
+                    if (a[comp.key] > b[comp.key]) {
+                        compRst = reverse;
+                        break;
+                    } else if (a[comp.key] < b[comp.key]) {
+                        compRst = -reverse;
+                        break;
+                    }
+                }
+                return compRst;
+            });
+            delete sourceData.data;
+            sourceData.data = tempRstArr;
+            // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/normalSortedRst.js");
+            break;
+        default:
+            //
+    }
+    return rst;
+}
+
 function setupFunc(obj, prop, ownRawObj) {
     obj[prop] = {};
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
@@ -186,7 +367,7 @@ function ext_getPropety(propKey) {
     let dtObj = parentObj["myOwnRawDataObj"];
     if (propKey && dtObj) {
         for (let dItem of dtObj.data) {
-            let doc = dItem._doc;
+            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
             if (doc.hasOwnProperty("property")) {
                 rst.push(doc["property"][propKey]);
             } else if (doc.hasOwnProperty(propKey)) {

+ 5 - 5
public/scMathUtil.js

@@ -2,16 +2,16 @@
  * Created by Tony on 2017/4/14.
  */
 const fs = require('fs');
-var scMath = null;
+let scMath = null;
 
 getScMathUtil = function() {
     if (!(scMath)) {
-        var data = fs.readFileSync(__dirname + '/web/scMathUtil.js', 'utf8', 'r');
+        let data = fs.readFileSync(__dirname + '/web/scMathUtil.js', 'utf8', 'r');
         //console.log(data);
-        eval(data);
-        scMath = scMathUtil;
+        eval(data + ' scMath = scMathUtil;');
+        //scMath = scMathUtil;
     }
     return scMath;
-}
+};
 
 exports.getUtil = getScMathUtil;

+ 10 - 11
public/treeUtil.js

@@ -2,17 +2,16 @@
  * Created by Tony on 2017/3/14.
  */
 
-const fs = require('fs');
-var treeNodeUtil = null;
+import fs from 'fs';
 
-getTreeNodeUtil = function() {
-    if (!(treeNodeUtil)) {
-        var data = fs.readFileSync(__dirname + '/web/treeDataHelper.js', 'utf8', 'r');
-        //console.log(data);
-        eval(data);
-        treeNodeUtil = tree_Data_Helper;
-    }
-    return treeNodeUtil;
+function getTreeNodeUtil() {
+    let tmpRst = null;
+    let data = fs.readFileSync(__dirname + '/web/treeDataHelper.js', 'utf8', 'r');
+    //console.log(data);
+    eval(data + ' ; tmpRst = tree_Data_Helper; ');
+    return tmpRst;
 }
 
-exports.getUtil = getTreeNodeUtil;
+const treeNodeUtil = getTreeNodeUtil();
+
+module.exports = treeNodeUtil;

+ 8 - 5
public/web/rpt_value_define.js

@@ -45,16 +45,19 @@ const JV = {
     NODE_BIZ_TYPE_SUM: "汇总类型",
     NODE_BIZ_TYPE_DETAIL: "明细类型",
 
-    NODE_MAP_DATA_HANDLE_INFO: "映射数据过滤及统计处理",
+    NODE_MAP_DATA_HANDLE_INFO: "映射数据处理",
     PROP_DATA_KEY: "映射数据对象",
     PROP_HANDLE_TYPE: "预处理类型",
-    PROP_FILTER_KEY: "过滤键属性",
-    PROP_FILTER_DEPENDENT_ON: "过滤依据对象",
-    PROP_FILTER_DEPENDENT_ON_KEY: "过滤依据对象键属性",
-    PROP_FILTER_CONDITION: "条件",
+    PROP_FILTER_KEY: "过滤键值集",
+    PROP_FILTER_COMPARE_OBJ: "compareObjKey",
+    PROP_FILTER_COMPARE_OBJ_KEY: "compareObjIdKey",
+    PROP_FILTER_COMPARE_VAL: "compareValue",
+    PROP_FILTER_CONDITION: "判断条件",
     PROP_HANDLE_TYPE_FILTER: "过滤",
     PROP_HANDLE_TYPE_SUM: "合计",
     PROP_HANDLE_TYPE_SORT: "排序",
+    PROP_SORT_TYPE: "排序方式",
+    PROP_SORT_KEYS: "排序键值集",
     PROP_SUM_GROUP_KEYS: "分组键值集",
     PROP_SUM_SUM_KEYS: "统计键值集",
     PROP_FIELD_EXP_MAP: "mapExpression",

+ 24 - 24
public/web/scMathUtil.js

@@ -2,45 +2,45 @@
  * Created by jimiz on 2017/3/28.
  */
 
-var scMathUtil = {
+let scMathUtil = {
     innerRoundTo: function(num, digit){
-        var lFactor = Math.pow(10, digit);
-        var fOffSet = 0.5;
-        var sign = '';
+        let lFactor = Math.pow(10, digit);
+        let fOffSet = 0.5;
+        let sign = '';
         if (num < 0){
             sign = '-';
             num = Math.abs(num);
         }
-        var result = Math.floor((num / lFactor) + fOffSet).toString();
-        var iLength = result.length;
-        var r1 = result.substring(0, iLength + digit);
-        var r2 = result.substring(iLength + digit, iLength);
+        let result = Math.floor((num / lFactor) + fOffSet).toString();
+        let iLength = result.length;
+        let r1 = result.substring(0, iLength + digit);
+        let r2 = result.substring(iLength + digit, iLength);
         return Number(sign + r1 + '.' + r2);
     },
     floatToBin: function(num) {
         return num.toString(2);
     },
     binToFloat: function(bin) {
-        var result = 0;
-        var iLength = bin.length;
-        var sign = '';
+        let result = 0;
+        let iLength = bin.length;
+        let sign = '';
         if (iLength > 0 && bin[0]==='-'){
             sign = '-';
             bin = bin.substring(1, iLength);
         }
         iLength = bin.length;
-        var iDot = bin.indexOf('.');
+        let iDot = bin.indexOf('.');
         if (iDot >= 0) {
-            for (var i = 0; i < iLength; i++) {
-                var num = Number(bin[i]);
-                var idx = iDot - i;
+            for (let i = 0; i < iLength; i++) {
+                let num = Number(bin[i]);
+                let idx = iDot - i;
                 if (idx === 0) {
                     continue
                 };
                 if (idx > 0) {
                     idx -= 1
                 };
-                var r = Math.pow(2, idx);
+                let r = Math.pow(2, idx);
                 result += num * r;
             }
         }
@@ -50,16 +50,16 @@ var scMathUtil = {
         return sign + result;
     },
     incMantissa: function(bin){
-        var result = bin;
-        var iDot = bin.indexOf('.');
+        let result = bin;
+        let iDot = bin.indexOf('.');
         if (iDot < 0){return result};
-        var iLength = bin.length;
-        for (var i = iLength - 1; i > iDot; i--){
-            var num = Number(bin[i]);
+        let iLength = bin.length;
+        for (let i = iLength - 1; i > iDot; i--){
+            let num = Number(bin[i]);
             if (num === 0){
                 num = 1;
-                var bin1 = bin.substring(0, i);
-                var bin2 = bin.substring(i + 1, iLength);
+                let bin1 = bin.substring(0, i);
+                let bin2 = bin.substring(i + 1, iLength);
                 result = bin1 + num.toString() + bin2;
                 break;
             }
@@ -68,7 +68,7 @@ var scMathUtil = {
         return result;
     },
     roundTo: function(num, digit){
-        var me = this;
+        let me = this;
         return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
     }
 };

+ 62 - 42
public/web/treeDataHelper.js

@@ -3,22 +3,22 @@
  */
 const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1;
 
-var tree_Data_Helper = {
+let tree_Data_Helper = {
     buildTreeNodeDirectly: function(data) {
-        var me = this, topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
-        private_getTopNode = function (idArr) {
-            var rst = null;
-            for (var i = 0; i < idArr.length; i++) {
-                if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] == EMPTY_ID_VAL) {
+        let topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
+        let private_getTopNode = function (idArr) {
+            let rst = 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]];
                     break;
                 }
             }
             return rst;
-        }
-        private_buildNodeData = function(parentItem, idArr) {
-            var iter = [], nextNode = private_getTopNode(idArr);
-            while (nextNode != null && nextNode != undefined ) {
+        };
+        let private_buildNodeData = function(parentItem, idArr) {
+            let iter = [], nextNode = private_getTopNode(idArr);
+            while (nextNode !== null && nextNode !== undefined ) {
                 if (parentItem) {
                     parentItem[CHILDREN_NODE].push(nextNode);
                 } else {
@@ -27,25 +27,25 @@ var tree_Data_Helper = {
                 iter.push(nextNode);
                 nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
             }
-            for (var i = 0; i < iter.length; i++) {
+            for (let i = 0; i < iter.length; i++) {
                 private_buildNodeData(iter[i], iter[i][SUB_ID]);
             }
-        }
+        };
 
-        for (var i = 0; i < data.length; i++) {
+        for (let i = 0; i < data.length; i++) {
             tmpNodes[prefix + data[i][NODE_ID]] = data[i];
             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 (data[i][P_ID] === EMPTY_ID_VAL) {
                 topArr.push(data[i][NODE_ID]);
             }
         }
-        for (var i = 0; i < data.length; i++) {
-            if (data[i][NEXT_ID] != EMPTY_ID_VAL) {
+        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 (data[i][P_ID] != EMPTY_ID_VAL) {
+            if (data[i][P_ID] !== EMPTY_ID_VAL) {
                 tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
             }
         }
@@ -55,34 +55,54 @@ var tree_Data_Helper = {
         topArr.length = 0;
         return rst;
     },
-    reSettleRelatedID: function(treeData) {
-        if (treeData && treeData.length > 0) {
-            for (var i = 0; i < treeData[CHILDREN_NODE].length; i++) {
-                var nI = null;
-                if (i < treeData[CHILDREN_NODE].length - 1) {
-                    nI = treeData[CHILDREN_NODE][i+1];
+
+    getFlatArray: function (srcArr, destArr) {
+        let private_put = function (parentItem) {
+            destArr.push(parentItem);
+            if (parentItem.items) {
+                for (let subItem of parentItem.items) {
+                    private_put(subItem);
                 }
-                settleNodeRelatedID(null, nI, treeData[CHILDREN_NODE][i]);
             }
         }
-    },
-    settleNodeRelatedID : function(parentItem, nextItem, node) {
-        if (parentItem) {
-            node[P_ID] = parentItem[NODE_ID];
-        } else {
-            node[P_ID] = EMPTY_ID_VAL;
+        for (let node of srcArr) {
+            private_put(node);
         }
-        if (nextItem) {
-            node[NEXT_ID] = nextItem[NODE_ID];
-        } else {
-            node[NEXT_ID] = EMPTY_ID_VAL;
-        }
-        for (var i = 0; i < node[CHILDREN_NODE].length; i++) {
-            var nI = null;
-            if (i < node[CHILDREN_NODE].length - 1) {
-                nI = node[CHILDREN_NODE][i+1];
-            }
-            private_settleNodeRelatedID(node, nI, node[CHILDREN_NODE][i]);
+        for (let item of destArr) {
+            delete item[CHILDREN_NODE];
+            delete item[SUB_ID];
+            delete item[ADHOC_PRE_ID];
         }
     }
-}
+
+    // reSettleRelatedID: function(treeData) {
+    //     if (treeData && treeData.length > 0) {
+    //         for (let i = 0; i < treeData[CHILDREN_NODE].length; i++) {
+    //             let nI = null;
+    //             if (i < treeData[CHILDREN_NODE].length - 1) {
+    //                 nI = treeData[CHILDREN_NODE][i+1];
+    //             }
+    //             settleNodeRelatedID(null, nI, treeData[CHILDREN_NODE][i]);
+    //         }
+    //     }
+    // },
+    // settleNodeRelatedID : function(parentItem, nextItem, node) {
+    //     if (parentItem) {
+    //         node[P_ID] = parentItem[NODE_ID];
+    //     } else {
+    //         node[P_ID] = EMPTY_ID_VAL;
+    //     }
+    //     if (nextItem) {
+    //         node[NEXT_ID] = nextItem[NODE_ID];
+    //     } else {
+    //         node[NEXT_ID] = EMPTY_ID_VAL;
+    //     }
+    //     for (let i = 0; i < node[CHILDREN_NODE].length; i++) {
+    //         let nI = null;
+    //         if (i < node[CHILDREN_NODE].length - 1) {
+    //             nI = node[CHILDREN_NODE][i+1];
+    //         }
+    //         private_settleNodeRelatedID(node, nI, node[CHILDREN_NODE][i]);
+    //     }
+    // }
+};

+ 79 - 53
test/unit/reports/test_tpl_09_1.js

@@ -2,11 +2,13 @@
  * Created by Tony on 2017/10/18.
  */
 let test = require('tape');
+import JpcEx from "../../../modules/reports/rpt_component/jpc_ex";
 import JV from "../../../modules/reports/rpt_component/jpc_value_define";
 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();
 let consts = require('../../../modules/main/models/project_consts');
 let projectConsts = consts.projectConst;
@@ -26,7 +28,8 @@ fileUtils.getGlobbedFiles('../../../modules/reports/models/*.js').forEach(functi
 //暂时引入其它模块的model
 require('../../../modules/fee_rates/models/fee_rates');
 // 引入人工系数模块
-require('../../../modules/main/models/labour_coe');
+require('../../../modules/main/models/labour_coe_model');
+require('../../../modules/main/models/calc_program_model');
 
 let fsUtil = require("../../../public/fsUtil");
 
@@ -35,9 +38,7 @@ let projectDataMdl = require('../../../modules/main/models/project');
 let demoPrjId = - 1;
 let demoRptId = 226, pagesize = "A4";
 
-demoPrjId = 469; //QA: 1号教学楼建筑工程
-// demoPrjId = 491; //QA: 2号教学楼建筑工程
-// demoPrjId = 492; //QA: 3号教学楼建筑工程
+demoPrjId = 610; //QA: 建筑工程
 let userId_Leng = 1142; //小冷User Id
 
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
@@ -45,66 +46,90 @@ let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_fac
 
 import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
 
-// test('测试 - 获取project数据: ', function (t) {
-//     projectDataMdl.getData(demoPrjId, function (err, message, result) {
-//         if (!err) {
-//             fsUtil.wirteObjToFile(result, "D:/GitHome/ConstructionCost/tmp/ProjectDataFullObject.js");
-//             t.pass('pass succeeded!');
-//             t.end();
-//         } else {
-//             //callback(req, res, err, message, null);
-//             t.pass('pass failed!');
-//             t.end();
-//         }
-//     });
-// });
+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('测试 - 获取project部分数据: ', function (t) {
-//     let filter = [];
-//     filter.push(projectConsts.BILLS);
-//     filter.push(projectConsts.RATION);
-//     filter.push(projectConsts.RATION_GLJ);
-//     filter.push(projectConsts.FEERATE);
-//     prjMdl.project.getUserProject(userId_Leng, demoPrjId, function(err, msg, prjObj){
-//         if (!err) {
-//             projectDataMdl.getFilterData(demoPrjId, filter, function (results) {
-//                 if (results) {
-//                     // let newData = [];
-//                     // for (let item of results) {
-//                     //     newData.push(JSON.stringify(item));
-//                     // }
-//                     // fsUtil.writeArrayToFile(newData, "D:/GitHome/ConstructionCost/tmp/getProjectData_partial.js");
-//                     fsUtil.wirteObjToFile(prjObj, "D:/GitHome/ConstructionCost/tmp/getProjectObjectNew.js");
-//                     fsUtil.wirteObjToFile(results, "D:/GitHome/ConstructionCost/tmp/getProjectData_partialNew.js");
-//                     t.pass('pass succeeded!');
-//                     t.end();
-//                 } else {
-//                     //callback(req, res, err, message, null);
-//                     t.pass('get project data failed!');
-//                     t.end();
-//                 }
-//             });
-//         } else {
-//             t.pass('get project failed!');
-//             t.end();
-//         }
-//     });
-// });
+/*/
+test('测试 - 获取project数据: ', function (t) {
+    projectDataMdl.getData(demoPrjId, function (err, message, result) {
+        if (!err) {
+            fsUtil.wirteObjToFile(result, "D:/GitHome/ConstructionCost/tmp/ProjectDataFullObject.js");
+            t.pass('pass succeeded!');
+            t.end();
+        } else {
+            //callback(req, res, err, message, null);
+            t.pass('pass failed!');
+            t.end();
+        }
+    });
+});
+//*/
+/*/
+test('测试 - 获取project部分数据: ', function (t) {
+    let filter = [];
+    filter.push(projectConsts.BILLS);
+    filter.push(projectConsts.RATION);
+    filter.push(projectConsts.RATION_GLJ);
+    filter.push(projectConsts.FEERATE);
+    prjMdl.project.getUserProject(userId_Leng, demoPrjId, function(err, msg, prjObj){
+        if (!err) {
+            projectDataMdl.getFilterData(demoPrjId, filter, function (results) {
+                if (results) {
+                    // let newData = [];
+                    // for (let item of results) {
+                    //     newData.push(JSON.stringify(item));
+                    // }
+                    // fsUtil.writeArrayToFile(newData, "D:/GitHome/ConstructionCost/tmp/getProjectData_partial.js");
+                    fsUtil.wirteObjToFile(prjObj, "D:/GitHome/ConstructionCost/tmp/getProjectObjectNew.js");
+                    fsUtil.wirteObjToFile(results, "D:/GitHome/ConstructionCost/tmp/getProjectData_partialNew.js");
+                    t.pass('pass succeeded!');
+                    t.end();
+                } else {
+                    //callback(req, res, err, message, null);
+                    t.pass('get project data failed!');
+                    t.end();
+                }
+            });
+        } else {
+            t.pass('get project failed!');
+            t.end();
+        }
+    });
+});
+//*/
 
+//*
 test('测试 - 测试模板啦: ', function (t) {
-    rptTplFacade.getRptTemplate(demoRptId).then(function(tpl) {
+    rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
         let rptDataUtil = new rptDataExtractor();
-        rptDataUtil.initialize(tpl);
+        rptDataUtil.initialize(rptTpl._doc);
         let filter = rptDataUtil.getDataRequestFilter();
         console.log(filter);
         //正常应该根据报表模板定义的数据类型来请求数据
         rptTplDataFacade.prepareProjectData(userId_Leng, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
-                rptDataUtil.assembleData(rawDataObj);
+                let tplData = rptDataUtil.assembleData(rawDataObj);
+                // fsUtil.wirteObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.js");
+                //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.wirteObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.js");
+                } else {
+                    console.log("oh! no pages were created!")
+                }
+
                 t.pass('pass succeeded!');
                 t.end();
-                //fsUtil.wirteObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject1.js");
-                //准备执行公式需要的对象
             } else {
                 console.log(msg);
                 t.pass('pass with error!');
@@ -113,6 +138,7 @@ test('测试 - 测试模板啦: ', function (t) {
         })
     });
 });
+//*/
 
 test('close the connection', function (t) {
     setTimeout(function () {