Browse Source

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

zhongzewei 7 năm trước cách đây
mục cha
commit
ae3e02fee9

+ 0 - 1
Dockerfile_qa

@@ -4,7 +4,6 @@ WORKDIR /ConstructionOperation
 
 
 RUN git pull http://192.168.1.12:3000/SmartCost/ConstructionOperation master
 RUN git pull http://192.168.1.12:3000/SmartCost/ConstructionOperation master
 
 
-RUN mkdir tmp
 
 
 RUN cnpm install
 RUN cnpm install
 
 

+ 43 - 14
modules/reports/rpt_component/helper/jpc_helper_area.js

@@ -8,29 +8,58 @@ let JpcAreaHelper = {
             let areaWidth = 1.0 * (band[JV.PROP_RIGHT] - band[JV.PROP_LEFT]) / multipleDispCol;
             let areaWidth = 1.0 * (band[JV.PROP_RIGHT] - band[JV.PROP_LEFT]) / multipleDispCol;
             areaWidth = areaWidth / colAmount;
             areaWidth = areaWidth / colAmount;
             let innerLeft = 0.0, innerRight = areaWidth;
             let innerLeft = 0.0, innerRight = areaWidth;
-            switch (areaNode[JV.PROP_H_CALCULATION]) {
-                case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+            //
+            if (typeof areaNode[JV.PROP_H_CALCULATION]  === "string") {
+                switch (areaNode[JV.PROP_H_CALCULATION]) {
+                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+                        innerLeft = (1.0 * areaNode[JV.PROP_LEFT] * areaWidth / JV.HUNDRED_PERCENT);
+                        innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT);
+                        break;
+                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                        innerLeft = 1.0 * areaNode[JV.PROP_LEFT] * unitFactor;
+                        innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor;
+                        break;
+                }
+            } else {
+                //颗粒度更加细化的控制,可能左右两边的计算坐标方式都不同
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_LEFT] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
                     innerLeft = (1.0 * areaNode[JV.PROP_LEFT] * areaWidth / JV.HUNDRED_PERCENT);
                     innerLeft = (1.0 * areaNode[JV.PROP_LEFT] * areaWidth / JV.HUNDRED_PERCENT);
-                    innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT) ;
-                    break;
-                case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                } else {
                     innerLeft = 1.0 * areaNode[JV.PROP_LEFT] * unitFactor;
                     innerLeft = 1.0 * areaNode[JV.PROP_LEFT] * unitFactor;
-                    innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor ;
-                    break;
+                }
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_RIGHT] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT);
+                } else {
+                    innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor;
+                }
             }
             }
             //2. calculate top/bottom
             //2. calculate top/bottom
             let  areaHeight = 1.0 * (band[JV.PROP_BOTTOM] - band[JV.PROP_TOP]);
             let  areaHeight = 1.0 * (band[JV.PROP_BOTTOM] - band[JV.PROP_TOP]);
             areaHeight = areaHeight / rowAmount;
             areaHeight = areaHeight / rowAmount;
             let innerTop = 0.0, innerBottom = areaHeight;
             let innerTop = 0.0, innerBottom = areaHeight;
-            switch (areaNode[JV.PROP_V_CALCULATION]) {
-                case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+            if (typeof areaNode[JV.PROP_V_CALCULATION]  === "string") {
+                switch (areaNode[JV.PROP_V_CALCULATION]) {
+                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+                        innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
+                        innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
+                        break;
+                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                        innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
+                        innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;
+                        break;
+                }
+            } else {
+                //颗粒度更加细化的控制,可能上下两边的计算坐标方式都不同
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_TOP] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
                     innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
                     innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
-                    innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT) ;
-                    break;
-                case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                } else {
                     innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
                     innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
-                    innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor ;
-                    break;
+                }
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_BOTTOM] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
+                } else {
+                    innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;
+                }
             }
             }
             //
             //
             let rstLeft = 0.0, rstRight = 0.0, rstTop = 0.0, rstBottom = 0.0;
             let rstLeft = 0.0, rstRight = 0.0, rstTop = 0.0, rstBottom = 0.0;

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

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

+ 2 - 2
public/web/rpt_value_define.js

@@ -213,8 +213,8 @@ const JV = {
     LAYOUT_FULFILL: 4,
     LAYOUT_FULFILL: 4,
 
 
     OUTPUT_ALIGN: {
     OUTPUT_ALIGN: {
-        H: ["Left", "Center", "Right"],
-        V: ["Top", "Center", "Bottom"]
+        H: ["left", "center", "right"],
+        V: ["top", "center", "bottom"]
     },
     },
 
 
     CAL_TYPE:["percentage","abstract"],
     CAL_TYPE:["percentage","abstract"],

+ 22 - 8
web/maintain/report/js/cfg_const.js

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

+ 5 - 38
web/maintain/report/js/rpt_tpl_band.js

@@ -4,7 +4,6 @@ let bandTreeOprObj = {
     treeObj : null,
     treeObj : null,
     currentNode: null,
     currentNode: null,
     innerCounter: 1,
     innerCounter: 1,
-    reportCfg: null,
     canTrickEvent: false,
     canTrickEvent: false,
     iniTree: function(rptTpl) {
     iniTree: function(rptTpl) {
         var me = this;
         var me = this;
@@ -44,6 +43,8 @@ let bandTreeOprObj = {
                 private_copy_nodes(node, item);
                 private_copy_nodes(node, item);
                 rst.push(item);
                 rst.push(item);
             }
             }
+        } else {
+            console.log("the band tree is not ready!");
         }
         }
         return rst;
         return rst;
     },
     },
