|
@@ -17,6 +17,7 @@ module.exports={
|
|
|
getShareInfoMap,
|
|
getShareInfoMap,
|
|
|
getRecentShareList,
|
|
getRecentShareList,
|
|
|
moveProject:moveProject,
|
|
moveProject:moveProject,
|
|
|
|
|
+ accessToCopyProject,
|
|
|
copyProject:copyProject,
|
|
copyProject:copyProject,
|
|
|
copyExample: copyExample,
|
|
copyExample: copyExample,
|
|
|
setupSummaryFields: setupSummaryFields,
|
|
setupSummaryFields: setupSummaryFields,
|
|
@@ -279,6 +280,7 @@ async function copyExample(userID, compilation, projIDs){
|
|
|
//设置新的树结构数据
|
|
//设置新的树结构数据
|
|
|
let newDate = new Date(),
|
|
let newDate = new Date(),
|
|
|
parentBulks = [];
|
|
parentBulks = [];
|
|
|
|
|
+ const projectMaps = [];
|
|
|
for (let data of allProjs) {
|
|
for (let data of allProjs) {
|
|
|
let orgID = data.ID;
|
|
let orgID = data.ID;
|
|
|
data.ID = IDMapping[data.ID];
|
|
data.ID = IDMapping[data.ID];
|
|
@@ -302,7 +304,8 @@ async function copyExample(userID, compilation, projIDs){
|
|
|
compilation: compilation, fileVer: data.fileVer, projType: data.projType, property: {rootProjectID: rootProjectID}}
|
|
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);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
//最末顶层项目(兼容测试时已存在有项目,正常用户第一次进费用定额,该费用定额不存在项目)
|
|
//最末顶层项目(兼容测试时已存在有项目,正常用户第一次进费用定额,该费用定额不存在项目)
|
|
@@ -310,12 +313,40 @@ async function copyExample(userID, compilation, projIDs){
|
|
|
if (lastProj) {
|
|
if (lastProj) {
|
|
|
parentBulks.push({updateOne: {filter: {ID: lastProj.ID}, update: {$set: {NextSiblingID: parentExample[0].ID}}}});
|
|
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;
|
|
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 projectMap = data.projectMap;
|
|
|
let originalID = projectMap['copy'].document.ID;
|
|
let originalID = projectMap['copy'].document.ID;
|
|
|
if (!newProjectID) {
|
|
if (!newProjectID) {
|
|
@@ -376,7 +407,6 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
|
|
|
let [billMap,rationMap,projectGLJMap] = await Promise.all(IDtasks);
|
|
let [billMap,rationMap,projectGLJMap] = await Promise.all(IDtasks);
|
|
|
//所有复制任务异步处理,提升效率 复制清单,定额,4个文件,项目工料机, 定额工料机,人工系数,工程量明细,定额安装增加费,安装增加费
|
|
//所有复制任务异步处理,提升效率 复制清单,定额,4个文件,项目工料机, 定额工料机,人工系数,工程量明细,定额安装增加费,安装增加费
|
|
|
let copyTasks = [
|
|
let copyTasks = [
|
|
|
- createProject(projectMap),
|
|
|
|
|
copyProjectSetting(originalID,newProjectID),
|
|
copyProjectSetting(originalID,newProjectID),
|
|
|
copyBills(newProjectID,billMap),
|
|
copyBills(newProjectID,billMap),
|
|
|
copyRations(newProjectID,billMap.uuidMaping,rationMap,projectGLJMap.IDMap),
|
|
copyRations(newProjectID,billMap.uuidMaping,rationMap,projectGLJMap.IDMap),
|
|
@@ -400,8 +430,15 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
|
|
|
if(originalProperty.unitPriceFile){
|
|
if(originalProperty.unitPriceFile){
|
|
|
copyTasks.push(copyUnitPriceFile(newProjectID,originalProperty.rootProjectID,userID,originalProperty.unitPriceFile.id,unitPriceFileID,newUnitName));
|
|
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) {
|
|
async function createIDsAndReturn(originalID,model) {
|
|
@@ -434,14 +471,16 @@ async function getProjectGLJIDAndReturn(originalID,newProjectID) {
|
|
|
return{IDMap:IDMap,datas:datas};
|
|
return{IDMap:IDMap,datas:datas};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-async function createProject(projectMap) {//复制项目
|
|
|
|
|
|
|
+async function createProject(projectMaps) {//复制项目
|
|
|
let tasks = [];
|
|
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);
|
|
await projectModel.bulkWrite(tasks);
|
|
|
- return projectMap;
|
|
|
|
|
|
|
+ return projectMaps;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function copyProjectSetting(originalID,newProjectID) {
|
|
async function copyProjectSetting(originalID,newProjectID) {
|
|
@@ -1164,19 +1203,44 @@ async function isFirst(userId, compilationId) {
|
|
|
return isFirst;
|
|
return isFirst;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function testTimeout(time) {
|
|
|
|
|
+ return new Promise(resolve => setTimeout(resolve, time));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
//用户第一次进入费用定额的数据准备
|
|
//用户第一次进入费用定额的数据准备
|
|
|
async function prepareInitialData(userId, compilation, example) {
|
|
async function prepareInitialData(userId, compilation, example) {
|
|
|
let first = await isFirst(userId, compilation);
|
|
let first = await isFirst(userId, compilation);
|
|
|
if (first) {
|
|
if (first) {
|
|
|
await updateUsedList(userId, compilation);
|
|
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);
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1339,7 +1403,9 @@ async function downLoadProjectFile(info) {
|
|
|
|
|
|
|
|
let data = {
|
|
let data = {
|
|
|
key:info.key,
|
|
key:info.key,
|
|
|
|
|
+ content: '正在导入建设项目,请稍候……',
|
|
|
userID:info.session.sessionUser.id,
|
|
userID:info.session.sessionUser.id,
|
|
|
|
|
+ compilationID: info.session.sessionCompilation._id,
|
|
|
status:"start",
|
|
status:"start",
|
|
|
create_time:+new Date()
|
|
create_time:+new Date()
|
|
|
};
|
|
};
|
|
@@ -1375,28 +1441,31 @@ async function doDownLoadAndImport(privateDownloadUrl,info) {
|
|
|
|
|
|
|
|
async function importProcessChecking(data){
|
|
async function importProcessChecking(data){
|
|
|
let result = {error:0};
|
|
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){
|
|
|
if(log.status == "finish"){
|
|
if(log.status == "finish"){
|
|
|
result.status = "complete";
|
|
result.status = "complete";
|
|
|
- await importLogsModel.remove({key:data.key});
|
|
|
|
|
|
|
+ await importLogsModel.remove(query);
|
|
|
// 获取导入的项目数据
|
|
// 获取导入的项目数据
|
|
|
if (log.projectID) {
|
|
if (log.projectID) {
|
|
|
const projects = await getPosterityProjects([log.projectID], true);
|
|
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;
|
|
result.data = projects;
|
|
|
}
|
|
}
|
|
|
}else if(log.status == "start"){
|
|
}else if(log.status == "start"){
|
|
|
result.status = "processing";
|
|
result.status = "processing";
|
|
|
|
|
+ result.content = log.content;
|
|
|
}else if(log.status == "error"){
|
|
}else if(log.status == "error"){
|
|
|
result.error = 1;
|
|
result.error = 1;
|
|
|
result.msg = log.errorMsg;
|
|
result.msg = log.errorMsg;
|
|
|
- await importLogsModel.remove({key:data.key});
|
|
|
|
|
|
|
+ await importLogsModel.remove(query);
|
|
|
}
|
|
}
|
|
|
}else {
|
|
}else {
|
|
|
- result.error = 1;
|
|
|
|
|
- result.msg = `导入过程中发生错误!`;
|
|
|
|
|
|
|
+ result.status = "complete";
|
|
|
}
|
|
}
|
|
|
return result;
|
|
return result;
|
|
|
|
|
|