zhongzewei 6 سال پیش
والد
کامیت
85e9a4cda1
3فایلهای تغییر یافته به همراه80 افزوده شده و 5 حذف شده
  1. 2 0
      modules/all_models/compilation.js
  2. 3 1
      modules/pm/controllers/pm_controller.js
  3. 75 4
      modules/pm/facade/pm_facade.js

+ 2 - 0
modules/all_models/compilation.js

@@ -49,6 +49,8 @@ let modelSchema = {
     name: String,
     //描述
     description: String,
+    //例题
+    example: [],
     //代码覆盖路径
     overWriteUrl:String,
     // 创建时间

+ 3 - 1
modules/pm/controllers/pm_controller.js

@@ -259,7 +259,9 @@ module.exports = {
                 //拷贝补充定额模板数据
                 await sectionTreeDao.copyDataFromTemplate(request.session.sessionUser.id, compilationData._id);
                 //拷贝例题数据
-
+                if (sessionCompilation.example && sessionCompilation.example.length > 0) {
+                   await pm_facade.copyExample(request.session.sessionUser.id, sessionCompilation._id, sessionCompilation.example);
+                }
             }
         }
         // 清单计价

+ 75 - 4
modules/pm/facade/pm_facade.js

@@ -26,6 +26,7 @@ let quantityDetailModel = mongoose.model('quantity_detail');
 
 let featureLibModel =  mongoose.model("std_project_feature_lib");
 let scMathUtil = require('../../../public/scMathUtil').getUtil();
+let counter = require('../../../public/counter/counter');
 import CounterModel from "../../glj/models/counter_model";
 import moment from 'moment';
 import billsFlags from '../../common/const/bills_fixed';
@@ -41,6 +42,7 @@ const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
 module.exports={
     moveProject:moveProject,
     copyProject:copyProject,
+    copyExample: copyExample,
     getSummaryInfo: getSummaryInfo,
     getSummaryInfoByTender: getSummaryInfoByTender,
     getConstructionProject: getConstructionProject,
@@ -51,9 +53,78 @@ module.exports={
     isShare: isShare,
 };
 
-//拷贝父级项目
-async function copyParent(){
-
+//拷贝例题项目
+//@param {String}userID {Array}projIDs拷贝的例题项目ID(建设项目、文件夹)@return {Boolean}
+async function copyExample(userID, compilation, projIDs){
+    let allProjs = [],
+        IDMapping = {},
+        projMapping = {};
+    //例题项目不可为单项工程、单位工程、只能是建设项目、文件夹,否则不自动新建例题项目(这里不报错,让用户没有感觉)
+    let parentExample = await projectModel.find({ID: {$in: projIDs}, $or: notDeleted});
+    if (parentExample.length === 0) {
+        return false;
+    }
+    allProjs = allProjs.concat(parentExample);
+    for (let i = 0; i < parentExample.length; i++) {
+        let data = parentExample[i];
+        if (data.projType === projectType.tender || data.projType === projectType.engineering) {
+            return false;
+        }
+        //设置成顶节点,最后一个节点设置成末节
+        data.ParentID = -1;
+        if (i === parentExample.length - 1) {
+            data.NextSiblingID = -1;
+        }
+    }
+    //获取所有的子项目
+    let posterityProjs = await getPosterityProjects(projIDs);
+    allProjs = allProjs.concat(posterityProjs);
+    let projCounter = await counter.counterDAO.getIDAfterCountSync(counter.moduleName.project, allProjs.length);
+    //旧ID与新ID映射
+    for (let i = 0; i < allProjs.length; i++) {
+        let data = allProjs[i];
+        let newID = projCounter.sequence_value - (allProjs.length - 1) + i;
+        IDMapping[data.ID] = newID;
+        projMapping[newID] = data;
+    }
+    //return;
+    //设置新的树结构数据
+    let newDate = new Date(),
+        parentBulks = [];
+    for (let data of allProjs) {
+        let orgID = data.ID;
+        data.ID = IDMapping[data.ID];
+        data.ParentID = IDMapping[data.ParentID] ? IDMapping[data.ParentID] : -1;
+        data.NextSiblingID = IDMapping[data.NextSiblingID] ? IDMapping[data.NextSiblingID] : -1;
+        data.createDateTime = newDate;
+        data.userID = userID;
+        data.compilation = compilation;
+        data.shareInfo = [];
+        if (data.projType !== projectType.tender) {
+            let newData = _.cloneDeep(data._doc);
+            delete newData._id;
+          //  await projectModel.create(newData);
+            parentBulks.push({insertOne: {document: newData}});
+        } else {
+            //拷贝单位工程
+            let rootProjectID = projMapping[data.ParentID].ParentID;
+            let projectMap = {
+                copy: {
+                    document: {userID: userID, ID: orgID, NextSiblingID: data.NextSiblingID, ParentID: data.ParentID, name: data.name, shareInfo: [],
+                                compilation: compilation, fileVer: data.fileVer, projType: data.projType, property: {rootProjectID: rootProjectID}}
+                }
+            };
+            await copyProject(userID, compilation, {projectMap}, data.ID);
+        }
+    }
+    //最末顶层项目(兼容测试时已存在有项目,正常用户第一次进费用定额,该费用定额不存在项目)
+    let lastProj = await projectModel.findOne({userID: userID, compilation: compilation, ParentID: -1, NextSiblingID: -1, $or: notDeleted});
+    if (lastProj) {
+        parentBulks.push({updateOne: {filter: {ID: lastProj.ID}, update: {$set: {NextSiblingID: parentExample[0].ID}}}});
+    }
+    //拷贝父级文件
+    await projectModel.bulkWrite(parentBulks);
+    return true;
 }
 
 async function copyProject(userID, compilationID,data,newProjectID = null) {
@@ -733,7 +804,7 @@ async function getProjectFeature(libID,feeStandardName){
     }
 }
 
-//获取文件下所有子项目
+//获取projectIDs文件下所有子项目(不包括projectIDs本身)
 async function getPosterityProjects(projectIDs) {
     let rst = [];
     async function getProjects(IDs) {