Переглянути джерело

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

# Conflicts:
#	modules/main/controllers/bills_controller.js
#	modules/main/models/bills.js
#	public/counter/counter.js
zhangyin 8 роки тому
батько
коміт
80ba602334
44 змінених файлів з 1088 додано та 355 видалено
  1. 4 0
      modules/main/models/bills.js
  2. 5 0
      modules/pm/controllers/copy_proj_controller.js
  3. 21 0
      modules/pm/controllers/new_proj_controller.js
  4. 10 4
      modules/pm/controllers/pm_controller.js
  5. 34 27
      modules/pm/models/project.js
  6. 1 0
      modules/pm/routes/pm_route.js
  7. 54 0
      modules/rationRepository/controllers/rationChapterTreeController.js
  8. 73 0
      modules/rationRepository/controllers/rationRepositoryController.js
  9. 79 0
      modules/rationRepository/models/rationChapterTree.js
  10. 90 0
      modules/rationRepository/models/repositoryMap.js
  11. 21 0
      modules/rationRepository/routes/rationRepRoutes.js
  12. 42 0
      modules/reports/controllers/rpt_controller.js
  13. 2 1
      modules/reports/routes/report_router.js
  14. 22 11
      modules/reports/util/rpt_excel_util.js
  15. 1 6
      modules/templates/controllers/bills_template_controller.js
  16. 13 7
      modules/templates/models/bills_template.js
  17. 3 1
      public/counter/counter.js
  18. 133 0
      public/stringUtil.js
  19. 34 0
      public/web/common_ajax.js
  20. 49 15
      public/web/idTree.js
  21. 2 12
      public/web/tree_sheet_controller.js
  22. 7 9
      public/web/tree_sheet_helper.js
  23. 11 0
      public/web/urlUtil.js
  24. 27 10
      server.js
  25. 6 23
      test/tmp_data/bills_grid_setting.js
  26. 37 0
      test/unit/public/testBatchInsertDocs.js
  27. 11 0
      test/unit/public/testPinYin.js
  28. 1 1
      web/fees/feeRate.html
  29. 33 5
      web/fees/feeRate.js
  30. 26 22
      web/main/html/main.html
  31. 18 14
      web/main/js/models/bills.js
  32. 1 0
      web/pm/html/project-management.html
  33. 0 2
      web/pm/js/pm_ajax.js
  34. 45 37
      web/pm/js/pm_main.js
  35. 20 14
      web/rationLibEditor/dinge.html
  36. 38 25
      web/rationLibEditor/js/dinge.js
  37. 27 42
      web/rationLibEditor/js/mainJ.js
  38. 2 1
      web/rationLibEditor/main.html
  39. 16 2
      web/report/html/RptHome.html
  40. 8 4
      web/scripts/tree_table.js
  41. 2 1
      web/templates/html/bills.html
  42. 27 55
      web/templates/js/bills.js
  43. 24 3
      web/templates/js/tp_bills_setting.js
  44. 8 1
      web/users/login.html

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

@@ -54,6 +54,10 @@ billsDAO.prototype.getData = function(projectID, callback){
     });
 };
 
+billsDAO.prototype.AddBillsFromTemplate = function (datas, callback) {
+    bills.collection.insert(datas, callback);
+};
+
 billsDAO.prototype.save = function(datas, callback){
     var data, errList = [], updateLength = 0;
     var updateFunc = function (err, errData) {

+ 5 - 0
modules/pm/controllers/copy_proj_controller.js

@@ -0,0 +1,5 @@
+/**
+ * Created by Mai on 2017/4/24.
+ */
+
+var billsData = require('../../main/models/bills');

+ 21 - 0
modules/pm/controllers/new_proj_controller.js

@@ -0,0 +1,21 @@
+/**
+ * Created by Mai on 2017/4/24.
+ */
+
+var billsData = require('../../main/models/bills');
+var BillsTemplateData = require('../../templates/models/bills_template');
+
+module.exports = {
+    copyTemplateData: function (tempType, newProjID, callback) {
+        BillsTemplateData.getTemplate(tempType).then(function (templates) {
+            var datas = [];
+            templates.forEach(function (template) {
+                template._doc.projectID = newProjID;
+                datas.push(template._doc);
+            })
+            return billsData.AddBillsFromTemplate(datas, callback);
+        }).catch(function (err) {
+            callback(err);
+        });
+    }
+};

+ 10 - 4
modules/pm/controllers/pm_controller.js

@@ -27,13 +27,13 @@ module.exports = {
             } else {
                 callback(req, res, err, message, null);
             }
-        })
+        });
     },
     rename: function (req, res) {
         var data = JSON.parse(req.body.data);
         ProjectsData.rename(data.user_id, data.id, data.newName, function (err, message) {
             callback(req, res, err, message, null);
-        })
+        });
     },
     getProject: function(req, res){
         var data = JSON.parse(req.body.data);
@@ -43,12 +43,18 @@ module.exports = {
             } else {
                 callback(req, res, err, message, null);
             }
-        })
+        });
     },
     beforeOpenProject: function (req, res) {
         var data = JSON.parse(req.body.data);
         ProjectsData.beforeOpenProject(data.user_id, data.proj_id, data.updateData, function (err, message, data) {
             callback(req, res, err, message, data);
-        })
+        });
+    },
+    getNewProjectID: function (req, res) {
+        var data = JSON.parse(req.body.data);
+        ProjectsData.getNewProjectID(data.count, function (err, message, data) {
+            callback(req, res, err, message, data);
+        });
     }
 }

+ 34 - 27
modules/pm/models/project.js

@@ -1,13 +1,17 @@
 /**
  * Created by Mai on 2017/1/18.
  */
+var counter = require("../../../public/counter/counter.js");
+
+var newProjController = require('../controllers/new_proj_controller');
+var copyProjController = require('../controllers/copy_proj_controller');
 
-//*/
 var mongoose = require("mongoose");
 
 var dbm = require("../../../config/db/db_manager");
 var db = dbm.getCfgConnection("usersManages");
 var Schema = mongoose.Schema;