@@ -69,40 +70,6 @@ let bandTreeOprObj = {
 
 
         return rst;
         return rst;
     },
     },
-    getReportTplCfg: function() {
-        let me = this, params = {};
-        params.userId = userID;
-        CommonAjax.postEx("report_tpl_api/getUserRptCfg", params, 20000, true, function(result){
-                me.reportCfg = result;
-                me.refreshRptCfgs();
-            }, null, null
-        );
-    },
-    refreshRptCfgs: function () {
-        let me = this;
-        if (me.reportCfg) {
-            me.reportCfg.borderArr = [];
-            for (let style of me.reportCfg.styles) {
-                me.reportCfg.borderArr.push(style.ID);
-                $("#borderStyles").append("<option value='" + style.ID + "'>" + style.CfgDispName + "</option>");
-            }
-        }
-        let pf = $("#pageFrequency");
-        pf.append("<option value='" + JV.PAGE_STATUS[0] + "'>每页</option>");
-        pf.append("<option value='" + JV.PAGE_STATUS[1] + "'>首页</option>");
-        pf.append("<option value='" + JV.PAGE_STATUS[2] + "'>尾页</option>");
-        pf.append("<option value='" + JV.PAGE_STATUS[3] + "'>章首页</option>");
-        pf.append("<option value='" + JV.PAGE_STATUS[4] + "'>章尾页</option>");
-        pf.append("<option value='" + JV.PAGE_STATUS[5] + "'>分组</option>");
-        pf.append("<option value='" + JV.PAGE_STATUS[6] + "'>交叉行尾页</option>");
-        pf.append("<option value='" + JV.PAGE_STATUS[7] + "'>交叉列尾页</option>");
-        let ba = $("#bandAlignment");
-        ba.append("<option value='" + JV.LAYOUT[0] + "'>上</option>");
-        ba.append("<option value='" + JV.LAYOUT[1] + "'>下</option>");
-        ba.append("<option value='" + JV.LAYOUT[2] + "'>左</option>");
-        ba.append("<option value='" + JV.LAYOUT[3] + "'>右</option>");
-        ba.append("<option value='" + JV.LAYOUT[4] + "'>填充</option>");
-    },
     createBandFromNode: function(node) {
     createBandFromNode: function(node) {
         let me = this, rst = {};
         let me = this, rst = {};
         rst[JV.BAND_PROP_ALIGNMENT] = node[JV.BAND_PROP_ALIGNMENT];
         rst[JV.BAND_PROP_ALIGNMENT] = node[JV.BAND_PROP_ALIGNMENT];
@@ -121,7 +88,7 @@ let bandTreeOprObj = {
         rst[JV.PROP_NAME] = node[JV.PROP_NAME];
         rst[JV.PROP_NAME] = node[JV.PROP_NAME];
         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];
-        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];
             rst[JV.BAND_PROP_MERGE_BORDER] = node[JV.BAND_PROP_MERGE_BORDER];
         } else {
         } else {
             rst[JV.BAND_PROP_MERGE_BORDER] = 'F';
             rst[JV.BAND_PROP_MERGE_BORDER] = 'F';
@@ -188,7 +155,7 @@ let bandTreeOprObj = {
         me.canTrickEvent = false;
         me.canTrickEvent = false;
         //then refresh the band tab properties
         //then refresh the band tab properties
         //边框样式borderStyles
         //边框样式borderStyles
-        $("#borderStyles ").get(0).selectedIndex = me.reportCfg.borderArr.indexOf(treeNode[JV.PROP_STYLE]);
+        $("#borderStyles").get(0).selectedIndex = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(treeNode[JV.PROP_STYLE]);
         //边框合并
         //边框合并
         $("#mergeBandBorder").get(0).checked = stringUtil.convertStrToBoolean(treeNode[JV.BAND_PROP_MERGE_BORDER]);
         $("#mergeBandBorder").get(0).checked = stringUtil.convertStrToBoolean(treeNode[JV.BAND_PROP_MERGE_BORDER]);
         //位置
         //位置
@@ -229,7 +196,7 @@ let bandTreeOprObj = {
     bandStyleChange: function (dom) {
     bandStyleChange: function (dom) {
         let me = this;
         let me = this;
         if (me.currentNode) {
         if (me.currentNode) {
-            me.currentNode[JV.PROP_STYLE] = me.reportCfg.borderArr[dom.selectedIndex];
+            me.currentNode[JV.PROP_STYLE] = rpt_tpl_cfg_helper.reportCfg.borderArr[dom.selectedIndex];
         }
         }
     },
     },
     bandAlignmentChange: function (dom) {
     bandAlignmentChange: function (dom) {

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

@@ -0,0 +1,211 @@
+/**
+ * Created by Tony on 2017/12/8.
+ */
+let rpt_tpl_cfg_helper = {
+    reportCfg: null,
+    getReportTplCfg: function() {
+        let me = this, params = {};
+        params.userId = userID;
+        CommonAjax.postEx("report_tpl_api/getUserRptCfg", params, 20000, true, function(result){
+                me.reportCfg = result;
+                me.refreshRptCfgs();
+            }, null, null
+        );
+    },
+    refreshRptCfgs: function () {
+        let me = this;
+        if (me.reportCfg) {
+            me.reportCfg.borderArr = [];
+            for (let style of me.reportCfg.styles) {
+                me.reportCfg.borderArr.push(style.ID);
+                $("#borderStyles").append("<option value='" + style.ID + "'>" + style.CfgDispName + "</option>");
+                $("#elementBorders").append("<option value='" + style.ID + "'>" + style.CfgDispName + "</option>");
+            }
+            me.reportCfg.fontArr = [];
+            for (let font of me.reportCfg.fonts) {
+                if (font.CfgDispName) {
+                    me.reportCfg.fontArr.push(font.ID);
+                    $("#elementFonts").append("<option value='" + font.ID + "'>" + font.CfgDispName + "</option>");
+                } else {
+                    // me.reportCfg.fontArr.push("dummy font");
+                }
+            }
+            me.reportCfg.fontArr.push('自定义');
+            $("#elementFonts").append("<option value='自定义'>自定义</option>");
+            me.reportCfg.controlArr = [];
+            for (let control of me.reportCfg.ctrls) {
+                if (control.CfgDispName) {
+                    me.reportCfg.controlArr.push(control.ID);
+                    $("#elementControls").append("<option value='" + control.ID + "'>" + control.CfgDispName + "</option>");
+                } else {
+                    me.reportCfg.controlArr.push("dummy control");
+                }
+            }
+        }
+        let pf = $("#pageFrequency");
+        pf.append("<option value='" + JV.PAGE_STATUS[0] + "'>每页</option>");
+        pf.append("<option value='" + JV.PAGE_STATUS[1] + "'>首页</option>");
+        pf.append("<option value='" + JV.PAGE_STATUS[2] + "'>尾页</option>");
+        pf.append("<option value='" + JV.PAGE_STATUS[3] + "'>章首页</option>");
+        pf.append("<option value='" + JV.PAGE_STATUS[4] + "'>章尾页</option>");
+        pf.append("<option value='" + JV.PAGE_STATUS[5] + "'>分组</option>");
+        pf.append("<option value='" + JV.PAGE_STATUS[6] + "'>交叉行尾页</option>");
+        pf.append("<option value='" + JV.PAGE_STATUS[7] + "'>交叉列尾页</option>");
+        let ba = $("#bandAlignment");
+        ba.append("<option value='" + JV.LAYOUT[0] + "'>上</option>");
+        ba.append("<option value='" + JV.LAYOUT[1] + "'>下</option>");
+        ba.append("<option value='" + JV.LAYOUT[2] + "'>左</option>");
+        ba.append("<option value='" + JV.LAYOUT[3] + "'>右</option>");
+        ba.append("<option value='" + JV.LAYOUT[4] + "'>填充</option>");
+        let ha = $("#elementAlignmentHorizon");
+        ha.append("<option value='" + JV.OUTPUT_ALIGN.H[0] + "'>左</option>");
+        ha.append("<option value='" + JV.OUTPUT_ALIGN.H[1] + "'>中</option>");
+        ha.append("<option value='" + JV.OUTPUT_ALIGN.H[2] + "'>右</option>");
+        let va = $("#elementAlignmentVertical");
+        va.append("<option value='" + JV.OUTPUT_ALIGN.V[0] + "'>上</option>");
+        va.append("<option value='" + JV.OUTPUT_ALIGN.V[1] + "'>中</option>");
+        va.append("<option value='" + JV.OUTPUT_ALIGN.V[2] + "'>下</option>");
+    },
+    checkAndSetSelectedNodeCfg: function (treeNode) {
+        let me = rpt_tpl_cfg_helper;
+        if (treeNode[JV.PROP_AREA]) {
+            $("#element_font")[0].style.display = "";
+            $("#element_border")[0].style.display = "";
+            $("#element_control")[0].style.display = "";
+            //setup font
+            let fontDom = $("#elementFonts").get(0);
+            fontDom.removeAttribute("disabled")
+            let fontAttr = treeNode[JV.PROP_FONT];
+            if (typeof treeNode[JV.PROP_FONT] !== "string") {
+                fontAttr = "自定义";
+            }
+            let idx = me.reportCfg.fontArr.indexOf(fontAttr);
+            fontDom.selectedIndex = idx;
+            me.fontChange(fontDom);
+            //setup border
+            let borderDom = $("#elementBorders").get(0);
+            let borderAttr = treeNode[JV.PROP_STYLE];
+            idx = me.reportCfg.borderArr.indexOf(borderAttr);
+            borderDom.selectedIndex = idx;
+            me.borderChange(borderDom);
+            //setup control
+            let ctrlDom = $("#elementControls").get(0);
+            let ctrlAttr = treeNode[JV.PROP_CONTROL];
+            idx = me.reportCfg.controlArr.indexOf(ctrlAttr);
+            ctrlDom.selectedIndex = idx;
+            me.controlChange(ctrlDom);
+        } else {
+            $("#elementFonts").get(0).disabled = "disabled" ;
+            $("#element_font")[0].style.display = "none";
+            $("#element_border")[0].style.display = "none";
+            $("#element_control")[0].style.display = "none";
+        }
+    },
+    fontChange: function(dom) {
+        let me = rpt_tpl_cfg_helper, fontAttr = dom.value;
+        //dataInfoMapTreeOprObj.currentNode
+        if (fontAttr === "自定义") {
+            fontAttr = dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT];
+            if (typeof fontAttr === "string") {
+                fontAttr = {};
+                fontAttr[JV.FONT_PROPS[0]] = "宋体";
+                fontAttr[JV.FONT_PROPS[1]] = 12;
+                fontAttr[JV.FONT_PROPS[2]] = "BLACK";
+                fontAttr[JV.FONT_PROPS[3]] = "F"; //bold
+                fontAttr[JV.FONT_PROPS[4]] = "F"; //italic
+                fontAttr[JV.FONT_PROPS[5]] = "F"; //underline
+                fontAttr[JV.FONT_PROPS[6]] = "F"; //strikeout
+                fontAttr[JV.FONT_PROPS[7]] = 0;   //angle
+                dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT] = fontAttr;
+            }
+        } else {
+            dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT] = fontAttr;
+        }
+        me.private_setup_font(fontAttr);
+    },
+    private_setup_font: function(fontAttr) {
+        let me = rpt_tpl_cfg_helper;
+        if (typeof fontAttr === "string" && fontAttr !== "自定义") {
+            $("#eleFontName").get(0).disabled = "disabled" ;
+            $("#eleFontSize").get(0).disabled = "disabled" ;
+            $("#eleFontBold").get(0).disabled = "disabled" ;
+            $("#eleFontItalic").get(0).disabled = "disabled" ;
+            $("#eleFontUnderline").get(0).disabled = "disabled" ;
+            let idx = me.reportCfg.fontArr.indexOf(fontAttr);
+            $("#elementFonts").get(0).selectedIndex = idx;
+            let font = me.reportCfg.fonts[idx];
+            $("#eleFontName").get(0).value = font.Name;
+            $("#eleFontSize").get(0).value = parseInt(font.FontHeight);
+            $("#eleFontBold").get(0).checked = stringUtil.convertStrToBoolean(font.FontBold);
+            $("#eleFontItalic").get(0).checked = stringUtil.convertStrToBoolean(font.FontItalic);
+            $("#eleFontUnderline").get(0).checked = stringUtil.convertStrToBoolean(font.FontUnderline);
+        } else {
+            //$("#elementFonts").get(0).selectedIndex = idx;
+            $("#eleFontName").get(0).removeAttribute("disabled");
+            $("#eleFontSize").get(0).removeAttribute("disabled");
+            $("#eleFontBold").get(0).removeAttribute("disabled");
+            $("#eleFontItalic").get(0).removeAttribute("disabled");
+            $("#eleFontUnderline").get(0).removeAttribute("disabled");
+            $("#eleFontName").get(0).value = fontAttr.Name;
+            $("#eleFontSize").get(0).value = parseInt(fontAttr.FontHeight);
+            $("#eleFontBold").get(0).checked = stringUtil.convertStrToBoolean(fontAttr.FontBold);
+            $("#eleFontItalic").get(0).checked = stringUtil.convertStrToBoolean(fontAttr.FontItalic);
+            $("#eleFontUnderline").get(0).checked = stringUtil.convertStrToBoolean(fontAttr.FontUnderline);
+        }
+    },
+    fontNameChange: function(dom){
+        let font = dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT];
+        font[JV.FONT_PROPS[0]] = dom.value;
+    },
+    fontSizeChange: function(dom) {
+        let font = dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT];
+        font[JV.FONT_PROPS[1]] = dom.value;
+    },
+    fontBoldChange: function(dom) {
+        let font = dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT];
+        font[JV.FONT_PROPS[3]] = dom.checked?'T':'F';
+    },
+    fontItalicChange: function(dom) {
+        let font = dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT];
+        font[JV.FONT_PROPS[4]] = dom.checked?'T':'F';
+    },
+    fontUnderlineChange: function(dom) {
+        let font = dataInfoMapTreeOprObj.currentNode[JV.PROP_FONT];
+        font[JV.FONT_PROPS[5]] = dom.checked?'T':'F';
+    },
+    borderChange: function(dom) {
+        if (dataInfoMapTreeOprObj.currentNode) {
+            let me = this, borderAttr = dom.value;
+            let idx = me.reportCfg.borderArr.indexOf(borderAttr);
+            let border = me.reportCfg.styles[idx];
+            dataInfoMapTreeOprObj.currentNode[JV.PROP_STYLE] = borderAttr;
+
+            $("#eleBorderLeft").get(0).value = border[JV.PROP_BORDER_STYLE][JV.IDX_LEFT][JV.PROP_LINE_WEIGHT];
+            $("#eleBorderRight").get(0).value = border[JV.PROP_BORDER_STYLE][JV.IDX_RIGHT][JV.PROP_LINE_WEIGHT];
+            $("#eleBorderTop").get(0).value = border[JV.PROP_BORDER_STYLE][JV.IDX_TOP][JV.PROP_LINE_WEIGHT];
+            $("#eleBorderBottom").get(0).value = border[JV.PROP_BORDER_STYLE][JV.IDX_BOTTOM][JV.PROP_LINE_WEIGHT];
+        }
+    },
+    controlChange: function(dom) {
+        if (dataInfoMapTreeOprObj.currentNode) {
+            let me = this, ctrlAttr = dom.value;
+            let idx = me.reportCfg.controlArr.indexOf(ctrlAttr);
+            let ctrl = me.reportCfg.ctrls[idx];
+            dataInfoMapTreeOprObj.currentNode[JV.PROP_CONTROL] = ctrlAttr;
+
+            $("#elementAlignmentHorizon").get(0).selectedIndex = JV.OUTPUT_ALIGN.H.indexOf(ctrl[JV.CONTROL_PROPS[2]]);
+            $("#elementAlignmentVertical").get(0).selectedIndex = JV.OUTPUT_ALIGN.V.indexOf(ctrl[JV.CONTROL_PROPS[3]]);
+            $("#eleShrink").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[0]]);
+            $("#eleShowZero").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[1]]);
+            $("#eleAutoWrap").get(0).checked = stringUtil.convertStrToBoolean(ctrl[JV.CONTROL_PROPS[4]]);
+        }
+    },
+    changeAlignment: function(dom, type) {
+        if (type === "horizon") {
+            //
+        } else {
+            //vertical
+        }
+    }
+
+};

