ソースを参照

汇总统计逻辑

TonyKang 7 年 前
コミット
0a22972d61

+ 13 - 1
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -70,7 +70,19 @@ let JpcFieldHelper = {
                 }
                 if (!isFounded) {
                     if (rstFields) rstFields.push(tab_fields[i]);
-                    if (rstFieldsIdx) rstFieldsIdx.push(JV.BLANK_FIELD_INDEX);
+                    if (rstFieldsIdx) {
+                        if (rptTpl[JV.NODE_NO_MAPPING_FIELDS] && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
+                            for (let discretField of rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
+                                if (discretField[JV.PROP_ID] === tab_fields[i]["FieldID"]) {
+                                    rstFieldsIdx.push(discretField);
+                                    isFounded = true;
+                                    break;
+                                }
+                            }
+                        } else {
+                            rstFieldsIdx.push(JV.BLANK_FIELD_INDEX);
+                        }
+                    }
                 }
             }
         }

+ 3 - 3
modules/reports/rpt_component/jpc_ex.js

@@ -173,16 +173,16 @@ JpcExSrv.prototype.createNew = function(){
         //pre-condition: the data should be sorted in SQL/NoSQL level!
         //let dt1 = new Date();
         if (me.flowTab) {
-            me.flowTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0));
+            me.flowTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
             if (me.flowTabEx) {
                 me.flowTabEx.sorting(rptTpl, dataObj, dataHelper.exDataSeq.slice(0));
             }
         }
         if (me.billTab) {
-            me.billTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0));
+            me.billTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
         }
         if (me.crossTab) {
-            me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0));
+            me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
         }
         //let dt2 = new Date();
         //alert(dt2 - dt1);

+ 28 - 6
modules/reports/rpt_component/jpc_flow_tab.js

@@ -160,7 +160,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.multiCols = 1;
         me.pagesAmt = 0;
     };
-    JpcFlowTabResult.sorting = function(rptTpl, dataObj, dataSeq) {
+    JpcFlowTabResult.sorting = function(rptTpl, dataObj, dataSeq, $CURRENT_RPT) {
         let me = this;
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         if (rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_SEG_SUM]) JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS], me.seg_sum_tab_fields, me.seg_sum_fields_idx, me.isEx);
@@ -174,11 +174,24 @@ JpcFlowTabSrv.prototype.createNew = function(){
             me.segments.push(dataSeq[si].slice(0));
         }
         //pre-sum the data(for seg sum display)
+        //考虑到实际会有离散指标的汇总,这些离散指标数据是通过计算式后得来的,这种情况下,不适宜在sorting阶段进行汇总统计,现挪到preSetupPages阶段处理
+    };
+    JpcFlowTabResult.sumSeg = function (dataObj, $CURRENT_RPT) {
+        let me = this;
         let data_details = me.isEx?dataObj[JV.DATA_DETAIL_DATA_EX]:dataObj[JV.DATA_DETAIL_DATA],
             data_fields = [];
         for (let i = 0; i < me.seg_sum_fields_idx.length; i++) {
-            let data_field = data_details[me.seg_sum_fields_idx[i]];
-            data_fields.push(data_field);
+            if (typeof(me.seg_sum_fields_idx[i])=="object") {
+                let exField = JE.F(me.seg_sum_fields_idx[i][JV.PROP_ID], $CURRENT_RPT);
+                if (exField) {
+                    data_fields.push(exField["data_field"]);
+                } else {
+                    data_fields.push(null);
+                }
+            } else {
+                let data_field = data_details[me.seg_sum_fields_idx[i]];
+                data_fields.push(data_field);
+            }
         }
         for (let i = 0; i < me.segments.length; i++) { //seg level
             if (me.segments[i].length > 0) {
@@ -192,7 +205,6 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 }
                 me.segSumValLst.push(rowGrandTotal);
             }
-
         }
     };
     JpcFlowTabResult.sumUpGrp = function ($CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx) {
@@ -395,6 +407,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         if (followTabEx) {
             JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_ex_idx, true);
         }
+        me.sumSeg(dataObj, $CURRENT_RPT); //考虑到实际会有离散指标的汇总,这些离散指标数据是通过计算式后得来的,这种情况下,不适宜在sorting阶段进行汇总统计,现统一挪到这里处理
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             rst = me.segments.length;
             let pageStatus = [true, true, false, true, true, true, false, false];
@@ -759,8 +772,17 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 let contentValuesIdx = me.dispValueIdxLst[page - 1];
                 let page_sum_data_fields = [];
                 for (let i = 0; i < me.page_sum_fields_idx.length; i++) {
-                    let data_field = data_details[me.page_sum_fields_idx[i]];
-                    page_sum_data_fields.push(data_field);
+                    if (typeof(me.page_sum_fields_idx[i])=="object") {
+                        let exField = JE.F(me.page_sum_fields_idx[i][JV.PROP_ID], $CURRENT_RPT);
+                        if (exField) {
+                            page_sum_data_fields.push(exField["data_field"]);
+                        } else {
+                            page_sum_data_fields.push(null);
+                        }
+                    } else {
+                        let data_field = data_details[me.page_sum_fields_idx[i]];
+                        page_sum_data_fields.push(data_field);
+                    }
                 }
                 let rowGrandTotal = [];
                 for (let di = 0; di < page_sum_data_fields.length; di++) {

+ 4 - 4
modules/reports/rpt_component/jpc_rte.js

@@ -63,8 +63,8 @@ let JE = {
             dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
         }
     },
