| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529 | /** * Created by Mai on 2017/1/18. */import UnitPriceFileModel from "../../glj/models/unit_price_file_model";import moment from 'moment';let mongoose = require('mongoose');let ProjectsData = require('../models/project_model').project;let labourCoe = require('../../main/facade/labour_coe_facade');let projType = require('../models/project_model').projType;let fileType = require('../models/project_model').fileType;const engineering = require("../../common/const/engineering");let EngineeringLibModel = require("../../users/models/engineering_lib_model");let fee_rate_facade = require("../../fee_rates/facade/fee_rates_facade");let billsModel = require('../../main/models/bills').model;let rationsModel = require('../../main/models/ration').model;let projectModel = mongoose.model('projects');let unitPriceFileModel = mongoose.model('unit_price_file');let feeRateFileModel = mongoose.model('fee_rate_file');let asyncTool = require('async');let pm_facade = require('../facade/pm_facade');const userModel = mongoose.model('user');//统一回调函数let callback = function(req, res, err, message, data){    res.json({error: err, message: message, data: data});};module.exports = {    checkRight: function (req, res) {        if(typeof req.body.data === 'object'){            req.body.data = JSON.stringify(req.body.data);        }        let data = JSON.parse(req.body.data);        if (data.user_id) {            return data.user_id === req.session.sessionUser.id;        } else {            return false;        }    },    checkProjectRight: function (userId, projectId, callback) {        ProjectsData.getProject(projectId).then(function (result) {            /**             * result._doc.userID(Number): MongoDB             * userId(String): Session.userID             */            //result._doc.userID == userId &&            if (result._doc.projType === projType.tender) {                callback(true);            } else {                callback(false);            }        }).catch(function (err) {            callback(false);        });    },    getProjects: async function(req, res){         await ProjectsData.getUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, function(err, message, projects){            if (projects) {                callback(req, res, err, message, projects);            } else {                callback(req, res, err, message, null);            }        });    },    updateProjects: async function (req, res) {        let data = JSON.parse(req.body.data);        await ProjectsData.updateUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {            if (err === 0) {                callback(req, res, err, message, data);            } else {                callback(req, res, err, message, null);            }        });    },    // CSL, 2017-12-14 该方法用于项目属性:提交保存混合型数据,这些数据来自不同的表,包括projects.property、ration、bills、labour_coes.    updateMixDatas: function(req, res){        let datas = JSON.parse(req.body.data).mixDataArr;        let functions = [];        function updateFunc(model, cod, doc) {            return function (cb) {                model.update(cod, doc, cb);            }        };        function updateLC(){            return function (cb) {                datas.labourCoes.updateData.projectID = datas.projectID;                labourCoe.save(datas.labourCoes.updateData, cb);            }        };        // 项目属性        if (Object.keys(datas.properties).length > 0){            functions.push(updateFunc(projectModel, {ID: datas.projectID}, datas.properties));        };        // 人工系数        if (datas.labourCoes&&datas.labourCoes.updateData){            functions.push(updateLC());        };        // 清单:每文档doc只存储一条清单,每条清单都必须定位一次文档,无法合并处理        if (datas.bills.length > 0){            for (let bill of datas.bills){                functions.push(updateFunc(billsModel, {projectID: datas.projectID, ID: bill.ID, deleteInfo: null}, bill));            };        };        // 定额:每文档doc只存储一条定额,每条定额都必须定位一次文档,无法合并处理        if (datas.rations.length > 0){            for (let ration of datas.rations){                functions.push(updateFunc(rationsModel, {projectID: datas.projectID, ID: ration.ID, deleteInfo: null}, ration));            };        };        asyncTool.parallel(functions, function(err, result){            {                if (!err) {                    res.json({error: 0, message: err, data: result});                } else {                    res.json({error: 1, message: err, data: null});                }            }        });    },    updateFiles: async function(req, res){        let data = JSON.parse(req.body.data);        let updateDatas = data.updateDatas;        await ProjectsData.udpateUserFiles(req.session.sessionUser.id, updateDatas, function (err, message, data) {            callback(req, res, err, message, data);        });    }, /*   copyProjects: function (req, res) {        let data = JSON.parse(req.body.data);        ProjectsData.copyUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {            if (err === 0) {                callback(req, res, err, message, data);            } else {                callback(req, res, err, message, null);            }        });    },*/    rename: function (req, res) {        let data = JSON.parse(req.body.data);        ProjectsData.rename(req.session.sessionUser.id, req.session.sessionCompilation._id, data, function (err, message) {            callback(req, res, err, message, null);        });    },    getProject: function(req, res){        let data = JSON.parse(req.body.data);        ProjectsData.getUserProject(req.session.sessionUser.id, data.proj_id, async function(err, message, data){            if (err === 0) {                let engineeringLibModel = new EngineeringLibModel();                let engineeringInfo = data !== null && data.property.engineering_id !== undefined ?                    await engineeringLibModel.getEngineering(data.property.engineering_id) : null;                let strData = JSON.stringify(data);                let projInfo = JSON.parse(strData);                if (engineeringInfo !== null) {                    projInfo.engineeringInfo = engineeringInfo;                }                callback(req, res, err, message, projInfo);            } else {                callback(req, res, err, message, null);            }        });    },    beforeOpenProject: function (req, res) {        let data = JSON.parse(req.body.data);        ProjectsData.beforeOpenProject(req.session.sessionUser.id, data.proj_id, data.updateData, function (err, message, data) {            callback(req, res, err, message, data);        });    },    getNewProjectID: function (req, res) {        let data = JSON.parse(req.body.data);        ProjectsData.getNewProjectID(data.count, function (err, message, data) {            callback(req, res, err, message, data);        });    },    // 项目管理首页    index: async function(request, response) {        // 获取编办信息        let sessionCompilation = request.session.sessionCompilation;        if (sessionCompilation === undefined) {            return response.redirect('/logout');        }        // 清单计价        let billValuation = sessionCompilation.bill_valuation !== undefined ?            sessionCompilation.bill_valuation : [];        // 获取标准库数据        let engineeringLibModel = new EngineeringLibModel();        billValuation = await engineeringLibModel.getLib(billValuation);        // 定额计价        let rationValuation = sessionCompilation.ration_valuation !== undefined ?            sessionCompilation.ration_valuation : [];        rationValuation = await engineeringLibModel.getLib(rationValuation);        let renderData = {            userAccount: request.session.userAccount,            userID: request.session.sessionUser.id,            compilationData: JSON.stringify(sessionCompilation),            billValuation: JSON.stringify(billValuation),            rationValuation: JSON.stringify(rationValuation),            engineeringList: JSON.stringify(engineering.List),            versionName: sessionCompilation.name + '免费版'        };        response.render('building_saas/pm/html/project-management.html', renderData);    },    // 获取单价文件列表    getUnitFileList: async function(request, response) {        let data = request.body.data;        try {            data = JSON.parse(data);            let projectId = data.parentID !== undefined ? data.parentID : 0;            if (isNaN(projectId) && projectId <= 0) {                throw {msg: 'id数据有误!', err: 1};            }            /*// 获取对应建设项目下所有的单位工程id            let idList = await ProjectsData.getTenderByProjectId(projectId);            if (idList.length <= 0) {                throw {msg: '不存在对应单位工程', err: 0};            }*/            // 获取对应的单价文件            let unitPriceFileModel = new UnitPriceFileModel();            let unitPriceFileData = await unitPriceFileModel.getDataByRootProject(projectId);            if (unitPriceFileData === null) {                throw {msg: '不存在对应单价文件', err: 0};            }            // 整理数据            let unitPriceFileList = [];            for (let unitPriceFile of unitPriceFileData) {                let tmp = {                    name: unitPriceFile.name,                    id: unitPriceFile.id                };                unitPriceFileList.push(tmp);            }            callback(request, response, 0, '', unitPriceFileList);        } catch (error) {            console.log(error);            let responseData = error.err === 1 ? null : [];            callback(request, response, error.err, error.msg, responseData);        }    },    getFeeRateFileList:async function(request, response) {        let data = request.body.data;        try {            data = JSON.parse(data);            let projectId = data.parentID !== undefined ? data.parentID : 0;            if (isNaN(projectId) && projectId <= 0) {                throw {msg: 'id数据有误!', err: 1};            }            // 获取对应建设项目下所有的单位工程id            let feeRateFileList = await fee_rate_facade.getFeeRatesByProject(projectId);            callback(request, response, 0, '',feeRateFileList );        } catch (error) {            console.log(error);            let responseData = error.err === 1 ? null : [];            callback(request, response, error.err, error.msg, responseData);        }    },    getGCDatas: async function(request, response) {        let userID = request.session.sessionUser.id;        let compilatoinId = request.session.sessionCompilation._id;        let rst = [];        let _projs = Object.create(null), _engs = Object.create(null), prefix = 'ID_';        try{            let gc_unitPriceFiles = await ProjectsData.getGCFiles(fileType.unitPriceFile, userID);            let gc_feeRateFiles = await ProjectsData.getGCFiles(fileType.feeRateFile, userID);            let gc_tenderFiles = await ProjectsData.getGCFiles(projType.tender, userID);            for(let i = 0, len = gc_unitPriceFiles.length; i < len; i++){                let gc_uf = gc_unitPriceFiles[i];                let theProj = _projs[prefix + gc_uf.root_project_id] || null;                if(!theProj){                    let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_uf.root_project_id]);                    if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){                        theProj = _projs[prefix + gc_uf.root_project_id] = tempProj[0]._doc;                        buildProj(theProj);                    }                }                if(theProj){                    theProj.unitPriceFiles.push(gc_uf);                }            }            for(let i = 0, len = gc_feeRateFiles.length; i < len; i++){                let gc_ff = gc_feeRateFiles[i];                let theProj = _projs[prefix + gc_ff.rootProjectID] || null;                if(!theProj){                    let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_ff.rootProjectID]);                    if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){                        theProj = _projs[prefix + gc_ff.rootProjectID] = tempProj[0]._doc;                        buildProj(theProj);                    }                }                if(theProj) {                    theProj.feeRateFiles.push(gc_ff);                }            }            if(gc_tenderFiles.length > 0){                for(let i = 0, len = gc_tenderFiles.length; i < len; i++){                    let gc_t = gc_tenderFiles[i];                    let theEng = _engs[prefix + gc_t.ParentID] || null;                    if(!theEng){                        let tempEngs = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_t.ParentID]);                        if(tempEngs.length > 0 && tempEngs[0].projType === projType.engineering){                            theEng = _engs[prefix + gc_t.ParentID] = tempEngs[0]._doc;                            theEng.children = [];                        }                    }                    if(theEng) {                        theEng.children.push(gc_t);                        let theProj = _projs[prefix + theEng.ParentID] || null;                        if(!theProj){                            let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [theEng.ParentID]);                            if(tempProj.length > 0 && tempProj[0].projType === projType.project){                                theProj = _projs[prefix + theEng.ParentID] = tempProj[0]._doc;                                buildProj(theProj);                            }                        }                        if(theProj) {                            let isExist = false;                            for(let j = 0, jLen = theProj.children.length; j < jLen; j++){                                if(theProj.children[j].ID === theEng.ID){                                    isExist = true;                                    break;                                }                            }                            if(!isExist){                                theProj.children.push(theEng);                            }                        }                    }                }            }            for(let i in _projs){                rst.push(_projs[i]);            }            function buildProj(proj){                proj.children = [];                proj.unitPriceFiles = [];                proj.feeRateFiles = [];            }            callback(request, response, 0, 'success', rst);        }        catch (error){            callback(request, response, true, error, null);        }    },    recGC: function(request, response){        let userID = request.session.sessionUser.id;        let data = JSON.parse(request.body.data);        let nodes = data.nodes;        ProjectsData.recGC(userID, nodes, function (err, msg, data) {            callback(request, response, err, msg, data);        });   },    delGC: async function(request, response){        let data = JSON.parse(request.body.data);        let delDatas = data.delDatas;        let bulkProjs = [], bulkUFs = [], bulkFFs = [];        try{            for(let data of delDatas){                if(data.updateType === 'Project'){                    bulkProjs.push({updateOne: {filter: {ID: data.ID}, update: {'deleteInfo.completeDeleted': true}}});                }                else if(data.updateType === fileType.unitPriceFile){                    bulkUFs.push({updateOne: {filter: {id: data.ID}, update: {'deleteInfo.completeDeleted': true}}});                }                else{                    bulkFFs.push({updateOne: {filter: {ID: data.ID}, update: {'deleteInfo.completeDeleted': true}}});                }            }            if(bulkProjs.length > 0){                await projectModel.bulkWrite(bulkProjs);            }            if(bulkUFs.length > 0){                await unitPriceFileModel.bulkWrite(bulkUFs);            }            if(bulkFFs.length > 0){                await feeRateFileModel.bulkWrite(bulkFFs);            }            callback(request, response, 0, 'success', null);        } catch(err){            callback(request, response, 1, err, null);        }    },    moveProject:async function(req,res){        let result={            error:0        };        try {            let data = req.body.data;            let rdata= await pm_facade.moveProject(data);            result.data= rdata;        }catch (err){            console.log(err);            result.error=1;            result.message = err.message;        }        res.json(result);    },    copyProjects:async function (req, res) {        let result={            error:0        };        try {            let data = JSON.parse(req.body.data);            result.data = await pm_facade.copyProject(req.session.sessionUser.id, req.session.sessionCompilation._id,data);        }catch (err){            console.log(err);            result.error=1;            result.message = err.message;        }        res.json(result);    },    projectShareInfo: async function(req, res){        try{            let data = JSON.parse(req.body.data);            let shareInfo = await projectModel.findOne({ID: data.projectID, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]}, '-_id shareInfo');            callback(req, res, 0, 'success', shareInfo);        }        catch (err){            callback(req, res, 1, err, null);        }    },    share: async function(req, res){        try{            let data = JSON.parse(req.body.data);            //添加分享            let shareData = {userID: data.userID, allowCopy: data.allowCopy, shareDate: moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')};            if(data.type === 'create'){                await projectModel.update({ID: data.projectID, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]}, {$addToSet: {shareInfo: shareData}});            }            //取消分享            else {                await projectModel.update({ID: data.projectID, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]}, {$pull: {shareInfo: {userID: data.userID}}});            }            callback(req, res, 0, 'success', null);        }        catch (err){            callback(req, res, 1, err, null);        }    },    getShareProjects: async function (req, res) {        try {            let userID = req.session.sessionUser.id;            let rst = {receive: [], share: []}//接收的、由我分享的            let shareProjects = await projectModel.find({userID: userID, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'shareInfo.0': {$exists: true}});            //项目类型为分享给别人            let shareToUserIDs = [];            for(let proj of shareProjects){                proj._doc.shareType = 'shareTo';                 for(let shareToUser of proj.shareInfo){                     shareToUserIDs.push(shareToUser.userID);                 }            }            shareToUserIDs = Array.from(new Set(shareToUserIDs));            let shareToObjIDs = [];            for(let userID of shareToUserIDs){                shareToObjIDs.push(mongoose.Types.ObjectId(userID));            }            let shareToUsers = await userModel.find({_id: {$in: shareToObjIDs}});            for(let shareToUser of shareToUsers){                for(let proj of shareProjects){                    for(let user of proj.shareInfo){                        if(user.userID === shareToUser._id.toString()){                            user._doc.company = shareToUser.company;                            user._doc.email = shareToUser.email;                            user._doc.name = shareToUser.real_name;                            user._doc.mobile = shareToUser.mobile;                        }                    }                }            }            rst.share = shareProjects;            let receiveProjects = await projectModel.find({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'shareInfo.userID': userID});            //设置原项目用户信息            if(receiveProjects.length > 0){                let orgUserIDs = [];                for(let proj of receiveProjects){                    orgUserIDs.push(proj.userID);                }                orgUserIDs = Array.from(new Set(orgUserIDs));                let userObjIDs = [];                for(let uID of orgUserIDs){                    userObjIDs.push(mongoose.Types.ObjectId(uID));                }                let orgUsersInfo = await userModel.find({_id: {$in : userObjIDs}});                for(let proj of receiveProjects){                    //设置项目类型为来自别人分享                    proj._doc.shareType = 'receive';                    for(let userData of orgUsersInfo){                        if(proj.userID == userData._id.toString()){                            let userInfo = {name: userData.real_name, mobile: userData.mobile, company: userData.company, email: userData.email};                            proj._doc.userInfo = userInfo;                        }                    }                }            }            rst.receive = receiveProjects;            callback(req, res, 0, 'success', rst);        }        catch (err){            callback(req, res, 1, err, null);        }    },    getProjectsByQuery: async function (req, res) {        try{            let data = JSON.parse(req.body.data);            let query = data.query;            let options = data.options;            let projects = await projectModel.find(query, options);            callback(req, res, 0, 'success', projects);        }        catch (err){            callback(req, res, 1, err, null);        }    }};
 |