TonyKang %!s(int64=8) %!d(string=hai) anos
pai
achega
7947bc7bf3

+ 2 - 1
.gitignore

@@ -1,4 +1,5 @@
 node_modules/
 .git/
 dist/
-.idea/
+.idea/
+tmp/

+ 52 - 65
modules/reports/controllers/rpt_controller.js

@@ -23,77 +23,64 @@ let callback = function(req, res, err, data){
     }
 };
 
-module.exports = {
-    getReportAllPages: function(req, res){
-        let grp_id = req.body.grp_id;
-        let tpl_id = req.body.tpl_id;
-        let pageSize = req.body.pageSize;
-        let rptTpl = null;
-        Template.findOne({GROUP_KEY: grp_id, ID_KEY: tpl_id}, '-_id').exec().then(function(rst) {
-            rptTpl = rst;
-            if (rptTpl) {
-                return TemplateData.getPromise(tpl_id);
+function getAllPagesCommon(req, res, rpt_id, pageSize, cb) {
+    let rptTpl = null;
+    Template.findOne({ID: rpt_id}, '-_id').exec().then(function(rst) {
+        rptTpl = rst;
+        if (rptTpl) {
+            if (rptTpl.ID_KEY) {
+                return TemplateData.getPromise(rptTpl.ID_KEY);
             } else {
-                callback(req, res, 'No report template was found!', null);
+                callback(req, res, 'No report template data were found!', null);
             }
-        }).then(function(tplData){
-                if (tplData) {
-                    let printCom = JpcEx.createNew();
-                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
-                    let defProperties = rptUtil.getReportDefaultCache();
-                    printCom.initialize(rptTpl);
-                    printCom.analyzeData(rptTpl, tplData, defProperties);
-                    let maxPages = printCom.totalPages;
-                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
-                    if (pageRst) {
-                        callback(req, res, null, pageRst);
-                    } else {
-                        callback(req, res, "Have errors while on going...", null);
-                    }
+        } else {
+            callback(req, res, 'No report template was found!', null);
+        }
+    }).then(function(tplData){
+            if (tplData) {
+                let printCom = JpcEx.createNew();
+                rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                let defProperties = rptUtil.getReportDefaultCache();
+                printCom.initialize(rptTpl);
+                printCom.analyzeData(rptTpl, tplData, defProperties);
+                let maxPages = printCom.totalPages;
+                let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                if (pageRst) {
+                    cb(pageRst);
                 } else {
-                    callback(req, res, 'No report data were found!', null);
+                    callback(req, res, "Have errors while on going...", null);
                 }
+            } else {
+                callback(req, res, 'No report data were found!', null);
             }
-        );
+        }
+    );
+};
+
+module.exports = {
+    getReportAllPages: function(req, res){
+        let rpt_id = req.body.ID;
+        let pageSize = req.body.pageSize;
+        getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
+            callback(req, res, null, pageRst);
+        })
     },
     getExcel: function(req, res) {
-        let grp_id = req.params.id, tpl_id = req.params.pm, pageSize = req.params.size, rptName = req.params.rptName;
-        let rptTpl = null;
-        Template.findOne({GROUP_KEY: grp_id, ID_KEY: tpl_id}, '-_id').exec().then(function(rst) {
-            rptTpl = rst;
-            if (rptTpl) {
-                return TemplateData.getPromise(tpl_id);
-            } else {
-                callback(req, res, 'No report template was found!', null);
-            }
-        }).then(function(tplData){
-                if (tplData) {
-                    let printCom = JpcEx.createNew();
-                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
-                    let defProperties = rptUtil.getReportDefaultCache();
-                    printCom.initialize(rptTpl);
-                    printCom.analyzeData(rptTpl, tplData, defProperties);
-                    let maxPages = printCom.totalPages;
-                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
-                    if (pageRst) {
-                        rpt_xl_util.exportExcel(pageRst, rptName, null, function(newName){
-                            res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-                            res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
-                            let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
-                            filestream.on('data', function(chunk) {
-                                res.write(chunk);
-                            });
-                            filestream.on('end', function() {
-                                res.end();
-                            });
-                        });
-                    } else {
-                        callback(req, res, "Have errors while on going...", null);
-                    }
-                } else {
-                    callback(req, res, 'No report data were found!', null);
-                }
-            }
-        );
+        let rpt_id = req.params.id,
+            pageSize = req.params.size,
+            rptName = req.params.rptName;
+        getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
+            rpt_xl_util.exportExcel(pageRst, rptName, null, function(newName){
+                res.setHeader('Content-Type', 'application/vnd.openxmlformats');
+                res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
+                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
+                filestream.on('data', function(chunk) {
+                    res.write(chunk);
+                });
+                filestream.on('end', function() {
+                    res.end();
+                });
+            });
+        })
     }
 };

+ 34 - 2
modules/reports/controllers/rpt_tpl_controller.js

@@ -5,9 +5,10 @@
 let async = require("async");
 let counter = require('../../../public/counter/counter');
 
-//let TplNode = require('../models/tpl_tree_node');
+let RptTplModel = require('../models/rpt_template');
 let TreeNodeModel = require('../models/tpl_tree_node');
 let rptTplDef = require("../../../public/rpt_tpl_def").getUtil();
+let stringUtil = require("../../../public/stringUtil");
 
 //统一回调函数
 let callback = function(req, res, err, message, data){
@@ -48,7 +49,7 @@ module.exports = {
             callback(req,res, err, "", results);
         });
     },
