Bläddra i källkod

code sync from cost

TonyKang 7 år sedan
förälder
incheckning
b81cf8e090

+ 3 - 0
modules/reports/controllers/rpt_tpl_controller.js

@@ -52,6 +52,9 @@ let mExport = {
             compilationId = params.compilationId,
             userId = params.userId,
             engineerId = params.engineerId;
+        if (!compilationId) {
+            compilationId = req.session.sessionCompilation._id;
+        }
         rttFacade.findTplTree(compilationId, engineerId, userId).then(function(result) {
             if (result) {
                 callback(req,res,false,"", result);

+ 114 - 72
modules/reports/util/rpt_construct_data_util.js

@@ -13,19 +13,57 @@ let projectConst = consts.projectConst;
 let projectConstList = consts.projectConstList;
 
 class Rpt_Common{
-    initialize(Projects) {
-        this.Projects = Projects;
+    initialize(rpt_tpl, currentDataObj) {
+        this.template = rpt_tpl;
+        this.currentDataObj = currentDataObj;
     };
-
-    getSerialNo(fieldId, $CURRENT_RPT, $CURRENT_DATA){
-        let itemSerialNoRec = $JE.F(fieldId, $CURRENT_RPT);
-        if (itemSerialNoRec) {
-            itemSerialNoRec[JV.PROP_AD_HOC_DATA] = [];
-            for (var innerFmlIdx = 0; innerFmlIdx < $CURRENT_DATA[JV.DATA_DETAIL_DATA][0].length; innerFmlIdx++) {
-                itemSerialNoRec[JV.PROP_AD_HOC_DATA][innerFmlIdx] = (innerFmlIdx + 1);
-            }
-            itemSerialNoRec = null;
+    Multiply(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) * ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
+        }
+        return rst;
+    };
+    Divide(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) / ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
+        }
+        return rst;
+    };
+    Plus(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) + ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
         }
+        return rst;
+    };
+    Minus(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) - ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
+        }
+        return rst;
     };
 }
 
@@ -38,6 +76,7 @@ class Rpt_Data_Extractor {
         this.rptTpl = tpl;
     };
 
+    //-- 根据报表模板映射指标(非离散指标)的定义,罗列出所有需要用到的data对象key,作为数据请求的过滤依据
     getDataRequestFilter() {
         let rst = [];
         let tpl = this.rptTpl;
@@ -48,7 +87,7 @@ class Rpt_Data_Extractor {
                         if (field[JV.PROP_FIELD_EXP_MAP].indexOf('.' + key + '.') >= 0) {
                             rst.push(key);
                             if (key === projectConst.RATION_GLJ && (rst.indexOf(projectConst.PROJECTGLJ) < 0)) {
-                                //rst.push(projectConst.PROJECTGLJ);
+                                rst.push(projectConst.PROJECTGLJ);
                             }
                             if (key === projectConst.PROJECTGLJ && (rst.indexOf(projectConst.RATION_GLJ) < 0)) {
                                 rst.push(projectConst.RATION_GLJ);
@@ -58,42 +97,30 @@ class Rpt_Data_Extractor {
                 }
             }
         };
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX]) {
-                pri_func_chk_filter(field);
+        let pri_setup_filter = function (FIELD_LIST_KEY) {
+            if (tpl[JV.NODE_FIELD_MAP][FIELD_LIST_KEY]) {
+                for (let field of tpl[JV.NODE_FIELD_MAP][FIELD_LIST_KEY]) {
+                    pri_func_chk_filter(field);
+                }
             }
-        }
+        };
+        pri_setup_filter(JV.NODE_DISCRETE_FIELDS);
+        pri_setup_filter(JV.NODE_MASTER_FIELDS);
+        pri_setup_filter(JV.NODE_DETAIL_FIELDS);
+        pri_setup_filter(JV.NODE_MASTER_FIELDS_EX);
+        pri_setup_filter(JV.NODE_DETAIL_FIELDS_EX);
         return rst;
     };
 
     //--- 装配数据(把收集到的数据,依据报表模板的指示,预处理(如:排序、过滤、合计)及装配到相关指标) ---//
     assembleData(rawDataObj) {
-        let $PROJECT = {"COMMON": {}, "MAIN": {}, "DETAIL": {}};
+        let $PROJECT = {"COMMON": null, "MAIN": {}, "DETAIL": {}};
         let tpl = this.rptTpl;
+        this.COMMON.initialize(tpl, rawDataObj);
+        $PROJECT.COMMON = this.COMMON;
         $PROJECT.MAIN["myOwnRawDataObj"] = rawDataObj.prj._doc;
         $PROJECT.MAIN.getProperty = ext_mainGetPropety;
         $PROJECT.MAIN.getFee = ext_mainGetFee;
-        $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]);
@@ -134,8 +161,8 @@ class Rpt_Data_Extractor {
         // console.log(JV.DATA_MASTER_DATA_EX);
         // console.log(rptDataObj[JV.DATA_MASTER_DATA_EX]);
         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]);
