Selaa lähdekoodia

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

zhangyin 8 vuotta sitten
vanhempi
commit
c087caec4f
37 muutettua tiedostoa jossa 996 lisäystä ja 552 poistoa
  1. 11 5
      modules/bills/controllers/billsControllers.js
  2. 80 69
      modules/bills/model/interfaces.js
  3. 2 2
      modules/bills/model/billsModel.js
  4. 1 1
      modules/bills/model/schemas.js
  5. 8 7
      modules/bills/routes/billsRoutes.js
  6. 7 2
      modules/fees/controllers/fees_controller.js
  7. 18 0
      modules/fees/models/fees_db.js
  8. 1 0
      modules/fees/routes/fees_router.js
  9. 109 16
      modules/reports/util/rpt_excel_util.js
  10. 10 0
      public/stringUtil.js
  11. 4 4
      server.js
  12. 7 2
      test/unit/excel_export/rpt_excel_export_test.js
  13. 2 1
      tmp/07_1.page.js
  14. 1 3
      tmp/excel_test_raw_data/08-2/xl/styles.xml
  15. 0 59
      web/bills/html/testCanvas.html
  16. 0 94
      web/bills/scripts/billsAjax.js
  17. 0 84
      web/bills/scripts/buildTreeData.js
  18. 0 25
      web/bills/scripts/testTreeData.js
  19. 2 5
      web/bills/html/main.html
  20. 2 2
      web/bills/html/neirong.html
  21. 71 47
      web/bills/html/qingdan.html
  22. 19 0
      web/billsLib/html/test.html
  23. 2 2
      web/bills/html/tezheng.html
  24. 147 0
      web/billsLib/scripts/billsLibAjax.js
  25. 165 0
      web/billsLib/scripts/billsLibSetting.js
  26. 38 0
      web/billsLib/scripts/billsLibTree.js
  27. 0 0
      web/billsLib/scripts/dateFormat.js
  28. 111 0
      web/billsLib/scripts/dbController.js
  29. 0 0
      web/billsLib/scripts/global.js
  30. 19 34
      web/bills/scripts/setSheets.js
  31. 35 4
      web/fees/feeRate.js
  32. 34 4
      web/main/html/main.html
  33. 14 2
      web/main/js/models/bills.js
  34. 31 78
      web/main/js/models/cache_tree.js
  35. 5 0
      web/main/js/models/gljs.js
  36. 35 0
      web/main/js/models/project.js
  37. 5 0
      web/main/js/models/rations.js

+ 11 - 5
modules/bills/controllers/billsControllers.js

@@ -2,9 +2,9 @@
  * Created by vian on 2017/3/22.
  */
 
-var billsDao = require("../model/interfaces");
+var billsDao = require("../billsLibModel/billsLibInterfaces");
 //----
-var model = require("../model/billsModel");
+var model = require("../billsLibModel/billsLibModel");
 var counter = require("../../../public/counter/counter");
 var StdBillsLib = model.stdBillsLibMod;
 var Bills = model.billsMod;
@@ -42,6 +42,12 @@ module.exports = {
             callback(req, res, err ,message, null);
         });
     },
