| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 | /** * Created by Mai on 2017/1/18. */import UnitPriceFileModel from "../../glj/models/unit_price_file_model";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 = require("../models/project_schema");let asyncTool = require('async');//统一回调函数let callback = function(req, res, err, message, data){    res.json({error: err, message: message, data: data});};module.exports = {    checkRight: function (req, res) {        let data = JSON.parse(req.body.data);        if (data.user_id) {            return data.user_id === req.session.sessionUser.ssoId;        } 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: async function(req, res){         await ProjectsData.getUserProjects(req.session.sessionUser.ssoId, 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.ssoId, 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.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.ssoId, 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.ssoId, 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.ssoId, 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.ssoId, 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.ssoId, 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.ssoId,            compilationData: JSON.stringify(sessionCompilation),            billValuation: JSON.stringify(billValuation),            rationValuation: JSON.stringify(rationValuation),            engineeringList: JSON.stringify(engineering.List)        };        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.ssoId;        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.ssoId;        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);        });    }};
 |