Browse Source

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

TonyKang 8 years ago
parent
commit
24e0760bff

+ 30 - 0
modules/main/models/base_model.js

@@ -0,0 +1,30 @@
+/**
+ * Created by Mai on 2017/6/12.
+ */
+
+class baseModel {
+    constructor (model) {
+        this.model = model;
+    };
+
+    /**
+     * 查询数据
+     * @param query
+     * @param fields
+     * @returns {Promise|Array|{index: number, input: string}}
+     */
+    getQueryData(query, fields) {
+        return this.model.find(query, fields).exec();
+    };
+
+    /**
+     * 批量插入数据
+     * @param datas
+     * @param callback
+     */
+    insertData (datas, callback) {
+        this.model.collection.insert(datas, callback);
+    };
+};
+
+module.exports = baseModel;

+ 69 - 93
modules/main/models/bills.js

@@ -1,18 +1,18 @@
 /**
  * Created by jimiz on 2017/4/1.
  */
-var mongoose = require("mongoose");
-var db = require("../db/project_db");
-var subSchema = require("./bills_sub_schemas");
-var deleteSchema = require('../../../public/models/delete_schema');
-var Schema = mongoose.Schema;
-var async = require("async");
-var counter = require("../../../public/counter/counter.js");
-var consts = require('./project_consts');
-var projectConsts = consts.projectConst;
-var commonConsts = consts.commonConst;
+let mongoose = require("mongoose");
+let db = require("../db/project_db");
+let subSchema = require("./bills_sub_schemas");
+let deleteSchema = require('../../../public/models/delete_schema');
+let Schema = mongoose.Schema;
+let async = require("async");
+let counter = require("../../../public/counter/counter.js");
+let consts = require('./project_consts');
+let projectConsts = consts.projectConst;
+let commonConsts = consts.commonConst;
 
