浏览代码

code sync - 小数位数依据配置

TonyKang 7 年之前
父节点
当前提交
9413f52eff

+ 30 - 29
modules/reports/rpt_component/helper/jpc_helper_common_output.js

@@ -3,14 +3,15 @@ let JpcFieldHelper = require('./jpc_helper_field');
 
 let JpcCommonOutputHelper = {
     createCommonOutputWithoutDecorate: function (node, value) {
-        let rst = {};
+        let me = this, rst = {};
         //1. font/style/control
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
         rst[JV.PROP_CONTROL] = node[[JV.PROP_CONTROL]];
         rst[JV.PROP_STYLE] = node[[JV.PROP_STYLE]];
         //2. value
         rst[JV.PROP_VALUE] = value;
-        innerFormat(node[JV.PROP_FORMAT], rst);
+        me.formatCell(node[JV.PROP_FORMAT], rst);
+        // innerFormat(node[JV.PROP_FORMAT], rst);
         if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] !== null) {
             rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX] + rst[JV.PROP_VALUE];
         }
@@ -20,7 +21,7 @@ let JpcCommonOutputHelper = {
         return rst;
     },
     createCommonOutput: function (node, value, controls) {
-        let rst = {};
+        let me = this, rst = {};
         //1. font/style/control
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
         rst[JV.PROP_CONTROL] = node[[JV.PROP_CONTROL]];
@@ -28,7 +29,8 @@ let JpcCommonOutputHelper = {
         //2. value
         rst[JV.PROP_VALUE] = value;
         JpcFieldHelper.decorateValue(rst, controls);
-        innerFormat(node[JV.PROP_FORMAT], rst);
+        me.formatCell(node[JV.PROP_FORMAT], rst);
+        // innerFormat(node[JV.PROP_FORMAT], rst);
         if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] !== null && rst[JV.PROP_VALUE] !== "") {
             rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX] + rst[JV.PROP_VALUE];
         }
@@ -36,39 +38,38 @@ let JpcCommonOutputHelper = {
             rst[JV.PROP_VALUE] = rst[JV.PROP_VALUE] + node[JV.PROP_SUFFIX];
         }
         return rst;