-    getFieldValue: function (field, dataObj, valIdx, dftVal) {
-        let rst = dftVal;
+    getFieldValue: function (field, dataObj, valIdx, newVal) {
+        let rst = newVal;
         if (field.DataNodeName === "NA") {
             if (!field[JV.PROP_AD_HOC_DATA]) {
                 field[JV.PROP_AD_HOC_DATA] = [];
@@ -72,7 +72,7 @@ let JE = {
             if (field[JV.PROP_AD_HOC_DATA].length > valIdx) {
                 rst = field[JV.PROP_AD_HOC_DATA][valIdx];
             } else {
-                if (dftVal === null && field[JV.PROP_AD_HOC_DATA].length > 0) {
+                if (newVal === null && field[JV.PROP_AD_HOC_DATA].length > 0) {
                     rst = field[JV.PROP_AD_HOC_DATA][field[JV.PROP_AD_HOC_DATA].length - 1];
                 }
             }
@@ -86,7 +86,7 @@ let JE = {
             if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx) {
                 rst = dataObj[field.DataNodeName][field.DataSeq][valIdx];
             } else {
-                if (dftVal === null && dataObj[field.DataNodeName][field.DataSeq].length > 0) {
+                if (newVal === null && dataObj[field.DataNodeName][field.DataSeq].length > 0) {
                     rst = dataObj[field.DataNodeName][field.DataSeq][dataObj[field.DataNodeName][field.DataSeq].length - 1];
                 }
             }

+ 4 - 0
public/web/string_util_light.js

@@ -14,6 +14,10 @@ let stringUtil = {
         }
         return rst;
     },
+    replaceAll: function (targetStr, FindText, RepText) {
+        let regExp = new RegExp(FindText, "gm");
+        return targetStr.replace(regExp, RepText);
+    },
     convertStrToBoolean: function(str) {
         let rst = false, me = this;
         if (!me.isEmptyString(str)) {

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

@@ -32,7 +32,7 @@ let demoPrjId = - 1;
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
 // let demoRptId = 261; //封3
-let demoRptId = 301; //09
+let demoRptId = 401; //09
 // let demoRptId = 280; //11-1 暂列金
 // let demoRptId = 2260; //测试基本信息
 let pagesize = "A4";
@@ -40,13 +40,14 @@ let pagesize = "A4";
 //279: 04
 
 // let userId_Leng = "59cdf14a0034a1000ba52b97"; //小冷User Id 换成_id了 QQ号
-let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
+// let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
+let userId_HaiZhu = "5b5a66c4a3c23e000dccdd77"; //海珠user id
 // demoPrjId = 720; //QA: DW3
 //demoPrjId = 1626; //QA:
 // demoPrjId = 2260; //QA:
-demoPrjId = 3440; //QA:
+demoPrjId = 3834; //QA:
 //*/
-let userId_Dft = userId_Leng;
+let userId_Dft = userId_HaiZhu;
 // let userId_Dft = "5a025c4c15074d134c2b9689";
 /*/
  let userId_Dft = "595328da1934dc327cad08eb";
@@ -89,7 +90,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
                         // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
                         //     console.log("excel uuid: " + uuidName);
                         // });

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

@@ -1562,6 +1562,7 @@
     <!--报表-->
     <script type="text/javascript" src="/public/web/rpt_tpl_def.js"></script>
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
+    <script type="text/javascript" src="/public/web/string_util_light.js"></script>
     <script type="text/javascript" src="/public/web/ztree_common.js"></script>
     <script type="text/javascript" src="/web/building_saas/report/js/rpt_main.js"></script>
     <script type="text/javascript" src="/web/building_saas/report/js/rpt_cfg_const.js"></script>

+ 3 - 3
web/building_saas/report/js/rpt_main.js

@@ -384,7 +384,7 @@ let rptControlObj = {
             CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, 20000, true, function(result){
                     if (result) {
                         let uuIdUrls = [];
-                        let uuIdUrl =  "/report_api/getFileByUUID/" + result.uuid + "/" + result.reportName + "/xlsx";
+                        let uuIdUrl =  "/report_api/getFileByUUID/" + result.uuid + "/" + stringUtil.replaceAll(result.reportName, "#", "_") + "/xlsx";
                         uuIdUrls.push(uuIdUrl);
                         downloadReport(uuIdUrls);
                     } else {
@@ -415,7 +415,7 @@ let rptControlObj = {
                     if (result) {
                         let uuIdUrls = [];
                         for (let uuIdObj of result) {
-                            let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + uuIdObj.reportName + "/xlsx";
+                            let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/xlsx";
                             uuIdUrls.push(uuIdUrl);
                         }
                         downloadReport(uuIdUrls);
@@ -477,7 +477,7 @@ let rptControlObj = {
                     if (result) {
                         let uuIdUrls = [];
                         for (let uuIdObj of result) {
-                            let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + uuIdObj.reportName + "/pdf";
+                            let uuIdUrl =  "/report_api/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/pdf";
                             uuIdUrls.push(uuIdUrl);
                         }
                         downloadReport(uuIdUrls);