zhangweicheng hace 5 años
padre
commit
ec555d1f4c

+ 4 - 0
modules/import/controllers/import_controller.js

@@ -11,6 +11,10 @@ let controller = {
         let data = req.body;
         return await pm_facade.downLoadProjectFile(data);
     },
+    copyConstructionProject:async function(req){
+      let data = req.body;
+      return await pm_facade.copyConstructionProject(data);
+    },
     prepareInitialData: async function(req) {
         const data = req.body;
         return await pm_facade.prepareInitialData(data.userID, data.compilationID, data.example);

+ 1 - 0
modules/import/routes/import_route.js

@@ -9,6 +9,7 @@ module.exports = function (app) {
     importRouter.post('/importProject',importController.action);
     importRouter.post('/exportProject',importController.action);
     importRouter.post('/copyProject',importController.action);
+    importRouter.post('/copyConstructionProject',importController.action);
     importRouter.post('/prepareInitialData',importController.action);
     importRouter.get('/test',function (req,res) {
         res.json("hello word");

+ 15 - 0
modules/pm/controllers/pm_controller.js

@@ -870,6 +870,21 @@ module.exports = {
         }
         res.json(result);
     },
+    copyConstructionProject: async function (req, res) {
+      let data = JSON.parse(req.body.data);
+      let result = {
+          error: 0
+      };
+      try {
+          data.session = req.session;
+          result.data = await redirectToImportServer(data, "copyConstructionProject", req);
+      } catch (err) {
+          console.log(err);
+          result.error = 1;
+          result.message = err.message;
+      }
+      res.json(result);
+    },
     importProcessChecking:async function (req,res) {
         let result={
             error:0

+ 36 - 1
modules/pm/facade/pm_facade.js

@@ -48,6 +48,7 @@ module.exports={
     uploadToken:uploadToken,
     downLoadProjectFile:downLoadProjectFile,
     importProcessChecking:importProcessChecking,
+    copyConstructionProject,
     isTenderOverrun,
     getWelcomeInfo:getWelcomeInfo
 };
@@ -417,7 +418,7 @@ async function getShareInfoAfterChangePermission(permissionType, receiver, proje
 
 //拷贝例题项目
 //@param {String}userID {Array}projIDs拷贝的例题项目ID(建设项目、文件夹)@return {Boolean}
-async function copyExample(userID, compilation, projIDs){
+async function copyExample(userID, compilation, projIDs,nameMap){
     let allProjs = [],
         IDMapping = {},
         projMapping = {};
@@ -437,6 +438,7 @@ async function copyExample(userID, compilation, projIDs){
         if (i === parentExample.length - 1) {
             data.NextSiblingID = -1;
         }
+        if(nameMap && nameMap[data.ID]) data.name = nameMap[data.ID];
     }
     //获取所有的子项目
     let posterityProjs = await getPosterityProjects(projIDs);
@@ -1682,6 +1684,39 @@ async function importProcessChecking(data){
 
 }
 
+async function copyConstructionProject(data){
+  let log_data = {
+    key:data.key,
+    content: '正在复制建设项目,请稍候……',
+    userID:data.user_id,
+    compilationID: data.session.sessionCompilation._id,
+    status:"start",
+    create_time:+new Date()
+  };
+
+  await importLogsModel.create(log_data);
+  doCopy(data.user_id,data.session.sessionCompilation._id,data.projectID,data.newName,data.key);
+
+  return "start copy";
+  async function doCopy(user_id,compilationId,projectID,newName,key) {
+      let doc = {status:"finish"};
+      try {
+          let nameMap={};
+          nameMap[projectID] = newName
+          let r = await copyExample(user_id,compilationId,[projectID],nameMap);
+          if(r == false){
+              doc.errorMsg = "复制失败,请检查项目是否存在!";
+              doc.status = "error";
+          }
+      }catch (error){
+          console.log(error);
+          doc.errorMsg = "复制失败,请检查项目是否存在!";
+          doc.status = "error";
+      }finally {
+          await importLogsModel.update({key:key},doc);
+      }
+  }
+}
 
 async function importProject(data,req,updateData) {
     let result = {error:0};

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -65,6 +65,7 @@ module.exports = function (app) {
     pmRouter.post('/changeFile', pmController.changeFile);
     pmRouter.post('/exportProject', pmController.exportProject);
     pmRouter.post('/importProject', pmController.importProject);
+    pmRouter.post('/copyConstructionProject',systemMiddleware.tenderNumberChecking,pmController.copyConstructionProject);
     pmRouter.post('/importProcessChecking', pmController.importProcessChecking);
 
 

+ 39 - 2
web/building_saas/pm/js/pm_share.js

@@ -445,7 +445,7 @@ const pmShare = (function () {
             let node = tree.items[options.row];
             // Draw Text
             GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
-            if (node && node.data.projType === projectType.tender) {
+            if (node && node.data.projType === projectType.tender||node.data.projType === projectType.project) {
                 let text = options.sheet.getText(options.row, options.col);
                 let acStyle = options.sheet.getActualStyle(options.row, options.col),
                     zoom = options.sheet.zoom();
@@ -732,6 +732,7 @@ const pmShare = (function () {
         //data.allowCopy与shareInfo里allowCopy的区别:
         //data.allowCopy为该单位实际的权限(跟着最新的分享信息走,可能随着父项)
         for (let data of datas) {
+            if($(".p-title").text().includes('专业') && data.projType == projectType.project) data.allowCopy = isAllowCopy(userID, data); //20200715 专业版要求能复制建设项目
             if (data.projType === projectType.tender) {
                 data.allowCopy = isAllowCopy(userID, data);
                 data.allowCooperate = isAllowCoop(userID, data);
@@ -782,12 +783,23 @@ const pmShare = (function () {
                     icon: 'fa-copy',
                     disabled: function () {
                         let selected = tree.selected;
-                        return !(selected && selected.data.allowCopy);
+                        return !(selected && selected.data.allowCopy && selected.data.projType === projectType.tender);
                     },
                     callback: function (key, opt) {
                         $('#copyShare').modal('show');
                     }
                 },
+                "copyProject": {
+                  name: "拷贝建设项目",
+                  icon: 'fa-copy',
+                  disabled: function () {
+                      let selected = tree.selected;
+                      return !($(".p-title").text().includes('专业')&&selected && selected.data.allowCopy && selected.data.projType === projectType.project);
+                  },
+                  callback: function (key, opt) {
+                      copyContructionProject(tree.selected);
+                  }
+                },
                 "cancel": {
                     name: "清除",
                     icon: 'fa-remove',
@@ -928,6 +940,31 @@ const pmShare = (function () {
             alert(err);
         }
     }
+    //拷贝分享的建设项目
+    //@param {Object}selected 
+    async function copyContructionProject(selected){
+      try {
+        let newName = getCopyName(selected);
+        //获取单项工程的单位工程
+        let projectQuery = {$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], userID: userID,projType: "Project"};
+        const rstData = await ajaxPost('/pm/api/getProjectsByQuery', {user_id: userID, query: projectQuery, options: '-_id -property'}, false, 10000);
+        for(let project of rstData){
+            if(project.name === newName){
+                alert("已存在此建设项目");
+                return;
+            }
+        }
+        let tenderCount = 0;
+        if(selected.children) tenderCount = selected.children.length;
+        let key = uuid.v1();
+        $.bootstrapLoading.progressStart('拷贝建设项目', true);
+        $("#progress_modal_body").text('正在拷贝建设项目,请稍候……');
+        await ajaxPost('/pm/api/copyConstructionProject', {user_id: userID, tenderCount: tenderCount,key:key,projectID:selected.data.actualTreeInfo.ID,newName:newName});
+        importProcessChecking(key, null, projTreeObj.emitTreeChange);
+      } catch (error) {
+        console.log(error);
+      }
+    }
     //获取拷贝后的名称
     //@param {Object}node @return {String}
     function getCopyName(node) {