-    }
-};
-
-function innerFormat(formatStr, rst) {
-    if (formatStr) {
-        if (!(isNaN(parseFloat(rst[JV.PROP_VALUE])))) {
-            let dotIdx = formatStr.indexOf(".");
-            if (dotIdx >= 0) {
-                let tmpStr = parseFloat(rst[JV.PROP_VALUE]).toFixed(formatStr.length - dotIdx - 1);
-                let digStr = formatStr.substr(dotIdx + 1, formatStr.length - dotIdx);
-                for (let sIdx = digStr.length - 1; sIdx >= 0; sIdx--) {
-                    if (digStr[sIdx] === '#') {
-                        if (tmpStr.length > 0 && tmpStr[tmpStr.length - 1] === '0') {
-                            tmpStr = tmpStr.substr(0, tmpStr.length - 1);
+    },
+    formatCell: function (formatStr, rstCell) {
+        if (formatStr) {
+            if (!(isNaN(parseFloat(rstCell[JV.PROP_VALUE])))) {
+                let dotIdx = formatStr.indexOf(".");
+                if (dotIdx >= 0) {
+                    let tmpStr = parseFloat(rstCell[JV.PROP_VALUE]).toFixed(formatStr.length - dotIdx - 1);
+                    let digStr = formatStr.substr(dotIdx + 1, formatStr.length - dotIdx);
+                    for (let sIdx = digStr.length - 1; sIdx >= 0; sIdx--) {
+                        if (digStr[sIdx] === '#') {
+                            if (tmpStr.length > 0 && tmpStr[tmpStr.length - 1] === '0') {
+                                tmpStr = tmpStr.substr(0, tmpStr.length - 1);
+                            } else {
+                                break;
+                            }
                         } else {
                             break;
                         }
-                    } else {
-                        break;
                     }
+                    if (tmpStr[tmpStr.length - 1] === '.') tmpStr = tmpStr.substr(0, tmpStr.length - 1);
+                    rstCell[JV.PROP_VALUE] = tmpStr;
+                } else {
+                    rstCell[JV.PROP_VALUE] = parseFloat(rstCell[JV.PROP_VALUE]).toFixed(0);
+                }
+                let commaIdx = formatStr.indexOf(",");
+                if (commaIdx >= 0) {
+                    rstCell[JV.PROP_VALUE] = comdify(rstCell[JV.PROP_VALUE].toString());
                 }
-                if (tmpStr[tmpStr.length - 1] === '.') tmpStr = tmpStr.substr(0, tmpStr.length - 1);
-                rst[JV.PROP_VALUE] = tmpStr;
-            } else {
-                rst[JV.PROP_VALUE] = parseFloat(rst[JV.PROP_VALUE]).toFixed(0);
-            }
-            let commaIdx = formatStr.indexOf(",");
-            if (commaIdx >= 0) {
-                rst[JV.PROP_VALUE] = comdify(rst[JV.PROP_VALUE].toString());
             }
         }
     }
-}
+};
 
 function comdify(numStr){
     let re = /\d{1,3}(?=(\d{3})+$)/g;

+ 29 - 0
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -13,6 +13,35 @@ let JpcFieldHelper = {
             dataField[valueIdx] = newValue;
         }
     },
+    resetFormat: function (tab_field, map_field, customizeCfg) {
+        if (map_field && map_field[JV.PROP_PRECISION] && map_field[JV.PROP_PRECISION].type === "fixed") {
+            let formatStrs = ["#."], ffStr = (customizeCfg && customizeCfg.fillZero)?"0":"#";
+            for (let idx = 0; idx < parseInt(map_field[JV.PROP_FIXED_PRECISION_AMT]); idx++) {
+                formatStrs.push(ffStr);
+            }
+            if (tab_field[JV.PROP_FORMAT] && tab_field[JV.PROP_FORMAT].indexOf(",") >= 0) {
+                tab_field[JV.PROP_FORMAT] = "," + formatStrs.join("");
+            } else {
+                tab_field[JV.PROP_FORMAT] = formatStrs.join("");
+            }
+        }
+    },
+    resetFlexibleFormat: function (tab_field, ref_field, flexiblePrecisionRefObj, valueIdx, customizeCfg) {
+        let precisionAmt = 2;
+        if (ref_field && flexiblePrecisionRefObj && valueIdx >= 0) {
+            precisionAmt = flexiblePrecisionRefObj["refUnit_" + ref_field[valueIdx]];
+            if (precisionAmt === null || precisionAmt === undefined) precisionAmt = flexiblePrecisionRefObj["refUnit_其他未列单位"];
+        }
+        let formatStrs = ["#."], ffStr = (customizeCfg && customizeCfg.fillZero)?"0":"#";
+        for (let idx = 0; idx < precisionAmt; idx++) {
+            formatStrs.push(ffStr);
+        }
+        if (tab_field[JV.PROP_FORMAT] && tab_field[JV.PROP_FORMAT].indexOf(",") >= 0) {
+            tab_field[JV.PROP_FORMAT] = "," + formatStrs.join("");
+        } else {
+            tab_field[JV.PROP_FORMAT] = formatStrs.join("");
+        }
+    },
     decorateValue: function (cell, controls) {
         if (controls) {
             let val = cell[JV.PROP_VALUE];

+ 19 - 7
modules/reports/rpt_component/jpc_bill_tab.js

@@ -50,7 +50,7 @@ JpcBillTabSrv.prototype.createNew = function(){
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
         return rst;
     };
-    JpcBillTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, $CURRENT_RPT) {
+    JpcBillTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [], tabRstLst = [];
         //1 calculate the band position
         let pageStatus = [true, false, false, false, false, false, false, false];
@@ -58,7 +58,7 @@ JpcBillTabSrv.prototype.createNew = function(){
         //2. start to output detail-part
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         //2.1 output content
-        tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT));
+        tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT, customizeCfg));
         //2.2 output discrete
         tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, pageStatus, page - 1, 1, 0, $CURRENT_RPT));
         for (let i = 0; i < tabRstLst.length; i++) {
@@ -97,7 +97,7 @@ JpcBillTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcBillTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT) {
+    JpcBillTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, pageStatus, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
@@ -110,17 +110,29 @@ JpcBillTabSrv.prototype.createNew = function(){
                 } else if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
                     data_details = dataObj[JV.DATA_MASTER_DATA];
                 }
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
-                    let data_field = null;
+                    let data_field = null, map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
                     if (me.disp_fields_idx.length > i && me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX) {
                         data_field = data_details[me.disp_fields_idx[i]];
                     } else {
-                        data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
-                        if (data_field) {
-                            data_field = data_field[JV.PROP_AD_HOC_DATA];
+                        if (map_data_field) {
+                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
                         }
                     }
+                    if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                        if (flexiblePrecisionRefObj === null) {
+                            flexiblePrecisionRefObj = {};
+                            flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
+                            for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
+                                flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
+                            }
+                        }
+                        JpcFieldHelper.resetFlexibleFormat(tab_field, flexibleRefField, flexiblePrecisionRefObj, page - 1, customizeCfg);
+                    } else {
+                        if (page === 1) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
+                    }
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let val = JpcFieldHelper.getValue(data_field, page - 1);
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);

