Parcourir la source

Merge branch 'http_test' into usecase_daily_0.0.2

# Conflicts:
#	src/views/home/index.vue
洪海涛 il y a 4 ans
Parent
commit
08750d6682

+ 9 - 0
src/api/versionsCalendar.js

@@ -1,6 +1,15 @@
 import request from '@/utils/request'
 import { TeamManagement } from '@/apiConfig/api'
 
+// 新增版本时间轴
+export function listTimeLineByVersion(data) {
+  return request({
+    url: TeamManagement + `/VersionSchedule/listTimeLineByVersion`,
+    method: 'post',
+    data
+  })
+}
+
 // 列表
 export function getEvent(id) {
   return request({

+ 3 - 1
src/apiConfig/requestIP.js

@@ -4,7 +4,8 @@ export let requestIp = host + '/zuul'
 export let loginUrl = host + '/sso/login?jumpto=' + 'http://zhihui-test.intra.xiaojukeji.com' + location.pathname
 export let logoutUrl = host + '/sso/logout?jumpto=' + 'http://zhihui-test.intra.xiaojukeji.com' + location.pathname
 export let envTag = 'test'
-export let envUrl = 'http://10.190.5.126:8897/#/env'
+export let envUrl = 'http://zhihui-test.intra.xiaojukeji.com/zhihui_env/'
+export let toolsUrl = 'http://zhihui-test.intra.xiaojukeji.com/tools/'
 if (location.host.indexOf('localhost') < 0) {
   host = 'http://' + location.host
   requestIp = host + '/zuul'
@@ -15,6 +16,7 @@ if (location.host.indexOf('localhost') < 0) {
   } else if (host.indexOf('zhihui.xiaojukeji.com') >= 0) {
     envTag = 'online'
     envUrl = 'http://zhihui-env.intra.xiaojukeji.com/#/env'
+    toolsUrl = 'http://zhihui.xiaojukeji.com/tools/'
   }
 }
 

+ 24 - 24
src/styles/PublicStyle/index.scss

@@ -82,129 +82,129 @@
 // 任务状态控制
 
 .status_color { // 迭代状态样式修改(颜色)
-  /deep/ input {
+  input {
     color: #6AB4FF !important;
     border: 1px solid #6AB4FF !important;
     border-color: #6AB4FF !important;
     font-weight: 900 !important;
   }
-  /deep/ .el-input__suffix {
+  .el-input__suffix {
     color: #6AB4FF !important;
     right: 1px !important;
   }
-  /deep/ .el-select__caret {
+  .el-select__caret {
     color: #6AB4FF !important;
   }
 }
 
 .status_color1 { // 迭代状态样式修改(颜色)
-      /deep/ input {
+      input {
         color: #FF8952 !important;
         border: 1px solid #FF8952 !important;
         border-color: #FF8952 !important;
         font-weight: 900 !important;
       }
-      /deep/ .el-input__suffix {
+      .el-input__suffix {
         color: #FF8952 !important;
         right: 1px !important;
       }
-      /deep/ .el-select__caret {
+      .el-select__caret {
         color: #FF8952 !important;
       }
   }
 
   .status_color2 { // 迭代状态样式修改(颜色)
-    /deep/ input {
+    input {
       color: #7ED321 !important;
        border: 1px solid #7ED321 !important;
        border-color: #7ED321 !important;
            font-weight: 900 !important;
     }
-     /deep/ .el-input__suffix {
+    .el-input__suffix {
       color: #7ED321 !important;
       right: 1px !important;
     }
-    /deep/ .el-select__caret {
+    .el-select__caret {
       color: #7ED321 !important;
     }
   }
 
   .status_color3 { // 迭代状态样式修改(颜色)
-    /deep/ input {
+    input {
       color: #D675F0 !important;
        border: 1px solid #D675F0 !important;
        border-color: #D675F0 !important;
            font-weight: 900 !important;
     }
-     /deep/ .el-input__suffix {
+    .el-input__suffix {
       color: #D675F0 !important;
       right: 1px !important;
     }
-    /deep/ .el-select__caret {
+    .el-select__caret {
       color: #D675F0 !important;
     }
   }
 
   .status_color4 { // 迭代状态样式修改(颜色)
-    /deep/ input {
+    input {
       color: #13C2C2;
        border: 1px solid #13C2C2;
        border-color: #13C2C2 !important;
            font-weight: 900;
     }
-     /deep/ .el-input__suffix {
+    .el-input__suffix {
       color: #13C2C2 !important;
       right: 1px;
     }
-    /deep/ .el-select__caret {
+    .el-select__caret {
       color: #13C2C2 !important;
     }
   }
 
   .status_color5 { // 迭代状态样式修改(颜色)
-    /deep/ input {
+    input {
       color: rgb(255, 204, 102) !important;
        border: 1px solid rgb(163, 140, 94) !important;
        border-color: rgb(255, 204, 102) !important;
            font-weight: 900 !important;
     }
-    /deep/ .el-input__suffix {
+    .el-input__suffix {
       color: rgb(255, 204, 102) !important;
       right: 1px !important;
     }
-    /deep/ .el-select__caret {
+    .el-select__caret {
       color: rgb(255, 204, 102) !important;
     }
   }
 
   .status_color6 { // 迭代状态样式修改(颜色)
-    /deep/ input {
+    input {
       color: #2F54EB !important;
        border: 1px solid #2F54EB !important;
        border-color: #2F54EB !important;
            font-weight: 900 !important;
     }
-    /deep/ .el-input__suffix {
+    .el-input__suffix {
       color: #2F54EB !important;
       right: 1px !important;
     }
-    /deep/ .el-select__caret {
+    .el-select__caret {
       color: #2F54EB !important;
     }
   }
 
   .status_color7 { // 迭代状态样式修改(颜色)
-    /deep/ input {
+    input {
       color: #F56C6C !important;
        border: 1px solid #F56C6C !important;
        border-color: #F56C6C !important;
            font-weight: 900 !important;
     }
-    /deep/ .el-input__suffix {
+    .el-input__suffix {
       color: #F56C6C !important;
       right: 1px !important;
     }
-    /deep/ .el-select__caret {
+    .el-select__caret {
       color: #F56C6C !important;
     }
   }

+ 34 - 57
src/views/home/index.vue

@@ -20,11 +20,11 @@
       <!-- <el-menu-item index="9">工具集合</el-menu-item> -->
       <!-- <el-menu-item index="5" disabled>自动化</el-menu-item> -->
       <div class="div-login">
-        <svg-icon icon-class="yonghu"/>
+        <svg-icon icon-class="yonghu" />
         <el-dropdown style="color: #ffffff" @command="handleCommand">
           <span class="el-dropdown-link">
             {{ username }}
-            <i class="el-icon-arrow-down el-icon--right"/>
+            <i class="el-icon-arrow-down el-icon--right" />
           </span>
           <el-dropdown-menu slot="dropdown">
             <el-dropdown-item command="a">退出</el-dropdown-item>
@@ -71,7 +71,7 @@
       <img style="width: 100%;z-index: -1;" src="@/assets/home_images/home.jpg">
     </div>
     <div id="content1"/>
-    <div class="div-main" style="height: 600pt;width 100%;text-align: center;">
+    <div class="div-main" style="height: 600pt;width: 100%;text-align: center;">
       <div style="font-size: 21pt;margin-top: 54pt;color: #333333;">功能介绍</div>
 
       <el-card disabled shadow="hover" style="margin-left: 0;margin-top: 42pt" @click.native="handleSelect('4')">
@@ -131,51 +131,43 @@
         <div class="div-module-introduction" />
       </el-card> -->
     </div>
-    <div
-      style="font-size: 12px; color: #FFF; height: 240px;width 100%;background-image: linear-gradient(to bottom right,#3e99fd,#1040db); text-align: center;">
+    <div style="font-size: 12px; color: #FFF; height: 240px;width: 100%;background-image: linear-gradient(to bottom right,#3e99fd,#1040db); text-align: center;">
       <div style="font-size: 20px; padding: 30px 0 10px; font-weight: 600;">质惠综合测试平台</div>
       <div style="padding: 0px 0 40px;">普惠质量技术部 效率工具FT</div>
-      <div>流程管控-廖子君&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;Mock服务-赵福贵&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;环境平台-李嘉嘉/刘青&nbsp;&nbsp;&nbsp;
-        | &nbsp;&nbsp;&nbsp;虚拟硬件-魏洁文&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;数据中心-王丽莎&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;自动化-陈雅琪/程如意
-      </div>
-      <div style="padding: 20px 0 40px;">产品设计-朱晓菲&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;UI设计-余霖&nbsp;&nbsp;&nbsp; |
-        &nbsp;&nbsp;&nbsp;前端-秦志鹏/王子乾&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;FT负责人-叶宏钢/廖子君
-      </div>
+      <div>流程管控-廖子君&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;Mock服务-赵福贵&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;环境平台-李嘉嘉/刘青&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;虚拟硬件-魏洁文&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;数据中心-王丽莎&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;自动化-陈雅琪/程如意</div>
+      <div style="padding: 20px 0 40px;">产品设计-朱晓菲&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;UI设计-余霖&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;前端-秦志鹏/王子乾&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;FT负责人-叶宏钢/廖子君</div>
       <div style="font-size: 10px;">© 2019. All Rights Reserved</div>
     </div>
-    <float-menu class="float-menu-home"/>
+    <float-menu class="float-menu-home" />
   </div>
 </template>
 
 <style scoped>
 .home-carousel {
   width: 50%;
-  border-top: 30px solid #f5f5f5;
-  border-right: 30px solid #f5f5f5;
-  border-left: 30px solid #f5f5f5;
+  border-top:30px solid #f5f5f5;
+  border-right:30px solid #f5f5f5;
+  border-left:30px solid #f5f5f5;
   border-radius: 12px;
   background: #f5f5f5;
 }
 
-.el-carousel__item:nth-child(2n) {
-  background-color: #99a9bf;
-}
-
-.el-carousel__item:nth-child(2n+1) {
-  background-color: #d3dce6;
-}
+  .el-carousel__item:nth-child(2n) {
+    background-color: #99a9bf;
+  }
 
+  .el-carousel__item:nth-child(2n+1) {
+    background-color: #d3dce6;
+  }
 .el-dropdown:hover {
   cursor: pointer;
 }
-
 .logo {
   position: absolute;
   width: 90px;
   left: 7.8%;
   top: 23%;
 }
-
 div.div-login {
   margin-top: 10px;
   color: #ffffff;
@@ -185,7 +177,6 @@ div.div-login {
   top: 22%;
   right: 8.3%;
 }
-
 div.div-introduction {
   position: absolute;
   font-size: 37pt;
@@ -196,7 +187,6 @@ div.div-introduction {
   display: flex;
   justify-content: space-between;
 }
-
 img.img-arrow {
   position: absolute;
   cursor: pointer;
@@ -204,48 +194,40 @@ img.img-arrow {
   top: 95%;
   left: 48.95%;
 }
-
 .enter-button {
   margin-top: 6vh;
   margin-right: 20px;
   padding: 14px 10px;
-  color: rgb(64, 158, 255);
+  color: rgb(64,158,255);
 }
-
 .enter-button svg {
   margin-right: 10px;
   font-size: 18px;
 }
-
 .el-menu {
   border: none;
   height: 68px;
   position: fixed;
   z-index: 10;
 }
-
 .el-menu-item {
   padding-top: 1.5pt;
   height: 100%;
 }
-
 .is-active {
   color: #0fe3ff !important;
   border-color: #0fe3ff !important;
 }
-
 .el-menu-item:hover {
   color: #0fe3ff !important;
   background-color: transparent !important;
 }
-
 .float-menu-home {
   position: fixed;
   right: 10px;
   top: 70%;
   z-index: 10;
 }
-
 .el-card {
   display: inline-block;
   width: 22%;
@@ -263,23 +245,19 @@ img.img-arrow {
   height: 60px;
   object-fit: contain;
 }
-
 div.div-title {
   font-size: 13.5pt;
   color: #333333;
   margin-top: 21pt;
 }
-
 div.div-module-introduction {
   font-size: 10.5pt;
   color: #999999;
   margin-top: 7.5pt;
 }
-
 .el-card:hover {
   cursor: pointer;
 }
-
 .el-card.expect:hover {
   cursor: not-allowed;
 }
@@ -290,7 +268,6 @@ img.img-arrow {
   animation: arrow 1.5s infinite ease-in-out;
   -webkit-animation: arrow 1.5s infinite ease-in-out;
 }
-
 @keyframes arrow {
   0% {
     opacity: 0;
@@ -305,7 +282,6 @@ img.img-arrow {
     -webkit-transform: translate(0, -10px);
   }
 }
-
 @-webkit-keyframes arrow {
   0% {
     opacity: 0;
@@ -323,11 +299,11 @@ img.img-arrow {
 </style>
 
 <script>
-import {mapGetters} from 'vuex'
+import { mapGetters } from 'vuex'
 import FloatMenu from './floatMenu'
-import {logoutUrl, envUrl} from '@/apiConfig/requestIP.js'
-import {settingUserGetBiz} from '@/api/projectIndex'
-import {materialGetMaterialList} from '@/api/monthly/index.js'
+import { logoutUrl, envUrl, toolsUrl } from '@/apiConfig/requestIP.js'
+import { settingUserGetBiz } from '@/api/projectIndex'
+import { materialGetMaterialList } from '@/api/monthly/index.js'
 
 export default {
   components: {
@@ -355,7 +331,7 @@ export default {
   mounted() {
     this.materialGetMaterialList()
     window.addEventListener('resize', () => {
-      this.imgHeight = this.$refs.image[0].height || this.imgHeight
+      this.imgHeight = this.$refs.image[0].height
     })
     window.addEventListener('scroll', this.handleScroll, true)
     window.onresize = () => {
@@ -376,10 +352,10 @@ export default {
       this.imgHeight = this.$refs.image[0].height
     },
     image_carousel(e) {
-      this.$router.push({name: '月刊详情', query: {id: e.id}})
+      this.$router.push({ name: '月刊详情', query: { id: e.id }})
     },
     async materialGetMaterialList() {
-      const res = await materialGetMaterialList({pageSize: 5})
+      const res = await materialGetMaterialList({ pageSize: 5 })
       if (res.code === 200) {
         this.abc_img = res.data
       }
@@ -398,32 +374,33 @@ export default {
           window.open(envUrl, '_self')
           break
         case '2':
-          this.$router.push({name: 'Interface'})
+          this.$router.push({ name: 'Interface' })
           break
         case '3':
-          this.$router.push({name: 'jar包管理'})
+          this.$router.push({ name: 'jar包管理' })
           break
         case '4' :
           if (!this.bizId || this.bizId === -1) {
-            this.$router.push({name: '业务线选择'})
+            this.$router.push({ name: '业务线选择' })
           } else {
-            this.$router.push({name: '项目'})
+            this.$router.push({ name: '项目' })
           }
           break
         case '6':
-          this.$router.push({name: '单车'})
+          this.$router.push({ name: '单车' })
           break
         case '7':
-          this.$router.push({name: '上线质检'})
+          this.$router.push({ name: '上线质检' })
           break
         case '8':
-          this.$router.push({name: '统计分析'})
+          this.$router.push({ name: '统计分析' })
           break
         case '9':
-          this.$router.push({name: 'Interface'})
+          // this.$router.push({ name: 'Interface' })
+          window.open(toolsUrl, '_self')
           break
         case '10':
-          this.$router.push({name: '测试用例'})
+          this.$router.push({ name: '测试用例' })
           break
       }
     },

+ 11 - 11
src/views/projectManage/bugList/bugindex.vue

@@ -16,13 +16,13 @@
               </div>
               <div class="Layout marginLeft">
                 <div class="queryName">状态</div>
-                <el-select v-model="formInline.status" size="small" style="padding-left: 2px;" clearable filterable placeholder="请选择" @change="getBugList()">
+                <el-select v-model="formInline.statusList" size="small" style="padding-left: 2px;" clearable multiple filterable placeholder="请选择" @change="getBugList()">
                   <el-option v-for="item in bugEnumList" :key="item.code" :label="item.name" :value="item.code" />
                 </el-select>
               </div>
               <div class="Layout marginLeft">
                 <div class="queryName">优先级</div>
-                <el-select v-model="formInline.priorityLevel" size="small" style="padding-left: 2px;" clearable filterable placeholder="请选择" @change="getBugList()">
+                <el-select v-model="formInline.priorityLevels" size="small" style="padding-left: 2px;" clearable multiple filterable placeholder="请选择" @change="getBugList()">
                   <el-option v-for="item in priorityLevelEnumList" :key="item.code" :label="item.name" :value="item.name" />
                 </el-select>
               </div>
@@ -36,7 +36,7 @@
                   <div class="flex_start">
                     <div class="Layout">
                       <div class="queryName">缺陷等级</div>
-                      <el-select v-model="formInline.priority" size="small" clearable filterable placeholder="请选择" @change="changeSelect()">
+                      <el-select v-model="formInline.priorityList" size="small" clearable multiple filterable placeholder="请选择" @change="changeSelect()">
                         <el-option v-for="item in priorityEnumList" :key="item.code" :label="item.name" :value="item.code" />
                       </el-select>
                     </div>
@@ -82,15 +82,15 @@
                   <div style="margin: 1.5% 0;" class="flex_start">
                     <div class="Layout">
                       <div class="queryName">提报人</div>
-                      <searchPeople :value.sync="formInline.creator" />
+                      <searchPeople :value.sync="formInline.creators" :multiple="true" />
                     </div>
                     <div class="Layout marginLeft">
                       <div class="queryName">责任人</div>
-                      <searchPeople :value.sync="formInline.assigner" />
+                      <searchPeople :value.sync="formInline.assigners" :multiple="true" />
                     </div>
                     <div class="Layout marginLeft">
                       <div class="queryName">修复人</div>
-                      <searchPeople :value.sync="formInline.currentHandler" />
+                      <searchPeople :value.sync="formInline.currentHandlers" :multiple="true" />
                     </div>
                   </div>
                   <div style="margin: 1.5% 0;" class="flex_start">
@@ -140,7 +140,7 @@
                   <div style="margin: 1.5% 0;" class="flex_start">
                     <div class="Layout">
                       <div class="queryName">端类型</div>
-                      <el-select v-model="formInline.sysType" size="small" clearable filterable placeholder="请选择" @change="changeSelect()">
+                      <el-select v-model="formInline.sysTypes" size="small" clearable multiple filterable placeholder="请选择" @change="changeSelect()">
                         <el-option v-for="item in sysTypeEnumList" :key="item.code" :label="item.name" :value="item.code" />
                       </el-select>
                     </div>
@@ -422,8 +422,8 @@ export default {
       combination = _.cloneDeep(this.formInline)
       this.formInline = { bugName: combination.bugName }
       this.$set(this.formInline, 'bugId', combination.bugId)
-      this.$set(this.formInline, 'status', combination.status)
-      this.$set(this.formInline, 'priorityLevel', combination.priorityLevel)
+      this.$set(this.formInline, 'statusList', combination.statusList)
+      this.$set(this.formInline, 'priorityLevels', combination.priorityLevels)
       this.curIndex = 1
       this.getBugList()
     },
@@ -580,8 +580,8 @@ export default {
     async getFilterItem(filterId) { // 获取单个过滤器
       this.stratAndEnd = []
       const combination = _.cloneDeep(this.formInline)
-      const { bugId, status, priorityLevel } = combination
-      this.formInline = { bugId, status, priorityLevel }
+      const { bugId, statusList, priorityLevels } = combination
+      this.formInline = { bugId, statusList, priorityLevels }
       this.$router.push({ path: this.$route.path, query: { ...this.$route.query, filterId: filterId }})
       const res = await getFilterItem(filterId)
       if (res.code === 200) {

+ 22 - 15
src/views/projectManage/bugList/file/createdBug.vue

@@ -500,28 +500,35 @@ export default {
       // 创建(提交)
       this.$refs['formInline'].validate(valid => {
         if (valid) {
-          const data = e
-          data.currentHandler = e.currentHandler.join()
-          data.assigner = e.assigner.join()
+          const data = { ...e }
+          // data.currentHandler = data.currentHandler.join()
+          // data.assigner = data.assigner.join()
           var user = {
             name: this.userNames,
             ename: this.userInformation,
             id: ''
           }
-          bugCreate({ bugBaseInfo: data, user }).then(res => {
+          bugCreate({ bugBaseInfo: {
+            ...data,
+            assigner: data.assigner.join(),
+            currentHandler: data.currentHandler.join()
+          }, user }).then(res => {
             this.bugListSelect()
-            this.modalShow = false
-            this.$message({
-              message: res.msg,
-              type: 'success',
-              duration: 1000,
-              offset: 150
-            })
-            this.$emit('father')
-            if (this.getBugList) {
-              this.getBugList()
+
+            if (res.code === 200) {
+              this.$message({
+                message: res.msg,
+                type: 'success',
+                duration: 1000,
+                offset: 150
+              })
+              this.$emit('father')
+              if (this.getBugList) {
+                this.getBugList()
+              }
+              this.$emit('getBugList')
             }
-            this.$emit('getBugList')
+            this.modalShow = res.code !== 200
           })
         }
       })

+ 14 - 3
src/views/projectManage/onlineproblem/component/list.vue

@@ -12,9 +12,9 @@
         size="small"
         show-overflow-tooltip="true"
       >
-        <el-table-column label="优先级" width="105" prop="priority" sortable align="right">
+        <el-table-column label="优先级" width="105" prop="priority" sortable align="center">
           <template slot-scope="scope">
-            <span class="div_priority" :style="{background: priorityColors[scope.row.priority]}">{{ scope.row.priorityName }}</span>
+            <span :class="[scope.row.priority === '7' ? 'div_priorityUnrated' : 'div_priority']" :style="{background: priorityColors[scope.row.priority]}">{{ scope.row.priorityName }}</span>
           </template>
         </el-table-column>
         <el-table-column label="标题" min-width="200" show-overflow-tooltip align="left">
@@ -75,7 +75,7 @@ export default {
   data() {
     return {
       table_loading: false,
-      priorityColors: ['#F56C6C', '#FF8952', '#F5E300', '#7ED321', '#61D3B8', '#69B3FF', '#BDBDBD']
+      priorityColors: ['#F56C6C', '#FF8952', '#F5E300', '#7ED321', '#61D3B8', '#69B3FF', '#D675F0', '#BDBDBD']
     }
   },
   methods: {
@@ -133,6 +133,17 @@ export default {
     border-radius: 4px;
     margin-right: 30px;
   }
+  .div_priorityUnrated {
+    display: inline-block;
+    text-align: center;
+    width: 50px;
+    text-align: center;
+    line-height: 24px;
+    font-size: 14px;
+    color: #fff;
+    border-radius: 4px;
+    margin-right: 30px;
+  }
 }
 </style>
 

+ 30 - 18
src/views/projectManage/version/list/index.vue

@@ -12,7 +12,7 @@
         <el-row style="padding: 5px 0 0 15px">
           <el-col :span="20">
             <span class="queryName">客户端</span>
-            <el-select v-model="searchForm.clientType" size="small" style="padding-left: 2px;" clearable filterable placeholder="请选择" @change="onChangeClientType(searchForm.clientType);getVersionHomePageList()">
+            <el-select v-model="searchForm.clientType" size="small" style="padding-left: 2px;" clearable filterable placeholder="请选择" @change="onChangeClientType(searchForm.clientType);getVersionHomePageList(tabName)">
               <el-option
                 v-for="item in searchInfo.clients"
                 :key="item.code"
@@ -28,7 +28,7 @@
               clearable
               filterable
               placeholder="请选择"
-              @change="onChangeVersionType(searchForm.versionType);getVersionHomePageList()"
+              @change="onChangeVersionType(searchForm.versionType);getVersionHomePageList(tabName)"
             >
               <el-option v-for="item in searchInfo.versions" :key="item.code" :label="item.msg" :value="item.code" />
             </el-select>
@@ -47,7 +47,7 @@
             <el-row>
               <el-col :span="24">
                 <el-table v-loading="loading" :data="tableData" style="width: 100%;" highlight-current-row :header-cell-style="{ color: '#4A4A4A', fontSize: '14px', fontWeight: '500' }">
-                  <el-table-column prop="priority" label="优先级" min-width="90" align="right">
+                  <el-table-column prop="priority" label="优先级" min-width="10%">
                     <template v-slot="scope">
                       <div class="div_priority" :style="{background: priorityColors[scope.row.priority%priorityColors.length]}">{{ 'P'+scope.row.priority }}</div>
                       <!-- <div :class="[{ active: isActive=='h' }, { active1: isActive=='l' },{ active1: isActive=='l' }]" /> -->
@@ -119,7 +119,7 @@
 import { EncryptId } from '@/utils/crypto-js.js'
 import { mapGetters } from 'vuex'
 import TimeLine from './timeLine'
-import { getEvent } from '@/api/versionsCalendar'
+import { listTimeLineByVersion } from '@/api/versionsCalendar'
 import { getVersionHomePageList, showAppClientEnum, showVersionEnum } from '@/api/version.js'
 import tasksList from '../components/taskList'
 import extraUrgent from '@/assets/extraUrgent.png'
@@ -133,6 +133,7 @@ export default {
   },
   data() {
     return {
+      tabName: 'REQUIREMENT_COMM',
       extraUrgent: extraUrgent,
       activeName: 'first', // 默认展示需求
       timeLineSteps: [],
@@ -315,7 +316,7 @@ export default {
       handler(newV) {
         if (newV === -1) return
         this.searchForm.bizId = newV
-        this.showAppClientEnum()
+        this.showAppClientEnum('REQUIREMENT_COMM')
         this.showVersionEnum()
       },
       immediate: true
@@ -336,8 +337,15 @@ export default {
       }
     },
     handleClick(tab, event) {
-      tab.label === '任务' ? this.$refs.tasklist.get_allTask() : ''
-      tab.label === '需求' ? this.getVersionHomePageList() : ''
+      if (tab.label === '任务') {
+        this.tabName = 'TASK_COMM'
+        this.$refs.tasklist.get_allTask()
+      } else if (tab.label === '需求') {
+        this.tabName = 'REQUIREMENT_COMM'
+      }
+      this.getVersionHomePageList(this.tabName)
+      // tab.label === '任务' ? this.$refs.tasklist.get_allTask() : ''
+      // tab.label === '需求' ? this.getVersionHomePageList() : ''
     },
     getToRequirementDetails(id) {
       const bizId_id = EncryptId(`${this.bizId}_${id}`)
@@ -346,18 +354,18 @@ export default {
     // 分页pageSize选择
     handleSizeChange(pageSize) {
       this.searchForm.pageSize = pageSize
-      this.getVersionHomePageList()
+      this.getVersionHomePageList(this.getVersionHomePageList(this.tabName))
     },
     // 当前页选择
     handleCurrentChange(currentPage) {
       this.searchForm.curIndex = currentPage
-      this.getVersionHomePageList()
+      this.getVersionHomePageList(this.getVersionHomePageList(this.tabName))
     },
-    async getVersionHomePageList() {
+    async getVersionHomePageList(tabName) {
       this.loading = true
       this.searchForm.bizId = this.bizId
       const res = await getVersionHomePageList(this.searchForm)
-      this.getEvent(this.searchForm.versionType)
+      this.getEvent(this.searchForm, tabName)
       if (res.code === 200) {
         this.createTaskOption(res.data.list)
         this.createTaskHealthOption(res.data.list)
@@ -369,17 +377,20 @@ export default {
       this.loading = false
     },
     // 获取版本事件
-    getEvent(id) {
-      if (!id) {
+    getEvent(data, tabName) {
+      console.log(data, 'dddd')
+      if (!data.versionType) {
         return false
       }
-      getEvent(id).then(res => {
+      const obj = { 'clientType': data.clientType, 'type': tabName, 'versionType': data.versionType }
+      listTimeLineByVersion(obj).then(res => {
         this.timeLineSteps = []
         if (res.data) {
           for (const i in res.data) {
             const item = {
               dateLabel: res.data[i].endTime,
-              title: res.data[i].name
+              title: res.data[i].name,
+              type: res.data[i].type
             }
             this.timeLineSteps.push(item)
           }
@@ -424,7 +435,7 @@ export default {
         return ''
       }
     },
-    showAppClientEnum() {
+    showAppClientEnum(e) {
       showAppClientEnum()
         .then(res => {
           if (res.code === 200) {
@@ -438,7 +449,7 @@ export default {
                 this.searchTitle.version = this.searchInfo.versions[0].msg
               }
             }
-            this.getVersionHomePageList()
+            this.getVersionHomePageList(e)
           } else {
             this.$message.warning(res.msg)
           }
@@ -519,8 +530,9 @@ export default {
 }
 .time-line-container {
   margin-top: 20px;
+  padding: 0 20px;
   border: 1px solid rgba(238,238,238,1);
-  background: #FCFCFC;
+  background: #fcfcfc;
   border-radius: 4px;
 }
 .queryName {

+ 41 - 70
src/views/projectManage/version/list/timeLine.vue

@@ -3,28 +3,20 @@
     <swiper ref="mySwiper" class="swiper-wrapper timeline" :options="options">
       <swiper-slide v-for="(item,index) in steps" :key="index" class="swiper-slide">
         <div class="line" />
-        <div class="center" :class="[index%2==0?'circle1':'circle2']"><div class="circle-in center" /></div>
-        <div :class="[index%2==0?'point1':'point2']" />
-        <div :class="[index%2==0?'content1':'content2']">
+        <div class="center" :class="'circle' + item.type">
+          <div :class="[item.type === 2 ? 'circle' : 'circle-in', 'center']" />
+        </div>
+        <div :class="'content' + item.type">
           <span>{{ item.title }}</span><span class="date">{{ item.dateLabel }}</span>
         </div>
       </swiper-slide>
-      <!-- 分页器 -->
-      <!-- <div slot="pagination" class="swiper-pagination" /> -->
-      <!-- 左右箭头 -->
     </swiper>
-    <div class="swiper-button">
-      <div class="swiper-button-prev" />
-      <div class="swiper-button-next" />
-    </div>
   </div>
 </template>
 
 <script>
 import preImg from '@/icons/png/previous.png'
 import nextImg from '@/icons/png/next.png'
-// import 'swiper/dist/css/swiper.css'
-// import Swiper from 'swiper'
 import { Swiper, SwiperSlide, directive } from 'vue-awesome-swiper'
 import 'swiper/css/swiper.css'
 
@@ -43,11 +35,7 @@ export default {
         return [
           { dateLabel: 'January 2017', title: 'Gathering Information' },
           { dateLabel: 'February 2017', title: 'Planning' },
-          { dateLabel: 'March 2017', title: 'Design' },
-          { dateLabel: 'April 2017', title: 'Content Writing and Assembly' },
-          { dateLabel: 'May 2017', title: 'Coding' },
-          { dateLabel: 'June 2017', title: 'Testing, Review & Launch' },
-          { dateLabel: 'July 2017', title: 'Maintenance' }
+          { dateLabel: 'March 2017', title: 'Design' }
         ]
       }
     }
@@ -57,15 +45,6 @@ export default {
       nextImg: nextImg,
       preImg: preImg,
       options: {
-        // 设置点击箭头
-        navigation: {
-          nextEl: '.swiper-button-next',
-          prevEl: '.swiper-button-prev'
-        },
-        pagination: {
-          el: '.swiper-pagination'
-        },
-        // pagination: '.swiper-pagination',
         slidesPerView: 5,
         grabCursor: true
       }
@@ -87,18 +66,21 @@ export default {
 
 <style scoped lang="scss">
 .swiper-container {
-  padding: 50px 0;
+  padding: 40px 0;
   position: relative;
+  overflow-x: auto;
 }
+.swiper-container::-webkit-scrollbar {display:none}
 .timeline {
-  width: 90%;
+  width: 100%;
   list-style-type: none;
   display: flex;
   padding: 0;
+  margin: 0;
   text-align: center;
 }
 .swiper-slide {
-  height: 150px;
+  min-height: 180px;
   width: 200px;
   display: flex;
   align-items: center;
@@ -106,63 +88,58 @@ export default {
   position: relative;
   .line{
     width: 100%;
-    border: 1px solid #909399;
+    border: 1px solid #E5E5E5;
   }
   .center {
     left: 50%;
     top: 50%;
     transform: translate(-50%,-50%);
   }
-  .circle1,.circle2 {
+  .circle0,.circle1,.circle2 {
     position: absolute;
-    height: 15px;
-    width: 15px;
-    border-radius: 50%;
-    border: 3px solid #67C23A;
   }
-  .circle1::before {
+  .circle0::before {
     content: '';
     position: absolute;
-    height: 30px;
-    border: 1px solid #67C23A;
+    height: 50px;
+    border: 1px solid #4091f7;
     left: 50%;
-    top: 0;
+    top: -15px;
     transform: translate(-50%,-33px);
   }
-  .circle2::after{
+  .circle1::after{
     content: '';
     position: absolute;
-    height: 30px;
-    border: 1px solid #67C23A;
+    height: 50px;
+    border: 1px solid #4091f7;
     left: 50%;
-    bottom: 0;
+    bottom: -15px;
     transform: translate(-50%,33px);
   }
-  .circle-in {
+  .circle2::after{
+    content: '';
     position: absolute;
-    border-radius: 50%;
-    border: 4px solid #67C23A;
+    left: 50%;
+    bottom: 0;
+    transform: translate(-50%,33px);
   }
-  .point1 {
+  .circle {
+    width: 8px;
+    height: 8px;
     position: absolute;
-    left: 50%;
-    top: 50%;
-    transform: translate(-50%,-45px);
     border-radius: 50%;
-    border: 4px solid #67C23A;
+    background: #FFF;
+    border: 2px solid #92d048;
   }
-  .point2 {
+  .circle-in {
     position: absolute;
-    left: 50%;
-    bottom: 50%;
-    transform: translate(-50%,45px);
     border-radius: 50%;
-    border: 4px solid #67C23A;
+    border: 6px solid #4091f7;
   }
-  .content1,.content2 {
+  .content0,.content1,.content2 {
     width: 100%;
     font-size: 14px;
-    color: #909399;
+    color: #333;
     position: absolute;
     left: 50%;
     transform: translateX(-50%);
@@ -170,11 +147,15 @@ export default {
       margin-right: 5px;
     }
   }
+  .content0 {
+    top: 8px;
+  }
   .content1 {
-    top:10px;
+    bottom: 8px;
   }
   .content2 {
-    bottom:10px;
+    color: #666;
+    top: 55px;
   }
 }
 .swiper-slide:nth-child(2n) {
@@ -188,13 +169,3 @@ export default {
   top: -75px;
 }
 </style>
-
-<style>
-.swiper-container .swiper-pagination-bullet-active {
-  background-color: #409eff;
-}
-.swiper-container .swiper-button-prev,
-.swiper-container .swiper-button-next {
-  color: #409eff;
-}
-</style>

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

@@ -145,7 +145,7 @@
               <div class="task-name">{{ details.reportTime }}</div>
             </div>
           </el-main>
-          <el-footer class="report-mains">
+          <el-footer class="report-mains" style="height: auto;">
             <div class="title">
               <div class="blur-column" />关联任务
             </div>

+ 1 - 1
src/views/reportManagement/Testing/components/deliverDetails.vue

@@ -150,7 +150,7 @@
               <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>

+ 72 - 4
src/views/workbench/components/statisticsSection.vue

@@ -28,13 +28,33 @@
           <el-radio-group v-model="itemType" @change="onChangeTagRadio">
             <el-radio-button label="0">未上线{{ title }}状态分布</el-radio-button>
             <el-radio-button label="1">
-              本周{{ title }}状态流入图
+              {{ title }}状态流入图
               <el-tooltip class="item" effect="dark" :content="'推进状态的时间是在本周的需求数量/推进状态的时间是在本周的任务数量'" placement="top">
                 <i class="el-icon-info" />
               </el-tooltip>
             </el-radio-button>
           </el-radio-group>
-          <h3 class="mt5" @click="getAll()">总数:<span>{{ totalTask }}</span></h3>
+          <div v-if="itemType === '1'" class="spaceBetween">
+            <div class="date-select">
+              <span :class="[dateType==='WEEK'?'date-active':'']" class="date-item" @click.stop="dateType='WEEK';setDate('WEEK')">本周</span>
+              <span :class="[dateType==='MONTH'?'date-active':'']" class="date-item" @click.stop="dateType='MONTH';setDate('MONTH')">本月</span>
+              <span :class="[dateType==='YEAR'?'date-active':'']" class="date-item" @click.stop="dateType='YEAR';setDate('YEAR')">本年</span>
+            </div>
+            <el-date-picker
+              v-model="stratAndEnd"
+              type="daterange"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              size="small"
+              value-format="yyyy.MM.dd"
+              :default-time="['00:00:00','23:59:59']"
+              @change="setDateList()"
+            />
+            <h3 class="mt5" @click="getAll()">总数:<span>{{ totalTask }}</span></h3>
+          </div>
+          <h3 v-if="itemType === '0'" class="mt5" @click="getAll()">总数:<span>{{ totalTask }}</span></h3>
           <div class="chart-contain">
             <status-stay-chart :chart-data="echartsOption" @onClick="chartChange" />
             <!-- <normal-echart v-if="echartsOption" :chart-id="type+title" :option="echartsOption" @onClick="chartChange" /> -->
@@ -66,6 +86,9 @@
 </template>
 
 <script>
+import moment from 'moment'
+moment.locale('zh-cn')
+// import { getPersonalRequireDisData } from '@/api/workSchedule.js'
 import normalEchart from '@/components/chart/normalEchart'
 import statusStayChart from '@/components/chart/statusStayChart'
 export default {
@@ -107,6 +130,14 @@ export default {
       statisticsList: [],
       echartsOption: null,
       echartsOption2: null,
+      stratAndEnd: [], // 开始结束日期
+      dateType: 'WEEK', // 时间选择类型
+      bugCountTimeType: 1, // 获取趋缺陷势图数据接口入参:1本周 2本月 3本年
+      timeTypeList: [ // 日期选择
+        { code: 1, label: '周' },
+        { code: 2, label: '月' },
+        { code: 3, label: '年' }
+      ],
       totalTask: 0, // 所有总数
       totalIdList: 0, // 所有总数的idList
       itemType: '0', // 0: 未上线的需求分布  1: 本周状态流入图
@@ -158,13 +189,24 @@ export default {
           this.getChart(requestChart, '3')
           this.getChart(requestChart, '5')
         } else {
+          this.itemType = '0'
           this.getChart(requestChart, this.itemType)
         }
       }
     },
+    setDate(type) { // 日期筛选
+      this.stratAndEnd = []
+      const { requestChart } = this.requestObj
+      this.getChart(requestChart, this.itemType, { dateType: this.dateType })
+    },
+    setDateList() { // 日期筛选
+      this.dateType = ''
+      const { requestChart } = this.requestObj
+      this.getChart(requestChart, this.itemType, { dayTime: this.stratAndEnd })
+    },
     onChangeTagRadio(e) {
       const { requestChart } = this.requestObj
-      this.getChart(requestChart, this.itemType)
+      this.getChart(requestChart, this.itemType, { dateType: this.dateType })
     },
     async getData(requestUrl) { // 获取顶部数据
       const res = await requestUrl({ teamSearchInfo: this.searchForm })
@@ -183,12 +225,17 @@ export default {
         }
       }
     },
-    async getChart(requestUrl, type) { // 获取图表数据
+    async getChart(requestUrl, type, data) { // 获取图表数据
       const res = await requestUrl({ teamSearchInfo: this.searchForm, type: type })
       if (type === '3') {
         this.echartsOption = this.setChart(res.data)
       } else if (type === '5') {
         this.echartsOption2 = this.setChart(res.data)
+      } else if (type === '1') {
+        const res = await requestUrl({ teamSearchInfo: this.searchForm, type, ...data })
+        this.totalTask = res.data.total
+        this.totalIdList = res.data.idList
+        this.echartsOption = { ...res.data, type: this.itemType }
       } else {
         const res = await requestUrl({ teamSearchInfo: this.searchForm, type })
         this.totalTask = res.data.total
@@ -373,4 +420,25 @@ export default {
 .drawer-pull {
   top: 1px;
 }
+.date-select {
+      line-height: 20px;
+      display: inline-block;
+      .date-item {
+        display: inline-block;
+        width: 40px;
+        text-align: center;
+        cursor: pointer;
+        border-radius: 2px;
+      }
+      .date-active {
+        color: #FFFFFF;
+        background-color: #409EFF;
+      }
+    }
+  .spaceBetween {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-top: 5px;
+  }
 </style>

+ 13 - 0
src/views/workbench/person/components/myFullCalendar.vue

@@ -409,6 +409,19 @@ export default {
   position: relative;
   bottom: 3px;
 }
+
+#small-calendar
+  .fc-dayGridMonth-view
+  .table-bordered
+  .fc-body
+  .fc-event-container
+  .fc-content
+  .fc-title {
+  font-size: 12px;
+  display: inline-block;
+  position: relative;
+  bottom: 3px;
+}
 #small-calendar
   .fc-dayGridMonth-view
   .table-bordered