Browse Source

code sync

TonyKang 6 years ago
parent
commit
d5b2d8fc7c
1 changed files with 100 additions and 15 deletions
  1. 100 15
      modules/reports/rpt_component/jpc_flow_tab.js

+ 100 - 15
modules/reports/rpt_component/jpc_flow_tab.js

@@ -12,6 +12,7 @@ let JpcAreaHelper = require('./helper/jpc_helper_area');
 let PDFKit = require('pdfkit');
 let fontUtil = require('../util/rpt_font_util');
 let fsUtil = require("../../../public/fsUtil");
+let strUtil = require("../../../public/stringUtil");
 
 
 let JpcFlowTabSrv = function(){};
@@ -198,16 +199,60 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 let rowGrandTotal = [];
                 for (let di = 0; di < data_fields.length; di++) {
                     rowGrandTotal.push(0.0);
+                    let precisionAmt = 4;
+                    let sum_field = JE.F(me.seg_sum_tab_fields[di][JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    if (sum_field[JV.PROP_PRECISION] && sum_field[JV.PROP_PRECISION].type === `fixed`) {
+                        precisionAmt = sum_field[JV.PROP_FIXED_PRECISION_AMT];
+                    } else {
+                        let flowF = me.seg_sum_tab_fields[di];
+                        if (flowF && !strUtil.isEmptyString(flowF[JV.PROP_FORMAT])) {
+                            let idx = flowF[JV.PROP_FORMAT].indexOf('.');
+                            if (idx >= 0) {
+                                precisionAmt = flowF[JV.PROP_FORMAT].length - idx - 1;
+                            }
+                        }
+                    }
                     for (let j = 0; j < me.segments[i].length; j++) {
                         //3. start to sum
-                        rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]);
+                        // rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]);
+                        rowGrandTotal[di] = rowGrandTotal[di] + parseFloat(parseFloat(JpcFieldHelper.getValue(data_fields[di], me.segments[i][j])).toFixed(precisionAmt));
                     }
                 }
                 me.segSumValLst.push(rowGrandTotal);
             }
         }
     };
-    JpcFlowTabResult.sumUpGrp = function ($CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx) {
+    JpcFlowTabResult.getFlowFieldById = function (fieldKey, rptTpl) {
+        let rst = null;
+        if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP] && rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES] && rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length > 0) {
+            for (let grpLine of rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES]) {
+                if (grpLine[JV.PROP_GROUP_SUM_KEYS] && grpLine[JV.PROP_GROUP_SUM_KEYS].length > 0) {
+                    for (let sumKey of grpLine[JV.PROP_GROUP_SUM_KEYS]) {
+                        if (sumKey[JV.PROP_SUM_KEY] === fieldKey) {
+                            rst = sumKey;
+                            break;
+                        }
+                    }
+                }
+                if (rst) break;
+            }
+        }
+        if (!(rst) && rptTpl[JV.NODE_FLOW_INFO_EX] && rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP] && rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES] && rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length > 0) {
+            for (let grpLine of rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES]) {
+                if (grpLine[JV.PROP_GROUP_SUM_KEYS] && grpLine[JV.PROP_GROUP_SUM_KEYS].length > 0) {
+                    for (let sumKey of grpLine[JV.PROP_GROUP_SUM_KEYS]) {
+                        if (sumKey[JV.PROP_SUM_KEY] === fieldKey) {
+                            rst = sumKey;
+                            break;
+                        }
+                    }
+                }
+                if (rst) break;
+            }
+        }
+        return rst;
+    };
+    JpcFlowTabResult.sumUpGrp = function (rptTpl, $CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx) {
         let me = this, segDataIdx = me.segments[segIdx];
         for (let j = 0; j < me.group_sum_fields.length; j++) {
             let sum_field = JE.F(me.group_sum_fields[j][JV.PROP_FIELD_ID], $CURRENT_RPT);
@@ -218,9 +263,21 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 } else {
                     data_field = dataObj[sum_field.DataNodeName][sum_field.DataSeq];
                 }
-                let sumV = 0;
+                let sumV = 0, precisionAmt = 4;
                 for (let si = preGrpIdx; si <= nexGrpIdx; si++) {
-                    sumV += parseFloat(JpcFieldHelper.getValue(data_field, segDataIdx[si]));
+                    if (sum_field[JV.PROP_PRECISION] && sum_field[JV.PROP_PRECISION].type === `fixed`) {
+                        precisionAmt = sum_field[JV.PROP_FIXED_PRECISION_AMT];
+                    } else {
+                        let flowF = me.getFlowFieldById(me.group_sum_fields[j][JV.PROP_SUM_KEY], rptTpl);
+                        if (flowF && !strUtil.isEmptyString(flowF[JV.PROP_FORMAT])) {
+                            let idx = flowF[JV.PROP_FORMAT].indexOf('.');
+                            if (idx >= 0) {
+                                precisionAmt = flowF[JV.PROP_FORMAT].length - idx - 1;
+                            }
+                        }
+                    }
+                    //sumV += parseFloat(JpcFieldHelper.getValue(data_field, segDataIdx[si]));
+                    sumV += parseFloat(parseFloat(JpcFieldHelper.getValue(data_field, segDataIdx[si])).toFixed(precisionAmt));
                 }
                 // me.group_sum_values[segIdx][j].push(sumV);
                 me.group_sum_values[segIdx][me.group_sum_fields[j][JV.PROP_SUM_KEY]].push(sumV);
@@ -269,14 +326,14 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     }
                     if (hasDiff) {
                         //then sum up the fields
-                        me.sumUpGrp($CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx);
+                        me.sumUpGrp(rptTpl, $CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx);
                         nexGrpIdx = di;
                         preGrpIdx = di;
                         if (di === segDataIdx.length - 1) {
-                            me.sumUpGrp($CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx);
+                            me.sumUpGrp(rptTpl, $CURRENT_RPT, dataObj, segIdx, preGrpIdx, nexGrpIdx);
                         }
                     } else if (di === segDataIdx.length - 1) {
-                        me.sumUpGrp($CURRENT_RPT, dataObj, segIdx, preGrpIdx, di);
+                        me.sumUpGrp(rptTpl, $CURRENT_RPT, dataObj, segIdx, preGrpIdx, di);
                     } else {
                         nexGrpIdx = di;
                     }
