فهرست منبع

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 سال پیش
والد
کامیت
31171ad7eb
42فایلهای تغییر یافته به همراه3694 افزوده شده و 697 حذف شده
  1. 1 1
      Dockerfile
  2. 1 1
      Dockerfile_qa
  3. 1 1
      config/config.js
  4. 7 10
      config/db/db_manager.js
  5. 5 5
      logs/log4js.json
  6. 116 38
      modules/bills_lib/controllers/bills_lib_controllers.js
  7. 59 0
      modules/bills_lib/controllers/bills_permissionController.js
  8. 39 0
      modules/bills_lib/controllers/items_permissionController.js
  9. 33 0
      modules/bills_lib/controllers/jobs_permissionController.js
  10. 56 0
      modules/bills_lib/controllers/stdBillsLib_permissionController.js
  11. 27 0
      modules/bills_lib/controllers/views_permissionController.js
  12. 2797 410
      modules/bills_lib/models/bills_lib_interfaces.js
  13. 16 0
      modules/bills_lib/models/bills_lib_model.js
  14. 65 39
      modules/bills_lib/models/bills_lib_schemas.js
  15. 63 29
      modules/bills_lib/routes/bills_lib_routes.js
  16. 21 0
      modules/common/helper/mongoose_helper.js
  17. 1 1
      modules/common/std/schemas/std_ration_lib_glj_list.js
  18. 1 1
      modules/glj/models/unit_price_model.js
  19. 2 1
      modules/main/controllers/project_controller.js
  20. 30 5
      modules/pm/controllers/pm_controller.js
  21. 38 3
      modules/pm/models/project_model.js
  22. 28 17
      modules/ration_glj/facade/ration_glj_facade.js
  23. 15 14
      modules/ration_glj/models/ration_glj_temp.js
  24. 1 1
      modules/ration_repository/models/glj_repository.js
  25. 8 1
      modules/users/models/engineering_lib_model.js
  26. 2 1
      public/calc_util.js
  27. 2 2
      public/web/sheet/sheet_common.js
  28. 3 0
      public/web/sheet/sheet_data_helper.js
  29. 3 0
      public/web/tree_sheet/tree_sheet_helper.js
  30. 1 0
      server.js
  31. 8 5
      test/tmp_data/bills_grid_setting.js
  32. 1 1
      web/building_saas/css/main.css
  33. 6 14
      web/building_saas/main/html/main.html
  34. 6 0
      web/building_saas/main/js/models/bills.js
  35. 84 28
      web/building_saas/main/js/views/character_content_view.js
  36. 16 13
      web/building_saas/main/js/views/std_bills_lib.js
  37. 10 11
      web/building_saas/main/js/views/std_ration_lib.js
  38. 28 11
      web/building_saas/main/js/views/sub_view.js
  39. 6 6
      web/building_saas/pm/html/project-management.html
  40. 84 26
      web/building_saas/pm/js/pm_main.js
  41. 1 0
      web/glj/html/glj_index.html
  42. 2 1
      web/glj/js/project_glj_spread.js

+ 1 - 1
Dockerfile

@@ -1,4 +1,4 @@
-FROM server:2.0
+FROM server:3.0
 
 COPY . ConstructionCost
 

+ 1 - 1
Dockerfile_qa

@@ -1,4 +1,4 @@
-FROM server:2.0
+FROM server:3.0
 
 COPY . ConstructionCost
 

+ 1 - 1
config/config.js

@@ -19,7 +19,7 @@ module.exports = {
             },
             "server": {
                  "socketOptions": {
-                 "connectTimeoutMS": 10000
+                 "connectTimeoutMS": 20000
                 }
             }
         }

+ 7 - 10
config/db/db_manager.js

@@ -49,16 +49,13 @@ module.exports = {
     connect:function () {
         var config = require("../config.js");
         var dbURL = 'mongodb://' + config.current.server + ":" + config.current.port + '/scConstruct';
-
-        var db = mg.connect(dbURL, config.options, function(err) {
-            if (err) {
-                console.log('Could not connect to MongoDB!');
-                console.log(err);
-            }
-        });
-        mg.connection.on('error', function(err) {
-            console.log('MongoDB connection error:', err);
+        mg.connect(dbURL, config.options);
+        var db = mg.connection;
+        db.on("error",function (err) {
+            console.log('Could not connect to MongoDB!');
+            console.log(err);
             process.exit(-1);
-        });
+        })
+        return mg;
     }
 };

+ 5 - 5
logs/log4js.json

@@ -1,5 +1,5 @@
 {
-  "customBaseDir" :"../logs/",
+  "customBaseDir" :"../logs/ConstructionCost/",
   "customDefaultAtt" :{
     "type": "dateFile",
     "alwaysIncludePattern": false,
@@ -7,10 +7,10 @@
   },
   "appenders": {
     "console": { "type": "console" },
-    "logInfo":{"filename":"info/ConstructionCost.log"},
-    "logDebug":{"filename":"debug/ConstructionCost.log"},
-    "logWarn":{"filename":"warn/ConstructionCost.log"},
-    "logErr":{"filename":"err/ConstructionCost.log"}
+    "logInfo":{"filename":"info.log"},
+    "logDebug":{"filename":"debug.log"},
+    "logWarn":{"filename":"warn.log"},
+    "logErr":{"filename":"err.log"}
   },
   "categories": {
     "default": { "appenders": ["console"], "level": "debug"},

+ 116 - 38
modules/bills_lib/controllers/bills_lib_controllers.js

@@ -2,165 +2,243 @@
  * Created by vian on 2017/3/22.
  */
 
-var billsLibDao = require("./../models/bills_lib_interfaces");
-//----
-var model = require("./../models/bills_lib_model");
-var counter = require("../../../public/counter/counter");
-var StdBillsLib = model.stdBillsLibMod;
-var Bills = model.billsMod;
-var JobContent = model.jobContentMod;
-var ItemCharacter = model.itemCharacterMod;
-//---
-//ͳһ�ص�����
-var callback = function(req, res, err, message, data){
+let billsLibDao = require("./../models/bills_lib_interfaces");
+let callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
 }
 
 module.exports = {
     getMaxNumber: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.getMaxNumber(data, function(err, message, maxNumber){
             callback(req, res, err, message, maxNumber);
         });
     },
     getABillsLib: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.getABillsLib(data, function(err, message, data){
             callback(req, res, err, message, data);
         });
     },
     getStdBillsLib: function(req, res){
-        var data = JSON.parse(req.body.data);
-        billsLibDao.getStdBillsLib(data, function(err, message, stdBillsLib){
+        billsLibDao.getStdBillsLib(function(err, message, stdBillsLib){
             callback(req, res, err, message, stdBillsLib );
         });
     },
     createStdBillsLib: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
          billsLibDao.createStdBillsLib(data, function(err, message, info){
             callback(req, res, err, message, info);
          });
     },
     deleteStdBillsLib: function(req, res){
-        var data = JSON.parse(req.body.data);
-        billsLibDao.deleteStdBillsLib(data.billsLibId, function(err, message){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.deleteStdBillsLib(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     renameStdBillsLib: function(req, res) {
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.renameStdBillsLib(data, function (err, message) {
             callback(req, res, err ,message, null);
         });
     },
     getStdBillsLibName: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.getStdBillsLibName(data.billsLibId, function(err, message, info){
             callback(req, res, err, message, info);
         });
     },
+    getCurrentUniqId: function(req, res){
+        billsLibDao.getCurrentUniqId(function(err, message, id){
+            callback(req, res, err, message, id);
+        });
+    },
     getBills: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         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);
+        let data = JSON.parse(req.body.data);
         billsLibDao.createBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
+    upMove: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.upMove(data, function(err, message){
+            callback(req, res, err, message, null);
+        });
+    },
+    downMove: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.downMove(data, function (err, message) {
+            callback(req, res, err, message, null);
+        })
+    },
+    upLevel: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.upLevel(data, function(err, message){
+            callback(req, res, err, message, null);
+        })
+    },
+    downLevel: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.downLevel(data, function (err, message) {
+            callback(req, res, err, message, null)
+        })
+    },
     updatePNId: function (req, res) {
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.updatePNId(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     updateBills: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.updateBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
+    removeTotal: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.removeTotal(data, function (err, message) {
+            callback(req, res, err, message, null);
+        })
+    },
+    updateSerialNo: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.updateSerialNo(data, function (err, message) {
+            callback(req, res, err, message, null);
+        });
+    },
     updateBillsArr: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.updateBillsArr(data, function(err, message){
            callback(req, res, err, message, null);
         });
     },
     pasteBills: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.pasteBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     updateRecharge: function(req, res){
-      var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.updateRecharge(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
+    pasteRel: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.pasteRel(data, function(err, message, datas){
+            callback(req, res, err, message, datas);
+        });
+    },
     deleteBills: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.deleteBills(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     getJobContent: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.getJobContent(data, function(err, message, jobs){
             callback(req, res, err, message, jobs);
         });
     },
     createJobContent: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.createJobContent(data, function(err, message, id){
             callback(req, res, err, message, id);
         });
     },
     updateJobContent: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.updateJobContent(data, function(err, message, id){
             callback(req, res, err, message, id);
         });
     },
     updateValue: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.updateValue(data, function(err, message){
             callback(req, res, err, message, null);
         })
     },
     deleteJobContent: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.deleteJobContent(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
+    pasteJobs: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.pasteJobs(data, function(err, message, datas){
+            callback(req, res, err, message, datas);
+        });
+    },
+    edCreateJob: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.edCreateJob(data, function(err, message, id){
+            callback(req, res, err, message, id);
+        })
+    },
+    edUpdateJob: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.edUpdateJob(data, function(err, message, id){
+            callback(req, res, err, message, id);
+        })
+    },
     getItemCharacter: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.getItemCharacter(data, function(err, message, items){
             callback(req, res, err, message, items);
         });
     },
     createItemCharacter: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.createItemCharacter(data, function(err, message, id){
             callback(req, res, err, message, id);
         });
     },
     updateItemCharacter: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.updateItemCharacter(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     deleteItemCharacter: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         billsLibDao.deleteItemCharacter(data, function(err, message){
             callback(req, res, err, message, null);
         });
+    },
+    pasteItems: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.pasteItems(data, function(err, message, datas){
+            callback(req, res, err, message, datas);
+        });
+    },
+    pasteValues: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.pasteValues(data, function(err, message, datas){
+            callback(req, res, err, message, datas);
+        });
+    },
+    edCreateItem: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.edCreateItem(data, function(err, message, id){
+            callback(req, res, err, message, id);
+        })
+    },
+    edUpdateItem: function(req, res){
+        let data = JSON.parse(req.body.data);
+        billsLibDao.edUpdateItem(data, function(err, message, id){
+            callback(req, res, err, message, id);
+        })
     }
