149 lines
4.3 KiB
Vue
149 lines
4.3 KiB
Vue
|
|
<template>
|
|||
|
|
<div class="gamma-card risk-assessment">
|
|||
|
|
<div class="gamma-grid-2" style="grid-template-columns: 1fr 2fr; gap: 24px;">
|
|||
|
|
<div class="risk-card">
|
|||
|
|
<div class="gamma-title"><span>🛡️</span> 风险评估</div>
|
|||
|
|
<div class="risk-desc">
|
|||
|
|
说明:<br>
|
|||
|
|
<span v-for="item in RISK_LEVEL_DESC" :key="item.level">
|
|||
|
|
{{ item.level }}({{ item.label }}): {{ item.desc }}<br>
|
|||
|
|
</span>
|
|||
|
|
</div>
|
|||
|
|
<div class="risk-level-circle">
|
|||
|
|
<div class="circle" :style="{ borderTopColor: levelColor }">
|
|||
|
|
<div class="circle-text">{{ riskLevel }}</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="risk-level-text">风险等级</div>
|
|||
|
|
<div class="risk-stars">{{ riskStars }}</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="risk-card index-group">
|
|||
|
|
<div class="index-item">
|
|||
|
|
<div class="index-title">信用风险指数</div>
|
|||
|
|
<div class="index-circle">
|
|||
|
|
<div class="index-status">{{ riskScoreDisplay }}</div>
|
|||
|
|
<div class="gamma-small">{{ riskScoreUnit }}</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="index-desc">信用风险评分,0-1000分,分数越高用户信用越高</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="index-item">
|
|||
|
|
<div class="index-title">履约金额综合指数</div>
|
|||
|
|
<div class="index-circle">
|
|||
|
|
<div class="index-status">{{ amountIndexDisplay.value }}</div>
|
|||
|
|
<div class="gamma-small">{{ amountIndexDisplay.unit }}</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="index-desc">履约金额综合指数,0-1000分,指数越大用户逾期可能性越低</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="index-item">
|
|||
|
|
<div class="index-title">履约笔数综合指数</div>
|
|||
|
|
<div class="index-circle">
|
|||
|
|
<div class="index-status">{{ countIndexDisplay.value }}</div>
|
|||
|
|
<div class="gamma-small">{{ countIndexDisplay.unit }}</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="index-desc">履约笔数综合指数,0-1000分,指数越大用户逾期可能性越低</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup>
|
|||
|
|
import { computed } from 'vue';
|
|||
|
|
import { RISK_LEVEL_DESC, riskLevelColor, formatComplianceIndex, riskLevelStars } from '../reportHelper';
|
|||
|
|
|
|||
|
|
const props = defineProps({
|
|||
|
|
riskLevel: { type: String, default: '—' },
|
|||
|
|
riskScore: { type: [String, Number], default: '—' },
|
|||
|
|
amountIndex: { type: [String, Number], default: '' },
|
|||
|
|
countIndex: { type: [String, Number], default: '' },
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const levelColor = computed(() => riskLevelColor(props.riskLevel));
|
|||
|
|
const riskStars = computed(() => riskLevelStars(props.riskLevel));
|
|||
|
|
|
|||
|
|
const riskScoreDisplay = computed(() => {
|
|||
|
|
if (props.riskScore === null || props.riskScore === undefined || props.riskScore === '') {
|
|||
|
|
return '未命中';
|
|||
|
|
}
|
|||
|
|
return String(props.riskScore);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const riskScoreUnit = computed(() => (riskScoreDisplay.value === '未命中' ? '未命中' : '分'));
|
|||
|
|
|
|||
|
|
const amountIndexDisplay = computed(() => formatComplianceIndex(props.amountIndex));
|
|||
|
|
const countIndexDisplay = computed(() => formatComplianceIndex(props.countIndex));
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.risk-assessment .risk-card {
|
|||
|
|
background: #fff;
|
|||
|
|
border-radius: 8px;
|
|||
|
|
padding: 20px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.risk-desc {
|
|||
|
|
font-size: 13px;
|
|||
|
|
color: #555;
|
|||
|
|
line-height: 1.6;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.risk-level-circle {
|
|||
|
|
display: flex;
|
|||
|
|
flex-direction: column;
|
|||
|
|
align-items: center;
|
|||
|
|
margin-top: 16px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.circle {
|
|||
|
|
width: 120px;
|
|||
|
|
height: 120px;
|
|||
|
|
border-radius: 50%;
|
|||
|
|
border: 4px solid #eee;
|
|||
|
|
border-top-color: #ff3333;
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.circle-text {
|
|||
|
|
font-size: 48px;
|
|||
|
|
font-weight: bold;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.risk-level-text {
|
|||
|
|
font-size: 14px;
|
|||
|
|
color: #666;
|
|||
|
|
margin-top: 8px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.risk-stars {
|
|||
|
|
margin-top: 4px;
|
|||
|
|
letter-spacing: 2px;
|
|||
|
|
color: #d4af37;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.index-group {
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: space-around;
|
|||
|
|
align-items: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.index-item { text-align: center; }
|
|||
|
|
|
|||
|
|
.index-circle {
|
|||
|
|
width: 100px;
|
|||
|
|
height: 100px;
|
|||
|
|
border-radius: 50%;
|
|||
|
|
border: 3px solid #eee;
|
|||
|
|
display: flex;
|
|||
|
|
flex-direction: column;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
margin: 0 auto 8px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.index-title { font-size: 14px; margin-bottom: 4px; }
|
|||
|
|
.index-status { font-size: 18px; font-weight: 600; }
|
|||
|
|
.index-desc { font-size: 12px; color: #666; margin-top: 4px; line-height: 1.4; max-width: 180px; }
|
|||
|
|
</style>
|