Эх сурвалжийг харах

Merge branch 'http_test' into Qz_daily_0.0.9

qinzhipeng_v@didiglobal.com 4 жил өмнө
parent
commit
42d041d5b9
29 өөрчлөгдсөн 590 нэмэгдсэн , 195 устгасан
  1. 8 0
      src/api/projectIndex.js
  2. 9 0
      src/api/taskIndex.js
  3. 2 1
      src/api/workSchedule.js
  4. 0 1
      src/components/chart/antvChart.vue
  5. 84 0
      src/components/commentsAndChanges/index.vue
  6. 73 0
      src/components/commentsAndChanges/record.vue
  7. 0 3
      src/components/input/editor.vue
  8. 0 1
      src/components/searchHeader/index.vue
  9. 0 2
      src/components/select/searchPeople.vue
  10. 0 1
      src/components/select/selectTeam.vue
  11. 0 1
      src/views/mqTest/index.vue
  12. 6 1
      src/views/projectManage/bugList/details/bugTableDialog.vue
  13. 29 1
      src/views/projectManage/projectList/projectViewDetails.vue
  14. 57 18
      src/views/projectManage/taskList/taskViewDetail.vue
  15. 9 4
      src/views/quality/allStatistics.vue
  16. 14 19
      src/views/quality/components/drawerAll.vue
  17. 4 4
      src/views/quality/components/tables/index.vue
  18. 16 0
      src/views/quality/defectStatistics.vue
  19. 0 1
      src/views/quality/requireStatistics.vue
  20. 1 4
      src/views/quality/taskStatistics.vue
  21. 1 3
      src/views/reportManagement/ReleaseReport/components/releaseDetails.vue
  22. 47 43
      src/views/reportManagement/Testing/components/deliverDetails.vue
  23. 45 39
      src/views/reportManagement/daily/components/dailyDetails.vue
  24. 6 0
      src/views/reportManagement/drawerCheckList/drawerIndex.vue
  25. 6 0
      src/views/workbench/bugTableList.vue
  26. 2 2
      src/views/workbench/components/listView.vue
  27. 1 1
      src/views/workbench/components/searchSection.vue
  28. 2 2
      src/views/workbench/team/components/ganntViews.vue
  29. 168 43
      src/views/workbench/team/index.vue

+ 8 - 0
src/api/projectIndex.js

@@ -155,3 +155,11 @@ export function getPersonBizList() {
     method: 'get'
   })
 }
+
+// 获取项目变更记录
+export function operationLogProject(id) {
+  return request({
+    url: TeamManagement + `/operationLog/project?projectId=${id}`,
+    method: 'get'
+  })
+}

+ 9 - 0
src/api/taskIndex.js

@@ -364,3 +364,12 @@ export function taskDownload(data) {
     responseType: 'blob' // 表明返回服务器返回的数据类型
   })
 }
+
+// 任务关闭更新
+export function taskOpenOrClose(data) {
+  return request({
+    url: TeamManagement + `/task/openOrClose`,
+    method: 'post',
+    data
+  })
+}

+ 2 - 1
src/api/workSchedule.js

@@ -111,7 +111,8 @@ export function teamQueryWorkList(data) {
   return request({
     url: TeamManagement + `/workbench/team/queryWorkList`,
     method: 'post',
-    data
+    data,
+    timeout: '10000'
   })
 }
 

+ 0 - 1
src/components/chart/antvChart.vue

