Browse Source

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

Chenshilong 8 years ago
parent
commit
b0a720ee48
48 changed files with 1669 additions and 505 deletions
  1. 10 4
      modules/bills/controllers/billsControllers.js
  2. 70 57
      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. 55 0
      modules/main/controllers/bills_controller.js
  7. 55 0
      modules/main/controllers/rations_controller.js
  8. 8 0
      modules/main/db/project_db.js
  9. 102 0
      modules/main/models/bills.js
  10. 3 0
      modules/main/models/billsExprs.js
  11. 22 0
      modules/main/models/billsSubSchemas.js
  12. 3 0
      modules/main/models/expressions.js
  13. 24 0
      modules/main/models/gljs.js
  14. 21 0
      modules/main/models/projectGLJ.js
  15. 25 0
      modules/main/models/rationPrograms.js
  16. 89 0
      modules/main/models/rations.js
  17. 13 0
      modules/main/routes/bills_route.js
  18. 13 0
      modules/main/routes/rations_route.js
  19. 324 28
      modules/reports/util/rpt_excel_util.js
  20. 28 0
      public/fsUtil.js
  21. 53 0
      public/stringUtil.js
  22. 3 12
      public/web/idTree.js
  23. 38 26
      public/web/tree_sheet_controller.js
  24. 9 4
      server.js
  25. 7 2
      test/demo/demo.js
  26. 50 0
      test/demo/stringTest.js
  27. 1 1
      test/unit/excel_export/fileReadWrite.js
  28. 1 0
      test/unit/excel_export/privateFunctionTest.js
  29. 57 0
      test/unit/excel_export/rpt_excel_export_test.js
  30. 1 1
      tmp/07_1.page.js
  31. 0 59
      web/bills/html/testCanvas.html
  32. 0 94
      web/bills/scripts/billsAjax.js
  33. 0 84
      web/bills/scripts/buildTreeData.js
  34. 0 25
      web/bills/scripts/testTreeData.js
  35. 2 5
      web/bills/html/main.html
  36. 2 2
      web/bills/html/neirong.html
  37. 154 44
      web/bills/html/qingdan.html
  38. 19 0
      web/billsLib/html/test.html
  39. 2 2
      web/bills/html/tezheng.html
  40. 147 0
      web/billsLib/scripts/billsLibAjax.js
  41. 165 0
      web/billsLib/scripts/billsLibSetting.js
  42. 38 0
      web/billsLib/scripts/billsLibTree.js
  43. 0 0
      web/billsLib/scripts/dateFormat.js
  44. 0 0
      web/billsLib/scripts/global.js
  45. 19 34
      web/bills/scripts/setSheets.js
  46. 9 6
      web/main/html/main.html
  47. 15 4
      web/main/js/models/cache_tree.js
  48. 1 1
      web/main/js/models/project.js

+ 10 - 4
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);
         });
     },

