浏览代码

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

MaiXinRong 8 年之前
父节点
当前提交
dd121558eb

+ 25 - 19
modules/billsLib/billsLibControllers/billsLibControllers.js

@@ -2,7 +2,7 @@
  * Created by vian on 2017/3/22.
  */
 
-var billsDao = require("../billsLibModel/billsLibInterfaces");
+var billsLibDao = require("../billsLibModel/billsLibInterfaces");
 //----
 var model = require("../billsLibModel/billsLibModel");
 var counter = require("../../../public/counter/counter");
@@ -19,110 +19,116 @@ var callback = function(req, res, err, message, data){
 module.exports = {
     getStdBillsLib: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.getStdBillsLib(data.userId, function(err, message, stdBillsLib){
+        billsLibDao.getStdBillsLib(data.userId, function(err, message, stdBillsLib){
             callback(req, res, err, message, stdBillsLib );
         });
     },
     createStdBillsLib: function(req, res){
         var data = JSON.parse(req.body.data);
         var billsLibName = data.name;
-         billsDao.createStdBillsLib(data, function(err, message, info){
+         billsLibDao.createStdBillsLib(data, function(err, message, info){
             callback(req, res, err, message, info);
          });
     },
     deleteStdBillsLib: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.deleteStdBillsLib(data.billsLibId, function(err, message){
+        billsLibDao.deleteStdBillsLib(data.billsLibId, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     renameStdBillsLib: function(req, res) {
         var data = JSON.parse(req.body.data);
-        billsDao.renameStdBillsLib(data, function (err, message) {
+        billsLibDao.renameStdBillsLib(data, function (err, message) {
             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){
+        billsLibDao.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){
+        billsLibDao.getBills(data.billsLibId, function(err, message, bills){
             callback(req, res, err, message, bills);
         });
     },
     createBills: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.createBills(data, function(err, message){
+        billsLibDao.createBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     updatePNId: function (req, res) {
         var data = JSON.parse(req.body.data);
-        billsDao.updatePNId(data, function(err, message){
+        billsLibDao.updatePNId(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     updateBills: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.updateBills(data, function(err, message){
+        billsLibDao.updateBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     deleteBills: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.deleteBills(data, function(err, message){
+        billsLibDao.deleteBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     getJobContent: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.getJobContent(data.billsLibId, function(err, message, jobs){
+        billsLibDao.getJobContent(data, function(err, message, jobs){
             callback(req, res, err, message, jobs);
         });
     },
+    getSomeJobs: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsLibDao.getSomeJobs(data, function(err, message, jobs){
+           callback(req, res, err, message, jobs);
+        });
+    },
     createJobContent: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.createJobContent(data, function(err, message){
+        billsLibDao.createJobContent(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     updateJobContent: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.updateJobContent(data, function(err, message){
+        billsLibDao.updateJobContent(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     deleteJobContent: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.deleteJobContent(data.jobId, function(err, message){
+        billsLibDao.deleteJobContent(data.jobId, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     getItemCharacter: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.getItemCharacter(data.billsLibId, function(err, message, items){
+        billsLibDao.getItemCharacter(data.billsLibId, function(err, message, items){
             callback(req, res, err, message, items);
         });
     },
     createItemCharacter: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.createItemCharacter(data, function(err, message){
+        billsLibDao.createItemCharacter(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     updateItemCharacter: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.updateItemCharacter(data, function(err, message){
+        billsLibDao.updateItemCharacter(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     deleteItemCharacter: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsDao.deleteItemCharacter(data.itemId, function(err, message){
+        billsLibDao.deleteItemCharacter(data.itemId, function(err, message){
             callback(req, res, err, message, null);
         });
     }

+ 100 - 63
modules/billsLib/billsLibModel/billsLibInterfaces.js

@@ -10,9 +10,9 @@ var ItemCharacter = model.itemCharacterMod;
 
 var fieldArr = ["code", "name", "unit", "ruleText", "Expression"];
 
-var billsDao = function(){};
+var billsLibDao = function(){};
 //----------StdBillsLib-------------------
-billsDao.prototype.getStdBillsLib = function(userId, callback){
+billsLibDao.prototype.getStdBillsLib = function(userId, callback){
     StdBillsLib.find({}, "-_id", function(err, data){
         if(err){
             callback(1, "Error", null);
@@ -23,7 +23,7 @@ billsDao.prototype.getStdBillsLib = function(userId, callback){
     })
 }
 
-billsDao.prototype.createStdBillsLib = function(clibData, callback){
+billsLibDao.prototype.createStdBillsLib = function(clibData, callback){
     counter.getIDAfterCount("bills", 1, function(err, result){
         var billsLibId = result.value.sequence_value;
         var billsLibName = clibData.name;
@@ -51,7 +51,7 @@ billsDao.prototype.createStdBillsLib = function(clibData, callback){
     });
 }
 
-billsDao.prototype.deleteStdBillsLib = function(billsLibId, callback){
+billsLibDao.prototype.deleteStdBillsLib = function(billsLibId, callback){
     StdBillsLib.remove({billsLibId: billsLibId}, function(err){
         if(err){
             callback(1, "Error");
@@ -62,7 +62,7 @@ billsDao.prototype.deleteStdBillsLib = function(billsLibId, callback){
     });
 }
 
-billsDao.prototype.renameStdBillsLib = function(renameData, callback){
+billsLibDao.prototype.renameStdBillsLib = function(renameData, callback){
     var billsLibId = renameData.id;
     var renameVal = renameData.value;
     StdBillsLib.update({billsLibId: billsLibId}, {$set:{billsLibName: renameVal}}, function(err){
@@ -75,7 +75,7 @@ billsDao.prototype.renameStdBillsLib = function(renameData, callback){
     });
 }
 
-billsDao.prototype.getStdBillsLibName = function(billsLibId, callback){
+billsLibDao.prototype.getStdBillsLibName = function(billsLibId, callback){
     StdBillsLib.find({billsLibId: billsLibId}, "-_id", function(err,  data){
         if(err){
             callback(1, "Error", null);
@@ -86,7 +86,7 @@ billsDao.prototype.getStdBillsLibName = function(billsLibId, callback){
     });
 }
 //----------------------------Bills---------------------
-billsDao.prototype.getBills = function (billsLibId, callback) {
+billsLibDao.prototype.getBills = function (billsLibId, callback) {
     Bills.find({billsLibId: billsLibId}, "-_id",  function(err, billsData){
         if(err){
             callback(1, "Error", null);
@@ -97,7 +97,7 @@ billsDao.prototype.getBills = function (billsLibId, callback) {
     });
 }
 
-billsDao.prototype.createBills = function(cbillsData, callback){
+billsLibDao.prototype.createBills = function(cbillsData, callback){
         var newId = cbillsData.newId;
         var pid = cbillsData.ParentID;
         var nid = cbillsData.NextSiblingID;
@@ -106,7 +106,13 @@ billsDao.prototype.createBills = function(cbillsData, callback){
             ID: newId,
             ParentID: pid,
             NextSiblingID: nid,
-            billsLibId: billsLibId
+            billsLibId: billsLibId,
+            code: '',
+            name: '',
+            unit: '',
+            ruleText: '',
+            Expression: '',
+            recharge:'',
         };
         Bills.create(newBills, function(err){
             if(err){
@@ -118,7 +124,7 @@ billsDao.prototype.createBills = function(cbillsData, callback){
         });
 }
 
-billsDao.prototype.updatePNId= function(updateData, callback){
+billsLibDao.prototype.updatePNId= function(updateData, callback){
     var billsLibId = updateData.billsLibId;
     var updateId = updateData.updateId;
     var updatepid= updateData.ParentID;
@@ -154,21 +160,14 @@ billsDao.prototype.updatePNId= function(updateData, callback){
         });
     }
 }
-   /* 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;
+billsLibDao.prototype.updateBills = function(ubillsData, callback){
+    var billsLibId = ubillsData.billsLibId;
+    var updateId = ubillsData.updateId;
     var updateField = ubillsData.field;
     var updateData = ubillsData.data;
-    if(updateField == "code"){
-        Bills.update({ID: updateId}, {$set:{code: updateData}}, function(err){
+    if(updateField === "code"){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {code: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
             }
@@ -177,8 +176,8 @@ billsDao.prototype.updateBills = function(ubillsData, callback){
             }
         });
     }
-    else if(updateField == "name"){
-        Bills.update({ID: updateId}, {$set:{name: updateData}}, function(err){
+    else if(updateField === "name"){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {name: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
             }
@@ -187,8 +186,8 @@ billsDao.prototype.updateBills = function(ubillsData, callback){
             }
         });
     }
-    else if(updateField == "unit"){
-        Bills.update({ID: updateId}, {$set:{unit: updateData}}, function(err){
+    else if(updateField === "unit"){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {unit: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
             }
@@ -197,8 +196,28 @@ billsDao.prototype.updateBills = function(ubillsData, callback){
             }
         });
     }
-    else if(updateField == "ruleText"){
-        Bills.update({ID: updateId}, {$set:{ruleText: updateData}}, function(err){
+    else if(updateField === "ruleText"){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {ruleText: updateData}}, function(err){
+            if(err){
+                callback(1, "Error");
+            }
+            else {
+                callback(0, "");
+            }
+        });
+    }
+    else if(updateField === "jobs"){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$addToSet: {jobs: updateData}}, function(err){
+            if(err){
+                callback(1, "Error");
+            }
+            else {
+                callback(0, "");
+            }
+        });
+    }
+    else if(updateField === "items"){
+        Bills.update({billsLibId: billsLibId, ID: updateId}, {$addToSet: {items: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
             }
@@ -209,7 +228,7 @@ billsDao.prototype.updateBills = function(ubillsData, callback){
     }
 }
 
-billsDao.prototype.deleteBills = function(delData, callback){
+billsLibDao.prototype.deleteBills = function(delData, callback){
     var deleteIds = delData.deleteIds;
     var billsLibId = delData.billsLibId;
     if(deleteIds){
@@ -227,8 +246,22 @@ billsDao.prototype.deleteBills = function(delData, callback){
 }
 
 //--------------JobContent------------------
-billsDao.prototype.getJobContent = function(billsLibId, callback){
-    JobContent.find({billsLibId: billsLibId}, "-_id", function(err, jobs){
+billsLibDao.prototype.getJobContent = function(gJobData, callback){
+    var billsLibId = gJobData.billsLibId;
+        JobContent.find({billsLibId: billsLibId}, "-_id", function(err, jobs){
+            if(err){
+                callback(1, "Error", null);
+            }
+            else{
+                callback(0, "", jobs)
+            }
+        });
+}
+
+billsLibDao.prototype.getSomeJobs = function(gJobData, callback){
+    var billsLibId = gJobData.billsLibId;
+    var ids = gJobData.ids;
+    JobContent.find({billsLibId: billsLibId, id: {$in: ids}}, "-_id", function(err, jobs){
         if(err){
             callback(1, "Error", null);
         }
@@ -238,42 +271,46 @@ billsDao.prototype.getJobContent = function(billsLibId, callback){
     });
 }
 
-billsDao.prototype.createJobContent = function(cJobData, callback){
+billsLibDao.prototype.createJobContent = function(cJobData, callback){
     var field = cJobData.field;
     var data = cJobData.data;
-    var id = counter.getIDAfterCount("billsLib", 1);
     var billsLibId = cJobData.billsLibId;
-    var newJobContent;
-    if(field == "code"){
-        newJobContent = {
-            id: id,
-            billsLibId: billsLibId,
-            code: data
-        }
-    }
-    else if(field == "content"){
-        newJobContent = {
-            id: id,
-            billsLibId: billsLibId,
-            content: data
-        }
-    }
-    JobContent.create(newJobContent, function(err){
-        if(err){
-            callback(1, "Error");
+    counter.getIDAfterCount("bills", 1, function(err, result){
+        var id = result.value.sequence_value;
+        var newJobContent;
+        if(field == "code"){
+            newJobContent = {
+                id: id,
+                billsLibId: billsLibId,
+                code: data,
+                content: ''
+            }
         }
-        else{
-            callback(0, "");
+        else if(field == "content"){
+            newJobContent = {
+                id: id,
+                billsLibId: billsLibId,
+                code: '',
+                content: data,
+            }
         }
+        JobContent.create(newJobContent, function(err){
+            if(err){
+                callback(1, "Error");
+            }
+            else{
+                callback(0, "");
+            }
+        });
     });
 }
 
-billsDao.prototype.updateJobContent = function(uJobData, callback){
+billsLibDao.prototype.updateJobContent = function(uJobData, callback){
     var field = cJobData.field;
     var updateData = cJobData.data;
-    var id = cJobData.id;
+    var updateid = cJobData.updateId;
     if(field == "code"){
-        JobContent.update({id: id}, {$set: {code: updateData}}, function(err){
+        JobContent.update({id: updateid}, {$set: {code: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
             }
@@ -283,7 +320,7 @@ billsDao.prototype.updateJobContent = function(uJobData, callback){
         });
     }
     else if(field == "content"){
-        JobContent.update({id: id}, {$set: {content: updateData}}, function(err){
+        JobContent.update({id: updateid}, {$set: {content: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
             }
@@ -294,7 +331,7 @@ billsDao.prototype.updateJobContent = function(uJobData, callback){
     }
 }
 
-billsDao.prototype.deleteJobContent = function(jobId, callback){
+billsLibDao.prototype.deleteJobContent = function(jobId, callback){
     JobContent.remove({id: jobId}, function(err){
         if(err){
             callback(1, "Error");
@@ -307,7 +344,7 @@ billsDao.prototype.deleteJobContent = function(jobId, callback){
 
 
 //----------------------ItemCharacter---------------------
-billsDao.prototype.getItemCharacter = function(billsLibId, callback){
+billsLibDao.prototype.getItemCharacter = function(billsLibId, callback){
     ItemCharacter.find({billsLibId: billsLibId}, "-_id", function(err, items){
         if(err){
             callback(1, "Error", null);
@@ -318,7 +355,7 @@ billsDao.prototype.getItemCharacter = function(billsLibId, callback){
     });
 }
 
-billsDao.prototype.createItemCharacter = function(cItemData, callback){
+billsLibDao.prototype.createItemCharacter = function(cItemData, callback){
     var field = cItemData.field;
     var data = cItemData.data;
     var id = counter.getIDAfterCount("billsLib", 1);
@@ -340,7 +377,7 @@ billsDao.prototype.createItemCharacter = function(cItemData, callback){
     }
 }
 
-billsDao.prototype.updateItemCharacter = function(uItemData, callback){
+billsLibDao.prototype.updateItemCharacter = function(uItemData, callback){
     var field = uItemData.field;
     var updateData = uItemData.data;
     var id = uItemData.id;
@@ -366,7 +403,7 @@ billsDao.prototype.updateItemCharacter = function(uItemData, callback){
     }
 }
 
-billsDao.prototype.deleteItemCharacter = function(itemId, callback){
+billsLibDao.prototype.deleteItemCharacter = function(itemId, callback){
     JobContent.remove({id: itemId}, function(err){
         if(err){
             callback(1, "Error");
@@ -381,4 +418,4 @@ billsDao.prototype.deleteItemCharacter = function(itemId, callback){
 
 //-----------------------------
 
-module.exports = new billsDao();
+module.exports = new billsLibDao();

+ 1 - 1
modules/billsLib/billsLibModel/billsLibModel.js

@@ -3,7 +3,7 @@
  */
 var dbm = require("../../../config/db/db_manager");
 var schemas = require("./billsLibSchemas.js");
-//var db = dbm.getLocalConnection("stdBillsLibData");
+//var db = dbm.getLocalConnection("stdBillsEditor");
 var db = dbm.getCfgConnection("stdBillsEditor");
 var stdBillsLibMod = db.model("stdBillsLib", schemas.stdBillsLibSchema);
 var billsMod = db.model("billsLib", schemas.billsSchema);

+ 0 - 1
modules/billsLib/billsLibModel/billsLibSchemas.js

@@ -20,7 +20,6 @@ var billsSchema = mongoose.Schema({
     jobs: Array,
     items: Array,
     recharge:String,
-    //nodeId: Number,
     billsLibId: Number
 },
     {versionKey: false}

+ 1 - 0
modules/billsLib/billsLibRoutes/billsLibRoutes.js

@@ -39,6 +39,7 @@ billsRouter.post("/updatePNId", billsController.updatePNId);
 billsRouter.post("/updateBills", billsController.updateBills);
 billsRouter.post("/deleteBills", billsController.deleteBills);
 billsRouter.post("/getJobContent", billsController.getJobContent);
+billsRouter.post('/getSomeJobs', billsController.getSomeJobs);
 billsRouter.post("/createJobContent", billsController.createJobContent);
 billsRouter.post("/updateJobContent", billsController.updateJobContent);
 billsRouter.post("/deleteJobContent", billsController.deleteJobContent);

+ 8 - 8
modules/reports/util/rpt_excel_util.js

@@ -327,22 +327,22 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
         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]));
+            sheetBorderLineWidths.push(parseInt(sheetBorder[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]));
+            sheetBorderLineWidths.push(parseInt(sheetBorder[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]));
+            sheetBorderLineWidths.push(parseInt(sheetBorder[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]));
+            sheetBorderLineWidths.push(parseInt(sheetBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]));
         } else {
             sheetBorderLineWidths.push(0);
         }
@@ -437,8 +437,8 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
         //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 * 25.4 / 2.117;
+        for (var i = 1; i < xPos.length - 1; i++) {
+            w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
             w = Math.round(w * 1000) / 1000;
             rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
         }
@@ -465,7 +465,7 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
     private_setSheetData = function(){
         //remark: 1 excel height = 0.3612 mm
         rst.push('<sheetData>');
-        var spanX = xPos.length - 1, cellIdx = 0, h = 0,
+        var spanX = xPos.length - 2, 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++) {
@@ -531,7 +531,7 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
     private_pre_analyze_pos();
     rst.push(dftHeadXml + '\r\n');
     rst.push('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">');
-    var colStr = private_getCellIdxStr(xPos.length - 2);
+    var colStr = private_getCellIdxStr(xPos.length - 3);
     rst.push('<dimension ref="A1:' + colStr + '' + yPos.length + '"/>');
     rst.push('<sheetViews><sheetView tabSelected="1" workbookViewId="0">');
     rst.push('<selection sqref="A1:' + colStr + '1"/>');

+ 17 - 0
public/scMathUtil.js

@@ -0,0 +1,17 @@
+/**
+ * Created by Tony on 2017/4/14.
+ */
+const fs = require('fs');
+var scMath = null;
+
+getScMathUtil = function() {
+    if (!(scMath)) {
+        var data = fs.readFileSync(__dirname + '/web/scMathUtil.js', 'utf8', 'r');
+        //console.log(data);
+        eval(data);
+        scMath = scMathUtil;
+    }
+    return scMath;
+}
+
+exports.getUtil = getScMathUtil;

+ 69 - 0
public/web/scMathUtil.js

@@ -0,0 +1,69 @@
+/**
+ * Created by jimiz on 2017/3/28.
+ */
+
+var scMathUtil = {
+    innerRoundTo: function(num, digit){
+        var lFactor = Math.pow(10, digit);
+        var fOffSet;
+        if (num > 0){
+            fOffSet = 0.5;
+        }
+        else{
+            fOffSet = -0.5;
+        };
+        var result = Math.floor((num / lFactor) + fOffSet).toString();
+        var iLength = result.length;
+        var r1 = result.substring(0, iLength + digit);
+        var r2 = result.substring(iLength + digit, iLength);
+        return Number(r1 + '.' + r2);
+    },
+    floatToBin: function(num) {
+        return num.toString(2);
+    },
+    binToFloat: function(bin) {
+        var result = 0;
+        var iLength = bin.length;
+        var iDot = bin.indexOf('.');
+        if (iDot >= 0) {
+            for (var i = 0; i < iLength; i++) {
+                var num = Number(bin[i]);
+                var idx = iDot - i;
+                if (idx === 0) {
+                    continue
+                };
+                if (idx > 0) {
+                    idx -= 1
+                };
+                var r = Math.pow(2, idx);
+                result += num * r;
+            }
+        }
+        else {
+            result = parseInt(bin, 2);
+        };
+        return result;
+    },
+    incMantissa: function(bin){
+        var result = bin;
+        var iDot = bin.indexOf('.');
+        if (iDot < 0){return result};
+        var iLength = bin.length;
+        for (var i = iLength - 1; i > iDot; i--){
+            var num = Number(bin[i]);
+            if (num === 0){
+                num = 1;
+                var bin1 = bin.substring(0, i);
+                var bin2 = bin.substring(i + 1, iLength);
+                result = bin1 + num.toString() + bin2;
+                break;
+            }
+
+        };
+        return result;
+    },
+    roundTo: function(num, digit){
+        var me = this;
+        return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
+    }
+}

+ 0 - 1
public/web/tree_sheet_controller.js

@@ -17,7 +17,6 @@ var TREE_SHEET_CONTROLLER = {
             var that = this;
             TREE_SHEET_HELPER.loadSheetHeader(this.setting, this.sheet);
             TREE_SHEET_HELPER.showTreeData(this.setting, this.sheet, this.tree);
-
             this.sheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) {
                 that.setTreeSelected(that.tree.findNode(info.sheet.getTag(info.newSelections[0].row, info.newSelections[0].col)));
             });

+ 3 - 3
public/web/tree_sheet_helper.js

@@ -116,10 +116,10 @@ var TREE_SHEET_HELPER = {
         };
         TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            // 画布,(x1, y1)起点(横, 竖), (x2, y2)终点(横, 竖), 颜色
+            // ������(x1, y1)���(��, ��), (x2, y2)�յ�(��, ��), ��ɫ
             var drawLine = function (canvas, x1, y1, x2, y2, color) {
                 ctx.save();
-                // 修正偏移量
+                // 锟斤拷锟斤拷偏锟斤拷锟斤拷
                 ctx.translate(0.5, 0.5);
                 ctx.beginPath();
                 ctx.moveTo(x1, y1);
@@ -139,7 +139,7 @@ var TREE_SHEET_HELPER = {
                     rect.right = Math.min(rect.right, x + w);
 
                     ctx.save();
-                    // 修正偏移量
+                    // 锟斤拷锟斤拷偏锟斤拷锟斤拷
                     ctx.translate(0.5, 0.5);
                     ctx.strokeStyle = 'black';
                     ctx.beginPath();

+ 3 - 0
server.js

@@ -99,6 +99,9 @@ app.get("/stdBillsmain", function(req, res){
 app.get("/stdBills", function(req, res){
     res.render("billsLib/html/qingdan.html");
 });
+app.get('/stdJobs', function(req, res){
+    res.render('billsLib/html/neirong.html');
+});
 var billsLibRouter = require("./modules/billsLib/billsLibRoutes/billsLibRoutes");
 app.use("/stdBillsEditor", billsLibRouter);
 //-----------------

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

@@ -7,7 +7,7 @@ var fsUtil = require('../../../public/fsUtil');
 var rpt_xl_util = require('../../../modules/reports/util/rpt_excel_util');
 
 test('check real function.', function(t){
-    var data = fs.readFileSync('../../../tmp/07_1.page1.js', 'utf8', 'r');
+    var data = fs.readFileSync('../../../tmp/07_1.page.js', 'utf8', 'r');
     //var data = fs.readFileSync('../../../tmp/08_2.page.js', 'utf8', 'r');
     eval(data);
     rpt_xl_util.exportExcel(testReport07_1, null);

+ 10 - 0
test/unit/public/testScMath.js

@@ -0,0 +1,10 @@
+/**
+ * Created by Tony on 2017/4/14.
+ */
+var test = require('tape');
+var scMathUtil = require('../../../public/scMathUtil').getUtil();
+
+test('test smartcost math util for rounding', function(t){
+    t.equal(scMathUtil.roundTo(3.12345, -2), 3.12);
+    t.end();
+})

+ 1 - 1
web/billsLib/html/main.html

@@ -125,7 +125,7 @@
     <script src="lib/bootstrap/bootstrap.min.js"></script>
     <script src="lib/global.js"></script>
     <script src="web/billsLib/scripts/billsLibAjax.js"></script>
-    <script src="web/billsLib/scripts/dateFormat.js"></script>
+    <script src="web/billsLib/scripts/tools.js"></script>
 
 </body>
 <script type="text/javascript">

+ 19 - 13
web/billsLib/html/neirong.html

@@ -6,14 +6,14 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>清单规则编辑器</title>
-    <link rel="stylesheet" href="../../css/bootstrap/bootstrap.min.css">
+    <link rel="stylesheet" href="web/css/bootstrap/bootstrap.min.css">
     <!--<link rel="stylesheet" href="../../web/css/bootstrap/themes.css">-->
-    <link rel="stylesheet" href="../../css/main.css">
-    <link rel="stylesheet" href="../../css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="web/css/main.css">
+    <link rel="stylesheet" href="web/css/font-awesome/font-awesome.min.css">
     <!--spread-->
-    <link rel="stylesheet" href="../../../web/css/spreadjs/gc.spread.sheets.excel2013white.10.0.1.css">
+    <link rel="stylesheet" href="web/css/spreadjs/gc.spread.sheets.excel2013white.10.0.1.css">
     <!--zTree-->
-    <link rel="stylesheet" href="../../css/ztree/zTreeStyle.css" type="text/css">
+    <link rel="stylesheet" href="web/css/ztree/zTreeStyle.css" type="text/css">
 </head>
 
 <body>
@@ -26,10 +26,10 @@
 
               <ul class="nav nav-tabs" role="tablist">
                   <li class="nav-item">
-                      <a class="nav-link px-3" href="qingdan.html">清单</a>
+                      <a id="aStdBills" class="nav-link px-3" href="stdBills">清单</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link active px-3" href="neirong.html">工作内容</a>
+                      <a class="nav-link active px-3" href="javascript: void(0);">工作内容</a>
                   </li>
                   <li class="nav-item">
                       <a class="nav-link px-3" href="tezheng.html">项目特征</a>
@@ -165,14 +165,20 @@
         </div>
     </div>
     <!-- JS. -->
-    <script src="../../../lib/spreadjs/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="..//scripts/global.js"></script>
-    <script src="..//scripts/setSheets.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/billsLib/scripts/global.js"></script>
+    <script src="web/billsLib/scripts/setSheets.js"></script>
+    <script src="web/billsLib/scripts/billsLibAjax.js"></script>
+    <script src="web/billsLib/scripts/tools.js"></script>
     <SCRIPT type="text/javascript">
+        var billsLibId = getQueryString('billsLibId');
         $(document).ready(function(){
+            $('#aStdBills').attr('href', function(){
+                return 'stdBills?billsLibId=' + billsLibId;
+            });
             buildAllJobs();
         });
         function buildAllJobs(){

+ 43 - 104
web/billsLib/html/qingdan.html

@@ -26,10 +26,10 @@
 
               <ul class="nav nav-tabs" role="tablist">
                   <li class="nav-item">
-                      <a class="nav-link active px-3" href="qingdan.html">清单</a>
+                      <a class="nav-link active px-3" href="javascript: void(0);">清单</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link px-3" href="neirong.html">工作内容</a>
+                      <a id="aStdJobs" class="nav-link px-3" href="stdJobs">工作内容</a>
                   </li>
                   <li class="nav-item">
                       <a class="nav-link px-3" href="tezheng.html">项目特征</a>
@@ -223,12 +223,16 @@
     <!--<script src="test/tmp_data/data_15690.js"></script>-->
     <script src="test/tmp_data/bills_grid_setting.js"></script>
     <script src="web/billsLib/scripts/dbController.js"></script>
+    <script src="web/billsLib/scripts/tools.js"></script>
 </body>
 <script type="text/javascript">
     autoFlashHeight();
     var billsTree = billsLibTree.createBillsTree();
     var billsLibId = getQueryString("billsLibId");
     $(document).ready(function(){
+        $("#aStdJobs").attr('href', function(){
+            return 'stdJobs?billsLibId=' + billsLibId;
+        });
         billsAjax.getStdBillsLibName(billsLibId);
         billsAjax.getBills(billsLibId);
         buildJobs();
@@ -238,14 +242,15 @@
     //test
 
 
-    function nodeOpration(controller,sheet){
+    function nodeOpration(controller){
+        dbController.editData(controller, controller.sheet);
         $('#insert').click(function(){
             //controller.insert();
             dbController.insert(controller);
         });
         $('#delete').click(function(){
-            dbController.delete(controller);
             //controller.delete();
+            dbController.delete(controller);
         });
         $('#upLevel').click(function(){
             //controller.upLevel();
@@ -253,11 +258,11 @@
         });
         $('#downLevel').click(function(){
             //controller.downLevel();
-            dbController.downLevel(controller);
+           dbController.downLevel(controller);
         });
         $('#upMove').click(function(){
+            //controller.upMove();
             dbController.upMove(controller);
-           // controller.upMove();
         });
         $('#downMove').click(function(){
             //controller.downMove();
@@ -271,6 +276,9 @@
         billsTree.loadDatas(datas);
         var controller = TREE_SHEET_CONTROLLER.createNew(billsTree.tree, billsSpread.getActiveSheet(), billsLibSetting);
         controller.showTreeData();
+        if(!controller.tree.selected && controller.tree.findNode(controller.sheet.getTag(0, 0, GC.Spread.Sheets.SheetArea.viewport))){
+            controller.setTreeSelected(controller.tree.findNode(controller.sheet.getTag(0, 0, GC.Spread.Sheets.SheetArea.viewport)));
+        }
         controller.bind('refreshBaseActn', function (tree) {
             var showButton = function (show, btn) {
                 if (show) {
@@ -285,114 +293,45 @@
             showButton(tree.selected && tree.selected.canDownMove(), $('#downMove'));
             showButton(tree.selected ? true : false, $('#delete'));
         });
-        nodeOpration(controller, billsSpread.getActiveSheet());
+        controller.setTreeSelected(controller.tree.findNode(controller.sheet.getTag(0,0)));
+        nodeOpration(controller);
     }
 
-
-    function buildBills(){
-        var spread = new GC.Spread.Sheets.Workbook($("#spreadBills")[0], {sheetCount: 1});
-        var sheet = spread.getSheet(0);
-        var chRowCount = 2;
-        var vpColCount = 4;
-        var vpRowCount = 27;
-        sheet.suspendPaint();
-        sheet.suspendEvent();
-        initSheet(spread, sheet, chRowCount, vpRowCount, vpColCount );//初始表单设置
-        setupBillsColHeader(sheet);
-        setupEvents(spread, sheet);//事件
-        initRowHeight(sheet);//设置行高
-        setCell(sheet);//设置文本居中
-        myCommand(spread, sheet);
-        setScrollBar(spread, sheet, vpRowCount);
-        sheet.resumePaint();
-        sheet.resumeEvent();
-
+    function buildJobs(){
+        var jobsSpread = new GC.Spread.Sheets.Workbook($("#spreadJobs")[0], {sheetCount: 1});
+        initSheet(jobsSpread);
+        TREE_SHEET_HELPER.loadSheetHeader(jobsSetting, jobsSpread.getActiveSheet());
     }
 
-    function setupBillsColHeader(sheet){
-        var ch = GC.Spread.Sheets.SheetArea.colHeader;
-        sheet.addSpan(0, 0, 2, 1, ch);
-        sheet.setValue(0, 0, "编码", ch);
-        sheet.setColumnWidth(0, 160);
-
-        sheet.addSpan(0, 1, 2, 1, ch);
-        sheet.setValue(0, 1, "名称", ch);
-        sheet.setColumnWidth(1, 300);
+    function jobsController(sheet, jobsSetting){
+        jobsAjax.getJobContent(billsLibId, function(jobsArr){
 
-        sheet.addSpan(0, 2, 2, 1, ch);
-        sheet.setValue(0, 2, "计量单位", ch);
-        sheet.setColumnWidth(2, 160);
+            sheet.bind(GC.Spread.Sheets.Events.EditEnded, function(sender, args){
+                var field, oldData = args.sheet.getValue(args.row, args.col), newData = args.editingText, id = sheet.getTag(args.row, args.col) ;
+                jobsSetting.cols.forEach(function(col, idx){
+                    if(args.col === idx){
+                        field = col.data.field;
+                    }
+                });
+                //create
+                if(!id && !newData){
+                    jobsAjax.createJobContent(billsLibId, field, newData);
+                }
+                //update
+                if(id && newData !== oldData ){
+                    jobsAjax.updateJobContent(id, field, newData);
+                }
+            });
+        });
 
-        sheet.addSpan(0, 3, 2, 1, ch);
-        sheet.setValue(0, 3, "工程量计算规则", ch);
-        sheet.setColumnWidth(3, 420);
-    }
-    //设置滚动条
-    /*function setScrollBar(spread, sheet){
-        var rowCount = sheet.getR
-    }*/
-    //
-    function buildJobs(){
-        var spread = new GC.Spread.Sheets.Workbook($("#spreadJobs")[0], {sheetCount: 1});
-        var sheet = spread.getSheet(0);
-        var chRowCount = 2;
-        var vpRowCount = 8;
-        var vpColCount = 2;
-        sheet.suspendPaint();
-        sheet.suspendEvent();
-        initSheet(spread);
-        setupJobsColHeader(sheet);
-        //initRowHeight(sheet);
-        setCell(sheet);
-        myCommand(spread, sheet);
-        setScrollBar(spread, sheet, vpRowCount);
-        sheet.resumePaint();
-        sheet.resumeEvent();
-    }
-    function setupJobsColHeader(sheet){
-        var ch = GC.Spread.Sheets.SheetArea.colHeader;
-        sheet.addSpan(0, 0, 2, 1, ch);
-        sheet.setValue(0, 0, "编号", ch);
-        sheet.setColumnWidth(0, 100);
-        sheet.addSpan(0, 1, 2, 1, ch);
-        sheet.setValue(0, 1, "工作内容", ch);
-        sheet.setColumnWidth(1, 215);
     }
-    //
-    function buildItems(){
-        var spread = new GC.Spread.Sheets.Workbook($("#spreadItems")[0], {sheetCount: 1});
-        var sheet = spread.getSheet(0);
-        var chRowCount = 2;
-        var vpRowCount = 8;
-        var vpColCount = 2;
-        sheet.suspendPaint();
-        sheet.suspendEvent();
-        initSheet(spread, sheet, chRowCount, vpRowCount, vpColCount);
-        setupItemsColHeader(sheet);
-        //initRowHeight(sheet);
-        setCell(sheet);
-        myCommand(spread, sheet);
-        setScrollBar(spread, sheet, vpRowCount);
-        sheet.resumePaint();
-        sheet.resumeEvent();
-    }
-    function setupItemsColHeader(sheet){
-        var ch = GC.Spread.Sheets.SheetArea.colHeader;
-        sheet.addSpan(0, 0, 2, 1, ch);
-        sheet.setValue(0, 0, "编号", ch);
-        sheet.setColumnWidth(0, 100);
 
-        sheet.addSpan(0, 1, 2, 1, ch);
-        sheet.setValue(0, 1, "项目特征", ch);
-        sheet.setColumnWidth(1, 215);
+    function buildItems(){
+        var itemsSpread = new GC.Spread.Sheets.Workbook($("#spreadItems")[0], {sheetCount: 1});
+        initSheet(itemsSpread);
+        TREE_SHEET_HELPER.loadSheetHeader(itemsSetting, itemsSpread.getActiveSheet());
     }
 
-    function getQueryString(name)
-    {
-        var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
-        var r = window.location.search.substr(1).match(reg);
-        if(r!=null)return  unescape(r[2]); return null;
-    }
 
 </script>
 

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

@@ -143,5 +143,66 @@ var billsAjax = {
 
             }
         });
+    },
+    updateBills: function(billsLibId, updateId, field, data){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updateBills',
+            data: {data: JSON.stringify({billsLibId: billsLibId, updateId: updateId, field: field, data: data})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    }
+}
+
+var jobsAjax = {
+    getJobContent: function(billsLidId, callback){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/getJobContent',
+            data: {data: JSON.stringify({billsLibId: billsLidId})},
+            dataType: 'json',
+            success: function(result){
+                if(!result.error && callback){
+                    callback(result.data);
+                }
+            }
+        });
+    },
+    getSomeJobs: function(billsLibId, ids){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/getSomeJobs',
+            data: {data: JSON.stringify({billsLibId: billsLibId, ids: ids})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    },
+    createJobContent: function(billsLibId, field, data){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/createJobContent',
+            data: {data: JSON.stringify({billsLibId: billsLibId, field: field, data: data})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    },
+    updateJobContent: function(id, field, data){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updateJobContent',
+            data: {data: JSON.stringify({updateId: id, field: field, data: data })},
+            dataTypea: 'json',
+            success: function(result){
+
+            }
+        });
     }
 }
+

+ 2 - 2
web/billsLib/scripts/billsLibSetting.js

@@ -112,7 +112,7 @@ var jobsSetting = {
                 hAlign: 0,
                 font: '14px Arial'
             },
-            width: 215
+            width: 210
         },
     ],
     headRows: 2,
@@ -155,7 +155,7 @@ var itemsSetting = {
                 hAlign: 0,
                 font: '14px Arial'
             },
-            width: 215
+            width: 210
         },
     ],
     headRows: 2,

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

@@ -107,5 +107,25 @@ var dbController = {
                 controller.downMove();
             }
         }
+    },
+
+    editData: function(controller){
+        controller.sheet.bind(GC.Spread.Sheets.Events.EditEnded, function(sender, args){
+            var node = controller.tree.selected, updateId, field;
+            if(node){
+                updateId = node.getID();
+                billsLibSetting.cols.forEach(function(col, idx){
+                    if(args.col === idx){
+                        field = col.data.field;
+                        node.data[field] = args.editingText;
+                    }
+                });
+                billsAjax.updateBills(billsLibId, updateId, field, args.editingText);
+            }
+            else {
+                args.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value('');
+            }
+        });
     }
+
 }

+ 9 - 0
web/billsLib/scripts/dateFormat.js

@@ -1,6 +1,7 @@
 /**
  * Created by vian on 2017/3/30.
  */
+//time tools
 Date.prototype.format = function(fmt)
 {
     var o = {
@@ -18,4 +19,12 @@ Date.prototype.format = function(fmt)
         if(new RegExp("("+ k +")").test(fmt))
             fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
     return fmt;
+}
+
+//
+function getQueryString(name)
+{
+    var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
+    var r = window.location.search.substr(1).match(reg);
+    if(r!=null)return  unescape(r[2]); return null;
 }