瀏覽代碼

code sync and tuning(独立指标)

TonyKang 7 年之前
父節點
當前提交
40ad86985a

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

@@ -2,7 +2,7 @@ let JV = require('../jpc_value_define');
 let JpcFieldHelper = require('./jpc_helper_field');
 
 let JpcCommonOutputHelper = {
-    createCommonOutputWithoutDecorate: function (node, value, controls) {
+    createCommonOutputWithoutDecorate: function (node, value) {
         let rst = {};
         //1. font/style/control
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
@@ -10,20 +10,11 @@ let JpcCommonOutputHelper = {
         rst[JV.PROP_STYLE] = node[[JV.PROP_STYLE]];
         //2. value
         rst[JV.PROP_VALUE] = value;
-        if (node[JV.PROP_FORMAT]) {
-            if (!(isNaN(parseFloat(rst[JV.PROP_VALUE])))) {
-                let dotIdx = node[JV.PROP_FORMAT].indexOf(".");
-                if (dotIdx >= 0) {
-                    rst[JV.PROP_VALUE] = parseFloat(rst[JV.PROP_VALUE]).toFixed(node[JV.PROP_FORMAT].length - dotIdx - 1);
-                } else {
-                    rst[JV.PROP_VALUE] = parseFloat(rst[JV.PROP_VALUE]).toFixed(0);
-                }
-            }
-        }
-        if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] != null) {
+        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];
         }
-        if (node[JV.PROP_SUFFIX] && rst[JV.PROP_VALUE] != null) {
+        if (node[JV.PROP_SUFFIX] && rst[JV.PROP_VALUE] !== null) {
             rst[JV.PROP_VALUE] = rst[JV.PROP_VALUE] + node[JV.PROP_SUFFIX];
         }
         return rst;
@@ -37,24 +28,37 @@ let JpcCommonOutputHelper = {
         //2. value
         rst[JV.PROP_VALUE] = value;
         JpcFieldHelper.decorateValue(rst, controls);
-        if (node[JV.PROP_FORMAT]) {
-            if (!(isNaN(parseFloat(rst[JV.PROP_VALUE])))) {
-                let dotIdx = node[JV.PROP_FORMAT].indexOf(".");
-                if (dotIdx >= 0) {
-                    rst[JV.PROP_VALUE] = parseFloat(rst[JV.PROP_VALUE]).toFixed(node[JV.PROP_FORMAT].length - dotIdx - 1);
-                } else {
-                    rst[JV.PROP_VALUE] = parseFloat(rst[JV.PROP_VALUE]).toFixed(0);
-                }
-            }
-        }
-        if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] != null && rst[JV.PROP_VALUE] != "") {
+        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];
         }
-        if (node[JV.PROP_SUFFIX] && rst[JV.PROP_VALUE] != null && rst[JV.PROP_VALUE] != "") {
+        if (node[JV.PROP_SUFFIX] && rst[JV.PROP_VALUE] !== null && rst[JV.PROP_VALUE] !== "") {
             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) {
+                rst[JV.PROP_VALUE] = parseFloat(rst[JV.PROP_VALUE]).toFixed(formatStr.length - dotIdx - 1);
+            } 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;
+    return numStr.replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re,"$&,")+s2;});
 }
 
 module.exports = JpcCommonOutputHelper;

+ 1 - 0
modules/reports/rpt_component/jpc_bill_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 JpcCommonHelper = require('./helper/jpc_helper_common');

+ 2 - 1
modules/reports/rpt_component/jpc_rte.js

@@ -1,9 +1,10 @@
 /**
  * Created by Tony on 2016/12/28.
  */
