/** * Created by zhang on 2018/4/17. */ let mongoose = require('mongoose'); let _ = require("lodash"); let feeRate_facade = require('../../fee_rates/facade/fee_rates_facade'); const uuidV1 = require('uuid/v1'); let projectModel = mongoose.model('projects'); let feeRateModel = mongoose.model('fee_rates'); let feeRateFileModel = mongoose.model('fee_rate_file'); let unitPriceFileModel = mongoose.model("unit_price_file"); let mixRatioModel = mongoose.model("mix_ratio"); let unitPriceModel = mongoose.model("unit_price"); import CounterModel from "../../glj/models/counter_model"; module.exports={ moveProject:moveProject, copyProject:copyProject }; async function copyProject(userID, compilationID,data) {; console.log(userID); console.log(compilationID); console.log(data); let p = Promise.all([getFeeRate(),getUnitfile()]); return await p; } async function getFeeRate() { return await feeRateFileModel.findOne({ID:"e7527fa0-3bd0-11e8-bced-7f72a1e036f0"}); } async function getUnitfile() { return await unitPriceFileModel.findOne({id:958}); } async function moveProject(data) { data = JSON.parse(data); let projectMap = data.projectMap,feeRateMap = data.feeRateMap,unitPriceMap = data.unitPriceMap; let projectTasks = [],feeRateTask=[],feeRateFileTask=[],unitPriceTask=[],unitPriceFileTask=[],mixRatioTask=[]; let feeUniqMap=[],priceUniqMap={};//费率、单价文件唯一映射表当移动多个项目时,任务有可能出现重复的情况 if(!_.isEmpty(feeRateMap)&&data.rootProjectID){//如果费率有修改 let feeRates =await feeRate_facade.getFeeRatesByProject(data.rootProjectID);//取目标建设项目的所有费率文件,重名检查 for(let projectID in feeRateMap){ let rename = feeRateMap[projectID].name; let feeRateID = feeRateMap[projectID].query.ID; let checkFee = _.find(feeRates,{'name':rename}); let newID = feeRateID; if(checkFee){//说明费率名字已存在,需要重命名 rename = feeUniqMap[feeRateID]?feeUniqMap[feeRateID].name:rename + '(' + new Date().Format('MM-dd hh:mm:ss') + '移动)'; projectMap[projectID]['update']['property.feeFile.name'] = rename; if(feeRateMap[projectID].action == 'move'){ feeRateMap[projectID].update.name = rename; } } if(feeRateMap[projectID].action == 'copy'){ newID = feeUniqMap[feeRateID]?feeUniqMap[feeRateID].ID:uuidV1(); feeRateMap[projectID].name = rename; feeRateMap[projectID].ID = newID; projectMap[projectID]['update']['property.feeFile.id'] = newID; } if(!feeUniqMap[feeRateID]){ await generateFeeRateTask(feeRateMap[projectID],feeRateTask,feeRateFileTask); feeUniqMap[feeRateID] = {name:rename,ID:newID}; } } } if(!_.isEmpty(unitPriceMap)&&data.rootProjectID) {//如果单价文件有修改 let unitPriceFiles = await unitPriceFileModel.find({root_project_id: data.rootProjectID, deleteInfo: null}); for(let projectID in unitPriceMap){ let checkUn = _.find(unitPriceFiles,{'name':unitPriceMap[projectID].name}); let rename = unitPriceMap[projectID].name; let unitPriceID = unitPriceMap[projectID].query.id; let newID = unitPriceID; if(checkUn){//重名检查 rename = priceUniqMap[unitPriceID]?priceUniqMap[unitPriceID].name:rename + '(' + new Date().Format('MM-dd hh:mm:ss') + '移动)'; projectMap[projectID]['update']['property.unitPriceFile.name'] = rename; if(unitPriceMap[projectID].action =='move'){ unitPriceMap[projectID].update.name = rename; } } if(unitPriceMap[projectID].action =='copy'){ newID = priceUniqMap[unitPriceID]?priceUniqMap[unitPriceID].id: await getCounterID("unit_price_file"); unitPriceMap[projectID].name = rename; unitPriceMap[projectID].id = newID; projectMap[projectID]['update']['property.unitPriceFile.id'] = newID; } if(!priceUniqMap[unitPriceID]){ await generateUnitPriceTask(unitPriceMap[projectID],projectID,data.user_id,unitPriceTask,unitPriceFileTask,mixRatioTask); priceUniqMap[unitPriceID] = {name:rename,id:newID}; } } } if(!_.isEmpty(projectMap)){ for(let projectID in projectMap){ projectTasks.push({updateOne:{filter : projectMap[projectID].query, update : projectMap[projectID].update}}); } } projectTasks.length>0?await projectModel.bulkWrite(projectTasks):''; feeRateTask.length>0?await feeRateModel.bulkWrite(feeRateTask):''; feeRateFileTask.length>0?await feeRateFileModel.bulkWrite(feeRateFileTask):''; unitPriceFileTask.length>0?await unitPriceFileModel.bulkWrite(unitPriceFileTask):''; unitPriceTask.length>0?await insertMany(unitPriceTask,unitPriceModel):''; mixRatioTask.length>0?await insertMany(mixRatioTask,mixRatioModel):''; return projectMap; } async function generateFeeRateTask(data,feeRateTask,feeRateFileTask) { if(data.action == 'move'){ let task = { updateOne:{ filter : data.query, update : data.update } }; feeRateFileTask.push(task); } if(data.action == 'copy'){//copy 费率的时候用insertOne方法 let [feeRateFile,feeRate] =await feeRate_facade.getFeeRateByID(data.query.ID); let newFeeRateID = uuidV1(); let newFeeRate = { ID:newFeeRateID, rates:feeRate.rates }; let newFeeRateFile = { ID:data.ID, rootProjectID:data.rootProjectID, userID:feeRateFile.userID, name:data.name, libID:feeRateFile.libID, libName:feeRateFile.libName, feeRateID:newFeeRateID }; feeRateTask.push({insertOne :{document:newFeeRate}}); feeRateFileTask.push({insertOne :{document:newFeeRateFile}}); } } async function generateUnitPriceTask(data,projectID,user_id,unitPriceTask,unitPriceFileTask,mixRatioTask){ if(data.action == 'move'){ let task = { updateOne:{ filter : data.query, update : data.update } }; unitPriceFileTask.push(task); } if(data.action == 'copy'){ let newUnitFile = { id:data.id, name: data.name, project_id:projectID, user_id:user_id, root_project_id: data.rootProjectID }; unitPriceFileTask.push({insertOne :{document:newUnitFile}}); let mixRatios = await mixRatioModel.find({unit_price_file_id: data.query.id}); mixRatios = JSON.stringify(mixRatios); mixRatios = JSON.parse(mixRatios); for(let m of mixRatios){ delete m._id; // 删除原有id信息 delete m.id; m.unit_price_file_id = data.id; m.id = await getCounterID('mix_ratio'); mixRatioTask.push(m); } let unitPrices = await unitPriceModel.find({unit_price_file_id: data.query.id});//unit_price_file_id unitPrices = JSON.stringify(unitPrices); unitPrices = JSON.parse(unitPrices); for(let u of unitPrices){ delete u._id; // 删除原有id信息 delete u.id; u.unit_price_file_id = data.id; u.id = await getCounterID('unit_price'); unitPriceTask.push(u); } } } async function getCounterID(collectionName){ let counterModel = new CounterModel(); return await counterModel.getId(collectionName); } async function insertMany(datas,model) { while (datas.length>1000){//因为mongoose限制了批量插入的条数为1000.所以超出限制后需要分批插入 let newList = datas.splice(0,1000);//一次插入1000条 model.insertMany(newList); } model.insertMany(datas); }