Browse Source

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionOperation

zhongzewei 7 years ago
parent
commit
64be315c6c

+ 2 - 1
modules/all_models/compilation.js

@@ -20,6 +20,7 @@ let engineeringListSchema = new Schema({
     }
     }
 }, {_id: false});
 }, {_id: false});
 let childrenSchema = new Schema({
 let childrenSchema = new Schema({
+    id:String,
     // 计价名称
     // 计价名称
     name: String,
     name: String,
     // 工程专业列表
     // 工程专业列表
@@ -36,7 +37,7 @@ let childrenSchema = new Schema({
     type: {
     type: {
         type: Number
         type: Number
     }
     }
-});
+},{_id: false});
 let modelSchema = {
 let modelSchema = {
     // 是否发布
     // 是否发布
     is_release: {
     is_release: {

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

@@ -3,14 +3,15 @@ let JpcFieldHelper = require('./jpc_helper_field');
 
 
 let JpcCommonOutputHelper = {
 let JpcCommonOutputHelper = {
     createCommonOutputWithoutDecorate: function (node, value) {
     createCommonOutputWithoutDecorate: function (node, value) {
-        let rst = {};
+        let me = this, rst = {};
         //1. font/style/control
         //1. font/style/control
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
         rst[JV.PROP_CONTROL] = node[[JV.PROP_CONTROL]];
         rst[JV.PROP_CONTROL] = node[[JV.PROP_CONTROL]];
         rst[JV.PROP_STYLE] = node[[JV.PROP_STYLE]];
         rst[JV.PROP_STYLE] = node[[JV.PROP_STYLE]];
         //2. value
         //2. value
         rst[JV.PROP_VALUE] = 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) {
         if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] !== null) {
             rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX] + rst[JV.PROP_VALUE];
             rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX] + rst[JV.PROP_VALUE];
         }
         }
@@ -20,7 +21,7 @@ let JpcCommonOutputHelper = {
         return rst;
         return rst;
     },
     },
     createCommonOutput: function (node, value, controls) {
     createCommonOutput: function (node, value, controls) {
-        let rst = {};
+        let me = this, rst = {};
         //1. font/style/control
         //1. font/style/control
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
         rst[JV.PROP_CONTROL] = node[[JV.PROP_CONTROL]];
         rst[JV.PROP_CONTROL] = node[[JV.PROP_CONTROL]];
@@ -28,7 +29,8 @@ let JpcCommonOutputHelper = {
         //2. value
         //2. value
         rst[JV.PROP_VALUE] = value;
         rst[JV.PROP_VALUE] = value;
         JpcFieldHelper.decorateValue(rst, controls);
         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] !== "") {
         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];
             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];
             rst[JV.PROP_VALUE] = rst[JV.PROP_VALUE] + node[JV.PROP_SUFFIX];
         }
         }
         return rst;
         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 {
                         } else {
                             break;
                             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){
 function comdify(numStr){
     let re = /\d{1,3}(?=(\d{3})+$)/g;
     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;
             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) {
     decorateValue: function (cell, controls) {
         if (controls) {
         if (controls) {
             let val = cell[JV.PROP_VALUE];
             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));
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
         return rst;
         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 = [];
         let me = this, rst = [], tabRstLst = [];
         //1 calculate the band position
         //1 calculate the band position
         let pageStatus = [true, false, false, false, false, false, false, false];
         let pageStatus = [true, false, false, false, false, false, false, false];
@@ -58,7 +58,7 @@ JpcBillTabSrv.prototype.createNew = function(){
         //2. start to output detail-part
         //2. start to output detail-part
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         //2.1 output content
         //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
         //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));
         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++) {
         for (let i = 0; i < tabRstLst.length; i++) {
@@ -97,7 +97,7 @@ JpcBillTabSrv.prototype.createNew = function(){
         }
         }
         return rst;
         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 me = this, rst = [];
         let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];
         let tab = rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         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]) {
                 } else if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
                     data_details = dataObj[JV.DATA_MASTER_DATA];
                     data_details = dataObj[JV.DATA_MASTER_DATA];
                 }
                 }
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[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) {
                     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]];
                         data_field = data_details[me.disp_fields_idx[i]];
                     } else {
                     } 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])) {
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let val = JpcFieldHelper.getValue(data_field, page - 1);
                         let val = JpcFieldHelper.getValue(data_field, page - 1);
                         let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
                         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 JV = require('./jpc_value_define');
+let JE = require('./jpc_rte');
 let JpcFieldHelper = require('./helper/jpc_helper_field');
 let JpcFieldHelper = require('./helper/jpc_helper_field');
 let JpcBandHelper = require('./helper/jpc_helper_band');
 let JpcBandHelper = require('./helper/jpc_helper_band');
 let JpcBand = require('./jpc_band');
 let JpcBand = require('./jpc_band');
@@ -325,7 +326,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         //...
         //...
         return rst;
         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 me = this, rst = [], tabRstLst = [];
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
@@ -363,11 +364,11 @@ JpcCrossTabSrv.prototype.createNew = function(){
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
             //2. start to output detail-part
             //2. start to output detail-part
             //2.1 Row-Tab
             //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
             //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
             //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 Row
             //2.4 Sum-tab Col
             //2.4 Sum-tab Col
             tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
             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;
         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 me = this, rst = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         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 data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let serialsIdx = me.dispSerialIdxLst_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++) {
                 for (let i = 0; i < me.row_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
                     let data_field = data_details[me.row_fields_idx[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])) {
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let rows = valuesIdx.length;
                         let rows = valuesIdx.length;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                         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));
                             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;
         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 me = this, rst = [], firstTextOutput = true;
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         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 tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let i = 0; i < me.col_fields_idx.length; i++) {
                 for (let i = 0; i < me.col_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
                     let data_field = data_details[me.col_fields_idx[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])) {
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let cols = valuesIdx.length;
                         let cols = valuesIdx.length;
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
                         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));
                             rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
                             //2. output texts
                             //2. output texts
                             if (firstTextOutput) {
                             if (firstTextOutput) {
@@ -444,7 +473,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         }
         return rst;
         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 me = this, rst = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         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 tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     let tab_field = tab_fields[i];
                     let data_field = data_details[me.content_fields_idx[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])) {
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let rows = contentValuesIdx.length;
                         let rows = contentValuesIdx.length;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
                             let cols = contentValuesIdx[rowIdx].length;
                             let cols = contentValuesIdx[rowIdx].length;
                             for (let colIdx = 0; colIdx < cols; colIdx++) {
                             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));
                                 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;
         return rst;
     };
     };
