Преглед на файлове

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

Chenshilong преди 8 години
родител
ревизия
4c8ccc09bb
променени са 30 файла, в които са добавени 837 реда и са изтрити 772 реда
  1. 5 5
      modules/main/controllers/GLJ_controller.js
  2. 10 0
      modules/main/controllers/project_controller.js
  3. 41 34
      modules/main/models/GLJ.js
  4. 32 28
      modules/main/models/bills.js
  5. 50 21
      modules/main/models/project.js
  6. 7 1
      modules/main/models/projectConsts.js
  7. 39 35
      modules/main/models/ration.js
  8. 1 0
      modules/main/routes/project_route.js
  9. 6 7
      modules/rationRepository/controllers/rationChapterTreeController.js
  10. 47 0
      modules/rationRepository/controllers/repositoryGljController.js
  11. 73 0
      modules/rationRepository/models/gljRepository.js
  12. 7 1
      modules/rationRepository/models/rationItem.js
  13. 6 1
      modules/rationRepository/routes/rationRepRoutes.js
  14. 9 0
      public/QueryParam.js
  15. 1 1
      server.js
  16. 32 10
      test/tmp_data/test_project_1.js
  17. 129 0
      test/unit/idTree/idTreeTest.js
  18. 8 0
      test/unit/testProject/testProject.js
  19. 29 3
      web/main/html/main.html
  20. 5 5
      web/main/js/models/bills.js
  21. 4 4
      web/main/js/models/glj.js
  22. 55 18
      web/main/js/models/project.js
  23. 4 4
      web/main/js/models/ration.js
  24. 40 463
      web/rationLibEditor/dinge.html
  25. 40 48
      web/rationLibEditor/gongliao.html
  26. 25 38
      web/rationLibEditor/js/chapterTree.js
  27. 0 39
      web/rationLibEditor/js/gongliao.js
  28. 2 5
      web/rationLibEditor/js/ration.js
  29. 129 0
      web/rationLibEditor/js/repositoryGLJ.js
  30. 1 1
      web/templates/js/bills.js

+ 5 - 5
modules/main/controllers/GLJ_controller.js

