正式版

This commit is contained in:
2025-10-30 13:34:28 +08:00
parent 4ddb31e663
commit 75590a0062
165 changed files with 1219 additions and 570 deletions

View File

@@ -4,7 +4,7 @@
<div class="flex items-center justify-between mb-3 border border-[#DDDDDD] rounded-lg p-4 bg-[#F9F9F9]">
<div class="flex items-center">
<div class="w-10 h-10 flex items-center justify-center mr-2">
<img src="@/assets/images/report/jd.png" alt="租赁风险评估概览" class="w-10 h-10 object-contain" />
<img src="@/assets/images/report/zlfxpggl.png" alt="租赁风险评估概览" class="w-10 h-10 object-contain" />
</div>
<span class="font-bold text-gray-800">租赁风险评估概览</span>
</div>

View File

@@ -3,8 +3,8 @@
<div class="p-2 relative">
<div class="flex items-center justify-between mb-3 border border-[#DDDDDD] rounded-lg p-4 bg-[#F9F9F9]">
<div class="flex items-center ">
<div class="w-10 h-10 flex items-center justify-center mr-2">
<img src="@/assets/images/report/jd.png" alt="借贷评估概览" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/jdpggl.png" alt="借贷评估概览" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">借贷评估概览</span>
</div>
@@ -17,8 +17,8 @@
<div v-if="loanEvaluationVerificationDetail.organLoanPerformances"
class="border border-[#DDDDDD] mb-4 rounded-lg">
<div class="flex items-center p-4">
<div class="w-10 h-10 flex items-center justify-center mr-2">
<img src="@/assets/images/report/jd2.png" alt="借贷评估概览" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/yzgz.png" alt="借贷评估概览" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">机构借贷表现</span>
</div>
@@ -60,8 +60,8 @@
<div v-if="loanEvaluationVerificationDetail.customerLoanPerformances"
class="border border-[#DDDDDD] mb-4 rounded-lg">
<div class="flex items-center p-4">
<div class="w-10 h-10 flex items-center justify-center mr-2">
<img src="@/assets/images/report/jd2.png" alt="客户类型借贷表现" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/khlxjdbx.png" alt="客户类型借贷表现" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">客户类型借贷表现</span>
</div>
@@ -123,8 +123,8 @@
<div v-if="loanEvaluationVerificationDetail.businessLoanPerformances"
class="border border-[#DDDDDD] mb-4 rounded-lg">
<div class="flex items-center p-4">
<div class="w-10 h-10 flex items-center justify-center mr-2">
<img src="@/assets/images/report/ywlx.png" alt="业务类型借贷表现" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/ywlxjdbx.png" alt="业务类型借贷表现" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">业务类型借贷表现</span>
</div>
@@ -186,8 +186,8 @@
<!-- 异常时间段借贷表现 -->
<div v-if="loanEvaluationVerificationDetail.timeLoanPerformances" class="border border-[#DDDDDD] mb-4 rounded-lg">
<div class="flex items-center p-4">
<div class="w-10 h-10 flex items-center justify-center mr-2">
<img src="@/assets/images/report/yj.png" alt="异常时间段借贷表现" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/ycsjdjdbx.png" alt="异常时间段借贷表现" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">异常时间段借贷表现</span>
</div>

View File

