wenbobowen преди 4 години
родител
ревизия
d812949420

+ 3 - 3
src/components/addIcon/index.vue

@@ -24,11 +24,11 @@ export default {
 <style scoped lang='less'>
 .addIcon {
   display: inline-block;
-  width: 38px;
-  height: 38px;
+  width: 34px;
+  height: 34px;
   border-radius: 13px;
   text-align: center;
-  padding: 10px;
+  padding: 8px;
   .inner {
     width: 18px;
     height: 18px;

+ 6 - 1
src/styles/index.less

@@ -179,7 +179,12 @@ div:focus {
   vertical-align: middle;
   width: 80%;
 }
-
+.textRed {
+  color: #F5222D;
+}
+.textBlue {
+  color: #3F9DFF;
+}
 .iconfont {
   font-family: 'iconfont' !important;
   font-size: 16px;

+ 32 - 16
src/views/dataBigManage/components/dataItem/index.vue

@@ -1,23 +1,25 @@
 <template>
-  <div class="dataItem flex-center-start" :style="{ background: data.bgColor, padding: data.padding }">
-    <addIcon :inner-color="data.innerColor" :out-color="data.outColor" />
-    <div class="textWord">
+  <div v-if="item" class="dataItem flex-center-start" :style="{ background: item.bgColor, padding: item.padding, alignItems: item.type === 'circle' && 'baseline' }">
+    <div v-if="item.type === 'circle'" class="circle" :style="{ background: item.color }" />
+    <addIcon v-else :inner-color="item.innerColor" :out-color="item.outColor" />
+    <div class="textWord ellipsis">
       <div>
-        <span>{{ data.label }}</span>
-        <span class="title">{{ data.title }}</span>
-        <span>{{ data.titleUnit }}</span>
+        <span :style="{color: item.labelColor ? item.labelColor : '#666'}">{{ item.label }}</span>
+        <span class="title">{{ item.title }}</span>
+        <span>{{ item.titleUnit }}</span>
+        <span v-if="item.remark" class="remark">({{ item.remark }})</span>
       </div>
       <!-- <div class="ellipsis" v-html="subTitle" /> -->
       <div class="subTitleName">
-        <span v-if="data.subTitleUnit === 'rate'">
+        <span v-if="item.subTitleUnit === 'rate'">
           <span>环比:</span>
-          <span :class="Number(data.subTitle) > 0 ? 'item-up' : 'item-down'">
-            <i class="el-icon-caret-top" v-if="Number(data.subTitle) > 0" />
-            <i class="el-icon-caret-bottom" v-else />
-            {{ data.subTitle }}%
+          <span :class="Number(item.subTitle) > 0 ? 'item-up' : 'item-down'">
+            <i v-if="Number(item.subTitle) > 0" class="el-icon-caret-top" />
+            <i v-else class="el-icon-caret-bottom" />
+            {{ item.subTitle }}%
           </span>
         </span>
-        <span v-else v-html="data.subTitle" />
+        <span v-else v-html="item.subTitle" />
       </div>
     </div>
   </div>
@@ -29,10 +31,15 @@ export default {
     addIcon
   },
   props: {
-    data: {
+    item: {
       type: Object,
       required: false,
       default: () => {}
+    },
+    type: {
+      type: String,
+      required: false,
+      default: 'addIcon'
     }
   }
 }
@@ -40,13 +47,22 @@ export default {
 <style scoped lang='less'>
 .dataItem {
   border-radius: 6px;
-  padding: 8px 12px;
+  padding: 8px 6px;
+  color: #666;
+  .circle {
+    width: 6px;
+    height: 6px;
+    border-radius: 3px;
+  }
   .textWord {
-    padding-left: 10px;
+    padding-left: 4px;
     width: 90%;
+    .remark {
+      font-size: 12px;
+    }
     .title {
       color: #333;
-      font-size: 18px;
+      font-size: 14px;
       font-weight: 600;
     }
     .subTitleName {

+ 157 - 155
src/views/dataBigManage/components/efficiencyModule/index.vue

@@ -1,189 +1,150 @@
 <template>
   <el-row class="qualityModule">
     <el-col :span="7">
-      <div class="itemBox" style="border-left-color: #3F9DFE; background: #F5FAFF">
+      <div v-if="mainData.requirementData" class="itemBox" style="border-left-color: #3F9DFE; background: #F5FAFF">
         <div class="titleLevel3" style="color: #3F9DFE;">需求平均交付周期</div>
         <div class="content">
           <div class="item effic" style="color: #3F9DFE;">
-            <span class="num">14.5</span>
+            <span
+              class="num"
+              @click.stop="$emit(
+                'checkDetialModal',
+                { ...mainData.requirementData, activeLabel: mainData.requirementData.label }
+              )"
+            >{{ mainData.requirementData.countStr }}</span>
             <span class="unit">天</span>
           </div>
           <div class="item point">
             <span class="title">环比:</span>
-            <span class="num">
-              <i class="el-icon-caret-top" />
-              <i class="el-icon-caret-bottom" />
-              11%
+            <span
+              :class="Number(mainData.requirementData.chainRatio) > 0 ? 'item-up num' : 'item-down num'"
+              @click.stop="$emit(
+                'checkDetialModal',
+                { ...mainData.requirementData, activeLabel: mainData.requirementData.label }
+              )"
+            >
+              <i v-if="Number(mainData.requirementData.chainRatio) > 0" class="el-icon-caret-top" />
+              <i v-else class="el-icon-caret-bottom" />
+              {{ mainData.requirementData.chainRatio }}%
             </span>
           </div>
         </div>
         <div class="foot">
-          <div class="item">
-            <span class="title">产品周期:</span>
+          <div
+            v-for="item in mainData.requirementData.subCountList"
+            :key="item.label"
+            class="item"
+            @click.stop="$emit(
+              'checkDetialModal',
+              { ...mainData.requirementData, activeLabel: item.label }
+            )"
+          >
+            <span class="title">{{ item.label }}:</span>
             <span class="value">
-              <span class="num">14</span>
-              天
-            </span>
-          </div>
-          <div class="line" />
-          <div class="item">
-            <span class="title">研发周期:</span>
-            <span class="value">
-              <span class="num">14</span>
-              天
-            </span>
-          </div>
-          <div class="line" />
-          <div class="item">
-            <span class="title">测试周期:</span>
-            <span class="value">
-              <span class="num">14</span>
-              天
+              <span class="num">{{ item.countStr }}</span>
+              {{ item.unit }}
             </span>
           </div>
         </div>
       </div>
     </el-col>
     <el-col :span="7">
-      <div class="itemBox" style="border-left-color: #7ED321; background: #F7FDF2">
+      <div v-if="mainData.requirementPeopleData" class="itemBox" style="border-left-color: #7ED321; background: #F7FDF2">
         <div class="titleLevel3" style="color: #7ED321;">平均需求使用人力</div>
         <div class="content">
           <div class="item effic" style="color: #7ED321;margin-bottom: 20px;">
-            <span class="num">14.5</span>
+            <span class="num">{{ mainData.requirementPeopleData.countStr }}</span>
             <span class="unit">人/日</span>
           </div>
           <div class="item point" style="margin-bottom: 20px;">
             <span class="title">环比:</span>
-            <span class="num">
-              <i class="el-icon-caret-top" />
-              <i class="el-icon-caret-bottom" />
-              11%
+            <span :class="Number(mainData.requirementPeopleData.chainRatio) > 0 ? 'item-up num' : 'item-down num'">
+              <i v-if="Number(mainData.requirementPeopleData.chainRatio) > 0" class="el-icon-caret-top" />
+              <i v-else class="el-icon-caret-bottom" />
+              {{ mainData.requirementPeopleData.chainRatio }}%
             </span>
           </div>
         </div>
         <div class="foot">
-          <div class="item">
-            <span class="title">开发人力:</span>
+          <div v-for="item in mainData.requirementPeopleData.subCountList" :key="item.label" class="item">
+            <span class="title">{{ item.label }}:</span>
             <span class="value">
-              <span class="num">14</span>
-              人/日
-            </span>
-          </div>
-          <div class="line" />
-          <div class="item">
-            <span class="title">测试人力:</span>
-            <span class="value">
-              <span class="num">14</span>
-              人/日
-            </span>
-          </div>
-          <!-- <div class="line" /> -->
-          <div class="item" style="display: block; margin-left: 0px">
-            <span class="title">联调人力:</span>
-            <span class="value">
-              <span class="num">14</span>
-              人/日
+              <span class="num">{{ item.countStr }}</span>
+              {{ item.unit }}
             </span>
           </div>
         </div>
       </div>
     </el-col>
     <el-col :span="6">
-      <div class="itemBox" style="border-left-color: #F5222D; background: #FFF8F8">
+      <div v-if="mainData.bugAvgRepairData" class="itemBox" style="border-left-color: #F5222D; background: #FFF8F8">
         <div class="titleLevel3" style="color: #F5222D;">缺陷平均修复时长</div>
         <div class="content">
           <div class="item effic" style="color: #F5222D;">
-            <span class="num">20.5</span>
+            <span class="num">{{ mainData.bugAvgRepairData.countStr }}</span>
             <span class="unit">h</span>
           </div>
           <div class="item point">
             <span class="title">环比:</span>
-            <span class="num">
-              <i class="el-icon-caret-top" />
-              <i class="el-icon-caret-bottom" />
-              11%
+            <span :class="Number(mainData.bugAvgRepairData.chainRatio) > 0 ? 'item-up num' : 'item-down num'">
+              <i v-if="Number(mainData.bugAvgRepairData.chainRatio) > 0" class="el-icon-caret-top" />
+              <i v-else class="el-icon-caret-bottom" />
+              {{ mainData.bugAvgRepairData.chainRatio }}%
             </span>
           </div>
         </div>
         <div class="foot">
-          <div class="item">
-            <span class="title">P0&P1:</span>
+          <div v-for="item in mainData.bugAvgRepairData.subCountList" :key="item.label" class="item">
+            <span class="title">{{ item.label }}:</span>
             <span class="value">
-              <span class="num">14</span>
-              h
-            </span>
-          </div>
-          <div class="line" />
-          <div class="item">
-            <span class="title">P1以上:</span>
-            <span class="value">
-              <span class="num">14</span>
-              h
+              <span class="num">{{ item.countStr }}</span>
+              {{ item.unit }}
             </span>
           </div>
         </div>
       </div>
     </el-col>
     <el-col :span="4">
-      <div class="itemBox" style="border-left-color: #62D9AA; background: #62D9AA; color: #fff">
-        <!-- <div class="titleLevel3">小小的</div> -->
-        <dataItem
-          :data="{
-            'innerColor': '#62D9AA',
-            'outColor': '#fff',
-            'label': '延期提测',
-            'subTitle': '<span style=color:#fff;> 1% </span>',
-            'subTitleUnit': 'normal',
-            'bgColor': 'transparent',
-            'padding': '8px 0px'
-          }"
-        />
-        <div class="line" />
-        <dataItem
-          :data="{
-            'innerColor': '#62D9AA',
-            'outColor': '#fff',
-            'label': '延期提测',
-            'subTitle': '<span style=color:#fff;> 1% </span>',
-            'subTitleUnit': 'normal',
-            'bgColor': 'transparent',
-            'padding': '8px 0px'
-          }"
-        />
+      <div v-if="mainData.delayList" class="itemBox" style="border-left-color: #62D9AA; background: #62D9AA; color: #fff">
+        <div v-for="item in mainData.delayList" :key="item.label" class="dataItemBox">
+          <dataItem
+            :item="{
+              'innerColor': '#62D9AA',
+              'outColor': '#fff',
+              'label': item.label,
+              'labelColor': '#fff',
+              'subTitle': `<span style=color:#fff;> 1%(${item.remark})</span>`,
+              'bgColor': 'transparent',
+              'padding': '8px 0px'
+            }"
+          />
+        </div>
       </div>
     </el-col>
     <!-- 第二行 -->
     <el-col :span="7">
-      <div class="itemBox" style="border-left-color: #FAAD14; background: #FFFAF1">
+      <div v-if="mainData.taskData" class="itemBox" style="border-left-color: #FAAD14; background: #FFFAF1">
         <div class="titleLevel3" style="color: #FAAD14;">任务平均交付周期</div>
         <div class="content">
           <div class="item effic" style="color: #FAAD14;">
-            <span class="num">20.5</span>
+            <span class="num">{{ mainData.taskData.countStr }}</span>
             <span class="unit">天</span>
           </div>
           <div class="item point">
             <span class="title">环比:</span>
-            <span class="num">
-              <i class="el-icon-caret-top" />
-              <i class="el-icon-caret-bottom" />
-              11%
+            <span :class="Number(mainData.taskData.chainRatio) > 0 ? 'item-up num' : 'item-down num'">
+              <i v-if="Number(mainData.taskData.chainRatio) > 0" class="el-icon-caret-top" />
+              <i v-else class="el-icon-caret-bottom" />
+              {{ mainData.taskData.chainRatio }}%
             </span>
           </div>
         </div>
         <div class="foot">
-          <div class="item">
-            <span class="title">研发周期:</span>
-            <span class="value">
-              <span class="num">14</span>
-              天
-            </span>
-          </div>
-          <div class="line" />
-          <div class="item">
-            <span class="title">测试周期:</span>
+          <div v-for="item in mainData.taskData.subCountList" :key="item.label" class="item">
+            <span class="title">{{ item.label }}:</span>
             <span class="value">
-              <span class="num">14</span>
-              
+              <span class="num">{{ item.countStr }}</span>
+              {{ item.unit }}
             </span>
           </div>
         </div>
@@ -197,50 +158,45 @@
       </div>
     </el-col>
     <el-col :span="6">
-      <div class="itemBox" style="border-left-color: #C97DE9; background: #FCF8FE">
+      <div v-if="mainData.bugAvgOneDataRepairData" class="itemBox" style="border-left-color: #C97DE9; background: #FCF8FE">
         <div class="titleLevel3" style="color: #C97DE9;">缺陷24小时修复率</div>
         <div class="content">
           <div class="item effic" style="color: #C97DE9;">
-            <span class="num">20.5</span>
+            <span class="num">{{ mainData.bugAvgOneDataRepairData.countStr }}</span>
             <span class="unit">%</span>
           </div>
           <div class="item point">
             <span class="title">环比:</span>
-            <span class="num">
-              <i class="el-icon-caret-top" />
-              <i class="el-icon-caret-bottom" />
-              11%
+            <span :class="Number(mainData.bugAvgOneDataRepairData.chainRatio) > 0 ? 'item-up num' : 'item-down num'">
+              <i v-if="Number(mainData.bugAvgOneDataRepairData.chainRatio) > 0" class="el-icon-caret-top" />
+              <i v-else class="el-icon-caret-bottom" />
+              {{ mainData.bugAvgOneDataRepairData.chainRatio }}%
             </span>
           </div>
         </div>
         <div class="foot">
-          <div class="item">
-            <span class="title">P0&P1:</span>
+          <div v-for="item in mainData.bugAvgOneDataRepairData.subCountList" :key="item.label" class="item">
+            <span class="title">{{ item.label }}:</span>
             <span class="value">
-              <span class="num">14</span>
-              %
-            </span>
-          </div>
-          <div class="line" />
-          <div class="item">
-            <span class="title">P1以上:</span>
-            <span class="value">
-              <span class="num">14</span>
-              %
+              <span class="num">{{ item.countStr }}</span>
+              {{ item.unit }}
             </span>
           </div>
         </div>
       </div>
     </el-col>
     <el-col :span="4">
-      <div class="itemBox" style="border-left-color: #6394FA; background: #6394FA; color: #fff">
+      <div v-if="mainData.testDevPeopleScale" class="itemBox" style="border-left-color: #6394FA; background: #6394FA; color: #fff">
         <dataItem
-          inner-color="#6394FA"
-          out-color="#fff"
-          title="延期提测"
-          sub-title="1%"
-          bg-color="transparent"
-          padding="8px 0px"
+          :item="{
+            'innerColor': '#6394FA',
+            'outColor': '#fff',
+            'label': mainData.testDevPeopleScale.label,
+            'labelColor': '#fff',
+            'subTitle': `<span style=color:#fff;>${mainData.testDevPeopleScale.countStr}</span>`,
+            'bgColor': 'transparent',
+            'padding': '8px 0px'
+          }"
         />
       </div>
     </el-col>
@@ -251,6 +207,41 @@ import dataItem from '../dataItem'
 export default {
   components: {
     dataItem
+  },
+  props: {
+    datas: {
+      type: Object,
+      required: true,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      mainData: {}
+    }
+  },
+  watch: {
+    datas(newVal) {
+      console.log(newVal)
+      this.resetBaseData()
+    }
+  },
+  mounted() {
+    this.resetBaseData()
+  },
+  methods: {
+    resetBaseData() {
+      const {
+        efficiencyData
+      } = this.datas
+      if (efficiencyData) {
+        this.mainData = efficiencyData
+      }
+    },
+    changeList() {},
+    changeTab(type, value) {
+      this[type] = value
+    }
   }
 }
 </script>
@@ -297,7 +288,7 @@ export default {
       .foot {
         .item {
           display: inline-block;
-          margin: 0 5px;
+          // margin: 0 5px;
           font-size: 12px;
           color: #666;
           &:first-child {
@@ -305,27 +296,38 @@ export default {
           }
           .num {
             color: #333;
+            font-weight: 600;
+          }
+          &::after {
+            content: '|';
+            color: #DDDFE5;
+            margin: 0 7px 0 5px;
+          }
+          &:last-child::after {
+            content: '';
           }
         }
-        .line {
-          height: 12px;
-          width: 1px;
-          background: #DDDFE5;
-          display: inline-block;
-          // border-right: 1px solid #DDDFE5;
+      }
+      .dataItemBox {
+        &::after {
+          content: '';
+          display: block;
+          color: #fff;
+          width: 100%;
+          height: 1px;
+          background: #fff;
+          opacity: 0.7;
+        }
+        &:last-child::after {
+          display: none;
         }
       }
     }
-    .line {
-      color: #fff;
-      width: 100%;
-      height: 1px;
-      background: #fff;
-      opacity: 0.7;
+    .item-up {
+      color:#F32850
+    }
+    .item-down {
+      color:#9FFF39
     }
-  //   :last-child {
-  //     margin-bottom: 0px;
-  //   }
-  // }
 }
 </style>

+ 296 - 81
src/views/dataBigManage/components/qualityModule/index.vue

@@ -4,32 +4,32 @@
       <div class="itemBox onlineProblem">
         <div class="titleLevel3 mb10">线上问题</div>
         <el-row :gutter="10">
-          <el-col v-for="(item, index) in mainData.onlineProblemList" :key="index" :span="12" class="mb10">
-            <!-- <dataItem
-              :inner-color="item.innerColor"
-              :out-color="item.outColor"
-              :title="item.title"
-              :sub-title="item.subTitle"
-              :bg-color="item.bgColor"
-            /> -->
-            <dataItem :data="item"/>
+          <el-col
+            v-for="(item, index) in mainData.onlineProblemList"
+            :key="index"
+            :span="12"
+            class="mb10"
+          >
+            <div @click.stop="onDetial('线上问题', item)">
+              <dataItem :item="item" />
+            </div>
           </el-col>
         </el-row>
         <div class="chartSearchbar inlineBetween mt15">
           <div style="width: 200px">
             <el-select
-              v-model="viewType"
+              v-model="onlineProblemViweType"
               size="small"
               filterable
               style="width: 115px"
-              @change="$emit('search')"
+              @change="$emit('search', { onlineProblemViweType })"
             >
-              <el-option v-for="(t, index) in typeOptionList" :key="index" :label="t" :value="t" />
+              <el-option v-for="(t, index) in onlineProblemSelect" :key="index" :label="t" :value="t" />
             </el-select>
           </div>
         </div>
         <div class="chartViewHeight">
-          <normal-echart v-if="echartsOption1" :chart-id="'chart1'" :option="echartsOption1" @onClick="changeList" />
+          <normal-echart v-if="onlineProblemChartOption" :chart-id="'chart1'" :option="onlineProblemChartOption" @onClick="changeList" />
         </div>
       </div>
     </el-col>
@@ -37,47 +37,77 @@
       <div class="itemBox quality">
         <div class="titleLevel3 mb10">线下质量</div>
         <el-row :gutter="10">
-          <el-col v-for="(item, index) in itemList" :key="index" :span="12" class="mb10">
-            <dataItem :data="item" />
+          <el-col v-for="(item, index) in mainData.offlineProblemList" :key="index" :span="12" class="mb10">
+            <div @click.stop="onDetial('线下质量', item)">
+              <dataItem :item="item" />
+            </div>
           </el-col>
         </el-row>
         <div class="chartSearchbar inlineBetween mt15">
           <div style="width: 200px">
             <el-select
-              v-model="viewType"
+              v-model="offlineProblemViweType"
               size="small"
               filterable
               style="width: 115px"
-              @change="$emit('search')"
+              @change="$emit('search', { offlineProblemViweType })"
             >
-              <el-option v-for="(t, index) in typeOptionList" :key="index" :label="t" :value="t" />
+              <el-option v-for="(t, index) in offlineProblemSelect" :key="index" :label="t" :value="t" />
             </el-select>
           </div>
         </div>
         <div class="chartViewHeight">
-          <normal-echart v-if="echartsOption1" :chart-id="'chart2'" :option="echartsOption1" @onClick="changeList" />
+          <normal-echart v-if="offlineProblemChartOption" :chart-id="'chart2'" :option="offlineProblemChartOption" @onClick="changeList" />
         </div>
       </div>
     </el-col>
     <el-col :span="8">
-      <div class="itemBox progress">
+      <div class="itemBox progress" style="min-height: 281px">
         <div class="titleLevel3 mb10">上线过程</div>
-        <el-row :gutter="10">
-          <el-col v-for="(item, index) in itemList" :key="index" :span="12" class="mb10">
-            <dataItem :data="item" />
+        <el-row v-if="mainData.onlineProcessList" :gutter="10">
+          <el-col v-for="(item, index) in mainData.onlineProcessList.list" :key="index" :span="12" class="mb10">
+            <dataItem :item="item" />
           </el-col>
         </el-row>
-        <el-row :gutter="10" style="height: 100px">
+        <el-divider class="divider" />
+        <el-row v-if="mainData.onlineProcessList" :gutter="10" class="rollBack">
           <el-col :span="12" class="mb10">
-            123
+            <span class="rollBackItem">
+              <span class="bigCircle" style="background: #7ED321" />
+              回滚
+              <span class="numText" style="font-size: 20px">{{ mainData.onlineProcessList.rollBack.countStr }}</span>
+              次
+            </span>
           </el-col>
           <el-col :span="12" class="mb10">
-            456
+            <div class="rollBackItem">
+              <span class="circle" style="background: #3F9DFE" />
+              预发回滚
+              <span class="numText">{{ mainData.onlineProcessList.rollBack.preCountStr }}</span>
+              次
+            </div>
+            <div class="rollBackItem">
+              <span class="circle" style="background: #3F9DFE" />
+              全量回滚
+              <span class="numText">{{ mainData.onlineProcessList.rollBack.fullCountStr }}</span>
+              次
+            </div>
+            <div class="rollBackItem">
+              <span class="circle" style="background: #3F9DFE" />
+              小流量回滚
+              <span class="numText">{{ mainData.onlineProcessList.rollBack.lowCountStr }}</span>
+              次
+            </div>
           </el-col>
         </el-row>
       </div>
       <div class="itemBox progress" style="margin-top: 20px; height: 102px;">
-        123
+        <div class="titleLevel3 mb10">移动端发布质量</div>
+        <el-row :gutter="10">
+          <el-col v-for="(item, index) in mainData.mobilePublishQualityList" :key="index" :span="12" class="mb10">
+            <dataItem :item="item" />
+          </el-col>
+        </el-row>
       </div>
     </el-col>
   </el-row>
@@ -92,7 +122,7 @@ export default {
     normalEchart
   },
   props: {
-    data: {
+    datas: {
       type: Object,
       required: true,
       default: () => {}
@@ -130,90 +160,275 @@ export default {
           'bgColor': '#F5F7FC'
         }
       ],
-      typeOptionList: ['时间'],
+      redObj: {
+        'innerColor': '#F5222D',
+        'outColor': '#F5DDE2',
+        'bgColor': '#F5F7FC'
+      },
+      yellowObj: {
+        'innerColor': '#FAAD14',
+        'outColor': '#F7ECDA',
+        'bgColor': '#F5F7FC'
+      },
+      purpleObj: {
+        'innerColor': '#C97DE9',
+        'outColor': '#EFE5FA',
+        'bgColor': '#F5F7FC'
+      },
+      greenObj: {
+        'innerColor': '#7ED321',
+        'outColor': '#E4F2DC',
+        'bgColor': '#F5F7FC'
+      },
+      onlineProblemSelect: ['按时间', '按等级', '按影响业务方'],
+      offlineProblemSelect: ['按时间', '按缺陷等级', '按责任人'],
+      offlineProblemViweType: '按时间',
+      onlineProblemViweType: '按时间',
+      onlineProblemChartOption: null,
+      offlineProblemChartOption: null,
       echartsOption1: null,
       viewType: null,
-      baseData: {},
-      mainData: {},
+      mainData: {}
     }
   },
   watch: {
-    data() {
-      console.log(this.data)
-      this.baseData = this.data
+    datas() {
       this.resetBaseData()
     }
   },
   mounted() {
     this.resetBaseData()
-    this.echartsOption1 = getOption([1, 2, 3], [4, 5, 6], 'bar')
   },
   methods: {
+    onDetial(name, item) {
+      if (name === '线上问题' && item.label === '新增问题' || name === '线下质量') {
+        this.$emit('checkDetialModal', item)
+      }
+    },
     resetBaseData() {
-      let d = null
-      console.log(this.data)
-      if (this.data.onlineProblemList) {
-        console.log(this.data.onlineProblemList)
-        const { ImprovementsOverRate, depleteUnavailableTime, newOnlineProblems, onlineBreakRate } = this.data.onlineProblemList
-        d = [
-          {
-            'innerColor': '#F5222D',
-            'outColor': '#F5DDE2',
-            'bgColor': '#F5F7FC',
-            'label': newOnlineProblems.label,
-            'title': newOnlineProblems.countStr,
-            'titleUnit': '个',
-            'subTitleUnit': 'rate',
-            'subTitle': newOnlineProblems.chainRatio,
-            'IdList': newOnlineProblems.IdList
-          },
+      const {
+        onlineProblemList,
+        onlineProblemChart,
+        offlineProblemList,
+        offlineProblemChart,
+        onlineProcessList,
+        mobilePublishQualityList
+      } = this.datas
+      // 线上问题表
+      if (onlineProblemList) {
+        this.mainData = { ...this.mainData, onlineProblemList: this.getOnlineProblemList() }
+      }
+      // 线上问题图
+      if (onlineProblemChart) {
+        const { xaxis, yaxis } = onlineProblemChart
+        this.onlineProblemChartOption = getOption(xaxis, yaxis.data, 'bar')
+      }
+      // 线下质量表
+      if (offlineProblemList) {
+        this.mainData = { ...this.mainData, offlineProblemList: this.getOfflineProblemList() }
+      }
+      // 线下质量图
+      if (offlineProblemChart) {
+        const { xaxis, yaxis } = offlineProblemChart
+        this.offlineProblemChartOption = getOption(xaxis, yaxis.data, 'bar')
+      }
+      // 上线过程
+      if (onlineProcessList) {
+        this.mainData = { ...this.mainData, onlineProcessList: this.getOnlineProcessList() }
+      }
+      // 移动端发布质量
+      if (mobilePublishQualityList) {
+        this.mainData = { ...this.mainData, mobilePublishQualityList: this.getMobilePublishQualityList() }
+      }
+    },
+    // 组织线上问题表数据
+    getOnlineProblemList() {
+      const { ImprovementsOverRate, depleteUnavailableTime, newOnlineProblems, onlineBreakRate } = this.datas.onlineProblemList
+      return [
+        {
+          ...this.redObj,
+          'label': newOnlineProblems.label,
+          'title': newOnlineProblems.countStr,
+          'titleUnit': '个',
+          'subTitleUnit': 'rate',
+          'subTitle': newOnlineProblems.chainRatio,
+          'IdList': newOnlineProblems.IdList
+        },
+        {
+          ...this.yellowObj,
+          'label': depleteUnavailableTime.label,
+          'title': depleteUnavailableTime.countStr,
+          'titleUnit': '分',
+          'subTitleUnit': 'rate',
+          'subTitle': depleteUnavailableTime.chainRatio,
+          'IdList': depleteUnavailableTime.IdList
+        },
+        {
+          ...this.purpleObj,
+          'label': onlineBreakRate.label,
+          'title': onlineBreakRate.countStr,
+          'titleUnit': '%',
+          'subTitleUnit': 'rate',
+          'subTitle': onlineBreakRate.chainRatio,
+          'IdList': onlineBreakRate.IdList
+        },
+        {
+          ...this.greenObj,
+          'label': ImprovementsOverRate.label,
+          'title': ImprovementsOverRate.countStr,
+          'titleUnit': '%',
+          'subTitleUnit': 'rate',
+          'subTitle': ImprovementsOverRate.chainRatio,
+          'IdList': ImprovementsOverRate.IdList
+        }
+      ]
+    },
+    // 线下质量数据
+    getOfflineProblemList() {
+      const { newBug, reopen, testBackRate, releaseNopass } = this.datas.offlineProblemList
+      return [
+        {
+          ...this.redObj,
+          'label': newBug.label,
+          'title': newBug.countStr,
+          'titleUnit': '个',
+          'subTitleUnit': 'rate',
+          'subTitle': newBug.chainRatio,
+          'IdList': newBug.IdList
+        },
+        {
+          ...this.yellowObj,
+          'label': reopen.label,
+          'title': reopen.countStr,
+          'titleUnit': '次',
+          'subTitleUnit': 'rate',
+          'subTitle': reopen.chainRatio,
+          'IdList': reopen.IdList
+        },
+        {
+          'color': '#3F9DFE',
+          'bgColor': '#F5F7FC',
+          'label': testBackRate.label,
+          'title': testBackRate.countStr,
+          'titleUnit': '%',
+          'subTitleUnit': 'rate',
+          'subTitle': testBackRate.chainRatio,
+          'IdList': testBackRate.IdList,
+          'remark': testBackRate.remark,
+          'type': 'circle'
+        },
+        {
+          'color': '#7ED321',
+          'bgColor': '#F5F7FC',
+          'label': releaseNopass.label,
+          'title': releaseNopass.countStr,
+          'titleUnit': '%',
+          'subTitleUnit': 'rate',
+          'subTitle': releaseNopass.chainRatio,
+          'IdList': releaseNopass.IdList,
+          'remark': releaseNopass.remark,
+          'type': 'circle'
+        }
+      ]
+    },
+    // 上线过程数据
+    getOnlineProcessList() {
+      const { online, testFreeOnlineRate, onlinebyStreakingRate, rollBack } = this.datas.onlineProcessList
+      return {
+        'list': [
           {
-            'innerColor': '#FAAD14',
-            'outColor': '#F7ECDA',
-            'bgColor': '#F5F7FC',
-            'label': depleteUnavailableTime.label,
-            'title': depleteUnavailableTime.countStr,
-            'titleUnit': '分',
-            'subTitleUnit': 'rate',
-            'subTitle': depleteUnavailableTime.chainRatio,
-            'IdList': depleteUnavailableTime.IdList
+            'innerColor': '#3F9DFE',
+            'outColor': '#E2F0FF',
+            'padding': '8px 0px',
+            'label': online.label,
+            'title': online.countStr,
+            'titleUnit': '次',
+            'IdList': online.IdList
           },
           {
-            'innerColor': '#C97DE9',
-            'outColor': '#EFE5FA',
-            'bgColor': '#F5F7FC',
-            'label': onlineBreakRate.label,
-            'title': onlineBreakRate.countStr,
+            'innerColor': '#7ED321',
+            'outColor': '#E4F2DC',
+            'padding': '8px 0px',
+            'label': testFreeOnlineRate.label,
+            'title': testFreeOnlineRate.countStr,
             'titleUnit': '%',
-            'subTitleUnit': 'rate',
-            'subTitle': onlineBreakRate.chainRatio,
-            'IdList': onlineBreakRate.IdList
+            'IdList': testFreeOnlineRate.IdList
           },
           {
-            'innerColor': '#7ED321',
-            'outColor': '#E4F2DC',
-            'bgColor': '#F5F7FC',
-            'label': ImprovementsOverRate.label,
-            'title': ImprovementsOverRate.countStr,
+            'innerColor': '#F5222D',
+            'outColor': '#F5DDE2',
+            'padding': '8px 0px',
+            'label': onlinebyStreakingRate.label,
+            'title': onlinebyStreakingRate.countStr,
             'titleUnit': '%',
-            'subTitleUnit': 'rate',
-            'subTitle': ImprovementsOverRate.chainRatio,
-            'IdList': ImprovementsOverRate.IdList
+            'IdList': onlinebyStreakingRate.IdList
           }
-        ]
-        this.mainData = { ...this.mainData, onlineProblemList: d }
-        console.log(this.mainData)
+        ],
+        rollBack
       }
     },
+    // 移动端发布质量数据
+    getMobilePublishQualityList() {
+      const { hotpacth, addIssue } = this.datas.mobilePublishQualityList
+      return [
+        {
+          'innerColor': '#3F9DFE',
+          'outColor': '#E2F0FF',
+          'padding': '8px 0px',
+          'label': hotpacth.label,
+          'title': hotpacth.countStr,
+          'titleUnit': '次',
+          'IdList': hotpacth.IdList
+        },
+        {
+          'innerColor': '#F5222D',
+          'outColor': '#F5DDE2',
+          'padding': '8px 0px',
+          'label': addIssue.label,
+          'title': addIssue.countStr,
+          'titleUnit': '次',
+          'IdList': addIssue.IdList
+        }
+      ]
+    },
     changeList() {}
   }
 }
 </script>
 <style scoped lang='less'>
 .qualityModule {
+  .divider {
+    margin: 0 0 15px 0;
+  }
+  .rollBack {
+    height: 94px;
+    display: flex;
+    align-items: center;
+    .rollBackItem {
+      color: #666;
+      .numText {
+        color: #409EFF;
+        font-weight: 600;
+      }
+    }
+    .circle {
+      display: inline-block;
+      width: 6px;
+      height: 6px;
+      border-radius: 100%;
+      margin-right: 6px;
+    }
+    .bigCircle {
+      display: inline-block;
+      width: 10px;
+      height: 10px;
+      border-radius: 100%;
+      margin-right: 6px;
+    }
+  }
   .itemBox {
     box-shadow: 0px 6px 50px rgba(0, 0, 0, 0.05);
-    padding: 10px 20px;
+    padding: 10px 10px;
     border-radius: 6px;
   }
   .chartSearchbar {

+ 92 - 45
src/views/dataBigManage/components/throughputModule/index.vue

@@ -1,7 +1,7 @@
 <template>
-  <el-row :gutter="20" class="qualityModule">
+  <el-row :gutter="20" class="throughputModule">
     <el-col :span="6">
-      <div class="itemBox whole" style="background: #EEF0F5">
+      <div class="itemBox whole throughput" style="background: #EEF0F5">
         <div class="tab">
           <span
             v-for="item in wholeTabList"
@@ -12,9 +12,24 @@
           >{{ item }}</span>
         </div>
         <div class="list">
-          <div v-for="item in wholeList[wholeTab]" :key="item.pointer" class="listItem flex-center-between">
-            <div v-html="item.text" />
-            <div v-html="item.pointer" />
+          <div v-for="item in mainData.throughputList" :key="item.pointer" class="listItem flex-center-between">
+            <!-- <div v-html="item.text" />
+            <div v-html="item.pointer" /> -->
+            <div>
+              {{ item.label }}
+              <span :class="Number(item.chainRatio) > 0 ? 'textRed count' : 'textBlue count'">{{ item.countStr }}</span>
+              <span>
+                {{ item.label.includes('率') ? '%' : '个' }}
+              </span>
+            </div>
+            <div class="throughputRate">
+              <span>环比:</span>
+              <span :class="Number(item.chainRatio) > 0 ? 'item-up' : 'item-down'">
+                <i v-if="Number(item.chainRatio) > 0" class="el-icon-caret-top" />
+                <i v-else class="el-icon-caret-bottom" />
+                {{ item.chainRatio }}%
+              </span>
+            </div>
           </div>
         </div>
       </div>
@@ -23,7 +38,7 @@
       <div class="itemBox">
         <div class="titleLevel3 mb25">需求方向分布图</div>
         <div class="chartViewHeight">
-          <normal-echart v-if="echartsOption1" :chart-id="'chart3'" :option="echartsOption1" @onClick="changeList" />
+          <normal-echart v-if="requirementDirectionChartOption" :chart-id="'chart3'" :option="requirementDirectionChartOption" @onClick="changeList" />
         </div>
       </div>
     </el-col>
@@ -44,7 +59,7 @@
           </div>
         </div>
         <div class="chartViewHeight" style="height: 178px">
-          <normal-echart v-if="echartsOption2" :chart-id="'chart4'" :option="echartsOption2" @onClick="changeList" />
+          <normal-echart v-if="requirementBacklogRateChartOption" :chart-id="'chart4'" :option="requirementBacklogRateChartOption" @onClick="changeList" />
         </div>
       </div>
     </el-col>
@@ -61,7 +76,7 @@
           >{{ item }}</span>
         </div>
         <div class="chartViewHeight" style="height: 189px">
-          <normal-echart v-if="echartsOption1" :chart-id="'chart5'" :option="echartsOption1" @onClick="changeList" />
+          <normal-echart v-if="versionRequirementChartOption" :chart-id="'chart5'" :option="versionRequirementChartOption" @onClick="changeList" />
         </div>
       </div>
     </el-col>
@@ -74,9 +89,19 @@ export default {
   components: {
     normalEchart
   },
+  props: {
+    datas: {
+      type: Object,
+      required: true,
+      default: () => {}
+    }
+  },
   data() {
     return {
       typeOptionList: [],
+      requirementDirectionChartOption: null,
+      requirementBacklogRateChartOption: null,
+      versionRequirementChartOption: null,
       echartsOption1: null,
       echartsOption2: null,
       viewType: null,
@@ -84,60 +109,82 @@ export default {
       verTab: '青桔端',
       wholeTabList: ['需求', '任务', '项目'],
       wholeTab: '需求',
-      wholeList: {
-        '需求': [{
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }, {
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }, {
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }, {
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }, {
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }],
-        '任务': [{
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }, {
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }, {
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }],
-        '项目': [{
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }, {
-          text: '<div>新增需求<b>8</b>个</div>',
-          points: '环比:4.25%'
-        }]
-      }
+      wholeList: [{
+        text: '<div>新增需求<b>8</b>个</div>',
+        points: '环比:4.25%'
+      }, {
+        text: '<div>新增需求<b>8</b>个</div>',
+        points: '环比:4.25%'
+      }],
+      mainData: {}
+    }
+  },
+  watch: {
+    datas() {
+      console.log(this.datas)
+      this.resetBaseData()
     }
   },
   mounted() {
+    this.resetBaseData()
     this.echartsOption1 = getOption([1, 2, 3], [4, 5, 6], 'bar')
     this.echartsOption2 = getOption([1, 2, 3], [4, 5, 6], 'line')
   },
   methods: {
+    resetBaseData() {
+      const {
+        throughputList, // 需求任务项目
+        requirementDirectionChart, // 需求方向分布图
+        requirementBacklogRateChart, // 积压率
+        versionRequirementChart // 版本需求
+      } = this.datas
+      // 需求任务项目
+      if (throughputList) {
+        console.log(throughputList)
+        this.mainData = { ...this.mainData, throughputList }
+      }
+      if (requirementDirectionChart) {
+        const { xaxis, yaxis } = requirementDirectionChart
+        this.requirementDirectionChartOption = getOption(xaxis, yaxis.data, 'bar')
+      }
+      // 积压率
+      if (requirementBacklogRateChart) {
+        const { xaxis, yaxis } = requirementBacklogRateChart
+        this.requirementBacklogRateChartOption = getOption(xaxis, yaxis.data, 'line')
+      }
+      if (versionRequirementChart) {
+        const { xaxis, yaxis } = versionRequirementChart
+        this.versionRequirementChartOption = getOption(xaxis, yaxis.data, 'bar')
+      }
+    },
     changeList() {},
     changeTab(type, value) {
       this[type] = value
+      this.$emit('search', { [type]: value })
     }
   }
 }
 </script>
 <style scoped lang='less'>
-.qualityModule {
+.throughputModule {
+  .throughput {
+    color: #333;
+    .throughputRate {
+      min-width: 100px;
+    }
+    .count {
+      font-weight: 600;
+    }
+  }
+  .item-up {
+    color:#F32850
+  }
+  .item-down {
+    color:#9FFF39
+  }
   .itemBox {
     box-shadow: 0px 6px 50px rgba(0, 0, 0, 0.05);
-    padding: 10px 20px;
+    padding: 10px 10px;
     border-radius: 6px;
     &.whole {
       padding: 10px 0px;

+ 3 - 3
src/views/dataBigManage/data.js

@@ -4,7 +4,7 @@ export const listSearchData = {
       {
         name: '部门',
         value: '',
-        key: 'title',
+        key: 'deptCode',
         type: 'select',
         placeholder: '请选择部门',
         option: [{ value: 1, label: 22 }, { value: 2, label: 33 }]
@@ -22,9 +22,9 @@ export const listSearchData = {
   adv: [
     [{
       name: '团队',
-      key: 'priority',
+      key: 'teamIds',
       type: 'select',
-      multiple: false,
+      multiple: true,
       placeholder: '',
       value: '',
       requried: true,

+ 145 - 35
src/views/dataBigManage/index.vue

@@ -13,17 +13,27 @@
       <header class="header mb25">
         <headTitle title="质量" />
       </header>
-      <qualityModule :data="mainData.quality"/>
+      <qualityModule
+        :datas="mainData.quality"
+        @search="qualitySearch"
+        @checkDetialModal="checkDetialModal"
+      />
       <header class="header mb25 mt40">
         <headTitle title="吞吐量" />
       </header>
-      <throughputModule />
+      <throughputModule
+        :datas="mainData.throughput"
+        @search="qualitySearch"
+      />
       <header class="header mb25 mt40">
         <headTitle title="效率" />
       </header>
-      <efficiencyModule />
+      <efficiencyModule
+        :datas="mainData.efficiency"
+        @checkDetialModal="checkDetialModal"
+      />
     </div>
-    <div v-show="false" @click.stop>
+    <div @click.stop>
       <!-- <drawer-modal v-if="openDrawer" :drawer="openDrawer" :data="requireList" :status="reqStatus" @clone="clone" /> -->
     </div>
   </div>
@@ -52,15 +62,15 @@ import headTitle from '@/components/headTitle'
 import throughputModule from './components/throughputModule/index.vue'
 import qualityModule from './components/qualityModule/index.vue'
 import efficiencyModule from './components/efficiencyModule/index.vue'
-import drawerModal from './components/drawerModal/index.vue'
+// import drawerModal from './components/drawerModal/index.vue'
 export default {
   components: {
     searchHeader,
     headTitle,
     throughputModule,
     qualityModule,
-    efficiencyModule,
-    drawerModal
+    efficiencyModule
+    // drawerModal
   },
   data() {
     return {
@@ -70,9 +80,16 @@ export default {
       openDrawer: true,
       requireList: {},
       reqStatus: '缺陷状态',
-      params: {},
+      params: {
+        offlineProblemViweType: '按时间',
+        onlineProblemViweType: '按时间',
+        wholeTab: '需求',
+        verTab: '青桔端'
+      },
       mainData: {
-        quality: {}
+        quality: {},
+        throughput: {},
+        efficiency: {}
       }
     }
   },
@@ -92,8 +109,34 @@ export default {
         }))
       }
       console.log(data)
+      this.params = {
+        ...this.params,
+        ...data,
+        startTime: data.time[0],
+        endTime: data.time[1]
+      }
       this.getList()
     },
+    qualitySearch(d) {
+      console.log(d)
+      this.params = {
+        ...this.params,
+        ...d
+      }
+      if (Object.keys(d)[0] === 'onlineProblemViweType') {
+        this.getOnlineProblemChartData(this.params)
+      } else if (Object.keys(d)[0] === 'offlineProblemViweType') {
+        this.getOfflineProblemChartData(this.params)
+      } else if (Object.keys(d)[0] === 'wholeTab') {
+        this.getThroughputData(this.params)
+      } else if (Object.keys(d)[0] === 'verTab') {
+        this.getVersionRequirementChartData(this.params)
+      }
+    },
+    // 弹窗数据
+    checkDetialModal(data) {
+      console.log(data)
+    },
     moreReset(data) {
       this.renderList.adv.map(t => t.map(g => {
         g.value = null
@@ -103,64 +146,131 @@ export default {
       this.showMore = e
     },
     getList() {
+      const params = this.params
       // // 质量
-      this.getOnlineProblemList() // 线上问题列表
+      this.getOnlineProblemList(params) // 线上问题列表
+      this.getOnlineProblemChartData(params) // 线上问题图表
+      this.getOfflineProblemList(params) // 线下问题列表
+      this.getOfflineProblemChartData(params) // 线下问题图
+      this.getOnlineProcessData(params) // 上线过程
+      this.getMobilePublishQualityData(params) // 移动端发布质量
+      this.getThroughputData(params) // 需求任务项目列表
+      this.getRequirementDirectionDistributionChartData(params) // 需求方向分布图
+      this.getRequirementBacklogRateChartData(params) // 积压率
+      this.getVersionRequirementChartData(params) // 需求版本
+      this.getEfficiencyData(params) // 效率
     },
     // 线上问题列表
-    getOnlineProblemList() {
-      const params = this.params
+    getOnlineProblemList(params) {
       getOnlineProblemListRequest(params).then(res => {
         this.mainData = {
-          ...this.mainData, 
+          ...this.mainData,
           quality: { ...this.mainData.quality, onlineProblemList: res.data }
         }
       })
     },
     // 线上问题图表
-    getOnlineProblemChartData() {
-      const params = this.params
-      getOnlineProblemChartDataRequest(params).then(res => {
+    getOnlineProblemChartData(params) {
+      getOnlineProblemChartDataRequest({
+        ...params,
+        extensionType: params.onlineProblemViweType
+      }).then(res => {
         this.mainData = {
-          ...this.mainData, 
+          ...this.mainData,
           quality: { ...this.mainData.quality, onlineProblemChart: res.data }
         }
       })
     },
     // 线下问题列表
-    getOfflineProblemList() {
-
+    getOfflineProblemList(params) {
+      getOfflineProblemListRequest(params).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          quality: { ...this.mainData.quality, offlineProblemList: res.data }
+        }
+      })
     },
     // 线下问题图表
-    getOfflineProblemChartData() {
-
+    getOfflineProblemChartData(params) {
+      //  offlineProblemChart
+      getOfflineProblemChartDataRequest({
+        ...params,
+        extensionType: params.offlineProblemViweType
+      }).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          quality: { ...this.mainData.quality, offlineProblemChart: res.data }
+        }
+      })
     },
     // 上线过程
-    getOnlineProcessData() {
-
+    getOnlineProcessData(params) {
+      getOnlineProcessDataRequest(params).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          quality: { ...this.mainData.quality, onlineProcessList: res.data }
+        }
+      })
     },
     // 移动端发布质量
-    getMobilePublishQualityData() {
-
+    getMobilePublishQualityData(params) {
+      getMobilePublishQualityDataRequest(params).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          quality: { ...this.mainData.quality, mobilePublishQualityList: res.data }
+        }
+      })
     },
     // 需求任务项目列表
-    getThroughputData() {
-
+    getThroughputData(params) {
+      getThroughputDataRequest({
+        ...params,
+        extensionType: params.wholeTab
+      }).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          throughput: { ...this.mainData.throughput, throughputList: res.data }
+        }
+      })
     },
     // 需求方向分布图
-    getRequirementDirectionDistributionChartData() {
-
+    getRequirementDirectionDistributionChartData(params) {
+      getRequirementDirectionDistributionChartDataRequest(params).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          throughput: { ...this.mainData.throughput, requirementDirectionChart: res.data }
+        }
+      })
     },
     // 需求积压率
-    getRequirementBacklogRateChartData() {
-
+    getRequirementBacklogRateChartData(params) {
+      getRequirementBacklogRateChartDataRequest(params).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          throughput: { ...this.mainData.throughput, requirementBacklogRateChart: res.data }
+        }
+      })
     },
     // 版本需求图
-    getVersionRequirementChartData() {
-
+    getVersionRequirementChartData(params) {
+      getVersionRequirementChartDataRequest({
+        ...params,
+        extensionType: params.verTab
+      }).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          throughput: { ...this.mainData.throughput, versionRequirementChart: res.data }
+        }
+      })
     },
     // 效率
-    getEfficiencyData() {
-
+    getEfficiencyData(params) {
+      getEfficiencyDataRequest(params).then(res => {
+        this.mainData = {
+          ...this.mainData,
+          efficiency: { ...this.mainData.efficiency, efficiencyData: res.data }
+        }
+      })
     }
   }
 }