123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887 |
- /**
- * Created by Mai on 2017/1/18.
- */
- let projectType = {
- folder: 'Folder',
- tender: 'Tender',
- project: 'Project',
- engineering: 'Engineering',
- };
- let fileType = {
- unitPriceFile: 'UnitPriceFile',
- feeRateFile: 'FeeRateFile'
- };
- //先导出后require可以解决循环引用问题
- module.exports ={ project: new ProjectsDAO(),
- projType: projectType,
- fileType: fileType
- };
- import mongoose from 'mongoose';
- import async_c from 'async';
- import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
- let UnitPriceFiles = mongoose.model('unit_price_file');
- import {
- defaultDecimal,
- billsQuantityDecimal,
- basicInformation,
- projectFeature,
- displaySetting,
- calcOptions,
- tenderSetting,
- G_FILE_VER
- } from './project_property_template';
- import optionSetting from '../../options/models/optionTypes';
- import fixedFlag from '../../common/const/bills_fixed';
- let FeeRateFiles = mongoose.model('fee_rate_file');
- let counter = require("../../../public/counter/counter.js");
- let newProjController = require('../controllers/new_proj_controller');
- let copyProjController = require('../controllers/copy_proj_controller');
- let feeRateFacade = require('../../fee_rates/facade/fee_rates_facade');
- let labourCoeFacade = require('../../main/facade/labour_coe_facade');
- let calcProgramFacade = require('../../main/facade/calc_program_facade');
- let installationFacade = require('../../main/facade/installation_facade');
- let projectFacade = require('../../main/facade/project_facade');
- let pmFacade = require('../facade/pm_facade');
- let logger = require("../../../logs/log_helper").logger;
- let BillsModel = require("../../main/models/bills").model;
- let _ = require('lodash');
- let Projects = mongoose.model('projects');
- let mainColLibModel = mongoose.model('std_main_col_lib');
- let projSettingModel = mongoose.model('proj_setting');
- let optionModel = mongoose.model('options');
- function ProjectsDAO() {
- }
- //let G_FILE_VER = '1.0.1';
- ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, callback) {
- try {//
- let projects = await Projects.find({
- '$or': [{
- 'userID': userId,
- 'compilation': compilation,
- 'deleteInfo': null
- }, {'userID': userId, 'compilation': compilation, 'deleteInfo.deleted': {'$in': [null, false]}}]
- }, '-_id', {lean: true});
- let projIDs= [];
- for(let project of projects){
- if(project.projType === projectType.project){
- projIDs.push(project.ID);
- }
- }
- let summaryInfo = await pmFacade.getSummaryInfo(projIDs);
- //设置汇总字段
- for(let proj of projects){
- let summaryProj = summaryInfo[proj.ID];
- if(summaryProj){
- proj.engineeringCost = summaryProj.engineeringCost;
- proj.subEngineering = summaryProj.subEngineering;
- proj.measure = summaryProj.measure;
- proj.safetyConstruction = summaryProj.safetyConstruction;
- proj.other = summaryProj.other;
- proj.charge = summaryProj.charge;
- proj.tax = summaryProj.tax;
- proj.rate = summaryProj.rate;
- proj.buildingArea = summaryProj.buildingArea;
- proj.perCost = summaryProj.perCost;
- }
- }
- callback(0, '', projects);
- }
- catch (err) {
- callback(1, 'Error', null);
- }
- };
- ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
- Projects.findOne({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], ID: ProjId}, '-_id', function (err, template) {
- if (err) {
- callback(1, '找不到标段数据', null);
- } else {
- //打开分享的项目,只读
- if(template && userId !== template.userID){
- template._doc.readOnly = true;
- }
- callback(0, '', template);
- }
- });
- };
- ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId, compilationName,overWriteUrl, datas, callback) {
- let data, project, updateLength = 0, hasError = false, deleteInfo = null, i, newProject;
- let updateAll = function (err) {
- if (!err) {
- updateLength += 1;
- if (updateLength === datas.length) {
- callback(0, '', datas);
- }
- } else {
- hasError = true;
- console.log(err);
- callback(1, '提交数据出错.', null);
- }
- };
- console.log(datas);
- if (datas) {
- for (i = 0; i < datas.length && !hasError; i++) {
- data = datas[i];
- if (data.updateData.name !== undefined) {
- data.updateData.name = data.updateData.name.trim();
- }
- 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['compilation'] = compilationId;
- data.updateData['createDateTime'] = new Date();
- data.updateData['fileVer'] = G_FILE_VER;
- /*if(data.updateData.projType === projectType.project){
- //设置建设项目基本信息,多个单位工程共用
- data.updateData.property = {basicInformation: basicInformation};
- }*/
- // 如果没有选中单价文件则新增单价文件
- if (data.updateData.projType === projectType.tender && data.updateData.property !== null &&
- Object.keys(data.updateData.property.unitPriceFile).length > 0 &&
- data.updateData.property.unitPriceFile.id === '') {
- let unitPriceFileModel = new UnitPriceFileModel();
- let insertData = {
- name: data.updateData.name,
- project_id: data.updateData.ID,
- user_id: userId,
- root_project_id: data.updateData.property.rootProjectID
- };
- let addResult = await unitPriceFileModel.add(insertData);
- if (!addResult) {
- callback(1, '新增单价文件失败.', null);
- return;
- }
- data.updateData.property.unitPriceFile.id = addResult.id;
- }
- if (data.updateData.projType === projectType.tender) {
- //单价文件
- data.updateData.property.unitPriceFile.id=parseInt(data.updateData.property.unitPriceFile.id);
- //小数位数
- data.updateData.property.decimal = defaultDecimal;
- //清单工程量精度
- data.updateData.property.billsQuantityDecimal = billsQuantityDecimal;
- //呈现选项
- data.updateData.property.displaySetting = displaySetting;
- data.updateData.property.billsCalcMode = 0;
- if(overWriteUrl && overWriteUrl !=""){
- let overWrite = require("../../.."+overWriteUrl);
- if(overWrite.getBillsCalcMode) data.updateData.property.billsCalcMode = overWrite.getBillsCalcMode();//重写清单计费取费方式
- }
- data.updateData.property.zanguCalcMode = 0;
- //计算选项
- data.updateData.property.calcOptions = calcOptions;
- //安装增加费
- if(data.updateData.property.isInstall == true || data.updateData.property.isInstall=='true'){//判断是否安装工程
- await installationFacade.copyInstallationFeeFromLib(data.updateData.ID,data.updateData.property.engineering_id);
- }
- //锁定清单
- data.updateData.property.lockBills = false;
- //工料机单价调整系数
- data.updateData.property.tenderSetting = tenderSetting;
- //添加重庆经济指标数据
- await projectFacade.setSEILibData(data.updateData.property);
- data.updateData.property.overHeight = await pmFacade.initOverHeightItems(data.updateData.property.engineering_id);
- if (data.updateData.property.overHeight.length) {
- // 对应清单或分部下
- data.updateData.property.overHeightOption = 1;
- }
- }else if (data.updateData.projType === projectType.project) {
- //更新基本信息
- data.updateData.property.basicInformation.forEach(function (pData) {
- pData.items.forEach(function (item) {
- if (item.key === 'engineeringName') {
- item.value = data.updateData.name;
- } else if (item.key === 'fileKind') {
- item.value = {'1': '投标', '2': '招标'}[data.updateData.property.fileKind]
- } else if (item.key === 'taxModel') {
- item.value = {'1': '一般计税法', '2': '简易计税法'}[data.updateData.property.taxType]
- }
- });
- });
- }
- newProject = new Projects(data.updateData);
- if (data.updateData.projType === 'Tender') {
- let feeRateFileID = await feeRateFacade.newFeeRateFile(userId, data.updateData);
- newProject.property.feeFile = feeRateFileID ? feeRateFileID : -1;
- // 新建人工系数文件 CSL, 2017.10.13
- let lcFile = await labourCoeFacade.newProjectLabourCoe(data.updateData);
- newProject.property.labourCoeFile = lcFile ? lcFile : null;
- // 新建计算程序文件 CSL, 2017.10.23
- let cpFile = await calcProgramFacade.newProjectCalcProgramFile(data.updateData);
- newProject.property.calcProgramFile = cpFile ? cpFile : null;
- }
- newProject.save(async function (err, result) {
- if (!err && result._doc.projType === projectType.tender) {
- newProjController.copyTemplateData(result._doc.property, newProject.ID, updateAll);
- } else {
- updateAll(err);
- }
- });
- }
- else if (data.updateType === 'delete') {
- deleteInfo = {};
- deleteInfo['deleted'] = true;
- deleteInfo['deleteDateTime'] = new Date();
- deleteInfo['deleteBy'] = userId;
- data.updateData['deleteInfo'] = deleteInfo;
- //Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
- //update
- try {
- if (data.updateData.projType === projectType.project) {
- let engineerings = await Projects.find({userID: userId, ParentID: data.updateData.ID});
- let isExist = false;
- if (engineerings.length > 0) {
- for (let j = 0, jLen = engineerings.length; j < jLen; j++) {
- let e_tenders = await Projects.find({userID: userId, ParentID: engineerings[j].ID});
- if (e_tenders.length > 0) {
- isExist = true;
- break;
- }
- }
- }
- if (isExist) {//fake
- await UnitPriceFiles.update({
- user_id: userId,
- root_project_id: data.updateData.ID
- }, {$set: {deleteInfo: deleteInfo}}, {multi: true});
- await FeeRateFiles.update({
- userID: userId,
- rootProjectID: data.updateData.ID
- }, {$set: {deleteInfo: deleteInfo}}, {multi: true});
- await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
- }
- else {//true
- await UnitPriceFiles.remove({user_id: userId, root_project_id: data.updateData.ID});
- await FeeRateFiles.remove({userID: userId, rootProjectID: data.updateData.ID});
- //await Projects.update({userID: userId, NextSiblingID: data.updateData.ID, deleteInfo: null}, {$set: {NextSiblingID: data.NextSiblingID}});
- await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
- }
- }
- else if (data.updateData.projType === projectType.engineering) {
- let tenders = await Projects.find({userID: userId, ParentID: data.updateData.ID});
- if (tenders.length > 0) {//fake
- await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
- }
- else {//true
- //await Projects.update({userID: userId, NextSiblingID: data.updateData.ID, deleteInfo: null}, {$set: {NextSiblingID: data.NextSiblingID}});
- await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
- }
- }
- else if (data.updateData.projType === projectType.tender) {//fake
- let delTender = await Projects.findOne({userID: userId, ID: data.updateData.ID});
- //如果这个单位工程用到的费率文件、单价文件,没有被其他的单位工程使用,则应该一起跟随删除
- if(delTender){
- let unitPriceFile = delTender.property.unitPriceFile;
- let feeRateFile = delTender.property.feeFile;
- let usedUFTenders = await Projects.find(
- {userID: userId, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'property.unitPriceFile.id': unitPriceFile.id});
- if(usedUFTenders.length === 1){
- await UnitPriceFiles.update({id: unitPriceFile.id}, {$set: {deleteInfo: deleteInfo}});
- }
- let usedFRTenders = await Projects.find(
- {userID: userId, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'property.feeFile.id': feeRateFile.id});
- if(usedFRTenders.length === 1){
- await FeeRateFiles.update({ID: feeRateFile.id}, {$set: {deleteInfo: deleteInfo}});
- }
- await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
- }
- }
- else if (data.updateData.projType === projectType.folder) {//true
- await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
- }
- else throw '未知文件类型,删除失败!';
- }
- catch (error) {
- callback(1, error, null);
- }
- }
- else {
- hasError = true;
- callback(1, '提交数据错误.', null);
- }
- }
- }
- };
- //导入接口数据
- ProjectsDAO.prototype.importInterface = async function (srcData) {
- };
- ProjectsDAO.prototype.udpateUserFiles = async function (userId, datas, callback) {
- let updateType = {update: 'update', delete: 'delete'};
- let deleteInfo = Object.create(null);
- deleteInfo.deleted = true;
- deleteInfo.deleteBy = userId;
- deleteInfo.deleteDateTime = new Date();
- try {
- for (let i = 0, len = datas.length; i < len; i++) {
- let data = datas[i];
- if (data.updateType === updateType.update && data.fileType === fileType.unitPriceFile) {
- await UnitPriceFiles.update({user_id: userId, id: parseInt(data.updateData.id)}, data.updateData);
- await Projects.update({
- userID: userId,
- 'property.unitPriceFile.id': data.updateData.id
- }, {$set: {'property.unitPriceFile.name': data.updateData.name}}, {multi: true});
- }
- else if (data.updateType === updateType.update && data.fileType === fileType.feeRateFile) {
- await FeeRateFiles.update({ID: data.updateData.ID}, data.updateData);
- await Projects.update({
- userID: userId,
- 'property.feeFile.id': data.updateData.ID
- }, {$set: {'property.feeFile.name': data.updateData.name}}, {multi: true});
- }
- else if (data.updateType === updateType.delete && data.fileType === fileType.unitPriceFile) {
- data.updateData.deleteInfo = deleteInfo;
- await UnitPriceFiles.update({user_id: userId, id: parseInt(data.updateData.id)}, data.updateData);
- }
- else if (data.updateType === updateType.delete && data.fileType === fileType.feeRateFile) {
- data.updateData.deleteInfo = deleteInfo;
- await FeeRateFiles.update({ID: data.updateData.ID}, data.updateData);
- }
- else throw '未知文件类型,删除失败'
- }
- callback(false, '删除成功', null);
- }
- catch (error) {
- callback(true, '删除失败', null);
- }
- };
- ProjectsDAO.prototype.copyUserProjects = function (userId, compilationId, datas, callback) {
- let data, project, updateLength = 0, hasError = false, deleteInfo = null, tempType = 1, i;
- let updateAll = function (err) {
- if (!err) {
- updateLength += 1;
- if (updateLength === datas.length) {
- callback(0, '', datas);
- }
- } else {
- hasError = true;
- callback(1, '提交数据出错.', null);
- }
- };
- if (datas) {
- for (i = 0; i < datas.length && !hasError; i++) {
- data = datas[i];
- if (data.updateType === 'update') {
- Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll)
- } else if (data.updateType === 'copy') {
- console.log(userId);
- data.updateData['userID'] = userId;
- data.updateData['compilation'] = compilationId;
- data.updateData['createDateTime'] = new Date();
- data.updateData['fileVer'] = G_FILE_VER;
- let newProject = new Projects(data.updateData);
- newProject['srcProjectId'] = data.srcProjectId;
- newProject.save(function (err, result) {
- if (!err && result._doc.projType === 'Tender') {
- copyProjController.copyProjectData(newProject.srcProjectId, result._doc.ID, updateAll);
- } else {
- updateAll(err);
- }
- });
- } else {
- hasError = true;
- callback(1, '提交数据错误', null);
- }
- }
- }
- };
- ProjectsDAO.prototype.rename = async function (userId, compilationId, data, callback) {
- try {
- if (data.id === undefined || data.id === '') {
- throw '数据错误!';
- }
- if (data.newName === undefined || data.newName === '') {
- throw '请填写名称!';
- }
- data.newName = data.newName.trim();
- let project = await Projects.findOne({ID: data.id});
- if (!project) {
- throw '项目不存在';
- }
- if (project.projType === 'Project' && project.property && Array.isArray(project.property.basicInformation)) {
- //更新基本信息
- project.property.basicInformation.forEach(function (pData) {
- pData.items.forEach(function (item) {
- if (item.key === 'engineeringName') {
- item.value = data.newName;
- }
- });
- });
- await Projects.update({ID: data.id}, {$set: {name: data.newName, 'property.basicInformation': project.property.basicInformation}});
- } else {
- await Projects.update({ID: data.id}, {$set: {name: data.newName}});
- }
- Projects.update({userID: userId, ID: data.id}, {name: data.newName}, function (err) {
- if (err) {
- throw '项目不存在';
- }
- });
- } catch (error) {
- callback(1, error, null);
- return;
- }
- callback(0, '');
- };
- ProjectsDAO.prototype.beforeOpenProject = function (userId, projectId, updateData, callback) {
- updateData['recentDateTime'] = new Date();
- Projects.update({userID: userId, ID: projectId}, updateData, function (err) {
- if (err) {
- callback(1, '项目不存在.');
- } else {
- callback(0, '');
- }
- });
- };
- ProjectsDAO.prototype.getNewProjectID = function (count, callback) {
- counter.counterDAO.getIDAfterCount(counter.moduleName.project, count, function (err, result) {
- console.log(result);
- let highID = result.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({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'ID': key}).exec();
- }
- };
- ProjectsDAO.prototype.getProjectsByIds = async function (userId, compilationId, ids) {
- return await Projects.find({userID: userId, compilation: compilationId, ID: {$in: ids}}, '-_id -property');
- };
- ProjectsDAO.prototype.getGCFiles = async function (fileType, userID) {
- let rst;
- if (fileType === 'UnitPriceFile') {
- let unitPriceFileModel = new UnitPriceFileModel();
- rst = await unitPriceFileModel.getGCUnitPriceFiles(userID);
- }
- else if (fileType === 'FeeRateFile') {
- rst = await feeRateFacade.getGCFeeRateFiles(userID);
- }
- else {
- let isExist = false;
- for (let type in projectType) {
- if (projectType[type] === fileType) {
- isExist = true;
- break;
- }
- }
- if (!isExist) throw '不存在此项目类型!';
- rst = await Projects.find(
- {userID: userID, projType: fileType, 'deleteInfo.deleted': true, '$or': [{'deleteInfo.completeDeleted': false}, {'deleteInfo.completeDeleted': null}]});
- }
- return rst;
- };
- ProjectsDAO.prototype.getFirstNodeID = async function (userID, compilationId, pid) {
- let nodes = await Projects.find({userID: userID, compilation: compilationId, ParentID: pid, deleteInfo: null});
- if (nodes.length === 0) {
- return -1;
- }
- else {
- let prefix = 'ID_';
- let chain = Object.create(null);
- for (let i = 0, len = nodes.length; i < len; i++) {
- let nodeDoc = nodes[i]._doc;
- let node = Object.create(null);
- node.ID = nodeDoc.ID;
- node.NextSiblingID = nodeDoc.NextSiblingID;
- chain[prefix + node.ID] = node;
- }
- for (let i = 0, len = nodes.length; i < len; i++) {
- let nodeDoc = nodes[i]._doc;
- let next = nodeDoc.NextSiblingID > 0 ? chain[prefix + nodeDoc.NextSiblingID] : null;
- chain[prefix + nodeDoc.ID].next = next;
- if (next) {
- next.pre = chain[prefix + nodeDoc.ID]
- }
- }
- for (let node in chain) {
- let pre = chain[node].pre || null;
- if (!pre) {
- return chain[node].ID;
- }
- }
- }
- };
- ProjectsDAO.prototype.recGC = async function (userID, compilationId, datas, callback) {
- let functions = [];
- let updateDatas = [];
- for (let i = 0, len = datas.length; i < len; i++) {
- if (datas[i].findData.ParentID !== undefined && datas[i].findData.NextSiblingID === -1 && !datas[i].findData.deleteInfo) {//维护项目管理树
- let findNode = await Projects.find(datas[i].findData);
- if (findNode.length > 0) {
- datas[i].findData = Object.create(null);
- datas[i].findData.ID = findNode[0].ID;
- updateDatas.push(datas[i]);
- }
- }
- else {
- if (datas[i].updateType === projectType.project && datas[i].updateData.NextSiblingID === undefined) {//则为待查询NextSiblingID,前端无法查询
- let projData = await Projects.find({userID: userID, ID: datas[i].findData.ID});//建设项目原本可能属于某文件夹、文件夹的存在需要判断
- let projPid = projData[0].ParentID;
- if (projPid !== -1) {
- let projFolder = await Projects.find({userID: userID, ID: projPid});
- if (projFolder.length === 0) {//文件夹已不存在
- projPid = -1;
- datas[i].updateData.ParentID = -1;
- }
- }
- let firstNodeID = await this.getFirstNodeID(userID, compilationId, projPid);
- datas[i].updateData.NextSiblingID = firstNodeID;
- }
- updateDatas.push(datas[i])
- }
- }
- for (let i = 0, len = updateDatas.length; i < len; i++) {
- functions.push((function (data) {
- return function (cb) {
- if (data.updateType === fileType.unitPriceFile) {
- UnitPriceFiles.update({id: parseInt(data.findData.id)}, data.updateData, function (err) {
- if (err) cb(err);
- else {
- Projects.update({
- userID: userID,
- 'property.unitPriceFile.id': data.findData.id
- }, {$set: {'property.unitPriceFile.name': data.updateData.name}}, function (err) {
- if (err) cb(err);
- else cb(false);
- });
- }
- })
- }
- else if (data.updateType === fileType.feeRateFile) {
- FeeRateFiles.update(data.findData, data.updateData, function (err) {
- if (err) cb(err);
- else {
- Projects.update({
- userID: userID,
- 'property.feeFile.id': data.findData.ID
- }, {$set: {'property.feeFile.name': data.updateData.name}}, function (err) {
- if (err) cb(err);
- else cb(false);
- });
- }
- });
- }
- else {
- if (data) {
- Projects.update(data.findData, data.updateData, function (err) {
- if (err) cb(err);
- else cb(false);
- });
- }
- }
- }
- })(updateDatas[i]));
- }
- async_c.parallel(functions, function (err, results) {
- if (err) callback(err, 'fail', null);
- else callback(0, 'success', null);
- });
- };
- /**
- * 整理工程专业对应标准库数据
- *
- * @param {Object} data
- * @return {Boolean}
- */
- ProjectsDAO.prototype.isExist = async function (userId, compilationId, name, parentID) {
- parentID = parseInt(parentID);
- if (name === '' || isNaN(parentID)) {
- return true;
- }
- let condition = {
- userID: userId,
- compilation: compilationId,
- ParentID: parentID,
- name: name,
- "$or": [{deleteInfo: null}, {"deleteInfo.deleted": false}]
- };
- let count = await Projects.count(condition);
- return count > 0;
- };
- /**
- * 获取对应建设项目下所有的单位工程id
- *
- * @param {Number} projectId
- * @return {Promise}
- */
- ProjectsDAO.prototype.getTenderByProjectId = async function (projectId) {
- let result = [];
- // 首先获取对应的单位工程id
- let engineeringData = await Projects.find({ParentID: projectId});
- if (engineeringData.length <= 0) {
- return result;
- }
- let engineeringIdList = [];
- for (let tmp of engineeringData) {
- engineeringIdList.push(tmp.ID);
- }
- // 查找对应的单位工程id
- let tenderData = await Projects.find({ParentID: {$in: engineeringIdList},deleteInfo: null});
- if (tenderData.length <= 0) {
- return result;
- }
- for (let tmp of tenderData) {
- result.push(tmp.ID);
- }
- return result;
- };
- /**
- * 根据单价文件id获取对应的标段数据
- *
- * @param {Number} unitPriceFileId
- * @return {Promise}
- */
- ProjectsDAO.prototype.getTenderByUnitPriceFileId = async function (unitPriceFileId) {
- let result = [];
- unitPriceFileId = parseInt(unitPriceFileId);
- if (isNaN(unitPriceFileId) && unitPriceFileId <= 0) {
- return result;
- }
- //let condition = {projType: 'Tender', "property.unitPriceFile.id": unitPriceFileId};
- let condition = {"property.unitPriceFile.id": unitPriceFileId,deleteInfo:null};
- result = await Projects.find(condition,['name','property']);
- return result;
- };
- /**
- * 根据项目id获取单价文件列表id
- *
- * @param {Number} projectId
- * @return {Promise}
- */
- ProjectsDAO.prototype.getUnitPriceFileId = async function (projectId) {
- let result = 0;
- let startTime = +new Date();
- let projectData = await Projects.find({ID: projectId},['property.unitPriceFile']);
- if (projectData === null) {
- return result;
- }
- let endTime = +new Date();
- console.log("取单价文件列表id时间-----"+(endTime - startTime));
- projectData = projectData[0];
- result = projectData.property.unitPriceFile !== undefined ? projectData.property.unitPriceFile.id : 0;
- return result;
- };
- /**
- * 根据项目id获取项目property信息
- *
- * @param {Number} projectId
- * @return {Promise}
- */
- ProjectsDAO.prototype.getProjectProperty = async function (projectId) {
- let result = null;
- let projectData = await Projects.findOne({ID: projectId},['property']);
- if (projectData === null) {
- return result;
- }
- return projectData.property;
- };
- ProjectsDAO.prototype.getExtendData = function(property,compilation) {
- let ext = {};
- if(property){
- let region = property.region;
- let taxType = property.taxType;
- if(compilation.priceProperties && compilation.priceProperties.length > 0){//如果是具有多单价的编办,取单价对应的字段
- let priceProperty = _.find(compilation.priceProperties,{region:region,taxModel:parseInt(taxType)});
- if(priceProperty){
- ext['priceField'] = priceProperty.price.dataCode;
- }
- }
- if(compilation.consumeAmtProperties && compilation.consumeAmtProperties.length > 0){
- let consumeAmt = _.find(compilation.consumeAmtProperties,{region:region,taxModel:parseInt(taxType)});
- if(consumeAmt){
- ext['quantityField'] = consumeAmt.consumeAmt.dataCode;
- }
- }
- }
- return _.isEmpty(ext)?null:ext;
- }
- /**
- * 获取当前用户的建设项目数据
- *
- * @paraconsolem {Number} userId
- * @return {Promise}
- */
- ProjectsDAO.prototype.getUserProjectData = async function (userId,compilation) {
- let projectList = await Projects.find({
- '$or': [
- {'userID': userId, 'compilation': compilation, 'deleteInfo': null, projType: 'Project'},
- {'userID': userId, 'compilation': compilation,'deleteInfo.deleted': {'$in': [null, false]}, projType: 'Project'}
- ]
- }, {_id: 0, name: 1, ID: 1, NextSiblingID: 1, ParentID: 1});
- return projectList;
- };
- /**
- * 更改项目属性中的单价文件
- *
- * @param {Number} projectId
- * @param {Object} changeInfo
- * @return {Promise}
- */
- ProjectsDAO.prototype.changeUnitPriceFileInfo = async function (projectId, changeInfo) {
- projectId = parseInt(projectId);
- if (isNaN(projectId) || projectId <= 0) {
- return false;
- }
- let result = await Projects.update({ID: projectId}, {"property.unitPriceFile": changeInfo});
- return result.ok === 1;
- };
- /**
- * 更新项目属性
- *
- * @param {Number} projectId - 项目id
- * @param {Object} propertyData - 项目属性数据
- * @return {Promise}
- */
- ProjectsDAO.prototype.updateProjectProperty = async function(projectId, propertyData) {
- projectId = parseInt(projectId);
- if (isNaN(projectId) || projectId <= 0 || propertyData.property === undefined || propertyData.data === undefined) {
- return false;
- }
- const updateData = {};
- updateData["property." + propertyData.property] = propertyData.data;
- let result = await Projects.update({ID: projectId}, updateData);
- return result.ok === 1;
- };
- // CSL, 2018-01-11 获取指定ID节点(如单项工程、建设项目)下所有单位工程的各项汇总金额,用于报表计算汇总。
- ProjectsDAO.prototype.getSummaryFees = async function (ID) {
- async function getProject(ID){
- return await Projects.findOne({'ID': ID, deleteInfo: null}, need);
- };
- async function getChildrenDocs(IDs){
- return await Projects.find({'ParentID': {"$in":IDs}, deleteInfo: null}, need);
- };
- async function getEgrIDs(ID){
- let _docs = await Projects.find({'ParentID': ID, deleteInfo: null}, ['ID', '-_id']);
- let arr = [];
- for (let doc of _docs){
- arr.push(doc.ID);
- };
- return arr;
- };
- let need = ['ID', 'ParentID', 'NextSiblingID', 'name', 'projType',
- 'fullFolder', 'summaryFees', '-_id'];
- let _doc = await getProject(ID);
- if (!_doc) return _doc;
- if (_doc.projType.sameText('Engineering')){
- return await getChildrenDocs([ID]);
- }
- else if (_doc.projType.sameText('Project')){
- let eIDs = await getEgrIDs(ID);
- return await getChildrenDocs(eIDs);
- }
- else{
- return _doc;
- };
- };
- ProjectsDAO.prototype.updateUnitFileToProject=async function(projectID,unitFile){
- return await Projects.findOneAndUpdate({'ID':projectID},{'property.unitPriceFile':unitFile});
- }
- //获取建设项目项目属性
- ProjectsDAO.prototype.getConstructionProperty = async function (projectID) {
- //获取建设项目
- let constructionProject = await pmFacade.getConstructionProject(projectID);
- if(!constructionProject || !constructionProject.property){
- return null;
- }
- return constructionProject.property;
- };
- //获取建设项目的基本信息
- ProjectsDAO.prototype.getBasicInfo = async function (projectID) {
- //获取建设项目
- let constructionProject = await pmFacade.getConstructionProject(projectID);
- if(!constructionProject || !constructionProject.property || !constructionProject.property.basicInformation){
- return null;
- }
- return constructionProject.property.basicInformation;
- };
- //恢复默认系统设置
- ProjectsDAO.prototype.defaultSettings = async function (userID, compilationId, projectID) {
- let project = await Projects.findOne({ID: projectID});
- if(!project){
- return false;
- }
- let cloneProperty = _.cloneDeep(project.property);
- //关于计算
- cloneProperty.billsCalcMode = 0;
- cloneProperty.zanguCalcMode = 0;
- cloneProperty.calcOptions = calcOptions;
- //清单工程量精度
- cloneProperty.billsQuantityDecimal = billsQuantityDecimal;
- //小数位数
- cloneProperty.decimal = defaultDecimal;
- //呈现选项
- cloneProperty.displaySetting = displaySetting;
- //列设置
- let stdColLib = await mainColLibModel.findOne({ID: project.property.colLibID});
- if(stdColLib){
- await projSettingModel.update({projectID: projectID}, {$set: {main_tree_col: stdColLib.main_tree_col}});
- }
- //系统选项
- await optionModel.update({user_id: userID, compilation_id: compilationId}, {$set: {options: optionSetting}});
- await Projects.update({ID: projectID}, {$set: {property: cloneProperty}});
- return true;
- };
|