+var deleteSchema = require('../../../public/models/deleteSchema');
 var ProjectSchema = new Schema({
     "ID": Number,
     "ParentID": Number,
@@ -17,32 +21,11 @@ var ProjectSchema = new Schema({
     "projType": String,
     "recentDateTime": Date,
     "createDateTime": Date,
-    "deleted": Boolean,
-    'deleteDateTime': Date,
+    "deleteInfo": deleteSchema,
     'fullFolder': Array
 });
 var Projects = db.model("projects", ProjectSchema);
 
-/*/
-var db = require('../db/pm_db');
-var Schema = db.mongoose.Schema;
- var ProjectSchema = new Schema({
- "name": String,
- "projType": String,
- "lastDateTime": String,
- "createDateTime": String,
- "id": Number,
- "parentId": Number,
- "nextId": Number,
- "userId": Number,
- "deleted": Boolean,
- 'deleteDateTime': String,
- 'deleteFullFolder': Array
- });
-
- var Projects = db.mongoose.model("projects", ProjectSchema);
-//*/
-
 var ProjectsDAO = function(){};
 
 ProjectsDAO.prototype.getUserProjects = function(userId, callback){
@@ -66,7 +49,7 @@ ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
 }
 
 ProjectsDAO.prototype.updateUserProjects = function(userId, datas, callback){
-    var data, project, updateLength = 0, hasError = false;
+    var data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i;
     var updateAll = function (err) {
             if (!err){
                 updateLength += 1;
@@ -79,7 +62,7 @@ ProjectsDAO.prototype.updateUserProjects = function(userId, datas, callback){
             }
         };
     if (datas){
-        for (var i = 0; i < datas.length && !hasError; i++){
+        for (i = 0; i < datas.length && !hasError; i++){
             data = datas[i];
             if (data.updateType === 'update') {
                 Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll)
@@ -89,10 +72,23 @@ ProjectsDAO.prototype.updateUserProjects = function(userId, datas, callback){
                     data.updateData['createDateTime'] = new Date();
                 }
                 newProject = new Projects(data.updateData);
-                newProject.save(updateAll);
+                newProject.save(function (err, result) {
+                    if (!err && result._doc.projType === 'Tender') {
+                        newProjController.copyTemplateData(tempType, newProject.ID, updateAll);
+                    } else {
+                        updateAll(err);
+                    }
+                });
             } else if (data.updateType === 'delete') {
-                data.updateData['deleteDateTime'] = new Date();
+                deleteInfo = {};
+                deleteInfo['deleted'] = true;
+                deleteInfo['deleteDateTime'] = new Date();
+                deleteInfo['deleteBy'] = userId;
+                data.updateData['deleteInfo'] = deleteInfo;
                 Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
+            } else {
+                hasError = true;
+                callback(1, '提交数据错误.', null);
             }
         }
     }
@@ -119,4 +115,15 @@ ProjectsDAO.prototype.beforeOpenProject = function (userId, projectId, updateDat
     });
 };
 
+ProjectsDAO.prototype.getNewProjectID = function (count, callback) {
+    counter.counterDAO.getIDAfterCount(counter.moduleName.project, count, function (err, result) {
+        var highID = result.value.sequence_value;
+        if (!err) {
+            callback(0, '', {lowID: highID - count + 1, highID: highID});
+        } else {
+            callback(1, '获取主键失败', null);
+        }
+    });
+}
+
 module.exports = new ProjectsDAO();

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -11,5 +11,6 @@ pmRouter.post('/updateProjects', pmController.updateProjects);
 pmRouter.post('/renameProject', pmController.rename);
 pmRouter.post('/beforeOpenProject', pmController.beforeOpenProject);
 pmRouter.post('/getProject', pmController.getProject);
+pmRouter.post('/getNewProjectID', pmController.getNewProjectID);
 
 module.exports = pmRouter;

+ 54 - 0
modules/rationRepository/controllers/rationChapterTreeController.js

@@ -0,0 +1,54 @@
+/**
+ * Created by Tony on 2017/4/21.
+ */
+
+var rationChapterTreeData = require('../models/rationChapterTree');
+var callback = function(req,res,err,data){
+    if(data){
+        res.status(200)
+        res.json({success:true,data:data});
+    }
+    else
+    if(err){
+        res.status(500)
+        res.json({success:false,error:err});
+    }
+    else{
+        res.status(204);
+        res.json({success:true,data:null});
+    }
+}
+module.exports ={
+    getRationChapterTree:
+        function(req,res){
+            var libName = req.body.rationLibName;
+            rationChapterTreeData.getRationChapterTrees(libName,function(err,data){
+                callback(req,res,err,data)
+            })
+        },
+    tempRationChapterTreeInsert:
+        function(req,res){
+            var DBName = req.body.rationName;
+            var rationTempTree = JSON.parse(req.body.rationTempTree);
+            rationChapterTreeData.tempRationChapterTreeInsert(DBName,rationTempTree,function(err,data){
+                callback(req,res,err,data)
+            })
+        },
+    sectionUpsert:
+        function(req,res){
+            var LibName = req.body.rationLibName;
+            var section = JSON.parse(req.body.rationSection);
+            rationChapterTreeData.sectionUpsert(LibName,section,function(err,data){
+                callback(req,res,err,data)
+            })
+        },
+    deleteSection:
+        function(req,res){
+            var LibName = req.body.rationLibName;
+            var sectionID = req.body.sectionID;
+            rationChapterTreeData.deleteSection(LibName,sectionID,function(err,data){
+                callback(req,res,err,data)
+            })
+        }
+
+}

+ 73 - 0
modules/rationRepository/controllers/rationRepositoryController.js

@@ -0,0 +1,73 @@
+/**
+ * Created by Tony on 2017/4/20.
+ */
+var rationRepository = require("../models/repositoryMap");
+
+var callback = function(req,res,err,data){
+    if(data){
+        res.status(200)
+        res.json({success:true,data:data});
+    }
+    else
+    if(err){
+        res.status(500)
+        res.json({success:false,error:err});
+    }
+    else{
+        res.status(204);
+        res.json({success:true});
+    }
+};
+
+module.exports = {
+    addRationRepository:function(req,res){
+        var rationObj = JSON.parse(req.body.rationRepObj);
+        rationRepository.addRationRepository(rationObj,function(err,data){
+            if (data) {
+                callback(req, res, err, data);
+            } else {
+                callback(req, res, err, null);
+            }
+        })
+    },
+    getDisPlayRationLibs: function(req, res){
+        rationRepository.getDisplayRationLibs(function(err, data){
+            if (data) {
+                callback(req, res, err, data);
+            } else {
+                callback(req, res, err, null);
+            }
+        });
+    },
+    getRealLibName:function(req,res){
+        var libName = req.body.rationName;
+        rationRepository.getRealLibName(libName,function(err,data){
+            if (data) {
+                callback(req, res, err, data);
+            } else {
+                callback(req, res, err, null);
+            }
+        })
+    },
+    deleteRationLib:function(req,res){
+        var rationName = req.body.rationName;
+        rationRepository.deleteRationLib(rationName,function(err,data){
+            if (data) {
+                callback(req, res, err, data);
+            } else {
+                callback(req, res, err,  null);
+            }
+        })
+    },
+    updateRationRepositoryName: function(req, res) {
+        var orgName = req.body.rationName;
+        var newName = req.body.newName;
+        rationRepository.updateName(orgName, newName, function(err, data){
+            if (data) {
+                callback(req, res, err, data);
+            } else {
+                callback(req, res, err, null);
+            }
+        });
+    }
+}

+ 79 - 0
modules/rationRepository/models/rationChapterTree.js

@@ -0,0 +1,79 @@
+/**
+ * Created by Tony on 2017/4/21.
+ */
+
+var mongoose = require("mongoose");
+var dbm = require("../../../config/db/db_manager");
+var chapterTreeDb = dbm.getCfgConnection("rationRepository")
+var async = require("async");
+var Schema = mongoose.Schema;
+
+var rationChapterTreeSchema = mongoose.Schema({//章节树  //生成唯一id改为sectionID  改成string
+    rationRepId: Number,
+    ID:Number,
+    ParentID:Number,
+    NextSiblingID:Number,
+    dispName: String
+});
+var rationChapterTreeModel = chapterTreeDb.model("rationChapterTrees",rationChapterTreeSchema, "rationChapterTrees")
+var repositoryMap = require('./repositoryMap');
+var counter = require('../../../public/counter/counter');
+
+var rationChapterTreeDAO = function(){};
+
+rationChapterTreeDAO.prototype.getRationChapterTrees = function(repositoryName,callback){
+    repositoryMap.getRealLibName(repositoryName, function(err, rst){
+        rationChapterTreeModel.find({"rationRepId": rst[0].ID},function(err,data){
+            if(data.length) callback(false,data);
+            else  if(err) callback("获取定额树错误!",false)
+            else callback(false,false);
+        })
+    })
+}
+
+rationChapterTreeDAO.prototype.createNewNode = function(repositoryName,nodeData,callback){
+    repositoryMap.getRealLibName(repositoryName, function(err, rst){
+        //
+    })
+},
+
+rationChapterTreeDAO.prototype.tempRationChapterTreeInsert = function(repositoryName,rationTempTree,callback){
+    var db = dbm.getCfgConnection(repositoryName)
+    var rationChapterTreeModel = db.model("rationChapterTrees",rationChapterTreeSchema, "rationChapterTrees")
+    rationChapterTreeModel.collection.insert(rationTempTree,function(err,data){
+        if(err) callback("插入定额模板错误",false)
+        else callback(false,"ok")
+    })
+}
+
+rationChapterTreeDAO.prototype.sectionUpsert = function(repositoryName,section,callback){
+    var db = dbm.getCfgConnection(repositoryName);
+    var rationChapterTreeModel = db.model("rationChapterTrees",rationChapterTreeSchema, "rationChapterTrees");
+    rationChapterTreeModel.find({"sectionId": section.sectionId},function(err,data){
+        if(data.length){
+            rationChapterTreeModel.update({'sectionId':section.sectionId},section,function(err,data){
+                if(err){
+                    callback(" ",false);
+                }else
+                    callback(false,"ok");
+            });
+        }else{
+            var N = new rationChapterTreeModel(section).save(function(err){
+                if(err){
+                    callback(" ",false);
+                }else
+                    callback(false,"success!");
+            })
+        }
+    })
+}
+//待  ration模块完成
+rationChapterTreeDAO.prototype.deleteSection= function(repositoryName,sectionId,callback){
+    var db = dbm.getCfgConnection(repositoryName);
+    var rationChapterTreeModel = db.model("rationItems",rationChapterTreeSchema);
+    rationChapterTreeModel.find({"sectionId": sectionId},[],function(err,data){
+
+    })
+}
+
+module.exports = new rationChapterTreeDAO()

+ 90 - 0
modules/rationRepository/models/repositoryMap.js

@@ -0,0 +1,90 @@
+/**
+ * Created by Tony on 2017/4/24.
+ * 重新构造,不适宜生成多个定额库db,还是得统一在一个表
+ */
+var mongoose = require('mongoose');
+var dbm = require("../../../config/db/db_manager");
+//var stringUtil = require('../../../public/stringUtil');
+var rationLibdb = dbm.getCfgConnection("rationRepository");
+var Schema = mongoose.Schema;
+var RepositoryMapSchema = new Schema({
+    "ID": Number,
+    "dispName" : String,
+    "appType" : String, //如:"建筑" / "公路"
+    "localeType": String, //如 各个省份 / 部颁
+    "descr" : String,
+    "deleted": Boolean
+});
+var counter = require('../../../public/counter/counter');
+
+var rationRepository = rationLibdb.model("repositoryMap", RepositoryMapSchema, "repositoryMap");
+
+function createNewLibModel(rationLibObj){
+    var rst = {};
+    rst.dispName = rationLibObj.dispName;
+    rst.appType = rationLibObj.appType?rationLibObj.appType:'construct';
+    rst.localeType = rationLibObj.localeType?rationLibObj.localeType:'';
+    rst.descr = rationLibObj.descr;
+    rst.deleted = false;
+    return rst;
+}
+
+rationRepositoryDao = function(){};
+
+rationRepositoryDao.prototype.getRealLibName = function(dispName,callback){
+    rationRepository.find({"dispName": dispName}, function(err,data){
+        if (err) {
+            callback('Error', null);
+        } else {
+            callback(0, data);
+        }
+    });
+};
+
+rationRepositoryDao.prototype.addRationRepository = function( rationLibObj,callback){
+    counter.counterDAO.getIDAfterCount(counter.moduleName.rationMap, 1, function(err, result){
+        var rMap = createNewLibModel(rationLibObj);
+        rMap.ID = result.value.sequence_value;
+        new rationRepository(rMap).save(function(err) {
+            if (err) callback("Error", null)
+            else
+                callback(false, "ok");
+        });
+    });
+};
+
+rationRepositoryDao.prototype.getDisplayRationLibs = function(callback) {
+    rationRepository.find({"deleted": false}, function(err, data){
+        if (err) {
+            callback( 'Error', null);
+        } else {
+            callback( false, data);
+        }
+    });
+};
+
+rationRepositoryDao.prototype.updateName = function(orgName,newName,callback){
+    rationRepository.find({"dispName":newName, "deleted": false}, function(err, data){
+        if (data.length == 0) {
+            rationRepository.update({dispName:orgName},{$set:{dispName:newName}},function(err){
+                if(err) callback("err",false);
+                else callback(false,"ok")
+            })
+        } else
+            callback("不可重名!",false);
+    });
+}
+
+rationRepositoryDao.prototype.deleteRationLib = function(rationName,callback){
+    rationRepository.find({"dispName":rationName, "deleted": false}, function(err, data){
+        if (data.length == 1) {
+            rationRepository.update({dispName:rationName},{$set:{deleted: true}},function(err){
+                if(err) callback("err",false);
+                else callback(false,"ok")
+            })
+        } else
+            callback("删除失败!",false);
+    });
+}
+
+module.exports = new rationRepositoryDao();

+ 21 - 0
modules/rationRepository/routes/rationRepRoutes.js

@@ -0,0 +1,21 @@
+/**
+ * Created by Tony on 2017/4/20.
+ */
+var express = require("express");
+var apiRouter =express.Router();
+var _rootDir = __dirname;
+
+var rationRepositoryController = require("../controllers/rationRepositoryController");
+var rationChapterTreeController = require("../controllers/rationChapterTreeController");
+
+apiRouter.post("/getRationDisplayNames",rationRepositoryController.getDisPlayRationLibs);
+apiRouter.post("/editRationLibs",rationRepositoryController.updateRationRepositoryName);
+apiRouter.post("/addRationRepository",rationRepositoryController.addRationRepository);
+apiRouter.post("/deleteRationLibs",rationRepositoryController.deleteRationLib);
+apiRouter.post("/getRealLibName",rationRepositoryController.getRealLibName);
+
+apiRouter.post("/getRationTree",rationChapterTreeController.getRationChapterTree);
+apiRouter.post("/addSection",rationChapterTreeController.sectionUpsert);
+apiRouter.post("/deleteSection",rationChapterTreeController.deleteSection);
+
+module.exports = apiRouter;

+ 42 - 0
modules/reports/controllers/rpt_controller.js

@@ -8,6 +8,8 @@ var TemplateData = require('../models/rpt_temp_data');
 var JpcEx = require('../rpt_component/JpcEx');
 //var cache = require('../../../public/cache/cacheUtil');
 var rptUtil = require("../util/rpt_util");
+var rpt_xl_util = require('../util/rpt_excel_util');
+var fs = require('fs');
 
 //统一回调函数
 var callback = function(req, res, err, data){
@@ -54,6 +56,46 @@ module.exports = {
             }
         );
     },
+    getExcel: function(req, res) {
+        var grp_id = req.params.id, tpl_id = req.params.pm, pageSize = req.params.size, rptName = req.params.rptName;
+        var rptTpl = null;
+        Template.getPromise(grp_id, tpl_id).then(function(rst) {
+            rptTpl = rst;
+            if (rptTpl) {
+                return TemplateData.getPromise(tpl_id);
+            } else {
+                callback(req, res, 'No report template was found!', null);
+            }
+        }).then(function(tplData){
+                if (tplData) {
+                    var printCom = JpcEx.createNew();
+                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                    var defProperties = rptUtil.getReportDefaultCache();
+                    printCom.initialize(rptTpl);
+                    printCom.analyzeData(rptTpl, tplData, defProperties);
+                    var maxPages = printCom.totalPages;
+                    var pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                    if (pageRst) {
+                        rpt_xl_util.exportExcel(pageRst, rptName, null, function(newName){
+                            res.setHeader('Content-Type', 'application/vnd.openxmlformats');
+                            res.setHeader("Content-Disposition", "attachment; filename=" + rptName + ".xlsx");
+                            var filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
+                            filestream.on('data', function(chunk) {
+                                res.write(chunk);
+                            });
+                            filestream.on('end', function() {
+                                res.end();
+                            });
+                        });
+                    } else {
+                        callback(req, res, "Have errors while on going...", null);
+                    }
+                } else {
+                    callback(req, res, 'No report data were found!', null);
+                }
+            }
+        );
+    },
     getDummyExcel: function(req, res) {
         var nodeExcel = require('excel-export'); //关联excel-export模块
         console.log("req.params.id:" + req.params.id);

+ 2 - 1
modules/reports/routes/report_router.js

@@ -9,6 +9,7 @@ var reportController = require('./../controllers/rpt_controller');
 
 rptRouter.post('/getReport', reportController.getReportAllPages);
 //rptRouter.post('/getPreview', pmController.updateProjects);
-rptRouter.get('/getExcel/:id/:pm', reportController.getDummyExcel);
+rptRouter.get('/getDummyExcel/:id/:pm', reportController.getDummyExcel);
+rptRouter.get('/getExcel/:id/:pm/:size/:rptName', reportController.getExcel);
 
 module.exports = rptRouter;

+ 22 - 11
modules/reports/util/rpt_excel_util.js

@@ -202,7 +202,12 @@ function writeSharedString(sharedStrList){
         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('<si><t>' + sharedStrList[i] + '</t></si>');
+            if (typeof sharedStrList[i] === 'string') {
+                rst.push('<si><t>' + sharedStrList[i].replace('|','\r\n') + '</t></si>');
+            } else {
+                rst.push('<si><t>' + sharedStrList[i] + '</t></si>');
+            }
         }
         rst.push('</sst>');
     }
@@ -610,7 +615,7 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
 }
 
 module.exports = {
-    exportExcel: function (pageData, fName, options) {
+    exportExcel: function (pageData, fName, options, callback) {
         var rptOptions = (options || {singlePage: false, fileName: 'report'});
         var sheets = [];
         for (var i = 0; i < pageData.items.length; i++) {
@@ -663,14 +668,20 @@ module.exports = {
         data = writeStyles(stylesObj);
         zip_xl.file(file, data.join(''), {compression: 'DEFLATE'});
 
-        zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
-            //.pipe(fs.createWriteStream('../../../tmp/outExcel.xlsx'))
-            .pipe(fs.createWriteStream('../../../tmp/' + fName + '.zip'))
-            .on('finish', function () {
-                // JSZip generates a readable stream with a "end" event,
-                // but is piped here in a writable stream which emits a "finish" event.
-                console.log("outExcel.xlsx was written.");
-            }
-        );
+        if (fName) {
+            var newName = '' + (new Date()).valueOf();
+            zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
+                .pipe(fs.createWriteStream(__dirname.slice(0, __dirname.length - 21) + '/tmp/' + newName + '.xlsx'))
+                .on('finish', function () {
+                    // JSZip generates a readable stream with a "end" event,
+                    // but is piped here in a writable stream which emits a "finish" event.
+                    console.log(newName + ".xlsx was written.");
+                    if (callback) callback(newName);
+                }
+            );
+        } else {
+            //return zip.generateNodeStream({type:'nodebuffer',streamFiles:true});
+            return zip;
+        }
     }
 }

+ 1 - 6
modules/templates/controllers/bills_template_controller.js

@@ -3,7 +3,6 @@
  */
 var BillsTemplateData = require('../models/bills_template');
 
-//ͳһ»Øµ÷º¯Êý
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
 };
@@ -32,11 +31,7 @@ module.exports = {
     getNewBillsTemplateID: function (req, res) {
         var data = JSON.parse(req.body.data);
         BillsTemplateData.getNewBillsTemplateID(data.count, function (err, message, data) {
-            if (err === 0) {
-                callback(req, res, err, message, data);
-            } else {
-                callback(req, res, err, message, null);
-            }
+            callback(req, res, err, message, data);
         });
     }
 }

+ 13 - 7
modules/templates/models/bills_template.js

@@ -24,13 +24,19 @@ var BillsTemplates = templatesDB.model('temp_bills', BillsTemplateSchema);
 var BillsTemplateDAO = function(){};
 
 BillsTemplateDAO.prototype.getTemplate = function (type, callback) {
-    BillsTemplates.find({'$or': [{tempType: type, deleteInfo: null}, {tempType: type, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, template){
-        if (err) {
-            callback(1, '找不到模板', null);
-        } else {
-            callback(0, '', template);
-        }
-    });
+    if (callback) {
+        BillsTemplates.find({'$or': [{tempType: type, deleteInfo: null}, {tempType: type, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id').exec()
+            .then(function (result, err) {
+                if (err) {
+                    callback(1, '找不到模板', null);
+                } else {
+                    callback(0, '', template);
+                }
+            });
+        return null;
+    } else {
+        return BillsTemplates.find({'$or': [{tempType: type, deleteInfo: null}, {tempType: type, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id').exec();
+    }
 };
 BillsTemplateDAO.prototype.updateTemplate = function (userID, tempType, datas, callback) {
     var data, project, updateLength = 0, hasError = false, deleteInfo = null;

+ 3 - 1
public/counter/counter.js

@@ -20,8 +20,10 @@ const COUNTER_MODULE_NAME = {
     project: 'projects',
     user: 'users',
     bills: 'bills',
-    ration: 'rations',
+    ration: 'ration',
     GLJ: 'glj',
+    rationMap: 'rationMaps',
+    rationTree: 'rationChapterTrees',
     report: 'rptTemplates',
     fee: 'fees',
     template_bills: 'temp_bills'

Різницю між файлами не показано, бо вона завелика
+ 133 - 0
public/stringUtil.js


+ 34 - 0
public/web/common_ajax.js

@@ -0,0 +1,34 @@
+/**
+ * Created by Mai on 2017/4/20.
+ */
+
+var CommonAjax = {
+    post: function (url, data, successCallback, errorCallback) {
+        $.ajax({
+            type:"POST",
+            url: url,
+            data: {'data': JSON.stringify(data)},
+            dataType: 'json',
+            cache: false,
+            timeout: 50000,
+            success: function(result){
+                if (result.error === 0) {
+                    if (successCallback) {
+                        successCallback(result.data);
+                    }
+                } else {
+                    alert('error: ' + result.message);
+                    if (errorCallback) {
+                        errorCallback();
+                    }
+                }
+            },
+            error: function(jqXHR, textStatus, errorThrown){
+                alert('error ' + textStatus + " " + errorThrown);
+                if (errorCallback) {
+                    errorCallback();
+                }
+            }
+        });
+    }
+};

+ 49 - 15
public/web/idTree.js

@@ -7,7 +7,8 @@ var idTree = {
             id: 'id',
             pid: 'pid',
             nid: 'nid',
-            rootId: -1
+            rootId: -1,
+            autoUpdate: false
         };
 
         var _eventType = {
@@ -65,13 +66,14 @@ var idTree = {
                     nodes[i].nextSibling = (i === nodes.length - 1) ? null : nodes[i + 1];
                 }
             },
-            // 在nodes中,从iIndex(包括)开始全部移除
+            // 在nodes中,从iIndex(包括)开始全部移除
             removeNodes: function (tree, parent, iIndex, count) {
                 var children = parent ? parent.children : tree.roots;
                 var pre = (iIndex < 0 || iIndex >= children.length) ? null : children[iIndex].preSibling;
                 var next = (pre && iIndex + count - 1 < children.length) ? children[iIndex + count] : null;
                 if (pre) {
-                    pre.nextSibling = next;
+                    pre.setNextSibling(next);
+                    //pre.nextSibling = next;
                 }
                 if (next) {
                     next.preSibling = pre;
@@ -82,7 +84,7 @@ var idTree = {
                     children.splice(iIndex, children.length - iIndex);
                 }
             },
-            // 在nodes中增加addNodes, 位置从index开始
+            // 在parent.children/tree.roots中增加nodes, 位置从index开始
             addNodes: function (tree, parent, nodes, iIndex) {
                 var children = parent ? parent.children : tree.roots;
                 var pre, next, i;
@@ -95,20 +97,20 @@ var idTree = {
                     next = null;
                 }
                 if (pre) {
-                    pre.nextSibling = nodes[0];
+                    pre.setNextSibling(nodes[0]);
                 }
                 nodes[0].preSibling = pre;
                 if (next) {
                     next.preSibling = nodes[nodes.length - 1];
                 }
-                nodes[nodes.length - 1].nextSibling = next;
+                nodes[nodes.length - 1].setNextSibling(next);
                 for (i = 0; i < nodes.length; i++) {
                     if (arguments.length === 4) {
                         children.splice(iIndex + i, 0, nodes[i]);
                     } else if (arguments.length === 3) {
                         children.push(nodes[i]);
                     }
-                    nodes[i].parent = parent ? parent : null;
+                    nodes[i].setParent(parent ? parent : null);
                 }
             },
             sortTreeItems: function (tree) {
@@ -135,7 +137,7 @@ var idTree = {
         };
 
         var Node = function (tree, data) {
-            // 以下的属性,本单元外均不可直接修改
+            // 以下的属性,本单元外均不可直接修改
             this.tree = tree;
             this.data = data;
             this.children = [];
@@ -160,6 +162,19 @@ var idTree = {
             return this.nextSibling ? this.nextSibling.getID() : -1;
         };
 
+        Node.prototype.setParent = function (parent) {
+            this.parent = parent;
+            if (this.tree.setting.autoUpdate) {
+                this.data[this.tree.setting.pid] = this.getParentID();
+            }
+        };
+        Node.prototype.setNextSibling = function (nextSibling) {
+            this.nextSibling = nextSibling;
+            if (this.tree.setting.autoUpdate) {
+                this.data[this.tree.setting.nid] = this.getNextSiblingID();
+            }
+        }
+
         Node.prototype.firstChild = function () {
             return this.children.length === 0 ? null : this.children[0];
         };
@@ -320,12 +335,12 @@ var idTree = {
             var iIndex = this.siblingIndex(), belongArray = this.parent ? this.parent.children : this.tree.roots, orgPre = this.preSibling;
             if (this.canUpMove()) {
                 if (orgPre.preSibling) {
-                    orgPre.preSibling.nextSibling = this;
+                    orgPre.preSibling.setNextSibling(this);
                 }
-                orgPre.nextSibling = this.nextSibling;
+                orgPre.seNextSibling(this.nextSibling);
                 this.preSibling = orgPre.preSibling;
                 orgPre.preSibling = this;
-                this.nextSibling = orgPre;
+                this.setNextSibling(orgPre);
                 belongArray.splice(iIndex, 1);
                 belongArray.splice(iIndex - 1, 0, this);
                 tools.sortTreeItems(this.tree);
@@ -353,11 +368,11 @@ var idTree = {
             var iIndex = this.siblingIndex(), belongArray = this.parent ? this.parent.children : this.tree.roots, orgNext = this.nextSibling;
             if (this.canDownMove()) {
                 if (this.preSibling) {
-                    this.preSibling.nextSibling = orgNext;
+                    this.preSibling.setNextSibling(orgNext);
                 }
                 orgNext.preSibling = this.preSibling;
-                this.nextSibling = orgNext.nextSibling;
-                orgNext.nextSibling = this;
+                this.setNextSibling(orgNext.nextSibling);
+                orgNext.setNextSibling(this);
                 this.preSibling = orgNext;
                 belongArray.splice(iIndex, 1);
                 belongArray.splice(iIndex + 1, 0, this);
@@ -512,6 +527,25 @@ var idTree = {
             }
             return data;
         };
+        Tree.prototype.insertByData = function (data, parentID, nextSiblingID) {
+            var parent = parentID === -1 ? null : this.nodes[this.prefix + parentID];
+            var nextSibling = nextSiblingID === -1 ? null : this.nodes[this.prefix + nextSiblingID];
+            var node = this.nodes[this.prefix + data[this.setting.id]];
+            if (node) {
+                return node;
+            } else {
+                node = new Node(this, data);
+                if (nextSibling) {
+                    tools.addNodes(this, parent, [node], nextSibling.siblingIndex());
+                } else {
+                    tools.addNodes(this, parent, [node]);
+                }
+                this.nodes[this.prefix +  data[this.setting.id]] = node;
+                tools.sortTreeItems(this);
+                this.maxNodeID( data[this.setting.id]);
+                return node;
+            }
+        };
 
         Tree.prototype.delete = function (node) {
             var success = false, that = this;
@@ -525,7 +559,7 @@ var idTree = {
                 deleteIdIndex([node]);
                 //delete this.nodes[this.prefix + node.getID()];
                 if (node.preSibling) {
-                    node.preSibling.nextSibling = node.nextSibling;
+                    node.preSibling.setNextSibling(node.nextSibling);
                 }
                 if (node.nextSibling) {
                     node.nextSibling.preSibling = node.preSibling;

+ 2 - 12
public/web/tree_sheet_controller.js

@@ -18,18 +18,8 @@ var TREE_SHEET_CONTROLLER = {
             var that = this;
             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)));
+                that.setTreeSelected(that.tree.items[info.newSelections[0].row]);
             });
-
-            /*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) {
-                    TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, result.nodes, false);
-                } else {
-                    TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, [tree.findNode(args.sheet.getTag(args.row, args.col))], false);
-                };
-            });*/
         };
 
         controller.prototype.insert = function () {
@@ -57,7 +47,7 @@ var TREE_SHEET_CONTROLLER = {
                 if (this.tree.delete(this.tree.selected)) {
                     TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
                         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)));
+                        that.setTreeSelected(that.tree.items[sels[0].row]);
                     });
                 }
             }

+ 7 - 9
public/web/tree_sheet_helper.js

@@ -94,13 +94,11 @@ var TREE_SHEET_HELPER = {
                     }
                     return data;
                 };
-                cell.value(getFieldText2());
-                /*if (node.data[colSetting.data.field]) {
-                    cell.value(node.data[colSetting.data.field]);
+                if (colSetting.data.getText) {
+                    cell.value(colSetting.data.getText(node));
                 } else {
-                    cell.text('');
-                }*/
-                sheet.setTag(iRow, iCol, node.getID());
+                    cell.value(getFieldText2());
+                }
             });
             if (recursive) {
                 TREE_SHEET_HELPER.refreshTreeNodeData(setting, sheet, node.children, recursive);
@@ -165,7 +163,7 @@ var TREE_SHEET_HELPER = {
                     }
                 }
             }
-            var node = tree.findNode(options.sheet.getTag(options.row, options.col, options.SheetArea));
+            var node = tree.items[options.row];
             var showTreeLine = true;
 
             if (!node) { return; }
@@ -225,7 +223,7 @@ var TREE_SHEET_HELPER = {
         }
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
             var offset = -1;
-            var node = tree.findNode(hitinfo.sheet.getTag(hitinfo.row, hitinfo.col, hitinfo.sheetArea));
+            var node = tree.items[hitinfo.row];
             tree.selected = node;
             if (!node || node.children.length === 0) { return; }
             var centerX = hitinfo.cellRect.x + offset + node.depth() * indent + indent / 2;
@@ -236,7 +234,7 @@ var TREE_SHEET_HELPER = {
                 TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () {
                     var iCount = node.posterityCount(), i, child;
                     for (i = 0; i < iCount; i++) {
-                        child = tree.findNode(hitinfo.sheet.getTag(hitinfo.row + i + 1, hitinfo.col, hitinfo.sheetArea));
+                        child = tree.items[hitinfo.row + i + 1];
                         hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.visible, hitinfo.sheetArea);
                         //hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.vis(), hitinfo.sheetArea);
                     }

+ 11 - 0
public/web/urlUtil.js

@@ -0,0 +1,11 @@
+/**
+ * Created by Mai on 2017/4/18.
+ */
+var scUrlUtil = {
+    GetQueryString: function (name) {
+        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+        var r = window.location.search.substr(1).match(reg);
+        if (r != null) return unescape(r[2]);
+        return null;
+    }
+};

+ 27 - 10
server.js

@@ -38,8 +38,12 @@ app.use(session({
 
 app.use(function (req, res, next) {
     var url = req.originalUrl;
-    if (req.originalUrl !== "/login" && !req.session.userAccount) {
-        return res.redirect("/login");
+    if (!/^\/login/.test(req.originalUrl) && !req.session.userAccount) {
+        if (req.headers.referer) {
+            return res.redirect('/login' + '?referer=' + req.headers.referer);
+        } else {
+            return res.redirect("/login" + '?referer=' + req.originalUrl);
+        }
     }
     next();
 });
@@ -99,14 +103,27 @@ app.get('/report',  function(req, res) {
 });
 app.use("/report_api", rpt_Router);
 
-//zhangenping add 2017.0.13-----------------------------------------begin
-app.use(express.static(_rootDir+"/web"));
-app.use(express.static(_rootDir+"/lib"));
-var rations_Router = require("./modules/rationLibEditor/routes/rationLibEditor_route");
-app.use("/rationLibEditor",rations_Router);
-//-----------------------------------------------------------------end
-//----------------
-
+//app.use(express.static(_rootDir+"/web"));
+//app.use(express.static(_rootDir+"/lib"));
+//var rations_Router = require("./modules/rationLibEditor/routes/rationLibEditor_route");
+//app.use("/rationLibEditor",rations_Router);
+
+var rationRepository_Router = require("./modules/rationRepository/routes/rationRepRoutes");
+app.get('/rationRepository/main', function(req, res) {
+    res.render('rationLibEditor/main.html',
+        {
+            userAccount: req.session.userAccount,
+            userID: req.session.userID
+        });
+});
+app.get('/rationRepository/ration', function(req, res) {
+    res.render('rationLibEditor/dinge.html',
+        {
+            userAccount: req.session.userAccount,
+            userID: req.session.userID
+        });
+});
+app.use("/rationRepository/api",rationRepository_Router);
 
 app.get("/stdBillsmain", function(req, res){
     res.render("billsLib/html/main.html");

+ 6 - 23
test/tmp_data/bills_grid_setting.js

@@ -5,7 +5,7 @@ var BillsGridSetting = {
     cols: [
         {
             head: {
-                titleNames: ['编号'],
+                titleNames: ['项目编码'],
                 spanCols: [1],
                 spanRows: [2],
                 vAlign: [1, 1],
@@ -13,33 +13,16 @@ var BillsGridSetting = {
                 font: '9px Arial'
             },
             data: {
-                field: 'Code',
+                field: 'code',
                 vAlign: 1,
                 hAlign: 0,
                 font: '9px Arial'
             },
-            width: 150
-        },
-        {
-            head: {
-                titleNames: ['清单编号'],
-                spanCols: [1],
-                spanRows: [2],
-                vAlign: [1, 1],
-                hAlign: [1, 1],
-                font: '9px Arial'
-            },
-            data: {
-                field: 'B_Code',
-                vAlign: 1,
-                hAlign: 0,
-                font: '9px Arial'
-            },
-            width: 100
+            width: 200
         },
         {
             head: {
-                titleNames: ['名称'],
+                titleNames: ['项目名称'],
                 spanCols: [1],
                 spanRows: [2],
                 vAlign: [1, 1],
@@ -47,7 +30,7 @@ var BillsGridSetting = {
                 font: '9px Arial'
             },
             data: {
-                field: 'Name',
+                field: 'name',
                 vAlign: 1,
                 hAlign: 0,
                 font: '9px Arial'
@@ -64,7 +47,7 @@ var BillsGridSetting = {
                 font: '9px Arial'
             },
             data: {
-                field: 'Units',
+                field: 'unit',
                 vAlign: 1,
                 hAlign: 1,
                 font: '9px Arial'

+ 37 - 0
test/unit/public/testBatchInsertDocs.js

@@ -0,0 +1,37 @@
+/**
+ * Created by Tony on 2017/4/24.
+ */
+
+var test = require('tape');
+var mongoose = require('mongoose');
+var dbm = require("../../../config/db/db_manager");
+var testdb = dbm.getLocalConnection("Demo");
+var Schema = mongoose.Schema;
+//testBatchInsert
+var BatchInsertSchema = new Schema({
+    "ID": Number,
+    "dispName" : String
+});
+
+var testModel = testdb.model("testBatchInsert", BatchInsertSchema, "testBatchInsert");
+
+test('test batch insert docs', function(t){
+    var arr = [];
+    arr.push(new testModel({ID: 1, dispName: "name1"}));
+    arr.push(new testModel({ID: 2, dispName: "name2"}));
+    arr.push(new testModel({ID: 3, dispName: "name3"}));
+    testModel.collection.insert(arr, null, function(err, docs){
+        if (err) {
+            t.pass('pass with error');
+        } else {
+            t.pass('pass with: ' + docs.insertedCount + ' records were inserted!');
+        }
+        t.end();
+    })
+});
+
+test('finish', function (t) {
+    mongoose.disconnect();
+    t.pass('closing db connection');
+    t.end();
+});

+ 11 - 0
test/unit/public/testPinYin.js

@@ -0,0 +1,11 @@
+/**
+ * Created by Tony on 2017/4/20.
+ */
+var test = require('tape');
+var stringUtil = require('../../../public/stringUtil');
+
+test('测试汉字转拼音', function(t){
+    t.equal(stringUtil.getPinYinFullChars("重庆市建筑工程"), "ZONGHENGKEJI——123");
+    t.equal(stringUtil.getPinYinCamelChars("纵横科技"), "ZHKJ");
+    t.end();
+})

+ 1 - 1
web/fees/feeRate.html

@@ -48,7 +48,7 @@
                 <span class="btn btn-link btn-sm new-msg">
                   <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;2
                 </span>
-                <button class="btn btn-link btn-sm">注销</button>
+                <button class="btn btn-link btn-sm" id="logout">注销</button>
             </div>
         </nav>
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">

+ 33 - 5
web/fees/feeRate.js

@@ -1,4 +1,4 @@
-/**
+/**
  * Created by CSL on 2017-03-23.
  */
 var region = '重庆';
@@ -15,6 +15,10 @@ $(document).ready(function () {
     $("#projectFeeFile").click(function () {
         loadProjectFeeRates(feeRateFileID);
     });
+
+    $("#logout").click(function () {
+        location.href = '/logout';
+    });
 });
 
 function loadProjectFeeRates(fileID) {
@@ -75,10 +79,6 @@ function loadLibFeeRates(libID) {
 
 function createSpreadView(canEdit) {
     // 创建前先销毁旧树表。
-    //$('#divFee').empty();  // 清空不行,浏览器跟踪显示错误数狂飚:TypeError: G is null
-    //$('#divFee').remove(); // 删除可以,但是太山寨。
-    //$('#content').append($('<div class="grid" id="divFee"></div>'));
-    // 以下找到官方的处理方法,比较面向对象
     if (spreadView) {
         spreadView.destroy();
         spreadView = null;
@@ -173,8 +173,36 @@ function createSpreadView(canEdit) {
         }
     };
 
+    function showObjs(arr){
+        var s = '';
+        for (var i = 0; i < arr.length; i++) {
+            s = s + JSON.stringify(arr[i]) + "\n";
+        }
+        alert(s);
+    }
+
+    function showObjs2(obj) {
+        var str = "";
+        var spr = "";
+        for (var x in obj) {
+            if (obj.hasOwnProperty(x)) {
+                if(str == ''){ spr = '' } else { spr = ', '};
+                str += spr + x + ':' + obj[x];
+            }
+        }
+        return str;
+    }
+
+    function rowClickFun(sender, args) {
+        //var arr = [args.event, args.hitInfo, args.item.dataItem];
+        //showObjs(arr);
+        alert(showObjs2(spreadView.getItem(4).item));
+    }
+
     spreadView = new GC.Spread.Views.DataView($('#divFee')[0],
         dataSource, columns, new GC.Spread.Views.Plugins.GridLayout(options));
+ 
+    spreadView["rowClick"].addHandler(rowClickFun);
     spreadView.invalidate();
     document.querySelector('#divFee').focus();
 }

+ 26 - 22
web/main/html/main.html

@@ -535,6 +535,7 @@
     <!-- view -->
     <script type="text/javascript" src="web/main/js/main_ajax.js"></script>
     <script type="text/javascript" src="web/main/js/main.js"></script>
+    <script type="text/javascript" src="/public/web/common_ajax.js"></script>
     <SCRIPT type="text/javascript">
   		<!--
   		var setting = {
@@ -616,7 +617,7 @@
         billsSpread.options.scrollbarMaxAlign = true;
 
         // For Test
-        datas.forEach(function (data) {
+        /*datas.forEach(function (data) {
             data.fees = [];
             data.fees.push({fieldName: 'labour', unitFee: '1', totalFee: '2', tenderUnitFee: '3', tenderTotalFee: '4'});
             data.flags = [];
@@ -627,30 +628,33 @@
             data.fees.push({fieldName: 'machine', unitFee: '5', totalFee: '6', tenderUnitFee: '7', tenderTotalFee: '8'});
             data.flags = [];
             data.flags.push({fieldName: 'isPartGather', flag: false});
-        });
+        });*/
 
         project = PROJECT.createNew();
-        project.Bills.loadDatas(datas);
-        project.Rations.loadDatas(drawing_data);
-        project.loadMainTree();
-        //project.mainTree.loadDatas(project.Bills.tree, project.Rations.datas);
+        CommonAjax.post('/bills/getBills', {}, function (bills) {
+            project.Bills.loadDatas(bills);
+            project.Rations.loadDatas([]);
+            //project.Rations.loadDatas(drawing_data);
+            project.loadMainTree();
 
-        controller = TREE_SHEET_CONTROLLER.createNew(project.mainTree, billsSpread.getActiveSheet(), BillsGridSetting);
-        //controller = TREE_SHEET_CONTROLLER.createNew(project.Bills.tree, billsSpread.getActiveSheet(), BillsGridSetting);
-        controller.showTreeData();
-        controller.bind('refreshBaseActn', function (tree) {
-            var showButton = function (show, btn) {
-                if (show) {
-                    btn.show();
-                } else {
-                    btn.hide();
-                }
-            };
-            showButton(tree.selected && tree.selected.canUpLevel(), $('#upLevel'));
-            showButton(tree.selected && tree.selected.canDownLevel(), $('#downLevel'));
-            showButton(tree.selected && tree.selected.canUpMove(), $('#upMove'));
-            showButton(tree.selected && tree.selected.canDownMove(), $('#downMove'));
-            showButton(tree.selected ? true : false, $('#delete'));
+            controller = TREE_SHEET_CONTROLLER.createNew(project.mainTree, billsSpread.getActiveSheet(), BillsGridSetting);
+            //controller = TREE_SHEET_CONTROLLER.createNew(project.Bills.tree, billsSpread.getActiveSheet(), BillsGridSetting);
+
+            controller.showTreeData();
+            controller.bind('refreshBaseActn', function (tree) {
+                var showButton = function (show, btn) {
+                    if (show) {
+                        btn.show();
+                    } else {
+                        btn.hide();
+                    }
+                };
+                showButton(tree.selected && tree.selected.canUpLevel(), $('#upLevel'));
+                showButton(tree.selected && tree.selected.canDownLevel(), $('#downLevel'));
+                showButton(tree.selected && tree.selected.canUpMove(), $('#upMove'));
+                showButton(tree.selected && tree.selected.canDownMove(), $('#downMove'));
+                showButton(tree.selected ? true : false, $('#delete'));
+            });
         });
 
         $('#insert').click(function () {

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

@@ -11,10 +11,10 @@ var Bills = {
             rootId: -1
         };
 
-        // 用户定义private方法
+        // 鐢ㄦ埛瀹氫箟private鏂规硶
         var tools = {};
 
-        // 所有通过this访问的属性,都不应在此单元外部进行写入操作
+        // 所有通过this访问的属性,都不应在此单元外部进行写入操作
         var bills = function (proj) {
             this.project = proj;
             this.datas = null;
@@ -27,7 +27,7 @@ var Bills = {
             proj.registerModule(ModuleNames.bills, this);
         };
 
-        // 从后台获取数据
+        // ???????????
         bills.prototype.pullData = function (){
             this.project.pullData(
                 '/bills/getData',
@@ -37,33 +37,37 @@ var Bills = {
                         this.loadDatas(result.data);
                     }
                     else {
-                        // to do: 错误处理需要细化
+                        // to do: ????????????
                         alert(result.message);
                     }
                 },
-                function (){/* to do: 错误处理需要细化*/}
+                function (){/* to do: ????????????*/}
             )
         };
 
-        // prototype用于定义public方法
+        // prototype鐢ㄤ簬瀹氫箟public鏂规硶
         bills.prototype.loadDatas = function (datas) {
             this.datas = datas;
-            // generate Fees & Flags IndexFor View & Calculate
+            // generate Fees & Flags Index, For View & Calculate
             this.datas.forEach(function (data) {
                 data.FeesIndex = {};
-                data.fees.forEach(function (fee) {
-                    data.FeesIndex[fee.fieldName] = fee;
-                });
+                if (data.fees) {
+                    data.fees.forEach(function (fee) {
+                        data.FeesIndex[fee.fieldName] = fee;
+                    });
+                }
                 data.FlagsIndex = {};
-                data.flags.forEach(function (flag) {
-                    data.FlagsIndex[flag.fieldName] = flag;
-                });
+                if (data.flags) {
+                    data.flags.forEach(function (flag) {
+                        data.FlagsIndex[flag.fieldName] = flag;
+                    });
+                }
             });
             // datas load to Tree
             this.tree.loadDatas(this.datas);
         };
 
-        // 提交数据后的错误处理方法
+        // ???????????????
         bills.prototype.doAfterUpdate = function(err, data){
             // to do
         };

+ 1 - 0
web/pm/html/project-management.html

@@ -457,6 +457,7 @@
     <script src="lib/global.js"></script>
     <script src="public/dateUtil.js"></script>
     <script src="web/scripts/tree_table.js"></script>
+    <script type="text/javascript" src="/public/web/common_ajax.js"></script>
     <script src="web/pm/js/pm_ajax.js"></script>
     <script src="web/pm/js/pm_main.js" charset="UTF-8"></script>
     <!-- zTree -->

+ 0 - 2
web/pm/js/pm_ajax.js

@@ -44,7 +44,6 @@ var UpdateProjectData = function (updateData, callback) {
         }
     });
 };
-
 // 重命名项目
 var RenameProject = function(projId, newName, callback) {
     $.ajax({
@@ -66,7 +65,6 @@ var RenameProject = function(projId, newName, callback) {
         }
     });
 };
-
 // 打开项目前,提交数据
 var BeforeOpenProject = function (projId, updateData, callback) {
     $.ajax({

+ 45 - 37
web/pm/js/pm_main.js

@@ -135,8 +135,8 @@ var GetPreNodeUpdateData = function (pre, nid) {
     return data;
 }
 // 获取新建项目数据
-var GetAddProjUpdateData = function (parent, next, name) {
-    var datas = [], updateData, pre, newId = Tree.maxNodeId() + 1;
+var GetAddProjUpdateData = function (parent, next, name, newId) {
+    var datas = [], updateData, pre;
     updateData = {};
     updateData['updateType'] = 'new';
     updateData['updateData'] = {};
@@ -148,8 +148,8 @@ var GetAddProjUpdateData = function (parent, next, name) {
     datas.push(updateData);
     return datas;
 };
-var GetAddFolderProjUpdateData = function (parent, next, folderName1, folderName2, name) {
-    var datas = [], updateData, folderData1, folderData2, pre, newId = Tree.maxNodeId() + 1;
+var GetAddFolderProjUpdateData = function (parent, next, folderName1, folderName2, name, newId) {
+    var datas = [], updateData, folderData1, folderData2, pre;
     var addUpdateData = function (parentId, nextId, name, projType) {
         var data = {};
         data['updateType'] = 'new';
@@ -169,8 +169,8 @@ var GetAddFolderProjUpdateData = function (parent, next, folderName1, folderName
     return datas;
 };
 // 获取新建文件夹数据
-var GetAddForlderUpdateData = function (parent, next, folderName) {
-    var datas = [], updateData, pre, newId = Tree.maxNodeId() + 1;
+var GetAddForlderUpdateData = function (parent, next, folderName, newId) {
+    var datas = [], updateData, pre;
     updateData = {};
     updateData['updateType'] = 'new';
     updateData['updateData'] = {};
@@ -217,7 +217,6 @@ var GetDeleteUpdateData = function (node) {
             data['updateType'] = 'delete';
             data['updateData'] = {};
             data['updateData'][Tree.setting.tree.id] = node.id();
-            data['updateData']['deleted'] = true;
             if (node.data.projType === 'Tender') {
                 data['updateData']['FullFolder'] = GetfullFolder(node.parent);
             }
@@ -358,7 +357,7 @@ $('#addFolderBtn').click(function () {
 $('#addFolderOk').click(function () {
     var form = $('#addFolder');
     var name = $('#folder-name-input').val();
-    var updateData, parent, next;
+    var parent, next;
     if (name) {
         if (Tree.selected()) {
             if (Tree.selected().children.length === 0 || Tree.selected().firstChild().data.projType === 'Folder') {
@@ -373,21 +372,24 @@ $('#addFolderOk').click(function () {
             next = Tree.firstNode();
         }
 
-        updateData = GetAddForlderUpdateData(parent, next, name);
-        UpdateProjectData(updateData, function(datas){
-            datas.forEach(function (data) {
-                if (data.updateType === 'new') {
-                    Tree.addNodeData(data.updateData, parent, next);
-                }
+        CommonAjax.post('/getNewProjectID', {count: 1}, function (IDs) {
+            var updateData = GetAddForlderUpdateData(parent, next, name, IDs.lowID);
+            Tree.maxNodeId(IDs.lowID - 1);
+            UpdateProjectData(updateData, function(datas){
+                datas.forEach(function (data) {
+                    if (data.updateType === 'new') {
+                        Tree.addNodeData(data.updateData, parent, next);
+                    }
+                });
+                form.modal('hide');
             });
-            form.modal('hide');
         });
     }
 });
 
 // 新建工程
 var AddProj = function () {
-    var name = $('#tenderName').val(), updateData, parent, next;
+    var name = $('#tenderName').val();
     if (name !== '') {
         // if (Tree.selected()){
         //     if (Tree.selected().data.projType === 'Tender') {
@@ -405,34 +407,40 @@ var AddProj = function () {
         //     parent = Tree._root();
         //     next = Tree.firstNode();
         // }
-        updateData = GetAddProjUpdateData(Tree._root, Tree.firstNode(), name);
-        UpdateProjectData(updateData, function (datas) {
-            datas.forEach(function (data) {
-                var parent, next;
-                if (data.updateType === 'new') {
-                    parent = data.updateData.parentId === -1 ?  Tree._root : Tree.findNode(data.updateData.parentId);
-                    next = data.updateData.nextId === -1 ? null : Tree.findNode(data.updateData.nextId);
-                    Tree.addNodeData(data.updateData, parent, next);
-                }
+        CommonAjax.post('/getNewProjectID', {count: 1}, function (IDs) {
+            var updateData = GetAddProjUpdateData(Tree._root, Tree.firstNode(), name, IDs.lowID);
+            Tree.maxNodeId(IDs.lowID - 1);
+            UpdateProjectData(updateData, function (datas) {
+                datas.forEach(function (data) {
+                    var parent, next;
+                    if (data.updateType === 'new') {
+                        parent = data.updateData.parentId === -1 ?  Tree._root : Tree.findNode(data.updateData.parentId);
+                        next = data.updateData.nextId === -1 ? null : Tree.findNode(data.updateData.nextId);
+                        Tree.addNodeData(data.updateData, parent, next);
+                    }
+                });
+                $('#addProj').modal('hide');
             });
-            $('#addProj').modal('hide');
         });
     }
 }
 var AddFolderProj = function () {
-    var nameB = $('#buildName').val(), nameX = $('#xiangName').val(), name = $('#tenderName').val(), updateData;
+    var nameB = $('#buildName').val(), nameX = $('#xiangName').val(), name = $('#tenderName').val();
     if (nameB !== '' && nameX !== '' && name !== '') {
-        updateData = GetAddFolderProjUpdateData(Tree._root, Tree.firstNode(), nameB, nameX, name);
-        UpdateProjectData(updateData, function (datas) {
-            datas.forEach(function (data) {
-                var parent, next;
-                if (data.updateType === 'new') {
-                    parent = data.updateData[Tree.setting.tree.pid] === -1 ?  Tree._root : Tree.findNode(data.updateData[Tree.setting.tree.pid]);
-                    next = data.updateData[Tree.setting.tree.nid] === -1 ? null : Tree.findNode(data.updateData[Tree.setting.tree.nid]);
-                    Tree.addNodeData(data.updateData, parent, next);
-                }
+        CommonAjax.post('/getNewProjectID', {count: 3}, function (IDs) {
+            var updateData = GetAddFolderProjUpdateData(Tree._root, Tree.firstNode(), nameB, nameX, name, IDs.lowID);
+            Tree.maxNodeId(IDs.lowID - 1);
+            UpdateProjectData(updateData, function (datas) {
+                datas.forEach(function (data) {
+                    var parent, next;
+                    if (data.updateType === 'new') {
+                        parent = data.updateData[Tree.setting.tree.pid] === -1 ?  Tree._root : Tree.findNode(data.updateData[Tree.setting.tree.pid]);
+                        next = data.updateData[Tree.setting.tree.nid] === -1 ? null : Tree.findNode(data.updateData[Tree.setting.tree.nid]);
+                        Tree.addNodeData(data.updateData, parent, next);
+                    }
+                });
+                $('#addProj').modal('hide');
             });
-            $('#addProj').modal('hide');
         });
     }
 }

+ 20 - 14
web/rationLibEditor/dinge.html

@@ -45,6 +45,12 @@
             <div class="container-fluid">
                 <div class="row">
                   <div class="main-side col-lg-3 p-0">
+                      <div class="tab-bar">
+                          <!--
+                          <a href="#" class="btn btn-secondary btn-sm">创建默认章节树</a>
+                          -->
+                          <a onclick="addRootNode()" class="btn btn-secondary btn-sm">增加根节点</a>
+                      </div>
                     <div class="tab-content">
                       <ul id="treeDemo" class="ztree"></ul>
                     </div>
@@ -862,7 +868,7 @@
         </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>
@@ -877,19 +883,19 @@
 /*var rationName = getQueryString("rationname");*/
 var treeObj;
 var zNodes =[
-    { id:1, pId:0,nId:2, name:"第一章 土石方工程",isParent:true,children:[]},
-    { id:2, pId:0,nId:3, name:"第二章 挡墙、护坡工程",isParent:true,children:[]},
-    { id:3, pId:0,nId:4, name:"第三章 基础工程",isParent:true,children:[]},
-    { id:4, pId:0,nId:5, name:"第四章 脚手架工程",isParent:true,children:[]},
-    { id:5, pId:0,nId:6, name:"第五章 砌筑工程",isParent:true,children:[]},
-    { id:6, pId:0,nId:7, name:"第六章 混凝土及钢筋混凝土工程",isParent:true,children:[]},
-    { id:7, pId:0,nId:8, name:"第七章 金属工程",isParent:true,children:[]},
-    { id:8, pId:0,nId:9, name:"第八章 门窗、木结构",isParent:true,children:[]},
-    { id:9, pId:0,nId:10, name:"第九章 楼地面工程",isParent:true,children:[]},
-    { id:10, pId:0,nId:11, name:"第十章 层面工程",isParent:true,children:[]},
-    { id:11, pId:0,nId:12, name:"第十一章 防腐隔热保温工程",isParent:true,children:[]},
-    { id:12, pId:0,nId:13, name:"第十二章 装饰工程",isParent:true,children:[]},
-    { id:13, pId:0,nId:-1, name:"第十三章 其他工程",isParent:true,children:[]},
+    { id:1, pId:-1,nId:2, name:"第一章 土石方工程",isParent:true,children:[]},
+    { id:2, pId:-1,nId:3, name:"第二章 挡墙、护坡工程",isParent:true,children:[]},
+    { id:3, pId:-1,nId:4, name:"第三章 基础工程",isParent:true,children:[]},
+    { id:4, pId:-1,nId:5, name:"第四章 脚手架工程",isParent:true,children:[]},
+    { id:5, pId:-1,nId:6, name:"第五章 砌筑工程",isParent:true,children:[]},
+    { id:6, pId:-1,nId:7, name:"第六章 混凝土及钢筋混凝土工程",isParent:true,children:[]},
+    { id:7, pId:-1,nId:8, name:"第七章 金属工程",isParent:true,children:[]},
+    { id:8, pId:-1,nId:9, name:"第八章 门窗、木结构",isParent:true,children:[]},
+    { id:9, pId:-1,nId:10, name:"第九章 楼地面工程",isParent:true,children:[]},
+    { id:10, pId:-1,nId:11, name:"第十章 层面工程",isParent:true,children:[]},
+    { id:11, pId:-1,nId:12, name:"第十一章 防腐隔热保温工程",isParent:true,children:[]},
+    { id:12, pId:-1,nId:13, name:"第十二章 装饰工程",isParent:true,children:[]},
+    { id:13, pId:-1,nId:-1, name:"第十三章 其他工程",isParent:true,children:[]},
 ];
 var setting = {
     view: {

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

@@ -20,35 +20,48 @@ $(document).ready(function(){
     mkRationItemSpread();
 });
 function initParam(){
-    var rationLibName = getQueryString("rationname");//获取定额库参数
-    if(rationLibName)
-        getRealLib(rationLibName);
-    else{
+    var rationLibName = getQueryString("repository");//获取定额库参数
+    if(rationLibName) {
+        params.realLibName = rationLibName;
+        getRationTree();
+    } else{
         params = JSON.parse(getQueryString("params"));
         getRationTree();
     }
 }
-function getRealLib(LibName){
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/rationLibEditor/getRealLibName",
-        data:{"rationName":LibName},
-        async:false,
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-            params.realLibName = result.data[0].dbName
-            getRationTree();
-        },
-        error:function(){}
-    })
+function addRootNode(){
+    //$.ajax({
+    //    type:"POST",
+    //    url:"api/getRationTree",
+    //    data:{"rationLibName": params.realLibName},
+    //    dataType:"json",
+    //    cache:false,
+    //    timeout:20000,
+    //    success:function(result,textStatus,status){
+    //        if(status.status == 200) createRationTree(result.data);//根据返回的全部定额章节对象,构架树。
+    //        else{
+    //            //treeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes);
+    //            //saveTempTree();
+    //        }
+    //    },
+    //    error:function(err){
+    //        alert(err.responseText.error)
+    //    }
+    //})
+
+    var newNodes = [], isSilent = false;
+    newNodes.push({ id: 20, pId:-1, nId:-1, name:"新增节点",isParent:true, children:[]});
+    if (treeObj) {
+        treeObj.addNodes(null, -1, newNodes, isSilent);
+    } else {
+        treeObj = $.fn.zTree.init($("#treeDemo"), setting, newNodes);
+    }
 }
 //---------------------------------------------------初始化章节树界面
 function  getRationTree(){
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/getRationTree",
+        url:"api/getRationTree",
         data:{"rationLibName": params.realLibName},
         dataType:"json",
         cache:false,
@@ -56,8 +69,8 @@ function  getRationTree(){
         success:function(result,textStatus,status){
             if(status.status == 200) createRationTree(result.data);//根据返回的全部定额章节对象,构架树。
             else{
-                treeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes);
-                saveTempTree();
+                //treeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes);
+                //saveTempTree();
             }
         },
         error:function(err){
@@ -151,7 +164,7 @@ function saveTempTree(){
     var rationTempTree = JSON.stringify(N)
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/saveTempRationTree",
+        url:"api/saveTempRationTree",
         data:{"rationName":rationLibName,"rationTempTree":rationTempTree},
         dataType:"json",
         cache:false,
@@ -199,7 +212,7 @@ function saveNewSection(n){
     var section = JSON.stringify(sec);
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/addSection",
+        url:"api/addSection",
         data:{"rationLibName":params.realLibName,"rationSection":section},
         dataType:"json",
         cache:false,
@@ -225,7 +238,7 @@ function onRemove(e, treeId, treeNode) {
     }
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/deleteSection",
+        url:"api/deleteSection",
         data:{"rationLibName":params.realLibName,"sectionID": treeNode.id},
         dataType:"json",
         cache:false,

+ 27 - 42
web/rationLibEditor/js/mainJ.js

@@ -5,15 +5,15 @@ $(function(){
     getRationLibs();
 })
 
-function addressdirect(){
+function addEvent_Addressdirect(){
     $("tr:gt(0)").each(function() {
         var td, a;
         td = $("td:eq(0)", $(this));
         a = $('a', td);
-        a.attr('href', "/rationLibEditor/rationLib" + "?rationname=" + a.text());
+        a.attr('href', "/rationRepository/ration" + "?repository=" + a.text());
     })
 }
-function deleteLib(){
+function addEvent_DeleteLib(){
     $("tr:gt(0)").each(function() {
         var td0, a1,td2,a2;
         td2 = $("td:eq(2)", $(this));
@@ -28,7 +28,7 @@ function deleteLib(){
     })
 }
 
-function editLib(){
+function addEvent_EditLib(){
     $("tr:gt(0)").each(function() {
         var td0, a1,td2,a2;
         td2 = $("td:eq(2)", $(this));
@@ -46,7 +46,7 @@ $("#deleteLib").click(function(){
     var rationLibName = $("#did").val();
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/deleteRationLibs",
+        url:"api/deleteRationLibs",
         dataType:"json",
         data:{"rationName": rationLibName},
         cache:false,
@@ -64,18 +64,18 @@ $("#deleteLib").click(function(){
 function getRationLibs(){
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/getRationDisplayNames",
+        url:"api/getRationDisplayNames",
         dataType:"json",
         cache:false,
-        timeout:50000,
+        timeout:5000,
         success:function(result){
             $("tbody tr").html("");
             for(var i=0;i<result.data.length;i++){
-                addLibTag(result.data[i].displayName);
+                addLibTag(result.data[i].dispName);
             }
-            addressdirect();
-            deleteLib();
-            editLib();
+            addEvent_Addressdirect();
+            addEvent_DeleteLib();
+            addEvent_EditLib();
         },
         error:function(iqXHR,textStatus,errorThrown){
             alert("error "+textStatus+" "+errorThrown);
@@ -90,21 +90,21 @@ function addLibTag(string){
     var a = $("a",$td0);
     var str = string;
     a.text(str);
-    var date = new Date().format("yyyy-MM-dd");
+    var date = new Date().Format("yyyy-MM-dd");
     $td1.text(date);
     $tr.appendTo("tbody");
 }
 
-function addRation(str) {
+function addRationRepository(rationObj) {
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/addRationLib",
+        url:"api/addRationRepository",
         dataType:"json",
-        data:{"rationDisPlayName": str},
+        data:{"rationRepObj": JSON.stringify(rationObj)},
         cache:false,
-        timeout:50000,
+        timeout:5000,
         success:function(result){
-
+            //
         },
         error:function(iqXHR,textStatus,errorThrown){
             alert("error "+textStatus+" "+errorThrown);
@@ -120,12 +120,16 @@ $("#rationAdd").click(function(){
     var a = $("a",$td0);
     var str = $("#addInput").val();
     a.text(str);
-    var date = new Date().format("yyyy-MM-dd");
+    var date = new Date().Format("yyyy-MM-dd");
     $td1.text(date);
     $tr.appendTo("tbody");
-    addRation(str);
-    addressdirect();
-    deleteLib();
+    var newRationRepObj = {};
+    newRationRepObj.dispName = str;
+    newRationRepObj.appType = "建筑";
+    newRationRepObj.descr = "";
+    addRationRepository(newRationRepObj);
+    addEvent_Addressdirect();
+    addEvent_DeleteLib();
 });
 
 $("#edtOK").click(function(){
@@ -133,7 +137,7 @@ $("#edtOK").click(function(){
     var newStr = $("#inputRation").val();
     $.ajax({
         type:"POST",
-        url:"http://localhost:6060/rationLibEditor/editRationLibs",
+        url:"api/editRationLibs",
         dataType:"json",
         data:{"rationName": str,"newName":newStr},
         cache:false,
@@ -148,24 +152,5 @@ $("#edtOK").click(function(){
     })
 
 });
-Date.prototype.format = function(fmt) {
-    var o = {
-        "M+" : this.getMonth()+1,
-        "d+" : this.getDate(),
-        "h+" : this.getHours(),
-        "m+" : this.getMinutes(),
-        "s+" : this.getSeconds(),
-        "q+" : Math.floor((this.getMonth()+3)/3),
-        "S"  : this.getMilliseconds()
-    };
-    if(/(y+)/.test(fmt)) {
-        fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
-    }
-    for(var k in o) {
-        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;
-}
+
 autoFlashHeight();

+ 2 - 1
web/rationLibEditor/main.html

@@ -105,7 +105,7 @@
 
     <!--弹出删除-->
     <div class="modal fade" id="del" data-backdrop="static" style="display: none;" aria-hidden="true">
-        <input type="hidden" id="did" value="">
+        <input type="hidden" id="did" value="123">
         <div class="modal-dialog" role="document">
             <div class="modal-content">
                 <div class="modal-header">
@@ -130,6 +130,7 @@
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/lib/global.js"></script>
     <!-- zTree -->
+    <script type="text/javascript" src="/public/dateUtil.js"></script>
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/mainJ.js"></script>

+ 16 - 2
web/report/html/RptHome.html

@@ -109,10 +109,24 @@
         }
     }
 
-    function getExcel() {
+    function getDummyExcel() {
         var id = "dummy_request_id";
         var p1 = "dummy_paramm_2";
-        var url =  "/report_api/getExcel/" + id + "/" + p1;
+        var url =  "/report_api/getDummyExcel/" + id + "/" + p1;
+        window.location = url;//这里不能使用get方法跳转,否则下载不成功
+    }
+
+    function getExcel() {
+        var rpt = document.getElementById("select_k1");
+        var size = document.getElementById("select_k2");
+        var rpt_name = rpt.options[rpt.selectedIndex].text;
+        if (rpt.selectedIndex >= 0 && size.selectedIndex >= 0) {
+            var strs = rpt.options[rpt.selectedIndex].value.split(';');
+            rpt_grp = strs[0];
+            rpt_id = strs[1];
+            rpt_size = size.options[size.selectedIndex].value;
+        }
+        var url =  "/report_api/getExcel/" + rpt_grp + "/" + rpt_id + "/" + rpt_size + "/" + rpt_name;
         window.location = url;//这里不能使用get方法跳转,否则下载不成功
     }
 

+ 8 - 4
web/scripts/tree_table.js

@@ -161,8 +161,12 @@
  					return _maxNodeId;
  				}
  			};
-			this.maxNodeId = function (){
-				return _maxNodeId;
+			this.maxNodeId = function (id){
+				if (arguments.length > 0) {
+					_maxNodeId = Math.max(id, _maxNodeId);
+				} else {
+					return _maxNodeId;
+				}
 			}
  		};
 
@@ -234,7 +238,7 @@
  					node = new Node(that, data);
  				}
  				node.data = data;
-				that.newNodeId(node.id());
+				that.maxNodeId(node.id());
 
 				if (!parent){
 					if (data[setting.tree.pid] === setting.tree.nullId) {
@@ -301,7 +305,7 @@
 			var pNode = parent ? parent : this._root;
 			if (!nextSibling || (nextSibling.parent === pNode && pNode.childIndex(nextSibling) > -1)) {
 				node = new Node(this, data);
-                this.newNodeId(data[this.setting.tree.id]);
+                this.maxNodeId(data[this.setting.tree.id]);
 				node.row = _view._makeRowDom(this.treeBodyObj, node);
 				this.move(node, pNode, nextSibling);
 			}

+ 2 - 1
web/templates/html/bills.html

@@ -99,7 +99,8 @@
 <!-- service -->
 <script type="text/javascript" src="/web/templates/js/bills.js"></script>
 <script type="text/javascript" src="/web/templates/js/tp_bills_setting.js"></script>
-<script type="text/javascript">
+<script type="text/javascript" src="/public/web/common_ajax.js"></script>
+<script>
     autoFlashHeight();
 </script>
 </html>

+ 27 - 55
web/templates/js/bills.js

@@ -3,32 +3,6 @@
  */
 $(document).ready(function () {
     var tempType = 3;
-    var PostData = function (url, data, successCallback, errorCallback) {
-        $.ajax({
-            type:"POST",
-            url: url,
-            data: {'data': JSON.stringify(data)},
-            dataType: 'json',
-            cache: false,
-            timeout: 50000,
-            success: function(result){
-                if (result.error === 0) {
-                    successCallback(result.data);
-                } else {
-                    alert('error: ' + result.message);
-                    if (errorCallback) {
-                        errorCallback();
-                    }
-                }
-            },
-            error: function(jqXHR, textStatus, errorThrown){
-                alert('error ' + textStatus + " " + errorThrown);
-                if (errorCallback) {
-                    errorCallback();
-                }
-            }
-        });
-    };
     var FormatUpdateData = function (data) {
         var updateData = {};
         updateData['user_id'] = userID;
@@ -52,16 +26,14 @@ $(document).ready(function () {
     }
     var RefreshBillsData = function (datas) {
         datas.forEach(function (data) {
-            bills.forEach(function (billsData) {
-                if (data.data.ID === billsData.ID) {
-                    $.extend(true, billsData, data.data);
-                }
-            })
-        })
-    }
+            var node = tree.findNode(data.data.ID);
+            if (node) {
+                $.extend(true, node.data, data.data);
+            }
+        });
+    };
 
-    var bills;
-    var tree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1});
+    var tree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true});
     var billsSpread = new GC.Spread.Sheets.Workbook($('#billsSpread')[0], { sheetCount: 1 });
     var controller = TREE_SHEET_CONTROLLER.createNew(tree, billsSpread.getActiveSheet(), TEMPLATE_BILLS_SETTING);
 
@@ -69,26 +41,32 @@ $(document).ready(function () {
 
     billsSpread.options.tabStripVisible = false;
     billsSpread.options.scrollbarMaxAlign = true;
+    billsSpread.options.cutCopyIndicatorVisible = false;
+    billsSpread.options.allowCopyPasteExcelStyle = false;
     controller.bind('refreshBaseActn', RefreshBaseActn);
 
     billsSpread.bind(GC.Spread.Sheets.Events.EditEnded, function (sender, info) {
-        var node = controller.tree.findNode(info.sheet.getTag(info.row, info.col));
+        var node = controller.tree.items[info.row];
         var fieldName = controller.setting.cols[info.col].data.field;
         var data = {type: 'update', data: {ID: node.getID()}};
         data.data[fieldName] = info.editingText;
         var updateData = FormatUpdateData([data]);
-        PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+        CommonAjax.post('/template/bills/updateBillsTemplate', updateData, function (data) {
             node.data[fieldName] = info.editingText;
             controller.refreshTreeNode([node], false);
         }, function () {
             controller.refreshTreeNode([node], false);
         });
     });
+    billsSpread.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
+        console.log("ClipboardPasting");
+    });
     billsSpread.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (e, info) {
+        console.log("ClipboardPasted");
         var node, iRow, iCol, curRow, curCol, datas = [], data, fieldName, updateData;
         for (iRow = 0; iRow < info.cellRange.rowCount; iRow ++) {
             curRow = info.cellRange.row + iRow;
-            node = controller.tree.findNode(info.sheet.getTag(curRow, 0));
+            node = controller.tree.items[curRow];
             if (node) {
                 data = {type: 'update', data: {ID: node.getID()}};
                 for (iCol = 0; iCol < info.cellRange.colCount; iCol++) {
@@ -99,16 +77,16 @@ $(document).ready(function () {
                 datas.push(data);
             }
         };
-        PostData('/template/bills/updateBillsTemplate', FormatUpdateData(datas), function (data) {
+        CommonAjax.post('/template/bills/updateBillsTemplate', FormatUpdateData(datas), function (data) {
             RefreshBillsData(data);
             controller.showTreeData();
         }, function () {
             controller.showTreeData();
-        })
+        });
     });
 
-    PostData('/template/bills/getBillsTemplate', {tempType: tempType}, function (data) {
-        bills = data;
+    CommonAjax.post('/template/bills/getBillsTemplate', {tempType: tempType}, function (data) {
+        var bills = data;
         tree.loadDatas(bills);
         controller.showTreeData();
         RefreshBaseActn(tree);
@@ -118,7 +96,7 @@ $(document).ready(function () {
     });
 
     $('#insert').click(function () {
-        PostData('/template/bills/getNewBillsTemplateID', {count: 1}, function (data) {
+        CommonAjax.post('/template/bills/getNewBillsTemplateID', {count: 1}, function (data) {
             var selected = controller.tree.selected, updateData;
             controller.tree.maxNodeID(data.lowID - 1);
             controller.tree.rangeNodeID(data.highID);
@@ -128,9 +106,8 @@ $(document).ready(function () {
                 updateData = FormatUpdateData(controller.tree.getInsertData());
             }
             if (updateData.updateData.length > 0) {
-                PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+                CommonAjax.post('/template/bills/updateBillsTemplate', updateData, function (data) {
                     controller.insert();
-                    RefreshBillsData(data);
                     controller.showTreeData();
                 });
             } else {
@@ -142,9 +119,8 @@ $(document).ready(function () {
         var selected = controller.tree.selected, updateData;
         if (selected) {
             updateData = FormatUpdateData(controller.tree.getDeleteData(selected));
-            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            CommonAjax.post('/template/bills/updateBillsTemplate', updateData, function (data) {
                 controller.delete();
-                RefreshBillsData(data);
                 controller.showTreeData();
             });
         }
@@ -153,9 +129,8 @@ $(document).ready(function () {
         var selected = controller.tree.selected, updateData;
         if (selected) {
             updateData = FormatUpdateData(selected.getUpLevelData());
-            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            CommonAjax.post('/template/bills/updateBillsTemplate', updateData, function (data) {
                 controller.upLevel();
-                RefreshBillsData(data);
                 controller.showTreeData();
             });
         }
@@ -164,9 +139,8 @@ $(document).ready(function () {
         var selected = controller.tree.selected, updateData;
         if (selected) {
             updateData = FormatUpdateData(selected.getDownLevelData());
-            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            CommonAjax.post('/template/bills/updateBillsTemplate', updateData, function (data) {
                 controller.downLevel();
-                RefreshBillsData(data);
                 controller.showTreeData();
             });
         }
@@ -175,9 +149,8 @@ $(document).ready(function () {
         var selected = controller.tree.selected, updateData;
         if (selected) {
             updateData = FormatUpdateData(selected.getUpMoveData());
-            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            CommonAjax.post('/template/bills/updateBillsTemplate', updateData, function (data) {
                 controller.upMove();
-                RefreshBillsData(data);
                 controller.showTreeData();
             });
         }
@@ -186,9 +159,8 @@ $(document).ready(function () {
         var selected = controller.tree.selected, updateData;
         if (selected) {
             updateData = FormatUpdateData(selected.getDownMoveData());
-            PostData('/template/bills/updateBillsTemplate', updateData, function (data) {
+            CommonAjax.post('/template/bills/updateBillsTemplate', updateData, function (data) {
                 controller.downMove();
-                RefreshBillsData(data);
                 controller.showTreeData();
             });
         }

+ 24 - 3
web/templates/js/tp_bills_setting.js

@@ -120,7 +120,14 @@ var TEMPLATE_BILLS_SETTING = {
             "field":"ID",
             "vAlign":0,
             "hAlign":1,
-            "font":"14.6667px Calibri"
+            "font":"14.6667px Calibri"/*,
+            "getText": function (node) {
+                if (node) {
+                    return node.getID();
+                } else {
+                    return '';
+                }
+            }*/
         }
     }, {
         "width":50,
@@ -149,7 +156,14 @@ var TEMPLATE_BILLS_SETTING = {
             "field":"ParentID",
             "vAlign":0,
             "hAlign":1,
-            "font":"14.6667px Calibri"
+            "font":"14.6667px Calibri"/*,
+            "getText": function (node) {
+                if (node) {
+                    return node.getParentID();
+                } else {
+                    return '';
+                }
+            }*/
         }
     }, {
         "width":50,
@@ -178,7 +192,14 @@ var TEMPLATE_BILLS_SETTING = {
             "field":"NextSiblingID",
             "vAlign":0,
             "hAlign":1,
-            "font":"14.6667px Calibri"
+            "font":"14.6667px Calibri"/*,
+            "getText": function (node) {
+                if (node) {
+                    return node.getNextSiblingID();
+                } else {
+                    return '';
+                }
+            }*/
         }
     }]
 };

+ 8 - 1
web/users/login.html

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/web/css/main.css">
     <link rel="stylesheet" href="/web/css/font-awesome/font-awesome.min.css">
     <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/public/web/urlUtil.js"></script>
 </head>
 <body>
     <div class="container">
@@ -36,6 +37,8 @@
 
         <script>
             $(document).ready(function () {
+                var referer = scUrlUtil.GetQueryString('referer');
+
                 $("#login").click(function () {
                     var account = $("#inputEmail").val();
                     var pw = $("#inputPassword").val();
@@ -47,7 +50,11 @@
                         success: function (result) {
                             if (result.data) {
 //                                $('#ver').modal('show');
-                                location.href = '/';
+                                if (referer) {
+                                    location.href = referer;
+                                } else {
+                                    location.href = '/';
+                                }
                             }
                             else {
                                 $('#hint').html(result.error);