+ 70 - 57
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,73 @@ 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 = {
+    counter.getIDAfterCount('bills', 1, function(err, result){
+        var newId = result.value.sequence_value;
+        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 updateId = updateData.updateId;
+    var updatepid= updateData.ParentID;
+    var updatenid = updateData.NextSiblingID;
+    if(!updatepid){
+        Bills.update({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({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({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;
@@ -230,7 +243,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 +323,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);

+ 55 - 0
modules/main/controllers/bills_controller.js

@@ -0,0 +1,55 @@
+/**
+ * Created by jimiz on 2017/4/7.
+ */
+var billsData = require('../models/bills');
+
+//统一回调函数
+var callback = function(req, res, err, message, data){
+    res.json({error: err, message: message, data: data});
+};
+
+module.exports = {
+    getBills: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsData.getBills(data.projectId, function(err, message, billsList){
+            if (err === 0) {
+                callback(req, res, err, message, billsList);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    },
+
+    updateBills: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsData.updateBills(data, function(err, message, errList){
+            if (err) {
+                callback(req, res, err, message, errList);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    },
+
+    getBillsItemTemplate: function(req, res){
+        //var data = JSON.parse(req.body.data);
+        billsData.getBillsItemTemplate(function(err, message, billsItem){
+            if (billsItem) {
+                callback(req, res, err, message, billsItem);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    },
+
+    allocIDs: function(req, res){
+        billsData.allocIDs(function(err, message, data){
+            if (err) {
+                callback(req, res, err, message, data);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    }
+
+};

+ 55 - 0
modules/main/controllers/rations_controller.js

@@ -0,0 +1,55 @@
+/**
+ * Created by jimiz on 2017/4/9.
+ */
+var rationsData = require('../models/rations');
+
+//统一回调函数
+var callback = function(req, res, err, message, data){
+    res.json({error: err, message: message, data: data});
+};
+
+module.exports = {
+    getRations: function(req, res){
+        var data = JSON.parse(req.body.data);
+        rationsData.getRations(data.projectId, function(err, message, rationList){
+            if (err === 0) {
+                callback(req, res, err, message, rationList);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    },
+
+    updateRations: function(req, res){
+        var data = JSON.parse(req.body.data);
+        rationsData.updateRations(data, function(err, message, errList){
+            if (err) {
+                callback(req, res, err, message, errList);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    },
+
+    getRationItemTemplate: function(req, res){
+        //var data = JSON.parse(req.body.data);
+        rationsData.getRationItemTemplate(function(err, message, rationItem){
+            if (billsItem) {
+                callback(req, res, err, message, rationItem);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    },
+
+    allocIDs: function(req, res){
+        rationsData.allocIDs(function(err, message, data){
+            if (err) {
+                callback(req, res, err, message, data);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        });
+    }
+
+};

+ 8 - 0
modules/main/db/project_db.js

@@ -0,0 +1,8 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var dbm = require("../../../config/db/db_manager");
+var db = dbm.getCfgConnection("scConstruct");
+
+module.exports = db;

+ 102 - 0
modules/main/models/bills.js

@@ -0,0 +1,102 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var db = require("../db/project_db");
+var subSchema = require("./billsSubSchemas");
+var Schema = mongoose.Schema;
+var counter = require("../../../public/counter/counter.js");
+
+var billsSchema = new Schema({
+    id: Number,
+    parentId: Number,
+    nextSiblingId: Number,
+    projectId: Number,
+    serialNo: Number,
+    chapterId: Number,
+    code: String,
+    fullCode: String,
+    name: String,
+    unit: String,
+    quantity: String, // Decimal
+    programId: Number,
+    comments: String,
+    // 调价
+    xs_Labour: String, // Decimal
+    xs_Material: String, // Decimal
+    xs_Machine: String, // Decimal
+    xs_FeeRate: String, // Decimal
+    xs_LabourPrice: String, // Decimal
+    xs_MaterialPrice: String, // Decimal
+    xs_MachinePrice: String, // Decimal
+    isTender_Labour: Boolean,
+    isTender_Material: Boolean,
+    isTender_Machine: Boolean,
+    tenderTargetPrice: String, // Decimal
+    tenderTargetUnitPrice: String, // Decimal
+    // 费用字段
+    fees: [subSchema.feesSchema],
+    // 标记字段
+    flags: [subSchema.flagsSchema]
+});
+
+var bills = db.model("bills", billsSchema);
+
+var billsDAO = function(){};
+
+billsDAO.prototype.getBills = function(projectId, callback){
+    Projects.find({projectId: projectId}, function(err, datas){
+        if (!err) {
+            callback(0, '', datas);
+        } else {
+            callback(1, '', null);
+        };
+    });
+};
+
+billsDAO.prototype.updateBills = 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, 'update error.', errList);
+        } else {
+            callback(0, '', null);
+        };
+    };
+};
+
+billsDAO.prototype.getBillsItemTemplate = function(callback){
+    var data = new bills;
+    /* to do: 需要根据标准配置库填充fees和flags字段,是否需要更多的参数? */
+    callback(0, '', data);
+};
+
+const
+    IDStep = 50, IDModule = 'bills';
+
+billsDAO.prototype.allocIDs = function(callback){
+    var lowID, highID;
+    counter.getIDAfterCount(IDModule, IDStep, function(highID, err){});
+    lowID = highID - IDStep + 1;
+    callback(0, '', {lowID, highID});
+};
+
+module.exports = new billsDAO();

+ 3 - 0
modules/main/models/billsExprs.js

@@ -0,0 +1,3 @@
+/**
+ * Created by jimiz on 2017/4/10.
+ */

+ 22 - 0
modules/main/models/billsSubSchemas.js

@@ -0,0 +1,22 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var Schema = mongoose.Schema;
+
+// 费用字段
+var feesSchema = new Schema({
+    fieldName: String,
+    unitFee: String, // Decimal. 单价
+    totalFee: String, // Decimal. 合价
+    tenderUnitFee: String, // Decimal. 调价后单价
+    tenderTotalFee: String // Decimal. 调价后合价
+});
+
+// 标记字段
+var flagsSchema = new Schema({
+    fieldName: String,
+    flag: Boolean
+});
+
+module.exports = {feesSchema, flagsSchema};

+ 3 - 0
modules/main/models/expressions.js

@@ -0,0 +1,3 @@
+/**
+ * Created by jimiz on 2017/4/10.
+ */

+ 24 - 0
modules/main/models/gljs.js

@@ -0,0 +1,24 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var db = require("../db/project_db");
+var Schema = mongoose.Schema;
+
+var gljSchema = new Schema({
+    id: Number,
+    projectID: Number,
+    orgRQuantity: String, //Decimal
+    rQuantity: String, //Decimal
+    customQuantity: String, //Decimal
+    quantity: String, //Decimal
+    rationItemQuantity: String, //Decimal
+    rationPrice: String, //Decimal
+    adjustPrice: String, //Decimal
+    price: String, //Decimal
+    tenderQuantity: String, //Decimal
+    tenderPrice: String, //Decimal
+    type: Number
+    // to do
+
+});

+ 21 - 0
modules/main/models/projectGLJ.js

@@ -0,0 +1,21 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var db = require("../db/project_db");
+var Schema = mongoose.Schema;
+
+var projectGLJSchema = new Schema({
+    id: Number,
+    projectId: Number,
+    code: Number,
+    name: String,
+    specs: String,
+    unit: String,
+    type: String,
+    amount: String, // Decimal
+    rationPrice: String, //Decimal
+    adjustPrice: String, //Decimal
+    price: String //Decimal
+    // to do
+});

+ 25 - 0
modules/main/models/rationPrograms.js

@@ -0,0 +1,25 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var db = require("../db/project_db");
+var Schema = mongoose.Schema;
+
+var rationProgramSchema = new Schema({
+    id: Number,
+    projectId: Number,
+    name: String,
+    programs: [{
+        id: Number,
+        serialNo: Number,
+        code: String,
+        name: String,
+        expression: String, // 表达式
+        displayExprs: String, // 显示用表达式/基数说明
+        feeRate: String, // Decimal
+        tenderFeeRate: String, // Decimal
+        feeRateID: Number, // 费率细目ID
+        mapField: String, // 对应定额表字段
+        comments: String // 备注
+    }]
+});

+ 89 - 0
modules/main/models/rations.js

@@ -0,0 +1,89 @@
+/**
+ * Created by jimiz on 2017/4/1.
+ */
+var mongoose = require("mongoose");
+var db = require("../db/project_db");
+var subSchema = require("./billsSubSchemas");
+var Schema = mongoose.Schema;
+
+var rationsSchema = new Schema({
+    id: Number,
+    projectId: Number,
+    billsItemId: Number,
+    serialNo: Number,
+    libID: Number,
+    code: String,
+    name: String,
+    maskName: String,
+    unit: String,
+    quantity: String, // Decimal
+    programId: Number,
+    content: String,
+    rationProjName: String,
+    comments: String,
+    // 费用字段
+    fees: [subSchema.feesSchema],
+    // 标记字段
+    flags: [subSchema.flagsSchema]
+});
+
+var rations = db.model("rations", rationsSchema);
+
+var rationsDAO = function(){};
+
+rationsDAO.prototype.getRations = function(projectId, callback){
+    Projects.find({projectID: projectId}, function(err, datas){
+        if (!err) {
+            callback(0, '', datas);
+        } else {
+            callback(1, '', null);
+        }
+    });
+};
+
+rationsDAO.prototype.updateRations = 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);
+        };
+    };
+};
+
+rationsDAO.prototype.getRationItemTemplate = function(callback){
+    var data = new rations;
+    /* to do: 需要根据标准配置库填充fees和flags字段,是否需要更多的参数? */
+    callback(0, '', data);
+};
+
+const
+    IDStep = 50, IDModule = 'rations';
+
+rationsDAO.prototype.allocIDs = function(callback){
+    var lowID, highID;
+    counter.getIDAfterCount(IDModule, IDStep, function(highID, err){});
+    lowID = highID - IDStep + 1;
+    callback(0, '', {lowID, highID});
+};
+
+module.exports = new rationsDAO();

+ 13 - 0
modules/main/routes/bills_route.js

@@ -0,0 +1,13 @@
+/**
+ * Created by jimiz on 2017/4/7.
+ */
+var express = require('express');
+var billsRouter = express.Router();
+var billsController = require('../controllers/bills_controller');
+
+billsRouter.post('/getBills', billsController.getBills);
+billsRouter.post('/updateBills', billsController.updateBills);
+billsRouter.post('/getBillsItemTemplate', billsController.getBillsItemTemplate);
+billsRouter.post('/allocIDs', billsController.allocIDs);
+
+module.exports = billsRouter;

+ 13 - 0
modules/main/routes/rations_route.js

@@ -0,0 +1,13 @@
+/**
+ * Created by jimiz on 2017/4/7.
+ */
+var express = require('express');
+var rationsRouter = express.Router();
+var rationsController = require('../controllers/rations_controller');
+
+rationsRouter.post('/getRations', rationsController.getRations);
+rationsRouter.post('/updateRations', rationsController.updateRations);
+rationsRouter.post('/getRationsItemTemplate', rationsController.getRationItemTemplate);
+rationsRouter.post('/allocIDs', rationsController.allocIDs);
+
+module.exports = rationsRouter;

+ 324 - 28
modules/reports/util/rpt_excel_util.js

@@ -3,6 +3,7 @@
  */
 var JV = require('../rpt_component/Jpc_ValueDefine');
 var fs = require('fs');
+var strUtil = require('../../../public/stringUtil');
 var jpcCmnHelper = require('../rpt_component/helper/Jpc_Helper_Common');
 var DPI = jpcCmnHelper.getScreenDPI()[0];
 const dftHeadXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
@@ -45,7 +46,7 @@ function writeApp(sheets) {
     rst.push('<ScaleCrop>false</ScaleCrop>');
     rst.push('<HeadingPairs>');
     rst.push('<vt:vector size="2" baseType="variant">');
-    rst.push('<vt:variant><vt:lpstr>¹¤×÷±í</vt:lpstr></vt:variant>');
+    rst.push('<vt:variant><vt:lpstr>工作�?</vt:lpstr></vt:variant>');
     rst.push('<vt:variant><vt:i4>' + sheets.length + '</vt:i4></vt:variant>');
     rst.push('</vt:vector>');
     rst.push('</HeadingPairs>');
@@ -78,7 +79,7 @@ function writeCore() {
     rst.push('<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">');
     rst.push('<dc:creator>SmartCost</dc:creator>');
     rst.push('<cp:lastModifiedBy>SmartCost</cp:lastModifiedBy>');
-    var dt = new Date(), dtStr = dt.getFullYear() + '-' + p_fillZero(dt.getMonth()) + '-' + p_fillZero(dt.getDate()) + 'T' +
+    var dt = new Date(), dtStr = dt.getFullYear() + '-' + p_fillZero(dt.getMonth()+1) + '-' + p_fillZero(dt.getDate()) + 'T' +
         p_fillZero(dt.getHours()) + ':' + p_fillZero(dt.getMinutes()) + ':' + p_fillZero(dt.getSeconds()) + 'Z';
     rst.push('<dcterms:created xsi:type="dcterms:W3CDTF">' + dtStr + '</dcterms:created>');
     rst.push('<dcterms:modified xsi:type="dcterms:W3CDTF">' + dtStr + '</dcterms:modified>');
@@ -121,23 +122,97 @@ function writeXlRels(sheets){
     return rst;
 }
 function writeTheme(){
-    var rst = fs.readFileSync('./excel_base_files/theme1.xml', 'utf8', 'r');
+    var rst = fs.readFileSync(__dirname + '/excel_base_files/theme1.xml', 'utf8', 'r');
     return rst;
 }
-function writeStyles(pageData){
-    //
+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('</styleSheet>');
+    return rst;
 }
-function writeSharedString(pageData){
-    //
+function writeSharedString(sharedStrList){
+    var rst = [];
+    if (sharedStrList && sharedStrList.length > 0) {
+        rst.push(dftHeadXml + '\r\n');
+        rst.push('<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="' + sharedStrList.length + '" uniqueCount="' + sharedStrList.length + '">');
+        for (var i = 0; i < sharedStrList.length; i++) {
+            rst.push('<si><t>' + sharedStrList[i] + '</t></si>');
+        }
+        rst.push('</sst>');
+    }
+    return rst;
 }
-function writeSheets(pageData){
-    var rst = [], 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));
     }
+    return rst;
 }
-function writeSheet(sheetData, sharedStrList, styleList){
-    var rst = [], xPos = [0], yPos = [0], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+function writeSheet(sheetData, sharedStrList, stylesObj){
+    var rst = [], xPos = [], yPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+    xPos.push(0);
+    yPos.push(0);
     private_pre_analyze_pos = function(){
         var cell, pos;
         sheetData.cells.sort(function(cell1, cell2) {
@@ -153,6 +228,7 @@ function writeSheet(sheetData, sharedStrList, styleList){
                     rst = -1;
                 }
             }
+            return rst;
         });
         for (var i = 0; i < sheetData.cells.length; i++) {
             cell = sheetData.cells[i];
@@ -165,8 +241,14 @@ function writeSheet(sheetData, sharedStrList, styleList){
             pos = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
             if (yPos.indexOf(pos) < 0) yPos.push(pos);
         }
-        xPos.sort();
-        yPos.sort();
+        xPos.sort(private_array_sort);
+        yPos.sort(private_array_sort);
+    };
+    private_array_sort = function(i1, i2){
+        var rst = 0;
+        if (i1 > i2) {rst = 1} else
+        if (i1 < i2) rst = -1;
+        return rst;
     };
     private_getCellIdxStr = function(idx){
         var rst = 'A';
@@ -189,18 +271,158 @@ function writeSheet(sheetData, sharedStrList, styleList){
         }
         return rst;
     };
-    private_getStyleIdx = function(cell) {
-        var rst = 1;
-        //
+    private_getFontId = function(cell) {
+        var rst = 0, hasFont = false;
+        if (!(stylesObj.fonts)) {
+            stylesObj.fonts = [];
+            //for (var i = 0; i < sheetData.font_collection)
+        }
+        var sheetFont = sheetData.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) && font[JV.FONT_PROPS[3]] == sheetFont[JV.FONT_PROPS[3]]) {
+                    hasFont = true;
+                    rst = i;
+                    break;
+                }
+            } else {
+                break;
+            }
+        }
+        if (!hasFont) {
+            var font = {};
+            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.colorIdx = "8";
+            font[JV.FONT_PROPS[3]] = sheetFont[JV.FONT_PROPS[3]]; //font bold
+            stylesObj.fonts.push(font);
+            rst = stylesObj.fonts.length - 1;
+        }
+        return rst;
+    };
+    private_checkBorder = function(border, sheetBorder) {
+        var rst = true, borderLineWidths = [], sheetBorderLineWidths = [];
+        borderLineWidths.push(border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]);
+        borderLineWidths.push(border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]);
+        borderLineWidths.push(border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]);
+        borderLineWidths.push(border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]);
+        if (sheetBorder[JV.PROP_LEFT] && sheetBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]) {
+            sheetBorderLineWidths.push(parseInt(border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]));
+        } else {
+            sheetBorderLineWidths.push(0);
+        }
+        if (sheetBorder[JV.PROP_RIGHT] && sheetBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]) {
+            sheetBorderLineWidths.push(parseInt(border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]));
+        } else {
+            sheetBorderLineWidths.push(0);
+        }
+        if (sheetBorder[JV.PROP_TOP] && sheetBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]) {
+            sheetBorderLineWidths.push(parseInt(border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]));
+        } else {
+            sheetBorderLineWidths.push(0);
+        }
+        if (sheetBorder[JV.PROP_BOTTOM] && sheetBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]) {
+            sheetBorderLineWidths.push(parseInt(border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]));
+        } else {
+            sheetBorderLineWidths.push(0);
+        }
+        for (var i = 0; i < 4; i++) {
+            if (borderLineWidths[i] != sheetBorderLineWidths[i]) {
+                rst = false;
+                break;
+            }
+        }
+        return rst;
+    };
+    private_getBorderId = function(cell) {
+        var rst = 0, hasBorder = false;
+        if (!(stylesObj.borders)) {
+            stylesObj.borders = [];
+        }
+        var sheetBorder = sheetData.style_collection[cell.style];
+        for (var i = 0; i < stylesObj.borders.length; i++) {
+            var border = stylesObj.borders[i];
+            if (private_checkBorder(border, sheetBorder)) {
+                hasBorder = true;
+                rst = i;
+                break;
+            }
+        }
+        if (!hasBorder) {
+            var border = {};
+            border[JV.PROP_LEFT] = {};
+            border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = 0;
+            border[JV.PROP_RIGHT] = {};
+            border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = 0;
+            border[JV.PROP_TOP] = {};
+            border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = 0;
+            border[JV.PROP_BOTTOM] = {};
+            border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = 0;
+            if (sheetBorder && sheetBorder[JV.PROP_LEFT]) {
+                border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]);
+            }
+            if (sheetBorder && sheetBorder[JV.PROP_RIGHT]) {
+                border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]);
+            }
+            if (sheetBorder && sheetBorder[JV.PROP_TOP]) {
+                border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]);
+            }
+            if (sheetBorder && sheetBorder[JV.PROP_BOTTOM]) {
+                border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]);
+            }
+            stylesObj.borders.push(border);
+            rst = stylesObj.borders.length - 1;
+        }
+        return rst;
+    };
+    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 = sheetData[JV.NODE_CONTROL_COLLECTION][cell[JV.PROP_CONTROL]];
+        for (var i = 0; i < stylesObj.cellXfs.length; 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) {
+            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;
     };
     private_setCols = function(){
+        //remark: 1 excel width = 2.117 mm
         rst.push('<cols>');
         var w = 0;
         for (var i = 1; i < xPos.length; i++) {
-            w = 1.0 * (xPos[i] - xPos[i - 1]) / DPI;
+            w = 1.0 * (xPos[i] - xPos[i - 1]) / DPI * 25.4 / 2.117;
             w = Math.round(w * 1000) / 1000;
-            rst.push('<col min="1" max="1" width="' + w + '" customWidth="1"/>');
+            rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
         }
         rst.push('</cols>');
     };
