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

Merge remote-tracking branch 'origin/Qz_daily_3.0.1' into Qz_daily_3.0.1

洪海涛 пре 4 година
родитељ
комит
3fa112372f

+ 13 - 4
src/components/input/textArea.vue

@@ -24,12 +24,12 @@
             class="icon"
           />
         </span>
-        <el-tooltip effect="dark" content="单击‘编辑’" placement="bottom">
-          <editor :id="'tinymce_'+id" v-model="inputValue" :class="'tinymce_'+id" :init="init" @input="changeText" />
-        </el-tooltip>
+        <editor :id="'tinymce_'+id" v-model="inputValue" :class="'tinymce_'+id" :init="init" @input="changeText" />
       </div>
       <div v-show="!isEmpty && !edit">
-        <pre class="text-pre" @click="ImmediateAddition" v-html="handlerText(value)" />
+        <el-tooltip effect="dark" content="单击‘编辑’" placement="bottom">
+          <pre class="text-pre" @click="ImmediateAddition" v-html="handlerText(value)" />
+        </el-tooltip>
       </div>
       <div :id="'inputUpload_'+id" style="display: none" @click.stop="blur_textarea" />
       <div v-show="edit" class="control">
@@ -48,6 +48,15 @@ import 'tinymce/themes/silver/theme'
 import 'tinymce/icons/default/icons'
 import 'tinymce/plugins/table'
 