-    JpcResult.outputAsSimpleJSONPageArray = function(rptTpl, dataObj, startPage, endPage, defProperties) {
+    JpcResult.outputAsSimpleJSONPageArray = function(rptTpl, dataObj, startPage, endPage, defProperties, customizeCfg) {
         let me = this, rst = {};
         let me = this, rst = {};
         if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
         if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
             rst[JV.NODE_CONTROL_COLLECTION] = private_buildDftControls(rptTpl, (defProperties === null)?null:defProperties.ctrls);
             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++) {
                 for (let page = startPage; page <= endPage; page++) {
                     me.runTimePageData.currentPage = page;
                     me.runTimePageData.currentPage = page;
                     me.executeFormulas(JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me);
                     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]) {
                 if (bands[JV.BAND_PROP_MERGE_BAND]) {
                     let mergedBand = {}, band = 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;
         return rst;
     };
     };
-    JpcResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, bands, page, controls) {
+    JpcResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, bands, page, controls, customizeCfg) {
         let me = this, rst = null;
         let me = this, rst = null;
         function getPageMergeBorder() {
         function getPageMergeBorder() {
             let rst = null;
             let rst = null;
@@ -330,7 +330,7 @@ JpcExSrv.prototype.createNew = function(){
                     if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                     if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                         adHocMergePos = {};
                         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) {
                     if (adHocMergePos) {
                         adHocMergePos[JV.NODE_PAGE_SIZE] = JpcCommonHelper.getPageSize(rptTpl);
                         adHocMergePos[JV.NODE_PAGE_SIZE] = JpcCommonHelper.getPageSize(rptTpl);
                         rst[JV.PAGE_SPECIAL_MERGE_POS] = adHocMergePos;
                         rst[JV.PAGE_SPECIAL_MERGE_POS] = adHocMergePos;
@@ -338,13 +338,13 @@ JpcExSrv.prototype.createNew = function(){
 
 
                 } else {
                 } else {
                     if (!me.isFollowMode) {
                     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) {
             } 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) {
             } 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)) {
             if (!(me.flowTab && me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY)) {
                 let pageMergeBorder = getPageMergeBorder();
                 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_ID] = fieldNode[JV.PROP_ID];
             item[JV.PROP_NAME] = fieldNode[JV.PROP_NAME];
             item[JV.PROP_NAME] = fieldNode[JV.PROP_NAME];
             item[JV.PROP_DATA_TYPE] = fieldNode[JV.PROP_DATA_TYPE];
             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.DataNodeName = dataNodeName;
             item.DataSeq = sequence;
             item.DataSeq = sequence;
             parentObj[JV.PROP_ID + "_" + fieldNode[JV.PROP_ID]] = item;
             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));
         rst = rst.concat(JpcDiscreteHelper.outputPreviewDiscreteInfo(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO], bands, unitFactor, pageStatus));
         return rst;
         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 me = this, rst = [], tabRstLst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
@@ -661,7 +661,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
             // 2.1 Content-Tab
             // 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
             // 2.2 Column tab
             tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, 0));
             tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, 0));
             // 2.3 Sum Seg
             // 2.3 Sum Seg