@@ -223,27 +445,71 @@ function writeSheet(sheetData, sharedStrList, styleList){
         rst.push('</mergeCells>');
     };
     private_setSheetData = function(){
+        //remark: 1 excel height = 0.3612 mm
         rst.push('<sheetData>');
-        var spanX = xPos.length - 1, cellIdx = 0, h = 0, hasMoreCols = true;
-        for (var i = 0; i < yPos.length - 1; i++) {
+        var spanX = xPos.length - 1, cellIdx = 0, h = 0,
+            hasMoreCols = true, nextColIdx = -1,
+            nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+        for (var i = 1; i < yPos.length - 1; i++) {
             if (i === 0) {
-                h = 1.0 * (yPos[i]) / DPI;
+                h = 1.0 * (yPos[i]) / DPI * 25.4 / 0.3612;
             } else {
-                h = 1.0 * (yPos[i] - yPos[i - 1]) / DPI;
+                h = 1.0 * (yPos[i] - yPos[i - 1]) / DPI * 25.4 / 0.3612;
             }
             h = Math.round(h * 1000) / 1000;
-            rst.push('<row r="' + (i+1) + '" spans="1:' + spanX + '" ht="' + h + '" customHeight="1">');
+            rst.push('<row r="' + i + '" spans="1:' + spanX + '" ht="' + h + '" customHeight="1">');
             //then put the cells of this row
             var colIdxStr = '';
+            hasMoreCols = true;
+            while (nextRowIdx < i) {
+                if (cellIdx >= sheetData.cells.length || nextRowIdx > i) {
+                    break;
+                } else {
+                    cellIdx++;
+                    nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                }
+            }
+            if (nextRowIdx > i) {
+                hasMoreCols = false;
+            }
+            nextColIdx = xPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
             for (var j = 0; j < xPos.length; j++) {
                 colIdxStr = private_getCellIdxStr(j);
                 if (hasMoreCols) {
-                    var ridx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                    if (nextColIdx == j) {
+                        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!
+                        } else {
+                            var valIdx = private_getSharedStrIdx(sheetData.cells[cellIdx][JV.PROP_VALUE]);
+                            rst.push('<c r="' + colIdxStr + i + '" s="' + styleIdx + '">');
+                            rst.push('<v>' + valIdx + '</v>');
+                            rst.push('</c>');
+                        }
+                        cellIdx++;
+                        if (cellIdx < sheetData.cells.length) {
+                            nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                            if (nextRowIdx > i) {
+                                hasMoreCols = false;
+                            } else {
+                                nextColIdx = xPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
+                            }
+                        } else {
+                            hasMoreCols = false;
+                        }
+                    } else if (nextColIdx < 0) {
+                        //impossible!
+                        console.log('has abnormal case!');
+                        hasMoreCols = false;
+                    } else {
+                        rst.push('<c r="' + colIdxStr + i + '" s="1"/>');
+                    }
                 } else {
-                    rst.push('<c r="' + colIdxStr + (i+1) + '" s="1"/>');
+                    rst.push('<c r="' + colIdxStr + i + '" s="1"/>');
                 }
             }
-            rst.push('</row');
+            rst.push('</row>');
         }
         //sheetData.cells.length
         rst.push('</sheetData>');
@@ -257,7 +523,7 @@ function writeSheet(sheetData, sharedStrList, styleList){
     rst.push('<selection sqref="A1:' + colStr + '1"/>');
     rst.push('</sheetView></sheetViews>');
     rst.push('<sheetFormatPr defaultRowHeight="13.5"/>');
-    private_setCols
+    private_setCols();
     private_setSheetData();
     private_setMergedCells();
     rst.push('<phoneticPr fontId="1" type="noConversion"/>');
@@ -273,4 +539,34 @@ module.exports = {
     exportExcel: function (pageData, options) {
         var rptOptions = (options || {singlePage: false, fileName: 'report'});
     }
+    ,testWriteContentTypes: function(sheets) {
+        return writeContentTypes(sheets);
+    }
+    ,testWriteRootRels: function() {
+        return writeRootRels();
+    }
+    ,testWriteApp: function(sheets) {
+        return writeApp(sheets);
+    }
+    ,testWriteCore: function() {
+        return writeCore();
+    }
+    ,testWriteXlWorkBook: function(sheets) {
+        return writeXlWorkBook(sheets);
+    }
+    ,testWriteXlRels: function(sheets) {
+        return writeXlRels(sheets);
+    }
+    ,testWriteSheets: function(pageData, sharedStrList, stylesObj){
+        return writeSheets(pageData, sharedStrList, stylesObj);
+    }
+    ,testWriteSharedString: function(sharedStrList){
+        return writeSharedString(sharedStrList);
+    }
+    ,testWriteTheme: function() {
+        return writeTheme();
+    }
+    ,testWriteStyles: function(stylesObj) {
+        return writeStyles(stylesObj);
+    }
 }

+ 28 - 0
public/fsUtil.js

@@ -0,0 +1,28 @@
+/**
+ * Created by Tony on 2017/4/10.
+ */
+
+var fs = require('fs');
+
+module.exports = {
+    writeArrayToFile: function(arr, filePath) {
+        if (arr && filePath && Array.isArray(arr)) {
+            var chunks = [], len = 0;
+            for (var i = 0; i < arr.length; i++) {
+                var buffer = new Buffer(arr[i]);
+                chunks.push(buffer);
+                len += buffer.length;
+                //
+            }
+            var resultBuffer = new Buffer(len);
+            for(var i=0,size=chunks.length,pos=0;i<size;i++){
+                chunks[i].copy(resultBuffer,pos);
+                pos += chunks[i].length;
+            }
+            fs.writeFile(filePath, resultBuffer, function(err){
+                if(err) throw err;
+                console.log('Write file: ' + filePath + ' ok!');
+            });
+        }
+    }
+}

+ 53 - 0
public/stringUtil.js

@@ -0,0 +1,53 @@
+module.exports = {
+    isEmptyString: function(str) {
+        var rst = false;
+        if (str == null || str == undefined) {
+            rst = true;
+        } else if (typeof str) {
+            var reg = /^\s*$/;
+            rst = reg.test(str);
+        }
+        return rst;
+    },
+    convertNumToChinese : function(num, isCurrency) {
+        if (!/^\d*(\.\d*)?$/.test(num)) { return "Number is wrong!"; }
+        var AA, BB;
+        if (isCurrency) {
+            AA = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
+            BB = new Array("", "拾", "佰", "仟", "萬", "億", "点", "");
+        } else {
+            AA = ['零','一','二','三','四','五','六','七','八','九'];
+            BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
+        }
+        //var AA = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
+        //var BB = new Array("", "拾", "佰", "仟", "萬", "億", "点", "");
+        var a = ("" + num).replace(/(^0*)/g, "").split("."), k = 0, re = "";
+        for (var i = a[0].length - 1; i >= 0; i--) {
+            switch (k) {
+                case 0: re = BB[7] + re; break;
+                case 4: if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
+                    re = BB[4] + re; break;
+                case 8: re = BB[5] + re; BB[7] = BB[5]; k = 0; break;
+            }
+            if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
+            if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re; k++;
+        }
+
+        if (a.length > 1) //加上小数部分(如果有小数部分)
+        {
+            re += BB[6];
+            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;
+    }
+}

+ 3 - 12
public/web/idTree.js

@@ -205,16 +205,7 @@ var idTree = {
         };*/
         Node.prototype.serialNo = function () {
             return this.tree.items.indexOf(this);
-        }
-        /*Node.prototype.serialNo = function () {
-            if (this.preSibling) {
-                return this.preSibling.serialNo() + this.preSibling.posterityCount() + 1;
-            } else if (this.parent) {
-                return this.parent.serialNo() + 1;
-            } else {
-                return 0;
-            }
-        };*/
+        };
 
         Node.prototype.addChild = function (node) {
             var preSibling = this.children.length === 0 ? null : this.children[this.children.length - 1];
@@ -450,7 +441,7 @@ var idTree = {
             return success;
         };
 
-        Tree.prototype.editedData = function (field, id, newText) {
+        /*Tree.prototype.editedData = function (field, id, newText) {
             var node = this.findNode(id), result = {allow: false, nodes: []};
             if (this.event[this.eventType.editedData]) {
                 return this.event[this.eventType.editedData](field, node.data);
@@ -459,7 +450,7 @@ var idTree = {
                 result.allow = true;
                 return result;
             }
-        };
+        };*/
 
         Tree.prototype.bind = function (eventName, eventFun) {
             this.event[eventName] = eventFun;

+ 38 - 26
public/web/tree_sheet_controller.js

@@ -9,7 +9,7 @@ var TREE_SHEET_CONTROLLER = {
             this.sheet = sheet;
             this.setting = setting;
             this.event = {
-                treeSelectedChanged: null
+                refreshBaseActn: null
             }
         };
 
@@ -19,13 +19,10 @@ var TREE_SHEET_CONTROLLER = {
             TREE_SHEET_HELPER.showTreeData(this.setting, this.sheet, this.tree);
 
             this.sheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) {
-                that.tree.selected = that.tree.findNode(info.sheet.getTag(info.newSelections[0].row, info.newSelections[0].col));
-                if (that.event.treeSelectedChanged) {
-                    that.event.treeSelectedChanged(that.tree.selected);
-                }
+                that.setTreeSelected(that.tree.findNode(info.sheet.getTag(info.newSelections[0].row, info.newSelections[0].col)));
             });
 
-            this.sheet.bind(GC.Spread.Sheets.Events.EditEnded, function (sender, args) {
+            /*this.sheet.bind(GC.Spread.Sheets.Events.EditEnded, function (sender, args) {
                 var result = tree.editedData(setting.cols[args.col].data.field, args.sheet.getTag(args.row, args.col), args.editingText);
 
                 if (result.allow) {
@@ -33,35 +30,35 @@ var TREE_SHEET_CONTROLLER = {
                 } else {
                     TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, [tree.findNode(args.sheet.getTag(args.row, args.col))], false);
                 };
-            });
+            });*/
         };
 
         controller.prototype.insert = function () {
-            var newNode = null, that = this;
-            if (this.tree && this.tree.selected) {
-                newNode = this.tree.insert(this.tree.selected.getParentID(), this.tree.selected.getNextSiblingID());
+            var newNode = null, that = this,  sels = this.sheet.getSelections();
+            if (this.tree) {
+                if (this.tree.selected) {
+                    newNode = this.tree.insert(this.tree.selected.getParentID(), this.tree.selected.getNextSiblingID());
+                } else {
+                    newNode = this.tree.insert();
+                }
                 if (newNode) {
                     TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
-                        var sels = that.sheet.getSelections();
-                        var iRow = sels[0].row, newNodeRow = iRow + that.tree.selected.posterityCount() + 1;
-                        that.sheet.addRows(newNodeRow, 1);
+                        that.sheet.addRows(newNode.serialNo(), 1);
                         TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, [newNode], false);
-                        that.tree.selected = newNode;
+                        that.setTreeSelected(newNode);
                         that.sheet.setSelection(newNode.serialNo(), sels[0].col, 1, 1);
                         that.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center)
-                    })
+                    });
                 }
             }
         };
         controller.prototype.delete = function () {
-            var that = this;
+            var that = this, sels = this.sheet.getSelections();
             if (this.tree.selected) {
                 if (this.tree.delete(this.tree.selected)) {
                     TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
-                        var sels = that.sheet.getSelections();
-                        var iRow = sels[0].row;
-                        that.sheet.deleteRows(iRow, that.tree.selected.posterityCount() + 1);
-                        that.tree.selected = that.tree.findNode(that.sheet.getTag(iRow, 0, GC.Spread.Sheets.SheetArea.viewport));
+                        that.sheet.deleteRows(sels[0].row, that.tree.selected.posterityCount() + 1);
+                        that.setTreeSelected(that.tree.findNode(that.sheet.getTag(sels[0].row, 0, GC.Spread.Sheets.SheetArea.viewport)));
                     });
                 }
             }
