Browse Source

report template on going

TonyKang 8 years ago
parent
commit
fa04cd2a1d

+ 5 - 5
modules/ration_repository/controllers/ration_section_tree_controller.js

@@ -8,10 +8,10 @@ var callback = function(req,res,err,message, data){
 }
 module.exports ={
     getRationChapterTree: function(req,res){
-        var libName = req.body.rationLibName;
+        var rationLibId = req.body.rationLibId;
         var repId = req.body.rationRepositoryId;
-        if (libName) {
-            rationChapterTreeData.getRationChapterTree(libName,function(err,data){
+        if (rationLibId) {
+            rationChapterTreeData.getRationChapterTree(rationLibId,function(err,data){
                 callback(req,res,err, "", data);
             })
         } else if (repId) {
@@ -21,10 +21,10 @@ module.exports ={
         }
     },
     createNewNode: function(req, res){
-        var libName = req.body.rationLibName;
+        var libId = req.body.rationLibId;
         var lastNodeId = req.body.lastNodeId;
         var nodeData = JSON.parse(req.body.rawNodeData);
-        rationChapterTreeData.createNewNode(libName, lastNodeId, nodeData, function(err,data){
+        rationChapterTreeData.createNewNode(libId, lastNodeId, nodeData, function(err,data){
             callback(req,res,err,"", data)
         });
     },

+ 25 - 40
modules/ration_repository/models/ration_section_tree.js

@@ -17,22 +17,15 @@ var rationChapterTreeSchema = mongoose.Schema({//章节树  //生成唯一id改
     isDeleted: Boolean
 });
 var rationChapterTreeModel = chapterTreeDb.model("rationChapterTrees",rationChapterTreeSchema, "rationChapterTrees")
-var repositoryMap = require('./repository_map');
 var counter = require('../../../public/counter/counter');
 
 var rationChapterTreeDAO = function(){};
 
-rationChapterTreeDAO.prototype.getRationChapterTree = function(repositoryName,callback){
-    repositoryMap.getRealLibName(repositoryName, function(err, rst){
-        if (err || rst.length == 0) {
-            callback("获取定额库错误!",false)
-        } else {
-            rationChapterTreeModel.find({"rationRepId": rst[0].ID, "$or": [{"isDeleted": null}, {"isDeleted": false} ]},function(err,data){
-                if(data.length) callback(false,data);
-                else  if(err) callback("获取定额树错误!",false)
-                else callback(false,false);
-            })
-        }
+rationChapterTreeDAO.prototype.getRationChapterTree = function(rationLibId,callback){
+    rationChapterTreeModel.find({"rationRepId": rationLibId, "$or": [{"isDeleted": null}, {"isDeleted": false} ]},function(err,data){
+        if(data.length) callback(false,data);
+        else  if(err) callback("获取定额树错误!",false)
+        else callback(false,false);
     })
 }
 
@@ -44,35 +37,27 @@ rationChapterTreeDAO.prototype.getRationChapterTreeByRepId = function(repId,call
     })
 }
 
-rationChapterTreeDAO.prototype.createNewNode = function(repositoryName, lastNodeId, nodeData,callback){
-    var promise = repositoryMap.getRealLibName(repositoryName), libId;
-    if (promise) {
-        promise.then(function(rst){
-            libId = rst[0].ID;
-            return counter.counterDAO.getIDAfterCount(counter.moduleName.rationTree, 1, function(err, result){
-                nodeData.rationRepId = libId;
-                nodeData.ID = result.value.sequence_value;
-                var node = new rationChapterTreeModel(nodeData);
-                node.save(function (err, result) {
-                    if (err) {
-                        callback("章节树ID错误!", false);
-                    } else {
-                        if (lastNodeId > 0) {
-                            rationChapterTreeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
-                                if (err) {
-                                    callback("章节树ID错误!", false);
-                                } else {
-                                    callback(false, result);
-                                }
-                            });
-                        } else callback(false, result);
-                    }
-                });
-            });
+rationChapterTreeDAO.prototype.createNewNode = function(libId, lastNodeId, nodeData,callback){
+    counter.counterDAO.getIDAfterCount(counter.moduleName.rationTree, 1, function(err, result){
+        nodeData.rationRepId = libId;
+        nodeData.ID = result.value.sequence_value;
+        var node = new rationChapterTreeModel(nodeData);
+        node.save(function (err, result) {
+            if (err) {
+                callback("章节树ID错误!", false);
+            } else {
+                if (lastNodeId > 0) {
+                    rationChapterTreeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
+                        if (err) {
+                            callback("章节树ID错误!", false);
+                        } else {
+                            callback(false, result);
+                        }
+                    });
+                } else callback(false, result);
+            }
         });
-    } else {
-        callback("定额库选择错误!", false);
-    }
+    });
 },
 
 rationChapterTreeDAO.prototype.removeNodes = function(nodeIds, preNodeId, preNodeNextId, callback){

+ 0 - 36
modules/reports/controllers/rpt_controller.js

@@ -15,7 +15,6 @@ var strUtil = require('../../../public/stringUtil');
 //统一回调函数
 var callback = function(req, res, err, data){
     if(err){
-        //res.send({success: false, error: err});
         res.json({success: false, error: err});
     }
     else{
@@ -96,40 +95,5 @@ module.exports = {
                 }
             }
         );
-    },
-    getDummyExcel: function(req, res) {
-        var nodeExcel = require('excel-export'); //关联excel-export模块
-        console.log("req.params.id:" + req.params.id);
-        console.log("req.params.pm:" + req.params.pm);
-        var conf = {};
-        conf.cols = [
-            {caption:'采购编号', type:'string'},
-            {caption:'合同名称', type:'string'},
-            {caption:'甲方', type:'string'},
-            {caption:'甲方部门', type:'string'},
-            {caption:'乙方', type:'string'},
-            {caption:'乙方部门', type:'string'},
-            {caption:'签订日期', type:'date'},
-            {caption:'中标日期', type:'date'},
-            {caption:'结束日期', type:'date'},
-            {caption:'销售负责人', type:'string'},
-            {caption:'商务负责人', type:'string'},
-            {caption:'业绩归属部门', type:'string'},
-            {caption:'金额', type:'number'},
-            {caption:'状态', type:'string'}
-        ];
-        var data = [{myId: 0, name: "dummyExcel", partyA: "", partyADept: "", partyB:"", partyBDept: "", signDate: "", beginDate:"", endDate:"", amount: 100, state:"dummy!"}]
-        var m_data = [];
-        var arry = [data[0].myId, data[0].name, data[0].partyA, data[0].partyADept, data[0].partyB, data[0].partyBDept, data[0].signDate, data[0].beginDate, data[0].endDate, "销售负责人", "商务负责人", "业绩归属部门", data[0].amount, data[0].state ];
-        m_data[0] = arry;
-        conf.rows = m_data;
-
-        var result = nodeExcel.execute(conf);
-        //console.log(result);
-        res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-        res.setHeader("Content-Disposition", "attachment; filename=" +data[0].name+ ".xlsx");
-        res.end(result, 'binary');
-    },
-    dummyFunc: function(req, res){
     }
 };

+ 27 - 0
modules/reports/controllers/rpt_tpl_controller.js

@@ -0,0 +1,27 @@
+/**
+ * Created by Tony on 2017/6/1.
+ */
+
+var TplNode = require('../models/tpl_tree_node');
+
+//统一回调函数
+var callback = function(req, res, err, data){
+    if(err){
+        //res.send({success: false, error: err});
+        res.json({success: false, error: err});
+    }
+    else{
+        //res.send({success: true, data: data});
+        res.json({success:true, data: data});
+    }
+};
+
+module.exports = {
+    createTplTreeNode: function(req, res){
+        var lastNodeId = req.body.lastNodeId;
+        var nodeData = JSON.parse(req.body.rawNodeData);
+        TplNode.createTplTreeNode(nodeData, lastNodeId, function(err, data){
+            callback(req,res,err,"", data);
+        })
+    }
+}

+ 1 - 1
modules/reports/models/cfg_control.js

@@ -14,7 +14,7 @@ var CtrlSchema = new Schema({
     "Wrap" : String
 });
 
-var Control = smartcostdb.model("com_ctrls", CtrlSchema);
+var Control = smartcostdb.model("com_ctrls", CtrlSchema, "com_ctrls");
 
 var CtrlDAO = function(){};
 

+ 1 - 1
modules/reports/models/cfg_font.js

@@ -17,7 +17,7 @@ var FontSchema = new Schema({
     "FontAngle" : String
 });
 
-var Font = smartcostdb.model("com_fonts", FontSchema);
+var Font = smartcostdb.model("com_fonts", FontSchema, "com_fonts");
 
 var FontDAO = function(){};
 

+ 1 - 1
modules/reports/models/cfg_style.js

@@ -10,7 +10,7 @@ var StyleSchema = new Schema({
     "border_style" : Array
 });
 
-var Style = smartcostdb.model("com_styles", StyleSchema);
+var Style = smartcostdb.model("com_styles", StyleSchema, "com_styles");
 
 var StyleDAO = function(){};
 

+ 1 - 1
modules/reports/models/rpt_template.js

@@ -18,7 +18,7 @@ var RptTemplateSchema = new Schema({
     "计算式_集合": Array
 });
 
-var Template = smartcostdb.model("rpt_templates", RptTemplateSchema);
+var Template = smartcostdb.model("rpt_templates", RptTemplateSchema, "rpt_templates");
 
 var RplTplDAO = function(){};
 

+ 1 - 1
modules/reports/models/rpt_tpl_data.js

@@ -12,7 +12,7 @@ var RptTemplateDataSchema = new Schema({
     "detail_data": Array
 });
 
-var TemplateData = smartcostdb.model("temp_tpl_datas", RptTemplateDataSchema);
+var TemplateData = smartcostdb.model("temp_tpl_data", RptTemplateDataSchema, "temp_tpl_data");
 
 var RplTplDataDAO = function(){};
 

+ 52 - 0
modules/reports/models/tpl_tree_node.js

@@ -0,0 +1,52 @@
+/**
+ * Created by Tony on 2017/5/31.
+ */
+var mongoose = require('mongoose');
+var dbm = require("../../../config/db/db_manager");
+var db = dbm.getCfgConnection("Reports");
+var Schema = mongoose.Schema;
+var TreeNodeSchema = new Schema({
+    ID:Number,
+    ParentID:Number,
+    NextSiblingID:Number,
+    grp_type: Number, //建筑(const : 1)/公路(const 2)/其他 etc...
+    node_type: Number,//节点类型:树节点(枝) 或 模板节点(叶)
+    tpl_type: Number, //概算、预算、招投标 etc...
+    userId: String,   //用户自定义模板用
+    ref_ID: Number,   //
+    name: String,
+    isDeleted: Boolean
+});
+
+var TreeNodeModel = db.model("rpt_tpl_tree", TreeNodeSchema, "rpt_tpl_tree");
+var counter = require('../../../public/counter/counter');
+
+var RplTplTreeDAO = function(){};
+
+RplTplTreeDAO.prototype.getTplTreeNodes = function(grp_type, userId, tpl_Type, callback) {
+    //
+};
+
+RplTplTreeDAO.prototype.createTplTreeNode = function(nodeData, lastNodeId, callback) {
+    counter.counterDAO.getIDAfterCount(counter.moduleName.report, 1, function(err, result){
+        nodeData.ID = result.value.sequence_value;
+        var node = new TreeNodeModel(nodeData);
+        node.save(function (err, result) {
+            if (err) {
+                callback("树节点错误!", false);
+            } else {
+                if (lastNodeId > 0) {
+                    TreeNodeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
+                        if (err) {
+                            callback("树节点错误!", false);
+                        } else {
+                            callback(false, result);
+                        }
+                    });
+                } else callback(false, result);
+            }
+        });
+    });
+};
+
+module.exports = new RplTplTreeDAO();

+ 0 - 3
modules/reports/routes/report_router.js

@@ -5,11 +5,8 @@
 var express = require('express');
 var rptRouter = express.Router();
 var reportController = require('./../controllers/rpt_controller');
-//apiRouter.post('/getReport', reportController.getReportAllPages);
 
 rptRouter.post('/getReport', reportController.getReportAllPages);
-//rptRouter.post('/getPreview', pmController.updateProjects);
-rptRouter.get('/getDummyExcel/:id/:pm', reportController.getDummyExcel);
 rptRouter.get('/getExcel/:id/:pm/:size/:rptName', reportController.getExcel);
 
 module.exports = rptRouter;

+ 11 - 0
modules/reports/routes/rpt_tpl_router.js

@@ -0,0 +1,11 @@
+/**
+ * Created by Tony on 2017/6/1.
+ */
+var express = require('express');
+var rptTplRouter = express.Router();
+var reportTplController = require('./../controllers/rpt_tpl_controller');
+
+//rptTplRouter.post('/getReport', reportTplController.getReportAllPages);
+rptTplRouter.post('/createTplTreeNode', reportTplController.createTplTreeNode);
+
+module.exports = rptTplRouter;

+ 14 - 1
operation.js

@@ -59,13 +59,26 @@ app.get('/report',  function(req, res) {
         res.redirect('/login');
     }
     else {
-        res.render('maintain/report/html/rpt_test.html',
+        res.render('maintain/report/rpt_test.html',
             {userAccount: req.session.userAccount,
                 userID: req.session.userID});
     }
 });
 app.use("/report_api", rpt_Router);
 
+var rptTpl_Router = require("./modules/reports/routes/report_router");
+app.get('/rpt_tpl',  function(req, res) {
+    if (!req.session.userAccount) {
+        res.redirect('/login');
+    }
+    else {
+        res.render('maintain/report/rpt_tpl_main.html',
+            {userAccount: req.session.userAccount,
+                userID: req.session.userID});
+    }
+});
+app.use("/report_tpl_api", rptTpl_Router);
+
 var rationRepository_Router = require("./modules/ration_repository/routes/ration_rep_routes");
 app.get('/rationRepository/main', function(req, res) {
     res.render('maintain/ration_repository/main.html',

+ 1 - 3
package.json

@@ -17,8 +17,6 @@
   },
   "dependencies": {
     "bluebird": "^3.5.0",
-    "excel-export": "^0.5.1",
-    "jszip": "^3.1.3",
-    "xlsx": "^0.9.6"
+    "jszip": "^3.1.3"
   }
 }

+ 9 - 0
public/rpt_tpl_def.js

@@ -0,0 +1,9 @@
+/**
+ * Created by Tony on 2017/6/1.
+ */
+
+rptTplDefObj = {
+    Grp_Type: {CONSTRUCT: 1, ROAD: 2},
+    Node_Type: {NODE: 'node', TEMPLATE: 'rptTpl'},
+    Tpl_Type: {ALL: 1, TENDER: 2, BILLS: 3, BUDGET: 4, OTHERS: 99}
+}

+ 0 - 30
test/unit/excel_export/excelDummyDataOutput.js

@@ -1,30 +0,0 @@
-/**
- * Created by Tony on 2017/3/28.
- */
-
-var nodeExcel = require('excel-export'); //关联excel-export模块
-var conf = {};
-conf.cols = [
-    {caption:'采购编号', type:'string'},
-    {caption:'合同名称', type:'string'},
-    {caption:'甲方', type:'string'},
-    {caption:'甲方部门', type:'string'},
-    {caption:'乙方', type:'string'},
-    {caption:'乙方部门', type:'string'},
-    {caption:'签订日期', type:'date'},
-    {caption:'中标日期', type:'date'},
-    {caption:'结束日期', type:'date'},
-    {caption:'销售负责人', type:'string'},
-    {caption:'商务负责人', type:'string'},
-    {caption:'业绩归属部门', type:'string'},
-    {caption:'金额', type:'number'},
-    {caption:'状态', type:'string'}
-];
-var data = [{myId: 0, name: "dummy name", partyA: "", partyADept: "", partyB:"", partyBDept: "", signDate: "", beginDate:"", endDate:"", amount: 100, state:"dummy!"}]
-var m_data = [];
-var arry = [data[0].myId, data[0].name, data[0].partyA, data[0].partyADept, data[0].partyB, data[0].partyBDept, data[0].signDate, data[0].beginDate, data[0].endDate, "销售负责人", "商务负责人", "业绩归属部门", data[0].amount, data[0].state ];
-m_data[0] = arry;
-conf.rows = m_data;
-
-var result = nodeExcel.execute(conf);
-console.log(result);

+ 6 - 4
web/maintain/ration_repository/js/section_tree.js

@@ -4,6 +4,7 @@
 
 var pageOprObj = {
     rationLibName : null,
+    rationLibId : null,
     initPage : function() {
         var me = this, rationLibId = getQueryString("repository"),//获取定额库参数
             rationLibName = storageUtil.getSessionCache("RationGrp","repositoryID_" + rationLibId);
@@ -12,18 +13,19 @@ var pageOprObj = {
             html = html.replace("XXX定额库", rationLibName);
             $("#rationname")[0].outerHTML = html;
             me.rationLibName = rationLibName;
-            zTreeOprObj.getRationTree(rationLibName);
+            me.rationLibId = rationLibId;
+            zTreeOprObj.getRationTree(rationLibId);
         }
     }
 }
 var zTreeOprObj = {
     treeObj: null,
-    getRationTree: function(rationLibName){
+    getRationTree: function(rationLibId){
         var me = this;
         $.ajax({
             type:"POST",
             url:"api/getRationTree",
-            data:{"rationLibName": rationLibName},
+            data:{"rationLibId": rationLibId},
             dataType:"json",
             cache:false,
             timeout:20000,
@@ -64,7 +66,7 @@ var zTreeOprObj = {
         $.ajax({
             type:"POST",
             url:"api/createNewNode",
-            data:{"rationLibName":pageOprObj.rationLibName,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
+            data:{"rationLibId":pageOprObj.rationLibId,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
             dataType:"json",
             cache:false,
             timeout:1000,

+ 275 - 0
web/maintain/report/css/main.css

@@ -0,0 +1,275 @@
+/*building SAAS 0.1*/
+/*bootstrap 初始化*/
+body {
+    font-size: 0.9rem
+}
+.dropdown-menu {
+    font-size: 0.9rem
+}
+/*自定义css*/
+.header {
+    background: #e1e1e1
+}
+.header .header-logo {
+    background: #ff6501;
+    color: #fff;
+    float: left;
+    padding-top: .25rem;
+    padding-bottom: .25rem;
+    margin-right: 1rem;
+    font-size: 1.25rem;
+    line-height: inherit
+}
+.top-msg{
+  position: fixed;
+  top:0;
+  width:100%;
+  z-index: 999
+}
+.in-1{padding-left:0rem!important}
+.in-2{padding-left:1rem!important}
+.in-3{padding-left:1.5rem!important}
+.in-4{padding-left:2rem!important}
+.in-5{padding-left:2.5rem!important}
+.in-6{padding-left:3rem!important}
+.main {
+    position: relative;
+    background: #f7f7f9;
+}
+.main-nav {
+    position: absolute;
+    text-align: center;
+    z-index: 999;
+    padding: 2px 0 0 2px
+}
+.main-nav .nav a {
+    display: block;
+    width: 28px;
+    text-align: center;
+    line-height: 18px;
+    color: #999;
+    padding: 10px 0;
+    border-right: 1px solid #ccc;
+}
+.main-nav .nav a:hover {
+    background: #fff;
+    color: #333;
+    text-decoration: none;
+}
+.main-nav .nav a.active {
+    border: 1px solid #ccc;
+    border-right: 1px solid #fff;
+    background: #fff;
+    color: #333
+}
+.content {
+    background: #fff
+}
+.tools-btn {
+    height: 30px;
+    line-height: 30px;
+}
+.toolsbar .tools-btn.btn:hover {
+    background: #f7f7f9;
+}
+.main-side {
+    border-right: 1px solid #ccc;
+    overflow-y: auto;
+}
+.main-side .tab-bar {
+    padding:5px 10px;
+    height:38px;
+    position:fixed;
+}
+.main-side .tab-content {
+    margin-top: 38px
+}
+.top-content, .fluid-content {
+    overflow: hidden;
+    border-bottom: 1px solid #ccc;
+}
+.warp-p2 {
+    padding: 2px
+}
+.bottom-content .nav,.top-content .nav {
+    background: #f7f7f9;
+    padding:0 0 0 2px
+}
+.bottom-content .nav-tabs .nav-link, .side-tabs .nav-tabs .nav-link,.top-content .nav-tabs .nav-link {
+    border-radius: 0;
+    padding: 0.2em 0.5em
+}
+.side-tabs .nav-tabs .nav-item {
+  z-index: 999
+}
+.side-tabs .nav-tabs {
+    border-bottom: none;
+    margin-bottom: -1px
+}
+.side-tabs .nav-tabs .nav-link {
+    border-radius: 0;
+    padding: 0em 0.5em;
+    line-height: 30px;
+    z-index: 999
+}
+.bottom-content .nav-tabs .nav-link.active {
+    border-top: 1px solid #f7f7f9
+}
+.side-tabs .nav-tabs .nav-link.active {
+    border-top: none;
+    border-bottom:1px solid #fff
+}
+.side-tabs a.active, .sub-nav a.active {
+    background: #ccc
+}
+.poj-manage {
+    background: #fff
+}
+.slide-sidebar {
+    border-left: 1px solid #E1E1E1;
+    box-shadow: 0px 15px 15px rgba(0, 0, 0, 0.1);
+    background: none repeat scroll 0% 0% #ffffff;
+    overflow: hidden;
+    position: absolute;
+    right: 0px;
+    top: 0;
+    z-index: 999;
+    width: 0px;
+}
+.new-msg {
+    -webkit-animation: tada 1s infinite .2s ease both;
+    -moz-animation: tada 1s infinite .2s ease both;
+}
+@-webkit-keyframes tada {
+    0% {
+        -webkit-transform: scale(1)
+    }
+    10%, 20% {
+        -webkit-transform: scale(0.9) rotate(-3deg)
+    }
+    30%, 50%, 70%, 90% {
+        -webkit-transform: scale(1.1) rotate(3deg)
+    }
+    40%, 60%, 80% {
+        -webkit-transform: scale(1.1) rotate(-3deg)
+    }
+    100% {
+        -webkit-transform: scale(1) rotate(0)
+    }
+}
+@-moz-keyframes tada {
+    0% {
+        -moz-transform: scale(1)
+    }
+    10%, 20% {
+        -moz-transform: scale(0.9) rotate(-3deg)
+    }
+    30%, 50%, 70%, 90% {
+        -moz-transform: scale(1.1) rotate(3deg)
+    }
+    40%, 60%, 80% {
+        -moz-transform: scale(1.1) rotate(-3deg)
+    }
+    100% {
+        -moz-transform: scale(1) rotate(0)
+    }
+}
+.has-danger {
+    -webkit-animation: shake 1s .2s ease both;
+    -moz-animation: shake 1s .2s ease both;
+    animation: shake 1s .2s ease both;
+}
+@-webkit-keyframes shake {
+    0%, 100% {
+        -webkit-transform: translateX(0);
+    }
+    10%, 30%, 50%, 70%, 90% {
+        -webkit-transform: translateX(-10px);
+    }
+    20%, 40%, 60%, 80% {
+        -webkit-transform: translateX(10px);
+    }
+}
+@-moz-keyframes shake {
+    0%, 100% {
+        -moz-transform: translateX(0);
+    }
+    10%, 30%, 50%, 70%, 90% {
+        -moz-transform: translateX(-10px);
+    }
+    20%, 40%, 60%, 80% {
+        -moz-transform: translateX(10px);
+    }
+}
+@keyframes shake {
+    0%, 100% {
+        transform: translateX(0);
+    }
+    10%, 30%, 50%, 70%, 90% {
+        transform: translateX(-10px);
+    }
+    20%, 40%, 60%, 80% {
+        transform: translateX(10px);
+    }
+}
+.bottom-content {
+    height: 370px;
+    overflow: hidden;
+}
+.bottom-content .tab-content .main-data-bottom{
+    height: 340px;
+    overflow: auto;
+}
+.form-signin {
+    max-width: 500px;
+    margin: 150px auto;
+}
+.poj-list, .side-content {
+    overflow: auto;
+}
+.poj-list span.poj-icon {
+  padding-right:10px;
+  color:#ccc
+}
+.print-toolsbar{
+  padding:5px
+}
+.print-toolsbar .panel {
+  display:inline-block;
+  vertical-align:top;
+  background:#f7f7f9
+}
+.print-toolsbar .panel .panel-foot{
+  text-align: center;
+  font-size: 12px
+}
+.print-list {
+  border-right:1px solid #ccc
+}
+.print-list .form-list {
+  overflow: auto
+}
+.print-list .list-tools{
+  height:50px;
+  padding:10px 0;
+  border-bottom:1px solid #f2f2f2
+}
+.pageContainer {
+  background: #ededed;
+  text-align: center
+}
+.pageContainer .page{
+  border:9px solid transparent;
+  display: inline-block;
+}
+.pageContainer .page img{
+  width:inherit;
+  height: inherit;
+}
+.codeList{
+    max-height: 200px;
+    overflow:auto;
+}
+.main-data-top,.main-data-bottom,.main-data{
+  overflow: auto;
+}

+ 42 - 0
web/maintain/report/js/global.js

@@ -0,0 +1,42 @@
+/*全局自适应高度*/
+function autoFlashHeight(){
+    var headerHeight = $(".header").height();
+    var bottomContentHeight = $(".bottom-content").height();
+    var toolsBar = $(".tools-bar").height();
+    $(".content").height($(window).height()-headerHeight);
+    $(".main-side").height($(window).height()-headerHeight-2);
+    $(".fluid-content").height($(window).height()-headerHeight-1);
+    $(".side-content").height($(window).height()-headerHeight );
+    $(".poj-list").height($(window).height()-headerHeight);
+    $(".form-list").height($(window).height()-headerHeight-50 );
+    $(".main-data-top").height($(window).height()-headerHeight-toolsBar-bottomContentHeight-2);
+    $(".main-data").height($(window).height()-headerHeight);
+};
+$(window).resize(autoFlashHeight);
+/*全局自适应高度结束*/
+$(function(){
+/*侧滑*/
+$(".open-sidebar").click(function(){
+    $(".slide-sidebar").animate({width:"800"}).addClass("open");
+});
+$("body").click(function(event){
+        var e = event || window.event; //浏览器兼容性
+        if(!$(event.target).is('a')) {
+            var elem = event.target || e.srcElement;
+            while (elem) { //循环判断至跟节点,防止点击的是div子元素
+                if (elem.className == "open-sidebar" || elem.className == 'slide-sidebar open') {
+                    return false;
+                }
+                elem = elem.parentNode;
+            }
+            $(".slide-sidebar").animate({width:"0"}).removeClass("open")// 关闭处理
+        }
+
+    });
+/*侧滑*/
+/*工具提示*/
+$('*[data-toggle=tooltip]').mouseover(function() {
+ $(this).tooltip('show');
+  });
+/*工具提示*/
+});

+ 32 - 0
web/maintain/report/js/rpt_tpl_main.js

@@ -0,0 +1,32 @@
+/**
+ * Created by Tony on 2017/6/1.
+ */
+var rptTplObj = {
+    treeObj: null,
+    iniPage: function() {
+        //
+    },
+    addRootNode: function() {
+        //
+    },
+    addSubNode: function() {
+        //
+    },
+    addTplNode: function (){
+        //
+    },
+    createIniRootNode: function() {
+        var rst = {
+            ID: -1,
+            ParentID: -1,
+            NextSiblingID: -1,
+            grp_type: rptTplDefObj.Grp_Type.CONSTRUCT,
+            node_type: rptTplDefObj.Node_Type.NODE,
+            tpl_type: rptTplDefObj.Tpl_Type.ALL,
+            userId: null,
+            ref_ID: -1,
+            name: '新节点'
+        };
+        return rst;
+    }
+}

web/maintain/report/html/rpt_test.html → web/maintain/report/rpt_test.html


+ 65 - 0
web/maintain/report/rpt_tpl_main.html

@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta http-equiv="x-ua-compatible" content="ie=edge">
+    <title>报表模板编辑器</title>
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+    <!-- <link rel="stylesheet" href="css/bootstrap/themes.css">-->
+    <link rel="stylesheet" href="/web/maintain/report/css/main.css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+    <!--zTree-->
+    <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
+</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"></div>
+    </nav>
+    <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+        <ul class="nav navbar-nav px-1">
+            <li class="nav-item">
+                <a class="nav-link" href="javacript:void(0);" aria-haspopup="true" aria-expanded="false" data-toggle="modal" data-target="#add">报表模板库</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="rptTplObj.addRootNode()" class="btn btn-secondary btn-sm">增加根节点</a>
+                        <a onclick="rptTplObj.addSubNode()" class="btn btn-secondary btn-sm">增加子节点</a>
+                    </div>
+                    <div class="tab-content">
+                        <ul id="rationChapterTree" class="ztree"></ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 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>
+<script src="/web/maintain/report/js/global.js"></script>
+<script src="/web/maintain/report/js/rpt_tpl_main.js"></script>
+<!-- zTree -->
+<script type="text/javascript" src="/public/web/date_util.js"></script>
+<script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
+<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
+<script type="text/javascript" src="/public/web/storageUtil.js"></script>
+<script type="text/javascript" src="/public/rpt_tpl_def.js"></script>
+</body>
+<script type="text/javascript">
+
+</script>
+
+</html>