@@ -4,18 +4,12 @@
<!-- 案件概览 -->
<div class="court-overview mb-4">
<div class="bg-white rounded-lg border border-gray-200 p-4">
<div class="flex items-center justify-between mb-3">
<div class="flex items-center">
<div class="w-8 h-8 bg-purple-500 rounded-full flex items-center justify-center mr-2">
<svg class="w-4 h-4 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3">
</path>
</svg>
</div>
<span class="font-bold text-gray-800">案件概览</span>
<div class="bg-white rounded-xl border border-[#DDDDDD] p-4">
<div class="flex items-center mb-3">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/ajgl.png" alt="案件概览" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">案件概览</span>
</div>
<!-- 案件类型统计 -->
@@ -57,16 +51,13 @@
<div class="space-y-4">
<!-- 涉案公告 -->
<div v-if="multCourtInfo.legalCases && multCourtInfo.legalCases.length > 0" class="case-section">
<div class="bg-white rounded-lg border border-gray-200 p-4">
<div class="bg-white rounded-xl border border-[#DDDDDD] p-4">
<div class="flex items-center mb-3">
<div class="w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center mr-2">
<svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/sagg.png" alt="涉案公告" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">涉案公告</span>
<span class="ml-2 px-2 py-1 bg-blue-100 text-blue-700 rounded-full text-xs font-medium">
<span class="ml-2 px-2 py-1 bg-[#2B79EE1A] text-[#2B79EE] rounded-full text-xs font-medium">
{{ multCourtInfo.legalCases.length }}
</span>
</div>
@@ -125,16 +116,13 @@
<!-- 执行案件 -->
<div v-if="multCourtInfo.executionCases && multCourtInfo.executionCases.length > 0" class="case-section">
<div class="bg-white rounded-lg border border-gray-200 p-4">
<div class="bg-white rounded-xl border border-[#DDDDDD] p-4">
<div class="flex items-center mb-3">
<div class="w-6 h-6 bg-red-500 rounded-full flex items-center justify-center mr-2">
<svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/zxaj.png" alt="执行案件" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">执行案件</span>
<span class="ml-2 px-2 py-1 bg-red-100 text-red-700 rounded-full text-xs font-medium">
<span class="ml-2 px-2 py-1 bg-[#F9ECEC] text-[#EB3C3C] rounded-full text-xs font-medium">
{{ multCourtInfo.executionCases.length }}
</span>
</div>
@@ -174,7 +162,7 @@
</div>
<div class="detail-item">
<span class="label">执行金额</span>
<span class="value text-red-600 font-bold">{{ caseItem.executionAmount }}</span>
<span class="value text-[#EB3C3C] font-bold">{{ caseItem.executionAmount }}</span>
</div>
<div class="detail-item">
<span class="label">已还款金额</span>
@@ -201,17 +189,13 @@
<!-- 失信案件 -->
<div v-if="multCourtInfo.disinCases && multCourtInfo.disinCases.length > 0" class="case-section">
<div class="bg-white rounded-lg border border-gray-200 p-4">
<div class="bg-white rounded-xl border border-[#DDDDDD] p-4">
<div class="flex items-center mb-3">
<div class="w-6 h-6 bg-orange-500 rounded-full flex items-center justify-center mr-2">
<svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z">
</path>
</svg>
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/sxaj.png" alt="失信案件" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">失信案件</span>
<span class="ml-2 px-2 py-1 bg-orange-100 text-orange-700 rounded-full text-xs font-medium">
<span class="ml-2 px-2 py-1 bg-[#FFF8E1] text-[#D6943E] rounded-full text-xs font-medium">
{{ multCourtInfo.disinCases.length }}
</span>
</div>
@@ -251,7 +235,7 @@
</div>
<div class="detail-item">
<span class="label">执行金额</span>
<span class="value text-red-600 font-bold">{{ caseItem.executionAmount }}</span>
<span class="value text-[#EB3C3C] font-bold">{{ caseItem.executionAmount }}</span>
</div>
<div class="detail-item">
<span class="label">已还款金额</span>
@@ -278,17 +262,13 @@
<!-- 限高案件 -->
<div v-if="multCourtInfo.limitCases && multCourtInfo.limitCases.length > 0" class="case-section">
<div class="bg-white rounded-lg border border-gray-200 p-4">
<div class="bg-white rounded-xl border border-[#DDDDDD] p-4">
<div class="flex items-center mb-3">
<div class="w-6 h-6 bg-purple-500 rounded-full flex items-center justify-center mr-2">
<svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728L5.636 5.636m12.728 12.728L18.364 5.636M5.636 18.364l12.728-12.728">
</path>
</svg>
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/xgaj.png" alt="限高案件" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">限高案件</span>
<span class="ml-2 px-2 py-1 bg-purple-100 text-purple-700 rounded-full text-xs font-medium">
<span class="ml-2 px-2 py-1 bg-[#2B79EE1A] text-[#2B79EE] rounded-full text-xs font-medium">
{{ multCourtInfo.limitCases.length }}
</span>
</div>
@@ -328,7 +308,7 @@
</div>
<div class="detail-item">
<span class="label">执行金额</span>
<span class="value text-red-600 font-bold">{{ caseItem.executionAmount }}</span>
<span class="value text-[#EB3C3C] font-bold">{{ caseItem.executionAmount }}</span>
</div>
<div class="detail-item">
<span class="label">已还款金额</span>
@@ -355,9 +335,10 @@
</div>
</div>
</div>
<!-- 温馨提示 -->
<LRemark content="法院曝光台信息展示申请人的各类案件信息,包括涉案公告、执行案件、失信案件和限高案件。数据来源于全国法院执行信息公开网等权威司法数据库。案件状态包括审理中、执行中、已结案等,执行金额和已还款金额直接反映债务履行情况。失信和限高记录对个人信用影响较大,建议重点关注。数据更新频率依赖于司法系统,可能存在延迟。" />
<LRemark
content="法院曝光台信息展示申请人的各类案件信息,包括涉案公告、执行案件、失信案件和限高案件。数据来源于全国法院执行信息公开网等权威司法数据库。案件状态包括审理中、执行中、已结案等,执行金额和已还款金额直接反映债务履行情况。失信和限高记录对个人信用影响较大,建议重点关注。数据更新频率依赖于司法系统,可能存在延迟。" />
</template>
<script setup>
@@ -420,16 +401,16 @@ const getCaseCount = (cases) => {
// 获取案件标识样式
const getCaseFlagClass = (flag) => {
if (flag === 1) return 'bg-red-50 border border-red-200'
if (flag === 2) return 'bg-green-50 border border-green-200'
if (flag === 1) return 'bg-[#F9ECEC] border border-[#F0CACA]'
if (flag === 2) return 'bg-[#ECF9EF] border border-[#CAECD3]'
return 'bg-gray-50 border border-gray-200'
}
// 获取案件标识文本样式
const getCaseFlagTextClass = (flag) => {
if (flag === 1) return 'text-red-600'
if (flag === 1) return 'text-[#EB3C3C]'
if (flag === 2) return 'text-green-600'
return 'text-gray-600'
return 'text-[#666666]'
}
// 获取案件标识文本
@@ -449,12 +430,12 @@ const getCaseItemClass = (caseItem) => {
// 获取案件状态样式
const getCaseStatusClass = (status) => {
if (status === '已结案') return 'text-green-600 bg-green-100'
if (status === '执行中') return 'text-orange-600 bg-orange-100'
if (status === '未执行') return 'text-red-600 bg-red-100'
if (status === '审理中') return 'text-blue-600 bg-blue-100'
if (status === '失信中') return 'text-red-600 bg-red-100'
if (status === '限高中') return 'text-purple-600 bg-purple-100'
return 'text-gray-600 bg-gray-100'
if (status === '执行中') return 'text-[#D6943E] bg-[#FFF8E1]'
if (status === '未执行') return 'text-[#EB3C3C] bg-[#F9ECEC]'
if (status === '审理中') return 'text-[#2B79EE] bg-[#EBF5FF]'
if (status === '失信中') return 'text-[#EB3C3C] bg-[#F9ECEC]'
if (status === '限高中') return 'text-[#2B79EE] bg-[#EBF5FF]'
return 'text-[#666666] bg-gray-100'
}
</script>
@@ -467,7 +448,7 @@ const getCaseStatusClass = (status) => {
.case-number {
font-weight: 600;
color: #374151;
color: #333333;
font-size: 14px;
}
@@ -489,13 +470,13 @@ const getCaseStatusClass = (status) => {
padding: 4px 0;
.label {
color: #6b7280;
color: #666666;
font-size: 13px;
font-weight: 500;
}
.value {
color: #374151;
color: #333333;
font-size: 13px;
font-weight: 400;
text-align: right;
@@ -511,18 +492,15 @@ const getCaseStatusClass = (status) => {
border-radius: 8px;
overflow: hidden;
&.case-item-settled {
border: 1px solid #d1fae5;
background-color: #f0fdf4;
}
&.case-item-settled {}
&.case-item-executing {
border: 1px solid #fed7aa;
background-color: #fff7ed;
border: 1px solid #FFE082;
background-color: #FFF8E1;
}
&.case-item-default {
border: 1px solid #e5e7eb;
border: 1px solid #DDDDDD;
background-color: #f9fafb;
}
}

View File

@@ -255,7 +255,7 @@
<div class="bg-white rounded-lg border border-[#EB3C3C33] p-4">
<div class="flex items-center mb-3">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/yqfx.png" alt="风险标识" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/fxbs.png" alt="风险标识" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">风险标识</span>
</div>

View File

@@ -5,7 +5,7 @@
<div class="flex items-center justify-between mb-3 p-4 ">
<div class="flex items-center">
<div class="w-10 h-10 flex items-center justify-center mr-2">
<img src="@/assets/images/report/gl.png" alt="关联风险监督" class="w-10 h-10 object-contain" />
<img src="@/assets/images/report/glfxjd.png" alt="关联风险监督" class="w-10 h-10 object-contain" />
</div>
<div>
<div class="font-bold text-lg text-[#333333]">关联风险监督</div>

View File

@@ -58,7 +58,7 @@
{{ getElementVerificationRisks().length }}条风险
</span>
</div>
</div>
</div>w'w'w'w'w'w'w'w'w'w
<div class="risk-list">
<div v-for="risk in getElementVerificationRisks()" :key="risk.key" class="risk-item">
<div class="flex items-center justify-between">

View File

@@ -20,7 +20,7 @@
<div class="grid grid-cols-3 gap-4">
<div class="text-center">
<div class="text-sm text-[#666666] mb-1">总风险点</div>
<div class="text-lg font-bold text-[#E53935]">{{ riskWarning.totalRiskCounts || 0 }}</div>
<div class="text-lg font-bold text-[#E53935]">{{ riskWarning.value?.totalRiskCounts || 0 }}</div>
</div>
<div class="text-center">
@@ -44,7 +44,7 @@
<!-- 要素核查 -->
<div class="risk-module-card relative" :class="getModuleCardClass('element')">
<div v-if="getElementVerificationRisks().length > 0"
class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
:class="['absolute top-0 right-0 px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl', getRiskBadgeBgColor(getModuleHighestRiskLevel('element'))]">
{{ getElementVerificationRisks().length }}条风险
</div>
<div class="flex items-center mb-3">
@@ -59,17 +59,21 @@
<div v-if="getElementVerificationRisks().length > 0"
class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4 relative">
<div class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
高风险
<div
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-xs text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeColor(getElementVerificationRisks()[0])]">
{{ getElementVerificationRisks()[0]?.level || '高风险' }}
</div>
<div class="flex items-center">
<div class="w-10 h-10 mr-4">
<img src="@/assets/images/report/fqzpf.png" alt="高风险" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 mr-3 flex-shrink-0">
<img :src="getRiskIcon(getElementVerificationRisks()[0])"
:alt="getElementVerificationRisks()[0]?.level || '高风险'" class="w-8 h-8 object-contain" />
</div>
<div class="flex-1">
<div class="font-bold text-[#333333]">{{ getElementVerificationRisks()[0]?.description || '检测到风险' }}
<div class="flex-1 pr-12">
<div class="font-bold text-[#333333] text-sm">{{ getElementVerificationRisks()[0]?.description ||
'检测到风险' }}
</div>
<div class="text-xs text-[#999999] mt-0.5">{{ getElementVerificationRisks()[0]?.detail || '该模块检测到风险' }}
</div>
<div class="text-sm text-[#999999]">{{ getElementVerificationRisks()[0]?.detail || '该模块检测到风险' }}</div>
</div>
</div>
</div>
@@ -90,7 +94,7 @@
<!-- 运营商核验 -->
<div class="risk-module-card relative" :class="getModuleCardClass('operator')">
<div v-if="getOperatorVerificationRisks().length > 0"
class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
:class="['absolute top-0 right-0 px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl', getRiskBadgeBgColor(getModuleHighestRiskLevel('operator'))]">
{{ getOperatorVerificationRisks().length }}条风险
</div>
<div class="flex items-center mb-3">
@@ -105,17 +109,21 @@
<div v-if="getOperatorVerificationRisks().length > 0"
class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4 relative">
<div class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
高风险
<div
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-xs text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeColor(getOperatorVerificationRisks()[0])]">
{{ getOperatorVerificationRisks()[0]?.level || '高风险' }}
</div>
<div class="flex items-center">
<div class="w-10 h-10 mr-4">
<img src="@/assets/images/report/zfx.png" alt="高风险" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 mr-3 flex-shrink-0">
<img :src="getRiskIcon(getOperatorVerificationRisks()[0])"
:alt="getOperatorVerificationRisks()[0]?.level || '高风险'" class="w-8 h-8 object-contain" />
</div>
<div class="flex-1">
<div class="font-bold text-[#333333]">{{ getOperatorVerificationRisks()[0]?.description || '手机在网状态为风险号'
<div class="flex-1 pr-12">
<div class="font-bold text-[#333333] text-sm">{{ getOperatorVerificationRisks()[0]?.description ||
'手机在网状态为风险号'
}}</div>
<div class="text-sm text-[#999999]">{{ getOperatorVerificationRisks()[0]?.detail || '手机号状态异常,存在风险' }}
<div class="text-xs text-[#999999] mt-0.5">{{ getOperatorVerificationRisks()[0]?.detail ||
'手机号状态异常,存在风险' }}
</div>
</div>
</div>
@@ -137,7 +145,7 @@
<!-- 公安重点人员核验 -->
<div class="risk-module-card relative" :class="getModuleCardClass('police')">
<div v-if="getPoliceVerificationRisks().length > 0"
class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
:class="['absolute top-0 right-0 px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl', getRiskBadgeBgColor(getModuleHighestRiskLevel('police'))]">
{{ getPoliceVerificationRisks().length }}条风险
</div>
<div class="flex items-center mb-3">
@@ -151,7 +159,7 @@
</div>
<!-- 风险等级显示 -->
<div v-if="riskWarning.level" class="mb-3">
<div v-if="riskWarning.value?.level" class="mb-3">
<div class="bg-gray-50 rounded-lg p-3 border border-gray-200">
<div class="flex items-center mb-2">
<div class="w-10 h-10 flex items-center justify-center mr-3">
@@ -159,11 +167,15 @@
</div>
<span class="font-bold text-lg text-gray-800">风险等级</span>
</div>
<div class="flex flex-wrap gap-2">
<span v-for="level in getRiskLevels()" :key="level"
class="px-3 py-1 rounded-md text-sm font-medium bg-yellow-50 text-yellow-700 border border-yellow-200">
{{ getRiskLevelText(level) }}
</span>
<div class="space-y-2">
<div v-for="level in getRiskLevels()" :key="level"
class="flex flex-col gap-1 p-3 bg-white rounded-lg border border-gray-200">
<div class="flex items-center gap-2">
<span :class="['px-2 py-1 rounded text-xs font-bold', getRiskLevelTagClass(level)]">{{ level
}}</span>
<span class="text-sm font-medium text-[#333333]">{{ getRiskLevelText(level) }}</span>
</div>
</div>
</div>
</div>
</div>
@@ -172,16 +184,17 @@
<div v-if="getPoliceVerificationRisks().length > 0" class="space-y-2">
<div v-for="risk in getPoliceVerificationRisks()" :key="risk.key"
class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4 relative">
<div class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-lg rounded-tr-lg">
<div
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-xs text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeColor(risk)]">
{{ risk.level }}
</div>
<div class="flex items-center">
<div class="w-10 h-10 mr-4">
<img src="@/assets/images/report/fqzpf.png" alt="高风险" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 mr-3 flex-shrink-0">
<img :src="getRiskIcon(risk)" :alt="risk.level" class="w-8 h-8 object-contain" />
</div>
<div class="flex-1 pr-16">
<div class="font-bold text-[#333333]">{{ risk.description }}</div>
<div class="text-sm text-[#999999]">{{ risk.detail }}</div>
<div class="flex-1 pr-12">
<div class="font-bold text-[#333333] text-sm">{{ risk.description }}</div>
<div class="text-xs text-[#999999] mt-0.5">{{ risk.detail }}</div>
</div>
</div>
</div>
@@ -202,7 +215,7 @@
<!-- 逾期风险 -->
<div class="risk-module-card relative" :class="getModuleCardClass('overdue')">
<div v-if="getOverdueRiskRisks().length > 0"
class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
:class="['absolute top-0 right-0 px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl', getRiskBadgeBgColor(getModuleHighestRiskLevel('overdue'))]">
{{ getOverdueRiskRisks().length }}条风险
</div>
<div class="flex items-center mb-3">
@@ -218,16 +231,17 @@
<div v-if="getOverdueRiskRisks().length > 0" class="space-y-2">
<div v-for="risk in getOverdueRiskRisks()" :key="risk.key"
class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4 relative">
<div class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-lg rounded-tr-lg">
<div
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-xs text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeColor(risk)]">
{{ risk.level }}
</div>
<div class="flex items-center">
<div class="w-10 h-10 mr-4">
<img src="@/assets/images/report/fqzpf.png" alt="高风险" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 mr-3 flex-shrink-0">
<img :src="getRiskIcon(risk)" :alt="risk.level" class="w-8 h-8 object-contain" />
</div>
<div class="flex-1 pr-16">
<div class="font-bold text-[#333333]">{{ risk.description }}</div>
<div class="text-sm text-[#999999]">{{ risk.detail }}</div>
<div class="flex-1 pr-12">
<div class="font-bold text-[#333333] text-sm">{{ risk.description }}</div>
<div class="text-xs text-[#999999] mt-0.5">{{ risk.detail }}</div>
</div>
</div>
</div>
@@ -247,57 +261,56 @@
</div>
<!-- 法院曝光台信息 -->
<!-- <div class="risk-module-card" :class="getModuleCardClass('court')">
<div class="module-header">
<div class="module-icon bg-purple-500">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z">
</path>
</svg>
<div class="risk-module-card relative" :class="getModuleCardClass('court')">
<div v-if="getCourtRiskRisks().length > 0"
:class="['absolute top-0 right-0 px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl', getRiskBadgeBgColor(getModuleHighestRiskLevel('court'))]">
{{ getCourtRiskRisks().length }}条风险
</div>
<div class="flex items-center mb-3">
<div class="w-12 h-12">
<img :src="courtIconPath" alt="法院曝光台信息" class="w-8 h-8 object-contain" />
</div>
<div class="module-info">
<h4 class="module-title">法院曝光台信息</h4>
<p class="module-desc">民事刑事行政案件等司法记录</p>
</div>
<div class="module-status">
<span class="status-badge" :class="getModuleStatusClass('court')">
{{ getCourtRiskRisks().length }}条风险
</span>
<div class="flex-1">
<h4 class="font-bold text-lg text-[#333333]">法院曝光台信息</h4>
<p class="text-sm text-[#999999]">民事刑事行政案件等司法记录</p>
</div>
</div>
<div class="module-content" v-if="getCourtRiskRisks().length > 0">
<div class="risk-list">
<div v-for="risk in getCourtRiskRisks()" :key="risk.key" class="risk-item">
<div class="risk-indicator" :class="getRiskLevelClass(risk.level)"></div>
<div class="risk-details">
<div class="risk-title">{{ risk.description }}</div>
<div class="risk-desc">{{ risk.detail }}</div>
<div v-if="getCourtRiskRisks().length > 0" class="space-y-2">
<div v-for="risk in getCourtRiskRisks()" :key="risk.key"
class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4 relative">
<div
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-xs text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeColor(risk)]">
{{ risk.level }}
</div>
<div class="flex items-center">
<div class="w-8 h-8 mr-3 flex-shrink-0">
<img :src="getRiskIcon(risk)" :alt="risk.level" class="w-8 h-8 object-contain" />
</div>
<div class="risk-level" :class="getRiskLevelClass(risk.level)">
{{ risk.level }}
<div class="flex-1 pr-12">
<div class="font-bold text-[#333333] text-sm">{{ risk.description }}</div>
<div class="text-xs text-[#999999] mt-0.5">{{ risk.detail }}</div>
</div>
</div>
</div>
</div>
<div v-else class="no-risk-content">
<div class="no-risk-icon">
<svg class="w-8 h-8 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
</div>
<div class="no-risk-text">
<div class="text-sm font-medium text-green-600">暂无风险</div>
<div class="text-xs text-gray-500">该模块未检测到风险</div>
<div v-else class="bg-[#F0FFF0] border border-green-200 rounded-lg p-4">
<div class="flex items-center">
<div class="w-10 h-10 mr-4">
<img :src="safeIconPath" alt="暂无风险" class="w-10 h-10 object-contain" />
</div>
<div class="flex-1">
<div class="font-bold text-[#333333]">暂无风险</div>
<div class="text-sm text-[#999999]">该模块未检测到风险</div>
</div>
</div>
</div>
</div> -->
</div>
<!-- 借贷评估 -->
<div class="risk-module-card relative" :class="getModuleCardClass('loan')">
<div v-if="getLoanEvaluationRisks().length > 0"
class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
:class="['absolute top-0 right-0 px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl', getRiskBadgeBgColor(getModuleHighestRiskLevel('loan'))]">
{{ getLoanEvaluationRisks().length }}条风险
</div>
<div class="flex items-center mb-3">
@@ -313,16 +326,17 @@
<div v-if="getLoanEvaluationRisks().length > 0" class="space-y-2">
<div v-for="risk in getLoanEvaluationRisks()" :key="risk.key"
class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4 relative">
<div class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-lg rounded-tr-lg">
<div
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-xs text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeColor(risk)]">
{{ risk.level }}
</div>
<div class="flex items-center">
<div class="w-10 h-10 mr-4">
<img src="@/assets/images/report/fqzpf.png" alt="高风险" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 mr-3 flex-shrink-0">
<img :src="getRiskIcon(risk)" :alt="risk.level" class="w-8 h-8 object-contain" />
</div>
<div class="flex-1 pr-16">
<div class="font-bold text-[#333333]">{{ risk.description }}</div>
<div class="text-sm text-[#999999]">{{ risk.detail }}</div>
<div class="flex-1 pr-12">
<div class="font-bold text-[#333333] text-sm">{{ risk.description }}</div>
<div class="text-xs text-[#999999] mt-0.5">{{ risk.detail }}</div>
</div>
</div>
</div>
@@ -344,7 +358,7 @@
<!-- 租赁风险评估 -->
<div class="risk-module-card relative" :class="getModuleCardClass('leasing')">
<div v-if="getLeasingRiskRisks().length > 0"
class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-xl rounded-tr-xl">
:class="['absolute top-0 right-0 px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl', getRiskBadgeBgColor(getModuleHighestRiskLevel('leasing'))]">
{{ getLeasingRiskRisks().length }}条风险
</div>
<div class="flex items-center mb-3">
@@ -360,16 +374,17 @@
<div v-if="getLeasingRiskRisks().length > 0" class="space-y-2">
<div v-for="risk in getLeasingRiskRisks()" :key="risk.key"
class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4 relative">
<div class="absolute top-0 right-0 px-2 py-1 text-xs text-white bg-[#E53935] rounded-bl-lg rounded-tr-lg">
<div
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-xs text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeColor(risk)]">
{{ risk.level }}
</div>
<div class="flex items-center">
<div class="w-10 h-10 mr-4">
<img src="@/assets/images/report/fqzpf.png" alt="高风险" class="w-10 h-10 object-contain" />
<div class="w-8 h-8 mr-3 flex-shrink-0">
<img :src="getRiskIcon(risk)" :alt="risk.level" class="w-8 h-8 object-contain" />
</div>
<div class="flex-1 pr-16">
<div class="font-bold text-[#333333]">{{ risk.description }}</div>
<div class="text-sm text-[#999999]">{{ risk.detail }}</div>
<div class="flex-1 pr-12">
<div class="font-bold text-[#333333] text-sm">{{ risk.description }}</div>
<div class="text-xs text-[#999999] mt-0.5">{{ risk.detail }}</div>
</div>
</div>
</div>
@@ -411,6 +426,20 @@ import {
formatVerificationResult
} from '@/ui/CDWBG8B4D/utils/intervalFormatter.js'
// 导入风险类型图标
import iconZfx from '@/assets/images/report/zfx.png'
import iconGfx from '@/assets/images/report/gfx.png'
// 图标路径
const courtIconPath = new URL('@/assets/images/report/fybgt.png', import.meta.url).href
const safeIconPath = new URL('@/assets/images/report/zq.png', import.meta.url).href
// 风险类型图标映射
const riskTypeIcons = {
'zfx.png': iconZfx,
'gfx.png': iconGfx
}
const props = defineProps({
data: {
type: Object,
@@ -431,7 +460,7 @@ const props = defineProps({
})
// 从data中解构出riskWarning
const riskWarning = computed(() => props.data?.riskWarning || {});
const riskWarning = computed(() => (props.data && props.data.riskWarning) ? props.data.riskWarning : {});
// 格式化时间
const formatTime = (timestamp) => {
@@ -442,8 +471,8 @@ const formatTime = (timestamp) => {
// 风险等级相关函数
const getRiskLevels = () => {
if (!riskWarning.level) return []
return riskWarning.level.split(',').map(level => level.trim()).filter(level => level)
if (!riskWarning.value?.level) return []
return riskWarning.value.level.split(',').map(level => level.trim()).filter(level => level)
}
const getRiskLevelText = (level) => {
@@ -468,6 +497,90 @@ const getRiskLevelClass = (level) => {
return 'bg-gray-100 text-gray-700 border-gray-200'
}
// 根据风险等级获取对应的图标路径
const getRiskIconPath = (level) => {
if (level === '高风险') {
return new URL('@/assets/images/report/gfx.png', import.meta.url).href
} else if (level === '中风险') {
return new URL('@/assets/images/report/zfx.png', import.meta.url).href
}
return new URL('@/assets/images/report/zfx.png', import.meta.url).href // 默认使用中风险图标
}
// 根据风险等级获取对应的背景色
const getRiskBadgeBgColor = (level) => {
if (level === '高风险') {
return 'bg-[#E53935]'
} else if (level === '中风险') {
return 'bg-[#D6943E]'
}
return 'bg-[#D6943E]' // 默认使用中风险颜色
}
// 根据风险代码获取对应的图标和背景色
const getRiskTypeConfig = (levelCode) => {
if (!levelCode) return { icon: 'zfx.png', bgColor: 'bg-[#D6943E]' }
// A类红色系
if (levelCode.startsWith('A')) {
return { icon: 'gfx.png', bgColor: 'bg-[#E53935]' }
}
// B类橙色系
if (levelCode.startsWith('B')) {
return { icon: 'zfx.png', bgColor: 'bg-[#D6943E]' }
}
// C类黄色系
if (levelCode.startsWith('C')) {
return { icon: 'zfx.png', bgColor: 'bg-[#D6943E]' }
}
// D类紫色系
if (levelCode.startsWith('D')) {
return { icon: 'gfx.png', bgColor: 'bg-[#E53935]' }
}
// E类蓝色系
if (levelCode.startsWith('E')) {
return { icon: 'zfx.png', bgColor: 'bg-[#D6943E]' }
}
// F类灰色系
if (levelCode.startsWith('F')) {
return { icon: 'zfx.png', bgColor: 'bg-[#999999]' }
}
return { icon: 'zfx.png', bgColor: 'bg-[#D6943E]' }
}
// 获取风险图标路径(根据 risk 对象)
const getRiskIcon = (risk) => {
// 优先根据风险等级(高风险/中风险)来决定图标
if (risk?.level === '高风险') {
return iconGfx
} else if (risk?.level === '中风险') {
return iconZfx
}
// 如果没有level使用levelCode来判断
if (risk?.levelCode) {
const config = getRiskTypeConfig(risk.levelCode)
return riskTypeIcons[config.icon] || iconZfx
}
return iconZfx
}
// 获取风险标签颜色(根据 risk 对象)
const getRiskBadgeColor = (risk) => {
// 优先根据风险等级(高风险/中风险)来决定背景色
if (risk?.level === '高风险') {
return 'bg-[#E53935]'
} else if (risk?.level === '中风险') {
return 'bg-[#D6943E]'
}
// 如果没有level使用levelCode来判断
if (risk?.levelCode) {
const config = getRiskTypeConfig(risk.levelCode)
return config.bgColor
}
return 'bg-[#D6943E]'
}
// 模块卡片样式
const getModuleCardClass = (module) => {
const riskCount = getModuleRiskCount(module)
@@ -504,6 +617,36 @@ const getModuleRiskCount = (module) => {
}
}
// 获取模块的风险列表
const getModuleRisks = (moduleType) => {
switch (moduleType) {
case 'element':
return getElementVerificationRisks()
case 'operator':
return getOperatorVerificationRisks()
case 'police':
return getPoliceVerificationRisks()
case 'overdue':
return getOverdueRiskRisks()
case 'court':
return getCourtRiskRisks()
case 'loan':
return getLoanEvaluationRisks()
case 'leasing':
return getLeasingRiskRisks()
default:
return []
}
}
// 获取模块的最高风险等级
const getModuleHighestRiskLevel = (moduleType) => {
const risks = getModuleRisks(moduleType)
if (risks.length === 0) return '中风险'
const hasHighRisk = risks.some(risk => risk.level === '高风险')
return hasHighRisk ? '高风险' : '中风险'
}
// 获取高风险数量
const getHighRiskCount = () => {
const highRiskFields = [
@@ -518,7 +661,7 @@ const getHighRiskCount = () => {
]
return highRiskFields.reduce((count, field) => {
return count + (riskWarning[field] || 0)
return count + (riskWarning.value[field] || 0)
}, 0)
}
@@ -531,7 +674,7 @@ const getMiddleRiskCount = () => {
]
return middleRiskFields.reduce((count, field) => {
return count + (riskWarning[field] || 0)
return count + (riskWarning.value[field] || 0)
}, 0)
}
@@ -539,7 +682,7 @@ const getMiddleRiskCount = () => {
const getElementVerificationRisks = () => {
const risks = []
if (riskWarning.idCardTwoElementMismatch) {
if (riskWarning.value.idCardTwoElementMismatch) {
risks.push({
key: 'idCardTwoElementMismatch',
description: '身份证二要素信息对比结果不一致',
@@ -548,7 +691,7 @@ const getElementVerificationRisks = () => {
})
}
if (riskWarning.phoneThreeElementMismatch) {
if (riskWarning.value.phoneThreeElementMismatch) {
risks.push({
key: 'phoneThreeElementMismatch',
description: '手机三要素简版不一致',
@@ -564,7 +707,7 @@ const getElementVerificationRisks = () => {
const getOperatorVerificationRisks = () => {
const risks = []
if (riskWarning.shortPhoneDuration) {
if (riskWarning.value.shortPhoneDuration) {
risks.push({
key: 'shortPhoneDuration',
description: '手机在网时长极短',
@@ -573,7 +716,7 @@ const getOperatorVerificationRisks = () => {
})
}
if (riskWarning.shortPhoneDurationSlight) {
if (riskWarning.value.shortPhoneDurationSlight) {
risks.push({
key: 'shortPhoneDurationSlight',
description: '手机在网时长较短',
@@ -582,7 +725,7 @@ const getOperatorVerificationRisks = () => {
})
}
if (riskWarning.idCardPhoneProvinceMismatch) {
if (riskWarning.value.idCardPhoneProvinceMismatch) {
risks.push({
key: 'idCardPhoneProvinceMismatch',
description: '身份证号手机号归属省不一致',
@@ -591,7 +734,7 @@ const getOperatorVerificationRisks = () => {
})
}
if (riskWarning.noPhoneDuration) {
if (riskWarning.value.noPhoneDuration) {
risks.push({
key: 'noPhoneDuration',
description: '手机在网状态为风险号',
@@ -603,63 +746,48 @@ const getOperatorVerificationRisks = () => {
return risks
}
// 根据 level 字段生成风险项
const getLevelBasedRisks = () => {
const risks = []
const levels = riskWarning.value?.level
if (!levels) return risks
const levelList = levels.split(',').map(l => l.trim()).filter(l => l && l !== '0' && l !== 'B3')
// 获取统计数据,确定整体风险等级
const highCounts = riskWarning.value.gazdyrhyRiskHighCounts || 0
const middleCounts = riskWarning.value.gazdyrhyRiskMiddleCounts || 0
// 根据统计数据判断整体风险等级
// 如果有高风险,整体显示为高风险;如果只有中风险,整体显示为中风险
let overallRiskLevel = '高风险'
if (highCounts > 0) {
overallRiskLevel = '高风险'
} else if (middleCounts > 0 && highCounts === 0) {
overallRiskLevel = '中风险'
}
levelList.forEach((level, index) => {
const levelDescription = getRiskLevelText(level)
risks.push({
key: `level_${level}_${index}`,
description: `命中${levelDescription}`,
detail: levelDescription,
level: overallRiskLevel,
levelCode: level
})
})
return risks
}
// 公安重点人员核验风险
const getPoliceVerificationRisks = () => {
const risks = []
if (riskWarning.hasCriminalRecord) {
risks.push({
key: 'hasCriminalRecord',
description: '该用户有前科',
detail: '用户存在犯罪前科记录',
level: '高风险'
})
}
if (riskWarning.isEconomyFront) {
risks.push({
key: 'isEconomyFront',
description: '该用户有经济类前科',
detail: '用户存在经济类犯罪前科',
level: '高风险'
})
}
if (riskWarning.isDisrupSocial) {
risks.push({
key: 'isDisrupSocial',
description: '该用户有妨害社会管理秩序',
detail: '用户存在妨害社会管理秩序记录',
level: '高风险'
})
}
if (riskWarning.isKeyPerson) {
risks.push({
key: 'isKeyPerson',
description: '该用户为重点人员',
detail: '用户被列为重点监管人员',
level: '高风险'
})
}
if (riskWarning.isTrafficRelated) {
risks.push({
key: 'isTrafficRelated',
description: '该用户为涉交通案件',
detail: '用户存在交通相关案件记录',
level: '高风险'
})
}
if (riskWarning.isAntiFraudInfo) {
risks.push({
key: 'isAntiFraudInfo',
description: '该用户为涉赌涉诈',
detail: '用户存在涉赌涉诈相关风险',
level: '中风险'
})
}
// 只添加基于 level 字段的风险项
risks.push(...getLevelBasedRisks())
return risks
}
@@ -668,7 +796,7 @@ const getPoliceVerificationRisks = () => {
const getOverdueRiskRisks = () => {
const risks = []
if (riskWarning.hitHighRiskBankLastTwoYears) {
if (riskWarning.value.hitHighRiskBankLastTwoYears) {
risks.push({
key: 'hitHighRiskBankLastTwoYears',
description: '近两年命中银行高风险',
@@ -677,7 +805,7 @@ const getOverdueRiskRisks = () => {
})
}
if (riskWarning.hitHighRiskNonBankLastTwoYears) {
if (riskWarning.value.hitHighRiskNonBankLastTwoYears) {
risks.push({
key: 'hitHighRiskNonBankLastTwoYears',
description: '近两年命中非银高风险',
@@ -686,7 +814,7 @@ const getOverdueRiskRisks = () => {
})
}
if (riskWarning.hitCurrentOverdue) {
if (riskWarning.value.hitCurrentOverdue) {
risks.push({
key: 'hitCurrentOverdue',
description: '该用户命中当前逾期',
@@ -702,7 +830,7 @@ const getOverdueRiskRisks = () => {
const getCourtRiskRisks = () => {
const risks = []
if (riskWarning.hitCivilCase) {
if (riskWarning.value.hitCivilCase) {
risks.push({
key: 'hitCivilCase',
description: '该用户命中民事案件',
@@ -711,7 +839,7 @@ const getCourtRiskRisks = () => {
})
}
if (riskWarning.hitCriminalRisk) {
if (riskWarning.value.hitCriminalRisk) {
risks.push({
key: 'hitCriminalRisk',
description: '该用户命中刑事风险',
@@ -720,7 +848,7 @@ const getCourtRiskRisks = () => {
})
}
if (riskWarning.hitAdministrativeCase) {
if (riskWarning.value.hitAdministrativeCase) {
risks.push({
key: 'hitAdministrativeCase',
description: '该用户命中行政案件',
@@ -729,7 +857,7 @@ const getCourtRiskRisks = () => {
})
}
if (riskWarning.hitPreservationReview) {
if (riskWarning.value.hitPreservationReview) {
risks.push({
key: 'hitPreservationReview',
description: '该用户命中保全审查',
@@ -738,7 +866,7 @@ const getCourtRiskRisks = () => {
})
}
if (riskWarning.hitExecutionCase) {
if (riskWarning.value.hitExecutionCase) {
risks.push({
key: 'hitExecutionCase',
description: '该用户命中执行案件',
@@ -747,7 +875,7 @@ const getCourtRiskRisks = () => {
})
}
if (riskWarning.hitBankruptcyAndLiquidation) {
if (riskWarning.value.hitBankruptcyAndLiquidation) {
risks.push({
key: 'hitBankruptcyAndLiquidation',
description: '该用户命中强制清算与破产案件',
@@ -756,7 +884,7 @@ const getCourtRiskRisks = () => {
})
}
if (riskWarning.hitDirectlyUnderCase) {
if (riskWarning.value.hitDirectlyUnderCase) {
risks.push({
key: 'hitDirectlyUnderCase',
description: '该用户命中直辖案件',
@@ -765,7 +893,7 @@ const getCourtRiskRisks = () => {
})
}
if (riskWarning.hitCompensationCase) {
if (riskWarning.value.hitCompensationCase) {
risks.push({
key: 'hitCompensationCase',
description: '该用户命中赔偿案件',
@@ -781,7 +909,7 @@ const getCourtRiskRisks = () => {
const getLoanEvaluationRisks = () => {
const risks = []
if (riskWarning.frequentApplicationRecent) {
if (riskWarning.value.frequentApplicationRecent) {
risks.push({
key: 'frequentApplicationRecent',
description: '近期申请机构极为频繁',
@@ -790,7 +918,7 @@ const getLoanEvaluationRisks = () => {
})
}
if (riskWarning.frequentNonBankApplications) {
if (riskWarning.value.frequentNonBankApplications) {
risks.push({
key: 'frequentNonBankApplications',
description: '在非银机构申请次数极多',
@@ -799,7 +927,7 @@ const getLoanEvaluationRisks = () => {
})
}
if (riskWarning.highDebtPressure) {
if (riskWarning.value.highDebtPressure) {
risks.push({
key: 'highDebtPressure',
description: '偿债压力极高',
@@ -808,7 +936,7 @@ const getLoanEvaluationRisks = () => {
})
}
if (riskWarning.frequentBankApplications) {
if (riskWarning.value.frequentBankApplications) {
risks.push({
key: 'frequentBankApplications',
description: '在银行机构申请次数极多',
@@ -817,7 +945,7 @@ const getLoanEvaluationRisks = () => {
})
}
if (riskWarning.moreFrequentNonBankApplications) {
if (riskWarning.value.moreFrequentNonBankApplications) {
risks.push({
key: 'moreFrequentNonBankApplications',
description: '在非银机构申请次数较多',
@@ -826,7 +954,7 @@ const getLoanEvaluationRisks = () => {
})
}
if (riskWarning.highFraudGangLevel) {
if (riskWarning.value.highFraudGangLevel) {
risks.push({
key: 'highFraudGangLevel',
description: '欺诈团伙等级较高',
@@ -835,7 +963,7 @@ const getLoanEvaluationRisks = () => {
})
}
if (riskWarning.moreFrequentBankApplications) {
if (riskWarning.value.moreFrequentBankApplications) {
risks.push({
key: 'moreFrequentBankApplications',
description: '在银行机构申请次数较多',
@@ -851,7 +979,7 @@ const getLoanEvaluationRisks = () => {
const getLeasingRiskRisks = () => {
const risks = []
if (riskWarning.frequentRentalApplications) {
if (riskWarning.value.frequentRentalApplications) {
risks.push({
key: 'frequentRentalApplications',
description: '在租赁机构申请极为频繁',
@@ -860,7 +988,7 @@ const getLeasingRiskRisks = () => {
})
}
if (riskWarning.veryFrequentRentalApplications) {
if (riskWarning.value.veryFrequentRentalApplications) {
risks.push({
key: 'veryFrequentRentalApplications',
description: '在租赁机构申请次数极多',

View File

@@ -1,9 +1,9 @@
<template>
<div class="">
<!-- 概览标题 -->
<div class="mb-6">
<div class="p-4">
<!-- 添加风险概览总结 -->
<div class=" p-4 rounded-lg" :class="getRiskOverviewClass()">
<div class="p-4 rounded-lg" :class="getRiskOverviewClass()">
<div class="flex items-center">
<div class="w-12 h-12 mr-3 flex-shrink-0">
<img :src="getRiskIcon()" alt="风险" class="w-12 h-12 object-contain" />
@@ -234,7 +234,7 @@ const caseTypeChartOption = computed(() => {
return {
value: value === 0 ? 0.1 : value, // 0值显示为0.1,让柱子能显示一个小尖尖
itemStyle: {
color: 'var(--color-primary)',
color: '#5d7eeb',
borderRadius: [0, 4, 4, 0],
},
}

View File

@@ -4,7 +4,7 @@
<!-- 标题 -->
<div class="flex items-center mb-3 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/zwsc.png" alt="涉诉风险整体概览" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/ssfxfx.png" alt="涉诉风险整体" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">涉诉风险分析</span>
</div>

296
src/ui/CIVYZ7F3A.vue Normal file
View File

@@ -0,0 +1,296 @@
<script setup>
import { computed, onMounted } from 'vue';
import { useRiskNotifier } from '@/composables/useRiskNotifier';
const props = defineProps({
data: {
type: Object,
default: () => ({})
},
apiId: {
type: String,
default: '',
},
index: {
type: Number,
default: 0,
},
notifyRiskStatus: {
type: Function,
default: () => { },
},
});
// 导入图片图标
import rkpmIcon from '@/assets/images/report/rkpm.png';
import zymcIcon from '@/assets/images/report/zymc.png';
import xxxsIcon from '@/assets/images/report/xxxs.png';
import xxlxIcon from '@/assets/images/report/xxlx.png';
import bysjIcon from '@/assets/images/report/bysj.png';
import xlIcon from '@/assets/images/report/xl.png';
// 计算风险评分0-100分分数越高越安全
const riskScore = computed(() => {
// 学历信息不算风险始终返回100分最安全
return 100;
});
// 使用 composable 通知父组件风险评分
useRiskNotifier(props, riskScore);
// 暴露给父组件
defineExpose({
riskScore
});
// 格式化日期从YYYYMM格式转换为YYYY年MM月格式
const formatDate = (dateStr) => {
if (!dateStr || dateStr.length !== 6) return "未知";
const year = dateStr.substring(0, 4);
const month = dateStr.substring(4, 6);
return `${year}${month}`;
};
// 获取学历等级的描述
const getEducationLevelDesc = (level) => {
const descriptions = {
"专科": "专科学历是高等教育的重要组成部分,培养具有专业知识和技能的应用型人才。",
"本科": "本科学历是高等教育的基础学位,培养具有系统专业知识和基本技能的高级人才。",
"硕士": "硕士学位是较高层次的学位,培养具有较深厚理论基础和专业技能的高级专门人才。",
"博士": "博士学位是最高学位,培养能够独立从事科学研究工作、具有创新能力的高级专门人才。",
};
return descriptions[level] || "";
};
// 根据学校属性获取徽章配置
const getSchoolBadges = () => {
const badges = [];
if (props.data.isProject985 === "是") {
badges.push({
text: "985院校",
class: "bg-amber-500 text-white",
icon: "🏆"
});
}
if (props.data.isProject211 === "是") {
badges.push({
text: "211院校",
class: "bg-blue-500 text-white",
icon: "⭐"
});
}
if (props.data.isDoubleFirstClass === "是") {
badges.push({
text: "双一流",
class: "bg-green-500 text-white",
icon: "✨"
});
}
return badges;
};
// 获取学校类型徽章样式
const getSchoolTypeBadgeClass = (type) => {
const typeClasses = {
"综合": "bg-blue-50 text-blue-700 border-blue-300",
"理工": "bg-purple-50 text-purple-700 border-purple-300",
"农业": "bg-green-50 text-green-700 border-green-300",
"医学": "bg-red-50 text-red-700 border-red-300",
"师范": "bg-yellow-50 text-yellow-700 border-yellow-300",
"财经": "bg-cyan-50 text-cyan-700 border-cyan-300",
"艺术": "bg-pink-50 text-pink-700 border-pink-300",
};
return typeClasses[type] || "bg-gray-50 text-gray-700 border-gray-300";
};
// 获取软科排名样式
const getRankingClass = () => {
if (!props.data.Ranking) return "bg-gray-50 text-gray-700";
// 解析排名范围 (例如: "151-155")
const match = props.data.Ranking.match(/(\d+)-(\d+)/);
if (match) {
const minRank = parseInt(match[1]);
if (minRank <= 50) return "bg-green-50 text-green-700 border-green-300";
if (minRank <= 100) return "bg-blue-50 text-blue-700 border-blue-300";
if (minRank <= 200) return "bg-yellow-50 text-yellow-700 border-yellow-300";
}
return "bg-gray-50 text-gray-700 border-gray-300";
};
// 判断是否有数据
const hasData = computed(() => {
return props.data && Object.keys(props.data).length > 0;
});
// 获取徽章列表
const schoolBadges = computed(() => getSchoolBadges());
</script>
<template>
<div v-if="hasData" class="card max-w-4xl mx-auto">
<!-- 头部区域 -->
<div class="mb-6">
<!-- 学历等级标题 -->
<div class="flex items-center justify-between mb-4">
<div class="flex items-center gap-3">
<div class="w-12 h-12 flex items-center justify-center">
<img :src="xlIcon" alt="学历图标" class="w-12 h-12" />
</div>
<div>
<h2 class="text-2xl font-bold text-gray-900">{{ data.educationLevel }}学历</h2>
<p class="text-sm text-gray-500">Education Information</p>
</div>
</div>
</div>
</div>
<!-- 主要内容区域 -->
<div class="space-y-4">
<!-- 软科排名 -->
<div v-if="data.Ranking"
class="bg-gradient-to-r from-blue-50 to-indigo-50 rounded-lg p-4 border border-blue-200">
<div class="flex items-center gap-3">
<div class="w-8 h-8 flex items-center justify-center flex-shrink-0">
<img :src="rkpmIcon" alt="软科排名" class="w-8 h-8" />
</div>
<div class="flex-1">
<div class="text-sm text-gray-600 mb-1">软科排名</div>
<div
:class="['inline-block px-3 py-1 rounded-full text-sm font-medium border', getRankingClass()]">
{{ data.Ranking }}
</div>
</div>
</div>
</div>
<!-- 学校徽章 -->
<div v-if="schoolBadges.length > 0" class="flex gap-2 flex-wrap">
<div v-for="(badge, index) in schoolBadges" :key="index"
:class="['inline-flex items-center gap-1 px-4 py-2 rounded-lg text-sm font-medium shadow-sm', badge.class]">
<span>{{ badge.icon }}</span>
<span>{{ badge.text }}</span>
</div>
</div>
<!-- 详细信息卡片 -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<!-- 专业信息 -->
<div v-if="data.major"
class="bg-gray-50 rounded-lg p-4 border border-gray-200 hover:border-blue-300 transition-colors">
<div class="flex items-start gap-3">
<div class="w-8 h-8 flex items-center justify-center flex-shrink-0 mt-1">
<img :src="zymcIcon" alt="专业名称" class="w-8 h-8" />
</div>
<div class="flex-1">
<div class="text-sm text-gray-600 mb-1">专业名称</div>
<div class="text-base font-medium text-gray-900">{{ data.major }}</div>
</div>
</div>
</div>
<!-- 学校类型 -->
<div v-if="data.schoolType"
class="bg-gray-50 rounded-lg p-4 border border-gray-200 hover:border-blue-300 transition-colors">
<div class="flex items-start gap-3">
<div class="w-8 h-8 flex items-center justify-center flex-shrink-0 mt-1">
<img :src="xxlxIcon" alt="学校类型" class="w-8 h-8" />
</div>
<div class="flex-1">
<div class="text-sm text-gray-600 mb-1">学校类型</div>
<div
:class="['inline-block px-3 py-1 rounded text-sm font-medium border', getSchoolTypeBadgeClass(data.schoolType)]">
{{ data.schoolType }}类院校
</div>
</div>
</div>
</div>
<!-- 学习形式 -->
<div v-if="data.educationType"
class="bg-gray-50 rounded-lg p-4 border border-gray-200 hover:border-blue-300 transition-colors">
<div class="flex items-start gap-3">
<div class="w-8 h-8 flex items-center justify-center flex-shrink-0 mt-1">
<img :src="xxxsIcon" alt="学习形式" class="w-8 h-8" />
</div>
<div class="flex-1">
<div class="text-sm text-gray-600 mb-1">学习形式</div>
<div class="text-base font-medium text-gray-900">{{ data.educationType }}</div>
</div>
</div>
</div>
<!-- 毕业时间 -->
<div v-if="data.graduationDate"
class="bg-gray-50 rounded-lg p-4 border border-gray-200 hover:border-blue-300 transition-colors">
<div class="flex items-start gap-3">
<div class="w-8 h-8 flex items-center justify-center flex-shrink-0 mt-1">
<img :src="bysjIcon" alt="毕业时间" class="w-8 h-8" />
</div>
<div class="flex-1">
<div class="text-sm text-gray-600 mb-1">毕业时间</div>
<div class="text-base font-medium text-gray-900">{{ formatDate(data.graduationDate) }}</div>
</div>
</div>
</div>
</div>
<!-- 学历描述 -->
<div v-if="data.educationLevel"
class="mt-6 bg-gradient-to-r from-blue-50 to-indigo-50 rounded-lg p-5 border border-blue-200">
<div class="flex items-start gap-3">
<div class="w-10 h-10 rounded-full bg-blue-500 flex items-center justify-center flex-shrink-0 mt-1">
<span class="text-white text-xl">💡</span>
</div>
<div class="flex-1">
<div class="flex items-center gap-2 mb-2">
<h3 class="text-lg font-semibold text-gray-900">学历说明</h3>
<span class="px-2 py-1 bg-blue-500 text-white text-xs rounded">信息</span>
</div>
<p class="text-gray-700 leading-relaxed">
{{ getEducationLevelDesc(data.educationLevel) }}
</p>
</div>
</div>
</div>
</div>
</div>
<!-- 无数据状态 -->
<div v-else class="card max-w-2xl mx-auto">
<div class="flex flex-col items-center py-12 text-center">
<div class="w-20 h-20 flex items-center justify-center mb-4">
<img :src="xlIcon" alt="学历图标" class="w-20 h-20 opacity-40" />
</div>
<h3 class="text-lg font-medium text-gray-900 mb-2">暂无学历信息</h3>
<p class="text-sm text-gray-500 max-w-md">
系统中暂无相关的学历信息记录这可能是因为学历信息未公开或数据正在同步中
</p>
</div>
</div>
</template>
<style lang="scss" scoped>
.card {
padding: 1.5rem;
box-shadow: 0px 0px 24px 0px #3F3F3F0F;
border-radius: 12px;
background: white;
}
/* 添加一些动画效果 */
.bg-gray-50 {
transition: all 0.3s ease;
}
.bg-gray-50:hover {
transform: translateY(-2px);
}
</style>

View File

@@ -1,6 +1,4 @@
<script setup>
import LTitle from "@/components/LTitle.vue";
const props = defineProps({
data: {
type: Object,

View File

@@ -225,6 +225,7 @@ function initChart() {
data: item.data || [],
barMaxWidth: 50,
barGap: '30%',
barMinHeight: 3,
label: {
show: true,
position: 'top',

View File

@@ -306,7 +306,7 @@ onUnmounted(() => {
<!-- 标题栏 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="还款压力分析" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/hkylfx.png" alt="还款压力分析" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">还款压力分析</span>
</div>

View File

@@ -4,7 +4,7 @@
<!-- 标题栏 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/fqzpf.png" alt="信用评分" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/xypf2.png" alt="信用评分" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">信用评分</span>
</div>
@@ -161,7 +161,7 @@
<div class="flex flex-col items-center justify-center h-full w-full">
<div class="flex flex-col items-center justify-center w-full h-full text-center">
<div class="text-lg text-[#999999] mt-1">金额: <span class="font-bold text-green-600 text-2xl">{{
(recent5AmountRatio * 100).toFixed(0) }}</span> %</div>
(recent5AmountRatio * 100).toFixed(0) }}</span> %</div>
<div class="font-medium text-[#666666] mb-2">近5次</div>
</div>

View File

@@ -5,7 +5,7 @@
<!-- 标题栏 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/zq.png" alt="机构分析" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/jgfx.png" alt="机构分析" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">机构分析</span>
</div>

View File

@@ -5,7 +5,7 @@
<!-- 标题栏 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/zwsc.png" alt="贷款行为分析" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/dkxwfx.png" alt="贷款行为分析" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">贷款行为分析</span>
</div>
@@ -167,14 +167,14 @@
<div class="flex justify-between items-center" v-if="currentPeriod.amounts">
<span class="text-sm text-gray-600">成功金额</span>
<span class="text-sm font-bold text-gray-800">{{ formatAmount(currentPeriod.amounts.success)
}}</span>
}}</span>
</div>
<!-- 失败金额 -->
<div class="flex justify-between items-center" v-if="currentPeriod.amounts">
<span class="text-sm text-gray-600">失败金额</span>
<span class="text-sm font-bold text-gray-800">{{ formatAmount(currentPeriod.amounts.failure)
}}</span>
}}</span>
</div>
</div>
</div>

View File

@@ -2,7 +2,10 @@
<div class="rounded-lg border border-[#99999933] mb-4">
<!-- 标题栏 -->
<div class="flex items-center p-4">
<span class="font-bold text-gray-800 text-xl ml-8">专业建议</span>
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/zyjy.png" alt="专业建议" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">专业建议</span>
</div>
<!-- 风险评估结论 -->

View File

@@ -3,7 +3,7 @@
<!-- 标题栏 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="风险指标详情" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/fxzbxq.png" alt="风险指标详情" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">风险指标详情</span>
</div>
@@ -52,7 +52,7 @@
<div class="flex justify-between items-center">
<span class="text-sm text-[#999999]">历史成功还款</span>
<span class="text-base font-bold text-[#333333]">{{ formatMetricValue(historicalSuccessPayments)
}}</span>
}}</span>
</div>
</div>
</div>
@@ -223,17 +223,17 @@
<div class="flex justify-between items-center">
<span class="text-sm text-[#999999]">近90天最大交易金额</span>
<span class="text-base font-bold text-[#333333]">{{ formatAmount(parseIntervalValue(data.xyp_t01aafzzz))
}}</span>
}}</span>
</div>
<div class="flex justify-between items-center">
<span class="text-sm text-[#999999]">近90天最小交易金额</span>
<span class="text-base font-bold text-[#333333]">{{ formatAmount(parseIntervalValue(data.xyp_t01abfzzz))
}}</span>
}}</span>
</div>
<div class="flex justify-between items-center">
<span class="text-sm text-[#999999]">近90天平均交易金额</span>
<span class="text-base font-bold text-[#333333]">{{ formatAmount(parseIntervalValue(data.xyp_t01adfzzz))
}}</span>
}}</span>
</div>
</div>
</div>

View File

@@ -5,7 +5,7 @@
<!-- 标题栏 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="风险概览" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/fxgl.png" alt="风险概览" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">风险概览</span>
</div>

View File

@@ -3,7 +3,7 @@
<!-- 标题栏 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/zwsc.png" alt="贷款行为分析" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/sjqsfx.png" alt="贷款行为分析" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">贷款行为分析</span>
</div>
@@ -152,7 +152,7 @@
<div class="flex justify-between items-center">
<span class="text-sm text-gray-600">新增</span>
<span class="text-sm font-bold text-gray-800">{{ formatAmount(currentAmountData.totalAmount)
}}</span>
}}</span>
</div>
<div class="h-2 rounded-full bg-gray-200">
<div class="h-2 rounded-full transition-all duration-500"

View File

@@ -400,6 +400,7 @@ function drawBorrowChart() {
},
},
barWidth: '60%',
barMinHeight: 3,
showBackground: true,
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.1)',
@@ -507,6 +508,7 @@ function drawRepayChart() {
},
},
barWidth: '60%',
barMinHeight: 3,
showBackground: true,
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.1)',

130
src/ui/CQCXG9P1C.vue Normal file
View File

@@ -0,0 +1,130 @@
<template>
<div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6">
<!-- 车辆总数统计 -->
<div class="flex justify-between items-center mb-6 pb-4 border-b border-gray-100">
<div class="flex items-center gap-3">
<div>
<div class="text-lg font-semibold text-gray-900">个人名下车辆</div>
</div>
</div>
<div class="bg-blue-50 text-blue-700 px-4 py-2 rounded-full text-sm font-medium">
{{ vehicleCount }}
</div>
</div>
<!-- 车辆列表 -->
<div class="space-y-3" v-if="vehicleList && vehicleList.length > 0">
<div class="bg-gray-50 rounded-lg p-4 border border-gray-200 hover:bg-blue-50 hover:border-blue-200 transition-colors duration-200"
v-for="(vehicle, index) in vehicleList" :key="index">
<div class="space-y-3">
<div class="text-xl font-bold text-gray-900 font-mono tracking-wider">
{{ vehicle.plateNum }}
</div>
<div class="flex items-center gap-3">
<div class="inline-flex items-center gap-1 px-3 py-1 rounded text-xs font-medium text-white"
:class="getPlateColorClass(vehicle.plateColor)">
<span>🏷</span>
<span>{{ getPlateColorText(vehicle.plateColor) }}</span>
</div>
<div class="text-sm text-gray-600">
<span class="text-gray-500">车辆类型:</span>
<span class="font-medium text-gray-900 ml-1">{{ getVehicleTypeText(vehicle.vehicleType)
}}</span>
</div>
</div>
</div>
</div>
</div>
<!-- 无数据状态 -->
<div class="text-center py-12 text-gray-500" v-else>
<div class="text-4xl mb-3">🚫</div>
<div class="text-lg font-medium mb-1">暂无车辆信息</div>
<div class="text-sm">No vehicle records found</div>
</div>
</div>
</template>
<script setup>
import { defineProps, computed } from 'vue';
// 接收父组件传入的 props
const props = defineProps({
data: Object,
params: Object,
});
// 车牌颜色映射
const plateColorMap = {
0: '蓝色 - 普通燃油车',
1: '黄色 - 大型车/货车',
2: '黑色 - 外籍车辆/港澳台车',
3: '白色 - 警车/军车/武警车',
4: '渐变绿色 - 新能源汽车',
5: '黄绿双拼色 - 大型新能源汽车',
6: '蓝白渐变色 - 临时牌照',
7: '临时牌照 - 临时行驶车辆',
11: '绿色 - 新能源汽车',
12: '红色 - 教练车/试验车'
};
// 车辆类型映射
const vehicleTypeMap = {
1: '一型客车',
2: '二型客车',
3: '三型客车',
4: '四型客车',
11: '一型货车',
12: '二型货车',
13: '三型货车',
14: '四型货车',
15: '五型货车',
16: '六型货车',
21: '一型专项作业车',
22: '二型专项作业车',
23: '三型专项作业车',
24: '四型专项作业车',
25: '五型专项作业车',
26: '六型专项作业车'
};
// 计算属性
const vehicleList = computed(() => props.data?.list || []);
const vehicleCount = computed(() => props.data?.vehicleCount || 0);
// 获取车牌颜色文本
const getPlateColorText = (plateColor) => {
return plateColorMap[plateColor] || '未知颜色 - 未知类型';
};
// 获取车牌颜色样式类
const getPlateColorClass = (plateColor) => {
const colorClassMap = {
0: 'bg-blue-500',
1: 'bg-yellow-500',
2: 'bg-gray-800',
3: 'bg-gray-200 text-gray-800',
4: 'bg-green-500',
5: 'bg-gradient-to-r from-yellow-500 to-green-500',
6: 'bg-gradient-to-r from-blue-500 to-white text-blue-800',
7: 'bg-red-500',
11: 'bg-green-500',
12: 'bg-red-500'
};
return colorClassMap[plateColor] || 'bg-gray-500';
};
// 获取车辆类型文本
const getVehicleTypeText = (vehicleType) => {
return vehicleTypeMap[vehicleType] || '未知类型';
};
onMounted(() => {
console.log('车辆数据:', props.data);
});
</script>
<style scoped>
/* 自定义样式 - 仅保留必要的样式 */
</style>

View File

@@ -3,7 +3,7 @@
<div class="border border-[#EEEEEE] p-4 rounded-xl">
<div class="flex items-center mb-3">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/dwtz.png" alt="对外投资历史" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/dwtzls.png" alt="对外投资历史" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">对外投资历史</span>
</div>
@@ -21,7 +21,7 @@
<div class="flex items-center justify-between pt-2">
<span class="text-sm text-gray-600">投资企业</span>
<span class="text-sm text-gray-600">投资项目: <span class="ml-1 font-medium text-[#333333]">{{
group.totalInvestments }}</span></span>
group.totalInvestments }}</span></span>
</div>
</div>
@@ -76,7 +76,7 @@
<!-- 持股比例 -->
<span class="text-base text-[#666666] flex-shrink-0">持股比例</span>
<span class="text-base font-medium text-[#333333] break-words">{{ investment.percent || '-'
}}</span>
}}</span>
<!-- 投资金额 -->
<template v-if="investment.amount">
@@ -114,13 +114,13 @@
<!-- 企业状态 -->
<span class="text-base text-[#666666] flex-shrink-0">企业状态</span>
<span class="text-base font-medium text-[#333333] break-words">{{ investment.regStatus || '-'
}}</span>
}}</span>
<!-- 统一社会信用代码 -->
<template v-if="investment.creditCode">
<span class="text-base text-[#666666] flex-shrink-0">统一社会信用代码</span>
<span class="text-base font-medium text-[#333333] break-words">{{ investment.creditCode
}}</span>
}}</span>
</template>
<!-- 企业类型 -->
@@ -149,14 +149,14 @@
<template v-if="investment.legalPersonName">
<span class="text-base text-[#666666] flex-shrink-0">法人代表</span>
<span class="text-base font-medium text-[#333333] break-words">{{ investment.legalPersonName
}}</span>
}}</span>
</template>
<!-- 经营范围 -->
<template v-if="investment.business_scope">
<span class="text-base text-[#666666] flex-shrink-0">经营范围</span>
<span class="text-base font-medium text-[#333333] break-words">{{ investment.business_scope
}}</span>
}}</span>
</template>
</div>
</div>

View File

@@ -4,7 +4,7 @@
<div class=" border border-[#EEEEEE] p-4 rounded-xl">
<div class="flex items-center mb-3">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/zwsc.png" alt="涉诉风险整体概览" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/ssfxztgl.png" alt="涉诉风险整体概览" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">涉诉风险整体概览</span>
</div>
@@ -1313,7 +1313,7 @@ const caseTypeChartOption = computed(() => {
return {
value: value,
itemStyle: {
color: "var(--color-primary)",
color: "#5d7eeb",
borderRadius: [0, 4, 4, 0],
},
};

View File

@@ -3,7 +3,7 @@
<div class="rounded-lg border border-gray-200 pb-4 mb-4">
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img :src="getTitleIcon()" alt="涉赌涉诈人员核验" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/sdszryhy.png" alt="涉赌涉诈人员核验" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">涉赌涉诈人员核验</span>
</div>

View File

@@ -4,7 +4,7 @@
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="历史借贷行为" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/lsjdxw.png" alt="历史借贷行为" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">历史借贷行为</span>
</div>
@@ -311,14 +311,15 @@ const barChartOption = computed(() => {
name: '申请机构数',
type: 'bar',
barWidth: '25%',
barMinHeight: 3,
data: data,
itemStyle: {
color: '#a03434',
color: '#5d7eeb',
borderRadius: [4, 4, 0, 0]
},
emphasis: {
itemStyle: {
color: '#c04242'
color: '#7dd3fc'
}
}
}

View File

@@ -4,53 +4,51 @@
<div class="mt-4">
<!-- 法院风险概览 -->
<div class="bg-gradient-to-r from-red-50 to-pink-50 rounded-lg p-4 mb-4">
<h3 class="text-lg font-semibold text-gray-800 mb-3 flex items-center">
<span class="w-2 h-2 bg-red-500 rounded-full mr-2"></span>
<div class="bg-gradient-to-r from-[#F9ECEC] to-[#FCE8E8] rounded-lg p-4 mb-4">
<h3 class="text-lg font-semibold text-[#333333] mb-3 flex items-center">
<span class="w-2 h-2 bg-[#EB3C3C] rounded-full mr-2"></span>
法院风险概览
</h3>
<div class="grid grid-cols-2 gap-4">
<div class="text-center">
<div class="text-2xl font-bold" :class="courtRiskInfos?.length > 0 ? 'text-red-600' : 'text-green-600'">
<div class="text-2xl font-bold" :class="courtRiskInfos?.length > 0 ? 'text-[#EB3C3C]' : 'text-green-600'">
{{ courtRiskInfos?.length || 0 }}
</div>
<div class="text-sm text-gray-600">法院案件数</div>
<div class="text-sm text-[#666666]">法院案件数</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold" :class="courtRiskInfos?.length > 0 ? 'text-red-600' : 'text-green-600'">
<div class="text-2xl font-bold" :class="courtRiskInfos?.length > 0 ? 'text-[#EB3C3C]' : 'text-green-600'">
{{ courtRiskInfos?.length > 0 ? '有风险' : '无风险' }}
</div>
<div class="text-sm text-gray-600">风险状态</div>
<div class="text-sm text-[#666666]">风险状态</div>
</div>
</div>
</div>
<!-- 案件类型统计 -->
<div v-if="courtRiskInfos && courtRiskInfos.length > 0" class="mb-4">
<div class="bg-white rounded-lg border border-gray-200 p-4">
<div class="bg-white rounded-xl border border-[#DDDDDD] p-4">
<div class="flex items-center justify-between mb-3">
<div class="flex items-center">
<div class="w-8 h-8 bg-purple-500 rounded-full flex items-center justify-center mr-2">
<svg class="w-4 h-4 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3">
</path>
</svg>
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/ajlxfb.png" alt="案件类型分布" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">案件类型分布</span>
<span class="font-bold text-[#333333]">案件类型分布</span>
</div>
</div>
<!-- 案件类型统计 -->
<div class="grid grid-cols-3 md:grid-cols-6 gap-2">
<div v-for="(typeInfo, type) in caseTypeStats" :key="type" class="text-center p-2 rounded-lg border"
:class="typeInfo.count > 0 ? 'bg-red-50 border-red-200' : 'bg-green-50 border-green-200'">
<div class="text-lg mb-1">{{ getCaseTypeIcon(type) }}</div>
<div class="text-base font-bold" :class="typeInfo.count > 0 ? 'text-red-600' : 'text-green-600'">
:class="typeInfo.count > 0 ? 'bg-[#F9ECEC] border border-[#F0CACA]' : 'bg-[#ECF9EF] border border-[#CAECD3]'">
<div class="flex justify-center mb-1">
<img :src="getCaseTypeIconPath(type)" alt="" class="w-8 h-8 object-contain" />
</div>
<div class="text-base font-bold" :class="typeInfo.count > 0 ? 'text-[#EB3C3C]' : 'text-green-600'">
{{ typeInfo.count }}
</div>
<div class="text-xs text-gray-600 leading-tight">{{ getCaseTypeShortName(type) }}</div>
<div class="text-xs mt-0.5" :class="typeInfo.count > 0 ? 'text-red-600' : 'text-green-600'">
<div class="text-xs text-[#666666] leading-tight">{{ getCaseTypeShortName(type) }}</div>
<div class="text-xs mt-0.5" :class="typeInfo.count > 0 ? 'text-[#EB3C3C]' : 'text-green-600'">
{{ typeInfo.count > 0 ? '有风险' : '无风险' }}
</div>
</div>
@@ -62,13 +60,12 @@
<div v-if="courtRiskInfos && courtRiskInfos.length > 0" class="space-y-4">
<!-- 按案件类型分组显示 -->
<div v-for="(cases, caseType) in groupedCases" :key="caseType" class="case-section">
<div class="bg-white rounded-lg border border-gray-200 p-4">
<div class="bg-white rounded-xl border border-[#DDDDDD] p-4">
<div class="flex items-center mb-3">
<div class="w-6 h-6 rounded-full flex items-center justify-center mr-2"
:class="getCaseTypeHeaderStyle(caseType)">
<span class="text-white text-xs">{{ getCaseTypeIcon(caseType) }}</span>
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img :src="getCaseTypeIconPath(caseType)" alt="" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">{{ getCaseTypeName(caseType) }}</span>
<span class="font-bold text-[#333333]">{{ getCaseTypeName(caseType) }}</span>
<span class="ml-2 px-2 py-1 rounded-full text-xs font-medium" :class="getCaseTypeBadgeStyle(caseType)">
{{ cases.length }}
</span>
@@ -115,7 +112,7 @@
</div>
<div class="detail-item" v-if="caseItem.executionAmount">
<span class="label">执行金额</span>
<span class="value text-red-600 font-bold">{{ caseItem.executionAmount }}</span>
<span class="value text-[#EB3C3C] font-bold">{{ caseItem.executionAmount }}</span>
</div>
<div class="detail-item" v-if="caseItem.repaidAmount">
<span class="label">已还款金额</span>
@@ -140,10 +137,10 @@
</div>
<!-- 匹配度信息 -->
<div v-if="caseItem.matchScore" class="mt-3 p-3 bg-blue-50 rounded-lg">
<div v-if="caseItem.matchScore" class="mt-3 p-3 bg-[#EBF5FF] rounded-lg">
<div class="flex items-center justify-between">
<span class="text-sm text-gray-600">身份匹配度</span>
<span class="text-sm font-bold text-blue-600">
<span class="text-sm text-[#666666]">身份匹配度</span>
<span class="text-sm font-bold text-[#2B79EE]">
{{ (caseItem.matchScore * 100).toFixed(1) }}%
</span>
</div>
@@ -156,7 +153,7 @@
<!-- 内容摘要 -->
<div v-if="caseItem.contentSummary" class="mt-3">
<div class="text-sm text-gray-600 mb-2">案件摘要</div>
<div class="text-sm text-[#666666] mb-2">案件摘要</div>
<div class="bg-gray-50 rounded-lg p-3 border">
<p class="text-sm text-gray-700 leading-relaxed">
{{ formatContentSummary(caseItem.contentSummary) }}
@@ -166,7 +163,7 @@
<!-- 执行公告ID -->
<div v-if="caseItem.executionAnnouncementId" class="mt-3">
<div class="text-sm text-gray-600 mb-1">公告编号</div>
<div class="text-sm text-[#666666] mb-1">公告编号</div>
<div class="bg-gray-100 rounded p-2">
<span class="text-xs font-mono text-gray-700">
{{ caseItem.executionAnnouncementId }}
@@ -181,19 +178,19 @@
</div>
<!-- 高风险警告 -->
<div v-if="hasHighRiskCases" class="mt-4 p-4 bg-red-100 border border-red-300 rounded-lg">
<div v-if="hasHighRiskCases" class="mt-4 p-4 bg-[#F9ECEC] border border-[#F0CACA] rounded-lg">
<div class="flex items-start">
<div class="mr-3 mt-1">
<span class="text-xl">🚨</span>
<div class="mr-3 mt-1 flex-shrink-0">
<img src="@/assets/images/report/gfx.png" alt="高风险" class="w-10 h-10 object-contain" />
</div>
<div>
<h4 class="font-semibold text-red-800 mb-2">法院风险警告</h4>
<p class="text-red-700 text-sm">
<h4 class="font-semibold text-[#EB3C3C] mb-2">法院风险警告</h4>
<p class="text-[#666666] text-sm">
检测到法院相关案件记录存在司法风险建议立即停止相关业务并进行详细核实
</p>
<div class="mt-2">
<span class="text-red-800 font-medium">涉及案件类型</span>
<span class="text-red-700">{{ getCaseTypesList.join('、') }}</span>
<span class="text-[#666666] font-medium">涉及案件类型</span>
<span class="text-[#EB3C3C]">{{ getCaseTypesList.join('、') }}</span>
</div>
</div>
</div>
@@ -201,14 +198,14 @@
<!-- 无风险提示 -->
<div v-if="!courtRiskInfos || courtRiskInfos.length === 0"
class="mt-4 p-4 bg-green-100 border border-green-300 rounded-lg">
class="mt-4 p-4 bg-[#ECF9EF] border border-[#CAECD3] rounded-lg">
<div class="flex items-start">
<div class="mr-3 mt-1">
<span class="text-xl"></span>
<img src="@/assets/images/report/zq.png" alt="正常" class="w-8 h-8 object-contain" />
</div>
<div>
<h4 class="font-semibold text-green-800 mb-2">法院风险核验通过</h4>
<p class="text-green-700 text-sm">
<h4 class="font-semibold text-green-600 mb-2">法院风险核验通过</h4>
<p class="text-green-600 text-sm">
未检测到法院相关案件记录司法风险较低
</p>
</div>
@@ -216,9 +213,9 @@
</div>
<!-- 案件类型说明 -->
<div class="mt-4 p-4 bg-gray-50 border border-gray-200 rounded-lg">
<h4 class="font-semibold text-gray-800 mb-2">案件类型说明</h4>
<div class="text-sm text-gray-600 space-y-1">
<div class="mt-4 p-4 bg-gray-50 border border-[#DDDDDD] rounded-lg">
<h4 class="font-semibold text-[#333333] mb-2">案件类型说明</h4>
<div class="text-sm text-[#666666] space-y-1">
<div><strong>民事案件</strong>涉及财产合同等民事纠纷</div>
<div><strong>刑事案件</strong>涉及刑法规定的犯罪行为</div>
<div><strong>行政案件</strong>涉及行政管理相关纠纷</div>
@@ -354,18 +351,19 @@ const caseTypeStats = computed(() => {
return stats
})
// 获取案件类型图标
const getCaseTypeIcon = (type) => {
// 获取案件类型图标路径
const getCaseTypeIconPath = (type) => {
const iconMap = {
'民事案件': '⚖️',
'刑事案件': '🚨',
'行政案件': '🏛️',
'执行案件': '⚡',
'非诉保全审查案件': '🛡️',
'强制清算与破产案件': '💼',
'default': '📄'
'民事案件': () => new URL('@/assets/images/report/ms.png', import.meta.url).href,
'刑事案件': () => new URL('@/assets/images/report/xs.png', import.meta.url).href,
'行政案件': () => new URL('@/assets/images/report/xz.png', import.meta.url).href,
'执行案件': () => new URL('@/assets/images/report/zxaj.png', import.meta.url).href,
'非诉保全审查案件': () => new URL('@/assets/images/report/fsbq.png', import.meta.url).href,
'强制清算与破产案件': () => new URL('@/assets/images/report/qspc.png', import.meta.url).href,
'default': () => new URL('@/assets/images/report/zxaj.png', import.meta.url).href
}
return iconMap[type] || iconMap.default
const getIcon = iconMap[type] || iconMap.default
return getIcon()
}
// 获取案件类型名称
@@ -397,27 +395,27 @@ const getCaseTypeShortName = (type) => {
// 获取案件类型头部样式
const getCaseTypeHeaderStyle = (caseType) => {
const styleMap = {
'民事案件': 'bg-blue-500',
'刑事案件': 'bg-red-500',
'行政案件': 'bg-purple-500',
'执行案件': 'bg-orange-500',
'民事案件': 'bg-[#2B79EE]',
'刑事案件': 'bg-[#EB3C3C]',
'行政案件': 'bg-[#2B79EE]',
'执行案件': 'bg-[#D6943E]',
'非诉保全审查案件': 'bg-green-500',
'强制清算与破产案件': 'bg-gray-500'
'强制清算与破产案件': 'bg-[#666666]'
}
return styleMap[caseType] || 'bg-gray-500'
return styleMap[caseType] || 'bg-[#666666]'
}
// 获取案件类型标签样式
const getCaseTypeBadgeStyle = (caseType) => {
const styleMap = {
'民事案件': 'bg-blue-100 text-blue-700',
'刑事案件': 'bg-red-100 text-red-700',
'行政案件': 'bg-purple-100 text-purple-700',
'执行案件': 'bg-orange-100 text-orange-700',
'非诉保全审查案件': 'bg-green-100 text-green-700',
'强制清算与破产案件': 'bg-gray-100 text-gray-700'
'民事案件': 'bg-[#2B79EE1A] text-[#2B79EE]',
'刑事案件': 'bg-[#F9ECEC] text-[#EB3C3C]',
'行政案件': 'bg-[#EBF5FF] text-[#2B79EE]',
'执行案件': 'bg-[#FFF8E1] text-[#D6943E]',
'非诉保全审查案件': 'bg-[#ECF9EF] text-green-600',
'强制清算与破产案件': 'bg-gray-100 text-[#666666]'
}
return styleMap[caseType] || 'bg-gray-100 text-gray-700'
return styleMap[caseType] || 'bg-gray-100 text-[#666666]'
}
// 获取案件项样式
@@ -431,32 +429,32 @@ const getCaseItemClass = (caseItem) => {
// 获取案件状态样式
const getCaseStatusClass = (status) => {
if (status === '已结案') return 'text-green-600 bg-green-100'
if (status === '执行中') return 'text-orange-600 bg-orange-100'
if (status === '未执行') return 'text-red-600 bg-red-100'
if (status === '审理中') return 'text-blue-600 bg-blue-100'
if (status === '失信中') return 'text-red-600 bg-red-100'
if (status === '限高中') return 'text-purple-600 bg-purple-100'
return 'text-gray-600 bg-gray-100'
if (status === '执行中') return 'text-[#D6943E] bg-[#FFF8E1]'
if (status === '未执行') return 'text-[#EB3C3C] bg-[#F9ECEC]'
if (status === '审理中') return 'text-[#2B79EE] bg-[#EBF5FF]'
if (status === '失信中') return 'text-[#EB3C3C] bg-[#F9ECEC]'
if (status === '限高中') return 'text-[#2B79EE] bg-[#EBF5FF]'
return 'text-[#666666] bg-gray-100'
}
// 获取案件状态文字样式
const getCaseStatusTextClass = (status) => {
if (status === '已结案') return 'text-green-600'
if (status === '执行中') return 'text-orange-600'
if (status === '未执行') return 'text-red-600'
if (status === '审理中') return 'text-blue-600'
if (status === '失信中') return 'text-red-600'
if (status === '限高中') return 'text-purple-600'
return 'text-gray-600'
if (status === '执行中') return 'text-[#D6943E]'
if (status === '未执行') return 'text-[#EB3C3C]'
if (status === '审理中') return 'text-[#2B79EE]'
if (status === '失信中') return 'text-[#EB3C3C]'
if (status === '限高中') return 'text-[#2B79EE]'
return 'text-[#666666]'
}
// 获取匹配度进度条样式
const getMatchScoreBarStyle = (score) => {
if (score >= 0.9) return 'bg-green-500'
if (score >= 0.8) return 'bg-blue-500'
if (score >= 0.8) return 'bg-[#2B79EE]'
if (score >= 0.7) return 'bg-yellow-500'
if (score >= 0.6) return 'bg-orange-500'
return 'bg-red-500'
if (score >= 0.6) return 'bg-[#D6943E]'
return 'bg-[#EB3C3C]'
}
// 格式化内容摘要
@@ -512,7 +510,7 @@ watch(() => props.data, (newData) => {
.case-number {
font-weight: 600;
color: #374151;
color: #333333;
font-size: 14px;
}
@@ -534,13 +532,13 @@ watch(() => props.data, (newData) => {
padding: 4px 0;
.label {
color: #6b7280;
color: #666666;
font-size: 13px;
font-weight: 500;
}
.value {
color: #374151;
color: #333333;
font-size: 13px;
font-weight: 400;
text-align: right;
@@ -557,22 +555,22 @@ watch(() => props.data, (newData) => {
overflow: hidden;
&.case-item-settled {
border: 1px solid #d1fae5;
background-color: #f0fdf4;
}
&.case-item-executing {
border: 1px solid #fed7aa;
background-color: #fff7ed;
}
&.case-item-hearing {
border: 1px solid #dbeafe;
background-color: #eff6ff;
border: 1px solid #CAECD3;
background-color: #FBFDFC;
}
&.case-item-executing {
border: 1px solid #FFE082;
background-color: #FFFDF9;
}
&.case-item-hearing {
border: 1px solid #EBF5FF;
background-color: #FAFDFF;
}
&.case-item-default {
border: 1px solid #e5e7eb;
border: 1px solid #DDDDDD;
background-color: #f9fafb;
}
}

View File

@@ -4,7 +4,7 @@
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="授信详情" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/sxxq.png" alt="授信详情" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">授信详情</span>
</div>

View File

@@ -4,7 +4,7 @@
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="近24个月放款情况" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/j24gyfkqk.png" alt="近24个月放款情况" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">近24个月放款情况</span>
</div>
@@ -374,13 +374,14 @@ const timeBarChartOption = computed(() => {
type: 'bar',
data: data,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#a03434',
color: '#5d7eeb',
borderRadius: [4, 4, 0, 0]
},
emphasis: {
itemStyle: {
color: '#c04242'
color: '#7dd3fc'
}
}
}
@@ -480,13 +481,14 @@ const amountBarChartOption = computed(() => {
type: 'bar',
data: amountData,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#a03434',
color: '#5d7eeb',
borderRadius: [4, 4, 0, 0]
},
emphasis: {
itemStyle: {
color: '#c04242'
color: '#7dd3fc'
}
}
}

View File

@@ -4,7 +4,7 @@
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="历史逾期记录" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/yqfx.png" alt="历史逾期记录" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">历史逾期记录</span>
</div>
@@ -54,7 +54,7 @@
<!-- 数据表格 -->
<div class="mb-4 mt-4 border border-gray-200 rounded-lg overflow-hidden mx-4">
<!-- 表头 -->
<div class="bg-[#922D2A] text-white">
<div class="bg-[#5d7eeb] text-white">
<div class="grid grid-cols-4 text-sm">
<div class="py-3 px-4 text-left font-semibold border-r border-white whitespace-nowrap">时间段</div>
<div class="py-3 px-4 text-center font-semibold border-r border-white whitespace-nowrap">M0+笔数</div>
@@ -390,6 +390,7 @@ const overdueCountBarChartOption = computed(() => {
type: 'bar',
data: m0Data,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#2B79EE',
borderRadius: [4, 4, 0, 0]
@@ -405,6 +406,7 @@ const overdueCountBarChartOption = computed(() => {
type: 'bar',
data: m1Data,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#61D2F4',
borderRadius: [4, 4, 0, 0]
@@ -486,13 +488,14 @@ const overdueAmountBarChartOption = computed(() => {
type: 'bar',
data: amountData,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#a03434',
color: '#5d7eeb',
borderRadius: [4, 4, 0, 0]
},
emphasis: {
itemStyle: {
color: '#c04242'
color: '#7dd3fc'
}
}
}

View File

@@ -4,7 +4,7 @@
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="履约情况" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/lyqk.png" alt="履约情况" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">履约情况</span>
</div>
@@ -339,13 +339,14 @@ const performanceBarChartOption = computed(() => {
type: 'bar',
data: data,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#a03434',
color: '#5d7eeb',
borderRadius: [4, 4, 0, 0]
},
emphasis: {
itemStyle: {
color: '#c04242'
color: '#7dd3fc'
}
}
}
@@ -411,13 +412,14 @@ const exceptionBarChartOption = computed(() => {
type: 'bar',
data: data,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#a03434',
color: '#5d7eeb',
borderRadius: [4, 4, 0, 0]
},
emphasis: {
itemStyle: {
color: '#c04242'
color: '#7dd3fc'
}
}
}

View File

@@ -4,7 +4,7 @@
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="租赁行为" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/zlxw.png" alt="租赁行为" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">租赁行为</span>
</div>
@@ -577,6 +577,7 @@ const timeDistributionChartOption = computed(() => {
type: 'bar',
data: countData,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#2B79EE',
borderRadius: [4, 4, 0, 0]
@@ -592,6 +593,7 @@ const timeDistributionChartOption = computed(() => {
type: 'bar',
data: institutionData,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#61D2F4',
borderRadius: [4, 4, 0, 0]
@@ -691,6 +693,7 @@ const specialTimeChartOption = computed(() => {
type: 'bar',
data: weekendData,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#2B79EE',
borderRadius: [4, 4, 0, 0]
@@ -706,6 +709,7 @@ const specialTimeChartOption = computed(() => {
type: 'bar',
data: nightData,
barWidth: '25%',
barMinHeight: 3,
itemStyle: {
color: '#61D2F4',
borderRadius: [4, 4, 0, 0]

View File

@@ -3,7 +3,7 @@
<div class="rounded-lg border border-gray-200 pb-4 mb-4">
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img :src="getTitleIcon()" alt="风险名单" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/fxmd.png" alt="风险名单" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">风险名单</span>
</div>

View File

@@ -3,7 +3,7 @@
<div class="rounded-lg border border-gray-200 pb-4 mb-4">
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="命中风险标注" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/mzfxbz.png" alt="命中风险标注" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">命中风险标注</span>
</div>

View File

@@ -4,7 +4,7 @@
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="关联风险监督" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/glfxjd2.png" alt="关联风险监督" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">关联风险监督</span>
</div>

View File

@@ -3,7 +3,7 @@
<div class="rounded-lg border border-gray-200 pb-4 mb-4">
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img :src="getTitleIcon()" alt="公安重点人员核验" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/glzdryhy2.png" alt="公安重点人员核验" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">公安重点人员核验</span>
</div>

View File

@@ -3,7 +3,7 @@
<div class="rounded-lg border border-gray-200 pb-2 mb-4">
<div class="flex items-center p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="身份信息核验" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/sfxxhy.png" alt="身份信息核验" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">身份信息核验</span>
</div>

View File

@@ -5,7 +5,7 @@
<!-- 标题区域 -->
<div class="flex items-center mb-4 p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="收入评估" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/srpg.png" alt="收入评估" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">收入评估</span>
</div>
@@ -461,7 +461,7 @@ defineExpose({
.indicator-marker {
position: absolute;
top: -24px;
top: -26px;
transform: translateX(-50%);
display: flex;
flex-direction: column;
@@ -469,7 +469,7 @@ defineExpose({
}
.marker-image {
width: 16px;
width: 24px;
margin-bottom: 0px;
}

View File

@@ -2,7 +2,7 @@
<div class="institution-status-section bg-white rounded-lg border border-gray-200">
<div class="flex items-center p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="机构状态信息" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/jgztxx.png" alt="机构状态信息" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">机构状态信息</span>
</div>

View File

@@ -2,7 +2,7 @@
<div class="probe-overview bg-white rounded-lg border border-gray-200">
<div class="flex items-center p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="逾期信息详情" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/yqxxxq.png" alt="逾期信息详情" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">逾期信息详情</span>
</div>

View File

@@ -2,9 +2,9 @@
<div class="performance-info-section bg-white rounded-lg border border-gray-200">
<div class="flex items-center p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="逾期信息详情" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/lyxxxq.png" alt="履约信息详情" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">逾期信息详情</span>
<span class="font-bold text-gray-800">履约信息详情</span>
</div>
<div class="">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 p-4">

View File

@@ -2,7 +2,7 @@
<div class="probe-overview bg-white rounded-lg border border-gray-200">
<div class="flex items-center p-4">
<div class="w-8 h-8 flex items-center justify-center mr-2">
<img src="@/assets/images/report/qsgg.png" alt="欠税公告" class="w-8 h-8 object-contain" />
<img src="@/assets/images/report/gl.png" alt="概览" class="w-8 h-8 object-contain" />
</div>
<span class="font-bold text-gray-800">概览</span>
</div>