+        console.log(JV.DATA_DETAIL_DATA_EX);
+        console.log(rptDataObj[JV.DATA_DETAIL_DATA_EX]);
         return rptDataObj;
     };
 
@@ -316,6 +343,7 @@ function setupFunc(obj, prop, ownRawObj) {
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
     obj[prop].getProperty = ext_getPropety;
     obj[prop].getFee = ext_getFee;
+    obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
 }
 
 function assembleFields(fieldList, rstDataArr, $PROJECT) {
@@ -333,11 +361,9 @@ function shielded_exec_env($PROJECT, $ME, rptDataItemObj) {
 }
 
 function ext_mainGetPropety(propKey) {
-    let rst = [];
-    let parentObj = this;
-    //console.log(this);
+    let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
-    if ((dtObj) && (propKey)) {
+    if (propKey && dtObj) {
         if (dtObj.hasOwnProperty("property")) {
             rst.push(dtObj["property"][propKey]);
         } else  {
@@ -347,6 +373,24 @@ function ext_mainGetPropety(propKey) {
     return rst;
 }
 
+function ext_getPropety(propKey) {
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (propKey && dtObj) {
+        for (let dItem of dtObj.data) {
+            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)) {
+                rst.push(doc[propKey]);
+            } else {
+                rst.push('');
+            }
+        }
+    }
+    return rst;
+}
+
 function ext_mainGetFee(feeKey, dtlFeeKey) {
     let rst = [];
     let parentObj = this;
@@ -372,24 +416,6 @@ function ext_mainGetFee(feeKey, dtlFeeKey) {
     return rst;
 }
 
-function ext_getPropety(propKey) {
-    let rst = [], parentObj = this;
-    let dtObj = parentObj["myOwnRawDataObj"];
-    if (propKey && dtObj) {
-        for (let dItem of dtObj.data) {
-            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)) {
-                rst.push(doc[propKey]);
-            } else {
-                rst.push('');
-            }
-        }
-    }
-    return rst;
-}
-
 function ext_getFee(feeKey, dtlFeeKey) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
@@ -423,16 +449,32 @@ function ext_getFee(feeKey, dtlFeeKey) {
     return rst;
 }
 
-function ext_getRationPropertyByID(IdVal, propKey) {
-    let rst = [], me = this;
-    if (IdVal !== null && IdVal !== undefined && me[projectConst.RATION]) {
+function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey) {
+    let rst = [], parentObj = this;
+    let IdKey = (adHocIdKey)?adHocIdKey:"ID";
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (foreignIdVal !== null && foreignIdVal !== undefined) {
         let isFound = false;
-        if (IdVal instanceof Array) {
-            for (let id of IdVal) {
+        if (foreignIdVal instanceof Array) {
+            for (let idVal of foreignIdVal) {
                 isFound = false;
-                for (let item of me[projectConst.RATION]["myOwnRawDataObj"].data) {
-                    if (item.ID === id) {
-                        rst.push(item[propKey]);
+                for (let i = 0; i < dtObj.data.length; i++) {
+                    let item = (dtObj.data[i]._doc)?dtObj.data[i]._doc:dtObj.data[i];
+                    if (item[IdKey] === idVal) {
+                        let splitPKey = propKey.split(".");
+                        if (splitPKey.length > 1) {
+                            let rstP = null;
+                            for (let i = 0; i < splitPKey.length; i++) {
+                                if (i === 0) {
+                                    rstP = item[splitPKey[i]];
+                                } else {
+                                    rstP = rstP[splitPKey[i]];
+                                }
+                            }
+                            rst.push(rstP);
+                        } else {
+                            rst.push(item[propKey]);
+                        }
                         isFound = true;
                         break;
                     }
@@ -440,8 +482,8 @@ function ext_getRationPropertyByID(IdVal, propKey) {
                 // if (!isFound) rst.push[null];
             }
         } else {
-            for (let item of me[projectConst.RATION]["myOwnRawDataObj"].data) {
-                if (item.ID === IdVal) {
+            for (let item of dtObj.data) {
+                if (item[IdKey] === foreignIdVal) {
                     rst.push(item[propKey]);
                     isFound = true;
                     break;