+import 'tinymce/plugins/image'
+import 'tinymce/plugins/media'
+import 'tinymce/plugins/lists'
+import 'tinymce/plugins/contextmenu'
+import 'tinymce/plugins/wordcount'
+import 'tinymce/plugins/colorpicker'
+import 'tinymce/plugins/textcolor'
+import 'tinymce/skins/ui/oxide/skin.css'
+
 export default {
   components: {
     Editor

+ 15 - 13
src/views/business/bizIdSelect.vue

@@ -6,8 +6,8 @@
       </div>
       <article>
         <div class="my-business">
-          <div class="business-title">我的业务线</div>
-          <div class="my-business-list">
+          <div class="business-title" style="color: #333333; font-weight: 500;">我的业务线</div>
+          <div v-if="myBusiness && myBusiness[0]" class="my-business-list">
             <div
               v-for="(item, index) in myBusiness"
               :key="'my'+item.code"
@@ -19,9 +19,10 @@
               <span class="biz-name">{{ item.name }}</span>
             </div>
           </div>
+          <div v-else style=" padding: 27px 32px; color: #666666; font-size: 16px;">请联系所在业务线负责人将您添加为团队成员</div>
         </div>
         <div class="all-business">
-          <div class="business-title" style="margin: 15px 0">所有业务线</div>
+          <div class="business-title" style="margin: 15px 0; color: #333333; font-weight: 500">所有业务线</div>
           <div class="all-business-list">
             <div
               v-for="(item, index) in bizSelectList"
@@ -134,19 +135,19 @@ export default {
 .business-contain {
   height: 100%;
   width: 100%;
-  padding: 70px 130px 120px;
+  padding: 30px;
   background-color: #f7f8fc;
 }
 .bizId-select {
   position: relative;
-  height: 628px;
+  // height: 628px;
   width: 100%;
-  padding-bottom: 32px;
+  // padding-bottom: 32px;
   background-color: #ffffff;
   border-radius: 10px;
-  box-shadow: 0px 30px 16px #eef0f5;
+  // box-shadow: 0px 30px 16px #eef0f5;
   article {
-    height: 480px;
+    // height: 480px;
     overflow: scroll;
   }
 }
@@ -170,20 +171,21 @@ export default {
     padding: 27px 32px;
     display: grid;
     text-align: center;
-    grid-template-columns: repeat(5, 20%);
+    grid-template-columns: repeat(6, 17%);
     grid-gap: 50px 0;
   }
 }
 .all-business {
   width: 100%;
-  padding: 0 46px 43px;
+  padding: 0 46px 0;
   color: #666666;
   font-size: 18px;
   .all-business-list {
+    font-size: 16px;
     padding: 27px 32px;
     display: grid;
     text-align: center;
-    grid-template-columns: repeat(5, 20%);
+    grid-template-columns: repeat(6, 17%);
     grid-gap: 33px 0;
   }
 }
@@ -235,8 +237,8 @@ export default {
 //   background-color: #13cbc2;
 // }
 .business-tips {
-  margin-top: 43px;
-  margin-bottom: 50px;
+  margin-top: 20px;
+  padding-bottom: 50px;
   display: flex;
   flex-direction: column;
   align-items: center;

+ 8 - 15
src/views/dataBigManage/components/qualityModule/index.vue

@@ -15,11 +15,8 @@
               :span="12"
               class="mb10"
             >
-              <div
-                :style="{ cursor: item.label === '新增问题' && 'pointer'}"
-                @click.stop="onDetial('线上问题', item)"
-              >
-                <dataItem :item="item" />
+              <div :style="{ cursor: item.label === '新增问题' && 'pointer'}"><!--@click.stop="onDetial('线上问题', item)"-->
+                <dataItem :item="item" @subCountListClick="(subCountItem) => onDetial('线上问题', item)" />
               </div>
             </el-row>
           </el-col>
@@ -64,11 +61,9 @@
         <div class="titleLevel3 mb10">线下质量</div>
         <el-row :gutter="10">
           <el-col v-for="(item, index) in mainData.offlineProblemList" :key="index" :span="12" class="mb10">
-            <div
-              :style="{ cursor: 'pointer'}"
-              @click.stop="onDetial('线下质量', item)"
-            >
-              <dataItem :item="item" />
+            <div :style="{ cursor: 'pointer'}" @click.stop="onDetial('线下质量', item)">
+              <!--@click.stop="onDetial('线下质量', item)"-->
+              <dataItem :item="item" @subCountListClick="(subCountItem) => onDetial('线下质量', item)" />
             </div>
           </el-col>
         </el-row>
@@ -101,11 +96,9 @@
             :span="12"
             class="mb10"
           >
-            <div
-              :style="{ cursor: item.label !== '免测上线率' && 'pointer'}"
-              @click.stop="onDetial('上线过程', {...item, parent: mainData.onlineProcessList, index: index, moduleName: '上线过程' })"
-            >
-              <dataItem :item="item" />
+            <div :style="{ cursor: item.label !== '免测上线率' && 'pointer'}" @click.stop="onDetial('上线过程', {...item, parent: mainData.onlineProcessList, index: index, moduleName: '上线过程' })">
+            <!-- @click.stop="onDetial('上线过程', {...item, parent: mainData.onlineProcessList, index: index, moduleName: '上线过程' })" -->
+              <dataItem :item="item" @subCountListClick="(subCountItem) => onDetial('上线过程', {...item, parent: mainData.onlineProcessList, index: index, moduleName: '上线过程' })" />
             </div>
           </el-col>
         </el-row>

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

+ 2 - 0
src/views/projectManage/bugList/file/createdBug.vue

@@ -366,6 +366,7 @@ export default {
       this.nowPageId = bizId_id[1]
     },
     init(e, ele) {
+      console.log(e, ele, '才能健康的事')
       this.modalShow = true
       this.createLoading = false
       this.$nextTick(() => {
@@ -385,6 +386,7 @@ export default {
         this.titleName = '新建缺陷'
         if (ele !== undefined) {
           this.$set(this.formInline, 'taskId', ele.id)
+          this.$set(this.formInline, 'moduleIds', ele.moduleIds)
         }
       }
       if (e === 2) {

+ 4 - 1
src/views/projectManage/components/demand.vue

@@ -127,6 +127,7 @@
       <el-table-column width="150" align="center">
         <template slot-scope="scope">
           <el-select
+            v-if="showunlock"
             v-model="scope.row.status"
             :class="{
               'status0':scope.row.status===0,
@@ -143,6 +144,7 @@
           >
             <el-option v-for="item in scope.row.availableStatusList" :key="item.code" :label="item.name" :value="item.code" />
           </el-select>
+          <div v-else>{{ scope.row.statusString }}</div>
         </template>
       </el-table-column>
       <el-table-column label="任">
@@ -239,7 +241,8 @@ export default {
       type: [Object, Array],
       default: () => null,
       required: false
-    }
+    },
+    showunlock: { type: Boolean, required: true }
   },
   data() {
     return {

+ 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/childrenTask/childDrawer.vue

@@ -121,7 +121,7 @@
           <div class="title-left-name">描述</div>
         </div>
         <div>
-          <text-area :id="'pro-desc'" :value.sync="formData.remark" :empty-text="'点击'" :input-button="'添加描述'" @change="changeArea('remark')" />
+          <text-area :id="'pro-descs'" :value.sync="formData.remark" :empty-text="'点击'" :input-button="'添加描述'" @change="changeArea('remark')" />
         </div>
       </section>
       <!-- 子任务列表 -->

+ 2 - 1
src/views/projectManage/taskList/components/scheduleList.vue

@@ -76,7 +76,7 @@
             <div class="blueStr" />
             <div class="task-object-list">
               <template v-for="(item,index) in scope.row.taskObjectList">
-                <div v-if="index<5" :key="'task-object'+index" class="task-item" @click="link(item.id)">
+                <div :key="'task-object'+index" class="task-item" @click="link(item.id)">
                   <span class="item-id">{{ item.taskId }}</span>
                   <span class="item-name">{{ item.name }}</span>
                   <span>{{ item.moduleInfoName }}</span>
@@ -294,6 +294,7 @@ export default {
 }
 .task-object-list {
   width: 100%;
+  height: 130px;
   overflow: scroll;
   .task-item {
     width: 100%;

+ 6 - 2
src/views/projectManage/taskList/taskViewDetail.vue

@@ -373,7 +373,7 @@
       <!-- 新建(bug) -->
       <createdBug v-if="bug_open" ref="createdBug" @getBugList="reloadList" />
       <create-children v-if="createChildren" :visible.sync="createChildren" :data="form_query" :new-add="true" @change="reloadList" />
-      <Test-report v-if="dialogTest" ref="TestReport" />
+      <Test-report v-if="dialogTest" ref="TestReport" @getList="getTest" />
       <Daily-report v-if="dialogDaily" ref="DailyReport" />
       <ReleaseReport v-if="dialogClient" ref="ClientReport" />
       <!-- 新建 -->
@@ -616,6 +616,9 @@ export default {
     this.$store.state.data.status = false
   },
   methods: {
+    getTest() {
+      this.taskGet()
+    },
     analysisBizId_id() { // 解析路由中的bizId_id
       if (!this.$route.query.bizId_id) return
       const bizId_id = analysisBizId_id(this.$route.query.bizId_id)
@@ -899,9 +902,10 @@ export default {
       }
     },
     created_bug() { // 缺陷创建
+      console.log(this.form_query)
       this.bug_open = true
       this.$nextTick(() => {
-        this.$refs.createdBug.init(1, { id: this.taskId })
+        this.$refs.createdBug.init(1, { id: this.taskId, moduleIds: this.form_query.moduleIds })
       })
     },
     createReport(e, ele) { // 创建报告