2024-12-06 18:05:17 +08:00

590 lines
26 KiB
Vue

<template>
<div>
<el-scrollbar :style="'height:'+`${contentHeight}`+'px'">
<div class="layout-content-wrap">
<div class="border-radius-4 flex-row justify-content-between">
<div class="width100 flex-row justify-content-between mr-16 border-radius-4 casework1">
<div class="flex-column f14 color-fff line-height-30 p-16">
<a>待调解案件/</a>
<a class="f32">{{statisticsObj.caseWait }}</a>
<a>金额 {{statisticsObj.caseWaitAmount}}</a>
</div>
<div class="flex-column f14 color-fff line-height-30 p-16 caseworkicon1"></div>
<img src="../../assets/image/workbench/Vector.png" width="30" height="30" alt="">
</div>
<div class="width100 flex-row justify-content-between mr-16 border-radius-4 casework2">
<div class="flex-column f14 color-fff line-height-30 p-16">
<a>暂存案件/</a>
<a class="f32">{{statisticsObj.caseStaging}}</a>
<a>金额 {{statisticsObj.caseStagingAmount}}</a>
</div>
<div class="flex-column f14 color-fff line-height-30 p-16 caseworkicon1"></div>
<img src="../../assets/image/workbench/Subtract.png" width="30" height="30" alt="">
</div>
<div class="width100 flex-row justify-content-between mr-16 border-radius-4 casework3">
<div class="flex-column f14 color-fff line-height-30 p-16">
<a>今日调解失败数/</a>
<a class="f32">{{statisticsObj.mediateFalse}}</a>
<a>金额 {{statisticsObj.mediateFalseAmount}}</a>
</div>
<div class="flex-column f14 color-fff line-height-30 p-16 caseworkicon1"></div>
<img src="../../assets/image/workbench/Subtract1.png" width="30" height="30" alt="">
</div>
<div class="width100 flex-row justify-content-between border-radius-4 casework4">
<div class="flex-column f14 color-fff line-height-30 p-16">
<a>今日调解成功数/</a>
<a class="f32">{{statisticsObj.mediateSuccess}}</a>
<a>金额 {{statisticsObj.mediateSuccessAmount}}</a>
</div>
<div class="flex-column f14 color-fff line-height-30 p-16 caseworkicon1"></div>
<img src="../../assets/image/workbench/Subtract2.png" width="30" height="30" alt="">
</div>
</div>
<div class="border-radius-4 flex-row justify-content-between mt-16 ">
<div class="width30 p-16 flex-column mr-16 border-radius-4 border-solid-lighter-1 listwork1 background-color-fff">
<div class="mt-8 mb-16 f22">快速入口</div>
<div class="flex-column f14 p-24 color-fff border-radius-8 line-height-40 fastcase1 cursor-pointer" @click="casejump()">
<a class="f24">案件列表</a>
<a>案件快速跟踪处理</a>
</div>
<div class="flex-column mt-16 f14 p-24 color-fff border-radius-8 line-height-40 fastcase2 cursor-pointer" @click="performanceDetail()">
<a class="f24">个人业绩入口</a>
<a>快速查看个人业绩信息</a>
</div>
</div>
<div class="width70 p-16 border-radius-4 border-solid-lighter-1 listwork2 background-color-fff">
<div class="mt-8 mb-16 f22">最近调解案件</div>
<div>
<el-table :data="tableData" >
<el-table-column
v-for="(item, i) in tableHead"
:key="i"
:prop="item.prop"
:label="item.label"
:show-overflow-tooltip="item.showOverflowTooltip"
:width="item.width"
:sortable="item.sortable"
:formatter="item.formatter"
></el-table-column>
<el-table-column label="操作" width="90">
<template slot-scope="scope">
<div class="flex-row align-items-center">
<div class="f14 color-1960F4 cursor-pointer mr-8" @click="handleDetail(scope)">查看详情</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
<div class="border-radius-4 flex-row justify-content-between mt-16 ">
<div class="width70 flex-column p-16 mr-16 border-radius-4 border-solid-lighter-1 seniority1 background-color-fff">
<div class="flex-row justify-content-between">
<a class="f22">调解案件数量统计</a>
<el-radio-group v-model="radio1" size="small">
<el-radio-button label="本年" ></el-radio-button>
<el-radio-button label="当月"></el-radio-button>
</el-radio-group>
</div>
<span id="total_recycling_chart" class="mt-24"></span>
</div>
<div class="width30 flex-column p-16 border-radius-4 border-solid-lighter-1 seniority2 background-color-fff">
<div class="flex-row justify-content-between">
<a class="f22">本月业绩排行 TOP10</a>
<el-radio-group v-model="radioRanking" size="small">
<el-radio-button label="总案件" ></el-radio-button>
<el-radio-button label="成功案件"></el-radio-button>
</el-radio-group>
</div>
<span id="total_performance_chart" class="mt-24"></span>
</div>
</div>
</div>
</el-scrollbar>
<!-- 编辑 -->
<editCaseDrawer v-if="editCaseDrawer" :editCaseDrawer.sync="editCaseDrawer"/>
<mediatorPerformanceDetail v-if="detailDrawer" :detailDrawer.sync="detailDrawer"/>
</div>
</template>
<script>
import api from "@/services/caseManagement";
import workApi from "@/services/workbenchApi";
export default {
components: {
editCaseDrawer: () => import('../mediation-management/components/editCaseDrawer'),//编辑
mediatorPerformanceDetail: () => import('../statistical-analysis/components/mediatorPerformanceDetail.vue'),
},
data() {
return {
identifier:this.$store.state.userinfo.identifier,
detailDrawer:null,
editCaseDrawer:null,//编辑
mediateStatusData:[],
caseStatusData:[],
financialProductsTypeOptions:[],
statisticsObj:{},
rankingList:[],
lineChartList:[],
radio1: '本年',
radioRanking: '总案件',
activeName: 'mediatorPerformance',
tableHead: [
{
prop: "caseName",
label: "案件名称",
showOverflowTooltip: true,
formatter: this.formatTable,
},
{
prop: "caseNo",
label: "案件编号",
showOverflowTooltip: true,
formatter:this.formatTable,
},
{
prop: "productTypeId",
label: "金融产品类型",
showOverflowTooltip: true,
formatter: this.formatProductType,
},
{
prop: "moneyAmount",
label: "案件金额",
showOverflowTooltip: true,
formatter: this.formatTable,
},
{
prop: "mediateTime",
label: "调解时间",
showOverflowTooltip: true,
formatter: this.formatTable,
},
{
prop: "caseStatus",
label: "调解状态",
showOverflowTooltip: true,
formatter: this.formatMediateStatusEnum,
},
{
prop: "resultStatus",
label: "案件状态",
showOverflowTooltip: true,
formatter: this.formatResultStatusEnum,
},
],
tableData: [],
};
},
watch: {
radioRanking:{
handler() {
this.total_performance_chart()
}
},
radio1:{
handler() {
this.total_recycling_chart()
}
}
},
computed:{
// 获取抽屉drawer的内容高度
contentHeight(){
let oh = document.documentElement.clientHeight;
return oh-66
}
},
methods: {
// 详情
handleDetail(scope){
this.editCaseDrawer={
title:'案件详情',
data:scope.row
}
},
// 获取金融产品类型
getDict(){
let data = {
type:'financial'
}
api.getDict(data).then(res => {
if (!res.code) {
this.financialProductsTypeOptions = res;
}
})
},
// 获取案件状态枚举-调解状态
getMediateStatusEnum(){
api.getMediateStatusEnum({}).then(res => {
if (!res.code) {
this.mediateStatusData = res;
}
})
},
// 获取调解中案件状态枚举
getCaseStatusEnum(){
api.getCaseStatusEnum({}).then(res => {
if (!res.code) {
this.caseStatusData = res;
}
})
},
// 案件状态
formatMediateStatusEnum(row, column, cellValue, index){
// console.log('row',row)
let className = `status-btn case-status${row.caseStatus}`
let obj = this.mediateStatusData.find((item) => {
return item.code == row.caseStatus
})
return row.caseStatus != null ? <div class={className}>{obj.desc}</div> : '-'
},
formatResultStatusEnum(row, column, cellValue, index){
// console.log('row',row)
let className = `status-btn result-status${row.resultStatus}`
let obj = this.caseStatusData.find((item) => {
return item.code == row.resultStatus
})
return row.resultStatus != null ? <div class={className}>{obj.desc}</div> : '-'
},
formatProductType(row, column, cellValue, index){
let obj = this.financialProductsTypeOptions.find((item) => {
return item.code == row.productTypeId
})
return row.productTypeId != null ? <div>{obj?obj.codeName:'-'}</div> : '-'
},
topStatistics(){
workApi.topStatistics({}).then(res => {
if (!res.code) {
this.statisticsObj = res;
}
})
},
recentStatistics(){
workApi.recentStatistics({}).then(res => {
if (!res.code) {
this.tableData = res;
}
})
},
async total_recycling_chart(){
let type = 1;
if(this.radio1 != '本年'){type=2}
workApi.lineChartStatistics({type:type}).then(res => {
if (!res.code) {
this.lineChartList=res
this.radiolineChartChanage()
}
})
},
radiolineChartChanage()
{
var option = {
title: {
text: '调解案件数量统计',
show: false
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
legend: {
data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
},
toolbox: {
show: false,
feature: {
saveAsImage: {}
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
boundaryGap: false,
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: 'Email',
type: 'line',
// stack: 'Total',
areaStyle: {},
emphasis: {
focus: 'series'
},
data: [120, 132, 101, 134, 90, 230, 210]
}
]
};
if(this.radio1 == '本年')
{
let legendData=[]
let seriesData=[]
this.lineChartList.forEach(item => {
if(item.key == 'monthList')
{
item.value.forEach(item => {
legendData.push(item.name)
seriesData.push({
name: item.name,
type: 'line',
stack: item.name,
areaStyle: {},
emphasis: {
focus: 'series'
},
data: item.line
})
})
}
});
option.legend.data = legendData
option.xAxis[0].data = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
option.series = seriesData
}
else
{
let legendData=[]
let seriesData=[]
let thisDayNum=this.$util.mGetDate();
this.lineChartList.forEach(item => {
if(item.key == 'dayList')
{
item.value.forEach(item => {
legendData.push(item.name)
seriesData.push({
name: item.name,
type: 'line',
stack: item.name,
areaStyle: {},
emphasis: {
focus: 'series'
},
data: item.line
})
})
}
});
let xAxisData=['1号', '2号', '3号', '4号', '5号', '6号', '7号', '8号', '9号', '10号', '11号', '12号'
, '13号', '14号', '15号', '16号', '17号', '18号', '19号', '20号', '21号', '22号', '23号', '24号', '25号', '26号'
, '27号', '28号']
if(thisDayNum > 28)
{
for(let i=29; i <= thisDayNum;i++)
{
xAxisData.push(i+'号')
}
}
option.legend.data = legendData
option.xAxis[0].data = xAxisData
option.series = seriesData
console.log(option,'seriesData')
}
var myChart = this.$echarts.init(document.getElementById('total_recycling_chart'));
myChart.setOption(option);
},
async total_performance_chart(){
let type = 1;
if(this.radioRanking != '总案件'){type=2}
workApi.rankingStatistics({type:type}).then(res => {
if (!res.code) {
this.rankingList=res
this.radioRankingChanage()
}
})
},
radioRankingChanage()
{
var option = {
title: {
text: '本月业绩排行',
show:false
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
formatter: '{b} : {c}(件)'
},
legend: {show:false},
grid: {
left: '3%',
right: '4%',
bottom: '1%',
top:'0%',
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01],
show:false
},
yAxis: {
type: 'category',
data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World']
},
series: [
{
// name: '2011',
color:'#12BCF1',
type: 'bar',
data: [18203, 23489, 29034, 104970, 131744, 630230]
}
]
};
if(this.radioRanking == '总案件')
{
let yAxisData=[]
let seriesData=[]
this.rankingList.forEach(item => {
if(item.key == 'allList')
{
let valnum=item.value.length-1;
item.value.forEach((item1,index) => {
yAxisData.push(item.value[valnum-index].userName)
seriesData.push(item.value[valnum-index].count)
})
}
});
option.yAxis.data = yAxisData
option.series[0].data = seriesData
}
else
{
let yAxisData=[]
let seriesData=[]
this.rankingList.forEach(item => {
if(item.key == 'successList')
{
let valnum=item.value.length-1;
item.value.forEach((item1,index) => {
yAxisData.push(item.value[valnum-index].userName)
seriesData.push(item.value[valnum-index].count)
})
}
});
option.yAxis.data = yAxisData
option.series[0].data = seriesData
}
var myChart = this.$echarts.init(document.getElementById('total_performance_chart'));
myChart.setOption(option);
},
performanceDetail()
{
if(this.identifier=='manager')
{
let jumpurl = '/statistical-analysis';
this.$store.commit('setRoutes',jumpurl)
this.$router.push(jumpurl)
}
else
{
let userData = this.$store.state.userinfo
this.detailDrawer = {title:'个人业绩',data:{row:{mediatorId:userData.id,mediatorName:userData.realName}}}
}
},
casejump(){
let jumpurl = ''
if(this.identifier=='manager')
{
jumpurl = '/case-management';
}
else
{
let resources = JSON.parse(sessionStorage.getItem('userInfo')).resources
this.menuTree = resources[0].children
if(JSON.stringify( this.menuTree).indexOf('mediation-management')>-1)
{
jumpurl = '/mediation-management';
}
}
if(jumpurl == '')
{
this.$message.warning('未赋予访问权限!')
}
else
{
this.$store.commit('setRoutes',jumpurl)
this.$router.push(jumpurl)
}
}
},
mounted(){
this.getDict()
this.getCaseStatusEnum()
this.getMediateStatusEnum()
this.topStatistics()
this.recentStatistics()
this.total_recycling_chart()
this.total_performance_chart()
}
};
</script>
<style scoped lang="scss">
.casework1{
background: linear-gradient(101.33deg, #12BCF1 0.46%, #099AEA 100%);
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.12), 0px 4px 4px rgba(0, 0, 0, 0.04);
height: 128px;
position: relative;
}
.casework2{
background: linear-gradient(101.33deg, #43A3FA 0.46%, #3B73F5 100%);
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.12), 0px 4px 4px rgba(0, 0, 0, 0.04);
position: relative;
}
.casework3{
background: linear-gradient(101.33deg, #9B7DFF 0.46%, #6B5AFA 100%);
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.12), 0px 4px 4px rgba(0, 0, 0, 0.04);
position: relative;
}
.casework4{
background: linear-gradient(101.33deg, #0FBEAF 0.46%, #079D87 100%);
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.12), 0px 4px 4px rgba(0, 0, 0, 0.04);
position: relative;
}
.caseworkicon1{background: linear-gradient(165.96deg, #FFFFFF 0%, rgba(255, 255, 255, 0) 100%);
opacity: 0.1;width: 80px;
}
.casework1 img,.casework2 img,.casework3 img,.casework4 img{position: absolute;right:25px;top:45px}
.listwork1{height: 381px;
.fastcase1
{
height: 138px;
background:url(../../assets/image/workbench/fast_case1.png) no-repeat,linear-gradient(102.52deg, #3CA0FA 0.5%, #2F6AF5 143.58%);
background-size: 100% 100%;
}
.fastcase2
{
height: 138px;
background:url(../../assets/image/workbench/fast_case2.png) no-repeat,linear-gradient(101.33deg, #12BCF1 0.46%, #099AEA 100%);
background-size: 100% 100%;
}
}
.seniority1{height: 427px;}
#total_recycling_chart{height: 420px;display: inline-block;width: 100%;}
#total_performance_chart{height: 335px;display: inline-block;width: 100%;}
</style>