|
@@ -4,13 +4,25 @@
|
|
|
let mongoose = require('mongoose');
|
|
|
let _ = require("lodash");
|
|
|
let feeRate_facade = require('../../fee_rates/facade/fee_rates_facade');
|
|
|
+let logger = require("../../../logs/log_helper").logger;
|
|
|
const uuidV1 = require('uuid/v1');
|
|
|
let projectModel = mongoose.model('projects');
|
|
|
+let projectSettingModel = mongoose.model('proj_setting');
|
|
|
+let billsModel = mongoose.model('bills');
|
|
|
+let rationModel = mongoose.model('ration');
|
|
|
+let gljListModel = mongoose.model("glj_list");
|
|
|
+let calcProgramsModel = mongoose.model('calc_programs');
|
|
|
+let labourCoesModel = mongoose.model('labour_coes');
|
|
|
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");
|
|
|
+let installationFeeModel = mongoose.model("installation_fee");
|
|
|
+let rationGLJModel = mongoose.model('ration_glj');
|
|
|
+let rationCoeModel = mongoose.model('ration_coe');
|
|
|
+let rationInstallationModel = mongoose.model('ration_installation');
|
|
|
+let quantityDetailModel = mongoose.model('quantity_detail');
|
|
|
import CounterModel from "../../glj/models/counter_model";
|
|
|
|
|
|
|
|
@@ -19,24 +31,237 @@ module.exports={
|
|
|
copyProject:copyProject
|
|
|
};
|
|
|
|
|
|
-async function copyProject(userID, compilationID,data) {;
|
|
|
- console.log(userID);
|
|
|
- console.log(compilationID);
|
|
|
- console.log(data);
|
|
|
+async function copyProject(userID, compilationID,data) {
|
|
|
+ let projectMap = data.projectMap;
|
|
|
+ let originalID = projectMap['copy'].document.ID;
|
|
|
+ let originalProperty = _.cloneDeep(projectMap['copy'].document.property);
|
|
|
+ let newProjectID = await getCounterID("projects");
|
|
|
+ let newFeeName = null,newUnitName = null;
|
|
|
+ let calcProgramFileID = uuidV1();//新的计算程序文件ID
|
|
|
+ let labourCoeFileID = uuidV1();//新的人工调整系数文件ID
|
|
|
+ let feeRateFileID = uuidV1();//新的费率文件ID
|
|
|
+ let unitPriceFileID = await getCounterID("unit_price_file");//新的单价文件ID
|
|
|
+ logger.info("复制项目: 旧项目ID: "+originalID+ " ------- 新项目ID: "+newProjectID);
|
|
|
+ //费率文件、单价文件重名检查
|
|
|
+ let feeRate = await feeRateFileModel.findOne({rootProjectID:originalProperty.rootProjectID,name:originalProperty.feeFile.name,deleteInfo:null});
|
|
|
+ if(feeRate){//存在重名的文件
|
|
|
+ newFeeName = originalProperty.feeFile.name + '(' + new Date().Format('MM-dd hh:mm:ss') + '复制)';
|
|
|
+ projectMap['copy'].document.property.feeFile.name = newFeeName;
|
|
|
+ }
|
|
|
+
|
|
|
+ let unitPriceFile = await unitPriceFileModel.findOne({root_project_id: originalProperty.rootProjectID,name:originalProperty.unitPriceFile.name,deleteInfo: null});
|
|
|
+ if(unitPriceFile){//存在重名的文件
|
|
|
+ newUnitName = originalProperty.unitPriceFile.name + '(' + new Date().Format('MM-dd hh:mm:ss') + '复制)';
|
|
|
+ projectMap['copy'].document.property.unitPriceFile.name = newUnitName;
|
|
|
+ }
|
|
|
|
|
|
- let p = Promise.all([getFeeRate(),getUnitfile()]);
|
|
|
+ //更新项目的属性;
|
|
|
+ projectMap['copy'].document.ID = newProjectID;
|
|
|
+ projectMap['copy'].document.property.calcProgramFile.ID = calcProgramFileID;
|
|
|
+ projectMap['copy'].document.property.labourCoeFile.ID = labourCoeFileID;
|
|
|
+ projectMap['copy'].document.property.feeFile.id = feeRateFileID;
|
|
|
+ projectMap['copy'].document.property.unitPriceFile.id = unitPriceFileID;
|
|
|
+ projectMap['copy'].document.userID = userID;
|
|
|
+ projectMap['copy'].document.compilation = compilationID;
|
|
|
+ projectMap['copy'].document.createDateTime = new Date();
|
|
|
+
|
|
|
+ //清单、定额ID生成任务
|
|
|
+ let IDtasks = [
|
|
|
+ createIDsAndReturn(originalID,billsModel),
|
|
|
+ createIDsAndReturn(originalID,rationModel),
|
|
|
+ getProjectGLJIDAndReturn(originalID,newProjectID)
|
|
|
+ ];
|
|
|
+ let [billMap,rationMap,projectGLJMap] = await Promise.all(IDtasks);
|
|
|
+
|
|
|
+ //所有复制任务异步处理,提升效率 复制清单,定额,4个文件,项目工料机, 定额工料机,人工系数,工程量明细,定额安装增加费,安装增加费
|
|
|
+ let copyTasks = [
|
|
|
+ createProject(projectMap),
|
|
|
+ copyProjectSetting(originalID,newProjectID),
|
|
|
+ copyBills(newProjectID,billMap),
|
|
|
+ copyRations(newProjectID,billMap.uuidMaping,rationMap),
|
|
|
+ copyProjectGLJ(projectGLJMap.datas),
|
|
|
+ commonCopy(newProjectID,originalProperty.calcProgramFile.ID,calcProgramFileID,calcProgramsModel),
|
|
|
+ commonCopy(newProjectID,originalProperty.labourCoeFile.ID,labourCoeFileID,labourCoesModel),
|
|
|
+ copyFeeRate(originalProperty.rootProjectID,userID,originalProperty.feeFile.id,feeRateFileID,newFeeName),
|
|
|
+ copyUnitPriceFile(newProjectID,originalProperty.rootProjectID,userID,originalProperty.unitPriceFile.id,unitPriceFileID,newUnitName),
|
|
|
+ copyInstallFee(originalID,newProjectID),
|
|
|
+ copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationGLJModel),
|
|
|
+ copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationCoeModel),
|
|
|
+ copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,quantityDetailModel),
|
|
|
+ copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationInstallationModel)
|
|
|
+ ];
|
|
|
+ let p = await Promise.all(copyTasks);
|
|
|
+ return p[0];
|
|
|
+}
|
|
|
|
|
|
- return await p;
|
|
|
+async function createIDsAndReturn(originalID,model) {
|
|
|
+ let uuidMaping = {};//做ID映射
|
|
|
+ let datas = [];
|
|
|
+ let result = await model.find({"projectID": originalID}, '-_id');
|
|
|
+ uuidMaping['-1'] = -1;
|
|
|
+ //建立uuid-ID映射
|
|
|
+ for(let d of result){
|
|
|
+ uuidMaping[d.ID] = uuidV1();
|
|
|
+ datas.push(d._doc);
|
|
|
+ }
|
|
|
+ return{uuidMaping:uuidMaping,datas:datas};
|
|
|
+}
|
|
|
|
|
|
+async function getProjectGLJIDAndReturn(originalID,newProjectID) {
|
|
|
+ let IDMap = {};
|
|
|
+ let datas = [];
|
|
|
+ let result = await gljListModel.find({project_id:originalID}, '-_id');
|
|
|
+ for(let d of result){
|
|
|
+ let newID = await getCounterID("glj_list");
|
|
|
+ IDMap[d.id] = newID;
|
|
|
+ d._doc.project_id = newProjectID;
|
|
|
+ d._doc.id = newID;
|
|
|
+ datas.push(d._doc);
|
|
|
+ }
|
|
|
+ return{IDMap:IDMap,datas:datas};
|
|
|
}
|
|
|
|
|
|
+async function createProject(projectMap) {//复制项目
|
|
|
+ let tasks = [];
|
|
|
+ if(projectMap['update']){//如果复制后存在前一个节点,则更新其NextSiblingID
|
|
|
+ tasks.push({updateOne:{filter : projectMap['update'].query, update : {NextSiblingID:projectMap['copy'].document.ID}}});
|
|
|
+ }
|
|
|
+ tasks.push({insertOne: {document: projectMap['copy'].document}});//复制任务
|
|
|
+ await projectModel.bulkWrite(tasks);
|
|
|
+ return projectMap;
|
|
|
+}
|
|
|
+
|
|
|
+async function copyProjectSetting(originalID,newProjectID) {
|
|
|
+ let result = null;
|
|
|
+ let setting = await projectSettingModel.findOne({"projectID": originalID}, '-_id');
|
|
|
+ if(setting){
|
|
|
+ setting._doc.projectID =newProjectID;
|
|
|
+ result = await projectSettingModel.create(setting._doc);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+async function copyBills(newProjectID,billMap) {
|
|
|
+ let uuidMaping = billMap.uuidMaping;//做ID映射
|
|
|
+ for(let doc of billMap.datas){
|
|
|
+ doc.projectID = newProjectID;
|
|
|
+ doc.ID = uuidMaping[doc.ID] ? uuidMaping[doc.ID] : -1;
|
|
|
+ doc.ParentID = uuidMaping[doc.ParentID] ? uuidMaping[doc.ParentID] : -1;
|
|
|
+ doc.NextSiblingID = uuidMaping[doc.NextSiblingID] ? uuidMaping[doc.NextSiblingID] : -1;
|
|
|
+ }
|
|
|
+ await insertMany(billMap.datas,billsModel);
|
|
|
+ return billMap.datas;
|
|
|
+}
|
|
|
+
|
|
|
+async function copyRations(newProjectID,billsIDMap,rationMap) {
|
|
|
+ let uuidMaping = rationMap.uuidMaping;
|
|
|
+ for(let doc of rationMap.datas){
|
|
|
+ doc.projectID = newProjectID;
|
|
|
+ doc.ID = uuidMaping[doc.ID] ? uuidMaping[doc.ID] : -1;
|
|
|
+ if(doc.billsItemID){
|
|
|
+ doc.billsItemID = billsIDMap[doc.billsItemID]?billsIDMap[doc.billsItemID]:-1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(rationMap.datas.length > 0){
|
|
|
+ await insertMany(rationMap.datas,rationModel);
|
|
|
+ }
|
|
|
+ return rationMap.datas;
|
|
|
+}
|
|
|
|
|
|
-async function getFeeRate() {
|
|
|
- return await feeRateFileModel.findOne({ID:"e7527fa0-3bd0-11e8-bced-7f72a1e036f0"});
|
|
|
+async function copyProjectGLJ(gljList) {
|
|
|
+ await insertMany(gljList,gljListModel);
|
|
|
}
|
|
|
|
|
|
-async function getUnitfile() {
|
|
|
- return await unitPriceFileModel.findOne({id:958});
|
|
|
+async function commonCopy(newProjectID,oldID,newID,model) { //对于只需更新ID和projectID的文件的复制
|
|
|
+ let result = null;
|
|
|
+ let file = await model.findOne({"ID": oldID}, '-_id');
|
|
|
+ if(file){
|
|
|
+ file._doc.ID = newID;
|
|
|
+ file._doc.projectID =newProjectID;
|
|
|
+ result = await model.create(file._doc);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+async function copyFeeRate(rootProjectID,userID,originalFeeRateFileID,feeRateFileID,newName) {//复制费率和费率文件
|
|
|
+ let [feeRateFile,feeRate] =await feeRate_facade.getFeeRateByID(originalFeeRateFileID);
|
|
|
+ let newFeeRateID = uuidV1();
|
|
|
+ if(feeRate){
|
|
|
+ feeRate._doc.ID = newFeeRateID;
|
|
|
+ await feeRateModel.create(feeRate._doc);
|
|
|
+ }
|
|
|
+ if(feeRateFile){
|
|
|
+ feeRateFile._doc.ID = feeRateFileID;
|
|
|
+ newName?feeRateFile._doc.name = newName:'';
|
|
|
+ feeRateFile._doc.userID = userID;
|
|
|
+ feeRateFile._doc.rootProjectID = rootProjectID;
|
|
|
+ feeRateFile._doc.feeRateID = newFeeRateID;
|
|
|
+ await feeRateFileModel.create(feeRateFile._doc);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function copyUnitPriceFile(newProjectID,rootProjectID,userID,originaluUnitPriceFileID,unitPriceFileID,newName) {//复制单价文件、组成物
|
|
|
+
|
|
|
+ let taskList = [
|
|
|
+ copyFile(newProjectID,rootProjectID,userID,originaluUnitPriceFileID,unitPriceFileID,newName),
|
|
|
+ copySubList(originaluUnitPriceFileID,unitPriceFileID,mixRatioModel),
|
|
|
+ copySubList(originaluUnitPriceFileID,unitPriceFileID,unitPriceModel)
|
|
|
+ ];
|
|
|
+
|
|
|
+ return await Promise.all(taskList);
|
|
|
+
|
|
|
+ async function copyFile(newProjectID,rootProjectID,userID,originaluUnitPriceFileID,unitPriceFileID,newName){
|
|
|
+ let unitPriceFile = await unitPriceFileModel.findOne({id:originaluUnitPriceFileID}, '-_id');
|
|
|
+ if(unitPriceFile){
|
|
|
+ unitPriceFile._doc.id = unitPriceFileID;
|
|
|
+ newName?unitPriceFile._doc.name = newName:'';
|
|
|
+ unitPriceFile._doc.project_id = newProjectID;
|
|
|
+ unitPriceFile._doc.user_id = userID;
|
|
|
+ unitPriceFile._doc.root_project_id = rootProjectID
|
|
|
+ }
|
|
|
+ await unitPriceFileModel.create(unitPriceFile._doc);
|
|
|
+ }
|
|
|
+
|
|
|
+ async function copySubList(srcFID,newFID,model) {
|
|
|
+ let mList = await model.find({unit_price_file_id: srcFID}, '-_id');
|
|
|
+ let rList = [];
|
|
|
+ for(let m of mList){
|
|
|
+ m._doc.unit_price_file_id = newFID;
|
|
|
+ m._doc.id = await getCounterID('mix_ratio');
|
|
|
+ rList.push(m._doc);
|
|
|
+ }
|
|
|
+ await insertMany(rList,model)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function copyInstallFee(originalPID,newProjectID) {
|
|
|
+ let result = null;
|
|
|
+ let installationFee = await installationFeeModel.find({projectID:originalPID}, '-_id');
|
|
|
+ let newList = [];
|
|
|
+ for(let i of installationFee ){
|
|
|
+ i._doc.ID = uuidV1();
|
|
|
+ i._doc.projectID = newProjectID;
|
|
|
+ newList.push(i._doc);
|
|
|
+ }
|
|
|
+ if(newList.length >0){
|
|
|
+ result = await installationFeeModel.insertMany(newList);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+async function copyRationSubList(originalPID,newProjectID,billIDMap,rationIDMap,projectGLJIDMap,model) {// 定额工料机,附注条件,工程量明细,定额安装增加费
|
|
|
+ let subList = await model.find({projectID:originalPID}, '-_id');
|
|
|
+ let newList =[];
|
|
|
+ for(let s of subList){
|
|
|
+ s._doc.ID = uuidV1();
|
|
|
+ s._doc.projectID = newProjectID;
|
|
|
+ s._doc.rationID&&rationIDMap[s._doc.rationID]?s._doc.rationID = rationIDMap[s._doc.rationID]:'';
|
|
|
+ s._doc.billID&&billIDMap[s._doc.billID]?s._doc.billID = billIDMap[s._doc.billID]:'';
|
|
|
+ s._doc.billsItemID&&billIDMap[s._doc.billsItemID]?s._doc.billsItemID = billIDMap[s._doc.billsItemID]:'';
|
|
|
+ s._doc.projectGLJID&&projectGLJIDMap[s._doc.projectGLJID]?s._doc.projectGLJID = projectGLJIDMap[s._doc.projectGLJID]:'';
|
|
|
+ newList.push(s._doc);
|
|
|
+ }
|
|
|
+ await insertMany(newList,model);
|
|
|
}
|
|
|
|
|
|
async function moveProject(data) {
|
|
@@ -194,8 +419,8 @@ async function getCounterID(collectionName){
|
|
|
async function insertMany(datas,model) {
|
|
|
while (datas.length>1000){//因为mongoose限制了批量插入的条数为1000.所以超出限制后需要分批插入
|
|
|
let newList = datas.splice(0,1000);//一次插入1000条
|
|
|
- model.insertMany(newList);
|
|
|
+ await model.insertMany(newList);
|
|
|
}
|
|
|
- model.insertMany(datas);
|
|
|
+ await model.insertMany(datas);
|
|
|
|
|
|
}
|