@@ -401,16 +458,17 @@ JpcFlowTabSrv.prototype.createNew = function(){
     JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) {
         //换一种思路来整理流水式数据
         let me = this, rst = 1, counterRowRec = 0, counterRowRecEx = 0, maxRowRec = 1, pageIdx = 0, currentRecAmt = 0;
-        me.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT);
-        if (followTabEx) {
-            followTabEx.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT);
-        }
         me.paging_option = option||JV.PAGING_OPTION_NORMAL;
         let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx);
         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);
         }
+        //根据实际情况,统计前要先根据format整理好小数位数,否则会出现显示的数据的累计与最后统计的结果不一致
+        me.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT);
+        if (followTabEx) {
+            followTabEx.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT);
+        }
         me.sumSeg(dataObj, $CURRENT_RPT); //考虑到实际会有离散指标的汇总,这些离散指标数据是通过计算式后得来的,这种情况下,不适宜在sorting阶段进行汇总统计,现统一挪到这里处理
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             rst = me.segments.length;
@@ -601,7 +659,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         if (handledRowAmt + maxRowRec >= ttlSegRecAmt) {
                             //备注: 理论上自动行高是没有上限的,有可能正常一页的数据可以拓展到3页及以上,在此极端情况下,必须做一些限制判断,否则会出现缺页情况。
                             // 2018-08-04 其实之前的判断逻辑完全是自找麻烦,而且还不够正确。其实只需要判断已经处理了多少行纪录(所有的都算,包括空白行),
-                            // 与总的seg纪录数想比较,就很容易得到结果,而且能处理极端的情况。
+                            // 与总的seg纪录数想比较,就很容易得到结果,而且能处理极端边界的情况。
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
                             pageStatus[JV.STATUS_REPORT_END] = true;
                             private_resetBandArea();
@@ -865,7 +923,6 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             } else {
                                 if (rowIdx === 0) JpcFieldHelper.resetFormat(tab_fieldex, map_data_fieldex, customizeCfg);
                             }
-                            // JpcFieldHelper.resetFormat(tab_fieldex, map_data_fieldex);
                             if (!(tab_fieldex[JV.PROP_HIDDEN])) {
                                 if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) {
                                     rst.push(me.outputTabField(band, tab_fieldex, data_fieldex, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
@@ -877,9 +934,24 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     for (let di = 0; di < page_sum_data_fields.length; di++) {
                         if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL ||
                             contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_AUTO_HEIGHT && contentValuesIdx[rowIdx][3] === 0) {
-                            rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(page_sum_data_fields[di], contentValuesIdx[rowIdx][2]);
+                            let precisionAmt = 4;
+                            let sum_field = JE.F(me.page_sum_tab_fields[di][JV.PROP_FIELD_ID], $CURRENT_RPT);
+                            if (sum_field[JV.PROP_PRECISION] && sum_field[JV.PROP_PRECISION].type === `fixed`) {
+                                precisionAmt = sum_field[JV.PROP_FIXED_PRECISION_AMT];
+                            } else {
+                                let flowF = me.page_sum_tab_fields[di];
+                                if (flowF && !strUtil.isEmptyString(flowF[JV.PROP_FORMAT])) {
+                                    let idx = flowF[JV.PROP_FORMAT].indexOf('.');
+                                    if (idx >= 0) {
+                                        precisionAmt = flowF[JV.PROP_FORMAT].length - idx - 1;
+                                    }
+                                }
+                            }
+                            // rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(page_sum_data_fields[di], contentValuesIdx[rowIdx][2]);
+                            if (contentValuesIdx[rowIdx][2] >= 0) {
+                                rowGrandTotal[di] = rowGrandTotal[di] + parseFloat(parseFloat(JpcFieldHelper.getValue(page_sum_data_fields[di], contentValuesIdx[rowIdx][2])).toFixed(precisionAmt));
+                            }
                         }
-                        // rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(page_sum_data_fields[di], contentValuesIdx[rowIdx][2]);
                     }
                 }
                 me.pageSumValLst.push(rowGrandTotal);
@@ -889,6 +961,19 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         for (let grpIdx = 0; grpIdx < rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length; grpIdx++) {
                             if (contentValuesIdx[rowIdx][3] === grpIdx) {
                                 let grp_line = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][grpIdx];
+                                if (page === 1) {
+                                    let sumFields = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS];
+                                    for (let sumF of sumFields) {
+                                        if (grp_line[JV.PROP_GROUP_SUM_KEYS] && grp_line[JV.PROP_GROUP_SUM_KEYS].length > 0) {
+                                            for (let grp_sum_field of grp_line[JV.PROP_GROUP_SUM_KEYS]) {
+                                                if (grp_sum_field[JV.PROP_SUM_KEY] === sumF[JV.PROP_SUM_KEY]) {
+                                                    let map_field = JE.F(sumF[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                                                    JpcFieldHelper.resetFormat(grp_sum_field, map_field, customizeCfg);
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
                                 let lineRst = me.outputTabGrpLine(band, grp_line, page, contentValuesIdx[rowIdx], contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx);
                                 rst = rst.concat(lineRst);
                             }