Переглянути джерело

统计算法调整 - 先format后统计。 另实现显示data与统计data的小数位数一致

TonyKang 6 роки тому
батько
коміт
ccf7ea92ad

+ 34 - 23
modules/reports/controllers/rpt_controller.js

@@ -178,36 +178,47 @@ function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
     };
     if (customizeCfg.fillZero) {
         if (rptTpl[JV.NODE_FLOW_INFO]) {
-            private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS]);
-            for (let discrete of rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
-                private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+            if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]);
+            if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]);
+            if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]);
+            if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP] && rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES])
+                private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][JV.PROP_SUM_FIELDS]);
+            if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
+                for (let discrete of rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
+                    private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+                }
             }
             if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
-                private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]);
-                private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]);
-                private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]);
-                private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS]);
-                for (let discrete of rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) {
-                    private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+                if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]);
+                if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_PAGE_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]);
+                if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_SEG_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]);
+                if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS]);
+                if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP] && rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES])
+                    private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][JV.PROP_SUM_FIELDS]);
+                if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) {
+                    for (let discrete of rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) {
+                        private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+                    }
                 }
             }
         } else if (rptTpl[JV.NODE_BILL_INFO]) {
-            private_Setup_Format(rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BILL_FIELDS]);
-            for (let discrete of rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) {
-                private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+            if (rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BILL_FIELDS]);
+            if (rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) {
+                for (let discrete of rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) {
+                    private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+                }
             }
         } else if (rptTpl[JV.NODE_CROSS_INFO]) {
-            private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT][JV.TAB_CROSS_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.TAB_CROSS_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.TAB_CROSS_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.TAB_CROSS_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS]);
-            private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS]);
-            for (let discrete of rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) {
-                private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT][JV.TAB_CROSS_FIELDS]);
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.TAB_CROSS_FIELDS]);
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.TAB_CROSS_FIELDS]);
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.TAB_CROSS_FIELDS]);
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS]);
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS]);
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) {
+                for (let discrete of rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) {
+                    private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
+                }
             }
         }
     }

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

+ 27 - 19
test/unit/others/rounding.js

@@ -2,26 +2,34 @@
  * Created by Tony on 2017/3/28.
  */
 
-var test = require('tape');
-test('test javascript rounding: ', function (t) {
-    var f1 = 2.35, f2 = 2.45, f3 = 2.449999999999999995, f4 = 2.44999999999999995;
-    t.equal(Math.round(f1*10), 24);
-    t.equal(Math.round(f2*10), 25);
-    t.equal(Math.round(f3*10), 25);
-    t.equal(Math.round(f4*10), 25);
-    t.end();
-});
-
-test('test javascript fixed rounding: ', function (t) {
-    var f1 = 2.35, f2 = 2.45, f3 = 2.449995;
-    t.equal(f1.toFixed(1), '2.4');
-    t.equal(f2.toFixed(1), '2.5');
-    t.equal(f3.toFixed(1), '2.5');
-    t.end();
-});
+let test = require('tape');
+// test('test javascript rounding: ', function (t) {
+//     let f1 = 2.35, f2 = 2.45, f3 = 2.449999999999999995, f4 = 2.44999999999999995;
+//     t.equal(Math.round(f1*10), 24);
+//     t.equal(Math.round(f2*10), 25);
+//     t.equal(Math.round(f3*10), 25);
+//     t.equal(Math.round(f4*10), 25);
+//     t.end();
+// });
+//
+// test('test javascript fixed rounding: ', function (t) {
+//     let f1 = 2.35, f2 = 2.45, f3 = 2.449995;
+//     t.equal(f1.toFixed(1), '2.4');
+//     t.equal(f2.toFixed(1), '2.5');
+//     t.equal(f3.toFixed(1), '2.5');
+//     t.end();
+// });
 
 //test('test javascript decimal: ', function (t) {
-//    var x = new Decimal(0.1), y = new Decimal(0.2);
+//    let x = new Decimal(0.1), y = new Decimal(0.2);
 //    t.equal(x + y, 0.3);
 //    t.end();
-//});
+//});
+
+test('test javascript decimal: ', function (t) {
+   let x = '3.44999999999';
+   t.equal(parseFloat(x).toFixed(1), `3.5`);
+   t.equal(parseFloat(x).toFixed(6), `3.450000`);
+    t.equal(parseFloat(parseFloat(x).toFixed(6)).toFixed(1), `3.5`);
+   t.end();
+});

+ 26 - 1
test/unit/reports/rpt_cfg.js

@@ -164,7 +164,32 @@ module.exports = {
         {
             "ID" : "Default",
             "CfgDispName" : "默认",
-            "border_style" : []
+            "border_style" : [
+                {
+                    "Position" : "Left",
+                    "LineWeight" : "1",
+                    "DashStyle" : "SOLID",
+                    "Color" : "BLACK"
+                },
+                {
+                    "Position" : "Right",
+                    "LineWeight" : "1",
+                    "DashStyle" : "SOLID",
+                    "Color" : "BLACK"
+                },
+                {
+                    "Position" : "Top",
+                    "LineWeight" : "0",
+                    "DashStyle" : "SOLID",
+                    "Color" : "BLACK"
+                },
+                {
+                    "Position" : "Bottom",
+                    "LineWeight" : "0",
+                    "DashStyle" : "SOLID",
+                    "Color" : "BLACK"
+                }
+            ]
         },
         {
             "ID" : "Default_Normal",

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

@@ -32,8 +32,10 @@ let demoPrjId = - 1;
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
 // let demoRptId = 261; //封3
-// let demoRptId = 400; //09
-let demoRptId = 530; //封2
+let demoRptId = 450; //09
+// let demoRptId = 451; //09-1
+// let demoRptId = 612; //09-3
+// let demoRptId = 530; //封2
 // let demoRptId = 386; //04
 // let demoRptId = 389; //10
 // let demoRptId = 280; //11-1 暂列金
@@ -91,7 +93,8 @@ test('测试 - 测试模板啦: ', function (t) {
                     printCom.initialize(rptTpl);
                     printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
                     let maxPages = printCom.totalPages;
-                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                    let customizeCfg = {"fillZero": true};
+                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                     if (pageRst) {
                         // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
                         // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){