-
 }
 

+ 59 - 0
modules/bills_lib/controllers/bills_permissionController.js

@@ -0,0 +1,59 @@
+/**标准清单操作相关
+ * Created by Zhong on 2017/8/2.
+ */
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+
+class billsPermContr extends baseController{
+    getCurrentUniqId(req, res){
+        billsController.getCurrentUniqId(req, res);
+    }
+    getBills(req, res){
+        billsController.getBills(req, res);
+    }
+    createBills(req, res){
+        billsController.createBills(req, res);
+    }
+    updatePNId(req, res){
+        billsController.updatePNId(req, res);
+    }
+    upMove(req, res){
+        billsController.upMove(req, res);
+    }
+    downMove(req, res){
+        billsController.downMove(req, res);
+    }
+    upLevel(req, res){
+        billsController.upLevel(req, res);
+    }
+    downLevel(req, res){
+        billsController.downLevel(req, res);
+    }
+    updateBills(req, res){
+        billsController.updateBills(req, res);
+    }
+    updateBillsArr(req, res){
+        billsController.updateBillsArr(req, res);
+    }
+    removeTotal(req, res){
+        billsController.removeTotal(req, res);
+    }
+    updateSerialNo(req, res){
+        billsController.updateSerialNo(req, res);
+    }
+    pasteBills(req, res){
+        billsController.pasteBills(req, res);
+    }
+    updateRecharge(req, res){
+        billsController.updateRecharge(req, res);
+    }
+    pasteRel(req, res){
+        billsController.pasteRel(req, res);
+    }
+    deleteBills(req, res){
+        billsController.deleteBills(req, res);
+    }
+
+}
+
+export default billsPermContr;

+ 39 - 0
modules/bills_lib/controllers/items_permissionController.js

@@ -0,0 +1,39 @@
+/**
+ * Created by Zhong on 2017/8/2.
+ */
+
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+
+class itemsPermContr extends baseController{
+
+    getItemCharacter(req, res){
+        billsController.getItemCharacter(req, res);
+    }
+    createItemCharacter(req, res){
+        billsController.createItemCharacter(req, res);
+    }
+    updateItemCharacter(req, res){
+        billsController.updateItemCharacter(req, res);
+    }
+    updateValue(req, res){
+        billsController.updateValue(req, res);
+    }
+    deleteItemCharacter(req, res){
+        billsController.deleteItemCharacter(req, res);
+    }
+    pasteItems(req, res){
+        billsController.pasteItems(req, res);
+    }
+    pasteValues(req, res){
+        billsController.pasteValues(req, res);
+    }
+    edCreateItem(req, res){
+        billsController.edCreateItem(req, res);
+    }
+    edUpdateItem(req, res){
+        billsController.edUpdateItem(req, res);
+    }
+}
+
+export default itemsPermContr;

+ 33 - 0
modules/bills_lib/controllers/jobs_permissionController.js

@@ -0,0 +1,33 @@
+/**
+ * Created by Zhong on 2017/8/2.
+ */
+
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+
+class jobsPermContr extends baseController{
+
+    getJobContent(req, res){
+        billsController.getJobContent(req, res);
+    }
+    createJobContent(req, res){
+        billsController.createJobContent(req, res);
+    }
+    updateJobContent(req, res){
+        billsController.updateJobContent(req, res);
+    }
+    deleteJobContent(req, res){
+        billsController.deleteJobContent(req, res);
+    }
+    pasteJobs(req, res){
+        billsController.pasteJobs(req, res);
+    }
+    edCreateJob(req, res){
+        billsController.edCreateJob(req, res);
+    }
+    edUpdateJob(req, res){
+        billsController.edUpdateJob(req, res);
+    }
+}
+
+export default jobsPermContr;

+ 56 - 0
modules/bills_lib/controllers/stdBillsLib_permissionController.js

@@ -0,0 +1,56 @@
+/**清单编辑器清单库操作相关
+ * Created by Zhong on 2017/8/2.
+ */
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+import CompilationModel from "../../users/models/compilation_model";
+
+let callback = function(req, res, err, message, data){
+    res.json({error: err, message: message, data: data});
+}
+class billsLibPermContr extends baseController{
+    async getCompilationList(req, res){
+        try{
+            let compilationModel = new CompilationModel(), rst = [];
+            let compilationList = await compilationModel.getCompilationList();
+            if(compilationList.length <= 0){
+                throw '没有数据';
+            }
+            else{
+
+                compilationList.forEach(function (compilation) {
+                    rst.push({_id: compilation._id, name: compilation.name});
+                })
+                callback(req, res, false, '', rst);
+            }
+        }
+        catch(err) {
+            callback(req, res, err, '没有数据', null);
+        }
+    }
+    getMaxNumber(req, res){
+        billsController.getMaxNumber(req, res);
+    }
+    getABillsLib(req, res){
+        billsController.getABillsLib(req, res);
+    }
+    getStdBillsLib(req, res){
+        billsController.getStdBillsLib(req, res);
+    }
+    createStdBillsLib(req, res){
+        billsController.createStdBillsLib(req, res);
+    }
+    deleteStdBillsLib(req, res){
+        billsController.deleteStdBillsLib(req, res);
+    }
+    renameStdBillsLib(req, res){
+        billsController.renameStdBillsLib(req, res);
+    }
+    getStdBillsLibName(req, res){
+        billsController.getStdBillsLibName(req, res);
+    }
+
+}
+
+export default billsLibPermContr;
+

+ 27 - 0
modules/bills_lib/controllers/views_permissionController.js

@@ -0,0 +1,27 @@
+/**
+ * 清单编辑器页面权限管理和session校验
+ * Created by Zhong on 2017/8/2.
+ */
+import baseController from "../../common/base/base_controller";
+
+class viewsPermContr extends baseController{
+    redirectStdBillsMain(req, res){
+        res.render("maintain/bills_lib/html/main.html",
+            {userAccount: req.session.managerData.username,
+                userID: req.session.managerData.userID});
+    }
+    redirectStdBills(req, res){
+        res.render("maintain/bills_lib/html/qingdan.html",
+            {userAccount: req.session.managerData.username});
+    }
+    redirectStdJobs(req, res){
+        res.render('maintain/bills_lib/html/neirong.html',
+            {userAccount: req.session.managerData.username});
+    }
+    redirectStdItems(req, res){
+        res.render('maintain/bills_lib/html/tezheng.html',
+            {userAccount: req.session.managerData.username});
+    }
+}
+
+export default viewsPermContr;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2797 - 410
modules/bills_lib/models/bills_lib_interfaces.js


+ 16 - 0
modules/bills_lib/models/bills_lib_model.js

@@ -1,6 +1,7 @@
 /**
  * Created by vian on 2017/3/17.
  */
+/*
 var dbm = require("../../../config/db/db_manager");
 var schemas = require("./bills_lib_schemas.js");
 //var db = dbm.getLocalConnection("stdBillsEditor");
@@ -15,4 +16,19 @@ module.exports = {
     billsMod: billsMod,
     jobContentMod: jobContentMod,
     itemCharacterMod: itemCharacterMod,
+}*/
+let dbm = require("../../../config/db/db_manager");
+let schemas = require("./bills_lib_schemas.js");
+let db = dbm.getCfgConnection("scConstruct");
+//let db = dbm.getLocalConnection("stdBillsEditor");
+let stdBillsLibMod = db.model("std_bills_lib_list", schemas.stdBillsLibSchema);
+let billsMod = db.model("std_bills_lib_bills", schemas.billsSchema);
+let jobContentMod = db.model("std_bills_lib_jobContent", schemas.jobContentSchema);
+let itemCharacterMod = db.model("std_bills_lib_itemCharacter", schemas.itemCharacterSchema);
+
+module.exports = {
+    stdBillsLibMod: stdBillsLibMod,
+    billsMod: billsMod,
+    jobContentMod: jobContentMod,
+    itemCharacterMod: itemCharacterMod,
 }

+ 65 - 39
modules/bills_lib/models/bills_lib_schemas.js