@@ -695,7 +695,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             for (let pi = 0; pi < me.multiCols; pi++) {
             for (let pi = 0; pi < me.multiCols; pi++) {
                 let actualPage = (page - 1) * me.multiCols + pi + 1;
                 let actualPage = (page - 1) * me.multiCols + pi + 1;
                 // 2.1 Content-Tab
                 // 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
                 // 2.2 Column tab
                 tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, pi));
                 tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, pi));
                 // 2.3 Sum Seg
                 // 2.3 Sum Seg
@@ -734,7 +734,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         }
         }
         return rst;
         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 me = this, rst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         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];
         let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_CONTENT];
@@ -758,20 +758,32 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     rowGrandTotal.push(0.0);
                     rowGrandTotal.push(0.0);
                 }
                 }
                 //normal content
                 //normal content
+                let flexiblePrecisionRefObj = null, flexibleRefField = null;
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                     for (let i = 0; i < tab_fields.length; i++) {
                     for (let i = 0; i < tab_fields.length; i++) {
                         let tab_field = tab_fields[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) {
                         if (me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX) {
                             data_field = data_details[me.disp_fields_idx[i]];
                             data_field = data_details[me.disp_fields_idx[i]];
                         } else {
                         } 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])) {
                         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) {
                             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));
                                 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) {
                             } 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) {
                     if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE) {
                         for (let idx_ex = 0; idx_ex < tab_fields_ex.length; idx_ex++) {
                         for (let idx_ex = 0; idx_ex < tab_fields_ex.length; idx_ex++) {
                             let tab_fieldex = tab_fields_ex[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) {
                             if (me.disp_fields_ex_idx[idx_ex] !== JV.BLANK_FIELD_INDEX) {
                                 data_fieldex = data_details_ex[me.disp_fields_ex_idx[idx_ex]];
                                 data_fieldex = data_details_ex[me.disp_fields_ex_idx[idx_ex]];
                             } else {
                             } 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 (!(tab_fieldex[JV.PROP_HIDDEN])) {
                                 if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) {
                                 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));
                                     rst.push(me.outputTabField(band, tab_fieldex, data_fieldex, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));

+ 19 - 1
modules/reports/util/rpt_construct_data_util.js

@@ -222,8 +222,9 @@ class Rpt_Data_Extractor {
         let rationGLJDatas = getModuleDataByKey(rawDataObj.prjData, "ration_glj");
         let rationGLJDatas = getModuleDataByKey(rawDataObj.prjData, "ration_glj");
         let rationDatas = getModuleDataByKey(rawDataObj.prjData, "ration");
         let rationDatas = getModuleDataByKey(rawDataObj.prjData, "ration");
         let billsDatas = getModuleDataByKey(rawDataObj.prjData, "bills");
         let billsDatas = getModuleDataByKey(rawDataObj.prjData, "bills");
+        let decimal = rawDataObj.prj.property.decimal.glj.quantity;
         if (projectGLJDatas && rationGLJDatas && rationDatas && billsDatas) {
         if (projectGLJDatas && rationGLJDatas && rationDatas && billsDatas) {
-            gljUtil.calcProjectGLJQuantity(projectGLJDatas.data, rationGLJDatas.data, rationDatas.data, billsDatas.data, 4);
+            gljUtil.calcProjectGLJQuantity(projectGLJDatas.data, rationGLJDatas.data, rationDatas.data, billsDatas.data, decimal);
         }
         }
 
 
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
@@ -282,6 +283,8 @@ class Rpt_Data_Extractor {
         // fsUtil.writeObjToFile(rptDataObj, "D:/GitHome/ConstructionCost/tmp/insertedOriginalData.jsp");
         // fsUtil.writeObjToFile(rptDataObj, "D:/GitHome/ConstructionCost/tmp/insertedOriginalData.jsp");
         // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/insertedRawDataData.jsp");
         // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/insertedRawDataData.jsp");
         // fsUtil.writeObjToFile($PROJECT, "D:/GitHome/ConstructionCost/tmp/$PROJECTData.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;
         return rptDataObj;
     };
     };
 
 
@@ -975,6 +978,21 @@ function assembleFields(fieldList, rstDataArr, $PROJECT) {
     if (fieldList) {
     if (fieldList) {
         for (let field of fieldList) {
         for (let field of fieldList) {
             shielded_exec_env($PROJECT, field, rstDataArr);
             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);
+                    }
+                }
+            }
         }
         }
     }
     }
 }
 }

