Files
report_viewer/src/components/BaseReport.vue
2026-05-15 10:45:00 +08:00

1035 lines
47 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup>
import ShareReportButton from "./ShareReportButton.vue";
import TitleBanner from "./TitleBanner.vue";
import VerificationCard from "./VerificationCard.vue";
import StyledTabs from "./StyledTabs.vue";
import { splitDWBG8B4DForTabs } from '@/ui/CDWBG8B4D/utils/simpleSplitter.js';
import { splitDWBG6A2CForTabs } from '@/ui/DWBG6A2C/utils/simpleSplitter.js';
import { splitCQYGL3F8EForTabs } from '@/ui/CQYGL3F8E/utils/simpleSplitter.js';
const props = defineProps({
isShare: {
type: Boolean,
default: false,
},
orderId: {
type: String,
required: false,
default: "",
},
orderNo: {
type: String,
default: "",
},
feature: {
type: String,
required: true,
},
reportData: {
type: Array,
required: true,
},
reportParams: {
type: Object,
required: true,
},
reportName: {
type: String,
required: true,
},
reportDateTime: {
type: [String, null],
required: false,
default: null,
},
isEmpty: {
type: Boolean,
required: true,
},
isDone: {
type: Boolean,
required: true,
},
isExample: {
type: Boolean,
default: false,
},
});
// 使用toRefs将props转换为组件内的ref
const {
feature,
reportData,
reportParams,
reportName,
reportDateTime,
isEmpty,
isDone,
isExample,
} = toRefs(props);
const active = ref(null);
const reportScore = ref(0); // 默认分数
const trapezoidBgImage = ref(''); // 牌匾背景图片
// 动态加载牌匾背景图片
const loadTrapezoidBackground = async () => {
try {
const bgModule = await import("@/assets/images/report/title_inquire_bg.png");
trapezoidBgImage.value = bgModule.default;
} catch (error) {
console.warn(`Failed to load trapezoid background image:`, error);
}
};
// 在组件挂载时加载牌匾背景图
onMounted(async () => {
await loadTrapezoidBackground();
});
const trapezoidBgStyle = computed(() => {
if (trapezoidBgImage.value) {
return {
backgroundImage: `url(${trapezoidBgImage.value})`,
};
}
return {};
});
const featureMap = {
// 司南报告
DWBG6A2C: {
name: "司南报告",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/index.vue")),
remark: '司南报告提供全面的个人信用风险评估,包括身份核验、风险名单、借贷行为、履约情况等多维度分析。'
},
// 司南报告拆分模块
DWBG6A2C_StandLiveInfo: {
name: "身份信息核验",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/StandLiveInfoSection.vue")),
},
DWBG6A2C_RiskPoint: {
name: "命中风险标注",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskPointSection.vue")),
},
DWBG6A2C_SecurityInfo: {
name: "公安重点人员核验",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/SecurityInfoSection.vue")),
},
DWBG6A2C_AntiFraudInfo: {
name: "涉赌涉诈人员核验",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/AntiFraudInfoSection.vue")),
},
DWBG6A2C_RiskList: {
name: "风险名单",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskListSection.vue")),
},
DWBG6A2C_ApplicationStatistics: {
name: "历史借贷行为",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/ApplicationStatisticsSection.vue")),
},
DWBG6A2C_LendingStatistics: {
name: "近24个月放款情况",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/LendingStatisticsSection.vue")),
},
DWBG6A2C_PerformanceStatistics: {
name: "履约情况",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/PerformanceStatisticsSection.vue")),
},
DWBG6A2C_OverdueRecord: {
name: "历史逾期记录",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/OverdueRecordSection.vue")),
},
DWBG6A2C_CreditDetail: {
name: "授信详情",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CreditDetailSection.vue")),
},
DWBG6A2C_RentalBehavior: {
name: "租赁行为",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RentalBehaviorSection.vue")),
},
DWBG6A2C_RiskSupervision: {
name: "关联风险监督",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskSupervisionSection.vue")),
},
DWBG6A2C_CourtRiskInfo:{
name:"法院风险信息",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")),
},
// 司法涉诉
FLXG0V4B: {
name: "司法涉诉",
component: defineAsyncComponent(() =>
import("@/ui/CFLXG0V4B/index.vue")
),
},
// 法院被执行人高级版
FLXGK5D2: {
name: "法院被执行人高级版",
component: defineAsyncComponent(() =>
import("@/ui/FLXGK5D2/index.vue")
),
remark: '法院被执行人高级版展示申请人作为失信被执行人或限高被执行人的详细情况。数据来源于法院公开信息,包括案号、执行法院、立案时间及风险信号描述等。'
},
// 个人涉诉
FLXG7E8F: {
name: "个人涉诉",
component: defineAsyncComponent(() =>
import("@/ui/FLXG7E8F/index.vue")
),
remark: '个人涉诉风险展示申请人相关的诉讼情况,包括民事诉讼、刑事诉讼、行政诉讼、执行案件、失信被执行人、限制消费等。数据来源于各级法院的公开判决书和法官网等权威渠道。'
},
// 人企关系加强版
QYGL3F8E: {
name: "人企关系加强版",
component: defineAsyncComponent(() =>
import("@/ui/CQYGL3F8E/index.vue")
),
remark: '人企关系加强版提供全面的企业关联分析,包括投资企业记录、高管任职记录和涉诉风险等多维度信息。'
},
// 人企关系加强版拆分模块
CQYGL3F8E_Investment: {
name: "投资企业记录",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/Investment.vue")),
},
CQYGL3F8E_SeniorExecutive: {
name: "高管任职记录",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/SeniorExecutive.vue")),
},
CQYGL3F8E_Lawsuit: {
name: "涉诉风险",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/Lawsuit.vue")),
},
CQYGL3F8E_InvestHistory: {
name: "对外投资历史",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/InvestHistory.vue")),
},
CQYGL3F8E_FinancingHistory: {
name: "融资历史",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/FinancingHistory.vue")),
},
CQYGL3F8E_Punishment: {
name: "行政处罚",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/Punishment.vue")),
},
CQYGL3F8E_Abnormal: {
name: "经营异常",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/Abnormal.vue")),
},
CQYGL3F8E_TaxRisk: {
name: "税务风险",
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/TaxRisk/index.vue")),
},
// 信贷表现
JRZQ4B6C: {
name: "信贷表现",
component: defineAsyncComponent(() => import("@/ui/JRZQ4B6C/index.vue")),
remark: '信贷表现主要为企业在背景调查过程中探查用户近期信贷表现时提供参考,帮助企业对其内部员工、外部业务进行个人信用过滤。数据来源于多个征信机构,可能存在数据延迟或不完整的情况。'
},
// 收入评估
JRZQ09J8: {
name: "收入评估",
component: defineAsyncComponent(() => import("@/ui/JRZQ09J8/index.vue")),
remark: '基于全国社会保险信息系统的缴费基数数据进行收入水平评估。评级反映相对收入水平,实际收入可能因地区差异而有所不同,建议结合其他收入证明材料进行综合评估。'
},
// 个人消费能力等级
JRZQ8B3C: {
name: "个人消费能力等级",
component: defineAsyncComponent(() => import("@/ui/JRZQ8B3C/index.vue")),
remark: '基于个人收入指数进行消费能力等级评估,展示用户的月消费能力范围。消费能力等级反映用户的消费水平,等级越高对应的月消费能力越强。数据来源于个人收入指数评分,实际消费能力可能因个人消费习惯、地区差异等因素而有所不同,建议结合其他消费行为数据进行综合评估。'
},
// 名下车辆详细版
QCXG9P1C: {
name: "名下车辆",
component: defineAsyncComponent(() => import("@/ui/CQCXG9P1C.vue")),
},
// 网络社交异常
IVYZ8I9J: {
name: "网络社交异常",
component: defineAsyncComponent(() => import("@/ui/IVYZ8I9J.vue")),
remark: '网络社交异常通过分析用户在互联网上的行为特征,检测资料包装中介、异常行业、虚假资料、羊毛党、身份信息存疑、严重异常行为、失信行为、支付异常行为、其他异常行为和上网环境异常等多维度风险。'
},
// 多头借贷行业风险版
DWBG7F3A: {
name: "多头借贷行业风险版",
component: defineAsyncComponent(() => import("@/ui/DWBG7F3A/index.vue")),
remark: '多头借贷行业风险版提供全面的多头借贷风险评估,包括多头共债子分、多头申请、多头逾期、圈团风险和可疑欺诈风险等多维度分析。'
},
JRZQ5E9F: {
name: "贷款风险评估",
component: defineAsyncComponent(() => import("@/ui/CJRZQ5E9F/index.vue")),
remark: '贷款风险评估提供全面的个人贷款风险分析,包括风险概览、信用评分、贷款行为分析、机构分析等多维度评估。'
},
FLXG3D56: {
name: "违约失信",
component: defineAsyncComponent(() => import("@/ui/CFLXG3D56.vue")),
remark: '违约失信用于检测个人在法院失信、银行风险、非银机构风险等多个维度的不良记录,包括法院失信被执行人、银行不良记录、非银机构逾期、失联等各类风险名单。'
},
FLXGDEA9: {
name: "本人不良",
component: defineAsyncComponent(() => import("@/ui/CFLXGDEA9.vue")),
remark: '本人不良记录查询结果来源于公安部门等权威机构,包括各类违法犯罪前科记录。查询结果仅供参考,具体信息以相关部门官方记录为准。'
},
IVYZ81NC:{
name: "婚姻状态",
component: defineAsyncComponent(() => import("@/ui/CIVYZ81NC.vue")),
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异。如您对查询结果有疑问,请联系客服反馈。',
},
IVYZ5733:{
name: "婚姻状态",
component: defineAsyncComponent(() => import("@/ui/CIVYZ5733.vue")),
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异。如您对查询结果有疑问,请联系客服反馈。',
},
JRZQ0A03:{
name: "借贷申请记录",
component: defineAsyncComponent(() => import("@/ui/CJRZQ0A03.vue")),
remark: '借贷申请记录通过分析用户在不同时间段的借贷申请行为、机构类型分布、申请频率等数据,评估用户的借贷意向强度和风险特征,帮助识别潜在的过度借贷风险。'
},
JRZQ4AA8:{
name: "偿债压力指数",
component: defineAsyncComponent(() => import("@/ui/CJRZQ4AA8.vue")),
remark: '偿债压力指数通过分析用户的债务规模、还款能力、收入水平等因素,计算并评估用户的偿债压力等级,帮助金融机构评估用户的还款能力和违约风险。'
},
JRZQ8203:{
name: "借贷行为记录",
component: defineAsyncComponent(() => import("@/ui/CJRZQ8203.vue")),
remark: '借贷行为记录通过分析用户的借款行为、还款行为、时间趋势等多维度数据,全面评估用户的借贷行为特征和信用表现,帮助识别异常借贷模式和潜在风险。'
},
QCXG7A2B:{
name: "名下车辆",
component: defineAsyncComponent(() => import("@/ui/CQCXG7A2B.vue")),
remark: '名下车辆查询结果来源于车辆管理部门等权威机构,包括各类车辆登记记录。查询结果仅供参考,具体信息以相关部门官方记录为准。'
},
IVYZ3P9M: {
name: "学历信息",
component: defineAsyncComponent(() => import("@/ui/IVYZ3P9M.vue")),
remark: '学历信息展示学生姓名、身份证号、学校、专业、入学与毕业时间、学历层次以及学习形式等字段,可结合字典编码了解具体含义。',
},
// 特殊名单验证B
JRZQ8A2D: {
name: "特殊名单验证",
component: defineAsyncComponent(() => import("@/ui/JRZQ8A2D.vue")),
remark: '特殊名单验证用于验证个人在各类金融机构和法院系统的信用状况,包括法院失信、银行风险、非银机构风险等多个维度。'
},
// 全景雷达
JRZQ7F1A: {
name: "全景雷达",
component: defineAsyncComponent(() => import("@/ui/JRZQ7F1A/index.vue")),
remark: '全景雷达提供全面的信用评估,包括申请行为详情、放款还款详情和信用详情。通过多维度的数据分析,全面展示申请人的信用状况和借贷行为。'
},
// 借贷意向验证A
JRZQ6F2A: {
name: "借贷意向验证",
component: defineAsyncComponent(() => import("@/ui/JRZQ6F2A/index.vue")),
remark: '借贷意向验证提供全面的借贷申请行为分析,包括申请次数、申请总次数(银行+非银)和申请机构总数(银行+非银)等多维度数据。通过不同时间段的统计分析,全面展示申请人的借贷申请行为。'
},
// 支付行为指数
JRZQ3C9R: {
name: "支付行为指数",
component: defineAsyncComponent(() => import("@/ui/JRZQ3C9R/index.vue")),
remark: '支付行为指数基于近两年的查验记录、还款成功与失败表现以及余额不足情况,对用户支付与还款习惯进行量化评分,用于评估其支付稳定性与违约风险。'
},
// 手机携号转网
YYSY7D3E: {
name: "手机携号转网",
component: defineAsyncComponent(() => import("@/ui/YYSY7D3E/index.vue")),
remark: '手机携号转网查询用于检测用户手机号码是否发生过携号转网操作,以及转网前后的运营商信息。携号转网可能影响用户身份验证和信用评估。'
},
// 手机在网时长
YYSY8B1C: {
name: "手机在网时长",
component: defineAsyncComponent(() => import("@/ui/YYSY8B1C/index.vue")),
remark: '手机在网时长查询用于检测用户手机号码的在网使用时长。在网时长越长,通常表示用户身份越稳定,信用风险越低。需要注意的是,如果手机号码存在携号转网的情况,那么在网时长会从转网的时候重新计算,转网前的在网时长不计入当前在网时长。建议结合手机携号转网查询结果进行综合评估。'
},
IVYZ0S0D:{
name: "劳动仲裁信息查询(个人版)",
component: defineAsyncComponent(() => import("@/ui/CIVYZ0S0D.vue")),
remark: '劳动仲裁信息查询(个人版)用于查询个人在劳动仲裁方面的信息,包括劳动仲裁案件数量、劳动仲裁案件类型、劳动仲裁案件结果等。',
},
// 谛听多维报告
DWBG8B4D: {
name: "谛听多维报告",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/index.vue")),
},
// 谛听多维报告拆分模块
DWBG8B4D_Overview: {
name: "报告概览",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/ReportOverview.vue")),
},
DWBG8B4D_ElementVerification: {
name: "要素核查",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/ElementVerification.vue")),
},
DWBG8B4D_Identity: {
name: "运营商核验",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/Identity.vue")),
},
DWBG8B4D_RiskWarning: {
name: "公安重点人员检验",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/RiskWarning.vue")),
},
DWBG8B4D_OverdueRisk: {
name: "逾期风险综述",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/OverdueRiskSection.vue")),
},
DWBG8B4D_LoanEvaluation: {
name: "借贷评估",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/LoanEvaluationSection.vue")),
},
DWBG8B4D_LeasingRisk: {
name: "租赁风险评估",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/LeasingRiskSection.vue")),
},
DWBG8B4D_RiskSupervision: {
name: "关联风险监督",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/RiskSupervisionSection.vue")),
},
DWBG8B4D_RiskWarningTab: {
name: "规则风险提示",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/RiskWarningTab.vue")),
},
// DWBG3B4DCourtInfo:{
// name: "规则风险提示",
// component: defineAsyncComponent(() => import("@/ui/cDwBG8B4D/components/MultcourtInfosection.vue")),
// }
// 法院被执行人限高版
CFLX3A9B: {
name: "法院被执行人限高版",
component: defineAsyncComponent(() => import("@/ui/CFLX3A9B.vue")),
remark: '法院被执行人限高版用于查询个人在法院的被执行人信息,包括被执行人数量、被执行人类型、被执行人结果等。',
},
CIVYZ6M8P: {
name: "职业资格证书查询",
component: defineAsyncComponent(() => import("@/ui/CIVYZ6M8P.vue")),
remark: '职业资格证书查询展示查询到的职业资格考试名称、级别、专业及通过日期等信息。查询结果来源于相关职业技能鉴定机构,仅供参考。',
},
CIVYZ7F3A: {
name: "学历信息查询B",
component: defineAsyncComponent(() => import("@/ui/CIVYZ7F3A.vue")),
remark: '学历信息查询B展示学生毕业院校排名、专业、学历层次、学习形式、毕业时间、学校属性985/211/双一流)等多维度学历信息。查询结果来源于教育部门等权威机构,仅供参考。',
},
CIVYZ9K7F: {
name: "公安二要素认证即时版",
component: defineAsyncComponent(() => import("@/ui/CIVYZ9K7F.vue")),
remark: '公安二要素认证即时版用于核验姓名与身份证号是否一致,同时返回涉诈风险评估等级。查询结果来源于公安部门等权威机构,仅供参考。',
},
CIVYZA1B3: {
name: "公安三要素即时版",
component: defineAsyncComponent(() => import("@/ui/CIVYZA1B3.vue")),
remark: '公安三要素即时版通过比对人像与身份证信息判断是否为同一人,返回相似度分值及个人基本信息。查询结果来源于公安部门等权威机构,仅供参考。',
},
CJRZQ0B6Y: {
name: "银行卡黑名单(实时)",
component: defineAsyncComponent(() => import("@/ui/CJRZQ0B6Y.vue")),
remark: '银行卡黑名单(实时)查询银行卡是否命中不良持卡人、涉案卡片、交易欺诈卡片、线上/线下卡号黑名单等各类风险名单。查询结果仅供参考,具体信息以相关机构官方记录为准。',
},
CJRZQACAB: {
name: "银行卡四要素验证(详版)",
component: defineAsyncComponent(() => import("@/ui/CJRZQACAB.vue")),
remark: '银行卡四要素验证(详版)核验姓名、身份证号、银行卡号与预留手机号是否匹配,返回详细的验证状态说明。',
},
CQCXG1H7Y: {
name: "车辆过户简版查询",
component: defineAsyncComponent(() => import("@/ui/CQCXG1H7Y.vue")),
remark: '车辆过户简版查询用于查看车辆最近是否发生过户及累计过户次数,数据来源于车辆管理部门等权威机构,仅供参考。',
},
CQCXG1U4U: {
name: "车辆里程记录(混合查询)",
component: defineAsyncComponent(() => import("@/ui/CQCXG1U4U.vue")),
remark: '车辆里程记录(混合查询)综合诊断与维保记录,展示车辆里程变化与是否存在调表嫌疑,数据来源于车辆维保及检测机构,仅供参考。',
},
CQCXG3Y6B: {
name: "车辆维保简版查询",
component: defineAsyncComponent(() => import("@/ui/CQCXG3Y6B.vue")),
remark: '车辆维保简版查询按时间轴展示维保记录,包含保养与更换材料明细,数据来源于车辆维保机构,仅供参考。',
},
CQCXG3Z3L: {
name: "车辆维保详细版查询",
component: defineAsyncComponent(() => import("@/ui/CQCXG3Z3L.vue")),
remark: '车辆维保详细版查询展示品牌、车架号等基本信息及每次维保的详细内容,数据来源于车辆维保机构,仅供参考。',
},
CQCXG4D2E: {
name: "名下车辆数量查询",
component: defineAsyncComponent(() => import("@/ui/CQCXG4D2E.vue")),
remark: '名下车辆数量查询展示查询对象名下登记的车辆数量及车牌、车牌颜色、车辆类型等基本信息,数据来源于车辆管理部门等权威机构,仅供参考。',
},
CQCXG4I1Z: {
name: "车辆过户详版查询",
component: defineAsyncComponent(() => import("@/ui/CQCXG4I1Z.vue")),
remark: '车辆过户详版查询按时间轴展示每一次车辆过户的车牌与地区变更情况,数据来源于车辆管理部门等权威机构,仅供参考。',
},
CQCXG5U0Z: {
name: "车辆静态信息查询",
component: defineAsyncComponent(() => import("@/ui/CQCXG5U0Z.vue")),
remark: '车辆静态信息查询展示车辆生产日期、排放标准、燃料类型、发动机型号、生产企业名称等核心静态信息,数据来源于车辆管理部门等权威机构,仅供参考。',
},
CQCXG6B4E: {
name: "车辆出险记录核验",
component: defineAsyncComponent(() => import("@/ui/CQCXG6B4E.vue")),
remark: '车辆出险记录核验综合车辆出险、脱保、重大事故等信息评估风险等级,并给出二手车价格参考,数据来源于保险行业信息平台,仅供参考。',
},
CQCXGGB2Q: {
name: "车辆二要素核验V1",
component: defineAsyncComponent(() => import("@/ui/CQCXGGB2Q.vue")),
remark: '车辆二要素核验V1用于校验人员姓名与车辆号牌是否匹配数据来源于车辆管理部门等权威机构仅供参考。',
},
CQCXGP00W: {
name: "车辆出险详版查询",
component: defineAsyncComponent(() => import("@/ui/CQCXGP00W.vue")),
remark: '车辆出险详版查询展示多维出险记录、碰撞部位、车辆配件类别及车况信息,辅助评估车辆风险,数据来源于保险行业信息平台,仅供参考。',
},
CQCXGY7F2: {
name: "二手车VIN估值",
component: defineAsyncComponent(() => import("@/ui/CQCXGY7F2.vue")),
remark: '二手车VIN估值基于车型、排量、排放标准等信息给出参考估值实际价格以市场为准仅供参考。',
},
CQCXGYTS2: {
name: "车辆二要素核验V2",
component: defineAsyncComponent(() => import("@/ui/CQCXGYTS2.vue")),
remark: '车辆二要素核验V2展示人员与车辆的详细匹配结果及相关说明数据来源于车辆管理部门等权威机构仅供参考。',
},
CQVehicleGeneric: {
name: "车辆通用查询",
component: defineAsyncComponent(() => import("@/ui/CQVehicleGeneric.vue")),
remark: '车辆通用查询用于展示各类车辆相关接口的原始返回数据,便于调试和查看。',
},
CQYGL2S0W: {
name: "失信被执行人(企业,个人)",
component: defineAsyncComponent(() => import("@/ui/CQYGL2S0W.vue")),
remark: '失信被执行人查询用于识别个人或企业的严重违约风险,展示命中最高法院公布的失信被执行人信息,数据来源于法院公开信息,仅供参考。',
},
CQYGL5F6A: {
name: "名下企业关联",
component: defineAsyncComponent(() => import("@/ui/CQYGL5F6A.vue")),
remark: '名下企业关联展示查询对象作为法人、股东或高管关联的企业信息,包括企业状态、成立日期、注册资本、行业等多维度数据,仅供参考。',
},
CQYGL66SL: {
name: "全国企业司法模型服务查询新详版",
component: defineAsyncComponent(() => import("@/ui/CQYGL66SL.vue")),
remark: '全国企业司法模型服务查询新详版展示企业在全国法院公开信息中的民事、刑事、行政、执行、破产、保全等多类司法案件情况,数据来源于法院公开信息,仅供参考。',
},
CYYSY3M8S: {
name: "运营商二要素V即时版",
component: defineAsyncComponent(() => import("@/ui/CYYSY3M8S.vue")),
remark: '运营商二要素V即时版用于核验手机号与姓名是否一致返回核验结果及计费状态数据来源于运营商系统仅供参考。',
},
CYYSY6F2B: {
name: "手机消费区间验证",
component: defineAsyncComponent(() => import("@/ui/CYYSY6F2B.vue")),
remark: '手机消费区间验证根据运营商数据评估消费能力档位,同时展示运营商及携号转网信息,数据来源于运营商系统,仅供参考。',
},
CYYSY9E4A: {
name: "天远手机号码归属地核验A",
component: defineAsyncComponent(() => import("@/ui/CYYSY9E4A.vue")),
remark: '天远手机号码归属地核验A展示手机号码的省市、运营商、区号及邮编等归属信息数据来源于运营商系统仅供参考。',
},
CYYSYE7V5: {
name: "手机在网状态V即时版",
component: defineAsyncComponent(() => import("@/ui/CYYSYE7V5.vue")),
remark: '手机在网状态V即时版用于判断号码当前是否在网可用返回在网状态及运营商信息数据来源于运营商系统仅供参考。',
},
CYYSYF2T7: {
name: "号码二次放号V即时版",
component: defineAsyncComponent(() => import("@/ui/CYYSYF2T7.vue")),
remark: '号码二次放号V即时版用于判断该手机号是否为二次放号返回核验结果及运营商信息数据来源于运营商系统仅供参考。',
},
CYYSYK8R3: {
name: "手机空号检测V即时版",
component: defineAsyncComponent(() => import("@/ui/CYYSYK8R3.vue")),
remark: '手机空号检测V即时版用于判断号码是空号、实号还是沉默号或风险号返回号码状态及归属地信息数据来源于运营商系统仅供参考。',
},
CYYSYK9R4: {
name: "全网手机三要素验证",
component: defineAsyncComponent(() => import("@/ui/CYYSYK9R4.vue")),
remark: '全网手机三要素验证用于核验手机号、身份证号与姓名是否一致,返回验证结果,数据来源于运营商系统,仅供参考。',
},
CYYSYP0T4: {
name: "手机号码在网时长V即时版",
component: defineAsyncComponent(() => import("@/ui/CYYSYP0T4.vue")),
remark: '手机号码在网时长V即时版展示号码在当前运营商下的在网时长区间数据来源于运营商系统仅供参考。',
},
CYYSYS9W1: {
name: "手机携号转网V即时版",
component: defineAsyncComponent(() => import("@/ui/CYYSYS9W1.vue")),
remark: '手机携号转网V即时版查询号码是否发生携号转网及前后运营商变更情况数据来源于运营商系统仅供参考。',
},
QCXG5F3A: {
name: "名下车辆车牌查询B",
component: defineAsyncComponent(() => import("@/ui/QCXG5F3A.vue")),
remark: '名下车辆车牌查询B展示查询对象名下登记的车辆车牌号、车牌颜色、车辆类型等信息数据来源于车辆管理部门等权威机构仅供参考。',
},
IVYZ4Y27: {
name: "学历信息高级版",
component: defineAsyncComponent(() => import("@/ui/IVYZ4Y27/index.vue")),
remark: '名下车辆车牌查询B展示查询对象名下登记的车辆车牌号、车牌颜色、车辆类型等信息数据来源于车辆管理部门等权威机构仅供参考。',
},
DWBG5SAM: {
name: "天远指谜报告",
component: defineAsyncComponent(() => import("@/ui/DWBG5SAM/index.vue")),
remark: '天远指谜报告综合展示身份核验、信用等级、风险画像与名单、公安不良、逾期与司法案件等维度,数据来源于合作机构,仅供参考。',
},
};
const maskValue = computed(() => {
return (type, value) => {
if (!value) return value;
if (type === "name") {
// 姓名脱敏(保留首位)
if (value.length === 1) {
return "*"; // 只保留一个字,返回 "*"
} else if (value.length === 2) {
return value[0] + "*"; // 两个字,保留姓氏,第二个字用 "*" 替代
} else {
return (
value[0] +
"*".repeat(value.length - 2) +
value[value.length - 1]
); // 两个字以上,保留第一个和最后一个字,其余的用 "*" 替代
}
} else if (type === "id_card") {
// 身份证号脱敏保留前6位和最后4位
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
} else if (type === "mobile") {
if (value.length === 11) {
return value.substring(0, 3) + "****" + value.substring(7);
}
return value; // 如果手机号不合法或长度不为 11 位,直接返回原手机号
} else if (type === "bank_card") {
// 银行卡号脱敏保留前6位和后4位
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
} else if (type === "ent_name") {
// 企业名称脱敏保留前3个字符和后3个字符中间部分用 "*" 替代)
if (value.length <= 6) {
return value[0] + "*".repeat(value.length - 1); // 少于6个字符时只保留第一个字符其他用 * 替代
} else {
return (
value.slice(0, 3) +
"*".repeat(value.length - 6) +
value.slice(-3)
); // 多于6个字符时保留前3和后3
}
} else if (type === "ent_code") {
// 企业代码脱敏保留前4个字符和后4个字符中间部分用 "*" 替代)
if (value.length <= 8) {
return value.slice(0, 4) + "*".repeat(value.length - 4); // 长度不超过8时保留前4个字符其他用 * 替代
} else {
return (
value.slice(0, 4) +
"*".repeat(value.length - 8) +
value.slice(-4)
); // 长度超过8时保留前4个字符和后4个字符
}
} else if (type === "car_license") {
// 车牌号脱敏保留前2个字符后2个字符其他部分用 "*" 替代)
if (value.length <= 4) {
return value[0] + "*".repeat(value.length - 1); // 如果车牌号长度小于等于4只保留首字符
} else {
// 如果车牌号较长保留前2个字符后2个字符其余部分用 "*" 替代
return (
value.slice(0, 2) +
"*".repeat(value.length - 4) +
value.slice(-2)
);
}
}
return value;
};
});
// ==================== 新评分系统 ====================
// Feature 风险等级配置(权重越高表示风险越大,最终分数越高越安全)
const featureRiskLevels = {
// 🔴 高风险类
'FLXG0V4B': 20, // 司法涉诉
'FLXGK5D2': 20, // 法院被执行人高级版
'FLXG7E8F': 20, // 个人涉诉
// 🟠 中高风险类 - 权重 7
'JRZQ4B6C': 7, // 信贷表现
'IVYZ8I9J': 7, // 网络社交异常
'JRZQ8A2D': 9, // 特殊名单验证
'JRZQ7F1A': 8, // 全景雷达
'JRZQ6F2A': 7, // 借贷意向验证A
'JRZQ5E9F': 8, // 借选指数评估
'JRZQ0A03': 7, // 借贷意向验证
'JRZQ8203': 7, // 借贷行为验证
'JRZQ4AA8': 6, // 偿债压力指数
'FLXG3D56': 9, // 特殊名单验证
'JRZQ3C9R': 7, // 支付行为指数
'YYSY7D3E': 5, // 手机携号转网
'YYSY8B1C': 5, // 手机在网时长
'CFLX3A9B': 5, // 法院被执行人限高版
'IVYZ4Y27' :3 , //xueli
'DWBG5SAM': 10,
// 🟡 中风险类 - 权重 5
'QYGL3F8E': 5, // 人企关系加强版
'QCXG9P1C': 5, // 名下车辆贷前
'QCXG7A2B': 3, // 名下车辆(简化版)
'JRZQ09J8': 5, // 收入评估
'JRZQ8B3C': 5, // 个人消费能力等级
'IVYZ3P9M': 4, // 学籍学历核验(实时版)
'FLXGDEA9': 15, // 公安不良人员名单(加强版)
'IVYZ81NC': 3, // 单人婚姻查询(登记时间版)
'IVYZ5733': 3, // 单人婚姻状态A
'IVYZ0S0D': 3, // 劳动仲裁信息查询(个人版)
// 📊 复合报告类 - 按子模块动态计算
'DWBG8B4D': 0, // 谛听多维报告(由子模块计算)
'DWBG6A2C': 0, // 司南报告(由子模块计算)
'DWBG7F3A': 8, // 多头借贷行业风险版
// 谛听多维报告子模块
'DWBG8B4D_Overview': 10,
'DWBG8B4D_ElementVerification': 4,
'DWBG8B4D_Identity': 4,
'DWBG8B4D_RiskWarning': 10,
'DWBG8B4D_OverdueRisk': 9,
'DWBG8B4D_LoanEvaluation': 7,
'DWBG8B4D_LeasingRisk': 6,
'DWBG8B4D_RiskSupervision': 8,
'DWBG8B4D_RiskWarningTab': 9,
'DWBG6A2C_CourtRiskInfo':9,
// 司南报告子模块
'DWBG6A2C_StandLiveInfo': 4,
'DWBG6A2C_RiskPoint': 9,
'DWBG6A2C_SecurityInfo': 15,
'DWBG6A2C_AntiFraudInfo': 15,
'DWBG6A2C_RiskList': 12,
'DWBG6A2C_ApplicationStatistics': 7,
'DWBG6A2C_LendingStatistics': 6,
'DWBG6A2C_PerformanceStatistics': 7,
'DWBG6A2C_OverdueRecord': 9,
'DWBG6A2C_CreditDetail': 5,
'DWBG6A2C_RentalBehavior': 5,
'DWBG6A2C_RiskSupervision': 8,
'DWBG6A2C_CourtRiskInfo':9,
// 人企关系加强版子模块
'CQYGL3F8E_Investment': 4,
'CQYGL3F8E_SeniorExecutive': 4,
'CQYGL3F8E_Lawsuit': 8,
'CQYGL3F8E_InvestHistory': 3,
'CQYGL3F8E_FinancingHistory': 3,
'CQYGL3F8E_Punishment': 7,
'CQYGL3F8E_Abnormal': 6,
'CQYGL3F8E_TaxRisk': 7,
// 新增模块 - 默认权重3待调整
'CIVYZ6M8P': 3,
'CIVYZ7F3A': 3,
'CIVYZ9K7F': 3,
'CIVYZA1B3': 3,
'CJRZQ0B6Y': 3,
'CJRZQACAB': 3,
'CQCXG1H7Y': 3,
'CQCXG1U4U': 3,
'CQCXG3Y6B': 3,
'CQCXG3Z3L': 3,
'CQCXG4D2E': 3,
'CQCXG4I1Z': 3,
'CQCXG5U0Z': 3,
'CQCXG6B4E': 3,
'CQCXGGB2Q': 3,
'CQCXGP00W': 3,
'CQCXGY7F2': 3,
'CQCXGYTS2': 3,
'CQVehicleGeneric': 3,
'CQYGL2S0W': 3,
'CQYGL5F6A': 3,
'CQYGL66SL': 3,
'CYYSY3M8S': 3,
'CYYSY6F2B': 3,
'CYYSY9E4A': 3,
'CYYSYE7V5': 3,
'CYYSYF2T7': 3,
'CYYSYK8R3': 3,
'CYYSYK9R4': 3,
'CYYSYP0T4': 3,
'CYYSYS9W1': 3,
'QCXG5F3A': 3,
};
// 处理数据拆分支持DWBG8B4D、DWBG6A2C、CJRZQ5E9F和CQYGL3F8E
const processedReportData = computed(() => {
console.log('[BaseReport.vue] 开始计算 processedReportData...');
let data = reportData.value || [];
// 拆分DWBG8B4D数据
data = splitDWBG8B4DForTabs(data);
// 拆分DWBG6A2C数据
data = splitDWBG6A2CForTabs(data);
// 拆分CQYGL3F8E数据
data = splitCQYGL3F8EForTabs(data);
// 过滤掉在featureMap中没有对应的项
const filtered = data.filter(item => {
const apiID = item?.data?.apiID;
const exists = item && item.data && apiID && featureMap[apiID];
if (!exists && item?.data?.apiID) {
console.warn(`[BaseReport.vue] 未找到 API ID "${apiID}" 的对应组件配置,已过滤。`);
}
return exists;
});
console.log('[BaseReport.vue] 过滤后模块数量:', filtered.length);
return filtered;
});
// 存储每个组件的 ref 引用
const componentRefs = ref({});
// 存储每个组件的风险评分(由组件主动通知)
const componentRiskScores = ref({});
// 提供方法让子组件通知自己的风险评分0-100分分数越高越安全
const notifyRiskStatus = (apiID, index, riskScore) => {
const key = `${apiID}_${index}`;
componentRiskScores.value[key] = riskScore;
};
// 暴露给子组件
defineExpose({
notifyRiskStatus
});
// 计算综合评分的函数(分数越高越安全)
const calculateScore = () => {
console.log('[BaseReport.vue] 开始计算报告评分...');
// 收集实际存在的 features 及其风险权重
const presentFeatures = [];
processedReportData.value.forEach((item, index) => {
const apiID = item.data?.apiID;
if (!apiID) return;
// 获取风险权重(如果不在配置中,默认为 3
const weight = featureRiskLevels[apiID] ?? 3;
// 跳过权重为 0 的复合报告主模块(它们由子模块计算)
if (weight === 0) return;
presentFeatures.push({
apiID,
index,
weight
});
});
console.log('[BaseReport.vue] 参与评分的特征数量:', presentFeatures.length);
if (presentFeatures.length === 0) return 100; // 无有效特征时返回满分(最安全)
// 累计总风险分数
let totalRiskScore = 0;
const riskDetails = []; // 用于调试
presentFeatures.forEach(({ apiID, index, weight }) => {
// 从组件风险评分中获取评分0-100分分数越高越安全
const key = `${apiID}_${index}`;
const componentScore = componentRiskScores.value[key] ?? 100; // 默认100分最安全
// 将组件评分转换为风险分数0-100 -> 100-0
const componentRisk = 100 - componentScore;
// 计算该模块的风险贡献(固定分值,不按占比)
// 使用权重系数放大高风险模块的影响
// 高风险模块权重10如果风险分数是0扣20分权重10 × 系数2
// 中风险模块权重7如果风险分数是0扣14分权重7 × 系数2
// 低风险模块权重3如果风险分数是0扣6分权重3 × 系数2
const weightMultiplier = 1.5; // 权重系数,可以调整这个值来控制影响程度
const riskContribution = (componentRisk / 100) * weight * weightMultiplier;
riskDetails.push({
apiID,
index,
weight,
componentScore,
componentRisk,
riskContribution,
hasStatus: key in componentRiskScores.value
});
// 累加风险分数
totalRiskScore += riskContribution;
});
console.log('[BaseReport.vue] 计算得出的总风险分数:', totalRiskScore);
// 将总风险分数限制在 0-90 范围内确保最低分为10分
const finalRiskScore = Math.max(0, Math.min(90, Math.round(totalRiskScore)));
// 转换为安全分数分数越高越安全100 - 风险分数)
// 最终分数范围10-100分
const safetyScore = 100 - finalRiskScore;
console.log('[BaseReport.vue] 最终安全评分:', safetyScore);
return safetyScore;
};
// 监听 reportData 和 componentRiskScores 变化并计算评分
watch([reportData, componentRiskScores], () => {
reportScore.value = calculateScore();
// 将评分系统数据整理到一个对象中
const scoreData = {
timestamp: new Date().toISOString(),
finalScore: reportScore.value,
reportModules: processedReportData.value.map((item, index) => ({
apiID: item?.data?.apiID || 'unknown',
name: featureMap[item?.data?.apiID]?.name || '未知',
index: index,
riskScore: componentRiskScores.value[`${item?.data?.apiID}_${index}`] ?? '未上报',
weight: featureRiskLevels[item?.data?.apiID] ?? 0
})),
componentScores: componentRiskScores.value,
riskLevels: featureRiskLevels
};
}, { immediate: true, deep: true });
</script>
<template>
<div class="min-h-full bg-[#f6f8fe]">
<template v-if="isDone">
<!-- Tabs 区域 -->
<StyledTabs v-model:active="active" scrollspy sticky>
<div class="flex flex-col gap-y-4 p-4">
<LEmpty v-if="isEmpty" />
<van-tab title="分析指数">
<div class="relative mb-4">
<!-- 产品卡片牌匾效果 - 使用背景图片 -->
<div class="absolute -top-[12px] left-1/2 transform -translate-x-1/2 w-[140px]">
<div class="trapezoid-bg-image flex items-center justify-center"
:style="trapezoidBgStyle">
<div class="text-xl whitespace-nowrap">分析指数</div>
</div>
</div>
<div class="card mb-4 mt-6 !pt-10">
<div class="my-4">
<GaugeChart :score="reportScore" />
</div>
</div>
</div>
</van-tab>
<van-tab title="基本信息">
<TitleBanner id="basic" class="mb-4">基本信息</TitleBanner>
<VerificationCard :report-params="reportParams" :report-date-time="reportDateTime"
:report-name="reportName" :is-empty="isEmpty" :is-share="isShare" :order-id="orderId"
:order-no="orderNo" />
<LRemark content="如查询的姓名/身份证与运营商提供的不一致,可能会存在报告内容不匹配的情况" />
</van-tab>
<van-tab v-for="(item, index) in processedReportData" :key="`${item.data.apiID}_${index}`"
:title="featureMap[item.data.apiID]?.name">
<TitleBanner :id="item.data.apiID" class="mb-4">
{{ featureMap[item.data.apiID]?.name }}
</TitleBanner>
<component :is="featureMap[item.data.apiID]?.component" :ref="el => {
if (el) {
const refKey = `${item.data.apiID}_${index}`;
componentRefs[refKey] = el;
}
}" :data="item.data.data" :params="reportParams" :api-id="item.data.apiID" :index="index"
:notify-risk-status="notifyRiskStatus">
</component>
<LRemark v-if="featureMap[item.data.apiID]?.remark"
:content="featureMap[item.data.apiID]?.remark" />
</van-tab>
<ShareReportButton v-if="!isShare" class="h-12 text-3xl mt-8" :order-id="orderId"
:order-no="orderNo" :is-example="isExample" />
<span class="mb-4 text-center text-sm text-gray-500">分享当前{{ isExample ? '示例' : '报告' }}链接</span>
<div class="card">
<div>
<div class="text-bold text-center text-[#333333] mb-2">
免责声明
</div>
<p class="text-[#999999]">
&nbsp; &nbsp;
1本份报告是在取得您个人授权后我们才向合法存有您以上个人信息的机构去调取相关内容我们不会以任何形式对您的报告进行存储除您和您授权的人外不会提供给任何人和机构进行查看
</p>
<p class="text-[#999999]">
&nbsp; &nbsp; 2本报告自生成之日起有效期 30
过期自动删除如果您对本份报告存有异议可能是合作机构数据有延迟或未能获取到您的相关数据出于合作平台数据隐私的保护本平台将不做任何解释
</p>
<p class="text-[#999999]">
&nbsp; &nbsp; 3若以上数据有错误请联系平台客服
</p>
</div>
</div>
</div>
</StyledTabs>
</template>
</div>
<div class="disclaimer">
<div class="flex flex-col items-center">
<div class="flex items-center">
<img class="w-4 h-4 mr-2" src="@/assets/images/public_security_record_icon.png" alt="公安备案" />
<text>琼公网安备46010002000584号</text>
</div>
<div>
<a class="text-blue-500" href="https://beian.miit.gov.cn">
琼ICP备2024048057号-2
</a>
</div>
</div>
<div>海南天远大数据科技有限公司版权所有</div>
</div>
</template>
<style lang="scss" scoped>
.a {
color: #e03131;
}
.disclaimer {
/* margin-top: 24px; */
padding: 10px;
font-size: 12px;
color: #999;
text-align: center;
border-top: 1px solid #e0e0e0;
padding-bottom: 60px;
background: #ffffff;
}
:deep(.card) {
@apply p-3;
box-shadow: 0px 0px 24px 0px #3F3F3F0F;
}
/* 梯形背景图片样式 */
.trapezoid-bg-image {
background-size: contain;
background-repeat: no-repeat;
background-position: center;
height: 44px;
}
</style>