111
This commit is contained in:
parent
e02562f880
commit
66c2df8d44
Binary file not shown.
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 142 KiB |
BIN
src/assets/images/banner_222.png
Normal file
BIN
src/assets/images/banner_222.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 137 KiB |
255
src/components/GaugeChart.vue
Normal file
255
src/components/GaugeChart.vue
Normal file
@ -0,0 +1,255 @@
|
||||
<template>
|
||||
<div>
|
||||
<div ref="chartRef" :style="{ width: '100%', height: '200px' }"></div>
|
||||
<div class="risk-description">
|
||||
{{ riskDescription }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import * as echarts from "echarts";
|
||||
import { ref, onMounted, onUnmounted, watch, computed } from "vue";
|
||||
|
||||
const props = defineProps({
|
||||
score: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
||||
// 根据分数计算风险等级和颜色
|
||||
const riskLevel = computed(() => {
|
||||
const score = props.score;
|
||||
if (score >= 0 && score <= 25) {
|
||||
return {
|
||||
level: "无任何风险",
|
||||
color: "#52c41a",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#52c41a" },
|
||||
{ offset: 1, color: "#7fdb42" }
|
||||
]
|
||||
};
|
||||
} else if (score > 25 && score <= 50) {
|
||||
return {
|
||||
level: "风险指数较低",
|
||||
color: "#faad14",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#faad14" },
|
||||
{ offset: 1, color: "#ffc53d" }
|
||||
]
|
||||
};
|
||||
} else if (score > 50 && score <= 75) {
|
||||
return {
|
||||
level: "风险指数较高",
|
||||
color: "#fa8c16",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#fa8c16" },
|
||||
{ offset: 1, color: "#ffa940" }
|
||||
]
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
level: "高风险警告",
|
||||
color: "#f5222d",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#f5222d" },
|
||||
{ offset: 1, color: "#ff4d4f" }
|
||||
]
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// 评分解释文本
|
||||
const riskDescription = computed(() => {
|
||||
const score = props.score;
|
||||
if (score >= 0 && score <= 25) {
|
||||
return "根据综合分析,当前报告未检测到明显风险因素,各项指标表现正常,总体状况良好。";
|
||||
} else if (score > 25 && score <= 50) {
|
||||
return "根据综合分析,当前报告存在少量风险信号,建议关注相关指标变化,保持警惕。";
|
||||
} else if (score > 50 && score <= 75) {
|
||||
return "根据综合分析,当前报告风险指数较高,多项指标显示异常,建议进一步核实相关情况。";
|
||||
} else {
|
||||
return "根据综合分析,当前报告显示高度风险状态,多项重要指标严重异常,请立即采取相应措施。";
|
||||
}
|
||||
});
|
||||
|
||||
const chartRef = ref(null);
|
||||
let chartInstance = null;
|
||||
|
||||
const initChart = () => {
|
||||
if (!chartRef.value) return;
|
||||
|
||||
// 初始化ECharts实例
|
||||
chartInstance = echarts.init(chartRef.value);
|
||||
updateChart();
|
||||
};
|
||||
|
||||
const updateChart = () => {
|
||||
if (!chartInstance) return;
|
||||
|
||||
// 获取当前风险等级信息
|
||||
const risk = riskLevel.value;
|
||||
|
||||
// 配置项
|
||||
const option = {
|
||||
series: [
|
||||
{
|
||||
type: "gauge",
|
||||
startAngle: 180,
|
||||
endAngle: 0,
|
||||
min: 0,
|
||||
max: 100,
|
||||
radius: "100%",
|
||||
center: ["50%", "80%"],
|
||||
itemStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, risk.gradient),
|
||||
shadowBlur: 10,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.2)',
|
||||
},
|
||||
progress: {
|
||||
show: true,
|
||||
width: 20,
|
||||
roundCap: true,
|
||||
clip: false
|
||||
},
|
||||
axisLine: {
|
||||
roundCap: true,
|
||||
lineStyle: {
|
||||
width: 20,
|
||||
color: [
|
||||
[1, new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{
|
||||
offset: 0,
|
||||
color: "rgba(0, 0, 0, 0.1)"
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "rgba(0, 0, 0, 0.05)"
|
||||
}
|
||||
])]
|
||||
]
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
distance: -26,
|
||||
length: 5,
|
||||
lineStyle: {
|
||||
color: "#999",
|
||||
width: 2
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
show: true,
|
||||
distance: -8,
|
||||
fontSize: 12,
|
||||
color: "#999",
|
||||
formatter: function (value) {
|
||||
if (value % 20 === 0) {
|
||||
return value;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
},
|
||||
anchor: {
|
||||
show: false
|
||||
},
|
||||
pointer: {
|
||||
icon: "triangle",
|
||||
iconStyle: {
|
||||
color: risk.color,
|
||||
borderColor: risk.color,
|
||||
borderWidth: 1
|
||||
},
|
||||
offsetCenter: ["7%", "-67%"],
|
||||
length: "10%",
|
||||
width: 15
|
||||
},
|
||||
detail: {
|
||||
valueAnimation: true,
|
||||
fontSize: 30,
|
||||
fontWeight: "bold",
|
||||
color: risk.color,
|
||||
offsetCenter: [0, "-25%"],
|
||||
formatter: function (value) {
|
||||
return `{value|${value}分}\n{level|${risk.level}}`;
|
||||
},
|
||||
rich: {
|
||||
value: {
|
||||
fontSize: 30,
|
||||
fontWeight: 'bold',
|
||||
color: risk.color,
|
||||
padding: [0, 0, 5, 0]
|
||||
},
|
||||
level: {
|
||||
fontSize: 14,
|
||||
fontWeight: 'normal',
|
||||
color: risk.color,
|
||||
padding: [5, 0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: props.score
|
||||
}
|
||||
],
|
||||
title: {
|
||||
fontSize: 14,
|
||||
color: risk.color,
|
||||
offsetCenter: [0, "10%"],
|
||||
formatter: risk.level
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
// 使用配置项设置图表
|
||||
chartInstance.setOption(option);
|
||||
};
|
||||
|
||||
// 监听分数变化
|
||||
watch(
|
||||
() => props.score,
|
||||
() => {
|
||||
updateChart();
|
||||
}
|
||||
);
|
||||
|
||||
onMounted(() => {
|
||||
initChart();
|
||||
|
||||
// 处理窗口大小变化
|
||||
window.addEventListener("resize", () => {
|
||||
if (chartInstance) {
|
||||
chartInstance.resize();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 在组件销毁前清理
|
||||
onUnmounted(() => {
|
||||
if (chartInstance) {
|
||||
chartInstance.dispose();
|
||||
chartInstance = null;
|
||||
}
|
||||
window.removeEventListener("resize", chartInstance?.resize);
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.risk-description {
|
||||
margin-top: 10px;
|
||||
padding: 8px 12px;
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 4px;
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
@ -54,7 +54,7 @@ const route = useRoute();
|
||||
const tabbar = ref('index');
|
||||
const menu = reactive([
|
||||
{ title: '首页', icon: 'home-o', name: 'index' },
|
||||
// { title: '推广', icon: 'balance-o', name: 'agent' },
|
||||
{ title: '推广', icon: 'balance-o', name: 'agent' },
|
||||
{ title: 'AI律师', icon: 'chat-o', name: 'ai' },
|
||||
{ title: '我的', icon: 'user-o', name: 'me' },
|
||||
]);
|
||||
|
@ -9,7 +9,6 @@ const props = defineProps({
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
||||
const chartInstance = ref(null); // ECharts 实例
|
||||
const chartRef = ref(null); // 图表容器 DOM
|
||||
const riskLevel = ref("");
|
||||
|
@ -10,7 +10,6 @@ const props = defineProps({
|
||||
},
|
||||
});
|
||||
const { data } = props;
|
||||
|
||||
// 图表相关
|
||||
const chartInstance = ref(null); // ECharts 实例
|
||||
const chartRef = ref(null); // 图表容器 DOM
|
||||
|
377
src/ui/CLawsuitPP.vue
Normal file
377
src/ui/CLawsuitPP.vue
Normal file
@ -0,0 +1,377 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
import { defineProps, onMounted, ref, computed } from "vue";
|
||||
import * as echarts from "echarts";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
// 正确解构props.data中的字段并处理默认值
|
||||
const {
|
||||
entout: PropEntout = [],
|
||||
sxbzxr: PropSxbzxr = [],
|
||||
xgbzxr: PropXgbzxr = []
|
||||
} = props.data || {}
|
||||
|
||||
// 安全获取entout数据(带响应式)
|
||||
const entout = ref(PropEntout[0]?.entout || {
|
||||
administrative: {},
|
||||
bankrupt: {},
|
||||
cases_tree: { criminal: [] },
|
||||
civil: {},
|
||||
count: {},
|
||||
criminal: { cases: [], count: {} },
|
||||
implement: {},
|
||||
preservation: {}
|
||||
})
|
||||
|
||||
// 获取其他字段(按需添加响应式)
|
||||
const sx = ref(PropSxbzxr[0]?.sxbzxr || [])
|
||||
const xg = ref(PropXgbzxr[0]?.xgbzxr || [])
|
||||
const fieldLabel = [
|
||||
// ================= 案件基础信息 =================
|
||||
{ "field": "n_jbfy", "label": "经办法院" },
|
||||
|
||||
{ "field": "n_jbfy_cj", "label": "法院所属层级" },
|
||||
{ "field": "c_ssdy", "label": "所属地域" },
|
||||
|
||||
// ================= 时间维度 =================
|
||||
{ "field": "d_larq", "label": "立案时间" },
|
||||
{ "field": "larq_stat", "label": "涉案时间分布" },
|
||||
{ "field": "d_jarq", "label": "结案时间" },
|
||||
|
||||
// ================= 案由与罪名 =================
|
||||
{ "field": "n_laay", "label": "立案案由" },
|
||||
{ "field": "n_laay_tag", "label": "立案案由标签" },
|
||||
{ "field": "n_laay_tree", "label": "立案案由详细" },
|
||||
{ "field": "n_jaay", "label": "结案案由" },
|
||||
|
||||
{ "field": "n_jaay_tag", "label": "结案案由标签" },
|
||||
{ "field": "n_jaay_tree", "label": "结案案由详细" },
|
||||
{ "field": "n_dzzm", "label": "定罪罪名" },
|
||||
{ "field": "n_dzzm_tree", "label": "定罪罪名详细" },
|
||||
|
||||
// ================= 当事人与诉讼 =================
|
||||
{ "field": "c_gkws_dsr", "label": "当事人" },
|
||||
{ "field": "n_dsrlx", "label": "当事人类型" },
|
||||
{ "field": "n_ssdw", "label": "诉讼地位" },
|
||||
{ "field": "n_ssdw_ys", "label": "一审诉讼地位" },
|
||||
{ "field": "c_gkws_glah", "label": "相关案件号" },
|
||||
|
||||
// ================= 审理与判决 =================
|
||||
{ "field": "n_slcx", "label": "审理程序" },
|
||||
{ "field": "c_slfsxx", "label": "审理方式信息" },
|
||||
{ "field": "n_ajjzjd", "label": "案件进展阶段" },
|
||||
{ "field": "n_pcjg", "label": "判处结果" },
|
||||
{ "field": "c_gkws_pjjg", "label": "判决结果" },
|
||||
{ "field": "n_pj_victory", "label": "胜诉估计" },
|
||||
|
||||
// ================= 金额与执行 =================
|
||||
// --- 起诉金额 ---
|
||||
{ "field": "n_qsbdje_level", "label": "起诉标的金额等级" },
|
||||
{ "field": "n_qsbdje", "label": "起诉标的金额" },
|
||||
{ "field": "n_qsbdje_gj_level", "label": "起诉标的金额估计等级" },
|
||||
{ "field": "n_qsbdje_gj", "label": "起诉标的金额估计" },
|
||||
|
||||
// --- 结案金额 ---
|
||||
{ "field": "n_jabdje_level", "label": "结案标的金额等级" },
|
||||
{ "field": "n_jabdje", "label": "结案标的金额" },
|
||||
{ "field": "n_jabdje_gj_level", "label": "结案标的金额估计等级" },
|
||||
{ "field": "n_jabdje_gj", "label": "结案标的金额估计" },
|
||||
|
||||
// --- 执行金额 ---
|
||||
{ "field": "n_sqzxbdje", "label": "申请执行标的金额" },
|
||||
{ "field": "n_sjdwje", "label": "实际到位金额" },
|
||||
{ "field": "n_wzxje", "label": "未执行金额" },
|
||||
|
||||
// --- 其他金额 ---
|
||||
{ "field": "n_fzje_level", "label": "犯罪金额等级" },
|
||||
{ "field": "n_fzje", "label": "犯罪金额" },
|
||||
{ "field": "n_bqqpcje_level", "label": "被请求赔偿金额等级" },
|
||||
{ "field": "n_bqqpcje", "label": "被请求赔偿金额" },
|
||||
{ "field": "n_pcpcje_level", "label": "判处赔偿金额等级" },
|
||||
{ "field": "n_pcpcje", "label": "判处赔偿金额" },
|
||||
{ "field": "n_pcpcje_gj_level", "label": "判处赔偿金额估计等级" },
|
||||
{ "field": "n_pcpcje_gj", "label": "判处赔偿金额估计" },
|
||||
{ "field": "n_ccxzxje_level", "label": "财产刑执行金额等级" },
|
||||
{ "field": "n_ccxzxje", "label": "财产刑执行金额" },
|
||||
{ "field": "n_ccxzxje_gj_level", "label": "财产刑执行金额估计等级" },
|
||||
{ "field": "n_ccxzxje_gj", "label": "财产刑执行金额估计" },
|
||||
|
||||
// ================= 其他辅助字段 =================
|
||||
{ "field": "n_sqbqse_level", "label": "申请保全数额等级" },
|
||||
{ "field": "n_sqbqse", "label": "申请保全数额" },
|
||||
{ "field": "c_sqbqbdw", "label": "申请保全标的物" },
|
||||
|
||||
// ================= 失信被执行人专项 、限制高消费专项 =================
|
||||
{ "field": "xb", "label": "性别" },
|
||||
{ "field": "zxfy", "label": "执行法院" },
|
||||
{ "field": "sf", "label": "省份" },
|
||||
{ "field": "ah", "label": "案号" },
|
||||
{ "field": "zxyjwh", "label": "执行依据文号" },
|
||||
{ "field": "zxyjdw", "label": "执行依据单位" },
|
||||
{ "field": "yw", "label": "生成法律文书确定的义务" },
|
||||
{ "field": "lxqk", "label": "履行情况" },
|
||||
{ "field": "xwqx", "label": "失信行为情形" },
|
||||
{ "field": "pjje_gj", "label": "失信金额估计" },
|
||||
{ "field": "larq", "label": "立案日期" },
|
||||
{ "field": "fbrq", "label": "发布日期" },
|
||||
];
|
||||
const collapse = ref([]);
|
||||
const chartOptions = ref({});
|
||||
const chartDom = ref(null); // 用于绑定 DOM 容器
|
||||
const totalCases = ref(0);
|
||||
|
||||
onMounted(() => {
|
||||
// 计算每种案件的数量
|
||||
const caseCounts = {
|
||||
criminal: entout.value.criminal?.cases?.length || 0,
|
||||
civil: entout.value.civil?.cases?.length || 0,
|
||||
administrative: entout.value.administrative?.cases?.length || 0,
|
||||
preservation: entout.value.preservation?.cases?.length || 0,
|
||||
implement: entout.value.implement?.cases?.length || 0,
|
||||
bankrupt: entout.value.bankrupt?.cases?.length || 0,
|
||||
sx: sx.value.length,
|
||||
xg: xg.value.length
|
||||
};
|
||||
|
||||
// 计算涉诉总案件数
|
||||
totalCases.value = Object.values(caseCounts).reduce(
|
||||
(sum, count) => sum + count,
|
||||
0
|
||||
);
|
||||
|
||||
chartOptions.value = {
|
||||
title: {
|
||||
// text: "涉诉案件数",
|
||||
// subtext: totalCases.toString(),
|
||||
// left: "35%", // 与 series.center 的第一个值保持一致
|
||||
// top: "50%", // 与 series.center 的第二个值保持一致
|
||||
// textAlign: "center", // 确保文本居中
|
||||
// textStyle: {
|
||||
// fontSize: 16,
|
||||
// fontWeight: "bold",
|
||||
// color: "#333",
|
||||
// },
|
||||
// subtextStyle: {
|
||||
// fontSize: 24,
|
||||
// fontWeight: "bold",
|
||||
// color: "#EE6666",
|
||||
// },
|
||||
},
|
||||
tooltip: {
|
||||
trigger: "item",
|
||||
formatter: "{b}: {c}件 ({d}%)",
|
||||
},
|
||||
legend: {
|
||||
orient: "vertical",
|
||||
right: "0", // 调整到右边
|
||||
top: "middle", // 垂直居中
|
||||
itemGap: 10, // 图例项间距
|
||||
textStyle: {
|
||||
fontSize: 12,
|
||||
color: "#666",
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "案件类型",
|
||||
type: "pie",
|
||||
radius: ["30%", "60%"], // 调整环形图半径
|
||||
center: ["30%", "50%"], // 调整环形图的位置
|
||||
avoidLabelOverlap: false,
|
||||
itemStyle: {
|
||||
borderRadius: 8, // 添加圆角效果
|
||||
borderColor: "#fff",
|
||||
borderWidth: 2,
|
||||
},
|
||||
label: {
|
||||
show: false, // 隐藏标签
|
||||
position: "center",
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: "18",
|
||||
fontWeight: "bold",
|
||||
formatter: "{b}\n{c}件",
|
||||
},
|
||||
},
|
||||
labelLine: {
|
||||
show: false,
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: caseCounts.criminal,
|
||||
name: `刑事案件${caseCounts.criminal}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.civil,
|
||||
name: `民事案件${caseCounts.civil}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.administrative,
|
||||
name: `行政案件${caseCounts.administrative}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.preservation,
|
||||
name: `非诉保全审查${caseCounts.preservation}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.implement,
|
||||
name: `执行案件${caseCounts.implement}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.bankrupt,
|
||||
name: `强制清算与破产${caseCounts.bankrupt}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.bankrupt,
|
||||
name: `失信${caseCounts.sx}件`,
|
||||
}, {
|
||||
value: caseCounts.bankrupt,
|
||||
name: `限高${caseCounts.xg}件`,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
// 初始化 ECharts 实例
|
||||
const chartInstance = echarts.init(chartDom.value);
|
||||
chartInstance.setOption(chartOptions.value);
|
||||
|
||||
// 监听窗口大小变化,动态调整图表
|
||||
window.addEventListener("resize", () => {
|
||||
chartInstance.resize();
|
||||
});
|
||||
});
|
||||
|
||||
const caseTypes = computed(() => {
|
||||
const data = entout.value;
|
||||
return {
|
||||
civil: data.civil?.cases || [],
|
||||
criminal: data.criminal?.cases || [],
|
||||
administrative: data.administrative?.cases || [],
|
||||
preservation: data.preservation?.cases || [],
|
||||
implement: data.implement?.cases || [],
|
||||
bankrupt: data.bankrupt?.cases || [],
|
||||
sx: sx.value,
|
||||
xg: xg.value
|
||||
};
|
||||
});
|
||||
|
||||
function getCaseTypeName(caseType) {
|
||||
const caseTypeNames = {
|
||||
civil: "民事",
|
||||
criminal: "刑事",
|
||||
administrative: "行政",
|
||||
preservation: "非诉保全审查",
|
||||
implement: "执行",
|
||||
bankrupt: "强制清算与破产",
|
||||
sx: "失信",
|
||||
xg: "限高"
|
||||
};
|
||||
return caseTypeNames[caseType] || caseType;
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-4">
|
||||
<!-- 涉诉案件统计 -->
|
||||
<LTitle title="涉诉案件统计" type="blue-green" />
|
||||
<div class="font-bold ml-4 text-lg">
|
||||
涉诉案件数共
|
||||
<span class="text-red-500 text-2xl font-bold">{{
|
||||
totalCases
|
||||
}}</span>件
|
||||
</div>
|
||||
<div ref="chartDom" style="
|
||||
width: 100%;
|
||||
height: 300px;
|
||||
margin-top: -40px;
|
||||
margin-bottom: -40px;
|
||||
"></div>
|
||||
<template v-for="(caseType, typeName) in caseTypes" :key="typeName">
|
||||
<LTitle :title="` ${getCaseTypeName(typeName)}案件`" type="blue-green" />
|
||||
<div v-if="!caseType || caseType.length === 0">
|
||||
无记录,或数据未被公开
|
||||
</div>
|
||||
<template v-else>
|
||||
<van-collapse v-model="collapse">
|
||||
<van-collapse-item v-for="(caseData, index) in caseType" :key="index" custom-class="collapse"
|
||||
:name="index" :title="`案件: ${caseData.c_ah || caseData.ah}`">
|
||||
<div class="case-row">
|
||||
<div class="case-label">案号:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.c_ah || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">案件类型:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.n_ajlx || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">经办法院:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.n_jbfy || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">立案日期:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.d_larq || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">结案方式:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.n_jafs || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">当事人信息:</div>
|
||||
<div class="case-value">
|
||||
<div v-for="dsr in caseData.c_dsrxx" :key="dsr.c_mc">
|
||||
{{ dsr.c_mc }} -
|
||||
{{
|
||||
dsr.n_ssdw
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-for="(item, index) in fieldLabel" :key="index">
|
||||
<div class="case-row" v-if="caseData[item.field]">
|
||||
<div class="case-label">{{ item.label }}:</div>
|
||||
<div class="case-value">{{ caseData[item.field] || '无' }}</div>
|
||||
</div>
|
||||
</template>
|
||||
</van-collapse-item>
|
||||
</van-collapse>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.case-row {
|
||||
@apply flex items-start justify-between my-2;
|
||||
}
|
||||
|
||||
.case-label {
|
||||
@apply flex-shrink-0 font-bold text-gray-700;
|
||||
}
|
||||
|
||||
.case-value {
|
||||
@apply text-left text-gray-500;
|
||||
}
|
||||
|
||||
:deep(.van-cell) {}
|
||||
</style>
|
@ -13,7 +13,7 @@ const entCollapse = ref([]);
|
||||
|
||||
<template>
|
||||
<div class="">
|
||||
<template v-if="data && data.datalist.length === 0">
|
||||
<template v-if="!data || data.datalist?.length === 0">
|
||||
<!-- 显示“暂无关联企业信息”的提示 -->
|
||||
<div class="card py-10 text-center text-gray-500">
|
||||
暂无关联企业信息
|
||||
|
@ -1,14 +1,17 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
|
||||
// const props = defineProps({
|
||||
// data: {
|
||||
// type: Object,
|
||||
// required: true,
|
||||
// },
|
||||
// })
|
||||
// const { data } = props
|
||||
const data = ref({
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
})
|
||||
const { data } = props
|
||||
import { ref, onMounted } from 'vue';
|
||||
|
||||
// 检查data是否为null或空对象
|
||||
const defaultData = {
|
||||
swift_number: "999333_20181029143459_23453A4E0",
|
||||
code: "00",
|
||||
flag_specialList_c: "1",
|
||||
@ -39,57 +42,57 @@ const data = ref({
|
||||
sl_id_nbank_other_overdue: "0",
|
||||
sl_id_nbank_other_lost: "0",
|
||||
sl_id_court_bad_time: "0",
|
||||
sl_id_court_executed_time: "1",
|
||||
sl_id_bank_bad_time: "1",
|
||||
sl_id_bank_overdue_time: "2",
|
||||
sl_id_court_executed_time: "0",
|
||||
sl_id_bank_bad_time: "0",
|
||||
sl_id_bank_overdue_time: "0",
|
||||
sl_id_bank_lost_time: "0",
|
||||
sl_id_nbank_bad_time: "0",
|
||||
sl_id_nbank_overdue_time: "1",
|
||||
sl_id_nbank_lost_time: "1",
|
||||
sl_id_nbank_overdue_time: "0",
|
||||
sl_id_nbank_lost_time: "0",
|
||||
sl_id_nbank_nsloan_bad_time: "0",
|
||||
sl_id_nbank_nsloan_overdue_time: "1",
|
||||
sl_id_nbank_nsloan_lost_time: "1",
|
||||
sl_id_nbank_nsloan_overdue_time: "0",
|
||||
sl_id_nbank_nsloan_lost_time: "0",
|
||||
sl_id_nbank_sloan_bad_time: "0",
|
||||
sl_id_nbank_sloan_overdue_time: "1",
|
||||
sl_id_nbank_sloan_lost_time: "1",
|
||||
sl_id_nbank_cons_bad_time: "1",
|
||||
sl_id_nbank_sloan_overdue_time: "0",
|
||||
sl_id_nbank_sloan_lost_time: "0",
|
||||
sl_id_nbank_cons_bad_time: "0",
|
||||
sl_id_nbank_cons_overdue_time: "0",
|
||||
sl_id_nbank_cons_lost_time: "1",
|
||||
sl_id_nbank_finlea_bad_time: "1",
|
||||
sl_id_nbank_finlea_overdue_time: "2",
|
||||
sl_id_nbank_cons_lost_time: "0",
|
||||
sl_id_nbank_finlea_bad_time: "0",
|
||||
sl_id_nbank_finlea_overdue_time: "0",
|
||||
sl_id_nbank_finlea_lost_time: "0",
|
||||
sl_id_nbank_autofin_bad_time: "1",
|
||||
sl_id_nbank_autofin_bad_time: "0",
|
||||
sl_id_nbank_autofin_overdue_time: "0",
|
||||
sl_id_nbank_autofin_lost_time: "2",
|
||||
sl_id_nbank_autofin_lost_time: "0",
|
||||
sl_id_nbank_other_bad_time: "0",
|
||||
sl_id_nbank_other_overdue_time: "0",
|
||||
sl_id_nbank_other_lost_time: "0",
|
||||
sl_id_court_bad_allnum: "1",
|
||||
sl_id_court_executed_allnum: "1",
|
||||
sl_id_bank_bad_allnum: "1",
|
||||
sl_id_bank_overdue_allnum: "2",
|
||||
sl_id_bank_lost_allnum: "5",
|
||||
sl_id_nbank_bad_allnum: "6",
|
||||
sl_id_nbank_overdue_allnum: "1",
|
||||
sl_id_nbank_lost_allnum: "1",
|
||||
sl_id_nbank_nsloan_bad_allnum: "7",
|
||||
sl_id_nbank_nsloan_overdue_allnum: "1",
|
||||
sl_id_nbank_nsloan_lost_allnum: "1",
|
||||
sl_id_nbank_sloan_bad_allnum: "1",
|
||||
sl_id_nbank_sloan_overdue_allnum: "1",
|
||||
sl_id_nbank_sloan_lost_allnum: "1",
|
||||
sl_id_nbank_cons_bad_allnum: "1",
|
||||
sl_id_nbank_cons_overdue_allnum: "9",
|
||||
sl_id_nbank_cons_lost_allnum: "1",
|
||||
sl_id_nbank_finlea_bad_allnum: "1",
|
||||
sl_id_nbank_finlea_overdue_allnum: "2",
|
||||
sl_id_nbank_finlea_lost_allnum: "4",
|
||||
sl_id_nbank_autofin_bad_allnum: "1",
|
||||
sl_id_nbank_autofin_overdue_allnum: "8",
|
||||
sl_id_nbank_autofin_lost_allnum: "2",
|
||||
sl_id_nbank_other_bad_allnum: "5",
|
||||
sl_id_nbank_other_overdue_allnum: "7",
|
||||
sl_id_nbank_other_lost_allnum: "2",
|
||||
sl_id_court_bad_allnum: "0",
|
||||
sl_id_court_executed_allnum: "0",
|
||||
sl_id_bank_bad_allnum: "0",
|
||||
sl_id_bank_overdue_allnum: "0",
|
||||
sl_id_bank_lost_allnum: "0",
|
||||
sl_id_nbank_bad_allnum: "0",
|
||||
sl_id_nbank_overdue_allnum: "0",
|
||||
sl_id_nbank_lost_allnum: "0",
|
||||
sl_id_nbank_nsloan_bad_allnum: "0",
|
||||
sl_id_nbank_nsloan_overdue_allnum: "0",
|
||||
sl_id_nbank_nsloan_lost_allnum: "0",
|
||||
sl_id_nbank_sloan_bad_allnum: "0",
|
||||
sl_id_nbank_sloan_overdue_allnum: "0",
|
||||
sl_id_nbank_sloan_lost_allnum: "0",
|
||||
sl_id_nbank_cons_bad_allnum: "0",
|
||||
sl_id_nbank_cons_overdue_allnum: "0",
|
||||
sl_id_nbank_cons_lost_allnum: "0",
|
||||
sl_id_nbank_finlea_bad_allnum: "0",
|
||||
sl_id_nbank_finlea_overdue_allnum: "0",
|
||||
sl_id_nbank_finlea_lost_allnum: "0",
|
||||
sl_id_nbank_autofin_bad_allnum: "0",
|
||||
sl_id_nbank_autofin_overdue_allnum: "0",
|
||||
sl_id_nbank_autofin_lost_allnum: "0",
|
||||
sl_id_nbank_other_bad_allnum: "0",
|
||||
sl_id_nbank_other_overdue_allnum: "0",
|
||||
sl_id_nbank_other_lost_allnum: "0",
|
||||
sl_cell_bank_bad: "0",
|
||||
sl_cell_bank_overdue: "0",
|
||||
sl_cell_bank_lost: "0",
|
||||
@ -114,56 +117,59 @@ const data = ref({
|
||||
sl_cell_nbank_other_bad: "0",
|
||||
sl_cell_nbank_other_overdue: "0",
|
||||
sl_cell_nbank_other_lost: "0",
|
||||
sl_cell_bank_bad_time: "1",
|
||||
sl_cell_bank_overdue_time: "2",
|
||||
sl_cell_bank_bad_time: "0",
|
||||
sl_cell_bank_overdue_time: "0",
|
||||
sl_cell_bank_lost_time: "0",
|
||||
sl_cell_nbank_bad_time: "0",
|
||||
sl_cell_nbank_overdue_time: "1",
|
||||
sl_cell_nbank_lost_time: "1",
|
||||
sl_cell_nbank_overdue_time: "0",
|
||||
sl_cell_nbank_lost_time: "0",
|
||||
sl_cell_nbank_nsloan_bad_time: "0",
|
||||
sl_cell_nbank_nsloan_overdue_time: "1",
|
||||
sl_cell_nbank_nsloan_lost_time: "1",
|
||||
sl_cell_nbank_nsloan_overdue_time: "0",
|
||||
sl_cell_nbank_nsloan_lost_time: "0",
|
||||
sl_cell_nbank_sloan_bad_time: "0",
|
||||
sl_cell_nbank_sloan_overdue_time: "1",
|
||||
sl_cell_nbank_sloan_lost_time: "1",
|
||||
sl_cell_nbank_cons_bad_time: "1",
|
||||
sl_cell_nbank_sloan_overdue_time: "0",
|
||||
sl_cell_nbank_sloan_lost_time: "0",
|
||||
sl_cell_nbank_cons_bad_time: "0",
|
||||
sl_cell_nbank_cons_overdue_time: "0",
|
||||
sl_cell_nbank_cons_lost_time: "1",
|
||||
sl_cell_nbank_finlea_bad_time: "1",
|
||||
sl_cell_nbank_finlea_overdue_time: "2",
|
||||
sl_cell_nbank_cons_lost_time: "0",
|
||||
sl_cell_nbank_finlea_bad_time: "0",
|
||||
sl_cell_nbank_finlea_overdue_time: "0",
|
||||
sl_cell_nbank_finlea_lost_time: "0",
|
||||
sl_cell_nbank_autofin_bad_time: "1",
|
||||
sl_cell_nbank_autofin_bad_time: "0",
|
||||
sl_cell_nbank_autofin_overdue_time: "0",
|
||||
sl_cell_nbank_autofin_lost_time: "2",
|
||||
sl_cell_nbank_autofin_lost_time: "0",
|
||||
sl_cell_nbank_other_bad_time: "0",
|
||||
sl_cell_nbank_other_overdue_time: "0",
|
||||
sl_cell_nbank_other_lost_time: "0",
|
||||
sl_cell_bank_bad_allnum: "1",
|
||||
sl_cell_bank_overdue_allnum: "2",
|
||||
sl_cell_bank_lost_allnum: "3",
|
||||
sl_cell_nbank_bad_allnum: "5",
|
||||
sl_cell_nbank_overdue_allnum: "1",
|
||||
sl_cell_nbank_lost_allnum: "1",
|
||||
sl_cell_nbank_nsloan_bad_allnum: "3",
|
||||
sl_cell_nbank_nsloan_overdue_allnum: "1",
|
||||
sl_cell_nbank_nsloan_lost_allnum: "1",
|
||||
sl_cell_nbank_sloan_bad_allnum: "7",
|
||||
sl_cell_nbank_sloan_overdue_allnum: "1",
|
||||
sl_cell_nbank_sloan_lost_allnum: "1",
|
||||
sl_cell_nbank_cons_bad_allnum: "1",
|
||||
sl_cell_nbank_cons_overdue_allnum: "8",
|
||||
sl_cell_nbank_cons_lost_allnum: "1",
|
||||
sl_cell_nbank_finlea_bad_allnum: "1",
|
||||
sl_cell_nbank_finlea_overdue_allnum: "2",
|
||||
sl_cell_nbank_finlea_lost_allnum: "4",
|
||||
sl_cell_nbank_autofin_bad_allnum: "1",
|
||||
sl_cell_nbank_autofin_overdue_allnum: "6",
|
||||
sl_cell_nbank_autofin_lost_allnum: "2",
|
||||
sl_cell_nbank_other_bad_allnum: "7",
|
||||
sl_cell_nbank_other_overdue_allnum: "6",
|
||||
sl_cell_nbank_other_lost_allnum: "9",
|
||||
});
|
||||
console.log("spp data", data);
|
||||
sl_cell_bank_bad_allnum: "0",
|
||||
sl_cell_bank_overdue_allnum: "0",
|
||||
sl_cell_bank_lost_allnum: "0",
|
||||
sl_cell_nbank_bad_allnum: "0",
|
||||
sl_cell_nbank_overdue_allnum: "0",
|
||||
sl_cell_nbank_lost_allnum: "0",
|
||||
sl_cell_nbank_nsloan_bad_allnum: "0",
|
||||
sl_cell_nbank_nsloan_overdue_allnum: "0",
|
||||
sl_cell_nbank_nsloan_lost_allnum: "0",
|
||||
sl_cell_nbank_sloan_bad_allnum: "0",
|
||||
sl_cell_nbank_sloan_overdue_allnum: "0",
|
||||
sl_cell_nbank_sloan_lost_allnum: "0",
|
||||
sl_cell_nbank_cons_bad_allnum: "0",
|
||||
sl_cell_nbank_cons_overdue_allnum: "0",
|
||||
sl_cell_nbank_cons_lost_allnum: "0",
|
||||
sl_cell_nbank_finlea_bad_allnum: "0",
|
||||
sl_cell_nbank_finlea_overdue_allnum: "0",
|
||||
sl_cell_nbank_finlea_lost_allnum: "0",
|
||||
sl_cell_nbank_autofin_bad_allnum: "0",
|
||||
sl_cell_nbank_autofin_overdue_allnum: "0",
|
||||
sl_cell_nbank_autofin_lost_allnum: "0",
|
||||
sl_cell_nbank_other_bad_allnum: "0",
|
||||
sl_cell_nbank_other_overdue_allnum: "0",
|
||||
sl_cell_nbank_other_lost_allnum: "0",
|
||||
};
|
||||
|
||||
// 由于所有值都需要是"0",我们可以直接使用这个defaultData
|
||||
const dataValue = ref(!props.data || Object.keys(props.data).length === 0 ? defaultData : props.data);
|
||||
|
||||
const bankLost = ref([]);
|
||||
const lost = ref([]);
|
||||
function totalStats(data) {
|
||||
@ -240,8 +246,8 @@ function lostSotalStats(data) {
|
||||
return result;
|
||||
}
|
||||
onMounted(() => {
|
||||
const result = totalStats(data.value);
|
||||
const lostResult = lostSotalStats(data.value);
|
||||
const result = totalStats(dataValue.value);
|
||||
const lostResult = lostSotalStats(dataValue.value);
|
||||
bankLost.value = result;
|
||||
lost.value = lostResult;
|
||||
});
|
||||
|
@ -141,9 +141,11 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { ref, computed } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
const agentStore = useAgentStore()
|
||||
const { isAgent } = storeToRefs(agentStore)
|
||||
const router = useRouter();
|
||||
const data = ref(null);
|
||||
|
||||
@ -197,9 +199,8 @@ const getData = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
onBeforeMount(() => {
|
||||
const token = localStorage.getItem("token")
|
||||
if (token) {
|
||||
onMounted(() => {
|
||||
if (isAgent.value) {
|
||||
getData();
|
||||
}
|
||||
});
|
||||
|
@ -3,7 +3,7 @@ const featureMap = {
|
||||
G09SC02: {
|
||||
name: '婚姻状态',
|
||||
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
|
||||
remark: "查询结果为“未婚或尚未登记结婚”时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。"
|
||||
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。'
|
||||
},
|
||||
G27BJ05: {
|
||||
name: '借贷申请记录',
|
||||
@ -18,7 +18,7 @@ const featureMap = {
|
||||
),
|
||||
},
|
||||
G26BJ05: {
|
||||
name: '关联人异常检测',
|
||||
name: '违约异常',
|
||||
component: defineAsyncComponent(() =>
|
||||
import('@/ui/CSpecialList.vue')
|
||||
),
|
||||
@ -31,8 +31,12 @@ const featureMap = {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||
},
|
||||
G22SC01: {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuitPP.vue')),
|
||||
},
|
||||
G05HZ01: {
|
||||
name: '股东人企关系',
|
||||
name: '人企关系',
|
||||
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
||||
},
|
||||
Q23SC01: {
|
||||
@ -88,6 +92,8 @@ const featureMap = {
|
||||
|
||||
import LEmpty from "@/components/LEmpty.vue";
|
||||
import LRemark from "@/components/LRemark.vue";
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
import GaugeChart from "@/components/GaugeChart.vue";
|
||||
|
||||
|
||||
const productId = ref(null);
|
||||
@ -100,6 +106,8 @@ const reportName = ref("")
|
||||
const reportDateTime = ref(null)
|
||||
const feature = ref("")
|
||||
const isEmpty = ref(false)
|
||||
const reportScore = ref(75); // 默认分数
|
||||
|
||||
onMounted(() => {
|
||||
const query = new URLSearchParams(window.location.search);
|
||||
feature.value = query.get("feature");
|
||||
@ -124,11 +132,282 @@ const getReport = async () => {
|
||||
reportParams.value = data.value.data.query_params
|
||||
reportName.value = data.value.data.product_name
|
||||
reportDateTime.value = data.value.data.create_time
|
||||
|
||||
// 计算综合评分
|
||||
reportScore.value = calculateScore(reportData.value);
|
||||
} else if (data.value.code === 200003) {
|
||||
isEmpty.value = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 计算综合评分的函数
|
||||
const calculateScore = (reportData) => {
|
||||
// 从0分开始
|
||||
let score = 0;
|
||||
// 最高分为90分
|
||||
const maxScore = 90;
|
||||
|
||||
// 定义各接口的相对权重比例(而非固定分值)
|
||||
const relativeWeights = {
|
||||
// 关键风险指标(高优先级)
|
||||
'G34BJ03': 250, // 不良记录
|
||||
'G26BJ05': 100, // 违约异常
|
||||
'G22SC01': 400, // 司法涉诉
|
||||
'G35SC01': 20, // 司法涉诉(次要)
|
||||
'Q23SC01': 50, // 企业涉诉
|
||||
'FIN019': 100, // 银行卡黑名单
|
||||
|
||||
// 高风险指标(中优先级)
|
||||
'G27BJ05': 40, // 借贷申请记录
|
||||
'G28BJ05': 40, // 借贷行为记录
|
||||
'G03HZ01': 70, // 手机号码风险
|
||||
|
||||
// 中风险指标(低优先级)
|
||||
'G19BJ02': 50, // 手机二次卡
|
||||
'G02BJ02': 50, // 手机在网时长
|
||||
'G05HZ01': 50, // 人企关系
|
||||
|
||||
// 验证指标(最低优先级)
|
||||
'G15BJ02': 25, // 手机三要素
|
||||
'G17BJ02': 25, // 手机号二要素
|
||||
'KZEYS': 25, // 身份证二要素
|
||||
'G20GZ01': 25 // 银行卡四要素核验
|
||||
};
|
||||
|
||||
// 找出当前报告中包含的接口
|
||||
const availableAPIs = reportData.map(item => item.data.apiID).filter(id => relativeWeights[id]);
|
||||
|
||||
// 如果没有可评分的接口,返回默认分数
|
||||
if (availableAPIs.length === 0) return 60; // 默认60分
|
||||
|
||||
// 计算当前报告中所有接口的相对权重总和
|
||||
let totalWeight = 0;
|
||||
availableAPIs.forEach(apiID => {
|
||||
totalWeight += relativeWeights[apiID];
|
||||
});
|
||||
|
||||
// 计算每个权重点对应的分数
|
||||
const pointValue = maxScore / totalWeight;
|
||||
|
||||
// 基于当前报告中的接口计算实际权重
|
||||
const actualWeights = {};
|
||||
availableAPIs.forEach(apiID => {
|
||||
// 将相对权重转换为实际分数权重
|
||||
actualWeights[apiID] = relativeWeights[apiID] * pointValue;
|
||||
});
|
||||
|
||||
// 遍历报告数据进行评分
|
||||
reportData.forEach(item => {
|
||||
const apiID = item.data.apiID;
|
||||
const data = item.data.data;
|
||||
|
||||
// 如果没有定义权重,跳过
|
||||
if (!actualWeights[apiID]) return;
|
||||
|
||||
// 根据不同的API ID计算分数(只有没有风险或风险低时加分)
|
||||
switch (apiID) {
|
||||
case 'G09SC02': // 婚姻状态
|
||||
// 不计入风险
|
||||
break;
|
||||
|
||||
case 'G27BJ05': // 借贷申请记录
|
||||
if (data) {
|
||||
// 检查所有字段是否都为0(没有风险)
|
||||
let noRisk = true;
|
||||
for (const key in data) {
|
||||
if (data[key] !== 0 && data[key] !== '0') {
|
||||
noRisk = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (noRisk || !Object.keys(data).length) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G28BJ05': // 借贷行为记录
|
||||
if (data) {
|
||||
// 检查所有字段是否都为0(没有风险)
|
||||
let noRisk = true;
|
||||
for (const key in data) {
|
||||
if (data[key] !== 0 && data[key] !== '0') {
|
||||
noRisk = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (noRisk || !Object.keys(data).length) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G26BJ05': // 违约异常
|
||||
if (data) {
|
||||
// 检查除特定字段外的其他字段是否都为0(没有风险)
|
||||
const excludeFields = ['swift_number', 'code', 'flag_specialList_c'];
|
||||
let noRisk = true;
|
||||
|
||||
for (const key in data) {
|
||||
if (!excludeFields.includes(key) && data[key] !== 0 && data[key] !== '0') {
|
||||
noRisk = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (noRisk || !Object.keys(data).length) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G34BJ03': // 不良记录
|
||||
if (data && data.risk_level) {
|
||||
// 根据风险等级加分
|
||||
switch (data.risk_level) {
|
||||
case 'A': // 无风险
|
||||
score += actualWeights[apiID];
|
||||
break;
|
||||
case 'F': // 低风险
|
||||
score += actualWeights[apiID] * 0.7;
|
||||
break;
|
||||
case 'C': // 中风险
|
||||
case 'D': // 中风险
|
||||
score += actualWeights[apiID] * 0.3;
|
||||
break;
|
||||
case 'B': // 高风险
|
||||
case 'E': // 高风险
|
||||
// 不加分
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G35SC01': // 司法涉诉
|
||||
case 'G22SC01': // 司法涉诉
|
||||
case 'Q23SC01': // 企业涉诉
|
||||
if (data) {
|
||||
let hasRisk = false;
|
||||
|
||||
// 检查各种涉诉信息 - 处理嵌套数据结构
|
||||
// entout是一个单元素数组,数组中第一个元素是JSON对象,对象中有entout属性
|
||||
if (data.entout && Array.isArray(data.entout) && data.entout.length > 0 &&
|
||||
data.entout[0] && data.entout[0].entout &&
|
||||
((Array.isArray(data.entout[0].entout) && data.entout[0].entout.length > 0) ||
|
||||
(typeof data.entout[0].entout === 'object' && Object.keys(data.entout[0].entout).length > 0))) {
|
||||
hasRisk = true;
|
||||
}
|
||||
|
||||
// 处理sxbzxr(失信被执行人)嵌套结构
|
||||
if (data.sxbzxr && Array.isArray(data.sxbzxr) && data.sxbzxr.length > 0 &&
|
||||
data.sxbzxr[0] && data.sxbzxr[0].sxbzxr &&
|
||||
((Array.isArray(data.sxbzxr[0].sxbzxr) && data.sxbzxr[0].sxbzxr.length > 0) ||
|
||||
(typeof data.sxbzxr[0].sxbzxr === 'object' && Object.keys(data.sxbzxr[0].sxbzxr).length > 0))) {
|
||||
hasRisk = true;
|
||||
}
|
||||
|
||||
// 处理xgbzxr(限制高消费被执行人)嵌套结构
|
||||
if (data.xgbzxr && Array.isArray(data.xgbzxr) && data.xgbzxr.length > 0 &&
|
||||
data.xgbzxr[0] && data.xgbzxr[0].xgbzxr &&
|
||||
((Array.isArray(data.xgbzxr[0].xgbzxr) && data.xgbzxr[0].xgbzxr.length > 0) ||
|
||||
(typeof data.xgbzxr[0].xgbzxr === 'object' && Object.keys(data.xgbzxr[0].xgbzxr).length > 0))) {
|
||||
hasRisk = true;
|
||||
}
|
||||
|
||||
if (!hasRisk) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G03HZ01': // 手机号码风险
|
||||
if (data && data.filterType) {
|
||||
// 根据filterType判断风险等级
|
||||
switch (data.filterType) {
|
||||
case '0': // 安全
|
||||
score += actualWeights[apiID];
|
||||
break;
|
||||
case '3': // 低危
|
||||
score += actualWeights[apiID] * 0.7;
|
||||
break;
|
||||
case '2': // 中危
|
||||
score += actualWeights[apiID] * 0.3;
|
||||
break;
|
||||
case '1': // 高危
|
||||
// 不加分
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G19BJ02': // 手机二次卡
|
||||
if (data && data.is_second_card === false) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G02BJ02': // 手机在网时长
|
||||
if (data && data.online_months >= 6) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G15BJ02': // 手机三要素
|
||||
case 'G17BJ02': // 手机号二要素
|
||||
case 'KZEYS': // 身份证二要素
|
||||
case 'G20GZ01': // 银行卡四要素核验
|
||||
if (data && data.is_consistent) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'FIN019': // 银行卡黑名单
|
||||
if (data && data.is_blacklisted === false) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
// 未知接口类型不影响评分
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// 确保分数在0-90范围内并四舍五入
|
||||
return Math.max(0, Math.min(maxScore, Math.round(score)));
|
||||
};
|
||||
|
||||
const maskValue = computed(() => {
|
||||
return (type, value) => {
|
||||
if (!value) return value;
|
||||
@ -187,6 +466,15 @@ const maskValue = computed(() => {
|
||||
<van-tabs v-model:active="active" shrink scrollspy sticky :offset-top="46">
|
||||
<div class="flex flex-col gap-y-4 p-4">
|
||||
<LEmpty v-if="isEmpty" />
|
||||
<van-tab title="分析指数">
|
||||
|
||||
<div id="overdiv" class="title mb-4">分析指数</div>
|
||||
<div class="card mb-4">
|
||||
<div class="my-4">
|
||||
<GaugeChart :score="reportScore" />
|
||||
</div>
|
||||
</div>
|
||||
</van-tab>
|
||||
<van-tab title="基本信息">
|
||||
<div id="overdiv" class="title mb-4">基本信息</div>
|
||||
<div class="card">
|
||||
@ -203,6 +491,7 @@ const maskValue = computed(() => {
|
||||
{{ reportName }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<template v-if="Object.keys(reportParams).length != 0">
|
||||
<LTitle title="报告对象" type="blue-green"></LTitle>
|
||||
<div class="flex flex-col gap-2 my-2">
|
||||
|
@ -536,6 +536,10 @@ onUnmounted(() => {
|
||||
报告包含内容
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div
|
||||
class="rounded-lg py-2 text-center text-sm text-gray-700 font-medium bg-gradient-to-r from-blue-200 via-blue-200 to-blue-100">
|
||||
分析指数
|
||||
</div>
|
||||
<div
|
||||
class="rounded-lg py-2 text-center text-sm text-gray-700 font-medium bg-gradient-to-r from-sky-200 via-sky-200 to-sky-100">
|
||||
基本信息
|
||||
|
@ -1,9 +1,14 @@
|
||||
<script setup>
|
||||
import LEmpty from "@/components/LEmpty.vue";
|
||||
import LPendding from "@/components/LPendding.vue";
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
import GaugeChart from "@/components/GaugeChart.vue";
|
||||
|
||||
const featureMap = {
|
||||
G09SC02: {
|
||||
name: '婚姻状态',
|
||||
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
|
||||
remark: "查询结果为“未婚或尚未登记结婚”时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。"
|
||||
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。'
|
||||
},
|
||||
G27BJ05: {
|
||||
name: '借贷申请记录',
|
||||
@ -18,7 +23,7 @@ const featureMap = {
|
||||
),
|
||||
},
|
||||
G26BJ05: {
|
||||
name: '关联人异常检测',
|
||||
name: '违约异常',
|
||||
component: defineAsyncComponent(() =>
|
||||
import('@/ui/CSpecialList.vue')
|
||||
),
|
||||
@ -31,8 +36,12 @@ const featureMap = {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||
},
|
||||
G22SC01: {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuitPP.vue')),
|
||||
},
|
||||
G05HZ01: {
|
||||
name: '股东人企关系',
|
||||
name: '人企关系',
|
||||
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
||||
},
|
||||
Q23SC01: {
|
||||
@ -85,10 +94,6 @@ const featureMap = {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
import LEmpty from "@/components/LEmpty.vue";
|
||||
import LPendding from "@/components/LPendding.vue";
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
const route = useRoute();
|
||||
|
||||
const productId = ref(null);
|
||||
@ -102,6 +107,8 @@ const orderId = ref(null);
|
||||
const orderNo = ref("")
|
||||
const isEmpty = ref(false)
|
||||
const isPending = ref(false)
|
||||
const reportScore = ref(75); // 默认分数
|
||||
|
||||
onMounted(() => {
|
||||
const query = new URLSearchParams(window.location.search);
|
||||
orderNo.value = query.get("out_trade_no");
|
||||
@ -137,6 +144,9 @@ const getReport = async () => {
|
||||
reportParams.value = data.value.data.query_params
|
||||
reportName.value = data.value.data.product_name
|
||||
reportDateTime.value = data.value.data.create_time
|
||||
|
||||
// 计算综合评分
|
||||
reportScore.value = calculateScore(reportData.value);
|
||||
} else if (data.value.code === 200003) {
|
||||
isEmpty.value = true
|
||||
} else if (data.value.code === 200002) {
|
||||
@ -145,6 +155,274 @@ const getReport = async () => {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 计算综合评分的函数
|
||||
const calculateScore = (reportData) => {
|
||||
// 从0分开始
|
||||
let score = 0;
|
||||
// 最高分为90分
|
||||
const maxScore = 90;
|
||||
|
||||
// 定义各接口的相对权重比例(而非固定分值)
|
||||
const relativeWeights = {
|
||||
// 关键风险指标(高优先级)
|
||||
'G34BJ03': 250, // 不良记录
|
||||
'G26BJ05': 100, // 违约异常
|
||||
'G22SC01': 400, // 司法涉诉
|
||||
'G35SC01': 20, // 司法涉诉(次要)
|
||||
'Q23SC01': 50, // 企业涉诉
|
||||
'FIN019': 100, // 银行卡黑名单
|
||||
|
||||
// 高风险指标(中优先级)
|
||||
'G27BJ05': 40, // 借贷申请记录
|
||||
'G28BJ05': 40, // 借贷行为记录
|
||||
'G03HZ01': 70, // 手机号码风险
|
||||
|
||||
// 中风险指标(低优先级)
|
||||
'G19BJ02': 50, // 手机二次卡
|
||||
'G02BJ02': 50, // 手机在网时长
|
||||
'G05HZ01': 50, // 人企关系
|
||||
|
||||
// 验证指标(最低优先级)
|
||||
'G15BJ02': 25, // 手机三要素
|
||||
'G17BJ02': 25, // 手机号二要素
|
||||
'KZEYS': 25, // 身份证二要素
|
||||
'G20GZ01': 25 // 银行卡四要素核验
|
||||
};
|
||||
|
||||
// 找出当前报告中包含的接口
|
||||
const availableAPIs = reportData.map(item => item.data.apiID).filter(id => relativeWeights[id]);
|
||||
|
||||
// 如果没有可评分的接口,返回默认分数
|
||||
if (availableAPIs.length === 0) return 60; // 默认60分
|
||||
|
||||
// 计算当前报告中所有接口的相对权重总和
|
||||
let totalWeight = 0;
|
||||
availableAPIs.forEach(apiID => {
|
||||
totalWeight += relativeWeights[apiID];
|
||||
});
|
||||
|
||||
// 计算每个权重点对应的分数
|
||||
const pointValue = maxScore / totalWeight;
|
||||
|
||||
// 基于当前报告中的接口计算实际权重
|
||||
const actualWeights = {};
|
||||
availableAPIs.forEach(apiID => {
|
||||
// 将相对权重转换为实际分数权重
|
||||
actualWeights[apiID] = relativeWeights[apiID] * pointValue;
|
||||
});
|
||||
|
||||
// 遍历报告数据进行评分
|
||||
reportData.forEach(item => {
|
||||
const apiID = item.data.apiID;
|
||||
const data = item.data.data;
|
||||
|
||||
// 如果没有定义权重,跳过
|
||||
if (!actualWeights[apiID]) return;
|
||||
|
||||
// 根据不同的API ID计算分数(只有没有风险或风险低时加分)
|
||||
switch (apiID) {
|
||||
case 'G09SC02': // 婚姻状态
|
||||
// 不计入风险
|
||||
break;
|
||||
|
||||
case 'G27BJ05': // 借贷申请记录
|
||||
if (data) {
|
||||
// 检查所有字段是否都为0(没有风险)
|
||||
let noRisk = true;
|
||||
for (const key in data) {
|
||||
if (data[key] !== 0 && data[key] !== '0') {
|
||||
noRisk = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (noRisk || !Object.keys(data).length) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G28BJ05': // 借贷行为记录
|
||||
if (data) {
|
||||
// 检查所有字段是否都为0(没有风险)
|
||||
let noRisk = true;
|
||||
for (const key in data) {
|
||||
if (data[key] !== 0 && data[key] !== '0') {
|
||||
noRisk = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (noRisk || !Object.keys(data).length) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G26BJ05': // 违约异常
|
||||
if (data) {
|
||||
// 检查除特定字段外的其他字段是否都为0(没有风险)
|
||||
const excludeFields = ['swift_number', 'code', 'flag_specialList_c'];
|
||||
let noRisk = true;
|
||||
|
||||
for (const key in data) {
|
||||
if (!excludeFields.includes(key) && data[key] !== 0 && data[key] !== '0') {
|
||||
noRisk = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (noRisk || !Object.keys(data).length) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G34BJ03': // 不良记录
|
||||
if (data && data.risk_level) {
|
||||
// 根据风险等级加分
|
||||
switch (data.risk_level) {
|
||||
case 'A': // 无风险
|
||||
score += actualWeights[apiID];
|
||||
break;
|
||||
case 'F': // 低风险
|
||||
score += actualWeights[apiID] * 0.7;
|
||||
break;
|
||||
case 'C': // 中风险
|
||||
case 'D': // 中风险
|
||||
score += actualWeights[apiID] * 0.3;
|
||||
break;
|
||||
case 'B': // 高风险
|
||||
case 'E': // 高风险
|
||||
// 不加分
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G35SC01': // 司法涉诉
|
||||
case 'G22SC01': // 司法涉诉
|
||||
case 'Q23SC01': // 企业涉诉
|
||||
if (data) {
|
||||
let hasRisk = false;
|
||||
|
||||
// 检查各种涉诉信息 - 处理嵌套数据结构
|
||||
// entout是一个单元素数组,数组中第一个元素是JSON对象,对象中有entout属性
|
||||
if (data.entout && Array.isArray(data.entout) && data.entout.length > 0 &&
|
||||
data.entout[0] && data.entout[0].entout &&
|
||||
((Array.isArray(data.entout[0].entout) && data.entout[0].entout.length > 0) ||
|
||||
(typeof data.entout[0].entout === 'object' && Object.keys(data.entout[0].entout).length > 0))) {
|
||||
hasRisk = true;
|
||||
}
|
||||
|
||||
// 处理sxbzxr(失信被执行人)嵌套结构
|
||||
if (data.sxbzxr && Array.isArray(data.sxbzxr) && data.sxbzxr.length > 0 &&
|
||||
data.sxbzxr[0] && data.sxbzxr[0].sxbzxr &&
|
||||
((Array.isArray(data.sxbzxr[0].sxbzxr) && data.sxbzxr[0].sxbzxr.length > 0) ||
|
||||
(typeof data.sxbzxr[0].sxbzxr === 'object' && Object.keys(data.sxbzxr[0].sxbzxr).length > 0))) {
|
||||
hasRisk = true;
|
||||
}
|
||||
|
||||
// 处理xgbzxr(限制高消费被执行人)嵌套结构
|
||||
if (data.xgbzxr && Array.isArray(data.xgbzxr) && data.xgbzxr.length > 0 &&
|
||||
data.xgbzxr[0] && data.xgbzxr[0].xgbzxr &&
|
||||
((Array.isArray(data.xgbzxr[0].xgbzxr) && data.xgbzxr[0].xgbzxr.length > 0) ||
|
||||
(typeof data.xgbzxr[0].xgbzxr === 'object' && Object.keys(data.xgbzxr[0].xgbzxr).length > 0))) {
|
||||
hasRisk = true;
|
||||
}
|
||||
|
||||
if (!hasRisk) {
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G03HZ01': // 手机号码风险
|
||||
if (data && data.filterType) {
|
||||
// 根据filterType判断风险等级
|
||||
switch (data.filterType) {
|
||||
case '0': // 安全
|
||||
score += actualWeights[apiID];
|
||||
break;
|
||||
case '3': // 低危
|
||||
score += actualWeights[apiID] * 0.7;
|
||||
break;
|
||||
case '2': // 中危
|
||||
score += actualWeights[apiID] * 0.3;
|
||||
break;
|
||||
case '1': // 高危
|
||||
// 不加分
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G19BJ02': // 手机二次卡
|
||||
if (data && data.is_second_card === false) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G02BJ02': // 手机在网时长
|
||||
if (data && data.online_months >= 6) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'G15BJ02': // 手机三要素
|
||||
case 'G17BJ02': // 手机号二要素
|
||||
case 'KZEYS': // 身份证二要素
|
||||
case 'G20GZ01': // 银行卡四要素核验
|
||||
if (data && data.is_consistent) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'FIN019': // 银行卡黑名单
|
||||
if (data && data.is_blacklisted === false) {
|
||||
score += actualWeights[apiID];
|
||||
} else if (!data) {
|
||||
// 无数据视为无风险
|
||||
score += actualWeights[apiID];
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
// 未知接口类型不影响评分
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// 确保分数在0-90范围内并四舍五入
|
||||
return Math.max(0, Math.min(maxScore, Math.round(score)));
|
||||
};
|
||||
|
||||
// 对请求参数进行脱敏处理
|
||||
const maskValue = computed(() => {
|
||||
return (type, value) => {
|
||||
@ -203,11 +481,19 @@ const maskValue = computed(() => {
|
||||
<!-- <van-notice-bar color="#e03131" background="#ecf9ff" left-icon="info-o"
|
||||
text="由于天远数据APP暂未上线,建议将此网站加入收藏夹或书签,或可以百度搜索天远数据,以及在微信天远数据小程序复制链接打开" /> -->
|
||||
<template v-if="isDone">
|
||||
<van-tabs v-model:active="active" scrollspy sticky :offset-top="46">
|
||||
<van-tabs v-model:active="active" shrink scrollspy sticky :offset-top="46">
|
||||
|
||||
<div class="flex flex-col gap-y-4 p-4">
|
||||
<LEmpty v-if="isEmpty" />
|
||||
<template v-if="!isEmpty && !isPending">
|
||||
<van-tab title="分析指数">
|
||||
<div id="overdiv" class="title mb-4">分析指数</div>
|
||||
<div class="card mb-4">
|
||||
<div class="my-4">
|
||||
<GaugeChart :score="reportScore" />
|
||||
</div>
|
||||
</div>
|
||||
</van-tab>
|
||||
<van-tab title="基本信息">
|
||||
<div id="overdiv" class="title mb-4">基本信息</div>
|
||||
<div class="card">
|
||||
@ -338,8 +624,9 @@ const maskValue = computed(() => {
|
||||
</van-tab>
|
||||
</template>
|
||||
<LPendding v-if="isPending" />
|
||||
<van-tab v-for="(item, index) in reportData" :key="index" :title="featureMap[item.data.apiID].name">
|
||||
<div id="lawsuit" class="title mb-4">{{ featureMap[item.data.apiID].name }}</div>
|
||||
<van-tab v-for="(item, index) in reportData" :key="index"
|
||||
:title="featureMap[item.data.apiID]?.name">
|
||||
<div id="lawsuit" class="title mb-4">{{ featureMap[item.data.apiID]?.name }}</div>
|
||||
<component :is="featureMap[item.data.apiID].component" :data="item.data.data"
|
||||
:params="reportParams">
|
||||
</component>
|
||||
|
@ -20,7 +20,8 @@ const toPromote = () => {
|
||||
const toHelp = () => {
|
||||
router.push("/help")
|
||||
}
|
||||
const services = ref([
|
||||
const services = ref(
|
||||
[
|
||||
{
|
||||
title: '个人风险',
|
||||
name: 'riskassessment',
|
||||
@ -77,7 +78,8 @@ const services = ref([
|
||||
bgColor: ' bg-orange-400 ',
|
||||
position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg'
|
||||
},
|
||||
])
|
||||
]
|
||||
)
|
||||
|
||||
const noticeText = ref([])
|
||||
|
||||
|
@ -14,19 +14,23 @@ export default defineConfig({
|
||||
port: 5678, // 自定义端口号,可选
|
||||
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
|
||||
proxy: {
|
||||
// "/api/v1": {
|
||||
// target: "https://www.tianyuandata.com", // 本地接口地址
|
||||
// changeOrigin: true,
|
||||
// },
|
||||
"/api/v1": {
|
||||
target: "https://www.tianyuandb.com", // 本地接口地址
|
||||
changeOrigin: true,
|
||||
},
|
||||
"/api/v1/chat": {
|
||||
target: "https://www.tianyuandata.com", // 本地接口地址
|
||||
target: "https://www.tianyuandb.com", // 本地接口地址
|
||||
changeOrigin: true,
|
||||
// rewrite: (path) => path.replace(/^\/api\/v1\/chat/, '/chat')
|
||||
},
|
||||
"/api/v1": {
|
||||
target: "https://6m4685017o.goho.co", // 本地接口地址
|
||||
changeOrigin: true,
|
||||
},
|
||||
// "/api/v1": {
|
||||
// target: "https://6m4685017o.goho.co", // 本地接口地址
|
||||
// changeOrigin: true,
|
||||
// },
|
||||
// "/api/v1": {
|
||||
// target: "http:127.0.0.1:8888", // 本地接口地址
|
||||
// changeOrigin: true,
|
||||
// },
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
|
Loading…
Reference in New Issue
Block a user