qinzhipeng_v@didiglobal.com 4 lat temu
rodzic
commit
2ed2814589

+ 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({

+ 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) {

+ 28 - 17
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>
@@ -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)
           }
@@ -520,7 +531,7 @@ export default {
 .time-line-container {
   margin-top: 20px;
   border: 1px solid rgba(238,238,238,1);
-  background: #FCFCFC;
+  background: #fcfcfc;
   border-radius: 4px;
 }
 .queryName {

+ 31 - 62
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
       }
@@ -89,7 +68,9 @@ export default {
 .swiper-container {
   padding: 50px 0;
   position: relative;
+  overflow-x: auto;
 }
+.swiper-container::-webkit-scrollbar {display:none}
 .timeline {
   width: 90%;
   list-style-type: none;
@@ -106,60 +87,55 @@ 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;
+    border: 1px solid #60AEFF;
     left: 50%;
     top: 0;
     transform: translate(-50%,-33px);
   }
-  .circle2::after{
+  .circle1::after{
     content: '';
     position: absolute;
     height: 30px;
-    border: 1px solid #67C23A;
+    border: 1px solid #60AEFF;
     left: 50%;
     bottom: 0;
     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: 10px;
+    height: 10px;
     position: absolute;
-    left: 50%;
-    top: 50%;
-    transform: translate(-50%,-45px);
     border-radius: 50%;
-    border: 4px solid #67C23A;
+    background: #FFF;
+    border: 2px solid #7ED321;
   }
-  .point2 {
+  .circle-in {
     position: absolute;
-    left: 50%;
-    bottom: 50%;
-    transform: translate(-50%,45px);
     border-radius: 50%;
-    border: 4px solid #67C23A;
+    border: 7px solid #60AEFF;
   }
-  .content1,.content2 {
+  .content0,.content1,.content2 {
     width: 100%;
     font-size: 14px;
     color: #909399;
@@ -170,12 +146,15 @@ export default {
       margin-right: 5px;
     }
   }
-  .content1 {
+  .content0 {
     top:10px;
   }
-  .content2 {
+  .content1 {
     bottom:10px;
   }
+  .content2 {
+    top: 36px;
+  }
 }
 .swiper-slide:nth-child(2n) {
   width: 40%;
@@ -188,13 +167,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>

+ 77 - 2
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="dateType = ''"
+            />
+            <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,8 @@
 </template>
 
 <script>
+import moment from 'moment'
+moment.locale('zh-cn')
 import normalEchart from '@/components/chart/normalEchart'
 import statusStayChart from '@/components/chart/statusStayChart'
 export default {
@@ -107,6 +129,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: 本周状态流入图
@@ -162,6 +192,30 @@ export default {
         }
       }
     },
+    setDate(type) { // 日期筛选
+      let startDate = null
+      let endDate = null
+      switch (type) {
+        case 'week':
+          startDate = moment().startOf('week').format('YYYY.MM.DD')
+          endDate = moment().endOf('week').format('YYYY.MM.DD')
+          this.bugCountTimeType = this.timeTypeList[0].code
+          break
+        case 'month':
+          startDate = moment().startOf('month').format('YYYY.MM.DD')
+          endDate = moment().endOf('month').format('YYYY.MM.DD')
+          this.bugCountTimeType = this.timeTypeList[1].code
+          break
+        case 'year':
+          startDate = moment().startOf('year').format('YYYY.MM.DD')
+          endDate = moment().endOf('year').format('YYYY.MM.DD')
+          this.bugCountTimeType = this.timeTypeList[2].code
+          break
+      }
+      this.stratAndEnd = [startDate, endDate]
+      // this.onSubmit()
+      console.log(this.stratAndEnd, this.bugCountTimeType)
+    },
     onChangeTagRadio(e) {
       const { requestChart } = this.requestObj
       this.getChart(requestChart, this.itemType)
@@ -373,4 +427,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>