工作台相关业务

This commit is contained in:
liuxi 2024-12-06 18:05:17 +08:00
parent 894d5f4c56
commit edd54800ee
7 changed files with 914 additions and 544 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

View File

@ -28,13 +28,13 @@
clearable placeholder="请选择委案机构"
@keydown.enter.native="handleSearch"
class="width100">
<el-option
v-for="item in financialProductsTypeOptions"
:key="item.code"
:label="item.codeName"
:value="item.code">
</el-option>
</el-select>
<el-option
v-for="item in financialProductsTypeOptions"
:key="item.code"
:label="item.codeName"
:value="item.code">
</el-option>
</el-select>
</div>
</el-col>
<el-col :span="8">
@ -110,7 +110,7 @@
<el-table-column prop="pkgName" label="案件包名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="entrustingAgencyName" label="委案机构" show-overflow-tooltip ></el-table-column>
<el-table-column prop="channel" label="委案渠道" show-overflow-tooltip ></el-table-column>
<el-table-column prop="planStartTime" label="委案时间" show-overflow-tooltip >
<el-table-column prop="planStartTime" label="委案日期" show-overflow-tooltip >
<template slot-scope="scope">
<span >{{ scope.row.planStartTime | formaDate("yyyy-MM-dd") }}</span>
</template>

View File