+    getStdBillsLibName: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsDao.getStdBillsLibName(data.billsLibId, function(err, message, info){
+            callback(req, res, err, message, info);
+        });
+    },
     getBills: function(req, res){
         var data = JSON.parse(req.body.data);
         billsDao.getBills(data.billsLibId, function(err, message, bills){
@@ -54,9 +60,9 @@ module.exports = {
             callback(req, res, err, message, null);
         });
     },
-    updateNextSiblingId: function (req, res) {
+    updatePNId: function (req, res) {
         var data = JSON.parse(req.body.data);
-        billsDao.updateNextSiblingId(data, function(err, message){
+        billsDao.updatePNId(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
@@ -68,7 +74,7 @@ module.exports = {
     },
     deleteBills: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.deleteBills(data.deleteIds, function(err, message){
+        billsDao.deleteBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },

+ 80 - 69
modules/bills/model/interfaces.js

@@ -1,7 +1,7 @@
 /**
  * Created by vian on 2017/3/20.
  */
-var model = require("./billsModel");
+var model = require("./billsLibModel");
 var counter = require("../../../public/counter/counter");
 var StdBillsLib = model.stdBillsLibMod;
 var Bills = model.billsMod;
@@ -75,9 +75,19 @@ billsDao.prototype.renameStdBillsLib = function(renameData, callback){
     });
 }
 
+billsDao.prototype.getStdBillsLibName = function(billsLibId, callback){
+    StdBillsLib.find({billsLibId: billsLibId}, "-_id", function(err,  data){
+        if(err){
+            callback(1, "Error", null);
+        }
+        else {
+            callback(0, "", data);
+        }
+    });
+}
 //----------------------------Bills---------------------
 billsDao.prototype.getBills = function (billsLibId, callback) {
-    Bills.find({billsLibId: billsLibId},"-_id",  function(err, billsData){
+    Bills.find({billsLibId: billsLibId}, "-_id",  function(err, billsData){
         if(err){
             callback(1, "Error", null);
         }
@@ -88,70 +98,70 @@ billsDao.prototype.getBills = function (billsLibId, callback) {
 }
 
 billsDao.prototype.createBills = function(cbillsData, callback){
-    var field = cbillsData.field;
-    var data = cbillsData.data;
-    var newId = cbillsData.id;//ǰ��ͨ�� counter.getIDAfterCount("bills", 1);���
-    var billsLibId = cbillsData.billsLibId;
-    var newBills;
-    if(field == "code"){
-        newBills = {
+        var newId = cbillsData.newId;
+        var pid = cbillsData.ParentID;
+        var nid = cbillsData.NextSiblingID;
+        var billsLibId = cbillsData.billsLibId;
+        var newBills = {
             ID: newId,
-            ParentID: cbillsData.parentId,
-            NextSiblingID: cbillsData.nextSiblingId,
-            billsLibId: billsLibId,
-            code: data
-        }
-    }
-    else if(field == "name"){
-        newBills = {
-            ID: newId,
-            ParentID: cbillsData.parentId,
-            NextSiblingID: cbillsData.nextSiblingId,
-            billsLibId: billsLibId,
-            name: data
-        }
+            ParentID: pid,
+            NextSiblingID: nid,
+            billsLibId: billsLibId
+        };
+        Bills.create(newBills, function(err){
+            if(err){
+                callback(1, "Error");
+            }
+            else{
+                callback(0, "");
+            }
+        });
+}
+
+billsDao.prototype.updatePNId= function(updateData, callback){
+    var billsLibId = updateData.billsLibId;
+    var updateId = updateData.updateId;
+    var updatepid= updateData.ParentID;
+    var updatenid = updateData.NextSiblingID;
+    if(!updatepid){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {NextSiblingID: updatenid}}, function(err){
+            if(err){
+                callback(1, "Error")
+            }
+            else{
+                callback(0, "");
+            }
+        });
     }
-    else if(field == "unit"){
-        newBills = {
-            ID: newId,
-            ParentID: cbillsData.parentId,
-            NextSiblingID: cbillsData.nextSiblingId,
-            billsLibId: billsLibId,
-            unit: data
-        }
+    else if(!updatenid){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {ParentID: updatepid}}, function(err){
+            if(err){
+                callback(1, "Error")
+            }
+            else{
+                callback(0, "");
+            }
+        });
     }
-    else if(field == "ruleText"){
-        newBills = {
-            ID: newId,
-            ParentID: cbillsData.parentId,
-            NextSiblingID: cbillsData.nextSiblingId,
-            billsLibId: billsLibId,
-            ruleText: data
-        }
+    else {
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {ParentID: updatepid, NextSiblingID: updatenid}}, function(err){
+            if(err){
+                callback(1, "Error")
+            }
+            else{
+                callback(0, "");
+            }
+        });
     }
-    Bills.create(newBills, function(err){
-        if(err){
-            callback(1, "Error");
-        }
-        else{
-            callback(0, "");
-        }
-    });
-
 }
-//������ɾ������¸ı��˵�nextSiblingId
-billsDao.prototype.updateNextSiblingId = function(uNextData, callback){
-    var updateId = uNextData.id;
-    var updateData = uNextData.data;
-    Bills.update({ID: updateId}, {$set: {NextSiblingID: updateData}}, function(err){
+   /* Bills.update({nodeId: updateNode, billsLibId: billsLibId}, {$set: {ParentID: updatepid, NextSiblingID: updatenid}}, function(err){
         if(err){
             callback(1, "Error")
         }
         else{
             callback(0, "");
         }
-    });
-}
+    });*/
 
 billsDao.prototype.updateBills = function(ubillsData, callback){
     var updateId = ubillsData.id;
@@ -199,19 +209,20 @@ billsDao.prototype.updateBills = function(ubillsData, callback){
     }
 }
 
-billsDao.prototype.deleteBills = function(deleteIds, callback){
-   //ǰ�˿��Ƶõ���ɾ�������нڵ�deleteIds
+billsDao.prototype.deleteBills = function(delData, callback){
+    var deleteIds = delData.deleteIds;
+    var billsLibId = delData.billsLibId;
     if(deleteIds){
-        for(var i=0; i<deleteIds.length; i++){
-            Bills.remove({ID: deleteIds[i]}, function(err){
-                if(err){
-                    callback(1, "Error");
-                }
-                else{
-                    callback(0, "");
-                }
-            });
-        }
+        //deleteIds.forEach(function(deleteId){
+           Bills.remove({billsLibId: billsLibId, ID: {$in: deleteIds}}, function(err){
+               if(err){
+                   callback(1, 'Error');
+               }
+               else {
+                   callback(0, '');
+               }
+           });
+      //  });
     }
 }
 
@@ -230,7 +241,7 @@ billsDao.prototype.getJobContent = function(billsLibId, callback){
 billsDao.prototype.createJobContent = function(cJobData, callback){
     var field = cJobData.field;
     var data = cJobData.data;
-    var id = counter.getIDAfterCount("bills", 1);
+    var id = counter.getIDAfterCount("billsLib", 1);
     var billsLibId = cJobData.billsLibId;
     var newJobContent;
     if(field == "code"){
@@ -310,7 +321,7 @@ billsDao.prototype.getItemCharacter = function(billsLibId, callback){
 billsDao.prototype.createItemCharacter = function(cItemData, callback){
     var field = cItemData.field;
     var data = cItemData.data;
-    var id = counter.getIDAfterCount("bills", 1);
+    var id = counter.getIDAfterCount("billsLib", 1);
     var billsLibId = cItemData.billsLibId;
     var newItemCharacter;
     if(field == "code"){

+ 2 - 2
modules/bills/model/billsModel.js

@@ -2,11 +2,11 @@
  * Created by vian on 2017/3/17.
  */
 var dbm = require("../../../config/db/db_manager");
-var schemas = require("./schemas.js");
+var schemas = require("./billsLibSchemas.js");
 //var db = dbm.getLocalConnection("stdBillsLibData");
 var db = dbm.getCfgConnection("stdBillsEditor");
 var stdBillsLibMod = db.model("stdBillsLib", schemas.stdBillsLibSchema);
-var billsMod = db.model("bills", schemas.billsSchema);
+var billsMod = db.model("billsLib", schemas.billsSchema);
 var jobContentMod = db.model("jobContent", schemas.jobContentSchema);
 var itemCharacterMod = db.model("itemCharacter", schemas.itemCharacterSchema);
 

+ 1 - 1
modules/bills/model/schemas.js

@@ -9,7 +9,6 @@ var stdBillsLibSchema =mongoose.Schema({
 );
 
 var billsSchema = mongoose.Schema({
-    //serialNo: Number,
     ID: Number,
     ParentID: Number,
     NextSiblingID: Number,
@@ -21,6 +20,7 @@ var billsSchema = mongoose.Schema({
     jobs: Array,
     items: Array,
     recharge:String,
+    //nodeId: Number,
     billsLibId: Number
 },
     {versionKey: false}

+ 8 - 7
modules/bills/routes/billsRoutes.js

@@ -2,7 +2,7 @@
  * Created by vian on 2017/3/17.
  */
 var express = require("express");
-var billsController = require("../controllers/billsControllers");
+var billsController = require("../billsLibControllers/billsLibControllers");
 var billsRouter =express.Router();
 
 
@@ -13,28 +13,29 @@ var billsRouter =express.Router();
 });*/
 
 /*billsRouter.get("/main", function(req, res){
-    res.render("bills/html/main.html");
+    res.render("billsLib/html/main.html");
 });
 
-billsRouter.get("/bills", function(req, res){
-    res.render("bills/html/qingdan.html");
+billsRouter.get("/billsLib", function(req, res){
+    res.render("billsLib/html/qingdan.html");
 });
 
 billsRouter.get("/jobs", function(req, res){
-    res.render("bills/html/neirong.html");
+    res.render("billsLib/html/neirong.html");
 });
 
 billsRouter.get("/items", function(req, res){
-    res.render("bills/html/tezheng.html");
+    res.render("billsLib/html/tezheng.html");
 });*/
 
 billsRouter.post("/getStdBillsLib", billsController.getStdBillsLib);
 billsRouter.post("/createStdBillsLib", billsController.createStdBillsLib);
 billsRouter.post("/deleteStdBillsLib", billsController.deleteStdBillsLib);
 billsRouter.post("/renameStdBillsLib", billsController.renameStdBillsLib);
+billsRouter.post("/getStdBillsLibName", billsController.getStdBillsLibName);
 billsRouter.post("/getBills", billsController.getBills);
 billsRouter.post("/createBills", billsController.createBills);
-billsRouter.post("/updateNextSiblingId", billsController.updateNextSiblingId);
+billsRouter.post("/updatePNId", billsController.updatePNId);
 billsRouter.post("/updateBills", billsController.updateBills);
 billsRouter.post("/deleteBills", billsController.deleteBills);
 billsRouter.post("/getJobContent", billsController.getJobContent);

+ 7 - 2
modules/fees/controllers/fees_controller.js

@@ -25,9 +25,14 @@ module.exports = {
         projectFeeRateFile.rates(fileID, function (doc) {
             res.json({data: doc});
         })
-    }
-
+    },
 
+    projectFeeUpdateRate: function (req, res) {
+        var rateObj = {"fileID": req.body.fileID, "rateID": req.body.rateID, "rateValue": req.body.rateValue};
+        projectFeeRateFile.updateRate(rateObj, function (doc) {
+            res.json({data: doc});
+        })
+    }
 }
 
 

+ 18 - 0
modules/fees/models/fees_db.js

@@ -36,6 +36,24 @@ FeeRateFile.prototype.rates = function(fileID, controllerFun){
     })
 };
 
+// 1 保存成功; 0 保存失败;-1没有找到对应记录。
+FeeRateFile.prototype.updateRate = function(rateObj, controllerFun){
+    feeRatesModel.find({"ID": rateObj.fileID}, ["rates"], function(err, data){
+        if(data.length){
+            for (var i = 0; i < data[0].rates.length; i++) {
+                if (data[0].rates[i].ID == rateObj.rateID) {
+                    data[0].rates[i].rate = rateObj.rateValue;
+                    data[0].save(function (err) {
+                        if (err) { controllerFun(0); } else { controllerFun(1); }
+                    });
+                    break;
+                }
+            };
+        }
+        else{ controllerFun(-1); }
+    })
+};
+
 module.exports = new FeeRateFile();
 
 

+ 1 - 0
modules/fees/routes/fees_router.js

@@ -13,6 +13,7 @@ feesRouter.get('/', function(req, res) {
 feesRouter.post('/getLibNames', feesController.libNames);
 feesRouter.post('/getLibFeeRates', feesController.libFeeRates);
 feesRouter.post('/getProjectFeeRates', feesController.projectFeeRates);
+feesRouter.post('/updateProjectFeeRate', feesController.projectFeeUpdateRate);
 
 
 module.exports = feesRouter;

+ 109 - 16
modules/reports/util/rpt_excel_util.js

@@ -126,7 +126,71 @@ function writeTheme(){
     return rst;
 }
 function writeStyles(stylesObj){
-    //
+    var rst = [];
+    rst.push(dftHeadXml + '\r\n');
+    rst.push('<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">');
+    //1. push fonts
+    rst.push('<fonts count="' + stylesObj.fonts.length + '">')
+    for (var i = 0; i < stylesObj.fonts.length; i++) {
+        var font = stylesObj.fonts[i];
+        rst.push('<font>');
+        if (strUtil.convertStrToBoolean(font[JV.FONT_PROPS[3]])) {
+            rst.push('<b/>');
+        }
+        rst.push('<sz val="' + font.size + '"/>');
+        rst.push('<color indexed="' + font.colorIdx + '"/>');
+        rst.push('<name val="' + font[JV.FONT_PROPS[0]] + '"/>');
+        rst.push('<charset val="' + font.charset + '"/>');
+        rst.push('</font>');
+    }
+    rst.push('<fonts>');
+    //2. push default fills
+    rst.push('<fills count="2"><fill><patternFill patternType="none" /></fill><fill><patternFill patternType="gray125" /></fill></fills>');
+    //3. push borders
+    rst.push('<borders count="' + stylesObj.borders.length + '">')
+    private_setBorder = function(border, borderDirection) {
+        if (border[borderDirection][JV.PROP_LINE_WEIGHT] == 0) {
+            rst.push('<' + borderDirection.toLowerCase() + '/>');
+        } else {
+            var bW = 'thin';
+            if (border[borderDirection][JV.PROP_LINE_WEIGHT] = 2) bW = 'medium';
+            if (border[borderDirection][JV.PROP_LINE_WEIGHT] > 2) bW = 'thick';
+            rst.push('<' + borderDirection.toLowerCase() + ' style="' + bW + '">' + '<color indexed="64"/>' + '</' + borderDirection.toLowerCase() + '>');
+        }
+    };
+    for (var i = 0; i < stylesObj.borders.length; i++) {
+        var border = stylesObj.borders[i];
+        private_setBorder(border, JV.PROP_LEFT);
+        private_setBorder(border, JV.PROP_RIGHT);
+        private_setBorder(border, JV.PROP_TOP);
+        private_setBorder(border, JV.PROP_BOTTOM);
+    }
+    rst.push('</borders>');
+    //4. push cellStyleXfs
+    rst.push('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"><alignment vertical="center"/></xf></cellStyleXfs>');
+    //5. push cellXfs
+    rst.push('<cellXfs count="' + stylesObj.cellXfs.length + '">');
+    for (var i = 0; i < stylesObj.cellXfs.length; i++) {
+        var excelStyle = stylesObj.cellXfs[i];
+        rst.push('<xf numFmtId="0" fontId="' + excelStyle.fontId + '" fillId="0" borderId="' + excelStyle.borderId + '" xfId="0">');
+        var alignStr = '<alignment horizontal="' + excelStyle[JV.CONTROL_PROPS[2]] + '" vertical="' + excelStyle[JV.CONTROL_PROPS[3]] + '"';
+        if (strUtil.convertStrToBoolean(excelStyle[JV.CONTROL_PROPS[1]])) {
+            alignStr = alignStr + ' shrinkToFit="1"';
+        }
+        if (strUtil.convertStrToBoolean(excelStyle[JV.CONTROL_PROPS[4]])) {
+            alignStr = alignStr + ' wrapText="1"';
+        }
+        alignStr = alignStr + '/>';
+        rst.push(alignStr);
+        rst.push('</xf>');
+    }
+    rst.push('</cellXfs>');
+    //6. others (xfl style / dxfs / tableStyles)
+    rst.push('<cellStyles count="1"><cellStyle name="常规" xfId="0" builtinId="0"/></cellStyles>');
+    rst.push('<dxfs count="0"/>');
+    rst.push('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/>');
+    rst.push('</styleSheet>');
+    return rst;
 }
 function writeSharedString(sharedStrList){
     var rst = [];
@@ -143,11 +207,11 @@ function writeSharedString(sharedStrList){
 function writeSheets(pageData, sharedStrList, stylesObj){
     var rst = [];
     for (var i = 0; i < pageData.items.length; i++) {
-        rst.push(writeSheet(pageData.items[i], sharedStrList, stylesObj));
+        rst.push(writeSheet(pageData, pageData.items[i], sharedStrList, stylesObj));
     }
     return rst;
 }
-function writeSheet(sheetData, sharedStrList, stylesObj){
+function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
     var rst = [], xPos = [], yPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     xPos.push(0);
     yPos.push(0);
@@ -215,11 +279,11 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
             stylesObj.fonts = [];
             //for (var i = 0; i < sheetData.font_collection)
         }
-        var sheetFont = sheetData.font_collection[cell.font];
+        var sheetFont = pageData.font_collection[cell.font];
         for (var i = 0; i < stylesObj.fonts.length; i++) {
             var font = stylesObj.fonts[i];
             if (sheetFont) {
-                if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4)) {
+                if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4) && font[JV.FONT_PROPS[3]] == sheetFont[JV.FONT_PROPS[3]]) {
                     hasFont = true;
                     rst = i;
                     break;
@@ -230,10 +294,11 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
         }
         if (!hasFont) {
             var font = {};
-            font[JV.FONT_PROPS[0]] = sheetFont[JV.FONT_PROPS[0]];
+            font[JV.FONT_PROPS[0]] = sheetFont[JV.FONT_PROPS[0]]; //font name
             font.size = Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4);
             font.charset = 134;
-            font.scheme = "minor";
+            font.colorIdx = "8";
+            font[JV.FONT_PROPS[3]] = sheetFont[JV.FONT_PROPS[3]]; //font bold
             stylesObj.fonts.push(font);
             rst = stylesObj.fonts.length - 1;
         }
@@ -278,7 +343,7 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
         if (!(stylesObj.borders)) {
             stylesObj.borders = [];
         }
-        var sheetBorder = sheetData.style_collection[cell.style];
+        var sheetBorder = pageData.style_collection[cell.style];
         for (var i = 0; i < stylesObj.borders.length; i++) {
             var border = stylesObj.borders[i];
             if (private_checkBorder(border, sheetBorder)) {
@@ -314,16 +379,41 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getStyleIdx = function(cell) {
+    private_checkControl = function(cellControl, sheetControl) {
+        var rst = true;
+        for (var i = 0; i < JV.CONTROL_PROPS.length; i++) {
+            if (cellControl[JV.CONTROL_PROPS[i]] != sheetControl[JV.CONTROL_PROPS[i]]) {
+                rst = false;
+                break;
+            }
+        }
+        return rst;
+    };
+    private_getStyleId = function(cell) {
         var rst = 1, hasStyle = false;
         if (!(stylesObj.cellXfs)) stylesObj.cellXfs = [];
+        var fontId = private_getFontId(cell);
+        var borderId = private_getBorderId(cell);
+        var cellControl = pageData[JV.NODE_CONTROL_COLLECTION][cell[JV.PROP_CONTROL]];
         for (var i = 0; i < stylesObj.cellXfs.length; i++) {
-            //check font and border
-            var fontId = private_getFontId(cell);
-            var cellStyle = stylesObj.cellXfs[i];
+            var sheetControl = stylesObj.cellXfs[i];
+            if (sheetControl.fontId == fontId && sheetControl.borderId == borderId) {
+                if (private_checkControl(cellControl, sheetControl)) {
+                    rst = i;
+                    hasStyle = true;
+                    break;
+                }
+            }
         }
         if (!hasStyle) {
-            //add new style
+            var sheetControl = {};
+            sheetControl.fontId = fontId;
+            sheetControl.borderId = borderId;
+            for (var i = 0; i < JV.CONTROL_PROPS.length; i++) {
+                sheetControl[JV.CONTROL_PROPS[i]] = cellControl[JV.CONTROL_PROPS[i]];
+            }
+            stylesObj.cellXfs.push(sheetControl);
+            rst = stylesObj.cellXfs.length - 1;
         }
         return rst;
     };
@@ -389,7 +479,7 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
                 colIdxStr = private_getCellIdxStr(j);
                 if (hasMoreCols) {
                     if (nextColIdx == j) {
-                        var styleIdx = private_getStyleIdx(sheetData.cells[cellIdx]);
+                        var styleIdx = private_getStyleId(sheetData.cells[cellIdx]);
                         if (strUtil.isEmptyString(sheetData.cells[cellIdx][JV.PROP_VALUE])) {
                             rst.push('<c r="' + colIdxStr + i + '" s="' + styleIdx + '"/>');
                             //should setup the right style instead!
@@ -469,8 +559,8 @@ module.exports = {
     ,testWriteXlRels: function(sheets) {
         return writeXlRels(sheets);
     }
-    ,testWriteSheets: function(pageData, sharedStrList, styleList){
-        return writeSheets(pageData, sharedStrList, styleList);
+    ,testWriteSheets: function(pageData, sharedStrList, stylesObj){
+        return writeSheets(pageData, sharedStrList, stylesObj);
     }
     ,testWriteSharedString: function(sharedStrList){
         return writeSharedString(sharedStrList);
@@ -478,4 +568,7 @@ module.exports = {
     ,testWriteTheme: function() {
         return writeTheme();
     }
+    ,testWriteStyles: function(stylesObj) {
+        return writeStyles(stylesObj);
+    }
 }

+ 10 - 0
public/stringUtil.js

@@ -39,5 +39,15 @@ module.exports = {
             for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
         }
         return re;
+    },
+    convertStrToBoolean: function(str) {
+        var rst = false, me = this;
+        if (!me.isEmptyString(str)) {
+            var upperStr = str.toUpperCase();
+            if (upperStr == 'T' || upperStr == 'Y' || upperStr == 'YES' || upperStr == 'TRUE') {
+                rst = true;
+            }
+        }
+        return rst;
     }
 }

+ 4 - 4
server.js

@@ -94,13 +94,13 @@ app.use("/rationLibEditor",rations_Router);
 
 
 app.get("/stdBillsmain", function(req, res){
-    res.render("bills/html/main.html");
+    res.render("billsLib/html/main.html");
 });
 app.get("/stdBills", function(req, res){
-    res.render("bills/html/qingdan.html");
+    res.render("billsLib/html/qingdan.html");
 });
-var billsRouter = require("./modules/bills/routes/billsRoutes");
-app.use("/stdBillsEditor", billsRouter);
+var billsLibRouter = require("./modules/billsLib/billsLibRoutes/billsLibRoutes");
+app.use("/stdBillsEditor", billsLibRouter);
 //-----------------
 
 app.use(function(req, res, next) {

+ 7 - 2
test/unit/excel_export/rpt_excel_export_test.js

@@ -33,8 +33,8 @@ test('check excel output', function(t){
     var xlRels = rpt_xl_util.testWriteXlRels(sheets);
     fsUtil.writeArrayToFile(xlRels, '../../../tmp/workbook.xml.rels');
     t.pass('pass xl sheet rels');
-    var sharedStrList = [], styleList= [];
-    var sheetsArr = rpt_xl_util.testWriteSheets(testReport07_1, sharedStrList, styleList);
+    var sharedStrList = [], stylesObj = {};
+    var sheetsArr = rpt_xl_util.testWriteSheets(testReport07_1, sharedStrList, stylesObj);
     for (var i = 0; i < sheetsArr.length; i++) {
         fsUtil.writeArrayToFile(sheetsArr[i], '../../../tmp/sheet' + (i + 1) + '.xml');
         t.pass('pass sheet' + (i + 1));
@@ -42,6 +42,11 @@ test('check excel output', function(t){
     var sharedStr = rpt_xl_util.testWriteSharedString(sharedStrList);
     fsUtil.writeArrayToFile(sharedStr, '../../../tmp/sharedStrings.xml');
     t.pass('pass shared string');
+
+    var styleStr = rpt_xl_util.testWriteStyles(stylesObj);
+    fsUtil.writeArrayToFile(styleStr, '../../../tmp/styles.xml');
+    t.pass('pass styles');
+
     var theme = rpt_xl_util.testWriteTheme();
     //console.log(theme);
     var themeArr = [];

+ 2 - 1
tmp/07_1.page.js

@@ -1,4 +1,5 @@
-var testReport07_1 = {
+var
+	testReport07_1 = {
 	"control_collection": {
 		"Default": {
 			"Shrink": "T",

+ 1 - 3
tmp/excel_test_raw_data/08-2/xl/styles.xml

@@ -199,9 +199,7 @@
 			<protection locked="0"/>
 		</xf>
 	</cellXfs>
-	<cellStyles count="1">
-		<cellStyle name="常规" xfId="0" builtinId="0"/>
-	</cellStyles>
+	<cellStyles count="1"><cellStyle name="常规" xfId="0" builtinId="0"/></cellStyles>
 	<dxfs count="0"/>
 	<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/>
 </styleSheet>

+ 0 - 59
web/bills/html/testCanvas.html

@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head lang="en">
-    <meta charset="UTF-8">
-    <title>Canvas Demo</title>
-    <script src="../../../lib/jquery/jquery.min.js"></script>
-    <script>
-        var test = "test";
-        function setId(){
-            return "testSetId";
-        }
-    </script>
-</head>
-<body>
-<canvas id="cv"></canvas>
-<input type="hidden" id="">
-<div id="di">sss</div>
-</body>
-<script>
-window.onload = function(){
-    var canvas = document.getElementById("cv");
-    var ctx = canvas.getContext("2d");
-    //ctx.setLineDash([1,1]);
-    ctx.beginPath();
-    ctx.moveTo(100, 100);
-    //ctx.lineWidth = 0.5;
-    ctx.strokeStyle = "gray";
-    ctx.lineTo(100, 120);
-    ctx.lineTo(120, 120);
-    ctx.lineTo(120, 100);
-    ctx.lineTo(100, 100);
-    ctx.stroke();
-    ctx.beginPath();
-    ctx.strokeStyle = "black";
-    ctx.moveTo(105, 110);
-    ctx.lineTo(115, 110);
-    ctx.stroke();
-
-    ctx.beginPath();
-    ctx.moveTo(100, 50);
-    ctx.strokeStyle = "gray";
-    ctx.lineTo(100, 70);
-    ctx.lineTo(120, 70);
-    ctx.lineTo(120, 50);
-    ctx.lineTo(100, 50);
-    ctx.stroke();
-    ctx.beginPath();
-    ctx.strokeStyle = "black";
-    ctx.moveTo(105, 60);
-    ctx.lineTo(115, 60);
-    ctx.moveTo(110, 55);
-    ctx.lineTo(110, 65);
-    ctx.stroke();
-
-$("#di").remove();
-
-}
-</script>
-</html>

+ 0 - 94
web/bills/scripts/billsAjax.js

@@ -1,94 +0,0 @@
-/**
- * Created by vian on 2017/3/27.
- */
-var mainAjax = {
-    getStdBillsLib: function(userId){
-        $.ajax({
-            type: "post",
-            url: "/stdBillsEditor/getStdBillsLib",
-            data: {"data": JSON.stringify({"userId": userId})},
-            dataType: "json",
-            success: function(result){
-                if(result.data){
-                    for(var i=0; i<result.data.length; i++){
-                        var id = result.data[i].billsLibId;
-                        var billsLibName = result.data[i].billsLibName;
-                        var createDate = result.data[i].createDate;
-                        var createDateFmt = new Date(createDate).format("yyyy-MM-dd");
-                        $("#showArea").append(
-                            "<tr id='tempId'>" +
-                            "<td><a href='stdBills'>"+billsLibName+"</a></td>" +
-                            "<td>"+createDateFmt+" </td>" +
-                            "<td><a href='javascript:void(0);' data-toggle='modal' data-target='#edit' title='编辑'>" +
-                            "<i class='fa fa-pencil-square-o'></i></a> <a href='javascript:void(0);' data-toggle='modal' data-target='#del' class='text-danger' title='删除'>" +
-                            "<i class='fa fa-remove'></i></a></td></tr>");
-                        var newHref = "stdBills?billsLibId="+id;
-                        $("#tempId td:first a").attr("href", newHref);
-                        $("#tempId").attr("id", id);
-                    }
-                }
-
-            }
-        });
-    },
-    createStdBillsLib: function(billsLibName){
-        $.ajax({
-            type: "POST",
-            url: "/stdBillsEditor/createStdBillsLib",
-            data: {data: JSON.stringify({name: billsLibName}) },
-            dataType: "json",
-            success: function(result){
-                var id = result.data[0].billsLibId;
-                var createDate = result.data[0].createDate;
-                var createDateFmt = new Date(createDate).format("yyyy-MM-dd");
-                $("#showArea").append(
-                    "<tr id='tempId'><td><a href='stdBills'>"+billsLibName+"</a></td><td>"+createDateFmt+" </td><td><a href='javascript:void(0);' data-toggle='modal' data-target='#edit' title='编辑'>" +
-                    "<i class='fa fa-pencil-square-o'></i></a> <a href='javascript:void(0);' data-toggle='modal' data-target='#del' class='text-danger' title='删除'>" +
-                    "<i class='fa fa-remove'></i></a></td></tr>"
-                );
-                var newHref = "stdBills?billsLibId="+id;
-                $("#tempId td:first a").attr("href", newHref);
-                $("#tempId").attr("id", id);
-            }
-        });
-    },
-    deleteStdBillsLib: function(billsLibId){
-        $.ajax({
-            type: "POST",
-            url: "/stdBillsEditor/deleteStdBillsLib",
-            data: {"data": JSON.stringify({"billsLibId": billsLibId})},
-            dataType: "json",
-            success: function(result){
-                if(!result.error){
-                    var jqSel = "#"+billsLibId;
-                    $(jqSel).remove();
-                }
-            }
-        });
-    },
-    renameStdBillsLib: function(billsLibId, newName){
-        $.ajax({
-            type: "post",
-            url: "/stdBillsEditor/renameStdbillsLib",
-            data: {"data": JSON.stringify({"id": billsLibId, "value": newName})},
-            dataType: "json",
-            success: function(result){
-                var jqSel = "#" + billsLibId + " td:first" + " a";
-                $(jqSel).text(newName);
-            }
-        });
-    }
-}
-
-var billsAjax = {
-    getBills: function(billsLibId){
-        $.ajax({
-            type: "post",
-            url: "/stdBillsEditor/getBills",
-            data: {"data": JSON.stringify({"billsLibId": billsLibId})},
-            dataType: "json",
-            success: function(result){
-            }
-        });
-    }
-}

+ 0 - 84
web/bills/scripts/buildTreeData.js

@@ -1,84 +0,0 @@
-/**
- * Created by vian on 2017/3/24.
- */
-var myTree = {
-    getTop: function(data, topId){
-        var top = [];
-        for(var i=0; i<data.length; i++){
-            if(data[i].ParentID == -1 ||data[i].ParentID == topId){
-                top.push(data[i]);
-            }
-        }
-        return top;
-    },
-
-    sortNodes: function(nodes){
-        for(var i=0; i<nodes.length; i++){
-            for(var j=i+1; j<nodes.length; j++){
-                var temp;
-                if(nodes[i].NextSiblingID == nodes[j].ID){
-                    temp = nodes[i+1];
-                    nodes[i+1] = nodes[j];
-                    nodes[j] = temp;
-                }
-            }
-            if(nodes[i].NextSiblingID == nodes[0].ID){
-                var topNode = nodes[i];
-                for(var j=nodes.length-2; j>=0; j-- ){
-                    nodes[j+1] = nodes[j];
-                }
-                nodes[0] = topNode;
-            }
-        }
-        return nodes;
-    },
-
-    getNodes: function(data ,ids){
-        var idsNodes = [];
-        for(var i =0; i<ids.length; i++){
-            for(var j=0 ; j<data.length; j++){
-                if(ids[i] == data[j].ID){
-                    idsNodes.push({ID: data[j].ID, ParentID: data[j].ParentID, NextSiblingID: data[j].NextSiblingID, children: data[j].children});
-                }
-            }
-        }
-        return idsNodes;
-    },
-
-    getNodeChildren: function(node, children){
-        for(var i=0; i<billsData.length; i++){
-            if(billsData[i].ParentID == node.ID){
-                children.push(billsData[i].ID);
-                myTree.getNodeChildren(billsData[i], children);
-            }
-        }
-        return children;
-    },
-
-    buildChildren: function(billsData){
-        var tempTree = [];
-        for(var i=0; i<billsData.length; i++){
-            var children = [];
-            myTree.getNodeChildren(billsData[i], children);
-            tempTree.push({"ID": billsData[i].ID, "ParentID": billsData[i].ParentID, "NextSiblingID": billsData[i].NextSiblingID, "children": children});
-        }
-        return tempTree;
-    },
-
-    buildTree: function(treeContainer, billsData, tempTree, topId){
-        var sortTempTree = myTree.sortNodes(getTop(tempTree, topId));
-        for(var i=0; i<sortTempTree.length; i++){
-            if(sortTempTree[i].children.length > 0){
-                treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
-                var childrenTree = myTree.getNodes(myTree.buildChildren(billsData), sortTempTree[i].children);
-                myTree.buildTree(treeContainer, billsData, childrenTree, sortTempTree[i].ID);
-            }
-            else {
-                treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
-            }
-        }
-        return treeContainer;
-
-    }
-
-}

+ 0 - 25
web/bills/scripts/testTreeData.js

@@ -1,25 +0,0 @@
-/**
- * Created by vian on 2017/3/27.
- */
-var billsData = [
-    {ID: "1", ParentID: "-1", NextSiblingID: 2},
-    {ID: "2", ParentID: "-1", NextSiblingID: 3},
-    {ID: "3", ParentID: "-1", NextSiblingID: 9},
-    {ID: "4", ParentID: "3", NextSiblingID: 5},
-    {ID: "5", ParentID: "3", NextSiblingID: -1},
-    {ID: "6", ParentID: "4", NextSiblingID: 7},
-    {ID: "7", ParentID: "4", NextSiblingID: -1},
-    {ID: "8", ParentID: "6", NextSiblingID: -1},
-    {ID: "9", ParentID: "-1", NextSiblingID: 10},
-    {ID: "10", ParentID: "-1", NextSiblingID: -1},
-    {ID: "11", ParentID: "10", NextSiblingID: -1},
-    {ID: "12", ParentID: "11", NextSiblingID: -1},
-    {ID: "13", ParentID: "12", NextSiblingID: -1},
-    {ID: "14", ParentID: "13", NextSiblingID: -1},
-    {ID: "15", ParentID: "14", NextSiblingID: 16},
-    {ID: "16", ParentID: "14", NextSiblingID: 17},
-    {ID: "17", ParentID: "14", NextSiblingID: -1},
-    {ID: "18", ParentID: "17", NextSiblingID: 19},
-    {ID: "19", ParentID: "17", NextSiblingID: -1},
-    {ID: "20", ParentID: "1", NextSiblingID: -1},
-]

+ 2 - 5
web/bills/html/main.html

@@ -124,11 +124,8 @@
     <script src="lib/tether/tether.min.js"></script>
     <script src="lib/bootstrap/bootstrap.min.js"></script>
     <script src="lib/global.js"></script>
-    <!-- zTree -->
-    <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 src="web/bills/scripts/billsAjax.js"></script>
-    <script src="web/bills/scripts/dateFormat.js"></script>
+    <script src="web/billsLib/scripts/billsLibAjax.js"></script>
+    <script src="web/billsLib/scripts/dateFormat.js"></script>
 
 </body>
 <script type="text/javascript">

+ 2 - 2
web/bills/html/neirong.html

@@ -169,8 +169,8 @@
     <script src="../../../lib/jquery/jquery.min.js"></script>
     <script src="../../../lib/tether/tether.min.js"></script>
     <script src="../../../lib/bootstrap/bootstrap.min.js"></script>
-    <script src="../../../web/bills/scripts/global.js"></script>
-    <script src="../../../web/bills/scripts/setSheets.js"></script>
+    <script src="..//scripts/global.js"></script>
+    <script src="..//scripts/setSheets.js"></script>
     <SCRIPT type="text/javascript">
         $(document).ready(function(){
             buildAllJobs();

+ 71 - 47
web/bills/html/qingdan.html

@@ -20,7 +20,7 @@
     <div class="header">
         <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
             <span class="header-logo px-2">清单规则编辑器</span>
-            <div class="navbar-text"><a href="main.html">清单规则</a><i class="fa fa-angle-right fa-fw"></i>XXX清单规则</div>
+            <div class="navbar-text"></div>
         </nav>
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
 
@@ -46,22 +46,22 @@
                   <div class="collapse navbar-collapse" id="navbarNav">
                       <ul class="navbar-nav">
                           <li class="nav-item">
-                              <a class="nav-link text-primary" href="#"><i class="fa fa-share" aria-hidden="true"></i>插入</a>
+                              <a class="nav-link text-primary" id="insert" href="javascript: void(0);"><i class="fa fa-share" aria-hidden="true"></i>插入</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link text-primary" id ="aDelete" href="javascript:void (0)"><i class="fa fa-remove" aria-hidden="true"></i>删除</a>
+                              <a class="nav-link text-primary" id ="delete" href="javascript:void (0)"><i class="fa fa-remove" aria-hidden="true"></i>删除</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link text-primary" href="#"><i class="fa fa-arrow-left" aria-hidden="true"></i>升级</a>
+                              <a class="nav-link text-primary" id="upLevel"  href="javascript: void(0);"><i class="fa fa-arrow-left" aria-hidden="true"></i>升级</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link text-primary" href="#"><i class="fa fa-arrow-right" aria-hidden="true"></i>降级</a>
+                              <a class="nav-link text-primary" id="downLevel" href="javascript: void(0);"><i class="fa fa-arrow-right" aria-hidden="true"></i>降级</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link disabled" href="#"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
+                              <a class="nav-link text-primary" id="upMove" href="javascript: void(0);"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link disabled" href="#"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
+                              <a class="nav-link text-primary" id="downMove" href="javascript: void(0);"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
                           </li>
                       </ul>
                   </div>
@@ -207,63 +207,87 @@
         </div>
     </div>
     <!-- JS. -->
-    <script src="lib/spreadjs/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script src="lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
     <script src="lib/jquery/jquery.min.js"></script>
     <script src="lib/tether/tether.min.js"></script>
     <script src="lib/bootstrap/bootstrap.min.js"></script>
-    <script src="web/bills/scripts/global.js"></script>
-    <script src="web/bills/scripts/setSheets.js"></script>
-    <script src="web/bills/scripts/billsAjax.js"></script>
+    <script src="web/billsLib/scripts/global.js"></script>
+    <script src="web/billsLib/scripts/setSheets.js"></script>
+    <script src="web/billsLib/scripts/billsLibAjax.js"></script>
+    <!--idTree-->
+    <script src="public/web/idTree.js"></script>
+    <script src="public/web/tree_sheet_controller.js"></script>
+    <script src="public/web/tree_sheet_helper.js"></script>
+    <script src="web/billsLib/scripts/billsLibSetting.js"></script>
+    <script src="web/billsLib/scripts/billsLibTree.js"></script>
+    <!--<script src="test/tmp_data/data_15690.js"></script>-->
+    <script src="test/tmp_data/bills_grid_setting.js"></script>
+    <script src="web/billsLib/scripts/dbController.js"></script>
 </body>
 <script type="text/javascript">
     autoFlashHeight();
+    var billsTree = billsLibTree.createBillsTree();
     var billsLibId = getQueryString("billsLibId");
     $(document).ready(function(){
-        if(billsLibId&&billsLibId.toString().length>0){
-            billsAjax.getBills(billsLibId);
-        }
-        buildBills();
+        billsAjax.getStdBillsLibName(billsLibId);
+        billsAjax.getBills(billsLibId);
         buildJobs();
         buildItems();
-        testSortA();
     });
     //test
-    function testSortA(){
-        var arr = [5,1,2,8,0,10];
-        arr.sort(function(a1, a2){
-            if(a1>a2){
-                return 1;
-            }
-            else{
-                return -1;
-            }
+    //test
+
+
+    function nodeOpration(controller,sheet){
+        $('#insert').click(function(){
+            //controller.insert();
+            dbController.insert(controller);
+        });
+        $('#delete').click(function(){
+            dbController.delete(controller);
+            //controller.delete();
+        });
+        $('#upLevel').click(function(){
+            //controller.upLevel();
+            dbController.upLevel(controller);
+        });
+        $('#downLevel').click(function(){
+            //controller.downLevel();
+            dbController.downLevel(controller);
+        });
+        $('#upMove').click(function(){
+            dbController.upMove(controller);
+           // controller.upMove();
+        });
+        $('#downMove').click(function(){
+            //controller.downMove();
+            dbController.downMove(controller);
         });
-        console.log(arr);
     }
 
-    function testSortB(){
-        var testDataArr = [
-            {ID: "1", NextSiblingID: "3", ParentID: "-1"},
-            {ID: "2", NextSiblingID: "6", ParentID: "-1"},
-            {ID: "3", NextSiblingID: "2", ParentID: "-1"},
-            {ID: "6", NextSiblingID: "4", ParentID: "-1"},
-            {ID: "4", NextSiblingID: "-1", ParentID: "-1"}
-        ];
-
-        testDataArr.sort(function(a, b){
-            if(a.NextSiblingID == b.ID){
-                return -1;
-            }
-            else{
-                return 1;
-            }
+    function showBillsSheet(datas){
+        var billsSpread = new GC.Spread.Sheets.Workbook($('#spreadBills')[0], {sheetCount: 1});
+        initSheet(billsSpread);
+        billsTree.loadDatas(datas);
+        var controller = TREE_SHEET_CONTROLLER.createNew(billsTree.tree, billsSpread.getActiveSheet(), billsLibSetting);
+        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'));
         });
-        //expect: 1 3 2 6 4
-        //fact:   2 6 4 1 3
-        console.log(testDataArr);
+        nodeOpration(controller, billsSpread.getActiveSheet());
     }
 
-    //test
 
     function buildBills(){
         var spread = new GC.Spread.Sheets.Workbook($("#spreadBills")[0], {sheetCount: 1});
@@ -316,7 +340,7 @@
         var vpColCount = 2;
         sheet.suspendPaint();
         sheet.suspendEvent();
-        initSheet(spread, sheet, chRowCount, vpRowCount, vpColCount);
+        initSheet(spread);
         setupJobsColHeader(sheet);
         //initRowHeight(sheet);
         setCell(sheet);

+ 19 - 0
web/billsLib/html/test.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>test</title>
+    <script src="../../../lib/jquery/jquery.min.js"></script>
+</head>
+<body>
+    <div id="di">ss</div>
+</body>
+<script>
+    $(document).ready(function(){
+       var test = {a: 1}
+        if(!test.b){
+            alert(1);
+        }
+    });
+</script>
+</html>

+ 2 - 2
web/bills/html/tezheng.html

@@ -170,8 +170,8 @@
     <script src="../../../lib/jquery/jquery.min.js"></script>
     <script src="../../../lib/tether/tether.min.js"></script>
     <script src="../../../lib/bootstrap/bootstrap.min.js"></script>
-    <script src="../../../web/bills/scripts/global.js"></script>
-    <script src="../../../web/bills/scripts/setSheets.js"></script>
+    <script src="..//scripts/global.js"></script>
+    <script src="..//scripts/setSheets.js"></script>
     <SCRIPT type="text/javascript">
   		$(document).ready(function(){
             buildAllItems();

+ 147 - 0
web/billsLib/scripts/billsLibAjax.js

@@ -0,0 +1,147 @@
+/**
+ * Created by vian on 2017/3/27.
+ */
+var mainAjax = {
+    getStdBillsLib: function(userId){
+        $.ajax({
+            type: "post",
+            url: "/stdBillsEditor/getStdBillsLib",
+            data: {data: JSON.stringify({userId: userId})},
+            dataType: "json",
+            success: function(result){
+                if(result.data){
+                    for(var i=0; i<result.data.length; i++){
+                        var id = result.data[i].billsLibId;
+                        var billsLibName = result.data[i].billsLibName;
+                        var createDate = result.data[i].createDate;
+                        var createDateFmt = new Date(createDate).format("yyyy-MM-dd");
+                        $("#showArea").append(
+                            "<tr id='tempId'>" +
+                            "<td><a href='stdBills'>"+billsLibName+"</a></td>" +
+                            "<td>"+createDateFmt+" </td>" +
+                            "<td><a href='javascript:void(0);' data-toggle='modal' data-target='#edit' title='编辑'>" +
+                            "<i class='fa fa-pencil-square-o'></i></a> <a href='javascript:void(0);' data-toggle='modal' data-target='#del' class='text-danger' title='删除'>" +
+                            "<i class='fa fa-remove'></i></a></td></tr>");
+                        var newHref = "stdBills?billsLibId="+id;
+                        $("#tempId td:first a").attr("href", newHref);
+                        $("#tempId").attr("id", id);
+                    }
+                }
+
+            }
+        });
+    },
+    createStdBillsLib: function(billsLibName){
+        $.ajax({
+            type: "POST",
+            url: "/stdBillsEditor/createStdBillsLib",
+            data: {data: JSON.stringify({name: billsLibName}) },
+            dataType: "json",
+            success: function(result){
+                if(!result.error){
+                    var id = result.data[0].billsLibId;
+                    var createDate = result.data[0].createDate;
+                    var createDateFmt = new Date(createDate).format("yyyy-MM-dd");
+                    $("#showArea").append(
+                        "<tr id='tempId'><td><a href='stdBills'>"+billsLibName+"</a></td><td>"+createDateFmt+" </td><td><a href='javascript:void(0);' data-toggle='modal' data-target='#edit' title='编辑'>" +
+                        "<i class='fa fa-pencil-square-o'></i></a> <a href='javascript:void(0);' data-toggle='modal' data-target='#del' class='text-danger' title='删除'>" +
+                        "<i class='fa fa-remove'></i></a></td></tr>"
+                    );
+                    var newHref = "stdBills?billsLibId="+id;
+                    $("#tempId td:first a").attr("href", newHref);
+                    $("#tempId").attr("id", id);
+                }
+            }
+        });
+    },
+    deleteStdBillsLib: function(billsLibId){
+        $.ajax({
+            type: "POST",
+            url: "/stdBillsEditor/deleteStdBillsLib",
+            data: {data: JSON.stringify({billsLibId: billsLibId})},
+            dataType: "json",
+            success: function(result){
+                if(!result.error){
+                    var jqSel = "#"+billsLibId;
+                    $(jqSel).remove();
+                }
+            }
+        });
+    },
+    renameStdBillsLib: function(billsLibId, newName){
+        $.ajax({
+            type: "post",
+            url: "/stdBillsEditor/renameStdbillsLib",
+            data: {data: JSON.stringify({id: billsLibId, value: newName})},
+            dataType: "json",
+            success: function(result){
+                if(!result.error){
+                    var jqSel = "#" + billsLibId + " td:first" + " a";
+                    $(jqSel).text(newName);
+                }
+            }
+        });
+    }
+}
+
+var billsAjax = {
+    getStdBillsLibName: function(billsLibId) {
+        $.ajax({
+            type: "post",
+            url: "/stdBillsEditor/getStdBillsLibName",
+            data: {data: JSON.stringify({billsLibId: billsLibId})},
+            success: function(result){
+                if(!result.error){
+                    $(".navbar-text").append(
+                    "<a href='stdBillsmain'>清单规则</a><i class='fa fa-angle-right fa-fw'></i>"+result.data[0].billsLibName
+                    );
+                }
+            }
+        });
+    },
+    getBills: function(billsLibId){
+        $.ajax({
+            type: "post",
+            url: "/stdBillsEditor/getBills",
+            data: {data: JSON.stringify({billsLibId: billsLibId})},
+            dataType: "json",
+            success: function(result){
+                if(!result.error){
+                    showBillsSheet(result.data);
+                }
+            }
+        });
+    },
+    createBills: function(billsLibId, newId, pid, nid){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/createBills',
+            data: {data: JSON.stringify({billsLibId: billsLibId, newId: newId, ParentID: pid, NextSiblingID: nid})},
+            dataType: 'json',
+            success: function(result){
+            }
+        });
+    },
+    updatePNId: function(billsLibId, updateId, pid, nid){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updatePNId',
+            data: {data: JSON.stringify({billsLibId: billsLibId, updateId: updateId, ParentID: pid, NextSiblingID: nid})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    },
+    deleteBills: function(billsLibId, deleteIds){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/deleteBills',
+            data: {data: JSON.stringify({billsLibId: billsLibId, deleteIds: deleteIds})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    }
+}

+ 165 - 0
web/billsLib/scripts/billsLibSetting.js

@@ -0,0 +1,165 @@
+/**
+ * Created by vian on 2017/4/10.
+ */
+var billsLibSetting = {
+    cols:[
+        {
+            head: {
+                titleNames: ['编码'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'code',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 160
+        },
+        {
+            head: {
+                titleNames: ['名称'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'name',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 300
+        },
+        {
+            head: {
+                titleNames: ['计量单位'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'unit',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 160
+        },
+        {
+            head: {
+                titleNames: ['工程量计算规则'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'ruleText',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 420
+        }
+    ],
+    headRows: 2,
+    headRowHeight: [20, 30, 30],
+    emptyRows: 3,
+    treeCol: 0
+};
+
+var jobsSetting = {
+    cols:[
+        {
+            head: {
+                titleNames: ['编号'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'code',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 100
+        },
+        {
+            head: {
+                titleNames: ['工作内容'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'content',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 215
+        },
+    ],
+    headRows: 2,
+    headRowHeight: [20, 30, 30],
+    emptyRows: 3,
+    treeCol: 0
+};
+
+var itemsSetting = {
+    cols:[
+        {
+            head: {
+                titleNames: ['编号'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'code',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 100
+        },
+        {
+            head: {
+                titleNames: ['项目 特征'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'character',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 215
+        },
+    ],
+    headRows: 2,
+    headRowHeight: [20, 30, 30],
+    emptyRows: 3,
+    treeCol: 0
+}

+ 38 - 0
web/billsLib/scripts/billsLibTree.js

@@ -0,0 +1,38 @@
+/**
+ * Created by vian on 2017/4/10.
+ */
+var billsLibTree = {
+    setting: {
+        id: 'ID',
+        pid: 'ParentID',
+        nid: 'NextSiblingID',
+        rootId: -1
+    },
+    virtualRoot: [{
+        ID: 1,
+        ParentID: -1,
+        NextSiblingID: -1,
+        code: '开始编辑',
+    }],
+    createBillsTree: function(){
+        var billsTree = function(){
+            this.datas = null;
+            this.tree = null;
+        };
+
+        billsTree.prototype.loadDatas = function(datas){
+            if(datas){
+                this.datas = datas;
+                this.tree = idTree.createNew(billsLibTree.setting);
+                this.tree.loadDatas(this.datas);
+           }
+           else {
+                this.datas = [];
+                this.tree = idTree.createNew(billsLibTree.setting);
+                this.tree.loadDatas(this.datas);
+            }
+        };
+
+        return new billsTree();
+    }
+}

web/bills/scripts/dateFormat.js → web/billsLib/scripts/dateFormat.js


+ 111 - 0
web/billsLib/scripts/dbController.js

@@ -0,0 +1,111 @@
+/**
+ * Created by vian on 2017/4/12.
+ */
+var dbController = {
+    insert: function(controller){
+        if(controller.tree.items.length === 0){
+            billsAjax.createBills(billsLibId, 1, -1 , -1);
+            controller.insert();
+        }
+        else {
+            var node = controller.tree.selected;
+            if(node){
+                var updateId = node.getID(), createpid = node.getParentID(), createnid = node.getNextSiblingID();
+                controller.insert();
+                billsAjax.createBills(billsLibId, node.getNextSiblingID(), createpid, createnid);
+                billsAjax.updatePNId(billsLibId, updateId, -1, node.getNextSiblingID());
+            }
+            else {
+                var updateNode = controller.tree.roots[controller.tree.roots.length - 1];
+                var updateId = updateNode.getID();
+                controller.insert();
+                billsAjax.createBills(billsLibId, updateNode.getNextSiblingID(), -1, -1);
+                billsAjax.updatePNId(billsLibId, updateId, -1, updateNode.getNextSiblingID());
+            }
+        }
+    },
+
+    delete: function(controller){
+        var node = controller.tree.selected;
+        var deleteIds = [];
+        var getDeleteIds = function(node){
+            if(node){
+                deleteIds.push(node.getID());
+                if(node.children.length > 0){
+                    for(var i=0; i<node.children.length; i++){
+                        getDeleteIds(node.children[i]);
+                    }
+                }
+            }
+        };
+        getDeleteIds(node);
+        billsAjax.deleteBills(billsLibId, deleteIds);
+        if(node.preSibling){
+            billsAjax.updatePNId(billsLibId, node.preSibling.getID(), null, node.getNextSiblingID());
+        }
+        controller.delete();
+    },
+
+    upLevel: function(controller){
+        var node = controller.tree.selected;
+        if(node){
+            if(node.parent){
+                //node
+                billsAjax.updatePNId(billsLibId, node.getID(), node.parent.getParentID(), node.parent.getNextSiblingID());
+                //parent
+                billsAjax.updatePNId(billsLibId, node.getParentID(), null, node.getID());
+                if(node.nextSibling){
+                    //node.nextSibling
+                    billsAjax.updatePNId(billsLibId, node.getNextSiblingID(), node.getID(), null);
+                }
+                if(node.preSibling){
+                    billsAjax.updatePNId(billsLibId, node.preSibling.getID(), null, -1);
+                }
+            }
+            controller.upLevel();
+        }
+
+    },
+
+    downLevel: function(controller){
+        var node = controller.tree.selected;
+        if(node){
+            if(node.preSibling){
+                billsAjax.updatePNId(billsLibId, node.preSibling.getID(), null, node.getNextSiblingID());
+                billsAjax.updatePNId(billsLibId, node.getID(), node.preSibling.getID(), -1);
+                if(node.preSibling.children.length > 0){
+                    billsAjax.updatePNId(billsLibId, node.preSibling.children[node.preSibling.children.length -1].getID(), null, node.getID());
+                }
+                controller.downLevel();
+            }
+        }
+    },
+
+    upMove: function(controller){
+        var node = controller.tree.selected;
+        if(node){
+            if(node.preSibling){
+                billsAjax.updatePNId(billsLibId, node.preSibling.getID(), null, node.getNextSiblingID());
+                billsAjax.updatePNId(billsLibId, node.getID(), null, node.preSibling.getID());
+                if(node.preSibling.preSibling){
+                    billsAjax.updatePNId(billsLibId, node.preSibling.preSibling.getID(), null, node.getID());
+                }
+                controller.upMove();
+            }
+        }
+    },
+
+    downMove: function(controller){
+        var node = controller.tree.selected;
+        if(node){
+            if(node.nextSibling){
+                billsAjax.updatePNId(billsLibId, node.getNextSiblingID(), null, node.getID());
+                billsAjax.updatePNId(billsLibId, node.getID(), null, node.nextSibling.getNextSiblingID());
+                if(node.preSibling){
+                    billsAjax.updatePNId(billsLibId, node.preSibling.getID(), null, node.getNextSiblingID());
+                }
+                controller.downMove();
+            }
+        }
+    }
+}

web/bills/scripts/global.js → web/billsLib/scripts/global.js


+ 19 - 34
web/bills/scripts/setSheets.js

@@ -1,29 +1,23 @@
 /**
  * Created by vian on 2017/3/16.
  */
-//初始表单
-function initSheet(spread, sheet, chRowCount, vpRowCount, vpColCount){
-    var spreadNS = GC.Spread.Sheets;
+
+function initSheet(spread){
+    var spreadNS = GC.Spread.Sheets, sheet = spread.getActiveSheet();
     spread.options.showHorizontalScrollbar = false;
     spread.options.showVerticalScrollbar =false;
     spread.options.tabStripVisible = false;
     spread.options.scrollbarMaxAlign = true;
     sheet.showRowOutline(false);
     sheet.defaults.rowHeight = 30;
-    sheet.setRowCount(chRowCount, spreadNS.SheetArea.colHeader);
-    sheet.setRowCount(vpRowCount, spreadNS.SheetArea.viewport);
-    sheet.setColumnCount(vpColCount, spreadNS.SheetArea.viewport);
-
 }
-//设置初始行高
-function initRowHeight(sheet){
-    /*var rowCount = sheet.getRowCount();
-    for(var i=0; i<rowCount; i++){
-        sheet.setRowHeight(i, 30);
-    }*/
+
+function initHeader(spread, setting){
+    var sheet = spread.getActiveSheet();
+    sheet.setColumnCount(setting.cols.length);
+    sheet.setRowCount();
 }
 
-//单元格设置
 function setCell(sheet){
     var colCount = sheet.getColumnCount();
     var vp = GC.Spread.Sheets.SheetArea.viewport;
@@ -32,39 +26,31 @@ function setCell(sheet){
     for(var i= 0; i<colCount; i++){
         sheet.getRange(-1, i, -1, 1, vp).vAlign(center);
         sheet.getRange(-1, i, -1, 1, vp).hAlign(left);
-        sheet.getRange(-1, i, -1, 1, vp).font("12pt 宋体");
+        sheet.getRange(-1, i, -1, 1, vp).font("12pt 锟斤拷锟斤拷");
     }
 }
 
-//绑定事件,统一事件
 function setupEvents(spread, sheet){
     var events = GC.Spread.Sheets.Events;
     $("#aDelete").click(function(){
         var rowIdx = sheet.getActiveRowIndex();
         sheet.deleteRows(rowIdx, 1);
     });
-    //EditChange
-   /* sheet.bind(events.EditChange, function(e, args){
-        console.log("EditChange!");
-    });*/
-    //EditEnded
+
    sheet.bind(events.EditEnded, function(e, args){
        var editRow = args.row;
        var editCol = args.col;
        var eiditVal = sheet.getValue(editRow, editCol);
         console.log("EE: row: "+editRow+"  col: "+editCol +"val: "+eiditVal);
     });
-    //EditEnding
-    /*sheet.bind(events.EditEnding, function(e, args){
-        console.log("EEing");
-    });*/
+
 }
-//滚动条
+
 function setScrollBar(spread, sheet, initRow){
     var events = GC.Spread.Sheets.Events;
     sheet.bind(events.EnterCell, function(e, data){
         var rowCount = sheet.getRowCount();
-        //当前行数大于初始行数
+        //锟斤拷前锟斤拷锟斤拷锟斤拷锟节筹拷始锟斤拷锟斤拷
         if(rowCount >initRow){
             spread.options.showVerticalScrollbar = true;
         }
@@ -74,31 +60,30 @@ function setScrollBar(spread, sheet, initRow){
     });
 }
 
-//自定义按钮
+
 function myCommand(spread, sheet){
     var keys = GC.Spread.Commands.Key;
-    //enter,最后一行回车键添加新行
+    //enter,锟斤拷锟揭伙拷谢爻锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
     spread.commandManager().register("myEnter", function(){
         var idxRow = sheet.getActiveRowIndex();
         var rowCount = sheet.getRowCount();
         if(idxRow+1 == rowCount){
             sheet.addRows(rowCount, 1);
-            sheet.setRowHeight(rowCount, 30);//设置行高
+            sheet.setRowHeight(rowCount, 30);//锟斤拷锟斤拷锟叫革拷
             sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
-            sheet.getRange(rowCount, -1, 1, -1).font("10pt 微软雅黑");
+            sheet.getRange(rowCount, -1, 1, -1).font("10pt 微锟斤拷锟脚猴拷");
         }
     });
     spread.commandManager().setShortcutKey("myEnter", keys.enter, false, false, false, false);
-    //down,最后一行down添加新行
     spread.commandManager().register("myDown", function(){
         var idxRow = sheet.getActiveRowIndex();
         var rowCount = sheet.getRowCount();
         if(idxRow+1 == rowCount){
             sheet.suspendPaint();
             sheet.addRows(rowCount, 1);
-            sheet.setRowHeight(rowCount, 30);//设置行高
+            sheet.setRowHeight(rowCount, 30);//锟斤拷锟斤拷锟叫革拷
             sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
-            sheet.getRange(rowCount, -1, 1, -1).font("10pt 微软雅黑");
+            sheet.getRange(rowCount, -1, 1, -1).font("10pt 微锟斤拷锟脚猴拷");
             sheet.resumePaint();
         }
     });

+ 35 - 4
web/fees/feeRate.js

@@ -3,6 +3,7 @@
  */
 var region = '重庆';
 var feeRateFileID = 5;
+var datas = [];
 var spreadView;
 
 $(document).ready(function () {
@@ -23,7 +24,8 @@ function loadProjectFeeRates(fileID) {
         data: {"fileID": fileID},
         success: function (result) {
             if (result.data) {
-                createSpreadView(result.data[0].rates, true);
+                datas = result.data[0].rates;
+                createSpreadView(true);
             }
         },
         error: function (result) {
@@ -61,7 +63,8 @@ function loadLibFeeRates(libID) {
         data: {"libID": libID},
         success: function (result) {
             if (result.data) {
-                createSpreadView(result.data[0].rates, false);
+                datas = result.data[0].rates;
+                createSpreadView(false);
             }
         },
         error: function (result) {
@@ -70,7 +73,7 @@ function loadLibFeeRates(libID) {
     });
 }
 
-function createSpreadView(datas, canEdit) {
+function createSpreadView(canEdit) {
     // 创建前先销毁旧树表。
     //$('#divFee').empty();  // 清空不行,浏览器跟踪显示错误数狂飚:TypeError: G is null
     //$('#divFee').remove(); // 删除可以,但是太山寨。
@@ -142,8 +145,36 @@ function createSpreadView(datas, canEdit) {
         }
     };
 
+    var dataSource = {
+        loadRange: function(params) {
+            params.success(datas);
+        },
+
+        update: function(params) {
+            $.ajax({
+                type: 'POST',
+                url: '/fees/updateProjectFeeRate',
+                data: {"fileID": feeRateFileID, "rateID": params.dataItem.ID, "rateValue": params.dataItem.rate},
+                success: function(data) {
+                    var iCode = data.data;
+                    if (iCode == 1){
+                        params.success();
+                    }else{
+                        alert('(' + iCode + ') 修改失败!');
+                        spreadView.cancelEditing();
+                        params.failed();
+                    }
+                },
+                error: function(xhr, status) {
+                    alert('内部程序错误!');
+                    params.failed();
+                }
+            });
+        }
+    };
+
     spreadView = new GC.Spread.Views.DataView($('#divFee')[0],
-        datas, columns, new GC.Spread.Views.Plugins.GridLayout(options));
+        dataSource, columns, new GC.Spread.Views.Plugins.GridLayout(options));
     spreadView.invalidate();
     document.querySelector('#divFee').focus();
 }

+ 34 - 4
web/main/html/main.html

@@ -618,10 +618,11 @@
         project = PROJECT.createNew();
         project.Bills.loadDatas(datas);
         project.Rations.loadDatas(drawing_data);
-        project.mainTree.loadDatas(project.Bills.tree, project.Rations.datas);
+        project.loadMainTree();
+        //project.mainTree.loadDatas(project.Bills.tree, project.Rations.datas);
 
-        //controller = TREE_SHEET_CONTROLLER.createNew(project.mainTree, billsSpread.getActiveSheet(), BillsGridSetting);
-        controller = TREE_SHEET_CONTROLLER.createNew(project.Bills.tree, billsSpread.getActiveSheet(), BillsGridSetting);
+        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) {
@@ -639,7 +640,36 @@
         });
 
         $('#insert').click(function () {
-            controller.insert();
+            var selected = controller.tree.selected;
+            var newSource = null, newNode = null, sels = billsSpread.getActiveSheet().getSelections();
+
+            if (!selected || selected.sourceType === project.Bills.getSourceType()) {
+                newSource = project.Bills.tree.insert(selected ? selected.source.getParentID() : -1, selected ? selected.source.getNextSiblingID() : -1);
+                newSource.data.Name = 'aaa';
+                newNode = project.mainTree.insert(selected.getParentID(), selected.getNextSiblingID());
+            } else if (selected.sourceType === project.Rations.getSourceType()) {
+
+            } else if (selected.sourceType === project.GLJs.getSourceType()) {
+
+            }
+
+            if (newNode) {
+                newNode.source = newSource;
+                newNode.sourceType = selected ? selected.sourceType : project.Bills.getSourceType();
+                if (newNode.sourceType === project.Bills.getSourceType()) {
+                    newNode.data = newSource.data;
+                } else {
+                    newNode.data = newSource;
+                }
+
+                TREE_SHEET_HELPER.massOperationSheet(controller.sheet, function () {
+                    controller.sheet.addRows(newNode.serialNo(), 1);
+                    TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, [newNode], false);
+                    controller.setTreeSelected(newNode);
+                    controller.sheet.setSelection(newNode.serialNo(), sels[0].col, 1, 1);
+                    controller.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center)
+                });
+            }
         });
         $('#delete').click(function () {
             controller.delete();

+ 14 - 2
web/main/js/models/bills.js

@@ -18,13 +18,25 @@ var Bills = {
         var bills = function (proj) {
             this.project = proj;
             this.datas = null;
-            this.tree = null;
+            this.tree = idTree.createNew(billsTreeSetting);
+
+            var sourceType = 'bills';
+            this.getSourceType = function () {
+                return sourceType;
+            }
         };
 
         // prototypeÓÃÓÚ¶¨Òåpublic·½·¨
         bills.prototype.loadDatas = function (datas) {
             this.datas = datas;
-            this.tree = idTree.createNew(billsTreeSetting);
+            // generate Fees Index£¬For View & Calculate
+            /*this.datas.forEach(function (data) {
+                data.FeesIndex = {};
+                data.fees.forEach(function (fee) {
+                    data.FeesIndex[fee.fieldName] = fee;
+                });
+            });*/
+            // datas load to Tree
             this.tree.loadDatas(this.datas);
         };
 

+ 31 - 78
web/main/js/models/cache_tree.js

@@ -3,9 +3,6 @@
  */
 var cacheTree = {
     createNew: function (owner) {
-        var _eventType = {
-            afterSelectedChanged: 'afterSelectedChanged'
-        };
         var tools = {
             findNode: function (nodes, check) {
                 for (var i = 0; i < nodes.length; i++) {
@@ -102,17 +99,6 @@ var cacheTree = {
                     }
                     nodes[i].parent = parent;
                 }
-            },
-            sortTreeItems: function (tree) {
-                var addItems = function (items) {
-                    var i;
-                    for (i = 0; i < items.length; i++) {
-                        tree.items.push(items[i]);
-                        addItems(items[i].children);
-                    }
-                };
-                tree.items.splice(0, tree.items.length);
-                addItems(tree.roots);
             }
         };
 
@@ -129,7 +115,7 @@ var cacheTree = {
             this.expanded = true;
             this.visible = true;
 
-            this.nodeType = null;
+            this.sourceType = null;
             this.source = null;
 
             this.getID = function () {
@@ -212,14 +198,14 @@ var cacheTree = {
         };
 
         Node.prototype.canUpLevel = function () {
-            if (this.nodeType === this.tree.nodeType.bills) {
+            if (this.sourceType === this.tree.owner.Bills.getSourceType()) {
                 return this.parent ? true : false;
             } else {
                 return false;
             }
         };
         Node.prototype.canDownLevel = function () {
-            return this.nodeType === this.tree.nodeType.bills ? !this.isFirst() : false;
+            return this.sourceType === this.tree.owner.Bills.getSourceType() ? !this.isFirst() : false;
         };
         Node.prototype.canUpMove = function () {
             return !this.isFirst();
@@ -268,7 +254,7 @@ var cacheTree = {
                 this.nextSibling = orgPre;
                 belongArray.splice(iIndex, 1);
                 belongArray.splice(iIndex - 1, 0, this);
-                tools.sortTreeItems(this.tree);
+                this.tree.sortTreeItems();
                 success = true;
             }
             return success;
@@ -283,22 +269,20 @@ var cacheTree = {
                 this.preSibling = orgNext;
                 belongArray.splice(iIndex, 1);
                 belongArray.splice(iIndex + 1, 0, this);
-                tools.sortTreeItems(this.tree);
+                this.tree.sortTreeItems();
                 success = true;
             }
             return success;
         };
 
         var Tree = function (owner) {
+            this.owner = owner;
             this.nodes = {};
             this.roots = [];
             this.items = [];
             this.prefix = 'id_';
             this.selected = null;
 
-            this.nodeType = {bills: 'bills', ration: 'ration', zc: 'zhuCai'};
-            this.masterField = {ration: 'BillsID'};
-
             var _MaxID = 0;
             this.newNodeID = function (id) {
                 if (arguments.length === 0) {
@@ -315,44 +299,29 @@ var cacheTree = {
             }
         };
 
-        Tree.prototype.createNewNode = function () {
-            var node = new Node(this, this.newNodeID());
-            this.nodes[this.prefix + node.getID()] = node;
-            return node;
+        Tree.prototype.addNode = function (parent, nextSibling) {
+            var newNode = new Node(this, this.newNodeID());
+            this.nodes[this.prefix + newNode.getID()] = newNode;
+            if (nextSibling) {
+                tools.addNodes(this, parent, [newNode], nextSibling.siblingIndex());
+            } else {
+                tools.addNodes(this, parent, [newNode]);
+            }
+            return newNode;
         };
-
-        Tree.prototype.loadDatas = function (idTree, rations) {
+        Tree.prototype.sortTreeItems = function () {
             var that = this;
-            var loadRationNode = function (rations, cacheNode) {
-                var newNode;
-                rations.forEach(function (ration) {
-                    if (ration[that.masterField.ration] && ration[that.masterField.ration] === cacheNode.source.getID()) {
-                        newNode = that.createNewNode();
-                        newNode.source = ration;
-                        newNode.nodeType = that.nodeType.ration;
-                        newNode.data = ration;
-                        tools.addNodes(that, cacheNode, [newNode]);
-                    }
-                });
-            };
-            var loadIdTreeNode = function (nodes, parent) {
-                var newNode, i;
+            var addItems = function (nodes) {
+                var i;
                 for (i = 0; i < nodes.length; i++) {
-                    newNode = that.createNewNode();
-                    newNode.source = nodes[i];
-                    newNode.nodeType = that.nodeType.bills;
-                    newNode.data = nodes[i].data;
-                    newNode.parent = parent;
-                    tools.addNodes(that, parent, [newNode]);
-                    if (nodes[i].children.length === 0) {
-                        loadRationNode(rations, newNode);
-                    };
-                    loadIdTreeNode(nodes[i].children, newNode);
+                    that.items.push(nodes[i]);
+                    addItems(nodes[i].children);
                 }
             };
-            loadIdTreeNode(idTree.roots, null);
-            tools.sortTreeItems(this);
+            this.items.splice(0, this.items.length);
+            addItems(this.roots);
         };
+
         Tree.prototype.firstNode = function () {
             return this.roots.length === 0 ? null : this.roots[0];
         };
@@ -371,25 +340,13 @@ var cacheTree = {
         };
 
         Tree.prototype.insert = function (parentID, nextSiblingID) {
-            var newID = this.newNodeID(), node = null, data = {};
-            var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID === -1 ? null: this.nodes[this.prefix + nextSiblingID];
-            if (newID !== -1) {
-                data = {};
-                data[this.setting.id] = newID;
-                data[this.setting.pid] = parentID;
-                data[this.setting.nid] = nextSiblingID;
-                node = new Node(this, data);
-                if (nextSibling) {
-                    tools.addNodes(this, parent, [node], nextSibling.siblingIndex());
-                } else {
-                    tools.addNodes(this, parent, [node]);
-                }
-                this.nodes[this.prefix + newID] = node;
-                tools.sortTreeItems(this);
-                this.maxNodeID(newID);
-            }
-            return node;
+            var parent = !parentID || parentID === -1 ? null : this.nodes[this.prefix + parentID];
+            var nextSibling = !nextSiblingID || nextSiblingID === -1 ? null: this.nodes[this.prefix + nextSiblingID];
+
+            var newNode = this.addNode(parent, nextSibling);
+            this.sortTreeItems();
+
+            return newNode;
         };
         Tree.prototype.delete = function (node) {
             var success = false;
@@ -406,16 +363,12 @@ var cacheTree = {
                 } else {
                     this.roots.splice(node.siblingIndex(), 1);
                 }
-                tools.sortTreeItems(this);
+                this.sortTreeItems();
                 success = true;
             }
             return success;
         };
 
-        Tree.prototype.editedData = function (field, id, newText) {
-            var node = this.findNode(id);
-        }
-
         return new Tree(owner);
     }
 };

+ 5 - 0
web/main/js/models/gljs.js

@@ -10,6 +10,11 @@ var GLJs = {
         var gljs = function (proj) {
             this.project = proj;
             this.datas = null;
+
+            var sourceType = 'glj';
+            this.getSourceType = function () {
+                return sourceType;
+            }
         };
 
         // prototypeÓÃÓÚ¶¨Òåpublic·½·¨

+ 35 - 0
web/main/js/models/project.js

@@ -13,6 +13,9 @@ var PROJECT = {
             this.Bills = Bills.createNew(this);
             this.Rations = Rations.createNew(this);
             this.GLJ = GLJs.createNew(this);
+
+
+            this.masterField = {ration: 'BillsID'};
         };
 
         // prototypeÓÃÓÚ¶¨Òåpublic·½·¨
@@ -20,6 +23,38 @@ var PROJECT = {
             // To Do
         };
 
+        project.prototype.loadMainTree = function () {
+            var that = this;
+            var loadRationNode = function (rations, cacheNode) {
+                var newNode;
+                rations.forEach(function (ration) {
+                    if (ration[that.masterField.ration] && ration[that.masterField.ration] === cacheNode.source.getID()) {
+                        newNode = that.mainTree.addNode(cacheNode);
+                        newNode.source = ration;
+                        newNode.sourceType = that.Rations.getSourceType();
+                        newNode.data = ration;
+                    }
+                });
+            };
+            var loadIdTreeNode = function (nodes, parent) {
+                var newNode, i;
+                for (i = 0; i < nodes.length; i++) {
+                    newNode = that.mainTree.addNode(parent);
+                    newNode.source = nodes[i];
+                    newNode.sourceType = that.Bills.getSourceType();
+                    newNode.data = nodes[i].data;
+
+                    if (nodes[i].children.length === 0) {
+                        loadRationNode(that.Rations.datas, newNode);
+                    } else {
+                        loadIdTreeNode(nodes[i].children, newNode);
+                    }
+                }
+            };
+            loadIdTreeNode(this.Bills.tree.roots, null);
+            this.mainTree.sortTreeItems();
+        }
+
         return new project();
     }
 };

+ 5 - 0
web/main/js/models/rations.js

@@ -11,6 +11,11 @@ var Rations = {
         var rations = function (proj) {
             this.project = proj;
             this.datas = null;
+
+            var sourceType = 'ration';
+            this.getSourceType = function () {
+                return sourceType;
+            }
         };
 
         // prototypeÓÃÓÚ¶¨Òåpublic·½·¨