| 
					
				 | 
			
			
				@@ -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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |