Преглед изворни кода

Merge branch 'http_test' into http_mock

qinzhipeng_v@didiglobal.com пре 4 година
родитељ
комит
637b291059

+ 3 - 0
src/apiConfig/requestIP.js

@@ -7,6 +7,7 @@ export let envTag = 'test'
 export let envUrl = 'http://zhihui-test.intra.xiaojukeji.com/zhihui_env/'
 export let toolsUrl = 'http://zhihui-test.intra.xiaojukeji.com/tools/'
 export let playBackUrl = 'http://zhihui-test.intra.xiaojukeji.com/playback/'
+export let automation = 'http://zhihui-test.intra.xiaojukeji.com/automation/'
 if (location.host.indexOf('localhost') < 0) {
   host = 'http://' + location.host
   requestIp = host + '/zuul'
@@ -17,11 +18,13 @@ if (location.host.indexOf('localhost') < 0) {
     envUrl = 'http://zhihui-pre.intra.xiaojukeji.com/zhihui_env/'
     toolsUrl = 'http://zhihui-pre.intra.xiaojukeji.com/tools/'
     playBackUrl = 'http://zhihui-pre.intra.xiaojukeji.com/playback/'
+    automation = 'http://zhihui-pre.intra.xiaojukeji.com/automation/'
   } else if (host.indexOf('zhihui.xiaojukeji.com') >= 0) {
     envTag = 'online'
     envUrl = 'http://zhihui.xiaojukeji.com/zhihui_env/'
     toolsUrl = 'http://zhihui.xiaojukeji.com/tools/'
     playBackUrl = 'http://zhihui.xiaojukeji.com/playback/'
+    automation = 'http://zhihui.xiaojukeji.com/automation/'
   }
 }
 

+ 19 - 0
src/styles/detail-pages.less

@@ -103,6 +103,25 @@
       color: #409EFF;
     }
   }