@@ -66,7 +66,6 @@ export default {
       })
       this.chart.data(
         dv.getAllNodes().map((node) => {
-          console.log(node, '图表数据')
           if (node) {
             return {
               name: node.data.name,

+ 84 - 0
src/components/commentsAndChanges/index.vue

@@ -0,0 +1,84 @@
+<template>
+  <div>
+    <ul class="comment-main">
+      <li v-for="(item,index) in comments" :key="index">
+        <span>{{ item.commentInfo.name }}</span>
+        <span class="comment-gmtCreater">{{ item.commentInfo.gmtCreater }}</span><br>
+        <span>{{ item.commentInfo.content }}</span>
+      </li>
+    </ul>
+    <el-input v-model="commentContent" type="textarea" placeholder="请输入评论内容" maxlength="300" show-word-limit :autosize="{ minRows: 3, maxRows: 5}" />
+    <div class="comment-btn">
+      <el-button type="primary" size="small" @click="addComment">发表评论</el-button>
+    </div>
+  </div>
+</template>
+<!-- 项目、需求、任务下评论 -->
+<script>
+import { commentCreate, commentList } from '@/api/taskIndex'
+export default {
+  props: {
+    data: { type: Object, required: true }
+  },
+  data() {
+    return {
+      commentData: {}, // 父组件的props
+      commentContent: null, // 评论内容
+      comments: [] // 评论列表
+    }
+  },
+  watch: {
+    data: {
+      handler(newV) {
+        this.commentData = newV
+        this.getCommentList()
+      },
+      deep: true
+    }
+  },
+  methods: {
+    async getCommentList() { // 获取评论
+      const res = await commentList({ type: this.commentData.type, joinId: this.commentData.id })
+      if (res.code === 200) {
+        this.comments = res.data
+        this.commentContent = ''
+      }
+    },
+    async addComment() { // 发表评论
+      if (this.commentContent.replace(/\s+/g, '') === '' || this.commentContent === null) { // 评论不能都是空格,不是为空
+        this.$message.warning('评论不能为空')
+        return
+      }
+      const commentInfo = { joinId: this.commentData.id, content: this.commentContent, type: this.commentData.type }
+      const res = await commentCreate({ commentInfo })
+      if (res.code === 200) {
+        this.$message({ message: '评论成功', type: 'success', duration: 1000, offset: 150 })
+        this.getCommentList()
+      } else {
+        this.$message.warning(res.msg)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .comment-main {
+    font-size:14px;
+    color:#333;
+    list-style: none;
+    padding: 15px 0 0;
+    li {
+      margin-bottom: 25px;
+    }
+    .comment-gmtCreater {
+      margin-left:20px;
+      color: #666;
+      font-size:12px
+    }
+  }
+  .comment-btn {
+    text-align: right;
+    margin: 20px 10px;
+  }
+</style>

+ 73 - 0
src/components/commentsAndChanges/record.vue

@@ -0,0 +1,73 @@
+<template>
+  <div>
+    <div v-for="(item,index) in changeRecord" :key="index" class="Layout_space_between sign-record">
+      <span>
+        <span class="operatorName">{{ item.operator }} : </span>
+        <span class="remark">{{ item.remark }}</span>
+      </span>
+      <span class="createTime">{{ item.createTime }}</span>
+    </div>
+  </div>
+</template>
+<!-- 项目、需求、任务下变更记录 -->
+<script>
+import '@/styles/PublicStyle/index.scss'
+import { operationLogTask } from '@/api/taskIndex'
+import { operationLogRequire } from '@/api/requirement.js'
+import { operationLogProject } from '@/api/projectIndex'
+
+export default {
+  props: {
+    id: { type: [Number, String], default: null },
+    name: { type: Number, default: null }
+  },
+  data() {
+    return {
+      changeRecord: [] // 变更记录
+    }
+  },
+  created() {
+    this.operationLogTask()
+  },
+  methods: {
+    async operationLogTask() {
+      if (this.name === '任务') {
+        const res = await operationLogTask(this.id)
+        this.changeRecord = res.data
+      } else if (this.name === '需求') {
+        const res = await operationLogRequire(this.id)
+        this.changeRecord = res.data
+      } else if (this.name === 7) { // 7 = 项目
+        const res = await operationLogProject(this.id)
+        this.changeRecord = res.data
+      }
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.sign-record {
+  margin: 20px 0;
+  font-size:14px;
+  line-height:20px;
+  opacity:1;
+  font-family:PingFangSC-Regular;
+
+.createTime {
+  min-width:150px;
+  color:rgba(68,68,68,1);
+}
+
+.remark {
+  min-width:500px;
+  text-align: left;
+  color:#444444;
+}
+.operatorName {
+  min-width: 60px;
+  color:rgba(51,59,74,1);
+  margin-right: 10px;
+}
+}
+</style>

+ 0 - 3
src/components/input/editor.vue

@@ -161,13 +161,10 @@ export default {
     getCursorPosition(event) {
       const editEl = event.target
       // return console.log(editEl);
-      console.log(event)
       if (editEl.selectionStart || editEl.selectionStart === 0) {
-        console.log(3333)
         // 非IE浏览器
         this.cursorPosition = editEl.selectionStart
       } else {
-        console.log(4444)
         // IE
         const range = document.selection.createRange()
         range.moveStart('character', -editEl.value.length)

+ 0 - 1
src/components/searchHeader/index.vue

@@ -130,7 +130,6 @@ export default {
       this.$emit('changeShowMore', this.showMore)
     },
     async getOption(key, q, utilName, type) {
-      console.log(key, q, utilName)
       if (utilName === 'getPerson') {
         const res = await getPerson({ memberIDAP: q })
         this.data[type].map(t => t.map(g => {

+ 0 - 2
src/components/select/searchPeople.vue

@@ -84,7 +84,6 @@ export default {
         }
         console.log(this.searchValue)
         const type = Object.prototype.toString.call(this.searchValue)
-        console.log(type)
         if (type.indexOf('Array') < 0) {
           this.remoteMethod(this.searchValue)
         } else if (type.indexOf('Array') > 0 && this.searchValue.length > 0 && this.firstGetArr) {
@@ -100,7 +99,6 @@ export default {
   },
   methods: {
     remoteMethod(query) {
-      console.log(query)
       query !== '' ? this.getMember(query) : this.options = []
     },
     initMore(arr) { // 当多人时候,对数组每一个人员进行搜索

+ 0 - 1
src/components/select/selectTeam.vue

@@ -115,7 +115,6 @@ export default {
       }
       const res = await teamQueryTeamInfo(params)
       this.options = res.data
-      console.log(res.data)
     }
   }
 

+ 0 - 1
src/views/mqTest/index.vue

@@ -14,7 +14,6 @@ export default {
   },
   mounted() {
     var height = window.innerHeight > document.body.clientHeight ? window.innerHeight : document.body.clientHeight
-    console.log(height, 'cdc')
     this.iframeHeight = height + 'px'
   }
 }

+ 6 - 1
src/views/projectManage/bugList/details/bugTableDialog.vue

@@ -307,7 +307,6 @@ export default {
       this.bugGetTableList(this.eleId, false)
     },
     bugGetTableList(e, index, vel) {
-      console.log(e, '需求新建')
       this.key = vel
       this.queryData = e
       this.data = {}
@@ -489,3 +488,9 @@ export default {
   }
 }
 </style>
+<style>
+.el-drawer__open .el-drawer.rtl {
+    -webkit-animation: none;
+    animation: none;
+}
+</style>

+ 29 - 1
src/views/projectManage/projectList/projectViewDetails.vue

@@ -120,6 +120,23 @@
             <mile-stone :values-list.sync="project_Milepost" @change="get_list" />
           </div>
         </section>
+        <section class="main-section">
+          <div class="el-main-title">
+            <div class="title-left-icon" />
+            <div class="title-left-name">动态</div>
+          </div>
+          <div class="comments-margin">
+            <el-tabs v-model="tabPosition">
+              <el-tab-pane label="评论" name="first">
+                <comments-and-changes v-if="form_query.id" :data="{type: 7, id: form_query.id}" />
+              </el-tab-pane>
+              <el-tab-pane label="变更记录" name="second">
+                <record v-if="form_query.id" :id="form_query.id" ref="record" :name="7" />
+              </el-tab-pane>
+            </el-tabs>
+          </div>
+        </section>
+
       </el-container>
       <!-- 概览 -->
       <!-- 需求 -->
@@ -199,6 +216,8 @@ import {
   mileStoneList,
   projectDelete
 } from '@/api/projectIndex'
+import record from '@/components/commentsAndChanges/record.vue'
+import commentsAndChanges from '@/components/commentsAndChanges/index.vue'
 import searchPeople from '@/components/select/searchPeople'
 import textArea from '@/components/input/textArea'
 import mileStone from './components/mileStone'
@@ -216,6 +235,7 @@ import bugTableDialog from '@/views/projectManage/bugList/details/bugTableDialog
 import '@/styles/PublicStyle/index.scss'
 export default {
   components: {
+    record,
     openDialog,
     RequirementCreate,
     createdBug,
@@ -227,7 +247,8 @@ export default {
     tasksList,
     needsList,
     modifyProject,
-    bugTableDialog
+    bugTableDialog,
+    commentsAndChanges
   },
   filters: {
     ellipsis(value, num) {
@@ -240,6 +261,7 @@ export default {
   },
   data() {
     return {
+      tabPosition: 'first',
       projectId: -1, // 项目id
       activeName: '1', // 顶部tab切换
       num: '',
@@ -308,8 +330,11 @@ export default {
     },
     async changeArea(e) { // area修改
       const projectInfo = _.cloneDeep(this.form_query)
+      projectInfo.priority = this.form_query.priorityStr
+      // projectInfo.bizType = this.form_query.projectTypeStr
       const res = await projectUpdate({ projectInfo, user: this.user })
       if (res.code === 200) {
+        this.$refs.record.operationLogTask() // 从新获取变更记录
         this.$message({ message: '修改成功', type: 'success', duration: 1000, offset: 150 })
       }
     },
@@ -469,6 +494,9 @@ export default {
     }
   }
 }
+  .comments-margin {
+    margin: 0 30px;
+  }
 >>>.el-input--small {
   font-size: 14px;
 }

+ 57 - 18
src/views/projectManage/taskList/taskViewDetail.vue

@@ -45,7 +45,8 @@
             </el-tooltip>
           </div>
           <el-button v-show="form_query.status === -2" disabled plain size="mini">Hold</el-button>
-          <el-dropdown v-show="form_query.status !== -2" placement="bottom" @command="updateStatus">
+          <el-button v-show="form_query.status === -4" disabled plain size="mini">已关闭</el-button>
+          <el-dropdown v-show="form_query.status !== -2 && form_query.status !== -4" placement="bottom" @command="updateStatus">
             <el-button size="mini" plainclass="el-dropdown-link drop_down">
               {{ getStatus.name }}
               <i class="el-icon-arrow-down el-icon--right" />
@@ -96,22 +97,30 @@
               <div class="title-left-icon" />
               <div class="title-left-name">工作流</div>
             </div>
-            <div>
-              <el-button v-if="form_query.isDirectlyFromDpm === 0 || form_query.isDirectlyFromDpm === 1" size="mini" @click="dialogVisible = true">{{ '拉取望岳状态及工作流' }}</el-button>
-              <el-popover
-                v-model="visible"
-                placement="bottom-end"
-                width="300px"
-                :visible-arrow="false"
-                trigger="manual"
-              >
-                <el-input
-                  v-model="textarea2"
-                  type="textarea"
-                  rows="5"
-                  style="width:300px"
-                  placeholder="请输入Hold原因(选填)"
-                />
+            <div class="Layout_space_between">
+              <el-button v-if="form_query.isDirectlyFromDpm === 0 || form_query.isDirectlyFromDpm === 1" class="el-btn-size" size="mini" @click="dialogVisible = true">{{ '拉取望岳状态及工作流' }}</el-button>
+              <div v-if="form_query.isTaskClose">
+                <el-popover v-if="form_query.status !== -2" v-model="taskVisible" placement="bottom-end" width="300px" :visible-arrow="false" trigger="manual">
+                  <el-input v-model="textarea1" type="textarea" rows="5" style="width:300px" placeholder="请输入关闭原因(选填)" />
+                  <div style="text-align: right; margin-top: 10px;">
+                    <el-button size="mini" type="text" @click="taskVisible = false">取消</el-button>
+                    <el-button type="primary" size="mini" @click="taskOpenOrClose(textarea1)">确定</el-button>
+                  </div>
+                  <el-button slot="reference" class="el-btn-size" size="mini" @click="changeTaskClose">{{ form_query.status === -4 ? closeTask = '解除关闭任务' : closeTask = '关闭任务' }}</el-button>
+                </el-popover>
+              </div>
+              <div v-slse-if="!form_query.isTaskClose && form_query.status !== -2">
+                <!-- <el-popover v-if="form_query.status !== -2" v-model="taskVisible" placement="bottom-end" width="300px" :visible-arrow="false" trigger="manual">
+                  <el-input v-model="textarea1" type="textarea" rows="5" style="width:300px" placeholder="请输入关闭原因(选填)" />
+                  <div style="text-align: right; margin-top: 10px;">
+                    <el-button size="mini" type="text" @click="taskVisible = false">取消</el-button>
+                    <el-button type="primary" size="mini" @click="taskOpenOrClose(textarea1)">确定</el-button>
+                  </div> -->
+                <el-button slot="reference" class="el-btn-size" size="mini" @click="changeTaskClose">解除关闭任务</el-button>
+                <!-- </el-popover> -->
+              </div>
+              <el-popover v-if="form_query.status !== -4" v-model="visible" placement="bottom-end" width="300px" :visible-arrow="false" trigger="manual">
+                <el-input v-model="textarea2" type="textarea" rows="5" style="width:300px" placeholder="请输入Hold原因(选填)" />
                 <div style="text-align: right; margin-top: 10px;">
                   <el-button size="mini" type="text" @click="visible = false">取消</el-button>
                   <el-button type="primary" size="mini" @click="taskHold(textarea2)">确定</el-button>
@@ -427,6 +436,7 @@ import {
   commentList,
   taskHold,
   taskUnhold,
+  taskOpenOrClose,
   configShowRequirementVersionEnum,
   scheduleGetTaskScheduleHistory
 } from '@/api/taskIndex'
@@ -504,8 +514,11 @@ export default {
       isShowLockedTime: false, // 是否显示解锁倒计时
       tabPosition: 'first',
       textarea2: '',
+      textarea1: '',
       HoldTask: '',
+      closeTask: '',
       visible: false, // Hold任务
+      taskVisible: false, // 关闭任务
       dialogVisible: false,
       showunlock: true,
       toilp: '',
@@ -656,6 +669,32 @@ export default {
         this.scheduleVisble = true
       }
     },
+    changeTaskClose() {
+      console.log(this.closeTask)
+      if (this.closeTask === '关闭任务') {
+        this.taskVisible = !this.taskVisible
+        this.textarea1 = ''
+      }
+      if (this.closeTask === '解除关闭任务') {
+        this.taskOpenOrClose()
+      }
+    },
+    async taskOpenOrClose(val) {
+      const data = { id: this.taskId, remark: val, closeStatus: -3 }
+      if (this.closeTask === '关闭任务') {
+        data.remark = val
+        data.closeStatus = -4
+      } else if (this.closeTask === '解除关闭任务') {
+        data.closeStatus = -3
+      }
+      const res = await taskOpenOrClose(data)
+      if (res.code === 200) {
+        this.taskGet()
+        this.$refs.timeLine.taskGetWorkFlow()
+        this.visible = false
+        this.$message({ message: '已修改任务状态', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
 
     changeBtn() {
       if (this.HoldTask === 'Hold 任务') {
@@ -1159,7 +1198,7 @@ export default {
   padding: 0 30px;
 }
 .el-btn-size {
-   margin: 10px 30px;
+   margin: 10px 30px 10px 0;
 }
 .blueStr {
   width:4px;

+ 9 - 4
src/views/quality/allStatistics.vue

@@ -1,15 +1,15 @@
 <template>
   <section class="all-statistics">
-    <div class="control-pages">
+    <div class="control-pages" @click="statistics">
       <span class="control-item" :class="{'is-active':isActive === 1}" @click="isActive=1">需求统计</span>
       <span class="control-item" :class="{'is-active':isActive === 2}" @click="isActive=2">任务统计</span>
       <span class="control-item" :class="{'is-active':isActive === 3}" @click="isActive=3">缺陷统计</span>
       <span class="control-item" :class="{'is-active':isActive === 4}" @click="isActive=4">老版统计</span>
     </div>
     <keep-alive>
-      <require-statistics v-if="isActive === 1" />
-      <task-statistics v-if="isActive === 2" />
-      <defect-statistics v-if="isActive === 3" />
+      <require-statistics v-if="isActive === 1" ref="statistics" />
+      <task-statistics v-if="isActive === 2" ref="statistics" />
+      <defect-statistics v-if="isActive === 3" ref="statistics" />
       <quality-measurement v-if="isActive === 4" />
     </keep-alive>
   </section>
@@ -41,6 +41,11 @@ export default {
     this.$nextTick(() => {
       this.isActive = this.$route.query.page ? Number(this.$route.query.page) : 1
     })
+  },
+  methods: {
+    statistics() {
+      this.$refs.statistics.clone()
+    }
   }
 }
 </script>

+ 14 - 19
src/views/quality/components/drawerAll.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-drawer :title="Statistics.title" :visible.sync="drawer_" :direction="direction" :modal="false" :class="{'drawer-box': showClass}" size="100%" :before-close="handleClose">
+  <el-drawer v-if="drawer_" :title="Statistics.title" :visible.sync="drawer_" :direction="direction" :modal="false" class="drawer-box" size="100%" :before-close="handleClose">
     <div v-if="Statistics.title === '任务分布图数据'" class="qz-drawer-grade">按任务等级分布</div>
     <div v-if="Statistics.title === '分布图数据'" class="qz-drawer-grade-tow">按缺陷等级分布</div>
     <div>
@@ -72,7 +72,6 @@ export default {
       dataList: [],
       Statistics: {}, // title
       direction: 'rtl',
-      showClass: false,
       defaultKey2: 0,
       defaultKey: 0,
       bugList: [],
@@ -100,7 +99,6 @@ export default {
     data: {
       handler(newV, oldV) {
         if (newV) {
-          console.log(newV, this.drawer, '刚进来')
           this.Statistics = newV
           this.list = newV.xaxis
           this.type = newV.name
@@ -113,11 +111,6 @@ export default {
       immediate: true
     }
   },
-  mounted() {
-    this.$nextTick(() => {
-      this.showClass = true
-    })
-  },
   methods: {
     setDrawerDate() {
       this.show = true
@@ -128,9 +121,6 @@ export default {
       } else if (this.Statistics.title === '责任人分布数据') {
         this.dataList = this.Statistics[this.Statistics.key].idList
         this.getTableData(this.dataList)
-      } else if (this.Statistics.title === '平均修复mmmmmm时长数据') {
-        this.dataList = this.Statistics[this.Statistics.key].idList
-        this.getTableData(this.dataList)
       } else if (this.Statistics.title === '缺陷统计数据' || this.Statistics.title === '去除节假日的修复时长数据' || this.Statistics.title === '周期统计数据' || this.Statistics.title === '人力统计数据' || this.Statistics.title === '平均修复时长数据') {
         const key = this.Statistics.title === '周期统计数据' || this.Statistics.title === '人力统计数据' ? this.Statistics.xaxis.indexOf(this.Statistics.label.substr(2)) : this.Statistics.xaxis.indexOf(this.Statistics.label)
         this.Statistics.title === '周期统计数据' || this.Statistics.title === '人力统计数据' ? this.min_title = this.Statistics.label.substr(2) : ''
@@ -228,7 +218,6 @@ export default {
       }
     },
     async getTableData(taskIdList) { // 获取需求、任务、缺陷表格数据
-      console.log(taskIdList, 'legnth')
       if (!taskIdList || taskIdList.length <= 0) {
         this.tableData = []
         this.total = 0
@@ -237,13 +226,13 @@ export default {
       const data = { ids: taskIdList, ...this.paging }
       if (this.Statistics.title === '周期统计数据') { data.statisticsType = 1 }
       if (this.Statistics.title === '人力统计数据') { data.statisticsType = 2 }
-      if (this.Statistics.title === '需求方向分布图数据' || this.Statistics.title === '需求分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === 'PRD评审趋势图数据' || this.Statistics.title === '技术准入趋势图数据' || this.Statistics.title === '累计新增' && this.Statistics.toType === '需求' || this.Statistics.title === 'PRD评审通过' && this.Statistics.toType === '需求' || this.Statistics.title === '技术准入' && this.Statistics.toType === '需求' || this.Statistics.title === '累计上线' && this.Statistics.toType === '需求' || this.Statistics.title === '累计hold' && this.Statistics.toType === '需求') {
+      if (this.Statistics.title === '需求方向分布图数据' || this.Statistics.title === '所属需求方向分布图数据' || this.Statistics.title === '需求分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === 'PRD评审趋势图数据' || this.Statistics.title === '技术准入趋势图数据' || this.Statistics.title === '累计新增' && this.Statistics.toType === '需求' || this.Statistics.title === 'PRD评审通过' && this.Statistics.toType === '需求' || this.Statistics.title === '技术准入' && this.Statistics.toType === '需求' || this.Statistics.title === '累计上线' && this.Statistics.toType === '需求' || this.Statistics.title === '累计hold' && this.Statistics.toType === '需求') {
         const res = await getRequirement(data)
         if (res.code === 200) {
           this.tableData = res.data.list
           this.total = res.data.total
         }
-      } else if (this.Statistics.title === '任务分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === '所属需求方向分布图数据' || this.Statistics.title === `模块分布图数据` || this.Statistics.title === '累计新增' && this.Statistics.toType === '任务' || this.Statistics.title === '技术准入' && this.Statistics.toType === '任务' || this.Statistics.title === '累计上线' && this.Statistics.toType === '任务' || this.Statistics.title === '累计hold' && this.Statistics.toType === '任务') {
+      } else if (this.Statistics.title === '任务分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === `模块分布图数据` || this.Statistics.title === '累计新增' && this.Statistics.toType === '任务' || this.Statistics.title === '技术准入' && this.Statistics.toType === '任务' || this.Statistics.title === '累计上线' && this.Statistics.toType === '任务' || this.Statistics.title === '累计hold' && this.Statistics.toType === '任务') {
         const res = await taskList(data)
         if (res.code === 200) {
           this.tableData = res.data
@@ -296,9 +285,9 @@ export default {
     },
     async exportTable() {
       const data = { ids: this.dataList }
-      if (this.Statistics.title === '需求方向分布图数据' || this.Statistics.title === '需求分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === 'PRD评审趋势图数据' || this.Statistics.title === '技术准入趋势图数据' || this.Statistics.title === '累计新增' && this.Statistics.toType === '需求' || this.Statistics.title === '技术准入' && this.Statistics.toType === '需求' || this.Statistics.title === '累计上线' && this.Statistics.toType === '需求' || this.Statistics.title === '累计hold' && this.Statistics.toType === '需求') {
+      if (this.Statistics.title === '需求方向分布图数据' || this.Statistics.title === '需求分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '需求' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '需求' || this.Statistics.title === '所属需求方向分布图数据' || this.Statistics.title === 'PRD评审趋势图数据' || this.Statistics.title === '技术准入趋势图数据' || this.Statistics.title === '累计新增' && this.Statistics.toType === '需求' || this.Statistics.title === '技术准入' && this.Statistics.toType === '需求' || this.Statistics.title === '累计上线' && this.Statistics.toType === '需求' || this.Statistics.title === '累计hold' && this.Statistics.toType === '需求') {
         this.responseDownload = await requirementDownload(data)
-      } else if (this.Statistics.title === '任务分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === '所属需求方向分布图数据' || this.Statistics.title === `模块分布图数据` || this.Statistics.title === '累计新增' && this.Statistics.toType === '任务' || this.Statistics.title === '技术准入' && this.Statistics.toType === '任务' || this.Statistics.title === '累计上线' && this.Statistics.toType === '任务' || this.Statistics.title === '累计hold' && this.Statistics.toType === '任务') {
+      } else if (this.Statistics.title === '任务分布图数据' || this.Statistics.title === '状态停留分布图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '状态累积流量图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '新增趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '上线趋势图数据' && this.Statistics.toType === '任务' || this.Statistics.title === '人力统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === '周期统计数据' && this.Statistics.toType === '任务' || this.Statistics.title === `模块分布图数据` || this.Statistics.title === '累计新增' && this.Statistics.toType === '任务' || this.Statistics.title === '技术准入' && this.Statistics.toType === '任务' || this.Statistics.title === '累计上线' && this.Statistics.toType === '任务' || this.Statistics.title === '累计hold' && this.Statistics.toType === '任务') {
         this.responseDownload = await taskDownload(data)
       } else if (this.Statistics.title === '缺陷统计数据' || this.Statistics.title === '分布图数据' || this.Statistics.title === `责任人分布数据` || this.Statistics.title === '去除节假日的修复时长数据' || this.Statistics.title === '模块分布数据' || this.Statistics.title === `${this.Statistics.qz_holiday}的修复时长区间数据` || this.Statistics.title === '平均修复时长数据' || this.Statistics.title === '趋势图数据' || this.Statistics.title === '累计修复' && this.Statistics.toType === '缺陷' || this.Statistics.title === '累计reopen' && this.Statistics.toType === '缺陷' || this.Statistics.title === '累计新增' && this.Statistics.toType === '缺陷') {
         this.responseDownload = await bugDownload(data)
@@ -373,9 +362,9 @@ export default {
     padding: 20px 30px;
     border-bottom: 1px solid #E2E2E2;
 }
-.drawer-box {
-  box-shadow: 0 8px 10px -5px rgba(0,0,0,.2), 0 16px 24px 2px rgba(0,0,0,.14), 0 6px 30px 5px rgba(0,0,0,.12);
-}
+  .drawer-box {
+    box-shadow: 0 8px 10px -5px rgba(0,0,0,.2), 0 16px 24px 2px rgba(0,0,0,.14), 0 6px 30px 5px rgba(0,0,0,.12);
+  }
  .el-drawer__wrapper {
     width: 100%;
     position: fixed;
@@ -403,3 +392,9 @@ export default {
   margin: 0 30px;
 }
 </style>
+<style>
+.el-drawer__open .el-drawer.rtl {
+    -webkit-animation: none;
+    animation: none;
+}
+</style>

+ 4 - 4
src/views/quality/components/tables/index.vue

@@ -6,13 +6,13 @@
           <span class="div_priority" :style="{background: priorityColors[scope.row.priority % priorityColors.length]}">{{ 'P'+scope.row.priority }}</span>
         </template>
       </el-table-column>
-      <el-table-column v-if="type === '需求' || type === '需求状态' || type === '需求等级' || type === '需求类型' || title === '需求分布图数据' && type === '跟版客户端' || type === 'pm' || title === '状态累积流量图数据' && type === '需求' || title === '周期统计数据' && type === '需求' || title === '人力统计数据' && type === '需求' || title === '新增趋势图数据' && type === '需求' || title === '上线趋势图数据' && type === '需求' || title === 'PRD评审趋势图数据' || title === '技术准入趋势图数据' || title === '需求方向分布图数据' || title === 'PRD评审通过' && type === '需求' || title === '累计新增' && type === '需求' || title === '技术准入' && type === '需求' || title === '累计上线' && type === '需求' || title === '累计hold' && type === '需求'" label="需求名称" :min-width="title === '周期统计数据' || title === '人力统计数据' ? '120' : '360'" align="left" show-overflow-tooltip>
+      <el-table-column v-if="type === '需求' || type === '需求状态' || type === '需求等级' || type === '需求类型' || title === '所属需求方向分布图数据' || title === '需求分布图数据' && type === '跟版客户端' || type === 'pm' || title === '状态累积流量图数据' && type === '需求' || title === '周期统计数据' && type === '需求' || title === '人力统计数据' && type === '需求' || title === '新增趋势图数据' && type === '需求' || title === '上线趋势图数据' && type === '需求' || title === 'PRD评审趋势图数据' || title === '技术准入趋势图数据' || title === '需求方向分布图数据' || title === 'PRD评审通过' && type === '需求' || title === '累计新增' && type === '需求' || title === '技术准入' && type === '需求' || title === '累计上线' && type === '需求' || title === '累计hold' && type === '需求'" label="需求名称" :min-width="title === '周期统计数据' || title === '人力统计数据' ? '120' : '360'" align="left" show-overflow-tooltip>
         <template slot-scope="scope">
           <div class="drawer-id">{{ scope.row.requirementDisplayId }}</div>
           <div class="drawer-name" @click="jumper(scope.row, '需求')">{{ scope.row.name }}</div>
         </template>
       </el-table-column>
-      <el-table-column v-if="type === '任务' || type === '任务状态' || title === '所属需求方向分布图数据' || type === '任务等级' || type === '开发负责人' || type === '测试负责人' || title === '任务分布图数据' && type === '跟版客户端' || type === '直接归属' || title === '状态累积流量图数据' && type === '任务' || title === '周期统计数据' && type === '任务' || title === '新增趋势图数据' && type === '任务' || title === '上线趋势图数据' && type === '任务' || title === '人力统计数据' && type === '任务' || title === `模块分布图数据` || title === '累计新增' && type === '任务' || title === '技术准入' && type === '任务' || title === '累计上线' && type === '任务' || title === '累计hold' && type === '任务'" label="任务名称" :min-width="title === '周期统计数据' || title === '人力统计数据' ? '120' : '360'" align="left" show-overflow-tooltip>
+      <el-table-column v-if="type === '任务' || type === '任务状态' || type === '任务等级' || type === '开发负责人' || type === '测试负责人' || title === '任务分布图数据' && type === '跟版客户端' || type === '直接归属' || title === '状态累积流量图数据' && type === '任务' || title === '周期统计数据' && type === '任务' || title === '新增趋势图数据' && type === '任务' || title === '上线趋势图数据' && type === '任务' || title === '人力统计数据' && type === '任务' || title === `模块分布图数据` || title === '累计新增' && type === '任务' || title === '技术准入' && type === '任务' || title === '累计上线' && type === '任务' || title === '累计hold' && type === '任务'" label="任务名称" :min-width="title === '周期统计数据' || title === '人力统计数据' ? '120' : '360'" align="left" show-overflow-tooltip>
         <template slot-scope="scope">
           <div class="drawer-id">{{ scope.row.taskIdSting }}</div>
           <div class="drawer-name" @click="jumper(scope.row, '任务')">{{ scope.row.name }}</div>
@@ -66,8 +66,8 @@
           <span>{{ scope.row.typeName }}</span>
         </template>
       </el-table-column>
-      <el-table-column v-if="type === '需求' || type === '需求状态' || type === '需求等级' || title === '状态累积流量图数据' && type === '需求' || title === '周期统计数据' && type === '需求' || title === '人力统计数据' && type === '需求' || title === '新增趋势图数据' && type === '需求' || title === '上线趋势图数据' && type === '需求' || title === 'PRD评审趋势图数据' || title === '技术准入趋势图数据' || title === '需求方向分布图数据' || title === 'PRD评审通过' && type === '需求' || title === '累计新增' && type === '需求' || title === '技术准入' && type === '需求' || title === '累计上线' && type === '需求' || title === '累计hold'" label="状态" prop="statusName" min-width="100" align="center" />
-      <el-table-column v-if="type === '任务' || type === '任务状态' || type === '任务等级' || title === '状态累积流量图数据' && type === '任务' || title === '周期统计数据' && type === '任务' || title === '人力统计数据' && type === '任务' || title === '新增趋势图数据' && type === '任务' || title === '上线趋势图数据' && type === '任务' || title === '所属需求方向分布图数据' || title === `模块分布图数据` || title === '累计新增' && type === '任务' || title === '技术准入' && type === '任务' || title === '累计上线' && type === '任务' || title === '累计hold' && type === '任务'" label="状态" prop="statusString" min-width="100" align="center" />
+      <el-table-column v-if="type === '需求' || type === '需求状态' || type === '需求等级' || title === '所属需求方向分布图数据' || title === '状态累积流量图数据' && type === '需求' || title === '周期统计数据' && type === '需求' || title === '人力统计数据' && type === '需求' || title === '新增趋势图数据' && type === '需求' || title === '上线趋势图数据' && type === '需求' || title === 'PRD评审趋势图数据' || title === '技术准入趋势图数据' || title === '需求方向分布图数据' || title === 'PRD评审通过' && type === '需求' || title === '累计新增' && type === '需求' || title === '技术准入' && type === '需求' || title === '累计上线' && type === '需求' || title === '累计hold'" label="状态" prop="statusName" min-width="100" align="center" />
+      <el-table-column v-if="type === '任务' || type === '任务状态' || type === '任务等级' || title === '状态累积流量图数据' && type === '任务' || title === '周期统计数据' && type === '任务' || title === '人力统计数据' && type === '任务' || title === '新增趋势图数据' && type === '任务' || title === '上线趋势图数据' && type === '任务' || title === `模块分布图数据` || title === '累计新增' && type === '任务' || title === '技术准入' && type === '任务' || title === '累计上线' && type === '任务' || title === '累计hold' && type === '任务'" label="状态" prop="statusString" min-width="100" align="center" />
     </el-table>
 
     <el-table v-if="title === '去除节假日的修复时长区间数据' || title === '不去除节假日的修复时长区间数据'" :data="data" style="width: auto;" height="calc(100vh - 355px)" :header-cell-style="{ 'color':'rgba(74,74,74,1)','font-size':'14px','font-weight':'500' }">

+ 16 - 0
src/views/quality/defectStatistics.vue

@@ -232,6 +232,13 @@
                 <span class="repair-span">{{ scope.row.repairData.detail[1].label }}:{{ scope.row.repairData.detail[1].total }}</span>
               </template>
             </el-table-column>
+            <el-table-column prop="holdData" label="Hold" sortable="custom">
+              <template slot-scope="scope">
+                <span class="table-repair-item2 repair-span2">{{ scope.row.holdData.total }}</span>
+                <span class="repair-span">{{ scope.row.holdData.detail[0].label }}:{{ scope.row.holdData.detail[0].total }}</span>
+                <span class="repair-span">{{ scope.row.holdData.detail[1].label }}:{{ scope.row.holdData.detail[1].total }}</span>
+              </template>
+            </el-table-column>
             <el-table-column prop="repairTimeAvgData" label="平均修复时长" min-width="120">
               <template slot-scope="scope">
                 <span class="table-repair-item3 repair-span">{{ scope.row.repairTimeAvgData.total }}</span>
@@ -298,6 +305,15 @@
                 <span class="repair-span">{{ scope.row.repairData.detail[1].label }}:{{ scope.row.repairData.detail[1].total }}</span>
               </template>
             </el-table-column>
+            <el-table-column prop="holdData" label="Hold" sortable="custom">
+              <template slot-scope="scope">
+                <span class="table-repair-item2 repair-span2" @click.stop>
+                  <span style="cursor: pointer;" @click="getBugmembers(scope.row, 'holdData')">{{ scope.row.holdData.total }}</span>
+                </span>
+                <span class="repair-span">{{ scope.row.holdData.detail[0].label }}:{{ scope.row.holdData.detail[0].total }}</span>
+                <span class="repair-span">{{ scope.row.holdData.detail[1].label }}:{{ scope.row.holdData.detail[1].total }}</span>
+              </template>
+            </el-table-column>
             <el-table-column prop="repairTimeAvgData" label="平均修复时长" min-width="120">
               <template slot-scope="scope">
                 <span class="table-repair-item3 repair-span" @click.stop>

+ 0 - 1
src/views/quality/requireStatistics.vue

@@ -555,7 +555,6 @@ export default {
       return arr
     },
     getRequiredNum(value) {
-      console.log(value, this.Summary, '点击')
       value.title = value.label
       value.toType = '需求'
       this.requireList = { ...value, ...this.Summary }

+ 1 - 4
src/views/quality/taskStatistics.vue

@@ -567,14 +567,12 @@ export default {
       return arr
     },
     getRequiredNum(value) {
-      console.log(value, this.Summary, '点击')
       value.title = value.label
       value.toType = '任务'
       this.requireList = { ...value, ...this.Summary }
       this.openDrawer = true
     },
     getModuleDistribute(value, data) {
-      console.log(value, data, '点击')
       if (value.data === undefined) {
         this.clone()
         return
@@ -593,9 +591,8 @@ export default {
       this.openDrawer = true
     },
     getRequirementData(value, data) {
-      console.log(value, data, '嗲集')
       value.title = '所属需求方向分布图数据'
-      value.toType = '任务'
+      value.toType = '需求'
       this.requireList = { ...value, ...data }
       this.openDrawer = true
     },

+ 1 - 3
src/views/reportManagement/ReleaseReport/components/releaseDetails.vue

@@ -16,9 +16,7 @@
     </el-header>
     <el-container>
       <el-main class="report-main">
-        <div class="title">
-          <div class="blur-column" />报告内容
-        </div>
+        <div class="title"><div class="blur-column" />报告内容</div>
         <el-row>
           <el-col :span="24" class="task-bot">
             <span class="from-names">测试结果:</span>

+ 47 - 43
src/views/reportManagement/Testing/components/deliverDetails.vue

@@ -21,7 +21,6 @@
     <el-container>
       <el-main class="report-main">
         <div class="title"><div class="blur-column" /> 报告内容</div>
-
         <el-row>
           <el-col :span="12" class="Layout_space_between task-bot">
             <span class="from-name"><span class="test-details">计划提测时间:</span>{{ details.deliverTestPlanTime }}</span>
@@ -100,41 +99,56 @@
       </el-main>
       <el-aside width="400px">
         <el-container>
-          <el-header class="report-mains">
+          <div v-if="details.status === 2 " class="report-mains">
+            <div class="title"><div class="blur-column" /> 打回信息</div>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">原因 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.returnReason }}</el-col>
+            </el-row>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">操作人 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.transactorName || '' }}</el-col>
+            </el-row>
+          </div>
+          <div class="report-mains">
             <div class="title"><div class="blur-column" /> 用户信息</div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">报告人 : </div>
-              <div class="task-name">{{ details.reportorObject ? details.reportorObject.name : '' }}</div>
-            </div>
-            <div class="Layout_flex_start">
-              <div class="title-name task-bot">收件人 : </div>
-              <div class="flex_start">
-                <div v-for="(item, index) in details.sendToObject" :key="index" class="task-name">
-                  {{ item.name }}
-                  <span v-if="index < details.sendToObject.length - 1"> , </span>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">报告人 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.reportorObject ? details.reportorObject.name : '' }}</el-col>
+            </el-row>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">收件人 : </el-col>
+              <el-col :span="19">
+                <div class="flex_start">
+                  <div v-for="(item, index) in details.sendToObject" :key="index" class="task-name">
+                    {{ item.name }}
+                    <span v-if="index < details.sendToObject.length - 1"> , </span>
+                  </div>
                 </div>
-              </div>
-            </div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">抄送人 : </div>
-              <div class="flex_start">
-                <div v-for="(item, index) in details.sendCcObject" :key="index" class="task-name">
-                  {{ item.name }}
-                  <span v-if="index < details.sendCcObject.length - 1"> , </span>
+              </el-col>
+            </el-row>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">抄送人 : </el-col>
+              <el-col :span="19">
+                <div class="flex_start">
+                  <div v-for="(item, index) in details.sendCcObject" :key="index" class="task-name">
+                    {{ item.name }}
+                    <span v-if="index < details.sendCcObject.length - 1"> , </span>
+                  </div>
                 </div>
-              </div>
-            </div>
-          </el-header>
+              </el-col>
+            </el-row>
+          </div>
           <el-main class="report-mains">
             <div class="title"><div class="blur-column" /> 时间</div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">创建时间 : </div>
-              <div class="task-name">{{ details.gmtCreate }}</div>
-            </div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">发送时间 : </div>
-              <div class="task-name">{{ details.reportTime }}</div>
-            </div>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">创建时间 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.gmtCreate }}</el-col>
+            </el-row>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">发送时间 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.reportTime || '' }}</el-col>
+            </el-row>
           </el-main>
           <el-footer class="report-mains">
             <div class="title"><div class="blur-column" /> 关联任务</div>
@@ -375,7 +389,7 @@ export default {
   border-radius:4px;
 }
 .report-mains {
-  min-height: 200px;
+  min-height: 100px;
   padding: 20px 30px;
   margin: 10px 10px 0 0;
   background: #FFF;
@@ -384,13 +398,12 @@ export default {
 .title {
   font-size:16px;
   font-family:PingFangSC-Medium;
-  margin-bottom: 10px;
+  margin-bottom: 15px;
   color:rgba(51,59,74,1);
   opacity:1;
 }
 
 .title-name {
-  width:100px;
   font-size:14px;
   font-family:PingFangSC-Regular;
   line-height:20px;
@@ -434,13 +447,4 @@ export default {
 .test-details {
   color: #666666;
 }
-
-.title {
-  font-size:16px;
-  font-family:PingFangSC-Medium;
-  line-height:35px;
-  margin-bottom: 10px;
-  color:rgba(51,59,74,1);
-  opacity:1;
-}
 </style>

+ 45 - 39
src/views/reportManagement/daily/components/dailyDetails.vue

@@ -22,49 +22,57 @@
       </el-main>
       <el-aside width="400px">
         <el-container>
-          <el-header class="report-mains">
+          <div class="report-mains">
             <div class="title"><div class="blur-column" /> 用户信息</div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">报告人 : </div>
-              <div class="task-name">{{ details.reportorObject ? details.reportorObject.name : '' }}</div>
-            </div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">收件人 : </div>
-              <div class="flex_start">
-                <div v-for="(item, index) in details.sendToObject" :key="index" class="task-name">
-                  {{ item.name }}
-                  <span v-if="index < details.sendToObject.length - 1"> , </span>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">报告人 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.reportorObject ? details.reportorObject.name : '' }}</el-col>
+            </el-row>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">收件人 : </el-col>
+              <el-col :span="19">
+                <div class="flex_start">
+                  <div v-for="(item, index) in details.sendToObject" :key="index" class="task-name">
+                    {{ item.name }}
+                    <span v-if="index < details.sendToObject.length - 1"> , </span>
+                  </div>
                 </div>
-              </div>
-            </div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">抄送人 : </div>
-              <div class="flex_start">
-                <div v-for="(item, index) in details.sendCcObject" :key="index" class="task-name">
-                  {{ item.name }}
-                  <span v-if="index < details.sendCcObject.length - 1"> , </span>
+              </el-col>
+            </el-row>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">抄送人 : </el-col>
+              <el-col :span="19">
+                <div class="flex_start">
+                  <div v-for="(item, index) in details.sendCcObject" :key="index" class="task-name">
+                    {{ item.name }}
+                    <span v-if="index < details.sendCcObject.length - 1"> , </span>
+                  </div>
                 </div>
-              </div>
-            </div>
-          </el-header>
+              </el-col>
+            </el-row>
+          </div>
           <el-main class="report-mains">
             <div class="title"><div class="blur-column" /> 时间</div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">创建时间 : </div>
-              <div class="task-name">{{ details.gmtCreate }}</div>
-            </div>
-            <div class="Layout_flex_start task-bot">
-              <div class="title-name">发送时间 : </div>
-              <div class="task-name">{{ details.reportTime }}</div>
-            </div>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">创建时间 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.gmtCreate }}</el-col>
+            </el-row>
+            <el-row class="task-bot">
+              <el-col :span="5" class="title-name">发送时间 : </el-col>
+              <el-col :span="19" class="task-name">{{ details.reportTime }}</el-col>
+            </el-row>
           </el-main>
-          <el-footer class="report-mains">
+          <el-footer class="report-mains" style="height: auto;">
             <div class="title"><div class="blur-column" /> 关联任务</div>
-            <div v-for="(item, index) in details.taskDetailList" :key="index" class="Layout_flex_start task-bot">
-              <div class="task-id">{{ item.taskId }}</div>
-              <el-tooltip class="item" effect="dark" :content="item.name" placement="top-start">
-                <div class="task-name didi-hover" @click="goTaskDetails(item.id)">{{ item.name.slice(0,12) + '...' }}</div>
-              </el-tooltip>
+            <div v-for="(item, index) in details.taskDetailList" :key="index">
+              <el-row class="task-bot">
+                <el-col :span="8" class="title-name">{{ item.taskId }}</el-col>
+                <el-col :span="16" class="task-name">
+                  <el-tooltip class="item" effect="dark" :content="item.name" placement="top-start">
+                    <div class="task-name didi-hover" @click="goTaskDetails(item.id)">{{ item.name.slice(0,16) + '...' }}</div>
+                  </el-tooltip>
+                </el-col>
+              </el-row>
             </div>
           </el-footer>
         </el-container>
@@ -205,7 +213,7 @@ export default {
   border-radius:4px;
 }
 .report-mains {
-  min-height: 200px;
+  min-height: 100px;
   padding: 20px 30PX;
   margin: 10px 10px 0 0;
   background: #FFF;
@@ -220,7 +228,6 @@ export default {
 }
 
 .title-name {
-  width:100px;
   font-size:14px;
   font-family:PingFangSC-Regular;
   line-height:20px;
@@ -240,7 +247,6 @@ export default {
 .task-name {
   font-size:14px;
   font-family:MicrosoftYaHei;
-  line-height:17px;
   color:rgba(51,51,51,1);
   opacity:1;
 }

+ 6 - 0
src/views/reportManagement/drawerCheckList/drawerIndex.vue

@@ -196,3 +196,9 @@ export default {
     padding-right: 75px;
 }
 </style>
+<style>
+.el-drawer__open .el-drawer.rtl {
+    -webkit-animation: none;
+    animation: none;
+}
+</style>

+ 6 - 0
src/views/workbench/bugTableList.vue

@@ -247,3 +247,9 @@ export default {
   pointer-events: auto;
 }
 </style>
+<style>
+.el-drawer__open .el-drawer.rtl {
+    -webkit-animation: none;
+    animation: none;
+}
+</style>

+ 2 - 2
src/views/workbench/components/listView.vue

@@ -172,7 +172,7 @@ export default {
   },
   props: {
     type: { type: String, required: true },
-    biz: { type: Number, default: null }
+    biz: { type: Object, default: null }
   },
   data() {
     return {
@@ -234,7 +234,7 @@ export default {
     biz: {
       handler(newV) {
         if (newV) {
-          this.searchForm.bizId = newV
+          this.searchForm = newV
           this.radio_aelect()
         }
       },

+ 1 - 1
src/views/workbench/components/searchSection.vue

@@ -132,7 +132,7 @@ export default {
   methods: {
     async queryTeamMember() { // 获取团队人员
       if (this.workbench === '团队' || this.workbench === '团队忙碌' || this.workbench === '团队空闲') {
-        const res = await queryTeamMember(this.searchForm)
+        const res = await queryTeamMember({ teamIds: this.searchForm.teamIds })
         if (res.code === 200) {
           res.data = res.data || []
           this.memberList = this.handleMember(res.data)

+ 2 - 2
src/views/workbench/team/components/ganntViews.vue

@@ -109,8 +109,8 @@ export default {
     async radioChange() {
       const data = {
         teamSearchInfo: {
-          bizId: this.searchForm.bizId, // 业务线
-          teamId: this.searchForm.teamId // 团队id
+          bizIds: this.searchForm.bizIds, // 业务线
+          teamIds: this.searchForm.teamIds // 团队id
         },
         timeInfo: {
           startTime: moment(this.timeSelectVal[0]).format('YYYY.MM.DD'),

+ 168 - 43
src/views/workbench/team/index.vue

@@ -3,20 +3,10 @@
     <!-- 顶部导航栏 -->
     <el-header class="main-header">
       <div class="select-group">
-        <el-cascader ref="cascader" v-model="teamNames" :options="options" class="cascader" @change="handleChange" />
-        <span class="el-dropdown-link" @click="setCascader">{{ teamBizName.length > 11 ? teamBizName.substring(0, 11) + '...' : teamBizName }} <i class="el-icon-arrow-down" /></span>
-        <el-dropdown size="small" style="margin-left: 20px" @command="handleBizId">
-          <span class="el-dropdown-link">
-            {{ bizName }}<i class="el-icon-arrow-down el-icon--right" />
-          </span>
-          <el-dropdown-menu slot="dropdown">
-            <el-dropdown-item
-              v-for="item in searchEnum.businesslines"
-              :key="item.code"
-              :command="item.code"
-            >{{ item.name }}</el-dropdown-item>
-          </el-dropdown-menu>
-        </el-dropdown>
+        <el-cascader ref="cascader" v-model="teamNames" collapse-tags :options="options" :props="props" class="cascader" @change="handleChange(teamNames, options)" />
+        <span class="el-dropdown-link" style="margin-right: 20px;" @click="setCascader">{{ teamBizName.length > 11 ? teamBizName.substring(0, 11) + '...' : teamBizName }} <i class="el-icon-arrow-down" /></span>
+        <el-cascader ref="cascader" v-model="bizIdCode" collapse-tags :options="searchEnum.businesslines" :props="propsBizId" class="cascader" @change="handleBizIdChange(bizIdCode, searchEnum.businesslines)" />
+        <span class="el-dropdown-link" @click="setCascader">{{ bizName.length > 11 ? bizName.substring(0, 11) + '...' : bizName }} <i class="el-icon-arrow-down" /></span>
       </div>
       <div class="top-tabs">
         <el-tabs v-model="activeName" @tab-click="handleClick">
@@ -42,7 +32,7 @@
           <el-tab-pane label="列表视图" name="3" />
           <el-tab-pane label="甘特图" name="2" />
         </el-tabs>
-        <list-view v-show="activeSchedule === '3'" :type="'团队'" :biz="bizId" />
+        <list-view v-show="activeSchedule === '3'" :type="'团队'" :biz="searchForm" />
         <search-section
           v-show="activeSchedule === '1'"
           ref="search-section"
@@ -253,12 +243,20 @@ export default {
   data() {
     return {
       value: [],
+      props: { multiple: true },
+      propsBizId: {
+        multiple: true,
+        value: 'code',
+        label: 'name',
+        children: 'children'
+      },
       options: [],
       activeName: '1', // 顶部导航栏
       activeSchedule: '1', // 日历和甘特图切换
+      optionData: [],
       searchForm: {
-        teamId: null,
-        bizId: null
+        teamIds: [],
+        bizIds: []
       },
       searchEnum: {
         businesslines: []
@@ -266,6 +264,7 @@ export default {
       dialog_team_visible: false, // 删除日程弹窗
       // teamName: '团队', // 团队名字
       teamNames: [],
+      bizIdCode: [-1],
       teamBizName: '团队',
       bizName: '业务线', // 业务线名字
       filtrate: {// 筛选区域
@@ -281,6 +280,8 @@ export default {
         }
       ],
       loading: true,
+      bizCode: 0,
+      teamCode: 0,
       calendarView: null, // 日程图表数据
       showDetail: false, // 显示详情弹框
       nowDetailData: {}, // 当前选中日程的数据
@@ -296,6 +297,7 @@ export default {
         visible: false,
         data: null
       },
+      datas: [],
       DialogTitle: '新建排期', // 排期弹框标题
       isDelete: false, // 删除排期操作
       visibleSchedule: false, // 排期任务弹框
@@ -339,32 +341,142 @@ export default {
     })
   },
   mounted() {
-    this.queryTeamInfoList()
+    this.queryTeamInfoList([-1])
     this.teamReminding()
   },
   methods: {
     setCascader() {
       this.$refs.cascader.$el.click()
     },
-    handleChange(val) {
-      let a = ''
-      let b = ''
-      this.options.map(item => {
-        if (item.value === val[0]) {
-          a = item.label
+    handleBizIdChange(val, option) {
+      if (val.length > 0) {
+        const one = val[0]
+        const tow = val[1] || ''
+        let [name, nameTow] = ['', '']
+        option.map(item => {
+          this.optionData.push(item.code)
+          if (one[0] !== -1 && item.code === one[0]) name = item.name
+          if (val[1] && item.code === tow[0]) nameTow = item.name
+        })
+        if (this.bizCode === 0 && one[0] === -1) { // 默认全选
+          this.bizName = '业务线'
+          this.bizIdCode = this.optionData
+          this.bizCode = 1
+        } else {
+          if (one[0] !== -1 && this.bizCode === 1) { // 取消全选
+            this.bizIdCode = null
+            this.bizName = '业务线'
+            this.bizCode = 0
+          } else if (one[0] === -1 && val.length < option.length) { // 点击全选以外的,取消全选
+            const data = val.filter(item => { return item[0] })
+            data.splice(0, 1)
+            this.bizIdCode = data
+            this.bizName = (name ? name + '/' : '') + (nameTow ? '' + nameTow : '')
+            this.bizCode = 0
+          } else if (one[0] !== -1 && val.length === (option.length - 1)) { // 点击其余的全部,触发全选
+            const data = val.filter(item => { return item[0] })
+            data.unshift([-1])
+            this.bizIdCode = data
+            this.bizName = '业务线'
+            this.bizCode = 1
+          } else if (one[0] !== -1) { // 基础多选
+            const data = val.filter(item => { return item[0] })
+            this.bizIdCode = data
+            this.bizName = name + (nameTow ? '/' + nameTow : '')
+          }
+        }
+        if (this.bizIdCode && this.bizIdCode.length > 0) {
+          const arr = this.bizIdCode.map(value => { return value[0] })
+          if (arr[0] === undefined) {
+            this.handleBizId([-1])
+          } else {
+            this.handleBizId(arr)
+          }
         }
-        if (item.children) {
-          item.children.map(item => {
-            if (item.value === val[1]) {
-              b = item.label
+      } else {
+        this.bizIdCode = [-1]
+        this.bizName = '业务线'
+      }
+    },
+    handleChange(val, options) {
+      if (val.length > 0) {
+        let [a, b, stop] = ['', '', true]
+        val.map(e => {
+          this.options.map(item => {
+            if (item.value === e[0]) a = item.label
+            if (item.children && stop) {
+              item.children.map(item => {
+                this.searchForm.teamIds.push(item.value)
+                if (item.value === e[1]) {
+                  b = item.label
+                  stop = false
+                }
+              })
             }
           })
+        })
+        const arr = val[0]
+        if (this.teamCode === 0 && arr[0] === -1) { // 默认全选
+          this.teamNames = this.datas
+          this.teamBizName = '团队'
+          this.teamCode = 1
+          this.bizName = '业务线'
+          this.bizIdCode = this.optionData
+        } else if (arr[0] !== -1 && this.teamCode === 1) {
+          this.teamNames = null
+          this.teamBizName = '团队'
+          this.bizName = '业务线'
+          this.teamCode = 0
+          this.bizIdCode = null
+        } else {
+          if (arr[0] === -1 && val.length < this.datas.length) {
+            const data = val.filter(item => { return item[0] })
+            data.splice(0, 1)
+            this.teamBizName = a + (b ? ' / ' + b : '')
+            this.teamNames = data
+            this.teamCode = 0
+            this.bizName = '业务线'
+            const datas = data.map(item => { return item[0] })
+            const bizIds = Array.from(new Set(datas))
+            this.bizIdCode = bizIds
+            this.bizCode = 0
+          } else if (arr[0] !== -1 && val.length === (this.datas.length - 1)) {
+            const data = val.filter(item => { return item[0] })
+            data.unshift([-1])
+            this.teamBizName = '团队'
+            this.teamNames = data
+            this.teamCode = 1
+            this.bizName = '业务线'
+            this.bizIdCode = this.optionData
+          } else if (arr[0] !== -1) {
+            this.teamNames = val
+            this.teamBizName = a + (b ? ' / ' + b : '')
+            const datas = val.map(item => { return item[0] })
+            const bizIds = Array.from(new Set(datas))
+            this.bizIdCode = bizIds
+            let [name, nameTow] = ['', '']
+            this.searchEnum.businesslines.map(item => {
+              if (item.code === bizIds[0]) name = item.name
+              if (bizIds[1] && item.code === bizIds[1]) nameTow = item.name
+            })
+            this.bizName = name + (nameTow ? '/' + nameTow : '')
+          }
         }
-      })
-      this.searchForm.teamId = val[1]
-      this.searchForm.bizId = val[0]
-      this.bizName = a
-      this.teamBizName = a + (b ? ' / ' + b : '')
+        this.searchForm.bizIds = this.bizIdCode
+        this.handleBizId(this.searchForm.bizIds)
+        const teamNum = []
+        this.teamNames.map(s => {
+          if (s[0] === -1) {
+            this.searchForm.teamIds = [-1]
+          } else {
+            teamNum.push(s[1])
+          }
+        })
+        this.searchForm.teamIds = Array.from(new Set(teamNum))
+      } else {
+        this.teamBizName = '团队'
+        this.bizName = '业务线'
+      }
     },
     handleClick() {
       if (this.activeName === '5' && this.$refs.bugTableDialog) {
@@ -390,30 +502,40 @@ export default {
           label: item.bizName,
           children: item.teamInfos ? this.setTeamChildren(item.teamInfos) : null
         }))
+        this.options[0].value = -1
+        this.datas = []
+        this.options.map(item => {
+          if (item.children) {
+            item.children.map(i => {
+              this.datas.push([item.value, i.value])
+            })
+          } else {
+            this.datas.push([item.value])
+          }
+        })
+        this.handleChange(this.datas, this.options)
       }
       const res = await settingGetBizList({})
       if (res.code === 200 && res.data) {
         this.searchEnum.businesslines = res.data.filter(item => item.isSecret === 0)
-        this.searchEnum.businesslines.unshift({ code: null, name: '全部' })
+        this.searchEnum.businesslines.unshift({ code: -1, name: '全部' })
+        this.handleBizIdChange([[-1]], this.searchEnum.businesslines)
       }
     },
     setTeamChildren(data) {
       const arr = data.map(item => ({ value: item.code, label: item.name }))
       return arr
     },
-    async queryTeamInfoList() { // 获取用户团队列表
-      const res = await queryTeamInfoList({ curIndex: 1, pageSize: 9999, type: 0, bizId: this.searchForm.bizId })
+    async queryTeamInfoList(e) { // 获取用户团队列表
+      const res = await queryTeamInfoList({ curIndex: 1, pageSize: 9999, type: 0, bizIds: e })
       if (res.code === 200 && res.data) {
         this.searchEnum.teams = res.data.list
         this.searchEnum.teams.unshift({ teamId: null, teamName: '全部团队' })
       }
     },
     handleBizId(e) { // 业务线变动
-      this.searchForm.bizId = e
-      this.queryTeamInfoList()// 重新获取团队
-      const res = this.searchEnum.businesslines.find(item => item.code === e)
-      this.bizName = res.name
-      // this.$store.dispatch('global/setBizId', res.code)
+      this.searchForm.bizIds = e
+      this.queryTeamInfoList(this.searchForm.bizIds)// 重新获取团队
       this.handleClick()
     },
     showSchedule(e) { // 查看日程详情
@@ -730,12 +852,15 @@ export default {
 <style lang="scss" scoped>
 .cascader {
   position: absolute;
-  width: 20px;
+  width: 7%;
   /deep/.el-input__inner {
     opacity: 0;
   }
   /deep/.el-input__icon {
     display: none;
-}
+  }
+  /deep/.el-cascader__tags .el-tag {
+    display: none;
+  }
 }
 </style>