Files
uni-qnc-tob/src/ui/CBankLoanApplication.vue
2024-11-24 15:21:01 +08:00

362 lines
9.5 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.

<script setup>
import QiunDataCharts from '@/components/qiun-data-charts/qiun-data-charts.vue'
const props = defineProps({
data: {
type: Object,
required: true,
},
})
const { data } = props
const tableData = ref([
])
const dateTableData = ref([
])
const options = ref([
{ label: '近7日', value: 0 },
{ label: '近1月', value: 1 },
{ label: '近3月', value: 2 },
{ label: '近6月', value: 3 },
{ label: '近1年', value: 4 },
])
const dateOptions = ref([
{ label: '近7日', value: 0 },
{ label: '近1月', value: 1 },
{ label: '近3月', value: 2 },
{ label: '近6月', value: 3 },
{ label: '近1年', value: 4 },
])
const selectedOption = ref(0)
const dateSelectedOption = ref(0)
const chartData = ref({})
const opts = ref({
color: ['#FAC858', '#EE6666', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'],
padding: [15, 15, 0, 5],
enableScroll: false,
legend: {},
xAxis: {
disableGrid: true,
},
yAxis: {
data: [
{
min: 0,
},
],
},
extra: {
column: {
type: 'group',
width: 15,
activeBgColor: '#000000',
activeBgOpacity: 0.08,
linearType: 'custom',
seriesGap: 5,
linearOpacity: 0.5,
barBorderCircle: true,
customColor: [
'#FA7D8D',
'#EB88E2',
],
},
},
},
)
onMounted(() => {
const seriesData = calculateTotalStats(data)
tableData.value = typeTotalStats(data)
dateTableData.value = dateTotalStats(data)
const res = {
categories: ['近7日', '近1月', '近3月', '近6月', '近1年'],
series: [
{
name: '申请次数',
data: seriesData.totalApplyCount,
},
{
name: '申请的机构数',
data: seriesData.totalOrgCount,
},
],
}
chartData.value = JSON.parse(JSON.stringify(res))
},
)
function calculateTotalStats(data) {
// 时间维度映射
const timeDimensions = {
d7: '近7日',
m1: '近1月',
m3: '近3月',
m6: '近6月',
m12: '近1年',
}
// 机构类型
const orgTypes = ['bank', 'nbank']
// 初始化结果数组
const result = {
totalApplyCount: [],
totalOrgCount: [],
}
// 遍历每个时间维度
for (const timeKey of Object.keys(timeDimensions)) {
let totalApplyCount = 0 // 每个时间维度的总申请次数
let totalOrgCount = 0 // 每个时间维度的总机构数
// 遍历每种机构类型并累加
orgTypes.forEach((orgType) => {
// 构造参数名
const applyCountKey = `als_${timeKey}_id_${orgType}_allnum`
const orgCountKey = `als_${timeKey}_id_${orgType}_orgnum`
// 检查 data 中是否存在此参数,如果不存在则跳过
if (data[applyCountKey] !== undefined && data[orgCountKey] !== undefined) {
// 累加数值(如果值为 undefined 或 null 则转换为 0
totalApplyCount += Number(data[applyCountKey] || 0)
totalOrgCount += Number(data[orgCountKey] || 0)
}
})
// 将每个时间维度的总申请次数和总机构数添加到结果数组中
result.totalApplyCount.push(totalApplyCount)
result.totalOrgCount.push(totalOrgCount)
}
return result
}
function typeTotalStats(data) {
// 时间维度映射
const timeDimensions = {
d7: '近7日',
m1: '近1月',
m3: '近3月',
m6: '近6月',
m12: '近1年',
}
// 定义机构类型和对应的映射表
const orgMappings = {
bank: '银行借贷',
mc: '小额贷款',
cf: '消费分期',
ca: '借款分期',
rel: '信用卡',
af: '汽车金融',
other: '其他',
}
const tableGroup = {
bank: [
{ code: 'bank', name: '银行机构' },
],
mc: [
{ code: 'nbank_mc', name: '小贷机构' },
// { code: 'nbank_nsloan', name: '持牌网络小贷' },
// { code: 'nbank_sloan', name: '持牌小贷机构' },
// { code: 'pdl', name: '线上小额现金贷' },
],
cf: [
{ code: 'nbank_cf', name: '消费类分期机构' },
// { code: 'coon', name: '线上消费分期' },
// { code: 'cooff', name: '线下消费分期' },
],
ca: [
{ code: 'nbank_ca', name: '现金类分期机构' },
// { code: 'caon', name: '线上现金分期' },
// { code: 'caoff', name: '线下现金分期' },
{ code: 'nbank_com', name: '代偿类分期机构' },
],
rel: [
{ code: 'rel', name: '信用卡(类信用卡)' },
],
af: [
{ code: 'af', name: '汽车金融' },
// { code: 'nbank_autofin', name: '持牌汽车金融机构' },
],
other: [
{ code: 'nbank_p2p', name: '改制机构' },
{ code: 'nbank_cons', name: '持牌消费金融机构' },
{ code: 'nbank_finlea', name: '持牌融资租赁机构' },
{ code: 'nbank_oth', name: '申请其他' },
{ code: 'nbank_else', name: '其他申请' },
// { code: 'oth', name: '申请其他' },
// { code: 'else', name: '其他申请' },
],
}
// 初始化结果数组
const result = []
// 遍历每个时间维度
for (const timeKey of Object.keys(timeDimensions)) {
const tableDataEntry = []
// 遍历每种机构类型并累加
Object.keys(orgMappings).forEach((groupOrgType) => {
const orgTypeArray = tableGroup[groupOrgType]
let totalApplyCount = 0
let totalOrgCount = 0
for (const i of orgTypeArray) {
const applyCountKey = `als_${timeKey}_id_${i.code}_allnum`
const orgCountKey = `als_${timeKey}_id_${i.code}_orgnum`
totalApplyCount = totalApplyCount + Number(data[applyCountKey] || 0)
totalOrgCount = totalOrgCount + Number(data[orgCountKey] || 0)
}
// 添加到 tableData
tableDataEntry.push({
label: orgMappings[groupOrgType],
name: groupOrgType,
totalApplyCount,
totalOrgCount,
})
})
result.push(tableDataEntry)
}
return result
}
function dateTotalStats(data) {
// 时间维度映射
const timeDimensions = {
d7: '近7日',
m1: '近1月',
m3: '近3月',
m6: '近6月',
m12: '近1年',
}
// 定义机构类型和对应的映射表
const orgMappings = {
week: '周末',
night: '夜间',
}
const tableGroup = {
week: [
{ code: 'bank_week', name: '周末银行' },
{ code: 'nbank_week', name: '周末非银' },
],
night: [
{ code: 'bank_night', name: '夜间银行' },
{ code: 'nbank_night', name: '夜间非银' },
],
}
// 初始化结果数组
const result = []
// 遍历每个时间维度
for (const timeKey of Object.keys(timeDimensions)) {
const tableDataEntry = []
// 遍历每种机构类型并累加
Object.keys(orgMappings).forEach((groupOrgType) => {
const orgTypeArray = tableGroup[groupOrgType]
let totalApplyCount = 0
let totalOrgCount = 0
for (const i of orgTypeArray) {
const applyCountKey = `als_${timeKey}_id_${i.code}_allnum`
const orgCountKey = `als_${timeKey}_id_${i.code}_orgnum`
totalApplyCount = totalApplyCount + Number(data[applyCountKey] || 0)
totalOrgCount = totalOrgCount + Number(data[orgCountKey] || 0)
}
// 添加到 tableData
tableDataEntry.push({
label: orgMappings[groupOrgType],
name: groupOrgType,
totalApplyCount,
totalOrgCount,
})
})
result.push(tableDataEntry)
}
console.log('date result', result)
return result
}
</script>
<template>
<div class="card">
<div class="flex flex-col gap-y-4">
<!-- 申请次数 -->
<LTitle title="申请次数" type="blue-green" />
<QiunDataCharts
type="column"
:opts="opts"
:chart-data="chartData"
/>
<!-- 银行类别申请记录 -->
<LTitle title="申请类别" type="blue-green" />
<LButtonGroup v-model="selectedOption" :options="options" />
<LTable :data="tableData[selectedOption]" type="blue-green">
<template #header>
<th class="border px-4 py-2">
借贷类别
</th>
<th class="border px-4 py-2">
申请次数
</th>
<th class="border px-4 py-2">
申请的机构数
</th>
</template>
<template #default="{ row }">
<td class="border px-4 py-2">
{{ row.label }}
</td>
<td class="border px-4 py-2">
{{ row.totalApplyCount }}
</td>
<td class="border px-4 py-2">
{{ row.totalOrgCount }}
</td>
</template>
</LTable>
<!-- 特殊时段申请记录 -->
<LTitle title="特殊时段申请记录" type="blue-green" />
<LButtonGroup v-model="dateSelectedOption" :options="dateOptions" />
<LTable :data="dateTableData[dateSelectedOption]" type="blue-green">
<!-- 表头 -->
<template #header>
<th class="border px-4 py-2">
时段
</th>
<th class="border px-4 py-2">
申请次数
</th>
<th class="border px-4 py-2">
申请的机构数
</th>
</template>
<!-- 渲染表格内容 -->
<template #default="{ row }">
<td class="border px-4 py-2">
{{ row.label }}
</td>
<td class="border px-4 py-2">
{{ row.totalApplyCount }}
</td>
<td class="border px-4 py-2">
{{ row.totalOrgCount }}
</td>
</template>
</LTable>
</div>
</div>
</template>
<style lang="scss" scoped>
</style>