+ 50 - 7
modules/reports/rpt_component/jpc_cross_tab.js

@@ -1,4 +1,5 @@
 let JV = require('./jpc_value_define');
+let JE = require('./jpc_rte');
 let JpcFieldHelper = require('./helper/jpc_helper_field');
 let JpcBandHelper = require('./helper/jpc_helper_band');
 let JpcBand = require('./jpc_band');
@@ -325,7 +326,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         //...
         return rst;
     };
-    JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT) {
+    JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [], tabRstLst = [];
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
@@ -363,11 +364,11 @@ JpcCrossTabSrv.prototype.createNew = function(){
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
             //2. start to output detail-part
             //2.1 Row-Tab
-            tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             //2.2 Col-Tab
-            tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             //2.3 Content-Tab
-            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             //2.4 Sum-Tab Row
             //2.4 Sum-tab Col
             tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
@@ -383,7 +384,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputRowTab = function(rptTpl, dataObj, page, bands, unitFactor, controls) {
+    JpcCrossTabResult.outputRowTab = function(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW];
         let band = bands[tab[JV.PROP_BAND_NAME]];
@@ -394,12 +395,26 @@ JpcCrossTabSrv.prototype.createNew = function(){
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let i = 0; i < me.row_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
                     let data_field = data_details[me.row_fields_idx[i]];
+                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let rows = valuesIdx.length;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
+                            if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                                if (flexiblePrecisionRefObj === null) {
+                                    flexiblePrecisionRefObj = {};
+                                    flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
+                                    for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
+                                        flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
+                                    }
+                                }
+                                JpcFieldHelper.resetFlexibleFormat(tab_field, flexibleRefField, flexiblePrecisionRefObj, valuesIdx[rowIdx], customizeCfg);
+                            } else {
+                                if (rowIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
+                            }
                             rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[rowIdx], serialsIdx[rowIdx], rows, rowIdx, 1, 0, unitFactor, true, controls));
                         }
                     }