@ -3,7 +3,7 @@
<LayoutHeader />
<div class="layout-bottom-wrap">
<!-- <SideMenu /> -->
<div class="layout-bottom-right-content p-16">
<div class="layout-bottom-right-content" :class="currentName == '/workbench' ? '':' p-16'">
<el-scrollbar :style="'height:'+`${contentHeight}`+'px'">
<router-view></router-view>
</el-scrollbar>
@ -23,6 +23,12 @@ export default {
let oh = document.documentElement.clientHeight;
return oh-85
} ,
currentPath() {
return this.$route.path; //
},
currentName() {
return this.$route.name; //
}
},
}
@ -43,6 +49,7 @@ export default {
width: calc(100% - 0px);
height: calc(100%);
background-color: #f6f4f4;
font-size: 14px;
}
.layout-content-wrap{
width: 100%;

View File

@ -0,0 +1,590 @@
<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>

View File

@ -1,192 +1,172 @@
<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>
<!-- <el-scrollbar :style="'height:'+`${contentHeight}`+'px'"> -->
<div class="layout-content-wrap flex-column">
<div class="work-hello">
<span>你好李德生</span>
</div>
<div class="flex-row justify-content-between work-main p-16">
<div class="border-radius-4 flex-column casework1">
<div class="flex-row justify-content-between case-title">
<span>案件进展情况</span>
<span>
<el-select v-model="queryParam.entrustingAgencyName"
clearable placeholder="请选择案件包"
@keydown.enter.native="handleSearch"
class="width100" size="mini">
<el-option
v-for="item in casePkOptions"
:key="item.code"
:label="item.codeName"
:value="item.code">
</el-option>
</el-select>
</span>
</div>
<div class="p-16 case-progress-cont">
<div class="case-progress">
<span class="case-pro1">
<p>案件总量</p>
<p><a>99</a></p>
</span>
<span class="case-pro2">
<p>案件待分</p>
<p><a>99</a></p>
</span>
<span class="case-pro3">
<p>未触达</p>
<p><a>99</a></p>
</span>
<span class="case-pro1">
<p>调解中</p>
<p><a>99</a></p>
</span>
<span class="case-pro2">
<p>调解成功</p>
<p><a>99</a></p>
</span>
<span class="case-pro3">
<p>已签署协议</p>
<p><a>99</a></p>
</span>
<span class="case-pro1">
<p>已司法确认</p>
<p><a>99</a></p>
</span>
<span class="case-pro2">
<p>已赋强公证</p>
<p><a>99</a></p>
</span>
</div>
</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 class="border-radius-4 flex-column casework2">
<div class="flex-row justify-content-between case-pk-title">
<span>待分配案件包</span>
<div class="flex-row">
<span>
<el-select v-model="queryParam.entrustingAgencyName"
clearable placeholder="请选择案件包"
@keydown.enter.native="handleSearch"
class="width100" size="mini">
<el-option
v-for="item in casePkOptions"
:key="item.code"
:label="item.codeName"
:value="item.code">
</el-option>
</el-select>
</span>
<span class="case-pk-btn ml-16" @click="handleImport"><i class="el-icon-upload2"></i>批量导入</span>
<span class="case-pk-btn"><i class="el-icon-plus"></i>添加案件</span>
</div>
</div>
<div class="case-pk-cont flex-column">
<div v-for="(item,index) in tableData" :key="index" class="case-pk-list">
<div class="flex-row justify-content-between mb-8">
<span class="f20 f-weight500">{{item.pkgName}}</span>
<span class="cursor-pointer" @click="jumpUrl(`/case-management?dataKey=casepack&pkgId=${item.id}`)">查看详情&nbsp;></span>
</div>
<div class="flex-row mb-16">
<span>{{item.entrustingAgencyName}}</span>
<span class="ml-16">委案日期{{item.planStartTime | formaDate('yyyy-MM-dd')}}</span>
</div>
<div class="flex-row justify-content-between case-pk-num mb-16">
<span>
<p><a>{{item.caseTotal}}</a></p>
案件总量
</span>
<span>
<p><a>{{item.assignTotal}}</a></p>
已分案件数
</span>
<span>
<p><a>{{item.caseTotal - item.assignTotal}}</a></p>
待分案件数
</span>
<span>
<p><a>{{item.months}}</a>个月</p>
委案期限
</span>
</div>
<div class="flex-row justify-content-end mb-8">
<el-button size="mini" type="primary" @click="handleCaseAllocation(item)">案件分配</el-button>
<el-button size="mini" @click="handleEdit(scope)">预设还款方案</el-button>
<el-button size="mini" @click="handleDelete(item)">删除</el-button>
</div>
</div>
</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 class="border-radius-4 flex-row justify-content-between casework3">
</div>
</div>
</div>
</el-scrollbar>
<!-- 编辑 -->
<editCaseDrawer v-if="editCaseDrawer" :editCaseDrawer.sync="editCaseDrawer"/>
<mediatorPerformanceDetail v-if="detailDrawer" :detailDrawer.sync="detailDrawer"/>
<!-- </el-scrollbar> -->
<!-- 导入 -->
<importPackageDialog v-if="importCaseDialog" :importCaseDialog.sync="importCaseDialog" />
<!-- 案件分配-->
<caseAllocationDialog v-if="caseAllocationDialog" :caseAllocationDialog.sync="caseAllocationDialog" />
</div>
</template>
<script>
import api from "@/services/caseManagement";
import workApi from "@/services/workbenchApi";
import pkapi from "@/services/casePackageManagement";
export default {
components: {
editCaseDrawer: () => import('../mediation-management/components/editCaseDrawer'),//
mediatorPerformanceDetail: () => import('../statistical-analysis/components/mediatorPerformanceDetail.vue'),
importPackageDialog: () => import('../case-package/components/importPackageDialog'),//
caseAllocationDialog: () => import('../case-package/components/caseAllocationDialog'),//
},
data() {
return {
casePkOptions:[],//
queryParam: {
pkgName:'',//
entrustingAgencyName: '',//
endTime: '',//
beginTime:'',//
willEnd:'',
current:1,
size:100,
},
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: [],
caseAllocationDialog:null,//
importCaseDialog:null,//
};
},
watch: {
radioRanking:{
handler() {
this.total_performance_chart()
}
},
radio1:{
handler() {
this.total_recycling_chart()
}
}
},
computed:{
// drawer
@ -196,370 +176,179 @@
}
},
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.getCaseInfoList(1)
},
mounted(){
this.getDict()
this.getCaseStatusEnum()
this.getMediateStatusEnum()
this.topStatistics()
this.recentStatistics()
this.total_recycling_chart()
this.total_performance_chart()
}
methods: {
jumpUrl (url) {
this.$router.push(url);
},
//
getCaseInfoList(val){
this.queryParam.planBegin = this.queryParam.beginTime
this.queryParam.planEnd = this.queryParam.endTime
this.queryParam.current = val
pkapi.getCasePkgQuery(this.queryParam).then(res => {
if (!res.code) {
this.tableData = res.records;
}
})
},
//
handleImport(){
this.importCaseDialog={
title:'批量导入案件',
}
},
//
handleCaseAllocation(row){
if((row.caseTotal - row.assignTotal) <= 0)
{
this.$message({
showClose: true,
message: '该案件包没有待分配的案件!',
type: 'warning'
});
return false
}
this.caseAllocationDialog={
title:'案件分配',
ObjectInfo:row
}
},
//
handleDelete(row){
this.$confirm("请确定是否删除此条数据?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
if(!this.$clickThrottle()) { return }//
pkapi.CasePkgdeleteById({id:row.id}).then((res) => {
this.$message.success("删除成功");
this.getCaseInfoList(1)
});
}).catch(() => {});
},
},
};
</script>
<style scoped lang="scss">
.work-hello{
background:url(../../assets/image/workbench/work-bg.png) no-repeat;
background-size: 100% 100%;
height: 96px;
padding: 25px 0 0 40px;
span{font-size:28px;color: #4E5969;}
}
.work-main{
background-color: #f6f4f4;
border-radius: 15px;
margin-top: -10px;
}
.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;
background:url(../../assets/image/workbench/work-left-bg.png) no-repeat;
background-size: 100% 100%;
// min-height:496px;
width: 400px;
padding: 20px;
.case-title{
height: 60px;
padding-top: 10px;
font-size: 18px;
color:#1D2129;
font-weight: 500;
}
.case-progress-cont{
background-color: #fff;
border-radius: 5px;
}
.case-progress{
background:url(../../assets/image/workbench/icon-bg.png) no-repeat;
background-size: 100% 100%;
height: 460px;
margin: auto;
color: #4E5969;
span{
padding: 15px 0 0px 15px;
width: 153px;
height: 105px;
display: inline-block;
margin-bottom: 13px;
line-height: 30px;
}
span:nth-child(even){
margin-left: 20px;
}
span p{padding: 0;margin: 0;}
span a{color: #1D2129;font-size: 22px;}
}
.case-pro1{width: 155px;height: 105px;}
}
.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;
background-color: #E1EDF4;
min-height:496px;
margin:4px 0 0 0;
width: calc(100% - 830px);
padding: 18px;
color: #4E5969;
.case-pk-title{
span:first-child{
font-size: 18px;
color:#1D2129;
font-weight: 500;
}
.case-pk-btn{
width: 90px;
font-size: 14px;
text-align: center;
line-height: 30px;
display: inline-block;
cursor: pointer;
}
}
.case-pk-cont{
.case-pk-list{
background-color: #fff;
padding: 16px;
border-radius: 8px;
margin-top: 20px;
.case-pk-num{
background-color: #F7F8FA;
height:85px ;
padding-top: 20px;
span{
width: 25%;
text-align: center;
border-right: solid 2px #e5e6e8;
height: 45px;
p{margin: 0;
a{
font-size: 22px;
}
}
}
span:last-child{border-right: 0;}
}
}
}
}
.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;
margin:4px 0 0 0;
min-height:496px;
width: 400px;
background-color: #E1EDF4;
}
.casework4{
background: linear-gradient(101.33deg, #0FBEAF 0.46%, #079D87 100%);
@ -570,21 +359,5 @@ position: relative;
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>