-    deleteTptTplNodes: function(req, res){
+    deleteRptTplNodes: function(req, res){
         let params = JSON.parse(req.body.params),
             nodeIds = params.nodeIds,
             preNodeId = params.preNodeId,
@@ -95,5 +96,36 @@ module.exports = {
                 }
             });
         });
+    },
+    createDftRptTpl: function(req, res) {
+        let params = JSON.parse(req.body.params),
+            treeNodeId = params.treeNodeId,
+            //grpChars = stringUtil.getPinYinFullChars(params.grpChars),
+            rptDftTplId = params.rptDftTplId;
+        let filter = {"ID": rptDftTplId};
+        RptTplModel.findOne(filter, '-_id').exec().then(function(dftTplRst) {
+            if (dftTplRst) {
+                dftTplRst["ID"] = treeNodeId;
+                dftTplRst["GROUP_KEY"] = "";
+                dftTplRst["ID_KEY"] = "";
+                let rptTpl = new RptTplModel(dftTplRst);
+                rptTpl.save(function (err, actTplRst) {
+                    if (err) {
+                        callback(req,res, "报表模板创建错误", "", null);
+                    } else {
+                        //TreeNodeModel.update();
+                        TreeNodeModel.update({ID: treeNodeId}, {"refId": treeNodeId}, function(err, rst){
+                            if (err) {
+                                callback(req,res, "报表模板创建错误", "", null);
+                            } else {
+                                callback(req,res, false, "", actTplRst);
+                            }
+                        });
+                    }
+                });
+            } else {
+                callback(req, res, 'Create report template failed!', null);
+            }
+        })
     }
 }

+ 2 - 0
modules/reports/models/rpt_template.js