-
+let strUtil = require('../../../public/stringUtil');
 let JV = require('./jpc_value_define');
 let JE = {
+    $STR_UTIL: strUtil,
     F: function(fID, $CURRENT_RPT) {
         let rst = null;
         if ($CURRENT_RPT && ($CURRENT_RPT.fields[JV.NODE_DETAIL_FIELDS][JV.PROP_ID + "_" + fID])) {

+ 13 - 5
public/stringUtil.js

@@ -149,6 +149,10 @@ module.exports = {
         let regExp = new RegExp(FindText, "gm");
         return targetStr.replace(regExp, RepText);
     },
+    comdify: function(numStr){
+        let re = /\d{1,3}(?=(\d{3})+$)/g;
+        return numStr.replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re,"$&,")+s2;});
+    },
     convertToCaptionNum: function(num, isCurrency, isTraditionalCap) {
         let me = this, rst = "";
         if (/^\d*(\.\d*)?$/.test(num)) {
@@ -187,12 +191,16 @@ module.exports = {
                 //小数部分处理
                 if (numSplitArr.length > 1) {
                     len = numSplitArr[1].length;
-                    if (isCurrency && len > 2) len = 2;
-                    let fractionStr = [];
-                    for (let idx = 0; idx < len; idx++) {
-                        fractionStr.push(capChars[ parseInt(numSplitArr[1].charAt(idx))]+ (isCurrency?((idx === 0)?"角":"分"):""));
+                    if (parseInt(numSplitArr[1]) === 0) {
+                        rst = rst + (isCurrency?"元整":"");
+                    } else {
+                        if (isCurrency && len > 2) len = 2;
+                        let fractionStr = [];
+                        for (let idx = 0; idx < len; idx++) {
+                            fractionStr.push(capChars[ parseInt(numSplitArr[1].charAt(idx))]+ (isCurrency?((idx === 0)?"角":"分"):""));
+                        }
+                        rst = rst + (isCurrency?"元":"点") + fractionStr.join("");
                     }
-                    rst = rst + (isCurrency?"元":"点") + fractionStr.join("");
                 } else {
                     rst = rst + (isCurrency?"元整":"");
                 }

+ 4 - 2
web/maintain/report/js/cfg_const.js

@@ -297,7 +297,8 @@ let rptDataInfoSetting = {
         },
         key: {
             children: 'items',
-            name: "Name"
+            name: "Name",
+            title: "Title",
         },
         simpleData: {
             enable: true
@@ -380,7 +381,8 @@ let discreteFieldParamSetting = {
         },
         key: {
             children: 'items',
-            name: "Name"
+            name: "Name",
+            title: "Title",
         },
         simpleData: {
             enable: true

+ 10 - 0
web/maintain/report/js/rpt_tpl_cfg_helper.js

@@ -86,6 +86,11 @@ let rpt_tpl_cfg_helper = {
                 } else {
                     $("#eleSuffix").get(0).value = "";
                 }
+                if (treeNode[JV.PROP_FORMAT]) {
+                    $("#eleFormat").get(0).value = treeNode[JV.PROP_FORMAT];
+                } else {
+                    $("#eleFormat").get(0).value = "";
+                }
             } else {
                 $("#element_pre_suff")[0].style.display = "none";
             }
@@ -290,5 +295,10 @@ let rpt_tpl_cfg_helper = {
         if (dataInfoMapTreeOprObj.currentNode) {
             dataInfoMapTreeOprObj.currentNode[typeStr] = dom.value;
         }
+    },
+    changeFormat: function (dom) {
+        if (dataInfoMapTreeOprObj.currentNode) {
+            dataInfoMapTreeOprObj.currentNode[JV.PROP_FORMAT] = dom.value;
+        }
     }
 };

+ 11 - 6
web/maintain/report/js/rpt_tpl_data_map.js

@@ -59,8 +59,8 @@ let dataInfoMapTreeOprObj = {
     },
     buildBillData: function(rptTpl) {
         let me = this, rst = [];
-        let rootFieldNode = {Name: JV.NODE_BILL_CONTENT, type: "bill_data", isParent: true};
-        let discreteNode = {Name: JV.NODE_DISCRETE_INFO};
+        let rootFieldNode = {Name: JV.NODE_BILL_CONTENT, type: "bill_data", isParent: true, Title: ""};
+        let discreteNode = {Name: JV.NODE_DISCRETE_INFO, Title: ""};
         rst.push(rootFieldNode);
         rst.push(discreteNode);
         me.private_build_bill_data(rootFieldNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT], rptTpl);
@@ -89,10 +89,10 @@ let dataInfoMapTreeOprObj = {
         discreteNode.items = [];
         for (let i = 0; i < discreteData.length; i++) {
             let dtl = discreteData[i];
-            let item = {"Name": "子项(所在区域:" + dtl[JV.PROP_BAND_NAME] + ")", "items":[]};
+            let item = {"Name": "子项(所在区域:" + dtl[JV.PROP_BAND_NAME] + ")", "items":[], Title: ""};
             item[JV.PROP_BAND_NAME] = dtl[JV.PROP_BAND_NAME];
-            let discreteFieldsNode = {"Name": "离散字段集", "items": [], "isParent": true};
-            let discreteTextsNode = {"Name": "离散文本集", "items": [], "isParent": true};
+            let discreteFieldsNode = {"Name": "离散字段集", "items": [], "isParent": true, Title: ""};
+            let discreteTextsNode = {"Name": "离散文本集", "items": [], "isParent": true, Title: ""};
             item.items.push(discreteFieldsNode);
             item.items.push(discreteTextsNode);
 
@@ -126,11 +126,11 @@ let dataInfoMapTreeOprObj = {
             }
         }
         getField(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]);
-        getField(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_NO_MAPPING_FIELDS]);
         getField(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]);
         getField(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX]);
         getField(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]);
         getField(rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX]);