@@ -73,6 +70,9 @@ var TREE_SHEET_CONTROLLER = {
                     TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
                         TREE_SHEET_HELPER.refreshNodesVisible([that.tree.selected], that.sheet, true);
                         that.sheet.showRow(that.tree.selected.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+                        if (that.event.refreshBaseActn) {
+                            that.event.refreshBaseActn(that.tree);
+                        }
                     });
                 }
             }
@@ -84,37 +84,49 @@ var TREE_SHEET_CONTROLLER = {
                     TREE_SHEET_HELPER.massOperationSheet(that.sheet, function () {
                         TREE_SHEET_HELPER.refreshNodesVisible([that.tree.selected.parent], that.sheet, true);
                         that.sheet.showRow(that.tree.selected.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+                        if (that.event.refreshBaseActn) {
+                            that.event.refreshBaseActn(that.tree);
+                        }
                     });
                 }
             }
         };
         controller.prototype.upMove = function () {
-            var that = this;
+            var that = this, sels = this.sheet.getSelections();
             if (this.tree.selected) {
                 if (this.tree.selected.upMove()) {
                     TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
-                        var sels = that.sheet.getSelections();
-                        var iRow = sels[0].row;
                         TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, [that.tree.selected, that.tree.selected.nextSibling], true);
                         that.sheet.setSelection(that.tree.selected.serialNo(), sels[0].col, 1, 1);
+                        if (that.event.refreshBaseActn) {
+                            that.event.refreshBaseActn(that.tree);
+                        }
                     });
                 }
             }
         };
         controller.prototype.downMove = function () {
-            var that = this;
+            var that = this, sels = this.sheet.getSelections();
             if (this.tree.selected) {
                 if (this.tree.selected.downMove()) {
                     TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
-                        var sels = that.sheet.getSelections();
-                        var iRow = sels[0].row;
                         TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, [that.tree.selected, that.tree.selected.preSibling], true);
                         that.sheet.setSelection(that.tree.selected.serialNo(), sels[0].col, 1, 1);
+                        if (that.event.refreshBaseActn) {
+                            that.event.refreshBaseActn(that.tree);
+                        }
                     });
                 }
             }
         };
 
