|  | @@ -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);
 | 
	
		
			
				|  |  |                              }
 |