|
@@ -1,7 +1,7 @@
|
|
<template>
|
|
<template>
|
|
<el-container class="defect-container">
|
|
<el-container class="defect-container">
|
|
<el-header class="defect-main" style="height: auto;">
|
|
<el-header class="defect-main" style="height: auto;">
|
|
- <el-form :model="defectForm" class="demo-form-inline" :inline="true">
|
|
|
|
|
|
+ <el-form :model="chartForm" class="demo-form-inline" :inline="true">
|
|
<el-form-item label="时间:">
|
|
<el-form-item label="时间:">
|
|
<div class="date-select">
|
|
<div class="date-select">
|
|
<span :class="[dateType==='week'?'date-active':'']" class="date-item" @click.stop="dateType='week';setDate('week')">本周</span>
|
|
<span :class="[dateType==='week'?'date-active':'']" class="date-item" @click.stop="dateType='week';setDate('week')">本周</span>
|
|
@@ -23,10 +23,10 @@
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-form>
|
|
- <el-form :model="defectForm" class="demo-form-inline" :inline="true">
|
|
|
|
|
|
+ <el-form :model="chartForm" class="demo-form-inline" :inline="true">
|
|
<el-form-item label="责任团队:">
|
|
<el-form-item label="责任团队:">
|
|
<el-select
|
|
<el-select
|
|
- v-model="defectForm.team"
|
|
|
|
|
|
+ v-model="chartForm.team"
|
|
placeholder="请选择"
|
|
placeholder="请选择"
|
|
size="small"
|
|
size="small"
|
|
clearable
|
|
clearable
|
|
@@ -47,16 +47,20 @@
|
|
</el-option-group>
|
|
</el-option-group>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="模块:">
|
|
|
|
|
|
+ <el-form-item label="需求方向:">
|
|
<el-cascader
|
|
<el-cascader
|
|
- v-model="defectForm.moduleIds"
|
|
|
|
|
|
+ v-model="chartForm.rqmtOrntIds"
|
|
size="small"
|
|
size="small"
|
|
clearable
|
|
clearable
|
|
collapse-tags
|
|
collapse-tags
|
|
- :props="{ multiple: true }"
|
|
|
|
|
|
+ :props="{
|
|
|
|
+ value: 'id',
|
|
|
|
+ label: 'rqmtOrntName',
|
|
|
|
+ children: 'childRqmtOrnts',
|
|
|
|
+ multiple: true
|
|
|
|
+ }"
|
|
:options="moduleList"
|
|
:options="moduleList"
|
|
placeholder="请选择"
|
|
placeholder="请选择"
|
|
- @click.native="bugDataGet"
|
|
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-form-item>
|
|
@@ -97,11 +101,11 @@
|
|
<h3>状态累积流量图</h3>
|
|
<h3>状态累积流量图</h3>
|
|
<status-chart />
|
|
<status-chart />
|
|
</div>
|
|
</div>
|
|
- <el-tabs v-model="activeName" class="tab-change">
|
|
|
|
- <el-tab-pane name="first">
|
|
|
|
|
|
+ <el-tabs v-model="activeTab" class="tab-change">
|
|
|
|
+ <el-tab-pane name="1">
|
|
<span slot="label" class="tab-item">累计新增</span>
|
|
<span slot="label" class="tab-item">累计新增</span>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
- <el-tab-pane name="second">
|
|
|
|
|
|
+ <el-tab-pane name="2">
|
|
<span slot="label" class="tab-item">累计上线</span>
|
|
<span slot="label" class="tab-item">累计上线</span>
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
</el-tabs>
|
|
</el-tabs>
|
|
@@ -124,24 +128,38 @@
|
|
<span>仅统计状态已变更“已排期”且排期不为空的任务;横坐标表示任务交付日期,纵坐标代表研发交付周期(研发、联调、上线类型排期的总周期)</span>
|
|
<span>仅统计状态已变更“已排期”且排期不为空的任务;横坐标表示任务交付日期,纵坐标代表研发交付周期(研发、联调、上线类型排期的总周期)</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
+ <div class="chart-item">
|
|
|
|
+ <h3>需求分布图</h3>
|
|
|
|
+ <distribution-chart
|
|
|
|
+ :chart-data="distributeData"
|
|
|
|
+ :status-list="distributeStatusList"
|
|
|
|
+ :status.sync="distributeStatus"
|
|
|
|
+ @change="getDistributeData()"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
</el-main>
|
|
</el-main>
|
|
</el-container>
|
|
</el-container>
|
|
</template>
|
|
</template>
|
|
<script>
|
|
<script>
|
|
import moment from 'moment'
|
|
import moment from 'moment'
|
|
moment.locale('zh-cn')
|
|
moment.locale('zh-cn')
|
|
-import { settingQueryBizModuleList } from '@/api/defectManage'
|
|
|
|
|
|
+import { settingQueryBizRqmtOrntList } from '@/api/requirement'
|
|
import { teamQueryTeamInfoList } from '@/api/configure'
|
|
import { teamQueryTeamInfoList } from '@/api/configure'
|
|
import {
|
|
import {
|
|
getSummary,
|
|
getSummary,
|
|
getBugCountTrend,
|
|
getBugCountTrend,
|
|
getRepairTimeSumData
|
|
getRepairTimeSumData
|
|
} from '@/api/defectStatistics'
|
|
} from '@/api/defectStatistics'
|
|
|
|
+import {
|
|
|
|
+ getDistributeData,
|
|
|
|
+ getStatusStayData
|
|
|
|
+} from '@/api/statisticsApi/requireStatistics'
|
|
import statusChart from './components/statusChart'
|
|
import statusChart from './components/statusChart'
|
|
import tendencyChart from './components/tendencyChart'
|
|
import tendencyChart from './components/tendencyChart'
|
|
import cycleStatistic from './components/cycleStatistic'
|
|
import cycleStatistic from './components/cycleStatistic'
|
|
|
|
+import distributionChart from './components/distributionChart'
|
|
export default {
|
|
export default {
|
|
- components: { statusChart, tendencyChart, cycleStatistic },
|
|
|
|
|
|
+ components: { statusChart, tendencyChart, cycleStatistic, distributionChart },
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
bugCountTimeType: 1, // 获取趋缺陷势图数据接口入参:1本周 2本月 3本年
|
|
bugCountTimeType: 1, // 获取趋缺陷势图数据接口入参:1本周 2本月 3本年
|
|
@@ -151,26 +169,36 @@ export default {
|
|
{ code: 3, label: '年' }
|
|
{ code: 3, label: '年' }
|
|
],
|
|
],
|
|
teamOptions: [], // 团队列表
|
|
teamOptions: [], // 团队列表
|
|
- defectForm: {}, // 筛选表单
|
|
|
|
|
|
+ chartForm: {}, // 筛选表单
|
|
stratAndEnd: [], // 开始结束日期
|
|
stratAndEnd: [], // 开始结束日期
|
|
dateType: 'week', // 时间选择类型
|
|
dateType: 'week', // 时间选择类型
|
|
- moduleList: [], // 模块列表
|
|
|
|
|
|
+ moduleList: [], // 需求方向列表
|
|
Summary: [], // 顶部数据
|
|
Summary: [], // 顶部数据
|
|
- activeName: 'first', // tab标签
|
|
|
|
|
|
+ activeTab: '1', // tab标签
|
|
tendencyData: null, // 趋势图数据
|
|
tendencyData: null, // 趋势图数据
|
|
- cycleData: [] // 周期统计数据
|
|
|
|
|
|
+ cycleData: [], // 周期统计数据
|
|
|
|
+ distributeStatus: 1, // 需求分布图需求状态
|
|
|
|
+ distributeStatusList: [
|
|
|
|
+ { code: 1, label: '需求状态' },
|
|
|
|
+ { code: 2, label: '需求等级' },
|
|
|
|
+ { code: 3, label: '需求类型' },
|
|
|
|
+ { code: 4, label: 'pm' },
|
|
|
|
+ { code: 5, label: '跟版客户端' }
|
|
|
|
+ ], // 需求分布图需求状态列表
|
|
|
|
+ distributeData: null // 需求分布图数据
|
|
}
|
|
}
|
|
},
|
|
},
|
|
computed: {
|
|
computed: {
|
|
globalParams: { // 通用接口参数
|
|
globalParams: { // 通用接口参数
|
|
get() {
|
|
get() {
|
|
- const moduleIds = this.defectForm.moduleIds
|
|
|
|
|
|
+ const rqmtOrntIds = this.chartForm.rqmtOrntIds
|
|
|
|
+ const team = this.chartForm.team
|
|
const params = {
|
|
const params = {
|
|
startTime: this.stratAndEnd[0] || null,
|
|
startTime: this.stratAndEnd[0] || null,
|
|
endTime: this.stratAndEnd[1] || null,
|
|
endTime: this.stratAndEnd[1] || null,
|
|
bizId: Number(localStorage.getItem('bizId')),
|
|
bizId: Number(localStorage.getItem('bizId')),
|
|
- teamIds: this.defectForm.team || null,
|
|
|
|
- moduleIds: moduleIds && moduleIds.length > 0 ? moduleIds : null
|
|
|
|
|
|
+ teamIds: team && team.length > 0 ? team : null,
|
|
|
|
+ rqmtOrntIds: rqmtOrntIds && rqmtOrntIds.length > 0 ? rqmtOrntIds : null
|
|
}
|
|
}
|
|
return params
|
|
return params
|
|
}
|
|
}
|
|
@@ -180,6 +208,7 @@ export default {
|
|
this.$store.state.data.status = true
|
|
this.$store.state.data.status = true
|
|
this.setDate(this.dateType)
|
|
this.setDate(this.dateType)
|
|
this.getTeamList()
|
|
this.getTeamList()
|
|
|
|
+ this.getRequireDirection()
|
|
},
|
|
},
|
|
mounted() {
|
|
mounted() {
|
|
this.onSubmit()
|
|
this.onSubmit()
|
|
@@ -189,6 +218,7 @@ export default {
|
|
this.getSummary()
|
|
this.getSummary()
|
|
this.defectTrendTimeChange()
|
|
this.defectTrendTimeChange()
|
|
this.getCycleData()
|
|
this.getCycleData()
|
|
|
|
+ this.getDistributeData()
|
|
},
|
|
},
|
|
setDate(type) { // 日期筛选
|
|
setDate(type) { // 日期筛选
|
|
let startDate = null
|
|
let startDate = null
|
|
@@ -213,17 +243,17 @@ export default {
|
|
this.stratAndEnd = [startDate, endDate]
|
|
this.stratAndEnd = [startDate, endDate]
|
|
this.onSubmit()
|
|
this.onSubmit()
|
|
},
|
|
},
|
|
- async bugDataGet() { // 所属模块
|
|
|
|
- const res = await settingQueryBizModuleList(Number(localStorage.getItem('bizId')))
|
|
|
|
- this.moduleList = this.handlerModules(res.data)
|
|
|
|
|
|
+ async getRequireDirection() { // 需求方向列表
|
|
|
|
+ const res = await settingQueryBizRqmtOrntList(Number(localStorage.getItem('bizId')))
|
|
|
|
+ if (res.code === 200) {
|
|
|
|
+ this.moduleList = this.getRequireData(res.data)
|
|
|
|
+ }
|
|
},
|
|
},
|
|
- handlerModules(arr) { // 模块数据处理
|
|
|
|
- return arr.map(item => ({
|
|
|
|
- ...item,
|
|
|
|
- value: item.id,
|
|
|
|
- label: item.moduleName,
|
|
|
|
- children: item.childModules.length ? this.handlerModules(item.childModules) : null
|
|
|
|
- }))
|
|
|
|
|
|
+ getRequireData(data) {
|
|
|
|
+ for (let i = 0; i < data.length; i++) {
|
|
|
|
+ data[i].childRqmtOrnts.length < 1 ? delete data[i].childRqmtOrnts : this.getRequireData(data[i].childRqmtOrnts)
|
|
|
|
+ }
|
|
|
|
+ return data
|
|
},
|
|
},
|
|
async getTeamList() { // 获取我的团队和所有团队
|
|
async getTeamList() { // 获取我的团队和所有团队
|
|
const myRes = await teamQueryTeamInfoList({ type: 0 })// 我的团队
|
|
const myRes = await teamQueryTeamInfoList({ type: 0 })// 我的团队
|
|
@@ -238,13 +268,13 @@ export default {
|
|
if (res.code === 200) this.Summary = res.data || []
|
|
if (res.code === 200) this.Summary = res.data || []
|
|
},
|
|
},
|
|
async defectTrendTimeChange() { // 趋势图日期变动
|
|
async defectTrendTimeChange() { // 趋势图日期变动
|
|
- const moduleIds = this.defectForm.moduleIds
|
|
|
|
|
|
+ const rqmtOrntIds = this.chartForm.rqmtOrntIds
|
|
const params = {
|
|
const params = {
|
|
beginTime: this.stratAndEnd[0] || null,
|
|
beginTime: this.stratAndEnd[0] || null,
|
|
endTime: this.stratAndEnd[1] || null,
|
|
endTime: this.stratAndEnd[1] || null,
|
|
bizId: Number(localStorage.getItem('bizId')),
|
|
bizId: Number(localStorage.getItem('bizId')),
|
|
- teamIds: this.defectForm.team || null,
|
|
|
|
- moduleIds: moduleIds && moduleIds.length > 0 ? moduleIds : null,
|
|
|
|
|
|
+ teamIds: this.chartForm.team || null,
|
|
|
|
+ rqmtOrntIds: rqmtOrntIds && rqmtOrntIds.length > 0 ? rqmtOrntIds : null,
|
|
timeType: this.bugCountTimeType
|
|
timeType: this.bugCountTimeType
|
|
}
|
|
}
|
|
const res = await getBugCountTrend(params)
|
|
const res = await getBugCountTrend(params)
|
|
@@ -257,6 +287,20 @@ export default {
|
|
}
|
|
}
|
|
const res = await getRepairTimeSumData(params)
|
|
const res = await getRepairTimeSumData(params)
|
|
if (res.code === 200) this.cycleData = res.data
|
|
if (res.code === 200) this.cycleData = res.data
|
|
|
|
+ },
|
|
|
|
+ async getDistributeData() { // 获取需求统计
|
|
|
|
+ const params = {
|
|
|
|
+ ...this.globalParams,
|
|
|
|
+ type: Number(this.activeTab),
|
|
|
|
+ distributeType: this.distributeStatus
|
|
|
|
+ }
|
|
|
|
+ const res = await getDistributeData(params)
|
|
|
|
+ if (res.code === 200) {
|
|
|
|
+ this.distributeData = res.data
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ async getStatusStayData() { // 状态停留时长分布
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|