Selaa lähdekoodia

1. idTree的Bug修复
2. TemplateBills(新建项目使用)相关

MaiXinRong 8 vuotta sitten
vanhempi
commit
663f53909d

+ 32 - 0
modules/templates/controllers/bills_template_controller.js

@@ -0,0 +1,32 @@
+/**
+ * Created by Mai on 2017/4/17.
+ */
+var BillsTemplateData = require('../models/bills_template');
+
+//ͳһ»Øµ÷º¯Êý
+var callback = function(req, res, err, message, data){
+    res.json({error: err, message: message, data: data});
+};
+
+module.exports = {
+    getBillsTemplate: function(req, res){
+        var data = JSON.parse(req.body.data);
+        BillsTemplateData.getTemplate(data.tempType, function(err, message, templates){
+            if (templates) {
+                callback(req, res, err, message, templates);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    },
+    updateBillsTemplate: function (req, res) {
+        var data = JSON.parse(req.body.data);
+        BillsTemplateData.updateTemplate(data.user_id, data.tempType, data.updateData, function (err, message, data) {
+            if (err === 0) {
+                callback(req, res, err, message, data);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        })
+    }
+}

+ 69 - 0
modules/templates/models/bills_template.js

@@ -0,0 +1,69 @@
+/**
+ * Created by Mai on 2017/4/14.
+ * 清单模板,新建项目使用
+ */
+var mongoose = require('mongoose');
+var dbm = require("../../../config/db/db_manager");
+var templatesDB = dbm.getCfgConnection("templates");
+var Schema = mongoose.Schema;
+var deleteSchema = require('../../../public/models/deleteSchema');
+var BillsTemplateSchema = new Schema({
+    ID: Number,
+    ParentID: Number,
+    NextSiblingID: Number,
+    code: String,
+    name: String,
+    unit: String,
+    deleteInfo: deleteSchema,
+    tempType: Number
+});
+var BillsTemplates = templatesDB.model('temp_bills', BillsTemplateSchema);
+
+var BillsTemplateDAO = function(){};
+
+BillsTemplateDAO.prototype.getTemplate = function (type, callback) {
+    BillsTemplates.find({'$or': [{tempType: type, deleteInfo: null}, {tempType: type, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, template){
+        if (err) {
+            callback(1, '找不到模板', null);
+        } else {
+            callback(0, '', template);
+        }
+    });
+};
+BillsTemplateDAO.prototype.updateTemplate = function (userID, tempType, datas, callback) {
+    var data, project, updateLength = 0, hasError = false, deleteInfo = null;
+    var updateAll = function (err) {
+        if (!err){
+            updateLength += 1;
+            if (updateLength === datas.length) {
+                callback(0, '', datas);
+            }
+        } else {
+            hasError = true;
+            callback(1, '升级数据出错', null);
+        }
+    };
+    if (datas){
+        for (var i = 0; i < datas.length && !hasError; i++){
+            data = datas[i];
+            if (data.type === 'update') {
+                BillsTemplates.update({tempType: tempType, ID: data.data.ID}, data.data, updateAll)
+            } else if (data.type === 'new') {
+                data.data['tempType'] = tempType;
+                newProject = new BillsTemplates(data.data);
+                newProject.save(updateAll);
+            } else if (data.type === 'delete') {
+                deleteInfo = {};
+                deleteInfo['deleted'] = true;
+                deleteInfo['deleteDateTime'] = new Date();
+                deleteInfo['deleteBy'] = userID;
+                BillsTemplates.update({ID: data.data.ID}, {deleteInfo: deleteInfo}, updateAll);
+            } else {
+                hasError = true;
+                callback(1, '升级数据出错', null)
+            }
+        }
+    }
+}
+
+module.exports = new BillsTemplateDAO();

+ 12 - 0
modules/templates/routes/bills_template_router.js

@@ -0,0 +1,12 @@
+/**
+ * Created by Mai on 2017/4/17.
+ */
+
+var express = require('express');
+var billsTemplateRouter = express.Router();
+var billsTemplateController = require('./../controllers/bills_template_controller');
+
+billsTemplateRouter.post('/getBillsTemplate', billsTemplateController.getBillsTemplate);
+billsTemplateRouter.post('/updateBillsTemplate', billsTemplateController.updateBillsTemplate);
+
+module.exports = billsTemplateRouter;

+ 15 - 0
public/models/deleteSchema.js

@@ -0,0 +1,15 @@
+/**
+ * Created by Mai on 2017/4/17.
+ */
+
+var mongoose = require("mongoose");
+var Schema = mongoose.Schema;
+
+// ·ÑÓÃ×Ö¶Î
+var deleteSchema = new Schema({
+    deleted: Boolean,
+    deleteDateTime: Date,
+    deleteBy: Number // userID
+});
+
+module.exports = deleteSchema;

+ 5 - 5
public/web/idTree.js

@@ -108,7 +108,7 @@ var idTree = {
                     } else if (arguments.length === 3) {
                         children.push(nodes[i]);
                     }
-                    nodes[i].parent = parent;
+                    nodes[i].parent = parent ? parent : null;
                 }
             },
             sortTreeItems: function (tree) {
@@ -480,8 +480,8 @@ var idTree = {
             if (newID !== -1) {
                 data = {};
                 data[this.setting.id] = newID;
-                data[this.setting.pid] = parentID;
-                data[this.setting.nid] = nextSiblingID;
+                data[this.setting.pid] = parent ? parent.getID() : this.setting.rootId;
+                data[this.setting.nid] = nextSibling ? nextSibling.getID() : this.setting.rootId;
                 node = new Node(this, data);
                 if (nextSibling) {
                     tools.addNodes(this, parent, [node], nextSibling.siblingIndex());
@@ -500,11 +500,11 @@ var idTree = {
             var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
             var nextSibling = nextSiblingID === -1 ? null: this.nodes[this.prefix + nextSiblingID];
             if (newID !== -1) {
-                data.push({type: 'new', data: this.getDataTemplate(newID, parentID, nextSiblingID)});
+                data.push({type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, nextSibling ? nextSibling.getID() : this.setting.rootId)});
 
                 if (nextSibling && nextSibling.preSibling) {
                     tools.addUpdateDataForNextSibling(data, nextSibling.preSibling, newID);
-                } else if (parent && parent.childrent.length !== 0) {
+                } else if (parent && parent.children.length !== 0) {
                     tools.addUpdateDataForNextSibling(data, parent.lastChild(), newID);
                 } else if (!parent && this.roots.length !== 0) {
                     tools.addUpdateDataForNextSibling(data, this.roots[this.roots.length - 1], newID);

+ 9 - 2
public/web/tree_sheet_controller.js

@@ -10,12 +10,12 @@ var TREE_SHEET_CONTROLLER = {
             this.setting = setting;
             this.event = {
                 refreshBaseActn: null
-            }
+            };
+            TREE_SHEET_HELPER.loadSheetHeader(this.setting, this.sheet);
         };
 
         controller.prototype.showTreeData = function () {
             var that = this;
-            TREE_SHEET_HELPER.loadSheetHeader(this.setting, this.sheet);
             TREE_SHEET_HELPER.showTreeData(this.setting, this.sheet, this.tree);
             this.sheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) {
                 that.setTreeSelected(that.tree.findNode(info.sheet.getTag(info.newSelections[0].row, info.newSelections[0].col)));
@@ -119,6 +119,13 @@ var TREE_SHEET_CONTROLLER = {
             }
         };
 
+        controller.prototype.refreshTreeNode = function (nodes, recursive) {
+            var that = this;
+            TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
+                TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, nodes, recursive)
+            })
+        }
+
         controller.prototype.setTreeSelected = function (node) {
             this.tree.selected = node;
             if (this.event.refreshBaseActn) {

+ 14 - 2
server.js

@@ -1,8 +1,8 @@
 var express = require('express');
 
 var config = require("./config/config.js");
-//config.setToLocalDb();
-config.setToQaDb();
+config.setToLocalDb();
+//config.setToQaDb();
 //config.setupCache();
 var cfgCacheUtil = require("./config/cacheCfg");
 cfgCacheUtil.setupDftCache();
@@ -39,6 +39,18 @@ app.use(session({
 app.use('/', require('./modules/users/routes/users_route'));
 app.use('/fees', require('./modules/fees/routes/fees_router'));
 
+app.get('/template/bills', function (req, res) {
+    if (!req.session.userAccount) {
+        res.redirect('/login');
+    } else {
+        res.render('templates/html/bills.html',
+            {userAccount: req.session.userAccount,
+                userID: req.session.userID});
+    }
+});
+var billsTemplateRouter = require('./modules/templates/routes/bills_template_router');
+app.use('/template/bills', billsTemplateRouter);
+
 app.get('/pm', function(req, res){
     if(!req.session.userAccount){
         res.redirect('/login');

+ 4 - 0
web/css/main.css

@@ -261,3 +261,7 @@ body {
   width:inherit;
   height: inherit;
 }
+.modal-fixed-height {
+  height: 400px;
+  overflow-y: auto;
+}

+ 41 - 6
web/main/html/main.html

@@ -658,7 +658,6 @@
 
             if (!selected || selected.sourceType === project.Bills.getSourceType()) {
                 newSource = project.Bills.tree.insert(selected ? selected.source.getParentID() : -1, selected ? selected.source.getNextSiblingID() : -1);
-                newSource.data.Name = 'aaa';
                 newNode = project.mainTree.insert(selected.getParentID(), selected.getNextSiblingID());
             } else if (selected.sourceType === project.Rations.getSourceType()) {
 
@@ -685,19 +684,55 @@
             }
         });
         $('#delete').click(function () {
-            controller.delete();
+            var selected = controller.tree.selected;
+            if (selected) {
+                if (selected.sourceType === project.Bills.getSourceType()) {
+                    project.Bills.delete(selected.source.getID());
+                    controller.delete();
+                } else if (selected.sourceType === project.Rations.getSourceType()) {
+                    project.Rations.delete(selected.source);
+                    controller.delete();
+                };
+            }
         });
         $('#upLevel').click(function () {
-            controller.upLevel()
+            console.log(project.Bills.tree.getInsertData(project.Bills.tree.selected.getParentID(), project.Bills.tree.selected.getNextSiblingID()));
+            var selected = controller.tree.selected;
+            if (selected && selected.sourceType === project.Bills.getSourceType()) {
+                selected.source.upLevel();
+                controller.upLevel();
+            }
         });
         $('#downLevel').click(function () {
-            controller.downLevel();
+            var selected = controller.tree.selected;
+            if (selected && selected.sourceType === project.Bills.getSourceType()) {
+                selected.source.upLevel();
+                controller.downLevel();
+            }
         });
         $('#upMove').click(function () {
-            controller.upMove();
+            var selected = controller.tree.selected;
+            if (selected) {
+                if (selected.sourceType === project.Bills.getSourceType()) {
+                    selected.source.upLevel();
+                    controller.upMove();
+                } else if (selected.sourceType === project.Rations.getSourceType()) {
+                    // to Do
+                    controller.upMove();
+                }
+            }
         });
         $('#downMove').click(function () {
-            controller.downMove();
+            var selected = controller.tree.selected;
+            if (selected) {
+                if (selected.sourceType === project.Bills.getSourceType()) {
+                    selected.source.downLevel();
+                    controller.downMove();
+                } else if (selected.sourceType === project.Rations.getSourceType()) {
+                    // to Do
+                    controller.downMove();
+                }
+            }
         });
     });
 </script>

+ 1 - 1
web/main/js/models/project.js

@@ -12,7 +12,7 @@ var PROJECT = {
 
             this.Bills = Bills.createNew(this);
             this.Rations = Rations.createNew(this);
-            this.GLJ = GLJs.createNew(this);
+            this.GLJs = GLJs.createNew(this);
 
 
             this.masterField = {ration: 'BillsID'};

+ 123 - 0
web/templates/html/bills.html

@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<html>
+<head lang="en">
+    <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>模板清单-Smartcost</title>
+    <link rel="stylesheet" href="/web/css/bootstrap/bootstrap.min.css">
+    <link rel="stylesheet" href="/web/css/main.css">
+    <link rel="stylesheet" href="/web/css/font-awesome/font-awesome.min.css">
+    <!--SpreadJs-->
+    <link rel="stylesheet" href="/web/css/spreadjs/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <script>
+        // 这里的变量供页面调用
+        var userAccount = '<%- userAccount %>';
+        var userID = '<%- userID %>';
+    </script>
+</head>
+<body>
+<div class="header">
+    <!-- <div class="top-msg clearfix">
+        <div class="alert alert-warning mb-0 py-0" role="alert">
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+              <span aria-hidden="true">&times;</span>
+            </button>
+            <strong>注意!</strong> 这是一条消息通知 <a href="#">链接</a>
+        </div>
+    </div> -->
+    <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
+        <span class="header-logo px-2">Smartcost</span>
+        <div class="float-lg-right navbar-text pt-0">
+            <div class="dropdown d-inline-block">
+                <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><%- userAccount %></button>
+                <div class="dropdown-menu dropdown-menu-right">
+                    <a class="dropdown-item" href="/user/info" target="_blank">账号资料</a>
+                    <a class="dropdown-item" href="/user/buy" target="_blank">产品购买</a>
+                    <a class="dropdown-item" href="/user/set" target="_blank">偏好设置</a>
+                </div>
+            </div>
+                <span class="btn btn-link btn-sm new-msg">
+                  <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
+                </span>
+            <a class="btn btn-link btn-sm" href="/logout">注销</a>
+        </div>
+    </nav>
+</div>
+<div class="main">
+    <div class="content">
+        <div class="tab-content">
+            <div class="tab-pane active" id="zaojiashu" role="tabpanel">
+                <!--造价书-->
+                <div class="toolsbar px-1 d-flex justify-content-between">
+                    <div class="tools-btn btn-group align-top">
+                        <a href="" class="btn btn-sm"><i class="fa fa-files-o" aria-hidden="true"></i> 复制</a>
+                        <a href="" class="btn btn-sm"><i class="fa fa-scissors" aria-hidden="true"></i> 剪切</a>
+                        <a href="" class="btn btn-sm"><i class="fa fa-clipboard" aria-hidden="true"></i> 粘贴</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="insert"><i class="fa fa-sign-in" aria-hidden="true"></i> 插入</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="delete"><i class="fa fa-remove" aria-hidden="true"></i> 删除</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="upLevel"><i class="fa fa-arrow-left" aria-hidden="true"></i> 升级</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="downLevel"><i class="fa fa-arrow-right" aria-hidden="true"></i> 降级</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="downMove"><i class="fa fa-arrow-down" aria-hidden="true"></i> 下移</a>
+                        <a href="javascript:void(0)" class="btn btn-sm" id="upMove"><i class="fa fa-arrow-up" aria-hidden="true"></i> 上移</a>
+                    </div>
+                    <div class="side-tabs">
+                        <ul class="nav nav-tabs" role="tablist">
+                            <li class="nav-item">
+                                <a class="nav-link active px-3" data-toggle="tab" href="#qd" role="tab">清单规则</a>
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+                <div class="container-fluid">
+                    <div class="row">
+                        <div class="main-content col-lg-9 p-0">
+                            <div class="top-content">
+                                <div class="main-data-top" id="billsSpread"></div>
+                            </div>
+                        </div>
+                        <div class="main-side col-lg-3 p-0">
+                            <div class="tab-content">
+                                <!--清单规则-->
+                                <div class="tab-pane active" id="qd" role="tabpanel">
+                                    <div class="warp-p2">
+                                        <div>
+                                            <select class="form-control form-control-sm" id="exampleSelect1">
+                                                <option>重庆市房屋建筑与装饰工程工程量计算规则(2013)</option>
+                                                <option>2</option>
+                                                <option>3</option>
+                                                <option>4</option>
+                                                <option>5</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<!-- 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="/lib/global.js"></script>
+<!-- SpreadJs -->
+<script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+<script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+<!-- Models -->
+<script type="text/javascript" src="/public/web/idTree.js"></script>
+<!-- Controller -->
+<script type="text/javascript" src="/public/web/tree_sheet_controller.js"></script>
+<script type="text/javascript" src="/public/web/tree_sheet_helper.js"></script>
+<!-- service -->
+<script type="text/javascript" src="/web/templates/js/bills.js"></script>
+<script type="text/javascript" src="/web/templates/js/tp_bills_setting.js"></script>
+<script type="text/javascript">
+    autoFlashHeight();
+</script>
+</html>

+ 157 - 0
web/templates/js/bills.js

@@ -0,0 +1,157 @@
+/**
+ * Created by Mai on 2017/4/17.
+ */
+$(document).ready(function () {
+    var PostData = function (url, data, successCallback, errorCallback) {
+        $.ajax({
+            type:"POST",
+            url: url,
+            data: {'data': JSON.stringify(data)},
+            dataType: 'json',
+            cache: false,
+            timeout: 50000,
+            success: function(result){
+                if (result.error === 0) {
+                    successCallback(result.data);
+                } else {
+                    alert('error: ' + result.message);
+                    if (errorCallback) {
+                        errorCallback();
+                    }
+                }
+            },
+            error: function(jqXHR, textStatus, errorThrown){
+                alert('error ' + textStatus + " " + errorThrown);
+                if (errorCallback) {
+                    errorCallback();
+                }
+            }
+        });
+    };
+    var FormatUpdateData = function (data) {
+        var updateData = {};
+        updateData['user_id'] = userID;
+        updateData['tempType'] = 1;
+        updateData['updateData'] = data;
+        return updateData;
+    };
+    var RefreshBaseActn = function (tree) {
+        var showButton = function (show, btn) {
+            if (show) {
+                btn.show();
+            } else {
+                btn.hide();
+            }
+        };
+        showButton(tree.selected && tree.selected.canUpLevel(), $('#upLevel'));
+        showButton(tree.selected && tree.selected.canDownLevel(), $('#downLevel'));
+        showButton(tree.selected && tree.selected.canUpMove(), $('#upMove'));
+        showButton(tree.selected && tree.selected.canDownMove(), $('#downMove'));
+        showButton(tree.selected ? true : false, $('#delete'));
+    }
+
+    var bills;
+    var tree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1});
+    var billsSpread = new GC.Spread.Sheets.Workbook($('#billsSpread')[0], { sheetCount: 1 });
+    var controller = TREE_SHEET_CONTROLLER.createNew(tree, billsSpread.getActiveSheet(), TEMPLATE_BILLS_SETTING);
+
+    GC.Spread.Common.CultureManager.culture("zh-cn");
+
+    billsSpread.options.tabStripVisible = false;
+    billsSpread.options.scrollbarMaxAlign = true;
+    controller.bind('refreshBaseActn', RefreshBaseActn);
+
+    /*billsSpread.bind(GC.Spread.Sheets.Events.ValueChanged, function (e, info) {
+        var node = controller.tree.findNode(info.sheet.getTag(info.row, info.col));
+        var fieldName = controller.setting.cols[info.col].data.field;
+        var data = {type: 'update', data: node.data};
+        data.data[fieldName] = info.newValue;
+        var updateData = FormatUpdateData([data]);
+        PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            node.data[fieldName] = info.newValue;
+        }, function () {
+            TREE_SHEET_HELPER.refreshTreeNodeData(setting, sheet, [node], false);
+        });
+    });*/
+
+    billsSpread.bind(GC.Spread.Sheets.Events.EditEnded, function (sender, info) {
+        var node = controller.tree.findNode(info.sheet.getTag(info.row, info.col));
+        var fieldName = controller.setting.cols[info.col].data.field;
+        var data = {type: 'update', data: node.data};
+        data.data[fieldName] = info.editingText;
+        var updateData = FormatUpdateData([data]);
+        PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            node.data[fieldName] = info.editingText;
+            controller.refreshTreeNode([node], false);
+        }, function () {
+            controller.refreshTreeNode([node], false);
+        });
+    });
+
+    PostData('/template/bills/getBillsTemplate', {tempType: 1}, function (data) {
+        bills = data;
+        tree.loadDatas(bills);
+        controller.showTreeData();
+        RefreshBaseActn(tree);
+    }, function () {
+        controller.showTreeData();
+        RefreshBaseActn(tree);
+    });
+
+    $('#insert').click(function () {
+        var selected = controller.tree.selected, updateData;
+        if (selected) {
+            updateData = FormatUpdateData(controller.tree.getInsertData(selected.getParentID(), selected.getNextSiblingID()));
+        } else {
+            updateData = FormatUpdateData(controller.tree.getInsertData());
+        }
+        PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            controller.insert();
+        });
+    });
+    $('#delete').click(function () {
+        var selected = controller.tree.selected, updateData;
+        if (selected) {
+            updateData = FormatUpdateData(controller.tree.getDeleteData(selected));
+            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+                controller.delete();
+            });
+        }
+    });
+    $('#upLevel').click(function () {
+        var selected = controller.tree.selected, updateData;
+        if (selected) {
+            updateData = FormatUpdateData(selected.getUpLevelData());
+            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+                controller.upLevel();
+            });
+        }
+    });
+    $('#downLevel').click(function () {
+        var selected = controller.tree.selected, updateData;
+        if (selected) {
+            updateData = FormatUpdateData(selected.getDownLevelData());
+            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+                controller.downLevel();
+            });
+        }
+    });
+    $('#upMove').click(function () {
+        var selected = controller.tree.selected, updateData;
+        if (selected) {
+            updateData = FormatUpdateData(selected.getUpMoveData());
+            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+                controller.upMove();
+            });
+        }
+    });
+    $('#downMove').click(function () {
+        var selected = controller.tree.selected, updateData;
+        if (selected) {
+            updateData = FormatUpdateData(selected.getDownMoveData());
+            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+              controller.downMove()
+            });
+        }
+    });
+});

