Browse Source

code sync from cost

TonyKang 7 years ago
parent
commit
884479ba19

+ 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)) {