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 tabbar = ref('index');
|
||||||
const menu = reactive([
|
const menu = reactive([
|
||||||
{ title: '首页', icon: 'home-o', name: 'index' },
|
{ 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: 'AI律师', icon: 'chat-o', name: 'ai' },
|
||||||
{ title: '我的', icon: 'user-o', name: 'me' },
|
{ title: '我的', icon: 'user-o', name: 'me' },
|
||||||
]);
|
]);
|
||||||
|
@ -9,7 +9,6 @@ const props = defineProps({
|
|||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const chartInstance = ref(null); // ECharts 实例
|
const chartInstance = ref(null); // ECharts 实例
|
||||||
const chartRef = ref(null); // 图表容器 DOM
|
const chartRef = ref(null); // 图表容器 DOM
|
||||||
const riskLevel = ref("");
|
const riskLevel = ref("");
|
||||||
|
@ -10,7 +10,6 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
const { data } = props;
|
const { data } = props;
|
||||||
|
|
||||||
// 图表相关
|
// 图表相关
|
||||||
const chartInstance = ref(null); // ECharts 实例
|
const chartInstance = ref(null); // ECharts 实例
|
||||||
const chartRef = ref(null); // 图表容器 DOM
|
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>
|
<template>
|
||||||
<div class="">
|
<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">
|
<div class="card py-10 text-center text-gray-500">
|
||||||
暂无关联企业信息
|
暂无关联企业信息
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import LTitle from "@/components/LTitle.vue";
|
import LTitle from "@/components/LTitle.vue";
|
||||||
|
|
||||||
// const props = defineProps({
|
const props = defineProps({
|
||||||
// data: {
|
data: {
|
||||||
// type: Object,
|
type: Object,
|
||||||
// required: true,
|
required: true,
|
||||||
// },
|
},
|
||||||
// })
|
})
|
||||||
// const { data } = props
|
const { data } = props
|
||||||
const data = ref({
|
import { ref, onMounted } from 'vue';
|
||||||
|
|
||||||
|
// 检查data是否为null或空对象
|
||||||
|
const defaultData = {
|
||||||
swift_number: "999333_20181029143459_23453A4E0",
|
swift_number: "999333_20181029143459_23453A4E0",
|
||||||
code: "00",
|
code: "00",
|
||||||
flag_specialList_c: "1",
|
flag_specialList_c: "1",
|
||||||
@ -39,57 +42,57 @@ const data = ref({
|
|||||||
sl_id_nbank_other_overdue: "0",
|
sl_id_nbank_other_overdue: "0",
|
||||||
sl_id_nbank_other_lost: "0",
|
sl_id_nbank_other_lost: "0",
|
||||||
sl_id_court_bad_time: "0",
|
sl_id_court_bad_time: "0",
|
||||||
sl_id_court_executed_time: "1",
|
sl_id_court_executed_time: "0",
|
||||||
sl_id_bank_bad_time: "1",
|
sl_id_bank_bad_time: "0",
|
||||||
sl_id_bank_overdue_time: "2",
|
sl_id_bank_overdue_time: "0",
|
||||||
sl_id_bank_lost_time: "0",
|
sl_id_bank_lost_time: "0",
|
||||||
sl_id_nbank_bad_time: "0",
|
sl_id_nbank_bad_time: "0",
|
||||||
sl_id_nbank_overdue_time: "1",
|
sl_id_nbank_overdue_time: "0",
|
||||||
sl_id_nbank_lost_time: "1",
|
sl_id_nbank_lost_time: "0",
|
||||||
sl_id_nbank_nsloan_bad_time: "0",
|
sl_id_nbank_nsloan_bad_time: "0",
|
||||||
sl_id_nbank_nsloan_overdue_time: "1",
|
sl_id_nbank_nsloan_overdue_time: "0",
|
||||||
sl_id_nbank_nsloan_lost_time: "1",
|
sl_id_nbank_nsloan_lost_time: "0",
|
||||||
sl_id_nbank_sloan_bad_time: "0",
|
sl_id_nbank_sloan_bad_time: "0",
|
||||||
sl_id_nbank_sloan_overdue_time: "1",
|
sl_id_nbank_sloan_overdue_time: "0",
|
||||||
sl_id_nbank_sloan_lost_time: "1",
|
sl_id_nbank_sloan_lost_time: "0",
|
||||||
sl_id_nbank_cons_bad_time: "1",
|
sl_id_nbank_cons_bad_time: "0",
|
||||||
sl_id_nbank_cons_overdue_time: "0",
|
sl_id_nbank_cons_overdue_time: "0",
|
||||||
sl_id_nbank_cons_lost_time: "1",
|
sl_id_nbank_cons_lost_time: "0",
|
||||||
sl_id_nbank_finlea_bad_time: "1",
|
sl_id_nbank_finlea_bad_time: "0",
|
||||||
sl_id_nbank_finlea_overdue_time: "2",
|
sl_id_nbank_finlea_overdue_time: "0",
|
||||||
sl_id_nbank_finlea_lost_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_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_bad_time: "0",
|
||||||
sl_id_nbank_other_overdue_time: "0",
|
sl_id_nbank_other_overdue_time: "0",
|
||||||
sl_id_nbank_other_lost_time: "0",
|
sl_id_nbank_other_lost_time: "0",
|
||||||
sl_id_court_bad_allnum: "1",
|
sl_id_court_bad_allnum: "0",
|
||||||
sl_id_court_executed_allnum: "1",
|
sl_id_court_executed_allnum: "0",
|
||||||
sl_id_bank_bad_allnum: "1",
|
sl_id_bank_bad_allnum: "0",
|
||||||
sl_id_bank_overdue_allnum: "2",
|
sl_id_bank_overdue_allnum: "0",
|
||||||
sl_id_bank_lost_allnum: "5",
|
sl_id_bank_lost_allnum: "0",
|
||||||
sl_id_nbank_bad_allnum: "6",
|
sl_id_nbank_bad_allnum: "0",
|
||||||
sl_id_nbank_overdue_allnum: "1",
|
sl_id_nbank_overdue_allnum: "0",
|
||||||
sl_id_nbank_lost_allnum: "1",
|
sl_id_nbank_lost_allnum: "0",
|
||||||
sl_id_nbank_nsloan_bad_allnum: "7",
|
sl_id_nbank_nsloan_bad_allnum: "0",
|
||||||
sl_id_nbank_nsloan_overdue_allnum: "1",
|
sl_id_nbank_nsloan_overdue_allnum: "0",
|
||||||
sl_id_nbank_nsloan_lost_allnum: "1",
|
sl_id_nbank_nsloan_lost_allnum: "0",
|
||||||
sl_id_nbank_sloan_bad_allnum: "1",
|
sl_id_nbank_sloan_bad_allnum: "0",
|
||||||
sl_id_nbank_sloan_overdue_allnum: "1",
|
sl_id_nbank_sloan_overdue_allnum: "0",
|
||||||
sl_id_nbank_sloan_lost_allnum: "1",
|
sl_id_nbank_sloan_lost_allnum: "0",
|
||||||
sl_id_nbank_cons_bad_allnum: "1",
|
sl_id_nbank_cons_bad_allnum: "0",
|
||||||
sl_id_nbank_cons_overdue_allnum: "9",
|
sl_id_nbank_cons_overdue_allnum: "0",
|
||||||
sl_id_nbank_cons_lost_allnum: "1",
|
sl_id_nbank_cons_lost_allnum: "0",
|
||||||
sl_id_nbank_finlea_bad_allnum: "1",
|
sl_id_nbank_finlea_bad_allnum: "0",
|
||||||
sl_id_nbank_finlea_overdue_allnum: "2",
|
sl_id_nbank_finlea_overdue_allnum: "0",
|
||||||
sl_id_nbank_finlea_lost_allnum: "4",
|
sl_id_nbank_finlea_lost_allnum: "0",
|
||||||
sl_id_nbank_autofin_bad_allnum: "1",
|
sl_id_nbank_autofin_bad_allnum: "0",
|
||||||
sl_id_nbank_autofin_overdue_allnum: "8",
|
sl_id_nbank_autofin_overdue_allnum: "0",
|
||||||
sl_id_nbank_autofin_lost_allnum: "2",
|
sl_id_nbank_autofin_lost_allnum: "0",
|
||||||
sl_id_nbank_other_bad_allnum: "5",
|
sl_id_nbank_other_bad_allnum: "0",
|
||||||
sl_id_nbank_other_overdue_allnum: "7",
|
sl_id_nbank_other_overdue_allnum: "0",
|
||||||
sl_id_nbank_other_lost_allnum: "2",
|
sl_id_nbank_other_lost_allnum: "0",
|
||||||
sl_cell_bank_bad: "0",
|
sl_cell_bank_bad: "0",
|
||||||
sl_cell_bank_overdue: "0",
|
sl_cell_bank_overdue: "0",
|
||||||
sl_cell_bank_lost: "0",
|
sl_cell_bank_lost: "0",
|
||||||
@ -114,56 +117,59 @@ const data = ref({
|
|||||||
sl_cell_nbank_other_bad: "0",
|
sl_cell_nbank_other_bad: "0",
|
||||||
sl_cell_nbank_other_overdue: "0",
|
sl_cell_nbank_other_overdue: "0",
|
||||||
sl_cell_nbank_other_lost: "0",
|
sl_cell_nbank_other_lost: "0",
|
||||||
sl_cell_bank_bad_time: "1",
|
sl_cell_bank_bad_time: "0",
|
||||||
sl_cell_bank_overdue_time: "2",
|
sl_cell_bank_overdue_time: "0",
|
||||||
sl_cell_bank_lost_time: "0",
|
sl_cell_bank_lost_time: "0",
|
||||||
sl_cell_nbank_bad_time: "0",
|
sl_cell_nbank_bad_time: "0",
|
||||||
sl_cell_nbank_overdue_time: "1",
|
sl_cell_nbank_overdue_time: "0",
|
||||||
sl_cell_nbank_lost_time: "1",
|
sl_cell_nbank_lost_time: "0",
|
||||||
sl_cell_nbank_nsloan_bad_time: "0",
|
sl_cell_nbank_nsloan_bad_time: "0",
|
||||||
sl_cell_nbank_nsloan_overdue_time: "1",
|
sl_cell_nbank_nsloan_overdue_time: "0",
|
||||||
sl_cell_nbank_nsloan_lost_time: "1",
|
sl_cell_nbank_nsloan_lost_time: "0",
|
||||||
sl_cell_nbank_sloan_bad_time: "0",
|
sl_cell_nbank_sloan_bad_time: "0",
|
||||||
sl_cell_nbank_sloan_overdue_time: "1",
|
sl_cell_nbank_sloan_overdue_time: "0",
|
||||||
sl_cell_nbank_sloan_lost_time: "1",
|
sl_cell_nbank_sloan_lost_time: "0",
|
||||||
sl_cell_nbank_cons_bad_time: "1",
|
sl_cell_nbank_cons_bad_time: "0",
|
||||||
sl_cell_nbank_cons_overdue_time: "0",
|
sl_cell_nbank_cons_overdue_time: "0",
|
||||||
sl_cell_nbank_cons_lost_time: "1",
|
sl_cell_nbank_cons_lost_time: "0",
|
||||||
sl_cell_nbank_finlea_bad_time: "1",
|
sl_cell_nbank_finlea_bad_time: "0",
|
||||||
sl_cell_nbank_finlea_overdue_time: "2",
|
sl_cell_nbank_finlea_overdue_time: "0",
|
||||||
sl_cell_nbank_finlea_lost_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_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_bad_time: "0",
|
||||||
sl_cell_nbank_other_overdue_time: "0",
|
sl_cell_nbank_other_overdue_time: "0",
|
||||||
sl_cell_nbank_other_lost_time: "0",
|
sl_cell_nbank_other_lost_time: "0",
|
||||||
sl_cell_bank_bad_allnum: "1",
|
sl_cell_bank_bad_allnum: "0",
|
||||||
sl_cell_bank_overdue_allnum: "2",
|
sl_cell_bank_overdue_allnum: "0",
|
||||||
sl_cell_bank_lost_allnum: "3",
|
sl_cell_bank_lost_allnum: "0",
|
||||||
sl_cell_nbank_bad_allnum: "5",
|
sl_cell_nbank_bad_allnum: "0",
|
||||||
sl_cell_nbank_overdue_allnum: "1",
|
sl_cell_nbank_overdue_allnum: "0",
|
||||||
sl_cell_nbank_lost_allnum: "1",
|
sl_cell_nbank_lost_allnum: "0",
|
||||||
sl_cell_nbank_nsloan_bad_allnum: "3",
|
sl_cell_nbank_nsloan_bad_allnum: "0",
|
||||||
sl_cell_nbank_nsloan_overdue_allnum: "1",
|
sl_cell_nbank_nsloan_overdue_allnum: "0",
|
||||||
sl_cell_nbank_nsloan_lost_allnum: "1",
|
sl_cell_nbank_nsloan_lost_allnum: "0",
|
||||||
sl_cell_nbank_sloan_bad_allnum: "7",
|
sl_cell_nbank_sloan_bad_allnum: "0",
|
||||||
sl_cell_nbank_sloan_overdue_allnum: "1",
|
sl_cell_nbank_sloan_overdue_allnum: "0",
|
||||||
sl_cell_nbank_sloan_lost_allnum: "1",
|
sl_cell_nbank_sloan_lost_allnum: "0",
|
||||||
sl_cell_nbank_cons_bad_allnum: "1",
|
sl_cell_nbank_cons_bad_allnum: "0",
|
||||||
sl_cell_nbank_cons_overdue_allnum: "8",
|
sl_cell_nbank_cons_overdue_allnum: "0",
|
||||||
sl_cell_nbank_cons_lost_allnum: "1",
|
sl_cell_nbank_cons_lost_allnum: "0",
|
||||||
sl_cell_nbank_finlea_bad_allnum: "1",
|
sl_cell_nbank_finlea_bad_allnum: "0",
|
||||||
sl_cell_nbank_finlea_overdue_allnum: "2",
|
sl_cell_nbank_finlea_overdue_allnum: "0",
|
||||||
sl_cell_nbank_finlea_lost_allnum: "4",
|
sl_cell_nbank_finlea_lost_allnum: "0",
|
||||||
sl_cell_nbank_autofin_bad_allnum: "1",
|
sl_cell_nbank_autofin_bad_allnum: "0",
|
||||||
sl_cell_nbank_autofin_overdue_allnum: "6",
|
sl_cell_nbank_autofin_overdue_allnum: "0",
|
||||||
sl_cell_nbank_autofin_lost_allnum: "2",
|
sl_cell_nbank_autofin_lost_allnum: "0",
|
||||||
sl_cell_nbank_other_bad_allnum: "7",
|
sl_cell_nbank_other_bad_allnum: "0",
|
||||||
sl_cell_nbank_other_overdue_allnum: "6",
|
sl_cell_nbank_other_overdue_allnum: "0",
|
||||||
sl_cell_nbank_other_lost_allnum: "9",
|
sl_cell_nbank_other_lost_allnum: "0",
|
||||||
});
|
};
|
||||||
console.log("spp data", data);
|
|
||||||
|
// 由于所有值都需要是"0",我们可以直接使用这个defaultData
|
||||||
|
const dataValue = ref(!props.data || Object.keys(props.data).length === 0 ? defaultData : props.data);
|
||||||
|
|
||||||
const bankLost = ref([]);
|
const bankLost = ref([]);
|
||||||
const lost = ref([]);
|
const lost = ref([]);
|
||||||
function totalStats(data) {
|
function totalStats(data) {
|
||||||
@ -240,8 +246,8 @@ function lostSotalStats(data) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const result = totalStats(data.value);
|
const result = totalStats(dataValue.value);
|
||||||
const lostResult = lostSotalStats(data.value);
|
const lostResult = lostSotalStats(dataValue.value);
|
||||||
bankLost.value = result;
|
bankLost.value = result;
|
||||||
lost.value = lostResult;
|
lost.value = lostResult;
|
||||||
});
|
});
|
||||||
|
@ -141,9 +141,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
import { ref, computed } from 'vue';
|
import { ref, computed } from 'vue';
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
|
const agentStore = useAgentStore()
|
||||||
|
const { isAgent } = storeToRefs(agentStore)
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const data = ref(null);
|
const data = ref(null);
|
||||||
|
|
||||||
@ -197,9 +199,8 @@ const getData = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onMounted(() => {
|
||||||
const token = localStorage.getItem("token")
|
if (isAgent.value) {
|
||||||
if (token) {
|
|
||||||
getData();
|
getData();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -3,7 +3,7 @@ const featureMap = {
|
|||||||
G09SC02: {
|
G09SC02: {
|
||||||
name: '婚姻状态',
|
name: '婚姻状态',
|
||||||
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
|
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
|
||||||
remark: "查询结果为“未婚或尚未登记结婚”时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。"
|
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。'
|
||||||
},
|
},
|
||||||
G27BJ05: {
|
G27BJ05: {
|
||||||
name: '借贷申请记录',
|
name: '借贷申请记录',
|
||||||
@ -18,7 +18,7 @@ const featureMap = {
|
|||||||
),
|
),
|
||||||
},
|
},
|
||||||
G26BJ05: {
|
G26BJ05: {
|
||||||
name: '关联人异常检测',
|
name: '违约异常',
|
||||||
component: defineAsyncComponent(() =>
|
component: defineAsyncComponent(() =>
|
||||||
import('@/ui/CSpecialList.vue')
|
import('@/ui/CSpecialList.vue')
|
||||||
),
|
),
|
||||||
@ -31,8 +31,12 @@ const featureMap = {
|
|||||||
name: '司法涉诉',
|
name: '司法涉诉',
|
||||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||||
},
|
},
|
||||||
|
G22SC01: {
|
||||||
|
name: '司法涉诉',
|
||||||
|
component: defineAsyncComponent(() => import('@/ui/CLawsuitPP.vue')),
|
||||||
|
},
|
||||||
G05HZ01: {
|
G05HZ01: {
|
||||||
name: '股东人企关系',
|
name: '人企关系',
|
||||||
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
||||||
},
|
},
|
||||||
Q23SC01: {
|
Q23SC01: {
|
||||||
@ -88,6 +92,8 @@ const featureMap = {
|
|||||||
|
|
||||||
import LEmpty from "@/components/LEmpty.vue";
|
import LEmpty from "@/components/LEmpty.vue";
|
||||||
import LRemark from "@/components/LRemark.vue";
|
import LRemark from "@/components/LRemark.vue";
|
||||||
|
import LTitle from "@/components/LTitle.vue";
|
||||||
|
import GaugeChart from "@/components/GaugeChart.vue";
|
||||||
|
|
||||||
|
|
||||||
const productId = ref(null);
|
const productId = ref(null);
|
||||||
@ -100,6 +106,8 @@ const reportName = ref("")
|
|||||||
const reportDateTime = ref(null)
|
const reportDateTime = ref(null)
|
||||||
const feature = ref("")
|
const feature = ref("")
|
||||||
const isEmpty = ref(false)
|
const isEmpty = ref(false)
|
||||||
|
const reportScore = ref(75); // 默认分数
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const query = new URLSearchParams(window.location.search);
|
const query = new URLSearchParams(window.location.search);
|
||||||
feature.value = query.get("feature");
|
feature.value = query.get("feature");
|
||||||
@ -124,11 +132,282 @@ const getReport = async () => {
|
|||||||
reportParams.value = data.value.data.query_params
|
reportParams.value = data.value.data.query_params
|
||||||
reportName.value = data.value.data.product_name
|
reportName.value = data.value.data.product_name
|
||||||
reportDateTime.value = data.value.data.create_time
|
reportDateTime.value = data.value.data.create_time
|
||||||
|
|
||||||
|
// 计算综合评分
|
||||||
|
reportScore.value = calculateScore(reportData.value);
|
||||||
} else if (data.value.code === 200003) {
|
} else if (data.value.code === 200003) {
|
||||||
isEmpty.value = true
|
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(() => {
|
const maskValue = computed(() => {
|
||||||
return (type, value) => {
|
return (type, value) => {
|
||||||
if (!value) return value;
|
if (!value) return value;
|
||||||
@ -187,6 +466,15 @@ const maskValue = computed(() => {
|
|||||||
<van-tabs v-model:active="active" shrink 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">
|
<div class="flex flex-col gap-y-4 p-4">
|
||||||
<LEmpty v-if="isEmpty" />
|
<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="基本信息">
|
<van-tab title="基本信息">
|
||||||
<div id="overdiv" class="title mb-4">基本信息</div>
|
<div id="overdiv" class="title mb-4">基本信息</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
@ -203,13 +491,14 @@ const maskValue = computed(() => {
|
|||||||
{{ reportName }}</span>
|
{{ reportName }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-if="Object.keys(reportParams).length != 0">
|
<template v-if="Object.keys(reportParams).length != 0">
|
||||||
<LTitle title="报告对象" type="blue-green"></LTitle>
|
<LTitle title="报告对象" type="blue-green"></LTitle>
|
||||||
<div class="flex flex-col gap-2 my-2">
|
<div class="flex flex-col gap-2 my-2">
|
||||||
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.name">
|
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.name">
|
||||||
<span class="text-gray-700 font-bold">姓名</span>
|
<span class="text-gray-700 font-bold">姓名</span>
|
||||||
<span class="text-gray-600">{{ maskValue("name", reportParams?.name)
|
<span class="text-gray-600">{{ maskValue("name", reportParams?.name)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.id_card">
|
v-if="reportParams?.id_card">
|
||||||
@ -221,65 +510,65 @@ const maskValue = computed(() => {
|
|||||||
v-if="reportParams?.nameMan">
|
v-if="reportParams?.nameMan">
|
||||||
<span class="text-gray-700 font-bold">男方姓名</span>
|
<span class="text-gray-700 font-bold">男方姓名</span>
|
||||||
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameMan)
|
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameMan)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.idCardMan">
|
v-if="reportParams?.idCardMan">
|
||||||
<span class="text-gray-700 font-bold">男方身份证号</span>
|
<span class="text-gray-700 font-bold">男方身份证号</span>
|
||||||
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardMan)
|
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardMan)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.nameWoman">
|
v-if="reportParams?.nameWoman">
|
||||||
<span class="text-gray-700 font-bold">女方姓名</span>
|
<span class="text-gray-700 font-bold">女方姓名</span>
|
||||||
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameWoman)
|
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameWoman)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.idCardWoman">
|
v-if="reportParams?.idCardWoman">
|
||||||
<span class="text-gray-700 font-bold">女方身份证号</span>
|
<span class="text-gray-700 font-bold">女方身份证号</span>
|
||||||
<span class="text-gray-600">{{ maskValue("id_card",
|
<span class="text-gray-600">{{ maskValue("id_card",
|
||||||
reportParams?.idCardWoman)
|
reportParams?.idCardWoman)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.bank_card">
|
v-if="reportParams?.bank_card">
|
||||||
<span class="text-gray-700 font-bold">银行卡号</span>
|
<span class="text-gray-700 font-bold">银行卡号</span>
|
||||||
<span class="text-gray-600">{{ maskValue("bank_card",
|
<span class="text-gray-600">{{ maskValue("bank_card",
|
||||||
reportParams?.bank_card)
|
reportParams?.bank_card)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.mobile">
|
v-if="reportParams?.mobile">
|
||||||
<span class="text-gray-700 font-bold">手机号</span>
|
<span class="text-gray-700 font-bold">手机号</span>
|
||||||
<span class="text-gray-600">{{ maskValue("mobile", reportParams?.mobile)
|
<span class="text-gray-600">{{ maskValue("mobile", reportParams?.mobile)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.verification_code">
|
v-if="reportParams?.verification_code">
|
||||||
<span class="text-gray-700 font-bold">验证码</span>
|
<span class="text-gray-700 font-bold">验证码</span>
|
||||||
<span class="text-gray-600">{{ maskValue("code",
|
<span class="text-gray-600">{{ maskValue("code",
|
||||||
reportParams?.verification_code)
|
reportParams?.verification_code)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.car_license">
|
v-if="reportParams?.car_license">
|
||||||
<span class="text-gray-700 font-bold">车牌号</span>
|
<span class="text-gray-700 font-bold">车牌号</span>
|
||||||
<span class="text-gray-600">{{ maskValue("car_license",
|
<span class="text-gray-600">{{ maskValue("car_license",
|
||||||
reportParams?.car_license)
|
reportParams?.car_license)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.ent_name">
|
v-if="reportParams?.ent_name">
|
||||||
<span class="text-gray-700 font-bold">企业名称</span>
|
<span class="text-gray-700 font-bold">企业名称</span>
|
||||||
<span class="text-gray-600">{{ maskValue("ent_name", reportParams?.ent_name)
|
<span class="text-gray-600">{{ maskValue("ent_name", reportParams?.ent_name)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between border-b pb-2 pl-2"
|
<div class="flex justify-between border-b pb-2 pl-2"
|
||||||
v-if="reportParams?.ent_code">
|
v-if="reportParams?.ent_code">
|
||||||
<span class="text-gray-700 font-bold">企业代码</span>
|
<span class="text-gray-700 font-bold">企业代码</span>
|
||||||
<span class="text-gray-600">{{ maskValue("ent_code", reportParams?.ent_code)
|
<span class="text-gray-600">{{ maskValue("ent_code", reportParams?.ent_code)
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col gap-4">
|
<div class="flex flex-col gap-4">
|
||||||
<div class="flex items-center bg-blue-100 rounded-xl px-4 py-2 flex-1">
|
<div class="flex items-center bg-blue-100 rounded-xl px-4 py-2 flex-1">
|
||||||
|
@ -536,6 +536,10 @@ onUnmounted(() => {
|
|||||||
报告包含内容
|
报告包含内容
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2 gap-4">
|
<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
|
<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">
|
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>
|
<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 = {
|
const featureMap = {
|
||||||
G09SC02: {
|
G09SC02: {
|
||||||
name: '婚姻状态',
|
name: '婚姻状态',
|
||||||
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
|
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
|
||||||
remark: "查询结果为“未婚或尚未登记结婚”时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。"
|
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。'
|
||||||
},
|
},
|
||||||
G27BJ05: {
|
G27BJ05: {
|
||||||
name: '借贷申请记录',
|
name: '借贷申请记录',
|
||||||
@ -18,7 +23,7 @@ const featureMap = {
|
|||||||
),
|
),
|
||||||
},
|
},
|
||||||
G26BJ05: {
|
G26BJ05: {
|
||||||
name: '关联人异常检测',
|
name: '违约异常',
|
||||||
component: defineAsyncComponent(() =>
|
component: defineAsyncComponent(() =>
|
||||||
import('@/ui/CSpecialList.vue')
|
import('@/ui/CSpecialList.vue')
|
||||||
),
|
),
|
||||||
@ -31,8 +36,12 @@ const featureMap = {
|
|||||||
name: '司法涉诉',
|
name: '司法涉诉',
|
||||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||||
},
|
},
|
||||||
|
G22SC01: {
|
||||||
|
name: '司法涉诉',
|
||||||
|
component: defineAsyncComponent(() => import('@/ui/CLawsuitPP.vue')),
|
||||||
|
},
|
||||||
G05HZ01: {
|
G05HZ01: {
|
||||||
name: '股东人企关系',
|
name: '人企关系',
|
||||||
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
||||||
},
|
},
|
||||||
Q23SC01: {
|
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 route = useRoute();
|
||||||
|
|
||||||
const productId = ref(null);
|
const productId = ref(null);
|
||||||
@ -102,6 +107,8 @@ const orderId = ref(null);
|
|||||||
const orderNo = ref("")
|
const orderNo = ref("")
|
||||||
const isEmpty = ref(false)
|
const isEmpty = ref(false)
|
||||||
const isPending = ref(false)
|
const isPending = ref(false)
|
||||||
|
const reportScore = ref(75); // 默认分数
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const query = new URLSearchParams(window.location.search);
|
const query = new URLSearchParams(window.location.search);
|
||||||
orderNo.value = query.get("out_trade_no");
|
orderNo.value = query.get("out_trade_no");
|
||||||
@ -137,6 +144,9 @@ const getReport = async () => {
|
|||||||
reportParams.value = data.value.data.query_params
|
reportParams.value = data.value.data.query_params
|
||||||
reportName.value = data.value.data.product_name
|
reportName.value = data.value.data.product_name
|
||||||
reportDateTime.value = data.value.data.create_time
|
reportDateTime.value = data.value.data.create_time
|
||||||
|
|
||||||
|
// 计算综合评分
|
||||||
|
reportScore.value = calculateScore(reportData.value);
|
||||||
} else if (data.value.code === 200003) {
|
} else if (data.value.code === 200003) {
|
||||||
isEmpty.value = true
|
isEmpty.value = true
|
||||||
} else if (data.value.code === 200002) {
|
} 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(() => {
|
const maskValue = computed(() => {
|
||||||
return (type, value) => {
|
return (type, value) => {
|
||||||
@ -203,11 +481,19 @@ const maskValue = computed(() => {
|
|||||||
<!-- <van-notice-bar color="#e03131" background="#ecf9ff" left-icon="info-o"
|
<!-- <van-notice-bar color="#e03131" background="#ecf9ff" left-icon="info-o"
|
||||||
text="由于天远数据APP暂未上线,建议将此网站加入收藏夹或书签,或可以百度搜索天远数据,以及在微信天远数据小程序复制链接打开" /> -->
|
text="由于天远数据APP暂未上线,建议将此网站加入收藏夹或书签,或可以百度搜索天远数据,以及在微信天远数据小程序复制链接打开" /> -->
|
||||||
<template v-if="isDone">
|
<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">
|
<div class="flex flex-col gap-y-4 p-4">
|
||||||
<LEmpty v-if="isEmpty" />
|
<LEmpty v-if="isEmpty" />
|
||||||
<template v-if="!isEmpty && !isPending">
|
<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="基本信息">
|
<van-tab title="基本信息">
|
||||||
<div id="overdiv" class="title mb-4">基本信息</div>
|
<div id="overdiv" class="title mb-4">基本信息</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
@ -338,8 +624,9 @@ const maskValue = computed(() => {
|
|||||||
</van-tab>
|
</van-tab>
|
||||||
</template>
|
</template>
|
||||||
<LPendding v-if="isPending" />
|
<LPendding v-if="isPending" />
|
||||||
<van-tab v-for="(item, index) in reportData" :key="index" :title="featureMap[item.data.apiID].name">
|
<van-tab v-for="(item, index) in reportData" :key="index"
|
||||||
<div id="lawsuit" class="title mb-4">{{ featureMap[item.data.apiID].name }}</div>
|
: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"
|
<component :is="featureMap[item.data.apiID].component" :data="item.data.data"
|
||||||
:params="reportParams">
|
:params="reportParams">
|
||||||
</component>
|
</component>
|
||||||
|
@ -20,64 +20,66 @@ const toPromote = () => {
|
|||||||
const toHelp = () => {
|
const toHelp = () => {
|
||||||
router.push("/help")
|
router.push("/help")
|
||||||
}
|
}
|
||||||
const services = ref([
|
const services = ref(
|
||||||
{
|
[
|
||||||
title: '个人风险',
|
{
|
||||||
name: 'riskassessment',
|
title: '个人风险',
|
||||||
subtitle: '一查全知',
|
name: 'riskassessment',
|
||||||
bg: indexIcon2,
|
subtitle: '一查全知',
|
||||||
bgColor: 'bg-indigo-400',
|
bg: indexIcon2,
|
||||||
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
bgColor: 'bg-indigo-400',
|
||||||
},
|
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
||||||
{
|
},
|
||||||
title: '婚恋风险',
|
{
|
||||||
name: 'marriage',
|
title: '婚恋风险',
|
||||||
subtitle: '查婚姻状态让爱无忧',
|
name: 'marriage',
|
||||||
bg: indexIcon1,
|
subtitle: '查婚姻状态让爱无忧',
|
||||||
bgColor: ' bg-pink-400 ',
|
bg: indexIcon1,
|
||||||
position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg'
|
bgColor: ' bg-pink-400 ',
|
||||||
},
|
position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg'
|
||||||
{
|
},
|
||||||
title: '家政服务',
|
{
|
||||||
name: 'homeservice',
|
title: '家政服务',
|
||||||
subtitle: '用人有保障',
|
name: 'homeservice',
|
||||||
bg: indexIcon3,
|
subtitle: '用人有保障',
|
||||||
bgColor: ' bg-teal-500 ',
|
bg: indexIcon3,
|
||||||
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
bgColor: ' bg-teal-500 ',
|
||||||
},
|
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
||||||
{
|
},
|
||||||
title: '租赁风险',
|
{
|
||||||
name: 'rentalinfo',
|
title: '租赁风险',
|
||||||
subtitle: '一查明了',
|
name: 'rentalinfo',
|
||||||
bg: indexIcon4,
|
subtitle: '一查明了',
|
||||||
bgColor: ' bg-sky-500 ',
|
bg: indexIcon4,
|
||||||
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
bgColor: ' bg-sky-500 ',
|
||||||
},
|
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
||||||
{
|
},
|
||||||
title: '企业报告',
|
{
|
||||||
name: 'companyinfo',
|
title: '企业报告',
|
||||||
subtitle: '合作更安心',
|
name: 'companyinfo',
|
||||||
bg: indexIcon5,
|
subtitle: '合作更安心',
|
||||||
bgColor: ' bg-blue-400 ',
|
bg: indexIcon5,
|
||||||
position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg'
|
bgColor: ' bg-blue-400 ',
|
||||||
},
|
position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg'
|
||||||
{
|
},
|
||||||
title: '人事背调',
|
{
|
||||||
name: 'backgroundcheck',
|
title: '人事背调',
|
||||||
subtitle: '招聘有保障,选人更放心',
|
name: 'backgroundcheck',
|
||||||
bg: indexIcon6,
|
subtitle: '招聘有保障,选人更放心',
|
||||||
bgColor: ' bg-orange-400 ',
|
bg: indexIcon6,
|
||||||
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
bgColor: ' bg-orange-400 ',
|
||||||
},
|
position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg'
|
||||||
{
|
},
|
||||||
title: '贷前背调',
|
{
|
||||||
name: 'preloanbackgroundcheck',
|
title: '贷前背调',
|
||||||
subtitle: '招聘有保障,选人更放心',
|
name: 'preloanbackgroundcheck',
|
||||||
bg: indexIcon7,
|
subtitle: '招聘有保障,选人更放心',
|
||||||
bgColor: ' bg-orange-400 ',
|
bg: indexIcon7,
|
||||||
position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg'
|
bgColor: ' bg-orange-400 ',
|
||||||
},
|
position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg'
|
||||||
])
|
},
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
const noticeText = ref([])
|
const noticeText = ref([])
|
||||||
|
|
||||||
|
@ -14,19 +14,23 @@ export default defineConfig({
|
|||||||
port: 5678, // 自定义端口号,可选
|
port: 5678, // 自定义端口号,可选
|
||||||
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
|
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
|
||||||
proxy: {
|
proxy: {
|
||||||
// "/api/v1": {
|
"/api/v1": {
|
||||||
// target: "https://www.tianyuandata.com", // 本地接口地址
|
target: "https://www.tianyuandb.com", // 本地接口地址
|
||||||
// changeOrigin: true,
|
changeOrigin: true,
|
||||||
// },
|
},
|
||||||
"/api/v1/chat": {
|
"/api/v1/chat": {
|
||||||
target: "https://www.tianyuandata.com", // 本地接口地址
|
target: "https://www.tianyuandb.com", // 本地接口地址
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
// rewrite: (path) => path.replace(/^\/api\/v1\/chat/, '/chat')
|
// rewrite: (path) => path.replace(/^\/api\/v1\/chat/, '/chat')
|
||||||
},
|
},
|
||||||
"/api/v1": {
|
// "/api/v1": {
|
||||||
target: "https://6m4685017o.goho.co", // 本地接口地址
|
// target: "https://6m4685017o.goho.co", // 本地接口地址
|
||||||
changeOrigin: true,
|
// changeOrigin: true,
|
||||||
},
|
// },
|
||||||
|
// "/api/v1": {
|
||||||
|
// target: "http:127.0.0.1:8888", // 本地接口地址
|
||||||
|
// changeOrigin: true,
|
||||||
|
// },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
|
Loading…
Reference in New Issue
Block a user