This commit is contained in:
2024-11-24 15:21:01 +08:00
commit 08b8825abd
160 changed files with 34913 additions and 0 deletions

View File

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