+ 8 - 6
modules/users/models/compilation_model.js

@@ -35,8 +35,8 @@ class CompilationModel extends BaseModel {
      */
      */
     async getCompilationList() {
     async getCompilationList() {
         // 筛选字段
         // 筛选字段
-        let field = {_id: 1, name: 1, is_release: 1, description: 1, "ration_valuation._id": 1, "ration_valuation.name": 1, "ration_valuation.enable": 1,
-            "bill_valuation._id": 1, "bill_valuation.name": 1, "bill_valuation.enable": 1};
+        let field = {_id: 1, name: 1, is_release: 1, description: 1, "ration_valuation.id": 1, "ration_valuation.name": 1, "ration_valuation.enable": 1,
+            "bill_valuation.id": 1, "bill_valuation.name": 1, "bill_valuation.enable": 1};
         let compilationData = await this.findDataByCondition({name: {$ne: ''}}, field, false);
         let compilationData = await this.findDataByCondition({name: {$ne: ''}}, field, false);
 
 
         return compilationData === null ? [] : compilationData;
         return compilationData === null ? [] : compilationData;
@@ -113,8 +113,10 @@ class CompilationModel extends BaseModel {
         }
         }
 
 
         let insertData = {};
         let insertData = {};
+        data.id = "12580";
         insertData[section + '_valuation'] = data;
         insertData[section + '_valuation'] = data;
         let result = await this.db.addToSet(condition, insertData);
         let result = await this.db.addToSet(condition, insertData);
+        console.log(result);
 
 
         return result.ok === undefined ? false : result.ok;
         return result.ok === undefined ? false : result.ok;
     }
     }