@@ -408,7 +423,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputColTab = function(rptTpl, dataObj, page, bands, unitFactor, controls) {
+    JpcCrossTabResult.outputColTab = function(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [], firstTextOutput = true;
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL];
         let band = bands[tab[JV.PROP_BAND_NAME]];
@@ -418,12 +433,26 @@ JpcCrossTabSrv.prototype.createNew = function(){
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let i = 0; i < me.col_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
                     let data_field = data_details[me.col_fields_idx[i]];
+                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let cols = valuesIdx.length;
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
+                            if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                                if (flexiblePrecisionRefObj === null) {
+                                    flexiblePrecisionRefObj = {};
+                                    flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
+                                    for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
+                                        flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
+                                    }
+                                }
+                                JpcFieldHelper.resetFlexibleFormat(tab_field, flexibleRefField, flexiblePrecisionRefObj, valuesIdx[colIdx], customizeCfg);
+                            } else {
+                                if (colIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
+                            }
                             rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
                             //2. output texts
                             if (firstTextOutput) {
@@ -444,7 +473,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputContent = function (rptTpl, dataObj, page, bands, unitFactor, controls) {
+    JpcCrossTabResult.outputContent = function (rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
@@ -454,14 +483,28 @@ JpcCrossTabSrv.prototype.createNew = function(){
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     let data_field = data_details[me.content_fields_idx[i]];
+                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let rows = contentValuesIdx.length;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                             let cols = contentValuesIdx[rowIdx].length;
                             for (let colIdx = 0; colIdx < cols; colIdx++) {
+                                if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                                    if (flexiblePrecisionRefObj === null) {
+                                        flexiblePrecisionRefObj = {};
+                                        flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
+                                        for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
+                                            flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
+                                        }
+                                    }
+                                    JpcFieldHelper.resetFlexibleFormat(tab_field, flexibleRefField, flexiblePrecisionRefObj, contentValuesIdx[rowIdx][colIdx], customizeCfg);
+                                } else {
+                                    if (colIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
+                                }
                                 rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][colIdx], -1, rows, rowIdx, cols, colIdx, unitFactor, true, controls));
                             }
                         }

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

@@ -271,7 +271,7 @@ JpcExSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcResult.outputAsSimpleJSONPageArray = function(rptTpl, dataObj, startPage, endPage, defProperties) {
+    JpcResult.outputAsSimpleJSONPageArray = function(rptTpl, dataObj, startPage, endPage, defProperties, customizeCfg) {
         let me = this, rst = {};
         if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
             rst[JV.NODE_CONTROL_COLLECTION] = private_buildDftControls(rptTpl, (defProperties === null)?null:defProperties.ctrls);
@@ -287,7 +287,7 @@ JpcExSrv.prototype.createNew = function(){
                 for (let page = startPage; page <= endPage; page++) {
                     me.runTimePageData.currentPage = page;
                     me.executeFormulas(JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me);
-                    rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst[JV.NODE_CONTROL_COLLECTION]));
+                    rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst[JV.NODE_CONTROL_COLLECTION], customizeCfg));
                 }
                 if (bands[JV.BAND_PROP_MERGE_BAND]) {
                     let mergedBand = {}, band = bands[JV.BAND_PROP_MERGE_BAND];
@@ -306,7 +306,7 @@ JpcExSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, bands, page, controls) {
+    JpcResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, bands, page, controls, customizeCfg) {
         let me = this, rst = null;
         function getPageMergeBorder() {
             let rst = null;
@@ -330,7 +330,7 @@ JpcExSrv.prototype.createNew = function(){
                     if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                         adHocMergePos = {};
                     }
-                    rst[JV.PROP_CELLS] = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, adHocMergePos, me);
+                    rst[JV.PROP_CELLS] = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, adHocMergePos, me, customizeCfg);
                     if (adHocMergePos) {
                         adHocMergePos[JV.NODE_PAGE_SIZE] = JpcCommonHelper.getPageSize(rptTpl);
                         rst[JV.PAGE_SPECIAL_MERGE_POS] = adHocMergePos;
@@ -338,13 +338,13 @@ JpcExSrv.prototype.createNew = function(){
 
                 } else {
                     if (!me.isFollowMode) {
-                        rst[JV.PROP_CELLS] = me.flowTabEx.outputAsSimpleJSONPage(rptTpl, dataObj, page - (me.totalPages - me.exTotalPages), bands, controls, adHocMergePos, me);
+                        rst[JV.PROP_CELLS] = me.flowTabEx.outputAsSimpleJSONPage(rptTpl, dataObj, page - (me.totalPages - me.exTotalPages), bands, controls, adHocMergePos, me, customizeCfg);
                     }
                 }
             } else if (me.crossTab) {
-                rst[JV.PROP_CELLS] = me.crossTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me);
+                rst[JV.PROP_CELLS] = me.crossTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
             } else if (me.billTab) {
-                rst[JV.PROP_CELLS] = me.billTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me);
+                rst[JV.PROP_CELLS] = me.billTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, me, customizeCfg);
             }
             if (!(me.flowTab && me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY)) {
                 let pageMergeBorder = getPageMergeBorder();

+ 10 - 0
modules/reports/rpt_component/jpc_field.js

@@ -48,6 +48,16 @@ let JpcField = {
             item[JV.PROP_ID] = fieldNode[JV.PROP_ID];
             item[JV.PROP_NAME] = fieldNode[JV.PROP_NAME];
             item[JV.PROP_DATA_TYPE] = fieldNode[JV.PROP_DATA_TYPE];
+            if (fieldNode[JV.PROP_PRECISION]) {
+                item[JV.PROP_PRECISION] = {};
+                item[JV.PROP_PRECISION].type = fieldNode[JV.PROP_PRECISION].type;
+                if (fieldNode[JV.PROP_PRECISION].type === 'fixed') {
+                    item[JV.PROP_FIXED_PRECISION_AMT] = fieldNode[JV.PROP_FIXED_PRECISION_AMT];
+                } else {
+                    item[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID] = fieldNode[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID];
+                    item.flexiblePrecisionRefObj = fieldNode.flexiblePrecisionRefObj;
+                }
+            }
             item.DataNodeName = dataNodeName;
             item.DataSeq = sequence;
             parentObj[JV.PROP_ID + "_" + fieldNode[JV.PROP_ID]] = item;

+ 37 - 13
modules/reports/rpt_component/jpc_flow_tab.js

@@ -646,7 +646,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
         return rst;
     };
-    JpcFlowTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, adHocMergePos, $CURRENT_RPT) {
+    JpcFlowTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, adHocMergePos, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [], tabRstLst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
@@ -661,7 +661,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
             // 2.1 Content-Tab
-            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT));
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT, customizeCfg));
             // 2.2 Column tab
             tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, 0));
             // 2.3 Sum Seg