+ 348 - 82
web/maintain/report/js/rpt_tpl_data_map.js

@@ -1,27 +1,38 @@
 /**
 /**
  * Created by Tony on 2017/10/5.
  * Created by Tony on 2017/10/5.
+ * 各种类型(flow/bill/cross)数据类型 + 离散
  */
  */
 'use strict'
 'use strict'
 
 
 let dataInfoMapTreeOprObj = {
 let dataInfoMapTreeOprObj = {
     treeObj : null,
     treeObj : null,
+    bandTreeObj: null,
+    selectedTreeObj: null,
     currentNode: null,
     currentNode: null,
     dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image'],
     dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image'],
     iniTree: function(rptTpl) {
     iniTree: function(rptTpl) {
-        var me = this;
+        let me = this;
         let fieldMapList = me.buildTreeData(rptTpl);
         let fieldMapList = me.buildTreeData(rptTpl);
         me.treeObj = $.fn.zTree.init($("#tpl_data_info_reversed"), rptDataInfoSetting, fieldMapList);
         me.treeObj = $.fn.zTree.init($("#tpl_data_info_reversed"), rptDataInfoSetting, fieldMapList);
         me.treeObj.expandAll(true);
         me.treeObj.expandAll(true);
     },
     },
     iniDataMap: function () {
     iniDataMap: function () {
-        let me = this, bandList = bandTreeOprObj.copyBandList(true);
+        let me = this, bandList = bandTreeOprObj.copyBandList(false);
         if (bandList) {
         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) {
     buildTreeData: function (rptTpl) {
         let me = this, rst = null;
         let me = this, rst = null;
@@ -46,72 +57,117 @@ let dataInfoMapTreeOprObj = {
         let discreteNode = {Name: JV.NODE_DISCRETE_INFO};
         let discreteNode = {Name: JV.NODE_DISCRETE_INFO};
         rst.push(rootFieldNode);
         rst.push(rootFieldNode);
         rst.push(discreteNode);
         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;
         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];
         let me = this, bandName = billData[JV.PROP_BAND_NAME];
         if (rootFieldNode) {
         if (rootFieldNode) {
+            rootFieldNode[JV.PROP_BAND_NAME] = bandName;
             rootFieldNode.items = [];
             rootFieldNode.items = [];
             for (let fieldItem of billData[JV.PROP_BILL_FIELDS]) {
             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;
         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": "子项(所在区域:" + dtl[JV.PROP_BAND_NAME] + ")", "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;
         let me = this, rst = null;
         if (fieldData) {
         if (fieldData) {
             rst = {};
             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;
         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) {
     private_copy_area: function (orgArea, destArea) {
         destArea[JV.PROP_LEFT] = orgArea[[JV.PROP_LEFT]];
         destArea[JV.PROP_LEFT] = orgArea[[JV.PROP_LEFT]];
         destArea[JV.PROP_RIGHT] = orgArea[[JV.PROP_RIGHT]];
         destArea[JV.PROP_RIGHT] = orgArea[[JV.PROP_RIGHT]];
@@ -120,32 +176,131 @@ let dataInfoMapTreeOprObj = {
         destArea[JV.PROP_H_CALCULATION] = orgArea[[JV.PROP_H_CALCULATION]];
         destArea[JV.PROP_H_CALCULATION] = orgArea[[JV.PROP_H_CALCULATION]];
         destArea[JV.PROP_V_CALCULATION] = orgArea[[JV.PROP_V_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;
         let me = this, rst = null;
         if (param) {
         if (param) {
             rst = {};
             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;
         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) {
-        //
+    private_setup_dummy_field_node: function(node) {
+        if (!node[JV.PROP_PARAM_ID]) {
+            node[JV.PROP_FIELD_ID] = node[JV.PROP_ID];
+        }
+        node[JV.PROP_FONT] = "Content";
+        node[JV.PROP_CONTROL] = "Default";
+        node[JV.PROP_STYLE] = "Default_None";
+        node[JV.PROP_AREA] = {};
+        node[JV.PROP_AREA][JV.PROP_LEFT] = 0;
+        node[JV.PROP_AREA][JV.PROP_RIGHT] = 100;
+        node[JV.PROP_AREA][JV.PROP_TOP] = 0;
+        node[JV.PROP_AREA][JV.PROP_BOTTOM] = 100;
+        node[JV.PROP_AREA][JV.PROP_H_CALCULATION] = JV.CAL_TYPE[0];
+        node[JV.PROP_AREA][JV.PROP_V_CALCULATION] = JV.CAL_TYPE[0];
     },
     },
-    onBandClick: function (event,treeId,treeNode) {
-        //
+
+    onTabDataClick: function (event,treeId,treeNode) {
+        let me = dataInfoMapTreeOprObj, matchedBandNode = null;
+        let bandChked = false;
+        me.currentNode = treeNode;
+        function checkBandNode(bNode, bandName) {
+            if (bNode[JV.PROP_NAME] === bandName) {
+                bandChked = true;
+                matchedBandNode = bNode;
+            } else if (bNode.items){
+                for (let subNode of bNode.items) {
+                    checkBandNode(subNode, bandName);
+                    if (bandChked) {
+                        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 (bandChked) {
+                    break;
+                }
+            }
+        }
+        if (bandChked) {
+            setDisabledBandSelect(false);
+            me.bandTreeObj.checkNode(matchedBandNode, true, true);
+        } else {
+            setDisabledBandSelect(true);
+        }
+        //检测是否为field/param/text对象
+        rpt_tpl_cfg_helper.checkAndSetSelectedNodeCfg(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];
+            me.currentNode[JV.PROP_NAME] = "子项(所在区域:" + treeNode[JV.PROP_NAME] + ")";
+            me.treeObj.updateNode(me.currentNode);
+        }
     },
     },
     onBeforeRemove: function(treeId, treeNode){
     onBeforeRemove: function(treeId, treeNode){
         let rst = true;
         let rst = true;
@@ -157,7 +312,16 @@ let dataInfoMapTreeOprObj = {
         return rst;
         return rst;
     },
     },
     beforeRename: function(treeId, treeNode, newName, isCancel) {
     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) {
     onBeforeDrag: function (treeId, treeNodes) {
         let rst = true;
         let rst = true;
@@ -171,35 +335,137 @@ let dataInfoMapTreeOprObj = {
     },
     },
     onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
     onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
         let rst = false;
         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') {
-                    rst = true;
-                }
+        if (targetNode.Name === JV.NODE_FLOW_CONTENT || targetNode.Name === JV.NODE_BILL_CONTENT || targetNode.Name === JV.NODE_CROSS_CONTENT
+            || targetNode.Name === JV.NODE_CROSS_ROW || targetNode.Name === JV.NODE_CROSS_COL
+            || targetNode.Name === "离散字段集" ) {
+            rst = true;
+        }
+        return rst;
+    },
+    onDrop: function(event, treeId, treeNodes, targetNode, moveType) {
+        let me = dataInfoMapTreeOprObj;
+        for (let node of treeNodes) {
+            me.private_setup_dummy_field_node(node);
+        }
+    },
+    onRemove: function (e, treeId, treeNode) {
+        //
+    },
+    onRename: function (e, treeId, treeNode, isCancel) {
+        if (!isCancel) {
+            treeNode[JV.PROP_LABEL] = treeNode[JV.PROP_NAME];
+        }
+    },
+    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] = "子项(所在区域:" + me.bandTreeObj.getNodes()[0][JV.PROP_NAME] + ")";
+                    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 {
             } else {
-                let parentNode = targetNode.getParentNode();
-                if (parentNode.Name === "离散信息") {
-                    if (targetNode.Name === "Fields") {
-                        rst = true;
+                //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);
                     }
                     }
-                } else if (parentNode.Name === "Fields") {
-                    rst = true;
+                    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);
                 }
                 }
             }
             }
         }
         }
-        return rst;
     },
     },
-    onRemove: function () {
-        //
-    },
-    onRename: function () {
-        //
+    private_extract_discrete_info: function(discreteNode) {
+        let me = this, rst = [];
+        for (let dtlItemNode of discreteNode.items) {
+            let newContent = {};
+            rst.push(newContent);
+            newContent[JV.PROP_BAND_NAME] = dtlItemNode[JV.PROP_BAND_NAME];
+            for (let node of dtlItemNode.items) {
+                // if (node[JV.PROP_DISCRETE_FIELDS] && node[JV.PROP_DISCRETE_FIELDS].length > 0) {
+                if (node[JV.PROP_NAME] === "离散字段集" && node.items.length > 0) {
+                    newContent[JV.PROP_DISCRETE_FIELDS] = [];
+                    for (let field of node.items) {
+                        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) {
+                if (node[JV.PROP_NAME] === "离散文本集" && node.items.length > 0) {
+                    newContent[JV.PROP_TEXTS] = [];
+                    for (let txt of node.items) {
+                        let item = {};
+                        newContent[JV.PROP_TEXTS].push(item);
+                        me.private_copy_text_properties(txt, item);
+                    }
+                }
+            }
+        }
+        return rst;
     },
     },
-    extractFieldMaps: function (rptTpl) {
-        //
+    extractDiscreteFieldParam: function(rptTpl) {
+        let me = dataInfoMapTreeOprObj;
     },
     },
     createMapFieldByNode: function (node) {
     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) {
-        //
-    }
-}

+ 48 - 14
web/maintain/report/js/rpt_tpl_field_map.js

@@ -1,3 +1,9 @@
+/**
+ * Created by Tony on 2017/6/7.
+ * 各种指标处理对象
+ * 包括:可映射指标、报表已选指标集合、离散独立指标和参数
+ */
+
 'use strict'
 'use strict'
 
 
 let fieldMapTreeOprObj = {
 let fieldMapTreeOprObj = {
@@ -34,17 +40,19 @@ let fieldMapTreeOprObj = {
         return rst;
         return rst;
     },
     },
     copySelectedFieldList: function () {
     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;
         return rst;
     },
     },
@@ -99,10 +107,10 @@ let fieldMapTreeOprObj = {
         }
         }
         return rst;
         return rst;
     },
     },
-    onRemove: function () {
+    onRemove: function (e, treeId, treeNode) {
         //
         //
     },
     },
-    onRename: function () {
+    onRename: function (e, treeId, treeNode, isCancel) {
         //
         //
     },
     },
     extractFieldMaps: function (rptTpl) {
     extractFieldMaps: function (rptTpl) {
@@ -197,8 +205,27 @@ let discreteFieldParamTreeOprObj = {
         let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true};
         let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true};
         rst.push(disFieldNode);
         rst.push(disFieldNode);
         rst.push(disParamNode);
         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_FIELD_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_PARAM_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;
         return rst;
     },
     },
     addHoverDom: function(treeId, treeNode) {
     addHoverDom: function(treeId, treeNode) {
@@ -229,7 +256,14 @@ let discreteFieldParamTreeOprObj = {
         return rst;
         return rst;
     },
     },
     onBeforeDrag: function (treeId, treeNodes) {
     onBeforeDrag: function (treeId, treeNodes) {
-        //
+        let rst = true;
+        for (let node of treeNodes) {
+            if (node.level === 0) {
+                rst = false;
+                break;
+            }
+        }
+        return rst;
     },
     },
     onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
     onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
         // let rst = false;
         // let rst = false;

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

@@ -1,5 +1,7 @@
 /**
 /**
  * Created by Tony on 2017/6/7.
  * Created by Tony on 2017/6/7.
+ * 报表模板helper
+ * 管理:编办、工程类型等
  */
  */
 let tplHelper = {
 let tplHelper = {
     createDftRptTpl: function(treeNode) {
     createDftRptTpl: function(treeNode) {
@@ -65,6 +67,7 @@ let tplHelper = {
             //4. 指标摆放
             //4. 指标摆放
             dataInfoMapTreeOprObj.iniTree(rptTpl);
             dataInfoMapTreeOprObj.iniTree(rptTpl);
             discreteFieldParamTreeOprObj.iniTree(rptTpl);
             discreteFieldParamTreeOprObj.iniTree(rptTpl);
+            dataInfoMapTreeOprObj.iniDataMap();
             //5. 计算式
             //5. 计算式
         }
         }
     },
     },
@@ -88,7 +91,7 @@ let tplHelper = {
 
 
     reCombineRptTpl: function () {
     reCombineRptTpl: function () {
         let rst = true;
         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;
             let rptTpl = zTreeOprObj.currentNode.rptTpl;
             //1. 模板信息
             //1. 模板信息
             zTreeOprObj.extractMainInfo(rptTpl);
             zTreeOprObj.extractMainInfo(rptTpl);
@@ -97,7 +100,8 @@ let tplHelper = {
             //3. 指标映射
             //3. 指标映射
             fieldMapTreeOprObj.extractFieldMaps(rptTpl);
             fieldMapTreeOprObj.extractFieldMaps(rptTpl);
             //4. 指标摆放
             //4. 指标摆放
-            tabFieldCfgTreeOprObj.extractTabFields(rptTpl);
+            dataInfoMapTreeOprObj.extractTabFields(rptTpl);
+            dataInfoMapTreeOprObj.extractDiscreteFieldParam(rptTpl);
             //5. 计算式
             //5. 计算式
             calculationTreeOprObj.extractCalculation(rptTpl);
             calculationTreeOprObj.extractCalculation(rptTpl);
         } else {
         } else {

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

@@ -4,7 +4,7 @@ let rptTplObj = {
     iniPage: function() {
     iniPage: function() {
         zTreeOprObj.iniEngineerIdList();
         zTreeOprObj.iniEngineerIdList();
         zTreeOprObj.getCompilationList();
         zTreeOprObj.getCompilationList();
-        bandTreeOprObj.getReportTplCfg();
+        rpt_tpl_cfg_helper.getReportTplCfg();
         selectableFiledTreeOprObj.iniTree();
         selectableFiledTreeOprObj.iniTree();
         preview_util.drawBorder($("#tplCanvas")[0]);
         preview_util.drawBorder($("#tplCanvas")[0]);
     }
     }

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

@@ -0,0 +1,304 @@
+<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="row" id="element_font">
+                            <div class="form-group col-md-3">
+                                <label>字体选择</label>
+                                <select class="form-control" id="elementFonts" onchange="rpt_tpl_cfg_helper.fontChange(this)" disabled></select>
+                            </div>
+                            <div class="form-group col-md-3">
+                                <label>字体名称</label>
+                                <input class="form-control" id="eleFontName" value="" onchange="rpt_tpl_cfg_helper.fontNameChange(this)" disabled>
+                            </div>
+                            <div class="form-group col-md-2">
+                                <label>字体大小</label>
+                                <input class="form-control input-sm" id="eleFontSize" type="number" value="12" step="1" min="6" max="56" onchange="rpt_tpl_cfg_helper.fontSizeChange(this)" disabled>
+                            </div>
+                            <div class="form-group col-md-4">
+                                <label></label>
+                                <div class="form-check">
+                                    <label class="form-check-label">
+                                        <input type="checkbox" class="form-check-input" id="eleFontBold" onchange="rpt_tpl_cfg_helper.fontBoldChange(this)" disabled>
+                                        粗体
+                                    </label>&nbsp&nbsp
+                                    <label class="form-check-label">
+                                        <input type="checkbox" class="form-check-input" id="eleFontItalic" onchange="rpt_tpl_cfg_helper.fontItalicChange(this)" disabled>
+                                        斜体
+                                    </label>&nbsp&nbsp
+                                    <label class="form-check-label">
+                                        <input type="checkbox" class="form-check-input" id="eleFontUnderline" onchange="rpt_tpl_cfg_helper.fontUnderlineChange(this)" disabled>
+                                        下划线
+                                    </label>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row" id="element_border">
+                            <div class="form-group col-md-3">
+                                <label>边框样式</label>
+                                <select class="form-control" id="elementBorders" onchange="rpt_tpl_cfg_helper.borderChange(this)"></select>
+                            </div>
+                            <div class="form-group col-md-2">
+                                <label>左边</label>
+                                <input class="form-control input-sm" id="eleBorderLeft" type="number" value="0" step="1" min="0" max="3" disabled>
+                            </div>
+                            <div class="form-group col-md-2">
+                                <label>右边</label>
+                                <input class="form-control input-sm" id="eleBorderRight" type="number" value="0" step="1" min="0" max="3" disabled>
+                            </div>
+                            <div class="form-group col-md-2">
+                                <label>上边</label>
+                                <input class="form-control input-sm" id="eleBorderTop" type="number" value="0" step="1" min="0" max="3" disabled>
+                            </div>
+                            <div class="form-group col-md-2">
+                                <label>下边</label>
+                                <input class="form-control input-sm" id="eleBorderBottom" type="number" value="0" step="1" min="0" max="3" disabled>
+                            </div>
+                        </div>
+                        <div class="row" id="element_control">
+                            <div class="form-group col-md-3">
+                                <label>控制选择</label>
+                                <select class="form-control" id="elementControls" onchange="rpt_tpl_cfg_helper.controlChange(this)"></select>
+                            </div>
+                            <div class="form-group col-md-2">
+                                <label>横向对齐</label>
+                                <select class="form-control" id="elementAlignmentHorizon" onchange="rpt_tpl_cfg_helper.changeAlignment(this, 'horizon')" disabled></select>
+                            </div>
+                            <div class="form-group col-md-2">
+                                <label>纵向对齐</label>
+                                <select class="form-control" id="elementAlignmentVertical" onchange="rpt_tpl_cfg_helper.changeAlignment(this, 'vertical')" disabled></select>
+                            </div>
+                            <div class="form-group col-md-5">
+                                <label></label>
+                                <div class="form-check">
+                                    <label class="form-check-label">
+                                        <input type="checkbox" class="form-check-input" id="eleShrink" onchange="" disabled>
+                                        自动缩放
+                                    </label>&nbsp&nbsp
+                                    <label class="form-check-label">
+                                        <input type="checkbox" class="form-check-input" id="eleShowZero" onchange="" disabled>
+                                        显示0
+                                    </label>&nbsp&nbsp
+                                    <label class="form-check-label">
+                                        <input type="checkbox" class="form-check-input" id="eleAutoWrap" onchange="" disabled>
+                                        自动折行
+                                    </label>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row" id="element_area">
+                        </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>

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

@@ -49,253 +49,16 @@
         <div class="content">
         <div class="content">
             <div class="container-fluid">
             <div class="container-fluid">
                 <div class="row">
                 <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>
-                    <div class="main-content col-lg-9 p-0">
+                    <div class="main-content col-lg-10 p-0">
                         <div class="container-fluid">
                         <div class="container-fluid">
                             <div class="row">
                             <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>
                         </div>
                     </div>
                     </div>
@@ -304,51 +67,16 @@
         </div>
         </div>
     </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. -->
     <!-- JS. -->
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/maintain/report/js/global.js"></script>
     <script src="/web/maintain/report/js/global.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_main.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_main.js"></script>
+    <script src="/web/maintain/report/js/rpt_tpl_cfg_helper.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_band.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_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_calculation.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_helper.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>
     <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>

+ 12 - 0
web/users/js/main_tree_col.js

@@ -23,6 +23,9 @@ let MainTreeCol = {
         ration: function (node) {
         ration: function (node) {
             return node.sourceType === projectObj.project.Ration.getSourceType();
             return node.sourceType === projectObj.project.Ration.getSourceType();
         },
         },
+        glj: function (node) {
+            return node.sourceType == projectObj.project.ration_glj.getSourceType();
+        },
         volumePrice: function (node) {
         volumePrice: function (node) {
             return node.sourceType === projectObj.project.VolumePrice.getSourceType();
             return node.sourceType === projectObj.project.VolumePrice.getSourceType();
         },
         },
@@ -50,6 +53,15 @@ let MainTreeCol = {
         },
         },
         forTotalFee: function (node) {
         forTotalFee: function (node) {
             return MainTreeCol.readOnly.non_bills(node) || MainTreeCol.readOnly.billsParent(node) || (MainTreeCol.readOnly.leafBillsWithDetail(node));
             return MainTreeCol.readOnly.non_bills(node) || MainTreeCol.readOnly.billsParent(node) || (MainTreeCol.readOnly.leafBillsWithDetail(node));
+        },
+        forFeeRate:function (node) {
+            return MainTreeCol.readOnly.non_bills(node)||MainTreeCol.readOnly.billsParent(node)||MainTreeCol.readOnly.leafBillsWithDetail(node);
+        },
+        forQuantity:function (node) {
+            return MainTreeCol.readOnly.glj(node)||MainTreeCol.readOnly.billsParent(node)
+        },
+        forMarketPrice:function (node) {
+            return MainTreeCol.readOnly.non_volumePrice(node);
         }
         }
     },
     },
     cellType: {
     cellType: {