@@ -205,7 +207,7 @@ class CompilationModel extends BaseModel {
         let sectionString = section + '_valuation';
         let sectionString = section + '_valuation';
 
 
         for(let valuation of compilationData[sectionString]) {
         for(let valuation of compilationData[sectionString]) {
-            if (valuation._id.toString() === id) {
+            if (valuation.id.toString() === id) {
                 result = valuation;
                 result = valuation;
                 break;
                 break;
             }
             }
@@ -292,7 +294,7 @@ class CompilationModel extends BaseModel {
     async getEngineeringLib(valuationId, section, engineering) {
     async getEngineeringLib(valuationId, section, engineering) {
         let sectionString = section + "_valuation";
         let sectionString = section + "_valuation";
         let condition = {};
         let condition = {};
-        condition[sectionString + "._id"] = valuationId;
+        condition[sectionString + ".id"] = valuationId;
 
 
         let compilationData = await this.findDataByCondition(condition);
         let compilationData = await this.findDataByCondition(condition);
         if (compilationData === null) {
         if (compilationData === null) {
@@ -300,7 +302,7 @@ class CompilationModel extends BaseModel {
         }
         }
         let valuationData = null;
         let valuationData = null;
         for(let valuation of compilationData[sectionString]) {
         for(let valuation of compilationData[sectionString]) {
-            if(valuation._id.toString() === valuationId) {
+            if(valuation.id === valuationId) {
                 valuationData = valuation;
                 valuationData = valuation;
             }
             }
         }
         }
@@ -333,7 +335,7 @@ class CompilationModel extends BaseModel {
     async addEngineeringLib(valuationId, section, data) {
     async addEngineeringLib(valuationId, section, data) {
         let sectionString = section + "_valuation";
         let sectionString = section + "_valuation";
         let condition = {};
         let condition = {};
-        condition[sectionString + "._id"] = valuationId;
+        condition[sectionString + ".id"] = valuationId;
 
 
         let insertData = {};
         let insertData = {};
         insertData[sectionString + ".$.engineering_list"] = data;
         insertData[sectionString + ".$.engineering_list"] = data;

+ 1 - 1
modules/users/models/engineering_lib_model.js

@@ -77,10 +77,10 @@ class EngineeringLibModel extends BaseModel {
             // 查找计价规则表中是否有对应工程专业标准库的数据
             // 查找计价规则表中是否有对应工程专业标准库的数据
             let compilationModel = new CompilationModel();
             let compilationModel = new CompilationModel();
             let engineeringLib = await compilationModel.getEngineeringLib(valuationId, data.section, data.engineering);
             let engineeringLib = await compilationModel.getEngineeringLib(valuationId, data.section, data.engineering);
-
             if (engineeringLib === null) {
             if (engineeringLib === null) {
                 // 不存在则插入
                 // 不存在则插入
                 result = await this.db.create(data);
                 result = await this.db.create(data);
+                console.log(data);
             } else {
             } else {
                 delete data.id;
                 delete data.id;
                 delete data.section;
                 delete data.section;

+ 2 - 1
package.json

@@ -19,7 +19,8 @@
     "moment": "^2.18.1",
     "moment": "^2.18.1",
     "mongoose": "~4.13.12",
     "mongoose": "~4.13.12",
     "request": "^2.79.0",
     "request": "^2.79.0",
-    "tape": "^4.6.3"
+    "tape": "^4.6.3",
+    "uuid": "^3.1.0"
   },
   },
   "dependencies": {
   "dependencies": {
     "babel-core": "^6.26.0",
     "babel-core": "^6.26.0",

+ 51 - 15
public/web/id_tree.js

@@ -579,30 +579,35 @@ var idTree = {
 
 
         Tree.prototype.delete = function (node) {
         Tree.prototype.delete = function (node) {
             var success = false, that = this;
             var success = false, that = this;
-            var deleteIdIndex = function (nodes) {
+            if(node) success = that.m_delete([node]);
+            return success;
+        };
+        Tree.prototype.m_delete = function (nodes) {
+            let success = false, that = this;
+            let deleteIdIndex = function (nodes) {
                 nodes.forEach(function (node) {
                 nodes.forEach(function (node) {
                     delete that.nodes[that.prefix + node.getID()];
                     delete that.nodes[that.prefix + node.getID()];
                     deleteIdIndex(node.children);
                     deleteIdIndex(node.children);
                 })
                 })
-            }
-            if (node) {
-                deleteIdIndex([node]);
-                //delete this.nodes[this.prefix + node.getID()];
-                if (node.preSibling) {
-                    node.preSibling.setNextSibling(node.nextSibling);
-                } else if (node.nextSibling) {
-                    node.nextSibling.preSibling = null;
-                }
-                if (node.parent) {
-                    node.parent.children.splice(node.siblingIndex(), 1);
+            };
+            for(let n of nodes){
+                deleteIdIndex([n]);
+                if (n.preSibling) {
+                    n.preSibling.setNextSibling(n.nextSibling);
+                } else if (n.nextSibling) {
+                    n.nextSibling.preSibling = null;
+                }
+                if (n.parent) {
+                    n.parent.children.splice(n.siblingIndex(), 1);
                 } else {
                 } else {
-                    this.roots.splice(node.siblingIndex(), 1);
+                    this.roots.splice(n.siblingIndex(), 1);
                 }
                 }
-                tools.sortTreeItems(this);
-                success = true;
             }
             }
+            tools.sortTreeItems(this);
+            success = true;
             return success;
             return success;
         };
         };
+
         Tree.prototype.getDeleteData = function (node) {
         Tree.prototype.getDeleteData = function (node) {
             var data = [];
             var data = [];
             var addUpdateDataForDelete = function (datas, nodes) {
             var addUpdateDataForDelete = function (datas, nodes) {
@@ -621,6 +626,37 @@ var idTree = {
             }
             }
             return data;
             return data;
         };
         };
+        Tree.prototype.getDeleteDatas = function (deleteMap,deleteNodes){//批量删除
+            let datas = [];
+            addDeleteDatas(datas,deleteNodes);
+            for(let d of deleteNodes){
+                addPreUpdateData(datas,deleteMap,d.preSibling,d.nextSibling);
+            }
+           function addPreUpdateData(updateDatas,map,preSibling,nextSibling) {
+               if(preSibling && (map[preSibling.getID()] == undefined || map[preSibling.getID()] == null)){
+                   if(nextSibling){
+                      if(map[nextSibling.getID()]){//如果下一个节点也是要删除的,则再往下顺延
+                          addPreUpdateData(updateDatas,map,preSibling,nextSibling.nextSibling);
+                      }else {
+                          updateDatas.push({type: 'update', data: preSibling.tree.getDataTemplate(preSibling.getID(), preSibling.getParentID(),nextSibling.getID())});
+                      }
+                   }else {
+                       updateDatas.push({type: 'update', data: preSibling.tree.getDataTemplate(preSibling.getID(), preSibling.getParentID(),-1)});
+                   }
+               }
+           }
+
+            function addDeleteDatas(dataArray,nodes) {
+                for(let n of nodes){
+                    let delData = {};
+                    delData[n.tree.setting.id] = n.getID();
+                    dataArray.push({type: 'delete', data: delData});
+                    addDeleteDatas(dataArray,n.children);
+                }
+            }
+            return datas;
+        };
+
 
 
         /*Tree.prototype.editedData = function (field, id, newText) {
         /*Tree.prototype.editedData = function (field, id, newText) {
          var node = this.findNode(id), result = {allow: false, nodes: []};
          var node = this.findNode(id), result = {allow: false, nodes: []};

+ 10 - 0
public/web/rpt_value_define.js

@@ -83,6 +83,11 @@ const JV = {
     PROP_SUM_CALC_AHEAD: "统计前计算",
     PROP_SUM_CALC_AHEAD: "统计前计算",
     PROP_SUM_CACL_TYPE: "计算类型",
     PROP_SUM_CACL_TYPE: "计算类型",
     PROP_FIELD_EXP_MAP: "mapExpression",
     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_FONT_COLLECTION: "font_collection",
     NODE_STYLE_COLLECTION: "style_collection",
     NODE_STYLE_COLLECTION: "style_collection",
@@ -197,6 +202,11 @@ const JV = {
     PAGE_STATUS: ["EveryPage","FirstPage", "LastPage", "SegmentStart", "SegmentEnd", "Group", "CrossRowEnd", "CrossColEnd"],
     PAGE_STATUS: ["EveryPage","FirstPage", "LastPage", "SegmentStart", "SegmentEnd", "Group", "CrossRowEnd", "CrossColEnd"],
 
 
     CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap"],
     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"],
     BORDER_STYLE_PROPS: ["LineWeight", "DashStyle", "Color"],
     PROP_LINE_WEIGHT: "LineWeight",
     PROP_LINE_WEIGHT: "LineWeight",
     PROP_DASH_STYLE: "DashStyle",
     PROP_DASH_STYLE: "DashStyle",

+ 16 - 0
public/web/tree_sheet/tree_sheet_controller.js

@@ -113,6 +113,22 @@ var TREE_SHEET_CONTROLLER = {
                 }
                 }
             }
             }
         };
         };
+        controller.prototype.m_delete = function (nodes) {
+            var that = this, sels = this.sheet.getSelections();
+            if(nodes.length > 0){
+                if(this.tree.m_delete(nodes)){
+                    TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
+                        let rowCount = 0;
+                        for(let node of nodes){
+                            rowCount = rowCount+node.posterityCount() + 1;
+                        }
+                        that.sheet.deleteRows(sels[0].row, rowCount);
+                        that.setTreeSelected(that.tree.items[sels[0].row]);
+                        that.sheet.setSelection(sels[0].row,sels[0].col,1,sels[0].colCount);
+                    });
+                }
+            }
+        };
         controller.prototype.upLevel = function () {
         controller.prototype.upLevel = function () {
             var that = this;
             var that = this;
             if (this.tree.selected) {
             if (this.tree.selected) {

+ 0 - 39
web/maintain/report/js/cfg_const.js

@@ -1,42 +1,3 @@
-let setting_org = {
-    view: {
-        addHoverDom: zTreeOprObj.addHoverDom,
-        removeHoverDom: zTreeOprObj.removeHoverDom,
-        expandSpeed: "",
-        selectedMulti: false
-    },
-    edit: {
-        enable: true,
-        editNameSelectAll: true,
-        showRemoveBtn: true,
-        showRenameBtn: true,
-        removeTitle: "删除节点",
-        renameTitle: "更改名称"
-    },
-    data: {
-        keep: {
-            parent:true,
-            leaf:true
-        },
-        key: {
-            children: "items"
-        },
-        simpleData: {
-            enable: true,
-            idKey: "ID",
-            pIdKey: "ParentID",
-            rootPId: -1
-        }
-    },
-    callback:{
-        onClick: zTreeOprObj.onClick,
-        beforeRename: zTreeOprObj.beforeRename,
-        beforeRemove: zTreeOprObj.onBeforeRemove,
-        onRemove: zTreeOprObj.onRemove,
-        onRename: zTreeOprObj.onRename
-    }
-};
-
 let setting = {
 let setting = {
     view: {
     view: {
         addHoverDom: zTreeOprObj.addHoverDom,
         addHoverDom: zTreeOprObj.addHoverDom,

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

@@ -9,7 +9,7 @@
 let fieldMapTreeOprObj = {
 let fieldMapTreeOprObj = {
     treeObj : null,
     treeObj : null,
     currentNode: null,
     currentNode: null,
-    dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image'],
+    dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image', 'object'],
     iniTree: function(rptTpl) {
     iniTree: function(rptTpl) {
         var me = this;
         var me = this;
         let fieldMapList = me.buildTreeData(rptTpl);
         let fieldMapList = me.buildTreeData(rptTpl);
@@ -137,15 +137,53 @@ let fieldMapTreeOprObj = {
         }
         }
     },
     },
     createMapFieldByNode: function (node) {
     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;
         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;
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
     }
 };
 };
 
 

+ 5 - 1
web/maintain/report/js/rpt_tpl_main.js

@@ -1,6 +1,7 @@
 'use strict'
 'use strict'
 
 
-const IDMark_Switch = "_switch",
+const
+    IDMark_Switch = "_switch",
     IDMark_Icon = "_ico",
     IDMark_Icon = "_ico",
     IDMark_Span = "_span",
     IDMark_Span = "_span",
     IDMark_Input = "_input",
     IDMark_Input = "_input",
@@ -9,6 +10,7 @@ const IDMark_Switch = "_switch",
     IDMark_Remove = "_remove",
     IDMark_Remove = "_remove",
     IDMark_Ul = "_ul",
     IDMark_Ul = "_ul",
     IDMark_A = "_a";
     IDMark_A = "_a";
+    //以上的常量是在查找zTree默认生成的dom对象时用到(tID + 后缀)
 
 
 const NODE_LEVEL_COMPILATION_OLD = 0,
 const NODE_LEVEL_COMPILATION_OLD = 0,
     NODE_LEVEL_COMPILATION_NEW = 1,
     NODE_LEVEL_COMPILATION_NEW = 1,
@@ -348,6 +350,8 @@ let zTreeOprObj = {
     },
     },
     onDrop: function (event, treeId, treeNodes, targetNode, moveType, isCopy) {
     onDrop: function (event, treeId, treeNodes, targetNode, moveType, isCopy) {
         let me = zTreeOprObj;
         let me = zTreeOprObj;
+        zTreeOprObj.treeObj.checkNode(treeNodes[0], false, false);
+        treeNodes[0].released = false;
         let targetTopNode = me.getParentNodeByNodeLevel(targetNode, NODE_LEVEL_COMPILATION_NEW);
         let targetTopNode = me.getParentNodeByNodeLevel(targetNode, NODE_LEVEL_COMPILATION_NEW);
         let newTopNode = null;
         let newTopNode = null;
         let canContinue = false;
         let canContinue = false;

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

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

+ 33 - 4
web/users/js/template.js

@@ -413,15 +413,44 @@ $(document).ready(function () {
     $('#delete').click(function () {
     $('#delete').click(function () {
         let me = this;
         let me = this;
         $(me).addClass('disabled');
         $(me).addClass('disabled');
-        var selected = controller.tree.selected, updateData;
-        if (selected) {
-            updateData = controller.tree.getDeleteData(selected);
+        let selection = controller.sheet.getSelections()[0], updateData,deleteMap={},deleteNodes=[];
+        for(let i=0;i < selection.rowCount;i++){
+            let tem_node = controller.tree.items[selection.row+i];
+            if(i == 0){//第一个直接添加;
+                deleteMap[tem_node.getID()] = tem_node;
+                deleteNodes.push(tem_node); 
+            }else {
+                setNodeToMapAndArray(tem_node,deleteMap,deleteNodes);
+            }
+        }
+
+        if (deleteNodes.length > 0) {
+            updateData = controller.tree.getDeleteDatas(deleteMap,deleteNodes);
             CommonAjax.post(updateUrl, updateData, function (data) {
             CommonAjax.post(updateUrl, updateData, function (data) {
-                controller.delete();
+                controller.m_delete(deleteNodes);
                 controller.showTreeData();
                 controller.showTreeData();
                 $(me).removeClass('disabled');
                 $(me).removeClass('disabled');
             });
             });
         }
         }
+        function setNodeToMapAndArray(node,map,array) {
+            let nodeID = node.getID();
+            if(map[nodeID]==undefined||map[nodeID]==null){
+                newMap(node,node.parent,map,array)
+            }
+            function newMap(node,parent,map,array) {
+                let nodeID =node.getID();
+                if(parent==null){//说明已经是最顶层了
+                    map[nodeID]=node;
+                    array.push(node);
+                }else {
+                    let parentID = parent.getID();
+                    if(map[parentID]==undefined||map[parentID]==null){
+                        newMap(node,parent.parent,map,array);
+                    }
+                }
+            }
+        }
+        
     });
     });
     $('#upLevel').click(function () {
     $('#upLevel').click(function () {
         let me = this;
         let me = this;

+ 1 - 1
web/users/views/compilation/add.html

@@ -12,7 +12,7 @@
         <div class="c-header" style="padding:0">
         <div class="c-header" style="padding:0">
             <ul class="nav nav-tabs">
             <ul class="nav nav-tabs">
                 <% valuationList.forEach(function(valuation) { %>
                 <% valuationList.forEach(function(valuation) { %>
-                <li role="presentation" <% if (valuation._id.toString() === valuationId) { %>class="active"<% } %>><a href="/compilation/valuation/<%= section %>/<%= valuation._id %>"><%= valuation.name %></a></li>
+                <li role="presentation" <% if (valuation.id.toString() === valuationId) { %>class="active"<% } %>><a href="/compilation/valuation/<%= section %>/<%= valuation.id %>"><%= valuation.name %></a></li>
                 <% }) %>
                 <% }) %>
             </ul>
             </ul>
         </div>
         </div>

+ 1 - 1
web/users/views/compilation/template.html

@@ -18,7 +18,7 @@
         <div class="c-header" style="padding:0">
         <div class="c-header" style="padding:0">
             <ul class="nav nav-tabs">
             <ul class="nav nav-tabs">
                 <% valuationList.forEach(function(valuation) { %>
                 <% valuationList.forEach(function(valuation) { %>
-                <li role="presentation" <% if (valuation._id.toString() === valuationId) { %>class="active"<% } %>><a href="/compilation/valuation/<%= section %>/<%= valuation._id %>"><%= valuation.name %></a></li>
+                <li role="presentation" <% if (valuation.id.toString() === valuationId) { %>class="active"<% } %>><a href="/compilation/valuation/<%= section %>/<%= valuation.id %>"><%= valuation.name %></a></li>
                 <% }) %>
                 <% }) %>
             </ul>
             </ul>
         </div>
         </div>

File diff suppressed because it is too large
+ 1 - 1
web/users/views/layout/layout.html