Преглед изворни кода

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

Chenshilong пре 8 година
родитељ
комит
01c1ea43c0

+ 25 - 1
modules/rationLibEditor/RationEditorDB/interfaces.js

@@ -362,6 +362,31 @@ removes.deleteRationLibs = function(req,res){//只删除了映射表内容  级
     var rationName = req.body.rationName;
     Schemas.connectMap(function(db){
         var LibMapModel = db.model("rationlibmaps",Schemas.RationLibMapSchema);
+        LibMapModel.find({"DisplayName":rationName},function(err,data){
+            if(data.length) {
+                var realRationName = data[0].DBName;
+                db = mongoose.createConnection("192.168.1.184", realRationName, 60666);
+                db.dropDatabase(function(err){
+                    if(err) callback(req,res,"drop err",false);
+                    else{
+                        callback(req,res,false,"ok")
+  /*                      var db = mongoose.createConnection("192.168.1.184"," rationLibMap", 60666)
+                        var LibMapModel = db.model("rationlibmaps",Schemas.RationLibMapSchema);
+                        LibMapModel.remove({"DisplayName":rationName},function(err){
+                            if(err) callback(req,res,"删除错误",false);
+                            else callback(req,res,false,"已删除");
+                        })*/
+                    }
+                });
+            }
+        })
+    })
+
+}
+removes.deleteRationMapItem=function(req,res){
+    var rationName = req.body.rationName;
+    Schemas.connectMap(function(db){
+        var LibMapModel = db.model("rationlibmaps",Schemas.RationLibMapSchema);
         LibMapModel.remove({"DisplayName":rationName},function(err){
             if(err) callback(req,res,"删除错误",false);
             else callback(req,res,false,"已删除");
@@ -406,7 +431,6 @@ removes.deleteGLJItem = function(req,res){
 }
 removes.deleteRation = function(req,res){
     var DBName = req.body.rationName;
-    var deltype = req.body.type;
     var delvalue = req.body.value;
     Schemas.connectMap(function(db){
         var LibMapModel = db.model("rationlibmaps",Schemas.RationLibMapSchema);

+ 1 - 0
modules/rationLibEditor/routes/rationLibEditor_route.js

@@ -43,6 +43,7 @@ apiRouter.post("/getGLJItem",RationInterface.search.getGLJ);
 apiRouter.post("/editRationLibs",RationInterface.update.updateRationLib);
 apiRouter.post("/editGLJItem",RationInterface.update.updateGLJItem);
 apiRouter.post("/deleteRation",RationInterface.remove.deleteRation);
+apiRouter.post("/deleteRationMapItem",RationInterface.remove.deleteRationMapItem);
 apiRouter.post("/deleteRationGLJ",RationInterface.remove.deleteRationGLJ);
 apiRouter.post("/editRation",RationInterface.remove.deleteRationGLJ);
 apiRouter.post("/editRGLJAmount",RationInterface.update.updateRGLJAmount);

+ 6 - 7
modules/reports/controllers/rpt_controller.js

@@ -6,7 +6,7 @@ var JV = require('../rpt_component/Jpc_ValueDefine');
 var Template = require('../models/rpt_template');
 var TemplateData = require('../models/rpt_temp_data');
 var JpcEx = require('../rpt_component/JpcEx');
-var cacheController = require('./cacheController');
+var cache = require('../../../public/cache/cacheUtil');
 
 //统一回调函数
 var callback = function(req, res, err, data){
@@ -18,7 +18,7 @@ var callback = function(req, res, err, data){
         //res.send({success: true, data: data});
         res.json({success:true, data: data});
     }
-}
+};
 
 module.exports = {
     getReportAllPages: function(req, res){
@@ -31,9 +31,9 @@ module.exports = {
                     if (tplData) {
                         var printCom = JpcEx.createNew();
                         rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
-                        var dftControls = cacheController.getCache("common_ctrls");
-                        var dftFonts = cacheController.getCache("common_fonts");
-                        var dftStyles = cacheController.getCache("common_styles");
+                        var dftControls = cache.getCache("common_ctrls");
+                        var dftFonts = cache.getCache("common_fonts");
+                        var dftStyles = cache.getCache("common_styles");
                         var defProperties = {ctrls: dftControls, fonts: dftFonts, styles: dftStyles};
                         printCom.initialize(rptTpl);
                         printCom.analyzeData(rptTpl, tplData, defProperties);
@@ -56,5 +56,4 @@ module.exports = {
     },
     remove: function(req, res){
     }
-
-}
+};

+ 48 - 0
modules/reports/controllers/rtp_cfg_controller.js

@@ -0,0 +1,48 @@
+/**
+ * Created by Tony on 2017/3/17.
+ */
+var cmn_ctrl = require('../models/rpt_control');
+var cmn_font = require('../models/rpt_font');
+var cmn_style = require('../models/rpt_style');
+
+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 = {
+    setReportDefaultCache: function (req, res) {
+        var err = "", defProperties = {ctrls: null, fonts: null, styles: null};
+        cmn_ctrl.getAll(null, function(err, ctrls){
+            if (ctrls) {
+                cache.common_ctrls = ctrls;
+                defProperties.ctrls = ctrls;
+            } else {
+                err += 'No default controls! ';
+            }
+        });
+        cmn_font.getAll(null, function(err, fonts){
+            if (fonts) {
+                cache.common_fonts = fonts;
+                defProperties.fonts = fonts;
+            } else {
+                err += 'No default fonts! ';
+            }
+        });
+        cmn_style.getAll(null, function(err, styles){
+            if (styles) {
+                cache.common_styles = styles;
+                defProperties.styles = styles;
+            } else {
+                err += 'No default styles!';
+            }
+        });
+        callback(req, res, err, defProperties);
+    }
+}

+ 44 - 0
modules/reports/models/cfg_control.js

@@ -0,0 +1,44 @@
+/**
+ * Created by Tony on 2016/12/23.
+ */
+var mongoose = require('mongoose');
+var dbm = require("../../../config/db/db_manager");
+var smartcostdb = dbm.getCfgConnection("Reports");
+var Schema = mongoose.Schema;
+var CtrlSchema = new Schema({
+    "ID" : String,
+    "Shrink" : String,
+    "ShowZero" : String,
+    "Horizon" : String,
+    "Vertical" : String,
+    "Wrap" : String
+});
+
+var Control = smartcostdb.model("com_ctrls", CtrlSchema);
+
+var CtrlDAO = function(){};
+
+//根据id
+CtrlDAO.prototype.get = function(id, callback){
+    Control.find({ID: id}, function(err, templates){
+        if(templates.length){
+            callback(false, templates[0]);
+        }
+        else{
+            callback('no record was found!');
+        }
+    })
+}
+
+CtrlDAO.prototype.getAll = function(id, callback){
+    Control.find({}, function(err, templates){
+        if(templates.length){
+            callback(false, templates);
+        }
+        else{
+            callback('no record was found!');
+        }
+    })
+}
+
+module.exports = new CtrlDAO();

+ 47 - 0
modules/reports/models/cfg_font.js

@@ -0,0 +1,47 @@
+/**
+ * Created by Tony on 2016/12/23.
+ */
+var mongoose = require('mongoose');
+var dbm = require("../../../config/db/db_manager");
+var smartcostdb = dbm.getCfgConnection("Reports");
+var Schema = mongoose.Schema;
+var FontSchema = new Schema({
+    "ID" : String,
+    "Name" : String,
+    "FontHeight" : String,
+    "FontColor" : String,
+    "FontBold" : String,
+    "FontItalic" : String,
+    "FontUnderline" : String,
+    "FontStrikeOut" : String,
+    "FontAngle" : String
+});
+
+var Font = smartcostdb.model("com_fonts", FontSchema);
+
+var FontDAO = function(){};
+
+//根据id
+FontDAO.prototype.get = function(id, callback){
+    Font.find({ID: id}, function(err, templates){
+        if(templates.length){
+            callback(false, templates[0]);
+        }
+        else{
+            callback('no record was found!');
+        }
+    })
+}
+
+FontDAO.prototype.getAll = function(id, callback){
+    Font.find({}, function(err, templates){
+        if(templates.length){
+            callback(false, templates);
+        }
+        else{
+            callback('no record was found!');
+        }
+    })
+}
+
+module.exports = new FontDAO();

+ 40 - 0
modules/reports/models/cfg_style.js

@@ -0,0 +1,40 @@
+/**
+ * Created by Tony on 2016/12/23.
+ */
+var mongoose = require('mongoose');
+var dbm = require("../../../config/db/db_manager");
+var smartcostdb = dbm.getCfgConnection("Reports");
+var Schema = mongoose.Schema;
+var StyleSchema = new Schema({
+    "ID" : String,
+    "border_style" : Array
+});
+
+var Style = smartcostdb.model("com_styles", StyleSchema);
+
+var StyleDAO = function(){};
+
+//根据id
+StyleDAO.prototype.get = function(id, callback){
+    Style.find({ID: id}, function(err, templates){
+        if(templates.length){
+            callback(false, templates[0]);
+        }
+        else{
+            callback('no record was found!');
+        }
+    })
+}
+
+StyleDAO.prototype.getAll = function(id, callback){
+    Style.find({}, function(err, templates){
+        if(templates.length){
+            callback(false, templates);
+        }
+        else{
+            callback('no record was found!');
+        }
+    })
+}
+
+module.exports = new StyleDAO();

+ 3 - 4
modules/reports/models/rpt_temp_data.js

@@ -2,8 +2,8 @@
  * Created by Tony on 2016/12/28.
  */
 var mongoose = require('mongoose');
-var smartcostdb = require('./../db/smartcostdb');
-//var Schema = smartcostdb.mongoose.Schema;
+var dbm = require("../../../config/db/db_manager");
+var smartcostdb = dbm.getCfgConnection("Reports");
 var Schema = mongoose.Schema;
 var RptTemplateDataSchema = new Schema({
     "Data_Key": String,
@@ -12,8 +12,7 @@ var RptTemplateDataSchema = new Schema({
     "detail_data": Array
 });
 
-var TemplateData = smartcostdb.mongoose.model("temp_tpl_datas", RptTemplateDataSchema);
-//var TemplateData = smartcostdb.model("temp_tpl_datas", RptTemplateDataSchema);
+var TemplateData = smartcostdb.model("temp_tpl_datas", RptTemplateDataSchema);
 
 var RplTplDataDAO = function(){};
 

+ 3 - 4
modules/reports/models/rpt_template.js

@@ -2,8 +2,8 @@
  * Created by Tony on 2016/12/23.
  */
 var mongoose = require('mongoose');
-var smartcostdb = require('./../db/smartcostdb');
-//var Schema = smartcostdb.mongoose.Schema;
+var dbm = require("../../../config/db/db_manager");
+var smartcostdb = dbm.getCfgConnection("Reports");
 var Schema = mongoose.Schema;
 var RptTemplateSchema = new Schema({
     "GROUP_KEY": String,
@@ -18,8 +18,7 @@ var RptTemplateSchema = new Schema({
     "计算式_集合": Array
 });
 
-var Template = smartcostdb.mongoose.model("rpt_templates", RptTemplateSchema);
-//var Template = smartcostdb.model("rpt_templates", RptTemplateSchema);
+var Template = smartcostdb.model("rpt_templates", RptTemplateSchema);
 
 var RplTplDAO = function(){};
 

+ 5 - 15
modules/reports/routes/report_router.js

@@ -4,21 +4,11 @@
 
 var express = require('express');
 var rptRouter = express.Router();
-var pmController = require('./../controllers/pm_controller');
+var reportController = require('./../controllers/rpt_controller');
+//apiRouter.post('/getReport', reportController.getReportAllPages);
 
-rptRouter.get('/pm', function(req, res){
-    if(!req.session.userAccount){
-        res.redirect('/login');
-    }
-    else{
-        res.render('pm/html/project-management.html',
-            {userAccount: req.session.userAccount,
-                userID: req.session.userID});
-    }
-});
-
-rptRouter.post('/getProjects', pmController.getProjects);
-rptRouter.post('/updateProjects', pmController.updateProjects);
-rptRouter.post('/renameProject', pmController.rename);
+rptRouter.post('/getReport', reportController.getReportAllPages);
+//rptRouter.post('/getPreview', pmController.updateProjects);
+//rptRouter.post('/getExcel', pmController.rename);
 
 module.exports = rptRouter;

+ 4 - 3
package.json

@@ -1,7 +1,7 @@
 {
   "name": "",
-  "version": "0.1.0",
-  "description": "to make question",
+  "version": "0.2.0",
+  "description": "Smart Soft - Construct Cost",
   "devDependencies": {
     "body-parser": "^1.13.2",
     "express": "^4.13.1",
@@ -12,6 +12,7 @@
     "debug": "~2.6.0",
     "ejs": "~2.5.5",
     "express-session": "^1.15.1",
-    "request": "^2.79.0"
+    "request": "^2.79.0",
+    "tape": "^4.6.3"
   }
 }

+ 14 - 0
public/cache/cacheUtil.js

@@ -0,0 +1,14 @@
+/**
+ * Created by Tony on 2016/12/28.
+ */
+var cache = {};
+
+module.exports = {
+    setCache: function(cacheKey, cacheValue) {
+        cache[cacheKey] = cacheValue;
+        return true;
+    },
+    getCache: function(cacheKey) {
+        return cache[cacheKey];
+    }
+}

+ 11 - 52
public/treeUtil.js

@@ -2,58 +2,17 @@
  * Created by Tony on 2017/3/14.
  */
 
-const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1;
+const fs = require('fs');
+var treeNodeUtil = null;
 
-module.exports = {
-    buildTreeNodeDirectly: function(data) {
-        var me = this, topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
-        private_getTopNode = function (idArr) {
-            var rst = null;
-            for (var i = 0; i < idArr.length; i++) {
-                if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] == EMPTY_ID_VAL) {
-                    rst = tmpNodes[prefix + idArr[i]];
-                    break;
-                }
-            }
-            return rst;
-        }
-        private_buildNodeData = function(parentItem, idArr) {
-            var iter = [], nextNode = private_getTopNode(idArr);
-            while (nextNode != null && nextNode != undefined ) {
-                if (parentItem) {
-                    parentItem[CHILDREN_NODE].push(nextNode);
-                } else {
-                    rst.push(nextNode);
-                }
-                iter.push(nextNode);
-                nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
-            }
-            for (var i = 0; i < iter.length; i++) {
-                private_buildNodeData(iter[i], iter[i][SUB_ID]);
-            }
-        }
-
-        for (var i = 0; i < data.length; i++) {
-            tmpNodes[prefix + data[i][NODE_ID]] = data[i];
-            data[i][ADHOC_PRE_ID] = EMPTY_ID_VAL;
-            data[i][SUB_ID] = [];
-            data[i][CHILDREN_NODE] = [];
-            if (data[i][P_ID] == EMPTY_ID_VAL) {
-                topArr.push(data[i][NODE_ID]);
-            }
-        }
-        for (var i = 0; i < data.length; i++) {
-            if (data[i][NEXT_ID] != EMPTY_ID_VAL) {
-                tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
-            }
-            if (data[i][P_ID] != EMPTY_ID_VAL) {
-                tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
-            }
-        }
-        private_buildNodeData(null, topArr);
-        //try to release and return
-        tmpNodes = null;
-        topArr.length = 0;
-        return rst;
+getTreeNodeUtil = function() {
+    if (!(treeNodeUtil)) {
+        var data = fs.readFileSync(__dirname + '/web/treeDataHelper.js', 'utf8', 'r');
+        //console.log(data);
+        eval(data);
+        treeNodeUtil = tree_Data_Helper;
     }
+    return treeNodeUtil;
 }
+
+exports.getUtil = getTreeNodeUtil;

+ 30 - 0
web/scripts/treeDataHelper.js

@@ -54,5 +54,35 @@ var tree_Data_Helper = {
         tmpNodes = null;
         topArr.length = 0;
         return rst;
+    },
+    reSettleRelatedID: function(treeData) {
+        if (treeData && treeData.length > 0) {
+            for (var i = 0; i < treeData[CHILDREN_NODE].length; i++) {
+                var nI = null;
+                if (i < treeData[CHILDREN_NODE].length - 1) {
+                    nI = treeData[CHILDREN_NODE][i+1];
+                }
+                settleNodeRelatedID(null, nI, treeData[CHILDREN_NODE][i]);
+            }
+        }
+    },
+    settleNodeRelatedID : function(parentItem, nextItem, node) {
+        if (parentItem) {
+            node[P_ID] = parentItem[NODE_ID];
+        } else {
+            node[P_ID] = EMPTY_ID_VAL;
+        }
+        if (nextItem) {
+            node[NEXT_ID] = nextItem[NODE_ID];
+        } else {
+            node[NEXT_ID] = EMPTY_ID_VAL;
+        }
+        for (var i = 0; i < node[CHILDREN_NODE].length; i++) {
+            var nI = null;
+            if (i < node[CHILDREN_NODE].length - 1) {
+                nI = node[CHILDREN_NODE][i+1];
+            }
+            private_settleNodeRelatedID(node, nI, node[CHILDREN_NODE][i]);
+        }
     }
 }

+ 3 - 0
server.js

@@ -64,6 +64,9 @@ app.get('/main',  function(req, res) {
     }
 });
 
+var rpt_Router = require("./modules/reports/routes/report_router");
+app.use("/report", rpt_Router);
+
 //zhangenping add 2017.0.13-----------------------------------------begin
 app.use(express.static(_rootDir+"/web"));
 app.use(express.static(_rootDir+"/lib"));

+ 12 - 0
test/demo/demo.js

@@ -0,0 +1,12 @@
+/**
+ * Created by Tony on 2017/3/16.
+ */
+
+var test = require('tape');
+
+test('basic arithmetic', function (t) {
+    t.plan(2);
+
+    t.equal(2 + 3, 5);
+    t.equal(7 * 8 + 9, 65);
+});

+ 0 - 0
test/globalTestSuit.js


+ 0 - 33
test/testRouter.js

@@ -1,33 +0,0 @@
-/**
- * Created by Tony on 2017/3/7.
- */
-var express = require('express');
-var app = express();
-
-var _rootDir = __dirname;
-
-app.use(express.static(_rootDir));
-
-var bodyParser = require('body-parser');
-app.use(bodyParser.urlencoded({extended: false}));
-app.use(bodyParser.json());
-
-//注册路由
-app.get('/', function(req, res){
-    //res.sendFile(_rootDir+'/web/.../project-management.html');
-});
-
-
-var apiRouter = express.Router();
-
-app.use('/api', apiRouter);
-
-app.use(function(req, res, next) {
-    res.status(404).sendFile(_rootDir+'/src/404.html');
-});
-app.use(function(err, req, res, next) {
-    console.error(err.stack);
-    res.status(500).send('500 Error');
-});
-
-app.listen(6060);

Разлика између датотеке није приказан због своје велике величине
+ 3 - 0
test/tmp_data/test_bills_data.js


+ 11 - 0
test/unit/cache/testCacheUsage.js

@@ -0,0 +1,11 @@
+/**
+ * Created by Tony on 2017/3/20.
+ */
+var test = require('tape');
+var cache = require('../../../public/cache/cacheUtil');
+
+test('test cache usage:', function(t) {
+    cache.setCache("unit_TestKey","hello my cache!");
+    t.equal(cache.getCache("unit_TestKey"), "hello my cache!")
+    t.end();
+})

+ 14 - 0
test/unit/reports/testBills.js

@@ -0,0 +1,14 @@
+/**
+ * Created by Tony on 2017/3/20.
+ */
+var test = require('tape');
+var treeU = require('../../../public/treeUtil').getUtil();
+var testData = require('../../tmp_data/test_bills_data');
+
+test('test treeUtil buildTreeNodeDirectly: ', function (t) {
+    t.plan(1);
+    var rst = treeU.buildTreeNodeDirectly(testData);
+    console.log(rst.length);
+    t.equal(rst.length > 5 && rst.length < 20, true);
+    //t.end();
+});

+ 46 - 0
test/unit/reports/testRpt.js

@@ -0,0 +1,46 @@
+/**
+ * Created by Tony on 2017/3/17.
+ */
+var test = require('tape');
+var cmn_ctrl = require('../../../modules/reports/models/cfg_control');
+var cmn_font = require('../../../modules/reports/models/cfg_font');
+var cmn_style = require('../../../modules/reports/models/cfg_style');
+
+test('test get report pages function: ', function (t) {
+    /*/
+    t.plan(1);
+    t.equal(2 + 3, 5);
+    /*/
+    cmn_ctrl.getAll(null, function(err, ctrls){
+        t.notEqual(ctrls, null);
+        t.end();
+        return true;
+    });
+    //*/
+});
+
+test('test get report pages function: ', function (t) {
+    /*/
+    t.plan(1);
+    t.equal(7 * 8 + 9, 65);
+    /*/
+    cmn_font.getAll(null, function(err, fonts){
+        t.notEqual(fonts, null);
+        t.end();
+        return true;
+    });
+    //*/
+});
+
+test('test get report pages function: ', function (t) {
+    /*/
+    t.plan(1);
+    t.equal(1+2, 65);
+    /*/
+    cmn_style.getAll(null, function(err, styles){
+        t.notEqual(styles, null);
+        t.end();
+        return true;
+    });
+    //*/
+});

+ 41 - 1
web/rationLibEditor/dinge.html

@@ -956,9 +956,49 @@ function onRemove(e, treeId, treeNode) {
             saveNewSection(pNodes[i]);
         }
     }
+    $.ajax({
+        type:"POST",
+        url:"http://localhost:6060/ration/getRationsBySectionID",
+        data:{"rationName": rationName,"sectionID": treeNode.id},
+        dataType:"json",
+        cache:false,
+        timeout:1000,
+        success:function(result){
+            if(result){
+                caseDeleteTreeNode(result.data)
+            }
+
+        },
+        error:function(){
+        }
+    })
     removeSection(id)
+    $("#rationTbody").html("");
+    $("#rationGLJTbody").html("");
+}
+//级联删除章节点
+function caseDeleteTreeNode(arryObj){
+    for(var i=0;i<arryObj.length;i++){
+        {
+            $.ajax({
+                type:"POST",
+                url:"http://localhost:6060/ration/deleteRation",
+                data:{"rationName": rationName,"value":arryObj[i].RationCode},
+                async:false,
+                dataType:"json",
+                cache:false,
+                timeout:1000,
+                success:function(result){
+
+                },
+                error:function(){
+                    alert("nima")
+                }
+            })
+        }
+    }
 }
-//删除树节点ajax函数
+//删除树节点ajax函
 function removeSection(id){
     $.ajax({
         type:"POST",

+ 18 - 0
web/rationLibEditor/main.html

@@ -188,6 +188,22 @@ $("#deleteLib").click(function(){
         dataType:"json",
         data:{"rationName": rationName},
         cache:false,
+        async:false,
+        timeout:50000,
+        success:function(result){
+        //    getRationLibs();//刷新界面重新获取定额库
+        },
+        error:function(iqXHR,textStatus,errorThrown){
+
+        }
+    })
+    $.ajax({
+        type:"POST",
+        url:"http://localhost:6060/ration/deleteRationMapItem",
+        dataType:"json",
+        data:{"rationName": rationName},
+        async:false,
+        cache:false,
         timeout:50000,
         success:function(result){
             getRationLibs();//刷新界面重新获取定额库
@@ -196,6 +212,8 @@ $("#deleteLib").click(function(){
 
         }
     })
+
+
 });
 //获取定额库
 function getRationLibs(){

+ 109 - 0
web/scripts/sheetDataHelper.js

@@ -0,0 +1,109 @@
+/**
+ * Created by Mai on 2017/3/13.
+ */
+// setting示例
+var __settingTemp = {
+    cols: [
+        {
+            id: 'code',
+            head: {
+                titleNames: ['编号'],
+                spanCols:[1],
+                spanRows:[1],
+                vAlign: [1],
+                hAlign: [1],
+                font: '4px Arial'
+            },
+            data:{
+                field: 'code',
+                vAlign: 1,
+                hAlign: 0,
+                font: '4px Arial'
+            },
+            width: 60,
+            readOnly: false
+        }
+    ],
+    headRows: 1,
+    headRowHeight: [25],
+    emptyRows: 3
+};
+
+var SheetDataHelper = {
+    loadSheetHeader: function (setting, sheet) {
+        sheet.setColumnCount(setting.cols.length);
+        sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
+        setting.headRowHeight.forEach(function (rowHeight, index) {
+            sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
+        })
+        setting.cols.forEach(function (col, index) {
+            var i, iRow = 0, cell;
+            for (i = 0; i < col.head.spanCols.length; i++) {
+                if (col.head.spanCols[i] !== 0) {
+                    cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
+                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]);
+                }
+                if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
+                    sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
+                }
+                iRow += col.head.spanRows[i];
+            };
+            sheet.setColumnWidth(index, col.width);
+        });
+    },
+    protectdSheet: function (sheet) {
+        var option = {
+            allowSelectLockedCells: true,
+            allowSelectUnlockedCells: true,
+            allowResizeRows: true,
+            allowResizeColumns: true
+        };
+
+        sheet.options.protectionOptions = option;
+        sheet.options.isProtected = true;        
+    },
+    getSheetCellStyle: function (setting) {
+        var style = new GC.Spread.Sheets.Style();
+        style.locked = setting.readOnly;
+        style.name = setting.id;
+        style.font = setting.data.font;
+        style.hAlign = setting.data.hAlign;
+        style.vAlign = setting.data.vAlign;
+        //style.wordWrap = setting.data.wordWrap;
+        return style;
+    },
+    loadSheetData: function (setting, sheet, datas) {
+        SheetDataHelper.protectdSheet(sheet);
+
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+
+        sheet.setRowCount(datas.length + setting.emptyRows, GC.Spread.Sheets.SheetArea.viewport);
+        setting.cols.forEach(function (colSetting, iCol) {       
+            sheet.setStyle(-1, iCol, SheetDataHelper.getSheetCellStyle(colSetting));
+            datas.forEach(function (data, iRow) {
+                var cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
+                cell.value(data[colSetting.data.field]);
+            });
+        });
+
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    },
+    bindSheetData: function (setting, sheet, datas) {     
+        var getBindColInfo = function (setting) {
+            var colInfo = {};
+            colInfo.name = setting.data.field;
+            colInfo.size = setting.width;
+            return colInfo;
+        }
+
+        SheetDataHelper.protectdSheet(sheet); 
+        sheet.autoGenerateColumns = false;
+        sheet.setDataSource(datas);
+        setting.cols.forEach(function (colSetting, iCol) {
+            sheet.setStyle(-1, iCol, SheetDataHelper.getSheetCellStyle(colSetting));
+            sheet.bindColumn(iCol, getBindColInfo(colSetting));
+        });
+    }
+};