Parcourir la source

任务关联望岳

wangziqian il y a 4 ans
Parent
commit
c41daace73

+ 24 - 2
src/views/projectManage/taskList/components/scheduleList.vue

@@ -66,10 +66,12 @@
             title="关联的任务"
             width="450"
             trigger="click"
+            popper-class="synchronize"
           >
+            <div class="blueStr" />
             <div class="task-object-list">
               <template v-for="(item,index) in scope.row.taskObjectList">
-                <div v-if="index<5" :key="'task-object'+index" class="task-item">
+                <div v-if="index<5" :key="'task-object'+index" class="task-item" @click="link(item.id)">
                   <span class="item-id">{{ item.taskId }}</span>
                   <span class="item-name">{{ item.name }}</span>
                   <span>{{ item.moduleInfoName }}</span>
@@ -235,6 +237,10 @@ export default {
       this.DialogTitle = '编辑排期'
       this.visibleSchedule = true
       this.detailData = row
+    },
+    link(id) {
+      const newTab = this.$router.resolve({ name: '任务详情', query: { id: id }})
+      window.open(newTab.href, '_blank')
     }
   }
 }
@@ -303,6 +309,7 @@ export default {
     width: 100%;
     white-space: nowrap;
     color: #999999;
+    margin-bottom: 5px;
     .item-id {
       padding-right: 20px;
     }
@@ -316,7 +323,22 @@ export default {
   display: none;
 }
 </style>
-<style>
+<style lang="scss">
+.synchronize {
+  .el-popover__title {
+    color: #333333;
+    padding: 10px 20px;
+  }
+}
+.blueStr {
+  width:4px;
+  height:17px;
+  background:#409EFF;
+  border-radius:1px;
+  position: absolute;
+  top: 22px;
+  left: 15px;
+}
 .el-tooltip__popper.is-dark {
   background:rgba(121,132,150,0.8);
   color: #FFF;

+ 14 - 1
src/views/projectManage/taskList/dialog/synchronizeDialog.vue

@@ -1,6 +1,7 @@
 <template>
   <normal-dialog
     :show-dialog.sync="show"
+    :is-default-close="false"
     title="同步排期至望月"
     width="40%"
     @confirm="confirmForm()"
@@ -25,6 +26,7 @@
 <script>
 import normalDialog from '@/components/dialog/normalDialog'
 import { showRelatedDpmTask } from '@/api/taskIndex'
+import { taskSyncScheduleToDpm } from '@/api/requirement'
 export default {
   components: {
     normalDialog
@@ -80,8 +82,19 @@ export default {
         this.taskObjectList = res.data
       }
     },
+    async taskSyncScheduleToDpm() {
+      const params = {
+        id: this.id
+      }
+      const res = await taskSyncScheduleToDpm(params)
+      if (res.code === 200) {
+        this.$message({ message: '同步成功', type: 'success', duration: 1000, offset: 150 })
+        this.cancel()
+        this.$emit('change')
+      }
+    },
     confirmForm() {
-
+      this.taskSyncScheduleToDpm()
     },
     cancel() {
       this.show = false

+ 90 - 8
src/views/projectManage/taskList/taskViewDetail.vue

@@ -18,9 +18,23 @@
           <div class="header-title">
             <span class="title-id">
               TASK-{{ form_query.id }}
-              <el-tooltip v-if="form_query.relatedDpmTaskInfo" class="item" effect="dark" :content="`【${form_query.relatedDpmTaskInfo.taskId}】【${form_query.relatedDpmTaskInfo.name}】`" placement="top">
-                <img src="@/assets/home_images/WX20200914-141851@2x.png" @click="dpmUrl(form_query.dpmUrl)">
+              <el-tooltip v-if="form_query.isDirectlyFromDpm === 0 || form_query.isDirectlyFromDpm === 1" class="item" effect="dark" :content="`【${form_query.relatedDpmTaskInfo.taskId}】【${form_query.relatedDpmTaskInfo.name}】`" placement="top">
+                <span class="synchronize-icon">
+                  <img src="@/assets/home_images/WX20200914-141851@2x.png" @click="dpmUrl(form_query.dpmUrl)">
+                  <i v-if="form_query.isDirectlyFromDpm === 0" class="el-icon-circle-close sty-icon" @click="deleteDpl()" />
+                </span>
               </el-tooltip>
+              <el-popover v-if="form_query.isDirectlyFromDpm === -1" placement="bottom" title="关联望岳任务" width="400" trigger="click" popper-class="synchronize">
+                <div class="blueStr" />
+                <div class="task-object-list">
+                  <div v-for="(item, index) in dplOption" :key="index" class="task-item" @click="synchronize(item.id)">
+                    <span>{{ item.moduleInfoName }}</span>
+                    <span class="item-name">{{ item.name }}</span>
+                    <span class="item-id">{{ item.taskId }}</span>
+                  </div>
+                </div>
+                <el-button v-if="form_query.isDirectlyFromDpm === -1" slot="reference" size="mini" type="text" @click.once="getDplList(taskId)">关联望岳</el-button>
+              </el-popover>
             </span>
             <el-tooltip class="item" effect="dark" :content="form_query.name" placement="bottom">
               <span
@@ -329,6 +343,7 @@
         :id="taskId"
         :data="form_query.relatedDpmTaskInfo"
         :visible.sync="synchronizeDialog"
+        @change="taskGet()"
       />
       <!-- 同步望月 -->
       <drawer
@@ -365,7 +380,7 @@ import {
   scheduleGetTaskScheduleHistory
 } from '@/api/taskIndex'
 import { listByTask } from '@/api/projectViewDetails'
-import { projectListProject, scheduleGetHistoryScheduleById } from '@/api/requirement.js'
+import { projectListProject, scheduleGetHistoryScheduleById, taskListAvailableDpmTask, taskSetTaskRelated, taskDeleteRelationship } from '@/api/requirement.js'
 import searchPeople from '@/components/select/searchPeople'
 import textArea from '@/components/input/textArea'
 import drawer from '@/views/projectManage/Drawer'
@@ -470,7 +485,8 @@ export default {
       commentContent: null, // 评论内容
       comments: [], // 评论列表
       taskIds: '', // 将要修改状态的任务id
-      synchronizeDialog: false // 同步任务至望月弹框
+      synchronizeDialog: false, // 同步任务至望月弹框
+      dplOption: [] // 关联的望岳任务
     }
   },
   computed: {
@@ -773,6 +789,26 @@ export default {
     },
     dpmUrl(url) {
       window.open(url, '_blank')
+    },
+    async getDplList(taskId) { // 获取关联望岳任务
+      const res = await taskListAvailableDpmTask(taskId)
+      if (res.code === 200) {
+        this.dplOption = res.data
+      }
+    },
+    async synchronize(id) { // 关联至望岳
+      const res = await taskSetTaskRelated(this.taskId, id)
+      if (res.code === 200) {
+        this.taskGet()
+        this.$message({ message: '关联成功', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
+    async deleteDpl() { // 取消关联
+      const res = await taskDeleteRelationship(this.taskId)
+      if (res.code === 200) {
+        this.taskGet()
+        this.$message({ message: '已取消关联', type: 'success', offset: 150 })
+      }
     }
   }
 }
@@ -791,6 +827,16 @@ export default {
   .title-name {
     cursor: pointer;
   }
+  .synchronize-icon {
+    position: relative;
+  }
+  .sty-icon {
+    position: absolute;
+    right: -5px;
+    top: -5px;
+    background: #eee;
+    border-radius: 50%;
+  }
 }
 .main-header::after {
   @include main-header-after;
@@ -965,11 +1011,47 @@ export default {
 .el-btn-size {
    margin: 10px 30px;
 }
+.blueStr {
+  width:4px;
+  height:17px;
+  background:#409EFF;
+  border-radius:1px;
+  position: absolute;
+  top: 22px;
+  left: 15px;
+}
 </style>
 
-<style>
- .el-main-title .el-popper[x-placement^=bottom] {
-    margin: 12px 10px 0 0;
-    width: 300px;
+<style lang="scss">
+.synchronize {
+  .el-popover__title {
+    color: #333333;
+    padding: 10px 20px;
+  }
+  .task-object-list {
+    width: 100%;
+    overflow: scroll;
+    cursor: pointer;
+    .task-item {
+      width: 100%;
+      white-space: nowrap;
+      color: #999999;
+      margin-bottom: 5px;
+      .item-id {
+        padding-right: 20px;
+      }
+      .item-name {
+        color: #333333;
+        padding-right: 20px;
+      }
+    }
+  }
+  .task-object-list::-webkit-scrollbar {
+    display: none;
+  }
+}
+.el-main-title .el-popper[x-placement^=bottom] {
+  margin: 12px 10px 0 0;
+  width: 300px;
 }
 </style>