@@ -14,9 +14,9 @@ var callback = function(req, res, err, message, data){
 module.exports = {
     getData: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsData.getData(data.projectId, function(err, message, billsList){
+        GLJData.getData(data.projectId, function(err, message, GLJList){
             if (err === 0) {
-                callback(req, res, err, message, billsList);
+                callback(req, res, err, message, GLJList);
             } else {
                 callback(req, res, err, message, null);
             }
@@ -25,9 +25,9 @@ module.exports = {
 
     getItemTemplate: function(req, res){
         //var data = JSON.parse(req.body.data);
-        billsData.getItemTemplate(function(err, message, billsItem){
+        GLJData.getItemTemplate(function(err, message,GLJItem){
             if (billsItem) {
-                callback(req, res, err, message, billsItem);
+                callback(req, res, err, message, GLJItem);
             } else {
                 callback(req, res, err, message, null);
             }
@@ -35,7 +35,7 @@ module.exports = {
     },
 
     allocIDs: function(req, res){
-        billsData.allocIDs(function(err, message, data){
+        GLJData.allocIDs(function(err, message, data){
             if (err) {
                 callback(req, res, err, message, data);
             } else {

+ 10 - 0
modules/main/controllers/project_controller.js

@@ -18,5 +18,15 @@ module.exports = {
                 callback(req, res, err, message, null);
             }
         });
+    },
+    getData: function (req, res) {
+        var data = JSON.parse(req.body.data);
+        Project.getData(data.project_id, function (err, message, result) {
+            if (!err) {
+                callback(req, res, err, message, result);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
     }
 };

+ 41 - 34
modules/main/models/GLJ.js

@@ -4,9 +4,18 @@
 var mongoose = require("mongoose");
 var db = require("../db/project_db");
 var Schema = mongoose.Schema;
+var counter = require("../../../public/counter/counter.js");
+var deleteSchema = require('../../../public/models/deleteSchema');
+var consts = require('./projectConsts');
+var projectConsts = consts.projectConst;
+var commonConsts = consts.commonConst;
 
 var GLJSchema = new Schema({
     ID: Number,
+    GLJID: Number,
+    rGLJID: Number,
+    rationID: Number,
+    billsItemID: Number,
     projectID: Number,
     orgRQuantity: String, //Decimal
     rQuantity: String, //Decimal
@@ -18,19 +27,20 @@ var GLJSchema = new Schema({
     price: String, //Decimal
     tenderQuantity: String, //Decimal
     tenderPrice: String, //Decimal
-    type: Number
+    type: Number,
+    deleteInfo: deleteSchema
     // to do
 
 });
 
-var GLJ = db.model("GLJList", GLJSchema);
+var GLJ = db.model("GLJ", GLJSchema, "GLJ");
 
 var GLJDAO = function(){};
 
-GLJDAO.prototype.getData = function(projectId, callback){
-    GLJ.find({projectId: projectId}, function(err, datas){
+GLJDAO.prototype.getData = function(projectID, callback){
+    GLJ.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
         if (!err) {
-            callback(0, '', datas);
+            callback(0, projectConsts.GLJ, datas);
         } else {
             callback(1, '', null);
         };
@@ -38,32 +48,32 @@ GLJDAO.prototype.getData = function(projectId, callback){
 };
 
 GLJDAO.prototype.save = function(datas, callback){
-    var data, errList = [], updateLength = 0;
-    var updateFunc = function (err, errData) {
-        if (err){
-            errList.push(errData);
-        };
-    };
-    if (datas){
-        for (var i = 0; i < datas.length; i++){
-            data = datas[i];
-            if (data.updateType === 'update') {
-                delete data.updateType;
-                data.save(updateFunc);
-            } else if (data.updateType === 'create') {
-                delete data.updateType;
-                data.save(updateFunc);
-            } else if (data.updateType === 'delete') {
-                delete data.updateType;
-                data.remove(updateFunc);
-            };
-        };
-        if (errList.length > 0){
-            callback(1, errList);
-        } else {
-            callback(0, null);
-        };
-    };
+    var functions = [];
+    var data;
+
+    function saveOne(data) {
+        return function (cb) {
+            switch (doc.updateType) {
+                case commonConsts.UT_UPDATE:
+                    GLJ.update({ID: doc.ID}, doc, cb);
+                    break;
+                case commonConsts.UT_CREATE:
+                    GLJ.create(doc, cb);
+                    break;
+                case commonConsts.UT_DELETE:
+                /* 假删除
+                 var item = new GLJ(doc);
+                 item.remove(cb);
+                 */
+            }
+        }
+    }
+    for (var i = 0; i < datas.length; i++){
+        data = datas[i];
+        functions.push(saveOne(data));
+    }
+
+    async.parallel(functions, callback);
 };
 
 GLJDAO.prototype.getItemTemplate = function(callback){
@@ -72,9 +82,6 @@ GLJDAO.prototype.getItemTemplate = function(callback){
     callback(0, '', data);
 };
 
-const
-    IDStep = 50, IDModule = 'bills';
-
 GLJDAO.prototype.allocIDs = function(IDStep, callback){
     counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, IDStep, function(err, highID){
         var lowID = highID - IDStep + 1;

+ 32 - 28
modules/main/models/bills.js

@@ -6,7 +6,11 @@ var db = require("../db/project_db");
 var subSchema = require("./billsSubSchemas");
 var deleteSchema = require('../../../public/models/deleteSchema');
 var Schema = mongoose.Schema;
+var async = require("async");
 var counter = require("../../../public/counter/counter.js");
+var consts = require('./projectConsts');
+var projectConsts = consts.projectConst;
+var commonConsts = consts.commonConst;
 
 var billsSchema = new Schema({
     ID: Number,
@@ -49,9 +53,9 @@ var billsDAO = function(){};
 billsDAO.prototype.getData = function(projectID, callback){
     bills.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
         if (!err) {
-            callback(0, '', datas);
+            callback(0, projectConsts.BILLS, datas);
         } else {
-            callback(1, '', null);
+            callback(1, projectConsts.BILLS, null);
         };
     });
 };
@@ -78,32 +82,32 @@ billsDAO.prototype.AddBillsFromTemplate = function (datas, callback) {
 };
 
 billsDAO.prototype.save = function(datas, callback){
-    var data, errList = [], updateLength = 0;
-    var updateFunc = function (err, errData) {
-        if (err){
-            errList.push(errData);
-        };
-    };
-    if (datas){
-        for (var i = 0; i < datas.length; i++){
-            data = datas[i];
-            if (data.updateType === 'update') {
-                delete data.updateType;
-                data.save(updateFunc);
-            } else if (data.updateType === 'create') {
-                delete data.updateType;
-                data.save(updateFunc);
-            } else if (data.updateType === 'delete') {
-                delete data.updateType;
-                data.remove(updateFunc);
-            };
-        };
-        if (errList.length > 0){
-            callback(1, errList);
-        } else {
-            callback(0, null);
-        };
-    };
+    var functions = [];
+    var data;
+
+    function saveOne(doc) {
+        return function (cb) {
+            switch (doc.updateType) {
+                case commonConsts.UT_UPDATE:
+                    bills.update({ID: doc.ID}, doc, cb);
+                    break;
+                case commonConsts.UT_CREATE:
+                    bills.create(doc, cb);
+                    break;
+                case commonConsts.UT_DELETE:
+                    /* 假删除
+                    var item = new bills(doc);
+                    item.remove(cb);
+                    */
+            }
+        }
+    }
+    for (var i = 0; i < datas.length; i++){
+        data = datas[i];
+        functions.push(saveOne(data));
+    }
+
+    async.parallel(functions, callback);
 };
 
 billsDAO.prototype.getItemTemplate = function(callback){

+ 50 - 21
modules/main/models/project.js

@@ -5,20 +5,23 @@ var billsData = require('./bills');
 var rationData = require('./ration');
 var GLJData = require('./GLJ');
 var consts = require('./projectConsts');
+var projectConsts = consts.projectConst;
+var async = require("async");
 
 var moduleMap = {};
 
-moduleMap[consts.BILLS] = billsData;
-moduleMap[consts.RATION] = rationData;
-moduleMap[consts.GLJ] = GLJData;
+moduleMap[projectConsts.BILLS] = billsData;
+moduleMap[projectConsts.RATION] = rationData;
+moduleMap[projectConsts.GLJ] = GLJData;
 
 var Project = function (){};
 
 Project.prototype.datas = [];
 
 Project.prototype.prepare = function(data, callback){
-    data.updateData.forEach(function(item){
-        this.datas.push(item);
+    var me = this;
+    data.update_data.forEach(function(item){
+        me.datas.push(item);
         /*
         to do
         moduleMap[item.moduleName].prepare(item.data, jobCallback);
@@ -26,31 +29,57 @@ Project.prototype.prepare = function(data, callback){
     });
 };
 
-Project.prototype.save = function(data, callback){
+Project.prototype.save = function(datas, callback){
     var job, savePoint;
-    var errDatas = [];
-    this.prepare(data, function(job, savePoint){});
+    var functions = [];
+    var item;
 
-    var saveCallback = function(err, moduleName, data){
-        if (err != 0){
-            var errData = {moduleName: moduleName, err: err, data: data};
-            errDatas.push(errData);
+    this.prepare(datas, function(job, savePoint){});
+
+    function saveModule(data) {
+        return function (cb) {
+            moduleMap[data.moduleName].save(data.data, cb);
         }
-    };
+    }
+    for (var i = 0; i < this.datas.length; i++){
+        item = this.datas[i];
+        functions.push(saveModule(item));
+    }
 
-    this.datas.forEach(function(item){
-        moduleMap[item.moduleName].save(item.data, saveCallback);
+    async.parallel(functions, function(err, results) {
+        if (!err){
+            callback(null, '', results)
+        }
+        else{
+            callback(1, 'save project failed', null)
+        }
     });
-
     this.datas = [];
+};
 
-    if (errDatas.length > 0){
-        callback(1, 'error', errDatas)
-    }
-    else{
-        callback(0, '', null)
+Project.prototype.getData = function(projectID, callback){
+    var functions = [];
+    var itemName;
+
+    for (itemName in moduleMap){
+        functions.push((function(itemName){
+            return function (cb) {
+                moduleMap[itemName].getData(projectID, function(err, moduleName, data){
+                    cb(err, {moduleName: moduleName, data: data})
+                })
+            }
+        })(itemName))
     }
 
+    async.parallel(functions, function(err, results) {
+        if (!err){
+            callback(null, '', results)
+        }
+        else{
+            callback(1, 'load project failed', null)
+        }
+    });
+
 };
 
 module.exports = new Project();

+ 7 - 1
modules/main/models/projectConsts.js

@@ -9,4 +9,10 @@ var projectConst = {
 
 };
 
-module.exports = projectConst;
+var commonConst = {
+    UT_UPDATE: 'ut_update',
+    UT_CREATE: 'ut_create',
+    UT_DELETE: 'ut_delete'
+};
+
+module.exports = {projectConst: projectConst, commonConst: commonConst};

+ 39 - 35
modules/main/models/ration.js

@@ -5,6 +5,11 @@ var mongoose = require("mongoose");
 var db = require("../db/project_db");
 var subSchema = require("./billsSubSchemas");
 var Schema = mongoose.Schema;
+var deleteSchema = require('../../../public/models/deleteSchema');
+var counter = require("../../../public/counter/counter.js");
+var consts = require('./projectConsts');
+var projectConsts = consts.projectConst;
+var commonConsts = consts.commonConst;
 
 var rationSchema = new Schema({
     ID: Number,
@@ -17,24 +22,26 @@ var rationSchema = new Schema({
     maskName: String,
     unit: String,
     quantity: String, // Decimal
-    programId: Number,
+    programID: Number,
+    adjustState: String,
     content: String,
     rationProjName: String,
     comments: String,
     // 费用字段
     fees: [subSchema.feesSchema],
     // 标记字段
-    flags: [subSchema.flagsSchema]
+    flags: [subSchema.flagsSchema],
+    deleteInfo: deleteSchema
 });
 
-var ration = db.model("rations", rationSchema);
+var ration = db.model("ration", rationSchema, "ration");
 
 var rationDAO = function(){};
 
-rationDAO.prototype.getData = function(projectId, callback){
-    rations.find({projectID: projectId}, function(err, datas){
+rationDAO.prototype.getData = function(projectID, callback){
+    ration.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
         if (!err) {
-            callback(0, '', datas);
+            callback(0, projectConsts.RATION, datas);
         } else {
             callback(1, '', null);
         }
@@ -42,32 +49,32 @@ rationDAO.prototype.getData = function(projectId, callback){
 };
 
 rationDAO.prototype.save = function(projectId, datas, callback){
-    var data, errList = [], updateLength = 0;
-    var updateFunc = function (err, errData) {
-        if (err){
-            errList.push(errData);
-        };
-    };
-    if (datas){
-        for (var i = 0; i < datas.length; i++){
-            data = datas[i];
-            if (data.updateType === 'update') {
-                delete data.updateType;
-                data.save(updateFunc);
-            } else if (data.updateType === 'create') {
-                delete data.updateType;
-                data.save(updateFunc);
-            } else if (data.updateType === 'delete') {
-                delete data.updateType;
-                data.remove(updateFunc);
-            };
-        };
-        if (errList.length > 0){
-            callback(1, 'update error.', errList);
-        } else {
-            callback(0, '', null);
-        };
-    };
+    var functions = [];
+    var data;
+
+    function saveOne(data) {
+        return function (cb) {
+            switch (doc.updateType) {
+                case commonConsts.UT_UPDATE:
+                    ration.update({ID: doc.ID}, doc, cb);
+                    break;
+                case commonConsts.UT_CREATE:
+                    ration.create(doc, cb);
+                    break;
+                case commonConsts.UT_DELETE:
+                /* 假删除
+                 var item = new ration(doc);
+                 item.remove(cb);
+                 */
+            }
+        }
+    }
+    for (var i = 0; i < datas.length; i++){
+        data = datas[i];
+        functions.push(saveOne(data));
+    }
+
+    async.parallel(functions, callback);
 };
 
 rationDAO.prototype.getItemTemplate = function(callback){
@@ -76,9 +83,6 @@ rationDAO.prototype.getItemTemplate = function(callback){
     callback(0, '', data);
 };
 
-const
-    IDStep = 50, IDModule = 'rations';
-
 rationDAO.prototype.allocIDs = function(IDStep, callback){
     counter.counterDAO.getIDAfterCount(counter.moduleName.ration, IDStep, function(err, highID){
         var lowID = highID - IDStep + 1;

+ 1 - 0
modules/main/routes/project_route.js

@@ -6,5 +6,6 @@ var projectRouter = express.Router();
 var projectController = require('../controllers/project_controller');
 
 projectRouter.post('/save', projectController.save);
+projectRouter.post('/getData', projectController.getData);
 
 module.exports = projectRouter;

+ 6 - 7
modules/rationRepository/controllers/rationChapterTreeController.js

@@ -20,13 +20,12 @@ var callback = function(req,res,err,data){
     }
 }
 module.exports ={
-    getRationChapterTree:
-        function(req,res){
-            var libName = req.body.rationLibName;
-            rationChapterTreeData.getRationChapterTree(libName,function(err,data){
-                callback(req,res,err,data)
-            })
-        },
+    getRationChapterTree: function(req,res){
+        var libName = req.body.rationLibName;
+        rationChapterTreeData.getRationChapterTree(libName,function(err,data){
+            callback(req,res,err,data)
+        })
+    },
     createNewNode: function(req, res){
         var libName = req.body.rationLibName;
         var lastNodeId = req.body.lastNodeId;

+ 47 - 0
modules/rationRepository/controllers/repositoryGljController.js

@@ -0,0 +1,47 @@
+/**
+ * Created by Tony on 2017/5/5.
+ */
+var gljRepository = require("../models/gljRepository");
+
+var callback = function(req,res,err,data){
+    if(data){
+        res.status(200)
+        res.json({success:true,data:data});
+    }
+    else
+    if(err){
+        res.status(500)
+        res.json({success:false,error:err});
+        //res.json(err);
+    }
+    else{
+        res.status(204);
+        res.json({success:true,data:null});
+    }
+}
+module.exports ={
+    getGljTree: function(req,res){
+        var libName = req.body.rationLibName;
+        gljRepository.getGljTypes(libName,function(err,data){
+            callback(req,res,err,data)
+        });
+    },
+    getGljItems: function(req, res) {
+        var repId = req.body.repositoryId,
+            gljType = req.body.type,
+            gljCode = req.body.code;
+        if (gljCode) {
+            gljRepository.getGljItem(repId, gljCode, function(err, data){
+                callback(req,res,err,data)
+            });
+        } else if (gljType) {
+            gljRepository.getGljItemByType(repId, gljType, function(err, data){
+                callback(req,res,err,data)
+            });
+        } else {
+            gljRepository.getGljItemsByRep(repId, function(err, data){
+                callback(req,res,err,data)
+            });
+        }
+    }
+}

+ 73 - 0
modules/rationRepository/models/gljRepository.js

@@ -0,0 +1,73 @@
+/**
+ * Created by Tony on 2017/5/4.
+ * 工料机的总库,根据不同定额库分类,参考原gljList表
+ */
+
+var mongoose = require("mongoose");
+var dbm = require("../../../config/db/db_manager");
+var db = dbm.getCfgConnection("rationRepository")
+var async = require("async");
+var Schema = mongoose.Schema;
+
+var gljTypeSchema = mongoose.Schema({
+    repositoryId: Number,
+    ID: Number,
+    ParentID: Number,
+    NextSiblingID: Number,
+    Name: String
+});
+
+var gljSchema = mongoose.Schema({
+    repositoryId: Number,
+    ID:Number,
+    //以下是基于已有access库
+    code: String,
+    name: String,
+    specs: String,
+    unit: String,
+    basePrice: Number,
+    gljType: Number
+});
+var gljTypeModel = db.model("gljType",gljTypeSchema, "gljType");
+var gljItemModel = db.model("gljRepository",gljSchema, "gljRepository");
+var repositoryMap = require('./repositoryMap');
+var counter = require('../../../public/counter/counter');
+
+var gljItemDAO = function(){};
+gljItemDAO.prototype.getGljTypes = function(repositoryName, callback){
+    repositoryMap.getRealLibName(repositoryName, function(err, rst){
+        if (err || rst.length == 0) {
+            callback("获取定额库错误!",false)
+        } else {
+            gljTypeModel.find({"repositoryId": 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);
+            })
+        }
+    });
+};
+
+gljItemDAO.prototype.getGljItemsByRep = function(repositoryId,callback){
+    gljItemModel.find({"repositoryId": repositoryId},function(err,data){
+        if(err) callback(true, "获取工料机错误!", "")
+        else callback(false,"获取工料机", data);
+    })
+};
+
+gljItemDAO.prototype.getGljItemByType = function(repositoryId, type, callback){
+    gljItemModel.find({"repositoryId": repositoryId, "gljType": type},function(err,data){
+        if(err) callback(true, "获取工料机错误!", "")
+        else callback(false,"获取工料机", data);
+    })
+};
+
+gljItemDAO.prototype.getGljItem = function(repositoryId, code, callback){
+    gljItemModel.find({"repositoryId": repositoryId, "code": code},function(err,data){
+        if(err) callback(true, "获取工料机错误!", "")
+        else callback(false,"获取工料机", data);
+    })
+};
+
+module.exports = new gljItemDAO();
+

+ 7 - 1
modules/rationRepository/models/rationItem.js

@@ -7,6 +7,11 @@ var db = dbm.getCfgConnection("rationRepository")
 var async = require("async");
 var Schema = mongoose.Schema;
 
+var rationGljItemSchema = mongoose.Schema({
+    gljId: Number,
+    consumeAmt: Number,
+    proportion: Number //配合比,暂时无需使用,默认0
+});
 var rationItemSchema = mongoose.Schema({
     ID:Number,
     //以下是基于已有access库
@@ -16,7 +21,8 @@ var rationItemSchema = mongoose.Schema({
     basePrice: Number,
     sectionId: Number,
     caption: String,
-    feeType: Number
+    feeType: Number,
+    rationGljList: [rationGljItemSchema]
 });
 var rationItemModel = db.model("rationItems",rationItemSchema, "rationItems")
 var counter = require('../../../public/counter/counter');

+ 6 - 1
modules/rationRepository/routes/rationRepRoutes.js

@@ -3,11 +3,12 @@
  */
 var express = require("express");
 var apiRouter =express.Router();
-var _rootDir = __dirname;
+//var _rootDir = __dirname;
 
 var rationRepositoryController = require("../controllers/rationRepositoryController");
 var rationChapterTreeController = require("../controllers/rationChapterTreeController");
 var rationController = require("../controllers/rationController");
+var repositoryGljController = require("../controllers/repositoryGljController");
 
 apiRouter.post("/getRationDisplayNames",rationRepositoryController.getDisPlayRationLibs);
 apiRouter.post("/editRationLibs",rationRepositoryController.updateRationRepositoryName);
@@ -23,4 +24,8 @@ apiRouter.post("/deleteNodes",rationChapterTreeController.deleteNodes);
 apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
 apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
 
+apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
+apiRouter.post("/getGljItems",repositoryGljController.getGljItems);
+
+
 module.exports = apiRouter;

+ 9 - 0
public/QueryParam.js

@@ -0,0 +1,9 @@
+/**
+ * Created by Tony on 2017/5/5.
+ */
+
+function getQueryString(key){
+    var reg = new RegExp("(^|&)"+key+"=([^&]*)(&|$)");
+    var result = window.location.search.substr(1).match(reg);
+    return result?decodeURIComponent(result[2]):null;
+}

+ 1 - 1
server.js

@@ -145,7 +145,7 @@ app.get('/rationRepository/ration', function(req, res) {
             userID: req.session.userID
         });
 });
-app.get('/rationRepository/gongliao', function(req, res) {
+app.get('/rationRepository/lmm', function(req, res) {
     res.render('rationLibEditor/gongliao.html',
         {
             userAccount: req.session.userAccount,

Файловите разлики са ограничени, защото са твърде много
+ 32 - 10
test/tmp_data/test_project_1.js


+ 129 - 0
test/unit/idTree/idTreeTest.js

@@ -0,0 +1,129 @@
+/**
+ * Created by Mai on 2017/4/1.
+ */
+
+const fs = require('fs');
+var test = require('tape');
+var idTreeUtil = null;
+var idTreeSetting = {
+    id: 'ID',
+    pid: 'ParentID',
+    nid: 'NextSiblingID',
+    rootId: -1,
+    autoUpdate: false
+};
+var testTreeData = null;
+var testTree = null;
+
+var getKeyIDs = function (node) {
+    var data = [];
+    if (node) {
+        data.push(node.getID());
+        data.push(node.getParentID());
+        data.push(node.getNextSiblingID());
+    } else {
+        for (var i = 1; i <= 3; i++) {
+            data.push(-1);
+        }
+    }
+    return data;
+}
+
+test('loading idTree Module: ', function (t) {
+    var idTreeCode = fs.readFileSync(__dirname + '../../../../public/web/idTree.js', 'utf8', 'r');
+    eval(idTreeCode);
+    idTreeUtil = idTree;
+    t.pass('pass for loading idTree Module');
+    t.end();
+});
+
+test('loading Testing Data: ', function (t) {
+    var idTreeDataCode = fs.readFileSync(__dirname + '../../../tmp_data/data_15690.js', 'utf8', 'r');
+    eval(idTreeDataCode);
+    testTreeData = datas;
+    t.pass('pass for loading Testing Data');
+    t.end();
+});
+
+test('idTree loading Testing Data: ', function (t) {
+    t.plan(1);
+    testTree = idTreeUtil.createNew(idTreeSetting);
+    testTree.loadDatas(testTreeData);
+    t.equal(testTree.count(), testTreeData.length);
+    t.end();
+});
+
+test('upMove Node: ', function (t) {
+    t.plan(3);
+    var testNodeID = 13431;
+    var testResult = [[13429, 13427, 13431], [13430, 13427, 13432], [13431, 13427, 13430]];
+    var node = testTree.findNode(testNodeID), pre = node.preSibling, prePre = pre ? pre.preSibling : null;
+    node.upMove();
+    t.deepEqual(getKeyIDs(prePre), testResult[0]);
+    t.deepEqual(getKeyIDs(pre), testResult[1]);
+    t.deepEqual(getKeyIDs(node), testResult[2]);
+    t.end();
+});
+
+test('downMove Node: ', function (t) {
+    t.plan(3);
+    var testNodeID = 13431;
+    var testResult = [[13429, 13427, 13430], [13430, 13427, 13431], [13431, 13427, 13432]];
+    var node = testTree.findNode(testNodeID), pre = node.preSibling, next = node.nextSibling;
+    node.downMove();
+    t.deepEqual(getKeyIDs(pre), testResult[0]);
+    t.deepEqual(getKeyIDs(next), testResult[1]);
+    t.deepEqual(getKeyIDs(node), testResult[2]);
+    t.end();
+});
+
+test('upLevel Node: ', function (t) {
+    t.plan(4);
+    var testNodeID = 13431;
+    var node = testTree.findNode(testNodeID), orgPre = node.preSibling, orgNext = node.nextSibling, orgParent = node.parent;
+    var orgChildrenCount = node.children.length, orgNextSiblingCount = orgParent.children.length - node.siblingIndex() - 1;
+    node.upLevel();
+    t.equal(orgNext.parent, node);
+    t.equal(node.children.length, orgChildrenCount + orgNextSiblingCount);
+    t.equal(orgPre.nextSibling, null);
+    t.equal(orgParent.nextSibling, node);
+    t.end();
+});
+
+test('downLevel Node: ', function (t) {
+    t.plan(4);
+    var testNodeID = 13431;
+    var node = testTree.findNode(testNodeID), orgPre = node.preSibling, orgNext = node.nextSibling, orgParent = node.parent;
+    var newPre = orgPre.lastChild();
+    node.downLevel();
+    t.equal(orgPre.nextSibling, orgNext);
+    t.equal(orgPre.lastChild(), node);
+    t.equal(newPre.nextSibling, node);
+    t.equal(node.nextSibling, null);
+    t.end();
+});
+
+test('insert Node: ', function (t) {
+    t.plan(5);
+    var parent = testTree.findNode(13574), next = testTree.findNode(13598);
+    var orgTreeCount = testTree.count(), orgParentChildrenCount = parent.children.length, orgNextPre = next.preSibling;
+    var newNode = testTree.insert(parent.getID(), next.getID());
+    t.equal(testTree.count(), orgTreeCount + 1);
+    t.equal(parent.children.length, orgParentChildrenCount + 1);
+    t.equal(orgNextPre.nextSibling, newNode);
+    t.equal(newNode.parent, parent);
+    t.equal(newNode.nextSibling, next);
+    t.end();
+});
+
+test('delete Node: ', function (t) {
+    t.plan(3);
+    var testNodeID = 13598;
+    var node = testTree.findNode(testNodeID), orgParent = node.parent, orgPre = node.preSibling, orgNext = node.nextSibling;
+    var orgTreeCount = testTree.count(), orgParentChildrenCount = orgParent.children.length;
+    testTree.delete(node);
+    t.equal(testTree.count(), orgTreeCount - node.posterityCount() - 1);
+    t.equal(orgParent.children.length, orgParentChildrenCount - 1);
+    t.equal(orgPre.nextSibling, orgNext);
+    t.end();
+});

+ 8 - 0
test/unit/testProject/testProject.js

@@ -0,0 +1,8 @@
+/**
+ * Created by jimiz on 2017/4/26.
+ */
+var billsData = require('./bills');
+var rationData = require('./ration');
+var GLJData = require('./GLJ');
+var consts = require('./projectConsts');
+

+ 29 - 3
web/main/html/main.html

@@ -525,6 +525,7 @@
 
     <script type="text/javascript" src="public/web/idTree.js"></script>
     <script type="text/javascript" src="web/main/js/models/cache_tree.js"></script>
+    <script type="text/javascript" src="/test/tmp_data/data_15690.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>
@@ -629,8 +630,33 @@
             data.flags.push({fieldName: 'isPartGather', flag: false});
         });*/
 
-        project = PROJECT.createNew();
-        CommonAjax.post('/bills/getData', {projectId: scUrlUtil.GetQueryString('project')}, function (bills) {
+        project = PROJECT.createNew(scUrlUtil.GetQueryString('project'), null/* to do: userID*/);
+        project.loadDatas(function (err) {
+            if (!err) {
+                controller = TREE_SHEET_CONTROLLER.createNew(project.mainTree, billsSpread.getActiveSheet(), BillsGridSetting);
+                //controller = TREE_SHEET_CONTROLLER.createNew(project.Bills.tree, billsSpread.getActiveSheet(), BillsGridSetting);
+
+                controller.showTreeData();
+                controller.bind('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'));
+                });
+            }
+            else {
+
+            }
+        });
+        /*CommonAjax.post('/bills/getBills', {}, function (bills) {
             project.Bills.loadDatas(bills);
             project.Ration.loadDatas([]);
             //project.Rations.loadDatas(drawing_data);
@@ -654,7 +680,7 @@
                 showButton(tree.selected && tree.selected.canDownMove(), $('#downMove'));
                 showButton(tree.selected ? true : false, $('#delete'));
             });
-        });
+        });*/
 
         $('#insert').click(function () {
             var selected = controller.tree.selected;

+ 5 - 5
web/main/js/models/bills.js

@@ -18,7 +18,7 @@ var Bills = {
         var bills = function (proj) {
             this.project = proj;
             this.datas = null;
-            this.tree = idTree.createInit(billsTreeSetting);
+            this.tree = idTree.createNew(billsTreeSetting);
 
             var sourceType = ModuleNames.bills;
             this.getSourceType = function () {
@@ -28,7 +28,7 @@ var Bills = {
         };
 
         // 从后台获取数据
-        bills.prototype.pullData = function (){
+        /*bills.prototype.pullData = function (){
             this.project.pullData(
                 '/bills/getData',
                 {projectID: this.project.ID},
@@ -41,12 +41,12 @@ var Bills = {
                         alert(result.message);
                     }
                 },
-                function (){/* to do: 错误处理需要细化*/}
+                function (){}// to do: 错误处理需要细化
             )
-        };
+        };*/
 
         // prototype用于定义public方法
-        bills.prototype.loadDatas = function (datas) {
+        bills.prototype.loadData = function (datas) {
             this.datas = datas;
             // generate Fees & Flags Index, For View & Calculate
             this.datas.forEach(function (data) {

+ 4 - 4
web/main/js/models/glj.js

@@ -19,7 +19,7 @@ var GLJ = {
         };
 
         // 从后台获取数据
-        glj.prototype.pullData = function (){
+        /*glj.prototype.pullData = function (){
             this.project.pullData(
                 '/glj/getData',
                 {projectID: this.project.ID},
@@ -32,11 +32,11 @@ var GLJ = {
                         alert(result.message);
                     }
                 },
-                function (){/* to do: 错误处理需要细化*/}
+                function (){}//to do: 错误处理需要细化
             )
-        };
+        };*/
         // prototype用于定义public方法
-        glj.prototype.loadDatas = function (datas) {
+        glj.prototype.loadData = function (datas) {
             this.datas = datas;
         };
 

+ 55 - 18
web/main/js/models/project.js

@@ -5,31 +5,51 @@ var PROJECT = {
     createNew: function (projectID, userID) {
         // 定义private方法
         var tools = {
+            _project: null,
             _ID: projectID,
             _userID: userID,
             updateLock: 0,
             updateData: [],
             operation: '',
-            modules: {},
+            modules: {}
+        };
 
-            doAfterUpdate: function(result){
-                result.forEach(function(item){
-                    if (item.moduleName in this.modules){
-                        this.modules[item.moduleName].doAfterUpdate(item.err, item.data);
-                    }
-                });
-            }
+        var me = tools;
+        tools.doAfterUpdate = function(result){
+            result.forEach(function(item){
+                if (me.modules[item.moduleName]){
+                    me.modules[item.moduleName].doAfterUpdate(item.err, item.data);
+                }
+            });
         };
+        tools.doAfterLoad = function(result, callback){
+            result.forEach(function(item){
+                if (me.modules[item.moduleName]){
+                    me.modules[item.moduleName].loadData(item.data);
+                }
+            });
+            me._project.loadMainTree();
+            //me.test(result[0].data[0]);
+            callback(0);
+        };
+        /*tools.test = function(data){
+            me._project.beginUpdate('修改名称');
+            data.name = 'test';
+            data['updateType'] = 'ut_update';
+            me._project.push(ModuleNames.bills, [data]);
+            me._project.endUpdate();
+        };*/
 
         // 所有通过this访问的属性,都不应在此单元外部进行写入操作
         var project = function () {
-            this.mainTree = cacheTree.createInit(this);
+            tools._project = this;
+            this.mainTree = cacheTree.createNew(this);
 
             this.Bills = Bills.createNew(this);
             this.Ration = Ration.createNew(this);
             this.GLJ = GLJ.createNew(this);
 
-            this.masterField = {ration: 'BillsID'};
+            this.masterField = {ration: 'billsItemID'};
         };
 
         // prototype用于定义public方法
@@ -75,7 +95,7 @@ var PROJECT = {
         };
 
         // 提供给各模块调用的统一从后台获取数据的方法
-        project.prototype.pullData = function (url, data, successCallback, errorCallback) {
+        /*project.prototype.pullData = function (url, data, successCallback, errorCallback) {
             $.ajax({
                 type:"POST",
                 url: url,
@@ -91,14 +111,31 @@ var PROJECT = {
                     errorCallback();
                 }
             });
-        };
+        };*/
 
         // 所有模块在此从后台获取数据
-        project.prototype.loadDatas = function (){
-            this.Bills.pullData();
-            this.Ration.pullData();
-            this.GLJ.pullData();
-
+        project.prototype.loadDatas = function (callback){
+            $.ajax({
+                type: "POST",
+                url: '/project/getData',
+                data: {'data': JSON.stringify({
+                    "project_id": tools._ID
+                })},
+                dataType: 'json',
+                cache: false,
+                timeout: 50000,
+                success: function (result) {
+                    if (!result.error) {
+                        tools.doAfterLoad(result.data, callback);
+                    } else {
+                        alert('error: ' + result.message);
+                        callback(result.error);
+                    }
+                },
+                error: function(jqXHR, textStatus, errorThrown){
+                    alert('error ' + textStatus + " " + errorThrown);
+                }
+            });
         };
 
         project.prototype.beginUpdate = function(operation){
@@ -128,7 +165,7 @@ var PROJECT = {
                     cache: false,
                     timeout: 50000,
                     success: function (result) {
-                        if (result.error === 0) {
+                        if (!result.error) {
                             tools.doAfterUpdate(result.data);
                         } else {
                             alert('error: ' + result.message);

+ 4 - 4
web/main/js/models/ration.js

@@ -20,7 +20,7 @@ var Ration = {
         };
 
         // 从后台获取数据
-        ration.prototype.pullData = function (){
+        /*ration.prototype.pullData = function (){
             this.project.pullData(
                 '/ration/getData',
                 {projectID: this.project.ID},
@@ -33,11 +33,11 @@ var Ration = {
                         alert(result.message);
                     }
                 },
-                function (){/* to do: 错误处理需要细化*/}
+                function (){}//to do: 错误处理需要细化
             )
-        };
+        };*/
         // prototype用于定义public方法
-        ration.prototype.loadDatas = function (datas) {
+        ration.prototype.loadData = function (datas) {
             this.datas = datas;
             // generate Fees & Flags Index,For View & Calculate
             this.datas.forEach(function (data) {

+ 40 - 463
web/rationLibEditor/dinge.html

@@ -25,14 +25,13 @@
         <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 active px-3" href="rationLib">定额</a> zepadd  -->
                       <a class="nav-link active px-3" id ="dinge" >定额</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link px-3" id="gongliao">工料机</a>
+                      <a class="nav-link px-3" id="gongliao" href="/rationLibEditor/lmm">工料机</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link px-3" id="fuzhu">附注条件</a>
+                      <a class="nav-link px-3" id="fuzhu" href="/rationLibEditor/fuzhu">附注条件</a>
                   </li>
                   <li class="nav-item">
                       <a class="nav-link px-3" href="#maz">安装增加费</a>
@@ -882,473 +881,51 @@
     <script type="text/javascript" src="/web/rationLibEditor/js/ration.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/rationGLJ.js"></script>
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
-    <SCRIPT type="text/javascript">
-/*var rationName = getQueryString("rationname");*/
-var treeObj;
-var setting = {
-    view: {
-        //	showIcon: showIconForTree,//已存在*/
-        addHoverDom: zTreeOprObj.addHoverDom,
-        removeHoverDom: zTreeOprObj.removeHoverDom,
-        expandSpeed: "",
-        selectedMulti: false
-    },
-    edit: {
-        enable: true,
-        editNameSelectAll: true,
-        showRemoveBtn: true,
-        showRenameBtn: true
-    },
-    data: {
-        keep: {
-            parent:true,
-            leaf:true
-        },
-        key: {
-            children: "items"
-        },
-        simpleData: {
-            enable: true,
-            idKey: "ID",
-            pIdKey: "ParentID",
-            rootPId: -1
-        }
-    },
-    callback:{
-        onClick: zTreeOprObj.onClick,
-        beforeDrag: zTreeOprObj.beforeDrag,
-        beforeRename: zTreeOprObj.beforeRename,
-        beforeRemove: zTreeOprObj.onBeforeRemove,
-        onRemove: zTreeOprObj.onRemove,
-        onRename: zTreeOprObj.onRename
-    }
-};
-var log, className = "dark";
-var properties = {
-}
-//点击树获取定额
-function SectionClick(event,treeId,treeNode){
-    var sectionID = treeNode.id;
-    properties.selectedSection =sectionID
-    getRationItems(sectionID);
-}
-
-function selectAll() {
-    var zTree = $.fn.zTree.getZTreeObj("rationChapterTree");
-    zTree.setting.edit.editNameSelectAll =  $("#selectAll").attr("checked");
-}
-
-
-//新增定额事件
-$("#mkadd").click(function(){
-    var section = treeObj.getSelectedNodes();
-    if(!section.length){
-        alert("请选择需要添加定额的章节!")
-        return;
-    }
-})
-$("#mkaddglj").click(function() {
-    var s = $("#gljparam").val()
-    if (!s) {
-        alert("请选择需要添加工料机的定额!")
-        return;
-    }
-})
-$("#rationAdd").click(function(){
-    var section = treeObj.getSelectedNodes();
-    var rationItem = {};
-    var code,name,danwei,jijia,xsname,qfzy;
-    code = $("#code").val();name = $("#name").val();danwei=$("#danwei").val();jijia = $("#jijia").val();xsname = $("#xsname").val();qfzy=$("#qfzy").val();
-    rationItem.RationCode = code;
-    rationItem.RationName = name;
-    rationItem.Unit = danwei;
-    rationItem.BasePrice = Number(jijia);
-    rationItem.SectionID = section[0].id;
-    rationItem.ContentID = 0;
-    rationItem.Caption = xsname;
-    rationItem.FeeType = Number(qfzy)
-    saveRationItem(rationItem);
-/*    bindRationDelete()
-    bindRationClick();*/
-})
-//保存定额条目Ajax函数
-function saveRationItem(obj){
-    var rationItem = JSON.stringify(obj)
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/rationLibEditor/saveRationItem",
-        data:{"rationName":rationName,"rationItem":rationItem},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-            getRationItems(properties.selectedSection);
-        },
-        error: function(jqXHR, textStatus, errorThrown){
-          var err = JSON.parse(jqXHR.responseText);
-            alert(err.error);
-        }
-    })
-}
-//获取定额条目Ajax函数
-function getRationItems(sectionID){
-    $("#rationTbody").html("")
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/getRationsBySectionID",
-        data:{"rationName": rationName,"sectionID": sectionID},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-            if(result){
-                showRationItems(result.data);
-            }
-
-        },
-        error:function(){
-        }
-    })
-}
-//显示定额条目
-function showRationItems(data){
-    //var RationJSONStr = JSON.stringify(data);
-    var spread = $("#rationItemsSheet").data("workbook");
-    spread.fromJSON(data);
-
-}
-//绑定点击定额号
-function bindRationClick(){
-    var tr = $("#rationTbody tr");
-    var td = $("td:eq(1)",tr);
-    td.each(function() {
-        var a;
-        a = $('a', $(this));
-        var str = a.text();
-        a.click(function(){
-            $("#gljparam").val(str);
-            properties.selectedRation = str;
-            getRationGLJItems(str)
-        })
-        })
-}
-//获取定额工料机
-function getRationGLJItems(str){
-    var GLJTags = [];
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/getRationGLJItems",
-        async: false,
-        data:{"rationName": rationName,"rationCode":str},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result,status){
-            if(result){
-                var rationGLJs = result.data;
-                for(var i=0;i<rationGLJs.length;i++){
-                    var TagItem = {};
-                    TagItem.dexh = rationGLJs[i].Amount;
-                    var gljCode = rationGLJs[i].GLJCode;
-                    $.ajax({
-                        type:"POST",
-                        url:"http://localhost:6060/ration/getGLJItem",
-                        async: false,
-                        data:{"rationName": rationName,"GLJCode":gljCode},
-                        dataType:"json",
-                        cache:false,
-                        timeout:1000,
-                        success:function(result1){
-                            TagItem.GLJ = result1.data[0];
-                            GLJTags[i] = TagItem;
-                        },
-                        error:function(){
-
-                        }
-                    })
-                }
-            }
-
-        },
-        error:function(){
-        }
-    })
-    showRationGLJ(GLJTags)
-
-}
-//为每条定额工料机绑定删除事件
-function bindRationGLJDelete(){
-    $("#rationGLJTbody tr").each(function() {
-        var td7, a1,td1,a2;
-        td7 = $("td:eq(7)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("a:eq(1)",td7);
-        a2.click(function(){
-            $("#delType").val("rationGLJ");
-            $("#delParam").val(str);
-        })
-    })
-}
-//为每条定额绑定编辑事件
-function bindRationEdit(){
-    $("#rationTbody tr").each(function() {
-        var td7,td1,a2;
-        td7 = $("td:eq(7)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("a:eq(0)",td7);
-        a2.click(function(){
-            properties.Edit = "ration";
-            properties.EditParam =str;
-            $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/getRationByCode",
-                data:{"rationName": rationName,"RationCode":str},
-                dataType:"json",
-                cache:false,
-                timeout:5000,
-                success:function(result){
-                    var ration = result.data[0];
-                    $("#ERcode").val(ration.RationCode).attr("disabled",true);
-                    $("#ERname").val(ration.RationName);
-                    $("#ERdanwei").find("option:selected").text(ration.Unit);
-                    $("#ERjijia").val(ration.BasePrice).attr("disabled",true);
-                    $("#ERxsmc").val(ration.Caption);
-                    $("#ERqfzy").val(ration.FeeType);
+    <script type="text/javascript" src="/public/QueryParam.js"></script>
+    <script type="text/javascript">
+        var setting = {
+            view: {
+                addHoverDom: zTreeOprObj.addHoverDom,
+                removeHoverDom: zTreeOprObj.removeHoverDom,
+                expandSpeed: "",
+                selectedMulti: false
+            },
+            edit: {
+                enable: true,
+                editNameSelectAll: true,
+                showRemoveBtn: true,
+                showRenameBtn: true
+            },
+            data: {
+                keep: {
+                    parent:true,
+                    leaf:true
                 },
-                error:function(err){
-                }
-            })
-
-        })
-    })
-}
-//绑定定额消耗编辑事件
-function bindRGLJAmountEdit(){
-    $("#rationGLJTbody tr").each(function() {
-        var td5, td1, a2,amount;
-        var value = $("#gljparam").val();
-        td5 = $("td:eq(5)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("input", td5);
-
-        a2.blur(function () {
-            if(isNaN(a2.val()))
-            alert("请输入数值!");
-            else
-            $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/editRGLJAmount",
-                dataType:"json",
-                data:{"rationName":rationName,"GLJCode":str,"RationCode":value,"Amount":Number(a2.val())},
-
-                cache:false,
-                timeout:50000,
-                success:function(result){
-                  //  getRationItems(properties.selectedSection);
-                    getRationGLJItems(value);
+                key: {
+                    children: "items"
                 },
-                error:function(iqXHR,textStatus,errorThrown){
-                    alert("error "+textStatus+" "+errorThrown);
+                simpleData: {
+                    enable: true,
+                    idKey: "ID",
+                    pIdKey: "ParentID",
+                    rootPId: -1
                 }
-            })
-        })
-    })
-
-}
-$("#Rbianji").click(function(){//设置定额号不可编辑
-
-    var ERcode,ERname,ERdanwei,ERjijia,ERxsmc,ERqfzy,ration={};
-    ERcode=$("#ERcode").val();
-    ERname=$("#ERname").val();
-    ERdanwei=$("#ERdanwei").val();
-    ERjijia=$("#ERjijia").val();
-    ERxsmc = $("#ERxsmc").val();
-    ERqfzy=$("#ERqfzy").val();
-    ration.RationCode = ERcode;
-    ration.RationName = ERname;
-    ration.Unit = ERdanwei;
-    ration.BasePrice = Number(ERjijia);
-    ration.SectionID = properties.selectedSection;
-    ration.ContentID = 0;
-    ration.Caption = ERxsmc;
-    ration.FeeType =Number(ERqfzy);
-    var rationItem = JSON.stringify(ration);
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/editRationItem",
-        dataType:"json",
-        data:{"rationName":rationName,"RationCode":properties.EditParam,"newRation":rationItem},
-        cache:false,
-        timeout:50000,
-        success:function(result){
-            getRationItems(properties.selectedSection);
-        },
-        error:function(iqXHR,textStatus,errorThrown){
-            alert("error "+textStatus+" "+errorThrown);
-        }
-    })
-})
-//为每条定额绑定删除事件
-function bindRationDelete(){
-    $("#rationTbody tr").each(function() {
-        var td7, a1,td1,a2;
-        td7 = $("td:eq(7)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("a:eq(1)",td7);
-        a2.click(function(){
-            $("#delType").val("ration");
-            $("#delParam").val(str);
-        })
-    })
-}
-//删除定额或定额工料机
-$("#shanchu").click(function(){
-    var type = $("#delType").val();
-    var value = $("#delParam").val();
-    switch(type){
-        case "ration":
-        {$.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/deleteRation",
-                data:{"rationName": rationName,"type":type,"value":value},
-                async:false,
-                dataType:"json",
-                cache:false,
-                timeout:1000,
-                success:function(result){
-                    getRationItems(properties.selectedSection);
-                    getRationGLJItems(value)
-                },
-                error:function(){
-                    alert("nima")
-                }
-            })
-            break;}
-        case "rationGLJ":
-        { $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/deleteRationGLJ",
-                data:{"rationName": rationName,"type":type,"value":value},
-                async:false,
-                dataType:"json",
-                cache:false,
-                timeout:1000,
-                success:function(result){
-                   var s =  $("#gljparam").val();
-                    getRationGLJItems(s)
-                },
-                error:function(){
-                    alert("nima")
-                }
-            })
-            break;}
-    }
-
-})
-//显示定额工料机条目
-function showRationGLJ(obj){
-    $("#bglj tbody tr").html("");
-    var Baseprice = 0;
-    for(var i=0;i<obj.length;i++){
-        var code,name,danwei,jijia,dexh,leixing;
-        code = obj[i].GLJ.GLJCode;
-        name = obj[i].GLJ.GLJName;
-        danwei = obj[i].GLJ.Unit;
-        jijia = obj[i].GLJ.BasePrice;
-        dexh = obj[i].dexh;
-        Baseprice = Baseprice + Number(jijia)*Number(dexh);
-        leixing =obj[i].GLJ.Type;
-        var $tr = $('<tr><td></td><td></td><td></td><td></td><td></td><td><input></td><td></td><td> <a href="javacript:void(0);" data-toggle="modal" data-target="#del" class="text-danger" title="删除"><i class="fa fa-remove"></i></a></td> </tr>')
-        //<a href="javacript:void(0);" data-toggle="modal" data-target="#editBglj" title="编辑"><i class="fa fa-pencil-square-o"></i></a>
-        var td0,td1,td2,td3,td4,td5,td6,a;
-        td0 = $("td:eq(0)",$tr), td1 = $("td:eq(1)",$tr);td2 = $("td:eq(2)",$tr);td3 = $("td:eq(3)",$tr);td4 = $("td:eq(4)",$tr);td5 = $("td:eq(5)",$tr);a=$("input",td5);td6 = $("td:eq(6)",$tr);
-        td0.text(i); td1.text(code);td2.text(name);td3.text(danwei);td4.text(jijia);a.val(dexh);td6.text(leixing)
-        $tr.appendTo("#bglj tbody");
-    }
-    var s = $("#gljparam").val()
-    $("#rationTbody tr").each(function(){
-        var td = $("td:eq(1)",$(this))
-        var s1 = td.text();
-
-        if ( s  == s1){
-            td.next().next().next().text(Baseprice.toFixed(2));
-            $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/setRationBasePrice",
-                data:{"rationName": rationName,"rationCode":s,"BasePrice":Baseprice.toFixed(2)},
-                dataType:"json",
-                cache:false,
-                timeout:1000,
-                success:function(result){
-
-                },
-                error:function(err){
-
-                }
-            })
-        }
-
-    })
-    bindRGLJAmountEdit();
-    bindRationGLJDelete();
-}
-//添加定额工料机ajax函数
-$("#bt-glj").click(function(){
-    var rationGLJ = {};
-    rationGLJ.RationCode = $("#gljparam").val();
-    rationGLJ.GLJCode = $("#bt-inputCode").val();
-    rationGLJ.Amount =Number($("#gljxh").val());
-    rationGLJ.Type = Number($("#gljlx").val()) ;
-    var rationglj = JSON.stringify(rationGLJ);
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/saveRationGLJ",
-        data:{"rationName": rationName,"rationGLJ":rationglj},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-           getRationGLJItems($("#gljparam").val())
-        },
-        error:function(err){
-            var error = JSON.parse(err.responseText);
-            alert(error.error);
-        }
-    })
-})
-//输入工料机编号自动获取工料机信息
-$("#bt-inputCode").blur(function(){
-    var gljCode = $("#bt-inputCode").val();
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/getGLJByCode",
-        data:{"rationName": rationName,"gljCode":gljCode},
-        dataType:"json",
-        cache:false,
-        timeout:5000,
-        success:function(result){
-          var glj = result.data[0];
-            $("#gljName").val(glj.GLJName).attr("disabled",true);
-            $("#gljdw").find("option:selected").text(glj.Unit).attr("disabled","disabled");
-            $("#gljdj").val(glj.BasePrice).attr("disabled",true);
-            $("#gljlx").val(glj.Type).attr("disabled","disabled");
-        },
-        error:function(err){
-            var error = JSON.parse(err.responseText);
-            alert(error.error);
-        }
-    })
-})
-  	</SCRIPT>
+            },
+            callback:{
+                onClick: zTreeOprObj.onClick,
+                beforeDrag: zTreeOprObj.beforeDrag,
+                beforeRename: zTreeOprObj.beforeRename,
+                beforeRemove: zTreeOprObj.onBeforeRemove,
+                onRemove: zTreeOprObj.onRemove,
+                onRename: zTreeOprObj.onRename
+            }
+        };
+  	</script>
 </body>
 <script type="text/javascript">
     autoFlashHeight();
     $(document).ready(function(){
-        pageOprObj.initParam();
+        pageOprObj.initPage();
         rationOprObj.buildSheet($("#rationItemsSheet")[0]);
         rationGLJOprObj.buildSheet($("#rationGLJSheet")[0]);
     });

+ 40 - 48
web/rationLibEditor/gongliao.html

@@ -9,6 +9,7 @@
     <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">
+    <link rel="stylesheet" href="/web/css/spreadjs/gc.spread.sheets.10.0.1.css" type="text/css">
     <!--zTree-->
   	<link rel="stylesheet" href="/web/css/ztree/zTreeStyle.css" type="text/css">
 </head>
@@ -22,13 +23,13 @@
         <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" id="drirect-dinge" href="rationLib">定额</a>
+                      <a class="nav-link px-3" id="drirect-dinge" href="/rationLibEditor/ration">定额</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link active px-3" href="gongliao">工料机</a>
+                      <a class="nav-link active px-3">工料机</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link px-3" href="fuzhu">附注条件</a>
+                      <a class="nav-link px-3" href="/rationLibEditor/fuzhu">附注条件</a>
                   </li>
                   <li class="nav-item">
                       <a class="nav-link px-3" href="#maz">安装增加费</a>
@@ -39,32 +40,13 @@
     <div class="main">
         <div class="content">
             <div class="container-fluid">
-                <div class="row">
+                <div class="row" style="height: 660px">
                   <div class="main-side col-lg-3 p-0">
                     <div class="tab-content">
-                      <ul id="treeDemo" class="ztree"></ul>
+                      <ul id="repositoryTree" class="ztree"></ul>
                     </div>
                   </div>
                   <div id="GLJListSheet" class="main-content col-lg-9 p-0">
-          <!--       <table class="table table-sm table-bordered m-0">
-                      <thead>
-                        <tr>
-                          <th></th>
-                          <th>编码</th>
-                          <th>名称</th>
-                          <th>规格</th>
-                          <th>单位</th>
-                          <th>基价单价</th>
-                          <th>类型</th>
-                          <th>操作</th>
-                        </tr>
-                      </thead>
-                      <tbody>
-
-                      </tbody>
-                    </table>
-                    <div class="m-2"><a href="javacript:void(0);" data-toggle="modal" data-target="#add"  class="btn btn-primary btn-sm">添加</a></div>
-                    -->
                   </div>
                 </div>
             </div>
@@ -195,33 +177,43 @@
     <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.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="/web/rationLibEditor/js/gongliao.js"></script>
-    <SCRIPT type="text/javascript">
-  		<!--
-var setting = {
-    view: {
-        showIcon: false
-    },
-    data: {
-        simpleData: {
-            enable: true
-        }
-    }
-};
-var zNodes =[
-{ id:1, pId:0, name:"全部", open:true},
-    { id:11, pId:1, name:"人工"},
-    { id:111, pId:1, name:"材料"},
-    { id:112, pId:1, name:"机械"}
-    ];
-function showIconForTree(treeId, treeNode) {
-    return !treeNode.isParent;
-};
-  		//-->
-  	</SCRIPT>
+    <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
+    <script type="text/javascript" src="/public/QueryParam.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/repositoryGLJ.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/sheetCommon.js"></script>
+    <script type="text/javascript">
+        var setting = {
+            view: {
+                showIcon: true
+            },
+            data: {
+                keep: {
+                    parent:true,
+                    leaf:true
+                },
+                key: {
+                    children: "items",
+                    name: "Name"
+                },
+                simpleData: {
+                    enable: true,
+                    idKey: "ID",
+                    pIdKey: "ParentID",
+                    rootPId: -1
+                }
+            },
+            callback:{
+                //onClick: zTreeOprObj.onClick,
+            }
+        };
+  	</script>
 </body>
 <script type="text/javascript">
     autoFlashHeight();
+    $(document).ready(function(){
+        pageOprObj.initPage();
+        repositoryGljObj.buildSheet($("#GLJListSheet")[0]);
+    });
 </script>
 
 </html>

+ 25 - 38
web/rationLibEditor/js/chapterTree.js

@@ -2,31 +2,24 @@
  * Created by Tony on 2017/4/27.
  */
 
-function getQueryString(key){
-    var reg = new RegExp("(^|&)"+key+"=([^&]*)(&|$)");
-    var result = window.location.search.substr(1).match(reg);
-    return result?decodeURIComponent(result[2]):null;
-}
-
 var pageOprObj = {
-    initParam : function() {
-        var rationLibName = getQueryString("repository");//获取定额库参数
+    rationLibName : null,
+    initPage : function() {
+        var me = this, rationLibName = getQueryString("repository");//获取定额库参数
         if (rationLibName) {
-            params.realLibName = rationLibName;
-            zTreeOprObj.getRationTree();
-        } else{
-            params = JSON.parse(getQueryString("params"));
-            zTreeOprObj.getRationTree();
+            me.rationLibName = rationLibName;
+            zTreeOprObj.getRationTree(rationLibName);
         }
     }
 }
 var zTreeOprObj = {
-    getRationTree: function(){
+    treeObj: null,
+    getRationTree: function(rationLibName){
         var me = this;
         $.ajax({
             type:"POST",
             url:"api/getRationTree",
-            data:{"rationLibName": params.realLibName},
+            data:{"rationLibName": rationLibName},
             dataType:"json",
             cache:false,
             timeout:20000,
@@ -41,19 +34,14 @@ var zTreeOprObj = {
         })
     },
     createRationTree: function(sourceData){
-        var treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
-        for (var i = 0; i < treeArr.length; i++) {
-            if (treeArr[i].ParentID = -1) {
-                //
-            }
-        }
-        treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, treeArr);
-        treeObj.expandAll(true);
+        var me = zTreeOprObj, treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
+        me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, treeArr);
+        me.treeObj.expandAll(true);
     },
     addRootNode: function() {
-        var me = this, rawNode = {ParentID: -1, NextSiblingID: -1, name: "新增节点"}, lastNodeId = -1;
-        if (treeObj) {
-            var rootNodes = treeObj.getNodes();
+        var me = zTreeOprObj, rawNode = {ParentID: -1, NextSiblingID: -1, name: "新增节点"}, lastNodeId = -1;
+        if (me.treeObj) {
+            var rootNodes = me.treeObj.getNodes();
             if (rootNodes.length > 0) {
                 lastNodeId = rootNodes[rootNodes.length - 1].ID;
             }
@@ -62,10 +50,10 @@ var zTreeOprObj = {
             if (!(err)) {
                 var newNodes = [], isSilent = false;
                 newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, ParentID:-1, NextSiblingID:-1, name:"新增节点",isParent:false, items:[]});
-                if (treeObj) {
-                    treeObj.addNodes(null, -1, newNodes, isSilent);
+                if (me.treeObj) {
+                    me.treeObj.addNodes(null, -1, newNodes, isSilent);
                 } else {
-                    treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
+                    me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
                 }
             }
         });
@@ -74,7 +62,7 @@ var zTreeOprObj = {
         $.ajax({
             type:"POST",
             url:"api/createNewNode",
-            data:{"rationLibName":params.realLibName,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
+            data:{"rationLibName":pageOprObj.rationLibName,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
             dataType:"json",
             cache:false,
             timeout:1000,
@@ -87,7 +75,6 @@ var zTreeOprObj = {
         })
     },
     beforeRename: function(treeId, treeNode, newName, isCancel) {
-        className = (className === "dark" ? "":"dark");
         if (newName.length == 0) {
             return false;
         }
@@ -134,11 +121,11 @@ var zTreeOprObj = {
         return true;
     },
     onRemove: function(e, treeId, treeNode){
-        var pNode = treeObj.getNodeByTId(treeNode.parentTId);
+        var me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
         if (pNode && pNode.items && pNode.items.length == 0) {
             pNode.isParent = false;
-            treeObj.refresh();
-            //treeObj.updateNode(pNode, false); //这方法有后遗症,多次操作后会造成节点新增子节点时,父节点icon显示不正确
+            me.treeObj.refresh();
+            //me.treeObj.updateNode(pNode, false); //这方法有后遗症,多次操作后会造成节点新增子节点时,父节点icon显示不正确
         }
     },
     beforeDrag: function(treeId, treeNodes) {
@@ -174,7 +161,7 @@ var zTreeOprObj = {
         }
     },
     addHoverDom: function(treeId, treeNode) {
-        var sObj = $("#" + treeNode.tId + "_span");
+        var me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
         //if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0||(treeNode.level==2)) return;
         if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
         var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='add node' onfocus='this.blur();'></span>";
@@ -190,10 +177,10 @@ var zTreeOprObj = {
                     var newNodes = [], isSilent = false;
                     newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, name:"新增子节点",isParent:false, items:[]});
                     treeNode.isParent = true;
-                    if (treeObj) {
-                        treeObj.addNodes(treeNode, -1, newNodes, isSilent);
+                    if (me.treeObj) {
+                        me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
                     } else {
-                        treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
+                        me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
                     }
                 }
             });

+ 0 - 39
web/rationLibEditor/js/gongliao.js

@@ -1,39 +0,0 @@
-/**
- * Created by Syusuke on 2017/3/22.
- */
-//-----------------------------------------------获取参数对象
-var paramStr = getQueryString("params");
-var params = JSON.parse(paramStr);
-function getQueryString(key){
-    var reg = new RegExp("(^|&)"+key+"=([^&]*)(&|$)");
-    var result = window.location.search.substr(1).match(reg);
-    return result?decodeURIComponent(result[2]):null;
-}
-//-----------------------------------------------页面跳转
-$("#drirect-dinge").click(function(){
-  //  window.location = "/rationLibEditor/rationLib" + "?params=" + JSON.stringify(params);
-   $(this).attr('href', "/rationLibEditor/rationLib" + "?params=" + JSON.stringify(params))
-})
-//-----------------------------------------------页面初始化
-var spSetting_GLJ = {
-    spType:"GLJList",
-    header:[
-        {headerName:"编码",headerWidth:120,data:"GLJCode"},
-        {headerName:"名称",headerWidth:400,data:"GLJName"},
-        {headerName:"规格",headerWidth:120,data:"specs"},
-        {headerName:"单位",headerWidth:120,data:"unit"},
-        {headerName:"基价单价",headerWidth:120,data:"basePrice"},
-        {headerName:"类型",headerWidth:120,data:"type"}
-    ],
-    view:{
-        comboBox:[
-            {row:-1,col:3,rowCount:-1,colCount:1}
-        ],
-        lockedCells:[
-        ]
-    }
-};
-$(document).ready(function(){
-    $.fn.zTree.init($("#treeDemo"), setting, zNodes);
-    var rationSpread =  $.fn.Spread.init($("#GLJListSheet"),spSetting_GLJ);
-});

+ 2 - 5
web/rationLibEditor/js/ration.js

@@ -1,12 +1,9 @@
 /**
  * Created by Tony on 2017/4/28.
  */
-var params = {}
-$("#dinge").click(function(){
-    $(this).attr('href', "/rationRepository/ration" + "?params=" + JSON.stringify(params))
-})
+
 $("#gongliao").click(function(){
-    $(this).attr('href', "/rationRepository/gongliao" + "?params=" + JSON.stringify(params))
+    $(this).attr('href', "/rationRepository/lmm" + "?repository=" + getQueryString("repository"))
 });
 
 var rationOprObj = {

+ 129 - 0
web/rationLibEditor/js/repositoryGLJ.js

@@ -0,0 +1,129 @@
+/**
+ * Created by Tony on 2017/5/5.
+ */
+
+$("#drirect-dinge").click(function(){
+    $(this).attr('href', "/rationRepository/ration" + "?repository=" + getQueryString("repository"))
+});
+
+var pageOprObj = {
+    rationLibName : null,
+    initPage : function() {
+        var me = this, rationLibName = getQueryString("repository");//获取定额库参数
+        if (rationLibName) {
+            me.rationLibName = rationLibName;
+            repositoryGljObj.getGljTree(rationLibName, function(repId){
+                repositoryGljObj.getGljItems(repId);
+            });
+        }
+    }
+}
+repositoryGljObj = {
+    treeObj : null,
+    workBook: null,
+    gljAllTypeId: -1,
+    gljList: [],
+    setting: {
+        header:[
+            {headerName:"编码",headerWidth:120,data:"code"},
+            {headerName:"名称",headerWidth:400,data:"name"},
+            {headerName:"规格",headerWidth:120,data:"specs"},
+            {headerName:"单位",headerWidth:120,data:"unit"},
+            {headerName:"基价单价",headerWidth:120,data:"basePrice"},
+            {headerName:"类型",headerWidth:120,data:"gljType"}
+        ],
+        view:{
+            comboBox:[
+                {row:-1,col:3,rowCount:-1,colCount:1}
+            ],
+            lockedCells:[
+            ]
+        }
+    },
+    getGljTree: function(rationLibName, callback) {
+        var me = this;
+        $.ajax({
+            type:"POST",
+            url:"api/getGljTree",
+            data:{"rationLibName": rationLibName},
+            dataType:"json",
+            cache:false,
+            timeout:20000,
+            success:function(result,textStatus,status){
+                if(status.status == 200) {
+                    me.createRationTree(result.data);
+                    //me.gljAllTypeId
+                    if (result.data && result.data.length > 0) {
+                        for (var i = 0; i < result.data.length; i++) {
+                            if (result.data[i].Name === "全部") {
+                                me.gljAllTypeId = result.data[i].repositoryId;
+                                break;
+                            }
+                        }
+                        if (callback) {
+                            var repId = -1;
+                            repId = result.data[0].repositoryId;
+                            callback(repId);
+                        }
+                    }
+                }
+            },
+            error:function(err){
+                alert(err.responseJSON.error);
+            }
+        })
+    },
+    createRationTree : function(sourceData){
+        var me = repositoryGljObj, treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
+        me.treeObj = $.fn.zTree.init($("#repositoryTree"), setting, treeArr);
+        me.treeObj.expandAll(true);
+    },
+    getGljItems: function(repId) {
+        var me = this;
+        $.ajax({
+            type:"POST",
+            url:"api/getGljItems",
+            data:{"repositoryId": repId},
+            dataType:"json",
+            cache:false,
+            timeout:5000,
+            success:function(result){
+                if(status.status == 200) {
+                    me.gljList = result.data;
+                    me.showGljItems(result.data, me.gljAllTypeId);
+                }
+            },
+            error:function(err){
+                alert(err.responseJSON.error);
+            }
+        })
+    },
+    showGljItems: function(data, type) {
+        var me = repositoryGljObj;
+        if (me.workBook) {
+            var cacheSection = [];
+            for (var i = 0; i < data.length; i++) {
+                if (type == me.gljAllTypeId || type == data[i].gljType) {
+                    cacheSection.push(data[i]);
+                }
+            }
+            sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+            sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, cacheSection);
+        }
+    },
+    buildSheet: function(container) {
+        var me = this;
+        me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
+        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+    },
+    onClipboardPasting: function(sender, args) {
+        var me = repositoryGljObj;
+        if (args.cellRange.colCount != me.setting.header.length) {
+            args.cancel = true;
+        }
+    },
+    onClipboardPasted: function(e, info) {
+        var me = repositoryGljObj;
+    }
+}

+ 1 - 1
web/templates/js/bills.js

@@ -35,7 +35,7 @@ $(document).ready(function () {
 
     var tree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true});
     var billsSpread = new GC.Spread.Sheets.Workbook($('#billsSpread')[0], { sheetCount: 1 });
-    var controller = TREE_SHEET_CONTROLLER.createInit(tree, billsSpread.getActiveSheet(), TEMPLATE_BILLS_SETTING);
+    var controller = TREE_SHEET_CONTROLLER.createNew(tree, billsSpread.getActiveSheet(), TEMPLATE_BILLS_SETTING);
 
     GC.Spread.Common.CultureManager.culture("zh-cn");