+  .top-tabs-public {
+    height: 100%;
+    position: absolute;
+    left: 60%;
+    top: 0;
+    transform: translate(-50%,0);
+    /deep/.el-tabs__header {
+      margin: 0;
+    }
+    /deep/.el-tabs__item {
+      height: 60px;
+      line-height: 60px;
+      font-size: 16px;
+      color: #666666;
+    }
+    /deep/.el-tabs__item.is-active {
+      color: #409EFF;
+    }
+  }
   .top-control {
     // width: 235px;
     display: flex;

+ 7 - 1
src/views/home/index.vue

@@ -42,6 +42,8 @@
           <el-button plain class="enter-button" @click.native="handleSelect('1')"><svg-icon icon-class="env-enter" />环境管理</el-button>
           <el-button plain class="enter-button" @click.native="handleSelect('playback')"><svg-icon icon-class="playback-enter" />流量回放</el-button>
           <el-button plain class="enter-button" @click.native="handleSelect('9')"><svg-icon icon-class="tool-enter" />工具集合</el-button>
+          <el-button v-if="false" plain class="enter-button" @click.native="handleSelect('auto')">
+            <svg-icon icon-class="tool-enter" />自动化测试</el-button>
         </div>
         <div class="home-carousel">
           <el-carousel :height="imgHeight + 'px'" indicator-position="outside">
@@ -192,6 +194,7 @@ img.img-arrow {
   left: 48.95%;
 }
 .enter-button {
+  width: 120px;
   margin-top: 6vh;
   margin-right: 30px;
   margin-left: 0px;
@@ -299,7 +302,7 @@ img.img-arrow {
 <script>
 import { mapGetters } from 'vuex'
 import FloatMenu from './floatMenu'
-import { logoutUrl, envUrl, toolsUrl, playBackUrl } from '@/apiConfig/requestIP.js'
+import { logoutUrl, envUrl, toolsUrl, playBackUrl, automation } from '@/apiConfig/requestIP.js'
 import { settingUserGetBiz } from '@/api/projectIndex'
 import { materialGetMaterialList } from '@/api/monthly/index.js'
 
@@ -400,6 +403,9 @@ export default {
         case '10':
           this.$router.push({ name: '测试用例' })
           break
+        case 'auto':
+          window.open(automation, '_block')
+          break
         case 'playback':
           window.open(playBackUrl, '_self')
           break

+ 17 - 3
src/views/monthlyReport/childrenPage/editReport/components/ReadOnlyTable.vue

@@ -67,6 +67,11 @@
           :data="requireList"
           @clone="openDrawer = false"
         />
+      <drawerModal
+        v-clickoutside="() => openDrawerModalDrawer = false"
+        :open-drawer.sync="openDrawerModalDrawer"
+        :drawer-data="ids"
+      />
       </span>
     </div>
 </template>
@@ -78,10 +83,11 @@ import drawerAll from '@/views/quality/components/drawerAll'
 import Clickoutside from 'element-ui/src/utils/clickoutside'
 // import Cascader from '@/components/select/selectCascader'
 import CascaderInfo from './CascaderInfo'
+import drawerModal from './drawerModal'
 
 export default {
   name: 'ReadOnlyTable',
-  components: { drawerAll, CascaderInfo },
+  components: { drawerAll, CascaderInfo, drawerModal },
   directives: { Clickoutside },
   props: {
     plusTableDataBottom: {
@@ -136,7 +142,9 @@ export default {
         all: {},
         p0: {},
         p1: {}
-      }
+      },
+      ids: [],
+      openDrawerModalDrawer: false
     }
   },
   computed: {
@@ -291,7 +299,13 @@ export default {
     query({ row, column }, lIndex) {
       const index = lIndex - 1 || 0
       const data = row[column.property]
-      // return
+
+      if (index === 3) {
+        this.ids = data.reportBugs
+        this.openDrawerModalDrawer = true
+        return
+      }
+
       if (index <= 2) {
         const yaxis = this.setList(data, index)
         this.requireList = { toType: '缺陷', xaxis: this.bugPriority, title: '新增缺陷', yaxis: yaxis, dataIndex: index }

+ 54 - 3
src/views/monthlyReport/childrenPage/editReport/components/SubTitle.vue

@@ -1,28 +1,37 @@
 <template>
   <span><span><span class="fontWeight">线下缺陷</span> - </span>
     <span v-for="(item, index) in reportTextList" :key="index">
-      <span class="query-bug" @click.stop="query(item, index)">
+      <!-- <span class="query-bug" @click.stop="query(item, index)">
         <span v-if="index === 0">新增bug<span class="fontWeight">{{ item.label }}</span>个,</span>
         <span v-if="index === 1">其中P0 bug数<span class="fontWeight" :class="[item.label !== '0' ? 'query-colors' : '' ]">{{ item.label }}</span>个,</span>
         <span v-if="index === 2">P1 bug数<span class="fontWeight">{{ item.label }}</span>个;</span>
         <span v-if="index === 3">P0&P1平均修复时长<span class="fontWeight" :class="[item.label > 24 ? 'query-colors' : '' ]">{{ item.label }}h</span>;</span>
         <span v-if="index === 4">P0&P1 过夜率<span class="fontWeight" :class="[item.label > 30 ? 'query-colors' : '' ]">{{ item.label }}%</span>;</span>
         <span v-if="index === 5">Reopen<span class="fontWeight" :class="[item.label !== '0' ? 'query-colors' : '' ]">{{ item.label }}</span>次。</span>
-      </span>
+      </span> -->
+
+      <span>{{ item.copywriter }}<span class="fontWeight query-bug" :class="[setCopywriter(item.copywriter, item.label, index) ? 'query-colors' : '' ]" @click.stop="query(item, index)">{{ item.label }}</span>{{ setUnit(item.copywriter) }}{{ setSign(item.copywriter, index) }}</span>
+
       <!-- 新增bug 78个,其中P0 bug数XX(标红)个,P1 bug数XX个;P0&P1平均修复时长 23.8H;P0&P1 24小时修复率70.0%;reopen XX次。 -->
     </span>
     <span @click.stop>
       <drawer-all v-if="openDrawer" v-clickoutside="() => openDrawer = false" :drawer="openDrawer" :data="requireList" @clone="openDrawer = false" />
+      <drawerModal
+        v-clickoutside="() => openDrawerModalDrawer = false"
+        :open-drawer.sync="openDrawerModalDrawer"
+        :drawer-data="ids"
+      />
     </span>
   </span>
 </template>
 <script>
 import drawerAll from '@/views/quality/components/drawerAll'
 import Clickoutside from 'element-ui/src/utils/clickoutside'
+import drawerModal from './drawerModal'
 
 export default {
   name: 'SubTitle',
-  components: { drawerAll },
+  components: { drawerAll, drawerModal },
   directives: { Clickoutside },
   props: {
     subTitle: {
@@ -34,6 +43,8 @@ export default {
   data() {
     return {
       reportTextList: [],
+      ids: [],
+      openDrawerModalDrawer: false,
       openDrawer: false,
       requireList: {},
       bugPriority: ['全部', 'P0', 'P1', 'P1以上'],
@@ -64,7 +75,47 @@ export default {
         return index === 3 ? [q, w, e] : [q, r, t, e]
       }
     },
+    setCopywriter(copywriter, label, index) {
+      if (index === this.reportTextList.length - 1) return label > 0
+      if (copywriter.search(/过夜率/) > -1) {
+        return label > 30
+      }
+      if (copywriter.search(/P0\ /) > -1) return label > 0
+      if (copywriter.indexOf('时长') > -1) {
+        return label > 30
+      }
+      return false
+    },
+    setUnit(copywriter) {
+      if (copywriter.indexOf('时长') > -1) {
+        return 'h'
+      }
+      if (copywriter.search(/过夜率|关闭率/) > -1) {
+        return '%'
+      }
+      if (copywriter.search(/次数/) > -1) {
+        return '次'
+      }
+      return '个'
+    },
+    setSign(copywriter, index) {
+      if (index === this.reportTextList.length - 1) return '。'
+      if (this.reportTextList[index + 1].copywriter.search(/过夜率|关闭率/) > -1) return ';'
+      if (copywriter.search(/过夜率|关闭率/) > -1) {
+        return ';'
+      }
+      if (copywriter.indexOf('时长') > -1) {
+        return ';'
+      }
+      return ','
+    },
     query(data, index) {
+      console.log(data, 109, this.openDrawerModalDrawer)
+      if (data.copywriter.indexOf('关闭率') > -1) {
+        this.ids = data.reportBugs
+        this.openDrawerModalDrawer = true
+        return
+      }
       if (index <= 2) {
         const yaxis = this.setList(data, index)
         this.requireList = { toType: '缺陷', xaxis: this.bugPriority, title: '新增缺陷', yaxis: yaxis, dataIndex: index }

+ 114 - 0
src/views/monthlyReport/childrenPage/editReport/components/drawerModal/components/timeline.vue

@@ -0,0 +1,114 @@
+<template>
+  <div :class="[!bgMargin ? 'timeline-bg' : 'timeline-bgOne']">
+    <div class="timeline-layout">
+      <div v-for="(item, index) in list" ref="ss" :key="'item' + index">
+        <div class="timeline-name" :class="[index === key ? 'time-color1' : 'time-color']">{{ item }}</div>
+        <span class="circular" :class="[index === key ? 'time-code1' : 'time-code']" @click="click_code({value: index, name: item})" />
+        <div class="timeline-divider" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    data: { type: Array, required: true },
+    num: { type: Number, default: 0 },
+    bgMargin: { type: Boolean, default: false }
+  },
+  data() {
+    return {
+      list: [],
+      key: this.num
+    }
+  },
+  watch: {
+    data: {
+      handler(newV) {
+        if (!newV) return
+        this.list = newV
+      },
+      deep: true,
+      immediate: true
+    },
+    num: {
+      handler(newV) {
+        this.key = newV
+        // document.getElementById('index').scrollLeft += 500
+        // this.$refs.ss.scrollLeft = 300
+      },
+      deep: true
+    }
+  },
+  methods: {
+    // 初始化
+    timeline_init() {
+      this.list = this.list.map(item => ({
+        ...item,
+        show: false
+      }))
+    },
+    // 点击节点
+    click_code(val) {
+      this.key = val.value
+      this.$emit('update', val)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.timeline-bgOne {
+  min-width: max-content;
+  margin: 0 30px 18px;
+  text-align: center;
+  padding-right: 30px;
+}
+.timeline-bg {
+  min-width: max-content;
+  margin: 29px 30px 30px;
+  text-align: center;
+  padding-right: 30px;
+}
+.timeline-layout {
+  display: flex;
+  justify-content: center;
+}
+.timeline-divider {
+  content: '';
+  min-width: 100px;
+  border: 1px solid #E5E5E5;
+}
+.timeline-name {
+  padding: 0 10px;
+  font-weight: 400;
+  font-size: 12px;
+  color: #444444;
+  position: relative;
+  top: 12px;
+}
+.circular {
+  width: 10px;
+  height: 10px;
+  margin: 0 8px;
+  display: inline-block;
+  border: 1px solid #60AEFF;
+  border-radius: 50%;
+  position: relative;
+  top: 12px;
+  cursor: pointer;
+}
+.time-code {
+  background: #FFF;
+}
+.time-code1 {
+  background: #60AEFF;
+}
+.time-color {
+  color: #444;
+}
+.time-color1 {
+  color: #60AEFF;
+}
+</style>

+ 75 - 0
src/views/monthlyReport/childrenPage/editReport/components/drawerModal/drawerModalData.js

@@ -0,0 +1,75 @@
+import { bugList } from '@/api/defectManage'
+export default {
+  // “bug关闭率
+  bug1: {
+    // 标题
+    title: '缺陷',
+    // setIds
+    setIds(paging, drawerData) {
+      const newPaging = { ...paging }
+      newPaging.ids = drawerData.map(item => item.id)
+      return newPaging
+    },
+    // timeline
+    timeline: {
+      // 第一条
+      one: ['全部', '已完成', '未完成'],
+      oneStatus: {
+        status1: [3],
+        status2: [0, 2, 5, 4]
+      },
+      // 第一个时间轴点击的事件
+      oneClick({ value, name, paging, drawerData }) {
+        const newPaging = { ...paging }
+        if (value) {
+          newPaging.statusList = this.oneStatus[`status${value}`]
+          newPaging.ids = drawerData.filter(elm => newPaging.statusList.indexOf(elm.status) > -1).map(item => item.id)
+        } else {
+          delete newPaging.statusList
+          newPaging.ids = drawerData.map(item => item.id)
+        }
+        return { paging: newPaging }
+      },
+      // 第二条
+      two: null
+    },
+    // 表头
+    column: [
+      {
+        label: '缺陷等级',
+        key: 'priorityName',
+        minWidth: 60,
+        align: 'left',
+        type: 'level'
+      },
+      {
+        label: '缺陷名称',
+        key: 'bugName',
+        minWidth: 490,
+        align: 'left',
+        type: 'topTitle',
+        topName: 'BUG',
+        topKey: 'id'
+      },
+      {
+        label: '状态',
+        key: 'bugStatusName',
+        minWidth: 90
+      }
+    ],
+    // 表格高度
+    tableHeight: 'calc(100vh - 292px)',
+    // 是否真实分页
+    isPagination: true,
+    // 请求方法
+    method: bugList,
+    // 跳转
+    jumper: '缺陷',
+    // 设置接口返回值
+    setTableList({ tableList, oldTableList, paging, res }) {
+      tableList = res.data
+      paging.pageTotal = res.total
+      return { tableList, paging }
+    }
+  }
+}

+ 413 - 0
src/views/monthlyReport/childrenPage/editReport/components/drawerModal/index.vue

@@ -0,0 +1,413 @@
+<template>
+  <el-drawer
+    class="content-wrapper"
+    :modal="false"
+    size="100%"
+    :class="drawerBox"
+    destroy-on-close
+    :visible.sync="drawer"
+    :before-close="handleClose"
+    @click.stop
+    @open="setBoxShadow('')"
+    @opened="setBoxShadow"
+    @close="setBoxShadow('')"
+  >
+    <template slot="title">
+      <div v-if="title" @click.stop>{{ title }}<span class="sub-title">{{ subTitle }}</span></div>
+    </template>
+    <!-- 时间线 -->
+    <div
+      v-if="openDrawer && baseModal && baseModal.timeline.one "
+      class="drawer-padding drawer-header"
+      :style="{paddingTop: baseModal.timeline.two ? '10px':'30px'}"
+      @click.stop
+    >
+      <div id="index" ref="timeline1" class="drawer-scll">
+        <timeline
+          :num="timelineData.firstActive"
+          bg-margin
+          :data="baseModal.timeline.one"
+          @update="(params) => timeLineClick(params, 1)"
+        />
+      </div>
+      <div v-if="baseModal.timeline.two" ref="timeline2" class="drawer-scll">
+        <timeline
+          :num="timelineData.secondActive"
+          :data="baseModal.timeline.two"
+          bg-margin
+          @update="(params)=>timeLineClick(params, 2)"
+        />
+      </div>
+    </div>
+
+    <!-- 表格 -->
+    <dmTable
+      v-if="openDrawer"
+      v-loading="loading"
+      :table-list="tableList"
+      :total="tableList"
+      :column="baseModal && baseModal.column || []"
+      :table-height="baseModal && baseModal.tableHeight ? baseModal.tableHeight : 'auto' "
+      size="mini"
+      @click.stop
+      @change="dmTableChange"
+    >
+      <!-- 改进项:级别 -->
+      <template #improvementsOverRateColumnsPrioritySlot="{scope}">
+        <div v-if="scope.row.caseName" @click.stop>
+          <a target="_blank" :href="scope.row.url">{{ scope.row.caseName }}</a>
+        </div>
+      </template>
+    </dmTable>
+    <!-- 下拉 -->
+    <div class="footer-laout" @click.stop>
+      <div style="line-height: 60px;">
+<!--        <el-button type="primary" size="mini" @click="exportTable">导 出</el-button>-->
+      </div>
+      <el-pagination
+        :current-page.sync="paging.curIndex"
+        :page-size="paging.pageSize"
+        :pager-count="5"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page-sizes="[10, 15, 20, 30]"
+        :total="paging.pageTotal"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </el-drawer>
+</template>
+<script>
+import _ from 'lodash'
+import moment from 'moment'
+import dmTable from '@/components/baseTable/table'
+import timeline from './components/timeline'
+import drawerModalData from './drawerModalData'
+import { EncryptId } from '@/utils/crypto-js'
+
+export default {
+  name: 'DrawerModal',
+  components: {
+    dmTable, timeline
+  },
+  props: {
+    modalType: {
+      type: String,
+      required: false,
+      default: () => 'bug1' // 默认为缺陷
+    },
+    openDrawer: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    drawerData: {
+      type: Array,
+      required: false,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      baseModal: null,
+      drawer: false,
+      loading: false,
+      title: '',
+      headerTitle: '',
+      // timelineData,
+      tableList: [],
+      tableListOld: [],
+      // tableHeight: 'auto',
+      column: [],
+      ids: [],
+      label: '',
+      activeLabel: '',
+      drawerBox: '',
+      subTitle: '',
+      sourceData: null,
+      /* S 新增缺陷*/
+      priorityList: [],
+      /* E 新增缺陷*/
+      timelineData: {
+        first: [],
+        firstActive: 0,
+        second: [],
+        secondActive: 0
+      },
+      paging: {
+        curIndex: 1,
+        pageTotal: 0,
+        pageSize: 10
+      }
+    }
+  },
+  watch: {
+    drawerData(v, o) {
+      this.init()
+    },
+    openDrawer(value) {
+      this.drawer = value
+      if (this.drawer) {
+        this.init()
+      }
+    }
+  },
+  mounted() {
+    this.drawer = false
+  },
+  methods: {
+    moment,
+    init() {
+      this.baseModal = { ...drawerModalData[this.modalType] }
+      this.title = this.baseModal.title
+      this.pagingInit()
+      this.setPageSize()
+      this.column = this.baseModal.column
+      this.tableList = []
+      this.drawer = this.openDrawer
+      // 初始化的时候使用 setIds
+      this.paging = this.baseModal.setIds(this.paging, this.drawerData)
+      this.setTableList()
+    },
+    // 设置页数
+    setPageSize() {
+      const pageSize = window.localStorage.getItem('pageSize') || 10
+      const paging = _.cloneDeep(this.paging)
+      paging.pageSize = Number.parseInt(pageSize)
+      this.paging = _.cloneDeep(paging)
+    },
+    // 处理日期格式:JS - 2020-01-01T00:00:00.000000Z 日期格式转换
+    rTime(date) {
+      if (!date) return ''
+      var json_date = new Date(date).toJSON()
+      return new Date(new Date(json_date) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
+    },
+
+    handleClose() {
+      this.drawer = false
+      this.$emit('update:openDrawer', this.drawer)
+    },
+    handleSizeChange(value) {
+      this.paging.pageSize = value
+      const paging = _.cloneDeep(this.paging)
+      paging.pageSize = value
+      this.paging = _.cloneDeep(paging)
+      window.localStorage.setItem('pageSize', value)
+      // 是否真实分页
+      if (this.baseModal.isPagination) {
+        this.setTableList()
+      } else {
+        this.tableListPagination()
+      }
+    },
+    handleCurrentChange(value) {
+      const paging = _.cloneDeep(this.paging)
+      paging.curIndex = value
+      this.paging = _.cloneDeep(paging)
+      // 是否真实分页
+      if (this.baseModal.isPagination) {
+        this.setTableList()
+      } else {
+        this.tableListPagination()
+      }
+    },
+    // 导出
+    exportTable() {
+    },
+    // 格式化时间
+    dateFomatter(date) {
+      return date.substring(0, 10) + ' ' + date.substring(11, 19)
+    },
+    // 时间轴点击事件
+    timeLineClick({ value, name }, index) {
+      this.pagingInit()
+      if (index === 1) {
+        const { paging } = this.baseModal.timeline.oneClick({
+          value, name, paging: this.paging, drawerData: this.drawerData
+        })
+        this.paging = { ...paging }
+      }
+      if (index === 2) {
+        const { paging } = this.baseModal.timeline.twoClick({
+          value, index, paging: this.paging
+        })
+        this.paging = { ...paging }
+      }
+      this.setTableList()
+    },
+    // 设置列表数据
+    async setTableList() {
+      this.tableList = []
+      this.loading = true
+      // 请求数据
+      if (!this.drawerData.length) {
+        this.loading = false
+        return
+      }
+      const paging = this.paging
+      this.baseModal.method({
+        ...paging
+        // idList: this.drawerData,
+        // curIndex: this.paging.curIndex,
+        // pageSize: this.paging.pageSize
+      }).then(res => {
+        if (res.code === 200) {
+          // 暴露处理返回值的函数,通过 this.baseModal 调用
+          const { tableList, oldTableList, paging } = this.baseModal.setTableList({
+            tableList: this.tableList, // 表格展示时使用的数据
+            oldTableList: this.oldTableList, // 假分页时使用的数据
+            paging: this.paging, // 分页数据和部分给接口传参
+            res
+          })
+          if (tableList) {
+            this.tableList = [...tableList]
+          }
+          if (oldTableList) {
+            this.oldTableList = [...oldTableList]
+          }
+          if (paging) {
+            this.paging = { ...paging }
+          }
+          this.loading = false
+        }
+      })
+    },
+
+    // 前端分页
+    tableListPagination() {
+      if (this.tableListOld.length) {
+        this.tableList = this.tableListOld.map(e => e).splice((this.paging.curIndex - 1 || 0) * this.paging.pageSize, this.paging.pageSize)
+      }
+    },
+    // 分页数据初始化
+    pagingInit() {
+      const pageSize = window.localStorage.getItem('pageSize') || 10
+      this.paging = {
+        curIndex: 1,
+        pageTotal: 0,
+        pageSize: Number.parseInt(pageSize)
+      }
+      this.priorityList = []
+    },
+    // 设置表头
+    // 表格跳转
+    dmTableChange({ column, row }) {
+      if (typeof this.baseModal.jumper === 'string') {
+        this.jumper(row, this.baseModal.jumper)
+      } else {
+        this.baseModal.jumper({ column, row })
+      }
+    },
+    // 设置表格样式
+    setBoxShadow(key = 'drawer-box') {
+      if (key) {
+        setTimeout(() => {
+          this.drawerBox = key
+        }, 300)
+      } else {
+        this.drawerBox = key
+      }
+    },
+    jumper(val, name) { // 需求、任务、缺陷跳转
+      // const { bizId = null } = this.$store.state.global || {}
+      const { bizId, id } = val
+      const bizId_id = EncryptId(`${bizId}_${id}`)
+      const newTab = this.$router.resolve({ name: name + '详情', query: { bizId_id: bizId_id }})
+      window.open(newTab.href, '_blank')
+    }
+  }
+}
+</script>
+<style scoped lang='less'>
+.content-wrapper{
+ /deep/.el-drawer__body{
+   overflow: hidden;
+ }
+}
+/deep/ .el-drawer__header {
+  color: #444;
+  font-size: 20px;
+  font-weight: 500;
+  margin-bottom: 0;
+  padding: 20px 30px;
+  border-bottom: 1px solid #E2E2E2;
+
+  .sub-title {
+    color: #444;
+    font-size: 14px;
+    margin-left: 20px;
+    font-weight: 400;
+  }
+}
+
+.drawer-box {
+  box-shadow: 0 8px 10px -5px rgba(0, 0, 0, .2), 0 16px 24px 2px rgba(0, 0, 0, .14), 0 6px 30px 5px rgba(0, 0, 0, .12);
+}
+.el-drawer-fade-enter-active {
+  animation: el-drawer-fade-in 10ms;
+}
+.el-drawer-fade-leave-active {
+  animation: el-drawer-fade-in 10ms reverse;
+}
+.el-drawer__wrapper {
+  width: 100%;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 50%;
+  overflow: hidden;
+  margin: 0;
+}
+/deep/.el-drawer__container {
+  left: 0;
+  right: 0;
+  width: 50%;
+}
+/* S 时间轴 */
+.drawer-header {
+  text-align: center;
+  background: #F7F7F7;
+  border-radius: 4px;
+  min-height: 120px;
+  margin: 20px 30px 10px;
+  overflow: hidden;
+}
+.drawer-padding {
+  padding: 20px 0;
+}
+.drawer-padding-s {
+  padding: 1px 0;
+}
+.drawer-scll {
+  overflow-x: scroll;
+}
+.drawer-scll::-webkit-scrollbar { width: 0 !important; height: 0 !important }
+.drawer-H {
+  font-size: 16px;
+  margin: 0 30px;
+  color: #444444;
+}
+.drawer-scll {
+  overflow-x: scroll;
+}
+.drawer-scll::-webkit-scrollbar { width: 0 !important; height: 0 !important }
+.drawer-H {
+  font-size: 16px;
+  margin: 0 30px;
+  color: #444444;
+}
+/* E 时间轴 */
+.footer-laout {
+  display: flex;
+  justify-content: space-between;
+  margin: 0 30px;
+}
+.drawer-name:hover {
+  color: #409eff;
+  cursor: pointer;
+}
+/deep/.el-table::before{
+  display: none;
+}
+</style>

+ 7 - 2
src/views/projectManage/requirement/list/index.vue

@@ -161,8 +161,8 @@
                 <i style="color:#409EFF; cursor: pointer; margin-right: 5px;" class="el-icon-remove-outline" @click="DemandSta" />
                 <span> 需求状态包含:</span>
               </div>
-              <el-checkbox-group v-model="searchForm.containStatus" class="allCheckbox">
-                <el-checkbox v-for="item in requiredStatus" :key="item.value" :value="item.value">{{ item.label }}</el-checkbox>
+              <el-checkbox-group v-model="searchForm.containStatus" class="allCheckbox" @change="test">
+                <el-checkbox v-for="item in requiredStatus" :key="item.code" :label="item.code">{{ item.msg }}</el-checkbox>
               </el-checkbox-group>
               <div class="DemandStatus">状态停留时长:</div>
               <el-select v-model="searchForm.comparisonOperator" size="small" style="width: 80px; margin: 20px 20px 0 79px;" clearable filterable placeholder="请选择">
@@ -476,6 +476,9 @@ export default {
     this.$store.state.data.status = false
   },
   methods: {
+    test(e) {
+      console.log(e)
+    },
     // 修改状态
     async statusChange(item, value) {
       this.statusObj = value
@@ -506,6 +509,7 @@ export default {
         this.get_charts()
         this.logHandle('changtab_requirement_charts')
       } else {
+        this.showChartModal = false
         this.chartData = {}
         this.getTableData()
       }
@@ -622,6 +626,7 @@ export default {
           value: t.code
         }))
         this.requiredStatus = requiredStatus
+        console.log(requiredStatus)
         this.updateChartSlectOption('statusList', requiredStatus)
       }
       const res3 = await settingQueryBizRqmtOrntList(this.bizId)

+ 1 - 1
src/views/projectManage/taskList/taskViewDetail.vue

@@ -61,7 +61,7 @@
             </el-dropdown-menu>
           </el-dropdown>
         </div>
-        <div class="top-tabs">
+        <div class="top-tabs-public">
           <el-tabs v-model="activeName">
             <el-tab-pane label="概览" name="1" />
             <el-tab-pane label="子任务" name="2" />