+ 97 - 0
web/templates/js/tp_bills_setting.js

@@ -0,0 +1,97 @@
+/**
+ * Created by Mai on 2017/4/17.
+ */
+var TEMPLATE_BILLS_SETTING = {
+    "emptyRows":1,
+    "headRows":1,
+    "headRowHeight":[20],
+    "treeCol": 0,
+    "cols":[{
+        "width":200,
+        "readOnly":null,
+        "head":{
+            "titleNames":[
+                "编号"
+            ],
+            "spanCols":[
+                1
+            ],
+            "spanRows":[
+                1
+            ],
+            "vAlign":[
+                1
+            ],
+            "hAlign":[
+                1
+            ],
+            "font":[
+                "12px Arial"
+            ]
+        },
+        "data":{
+            "field":"code",
+            "vAlign":0,
+            "hAlign":3,
+            "font":"14.6667px Calibri"
+        }
+    }, {
+        "width":300,
+        "readOnly":null,
+        "head":{
+            "titleNames":[
+                "名称"
+            ],
+            "spanCols":[
+                1
+            ],
+            "spanRows":[
+                1
+            ],
+            "vAlign":[
+                1
+            ],
+            "hAlign":[
+                1
+            ],
+            "font":[
+                "12px Arial"
+            ]
+        },
+        "data":{
+            "field":"name",
+            "vAlign":0,
+            "hAlign":3,
+            "font":"14.6667px Calibri"
+        }
+    }, {
+        "width":50,
+        "readOnly":null,
+        "head":{
+            "titleNames":[
+                "单位"
+            ],
+            "spanCols":[
+                1
+            ],
+            "spanRows":[
+                1
+            ],
+            "vAlign":[
+                1
+            ],
+            "hAlign":[
+                1
+            ],
+            "font":[
+                "12px Arial"
+            ]
+        },
+        "data":{
+            "field":"unit",
+            "vAlign":0,
+            "hAlign":1,
+            "font":"14.6667px Calibri"
+        }
+    }]
+};