+        controller.prototype.setTreeSelected = function (node) {
+            this.tree.selected = node;
+            if (this.event.refreshBaseActn) {
+                this.event.refreshBaseActn(this.tree);
+            }
+        }
+
         controller.prototype.bind = function (eventName, eventFun) {
             this.event[eventName] = eventFun;
         };

+ 9 - 4
server.js

@@ -66,6 +66,11 @@ app.get('/main',  function(req, res) {
     }
 });
 
+var bills_Router = require('./modules/main/routes/bills_route');
+var rations_Router = require('./modules/main/routes/rations_route');
+app.use('/bills', bills_Router);
+app.use('/rations', rations_Router);
+
 var rpt_Router = require("./modules/reports/routes/report_router");
 app.get('/report',  function(req, res) {
     if (!req.session.userAccount) {
@@ -89,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/demo/demo.js

@@ -29,8 +29,13 @@ test('', function(t){
 })
 
 test('default sorting...', function(t){
-    var arrSimple=new Array(1,8,7,6);
-    arrSimple.sort();
+    var arrSimple=new Array(1,8,7,6,10,11);
+    arrSimple.sort(function(i1, i2){
+        rst = 0;
+        if (i1 > i2) {rst = 1} else
+        if (i1 < i2) rst = -1;
+        return rst;
+    });
     console.log(arrSimple);
     t.pass('just pass');
     t.end();

+ 50 - 0
test/demo/stringTest.js

@@ -0,0 +1,50 @@
+/**
+ * Created by Tony on 2017/4/7.
+ */
+
+var test = require('tape');
+var strUtil = require('../../public/stringUtil');
+
+//test('some string test cases', function (t) {
+//    var reg = /^\s*$/;
+//    var foo = "   ";
+//    t.equal(reg.test(foo), true);
+//    foo = null;
+//    t.equal(reg.test(foo), true);
+//    foo = undefined;
+//    t.equal(reg.test(foo), true);
+//    foo = "";
+//    t.equal(reg.test(foo), true);
+//    foo = 0;
+//    t.equal(reg.test(foo), true);
+//    t.end();
+//});
+//
+//test('check if string type', function(t){
+//    var foo = "";
+//    t.equal(typeof foo, 'string');
+//    foo = " ";
+//    t.equal(typeof foo, 'string');
+//    foo = 0;
+//    t.equal(typeof foo, 'number');
+//    foo = true;
+//    t.equal(typeof foo, 'boolean');
+//    foo = {};
+//    t.equal(typeof foo, 'object');
+//    foo = function(){};
+//    t.equal(typeof foo, 'function');
+//    foo = [];
+//    t.equal(Array.isArray(foo), true);
+//    t.end();
+//})
+
+test('test number to Chinese', function(t){
+    //t.equal(strUtil.convertNumToChinese(1, true), '壹');
+    //t.equal(strUtil.convertNumToChinese(1, false), '一');
+    t.equal(strUtil.convertNumToChinese(11, false), '一十一');
+    t.equal(strUtil.convertNumToChinese(12, false), '一十二');
+    t.equal(strUtil.convertNumToChinese(21, false), '二十一');
+    //console.log(strUtil.convertNumToChinese(102, false));
+    t.equal(strUtil.convertNumToChinese(102, false), '一百零二');
+    t.end();
+})

+ 1 - 1
test/unit/excel_export/fileReadWrite.js

@@ -29,7 +29,7 @@ fs.readFile('../../tmp_data/test_bills_data2.js',function(err,data){
         pos += chunks[i].length;
     }
 
-    fs.writeFile('../../../tmp/resut.text',resultBuffer,function(err){
+    fs.writeFile('../../../tmp/结果.text',resultBuffer,function(err){
         if(err) throw err;
         console.log('has finished');
     });

+ 1 - 0
test/unit/excel_export/privateFunctionTest.js

@@ -35,6 +35,7 @@ test('test private 1', function(t){
         return rst;
     };
     t.equal(private_getCellIdxStr2(0, ''), 'A');
+    t.equal(private_getCellIdxStr2(20, ''), 'U');
     t.equal(private_getCellIdxStr2(25, ''), 'Z');
     t.equal(private_getCellIdxStr2(26, ''), 'AA');
     t.equal(private_getCellIdxStr2(27, ''), 'AB');

+ 57 - 0
test/unit/excel_export/rpt_excel_export_test.js

@@ -0,0 +1,57 @@
+/**
+ * Created by Tony on 2017/4/10.
+ */
+var test = require('tape');
+var fs = require('fs');
+var fsUtil = require('../../../public/fsUtil');
+var rpt_xl_util = require('../../../modules/reports/util/rpt_excel_util');
+
+test('check excel output', function(t){
+    var data = fs.readFileSync('../../../tmp/07_1.page.js', 'utf8', 'r');
+    eval(data);
+    //console.log(testReport07_1);
+    var sheets = [];
+    for (var i = 0; i < testReport07_1.items.length; i++) {
+        sheets.push({sheetName: '第' + (i + 1) + '页'});
+    }
+    var ct = rpt_xl_util.testWriteContentTypes(sheets);
+    fsUtil.writeArrayToFile(ct, '../../../tmp/[Content_Types].xml');
+    t.pass('pass content types');
+    var rootRels = rpt_xl_util.testWriteRootRels();
+    fsUtil.writeArrayToFile(rootRels, '../../../tmp/.rels');
+    t.pass('pass root rels');
+    var app = rpt_xl_util.testWriteApp(sheets);
+    fsUtil.writeArrayToFile(app, '../../../tmp/app.xml');
+    t.pass('pass app');
+    var core = rpt_xl_util.testWriteCore(sheets);
+    fsUtil.writeArrayToFile(core, '../../../tmp/core.xml');
+    t.pass('pass core');
+    var xlWBs = rpt_xl_util.testWriteXlWorkBook(sheets);
+    fsUtil.writeArrayToFile(xlWBs, '../../../tmp/workbook.xml');
+    t.pass('pass workbook');
+    //workbook.xml.rels
+    var xlRels = rpt_xl_util.testWriteXlRels(sheets);
+    fsUtil.writeArrayToFile(xlRels, '../../../tmp/workbook.xml.rels');
+    t.pass('pass xl sheet rels');
+    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));
+    }
+    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(sharedStr, '../../../tmp/styles.xml');
+    t.pass('pass styles');
+
+    var theme = rpt_xl_util.testWriteTheme();
+    //console.log(theme);
+    var themeArr = [];
+    themeArr.push(theme)
+    fsUtil.writeArrayToFile(themeArr, '../../../tmp/theme1.xml');
+    t.pass('pass theme');
+    t.end();
+});

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

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

+ 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();

+ 154 - 44
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="downLevl" 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,173 @@
         </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>
 </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;
+    //test
+
+    var dbOperation = {
+        insert: function(controller){
+            if(controller.tree.items.length === 0){
+                billsAjax.createBills(billsLibId, -1 , -1);
+                controller.insert();
             }
-            else{
-                return -1;
+            else {
+                var node = controller.tree.selected;
+                if(node){
+                    var updateId = tagId, createpid = node.getParentID(), createnid = node.getNextSiblingID();
+                    controller.insert();
+                    billsAjax.createBills(billsLibId, createpid, createnid);
+                    billsAjax.updatePNId(updateId, -1, node.getNextSiblingID());
+                }
+                else {
+                    var updateNode = controller.tree.roots[controller.tree.roots.length - 1];
+                    var updateId = updateNode.getID();
+                    controller.insert();
+                    billsAjax.createBills(billsLibId, -1, -1);
+                    billsAjax.updatePNId(updateId, -1, updateNode.getNextSiblingID());
+                }
             }
-        });
-        console.log(arr);
-    }
+        },
+
+        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(deleteIds);
+            controller.delete;
+        },
 
-    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"}
-        ];
+        upLevel: function(controller){
+            var node = controller.tree.selected;
+            if(node){
+                if(node.parent){
+                    //node
+                    billsAjax.updatePNId(node.getID(), node.parent.getParentID(), node.parent.getNextSiblingID());
+                    //parent
+                    billsAjax.updatePNId(node.getParentID(), null, node.getID());
+                    if(node.nextSibling){
+                        //node.nextSibling
+                        billsAjax.updatePNId(node.getNextSiblingID(), node.getID(), null);
+                    }
+                    if(node.preSibling){
+                        billsAjax.updatePNId(node.preSibling.getID(), null, -1);
+                    }
+                }
+                //controllerOp
+                controller.upLevel();
+            }
+
+        },
+
+        downLevel: function(controller){
+            var node = controller.tree.selected;
+            if(node){
+                if(node.preSibling){
+                    billsAjax.updatePNId(node.preSibling.getID(), null, node.getNextSiblingID());
+                    billsAjax.updatePNId(node.getID(), node.preSibling.getID(), -1);
+                    if(node.preSibling.children.length > 0){
+                        billsAjax.updatePNId(node.preSibling.children[node.preSibling.children.length -1].getID(), null, node.getID());
+                    }
+                    controller.downLevel();
+                }
+            }
+        },
 
-        testDataArr.sort(function(a, b){
-            if(a.NextSiblingID == b.ID){
-                return -1;
+        upMove: function(controller){
+            var node = controller.tree.selected;
+            if(node){
+                if(node.preSibling){
+                    billsAjax.updatePNId(node.preSibling.getID(), null, node.getNextSiblingID());
+                    billsAjax.updatePNId(node.getID(), null, node.preSibling.getID());
+                    if(node.preSibling.preSibling){
+                        billsAjax.updatePNId(node.preSibling.preSibling.getID(), null, node.getID());
+                    }
+                    controller.upMove();
+                }
             }
-            else{
-                return 1;
+        },
+
+        downMove: function(controller){
+            var node = controller.tree.selected;
+            if(node){
+                if(node.nextSibling){
+                    billsAjax.updatePNId(node.getNextSiblingID(), null, node.getID());
+                    billsAjax.updatePNId(node.getID(), null, node.nextSibling.getNextSiblingID());
+                    if(node.preSibling){
+                        billsAjax.updatePNId(node.preSibling.getID(), null, node.getNextSiblingID());
+                    }
+                    controller.downMove();
+                }
             }
+        }
+    }
+
+    function nodeOpration(controller,sheet){
+        $('#insert').click(function(){
+            //dbOperation.insert(controller, sheet);
+            controller.insert();
+        });
+        $('#delete').click(function(){
+            controller.delete();
+        });
+        $('#upLevel').click(function(){
+            controller.upLevel();
+        });
+        $('#downLevl').click(function(){
+            controller.downLevel();
+        });
+        $('#upMove').click(function(){
+            controller.upMove();
+        });
+        $('#downMove').click(function(){
+            controller.downMove();
         });
-        //expect: 1 3 2 6 4
-        //fact:   2 6 4 1 3
-        console.log(testDataArr);
     }
 
-    //test
+    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();
+        nodeOpration(controller, billsSpread.getActiveSheet());
+    }
+
 
     function buildBills(){
         var spread = new GC.Spread.Sheets.Workbook($("#spreadBills")[0], {sheetCount: 1});
@@ -316,7 +426,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, pid, nid){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/createBills',
+            data: {data: JSON.stringify({billsLibId: billsLibId, ParentID: pid, NextSiblingID: nid})},
+            dataType: 'json',
+            success: function(result){
+            }
+        });
+    },
+    updatePNId: function(updateId, pid, nid){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updatePNId',
+            data: {data: JSON.stringify({updateId: updateId, ParentID: pid, NextSiblingID: nid})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    },
+    deleteBills: function(deleteIds){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/deleteBills',
+            data: {data: JSON.stringify({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


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();
         }
     });

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

@@ -515,6 +515,7 @@
     <script type="text/javascript" src="lib/ztree/jquery.ztree.excheck.js"></script>
     <!-- SpreadJs -->
     <script type="text/javascript" src="lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
     <!-- Model -->
     <script type="text/javascript" src="web/main/js/models/project.js"></script>
     <script type="text/javascript" src="web/main/js/models/bills.js"></script>
@@ -619,9 +620,10 @@
         project.Rations.loadDatas(drawing_data);
         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.mainTree, billsSpread.getActiveSheet(), BillsGridSetting);
+        controller = TREE_SHEET_CONTROLLER.createNew(project.Bills.tree, billsSpread.getActiveSheet(), BillsGridSetting);
         controller.showTreeData();
-        controller.bind('treeSelectedChanged', function (selected) {
+        controller.bind('refreshBaseActn', function (tree) {
             var showButton = function (show, btn) {
                 if (show) {
                     btn.show();
@@ -629,10 +631,11 @@
                     btn.hide();
                 }
             };
-            showButton(selected.canUpLevel(), $('#upLevel'));
-            showButton(selected.canDownLevel(), $('#downLevel'));
-            showButton(selected.canUpMove(), $('#upMove'));
-            showButton(selected.canDownMove(), $('#downMove'));
+            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'));
         });
 
         $('#insert').click(function () {

+ 15 - 4
web/main/js/models/cache_tree.js

@@ -2,7 +2,10 @@
  * Created by Mai on 2017/4/5.
  */
 var cacheTree = {
-    createNew: function () {
+    createNew: function (owner) {
+        var _eventType = {
+            afterSelectedChanged: 'afterSelectedChanged'
+        };
         var tools = {
             findNode: function (nodes, check) {
                 for (var i = 0; i < nodes.length; i++) {
@@ -286,11 +289,10 @@ var cacheTree = {
             return success;
         };
 
-        var Tree = function (setting) {
+        var Tree = function (owner) {
             this.nodes = {};
             this.roots = [];
             this.items = [];
-            this.setting = setting;
             this.prefix = 'id_';
             this.selected = null;
 
@@ -305,6 +307,11 @@ var cacheTree = {
                 } else {
                     _MaxID = Math.max(_MaxID, id);
                 }
+            };
+
+            var rootId = -1;
+            this.rootID = function () {
+                return rootId;
             }
         };
 
@@ -405,6 +412,10 @@ var cacheTree = {
             return success;
         };
 
-        return new Tree(setting);
+        Tree.prototype.editedData = function (field, id, newText) {
+            var node = this.findNode(id);
+        }
+
+        return new Tree(owner);
     }
 };

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

@@ -8,7 +8,7 @@ var PROJECT = {
 
         // 所有通过this访问的属性,都不应在此单元外部进行写入操作
         var project = function () {
-            this.mainTree = cacheTree.createNew();
+            this.mainTree = cacheTree.createNew(this);
 
             this.Bills = Bills.createNew(this);
             this.Rations = Rations.createNew(this);