+        if (!rst) getField(rptTpl[JV.NODE_NO_MAPPING_FIELDS]);
         return rst;
     },
     private_get_param_by_id: function (paramId, rptTpl) {
@@ -159,6 +159,7 @@ let dataInfoMapTreeOprObj = {
                 rst[JV.PROP_NAME] = fieldData[JV.PROP_FIELD_ID];
             }
             me.private_copy_field_properties(fieldData, rst);
+            rst.Title = "ID: " + fieldData[JV.PROP_FIELD_ID];
         }
         return rst;
     },
@@ -171,6 +172,7 @@ let dataInfoMapTreeOprObj = {
         destination[JV.PROP_STYLE] = source[JV.PROP_STYLE];
         destination[JV.PROP_PREFIX] = source[JV.PROP_PREFIX];
         destination[JV.PROP_SUFFIX] = source[JV.PROP_SUFFIX];
+        if (source[JV.PROP_FORMAT]) destination[JV.PROP_FORMAT] = source[JV.PROP_FORMAT];
         destination[JV.PROP_AREA] = {};
         me.private_copy_area(source[JV.PROP_AREA], destination[JV.PROP_AREA]);
     },
@@ -193,6 +195,7 @@ let dataInfoMapTreeOprObj = {
                 rst[JV.PROP_NAME] = param[JV.PROP_PARAM_ID];
             }
             me.private_copy_param_properties(param, rst);
+            rst.Title = "ID: " + param[JV.PROP_PARAM_ID];
         }
         return rst;
     },
@@ -204,6 +207,7 @@ let dataInfoMapTreeOprObj = {
         destination[JV.PROP_STYLE] = source[JV.PROP_STYLE];
         destination[JV.PROP_PREFIX] = source[JV.PROP_PREFIX];
         destination[JV.PROP_SUFFIX] = source[JV.PROP_SUFFIX];
+        if (source[JV.PROP_FORMAT]) destination[JV.PROP_FORMAT] = source[JV.PROP_FORMAT];
         destination[JV.PROP_AREA] = {};
         me.private_copy_area(source[JV.PROP_AREA], destination[JV.PROP_AREA]);
     },
@@ -222,6 +226,7 @@ let dataInfoMapTreeOprObj = {
         destination[JV.PROP_FONT] = source[JV.PROP_FONT];
         destination[JV.PROP_CONTROL] = source[JV.PROP_CONTROL];
         destination[JV.PROP_STYLE] = source[JV.PROP_STYLE];
+        destination.Title = "";
         destination[JV.PROP_AREA] = {};
         me.private_copy_area(source[JV.PROP_AREA], destination[JV.PROP_AREA]);
     },

