|
@@ -17,25 +17,25 @@
|
|
|
<timeline :num="timelineData.firstActive" bgmargin :data="timelineData.first" @update="(params) => timeLineClick(params, 1)" />
|
|
|
</div>
|
|
|
<div v-if="isTimeLine(2)" ref="timeline2" class="qz-drawer-scll">
|
|
|
- <timeline :num="timelineData.secondActive" :data="timelineData.second" @update="(params)=>timeLineClick(params, 2)" />
|
|
|
+ <timeline :num="timelineData.secondActive" :data="timelineData.second" :bgmargin="true" @update="(params)=>timeLineClick(params, 2)" />
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- 表格 -->
|
|
|
<dmTable v-if="openDrawer" v-loading="loading" :table-list="tableList" :total="tableList" :column="column" :table-height="tableHeight" @click.stop @change="dmTableChange">
|
|
|
<template #bugStatusNameSlot="{scope}">
|
|
|
- <div @click="print(scope)">自定义</div>
|
|
|
+ <div @click.stop="print(scope)">自定义</div>
|
|
|
</template>
|
|
|
<!-- 报告名称 -->
|
|
|
<template #returnReasonSlot="{scope}">
|
|
|
- <div v-if="scope.row.reportName">
|
|
|
+ <div v-if="scope.row.reportName" @click.stop>
|
|
|
<div class="drawer-name" @click.stop="jumper(scope.row,'提测')">{{ scope.row.reportName }}</div>
|
|
|
<div v-if="scope.row.returnReason" style="color: red">打开报告:{{ scope.row.returnReason }}</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
<!-- 报告人 -->
|
|
|
<template #creatorObjectSlot="{scope}">
|
|
|
- <div v-if="scope && scope.row && scope.row.creatorObject">{{ scope.row.creatorObject.name }}</div>
|
|
|
+ <div v-if="scope && scope.row && scope.row.creatorObject" @click.stop>{{ scope.row.creatorObject.name }}</div>
|
|
|
</template>
|
|
|
</dmTable>
|
|
|
<!-- 下拉 -->
|
|
@@ -62,12 +62,21 @@ import { bugList } from '@/api/defectManage'
|
|
|
import { getReportList } from '@/api/reportTemplate'
|
|
|
import dmTable from './components/table.vue'
|
|
|
import timeline from './components/timeline'
|
|
|
-import { columns, timelineData } from './drawerModalData'
|
|
|
+import { columns, timelineList } from './drawerModalData'
|
|
|
import { EncryptId } from '@/utils/crypto-js'
|
|
|
import Clickoutside from 'element-ui/src/utils/clickoutside'
|
|
|
import { requirementQueryRequirementInfoList, taskList } from '@/api/projectIndex'
|
|
|
+import {
|
|
|
+ // 质量
|
|
|
+ getRequireAvgData, // 需求平均交付周期
|
|
|
+ getTaskData, // 任务平均交付周期
|
|
|
+ getRequirePeopleData, // 平均需求使用人力
|
|
|
+ getDelayLaunchData, // 延期提测率
|
|
|
+ getDelayReleaseData, // 延期准出率
|
|
|
+ bugRepairData, // 缺陷24小时修复率
|
|
|
+ bugRepair2Data // 缺陷平均修复时长
|
|
|
+} from '@/api/dataMarket'
|
|
|
|
|
|
-Object.freeze(timelineData)
|
|
|
export default {
|
|
|
name: 'DrawerModal',
|
|
|
components: {
|
|
@@ -113,6 +122,7 @@ export default {
|
|
|
column: [],
|
|
|
ids: [],
|
|
|
label: '',
|
|
|
+ activeLabel: '',
|
|
|
subTitle: '',
|
|
|
sourceData: null,
|
|
|
timelineData: {
|
|
@@ -159,8 +169,32 @@ export default {
|
|
|
this.tableList = []
|
|
|
this.drawer = this.openDrawer
|
|
|
this.headerTitle = this.drawerData.headerTitle
|
|
|
- this.title = this.headerTitle === '质量' ? this.drawerData.label : this.drawerData.activeLabel
|
|
|
+ this.title = this.headerTitle.search(/质量|效率/) > -1 ? this.drawerData.label : this.drawerData.activeLabel
|
|
|
+ if (this.headerTitle === '效率') {
|
|
|
+ this.activeLabel = this.drawerData.activeLabel
|
|
|
+ if (this.drawerData.label === '需求平均交付周期') {
|
|
|
+ this.title = '需求周期'
|
|
|
+ }
|
|
|
+ if (this.drawerData.label === '任务平均交付周期') {
|
|
|
+ this.title = '任务周期'
|
|
|
+ }
|
|
|
+ if (this.drawerData.label === '平均需求使用人力') {
|
|
|
+ this.title = '需求人力'
|
|
|
+ }
|
|
|
+ if (this.drawerData.label === '缺陷平均修复时长') {
|
|
|
+ this.title = '缺陷修复时长'
|
|
|
+ }
|
|
|
+ }
|
|
|
this.sourceData = this.drawerData.list
|
|
|
+ if (this.headerTitle === '效率' && this.title.search(/延期准出率|延期提测率/) < 0) {
|
|
|
+ this.sourceData = [
|
|
|
+ {
|
|
|
+ label: this.drawerData.label === '缺陷24小时修复率' ? '全部' : this.drawerData.label,
|
|
|
+ IdList: this.drawerData.IdList
|
|
|
+ },
|
|
|
+ ...this.drawerData.subCountList
|
|
|
+ ]
|
|
|
+ }
|
|
|
// this.ids = this.drawerData.IdList.map(e => e)
|
|
|
// this.ids = [14952, 15453, 15988, 16182, 17445, 17447, 17735, 18062, 18064, 18067, 19255, 19568, 19569, 19570, 19571, 19572, 19574, 19575, 19576, 19577, 19578, 19579, 19587, 19588, 19590, 19593, 19595, 19596, 19597, 19599, 19619, 19642, 19644, 19645, 19652, 19655, 19673, 19674, 19887, 19888, 19931, 19935, 19970, 20048, 20049, 20058, 20071, 20086, 20149, 20181, 20182, 20183, 20184, 20301, 20442, 20755, 20758, 20760, 20765, 20770, 20777, 20778, 20782, 20783, 20789, 20803, 20804, 20805, 20808, 20809, 20810, 20812, 20813, 20814, 20815, 20816, 20817, 20818, 20819, 20820, 20825, 20826, 20831, 20848, 20850, 20851]
|
|
|
this.ids = [2049, 1662, 2050, 1644, 2051, 1657, 1670, 1715, 1728, 1692, 2048, 2052, 2047] // 提测报告
|
|
@@ -173,14 +207,10 @@ export default {
|
|
|
// 设置时间轴
|
|
|
setTimeLineData() {
|
|
|
let { firstActive, first, secondActive, second } = this.timelineData
|
|
|
-
|
|
|
if (this.title.search(/新增问题|新增缺陷|reopen|提测打回率|准出不通过/) < 0) {
|
|
|
- if (this.title.search(/缺陷24小时修复率/) > -1) {
|
|
|
- second = []
|
|
|
- }
|
|
|
if (this.headerTitle === '吞吐量') {
|
|
|
- // first = this.sourceData.map(elm => elm.label)
|
|
|
secondActive = 0
|
|
|
+ firstActive = 0
|
|
|
first = []
|
|
|
this.sourceData.forEach((elm, index) => {
|
|
|
if (this.title === elm.label) {
|
|
@@ -190,13 +220,55 @@ export default {
|
|
|
})
|
|
|
}
|
|
|
if (this.headerTitle === '效率') {
|
|
|
+ secondActive = 0
|
|
|
+ firstActive = 0
|
|
|
first = []
|
|
|
+ second = []
|
|
|
+ if (this.title === '缺陷24小时修复率') {
|
|
|
+ first = [...timelineList.time]
|
|
|
+ }
|
|
|
+ if (this.title === '延期提测率') {
|
|
|
+ first = [...timelineList.delayLaunchData]
|
|
|
+ }
|
|
|
+ if (this.title === '延期准出率') {
|
|
|
+ first = [...timelineList.delayLaunchData2]
|
|
|
+ }
|
|
|
+ if (this.title.search(/延期提测率|延期准出率/) < 0) {
|
|
|
+ this.sourceData.forEach((elm, index) => {
|
|
|
+ let label = `${elm.label}`
|
|
|
+ if (this.activeLabel === label) {
|
|
|
+ if (this.title === '缺陷24小时修复率') {
|
|
|
+ secondActive = index
|
|
|
+ } else {
|
|
|
+ firstActive = index
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (this.title === '缺陷24小时修复率') {
|
|
|
+ second.push(label)
|
|
|
+ } else {
|
|
|
+ if (index === 0) {
|
|
|
+ if (label === '需求平均交付周期') {
|
|
|
+ label = '需求交付周期'
|
|
|
+ }
|
|
|
+ if (label === '任务平均交付周期') {
|
|
|
+ label = '任务交付周期'
|
|
|
+ }
|
|
|
+ if (label === '平均需求使用人力') {
|
|
|
+ label = '需求使用人力'
|
|
|
+ }
|
|
|
+ if (this.drawerData.label === '缺陷平均修复时长') {
|
|
|
+ label = '全部'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ first.push(label)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
this.timelineData = { firstActive, first, secondActive, second }
|
|
|
}
|
|
|
},
|
|
|
handleClose() {
|
|
|
- console.log(123)
|
|
|
this.drawer = false
|
|
|
this.$emit('update:openDrawer', this.drawer)
|
|
|
},
|
|
@@ -228,16 +300,53 @@ export default {
|
|
|
this.column = columns.taskListColumns.map(e => e)
|
|
|
}
|
|
|
}
|
|
|
+ if (this.headerTitle === '效率') {
|
|
|
+ let columnsKey = 'requirementColumns'
|
|
|
+
|
|
|
+ if (this.title === '任务周期') {
|
|
|
+ columnsKey = 'taskColumns'
|
|
|
+ }
|
|
|
+ if (this.title === '需求人力') {
|
|
|
+ columnsKey = 'requirementPeopleColumns'
|
|
|
+ }
|
|
|
+ if (this.title === '延期提测率') {
|
|
|
+ columnsKey = 'delayLaunchDataColumns'
|
|
|
+ }
|
|
|
+ if (this.title === '延期准出率') {
|
|
|
+ columnsKey = 'delayReleaseData2Columns'
|
|
|
+ }
|
|
|
+ if (this.title.search(/缺陷修复时长|缺陷24小时修复率/) > -1) {
|
|
|
+ columnsKey = 'bugRepairDataColumns'
|
|
|
+ }
|
|
|
+ const columnsTipsKey = `${columnsKey}Tips`
|
|
|
+ this.column = columns.efficiency[columnsKey].map((elm, index) => {
|
|
|
+ if (index === 2 && this.title.search(/任务周期|需求人力|需求周期/) > -1) {
|
|
|
+ return columns.efficiency[columnsTipsKey][this.timelineData.firstActive || 0]
|
|
|
+ }
|
|
|
+ return elm
|
|
|
+ })
|
|
|
+ }
|
|
|
},
|
|
|
// 时间轴点击事件
|
|
|
timeLineClick({ value, name }, index) {
|
|
|
this.pagingInit()
|
|
|
if (index === 1) {
|
|
|
if (this.headerTitle === '吞吐量') {
|
|
|
- this.timelineData.firstActive = value
|
|
|
- this.ids = this.sourceData[value].IdList
|
|
|
+ this.timelineData.firstActive = value || 0
|
|
|
+ this.ids = this.sourceData[value || 0].IdList
|
|
|
this.title = name
|
|
|
}
|
|
|
+ if (this.headerTitle === '效率') {
|
|
|
+ this.timelineData.firstActive = value || 0
|
|
|
+ if (this.title.search(/延期准出率|延期提测率/) > -1) {
|
|
|
+ this.ids
|
|
|
+ } else {
|
|
|
+ this.timelineData.firstActive = value || 0
|
|
|
+ this.ids = this.sourceData[value || 0].IdList
|
|
|
+ }
|
|
|
+
|
|
|
+ this.setColumn()
|
|
|
+ }
|
|
|
this.setTableList()
|
|
|
console.log(value, name, '第一条')
|
|
|
}
|
|
@@ -247,13 +356,15 @@ export default {
|
|
|
},
|
|
|
// 设置列表数据
|
|
|
setTableList() {
|
|
|
- if (this.title.search(/新增缺陷|reopen/) > -1) {
|
|
|
- this.loading = true
|
|
|
- this.getBugStatisticData()
|
|
|
- }
|
|
|
- if (this.title.search(/提测打回率|准出不通过/) > -1) {
|
|
|
- this.loading = true
|
|
|
- this.setReportList()
|
|
|
+ if (this.headerTitle === '质量') {
|
|
|
+ if (this.title.search(/新增缺陷|reopen/) > -1) {
|
|
|
+ this.loading = true
|
|
|
+ this.getBugStatisticData()
|
|
|
+ }
|
|
|
+ if (this.title.search(/提测打回率|准出不通过/) > -1) {
|
|
|
+ this.loading = true
|
|
|
+ this.setReportList()
|
|
|
+ }
|
|
|
}
|
|
|
if (this.headerTitle === '吞吐量') {
|
|
|
if (this.title.search(/需求/) > -1) {
|
|
@@ -263,6 +374,24 @@ export default {
|
|
|
this.getTaskList()
|
|
|
}
|
|
|
}
|
|
|
+ if (this.headerTitle === '效率') {
|
|
|
+ if (this.title === '需求周期') {
|
|
|
+ this.loading = true
|
|
|
+ this.setRequireAvgData()
|
|
|
+ }
|
|
|
+ if (this.title === '任务周期') {
|
|
|
+ this.setTaskData()
|
|
|
+ }
|
|
|
+ if (this.title === '需求人力') {
|
|
|
+ this.setRequirePeopleData()
|
|
|
+ }
|
|
|
+ if (this.title === '缺陷修复时长') {
|
|
|
+ this.setbugRepair2Data()
|
|
|
+ }
|
|
|
+ if (this.title === '缺陷24小时修复率') {
|
|
|
+ this.setbugRepairData()
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
// 获取需求
|
|
|
async getRequirementList() {
|
|
@@ -324,11 +453,103 @@ export default {
|
|
|
const res = await getReportList(params)
|
|
|
if (res.code === 200) {
|
|
|
this.tableList = res.data
|
|
|
- this.paging.pageTotal = res.total
|
|
|
+ paging.pageTotal = res.total
|
|
|
+ this.paging = { ...paging }
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /* S 效率:半浮层数据接口 */
|
|
|
+ // 需求平均交付周期
|
|
|
+ async setRequireAvgData() {
|
|
|
+ const paging = this.paging
|
|
|
+ const params = {
|
|
|
+ ...paging,
|
|
|
+ title: this.timelineData.first[this.timelineData.firstActive],
|
|
|
+ ids: this.ids
|
|
|
+ }
|
|
|
+ delete params.pageTotal
|
|
|
+ const res = await getRequireAvgData(params)
|
|
|
+ if (res.code === 200) {
|
|
|
+ this.tableList = res.data.list
|
|
|
+ paging.pageTotal = res.data.total
|
|
|
+ this.paging = { ...paging }
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+ console.log(res)
|
|
|
+ },
|
|
|
+ // 任务平均交付周期
|
|
|
+ async setTaskData() {
|
|
|
+ const paging = this.paging
|
|
|
+ const params = {
|
|
|
+ ...paging,
|
|
|
+ title: this.timelineData.first[this.timelineData.firstActive],
|
|
|
+ ids: this.ids
|
|
|
+ }
|
|
|
+ delete params.pageTotal
|
|
|
+ const res = await getTaskData(params)
|
|
|
+ if (res.code === 200) {
|
|
|
+ this.tableList = res.data.list
|
|
|
+ paging.pageTotal = res.data.total
|
|
|
+ this.paging = { ...paging }
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+ console.log(res)
|
|
|
+ },
|
|
|
+ // 平均需求使用人力
|
|
|
+ async setRequirePeopleData() {
|
|
|
+ const paging = this.paging
|
|
|
+ const params = {
|
|
|
+ ...paging,
|
|
|
+ title: this.timelineData.first[this.timelineData.firstActive],
|
|
|
+ ids: this.ids
|
|
|
+ }
|
|
|
+ delete params.pageTotal
|
|
|
+ const res = await getRequirePeopleData(params)
|
|
|
+ if (res.code === 200) {
|
|
|
+ this.tableList = res.data.list
|
|
|
+ paging.pageTotal = res.data.total
|
|
|
+ this.paging = { ...paging }
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+ console.log(res)
|
|
|
+ },
|
|
|
+ // 缺陷平均修复时长
|
|
|
+ async setbugRepair2Data() {
|
|
|
+ const paging = this.paging
|
|
|
+ const params = {
|
|
|
+ ...paging,
|
|
|
+ title: this.timelineData.first[this.timelineData.firstActive],
|
|
|
+ ids: this.ids
|
|
|
+ }
|
|
|
+ delete params.pageTotal
|
|
|
+ const res = await bugRepair2Data(params)
|
|
|
+ if (res.code === 200) {
|
|
|
+ this.tableList = res.data.list
|
|
|
+ paging.pageTotal = res.data.total
|
|
|
this.paging = { ...paging }
|
|
|
this.loading = false
|
|
|
}
|
|
|
+ console.log(res)
|
|
|
},
|
|
|
+ // 缺陷24小时修复率
|
|
|
+ async setbugRepairData() {
|
|
|
+ const paging = this.paging
|
|
|
+ const params = {
|
|
|
+ ...paging,
|
|
|
+ title: this.timelineData.first[this.timelineData.firstActive],
|
|
|
+ ids: this.ids
|
|
|
+ }
|
|
|
+ delete params.pageTotal
|
|
|
+ const res = await bugRepairData(params)
|
|
|
+ if (res.code === 200) {
|
|
|
+ this.tableList = res.data.list
|
|
|
+ paging.pageTotal = res.data.total
|
|
|
+ this.paging = { ...paging }
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+ console.log(res)
|
|
|
+ },
|
|
|
+ /* E 效率:半浮层数据接口 */
|
|
|
// 分页数据初始化
|
|
|
pagingInit() {
|
|
|
this.paging = {
|
|
@@ -342,6 +563,8 @@ export default {
|
|
|
console.log(this.title)
|
|
|
if (this.title.search(/状态停留分布图数据|状态累积流量图数据/) > -1) {
|
|
|
this.tableHeight = 'calc(100vh - 363px)'
|
|
|
+ } else if (this.title.search(/需求周期|需求人力|任务周期|缺陷修复时长/) > -1) {
|
|
|
+ this.tableHeight = 'calc(100vh - 288px)'
|
|
|
} else if (this.title.search(/需求方向分布图数据|模块分布图数据/) > -1) {
|
|
|
this.tableHeight = 'calc(100vh - 200px)'
|
|
|
} else if (this.title.search(/累计新增|PRD评审通过|技术准入|累计上线|累计hold|累计修复|累计reopen/) > -1) {
|
|
@@ -350,7 +573,7 @@ export default {
|
|
|
// 吞吐量: 需求
|
|
|
this.tableHeight = 'calc(100vh - 188px)'
|
|
|
} else if (this.title === '缺陷24小时修复率') {
|
|
|
- this.tableHeight = 'calc(100vh - 416px)'
|
|
|
+ this.tableHeight = 'calc(100vh - 328px)'
|
|
|
} else if (this.title.search(/新增缺陷|提测打回率|reopen|准出不通过/) > -1) {
|
|
|
this.tableHeight = 'calc(100vh - 136px)'
|
|
|
} else {
|
|
@@ -372,6 +595,16 @@ export default {
|
|
|
if (this.title.search(/项目/) > -1) {
|
|
|
this.jumper(row, '项目')
|
|
|
}
|
|
|
+ } else if (this.headerTitle === '效率') {
|
|
|
+ if (column.label.search(/需求/) > -1) {
|
|
|
+ this.jumper(row, '需求')
|
|
|
+ }
|
|
|
+ if (column.label.search(/任务/) > -1) {
|
|
|
+ this.jumper(row, '任务')
|
|
|
+ }
|
|
|
+ if (column.label.search(/缺陷/) > -1) {
|
|
|
+ this.jumper(row, '缺陷')
|
|
|
+ }
|
|
|
} else {
|
|
|
this.jumper(row, '缺陷')
|
|
|
}
|
|
@@ -399,7 +632,7 @@ export default {
|
|
|
isTimeLine(index = 1) {
|
|
|
// 是第一条
|
|
|
if (index === 1) {
|
|
|
- return this.headerTitle.search(/吞吐量/) > -1
|
|
|
+ return this.headerTitle.search(/吞吐量|效率/) > -1
|
|
|
}
|
|
|
// 是第二条
|
|
|
if (index === 2) {
|
|
@@ -453,14 +686,14 @@ export default {
|
|
|
/* S 时间轴 */
|
|
|
.qz-drawer-header {
|
|
|
text-align: center;
|
|
|
- //background: #F7F7F7;
|
|
|
- //border-radius: 4px;
|
|
|
- //min-height: 120px;
|
|
|
- //margin: 20px 30px;
|
|
|
+ background: #F7F7F7;
|
|
|
+ border-radius: 4px;
|
|
|
+ min-height: 120px;
|
|
|
+ margin: 20px 30px;
|
|
|
overflow: hidden;
|
|
|
}
|
|
|
.qz-drawer-padding {
|
|
|
- //padding: 20px 0;
|
|
|
+ padding: 20px 0;
|
|
|
}
|
|
|
.qz-drawer-padding-s {
|
|
|
padding: 1px 0;
|