@@ -6,12 +6,14 @@ let dbm = require("../../../config/db/db_manager");
 let smartcostdb = dbm.getCfgConnection("scConstruct");
 let Schema = mongoose.Schema;
 let RptTemplateSchema = new Schema({
+    "ID" : Number,
     "GROUP_KEY": String,
     "ID_KEY": String,
     "主信息": Schema.Types.Mixed,
     "指标_数据_映射": Schema.Types.Mixed,
     "布局框_集合": Array,
     "流水式表_信息": Schema.Types.Mixed,
+    "账单式表_信息": Schema.Types.Mixed,
     "交叉表_信息": Schema.Types.Mixed,
     "无映射离散指标_集合": Schema.Types.Mixed,
     "离散参数_集合": Schema.Types.Mixed,

+ 1 - 1
modules/reports/routes/report_router.js

@@ -7,6 +7,6 @@ let rptRouter = express.Router();
 let reportController = require('./../controllers/rpt_controller');
 
 rptRouter.post('/getReport', reportController.getReportAllPages);
-rptRouter.get('/getExcel/:id/:pm/:size/:rptName', reportController.getExcel);
+rptRouter.get('/getExcel/:id/:size/:rptName', reportController.getExcel);
 
 module.exports = rptRouter;

+ 3 - 2
modules/reports/routes/rpt_tpl_router.js

@@ -4,7 +4,8 @@ let reportTplController = require('./../controllers/rpt_tpl_controller');
 
 rptTplRouter.post('/createTplTreeNode', reportTplController.createTplTreeNode);
 rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
-rptTplRouter.post('/updateTptTplNodes', reportTplController.updateTreeNodes);
-rptTplRouter.post('/deleteTptTplNodes', reportTplController.deleteTptTplNodes);
+rptTplRouter.post('/updateRptTplNodes', reportTplController.updateTreeNodes);
+rptTplRouter.post('/deleteRptTplNodes', reportTplController.deleteRptTplNodes);
+rptTplRouter.post('/createDftRptTpl', reportTplController.createDftRptTpl);
 
 module.exports = rptTplRouter;

+ 50 - 8
web/maintain/report/js/rpt_tpl_main.js

@@ -41,6 +41,40 @@ let zTreeOprObj = {
         }
         me.treeObj.refresh();
     },
+    moveUpNode: function() {
+        let me = this, nodes = [];
+        if (me.currentNode && me.currentNode.getPreNode()) {
+            let preNode = me.currentNode.getPreNode(), pre_preNode = preNode.getPreNode();
+            me.treeObj.moveNode(preNode, me.currentNode, "prev", true);
+            //then update the db
+            if (pre_preNode) {
+                pre_preNode.NextSiblingID = me.currentNode.ID;
+                nodes.push(me.createNodeFromZTreeNode(pre_preNode));
+            }
+            preNode.NextSiblingID = me.currentNode.NextSiblingID;
+            me.currentNode.NextSiblingID = preNode.ID;
+            nodes.push(me.createNodeFromZTreeNode(me.currentNode));
+            nodes.push(me.createNodeFromZTreeNode(preNode));
+            me.updateNodes(nodes);
+        }
+    },
+    moveDownNode: function() {
+        let me = this, nodes = [];
+        if (me.currentNode && me.currentNode.getNextNode()) {
+            let preNode = me.currentNode.getPreNode(), nextNode = me.currentNode.getNextNode();
+            me.treeObj.moveNode(nextNode, me.currentNode, "next", true);
+            //then update the db
+            if (preNode) {
+                preNode.NextSiblingID = nextNode.ID;
+                nodes.push(me.createNodeFromZTreeNode(preNode));
+            }
+            me.currentNode.NextSiblingID = nextNode.NextSiblingID;
+            nextNode.NextSiblingID = me.currentNode.ID;
+            nodes.push(me.createNodeFromZTreeNode(me.currentNode));
+            nodes.push(me.createNodeFromZTreeNode(nextNode));
+            me.updateNodes(nodes);
+        }
+    },
     addRootNode: function() {
         let me = this, rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
         if (me.treeObj) {
@@ -75,12 +109,12 @@ let zTreeOprObj = {
             }
             let params = {};
             params.nodes = nodes;
-            CommonAjax.postEx("report_tpl_api/updateTptTplNodes", params, 5000, true, null, null, null);
+            CommonAjax.postEx("report_tpl_api/updateRptTplNodes", params, 5000, true, null, null, null);
         }
     },
     addTplNode: function (){
         let me = this;
-        if (me.currentNode) {
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.NODE) {
             let rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
             rawNode.nodeType = RT.NodeType.TEMPLATE;
             rawNode.ParentID = me.currentNode.ID;
@@ -109,11 +143,11 @@ let zTreeOprObj = {
             }
         }
     },
-    addNewNode: function(rawNode, lastNodeId, callback, failcallback) {
+    addNewNode: function(rawNode, lastNodeId, callback, failCallback) {
         let params = {};
         params.lastNodeId = lastNodeId;
         params.rawNodeData = rawNode;
-        CommonAjax.postEx("report_tpl_api/createTplTreeNode", params, 5000, true, callback, failcallback, null);
+        CommonAjax.postEx("report_tpl_api/createTplTreeNode", params, 5000, true, callback, failCallback, null);
     },
     createIniRootNode: function() {
         let rst = {
@@ -208,7 +242,7 @@ let zTreeOprObj = {
         params.nodeIds = nodeIds;
         params.preNodeId = preNodeId;
         params.preNodeNextId = treeNode.NextSiblingID;
-        CommonAjax.postEx("report_tpl_api/deleteTptTplNodes", params, 5000, false, function(data){
+        CommonAjax.postEx("report_tpl_api/deleteRptTplNodes", params, 5000, false, function(data){
             canRemove = true;
         }, null, null);
         return canRemove;
@@ -234,15 +268,23 @@ let zTreeOprObj = {
     },
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
+        me.currentNode = treeNode;
         if (treeNode.nodeType == RT.NodeType.NODE) {
-            me.currentNode = treeNode;
             $("#rpt_tpl_display_label")[0].innerText = "...";
         } else if (treeNode.nodeType == RT.NodeType.TEMPLATE) {
-            me.currentNode = null;
-            $("#rpt_tpl_display_label")[0].innerText = treeNode.name;
+            let showText = treeNode.name, parentNode = treeNode.getParentNode();
+            while (parentNode !== null) {
+                showText = parentNode.name + ' > ' + showText;
+                parentNode = parentNode.getParentNode();
+            }
+            $("#rpt_tpl_display_label")[0].innerText = showText;
             if (treeNode.refId < 0) {
+                $('#rptTypeSelectionModal').modal('show');
                 //创建新报表模板
             }
         }
+    },
+    createNewTpl: function () {
+        alert('创建中。。。')
     }
 }

+ 26 - 32
web/maintain/report/rpt_test.html

@@ -17,9 +17,9 @@
             <td width="5"></td>
             <td>
                 <select name="select1" id="select_k1" onchange="ajaxCall()">
-                    <option value="SC;07_1">07-1表</option>
-                    <option value="SC;08_2">08-2表</option>
-                    <option value="MEASURE;M_ZB03_QDZF_09">计量-清单支付09表</option>
+                    <option value="2">07-1表</option>
+                    <option value="1">08-2表</option>
+                    <option value="3">计量-清单支付09表</option>
                 </select>
                 <select name="select2" id="select_k2" onchange="ajaxCall()">
                     <option value="A4">A4</option>
@@ -48,14 +48,12 @@
     }
 </style>
 <script>
-    var currentPage = 1;
-    var pageRst = null;
-    var currentRptTpl = null;
-    var maxPages = 20;
-    var defProperties = null;
-    var rpt_grp = null;
-    var rpt_id = null;
-    var rpt_size = null;
+    let currentPage = 1;
+    let pageRst = null;
+    let currentRptTpl = null;
+    let maxPages = 20;
+    let rpt_id = null;
+    let rpt_size = null;
 
     function printCurrentPage() {
         if (currentRptTpl) {
@@ -67,12 +65,12 @@
     }
 
     function getScreenDPI() {
-        var me = this, arrDPI = [];
+        let me = this, arrDPI = [];
         if (window.screen.deviceXDPI != undefined) {
             arrDPI.push(window.screen.deviceXDPI);
             arrDPI.push(window.screen.deviceYDPI);
         } else {
-            var tmpNode = document.createElement("DIV");
+            let tmpNode = document.createElement("DIV");
             tmpNode.style.cssText = "width:1in;height:1in;position:absolute;left:0px;top:0px;z-index:99;visibility:hidden";
             document.body.appendChild(tmpNode);
             arrDPI.push(parseInt(tmpNode.offsetWidth));
@@ -83,13 +81,11 @@
     }
 
     function setupReport() {
-        var rst = false;
-        var rpt = document.getElementById("select_k1");
-        var size = document.getElementById("select_k2");
+        let rst = false;
+        let rpt = document.getElementById("select_k1");
+        let size = document.getElementById("select_k2");
         if (rpt.selectedIndex >= 0 && size.selectedIndex >= 0) {
-            var strs = rpt.options[rpt.selectedIndex].value.split(';');
-            rpt_grp = strs[0];
-            rpt_id = strs[1];
+            rpt_id = rpt.options[rpt.selectedIndex].value;
             rpt_size = size.options[size.selectedIndex].value;
             rst = true;
         }
@@ -99,7 +95,7 @@
     function showPage(pageStep, cv) {
         if (currentPage + pageStep >= 1 && currentPage + pageStep <= maxPages) {
             currentPage = currentPage + pageStep;
-            var canvas = null;
+            let canvas = null;
             if (cv) {
                 canvas = cv;
             } else canvas = document.getElementById("myCanvas");
@@ -110,34 +106,32 @@
     }
 
     function getDummyExcel() {
-        var id = "dummy_request_id";
-        var p1 = "dummy_paramm_2";
-        var url =  "/report_api/getDummyExcel/" + id + "/" + p1;
+        let id = "dummy_request_id";
+        let p1 = "dummy_paramm_2";
+        let url =  "/report_api/getDummyExcel/" + id + "/" + p1;
         window.location = url;//这里不能使用get方法跳转,否则下载不成功
     }
 
     function getExcel() {
-        var rpt = document.getElementById("select_k1");
-        var size = document.getElementById("select_k2");
-        var rpt_name = rpt.options[rpt.selectedIndex].text;
+        let rpt = document.getElementById("select_k1");
+        let size = document.getElementById("select_k2");
+        let rpt_name = rpt.options[rpt.selectedIndex].text;
         if (rpt.selectedIndex >= 0 && size.selectedIndex >= 0) {
-            var strs = rpt.options[rpt.selectedIndex].value.split(';');
-            rpt_grp = strs[0];
-            rpt_id = strs[1];
+            rpt_id = rpt.options[rpt.selectedIndex].value;
             rpt_size = size.options[size.selectedIndex].value;
         }
-        var url =  "/report_api/getExcel/" + rpt_grp + "/" + rpt_id + "/" + rpt_size + "/" + rpt_name;
+        let url =  "/report_api/getExcel/" + rpt_id + "/" + rpt_size + "/" + rpt_name;
         window.location = url;//这里不能使用get方法跳转,否则下载不成功
     }
 
     function ajaxCall() {
         if (setupReport()) {
-            var canvas = document.getElementById("myCanvas");
+            let canvas = document.getElementById("myCanvas");
             canvas.style.cursor = "wait";
             $.ajax({
                 type:"POST",
                 url: 'report_api/getReport',
-                data: {"grp_id": rpt_grp, "tpl_id": rpt_id, "pageSize": rpt_size},
+                data: {"ID": rpt_id, "pageSize": rpt_size},
                 dataType: 'json',
                 cache: false,
                 timeout: 15000,

+ 265 - 226
web/maintain/report/rpt_tpl_main.html

@@ -20,287 +20,326 @@
 </head>
 
 <body>
-<div class="header">
-    <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
-        <span class="header-logo px-2">Smartcost</span>
-        <div class="navbar-text"><a>报表模板库</a> > <a id="rpt_tpl_display_label">...</a></div>
-    </nav>
-    <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
-        <ul class="nav nav-tabs" role="tablist">
-            <li class="nav-item">
-                <a class="nav-link px-3" href="#"><i class="fa fa-sign-out fa-flip-horizontal" aria-hidden="true"></i></a>
-            </li>
-            <li class="nav-item">
-                <a class="nav-link px-3" href="#"><i class="fa fa-sign-out" aria-hidden="true"></i></a>
-            </li>
-            <li class="nav-item">
-                <a class="nav-link active px-3" href="#">系统模板</a>
-            </li>
-        </ul>
-    </nav>
-</div>
-<div class="main">
-    <div class="content">
-        <div class="container-fluid">
-            <div class="row">
-                <div class="main-side col-lg-2 p-0">
-                    <div class="tab-bar">
-                        <a onclick="zTreeOprObj.addRootNode()" class="btn btn-secondary btn-sm">增加根节点</a>
-                        <a onclick="zTreeOprObj.addTplNode()" class="btn btn-secondary btn-sm">增加模板节点</a>
-                    </div>
-                    <div class="tab-content">
-                        <ul id="rptTplTree" class="ztree"></ul>
+    <div class="header">
+        <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
+            <span class="header-logo px-2">Smartcost</span>
+            <div class="navbar-text"><a>报表模板库</a> > <a id="rpt_tpl_display_label">...</a></div>
+        </nav>
+        <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+            <ul class="nav nav-tabs" role="tablist">
+                <li class="nav-item">
+                    <a class="nav-link px-3" href="#"><i class="fa fa-sign-out fa-flip-horizontal" aria-hidden="true"></i></a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link px-3" href="#"><i class="fa fa-sign-out" aria-hidden="true"></i></a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link active px-3" href="#">系统模板</a>
+                </li>
+            </ul>
+        </nav>
+    </div>
+    <div class="main">
+        <div class="content">
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="main-side col-lg-3 p-0">
+                        <div class="tab-bar">
+                            <a onclick="zTreeOprObj.addRootNode()" class="btn btn-secondary btn-sm fa fa-plus-square">根节点</a>
+                            <a onclick="zTreeOprObj.addTplNode()" class="btn btn-secondary btn-sm fa fa-plus-square">模板节点</a>
+                            <a onclick="zTreeOprObj.moveDownNode()" class="btn btn-sm" id="downMove"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
+                            <a onclick="zTreeOprObj.moveUpNode()" class="btn btn-sm" id="upMove"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
+                        </div>
+                        <div class="tab-content">
+                            <ul id="rptTplTree" class="ztree"></ul>
+                        </div>
                     </div>
-                </div>
-                <div class="main-content col-lg-9 p-0">
-                    <div class="container-fluid">
-                        <div class="row">
-                            <!-- 报表设置 -->
-                            <div class="col-lg-4 p-0">
-                                <div class="main-data-top">
-                                    <ul class="nav nav-tabs tools-bar" role="tablist">
-                                        <li class="nav-item">
-                                            <a class="nav-link p-1 active" data-toggle="tab" href="#rpttplinfo" role="tab">模板信息</a>
-                                        </li>
-                                        <li class="nav-item">
-                                            <a class="nav-link p-1" data-toggle="tab" href="#rpttpllayout" role="tab">模板布局</a>
-                                        </li>
-                                        <li class="nav-item">
-                                            <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldmap" role="tab">指标映射</a>
-                                        </li>
-                                        <li class="nav-item">
-                                            <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab">指标摆放</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" placeholder="输入报表名称">
-                                                    </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"><option>A3</option><option>A4</option></select>
+                    <div class="main-content col-lg-9 p-0">
+                        <div class="container-fluid">
+                            <div class="row">
+                                <!-- 报表设置 -->
+                                <div class="col-lg-4 p-0">
+                                    <div class="main-data-top">
+                                        <ul class="nav nav-tabs tools-bar" role="tablist">
+                                            <li class="nav-item">
+                                                <a class="nav-link p-1 active" data-toggle="tab" href="#rpttplinfo" role="tab">模板信息</a>
+                                            </li>
+                                            <li class="nav-item">
+                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttpllayout" role="tab">模板布局</a>
+                                            </li>
+                                            <li class="nav-item">
+                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldmap" role="tab">指标映射</a>
+                                            </li>
+                                            <li class="nav-item">
+                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab">指标摆放</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" placeholder="输入报表名称">
+                                                        </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"><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"><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"><option>横向</option><option>竖向</option></select>
+                                                                <div class="input-group-addon">单位</div>
+                                                                <select class="form-control input-sm"><option>CM</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"><option>CM</option></select>
+                                                        <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"><option>1</option><option>2</option></select>
+                                                                </div>
+                                                                <div class="input-group col-6">
+                                                                    <div class="input-group-addon">缩放</div>
+                                                                    <input class="form-control input-sm" type="number" step="1">
+                                                                </div>
+                                                            </div>
                                                         </div>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>显示调整</label>
-                                                        <div class="row">
+                                                        <div class="form-group row">
                                                             <div class="input-group col-6">
-                                                                <div class="input-group-addon">分栏</div>
-                                                                <select class="form-control input-sm"><option>1</option><option>2</option></select>
+                                                                <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>
-                                                                <input class="form-control input-sm" type="number" step="1">
+                                                                <div class="input-group-addon">空行显示</div>
+                                                                <select class="form-control input-sm"><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"><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 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" type="number" step="1">
+                                                                </div>
+                                                                <div class="input-group col-6">
+                                                                    <div class="input-group-addon">右</div>
+                                                                    <input class="form-control input-sm" type="number" step="1">
+                                                                </div>
+                                                            </div>
                                                         </div>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>页边距</label>
-                                                        <div class="row">
+                                                        <div class="form-group row">
                                                             <div class="input-group col-6">
-                                                                <div class="input-group-addon"></div>
+                                                                <div class="input-group-addon">上</div>
                                                                 <input class="form-control input-sm" type="number" step="1">
                                                             </div>
                                                             <div class="input-group col-6">
-                                                                <div class="input-group-addon"></div>
+                                                                <div class="input-group-addon"></div>
                                                                 <input class="form-control input-sm" type="number" step="1">
                                                             </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" type="number" step="1">
-                                                        </div>
-                                                        <div class="input-group col-6">
-                                                            <div class="input-group-addon">下</div>
-                                                            <input class="form-control input-sm" type="number" step="1">
-                                                        </div>
-                                                    </div>
                                                 </div>
                                             </div>
-                                        </div>
-                                        <!--模板布局-->
-                                        <div class="tab-pane" id="rpttpllayout" role="tabpanel">
-                                            <div class="main-data">
-                                                <div class="p-3">
-                                                    <div class="ztree-warp">
-                                                        ztree 保留空间
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>Band名称</label>
-                                                        <input class="form-control" placeholder="输入Band名称">
-                                                        <small class="form-text text-muted">提示文字文字</small>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>边框样式</label>
-                                                        <select class="form-control"><option> </option></select>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>高度</label>
-                                                        <div class=" form-inline">
-                                                            <input class="form-control mr-2" disabled>
-                                                            <div class="form-check">
-                                                                <label class="form-check-label">
-                                                                    <input class="form-check-input" type="checkbox" checked> 自动填充
-                                                                </label>
+                                            <!--模板布局-->
+                                            <div class="tab-pane" id="rpttpllayout" role="tabpanel">
+                                                <div class="main-data">
+                                                    <div class="p-3">
+                                                        <div class="ztree-warp">
+                                                            ztree 保留空间
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>Band名称</label>
+                                                            <input class="form-control" placeholder="输入Band名称">
+                                                            <small class="form-text text-muted">提示文字文字</small>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>边框样式</label>
+                                                            <select class="form-control"><option> </option></select>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>高度</label>
+                                                            <div class=" form-inline">
+                                                                <input class="form-control mr-2" disabled>
+                                                                <div class="form-check">
+                                                                    <label class="form-check-label">
+                                                                        <input class="form-check-input" type="checkbox" checked> 自动填充
+                                                                    </label>
+                                                                </div>
                                                             </div>
                                                         </div>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>宽度</label>
-                                                        <div class=" form-inline">
-                                                            <input class="form-control mr-2" placeholder="">
+                                                        <div class="form-group">
+                                                            <label>宽度</label>
+                                                            <div class=" form-inline">
+                                                                <input class="form-control mr-2" placeholder="">
+                                                                <div class="form-check">
+                                                                    <label class="form-check-label">
+                                                                        <input class="form-check-input" type="checkbox"> 自动填充
+                                                                    </label>
+                                                                </div>
+                                                            </div>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>出现频率</label>
+                                                            <select class="form-control"><option>每页</option><option>首页</option><option>尾页</option><option>章首页</option><option>章尾页</option><option>分组</option><option>交叉行尾页</option><option>交叉列尾页</option></select>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>位置</label>
+                                                            <select class="form-control"><option>上</option><option>下</option><option>左</option><option>右</option><option>填充</option></select>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>边框合并</label>
                                                             <div class="form-check">
                                                                 <label class="form-check-label">
-                                                                    <input class="form-check-input" type="checkbox"> 自动填充
+                                                                    <input type="checkbox" class="form-check-input">
+                                                                    合并
                                                                 </label>
                                                             </div>
                                                         </div>
                                                     </div>
-                                                    <div class="form-group">
-                                                        <label>出现频率</label>
-                                                        <select class="form-control"><option>每页</option><option>首页</option><option>尾页</option><option>章首页</option><option>章尾页</option><option>分组</option><option>交叉行尾页</option><option>交叉列尾页</option></select>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>位置</label>
-                                                        <select class="form-control"><option>上</option><option>下</option><option>左</option><option>右</option><option>填充</option></select>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>边框合并</label>
-                                                        <div class="form-check">
-                                                            <label class="form-check-label">
-                                                                <input type="checkbox" class="form-check-input">
-                                                                合并
-                                                            </label>
-                                                        </div>
-                                                    </div>
                                                 </div>
                                             </div>
-                                        </div>
-                                        <!--指标映射-->
-                                        <div class="tab-pane" id="rpttplfieldmap" role="tabpanel">
-                                            <div class="main-data">
-                                                <div class="p-3">
-                                                    <div class="ztree-warp">
-                                                        ztree 保留空间
-                                                    </div>
-                                                    <div class="row">
-                                                        <div class="form-group col-md-6">
-                                                            <label class="col-form-label">名称</label>
-                                                            <input class="form-control">
+                                            <!--指标映射-->
+                                            <div class="tab-pane" id="rpttplfieldmap" role="tabpanel">
+                                                <div class="main-data">
+                                                    <div class="p-3">
+                                                        <div class="ztree-warp">
+                                                            ztree 保留空间
                                                         </div>
-                                                        <div class="form-group col-md-6">
-                                                            <label class="col-form-label">数据类型</label>
-                                                            <select class="form-control"><option>String</option><option>Number</option><option>Date</option><option>Img etc</option></select>
+                                                        <div class="row">
+                                                            <div class="form-group col-md-6">
+                                                                <label class="col-form-label">名称</label>
+                                                                <input class="form-control">
+                                                            </div>
+                                                            <div class="form-group col-md-6">
+                                                                <label class="col-form-label">数据类型</label>
+                                                                <select class="form-control"><option>String</option><option>Number</option><option>Date</option><option>Img etc</option></select>
+                                                            </div>
                                                         </div>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>映射指标</label>
-                                                        <div class="input-group">
-                                                            <div class="input-group-addon">类型</div>
-                                                            <select class="form-control input-sm"><option>离散</option><option>主数据</option><option>从数据</option></select>
+                                                        <div class="form-group">
+                                                            <label>映射指标</label>
+                                                            <div class="input-group">
+                                                                <div class="input-group-addon">类型</div>
+                                                                <select class="form-control input-sm"><option>离散</option><option>主数据</option><option>从数据</option></select>
+                                                            </div>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <select class="form-control" size="5"></select>
                                                         </div>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <select class="form-control" size="5"></select>
                                                     </div>
                                                 </div>
                                             </div>
-                                        </div>
-                                        <!--指标摆放-->
-                                        <div class="tab-pane" id="rpttplfieldlocation" role="tabpanel">
-                                            <div class="main-data">
-                                                <div class="p-3">
-                                                    <div class="ztree-warp">
-                                                        ztree 保留空间
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>所属Band</label>
-                                                        <select class="form-control"><option> </option></select>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>显示行高度</label>
-                                                        <select class="form-control"><option> </option></select>
-                                                        <small class="form-text text-muted">用于 流水行/交叉行</small>
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>显示列宽度</label>
-                                                        <select class="form-control"><option> </option></select>
-                                                        <small class="form-text text-muted">用于 交叉列</small>
-                                                    </div>
-                                                    <div class="ztree-warp">
-                                                        ztree 保留空间
-                                                    </div>
-                                                    <div class="form-group">
-                                                        <label>映射指标</label>
-                                                        <select class="form-control"><option> </option></select>
+                                            <!--指标摆放-->
+                                            <div class="tab-pane" id="rpttplfieldlocation" role="tabpanel">
+                                                <div class="main-data">
+                                                    <div class="p-3">
+                                                        <div class="ztree-warp">
+                                                            ztree 保留空间
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>所属Band</label>
+                                                            <select class="form-control"><option> </option></select>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>显示行高度</label>
+                                                            <select class="form-control"><option> </option></select>
+                                                            <small class="form-text text-muted">用于 流水行/交叉行</small>
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>显示列宽度</label>
+                                                            <select class="form-control"><option> </option></select>
+                                                            <small class="form-text text-muted">用于 交叉列</small>
+                                                        </div>
+                                                        <div class="ztree-warp">
+                                                            ztree 保留空间
+                                                        </div>
+                                                        <div class="form-group">
+                                                            <label>映射指标</label>
+                                                            <select class="form-control"><option> </option></select>
+                                                        </div>
                                                     </div>
                                                 </div>
                                             </div>
-                                        </div>
-                                        <!--计算式-->
-                                        <div class="tab-pane" id="rpttplformula" role="tabpanel">
-                                            <div class="main-data">
-                                                <div class="p-3">
-                                                    计算式
+                                            <!--计算式-->
+                                            <div class="tab-pane" id="rpttplformula" role="tabpanel">
+                                                <div class="main-data">
+                                                    <div class="p-3">
+                                                        计算式
+                                                    </div>
                                                 </div>
                                             </div>
                                         </div>
                                     </div>
                                 </div>
-                            </div>
-                            <!-- 报表预览 -->
-                            <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">保存</button>
-                                        <button class="btn btn-secondary">保存并发布</button>
-                                        <button class="btn btn-danger">删除模板</button>
+                                <!-- 报表预览 -->
+                                <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">保存</button>
+                                            <button class="btn btn-secondary">保存并发布</button>
+                                            <button class="btn btn-danger">删除模板</button>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
                         </div>
-                    </div>
 
+                    </div>
+                </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>
-</div>
-<!-- JS. -->
+
+    <!-- JS. -->
 <script src="/lib/jquery/jquery.min.js"></script>
 <script src="/lib/tether/tether.min.js"></script>
 <script src="/lib/bootstrap/bootstrap.min.js"></script>