@@ -1,51 +1,77 @@
-var mongoose = require('mongoose');
-
-var stdBillsLibSchema =mongoose.Schema({
-    userId: Number,
-    billsLibId: Number,
-    billsLibName: String,
-    createDate: Date,
-    deleted: Boolean
-},
+let mongoose = require('mongoose');
+
+let oprSchema = mongoose.Schema({
+        operateDate: String,
+        operator: String
+    },
+    {_id: false},
+    {versionKey: false});
+
+let stdBillsLibSchema =mongoose.Schema({
+        creator: String,
+        createDate: String,
+        recentOpr: [oprSchema],
+        /* lastOperator: String,
+         lastOperateDate: Date,*/
+        billsLibId: Number,
+        billsLibName: String,
+        compilationId: String,
+        compilationName: String,
+        deleted: Boolean
+    },
     {versionKey: false}
 );
 
-var billsSchema = mongoose.Schema({
-    ID: Number,
-    ParentID: Number,
-    NextSiblingID: Number,
-    code: String,
-    name: String,
-    unit: String,
-    ruleText: String,
-    Expression: String,
-    jobs: Array,
-    items: Array,
-    recharge:String,
-    billsLibId: Number,
-    deleted: Boolean
-},
+let jobsSchema = mongoose.Schema({
+        id: Number,
+        serialNo: Number
+    },
+    {_id: false},
+    {versionKey: false});
+
+let itemsSchema = mongoose.Schema({
+        id: Number,
+        serialNo: Number
+    },
+    {_id: false},
+    {versionKey: false});
+
+let billsSchema = mongoose.Schema({
+        ID: Number,
+        ParentID: Number,
+        NextSiblingID: Number,
+        code: String,
+        name: String,
+        unit: String,
+        ruleText: String,
+        Expression: String,
+        jobs: [],
+        items: [],
+        recharge:String,
+        billsLibId: Number,
+        deleted: Boolean
+    },
     {versionKey: false}
 );
 
-var jobContentSchema = mongoose.Schema({
-    id: Number,
-    code: Number,
-    content: String,
-    billsLibId: Number,
-    deleted: Boolean
-},
+let jobContentSchema = mongoose.Schema({
+        id: Number,
+        code: Number,
+        content: String,
+        billsLibId: Number,
+        deleted: Boolean
+    },
     {versionKey: false}
 );
 
-var itemCharacterSchema = mongoose.Schema({
-    id: Number,
-    code: Number,
-    content: String,
-    itemValue: Array,
-    billsLibId: Number,
-    deleted: Boolean
-},
+let itemCharacterSchema = mongoose.Schema({
+        id: Number,
+        code: Number,
+        content: String,
+        itemValue: Array,
+        billsLibId: Number,
+        deleted: Boolean
+    },
     {versionKey: false}
 );
 

+ 63 - 29
modules/bills_lib/routes/bills_lib_routes.js

@@ -2,37 +2,71 @@
  * Created by vian on 2017/3/17.
  */
 let express = require("express");
-module.exports = function (app) {
-    let billsController = require("./../controllers/bills_lib_controllers");
-    let billsRouter =express.Router();
-
-    billsRouter.post('/getMaxNumber', billsController.getMaxNumber);
-    billsRouter.post('/getABillsLib', billsController.getABillsLib);
-    billsRouter.post("/getStdBillsLib", billsController.getStdBillsLib);
-    billsRouter.post("/createStdBillsLib", billsController.createStdBillsLib);
-    billsRouter.post("/deleteStdBillsLib", billsController.deleteStdBillsLib);
-    billsRouter.post("/renameStdBillsLib", billsController.renameStdBillsLib);
-    billsRouter.post("/getStdBillsLibName", billsController.getStdBillsLibName);
-    billsRouter.post("/getBills", billsController.getBills);
-    billsRouter.post("/createBills", billsController.createBills);
-    billsRouter.post("/updatePNId", billsController.updatePNId);
-    billsRouter.post("/updateBills", billsController.updateBills);
-    billsRouter.post("/updateBillsArr", billsController.updateBillsArr);
-    billsRouter.post("/pasteBills", billsController.pasteBills);
-    billsRouter.post('/updateRecharge', billsController.updateRecharge);
-    billsRouter.post("/deleteBills", billsController.deleteBills);
-    billsRouter.post("/getJobContent", billsController.getJobContent);
-    billsRouter.post("/createJobContent", billsController.createJobContent);
-    billsRouter.post("/updateJobContent", billsController.updateJobContent);
-    billsRouter.post("/deleteJobContent", billsController.deleteJobContent);
-    billsRouter.post("/getItemCharacter", billsController.getItemCharacter);
-    billsRouter.post("/createItemCharacter", billsController.createItemCharacter);
-    billsRouter.post("/updateItemCharacter", billsController.updateItemCharacter);
-    billsRouter.post("/updateValue", billsController.updateValue);
-    billsRouter.post("/deleteItemCharacter", billsController.deleteItemCharacter);
+let billsRouter =express.Router();
+import ViewsPermContr from "../controllers/views_permissionController";
+import BillsLibPermContr from "../controllers/stdBillsLib_permissionController";
+import BillsPermContr from "../controllers/bills_permissionController";
+import JobsPermContr from "../controllers/jobs_permissionController";
+import ItemsPermContr from "../controllers/items_permissionController";
+let viewsContr = new ViewsPermContr();
+let billsLibContr = new BillsLibPermContr();
+let billsContr = new BillsPermContr();
+let jobsContr = new JobsPermContr();
+let itemsContr = new ItemsPermContr();
+
+
+module.exports =function (app) {
+    app.get("/stdBillsmain", viewsContr.init, viewsContr.redirectStdBillsMain);
+    app.get("/stdBills", viewsContr.init, viewsContr.redirectStdBills);
+    app.get('/stdJobs', viewsContr.init, viewsContr.redirectStdJobs);
+    app.get('/stdItems', viewsContr.init, viewsContr.redirectStdItems);
+
+    billsRouter.post('/getCompilationList', billsLibContr.init, billsLibContr.getCompilationList);
+    billsRouter.post('/getMaxNumber', billsLibContr.init, billsLibContr.getMaxNumber);
+    billsRouter.post('/getABillsLib', billsLibContr.init, billsLibContr.getABillsLib);
+    billsRouter.post("/getStdBillsLib", billsLibContr.init, billsLibContr.getStdBillsLib);
+    billsRouter.post("/createStdBillsLib", billsLibContr.init, billsLibContr.createStdBillsLib);
+    billsRouter.post("/deleteStdBillsLib", billsLibContr.init, billsLibContr.deleteStdBillsLib);
+    billsRouter.post("/renameStdBillsLib", billsLibContr.init, billsLibContr.renameStdBillsLib);
+    billsRouter.post("/getStdBillsLibName", billsLibContr.init, billsLibContr.getStdBillsLibName);
+
+    billsRouter.post("/upMove",  billsContr.init, billsContr.upMove);
+    billsRouter.post("/downMove",  billsContr.init, billsContr.downMove);
+    billsRouter.post("/getCurrentUniqId", billsContr.init, billsContr.getCurrentUniqId);
+    billsRouter.post("/getBills",billsContr.init, billsContr.getBills);
+    billsRouter.post("/createBills", billsContr.init, billsContr.createBills);
+    billsRouter.post("/updatePNId", billsContr.init, billsContr.updatePNId);
+    billsRouter.post("/upLevel", billsContr.init, billsContr.upLevel);
+    billsRouter.post("/downLevel", billsContr.init, billsContr.downLevel);
+    billsRouter.post("/updateBills", billsContr.init, billsContr.updateBills);
+    billsRouter.post("/updateBillsArr", billsContr.init, billsContr.updateBillsArr);
+    billsRouter.post("/removeTotal", billsContr.init, billsContr.removeTotal);
+    billsRouter.post("/updateSerialNo", billsContr.init, billsContr.updateSerialNo);
+    billsRouter.post("/pasteBills", billsContr.init, billsContr.pasteBills);
+    billsRouter.post('/updateRecharge', billsContr.init, billsContr.updateRecharge);
+    billsRouter.post('/pasteRel', billsContr.init, billsContr.pasteRel);
+    billsRouter.post("/deleteBills", billsContr.init, billsContr.deleteBills);
+
+    billsRouter.post("/getJobContent", jobsContr.init, jobsContr.getJobContent);
+    billsRouter.post("/createJobContent", jobsContr.init, jobsContr.createJobContent);
+    billsRouter.post("/updateJobContent", jobsContr.init, jobsContr.updateJobContent);
+    billsRouter.post("/deleteJobContent", jobsContr.init, jobsContr.deleteJobContent);
+    billsRouter.post("/pasteJobs", jobsContr.init, jobsContr.pasteJobs);
+    billsRouter.post("/edCreateJob", jobsContr.init, jobsContr.edCreateJob);
+    billsRouter.post("/edUpdateJob", jobsContr.init, jobsContr.edUpdateJob);
+
+    billsRouter.post("/getItemCharacter", itemsContr.init, itemsContr.getItemCharacter);
+    billsRouter.post("/createItemCharacter", itemsContr.init, itemsContr.createItemCharacter);
+    billsRouter.post("/updateItemCharacter", itemsContr.init, itemsContr.updateItemCharacter);
+    billsRouter.post("/updateValue", itemsContr.init, itemsContr.updateValue);
+    billsRouter.post("/deleteItemCharacter", itemsContr.init, itemsContr.deleteItemCharacter);
+    billsRouter.post("/pasteItems", itemsContr.init, itemsContr.pasteItems);
+    billsRouter.post("/pasteValues", itemsContr.init, itemsContr.pasteValues);
+    billsRouter.post("/edCreateItem", itemsContr.init, itemsContr.edCreateItem);
+    billsRouter.post("/edUpdateItem", itemsContr.init, itemsContr.edUpdateItem);
 
     app.use("/stdBillsEditor", billsRouter);
-};
 
+}
 
 

+ 21 - 0
modules/common/helper/mongoose_helper.js

@@ -5,6 +5,8 @@
  * @date 2017/5/22.
  */
 
+import mongoose from "mongoose";
+
 class MongooseHelper {
 
     /**
@@ -31,6 +33,7 @@ class MongooseHelper {
     findOne(conditions, fields = null) {
         let self = this;
         return new Promise(function (resolve, reject) {
+            conditions = self._convertId(conditions);
             self.model.findOne(conditions, fields, function (error, data) {
                 if (error) {
                     reject(null);
@@ -177,6 +180,7 @@ class MongooseHelper {
     update(condition, updateData) {
         let self = this;
         return new Promise(function(resolve, reject) {
+            condition = self._convertId(condition);
             self.model.update(condition, {$set: updateData}, function(error, data) {
                 if (error) {
                     reject(error);
@@ -187,6 +191,23 @@ class MongooseHelper {
         });
     }
 
+    /**
+     * id转换为objectId
+     *
+     * @param {object} condition
+     * @return {object}
+     */
+    _convertId(condition) {
+        // 对于ID的处理
+        if (condition === null || condition._id === undefined) {
+            return condition;
+        }
+        let result = mongoose.Types.ObjectId(condition._id);
+        condition._id = result;
+
+        return condition;
+    }
+
 }
 
 export default MongooseHelper;

+ 1 - 1
modules/common/std/schemas/std_ration_lib_glj_list.js

@@ -7,7 +7,7 @@
  */
 import mongoose from "mongoose";
 
-let collectionName = 'std_ration_lib_glj_list';
+let collectionName = 'std_glj_lib_gljList';
 // 因为别处已初始化过,所以直接使用
 let model = mongoose.model(collectionName);
 export {model as default, collectionName as collectionName};

+ 1 - 1
modules/glj/models/unit_price_model.js

@@ -63,7 +63,7 @@ class UnitPriceModel extends BaseModel {
                 this.model.schema.path('market_price').required(true);
                 this.model.schema.path('name').required(true);
                 this.model.schema.path('code').required(true);
-                this.model.schema.path('unit').required(true);
+                // this.model.schema.path('unit').required(true);
                 this.model.schema.path('type').required(true);
                 this.model.schema.path('unit_price_file_id').required(true);
         }

+ 2 - 1
modules/main/controllers/project_controller.js

@@ -2,7 +2,7 @@
  * Created by jimiz on 2017/4/16.
  */
 var Project = require('../models/project');
-
+let logger = require('../../../logs/log_helper').logger;
 //统一回调函数
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
@@ -13,6 +13,7 @@ module.exports = {
         var data = JSON.parse(req.body.data);
         Project.save(data, function (err, message, result) {
             if (err) {
+                logger.err(err);
                 callback(req, res, err, message, null);
             } else {
                 callback(req, res, err, message, result);

+ 30 - 5
modules/pm/controllers/pm_controller.js

@@ -45,9 +45,9 @@ module.exports = {
             }
         });
     },
-    updateProjects: function (req, res) {
+    updateProjects: async function (req, res) {
         let data = JSON.parse(req.body.data);
-        ProjectsData.updateUserProjects(req.session.sessionUser.ssoId, data.updateData, function (err, message, data) {
+        await ProjectsData.updateUserProjects(req.session.sessionUser.ssoId, data.updateData, function (err, message, data) {
             if (err === 0) {
                 callback(req, res, err, message, data);
             } else {
@@ -73,9 +73,14 @@ module.exports = {
     },
     getProject: function(req, res){
         let data = JSON.parse(req.body.data);
-        ProjectsData.getUserProject(req.session.sessionUser.ssoId, data.proj_id, function(err, message, data){
+        ProjectsData.getUserProject(req.session.sessionUser.ssoId, data.proj_id, async function(err, message, data){
             if (err === 0) {
-                callback(req, res, err, message, data);
+                let engineeringLibModel = new EngineeringLibModel();
+                let engineeringInfo = await engineeringLibModel.getEngineering(data.property.engineering_id);
+                let strData = JSON.stringify(data);
+                let projInfo = JSON.parse(strData);
+                projInfo.engineeringInfo = engineeringInfo;
+                callback(req, res, err, message, projInfo);
             } else {
                 callback(req, res, err, message, null);
             }
@@ -122,5 +127,25 @@ module.exports = {
         };
 
         response.render('building_saas/pm/html/project-management.html', renderData);
+    },
+    // 获取项目的属性
+    getProjectProperty: async function(request, response) {
+        let data = request.body.data;
+        try {
+            data = JSON.parse(data);
+            let id = data.id !== undefined ? data.id : 0;
+            if (isNaN(id) && id <= 0) {
+                throw 'id数据有误!';
+            }
+            let property = await ProjectsData.getProjectProperty(id);
+
+            if (Object.keys(property).length <= 0) {
+                throw '操作失败';
+            }
+            callback(request, response, 0, '', property);
+        } catch (error) {
+            callback(request, response, 1, error, null);
+        }
+
     }
-}
+};

+ 38 - 3
modules/pm/models/project_model.js

@@ -1,6 +1,7 @@
 /**
  * Created by Mai on 2017/1/18.
  */
+import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
 let counter = require("../../../public/counter/counter.js");
 
 let newProjController = require('../controllers/new_proj_controller');
@@ -36,7 +37,7 @@ ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
     });
 }
 
-ProjectsDAO.prototype.updateUserProjects = function(userId, datas, callback){
+ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callback){
     let data, project, updateLength = 0, hasError = false, deleteInfo = null, i, newProject;
     let updateAll = function (err) {
             if (!err){
@@ -53,15 +54,34 @@ ProjectsDAO.prototype.updateUserProjects = function(userId, datas, callback){
     if (datas){
         for (i = 0; i < datas.length && !hasError; i++){
             data = datas[i];
+            data.updateData.name = data.updateData.name !== undefined ? data.updateData.name.trim() : null;
             if (data.updateType === 'update') {
                 Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll)
             } else if (data.updateType === 'new') {
                 data.updateData['userID'] = userId;
                 data.updateData['createDateTime'] = new Date();
                 newProject = new Projects(data.updateData);
-                newProject.save(function (err, result) {
+                // 查找同级是否存在同名数据
+                let exist = await this.isExist(data.updateData.name, data.updateData.ParentID);
+                if (exist) {
+                    callback(1, '同级目录已存在相同名称数据.', null);
+                    return;
+                }
+
+                newProject.save(async function (err, result) {
                     if (!err && result._doc.projType === projectType.tender) {
                         newProjController.copyTemplateData(data.updateData.property, newProject.ID, updateAll);
+                        // 新增单价文件
+                        let unitPriceFileModel = new UnitPriceFileModel();
+                        let insertData = {
+                            name: data.updateData.name,
+                            project_id: data.updateData.ID
+                        };
+                        let addResult = await unitPriceFileModel.add(insertData);
+                        if (!addResult) {
+                            callback(1, '新增单价文件失败.', null);
+                            return;
+                        }
                     } else {
                         updateAll(err);
                     }
@@ -93,7 +113,6 @@ ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
             callback(1, '提交数据出错.', null);
         }
     };
-    console.log(datas);
     if (datas) {
         for (i = 0; i < datas.length && !hasError; i++) {
             data = datas[i];
@@ -165,6 +184,22 @@ ProjectsDAO.prototype.getProject = function (key, callback) {
     }
 };
 
+/**
+ * 整理工程专业对应标准库数据
+ *
+ * @param {Object} data
+ * @return {Boolean}
+ */
+ProjectsDAO.prototype.isExist = async function(name, parentID) {
+    parentID = parseInt(parentID);
+    if (name === '' || isNaN(parentID)) {
+        return true;
+    }
+    let count = await Projects.count({ParentID: parentID, name: name});
+
+    return count > 0;
+};
+
 module.exports ={
     project: new ProjectsDAO(),
     projType: projectType

+ 28 - 17
modules/ration_glj/facade/ration_glj_facade.js

@@ -9,8 +9,7 @@ let commonConsts = consts.commonConst;
 let _=require("lodash");
 let ration_glj = mongoose.model('ration_glj');
 import GLJListModel from '../../glj/models/glj_list_model';
-//let std_ration_lib_glj_list_model = require('../../ration_repository/models/glj_repository');
-let std_ration_lib_glj_list_model = mongoose.model('std_ration_lib_glj_list');
+let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');
 let async_n = require("async");
 let ration = mongoose.model('ration');
 let ration_coe_facade = require('./ration_coe_facade');
@@ -18,7 +17,7 @@ let ration_coe = mongoose.model('ration_coe');
 let std_ration_lib_ration_items = mongoose.model('std_ration_lib_ration_items');
 let glj_calculate_facade = require('./glj_calculate_facade');
 let quantity_detail_facade = require('./quantity_detail_facade');
-
+let logger = require("../../../logs/log_helper").logger;
 
 
 module.exports={
@@ -85,8 +84,8 @@ function combineQuantity(results) {
 
 function get_lib_glj_info(ration_glj) {
     return function (cb) {
-        std_ration_lib_glj_list_model.findOne({'ID':ration_glj.GLJID,'repositoryId':ration_glj.glj_repository_id},(err,glj)=>{
-            if(err){
+        std_glj_lib_gljList_model.findOne({'ID':ration_glj.GLJID},(err,glj)=>{
+                if(err){
                 cb(err,'')
             }else if(glj){
                 ration_glj.name = glj.name;
@@ -133,7 +132,7 @@ async function getInfoFromProjectGLJ(ration_glj) {
          ration_glj.isEstimate=result.is_evaluate;
          return ration_glj;
      } catch (err) {
-         console.log(err);
+         logger.err(err);
          return null;
      }
 
@@ -151,18 +150,30 @@ function create_ration_glj(user_id,datas) {
             if(err){
                 callback(err,results)
             }else {
-                ration_glj.insertMany(results,(err,doc)=>{
-                    if(err){
-                        callback(err,null);
-                    }else {
-                        let returndata ={
-                            updateTpye:commonConsts.UT_CREATE,
-                            moduleName:'ration_glj',
-                            data:results
-                        }
-                        callback(null,returndata)
+                let newRecords =[];
+                for (let r of results){
+                    if(r){
+                        newRecords.push(r)
                     }
-                });
+                }
+                if(newRecords.length>0){
+                    ration_glj.insertMany(newRecords,(err,doc)=>{
+                        if(err){
+                            callback(err,null);
+                        }else {
+                            let returndata ={
+                                updateTpye:commonConsts.UT_CREATE,
+                                moduleName:'ration_glj',
+                                data:newRecords
+                            }
+                            callback(null,returndata)
+                        }
+                    });
+                }else {
+                    logger.info("can't find gljs")
+                    callback(null,null)
+                }
+
             }
         })
     }

+ 15 - 14
modules/ration_glj/models/ration_glj_temp.js

@@ -22,21 +22,22 @@ var rationAssItemSchema = mongoose.Schema({
 }, { _id: false });
 
 
-var gljSchema =new Schema({
-    repositoryId: Number,
-    ID:Number,
-    //以下是基于已有access库
-    code: String,
-    name: String,
-    specs: String,
-    unit: String,
-    basePrice: Number,
-    gljType: Number, //这个是UI显示上的详细分类,对应gljTypeSchema
-    shortName: String,  //人工,材料,机械
-    gljClass:Number
-},{versionKey:false});
+/*var gljSchema =new Schema({
+ repositoryId: Number,
+ ID:Number,
+ //以下是基于已有access库
+ code: String,
+ name: String,
+ specs: String,
+ unit: String,
+ basePrice: Number,
+ gljType: Number, //这个是UI显示上的详细分类,对应gljTypeSchema
+ shortName: String,  //人工,材料,机械
+ gljClass:Number
+ },{versionKey:false});
+
+ mongoose.model("std_ration_lib_glj_list",gljSchema,"std_ration_lib_glj_list");*/
 
-mongoose.model("std_ration_lib_glj_list",gljSchema,"std_ration_lib_glj_list");
 
 let rationSchema = new Schema({
     ID: Number,

+ 1 - 1
modules/ration_repository/models/glj_repository.js

@@ -32,7 +32,7 @@ var gljSchema = mongoose.Schema({
     gljClass:Number
 });
 var gljTypeModel = db.model("std_ration_lib_glj_type",gljTypeSchema, "std_ration_lib_glj_type");
-var gljItemModel = mongoose.model("std_ration_lib_glj_list");
+var gljItemModel = mongoose.model("std_glj_lib_gljList");
 var repositoryMap = require('./repository_map');
 var counter = require('../../../public/counter/counter');
 

+ 8 - 1
modules/users/models/engineering_lib_model.js

@@ -90,7 +90,14 @@ class EngineeringLibModel extends BaseModel {
             }
         }
         return valuationData;
-    }
+    };
+
+    async getEngineering(engineering_id) {
+        let condition = {_id: engineering_id};
+        let engineering = await this.findDataByCondition(condition);
+
+        return engineering;
+    };
 
 }
 

+ 2 - 1
public/calc_util.js

@@ -377,4 +377,5 @@ class Calculation {
     }
 };
 
-export default analyzer;
+/*
+export default analyzer;*/

+ 2 - 2
public/web/sheet/sheet_common.js

@@ -9,7 +9,7 @@ var sheetCommonObj = {
         var me = this;
         var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: SheetCount });
         spreadBook.options.tabStripVisible = false;
-        spreadBook.options.showHorizontalScrollbar = false;
+         spreadBook.options.showHorizontalScrollbar = true;
         spreadBook.options.allowCopyPasteExcelStyle = false;
         spreadBook.options.allowUserDragDrop = true;
         return spreadBook;
@@ -35,7 +35,7 @@ var sheetCommonObj = {
         var me = this;
         var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: 1 });
         spreadBook.options.tabStripVisible = false;
-        spreadBook.options.showHorizontalScrollbar = false;
+        spreadBook.options.showHorizontalScrollbar = true;
         var spreadNS = GC.Spread.Sheets;
         var sheet = spreadBook.getSheet(0);
         sheet.suspendPaint();

+ 3 - 0
public/web/sheet/sheet_data_helper.js

@@ -41,6 +41,9 @@ var SheetDataHelper = {
         return spread;
     },
     loadSheetHeader: function (setting, sheet) {
+        if (setting.frozenCols) {
+            sheet.frozenColumnCount(setting.frozenCols);
+        }
         sheet.setColumnCount(setting.cols.length);
         sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
         setting.headRowHeight.forEach(function (rowHeight, index) {

+ 3 - 0
public/web/tree_sheet/tree_sheet_helper.js

@@ -27,6 +27,9 @@ var TREE_SHEET_HELPER = {
         return style;
     },
     loadSheetHeader: function (setting, sheet) {
+        if (setting.frozenCols) {
+            sheet.frozenColumnCount(setting.frozenCols);
+        }
         sheet.setColumnCount(setting.cols.length);
         sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
         setting.headRowHeight.forEach(function (rowHeight, index) {

+ 1 - 0
server.js

@@ -14,6 +14,7 @@ let fs = require('fs');
 
 let URL = require('url');
 
+
 dbm.connect();
 //这里现在只引入了定额工料机里的models,当其它模块的models修改后使用:./modules/**/models/*.js引入所有的模块
 fileUtils.getGlobbedFiles('./modules/ration_glj/models/*.js').forEach(function(modelPath) {

+ 8 - 5
test/tmp_data/bills_grid_setting.js

@@ -4,6 +4,7 @@
 var BillsGridSetting ={
     "emptyRows":3,
     "headRows":1,
+    "frozenCols": 4,
     "treeCol": 0,
     "headRowHeight":[
         47
@@ -137,7 +138,7 @@ var BillsGridSetting ={
         },
         {
             "width":180,
-            "readOnly":'readOnly.volumePrice',
+            "readOnly": true,
             "head":{
                 "titleNames":[
                     "项目特征"
@@ -162,12 +163,13 @@ var BillsGridSetting ={
                 "field":"itemCharacterText",
                 "vAlign":1,
                 "hAlign":0,
-                "font":"Arial"
+                "font":"Arial",
+                "wordWrap": true
             }
         },
         {
-            "width":80,
-            "readOnly":'readOnly.volumePrice',
+            "width":180,
+            "readOnly": true,
             "head":{
                 "titleNames":[
                     "工作内容"
@@ -192,7 +194,8 @@ var BillsGridSetting ={
                 "field":"jobContentText",
                 "vAlign":1,
                 "hAlign":0,
-                "font":"Arial"
+                "font":"Arial",
+                "wordWrap": true
             }
         },
         {

+ 1 - 1
web/building_saas/css/main.css

@@ -234,7 +234,7 @@ body {
     }
 }
 .bottom-content .tab-content .main-data-bottom{
-    height: 400px;
+    height: 200px;
     overflow: auto;
 }
 .bottom-content .tab-content .ovf-hidden{

+ 6 - 14
web/building_saas/main/html/main.html

@@ -16,8 +16,6 @@
     <link rel="stylesheet" href="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css">
     <!-- jquery.contextmenu -->
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
-
-
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
     <script>
@@ -64,7 +62,7 @@
                     <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench"></i> 工具</a>
                     <div class="dropdown-menu">
                         <a class="dropdown-item" href="#">定额库编辑器</a>
-                        <a class="dropdown-item" href="#">工料机库编辑器</a>
+                        <a class="dropdown-item" href="/complementaryGlj">工料机库编辑器</a>
                     </div>
                 </li>
                 <li class="nav-item dropdown">
@@ -159,20 +157,14 @@
                                   </li>
                               </ul>
                               <!-- Tab panes -->
-                              <div class="tab-content">
+                              <div class="tab-content" id="tabCon">
                                   <div class="tab-pane active" id="gl" role="tabpanel">
-                                      <div class="main-data-bottom ovf-hidden" id="subSpread">
+                                      <div class="main-data-bottom ovf-hidden" id="subSpread" style="display: none">
                                       </div>
-                                      <div id="tzjnrCon" class="row" style="display: none">
-                                          <div class="col-6">
-                                              <div class="row">
-                                                  <div class="main-data-bottom ovf-hidden col-5" id="jobSpread">
-                                                  </div>
-                                                  <div class="main-data-bottom ovf-hidden col-7" id="itemSpread">
-                                                  </div>
-                                              </div>
+                                      <div id="tzjnrCon" class="main-data-bottom">
+                                          <div class="main-data-bottom ovf-hidden" style="width: 40%; float: left;" id="jobSpread">
                                           </div>
-                                          <div class="col-6">
+                                          <div class="main-data-bottom ovf-hidden" style="width: 60%; float: left;" id="itemSpread">
                                           </div>
                                       </div>
                                   </div>

+ 6 - 0
web/building_saas/main/js/models/bills.js

@@ -149,6 +149,12 @@ var Bills = {
                     data.data.code = stdBillsData.code;
                     data.data.name = stdBillsData.name;
                     data.data.unit = stdBillsData.unit;
+                    //zhong 特征及内容
+                    data.data.jobContent = stdBillsData.jobContent;
+                    data.data.itemCharacter = stdBillsData.itemCharacter;
+                    data.data.jobContentText = stdBillsData.jobContentText;
+                    data.data.itemCharacterText = stdBillsData.itemCharacterText;
+                    //zhong
                     newData = data.data;
                 }
             });

+ 84 - 28
web/building_saas/main/js/views/character_content_view.js

@@ -28,6 +28,15 @@ let contentOprObj = {
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
     },
+    //将从清单库中添加的清单,把标准清单的工作内容转化成清单的工作内容
+    buildJobContent: function (jobs) {
+        let jobContent = [];
+        for(let i = 0, len = jobs.length; i < len; i++){
+            let newJob = {serialNo: i + 1, content: jobs[i].content, isChecked: true};//从清单库添加过来的默认输出
+            jobContent.push(newJob);
+        }
+        return jobContent;
+    },
     //显示在jobSpread的数据
     showContentData: function (sheet, setting, datas) {
         sheetCommonObj.showData(sheet, setting, datas);
@@ -192,15 +201,10 @@ let contentOprObj = {
             selector: '#jobSpread',
             build: function($triggerElement, e){
                 //控制允许右键菜单在哪个位置出现
-                let clientX = e.originalEvent.clientX,
-                 clientY = e.originalEvent.clientY;
-                 let sheet = me.workBook.getSheet(0);
-                 let offset = $("#jobSpread").offset(),
-                 x = clientX - offset.left,
-                 y = clientY - offset.top;
-                 let target = sheet.hitTest(x, y);
+                let target = SheetDataHelper.safeRightClickSelection($triggerElement, e, me.workBook);
+                let sheet = me.workBook.getSheet(0);
                 if(target.hitTestType === 3){//在表格内&& typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    let insertDis = false, delDis = false, upDis = false, downDis = false;
+                    let insertDis = pageCCOprObj.isBillsType() ? false : true, delDis = false, upDis = false, downDis = false;
                     if(typeof target.row !== 'undefined'){
                         //控制按钮是否可用
                         sheet.setActiveCell(target.row, target.col);
@@ -210,11 +214,18 @@ let contentOprObj = {
                             upDis = true;
                         }
                         else{//有数据
-                            if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                            if(typeof target.col === 'undefined'){//定位不在表格内
                                 downDis = true;
-                            }
-                            if(target.row === 0){//定位在第一行,不可上移
                                 upDis = true;
+                                delDis = true;
+                            }
+                            else{//定位在表格内
+                                if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                                    downDis = true;
+                                }
+                                if(target.row === 0){//定位在第一行,不可上移
+                                    upDis = true;
+                                }
                             }
                         }
                     }
@@ -226,7 +237,7 @@ let contentOprObj = {
                     return {
                         callback: function(){},
                         items: {
-                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
+                            "insert": {name: "添加", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
                                 //插入空行
                                 me.addRow(sheet);
                             }},
@@ -279,6 +290,20 @@ let characterOprObj = {
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
     },
+    //将从清单库中添加的清单,把标准清单的项目特征转化成清单的项目特征
+    buildItemCharactet: function (items) {//从清单库过来的默认不输出
+        let itemCharacter = [];
+        for(let i = 0, len = items.length; i < len; i++){
+            let newItem = {serialNo: i + 1, character: items[i].content, eigenvalue: [], isChecked: false};
+            let eigenvalues = items[i].itemValue;
+            for(let j = 0, len = eigenvalues.length; j < len; j++){
+                let newValue = {value: eigenvalues[j].value, isSelected: false};
+                newItem.eigenvalue.push(newValue);
+            }
+            itemCharacter.push(newItem);
+        }
+        return itemCharacter;
+    },
     //显示在itemSpread的数据
     showCharacterData: function (sheet, setting, datas) {
         let me = characterOprObj;
@@ -410,6 +435,7 @@ let characterOprObj = {
         let me = characterOprObj;
         me.unsetSelected(item);
         me.setSelected(item, value);
+
     },
     insertValue: function (item, value) {
         let me = characterOprObj;
@@ -430,14 +456,16 @@ let characterOprObj = {
                     break;
                 }
             }
-            //不存在,新增进eigenvalue
+            //不存在,新增进eigenvalue,自动打勾输出
             if(!isExist){
                 //更新selected
                 me.insertValue(item, value);
+                item.isChecked = true;
             }
-            //存在,选择特征值
+            //存在,选择特征值,自动打勾输出
             else{
                 me.changeSelected(item, value);
+                item.isChecked = true;
             }
         }
     },
@@ -453,9 +481,9 @@ let characterOprObj = {
             let newCharacter = {character: '', eigenvalue: [newValue], isChecked: false, serialNo: preObj? preObj.serialNo + 1 : 1};
             me.currentCache.push(newCharacter);
         }
-        else if(character && value){
+        else if(character && value){//有了特征值自动打勾输出
             let newValue = {value: value, isSelected: true};
-            let newCharacter = {character:character , eigenvalue: [newValue], isChecked: false, serialNo: preObj? preObj.serialNo + 1 : 1};
+            let newCharacter = {character:character , eigenvalue: [newValue], isChecked: true, serialNo: preObj? preObj.serialNo + 1 : 1};
             me.currentCache.push(newCharacter);
         }
     },
@@ -535,7 +563,6 @@ let characterOprObj = {
         }
         let isChecked = args.sheet.getValue(args.row, args.col);
         if(me.currentCache.length > args.row){
-            me.refreshColData = true;
             me.currentCache[args.row].isChecked = isChecked;
             me.save();
         }
@@ -550,15 +577,10 @@ let characterOprObj = {
             selector: '#itemSpread',
             build: function($triggerElement, e){
                 //控制允许右键菜单在哪个位置出现
-                let clientX = e.originalEvent.clientX,
-                    clientY = e.originalEvent.clientY;
+                let target = SheetDataHelper.safeRightClickSelection($triggerElement, e, me.workBook);
                 let sheet = me.workBook.getSheet(0);
-                let offset = $("#itemSpread").offset(),
-                    x = clientX - offset.left,
-                    y = clientY - offset.top;
-                let target = sheet.hitTest(x, y);
                 if(target.hitTestType === 3){//在表格内 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
-                    let insertDis = false, delDis = false, upDis = false, downDis = false;
+                    let insertDis = pageCCOprObj.isBillsType() ? false : true, delDis = false, upDis = false, downDis = false;
                     if(typeof target.row !== 'undefined'){
                         //控制按钮是否可用
                         sheet.setActiveCell(target.row, target.col);
@@ -568,11 +590,18 @@ let characterOprObj = {
                             upDis = true;
                         }
                         else{//有数据
-                            if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                            if(typeof target.col === 'undefined'){//定位在表格外
                                 downDis = true;
-                            }
-                            if(target.row === 0){//定位在第一行,不可上移
                                 upDis = true;
+                                delDis = true;
+                            }
+                            else{
+                                if(target.row === me.currentCache.length -1){//定位在最后一行,不可下移
+                                    downDis = true;
+                                }
+                                if(target.row === 0){//定位在第一行,不可上移
+                                    upDis = true;
+                                }
                             }
                         }
                     }
@@ -584,7 +613,7 @@ let characterOprObj = {
                     return {
                         callback: function(){},
                         items: {
-                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
+                            "insert": {name: "添加", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
                                 me.addRow(sheet);
                             }},
                             "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
@@ -610,6 +639,30 @@ let characterOprObj = {
 let pageCCOprObj = {
     currentFindSet: null,
     mainActiveCell: null,//mainSpread焦点单元格
+    //获得造价书当前焦点行的类型:清单、定额
+    isBillsType: function () {
+        let rst = false;
+        let selectedNode = projectObj.mainController.tree.selected;
+        if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){//为清单
+            rst = true
+        }
+        return rst;
+
+    },
+    setItemContentNode: function (node, jobs, items) {
+        let theCont = contentOprObj, theCha = characterOprObj,
+            jobContent, itemCharacter, contentTxt, characterTxt;
+        jobContent = theCont.buildJobContent(jobs);
+        itemCharacter = theCha.buildItemCharactet(items);
+        contentTxt = theCont.getColData(jobContent);
+        characterTxt = theCha.getColData(itemCharacter);
+        node.data.jobContent = jobContent;
+        node.data.itemCharacter = itemCharacter;
+        node.data.jobContentText = contentTxt ? contentTxt : '';
+        node.data.itemCharacterText = characterTxt ? characterTxt : '';
+
+
+    },
     //设置特征及内容currentCache
     setCacheAndShow: function (node) {
         let theCont = contentOprObj, theCha = characterOprObj;
@@ -661,6 +714,8 @@ let pageCCOprObj = {
     },
     clearData: function () {
         let theCon = contentOprObj, theCha = characterOprObj;
+        theCon.workBook.getSheet(0).setRowCount(0);
+        theCha.workBook.getSheet(0).setRowCount(0);
         sheetCommonObj.cleanSheet(theCon.workBook.getSheet(0), theCon.setting, -1);
         sheetCommonObj.cleanSheet(theCha.workBook.getSheet(0), theCha.setting, -1);
     },
@@ -687,6 +742,7 @@ let pageCCOprObj = {
                     me.showData(oprObj.workBook.getSheet(0), oprObj.setting, oprObj.currentCache);//刷新特征及内容Spread
                     if(updateCol){
                         projectObj.mainSpread.getActiveSheet().setValue(me.mainActiveCell.row, updateCol, txtObj.text + ''); //刷新输出显示
+                        projectObj.mainSpread.getActiveSheet().autoFitRow(me.mainActiveCell.row);
                     }
                 }
             }

+ 16 - 13
web/building_saas/main/js/views/std_bills_lib.js

@@ -34,17 +34,17 @@ var billsLibObj = {
         }
     },
     loadStdBillsLib: function () {
-        CommonAjax.post('/stdBillsEditor/getStdBillsLib', {userId: userID}, function (datas) {
-            var i, select = $('#stdBillsLibSelect');
-            select.empty();
-            datas.forEach(function (data) {
-                var option = $('<option>').val(data.billsLibId).text(data.billsLibName);
-                select.append(option);
-            });
-            if (select.children.length !== 0) {
-                billsLibObj.loadStdBills(select.val());
-            }
+        let i, select = $('#stdBillsLibSelect');
+        select.empty();
+
+        let bills_lib = projectInfoObj.projectInfo.engineeringInfo.bill_lib;
+        bills_lib.forEach(function (data) {
+            var option = $('<option>').val(data.id).text(data.name);
+            select.append(option);
         });
+        if (select.children.length !== 0) {
+            billsLibObj.loadStdBills(select.val());
+        }
     },
     loadStdBills: function (stdBillsLibID) {
         var that = this;
@@ -54,7 +54,7 @@ var billsLibObj = {
         var findData = function (value, field, Array) {
             var i = 0;
             for (i = 0; i < Array.length - 1; i++) {
-                if (value === Array[i][field]) {
+                if (value[field] === Array[i][field]) {
                     return Array[i];
                 }
             }
@@ -63,7 +63,7 @@ var billsLibObj = {
         var getBillsJobs = function (node) {
             var jobs = [], i, jobData = null;
             if (stdBillsJobData && node && node.data.jobs) {
-                for (i = 0; i < node.data.jobs.length - 1; i++) {
+                for (i = 0; i < node.data.jobs.length; i++) {
                     jobData = findData(node.data.jobs[i], 'id', stdBillsJobData);
                     if (jobData) {
                         jobs.push(jobData);
@@ -75,7 +75,7 @@ var billsLibObj = {
         var getBillsFeatures = function (node) {
             var features = [], i, featureData = null;
             if (stdBillsFeatureData && node && node.data.items) {
-                for (i = 0; i < node.data.items.length - 1; i++) {
+                for (i = 0; i < node.data.items.length; i++) {
                     featureData = findData(node.data.items[i], 'id', stdBillsFeatureData);
                     if (featureData) {
                         features.push(featureData);
@@ -131,6 +131,8 @@ var billsLibObj = {
             stdBillsTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, showBillsRela);
             that.stdBillsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (sender, args) {
                 if (stdBillsTree.items[args.row].children.length === 0) {
+                    //特征及内容转化
+                    pageCCOprObj.setItemContentNode(stdBillsTree.items[args.row], getBillsJobs(stdBillsTree.items[args.row]), getBillsFeatures(stdBillsTree.items[args.row]));
                     ProjectController.addBills(projectObj.project, projectObj.mainController, stdBillsTree.items[args.row]);
                 }
             });
@@ -304,6 +306,7 @@ var billsLibObj = {
 };
 
 $('#stdBillsTab').bind('click', function () {
+    refreshSubSpread();//subSpread、jobSpread、itemSpread显示问题
     $(".main-data-side-q").height($(window).height() - $(".header").height() - $(".toolsbar").height() -  $(".tools-bar-height-q").height() - 202);
     var select = $('#stdBillsLibSelect');
     billsLibObj.refreshBillsSpread();

+ 10 - 11
web/building_saas/main/js/views/std_ration_lib.js

@@ -27,18 +27,16 @@ var rationLibObj = {
         }
     },
     loadStdRationLibs: function () {
-        CommonAjax.postRationLib('/rationRepository/api/getRationDisplayNames', {user_id: userID}, function (datas) {
-            var select = $('#stdRationLibSelect');
-            select.empty();
-            datas.forEach(function (data) {
-                select.append($('<option>').val(data.ID).text(data.dispName));
-            });
-            if (select[0].options.length !== 0) {
-                rationLibObj.loadStdRation(select.val());
-            }
-        }, function () {
-            $('#stdRationLibSelect').empty();
+        let select = $('#stdRationLibSelect');
+        select.empty();
+
+        let ration_lib = projectInfoObj.projectInfo.engineeringInfo.ration_lib;
+        ration_lib.forEach(function (data) {
+            select.append($('<option>').val(data.id).text(data.name));
         });
+        if (select[0].options.length !== 0) {
+            rationLibObj.loadStdRation(select.val());
+        }
     },
     loadStdRation: function (rationLibID) {
         var that = this;
@@ -190,6 +188,7 @@ var rationLibObj = {
     }
 };
 $('#stdRationTab').bind('click', function () {
+    refreshSubSpread();//subSpread、jobSpread、itemSpread显示问题
     var select = $('#stdRationLibSelect');
     $(".main-data-side-d").height($(window).height() - $(".header").height() - $(".toolsbar").height() -  $(".tools-bar-height-d").height() - 202);
     rationLibObj.refreshSpread();

+ 28 - 11
web/building_saas/main/js/views/sub_view.js

@@ -3,14 +3,14 @@
  */
 //modified by zhong on 2017-08-30
 // Tab panes 下有多个Spread时,相互之间不能正确显示。改成一个Spread下多个Sheet。
-var subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 7);
-subSpread.getSheet(4).name('JSCX');
-
 //特征及内容spread,解决不能正确显示spread
-$("#jobSpread").width($("#subSpread").width() *0.5* 0.4);
-$("#itemSpread").width($("#subSpread").width() *0.5 - $("#jobSpread").width()-20);
 contentOprObj.buildSheet($("#jobSpread")[0]);
 characterOprObj.buildSheet($("#itemSpread")[0]);
+$("#tzjnrCon").hide();
+$("#subSpread").show();
+var subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 7);
+subSpread.getSheet(4).name('JSCX');
+
 pageCCOprObj.active = false;
 
 // 工料机
@@ -36,6 +36,7 @@ $("#linkGLJ").click(function(){
     $("#tzjnrCon").hide();//控制显示subSpread,隐藏特征及内容spread
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(0);
     $.contextMenu( 'destroy', "#subSpread" );
     gljContextMenu.loadGLJSpreadContextMenu();
@@ -47,16 +48,17 @@ $("#linkFZDE").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(1);
     $.contextMenu( 'destroy', "#subSpread" );
     // for test
   //  subSpread.getActiveSheet().setValue(0, 0, "辅助定额");
 });
-
 $("#linkFZTJ").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(2);
     $.contextMenu( 'destroy', "#subSpread" );
     // for test
@@ -67,6 +69,7 @@ $("#linkGCLMX").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(3);
     $.contextMenu( 'destroy', "#subSpread" );
     gljContextMenu.loadQuantityDetailMenu();
@@ -78,6 +81,7 @@ $("#linkJSCX").click(function(){        // 计算程序
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(4);
     calcProgramObj.initSheet(subSpread.getSheet(4));
     let sel = projectObj.mainController.tree.selected;
@@ -93,6 +97,7 @@ $("#linkFXSM").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(5);
     // for test
     subSpread.getActiveSheet().setValue(0, 0, "分项说明");
@@ -102,6 +107,7 @@ $("#linkDESM").click(function(){
     $("#tzjnrCon").hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    refreshSubSpread();
     subSpread.setActiveSheetIndex(6);
     // for test
     subSpread.getActiveSheet().setValue(0, 0, "定额说明");
@@ -112,16 +118,27 @@ $("#linkTZJNR").click(function () {
     $("#subSpread").hide();
     $("#tzjnrCon").show();
     pageCCOprObj.active = true;
+    refreshSubSpread();
     let selectedNode = projectObj.mainController.tree.selected;
     pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
-   // if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
+    if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
         pageCCOprObj.setCacheAndShow(selectedNode);
-   // }
-    //else{
-       // pageCCOprObj.clearData();
-    //}
+    }
+    else{
+        pageCCOprObj.clearData();
+    }
 });
 function SubActiveSheetNameIs(sheetName){
     let rst = subSpread.getActiveSheet().name() == sheetName;
     return rst;
+}
+//弹出清单规则或定额库后导致subSpread和特征及内容spread显示出问题
+function refreshSubSpread(){
+    if(pageCCOprObj.active){
+        contentOprObj.workBook.refresh();
+        characterOprObj.workBook.refresh();
+    }
+    else{
+        subSpread.refresh();
+    }
 }

+ 6 - 6
web/building_saas/pm/html/project-management.html

@@ -120,9 +120,9 @@
                 <div class="col-lg-10">
                 <div class="toolsbar">
                     <div class="tools-btn btn-group align-top">
-                        <a href="javascript:void(0);" class="btn btn-sm" id="add-project-btn">新建 <i class="fa fa-cubes"></i> 建设项目</a>
-                        <a href="javascript:void(0);" class="btn btn-sm" id="add-engineering-btn">新建 <i class="fa fa-cube"></i> 单项工程</a>
-                        <a href="javascript:void(0);" class="btn btn-sm" id="add-tender-btn">新建 <i class="fa fa-sticky-note-o"></i> 单位工程</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="add-project-btn"><i class="fa fa-cubes"></i>&nbsp;新建建设项目</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="add-engineering-btn"><i class="fa fa-cube"></i>&nbsp;新建单项工程</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="add-tender-btn"><i class="fa fa-sticky-note-o"></i>&nbsp;新建单位工程</a>
                         <a href="javascript:void(0);" class="btn btn-sm" id="add-folder-btn"><i class="fa fa-folder-o"></i>&nbsp;新建文件夹</a>
                         <a href="javascript:void(0);" class="btn btn-sm" id="rename-btn">重命名</a>
                         <a href="javascript:void(0);" class="btn btn-sm" id="del-btn">删除</a>
@@ -247,7 +247,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">新建 <i class="fa fa-cubes"></i> 建设项目</h5>
+                <h5 class="modal-title"><i class="fa fa-cubes"></i>&nbsp;新建建设项目</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
@@ -292,7 +292,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">新建 <i class="fa fa-cube"></i> 单项工程</h5>
+                <h5 class="modal-title"><i class="fa fa-cube"></i>&nbsp;新建单项工程</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
@@ -318,7 +318,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">新建 <i class="fa fa-sticky-note-o"></i> 单位工程</h5>
+                <h5 class="modal-title"><i class="fa fa-sticky-note-o"></i>&nbsp;新建单位工程</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>

+ 84 - 26
web/building_saas/pm/js/pm_main.js

@@ -10,6 +10,8 @@ let movetoZTree = null;
 let copytoZTree = null;
 let engineering = [];
 let feeRateData = [];
+let isSaving = false;
+let projectProperty = [];
 let projectType = {
     folder: 'Folder',
     tender: 'Tender',
@@ -166,7 +168,6 @@ $(document).ready(function() {
     $("input[name='valuation_type']").click(function() {
         let type = $(this).val();
         let targetData = type === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
-
         let html = '<option value="">请选择计划规则</option>';
 
         for(let valuation of targetData) {
@@ -229,27 +230,9 @@ $(document).ready(function() {
             projectInfo = selectedItem !== null && selectedItem.parent !== undefined ? selectedItem.parent : null;
         }
         if (projectInfo !== null) {
-            let savedProjectData = localStorage.getItem(projectInfo.data.name);
-            console.log(savedProjectData);
-            savedProjectData = JSON.parse(savedProjectData);
-            // 填入计价规则
-            let valuationHtml = '<option value="'+ savedProjectData.valuation +'">'+ savedProjectData.valuationName +'</option>';
-            $("#tender-valuation").html(valuationHtml);
-
-            // 填入工程专业
-            let engineeringHtml = getEngineeringHtml(savedProjectData.engineeringList);
-            $("#tender-engineering").html(engineeringHtml);
-
-            $("input[name='tender_valuation_type']").attr('disabled', 'disabled').removeAttr('checked', 'checked');
-            $("input[name='tender_valuation_type'][value='"+ savedProjectData.valuationType +"']")
-                .attr("checked", "checked").removeAttr('disabled', 'disabled');
-
-            // 填入费率文件
-            let feeHtml = '<option>请选择费率文件</option>';
-            // for (let fee of savedProjectData.feeLib) {
-            //     feeHtml += '<option value="'+ fee.id +'">'+ fee.name +'</option>';
-            // }
-            $("#tender-fee-rate").html(feeHtml);
+            let parentID = projectInfo.data.ID;
+            // 获取当前的数据属性
+            getProperty(projectInfo.data);
         }
 
     });
@@ -490,6 +473,34 @@ $(document).ready(function() {
             });
         }
     });
+
+    // 选择工程专业后动态更改费率文件等数据
+    $("#tender-engineering").change(function() {
+        if (projectProperty.engineeringList === undefined || projectProperty.engineeringList.length <= 0) {
+            return false;
+        }
+        let selectedEngineering = $(this).val();
+        selectedEngineering = parseInt(selectedEngineering);
+        let currentLib = {};
+        for(let engineering of projectProperty.engineeringList) {
+            if (engineering.engineering === selectedEngineering) {
+                currentLib = engineering.lib;
+            }
+        }
+
+        if (Object.keys(currentLib).length <= 0) {
+            return false;
+        }
+        // 输出数据到页面
+        let feeHtml = '<option>请选择费率文件</option>';
+        if (currentLib.fee_lib !== undefined && currentLib.fee_lib.length > 0) {
+            for (let fee of currentLib.fee_lib) {
+                feeHtml += '<option value="'+ fee.id +'">'+ fee.name +'</option>';
+            }
+        }
+        $("#tender-fee-rate").html(feeHtml);
+
+    });
 });
 
 /**
@@ -549,8 +560,9 @@ function AddProject() {
 
     let callback = function() {
         $("#add-project-dialog").modal("hide");
-        // 记录选择后的信息
-        localStorage.setItem(name, JSON.stringify(projectInfo));
+        $("#project-name").val('');
+        $("input[name='valuation_type']").removeAttr('checked');
+        $("#valuation").children("option").not(":eq(0)").remove();
     };
     let selectedItem = Tree.selected();
 
@@ -634,6 +646,7 @@ function AddEngineering() {
     }
     let callback = function() {
         $("#add-engineering-dialog").modal("hide");
+        $("#engineering-name").val('');
     };
     let selectedItem = Tree.selected();
     // 如果选择的是单项工程则新增同级数据
@@ -660,10 +673,29 @@ function AddTender() {
     let valuationName = $("#tender-valuation").children("option:selected").text();
     let valuationType = $("input[name='tender_valuation_type']:checked").val();
     let engineering = $("#tender-engineering").val();
-    let enginerringName = $('#tender-engineering').children("option:selected").text();
+
+    let engineering_id = undefined;
+    let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
+    let engineeringList = [];
+    for(let tmp of valuationData) {
+        if (tmp._id === valuation) {
+            engineeringList = tmp.engineering_list;
+            break;
+        }
+    }
+    for(let tmp of engineeringList) {
+        if (tmp.engineering == engineering) {
+            engineering_id = tmp.engineering_id;
+            break;
+        }
+    }
+    let engineeringName = $('#tender-engineering').children("option:selected").text();
 
     let callback = function() {
         $("#add-tender-dialog").modal("hide");
+        $('#tender-name').val('');
+        $("#tender-fee-rate").children("option").removeAttr("selected");
+        $("#tender-engineering").children("option").removeAttr("selected");
     };
     let selectedItem = Tree.selected();
     let tenderInfo = {
@@ -671,7 +703,8 @@ function AddTender() {
         valuationType: valuationType,
         valuationName: valuationName,
         engineering: engineering,
-        engineeringName: enginerringName
+        engineering_id: engineering_id,
+        engineeringName: engineeringName
     };
     // 如果选择的是单项工程则新增同级数据
     if (selectedItem !== null && selectedItem.data.projType === projectType.tender) {
@@ -931,3 +964,28 @@ function getEngineeringHtml(engineeringList) {
 
     return result;
 }
+
+/**
+ * 远程获取项目属性数据
+ *
+ * @param {Object} projectInfo
+ * @return {void}
+ */
+function getProperty(projectInfo) {
+    if (projectInfo.property === undefined) {
+        return;
+    }
+    projectProperty = projectInfo.property;
+    // 写入专业工程相关
+    let engineeringHtml = getEngineeringHtml(projectProperty.engineeringList);
+    $("#tender-engineering").html(engineeringHtml);
+
+    // 填入计价规则
+    let valuationHtml = '<option value="'+ projectProperty.valuation +'">'+ projectProperty.valuationName +'</option>';
+    $("#tender-valuation").html(valuationHtml);
+
+    // 选中计价方式
+    $("input[name='tender_valuation_type']").attr('disabled', 'disabled').removeAttr('checked', 'checked');
+    $("input[name='tender_valuation_type'][value='"+ projectProperty.valuationType +"']")
+        .attr("checked", "checked").removeAttr('disabled', 'disabled');
+}

+ 1 - 0
web/glj/html/glj_index.html

@@ -24,6 +24,7 @@
                 <div class="main-content col-lg-12 p-0">
                     <div class="top-content">
                         <div class="main-data-top" id="project-glj">
+                            <p style="text-align: center; margin-top: 30px;">正在加载数据</p>
                         </div>
                     </div>
                     <div class="bottom-content">

+ 2 - 1
web/glj/js/project_glj_spread.js

@@ -92,8 +92,9 @@ ProjectGLJSpread.prototype.init = function () {
     this.sheetObj.setColumnEditable(marketPriceColumn);
     this.sheetObj.setColumnEditable(isEvaluateColumn);
     this.sheetObj.setColumnEditable(isAdjustPriceColumn);
-
     this.sheetObj.setData(sourceData);
+    // 取消正在加载字符提示
+    $("#project-glj > p").hide();
     this.specialColumn(sourceData);
 
     // 绑定修改事件