+ 72 - 5
web/maintain/report/js/rpt_tpl_field_map.js

@@ -193,6 +193,7 @@ let selectableFiledTreeOprObj = {
 let discreteFieldParamTreeOprObj = {
     treeObj : null,
     currentNode: null,
+    local_idx : 12000,
     iniTree: function(rptTpl) {
         var me = this;
         let fieldMapList = me.buildTreeData(rptTpl);
@@ -200,9 +201,9 @@ let discreteFieldParamTreeOprObj = {
         me.treeObj.expandAll(true);
     },
     buildTreeData: function(rptTpl){
-        let rst = [];
-        let disFieldNode = {Name: JV.NODE_NO_MAPPING_FIELDS, items: [], isParent: true};
-        let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true};
+        let me = this, rst = [];
+        let disFieldNode = {Name: JV.NODE_NO_MAPPING_FIELDS, items: [], isParent: true, Title: ""};
+        let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true, Title: ""};
         rst.push(disFieldNode);
         rst.push(disParamNode);
         if (rptTpl[JV.NODE_NO_MAPPING_FIELDS] && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
@@ -212,7 +213,9 @@ let discreteFieldParamTreeOprObj = {
                 node[JV.PROP_FIELD_ID] = df[JV.PROP_ID];
                 node[JV.PROP_NAME] = df[JV.PROP_NAME];
                 node[JV.PROP_DATA_TYPE] = df[JV.PROP_DATA_TYPE];
+                node.Title = "ID: " + df[JV.PROP_ID];
                 disFieldNode.items.push(node);
+                if (parseInt(df[JV.PROP_ID]) >= me.local_idx) me.local_idx = parseInt(df[JV.PROP_ID]) + 1;
             }
         }
         if (rptTpl[JV.NODE_DISCRETE_PARAMS]) {
@@ -223,11 +226,18 @@ let discreteFieldParamTreeOprObj = {
                 node[JV.PROP_NAME] = dp[JV.PROP_NAME];
                 node[JV.PROP_DATA_TYPE] = dp[JV.PROP_DATA_TYPE];
                 node[JV.PROP_DFT_VALUE] = dp[JV.PROP_DFT_VALUE];
+                node.Title = "ID: " + dp[JV.PROP_ID];
                 disParamNode.items.push(node);
+                if (parseInt(dp[JV.PROP_ID]) >= me.local_idx) me.local_idx = parseInt(dp[JV.PROP_ID]) + 1;
             }
         }
         return rst;
     },
+    getAndModifyLocalIdx: function() {
+        let me = discreteFieldParamTreeOprObj, rst = me.local_idx;
+        me.local_idx++;
+        return rst;
+    },
     addHoverDom: function(treeId, treeNode) {
         let me = discreteFieldParamTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
         if (treeNode.level > 0 || $("#addBtn_"+treeNode.tId).length > 0) return;
@@ -235,9 +245,35 @@ let discreteFieldParamTreeOprObj = {
         sObj.after(addStr);
         let btn = $("#addBtn_"+treeNode.tId);
         if (btn) btn.bind("click", function(){
-            //
+            if (treeNode[JV.PROP_NAME] === JV.NODE_NO_MAPPING_FIELDS) {
+                let field = me.private_setup_dummy_discrete_field_node();
+                let newNodes = [field];
+                me.treeObj.addNodes(treeNode, -1, newNodes, true);
+            } else if (treeNode[JV.PROP_NAME] === JV.NODE_DISCRETE_PARAMS) {
+                let param = me.private_setup_dummy_discrete_param_node;
+                let newNodes = [param];
+                me.treeObj.addNodes(treeNode, -1, newNodes, true);
+            }
         });
     },
+    private_setup_dummy_discrete_field_node: function () {
+        let me = discreteFieldParamTreeOprObj, rst = {};
+        rst[JV.PROP_ID] = me.getAndModifyLocalIdx();
+        rst[JV.PROP_NAME] = "新离散指标";
+        rst[JV.PROP_DATA_TYPE] = "string";
+        rst.descr = "";
+        rst.Title = "ID: " + rst[JV.PROP_ID];
+        return rst;
+    },
+    private_setup_dummy_discrete_param_node: function () {
+        let me = discreteFieldParamTreeOprObj, rst = {};
+        rst[JV.PROP_ID] = me.getAndModifyLocalIdx();
+        rst[JV.PROP_NAME] = "新离散参数";
+        rst[JV.PROP_DATA_TYPE] = "string";
+        rst[JV.PROP_DFT_VALUE] = "";
+        rst.Title = "ID: " + rst[JV.PROP_ID];
+        return rst;
+    },
     removeHoverDom: function(treeId, treeNode) {
         $("#addBtn_"+treeNode.tId).unbind().remove();
     },
@@ -290,6 +326,37 @@ let discreteFieldParamTreeOprObj = {
     },
     onRename: function () {
         //
+    },
+    extractFieldMaps: function (rptTpl) {
+        let me = this;
+        for (let rootNode of me.treeObj.getNodes()) {
+            if (rootNode[JV.PROP_NAME] === JV.NODE_NO_MAPPING_FIELDS) {
+                rptTpl[JV.NODE_NO_MAPPING_FIELDS] = [];
+                for (let fNode of rootNode.items) {
+                    rptTpl[JV.NODE_NO_MAPPING_FIELDS].push(me.createDiscreteFieldByNode(fNode));
+                }
+            } else if (rootNode[JV.PROP_NAME] === JV.NODE_DISCRETE_PARAMS) {
+                rptTpl[JV.NODE_DISCRETE_PARAMS] = [];
+                for (let pNode of rootNode.items) {
+                    rptTpl[JV.NODE_DISCRETE_PARAMS].push(me.createDiscreteParamByNode(pNode));
+                }
+            }
+        }
+    },
+    createDiscreteFieldByNode: 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.descr = node.descr;
+        return rst;
+    },
+    createDiscreteParamByNode: 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[JV.PROP_DFT_VALUE] = node[JV.PROP_DFT_VALUE];
+        return rst;
     }
-
 };

+ 1 - 0
web/maintain/report/js/rpt_tpl_helper.js

@@ -103,6 +103,7 @@ let tplHelper = {
             //4. 指标摆放
             dataInfoMapTreeOprObj.extractTabFields(rptTpl);
             dataInfoMapTreeOprObj.extractDiscreteFieldParam(rptTpl);
+            discreteFieldParamTreeOprObj.extractFieldMaps(rptTpl);
             //5. 计算式
             calculationTreeOprObj.extractCalculation(rptTpl);
         } else {

+ 6 - 2
web/maintain/report/rpt_tpl_detail.html

@@ -305,14 +305,18 @@
                             </div>
                         </div>
                         <div class="row" id="element_pre_suff">
-                            <div class="input-group col-6">
+                            <div class="input-group col-3">
                                 <div class="input-group-addon">前缀</div>
                                 <input class="form-control" id="elePrefix" value="" onkeyup="rpt_tpl_cfg_helper.changePreSuff(this, 'Prefix')">
                             </div>
-                            <div class="input-group col-6">
+                            <div class="input-group col-3">
                                 <div class="input-group-addon">后缀</div>
                                 <input class="form-control" id="eleSuffix" value="" onkeyup="rpt_tpl_cfg_helper.changePreSuff(this, 'Suffix')">
                             </div>
+                            <div class="input-group col-3">
+                                <div class="input-group-addon">格式</div>
+                                <input class="form-control" id="eleFormat" value="" onkeyup="rpt_tpl_cfg_helper.changeFormat(this)">
+                            </div>
                         </div>
                         <div class="form-group" id="dispRowHeight">
                             <label>显示行高度</label>