Explorar o código

code sync and report template save(for bill type)

TonyKang %!s(int64=7) %!d(string=hai) anos
pai
achega
1bdb1b969c

+ 3 - 8
modules/reports/util/rpt_construct_data_util.js

@@ -18,7 +18,7 @@ const GLJ_TYPE = {
     Machine: 3,
     Main_Material: 4,
     Equipment: 5
-}
+};
 
 class Rpt_Common{
     initialize(rpt_tpl, currentDataObj) {
@@ -249,7 +249,7 @@ function summaryData(sourceData, handleCfg, prjData){
             }
         }
         return ( "grp_key_" + keys.join('_'));
-    }
+    };
     let sumObj = {};
     for (let dtl of tempRstArr) {
         let grpKey = private_get_grp_key(dtl);
@@ -310,7 +310,7 @@ function filterData(sourceData, handleCfg, prjData) {
                 rst = true;
         }
         return rst;
-    }
+    };
     for (let item of tempRstArr) {
         let compRst = true;
         let curComparePrjData = null;
@@ -596,11 +596,6 @@ function sortData(sourceData, sortCfg, prjData) {
 
 function setupFunc(obj, prop, ownRawObj) {
     obj[prop] = {};
-    // if (prop === projectConst.CALC_PROGRAM) {
-    //     obj[prop]["myOwnRawDataObj"] = ownRawObj.data;
-    // } else {
-    //     obj[prop]["myOwnRawDataObj"] = ownRawObj;
-    // }
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
     obj[prop].getProperty = ext_getPropety;
     obj[prop].getFee = ext_getFee;

+ 15 - 5
web/maintain/report/js/cfg_const.js

@@ -70,7 +70,8 @@ let setting = {
         beforeRename: zTreeOprObj.beforeRename,
         beforeRemove: zTreeOprObj.onBeforeRemove,
         onRemove: zTreeOprObj.onRemove,
-        onRename: zTreeOprObj.onRename
+        onRename: zTreeOprObj.onRename,
+        beforeDrag: function() {return false;}
     }
 };
 
@@ -127,6 +128,11 @@ let bandSetting2 = {
         showRemoveBtn: false,
         showRenameBtn: false
     },
+    check: {
+        enable: true,
+        chkStyle: "radio",
+        radioType: "all"
+    },
     data: {
         keep: {
             parent:true,
@@ -141,7 +147,7 @@ let bandSetting2 = {
         }
     },
     callback:{
-        onClick: dataInfoMapTreeOprObj.onBandClick(),
+        onCheck: dataInfoMapTreeOprObj.onCheck,
         beforeDrag: function() {return false;}
     }
 };
@@ -226,14 +232,17 @@ let rptDataInfoSetting = {
     view: {
         showIcon: true,
         expandSpeed: "",
-        selectedMulti: false
+        selectedMulti: false,
+        addHoverDom: dataInfoMapTreeOprObj.addHoverDom,
+        removeHoverDom: dataInfoMapTreeOprObj.removeHoverDom
     },
     edit: {
         enable: true,
         editNameSelectAll: true,
         showRemoveBtn: true,
-        showRenameBtn: false,
+        showRenameBtn: true,
         removeTitle: "删除",
+        renameTitle: "更改文本名称",
         drag: {
             isCopy: false,
             isMove: true
@@ -253,8 +262,9 @@ let rptDataInfoSetting = {
         }
     },
     callback:{
-        onClick: dataInfoMapTreeOprObj.onClick,
+        onClick: dataInfoMapTreeOprObj.onTabDataClick,
         beforeRemove: dataInfoMapTreeOprObj.onBeforeRemove,
+        beforeEditName: dataInfoMapTreeOprObj.beforeEditName,
         onRemove: dataInfoMapTreeOprObj.onRemove
         //,beforeDrop: dataInfoMapTreeOprObj.onBeforeDrop
     }

+ 3 - 1
web/maintain/report/js/rpt_tpl_band.js

@@ -44,6 +44,8 @@ let bandTreeOprObj = {
                 private_copy_nodes(node, item);
                 rst.push(item);
             }
+        } else {
+            console.log("the band tree is not ready!");
         }
         return rst;
     },
@@ -121,7 +123,7 @@ let bandTreeOprObj = {
         rst[JV.PROP_NAME] = node[JV.PROP_NAME];
         rst[JV.PROP_CONTROL] = node[JV.PROP_CONTROL];
         rst[JV.PROP_STYLE] = node[JV.PROP_STYLE];
-        if (node[JV.BAND_PROP_MERGE_BORDER] != undefined) {
+        if (node[JV.BAND_PROP_MERGE_BORDER] !== undefined) {
             rst[JV.BAND_PROP_MERGE_BORDER] = node[JV.BAND_PROP_MERGE_BORDER];
         } else {
             rst[JV.BAND_PROP_MERGE_BORDER] = 'F';

+ 313 - 71
web/maintain/report/js/rpt_tpl_data_map.js

@@ -5,23 +5,33 @@
 
 let dataInfoMapTreeOprObj = {
     treeObj : null,
+    bandTreeObj: null,
+    selectedTreeObj: null,
     currentNode: null,
     dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image'],
     iniTree: function(rptTpl) {
-        var me = this;
+        let me = this;
         let fieldMapList = me.buildTreeData(rptTpl);
         me.treeObj = $.fn.zTree.init($("#tpl_data_info_reversed"), rptDataInfoSetting, fieldMapList);
         me.treeObj.expandAll(true);
     },
     iniDataMap: function () {
-        let me = this, bandList = bandTreeOprObj.copyBandList(true);
+        let me = this, bandList = bandTreeOprObj.copyBandList(false);
         if (bandList) {
-            let bandTree = $.fn.zTree.init($("#band_tree2_reversed"), bandSetting2, bandList);
-            bandTree.expandAll(true);
+            me.bandTreeObj = $.fn.zTree.init($("#band_tree2_reversed"), bandSetting2, bandList);
+            me.bandTreeObj.expandAll(true);
+            let selectedFieldList = fieldMapTreeOprObj.copySelectedFieldList();
+            if (me.selectedTreeObj) {
+                let nodes = me.selectedTreeObj.getNodes();
+                for (let node of nodes) {
+                    me.selectedTreeObj.removeNode(node);
+                }
+                me.selectedTreeObj.refresh();
+            }
+            // me.selectedTreeObj = $.fn.zTree.init(document.getElementById("tpl_data_selected_field_map_reversed"), selectedFieldMapSetting, selectedFieldList);
+            me.selectedTreeObj = $.fn.zTree.init($("#tpl_data_selected_field_map_reversed"), selectedFieldMapSetting, selectedFieldList);
+            me.selectedTreeObj.expandAll(true);
         }
-        let selectedFieldList = fieldMapTreeOprObj.copySelectedFieldList();
-        let selectedFieldTree = $.fn.zTree.init($("#tpl_data_selected_field_map_reversed"), selectedFieldMapSetting, selectedFieldList);
-        selectedFieldTree.expandAll(true);
     },
     buildTreeData: function (rptTpl) {
         let me = this, rst = null;
@@ -46,72 +56,117 @@ let dataInfoMapTreeOprObj = {
         let discreteNode = {Name: JV.NODE_DISCRETE_INFO};
         rst.push(rootFieldNode);
         rst.push(discreteNode);
-        me.private_build_bill_data(rootFieldNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT]);
-        me.private_build_bill_discrete_data(discreteNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]);
+        me.private_build_bill_data(rootFieldNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT], rptTpl);
+        me.private_build_bill_discrete_data(discreteNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO], rptTpl);
 
         return rst;
     },
 
-    private_build_bill_data: function (rootFieldNode, billData) {
+    private_build_bill_data: function (rootFieldNode, billData, rptTpl) {
         let me = this, bandName = billData[JV.PROP_BAND_NAME];
         if (rootFieldNode) {
+            rootFieldNode[JV.PROP_BAND_NAME] = bandName;
             rootFieldNode.items = [];
             for (let fieldItem of billData[JV.PROP_BILL_FIELDS]) {
-                rootFieldNode.items.push(me.private_build_field_node(bandName, fieldItem));
+                if (fieldItem[JV.PROP_FIELD_ID]) {
+                    rootFieldNode.items.push(me.private_build_field_node(fieldItem, rptTpl))
+                } else if (fieldItem[JV.PROP_PARAM_ID]) {
+                    rootFieldNode.items.push(me.private_build_param_node(fieldItem, rptTpl));
+                }
             }
         }
     },
-    private_build_bill_discrete_data: function (discreteNode, discreteData) {
+    private_build_bill_discrete_data: function (discreteNode, discreteData, rptTpl) {
         let me = this;
-        if (discreteNode) {
-            discreteNode.items = [];
-            let fieldItem = {Name: "Fields", items:[], isParent: true};
-            let paramItem = {Name: "Params", items:[], isParent: true};
-            let textItem = {Name: "Texts", items:[], isParent: true};
-            discreteNode.items.push(fieldItem);
-            discreteNode.items.push(paramItem);
-            discreteNode.items.push(textItem);
-            for (let bandItem of discreteData) {
-                let bandName = bandItem[JV.PROP_BAND_NAME];
-                if (bandItem[JV.PROP_DISCRETE_FIELDS]) {
-                    for (let dtlItem of bandItem[JV.PROP_DISCRETE_FIELDS]) {
-                        fieldItem.items.push(me.private_build_field_node(bandName, dtlItem));
+        discreteNode.isParent = true;
+        discreteNode.items = [];
+        for (let i = 0; i < discreteData.length; i++) {
+            let dtl = discreteData[i];
+            let item = {"Name": "离散" + (i + 1), "items":[]};
+            item[JV.PROP_BAND_NAME] = dtl[JV.PROP_BAND_NAME];
+            let discreteFieldsNode = {"Name": "离散字段集", "items": [], "isParent": true};
+            let discreteTextsNode = {"Name": "离散文本集", "items": [], "isParent": true};
+            item.items.push(discreteFieldsNode);
+            item.items.push(discreteTextsNode);
+
+            discreteNode.items.push(item);
+            if (dtl[JV.PROP_DISCRETE_FIELDS]) {
+                for (let field of dtl[JV.PROP_DISCRETE_FIELDS]) {
+                    if (field[JV.PROP_FIELD_ID]) {
+                        discreteFieldsNode.items.push(me.private_build_field_node(field, rptTpl))
+                    } else if (field[JV.PROP_PARAM_ID]) {
+                        discreteFieldsNode.items.push(me.private_build_param_node(field, rptTpl));
                     }
                 }
-                if (bandItem[JV.PROP_PARAMS]) {
-                    for (let dtlItem of bandItem[JV.PROP_PARAMS]) {
-                        paramItem.items.push(me.private_build_param_node(bandName, dtlItem));
-                    }
+            }
+            if (dtl[JV.PROP_TEXTS]) {
+                for (let txt of dtl[JV.PROP_TEXTS]) {
+                    discreteTextsNode.items.push(me.private_build_text_node(txt));
                 }
-
-                if (bandItem[JV.PROP_TEXTS]) {
-                    for (let dtlItem of bandItem[JV.PROP_TEXTS]) {
-                        textItem.items.push(me.private_build_text_node(bandName, dtlItem));
+            }
+        }
+    },
+    private_get_field_by_id: function (fieldId, rptTpl) {
+        let rst = null;
+        function getField(collection) {
+            if (!rst && collection) {
+                for (let item of collection) {
+                    if (item[JV.PROP_ID] === fieldId) {
+                        rst = item;
+                        break;
                     }
                 }
-                if (bandItem[JV.PROP_TEXT]) {
-                    textItem.items.push(me.private_build_text_node(bandName, bandItem[JV.PROP_TEXT]));
+            }
+        }
+        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]);
+        return rst;
+    },
+    private_get_param_by_id: function (paramId, rptTpl) {
+        let rst = null;
+        function getParam(collection) {
+            if (!rst && collection) {
+                for (let item of collection) {
+                    if (item[JV.PROP_ID] === paramId) {
+                        rst = item;
+                        break;
+                    }
                 }
             }
         }
+        getParam(rptTpl[JV.NODE_DISCRETE_PARAMS]);
+        return rst;
     },
-    private_build_field_node: function (bandName, fieldData) {
+    private_build_field_node: function (fieldData, rptTpl) {
         let me = this, rst = null;
         if (fieldData) {
             rst = {};
-            rst[JV.PROP_BAND_NAME] = bandName;
-            rst[JV.PROP_FIELD_ID] = fieldData[JV.PROP_FIELD_ID];
-            rst[JV.TAB_FIELD_PROP_SORT] = fieldData[JV.TAB_FIELD_PROP_SORT];
-            rst[JV.PROP_FONT] = fieldData[JV.PROP_FONT];
-            rst[JV.PROP_CONTROL] = fieldData[JV.PROP_CONTROL];
-            rst[JV.PROP_STYLE] = fieldData[JV.PROP_STYLE];
-            rst[JV.PROP_PREFIX] = fieldData[JV.PROP_PREFIX];
-            rst[JV.PROP_SUFFIX] = fieldData[JV.PROP_SUFFIX];
-            rst[JV.PROP_AREA] = {};
-            me.private_copy_area(fieldData[JV.PROP_AREA], rst[JV.PROP_AREA]);
+            let f = me.private_get_field_by_id(fieldData[JV.PROP_FIELD_ID], rptTpl);
+            if (f) {
+                rst[JV.PROP_NAME] = f[JV.PROP_NAME];
+            } else {
+                rst[JV.PROP_NAME] = fieldData[JV.PROP_FIELD_ID];
+            }
+            me.private_copy_field_properties(fieldData, rst);
         }
         return rst;
     },
+    private_copy_field_properties: function (source, destination) {
+        let me = this;
+        destination[JV.PROP_FIELD_ID] = source[JV.PROP_FIELD_ID];
+        if (source[JV.TAB_FIELD_PROP_SORT]) destination[JV.TAB_FIELD_PROP_SORT] = source[JV.TAB_FIELD_PROP_SORT];
+        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[JV.PROP_PREFIX] = source[JV.PROP_PREFIX];
+        destination[JV.PROP_SUFFIX] = source[JV.PROP_SUFFIX];
+        destination[JV.PROP_AREA] = {};
+        me.private_copy_area(source[JV.PROP_AREA], destination[JV.PROP_AREA]);
+    },
     private_copy_area: function (orgArea, destArea) {
         destArea[JV.PROP_LEFT] = orgArea[[JV.PROP_LEFT]];
         destArea[JV.PROP_RIGHT] = orgArea[[JV.PROP_RIGHT]];
@@ -120,32 +175,111 @@ let dataInfoMapTreeOprObj = {
         destArea[JV.PROP_H_CALCULATION] = orgArea[[JV.PROP_H_CALCULATION]];
         destArea[JV.PROP_V_CALCULATION] = orgArea[[JV.PROP_V_CALCULATION]];
     },
-    private_build_param_node: function (bandName, param) {
+    private_build_param_node: function (param, rptTpl) {
         let me = this, rst = null;
         if (param) {
             rst = {};
-            rst[JV.PROP_BAND_NAME] = bandName;
-            rst[JV.PROP_PARAM_ID] = param[JV.PROP_PARAM_ID];
-            rst[JV.PROP_FONT] = param[JV.PROP_FONT];
-            rst[JV.PROP_CONTROL] = param[JV.PROP_CONTROL];
-            rst[JV.PROP_STYLE] = param[JV.PROP_STYLE];
-            rst[JV.PROP_PREFIX] = param[JV.PROP_PREFIX];
-            rst[JV.PROP_SUFFIX] = param[JV.PROP_SUFFIX];
-            rst[JV.PROP_AREA] = {};
-            me.private_copy_area(param[JV.PROP_AREA], rst[JV.PROP_AREA]);
+            let p = me.private_get_param_by_id(param[JV.PROP_PARAM_ID], rptTpl);
+            if (p) {
+                rst[JV.PROP_NAME] = p[JV.PROP_NAME];
+            } else {
+                rst[JV.PROP_NAME] = param[JV.PROP_PARAM_ID];
+            }
+            me.private_copy_param_properties(param, rst);
         }
         return rst;
     },
+    private_copy_param_properties: function (source, destination) {
+        let me = this;
+        destination[JV.PROP_PARAM_ID] = source[JV.PROP_PARAM_ID];
+        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[JV.PROP_PREFIX] = source[JV.PROP_PREFIX];
+        destination[JV.PROP_SUFFIX] = source[JV.PROP_SUFFIX];
+        destination[JV.PROP_AREA] = {};
+        me.private_copy_area(source[JV.PROP_AREA], destination[JV.PROP_AREA]);
+    },
+    private_build_text_node: function (text) {
+        let me = this, rst = null;
+        if (text) {
+            rst = {};
+            rst[JV.PROP_NAME] = text[JV.PROP_LABEL];
+            me.private_copy_text_properties(text, rst);
+        }
+        return rst;
+    },
+    private_copy_text_properties: function (source, destination) {
+        let me = this;
+        destination[JV.PROP_LABEL] = source[JV.PROP_LABEL];
+        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[JV.PROP_AREA] = {};
+        me.private_copy_area(source[JV.PROP_AREA], destination[JV.PROP_AREA]);
+    },
 
-    private_build_text_node: function (bandName, text) {
-        //
+    private_get_dummy_text_node: function() {
+        let me = this, rst = {};
+        rst[JV.PROP_NAME] = "文本";
+        rst[JV.PROP_LABEL] = "文本";
+        rst[JV.PROP_FONT] = "Content";
+        rst[JV.PROP_CONTROL] = "Default";
+        rst[JV.PROP_STYLE] = "Default_None";
+        rst[JV.PROP_AREA] = {};
+        rst[JV.PROP_AREA][JV.PROP_LEFT] = 0;
+        rst[JV.PROP_AREA][JV.PROP_RIGHT] = 100;
+        rst[JV.PROP_AREA][JV.PROP_TOP] = 0;
+        rst[JV.PROP_AREA][JV.PROP_BOTTOM] = 100;
+        rst[JV.PROP_AREA][JV.PROP_H_CALCULATION] = JV.CAL_TYPE[0];
+        rst[JV.PROP_AREA][JV.PROP_V_CALCULATION] = JV.CAL_TYPE[0];
+        return rst;
     },
 
-    onClick: function (event,treeId,treeNode) {
-        //
+    onTabDataClick: function (event,treeId,treeNode) {
+        let me = dataInfoMapTreeOprObj, matchedBandNode = null;
+        let chked = false;
+        me.currentNode = treeNode;
+        function checkBandNode(bNode, bandName) {
+            if (bNode[JV.PROP_NAME] === bandName) {
+                chked = true;
+                matchedBandNode = bNode;
+            } else if (bNode.items){
+                for (let subNode of bNode.items) {
+                    checkBandNode(subNode, bandName);
+                    if (chked) {
+                        break;
+                    }
+                }
+            }
+        }
+        let nodes = me.bandTreeObj.getNodes();
+        function setDisabledBandSelect(disabled) {
+            for (let node of nodes) {
+                me.bandTreeObj.setChkDisabled(node, disabled, true, true);
+            }
+        }
+        if (treeNode[JV.PROP_BAND_NAME]) {
+            for (let node of nodes) {
+                checkBandNode(node, treeNode[JV.PROP_BAND_NAME]);
+                if (chked) {
+                    break;
+                }
+            }
+        }
+        if (chked) {
+            setDisabledBandSelect(false);
+            me.bandTreeObj.checkNode(matchedBandNode, true, true);
+        } else {
+            setDisabledBandSelect(true);
+        }
     },
-    onBandClick: function (event,treeId,treeNode) {
-        //
+    onCheck: function (event,treeId,treeNode) {
+        let me = dataInfoMapTreeOprObj;
+        if (me.currentNode[JV.PROP_BAND_NAME] && me.currentNode[JV.PROP_BAND_NAME] !== treeNode[JV.PROP_NAME])  {
+            alert("change band from: " + me.currentNode[JV.PROP_BAND_NAME] + " to : " + treeNode[JV.PROP_NAME]);
+            me.currentNode[JV.PROP_BAND_NAME] = treeNode[JV.PROP_NAME];
+        }
     },
     onBeforeRemove: function(treeId, treeNode){
         let rst = true;
@@ -157,7 +291,16 @@ let dataInfoMapTreeOprObj = {
         return rst;
     },
     beforeRename: function(treeId, treeNode, newName, isCancel) {
-        //
+        let rst = false;
+        return rst;
+    },
+    beforeEditName: function(treeId, treeNode) {
+        let rst = false;
+        let pn = treeNode.getParentNode();
+        if (pn && pn[JV.PROP_NAME] === "离散文本集") {
+            rst = true;
+        }
+        return rst;
     },
     onBeforeDrag: function (treeId, treeNodes) {
         let rst = true;
@@ -173,17 +316,15 @@ let dataInfoMapTreeOprObj = {
         let rst = false;
         if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
             if (targetNode.level === 0) {
-                if (targetNode.Name !== "离散信息" && moveType === 'inner') {
+                if (targetNode.Name !== JV.NODE_DISCRETE_INFO && moveType === 'inner') {
                     rst = true;
                 }
             } else {
                 let parentNode = targetNode.getParentNode();
                 if (parentNode.Name === "离散信息") {
-                    if (targetNode.Name === "Fields") {
-                        rst = true;
-                    }
-                } else if (parentNode.Name === "Fields") {
-                    rst = true;
+                    // if (targetNode.Name === "Fields") {
+                    //     rst = true;
+                    // }
                 }
             }
         }
@@ -195,11 +336,112 @@ let dataInfoMapTreeOprObj = {
     onRename: function () {
         //
     },
-    extractFieldMaps: function (rptTpl) {
-        //
+    addHoverDom: function(treeId, treeNode) {
+        let me = dataInfoMapTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0) {
+            return;
+        } else if ((treeNode.level === 0 && treeNode[JV.PROP_NAME] === JV.NODE_DISCRETE_INFO) || (treeNode.level === 2 && treeNode[JV.PROP_NAME] === "离散文本集")) {
+            let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增' onfocus='this.blur();'></span>";
+            sObj.after(addStr);
+            let btn = $("#addBtn_"+treeNode.tId);
+            if (treeNode[JV.PROP_NAME] === JV.NODE_DISCRETE_INFO) {
+                btn.bind("click", function(){
+                    let amtIdx = treeNode.items.length + 1;
+                    let node = {};
+                    node[JV.PROP_NAME] = "离散" + amtIdx;
+                    node[JV.PROP_BAND_NAME] = me.bandTreeObj.getNodes()[0][JV.PROP_NAME];
+                    node.items = [];
+                    let fields = {"Name": "离散字段集", "items": [], "isParent": true};
+                    let texts = {"Name": "离散文本集", "items": [], "isParent": true};
+                    node.items.push(fields);
+                    node.items.push(texts);
+                    let newNodes = [];
+                    newNodes.push(node);
+                    me.treeObj.addNodes(treeNode, -1, newNodes, true);
+                });
+            } else {
+                //text
+                btn.bind("click", function(){
+                    let node = me.private_get_dummy_text_node();
+                    let newNodes = [];
+                    newNodes.push(node);
+                    me.treeObj.addNodes(treeNode, -1, newNodes, true);
+                });
+            }
+        }
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
+    },
+    extractTabFields: function (rptTpl) {
+        let me = dataInfoMapTreeOprObj;
+        // for (let rootNode of me.treeObj.getNodes()) {
+        //     rptTpl[JV.NODE_FIELD_MAP][rootNode.Name] = [];
+        //     for (let mappingFieldNode of rootNode.items) {
+        //         rptTpl[JV.NODE_FIELD_MAP][rootNode.Name].push(me.createMapFieldByNode(mappingFieldNode));
+        //     }
+        // }
+        if (rptTpl[JV.NODE_FLOW_INFO]) {
+            //
+        }
+        if (rptTpl[JV.NODE_CROSS_INFO]) {
+            //
+        }
+        if (rptTpl[JV.NODE_BILL_INFO]) {
+            let nodes = me.treeObj.getNodes();
+            for (let node of nodes) {
+                if (node[JV.PROP_NAME] === JV.NODE_BILL_CONTENT) {
+                    let newContent = {};
+                    newContent[JV.PROP_BAND_NAME] = node[JV.PROP_BAND_NAME];
+                    newContent[JV.PROP_BILL_FIELDS] = [];
+                    for (let subNode of node.items) {
+                        let f = {};
+                        me.private_copy_field_properties(subNode, f);
+                        newContent[JV.PROP_BILL_FIELDS].push(f);
+                    }
+                    rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT] = newContent;
+                } else if (node[JV.PROP_NAME] === JV.NODE_DISCRETE_INFO) {
+                    rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO] = me.private_extract_discrete_info(node);
+                }
+            }
+        }
+    },
+    private_extract_discrete_info: function(discreteNode) {
+        let me = this, rst = [];
+        for (let node of discreteNode) {
+            let newContent = {};
+            rst.push(newContent);
+            newContent[JV.PROP_BAND_NAME] = node[JV.PROP_BAND_NAME];
+            if (node[JV.PROP_DISCRETE_FIELDS] && node[JV.PROP_DISCRETE_FIELDS].length > 0) {
+                newContent[JV.PROP_DISCRETE_FIELDS] = [];
+                for (let field of node[JV.PROP_DISCRETE_FIELDS]) {
+                    let item = {};
+                    newContent[JV.PROP_DISCRETE_FIELDS].push(item);
+                    if (field[JV.PROP_FIELD_ID]) {
+                        me.private_copy_field_properties(field, item);
+                    } else if (field[JV.PROP_PARAM_ID]) {
+                        me.private_copy_param_properties(field, item);
+                    }
+                }
+            }
+            if (node[JV.PROP_TEXTS] && node[JV.PROP_TEXTS].length > 0) {
+                newContent[JV.PROP_TEXTS] = [];
+                for (let txt of node[JV.PROP_TEXTS]) {
+                    let item = {};
+                    newContent[JV.PROP_TEXTS].push(item);
+                    me.private_copy_text_properties(txt, item);
+                }
+            }
+        }
+        return rst;
+    },
+    extractDiscreteFieldParam: function(rptTpl) {
+        let me = dataInfoMapTreeOprObj;
     },
     createMapFieldByNode: function (node) {
         //
     }
 };
 
+
+

+ 0 - 31
web/maintain/report/js/rpt_tpl_field_cfg.js

@@ -1,31 +0,0 @@
-/**
- * Created by Tony on 2017/7/7.
- */
-
-let tabFieldCfgTreeOprObj = {
-    treeObj : null,
-    iniTree: function(rptTpl) {
-        var me = this;
-        // let fieldMapList = me.buildTreeData(rptTpl);
-        // me.treeObj = $.fn.zTree.init($("#field_map_tree_reversed"), fieldMapSetting, fieldMapList);
-        // me.treeObj.expandAll(true);
-    },
-    buildTreeData: function (rptTpl) {
-    },
-    onClick: function () {
-        //
-    },
-    onBeforeRemove: function(treeId, treeNode){
-    },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
-    },
-    onRemove: function () {
-        //
-    },
-    onRename: function () {
-        //
-    },
-    extractTabFields: function (rptTpl) {
-        //
-    }
-}

+ 30 - 11
web/maintain/report/js/rpt_tpl_field_map.js

@@ -34,17 +34,19 @@ let fieldMapTreeOprObj = {
         return rst;
     },
     copySelectedFieldList: function () {
-        let me = this, rst = [];
-        let nodes = me.treeObj.getNodes();
-        for (let node of nodes) {
-            let item = {Name: node.Name, items: [], isParent: true};
-            if (node.items) {
-                for (let subNode of node.items) {
-                    let subItem = me.createMapFieldByNode(subNode);
-                    item.items.push(subItem);
+        let me = fieldMapTreeOprObj, rst = [];
+        if (me.treeObj) {
+            let nodes = me.treeObj.getNodes();
+            for (let node of nodes) {
+                let item = {Name: node.Name, items: [], isParent: true};
+                if (node.items) {
+                    for (let subNode of node.items) {
+                        let subItem = me.createMapFieldByNode(subNode);
+                        item.items.push(subItem);
+                    }
                 }
+                rst.push(item)
             }
-            rst.push(item)
         }
         return rst;
     },
@@ -197,8 +199,25 @@ let discreteFieldParamTreeOprObj = {
         let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true};
         rst.push(disFieldNode);
         rst.push(disParamNode);
-        //rptTpl[JV.NODE_NO_MAPPING_FIELDS]
-        //rptTpl[JV.NODE_DISCRETE_PARAMS]
+        if (rptTpl[JV.NODE_NO_MAPPING_FIELDS] && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
+            for (let df of rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
+                let node = {};
+                node[JV.PROP_ID] = df[JV.PROP_ID];
+                node[JV.PROP_NAME] = df[JV.PROP_NAME];
+                node[JV.PROP_DATA_TYPE] = df[JV.PROP_DATA_TYPE];
+                disFieldNode.items.push(node);
+            }
+        }
+        if (rptTpl[JV.NODE_DISCRETE_PARAMS]) {
+            for (let dp of rptTpl[JV.NODE_DISCRETE_PARAMS]) {
+                let node = {};
+                node[JV.PROP_ID] = dp[JV.PROP_ID];
+                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];
+                disParamNode.items.push(node);
+            }
+        }
         return rst;
     },
     addHoverDom: function(treeId, treeNode) {

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

@@ -65,6 +65,7 @@ let tplHelper = {
             //4. 指标摆放
             dataInfoMapTreeOprObj.iniTree(rptTpl);
             discreteFieldParamTreeOprObj.iniTree(rptTpl);
+            dataInfoMapTreeOprObj.iniDataMap();
             //5. 计算式
         }
     },
@@ -88,7 +89,7 @@ let tplHelper = {
 
     reCombineRptTpl: function () {
         let rst = true;
-        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.nodeType == RT.NodeType.TEMPLATE && zTreeOprObj.currentNode.rptTpl != null) {
+        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.nodeType === RT.NodeType.TEMPLATE && zTreeOprObj.currentNode.rptTpl !== null) {
             let rptTpl = zTreeOprObj.currentNode.rptTpl;
             //1. 模板信息
             zTreeOprObj.extractMainInfo(rptTpl);
@@ -97,7 +98,8 @@ let tplHelper = {
             //3. 指标映射
             fieldMapTreeOprObj.extractFieldMaps(rptTpl);
             //4. 指标摆放
-            tabFieldCfgTreeOprObj.extractTabFields(rptTpl);
+            dataInfoMapTreeOprObj.extractTabFields(rptTpl);
+            dataInfoMapTreeOprObj.extractDiscreteFieldParam(rptTpl);
             //5. 计算式
             calculationTreeOprObj.extractCalculation(rptTpl);
         } else {

+ 218 - 0
web/maintain/report/rpt_tpl_detail.html

@@ -0,0 +1,218 @@
+<div class="col-lg-5 p-0">
+    <div class="main-data-top">
+        <ul class="nav nav-tabs tools-bar" role="tablist">
+            <li class="nav-item">
+                <a class="nav-link p-1 active" data-toggle="tab" href="#rpttplinfo" role="tab">模板信息</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link p-1" data-toggle="tab" href="#rpttpllayout" role="tab">模板布局</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldmap" role="tab">指标映射</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab" onclick="dataInfoMapTreeOprObj.iniDataMap();">指标摆放</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link p-1" data-toggle="tab" href="#rpttplformula" role="tab">计算式</a>
+            </li>
+        </ul>
+        <div class="tab-content">
+            <!--模板信息-->
+            <div class="tab-pane active" id="rpttplinfo" role="tabpanel">
+                <div class="main-data">
+                    <div class="p-3">
+                        <div class="form-group">
+                            <label>报表名称</label>
+                            <input class="form-control" id="rptTplName" value="" disabled>
+                        </div>
+                        <div class="form-group">
+                            <label>页面</label>
+                            <div class="row">
+                                <div class="input-group col-6">
+                                    <div class="input-group-addon">纸张</div>
+                                    <select class="form-control input-sm" id="rptTplPageSize"><option>A3</option><option>A4</option></select>
+                                </div>
+                                <div class="input-group col-6">
+                                    <div class="input-group-addon">方向</div>
+                                    <select class="form-control input-sm" id="rptTplPageOrientation"><option>横向</option><option>竖向</option></select>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <div class="input-group col-6">
+                                <div class="input-group-addon">单位</div>
+                                <select class="form-control input-sm" id="rptTplUnit"><option>厘米</option></select>
+                            </div>
+                        </div>
+                        <div class="form-group" id="multiColCnt">
+                            <label>显示调整</label>
+                            <div class="row">
+                                <div class="input-group col-6">
+                                    <div class="input-group-addon">分栏</div>
+                                    <select class="form-control input-sm" id="rptTplMultiCols"><option>1</option><option>2</option></select>
+                                </div>
+                                <div class="input-group col-6" style="display: none">
+                                    <div class="input-group-addon">缩放</div>
+                                    <input class="form-control input-sm" type="number" value="1" step="0.25">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group row" style="display: none">
+                            <div class="input-group col-6">
+                                <div class="input-group-addon">空行提上</div>
+                                <select class="form-control input-sm"><option>提上</option></select>
+                            </div>
+                            <div class="input-group col-6">
+                                <div class="input-group-addon">空行显示</div>
+                                <select class="form-control input-sm"><option>显示</option></select>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label>页边距</label>
+                            <div class="row">
+                                <div class="input-group col-6">
+                                    <div class="input-group-addon">左</div>
+                                    <input class="form-control input-sm" id="rptTplMarginLeft" type="number" value="0.8" step="0.1" min="0">
+                                </div>
+                                <div class="input-group col-6">
+                                    <div class="input-group-addon">右</div>
+                                    <input class="form-control input-sm" id="rptTplMarginRight" type="number" value="0.8" step="0.1" min="0">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <div class="input-group col-6">
+                                <div class="input-group-addon">上</div>
+                                <input class="form-control input-sm" id="rptTplMarginTop" type="number" value="0.8" step="0.1" min="0">
+                            </div>
+                            <div class="input-group col-6">
+                                <div class="input-group-addon">下</div>
+                                <input class="form-control input-sm" id="rptTplMarginBottom" type="number" value="0.8" step="0.1" min="0">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!--模板布局-->
+            <div class="tab-pane" id="rpttpllayout" role="tabpanel">
+                <div class="main-data">
+                    <div class="p-3">
+                        <div class="tab-bar">
+                            <a onclick="bandTreeOprObj.addRootBand(zTreeOprObj.getRefTpl())" class="btn btn-secondary btn-sm fa fa-plus-square">根节点框</a>
+                            <a onclick="bandTreeOprObj.addSubBand(zTreeOprObj.getRefTpl())" class="btn btn-secondary btn-sm fa fa-plus-square">子节点框</a>
+                            <a onclick="bandTreeOprObj.moveDownBand(zTreeOprObj.getRefTpl())" class="btn btn-sm" id="downMoveBand"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
+                            <a onclick="bandTreeOprObj.moveUpBand(zTreeOprObj.getRefTpl())" class="btn btn-sm" id="upMoveBand"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
+                        </div>
+                        <div class="ztree-warp">
+                            <ul id="band_tree_reversed" class="ztree"></ul>
+                        </div>
+                        <div class="form-group">
+                            <label>边框样式</label>
+                            <select class="form-control" id="borderStyles" onchange="bandTreeOprObj.bandStyleChange(this)"></select>
+                        </div>
+                        <div class="form-group">
+                            <label>位置</label>
+                            <select class="form-control" id="bandAlignment" onchange="bandTreeOprObj.bandAlignmentChange(this)"></select>
+                        </div>
+
+                        <div class="row">
+                            <div class="form-group col-md-6">
+                                <label>高度</label>
+                                <input class="form-control mr-2" id="bandHeight" type="number" step="0.1" disabled onchange="bandTreeOprObj.bandHeightWidthChange(this)">
+                            </div>
+                            <div class="form-group col-md-6">
+                                <label>宽度</label>
+                                <input class="form-control mr-2" id="bandWidth"  type="number" step="0.1" disabled onchange="bandTreeOprObj.bandHeightWidthChange(this)">
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label>出现频率</label>
+                            <select class="form-control" id="pageFrequency" onchange="bandTreeOprObj.bandShowFrequencyChange(this)"></select>
+                        </div>
+                        <div class="form-group">
+                            <div class="form-check">
+                                <label class="form-check-label">
+                                    <input type="checkbox" class="form-check-input" id="mergeBandBorder" onchange="bandTreeOprObj.bandBorderMergeChange(this)">
+                                    边框合并
+                                </label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!--指标映射-->
+            <div class="tab-pane" id="rpttplfieldmap" role="tabpanel">
+                <div class="main-data">
+                    <div class="p-3">
+                        <label>报表映射指标</label>
+                        <div class="tab-content">
+                            <ul id="field_map_tree_reversed" class="ztree"></ul>
+                        </div>
+                        <p/>
+                        <div class="tab-content">
+                            <label>可映射指标</label>
+                            <div class="tab-content">
+                                <ul id="selectable_field_tree_reversed" class="ztree"></ul>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!--指标摆放-->
+            <div class="tab-pane" id="rpttplfieldlocation" role="tabpanel">
+                <div class="main-data">
+                    <div class="p-3">
+                        <div class="row">
+                            <div class="form-group col-md-8">
+                                <div class="ztree-warp">
+                                    <ul id="tpl_data_info_reversed" class="ztree"></ul>
+                                </div>
+                            </div>
+                            <div class="form-group col-md-4" id="band_tree2_div">
+                                <div class="ztree-warp">
+                                    <ul id="band_tree2_reversed" class="ztree"></ul>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group" id="dispRowHeight">
+                            <label>显示行高度</label>
+                            <select class="form-control"><option> </option></select>
+                            <small class="form-text text-muted">用于 流水行/交叉行</small>
+                        </div>
+                        <div class="form-group" id="dispColWidth">
+                            <label>显示列宽度</label>
+                            <select class="form-control"><option> </option></select>
+                            <small class="form-text text-muted">用于 交叉列</small>
+                        </div>
+                        <div class="row">
+                            <div class="form-group col-md-7">
+                                <div class="form-group">
+                                    <label>已选映射指标</label>
+                                    <div class="ztree-warp">
+                                        <ul id="tpl_data_selected_field_map_reversed" class="ztree"></ul>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group col-md-5">
+                                <div class="ztree-warp">
+                                    <label>离散独立指标/参数</label>
+                                    <ul id="tpl_discrete_fields_params_reversed" class="ztree"></ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!--计算式-->
+            <div class="tab-pane" id="rpttplformula" role="tabpanel">
+                <div class="main-data">
+                    <div class="p-3">
+                        计算式
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 6 - 279
web/maintain/report/rpt_tpl_main.html

@@ -49,253 +49,16 @@
         <div class="content">
             <div class="container-fluid">
                 <div class="row">
-                    <div class="main-side col-lg-3 p-0">
-                        <div class="tab-bar">
-                            <a onclick="zTreeOprObj.addRootNode()" class="btn btn-secondary btn-sm fa fa-plus-square">根节点</a>
-                            <a onclick="zTreeOprObj.addTplNode()" class="btn btn-secondary btn-sm fa fa-plus-square">模板节点</a>
-                            <a onclick="zTreeOprObj.moveDownNode()" class="btn btn-sm" id="downMove"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
-                            <a onclick="zTreeOprObj.moveUpNode()" class="btn btn-sm" id="upMove"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
-                        </div>
-                        <div class="tab-content">
-                            <ul id="rptTplTree" class="ztree"></ul>
-                        </div>
+                    <div class="main-side col-lg-2 p-0">
+                        <%include ./rpt_tpl_tree.html %>
                     </div>
-                    <div class="main-content col-lg-9 p-0">
+                    <div class="main-content col-lg-10 p-0">
                         <div class="container-fluid">
                             <div class="row">
                                 <!-- 报表设置 -->
-                                <div class="col-lg-4 p-0">
-                                    <div class="main-data-top">
-                                        <ul class="nav nav-tabs tools-bar" role="tablist">
-                                            <li class="nav-item">
-                                                <a class="nav-link p-1 active" data-toggle="tab" href="#rpttplinfo" role="tab">模板信息</a>
-                                            </li>
-                                            <li class="nav-item">
-                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttpllayout" role="tab">模板布局</a>
-                                            </li>
-                                            <li class="nav-item">
-                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldmap" role="tab">指标映射</a>
-                                            </li>
-                                            <li class="nav-item">
-                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab" onclick="dataInfoMapTreeOprObj.iniDataMap();">指标摆放</a>
-                                            </li>
-                                            <li class="nav-item">
-                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplformula" role="tab">计算式</a>
-                                            </li>
-                                        </ul>
-                                        <div class="tab-content">
-                                            <!--模板信息-->
-                                            <div class="tab-pane active" id="rpttplinfo" role="tabpanel">
-                                                <div class="main-data">
-                                                    <div class="p-3">
-                                                        <div class="form-group">
-                                                            <label>报表名称</label>
-                                                            <input class="form-control" id="rptTplName" value="" disabled>
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>页面</label>
-                                                            <div class="row">
-                                                                <div class="input-group col-6">
-                                                                    <div class="input-group-addon">纸张</div>
-                                                                    <select class="form-control input-sm" id="rptTplPageSize"><option>A3</option><option>A4</option></select>
-                                                                </div>
-                                                                <div class="input-group col-6">
-                                                                    <div class="input-group-addon">方向</div>
-                                                                    <select class="form-control input-sm" id="rptTplPageOrientation"><option>横向</option><option>竖向</option></select>
-                                                                </div>
-                                                            </div>
-                                                        </div>
-                                                        <div class="form-group row">
-                                                            <div class="input-group col-6">
-                                                                <div class="input-group-addon">单位</div>
-                                                                <select class="form-control input-sm" id="rptTplUnit"><option>厘米</option></select>
-                                                            </div>
-                                                        </div>
-                                                        <div class="form-group" id="multiColCnt">
-                                                            <label>显示调整</label>
-                                                            <div class="row">
-                                                                <div class="input-group col-6">
-                                                                    <div class="input-group-addon">分栏</div>
-                                                                    <select class="form-control input-sm" id="rptTplMultiCols"><option>1</option><option>2</option></select>
-                                                                </div>
-                                                                <div class="input-group col-6" style="display: none">
-                                                                    <div class="input-group-addon">缩放</div>
-                                                                    <input class="form-control input-sm" type="number" value="1" step="0.25">
-                                                                </div>
-                                                            </div>
-                                                        </div>
-                                                        <div class="form-group row" style="display: none">
-                                                            <div class="input-group col-6">
-                                                                <div class="input-group-addon">空行提上</div>
-                                                                <select class="form-control input-sm"><option>提上</option></select>
-                                                            </div>
-                                                            <div class="input-group col-6">
-                                                                <div class="input-group-addon">空行显示</div>
-                                                                <select class="form-control input-sm"><option>显示</option></select>
-                                                            </div>
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>页边距</label>
-                                                            <div class="row">
-                                                                <div class="input-group col-6">
-                                                                    <div class="input-group-addon">左</div>
-                                                                    <input class="form-control input-sm" id="rptTplMarginLeft" type="number" value="0.8" step="0.1" min="0">
-                                                                </div>
-                                                                <div class="input-group col-6">
-                                                                    <div class="input-group-addon">右</div>
-                                                                    <input class="form-control input-sm" id="rptTplMarginRight" type="number" value="0.8" step="0.1" min="0">
-                                                                </div>
-                                                            </div>
-                                                        </div>
-                                                        <div class="form-group row">
-                                                            <div class="input-group col-6">
-                                                                <div class="input-group-addon">上</div>
-                                                                <input class="form-control input-sm" id="rptTplMarginTop" type="number" value="0.8" step="0.1" min="0">
-                                                            </div>
-                                                            <div class="input-group col-6">
-                                                                <div class="input-group-addon">下</div>
-                                                                <input class="form-control input-sm" id="rptTplMarginBottom" type="number" value="0.8" step="0.1" min="0">
-                                                            </div>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <!--模板布局-->
-                                            <div class="tab-pane" id="rpttpllayout" role="tabpanel">
-                                                <div class="main-data">
-                                                    <div class="p-3">
-                                                        <div class="tab-bar">
-                                                            <a onclick="bandTreeOprObj.addRootBand(zTreeOprObj.getRefTpl())" class="btn btn-secondary btn-sm fa fa-plus-square">根节点框</a>
-                                                            <a onclick="bandTreeOprObj.addSubBand(zTreeOprObj.getRefTpl())" class="btn btn-secondary btn-sm fa fa-plus-square">子节点框</a>
-                                                            <a onclick="bandTreeOprObj.moveDownBand(zTreeOprObj.getRefTpl())" class="btn btn-sm" id="downMoveBand"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
-                                                            <a onclick="bandTreeOprObj.moveUpBand(zTreeOprObj.getRefTpl())" class="btn btn-sm" id="upMoveBand"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
-                                                        </div>
-                                                        <div class="ztree-warp">
-                                                            <ul id="band_tree_reversed" class="ztree"></ul>
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>边框样式</label>
-                                                            <select class="form-control" id="borderStyles" onchange="bandTreeOprObj.bandStyleChange(this)"></select>
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>位置</label>
-                                                            <select class="form-control" id="bandAlignment" onchange="bandTreeOprObj.bandAlignmentChange(this)"></select>
-                                                        </div>
-
-                                                        <div class="row">
-                                                            <div class="form-group col-md-6">
-                                                                <label>高度</label>
-                                                                <input class="form-control mr-2" id="bandHeight" type="number" step="0.1" disabled onchange="bandTreeOprObj.bandHeightWidthChange(this)">
-                                                            </div>
-                                                            <div class="form-group col-md-6">
-                                                                <label>宽度</label>
-                                                                <input class="form-control mr-2" id="bandWidth"  type="number" step="0.1" disabled onchange="bandTreeOprObj.bandHeightWidthChange(this)">
-                                                            </div>
-                                                        </div>
-
-                                                        <div class="form-group">
-                                                            <label>出现频率</label>
-                                                            <select class="form-control" id="pageFrequency" onchange="bandTreeOprObj.bandShowFrequencyChange(this)"></select>
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <div class="form-check">
-                                                                <label class="form-check-label">
-                                                                    <input type="checkbox" class="form-check-input" id="mergeBandBorder" onchange="bandTreeOprObj.bandBorderMergeChange(this)">
-                                                                    边框合并
-                                                                </label>
-                                                            </div>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <!--指标映射-->
-                                            <div class="tab-pane" id="rpttplfieldmap" role="tabpanel">
-                                                <div class="main-data">
-                                                    <div class="p-3">
-                                                        <label>报表映射指标</label>
-                                                        <div class="tab-content">
-                                                            <ul id="field_map_tree_reversed" class="ztree"></ul>
-                                                        </div>
-                                                        <p/>
-                                                        <div class="tab-content">
-                                                            <label>可映射指标</label>
-                                                            <div class="tab-content">
-                                                                <ul id="selectable_field_tree_reversed" class="ztree"></ul>
-                                                            </div>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <!--指标摆放-->
-                                            <div class="tab-pane" id="rpttplfieldlocation" role="tabpanel">
-                                                <div class="main-data">
-                                                    <div class="p-3">
-                                                        <div class="row">
-                                                            <div class="form-group col-md-6">
-                                                                <div class="ztree-warp">
-                                                                    <ul id="tpl_data_info_reversed" class="ztree"></ul>
-                                                                </div>
-                                                            </div>
-                                                            <div class="form-group col-md-6">
-                                                                <div class="ztree-warp">
-                                                                    <ul id="band_tree2_reversed" class="ztree"></ul>
-                                                                </div>
-                                                            </div>
-                                                        </div>
-                                                        <div class="form-group" id="dispRowHeight">
-                                                            <label>显示行高度</label>
-                                                            <select class="form-control"><option> </option></select>
-                                                            <small class="form-text text-muted">用于 流水行/交叉行</small>
-                                                        </div>
-                                                        <div class="form-group" id="dispColWidth">
-                                                            <label>显示列宽度</label>
-                                                            <select class="form-control"><option> </option></select>
-                                                            <small class="form-text text-muted">用于 交叉列</small>
-                                                        </div>
-                                                        <div class="row">
-                                                            <div class="form-group col-md-6">
-                                                                <div class="ztree-warp">
-                                                                    <label>离散独立指标/参数</label>
-                                                                    <ul id="tpl_discrete_fields_params_reversed" class="ztree"></ul>
-                                                                </div>
-                                                            </div>
-                                                            <div class="form-group col-md-6">
-                                                                <div class="form-group">
-                                                                    <label>已选映射指标</label>
-                                                                    <div class="ztree-warp">
-                                                                        <ul id="tpl_data_selected_field_map_reversed" class="ztree"></ul>
-                                                                    </div>
-                                                                </div>
-                                                            </div>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <!--计算式-->
-                                            <div class="tab-pane" id="rpttplformula" role="tabpanel">
-                                                <div class="main-data">
-                                                    <div class="p-3">
-                                                        计算式
-                                                    </div>
-                                                </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div>
+                                <%include ./rpt_tpl_detail.html %>
                                 <!-- 报表预览 -->
-                                <div class="form-view col-lg-8 p-0">
-                                    <div class="main-data-h" style="position:relative">
-                                        <div class="sub-button p-2">
-                                            <button class="btn btn-primary" onclick="preview_util.preview($('#tplCanvas')[0], zTreeOprObj.getRefTpl()) ">预览</button>
-                                            <button class="btn btn-primary" onclick="tplHelper.saveRptTpl()">保存</button>
-                                            <button class="btn btn-secondary">保存并发布</button>
-                                            <button class="btn btn-danger">删除模板</button>
-                                        </div>
-                                        <div class="main-data">
-                                            <canvas id="tplCanvas" height="820" width="920"></canvas>
-                                        </div>
-                                    </div>
-                                </div>
+                                <%include ./rpt_tpl_preview.html %>
                             </div>
                         </div>
                     </div>
@@ -304,42 +67,7 @@
         </div>
     </div>
     <!--弹出新建模板-->
-    <div class="modal fade" id="rptTypeSelectionModal" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h5 class="modal-title">创建新模板</h5>
-                </div>
-                <div class="modal-body">
-                    <div class="form-group">
-                        <label>模板类型</label>
-                        <div class="row">
-                            <div class="form-check col-4">
-                                <label class="form-check-label">
-                                    <input class="form-check-input" type="radio" name="inlineRadioOptions" id="flowTypeOpt" value="option1" checked="true"> 流水式表
-                                </label>
-                            </div>
-                            <div class="form-check col-4">
-                                <label class="form-check-label">
-                                    <input class="form-check-input" type="radio" name="inlineRadioOptions" id="billTypeOpt" value="option2"> 账单式表
-                                </label>
-                            </div>
-                            <div class="form-check col-4">
-                                <label class="form-check-label">
-                                    <input class="form-check-input" type="radio" name="inlineRadioOptions" id="crossTypeOpt" value="option3"> 交叉表
-                                </label>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="modal-footer text-xs-center">
-                    <button class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <button onclick="zTreeOprObj.createNewTpl()" class="btn btn-primary" data-dismiss="modal">创建</button>
-                </div>
-            </div>
-        </div>
-    </div>
-
+    <%include ./rpt_tpl_popup.html %>
     <!-- JS. -->
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
@@ -348,7 +76,6 @@
     <script src="/web/maintain/report/js/rpt_tpl_main.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_band.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_field_map.js"></script>
-    <script src="/web/maintain/report/js/rpt_tpl_field_cfg.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_calculation.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_helper.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_data_map.js"></script>

+ 35 - 0
web/maintain/report/rpt_tpl_popup.html

@@ -0,0 +1,35 @@
+<div class="modal fade" id="rptTypeSelectionModal" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">创建新模板</h5>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>模板类型</label>
+                    <div class="row">
+                        <div class="form-check col-4">
+                            <label class="form-check-label">
+                                <input class="form-check-input" type="radio" name="inlineRadioOptions" id="flowTypeOpt" value="option1" checked="true"> 流水式表
+                            </label>
+                        </div>
+                        <div class="form-check col-4">
+                            <label class="form-check-label">
+                                <input class="form-check-input" type="radio" name="inlineRadioOptions" id="billTypeOpt" value="option2"> 账单式表
+                            </label>
+                        </div>
+                        <div class="form-check col-4">
+                            <label class="form-check-label">
+                                <input class="form-check-input" type="radio" name="inlineRadioOptions" id="crossTypeOpt" value="option3"> 交叉表
+                            </label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer text-xs-center">
+                <button class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button onclick="zTreeOprObj.createNewTpl()" class="btn btn-primary" data-dismiss="modal">创建</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 13 - 0
web/maintain/report/rpt_tpl_preview.html

@@ -0,0 +1,13 @@
+<div class="form-view col-lg-7 p-0">
+    <div class="main-data-h" style="position:relative">
+        <div class="sub-button p-2">
+            <button class="btn btn-primary" onclick="preview_util.preview($('#tplCanvas')[0], zTreeOprObj.getRefTpl()) ">预览</button>
+            <button class="btn btn-primary" onclick="tplHelper.saveRptTpl()">保存</button>
+            <button class="btn btn-secondary">保存并发布</button>
+            <button class="btn btn-danger">删除模板</button>
+        </div>
+        <div class="main-data">
+            <canvas id="tplCanvas" height="800" width="910"></canvas>
+        </div>
+    </div>
+</div>

+ 9 - 0
web/maintain/report/rpt_tpl_tree.html

@@ -0,0 +1,9 @@
+<div class="tab-bar">
+    <a onclick="zTreeOprObj.addRootNode()" class="btn btn-secondary btn-sm fa fa-plus-square">根节点</a>
+    <a onclick="zTreeOprObj.addTplNode()" class="btn btn-secondary btn-sm fa fa-plus-square">模板节点</a>
+    <a onclick="zTreeOprObj.moveDownNode()" class="btn btn-sm" id="downMove"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
+    <a onclick="zTreeOprObj.moveUpNode()" class="btn btn-sm" id="upMove"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
+</div>
+<div class="tab-content">
+    <ul id="rptTplTree" class="ztree"></ul>
+</div>