Files
ibs-fullstack/ruoyi-ui/src/views/gridSearch/accountManageReport/index.vue
2026-02-26 14:51:13 +08:00

287 lines
8.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<div :gutter="24" class="sum-box">
<el-card class="box-card">
<div class="my-span-checklist-title">
总资产余额
</div>
<div class="my-span-checklist-main">
<span>{{ cardInfo.custAumBal }}</span>
</div>
</el-card>
<el-card class="box-card">
<div class="my-span-checklist-title">
总资产余额较上月变动
</div>
<div class="my-span-checklist-main">
<span>{{ cardInfo.aumBalCompLm }}</span>
</div>
</el-card>
<el-card class="box-card">
<div class="my-span-checklist-title">
总资产余额月日均
</div>
<div class="my-span-checklist-main">
<span>{{ cardInfo.custAumMonthAvg }}</span>
</div>
</el-card>
<el-card class="box-card">
<div class="my-span-checklist-title">
2星级及以上客户数量
</div>
<div class="my-span-checklist-main">
<span>{{ cardInfo.custLevelCountSum }}</span>
<el-tooltip
placement="top"
trigger="hover"
v-if="cardInfo.custLevelCount"
>
<span class="quesiton"><i class="el-icon-question"></i></span>
<template #content>
<ul v-for="item in cardInfo.custLevelCount">
<li :key="item.key" class="quesitonli"><span>{{ item.key }}</span>{{ item.value }}</li>
</ul>
</template>
</el-tooltip>
</div>
</el-card>
<el-card class="box-card">
<div class="my-span-checklist-title">
2星级及以上客户数量较上月变动
</div>
<div class="my-span-checklist-main">
<span>{{ cardInfo.custLevelCompLmSum }}</span>
<el-tooltip
placement="top"
trigger="hover"
v-if="cardInfo.custLevelCompLm"
>
<span class="quesiton"><i class="el-icon-question"></i></span>
<template #content>
<ul v-for="item in cardInfo.custLevelCompLm">
<li :key="item.key" class="quesitonli"><span>{{ item.key }}</span>{{ item.value }}</li>
</ul>
</template>
</el-tooltip>
</div>
</el-card>
</div>
<el-card class="header-statics" style="display: none">
<ul class="statics-cnt">
<li>
<span>{{ topData['branchNum'] || 0 }}</span>
<span>星级较上月变动数</span>
</li>
<li>
<span>{{ topData['outletNum'] || 0 }}</span>
<span>2星客户数量</span>
</li>
<li>
<span>{{ topData['topGridNum'] || 0 }}</span>
<span>3星客户数量</span>
</li>
<li>
<span>{{ topData['secGridNum'] || 0 }}</span>
<span>4星客户数量</span>
</li>
<li>
<span>{{ topData['businessNum'] || 0 }}</span>
<span>5星客户数量</span>
</li>
<li>
<span>{{ topData['merchantNum'] || 0 }}</span>
<span>总资产月日均</span>
</li>
</ul>
</el-card>
<el-table v-loading="loading" :data="tableData">
<el-table-column prop="custName" label="客户名称" align="center" />
<el-table-column prop="custIdc" label="客户证件号" align="center" width="180px" />
<el-table-column prop="custIsn" label="客户内码" align="center" />
<el-table-column prop="custAge" label="年龄" align="center" />
<el-table-column prop="custSex" label="性别" align="center" />
<el-table-column prop="custPhone" label="联系电话" align="center" width="150px" />
<el-table-column prop="custAdress" label="联系地址" align="center" width="150px" />
<el-table-column prop="custAumBal" label="总资产余额" align="center" width="120px" />
<el-table-column prop="aumBalCompLm" label="总资产余额较上月变动" align="center" width="150px" />
<el-table-column prop="custAumMonthAvg" label="总资产余额月日均" align="center" width="150px" />
<el-table-column prop="custLevel" label="客户星级" align="center" />
<el-table-column prop="custLevelCompLm" label="星级较上月变动" align="center" width="150px" />
<el-table-column prop="branchId" label="支行号" align="center" width="120px" />
<el-table-column prop="branchName" label="支行名" align="center" width="180px" />
<el-table-column prop="outletId" label="网点号" align="center" width="120px" />
<el-table-column prop="outletName" label="网点名" align="center" width="180px" />
<el-table-column prop="managerName" label="责任人" align="center" width="150px">
<template #default="scope">
<span>{{ scope.row.managerName }} {{ scope.row.managerId }}</span>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getData" />
</div>
</template>
<script>
import { gridCmpmCustManagerList, gridCmpmCustManagerResult } from '@/api/gridSearch/accountManageReport/index'
export default {
data() {
return {
cardInfo: {
custAumBal: '',
aumBalCompLm: '',
custAumMonthAvg: '',
custLevelCount: '',
custLevelCountSum: '',
custLevelCompLm: '',
custLevelCompLmSum: ''
},
tableData: [],
loading: false,
queryParams: {
pageNum: 1,
pageSize: 10
},
total: 0,
topData: []
}
},
mounted() {
this.getData()
this.getSum()
},
methods: {
getData() {
this.loading = true;
gridCmpmCustManagerList(this.queryParams).then(res => {
this.tableData = res.rows
this.loading = false
this.total = res.total
})
},
getSum() {
gridCmpmCustManagerResult().then(res => {
this.cardInfo = {
custAumBal: res.custAumBal,
aumBalCompLm: res.aumBalCompLm,
custAumMonthAvg: res.custAumMonthAvg,
custLevelCount: this.toArr(res.custLevelCount),
custLevelCountSum: this.toSum(res.custLevelCount),
custLevelCompLm: this.toArr(res.custLevelCompLm),
custLevelCompLmSum: this.toSum(res.custLevelCompLm),
}
})
},
toArr(obj) {
let arr = []
Object.keys(obj).map(key => {
arr.push({
key,
value: obj[key]
})
})
return arr
},
toSum(obj) {
let sum = 0
Object.keys(obj).map(key => {
sum = sum + obj[key] * 1
})
return sum
}
}
}
</script>
<style lang="scss" scoped>
.sum-box {
display: flex;
flex-direction: row;
justify-content: space-between;
margin: 0 -10px;
}
.box-card {
flex: 1;
height: 100px;
border-radius: 8px;
margin: 20px 10px;
border: 3px solid #a8c2f5;
}
.my-span-checklist-title {
font-size: 14px;
color: #666;
letter-spacing: 0.5px;
margin-bottom: 10px;
}
.my-span-checklist-main {
line-height: 40px;
font-size: 30px;
color: #222;
font-weight: bold;
}
.quesiton {
font-size: 20px;
color: #2094ff;
margin-left: 6px;
}
.quesitonli {
font-size: 16px;
line-height: 24px;
}
.statics-cnt {
display: flex;
justify-content: space-between;
gap: 17px;
padding: 0;
margin: 0;
li {
list-style: none;
margin: 0;
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
background-color: #eaf5ff;
border-radius: 8px;
padding: 24px 0;
min-width: 100px;
span {
&:first-child {
font-size: 28px;
font-weight: 900;
line-height: 40px;
color: #222222;
}
&:last-child {
font-size: 17px;
font-weight: 400;
line-height: 24px;
color: #959da6;
}
}
}
}
.header-statics {
box-shadow: 0 3px 8px 0 #00000017;
border-radius: 16px;
background-color: #ffffff;
margin: 0 0 22px 0;
padding: 24px 30px;
overflow-x: hidden;
>p {
margin: 0 0 20px 0;
line-height: 25px;
font-weight: 600;
color: #222222;
font-size: 18px;
letter-spacing: 0.5px;
}
}
</style>