|
@@ -17,6 +17,7 @@ module.exports={
|
|
|
getShareInfoMap,
|
|
|
getRecentShareList,
|
|
|
moveProject:moveProject,
|
|
|
+ accessToCopyProject,
|
|
|
copyProject:copyProject,
|
|
|
copyExample: copyExample,
|
|
|
setupSummaryFields: setupSummaryFields,
|
|
@@ -303,6 +304,7 @@ async function copyExample(userID, compilation, projIDs){
|
|
|
//设置新的树结构数据
|
|
|
let newDate = new Date(),
|
|
|
parentBulks = [];
|
|
|
+ const projectMaps = [];
|
|
|
for (let data of allProjs) {
|
|
|
let orgID = data.ID;
|
|
|
data.ID = IDMapping[data.ID];
|
|
@@ -326,7 +328,8 @@ async function copyExample(userID, compilation, projIDs){
|
|
|
compilation: compilation, fileVer: data.fileVer, projType: data.projType, property: {rootProjectID: rootProjectID}}
|
|
|
}
|
|
|
};
|
|
|
- await copyProject(userID, compilation, {projectMap}, data.ID);
|
|
|
+ await copyProject(userID, compilation, {projectMap}, data.ID, true);
|
|
|
+ projectMaps.push(projectMap);
|
|
|
}
|
|
|
}
|
|
|
//最末顶层项目(兼容测试时已存在有项目,正常用户第一次进费用定额,该费用定额不存在项目)
|
|
@@ -334,12 +337,40 @@ async function copyExample(userID, compilation, projIDs){
|
|
|
if (lastProj) {
|
|
|
parentBulks.push({updateOne: {filter: {ID: lastProj.ID}, update: {$set: {NextSiblingID: parentExample[0].ID}}}});
|
|
|
}
|
|
|
- //拷贝父级文件
|
|
|
- await projectModel.bulkWrite(parentBulks);
|
|
|
+ // 处理项目数据
|
|
|
+ const projectTasks = [projectModel.bulkWrite(parentBulks), createProject(projectMaps)];
|
|
|
+ await Promise.all(projectTasks);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-async function copyProject(userID, compilationID,data,newProjectID = null) {
|
|
|
+async function accessToCopyProject(userID, compilationID, data, newProjectID) {
|
|
|
+ const logData = {
|
|
|
+ key: uuidV1(),
|
|
|
+ content: '正在拷贝项目,请稍候……',
|
|
|
+ userID,
|
|
|
+ compilationID,
|
|
|
+ status: 'start',
|
|
|
+ create_time: +new Date()
|
|
|
+ };
|
|
|
+ await importLogsModel.create(logData);
|
|
|
+ handleCopyProject(logData.key, userID, compilationID,data,newProjectID);
|
|
|
+ return 'copying project';
|
|
|
+}
|
|
|
+
|
|
|
+async function handleCopyProject(key, userID, compilationID, data, newProjectID) {
|
|
|
+ const doc = { status: 'finish' };
|
|
|
+ try {
|
|
|
+ const projectMap = await copyProject(userID, compilationID, data, newProjectID);
|
|
|
+ doc.projectID = projectMap.copy.document.ID;
|
|
|
+ } catch (err) {
|
|
|
+ doc.status = 'error';
|
|
|
+ doc.errorMsg = String(err);
|
|
|
+ } finally {
|
|
|
+ await importLogsModel.update({ key }, doc);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function copyProject(userID, compilationID,data,newProjectID = null, delayProjectTask = false) {
|
|
|
let projectMap = data.projectMap;
|
|
|
let originalID = projectMap['copy'].document.ID;
|
|
|
if (!newProjectID) {
|
|
@@ -400,7 +431,6 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
|
|
|
let [billMap,rationMap,projectGLJMap] = await Promise.all(IDtasks);
|
|
|
//所有复制任务异步处理,提升效率 复制清单,定额,4个文件,项目工料机, 定额工料机,人工系数,工程量明细,定额安装增加费,安装增加费
|
|
|
let copyTasks = [
|
|
|
- createProject(projectMap),
|
|
|
copyProjectSetting(originalID,newProjectID),
|
|
|
copyBills(newProjectID,billMap),
|
|
|
copyRations(newProjectID,billMap.uuidMaping,rationMap,projectGLJMap.IDMap),
|
|
@@ -427,8 +457,15 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
|
|
|
if(originalProperty.unitPriceFile){
|
|
|
copyTasks.push(copyUnitPriceFile(newProjectID,originalProperty.rootProjectID,userID,originalProperty.unitPriceFile.id,unitPriceFileID,newUnitName));
|
|
|
}
|
|
|
- let p = await Promise.all(copyTasks);
|
|
|
- return p[0];
|
|
|
+ await Promise.all(copyTasks);
|
|
|
+ // 最后再处理项目数据
|
|
|
+ // 可能会有最后再在外层方法插入项目数据的需求,如拷贝例题,暂时先不在这里插入项目数据
|
|
|
+ if (delayProjectTask) {
|
|
|
+ return [projectMap];
|
|
|
+ } else {
|
|
|
+ const projectMaps = await createProject([projectMap]);
|
|
|
+ return projectMaps[0];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
async function createIDsAndReturn(originalID,model) {
|
|
@@ -461,14 +498,16 @@ async function getProjectGLJIDAndReturn(originalID,newProjectID) {
|
|
|
return{IDMap:IDMap,datas:datas};
|
|
|
}
|
|
|
|
|
|
-async function createProject(projectMap) {//复制项目
|
|
|
+async function createProject(projectMaps) {//复制项目
|
|
|
let tasks = [];
|
|
|
- if(projectMap['update']){//如果复制后存在前一个节点,则更新其NextSiblingID
|
|
|
- tasks.push({updateOne:{filter : projectMap['update'].query, update : {NextSiblingID:projectMap['copy'].document.ID}}});
|
|
|
+ for (const projectMap of projectMaps) {
|
|
|
+ if(projectMap['update']){//如果复制后存在前一个节点,则更新其NextSiblingID
|
|
|
+ tasks.push({updateOne:{filter : projectMap['update'].query, update : {NextSiblingID:projectMap['copy'].document.ID}}});
|
|
|
+ }
|
|
|
+ tasks.push({insertOne: {document: projectMap['copy'].document}});//复制任务
|
|
|
}
|
|
|
- tasks.push({insertOne: {document: projectMap['copy'].document}});//复制任务
|
|
|
await projectModel.bulkWrite(tasks);
|
|
|
- return projectMap;
|
|
|
+ return projectMaps;
|
|
|
}
|
|
|
|
|
|
async function copyProjectSetting(originalID,newProjectID) {
|
|
@@ -1446,7 +1485,9 @@ async function importChongqingProject(data) {
|
|
|
|
|
|
let log_data = {
|
|
|
key:data.key,
|
|
|
+ content: '正在导入例题,请稍候……',
|
|
|
userID:data.user_id,
|
|
|
+ compilationID: data.session.sessionCompilation._id,
|
|
|
status:"start",
|
|
|
create_time:+new Date()
|
|
|
};
|
|
@@ -1473,21 +1514,44 @@ async function importChongqingProject(data) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+function testTimeout(time) {
|
|
|
+ return new Promise(resolve => setTimeout(resolve, time));
|
|
|
+}
|
|
|
|
|
|
//用户第一次进入费用定额的数据准备
|
|
|
async function prepareInitialData(userId, compilation, example) {
|
|
|
let first = await isFirst(userId, compilation);
|
|
|
if (first) {
|
|
|
await updateUsedList(userId, compilation);
|
|
|
- let prepareTask = [
|
|
|
- copyCompleRationSection(userId, compilation),
|
|
|
- copyCompleGljSection(userId, compilation)
|
|
|
- ];
|
|
|
- if (example && example.length > 0) {
|
|
|
- prepareTask.push(copyExample(userId, compilation, example));
|
|
|
+ const logData = {
|
|
|
+ key: uuidV1(),
|
|
|
+ content: '正在加载例题,请稍候……',
|
|
|
+ userID: userId,
|
|
|
+ compilationID: compilation,
|
|
|
+ status: 'start',
|
|
|
+ create_time: +new Date()
|
|
|
+ };
|
|
|
+ await importLogsModel.create(logData);
|
|
|
+ initData(logData.key, userId, compilation, example);
|
|
|
+ return 'start prepareInitialData';
|
|
|
+ }
|
|
|
+ async function initData(key, userId, compilation, example) {
|
|
|
+ const doc = { status: 'finish' };
|
|
|
+ try {
|
|
|
+ let prepareTask = [
|
|
|
+ copyCompleRationSection(userId, compilation),
|
|
|
+ copyCompleGljSection(userId, compilation)
|
|
|
+ ];
|
|
|
+ if (example && example.length > 0) {
|
|
|
+ prepareTask.push(copyExample(userId, compilation, example));
|
|
|
+ }
|
|
|
+ await Promise.all(prepareTask);
|
|
|
+ } catch (error) {
|
|
|
+ doc.errorMsg = '加载例题失败,请检查例题项目是否存在!';
|
|
|
+ doc.status = 'error';
|
|
|
+ } finally {
|
|
|
+ await importLogsModel.update({ key }, doc);
|
|
|
}
|
|
|
- await Promise.all(prepareTask);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1502,6 +1566,11 @@ async function copyCompleRationSection(userId, compilationId) {
|
|
|
|
|
|
//拷贝补充人材机分类树
|
|
|
async function copyCompleGljSection(userId, compilationId) {
|
|
|
+ // 如果已有数据则不再生成
|
|
|
+ const count = await compleGljSectionModel.count({userId, compilationId});
|
|
|
+ if (count) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
let templateData = await compleGljSectionTModel.find({compilationId: compilationId});
|
|
|
if (templateData.length > 0) {
|
|
|
let insertDatas = [],
|
|
@@ -1700,6 +1769,8 @@ async function importProject(importObj, userID, compilationID) {
|
|
|
if (bulks.length > 0) {
|
|
|
await projectModel.bulkWrite(bulks);
|
|
|
}
|
|
|
+ return importObj.ID; // 返回建设项目ID
|
|
|
+ // TODO 删除
|
|
|
let summaryInfo = await getSummaryInfo([importObj.ID]);
|
|
|
//设置汇总字段
|
|
|
for(let proj of toInsertProjects){
|
|
@@ -2100,7 +2171,9 @@ async function downLoadProjectFile(info) {
|
|
|
console.log(privateDownloadUrl);
|
|
|
let data = {
|
|
|
key:info.key,
|
|
|
+ content: '正在导入建设项目,请稍候……',
|
|
|
userID:info.session.sessionUser.id,
|
|
|
+ compilationID: info.session.sessionCompilation._id,
|
|
|
status:"start",
|
|
|
create_time:+new Date()
|
|
|
};
|
|
@@ -2135,28 +2208,31 @@ async function doDownLoadAndImport(privateDownloadUrl,info) {
|
|
|
|
|
|
async function importProcessChecking(data){
|
|
|
let result = {error:0};
|
|
|
- let log = await importLogsModel.findOne({key:data.key});
|
|
|
+ const query = data.key ? { key: data.key } : { userID: data.userID, compilationID: data.compilationID };
|
|
|
+ let log = await importLogsModel.findOne(query);
|
|
|
if(log){
|
|
|
if(log.status == "finish"){
|
|
|
result.status = "complete";
|
|
|
- await importLogsModel.remove({key:data.key});
|
|
|
+ await importLogsModel.remove(query);
|
|
|
// 获取导入的项目数据
|
|
|
if (log.projectID) {
|
|
|
const projects = await getPosterityProjects([log.projectID], true);
|
|
|
- const summaryInfo = await getSummaryInfo([log.projectID]);
|
|
|
- setupSummaryFields(summaryInfo, projects);
|
|
|
+ if (!(projects.length === 1 && projects[0].projType === projectType.tender)) { // 处理的是建设项目数据
|
|
|
+ const summaryInfo = await getSummaryInfo([log.projectID]);
|
|
|
+ setupSummaryFields(summaryInfo, projects);
|
|
|
+ }
|
|
|
result.data = projects;
|
|
|
}
|
|
|
}else if(log.status == "start"){
|
|
|
result.status = "processing";
|
|
|
+ result.content = log.content;
|
|
|
}else if(log.status == "error"){
|
|
|
result.error = 1;
|
|
|
result.msg = log.errorMsg;
|
|
|
- await importLogsModel.remove({key:data.key});
|
|
|
+ await importLogsModel.remove(query);
|
|
|
}
|
|
|
}else {
|
|
|
- result.error = 1;
|
|
|
- result.msg = `导入过程中发生错误!`;
|
|
|
+ result.status = "complete";
|
|
|
}
|
|
|
return result;
|
|
|
|
|
@@ -2187,6 +2263,53 @@ async function downloadFileSync(key) {
|
|
|
|
|
|
// 导入接口
|
|
|
async function importInterface(key, session) {
|
|
|
+ const logData = {
|
|
|
+ key: key,
|
|
|
+ content: '正在导入接口文件,请稍候……',
|
|
|
+ userID: session.sessionUser.id,
|
|
|
+ compilationID: session.sessionCompilation._id,
|
|
|
+ status: 'start',
|
|
|
+ create_time: +new Date()
|
|
|
+ };
|
|
|
+ await importLogsModel.create(logData);
|
|
|
+ handleImportInterface(key, session);
|
|
|
+ return 'importing interface';
|
|
|
+}
|
|
|
+
|
|
|
+async function handleImportInterface(key, session) {
|
|
|
+ const doc = { status: 'finish' };
|
|
|
+ // 源文件内容文本
|
|
|
+ let downloadFilePath = '';
|
|
|
+ try {
|
|
|
+ const { path, srcData } = await downloadFileSync(key);
|
|
|
+ downloadFilePath = path;
|
|
|
+ if (!srcData) {
|
|
|
+ throw '无有效数据';
|
|
|
+ }
|
|
|
+ const userID = session.sessionUser.id;
|
|
|
+ const compilationID = session.sessionCompilation._id;
|
|
|
+ const importData = JSON.parse(srcData);
|
|
|
+ let tenderCount = 0;
|
|
|
+ importData.engs.forEach(eng => {
|
|
|
+ eng.tenders.forEach(() => {
|
|
|
+ tenderCount += 1;
|
|
|
+ });
|
|
|
+ });
|
|
|
+ if (await isTenderOverrun(tenderCount, session)) {
|
|
|
+ throw '您创建的项目个数超限,请联系我们的客服人员,或者导出建设项目保存到本地备份,删除云上数据。';
|
|
|
+ }
|
|
|
+ const projectID = await importProject(importData, userID, compilationID);
|
|
|
+ doc.projectID = projectID;
|
|
|
+ } catch (err) {
|
|
|
+ doc.errorMsg = typeof err === 'string' ? err : '导入接口失败,请检查接口文件!';
|
|
|
+ doc.status = 'error';
|
|
|
+ } finally {
|
|
|
+ await importLogsModel.update({ key }, doc);
|
|
|
+ fs.unlinkSync(downloadFilePath);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* async function importInterface(key, session) {
|
|
|
// 源文件内容文本
|
|
|
let downloadFilePath = '';
|
|
|
try {
|
|
@@ -2214,7 +2337,7 @@ async function importInterface(key, session) {
|
|
|
} finally {
|
|
|
fs.unlinkSync(downloadFilePath);
|
|
|
}
|
|
|
-}
|
|
|
+} */
|
|
|
|
|
|
async function importProjects(data,req,updateData) {
|
|
|
let result = {error:0};
|