-var billsSchema = new Schema({
+let billsSchema = new Schema({
     ID: Number,
     ParentID: Number,
     NextSiblingID: Number,
@@ -39,6 +39,7 @@ var billsSchema = new Schema({
     isTender_Machine: Boolean,
     tenderTargetPrice: String, // Decimal
     tenderTargetUnitPrice: String, // Decimal
+    tenderTargetUnitPrice: String, // Decimal
     // 费用字段
     fees: [subSchema.feesSchema],
     // 标记字段
@@ -46,98 +47,73 @@ var billsSchema = new Schema({
     deleteInfo: deleteSchema
 });
 
-var bills = db.model("bills", billsSchema);
-
-var billsDAO = function(){};
+let bills = db.model("bills", billsSchema);
+let baseModel = require('./base_model');
 
-billsDAO.prototype.getData = function(projectID, callback){
-    bills.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
-        if (!err) {
-            callback(0, projectConsts.BILLS, datas);
-        } else {
-            callback(1, projectConsts.BILLS, null);
-        };
-    });
-};
+class billsModel extends baseModel {
+    constructor () {
+        super(bills);
+    };
 
-// get All Project Bills, include deleted
-billsDAO.prototype.getProjectBills = function (projectId, callback) {
-    if (callback) {
-        bills.find({projectID: projectId}, '-_id').exec()
-            .then(function (result, err) {
-                if (err) {
-                    callback(1, '找不到模板', null);
-                } else {
-                    callback(0, '', result);
-                }
-            });
-        return null;
-    } else {
-        return bills.find({projectID: projectId}, '-_id').exec();
-    }
-}
+    /**
+     *
+     * @param {Number} projectId
+     * @returns {Promise}
+     */
+    getProjectData (projectId) {
+        return this.getQueryData({"projectID": projectId}, '-_id');
+    };
 
-billsDAO.prototype.AddBillsFromTemplate = function (datas, callback) {
-    bills.collection.insert(datas, callback);
-};
+    getData (projectID, callback) {
+        this.model.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
+            if (!err) {
+                callback(0, projectConsts.BILLS, datas);
+            } else {
+                callback(1, projectConsts.BILLS, null);
+            };
+        });
+    };
 
-billsDAO.prototype.save = function(user_id, datas, callback){
-    var functions = [];
-    var data;
+    save (user_id, datas, callback) {
+        let functions = [];
+        let data;
 
-    function saveOne(doc) {
-/*        switch (doc.type) {
-            case commonConsts.UT_CREATE:
-                return function (callback) {
-                    bills.update({projectID: doc.data.projectID, ID: doc.data.ID}, doc.data, callback);
-                };
-                break;
-            case commonConsts.UT_CREATE:
-                return function (callback) {
-                    bills.create(doc.data, callback);
-                };
-                break;
-            case commonConsts.UT_DELETE:
-                return function (callback) {
-                    doc.data.deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
-                    bills.update({projectID: doc.data.projectID, ID: doc.data.ID}, doc.data, callback);
+        function saveOne(doc) {
+            return function (cb) {
+                switch (doc.updateType) {
+                    case commonConsts.UT_UPDATE:
+                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        break;
+                    case commonConsts.UT_CREATE:
+                        bills.create(doc.updateData, cb);
+                        break;
+                    case commonConsts.UT_DELETE:
+                        doc.updateData.deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
+                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        break;
                 }
-                break;
-        }*/
-        return function (cb) {
-            switch (doc.updateType) {
-                case commonConsts.UT_UPDATE:
-                    bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
-                    break;
-                case commonConsts.UT_CREATE:
-                    bills.create(doc.updateData, cb);
-                    break;
-                case commonConsts.UT_DELETE:
-                    doc.updateData.deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
-                    bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
-                    break;
             }
         }
-    }
-    for (var i = 0; i < datas.length; i++){
-        data = datas[i];
-        functions.push(saveOne(data));
-    }
+        for (let i = 0; i < datas.length; i++){
+            data = datas[i];
+            functions.push(saveOne(data));
+        }
 
-    async.parallel(functions, callback);
-};
+        async.parallel(functions, callback);
+    };
 
-billsDAO.prototype.getItemTemplate = function(callback){
-    var data = new bills;
-    /* to do: 需要根据标准配置库填充fees和flags字段,是否需要更多的参数? */
-    callback(0, '', data);
-};
+    getItemTemplate (callback) {
+        let data = new bills;
+        /* to do: 需要根据标准配置库填充fees和flags字段,是否需要更多的参数? */
+        callback(0, '', data);
+    };
 
-billsDAO.prototype.allocIDs = function(IDStep, callback){
-    counter.counterDAO.getIDAfterCount(counter.moduleName.bills, IDStep, function(err, highID){
-        var lowID = highID - IDStep + 1;
-        callback(0, '', {lowID: lowID, highID: highID});
-    });
+    allocIDs (IDStep, callback) {
+        counter.counterDAO.getIDAfterCount(counter.moduleName.bills, IDStep, function(err, highID){
+            let lowID = highID - IDStep + 1;
+            callback(0, '', {lowID: lowID, highID: highID});
+        });
+    };
 };
 
-module.exports = new billsDAO();
+module.exports = new billsModel();

+ 65 - 56
modules/main/models/ration.js

@@ -1,18 +1,18 @@
 /**
  * Created by jimiz on 2017/4/1.
  */
-var mongoose = require("mongoose");
-var db = require("../db/project_db");
-var subSchema = require("./bills_sub_schemas");
-var Schema = mongoose.Schema;
-var deleteSchema = require('../../../public/models/delete_schema');
-var async = require("async");
-var counter = require("../../../public/counter/counter.js");
-var consts = require('./project_consts');
-var projectConsts = consts.projectConst;
-var commonConsts = consts.commonConst;
+let mongoose = require("mongoose");
+let db = require("../db/project_db");
+let subSchema = require("./bills_sub_schemas");
+let Schema = mongoose.Schema;
+let deleteSchema = require('../../../public/models/delete_schema');
+let async = require("async");
+let counter = require("../../../public/counter/counter.js");
+let consts = require('./project_consts');
+let projectConsts = consts.projectConst;
+let commonConsts = consts.commonConst;
 
-var rationSchema = new Schema({
+let rationSchema = new Schema({
     ID: Number,
     projectID: Number,
     billsItemID: Number,
@@ -35,59 +35,68 @@ var rationSchema = new Schema({
     deleteInfo: deleteSchema
 });
 
-var ration = db.model("ration", rationSchema, "ration");
+let ration = db.model("ration", rationSchema, "ration");
+let baseModel = require('./base_model');
 
-var rationDAO = function(){};
+class rationModel extends baseModel {
+    constructor () {
+        super(ration);
+    }
 
-rationDAO.prototype.getData = function(projectID, callback){
-    ration.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
-        if (!err) {
-            callback(0, projectConsts.RATION, datas);
-        } else {
-            callback(1, '', null);
-        }
-    });
-};
+    getData (projectID, callback) {
+        ration.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
+            if (!err) {
+                callback(0, projectConsts.RATION, datas);
+            } else {
+                callback(1, '', null);
+            }
+        });
+    };
 
-rationDAO.prototype.save = function(projectId, datas, callback){
-    var functions = [];
-    var data;
+    save (projectId, datas, callback) {
+        let functions = [];
+        let data;
 
-    function saveOne(doc) {
-        return function (cb) {
-            switch (doc.updateType) {
-                case commonConsts.UT_UPDATE:
-                    ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
-                    break;
-                case commonConsts.UT_CREATE:
-                    ration.create(doc.updateData, cb);
-                    break;
-                case commonConsts.UT_DELETE:
-                    doc.updateData.deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
-                    ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
-                    break;
+        function saveOne(doc) {
+            return function (cb) {
+                switch (doc.updateType) {
+                    case commonConsts.UT_UPDATE:
+                        ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        break;
+                    case commonConsts.UT_CREATE:
+                        ration.create(doc.updateData, cb);
+                        break;
+                    case commonConsts.UT_DELETE:
+                        doc.updateData.deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
+                        ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        break;
+                }
             }
         }
-    }
-    for (var i = 0; i < datas.length; i++){
-        data = datas[i];
-        functions.push(saveOne(data));
-    }
+        for (let i = 0; i < datas.length; i++){
+            data = datas[i];
+            functions.push(saveOne(data));
+        }
 
-    async.parallel(functions, callback);
-};
+        async.parallel(functions, callback);
+    };
 
-rationDAO.prototype.getItemTemplate = function(callback){
-    var data = new ration;
-    /* to do: 需要根据标准配置库填充fees和flags字段,是否需要更多的参数? */
-    callback(0, '', data);
-};
+    getItemTemplate (callback) {
+        let data = new ration;
+        /* to do: 需要根据标准配置库填充fees和flags字段,是否需要更多的参数? */
+        callback(0, '', data);
+    };
+
+    allocIDs (IDstep, callback) {
+        counter.counterDAO.getIDAfterCount(counter.moduleName.ration, IDStep, function(err, highID){
+            let lowID = highID - IDStep + 1;
+            callback(0, '', {lowID: lowID, highID: highID});
+        });
+    };
 
-rationDAO.prototype.allocIDs = function(IDStep, callback){
-    counter.counterDAO.getIDAfterCount(counter.moduleName.ration, IDStep, function(err, highID){
-        var lowID = highID - IDStep + 1;
-        callback(0, '', {lowID: lowID, highID: highID});
-    });
+    getProjectData (projectID) {
+        return this.getQueryData({"projectID": projectID}, '-_id');
+    };
 };
 
-module.exports = new rationDAO();
+module.exports = new rationModel();

+ 19 - 11
modules/pm/controllers/copy_proj_controller.js

@@ -2,19 +2,27 @@
  * Created by Mai on 2017/4/24.
  */
 
-var billsData = require('../../main/models/bills');
+let billsData = require('../../main/models/bills');
+let rationData = require('../../main/models/ration');
+let async = require('async');
 
 module.exports = {
     copyProjectData: function (srcProjID, newProjID, callback) {
-        billsData.getProjectBills(srcProjID).then(function (results) {
-            var datas = [];
-            results.forEach(function (result) {
-                result._doc.projectID = newProjID;
-                datas.push(result._doc);
-            });
-            return billsData.AddBillsFromTemplate(datas, callback);
-        }).catch(function (err) {
-            callback(err);
-        });
+        var fun = [];
+        var copyData = function (model) {
+            return () => {
+                model.getProjectData(srcProjID).then(function (results) {
+                    let datas = [];
+                    results.forEach(function (result) {
+                        result._doc.projectID = newProjID;
+                        datas.push(result._doc);
+                    });
+                    return model.insertData(datas, callback);
+                }).catch((err) => callback(err));
+            };
+        };
+        fun.push(copyData(billsData));
+        fun.push(copyData(rationData));
+        async.parallel(fun, (err) => callback(err));
     }
 };

+ 5 - 7
modules/pm/controllers/new_proj_controller.js

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

+ 29 - 11
modules/pm/controllers/pm_controller.js

@@ -1,24 +1,42 @@
 /**
  * Created by Mai on 2017/1/18.
  */
-var ProjectsData = require('../models/project');
+let ProjectsData = require('../models/project').project;
+let projType = require('../models/project').projType;
 
 //统一回调函数
-var callback = function(req, res, err, message, data){
+let callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
-}
+};
+
+
 
 module.exports = {
     checkRight: function (req, res) {
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         if (data.user_id) {
             return data.user_id === req.session.userID;
         } else {
             return false;
         }
     },
+    checkProjectRight: function (userId, projectId, callback) {
+        ProjectsData.getProject(projectId).then(function (result) {
+            /**
+             * result._doc.userID(Number): MongoDB
+             * userId(String): Session.userID
+             */
+            if (result._doc.userID == userId && result._doc.projType === projType.tender) {
+                callback(true);
+            } else {
+                callback(false);
+            }
+        }).catch(function (err) {
+            callback(false);
+        });
+    },
     getProjects: function(req, res){
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         ProjectsData.getUserProjects(data.user_id, function(err, message, projects){
             if (projects) {
                 callback(req, res, err, message, projects);
@@ -28,7 +46,7 @@ module.exports = {
         });
     },
     updateProjects: function (req, res) {
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         ProjectsData.updateUserProjects(data.user_id, data.updateData, function (err, message, data) {
             if (err === 0) {
                 callback(req, res, err, message, data);
@@ -38,7 +56,7 @@ module.exports = {
         });
     },
     copyProjects: function (req, res) {
-        var data = JSON.parse(req.body.data);
+        let data = JSON.parse(req.body.data);
         ProjectsData.copyUserProjects(data.user_id, data.updateData, function (err, message, data) {
             if (err === 0) {
                 callback(req, res, err, message, data);
@@ -48,13 +66,13 @@ module.exports = {
         });
     },
     rename: function (req, res) {
-        var data = JSON.parse(req.body.data);
+        let 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);
+        let data = JSON.parse(req.body.data);
         ProjectsData.getUserProject(data.user_id, data.proj_id, function(err, message, data){
             if (err === 0) {
                 callback(req, res, err, message, data);
@@ -64,13 +82,13 @@ module.exports = {
         });
     },
     beforeOpenProject: function (req, res) {
-        var data = JSON.parse(req.body.data);
+        let 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);
+        let data = JSON.parse(req.body.data);
         ProjectsData.getNewProjectID(data.count, function (err, message, data) {
             callback(req, res, err, message, data);
         });

+ 38 - 18
modules/pm/models/project.js

@@ -1,18 +1,18 @@
 /**
  * Created by Mai on 2017/1/18.
  */
-var counter = require("../../../public/counter/counter.js");
+let counter = require("../../../public/counter/counter.js");
 
-var newProjController = require('../controllers/new_proj_controller');
-var copyProjController = require('../controllers/copy_proj_controller');
+let newProjController = require('../controllers/new_proj_controller');
+let copyProjController = require('../controllers/copy_proj_controller');
 
-var mongoose = require("mongoose");
+let mongoose = require("mongoose");
 
-var dbm = require("../../../config/db/db_manager");
-var db = dbm.getCfgConnection("usersManages");
-var Schema = mongoose.Schema;
-var deleteSchema = require('../../../public/models/delete_schema');
-var ProjectSchema = new Schema({
+let dbm = require("../../../config/db/db_manager");
+let db = dbm.getCfgConnection("usersManages");
+let Schema = mongoose.Schema;
+let deleteSchema = require('../../../public/models/delete_schema');
+let ProjectSchema = new Schema({
     "ID": Number,
     "ParentID": Number,
     "NextSiblingID": Number,
@@ -24,9 +24,9 @@ var ProjectSchema = new Schema({
     "deleteInfo": deleteSchema,
     'fullFolder': Array
 });
-var Projects = db.model("projects", ProjectSchema);
+let Projects = db.model("projects", ProjectSchema);
 
-var ProjectsDAO = function(){};
+let ProjectsDAO = function(){};
 
 ProjectsDAO.prototype.getUserProjects = function(userId, callback){
     Projects.find({'$or': [{'userID': userId, 'deleteInfo': null}, {'userID': userId, 'deleteInfo.deleted': {'$in': [null, false]}}]}, '-_id', function(err, templates){
@@ -49,8 +49,8 @@ ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
 }
 
 ProjectsDAO.prototype.updateUserProjects = function(userId, datas, callback){
-    var data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i, newProject;
-    var updateAll = function (err) {
+    let data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i, newProject;
+    let updateAll = function (err) {
             if (!err){
                 updateLength += 1;
                 if (updateLength === datas.length) {
@@ -94,8 +94,8 @@ ProjectsDAO.prototype.updateUserProjects = function(userId, datas, callback){
     }
 };
 ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
-    var data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i;
-    var updateAll = function (err) {
+    let data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i;
+    let updateAll = function (err) {
         if (!err){
             updateLength += 1;
             if (updateLength === datas.length) {
@@ -156,13 +156,33 @@ 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;
+        let highID = result.value.sequence_value;
         if (!err) {
             callback(0, '', {lowID: highID - count + 1, highID: highID});
         } else {
             callback(1, '获取主键失败', null);
         }
     });
-}
+};
+
+ProjectsDAO.prototype.getProject = function (key, callback) {
+    if (callback) {
+        Projects.findOne({'_id': key}, function (err, result) {
+            if (err) {
+                callback(1, '查找标段失败');
+            } else {
+                callback(0, result);
+            }
+        });
+    } else {
+        return Projects.findOne({'ID': key}).exec();
+    }
+};
 
-module.exports = new ProjectsDAO();
+module.exports ={
+    project: new ProjectsDAO(),
+    projType: {
+        folder: 'Folder',
+        tender: 'Tender'
+    }
+};

+ 3 - 3
modules/pm/routes/pm_route.js

@@ -2,9 +2,9 @@
  * Created by Mai on 2017/3/8.
  */
 
-var express = require('express');
-var pmRouter = express.Router();
-var pmController = require('./../controllers/pm_controller');
+let express = require('express');
+let pmRouter = express.Router();
+let pmController = require('./../controllers/pm_controller');
 
 pmRouter.use(function (req, res, next) {
     if (/\/getNewProjectID/.test(req.originalUrl) || pmController.checkRight(req, res)) {

+ 6 - 0
modules/ration_repository/controllers/coe_controller.js

@@ -18,6 +18,12 @@ module.exports ={
         coeList.saveToCoeList(JSON.parse(req.body.data), function(isErr, msg, data){
             callback(req, res, isErr, msg, data);
         });
+    },
+
+    getCoeItemsByIDs: function(req,res){
+        coeList.getCoeItemsByIDs(JSON.parse(req.body.data), function(err,data){
+            callback(req, res, err, 'Get coe', data);
+        });
     }
 
 }

+ 13 - 2
modules/ration_repository/models/coe.js

@@ -36,8 +36,19 @@ coeListDAO.prototype.getCoe = function (data, callback) {
             "$or": [{"isDeleted": null}, {"isDeleted": false}]
         },
         function (err, doc) {
-            if (err) callback(true, "获取系数明细错误!", "")
-            else callback(false, "获取系数明细成功", doc);
+            if (err) callback("获取系数明细错误!", null)
+            else callback(null, doc);
+        })
+};
+
+coeListDAO.prototype.getCoeItemsByIDs = function (data, callback) {
+    coeListModel.find({
+            "libID": data.libID,
+            "ID": {"$in":data.coeIDs}
+        }, ["libID","ID","name","content","-_id"],
+        function (err, doc) {
+            if (err) callback("批量获取系数明细错误!", null)
+            else callback(null, doc);
         })
 };
 

+ 3 - 1
modules/ration_repository/models/ration_item.js

@@ -12,6 +12,7 @@ var rationGljItemSchema = mongoose.Schema({
     consumeAmt: Number,
     proportion: Number //配合比,暂时无需使用,默认0
 }, { _id: false });
+
 var rationItemSchema = mongoose.Schema({
     ID:Number,
     code: String,
@@ -22,7 +23,8 @@ var rationItemSchema = mongoose.Schema({
     rationRepId: Number,
     caption: String,
     feeType: Number,
-    rationGljList: [rationGljItemSchema]
+    rationGljList: [rationGljItemSchema],
+    rationCoeList: Array
 });
 var rationItemModel = db.model("rationItems",rationItemSchema, "rationItems")
 var counter = require('../../../public/counter/counter');

+ 1 - 0
modules/ration_repository/routes/ration_rep_routes.js

@@ -38,6 +38,7 @@ apiRouter.post("/getGljItemsByCodes",repositoryGljController.getGljItemsByCodes)
 
 apiRouter.post("/getCoeList",coeListController.getCoeList);
 apiRouter.post("/saveCoeList",coeListController.saveCoeList);
+apiRouter.post("/getCoeItemsByIDs",coeListController.getCoeItemsByIDs);
 
 apiRouter.post('/getRationItem', searchController.getRationItem);
 apiRouter.post('/findRation', searchController.findRation);

+ 2 - 1
public/web/sheet/sheet_data_helper.js

@@ -36,6 +36,7 @@ var SheetDataHelper = {
         spread.options.scrollbarMaxAlign = true;
         spread.options.cutCopyIndicatorVisible = false;
         spread.options.allowCopyPasteExcelStyle = false;
+        spread.options.allowUserDragDrop = false;
         spread.getActiveSheet().setRowCount(3);
         return spread;
     },
@@ -78,7 +79,7 @@ var SheetDataHelper = {
         style.font = setting.data.font;
         style.hAlign = setting.data.hAlign;
         style.vAlign = setting.data.vAlign;
-        //style.wordWrap = setting.data.wordWrap;
+        style.wordWrap = setting.data.wordWrap;
         return style;
     },
     loadSheetData: function (setting, sheet, datas) {

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

@@ -100,6 +100,7 @@ var TREE_SHEET_HELPER = {
                     cell.value(getFieldText2());
                 }
             });
+            sheet.autoFitRow(node.serialNo());
             if (recursive) {
                 TREE_SHEET_HELPER.refreshTreeNodeData(setting, sheet, node.children, recursive);
             }

+ 34 - 34
server.js

@@ -1,27 +1,27 @@
-var express = require('express');
+let express = require('express');
 
-var config = require("./config/config.js");
+let config = require("./config/config.js");
 //config.setToLocalDb();
 config.setToQaDb();
 //config.setupCache();
-var cfgCacheUtil = require("./config/cacheCfg");
+let cfgCacheUtil = require("./config/cacheCfg");
 cfgCacheUtil.setupDftCache();
 
-var path = require('path');
-var session = require('express-session');
-var DBStore = require('connect-mongo')(session);
+let path = require('path');
+let session = require('express-session');
+let DBStore = require('connect-mongo')(session);
 
-var URL = require('url')
+let URL = require('url')
 
-var app = express();
-var _rootDir = __dirname;
+let app = express();
+let _rootDir = __dirname;
 app.use(express.static(_rootDir));
 
 app.set('views', path.join(__dirname, 'web'));
 app.engine('.html', require('ejs').__express);
 app.set('view engine', 'html');
 
-var bodyParser = require('body-parser');
+let bodyParser = require('body-parser');
 app.use(bodyParser.urlencoded({extended: false}));
 app.use(bodyParser.json());
 
@@ -39,7 +39,7 @@ app.use(session({
 }));
 
 app.use(function (req, res, next) {
-    var url = req.originalUrl, referer;
+    let url = req.originalUrl, referer;
     if (!/^\/login/.test(req.originalUrl) && !req.session.userAccount) {
         if (/\/api/.test(req.originalUrl)) {
             referer = URL.parse(req.headers.referer);
@@ -55,7 +55,7 @@ app.use('/', require('./modules/users/routes/users_route'));
 app.use('/feeRates', require('./modules/fee_rates/routes/fee_rates_route'));
 
 app.get('/template/bills', function (req, res) {
-    var checkAdmin = function (userAccount) {
+    let checkAdmin = function (userAccount) {
         return true;
     }
     if (checkAdmin(req.session.userAccount)) {
@@ -68,7 +68,7 @@ app.get('/template/bills', function (req, res) {
 });
 
 app.use('/template/bills/api', function (req, res, next) {
-    var checkAdmin = function (userAccount) {
+    let checkAdmin = function (userAccount) {
         return true;
     }
     if (checkAdmin(req.session.userAccount)) {
@@ -77,7 +77,7 @@ app.use('/template/bills/api', function (req, res, next) {
         res.json({error: 1, message: '对不起,您无权限操作清单模板。', data: null});
     }
 });
-var billsTemplateRouter = require('./modules/templates/routes/bills_template_router');
+let billsTemplateRouter = require('./modules/templates/routes/bills_template_router');
 app.use('/template/bills/api', billsTemplateRouter);
 
 app.get('/pm', function(req, res){
@@ -85,28 +85,28 @@ app.get('/pm', function(req, res){
         {userAccount: req.session.userAccount,
             userID: req.session.userID});
 });
-var pmRouter = require('./modules/pm/routes/pm_route');
+let pmRouter = require('./modules/pm/routes/pm_route');
 app.use('/pm/api', pmRouter);
 
 app.get('/main',  function(req, res) {
-    var checkProjectRight = function (userID, projectID) {
-        return true;
-    }
-    if (checkProjectRight(req.session.userID, req.query.project)) {
-        res.render('building_saas/main/html/main.html',
-            {
-                userAccount: req.session.userAccount,
-                userID: req.session.userID
-            });
-    } else {
-        res.redirect('/pm');
-    }
+    let pm = require('./modules/pm/controllers/pm_controller');
+    pm.checkProjectRight(req.session.userID, req.query.project, function (hasRight) {
+        if (hasRight) {
+            res.render('building_saas/main/html/main.html',
+                {
+                    userAccount: req.session.userAccount,
+                    userID: req.session.userID
+                });
+        } else {
+            res.redirect('/pm');
+        }
+    });
 });
 
-var project_Router = require('./modules/main/routes/project_route');
-var bills_Router = require('./modules/main/routes/bills_route');
-var ration_Router = require('./modules/main/routes/ration_route');
-var GLJ_Router = require('./modules/main/routes/GLJ_route');
+let project_Router = require('./modules/main/routes/project_route');
+let bills_Router = require('./modules/main/routes/bills_route');
+let ration_Router = require('./modules/main/routes/ration_route');
+let GLJ_Router = require('./modules/main/routes/GLJ_route');
 app.use('/project', project_Router);
 app.use('/bills', bills_Router);
 app.use('/ration', ration_Router);
@@ -114,7 +114,7 @@ app.use('/glj', GLJ_Router);
 
 //app.use(express.static(_rootDir+"/web"));
 //app.use(express.static(_rootDir+"/lib"));
-//var rations_Router = require("./modules/rationLibEditor/routes/rationLibEditor_route");
+//let rations_Router = require("./modules/rationLibEditor/routes/rationLibEditor_route");
 //app.use("/rationLibEditor",rations_Router);
 
 app.get("/stdBillsmain", function(req, res){
@@ -136,11 +136,11 @@ app.get('/stdJobs', function(req, res){
 app.get('/stdItems', function(req, res){
     res.render('maintain/bills_lib/html/tezheng.html');
 });
-var billsLibRouter = require("./modules/bills_lib/routes/bills_lib_routes");
+let billsLibRouter = require("./modules/bills_lib/routes/bills_lib_routes");
 app.use("/stdBillsEditor", billsLibRouter);
 //-----------------
 
-var rationRepository_Router = require("./modules/ration_repository/routes/ration_rep_routes");
+let rationRepository_Router = require("./modules/ration_repository/routes/ration_rep_routes");
 app.use("/rationRepository/api",rationRepository_Router);
 
 app.use(function(req, res, next) {

+ 1 - 0
web/building_saas/main/html/main.html

@@ -603,6 +603,7 @@
         billsSpread = new GC.Spread.Sheets.Workbook($('#billsSpread')[0], { sheetCount: 1 });
         billsSpread.options.tabStripVisible = false;
         billsSpread.options.scrollbarMaxAlign = true;
+        billsSpread.options.allowUserDragDrop = false;
         billsSpread.getActiveSheet().selectionPolicy(GC.Spread.Sheets.SelectionPolicy.single);
 
         // For Test

+ 9 - 2
web/building_saas/pm/js/pm_main.js

@@ -116,7 +116,14 @@ var LoadProjTree = function () {
 };
 
 var GetNeedUpdatePreNode = function (parent, next) {
-    if (parent && parent.id() !== -1) {
+    if (next) {
+        return next.preSibling();
+    } else if (parent) {
+        return parent.firstChild();
+    } else {
+        return null;
+    }
+    /*if (parent && parent.id() !== -1) {
         if (next && next.preSibling()) {
             return next.preSibling();
         } else {
@@ -124,7 +131,7 @@ var GetNeedUpdatePreNode = function (parent, next) {
         }
     } else {
         return null;
-    }
+    }*/
 };
 var GetPreNodeUpdateData = function (pre, nid) {
     var data = {};

+ 1 - 1
web/maintain/ration_repository/dinge.html

@@ -560,9 +560,9 @@
                 pageOprObj.initPage();
                 rationOprObj.buildSheet($("#rationItemsSheet")[0]);
                 rationGLJOprObj.buildSheet($("#rationGLJSheet")[0]);
+                rationCoeOprObj.buildSheet($("#rationCoeSpread")[0]);
                 sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0), rationOprObj.setting);
                 sheetCommonObj.shieldAllCells(rationGLJOprObj.workBook.getSheet(0), rationGLJOprObj.setting);
-                rationCoeObj.show();
             });
         </script>
     </div>

+ 11 - 5
web/maintain/ration_repository/js/ration.js

@@ -44,16 +44,22 @@ var rationOprObj = {
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
     },
     onCellClick: function(sender, args) {
-        var me = rationOprObj, sheet = rationGLJOprObj.workBook.getSheet(0), setting = rationGLJOprObj.setting;
+        var me = rationOprObj, sheetGLJ = rationGLJOprObj.workBook.getSheet(0), settingGLJ = rationGLJOprObj.setting,
+            sheetCoe = rationCoeOprObj.workBook.getSheet(0), settingCoe = rationCoeOprObj.setting;
         if(args.sheetArea === GC.Spread.Sheets.SheetArea.colHeader || args.sheetArea === GC.Spread.Sheets.SheetArea.corner){
-            sheetCommonObj.cleanSheet(sheet, setting, -1);
-            sheetCommonObj.shieldAllCells(sheet);
+            sheetCommonObj.cleanSheet(sheetGLJ, settingGLJ, -1);
+            sheetCommonObj.shieldAllCells(sheetGLJ);
+            sheetCommonObj.cleanSheet(sheetCoe, settingCoe, -1);
+            sheetCommonObj.shieldAllCells(sheetCoe);
         } else {
-            sheetCommonObj.cleanSheet(sheet, setting, -1);
-            sheetCommonObj.shieldAllCells(sheet);
+            sheetCommonObj.cleanSheet(sheetGLJ, settingGLJ, -1);
+            sheetCommonObj.shieldAllCells(sheetGLJ);
+            sheetCommonObj.cleanSheet(sheetCoe, settingCoe, -1);
+            sheetCommonObj.shieldAllCells(sheetCoe);
             var cacheSection = me.getCache();
             if (cacheSection && args.row < cacheSection.length) {
                 rationGLJOprObj.getGljItems(cacheSection[args.row]);
+                rationCoeOprObj.getCoeItems(cacheSection[args.row]);
             }
         }
         me.workBook.focus(true);

+ 183 - 109
web/maintain/ration_repository/js/ration_coe.js

@@ -1,135 +1,209 @@
 /**
  * Created by CSL on 2017-06-08.
  */
-var rationCoeObj = {
-    spread: null,
-    datas: [],
-    libID: Number,
-    tempID: -999999,       // 本地新增一条数据给的默认ID,用作标记,服务端返回新ID后替换该ID
-
-    colDef: [
-        {name: "ID", displayName: "ID", size: 70, hAlign: "center"},
-        {name: "name", displayName: "名称", size: 400, readOnly: true},
-        {name: "content", displayName: "内容", size: 500, readOnly: true}
-    ],
-
-    show: function (){
-        var me = this;
-        me.libID = getQueryString("repository");
-        me.getDatas();
-        me.spread = sheetObj.create($('#rationCoeSpread')[0], me.colDef, me.datas);
-        me.spread.getSheet(0).bind(GC.Spread.Sheets.Events.CellChanged, me.onMainCellChanged);
-        me.spread.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onMainRangeChanged);
+var rationCoeOprObj = {
+    workBook: null,
+    libID: -1,
+    currentRationItem: null,
+    cache: {},
+    setting: {
+        header:[
+            {headerName:"编号",headerWidth:120,dataCode:"ID", dataType: "Number"},
+            {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String"},
+            {headerName:"内容",headerWidth:300,dataCode:"content", dataType: "String"}
+        ],
+        view:{
+            comboBox:[],
+            lockColumns:[1,2]
+        }
     },
-
-    getDatas: function () {
+    buildSheet: function(container) {
         var me = this;
-
-        $.ajax({
-            type:"POST",
-            url:"/rationRepository/api/getCoeList",
-            data:{"libID": me.libID},
-            dataType:"json",
-            cache:false,
-            async: false,
-            timeout:20000,
-            success: function (result) {
-                if (result.data) {
-                    me.datas = result.data;
-                };
-            },
-            error: function (result) {
-                alert('内部程序错误!');
-            }
-        })
+        me.libID = storageUtil.getSessionCache("RationGrp","repositoryID");
+        me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
     },
+    onRangeChanged: function(sender, args) {
+        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
+            var me = rationCoeOprObj, updateArr = [], removeArr = [];
+            if (args.col == 0) {
+                if (me.cache["_Coe_" + me.currentRationItem.ID]) {
+                    var cacheArr = me.cache["_Coe_" + me.currentRationItem.ID];
+                    for (var i = args.rowCount - 1; i >= 0; i--) {
+                        if (args.row + i < cacheArr.length) {
+                            cacheArr.splice(args.row + i, 1);
+                        }
+                    }
+                    me.updateRationItem();
+                    sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+                    me.showCoeItems(me.currentRationItem.ID);
+                }
+            }
 
-    onMainCellChanged: function(sender, args) {
-        if (args.propertyName !== "value"){return;};
-        var me = rationCoeObj;
-        var row = args.sheet.getActiveRowIndex();
-        var obj = me.datas[row];
-
-        if (obj.ID == undefined){           // 空行录入,即新增
-            obj.libID = me.libID;
-            obj.ID = me.tempID;
-            if (obj.name == undefined){obj.name = '';};     // 生成属性,令属性存储顺序一致
-            if (obj.content == undefined){obj.content = '';};
-            obj.coes = [{coeType:"全部", operator:"*", amount: "0"}];
-            me.datas[row] = obj;
-
-            me.save([obj],[],[]);
-
-            var sheet = me.spread.getSheet(0);
-            me.showNullRow(sheet);
         }
-        else{ // 正常修改
-            me.save([],[],[obj]);
-        };
     },
-
-    onMainRangeChanged: function(sender, args) {
-        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            if (!confirm('确定要删除本条附注条件吗?')){ args.cancel = true; return; }
-            var me = rationCoeObj;
-            var obj = me.datas[args.row];
-            me.save([],[obj],[]);
-            args.sheet.deleteRows(args.row, 1);
-        };
+/*    onClipboardPasting: function(sender, args) {
+        var me = rationCoeOprObj;
+        if (args.cellRange.colCount != 1 || args.cellRange.col != 0 || !(me.currentRationItem)) {
+            args.cancel = true;
+        }
     },
-
-    showNullRow: function(sheet){
-        var datas = sheet.getDataSource();
-        var lastData = datas[datas.length - 1];
-        if (!$.isEmptyObject(lastData)){
-            sheet.addRows(sheet.getRowCount(), 1);
-        };
+    onClipboardPasted: function(e, info) {
+        var me = rationCoeOprObj;
+        if (me.libID) {
+            if (info.cellRange.col == 0) {
+                var tmpCoeIDs = sheetCommonObj.analyzePasteData({header:[{dataCode: "ID"}] }, info);
+                var IDs = [];
+                for (var i = 0; i < tmpCoeIDs.length; i++) {
+                    IDs.push(tmpCoeIDs[i]);
+                }
+                me.addCoeItems(IDs);
+            } else {
+                //修改用量
+            }
+        }
+    },*/
+    onCellEditEnd: function(sender, args){
+        var me = rationCoeOprObj;
+        if (args.col == 0) {   // 编号列
+            if (args.editingText == null || args.editingText.trim() == "") {  //delete
+                var cacheArr = me.cache["_Coe_" + me.currentRationItem.ID];
+                if (cacheArr) {
+                    if (args.row < cacheArr.length) {
+                        cacheArr.splice(args.row, 1);
+                        me.updateRationItem();
+                        sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+                        me.showCoeItems(me.currentRationItem.ID);
+                    }
+                }
+            } else {
+                if (me.libID) {
+                    var coeIDs = [];
+                    coeIDs.push(args.editingText.trim());
+                    me.addCoeItems(coeIDs, me.libID);
+                }
+            }
+        }
     },
 
-    save: function(addArr, deleteArr, updateArr) {
-        var me = rationCoeObj;
-
-        //var addArrTemp = [];
-        //var deleteArrTemp = [];
-        var updateArrTemp = [];
-
-        // 空行会产生空对象数据,清理空对象会给sheet的空行效果带来奇怪的干扰,这里要中转一下。
-        if (updateArr.length > 0){
-            $.extend(true, updateArrTemp, updateArr);
-            //debug.d('011: ', updateArrTemp);
-            //debug.d('012: ', updateArr);
-            deleteEmptyObject(updateArrTemp[0].coes);
-            //debug.d('013: ', updateArrTemp);
-            //debug.d('014: ', updateArr);
-            //return;
-        };
-
+    addCoeItems: function(coeIDs) {
+        var me = this;
         $.ajax({
             type:"POST",
-            url:"api/saveCoeList",
-            data: {"data": JSON.stringify({"addArr": addArr, "deleteArr": deleteArr, "updateArr": updateArrTemp})},
+            url:"api/getCoeItemsByIDs",
+            data: {"data": JSON.stringify({"libID": me.libID, "coeIDs": coeIDs})},
             dataType:"json",
             cache:false,
             timeout:5000,
             success:function(result){
-                if (result.error) {
-                    alert(result.message);
-                } else {
-                    // 成功。更新从后台返回的新ID。
-                    if (addArr.length > 0){
-                        for (var i = 0; i < me.datas.length; i++) {
-                            if (me.datas[i].ID == me.tempID){
-                                me.datas[i].ID = result.data;
-                                me.spread.getSheet(0).repaint();
-                                break;
+                sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+                if (result) {
+                    var rstArr = [], newAddArr = [];
+                    for (var i = 0; i < result.data.length; i++) {
+                        rstArr.push(result.data[i]);
+                    };
+                    if (me.cache["_Coe_" + me.currentRationItem.ID]) {
+                        var cacheArr = me.cache["_Coe_" + me.currentRationItem.ID];
+                        for (var i = 0; i < rstArr.length; i++) {
+                            var hasDup = false;
+                            for (var j = 0; j < cacheArr.length; j++) {
+                                if (cacheArr[j] == rstArr[i]) {
+                                    hasDup = true;
+                                    break;
+                                }
+                            }
+                            if (!hasDup) {
+                                newAddArr.push(rstArr[i]);
                             }
                         }
-                    };
+                        cacheArr.sort(function(a, b) {
+                            var rst = 0;
+                            if (a > b) rst = 1
+                            else if (a < b) rst = -1;
+                            return rst;
+                        });
+                        me.cache["_Coe_" + me.currentRationItem.ID] = cacheArr.concat(newAddArr);
+                    }
+                    me.showCoeItems(me.currentRationItem.ID);
+                    if (newAddArr.length > 0) {
+                        me.updateRationItem();
+                    }
                 }
+                sheetCommonObj.lockCells(me.workBook.getSheet(0), me.setting);
             },
             error:function(err){
-                alert("内部程序错误!");
+                alert(err);
             }
         })
+    },
+
+    updateRationItem: function() {
+        var me = this, updateArr = [];
+        if (me.currentRationItem) {
+            me.currentRationItem.rationCoeList = me.getCoeIDsArr();
+            updateArr.push(me.currentRationItem);
+            rationOprObj.mixUpdateRequest(updateArr, [], []);
+        }
+    },
+
+    getCoeIDsArr: function(){
+        var me = this, rst = [];
+        if (me.currentRationItem && me.cache["_Coe_" + me.currentRationItem.ID]) {
+            var cacheArr = me.cache["_Coe_" + me.currentRationItem.ID];
+            for (var i = 0; i < cacheArr.length; i++) {
+                rst.push(cacheArr[i].ID);
+            }
+        }
+        return rst;
+    },
+
+    getCoeItems: function(rationItem) {
+        var me = this, rationID = rationItem.ID, rationCoeList = rationItem.rationCoeList;
+        if (rationCoeList == undefined){return;};
+
+        me.currentRationItem = rationItem;
+        if (me.cache["_Coe_" + rationID]) {
+            me.showCoeItems(rationID);
+            sheetCommonObj.lockCells(me.workBook.getSheet(0), me.setting);
+        } else {
+            $.ajax({
+                type:"POST",
+                url:"api/getCoeItemsByIDs",
+                data: {"data": JSON.stringify({"libID": me.libID, "coeIDs": rationCoeList})},
+                dataType:"json",
+                cache:false,
+                timeout:5000,
+                success:function(result){
+                    sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+
+                    if (result.data) {
+                        var cacheArr = [];
+                        for (var i = 0; i < result.data.length; i++) {
+                            for (var j = 0; j < rationCoeList.length; j++) {
+                                if (rationCoeList[j] == result.data[i].ID) {
+                                    cacheArr.push(result.data[i]);
+                                    break;
+                                }
+                            }
+                        };
+                        me.cache["_Coe_" + rationID] = cacheArr;
+                        me.showCoeItems(rationID);
+                    }
+                    sheetCommonObj.lockCells(me.workBook.getSheet(0), me.setting);
+                },
+                error:function(err){
+                    alert(err);
+                }
+            })
+        }
+    },
+    showCoeItems: function(rationID) {
+        var me = this;
+        if (me.cache["_Coe_" + rationID]) {
+            sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, me.cache["_Coe_" + rationID]);
+        }
     }
-};
+}

+ 1 - 0
web/maintain/ration_repository/js/ration_glj.js

@@ -114,6 +114,7 @@ var rationGLJOprObj = {
             success:function(result){
                 sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
                 if (result) {
+                    alert(JSON.stringify(result.data));
                     var rstArr = [], dummyR = {gljId: 0, consumeAmt:0}, newAddArr = [];
                     for (var i = 0; i < result.data.length; i++) {
                         dummyR.gljId = result.data[i].ID;