@@ -695,7 +695,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             for (let pi = 0; pi < me.multiCols; pi++) {
                 let actualPage = (page - 1) * me.multiCols + pi + 1;
                 // 2.1 Content-Tab
-                tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT));
+                tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT, customizeCfg));
                 // 2.2 Column tab
                 tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, pi));
                 // 2.3 Sum Seg
@@ -734,7 +734,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcFlowTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, multiColIdx, $CURRENT_RPT) {
+    JpcFlowTabResult.outputContent = function(rptTpl, dataObj, page, bands, unitFactor, controls, multiColIdx, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_CONTENT];
@@ -758,20 +758,32 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     rowGrandTotal.push(0.0);
                 }
                 //normal content
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                     for (let i = 0; i < tab_fields.length; i++) {
                         let tab_field = tab_fields[i];
-                        let data_field = null;
+                        let data_field = null,
+                            map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
                         if (me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX) {
                             data_field = data_details[me.disp_fields_idx[i]];
                         } else {
-                            data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
-                            if (data_field) {
-                                data_field = data_field[JV.PROP_AD_HOC_DATA];
+                            if (map_data_field) {
+                                data_field = map_data_field[JV.PROP_AD_HOC_DATA];
                             }
                         }
+                        if (map_data_field && map_data_field[JV.PROP_PRECISION] && map_data_field.flexiblePrecisionRefObj) {
+                            if (flexiblePrecisionRefObj === null) {
+                                flexiblePrecisionRefObj = {};
+                                flexibleRefField = JE.F(map_data_field[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
+                                for (let decimalObj of map_data_field.flexiblePrecisionRefObj) {
+                                    flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
+                                }
+                            }
+                            JpcFieldHelper.resetFlexibleFormat(tab_field, flexibleRefField, flexiblePrecisionRefObj, contentValuesIdx[rowIdx][2], customizeCfg);
+                        } else {
+                            if (rowIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
+                        }
                         if (!(tab_field[JV.PROP_HIDDEN])) {
-                            // rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
                             if (contentValuesIdx[rowIdx][0] !== JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) {
                                 rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
                             } else if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_AUTO_HEIGHT) {
@@ -797,15 +809,27 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE) {
                         for (let idx_ex = 0; idx_ex < tab_fields_ex.length; idx_ex++) {
                             let tab_fieldex = tab_fields_ex[idx_ex];
-                            let data_fieldex = null;
+                            let data_fieldex = null, map_data_fieldex = JE.F(tab_fieldex[JV.PROP_FIELD_ID], $CURRENT_RPT);
                             if (me.disp_fields_ex_idx[idx_ex] !== JV.BLANK_FIELD_INDEX) {
                                 data_fieldex = data_details_ex[me.disp_fields_ex_idx[idx_ex]];
                             } else {
-                                data_fieldex = JE.F(tab_fieldex[JV.PROP_FIELD_ID], $CURRENT_RPT);
-                                if (data_fieldex) {
-                                    data_fieldex = data_fieldex[JV.PROP_AD_HOC_DATA];
+                                if (map_data_fieldex) {
+                                    data_fieldex = map_data_fieldex[JV.PROP_AD_HOC_DATA];
                                 }
                             }
+                            if (map_data_fieldex && map_data_fieldex[JV.PROP_PRECISION] && map_data_fieldex.flexiblePrecisionRefObj) {
+                                if (flexiblePrecisionRefObj === null) {
+                                    flexiblePrecisionRefObj = {};
+                                    flexibleRefField = JE.F(map_data_fieldex[JV.PROP_PRECISION][JV.PROP_FLEXIBLE_REF_FILED_ID], $CURRENT_RPT);
+                                    for (let decimalObj of map_data_fieldex.flexiblePrecisionRefObj) {
+                                        flexiblePrecisionRefObj["refUnit_" + decimalObj.unit] = decimalObj.decimal;
+                                    }
+                                }
+                                JpcFieldHelper.resetFlexibleFormat(tab_fieldex, flexibleRefField, flexiblePrecisionRefObj, contentValuesIdx[rowIdx][2], customizeCfg);
+                            } 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));

+ 17 - 0
modules/reports/util/rpt_construct_data_util.js

@@ -282,6 +282,8 @@ class Rpt_Data_Extractor {
         // fsUtil.writeObjToFile(rptDataObj, "D:/GitHome/ConstructionCost/tmp/insertedOriginalData.jsp");
         // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/insertedRawDataData.jsp");
         // fsUtil.writeObjToFile($PROJECT, "D:/GitHome/ConstructionCost/tmp/$PROJECTData.jsp");
+        // fsUtil.writeObjToFile(tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS], "D:/GitHome/ConstructionCost/tmp/masterFieldsAfterAssemble.jsp");
+        // fsUtil.writeObjToFile(tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS], "D:/GitHome/ConstructionCost/tmp/detailFieldsAfterAssemble.jsp");
         return rptDataObj;
     };
 
@@ -975,6 +977,21 @@ function assembleFields(fieldList, rstDataArr, $PROJECT) {
     if (fieldList) {
         for (let field of fieldList) {
             shielded_exec_env($PROJECT, field, rstDataArr);
+            if ("Precision" in field) {
+                if (field["Precision"]["type"] === "fixed") {
+                    let vrst = eval(field["Precision"]["fixedMapExpression"]);
+                    if (vrst && vrst.length === 1) {
+                        field.fixedPrecisionNum = vrst[0];
+                        vrst.splice(0,1);
+                    }
+                } else if (field["Precision"]["type"] === "flexible") {
+                    let vrst = eval(field["Precision"]["flexibleMapExpression"]);
+                    if (vrst && vrst.length === 1) {
+                        field.flexiblePrecisionRefObj =vrst[0];
+                        vrst.splice(0,1);
+                    }
+                }
+            }
         }
     }
 }

+ 10 - 0
public/web/rpt_value_define.js

@@ -83,6 +83,11 @@ const JV = {
     PROP_SUM_CALC_AHEAD: "统计前计算",
     PROP_SUM_CACL_TYPE: "计算类型",
     PROP_FIELD_EXP_MAP: "mapExpression",
+    PROP_PRECISION: "Precision",
+    PROP_FIXED_PRECISION_AMT: "fixedPrecisionNum",
+    PROP_FIELD_EXP_FIXED_MAP: "fixedMapExpression",
+    PROP_FIELD_EXP_FLEXIBLE_MAP: "flexibleMapExpression",
+    PROP_FLEXIBLE_REF_FILED_ID: "flexibleRefFieldID",
 
     NODE_FONT_COLLECTION: "font_collection",
     NODE_STYLE_COLLECTION: "style_collection",
@@ -197,6 +202,11 @@ const JV = {
     PAGE_STATUS: ["EveryPage","FirstPage", "LastPage", "SegmentStart", "SegmentEnd", "Group", "CrossRowEnd", "CrossColEnd"],
 
     CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap"],
+    CONTROL_PROP_IDX_SHRINK: 0,
+    CONTROL_PROP_IDX_SHOW_ZERO: 1,
+    CONTROL_PROP_IDX_HORIZON: 2,
+    CONTROL_PROP_IDX_VERTICAL: 3,
+    CONTROL_PROP_IDX_WRAP: 4,
     BORDER_STYLE_PROPS: ["LineWeight", "DashStyle", "Color"],
     PROP_LINE_WEIGHT: "LineWeight",
     PROP_DASH_STYLE: "DashStyle",

+ 47 - 9
web/maintain/report/js/rpt_tpl_field_map.js

@@ -9,7 +9,7 @@
 let fieldMapTreeOprObj = {
     treeObj : null,
     currentNode: null,
-    dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image'],
+    dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image', 'object'],
     iniTree: function(rptTpl) {
         var me = this;
         let fieldMapList = me.buildTreeData(rptTpl);
@@ -137,15 +137,53 @@ let fieldMapTreeOprObj = {
         }
     },
     createMapFieldByNode: function (node) {
-        let rst = {};
-        rst[JV.PROP_ID] = node[JV.PROP_ID];
-        rst[JV.PROP_NAME] = node[JV.PROP_NAME];
-        rst[JV.PROP_DATA_TYPE] = node[JV.PROP_DATA_TYPE];
-        rst.mapExpression = node.mapExpression;
-        rst.adHocFormula = node.adHocFormula;
-        rst.descr = node.descr;
-        rst.Title = "ID: " + node[JV.PROP_ID];
+        let rst = {}, me = this;
+        me.copyMapFieldNode(node, rst);
         return rst;
+    },
+    copyMapFieldNode: function (src, dest) {
+        dest[JV.PROP_ID] = src[JV.PROP_ID];
+        dest[JV.PROP_NAME] = src[JV.PROP_NAME];
+        dest[JV.PROP_DATA_TYPE] = src[JV.PROP_DATA_TYPE];
+        dest.mapExpression = src.mapExpression;
+        dest.adHocFormula = src.adHocFormula;
+        dest.descr = src.descr;
+        dest.Title = "ID: " + src[JV.PROP_ID];
+        if (src.Precision) {
+            dest.Precision = src.Precision;
+        }
+    },
+    refreshFields: function () {
+        let me = this;
+        if (me.treeObj && selectableFiledTreeOprObj.treeObj) {
+            let selectableFields = [];
+            let private_get_all_selectable_fields = function (fieldNode) {
+                if (fieldNode.isParent) {
+                    for (let dtlSF of fieldNode.items) {
+                        private_get_all_selectable_fields(dtlSF);
+                    }
+                } else {
+                    selectableFields.push(fieldNode);
+                }
+            };
+            let selectableFieldNodes = selectableFiledTreeOprObj.treeObj.getNodes();
+            for (let subFn of selectableFieldNodes) {
+                private_get_all_selectable_fields(subFn);
+            }
+            let topNodes = me.treeObj.getNodes();
+            for (let node of topNodes) {
+                if (node.items && node.items.length > 0) {
+                    for (let dtl of node.items) {
+                        for (let sf of selectableFields) {
+                            if (sf.ID === dtl.ID) {
+                                me.copyMapFieldNode(sf, dtl);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
 };
 

+ 1 - 0
web/maintain/report/rpt_tpl_detail_mapping_fields.html

@@ -15,6 +15,7 @@
                     </div>
                 </div>
             </div>
+            <button class="btn btn-primary" onclick="fieldMapTreeOprObj.refreshFields()" style="display:none">刷新指标</button>
         </div>
     </div>
 </div>