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