1
@@ -9,6 +9,7 @@
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vant/area-data": "^2.0.0",
|
||||
"@vueuse/core": "^11.3.0",
|
||||
"axios": "^1.7.7",
|
||||
"crypto-js": "^4.2.0",
|
||||
|
||||
8
pnpm-lock.yaml
generated
@@ -8,6 +8,9 @@ importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
'@vant/area-data':
|
||||
specifier: ^2.0.0
|
||||
version: 2.0.0
|
||||
'@vueuse/core':
|
||||
specifier: ^11.3.0
|
||||
version: 11.3.0(vue@3.5.13)
|
||||
@@ -521,6 +524,9 @@ packages:
|
||||
'@types/web-bluetooth@0.0.20':
|
||||
resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
|
||||
|
||||
'@vant/area-data@2.0.0':
|
||||
resolution: {integrity: sha512-zgP4AA8z09S9QTNgVCCHo9cHjcybrv22RJDYPjuCkecn4SB98T5EoPQh2TwqbQXmUhbaOGgiZGy3OUaUxnY7qg==}
|
||||
|
||||
'@vant/auto-import-resolver@1.2.1':
|
||||
resolution: {integrity: sha512-czGWW4UolNITkF3qQSQlpHDHAsI3/GHVKbRMmEEpry7NWdnU4p5a5jBi0VApbaLa5g80Hy10XVs3IB+UozoSUw==}
|
||||
|
||||
@@ -2042,6 +2048,8 @@ snapshots:
|
||||
|
||||
'@types/web-bluetooth@0.0.20': {}
|
||||
|
||||
'@vant/area-data@2.0.0': {}
|
||||
|
||||
'@vant/auto-import-resolver@1.2.1': {}
|
||||
|
||||
'@vant/popperjs@1.3.0': {}
|
||||
|
||||
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 131 KiB |
BIN
src/assets/images/head_shot.webp
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
1
src/assets/images/icon_bg.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1740754594473" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="36608" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M102.4 256a102.4 102.4 0 0 1 102.4-102.4h340.2752a102.4 102.4 0 0 1 95.0784 64.3584L665.6 281.6c3.3792 8.3968 5.4272 17.0496 6.2464 25.6H819.2a51.2 51.2 0 0 1 51.2 51.2v512a51.2 51.2 0 0 1-51.2 51.2H153.6a51.2 51.2 0 0 1-51.2-51.2V256z" fill="#2357DF" opacity=".5" p-id="36609"></path><path d="M238.592 409.6h681.8304a51.2 51.2 0 0 1 50.176 61.44l-83.8656 409.6a51.2 51.2 0 0 1-50.176 40.96H154.7776a51.2 51.2 0 0 1-50.176-61.44l83.8656-409.6a51.2 51.2 0 0 1 50.176-40.96z" fill="#2357DF" p-id="36610"></path><path d="M358.4 640m25.6 0l307.2 0q25.6 0 25.6 25.6l0 0q0 25.6-25.6 25.6l-307.2 0q-25.6 0-25.6-25.6l0 0q0-25.6 25.6-25.6Z" fill="#FFFFFF" p-id="36611"></path></svg>
|
||||
|
After Width: | Height: | Size: 1007 B |
1
src/assets/images/icon_bz.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1740754612192" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="39491" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M887.456923 331.598922C867.952667 146.308492 707.042557 2.464607 516.876064 0.026575 307.205315-2.411457 134.105045 163.374716 134.105045 368.169401c0 134.091758 73.140959 253.555324 190.166494 319.382188l7.314096 75.578991c2.438032 14.628192 14.628192 24.38032 29.256383 24.380319h299.877932c14.628192 0 26.818352-12.19016 29.256383-24.380319l7.314096-75.578991c131.653726-70.702927 204.794685-207.232717 190.166494-355.952667zM321.833507 360.855305c0 17.066224-14.628192 29.256384-29.256384 29.256384s-29.256384-12.19016-29.256383-29.256384c0-9.752128 0-17.066224 2.438031-26.818351 2.438032-17.066224 17.066224-26.818352 34.132448-26.818352 17.066224 2.438032 29.256384 17.066224 26.818352 31.694416-2.438032 9.752128-4.876064 14.628192-4.876064 21.942287z m190.166493-185.290429c-70.702927 0-134.091758 36.570479-165.786174 97.521279-4.876064 9.752128-14.628192 14.628192-26.818351 14.628191-4.876064 0-9.752128 0-14.628192-2.438032-14.628192-7.314096-19.504256-24.38032-12.19016-39.008511 43.884575-78.017023 126.777662-126.777662 219.422877-126.777662 17.066224 0 29.256384 12.19016 29.256384 29.256383s-12.19016 26.818352-29.256384 26.818352zM343.775794 833.833507c-2.438032 9.752128-2.438032 17.066224-2.438032 26.818351 0 90.207183 75.578991 163.348142 168.224206 163.348142 92.645215 0 168.224206-73.140959 168.224206-163.348142 0-9.752128 0-19.504256-2.438032-26.818351H343.775794z" fill="#F5B53A" p-id="39492"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/images/invitation.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
src/assets/images/invitation_agent_apply.png
Normal file
|
After Width: | Height: | Size: 422 KiB |
BIN
src/assets/images/logo.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
src/assets/images/promote_bg.png
Normal file
|
After Width: | Height: | Size: 170 KiB |
BIN
src/assets/images/tg_qrcode_1.png
Normal file
|
After Width: | Height: | Size: 846 KiB |
BIN
src/assets/images/vip_banner.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
src/assets/images/vip_bg.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
src/assets/images/yq_qrcode_1.png
Normal file
|
After Width: | Height: | Size: 585 KiB |
187
src/components/AgentApplicationForm.vue
Normal file
@@ -0,0 +1,187 @@
|
||||
<template>
|
||||
<van-popup v-model:show="show" destroy-on-close round position="bottom">
|
||||
<div class=" h-8 bg-blue-200/10 flex items-center justify-center font-semibold">成为代理</div>
|
||||
<div v-if="ancestor" class="text-center text-xs my-2 text-gray-500">{{ maskName(ancestor) }}邀您成为天远数据代理方</div>
|
||||
<div class="p-4">
|
||||
<van-field label-width="56" v-model="form.region" is-link readonly label="地区" placeholder="请选择地区"
|
||||
@click="showCascader = true" />
|
||||
<van-popup v-model:show="showCascader" round position="bottom">
|
||||
<van-cascader v-model="cascaderValue" title="请选择所在地区" :options="options" @close="showCascader = false"
|
||||
@finish="onFinish" />
|
||||
</van-popup>
|
||||
<van-field label-width="56" v-model="form.wechat_id" label="微信号" name="wechat_id" placeholder="请输入微信号" />
|
||||
<van-field label-width="56" v-model="form.mobile" label="手机号" name="mobile" placeholder="请输入手机号" />
|
||||
|
||||
<!-- 获取验证码按钮 -->
|
||||
<div class="flex items-center justify-between">
|
||||
<van-field label-width="56" v-model="form.code" label="验证码" name="code" placeholder="请输入验证码" />
|
||||
<button class="px-2 py-1 text-sm font-bold flex-shrink-0 rounded-lg transition duration-300"
|
||||
:class="isCountingDown || !isPhoneNumberValid ? 'cursor-not-allowed bg-gray-300 text-gray-500' : 'bg-blue-500 text-white hover:bg-blue-600'"
|
||||
@click="getSmsCode">
|
||||
{{ isCountingDown ? `${countdown}s重新获取` : '获取验证码' }}
|
||||
</button>
|
||||
</div>
|
||||
<!-- 同意条款的复选框 -->
|
||||
<div class="p-4">
|
||||
<div class="flex items-start">
|
||||
<van-checkbox v-model="isAgreed" name="agree" icon-size="16px" class=" flex-shrink-0 mr-2">
|
||||
</van-checkbox>
|
||||
<div class="text-xs text-gray-400 leading-tight">
|
||||
我已阅读并同意
|
||||
<a class="cursor-pointer text-blue-400" @click="toUserAgreement">《用户协议》</a><a
|
||||
class="cursor-pointer text-blue-400" @click="toServiceAgreement">《信息技术服务合同》</a><a
|
||||
class="cursor-pointer text-blue-400" @click="toAgentManageAgreement">《推广方管理制度协议》</a>
|
||||
<div class="text-xs text-gray-400 mt-1">点击勾选即代表您同意上述法律文书的相关条款并签署上述法律文书</div>
|
||||
<div class="text-xs text-gray-400 mt-1">手机号未在本平台注册账号则申请后将自动生成账号</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
<van-button type="primary" round block @click="submit">提交申请</van-button>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<van-button type="default" round block @click="closePopup">取消</van-button>
|
||||
</div>
|
||||
</div>
|
||||
</van-popup>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const router = useRouter()
|
||||
const show = defineModel('show')
|
||||
import { useCascaderAreaData } from '@vant/area-data';
|
||||
import { showToast } from 'vant'; // 引入 showToast 方法
|
||||
const emit = defineEmits(); // 确保 emit 可以正确使用
|
||||
const props = defineProps({
|
||||
ancestor: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
})
|
||||
const { ancestor } = toRefs(props);
|
||||
const form = ref({
|
||||
region: '',
|
||||
mobile: '',
|
||||
wechat_id: '',
|
||||
code: '', // 增加验证码字段
|
||||
});
|
||||
const showCascader = ref(false);
|
||||
const cascaderValue = ref('');
|
||||
const options = useCascaderAreaData();
|
||||
const loadingSms = ref(false); // 控制验证码按钮的loading状态
|
||||
const isCountingDown = ref(false)
|
||||
const isAgreed = ref(false)
|
||||
const countdown = ref(60)
|
||||
const onFinish = ({ selectedOptions }) => {
|
||||
showCascader.value = false;
|
||||
form.value.region = selectedOptions.map((option) => option.text).join('/');
|
||||
};
|
||||
const isPhoneNumberValid = computed(() => {
|
||||
return /^1[3-9]\d{9}$/.test(form.value.mobile)
|
||||
})
|
||||
|
||||
const getSmsCode = async () => {
|
||||
if (!form.value.mobile) {
|
||||
showToast({ message: '请输入手机号' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isPhoneNumberValid.value) {
|
||||
showToast({ message: '手机号格式不正确' });
|
||||
return;
|
||||
}
|
||||
|
||||
loadingSms.value = true;
|
||||
|
||||
const { data, error } = await useApiFetch('auth/sendSms')
|
||||
.post({ mobile: form.value.mobile, actionType: 'agentApply' })
|
||||
.json();
|
||||
|
||||
loadingSms.value = false;
|
||||
|
||||
if (data.value && !error.value) {
|
||||
if (data.value.code === 200) {
|
||||
showToast({ message: "获取成功" });
|
||||
startCountdown(); // 启动倒计时
|
||||
} else {
|
||||
showToast(data.value.msg);
|
||||
}
|
||||
}
|
||||
};
|
||||
let timer = null
|
||||
onMounted(() => {
|
||||
console.log("ancestor", ancestor.value)
|
||||
})
|
||||
function startCountdown() {
|
||||
isCountingDown.value = true
|
||||
countdown.value = 60
|
||||
timer = setInterval(() => {
|
||||
if (countdown.value > 0) {
|
||||
countdown.value--
|
||||
} else {
|
||||
clearInterval(timer)
|
||||
isCountingDown.value = false
|
||||
}
|
||||
}, 1000)
|
||||
}
|
||||
onUnmounted(() => {
|
||||
if (timer) {
|
||||
clearInterval(timer)
|
||||
}
|
||||
})
|
||||
const submit = () => {
|
||||
// 校验表单字段
|
||||
if (!form.value.region) {
|
||||
showToast({ message: '请选择地区' });
|
||||
return;
|
||||
}
|
||||
if (!form.value.mobile) {
|
||||
showToast({ message: '请输入手机号' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isPhoneNumberValid.value) {
|
||||
showToast({ message: '手机号格式不正确' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!form.value.wechat_id) {
|
||||
showToast({ message: '请输入微信号' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!form.value.code) {
|
||||
showToast({ message: '请输入验证码' });
|
||||
return;
|
||||
}
|
||||
if (!isAgreed.value) {
|
||||
showToast({ message: "请先阅读并同意用户协议及相关条款" });
|
||||
return
|
||||
}
|
||||
console.log("form", form.value)
|
||||
// 触发父组件提交申请
|
||||
emit('submit', form.value);
|
||||
};
|
||||
const maskName = computed(() => {
|
||||
return (name) => {
|
||||
return name.substring(0, 3) + "****" + name.substring(7);
|
||||
}
|
||||
})
|
||||
const closePopup = () => {
|
||||
emit('close');
|
||||
};
|
||||
|
||||
const toUserAgreement = () => {
|
||||
router.push({ name: "userAgreement" })
|
||||
}
|
||||
const toServiceAgreement = () => {
|
||||
router.push({ name: "agentSerivceAgreement" })
|
||||
|
||||
}
|
||||
const toAgentManageAgreement = () => {
|
||||
router.push({ name: "agentManageAgreement" })
|
||||
|
||||
}
|
||||
</script>
|
||||
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>
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div v-if="isWeChat" class="wechat-overlay">
|
||||
<div v-if="isWeChat && !isExcludedPage" class="wechat-overlay">
|
||||
<div class="wechat-content">
|
||||
<p class="wechat-message">
|
||||
点击右上角的<van-icon class="ml-2" name="weapp-nav" /><br />然后点击在浏览器中打开
|
||||
@@ -10,11 +10,21 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue';
|
||||
import { ref, onMounted, computed } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
// 获取当前路由
|
||||
const route = useRoute();
|
||||
|
||||
// 定义一个响应式变量,表示是否在微信环境
|
||||
const isWeChat = ref(false);
|
||||
|
||||
// 计算属性:检查当前页面是否在排除列表中
|
||||
const isExcludedPage = computed(() => {
|
||||
const excludedRoutes = ['promotionInquire', 'invitationAgentApply'];
|
||||
return excludedRoutes.includes(route.name);
|
||||
});
|
||||
|
||||
// 检查是否为微信环境
|
||||
const checkIfWeChat = () => {
|
||||
const userAgent = navigator.userAgent.toLowerCase();
|
||||
|
||||
@@ -104,7 +104,20 @@ const router = createRouter({
|
||||
import("@/views/UserAgreement.vue"),
|
||||
meta: { title: "用户协议" },
|
||||
},
|
||||
|
||||
{
|
||||
path: "/agentManageAgreement",
|
||||
name: "agentManageAgreement",
|
||||
component: () =>
|
||||
import("@/views/AgentManageAgreement.vue"),
|
||||
meta: { title: "代理管理协议" },
|
||||
},
|
||||
{
|
||||
path: "/agentSerivceAgreement",
|
||||
name: "agentSerivceAgreement",
|
||||
component: () =>
|
||||
import("@/views/AgentServiceAgreement.vue"),
|
||||
meta: { title: "信息技术服务合同" },
|
||||
},
|
||||
{
|
||||
path: "/inquire/:feature",
|
||||
name: "inquire",
|
||||
@@ -113,6 +126,44 @@ const router = createRouter({
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: "app",
|
||||
children: [{
|
||||
path: "authorization",
|
||||
name: "appAuthorization",
|
||||
component: () =>
|
||||
import("@/views/Authorization.vue"),
|
||||
meta: { title: "授权书" },
|
||||
},
|
||||
{
|
||||
path: "privacyPolicy",
|
||||
name: "appPrivacyPolicy",
|
||||
component: () =>
|
||||
import("@/views/PrivacyPolicy.vue"),
|
||||
meta: { title: "隐私政策" },
|
||||
},
|
||||
{
|
||||
path: "userAgreement",
|
||||
name: "appUserAgreement",
|
||||
component: () =>
|
||||
import("@/views/AppUserAgreement.vue"),
|
||||
meta: { title: "用户协议" },
|
||||
},
|
||||
{
|
||||
path: "agentManageAgreement",
|
||||
name: "appAgentManageAgreement",
|
||||
component: () =>
|
||||
import("@/views/AgentManageAgreement.vue"),
|
||||
meta: { title: "代理管理协议" },
|
||||
},
|
||||
{
|
||||
path: "agentSerivceAgreement",
|
||||
name: "appAgentSerivceAgreement",
|
||||
component: () =>
|
||||
import("@/views/AgentServiceAgreement.vue"),
|
||||
meta: { title: "信息技术服务合同" },
|
||||
}]
|
||||
}
|
||||
],
|
||||
},
|
||||
|
||||
@@ -126,6 +177,27 @@ const router = createRouter({
|
||||
name: "promotionInquire",
|
||||
component: () => import("@/views/PromotionInquire.vue"),
|
||||
},
|
||||
{
|
||||
path: "/agent/promotionInquire/:linkIdentifier",
|
||||
name: "promotionInquire",
|
||||
component: () => import("@/views/PromotionInquire.vue"),
|
||||
},
|
||||
{
|
||||
path: "/agent/invitationAgentApply/:linkIdentifier",
|
||||
name: "invitationAgentApply",
|
||||
component: () => import("@/views/InvitationAgentApply.vue"),
|
||||
meta: { title: "代理申请" },
|
||||
},
|
||||
{
|
||||
path: "/appInquire/:feature",
|
||||
name: "appInquire",
|
||||
component: () => import("@/views/AppInquire.vue"),
|
||||
},
|
||||
{
|
||||
path: "/appExample/:feature",
|
||||
name: "appExample",
|
||||
component: () => import("@/views/AppExample.vue"),
|
||||
},
|
||||
// {
|
||||
// path: '/home',
|
||||
// name: 'home',
|
||||
|
||||
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>
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
477
src/views/AgentManageAgreement.vue
Normal file
@@ -0,0 +1,477 @@
|
||||
<template>
|
||||
<div class="container mx-auto p-4 text-gray-800">
|
||||
<div class="box">
|
||||
<p class="text-center font-bold text-xl mb-4">代理管理制度</p>
|
||||
|
||||
<p class="indent-8 mb-2"><span>一、</span><strong>前言</strong></p>
|
||||
<p class="indent-8 mb-2">
|
||||
海南省学宇思网络科技有限公司为加强对全国代理的统一管理,规范各代理行为,确保"全能查"的顺利推广,特依据如下原则制定代理管理制度,望各级代理认真贯彻、严格遵守。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">1.谨慎性原则</p>
|
||||
<p class="indent-8 mb-2">
|
||||
本着对双方负责的态度,请各级代理务必认真贯彻执行本管理制度的工作程序,不可草率行事。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">2.用心协助原则</p>
|
||||
<p class="indent-8 mb-2">
|
||||
海南省学宇思网络科技有限公司配合各代理的工作,对于代理在推广工作中遇到的问题用心配合解决。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">3.诚信的原则</p>
|
||||
<p class="indent-8 mb-2">双方务必诚实有信用,决不提供虚假信息。</p>
|
||||
<p class="indent-8 mb-2">4.严格管理原则</p>
|
||||
<p class="indent-8 mb-2">
|
||||
认真贯彻执行各项管理制度。对违反管理制度的代理,坚决按制度规定予以处罚,直至取消代理资格,决不姑息迁就。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">5.双方共赢原则</p>
|
||||
<p class="indent-8 mb-2">
|
||||
海南省学宇思网络科技有限公司的目标是与代理共赢,共同发展。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">6.长期性原则</p>
|
||||
<p class="indent-8 mb-2">
|
||||
立足市场,与代理长期协作,确保代理用心放心地进行市场推广工作。
|
||||
</p>
|
||||
|
||||
<p class="indent-8 mb-2"><strong>二、总则</strong></p>
|
||||
<p class="indent-8 mb-2">第一条 代理期限为一年,代理协议实行一年一签制。</p>
|
||||
<p class="indent-8 mb-2">
|
||||
第二条 本制度规定海南省学宇思网络科技有限公司代理(以下称代理)权限、运作及业务处理等相关事项,旨在使海南省学宇思网络科技有限公司与各代理之间持续良好合作关系,促进双方共同发展;
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
第三条 代理经海南省学宇思网络科技有限公司授权并自代理协议书生效之日起,应严格依照代理协议及本制度的规定履行义务,享受权利。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
第四条 海南省学宇思网络科技有限公司确定的代理应遵循海南省学宇思网络科技有限公司的规定从事代理活动,不得做出损害海南省学宇思网络科技有限公司利益和形象的行为;
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
第五条 代理在代理推广过程中,应妥善处理做好售前、售中、售后的咨询维护工作。
|
||||
</p>
|
||||
|
||||
<p class="indent-8 mb-2"><strong>三、开通代理账户要求</strong></p>
|
||||
<p class="indent-8 mb-2"><strong>个人类:</strong></p>
|
||||
<p class="indent-8 mb-2">1、完全民事行为能力人。</p>
|
||||
<p class="indent-8 mb-2">2、本人实名认证的手机号。</p>
|
||||
<p class="indent-8 mb-2">3、首次提现时必须进行本人实名认证并进行人脸识别。</p>
|
||||
<p class="indent-8 mb-2">4、全面赞同全能查的各项制度,并能积极参加全能查为各代理所举办的各种活动;</p>
|
||||
|
||||
<p class="indent-8 mb-2">企业类:</p>
|
||||
<p class="indent-8 mb-2">
|
||||
1、具有独立法人资格,并能提供有效营业执照、组织代码证等相关文件复印件,经审查合格签定代理协议后即成为海南省学宇思网络科技有限公司认证代理。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
2、应具备良好的经营规模、办公条件、设备及人员,有固定的营业场所,良好的资信潜力和商业信誉。并提供以下资料:
|
||||
</p>
|
||||
<p class="indent-8 mb-2">◆营业执照复印件</p>
|
||||
<p class="indent-8 mb-2">◆身份证复印件</p>
|
||||
<p class="indent-8 mb-2">◆代理合作协议</p>
|
||||
<p class="indent-8 mb-2">◆业务场景展示</p>
|
||||
<p class="indent-8 mb-2">3、全面赞同全能查的各项制度,并能积极参加全能查为各代理所举办的各种活动;</p>
|
||||
|
||||
<p class="indent-8 mb-4"><strong>四、代理权利和义务</strong></p>
|
||||
<p class="indent-8 mb-2">
|
||||
在成为海南省学宇思网络科技有限公司的认证代理后,可享有如下权利并承担相应的义务:
|
||||
</p>
|
||||
<p class="indent-8 mb-2">1、使用全能查开展广告宣传、市场推广活动;</p>
|
||||
<p class="indent-8 mb-2">2、维护海南省学宇思网络科技有限公司及其产品的良好形象;</p>
|
||||
<p class="indent-8 mb-2">3、开拓下级业务推广并负责对其定期进行业务培训;</p>
|
||||
<p class="indent-8 mb-2">4、推广过程中做好售前、售中、售后工作。</p>
|
||||
<p class="indent-8 mb-2">
|
||||
5、如用户需要开具发票,代理则需向用户开具(咨询费)发票。如代理未开具发票,全能查有义务配合税务机关采取相关措施。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
6、代理业务推广过程中,未经海南省学宇思网络科技有限公司授权,不得使用"全能查官方"词汇用于广告宣传。
|
||||
</p>
|
||||
|
||||
<p class="font-bold mb-2">五、推广管理</p>
|
||||
<p class="indent-8 mb-2">
|
||||
1、全能查负责建立与代理之间的沟通与联系渠道,不定期地向代理提供宣传资料、信息、政策以及推广方案与管理制度等方面的支持。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
2、海南省学宇思网络科技有限公司充分尊重代理代理推广权,但有下列状况之一时,海南省学宇思网络科技有限公司将保留或者取消该代理的权利:
|
||||
</p>
|
||||
<p class="indent-8 mb-2">a代理经营管理不善,造成工作无法正常开展的;</p>
|
||||
<p class="indent-8 mb-2">b国家政策变化等不可抗力发生时;</p>
|
||||
<p class="indent-8 mb-2">c遇有客户投诉,经确认属代理操作不当的;</p>
|
||||
<p class="indent-8 mb-2">d其他严重损害海南省学宇思网络科技有限公司形象与产品形象的行为发生时;</p>
|
||||
<p class="indent-8 mb-2">e违反国家法律法规时;</p>
|
||||
<p class="indent-8 mb-2">
|
||||
3、当代理名下发生投诉时,代理需配合相关的协调。否则海南省学宇思网络科技有限公司有权无条件取消其代理资格,终止其代理协议。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">4、代理应合规宣传海南省学宇思网络科技有限公司产品形象。</p>
|
||||
<p class="indent-8 mb-2">
|
||||
5、市场运作过程中,各代理在接到市场投诉时,应及时做好记录,并报海南省学宇思网络科技有限公司相关部门妥善处理。
|
||||
</p>
|
||||
|
||||
<p class="indent-8 mb-2"><strong>六、违规处罚</strong></p>
|
||||
<p class="indent-8 mb-2">
|
||||
1、各代理在推广海南省学宇思网络科技有限公司过程中,有损害海南省学宇思网络科技有限公司产品信誉行为时,视情节轻重,海南省学宇思网络科技有限公司将对其提出书面警告直至取消其代理资格;
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
2、未按海南省学宇思网络科技有限公司有关规定和本制度开展工作的,海南省学宇思网络科技有限公司将提出书面警告并限期整改;
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
3、不遵守海南省学宇思网络科技有限公司的相关规章制度,造成与其他推广代理纠纷时,海南省学宇思网络科技有限公司将视其情节轻重,处以20000元以上50000元以下的罚款,并取消其代理资格。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
4、违反保密义务,导致海南省学宇思网络科技有限公司重大损失的,海南省学宇思网络科技有限公司将对其处以5000-20000元罚款,情节严重者将直接取消其代理资格。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
5、代理如严重违反海南省学宇思网络科技有限公司相关规章制度,海南省学宇思网络科技有限公司可随时解除双方约定的部分或全部协议。
|
||||
</p>
|
||||
|
||||
<p class="indent-8 mb-2"><strong>七、投诉类处罚</strong></p>
|
||||
<p class="indent-8 mb-2">1、代理账户累计投诉率处罚措施</p>
|
||||
<p class="indent-8 mb-2">a.月查询报告数量≥200单</p>
|
||||
|
||||
<div class="mb-4 overflow-x-auto">
|
||||
<table class="w-full border-collapse border border-gray-300">
|
||||
<thead>
|
||||
<tr class="bg-gray-100">
|
||||
<th class="border border-gray-300 p-2 w-40">处理类型</th>
|
||||
<th class="border border-gray-300 p-2">提高底价</th>
|
||||
<th class="border border-gray-300 p-2">限制修改查询售价</th>
|
||||
<th class="border border-gray-300 p-2">罚款</th>
|
||||
<th class="border border-gray-300 p-2">禁止提现</th>
|
||||
<th class="border border-gray-300 p-2">封号</th>
|
||||
<th class="border border-gray-300 p-2">黑名单</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥5%<8%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">+1</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥8%<10%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">+3</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥10%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">+5</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p class="indent-8 mb-2">b.月查询报告数量<100单</p>
|
||||
<div class="mb-4 overflow-x-auto">
|
||||
<table class="w-full border-collapse border border-gray-300">
|
||||
<thead>
|
||||
<tr class="bg-gray-100">
|
||||
<th class="border border-gray-300 p-2 w-40">处理类型</th>
|
||||
<th class="border border-gray-300 p-2">提高底价</th>
|
||||
<th class="border border-gray-300 p-2">限制修改查询售价</th>
|
||||
<th class="border border-gray-300 p-2">罚款</th>
|
||||
<th class="border border-gray-300 p-2">禁止提现</th>
|
||||
<th class="border border-gray-300 p-2">封号</th>
|
||||
<th class="border border-gray-300 p-2">黑名单</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥6%<8%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">+1</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥8%<15%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">+5</td>
|
||||
<td class="border border-gray-300 p-2 text-center">49</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥15%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p class="indent-8 mb-2">c.月查询报告数量<50单</p>
|
||||
<div class="mb-4 overflow-x-auto">
|
||||
<table class="w-full border-collapse border border-gray-300">
|
||||
<thead>
|
||||
<tr class="bg-gray-100">
|
||||
<th class="border border-gray-300 p-2 w-40">处理类型</th>
|
||||
<th class="border border-gray-300 p-2">提高底价</th>
|
||||
<th class="border border-gray-300 p-2">限制修改查询售价</th>
|
||||
<th class="border border-gray-300 p-2">罚款</th>
|
||||
<th class="border border-gray-300 p-2">禁止提现</th>
|
||||
<th class="border border-gray-300 p-2">封号</th>
|
||||
<th class="border border-gray-300 p-2">黑名单</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥15%<20%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">+3</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥20%<50%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">+5</td>
|
||||
<td class="border border-gray-300 p-2 text-center">39</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">投诉率≥50%</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p class="indent-8 mb-2">
|
||||
备注:针对客户自身原因投诉,对于产生投诉的代理账户只有三次加底价机会(底价只加不减),到第四次时直接封号。
|
||||
</p>
|
||||
<p class="indent-8 mb-4">执行时间:每月1号出数据统计,2号执行。</p>
|
||||
|
||||
<p class="indent-8 mb-2">2、代理单笔投诉处罚措施</p>
|
||||
<div class="mb-4 overflow-x-auto">
|
||||
<table class="w-full border-collapse border border-gray-300">
|
||||
<thead>
|
||||
<tr class="bg-gray-100">
|
||||
<th class="border border-gray-300 p-2 w-40">处理类型</th>
|
||||
<th class="border border-gray-300 p-2">提高底价</th>
|
||||
<th class="border border-gray-300 p-2">冻结推广收益</th>
|
||||
<th class="border border-gray-300 p-2">单笔风险资金冻结</th>
|
||||
<th class="border border-gray-300 p-2">罚款</th>
|
||||
<th class="border border-gray-300 p-2">禁止提现</th>
|
||||
<th class="border border-gray-300 p-2">封号</th>
|
||||
<th class="border border-gray-300 p-2">黑名单</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">网络公开恶意投诉(非欺诈类可解)</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">支付宝投诉</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">政务部门投诉</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">(非产品质量类)客户一般退款</td>
|
||||
<td class="border border-gray-300 p-2 text-center">1+退款次数(最高10元)</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="border border-gray-300 p-2">受代理教唆客户恶意退款</td>
|
||||
<td class="border border-gray-300 p-2 text-center">5+退款次数</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">√</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
<td class="border border-gray-300 p-2 text-center">×</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p class="indent-8 mb-2">3、扬言给客户做"数据修复"类投诉措施</p>
|
||||
<p class="indent-8 mb-2">第一步:每接到此类投诉一次,所属代理底价+10元/次,并警告。</p>
|
||||
<p class="indent-8 mb-2">第二步:警告无效后,依旧发生则采取直接封号并加入黑名单。</p>
|
||||
<p class="indent-8 mb-2 text-red-600">备注:</p>
|
||||
<p class="indent-8 mb-2 text-red-600">1)√为执行项 ×为不执行项</p>
|
||||
<p class="indent-8 mb-2 text-red-600">
|
||||
2)一般投诉罚款投诉金额1倍(除退还投诉金额外,另行按投诉金额1倍的标准进行罚款)。
|
||||
</p>
|
||||
<p class="indent-8 mb-2 text-red-600">
|
||||
如:投诉金额为45元,则退还用户投诉金额:45元,代理罚款:45*1=45元
|
||||
</p>
|
||||
<p class="indent-8 mb-2 text-red-600">
|
||||
3)公开投诉,代理罚款2倍/封号(依据具体严重情况而定,除退还投诉金额外,另行按投诉金额2倍的标准进行罚款)。
|
||||
</p>
|
||||
<p class="indent-8 mb-2 text-red-600">如:投诉金额为45元,退还用户金额:45元,则代理罚款:45*2=90元</p>
|
||||
<p class="indent-8 mb-2 text-red-600">
|
||||
4)如代理发生单笔投诉涉及到本制度第六条所规定的事由,将按第六条、第七条处罚规则合并执行。
|
||||
</p>
|
||||
|
||||
<p class="indent-8 mb-2">4、冻结、封禁类代理处罚措施</p>
|
||||
<p class="indent-8 mb-2">
|
||||
a.自冻结、封禁之日起,3个月之内无任何新的投诉、舆情升级、违法犯罪情形,代理可向平台提交"提现申请函",平台根据处罚规则先行处罚后,对可提现余额再追加10%的罚款。代理可在7个工作日内完成相关的提现操作。但该代理账户的推广功能,则进入到审核期。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
b.自冻结、封禁之日起,3个月之内有新的投诉、舆情升级、违法犯罪情形,则平台对该账户的审查期将会延长,审查期间无法提现。
|
||||
</p>
|
||||
|
||||
<p class="indent-8 mb-4"><strong>八、封号规则</strong></p>
|
||||
<p class="mb-2">
|
||||
1、同一个设备频繁更换账号登录,或同一个账号频繁在多个设备登陆,系统自动自动检测手机登录IP和设备信息,有封号风险(一机一号,不要频繁切换设备或者账户);
|
||||
</p>
|
||||
<p class="mb-2">2、欺诈用户(诱导用户);</p>
|
||||
<p class="mb-2">3、先付款后退款等承诺;</p>
|
||||
<p class="mb-2">4、保证高额下款;</p>
|
||||
<p class="mb-2">5、使用数据优化(征信优化)等骗取用户钱财。</p>
|
||||
<p class="mb-2">6、发布涉嫌性骚扰的文字、图片;</p>
|
||||
<p class="mb-2">7、使用含色情、淫秽意味或其他令人不适的头像或资料;</p>
|
||||
<p class="mb-2">8、触犯新广告法;</p>
|
||||
<p class="mb-2">9、在朋友圈中使用辱骂、恐吓、威胁等言论;</p>
|
||||
<p class="mb-2">10、发布各类垃圾广告、恶意信息、诱骗信息;</p>
|
||||
<p class="mb-2">11、盗用他人头像或资料,伪装他人身份;</p>
|
||||
<p class="mb-2">12、多人举报的账号并涉及恶意诈骗;</p>
|
||||
<p class="mb-2">13、频繁被举报,每月超过20次以上的代理账户。</p>
|
||||
<p class="mb-2">14、恶意投诉,比如没有异议非说有异议且无法提供有效证明材料,各种奇葩投诉。</p>
|
||||
<p class="mb-2">15、租用账号,发布不良言论,诈骗信息。</p>
|
||||
<p class="mb-4">16、发布不当政治言论或者任何违反国家法规政策的言论。</p>
|
||||
<p class="mb-4">更多详细内容请认真阅读全能查《代理协议》。</p>
|
||||
|
||||
<h3 class="font-bold mb-2">退款的规则及途径</h3>
|
||||
<h4 class="font-bold mb-2">【退款规则】</h4>
|
||||
<p class="mb-2">1、自订单支付完成后30天内为有效期,在30天内可申请退款。</p>
|
||||
<p class="mb-2">2、超过报告有效期30天,则无法办理退款。</p>
|
||||
<p class="mb-2">3、符合相关退款条件的用户,退款时仅退还实付金额。</p>
|
||||
<p class="mb-2">
|
||||
4、用户购买报告成功后,因不可抗力等法定原因或平台原因,导致平台无法提供服务,用户可联系客服,发起退款。
|
||||
</p>
|
||||
<p class="mb-2">5、若因用户的失误重复付款,则支持退款重复金额。</p>
|
||||
<p class="mb-2">6、服务已发生且不符合退款情形的费用不予退款。</p>
|
||||
<p class="mb-2">7、如代理在市场推广中存在欺诈等相关行为,用户可提供有效的凭证办理退款事宜。</p>
|
||||
<p class="mb-4">8、产品呈现的情况与用户本人实际情况不符,用户可提供有效的凭证发起退款申请。</p>
|
||||
|
||||
<h4 class="font-bold mb-2">【用户发起投诉】</h4>
|
||||
<p class="mb-2">1.当代理拒绝退款,用户与代理双方线下也未达成一致时,用户可联系客服发起投诉。</p>
|
||||
<p class="mb-2">2.用户提交投诉后,请用户和代理按照相关提示举证,完成举证后客服将介入处理纠纷。</p>
|
||||
<p class="mb-2">
|
||||
3.平台客服介入前,若用户与代理双方已对退款协商一致,商家可直接联系平台客服说明情况,或者用户联系平台提供撤销投诉函并说明情况即可,同时投诉会关闭。
|
||||
</p>
|
||||
<p class="mb-2">4.平台客服介入后,若需要用户与代理提供举证信息,可发送相关材料至邮箱,方便客服及时处理。</p>
|
||||
<p class="mb-4">5.平台客服会根据举证信息,联系用户与代理双方处理投诉。</p>
|
||||
|
||||
<h5 class="indent-8 font-bold mb-2">九、退款服务以及流程</h5>
|
||||
<p class="indent-8 mb-4">
|
||||
自用户购买查询报告成功之日起,无论由于何种原因,用户均可向平台申请退款(不适用退款服务的情况除外)。
|
||||
</p>
|
||||
|
||||
<div class="flex flex-col items-center mb-4">
|
||||
<p class="mb-2">用户发起退款申请</p>
|
||||
<p class="mb-2">↓</p>
|
||||
<p class="mb-2">提供有效证明凭证</p>
|
||||
<p class="mb-2">↓</p>
|
||||
<p class="mb-2">平台审核是否符合退款标准</p>
|
||||
<p class="mb-2">↓</p>
|
||||
<p class="mb-2">确认无误后退款完成</p>
|
||||
<p class="mb-2">(预计1-7个工作日内完成)</p>
|
||||
</div>
|
||||
|
||||
<h4 class="font-bold mb-2">【退款流程说明】</h4>
|
||||
<p class="indent-8 mb-2">
|
||||
原路返回----直接把金额退回到用户付款的来源方,包括但不限于支付宝帐户,暂不收取手续费。
|
||||
</p>
|
||||
<p class="indent-8 mb-4">
|
||||
具体操作流程:在发生退款时,用户可在查询页面点击"联系客服"发起"申请退款"申请,并提供有效的证明凭证,客服提交至平台系统,系统通过审核后,相关的退款金额将在1-7个工作日内原路返回对应的付款账户中。通过网银或支付宝等第三方支付平台进行支付的费用将直接退到原账户。
|
||||
</p>
|
||||
|
||||
<h4 class="font-bold mb-2">【不适用退款服务的情况】</h4>
|
||||
<p class="indent-8 mb-2">1、已超过退款期限;</p>
|
||||
<p class="indent-8 mb-2">2、恶意投诉;</p>
|
||||
<p class="indent-8 mb-4">3、违反《用户使用协议》相关规则。</p>
|
||||
|
||||
<h4 class="font-bold mb-2">【补充说明】</h4>
|
||||
<p class="indent-8 mb-4">
|
||||
如您需要退款的产品类型不在以上30天,或者超出了30 天限制,则无法办理退款。如您有产品使用方面的疑问,您可以通过联系客服进行反馈。
|
||||
</p>
|
||||
|
||||
<p class="indent-8 mb-2"><strong>十、附则</strong></p>
|
||||
<p class="indent-8 mb-2">1、本制度作为《代理协议》之附件与《代理协议》具有同等法律效力。</p>
|
||||
<p class="indent-8 mb-2">
|
||||
2、海南省学宇思网络科技有限公司将本着"诚信为本、长期服务"的宗旨和"公平合理"的原则对代理进行合理布局和调整,以实现互利互惠、共同快速发展的目的。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">3、因其他原因需终止代理关系,需向海南省学宇思网络科技有限公司提出书面申请。</p>
|
||||
<p class="indent-8 mb-2">
|
||||
4、代理之间发生业务竞争和冲突,海南省学宇思网络科技有限公司将依据公平、公正、公开的原则按相关制度予以调解、处理。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
5、如海南省学宇思网络科技有限公司与各代理之间出现协议上的纠纷,由海南省学宇思网络科技有限公司所在地法院裁决。
|
||||
</p>
|
||||
<p class="indent-8 mb-2">
|
||||
6、本制度的制定、修改与废止皆经由海南省学宇思网络科技有限公司讨论决定,解释权归海南省学宇思网络科技有限公司所有。
|
||||
</p>
|
||||
<p class="indent-8 mb-4">7、本制度于2022年1月1日起实施,公司将根据实施情况对本制度进行修正和调整。</p>
|
||||
|
||||
<p class="indent-8 mb-8">本制度一经网上点击/勾选,即代表理解并同意勾选遵守。</p>
|
||||
|
||||
<p class="text-right">本制度于 {{ effectiveDate }} 生效。</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
// 获取当前日期并格式化为中文格式
|
||||
const getFormattedDate = () => {
|
||||
const date = new Date()
|
||||
const year = date.getFullYear()
|
||||
const month = (date.getMonth() + 1).toString().padStart(2, '0')
|
||||
const day = date.getDate().toString().padStart(2, '0')
|
||||
return `${year} 年 ${month} 月 ${day} 日`
|
||||
}
|
||||
|
||||
const effectiveDate = ref(getFormattedDate())
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
277
src/views/AgentServiceAgreement.vue
Normal file
@@ -0,0 +1,277 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="container mx-auto p-4 text-gray-800">
|
||||
<p class="text-center font-bold text-lg">信息技术服务合同
|
||||
</p>
|
||||
<p class="text-left"><span></span></p>
|
||||
<p class="text-left"><span class="text-black">甲方:</span></p>
|
||||
<p class="text-left"><span class="text-black">乙方:</span><span
|
||||
class="text-black">海南省学宇思网络科技有限公司</span>
|
||||
</p>
|
||||
<p class="text-left"> </p>
|
||||
<p class="text-left"><span class="text-black">鉴于:</span></p>
|
||||
<p class="text-left"><span class="text-black">1.
|
||||
甲方为其合法合规经营之业务,依法需对甲方最终用户或有关交易和交往利害关系主体有关信息进行识别;</span></p>
|
||||
<p class="text-left"><span class="text-black">2.
|
||||
乙方具备相关信息技术之专业能力,能够为甲方提供相应服务;</span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">
|
||||
现双方根据《中华人民共和国</span><span class="text-black">民法典</span><span
|
||||
class="text-black">》等相关法律法规,本着诚实、信用、公平,促进社会诚信发展为原则,经友好协商就</span><span
|
||||
class="text-black">海南省学宇思网络科技有限公司</span><span
|
||||
class="text-black">信息技术服务事宜达成一致,签订本合同。</span></p>
|
||||
<p class="text-left"><span></span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">一、
|
||||
释义</span></p>
|
||||
<p class="text-left"><span class="text-black">
|
||||
除上下文另有约定外,下列用语具有如下含义:</span></p>
|
||||
<p class="text-left"><span class="text-black">1.1
|
||||
</span><span class="text-black">海南省学宇思网络科技有限公司</span><span
|
||||
class="text-black">信息技术服务/服务
|
||||
指乙方通过信息化、人工智能和信息科技等技术手段对</span><span class="text-black">大数据</span><span
|
||||
class="text-black">进行以公众号、小程序、APP、web页面(以下简称平台)或标准接口形式为客户提供的服务,协助客户完成信息的整理、管理等业务流程。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">1.2
|
||||
本合同 指本文本协议,及其形成本合同不可分割的附件。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.3
|
||||
本合同标题仅供方便参考之用,不影响本合同的含义与解释。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.4
|
||||
本合同甲方、乙方单独称为“一方”,合称为“双方”。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.5
|
||||
法律法规 指中国法律、行政法规、部门规章、地方性法规、地方性政府部门规章以及由政府机构颁布的其他规范性文件。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.6
|
||||
工作日 指法定节假日、休息日之外的日期。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.7
|
||||
服务有效期 指乙方依据本合同提供服务的期限。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.8
|
||||
授权
|
||||
指甲方最终用户以书面签名或法律效力等同于书面的电子签名等方式明确同意甲方向第三方服务商(指乙方并含其关联方,下同)提供本人/单位相关数据信息(包括但不限于个人信息、行为、交易、设备、不良信息,下同),及同意该第三方服务提供商查询、核实、搜集、处理、共享、使用(含合法业务应用)其本人/单位相关数据的行为,但是法律法规规定可以不经同意的除外。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">1.9
|
||||
API(Application Programming Interface,应用程序编程接口)
|
||||
指一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.10
|
||||
Web应用 指一种可以通过Web访问的应用程序,由完成特定任务的各种Web组件(web
|
||||
components)构成的并通过Web将服务展示给客户。</span></p>
|
||||
<p class="text-left"><span class="text-black">1.11
|
||||
SFTP(Secure File Transfer Protocol,安全文件传送协议)
|
||||
指可以为传输文件提供一种安全的加密方法。</span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">二、
|
||||
合作内容与方式</span></p>
|
||||
<p class="text-left"><span class="text-black">2.1
|
||||
根据本合同约定的条件和条款,甲方使用乙方提供的【</span><span
|
||||
class="text-black">海南省学宇思网络科技有限公司</span><span class="text-black">相关</span><span
|
||||
class="text-black">信息技术】服务(简称“乙方服务”或“本服务”)。</span></p>
|
||||
<p class="text-left"><span class="text-black">2.2
|
||||
|
||||
乙方负责提供服务平台或接口,供甲方通过平台或接口使用本服务。乙方向甲方提供的平台或接口是使用本服务的重要凭证,除非另有约定或说明,甲方通过该平台或接口向乙方所发出的指令及相关行为均视为甲方的行为。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">2.3
|
||||
甲方通过乙方提供的平台或API/Web应用向乙方发起服务需求,乙方通过平台或API/Web应用将服务结果返回给甲方。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">三、
|
||||
费用及支付</span></p>
|
||||
<p class="text-left"><span class="text-black">3.1
|
||||
本合同采用先付费,后使用的计价模式。甲方依据自主选择的服务项目对应费用向乙方支付服务费用。</span></p>
|
||||
<p class="text-left"><span class="text-black">3.2
|
||||
服务有效期及支付方式</span></p>
|
||||
<p class="text-left"><span class="text-black">3.2.1
|
||||
服务有效期以1年为准。
|
||||
除非另有约定,充值金额使用完毕/流量限额全部用完或服务有效期届满之日(以先到者为准)且未在服务有效期内续费或者续流量的,则本合同即终止;在服务有效期内继续充值的,则续充的服务有效期为该次充值之后12个月;如当期服务有效期届满而预付金额/流量限额未用完,乙方无需退还服务费并不予以延期使用。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">3.3
|
||||
支付方式:</span></p>
|
||||
<p class="text-left"><span class="text-black">3.3.1
|
||||
甲方向乙方一次性</span><span class="text-black">或分多次</span><span
|
||||
class="text-black">支付服务费。</span></p>
|
||||
<p class="text-left"><span class="text-black">3.3.2
|
||||
乙方根据甲方使用功能和次数实时计费,并从甲方已支付费用中扣除。</span></p>
|
||||
<p class="text-left"><span class="text-black">3.3.3
|
||||
若甲方拟继续使用服务的,则须在预付费/流量使用完毕后,继续充值。具体充值的服务项目和价格见平台展示。</span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">四、
|
||||
权利与义务</span></p>
|
||||
<p class="text-left"><span class="text-black">4.1
|
||||
甲方权利与义务</span></p>
|
||||
<p class="text-left"><span class="text-black">4.1.1
|
||||
甲方有权根据本合同约定向乙方提起服务需求</span></p>
|
||||
<p class="text-left"><span class="text-black">4.1.2
|
||||
甲方</span><span
|
||||
class="text-black">使用乙方服务,不得违反《中华人民共和国个人信息保护法》及《征信业务管理办法》的相关规定,</span><span
|
||||
class="text-black">对乙方所提供的服务信息予以保密,且严格遵守法律法规,不从事任何侵犯个人信息或商业秘密的活动。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">4.1.3
|
||||
甲方向乙方提交的服务需求及相关数据,均已经过被查询用户、最终用户充分有效的书面或电子授权,同意乙方及乙方的关联合作方对相关数据进行获取,并在乙方系统中或提交数据源方用于该合同项下的识别并进行储存、分析、处理及使用(含业务应用)等合法行为,甲方对此充分理解并认可。</span>
|
||||
</p>
|
||||
<p class="text-left"><span
|
||||
class="text-black">根据乙方要求,甲方应当向乙方提供由最终用户签字的授权文件,乙方仅予以形式审查;乙方对授权文件的审查不免除甲方就授权的真实性、合法性、完整性、与本合同约定的一致性所承担的责任。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">4.1.4
|
||||
甲方需向乙方提供经乙方服务识别有相关用户之信息及验证结果反馈。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.1.5
|
||||
未经乙方同意,甲方不得将乙方提供的服务进行宣传或使用乙方名称、业务介绍、标识、商标、知识产权等。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.1.6
|
||||
甲方应限于自身使用乙方提供的产品和服务,不得从事与乙方有竞争关系的业务。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.1.7
|
||||
除为实现本合同目的确有必要外,甲方不将获得的服务信息进行存储、复制、下载、打印。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.2
|
||||
乙方的权利和义务</span></p>
|
||||
<p class="text-left"><span class="text-black">4.2.1
|
||||
负责提供服务,向甲方提供标准平台服务或接口文件,为甲方开通服务账号。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.2.2
|
||||
乙方负责其系统的设计、开发,使系统能够支撑合作业务正常运行,并有义务对甲方提出的维护请求给予支持。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.2.3
|
||||
乙方为优化对甲方提供的服务,可对其服务系统进行升级、调试等处理。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.2.4
|
||||
在乙方受甲方委托为甲方提供信息技术服务中所产生的后果(包括但不限于因甲方提供数据缺乏真实性或准确性导致服务偏差、乙方在受托服务中与甲方用户发生纠纷或遭投诉的),由甲方负责处理与承担。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">4.2.5
|
||||
如甲方未按约定支付服务费时,乙方有权中止服务。</span></p>
|
||||
<p class="text-left"><span class="text-black">4.2.6
|
||||
因甲方违反合同保密、授权条款或违反约定使用本服务(包括但不限于5.1.6、5.1.7、5.1.8)的,乙方可以中止或终止服务,并向甲方索赔对乙方造成损失的违约费用;</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">4.2.7
|
||||
乙方为履行本合同在不影响甲方权利的前提下可以通过乙方关联公司向甲方提供服务。</span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">五、
|
||||
知识产权</span></p>
|
||||
<p class="text-left"><span class="text-black">5.1
|
||||
|
||||
乙方享有本合同产品和服务相关内容之知识产权与所有权包括但不限于:软件、程序、源代码、文档、专利、商标、著作权、域名、专有技术、商业秘密、文字表达及其组合、数据、数据变量、数据算法、数据/模型、图标、图饰、图表、色彩、界面设计;除非经乙方许可,本合同并不赋予甲方享有乙方任何知识产权上的权利。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">5.2
|
||||
除非另有约定,任何一方均不可凭借本合同取得另一方所拥有的著作权、专利权、商标权或其他知识产权。</span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">六、
|
||||
保密与信息安全</span></p>
|
||||
<p class="text-left"><span class="text-black">
|
||||
除非双方签订《商业保密协议》对保密另有约定外,需履行以下保密约定:
|
||||
</span></p>
|
||||
<p class="text-left"><span class="text-black">6.1
|
||||
|
||||
保密信息:提供方(或其母公司、子公司、关联公司)向接受方披露的信息包括但不限于本合同内容、合作模式、商业计划、投资、经营方案、分析或计算方法、系统、数据、数据变量、数据算法、数据/模型、程序、装置、规格、序列、设计、研究或开发活动和方案、知识产权、专有技术、服务信息与服务说明、业务与营销方案、推广方法、销售额、客户名单、商业机会、成本、价格及其他财务信息。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">6.2
|
||||
|
||||
保密信息不包括:(1)在收到保密信息之时或之前已合法知悉的信息且该信息不受保密义务约束;(2)非因接受方违约而成为公众信息的信息;(3)接受方从披露方及其关联方以外的其他信息源所获知的信息;(4)提供方未明示为保密信息的信息;(5)接受方未利用任何保密信息而合法独立开发的信息,或通过接受方信息数据分析而获知的信息。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">6.3
|
||||
|
||||
上述保密信息可以以数据、文字及记载上述内容的书面资料、图书、录音资料、录像资料、光盘、软件、网页、客户端等有形媒介体现,也可通过口头等形式体现。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">6.4
|
||||
任何一方在提供保密信息时,如以书面形式提供,应注明‘保密’等相关字样;如以口头或可视形式透露,应在披露前明示接受方为保密信息。</span></p>
|
||||
<p class="text-left"><span class="text-black">6.5
|
||||
|
||||
除另有约定外,未经披露方书面同意,须将保密信息严格保密,并不得直接或间接导致、准许或容许向任何第三方披露、公布、转移、挪用或泄露保密信息;接受方均不向第三方及其不必要知悉的员工披露保密信息。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">6.6
|
||||
|
||||
除另有约定外,承担保密义务的范围不包括:(1)由乙方提供给数据源方的;(2)提供给乙方关联公司的;(3)将经适当汇总、编辑、修改、整理的保密信息在必要与合理范围内提供给律师和会计师及其他专业服务提供者;(4)按照法律、法规、监管、有管辖权的法院要求须提供的信息,但在不禁止的情况下应立即向保密信息提供方予以通报。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">6.7
|
||||
双方确认除非保密信息依法公开,保密义务自本合同签订时开始持续有效;甲方是否继续使用乙方的服务,不影响保密义务的承担。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">6.8
|
||||
|
||||
双方均应当遵守法律法规关于信息安全的管理规定,并采取有效措施保障信息安全包括但不限于保障计算机系统及其相关配套设备、设施(含网络)、运行环境、信息系统功能的安全运行等。</span>
|
||||
</p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">七、
|
||||
反商业贿赂</span></p>
|
||||
<p class="text-left"><span class="text-black">7.1
|
||||
双方都清楚并愿意严格遵守反商业贿赂的法律规定,任何形式的贿赂和贪渎行为都将触犯法律,并将受到不利后果。</span></p>
|
||||
<p class="text-left"><span class="text-black">7.2
|
||||
|
||||
双方均不得向对方或对方经办人或其他相关人员索要、收受、提供给予本合同约定外的任何利益,包括但不限于明扣、暗扣、现金、购物卡、实物、有价证券旅游或其他非物质利益等,但如该等利益属于行业惯例或通常礼仪做法的除外。</span>
|
||||
</p>
|
||||
<p class="text-left"><span
|
||||
class="text-black">本款“相关人员”是指双方经办人以外的与本合同有直接或间接利益关系的人员,如经办人的亲友等。</span>
|
||||
</p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">八、
|
||||
违约责任</span></p>
|
||||
<p class="text-left"><span class="text-black">8.1
|
||||
|
||||
除非另有约定,任何一方未履行本合同或违反约定且未及时改正或采取补救措施的,违约方应向守约方按照已发生合同金额的</span><span
|
||||
class="text-black">30</span><span
|
||||
class="text-black">%向守约方承担违约责任,并赔偿守约方因此受到的直接经济损失(包括调查、仲裁、诉讼、律师等合理费用)。</span></p>
|
||||
<p class="text-left"><span class="text-black">8.2
|
||||
|
||||
如因甲方原因导致本合同终止的,其无权要求乙方退回已收取而未使用的服务费;若一方因对方或其它非己方原因未能履行本合同下的义务,一方无需赔偿对方承受的损失。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">8.3
|
||||
一方未行使、迟延行使或部分行使其权利,并不意味该权利被放弃;某一权利不行使并不意味着其它权利被放弃。</span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">九、
|
||||
免责事由</span></p>
|
||||
<p class="text-left"><span class="text-black">除特别指明外,一方无须就下列情形承担责任:</span></p>
|
||||
<p class="text-left"><span class="text-black">9.1
|
||||
|
||||
不可抗力。不可抗力是指合同双方当事人不能预见、不能避免并不能克服的客观情况,包括但不限于:战争、骚乱、恐怖主义、洪水、地震、台风、国家公布的疫情等事件。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">9.2
|
||||
|
||||
因法律、法规、规章、规定、指引、通知、政策、命令及其他规范性文件或政府行为原因导致本合同不能履行的,适用关于不可抗力的规定。</span></p>
|
||||
<p class="text-left"><span class="text-black">9.3
|
||||
乙方为改善服务质量或数据源方对系统进行调整、升级、扩容等措施而导致服务中断、延时等情况。</span></p>
|
||||
<p class="text-left"><span class="text-black">9.4
|
||||
因网络、设备、黑客攻击、计算机病毒侵入或发作、通信或电力故障等不可预测因素造成不能提供服务的情形。</span></p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">十、
|
||||
争议解决与法律适用</span></p>
|
||||
<p class="text-left"><span class="text-black">10.1
|
||||
因履行本合同而发生的一切争议,甲乙双方应协商解决。协商不成的,任何一方均有权向乙方所在地有管辖权法院提起诉讼。</span></p>
|
||||
<p class="text-left"><span class="text-black">十一、
|
||||
通知与送达</span></p>
|
||||
<p class="text-left"><span class="text-black">11.1
|
||||
|
||||
本合同项下的通知应以电子邮件、快递、传真、专人递送按合同签署页所列示联系方式发出,除非任何一方已书面通知对方变更联系方式并经对方确认。</span></p>
|
||||
<p class="text-left"><span class="text-black">11.2
|
||||
|
||||
书面通知的形式包括在网站公告、电子邮件、站内信、微信、手机短信和传真等电子方式及纸质文件。通知在下列日期视为送达被通知方:如以电子邮件发送,显示成功发送确认时,或发送后第一个工作日内未被退回;如是以快递发送,以交邮后第五个工作日;如以传真发送,于发件人传真机记录传输确认时;如以专人递送,被通知方签收日。</span>
|
||||
</p>
|
||||
<p class="text-left"></p>
|
||||
<p class="text-left"><span class="text-black">十二、
|
||||
其他</span></p>
|
||||
<p class="text-left"><span class="text-black">12.1
|
||||
|
||||
本合同附件作为本合同的组成部分,与本合同具有同等的法律效力;未尽事宜经双方协商后签订补充合同,补充合同与本合同条款如有冲突,以补充合同为准。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">12.2
|
||||
本合同终止日与服务有效期终止日相同,在合同期限届满前由双方友好协商是否续约。</span></p>
|
||||
<p class="text-left"><span class="text-black">12.3
|
||||
|
||||
本合同终止不影响合同中有关授权、付款、保密、知识产权、反商业贿赂、违约责任、争议解决与法律适用等可以独立存在的条款的效力,一方未履行完毕的义务仍需继续履行。</span>
|
||||
</p>
|
||||
<p class="text-left"><span class="text-black">12.4
|
||||
本合同自甲方支付/充值费用之日</span><span class="text-black">计算服务期限</span><span
|
||||
class="text-black">,合同期限为12个月。</span></p>
|
||||
<p style="text-indent:24pt;"><span>本协议通过点击同意/勾选的方式签署,自签署之日生效。</span>
|
||||
</p>
|
||||
<p style="text-indent: 24pt; text-align: right;"><span>本协议于 {{ effectiveDate }}生效。</span></p>
|
||||
<p class="text-center"></p>
|
||||
<p></p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const getFormattedDate = () => {
|
||||
const date = new Date()
|
||||
const year = date.getFullYear()
|
||||
const month = (date.getMonth() + 1).toString().padStart(2, '0')
|
||||
const day = date.getDate().toString().padStart(2, '0')
|
||||
return `${year} 年 ${month} 月 ${day} 日`
|
||||
}
|
||||
|
||||
const effectiveDate = ref(getFormattedDate())
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
p {
|
||||
@apply my-1
|
||||
}
|
||||
</style>
|
||||
147
src/views/AppExample.vue
Normal file
@@ -0,0 +1,147 @@
|
||||
<script setup>
|
||||
import { useRoute } from "vue-router";
|
||||
|
||||
|
||||
const route = useRoute();
|
||||
|
||||
// 当前日期
|
||||
const today = new Date();
|
||||
|
||||
const feature = ref(route.params.feature);
|
||||
const featureData = ref({});
|
||||
|
||||
|
||||
onBeforeMount(() => {
|
||||
getProduct();
|
||||
})
|
||||
|
||||
|
||||
async function getProduct() {
|
||||
const { data, error } = await useApiFetch(`/product/app_en/${feature.value}`)
|
||||
.get()
|
||||
.json();
|
||||
if (data.value && !error.value) {
|
||||
if (data.value.code === 200) {
|
||||
feature.value = data.value.data.product_en;
|
||||
featureData.value = data.value.data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let timer = null;
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="inquire-bg min-h-screen p-6">
|
||||
<div class="mb-6 text-center text-3xl font-bold text-blue-700">
|
||||
{{ featureData.product_name }} 代理推广示例
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="mb-4 text-xl text-gray-800 font-bold">
|
||||
{{ featureData.product_name }}
|
||||
</div>
|
||||
<div class="mb-4 text-gray-600 leading-relaxed" v-html="featureData.description">
|
||||
|
||||
</div>
|
||||
|
||||
<template v-if="featureData.features && featureData.features.length > 1">
|
||||
<div class="mb-4 text-lg text-gray-800 font-semibold">
|
||||
报告包含内容
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div v-for="(feature, index) in featureData.features" :key="feature.id"
|
||||
class="rounded-lg py-2 text-center text-sm text-gray-700 font-medium" :class="[
|
||||
(Math.floor(index / 2) + (index % 2)) % 2 === 0
|
||||
? 'bg-gradient-to-r from-blue-200 via-blue-200 to-blue-100'
|
||||
: 'bg-gradient-to-r from-sky-200 via-sky-200 to-sky-100',
|
||||
]">
|
||||
{{ feature.name }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<div class=" mt-4">
|
||||
<div class="mb-4 text-xl text-center text-blue-700 font-semibold">
|
||||
成为代理伙伴的优势
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<!-- 0基础 -->
|
||||
<div class="p-4 bg-white rounded-lg shadow-sm">
|
||||
<div class="flex items-center mb-2">
|
||||
<div class="w-10 h-10 flex items-center justify-center bg-orange-100 rounded-lg">
|
||||
<span class="text-orange-500 text-xl">📚</span>
|
||||
</div>
|
||||
<div class="ml-3 font-medium">0基础</div>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600">
|
||||
无需专业技术背景<br>
|
||||
小白也可轻松上手
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 类型丰富 -->
|
||||
<div class="p-4 bg-white rounded-lg shadow-sm">
|
||||
<div class="flex items-center mb-2">
|
||||
<div class="w-10 h-10 flex items-center justify-center bg-blue-100 rounded-lg">
|
||||
<span class="text-blue-500 text-xl">📊</span>
|
||||
</div>
|
||||
<div class="ml-3 font-medium">类型丰富</div>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600">
|
||||
提供多种<br>
|
||||
报告类型查询
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 灵活自由 -->
|
||||
<div class="p-4 bg-white rounded-lg shadow-sm">
|
||||
<div class="flex items-center mb-2">
|
||||
<div class="w-10 h-10 flex items-center justify-center bg-green-100 rounded-lg">
|
||||
<span class="text-green-500 text-xl">🚩</span>
|
||||
</div>
|
||||
<div class="ml-3 font-medium">灵活自由</div>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600">
|
||||
价格你说了算,<br>
|
||||
随时随地可推广
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 市场广阔 -->
|
||||
<div class="p-4 bg-white rounded-lg shadow-sm">
|
||||
<div class="flex items-center mb-2">
|
||||
<div class="w-10 h-10 flex items-center justify-center bg-red-100 rounded-lg">
|
||||
<span class="text-red-500 text-xl">📈</span>
|
||||
</div>
|
||||
<div class="ml-3 font-medium">市场广阔</div>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600">
|
||||
市场前景好<br>
|
||||
机会众生,创收空间大
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.form-label {
|
||||
@apply w-20 text-sm font-medium text-gray-700 flex-shrink-0;
|
||||
}
|
||||
|
||||
.form-input::placeholder {
|
||||
color: var(--van-text-color-3);
|
||||
}
|
||||
|
||||
.form-input {
|
||||
@apply w-full border-b border-gray-200 px-2 py-2 focus:outline-none;
|
||||
}
|
||||
|
||||
.inquire-bg {
|
||||
background: url("@/assets/images/bg_2.png") no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
}
|
||||
</style>
|
||||
591
src/views/AppInquire.vue
Normal file
@@ -0,0 +1,591 @@
|
||||
<script setup>
|
||||
import { ref, reactive, computed, onMounted, onUnmounted } from "vue";
|
||||
import { aesEncrypt } from "@/utils/crypto";
|
||||
import { useRoute } from "vue-router";
|
||||
|
||||
import Authorization from "@/components/Authorization.vue";
|
||||
import Payment from "@/components/Payment.vue";
|
||||
import CarNumberInput from "@/components/CarNumberInput.vue";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter()
|
||||
const showAuthorizationPopup = ref(false);
|
||||
const authorization = ref(true);
|
||||
const showPayment = ref(false);
|
||||
const queryId = ref(null);
|
||||
const name = ref("");
|
||||
const nameMan = ref("");
|
||||
const nameWoman = ref("");
|
||||
const idCard = ref("");
|
||||
const idCardMan = ref("");
|
||||
const idCardWoman = ref("");
|
||||
const mobile = ref("");
|
||||
const bankCard = ref("");
|
||||
const startDate = ref([])
|
||||
const dateVal = ref("")
|
||||
const showDatePicker = ref(false)
|
||||
// 当前日期
|
||||
const today = new Date();
|
||||
const maxDate = today; // 最大日期为当前日期
|
||||
// 最小日期为2000年1月1日
|
||||
const minDate = new Date('2000-01-01');
|
||||
const entName = ref("");
|
||||
const entCode = ref("");
|
||||
const verificationCode = ref("");
|
||||
const agreeToTerms = ref(false);
|
||||
const isCountingDown = ref(false);
|
||||
const countdown = ref(60);
|
||||
const feature = ref(route.params.feature);
|
||||
const featureData = ref({});
|
||||
const carLicense = ref("");
|
||||
const carType = ref("小型汽车");
|
||||
const carPickerVal = ref([{ value: "02", text: "小型汽车" }]);
|
||||
const showCarTypePicker = ref(false);
|
||||
const carTypeColumns = [
|
||||
{ value: "01", text: "大型汽车" },
|
||||
{ value: "02", text: "小型汽车" },
|
||||
{ value: "03", text: "使馆汽车" },
|
||||
{ value: "04", text: "领馆汽车" },
|
||||
{ value: "05", text: "境外汽车" },
|
||||
{ value: "06", text: "外籍汽车" },
|
||||
{ value: "07", text: "普通摩托车" },
|
||||
{ value: "08", text: "轻便摩托车" },
|
||||
{ value: "09", text: "使馆摩托车" },
|
||||
{ value: "10", text: "领馆摩托车" },
|
||||
{ value: "11", text: "境外摩托车" },
|
||||
{ value: "12", text: "外籍摩托车" },
|
||||
{ value: "13", text: "低速车" },
|
||||
{ value: "14", text: "拖拉机" },
|
||||
{ value: "15", text: "挂车" },
|
||||
{ value: "16", text: "教练汽车" },
|
||||
{ value: "17", text: "教练摩托车" },
|
||||
{ value: "20", text: "临时入境汽车" },
|
||||
{ value: "21", text: "临时入境摩托车" },
|
||||
{ value: "22", text: "临时行驶车" },
|
||||
{ value: "23", text: "警用汽车" },
|
||||
{ value: "24", text: "警用摩托车" },
|
||||
{ value: "51", text: "新能源大型车" },
|
||||
{ value: "52", text: "新能源小型车" },
|
||||
];
|
||||
const formatterDate = (type, option) => {
|
||||
if (type === 'year') {
|
||||
option.text += '年';
|
||||
}
|
||||
if (type === 'month') {
|
||||
option.text += '月';
|
||||
}
|
||||
if (type === 'day') {
|
||||
option.text += '日';
|
||||
}
|
||||
return option;
|
||||
};
|
||||
const onConfirmDate = ({ selectedValues, selectedOptions }) => {
|
||||
dateVal.value = selectedOptions.map(item => item.text).join('');
|
||||
showDatePicker.value = false
|
||||
}
|
||||
const carLicenseChange = (e) => {
|
||||
carLicense.value = e;
|
||||
};
|
||||
const onConfirmCarType = ({ selectedValues, selectedOptions }) => {
|
||||
showCarTypePicker.value = false;
|
||||
carPickerVal.value = selectedValues;
|
||||
carType.value = selectedOptions[0].text;
|
||||
};
|
||||
|
||||
onBeforeMount(() => {
|
||||
getProduct();
|
||||
})
|
||||
onMounted(() => {
|
||||
isFinishPayment()
|
||||
initAuthorization();
|
||||
});
|
||||
const discountPrice = ref(false) // 是否应用折扣
|
||||
|
||||
function isFinishPayment() {
|
||||
const query = new URLSearchParams(window.location.search);
|
||||
let orderNo = query.get("out_trade_no");
|
||||
if (orderNo) {
|
||||
router.push({ path: '/report', query: { orderNo } });
|
||||
}
|
||||
}
|
||||
async function getProduct() {
|
||||
const { data, error } = await useApiFetch(`/product/app_en/${feature.value}`)
|
||||
.get()
|
||||
.json();
|
||||
if (data.value && !error.value) {
|
||||
if (data.value.code === 200) {
|
||||
feature.value = data.value.data.product_en;
|
||||
featureData.value = data.value.data;
|
||||
console.log("feature", feature.value)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
function initAuthorization() {
|
||||
if (NeedAuthorization.includes(feature.value)) {
|
||||
authorization.value = false;
|
||||
}
|
||||
}
|
||||
const isPhoneNumberValid = computed(() => {
|
||||
return /^1[3-9]\d{9}$/.test(mobile.value);
|
||||
});
|
||||
const isIdCardValid = computed(() => /^\d{17}[\dX]$/i.test(idCard.value));
|
||||
const isIdCardManValid = computed(() => /^\d{17}[\dX]$/i.test(idCardMan.value));
|
||||
const isIdCardWomanValid = computed(() =>
|
||||
/^\d{17}[\dX]$/i.test(idCardWoman.value)
|
||||
);
|
||||
const isCreditCodeValid = computed(() => /^.{18}$/.test(entCode.value));
|
||||
const isCarLicense = computed(() => carLicense.value.trim().length > 6);
|
||||
const isBankCardValid = computed(() => {
|
||||
const card = bankCard.value.replace(/\D/g, ""); // 移除所有非数字字符
|
||||
if (card.length < 13 || card.length > 19) {
|
||||
return false; // 校验长度
|
||||
}
|
||||
|
||||
let sum = 0;
|
||||
let shouldDouble = false;
|
||||
|
||||
// 从卡号的右边开始遍历
|
||||
for (let i = card.length - 1; i >= 0; i--) {
|
||||
let digit = parseInt(card.charAt(i));
|
||||
|
||||
if (shouldDouble) {
|
||||
digit *= 2;
|
||||
if (digit > 9) {
|
||||
digit -= 9;
|
||||
}
|
||||
}
|
||||
|
||||
sum += digit;
|
||||
shouldDouble = !shouldDouble; // 反转是否乘 2
|
||||
}
|
||||
|
||||
return sum % 10 === 0; // 如果最终和能被 10 整除,则银行卡号有效
|
||||
});
|
||||
|
||||
function handleSubmit() {
|
||||
if (!agreeToTerms.value) {
|
||||
showToast({ message: `请阅读并同意用户协议、隐私政策${!NeedAuthorization.includes(feature.value) ? '和授权书' : ''}` });
|
||||
return;
|
||||
}
|
||||
if (
|
||||
!validateField("name", name.value, (v) => v, "请输入姓名") ||
|
||||
!validateField("nameMan", nameMan.value, (v) => v, "请输入男方姓名") ||
|
||||
!validateField(
|
||||
"nameWoman",
|
||||
nameWoman.value,
|
||||
(v) => v,
|
||||
"请输入女方姓名"
|
||||
) ||
|
||||
!validateField(
|
||||
"mobile",
|
||||
mobile.value,
|
||||
(v) => isPhoneNumberValid.value,
|
||||
"请输入有效的手机号"
|
||||
) ||
|
||||
!validateField(
|
||||
"idCard",
|
||||
idCard.value,
|
||||
(v) => isIdCardValid.value,
|
||||
"请输入有效的身份证号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"idCardMan",
|
||||
idCardMan.value,
|
||||
(v) => isIdCardManValid.value,
|
||||
"请输入有效的男方身份证号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"idCardWoman",
|
||||
idCardWoman.value,
|
||||
(v) => isIdCardWomanValid.value,
|
||||
"请输入有效的女方身份证号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"bankCard",
|
||||
bankCard.value,
|
||||
(v) => isBankCardValid.value,
|
||||
"请输入有效的银行卡号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"verificationCode",
|
||||
verificationCode.value,
|
||||
(v) => v,
|
||||
"请输入验证码"
|
||||
) ||
|
||||
!validateField(
|
||||
"carPickerVal",
|
||||
carPickerVal.value,
|
||||
(v) => v,
|
||||
"请选择车辆类型"
|
||||
) ||
|
||||
!validateField(
|
||||
"carLicense",
|
||||
carLicense.value,
|
||||
(v) => isCarLicense.value,
|
||||
"请输入正确的车牌号"
|
||||
) ||
|
||||
!validateField("entName", entName.value, (v) => v, "请输入企业名称") ||
|
||||
!validateField(
|
||||
"entCode",
|
||||
entCode.value,
|
||||
(v) => isCreditCodeValid.value,
|
||||
"请输入统一社会信用代码"
|
||||
) ||
|
||||
!validateField(
|
||||
"date",
|
||||
dateVal.value,
|
||||
(v) => v,
|
||||
"请选择日期"
|
||||
)
|
||||
|
||||
) {
|
||||
return;
|
||||
}
|
||||
submitRequest();
|
||||
}
|
||||
const validateField = (field, value, validationFn, errorMessage) => {
|
||||
if (isHasInput(field) && !validationFn(value)) {
|
||||
showToast({ message: errorMessage });
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
const defaultInput = ["name", "idCard", "mobile", "verificationCode"];
|
||||
const specialProduct = {
|
||||
toc_EnterpriseLawsuit: ["entName", "entCode", "mobile", "verificationCode"],
|
||||
toc_PhoneThreeElements: ["name", "idCard", "mobile"],
|
||||
toc_IDCardTwoElements: ["name", "idCard"],
|
||||
toc_PhoneTwoElements: ["name", "mobile"],
|
||||
toc_PersonVehicleVerification: ["name", "carType", "carLicense"],
|
||||
toc_VehiclesUnderName: ["name", "idCard"],
|
||||
toc_DualMarriage: ["nameMan", "idCardMan", "nameWoman", "idCardWoman"],
|
||||
toc_BankCardBlacklist: ["name", "idCard", "mobile", "bankCard"],
|
||||
toc_BankCardFourElements: ["name", "idCard", "mobile", "bankCard"],
|
||||
toc_NaturalLifeStatus: ["name", "idCard"],
|
||||
toc_NetworkDuration: ["mobile"],
|
||||
toc_PhoneSecondaryCard: ["mobile", "date"],
|
||||
toc_PhoneNumberRisk: ["mobile"],
|
||||
};
|
||||
const NeedAuthorization = [
|
||||
"toc_Marriage",
|
||||
"marriage"
|
||||
];
|
||||
const isHasInput = (input) => {
|
||||
if (specialProduct[feature.value]) {
|
||||
return specialProduct[feature.value].includes(input);
|
||||
} else {
|
||||
return defaultInput.includes(input);
|
||||
}
|
||||
};
|
||||
async function submitRequest() {
|
||||
const req = {};
|
||||
if (isHasInput("name")) {
|
||||
req.name = name.value;
|
||||
}
|
||||
if (isHasInput("idCard")) {
|
||||
req.id_card = idCard.value;
|
||||
}
|
||||
if (isHasInput("nameMan")) {
|
||||
req.name_man = nameMan.value;
|
||||
}
|
||||
if (isHasInput("idCardMan")) {
|
||||
req.id_card_man = idCardMan.value;
|
||||
}
|
||||
if (isHasInput("nameWoman")) {
|
||||
req.name_woman = nameWoman.value;
|
||||
}
|
||||
if (isHasInput("idCardWoman")) {
|
||||
req.id_card_woman = idCardWoman.value;
|
||||
}
|
||||
if (isHasInput("bankCard")) {
|
||||
req.bank_card = bankCard.value.replace(/\D/g, "");
|
||||
}
|
||||
if (isHasInput("mobile")) {
|
||||
req.mobile = mobile.value;
|
||||
}
|
||||
if (isHasInput("verificationCode")) {
|
||||
req.code = verificationCode.value;
|
||||
}
|
||||
if (isHasInput("carType")) {
|
||||
req.car_type = carPickerVal.value[0].value;
|
||||
}
|
||||
if (isHasInput("carLicense")) {
|
||||
req.car_license = carLicense.value.trim();
|
||||
}
|
||||
if (isHasInput("date")) {
|
||||
req.start_date = startDate.value.map(item => item).join('')
|
||||
}
|
||||
if (isHasInput("entName")) {
|
||||
req.ent_name = entName.value;
|
||||
}
|
||||
if (isHasInput("entCode")) {
|
||||
req.ent_code = entCode.value;
|
||||
}
|
||||
const reqStr = JSON.stringify(req);
|
||||
const encodeData = aesEncrypt(reqStr, "ff83609b2b24fc73196aac3d3dfb874f");
|
||||
|
||||
const { data, error } = await useApiFetch(`/query/service_app/${feature.value}`)
|
||||
.post({ data: encodeData, app: true })
|
||||
.json();
|
||||
if (data.value.code === 200) {
|
||||
queryId.value = data.value.data.id;
|
||||
localStorage.setItem('token', data.value.data.accessToken)
|
||||
localStorage.setItem('refreshAfter', data.value.data.refreshAfter)
|
||||
localStorage.setItem('accessExpire', data.value.data.accessExpire)
|
||||
if (authorization.value) {
|
||||
showPayment.value = true;
|
||||
} else {
|
||||
showAuthorizationPopup.value = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function sendVerificationCode() {
|
||||
if (isCountingDown.value || !isPhoneNumberValid.value) return;
|
||||
if (!isPhoneNumberValid.value) {
|
||||
showToast({ message: "请输入有效的手机号" });
|
||||
return;
|
||||
}
|
||||
|
||||
const { data, error } = await useApiFetch("/auth/sendSms")
|
||||
.post({ mobile: mobile.value, actionType: "query" })
|
||||
.json();
|
||||
|
||||
if (!error.value && data.value.code === 200) {
|
||||
showToast({ message: "验证码发送成功", type: "success" });
|
||||
startCountdown();
|
||||
} else {
|
||||
showToast({ message: "验证码发送失败,请重试" });
|
||||
}
|
||||
}
|
||||
let timer = null;
|
||||
|
||||
function startCountdown() {
|
||||
isCountingDown.value = true;
|
||||
countdown.value = 60;
|
||||
timer = setInterval(() => {
|
||||
if (countdown.value > 0) {
|
||||
countdown.value--;
|
||||
} else {
|
||||
clearInterval(timer);
|
||||
isCountingDown.value = false;
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
function toUserAgreement() {
|
||||
router.push(`/userAgreement`)
|
||||
}
|
||||
|
||||
function toPrivacyPolicy() {
|
||||
router.push(`/privacyPolicy`)
|
||||
}
|
||||
|
||||
function toAuthorization() {
|
||||
router.push(`/authorization`)
|
||||
}
|
||||
// 用户同意
|
||||
const agreed = () => {
|
||||
showAuthorizationPopup.value = false;
|
||||
authorization.value = true;
|
||||
showPayment.value = true;
|
||||
};
|
||||
|
||||
// 用户取消
|
||||
const cancel = () => {
|
||||
showAuthorizationPopup.value = false;
|
||||
};
|
||||
const toExample = () => {
|
||||
router.push(`/example?feature=${feature.value}`)
|
||||
};
|
||||
onUnmounted(() => {
|
||||
if (timer) {
|
||||
clearInterval(timer);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="inquire-bg min-h-screen p-6">
|
||||
<div class="mb-6 text-center text-3xl font-bold text-blue-700">
|
||||
{{ featureData.product_name }}
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="mb-4 text-lg font-semibold text-gray-800">基本信息</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('name')">
|
||||
<label for="name" class="form-label">姓名</label>
|
||||
<input v-model="name" id="name" type="text" placeholder="请输入姓名" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('idCard')">
|
||||
<label for="idCard" class="form-label">身份证号</label>
|
||||
<input v-model="idCard" id="idCard" type="text" placeholder="请输入身份证号" class="form-input" />
|
||||
</div>
|
||||
<!-- 双人婚姻 -->
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('nameMan')">
|
||||
<label for="nameMan" class="form-label">男方姓名</label>
|
||||
<input v-model="nameMan" id="nameMan" type="text" placeholder="请输入男方姓名" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('idCardMan')">
|
||||
<label for="idCardMan" class="form-label">男方身份证号</label>
|
||||
<input v-model="idCardMan" id="idCardMan" type="text" placeholder="请输入男方身份证号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('nameWoman')">
|
||||
<label for="nameWoman" class="form-label">女方姓名</label>
|
||||
<input v-model="nameWoman" id="nameWoman" type="text" placeholder="请输入女方姓名" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('idCardWoman')">
|
||||
<label for="idCardWoman" class="form-label">女方身份证号</label>
|
||||
<input v-model="idCardWoman" id="idCardWoman" type="text" placeholder="请输入女方身份证号" class="form-input" />
|
||||
</div>
|
||||
<!-- 双人婚姻 -->
|
||||
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('entName')">
|
||||
<label for="entName" class="form-label">企业名称</label>
|
||||
<input v-model="entName" id="entName" type="text" placeholder="请输入企业名称" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('entCode')">
|
||||
<label for="entCode" class="form-label">统一社会信用代码</label>
|
||||
<input v-model="entCode" id="entCode" type="text" placeholder="请输入统一社会信用代码" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('carType')">
|
||||
<label for="carType" class="form-label">汽车类型</label>
|
||||
<van-field id="carType" v-model="carType" is-link readonly placeholder="点击选择汽车类型"
|
||||
@click="showCarTypePicker = true" class="form-input" />
|
||||
<van-popup v-model:show="showCarTypePicker" destroy-on-close round position="bottom">
|
||||
<van-picker :model-value="carPickerVal" :columns="carTypeColumns"
|
||||
@cancel="showCarTypePicker = false" @confirm="onConfirmCarType" />
|
||||
</van-popup>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('carLicense')">
|
||||
<!-- <label for="entCode" class="form-label">车牌号</label> -->
|
||||
<CarNumberInput class="form-input" @number-input-result="carLicenseChange" :default-str="carLicense">
|
||||
</CarNumberInput>
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('bankCard')">
|
||||
<label for="bankCard" class="form-label">银行卡号</label>
|
||||
<input v-model="bankCard" id="bankCard" type="tel" placeholder="请输入银行卡号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('mobile')">
|
||||
<label for="mobile" class="form-label">手机号</label>
|
||||
<input v-model="mobile" id="mobile" type="tel" placeholder="请输入手机号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('date')">
|
||||
<label for="date" class="form-label">业务日期</label>
|
||||
<van-field id="date" v-model="dateVal" is-link readonly placeholder="点击选择日期"
|
||||
@click="showDatePicker = true" class="form-input" />
|
||||
<van-popup v-model:show="showDatePicker" destroy-on-close round position="bottom">
|
||||
<van-date-picker v-model="startDate" :formatter="formatterDate" :min-date="minDate"
|
||||
:max-date="maxDate" title="选择日期" @confirm="onConfirmDate" @cancel="showDatePicker = false" />
|
||||
</van-popup>
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('verificationCode')">
|
||||
<label for="verificationCode" class="form-label">验证码</label>
|
||||
<div class="flex-1 flex items-center">
|
||||
<input v-model="verificationCode" id="verificationCode" type="text" placeholder="请输入验证码"
|
||||
class="form-input flex-1" />
|
||||
<button class="ml-2 px-4 py-2 text-sm text-blue-500 disabled:text-gray-400"
|
||||
:disabled="isCountingDown || !isPhoneNumberValid" @click="sendVerificationCode">
|
||||
{{
|
||||
isCountingDown
|
||||
? `${countdown}s重新获取`
|
||||
: "获取验证码"
|
||||
}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 flex items-center">
|
||||
<input type="checkbox" v-model="agreeToTerms" />
|
||||
<span class="ml-2 text-xs text-gray-400">
|
||||
我已阅读并同意
|
||||
<span @click="toUserAgreement" class="text-blue-500 ">用户协议、</span>
|
||||
<span @click="toPrivacyPolicy" class="text-blue-500 ">隐私政策</span>
|
||||
<template v-if="!NeedAuthorization.includes(feature)">
|
||||
<span @click="toAuthorization" class="text-blue-500 ">、授权书</span>
|
||||
</template>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<button class="w-24 rounded-l-xl bg-blue-400 py-2 text-white" @click="toExample">
|
||||
示例报告
|
||||
</button>
|
||||
<button class="flex-1 rounded-r-xl bg-blue-500 py-2 text-white" @click="handleSubmit">
|
||||
立即查询
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-4">
|
||||
<div class="mb-4 text-xl text-gray-800 font-bold">
|
||||
{{ featureData.product_name }}
|
||||
</div>
|
||||
<div class="mb-4 flex items-start justify-between">
|
||||
<div class="text-lg text-gray-500">价格:</div>
|
||||
<div>
|
||||
<div v-if="discountPrice" class="line-through text-gray-500" :class="{ 'text-lg': discountPrice }">
|
||||
¥ {{ featureData.sell_price }}
|
||||
</div>
|
||||
<div class="text-2xl text-red-600 font-semibold">
|
||||
¥{{ discountPrice ? (featureData.sell_price * 0.2).toFixed(2) : featureData.sell_price }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="discountPrice" class="text-sm text-right text-red-500 mb-4">
|
||||
限时活动价:2折优惠
|
||||
</div>
|
||||
<div class="mb-4 text-gray-600 leading-relaxed" v-html="featureData.description">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<template v-if="featureData.features && featureData.features.length > 1">
|
||||
<div class="mb-4 text-lg text-gray-800 font-semibold">
|
||||
报告包含内容
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div v-for="(feature, index) in featureData.features" :key="feature.id"
|
||||
class="rounded-lg py-2 text-center text-sm text-gray-700 font-medium" :class="[
|
||||
(Math.floor(index / 2) + (index % 2)) % 2 === 0
|
||||
? 'bg-gradient-to-r from-blue-200 via-blue-200 to-blue-100'
|
||||
: 'bg-gradient-to-r from-sky-200 via-sky-200 to-sky-100',
|
||||
]">
|
||||
{{ feature.name }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 底部弹出 -->
|
||||
<van-popup v-model:show="showAuthorizationPopup" position="bottom" :style="{ height: '80%' }">
|
||||
<Authorization :style="{ height: '100%' }" :name="name" :id-card="idCard" :mobile="mobile" @agreed="agreed"
|
||||
@cancel="cancel" />
|
||||
</van-popup>
|
||||
<Payment v-model="showPayment" :data="featureData" :id="queryId" @close="showPayment = false" />
|
||||
<RecordFooter v-if="!webviewEnv" />
|
||||
<!-- <div
|
||||
class=" fixed right-2 top-3/4 px-4 py-2 text-sm bg-blue-400 rounded-xl cursor-pointer text-white font-bold shadow active:bg-blue-500">
|
||||
历史查询
|
||||
</div> -->
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.form-label {
|
||||
@apply w-20 text-sm font-medium text-gray-700 flex-shrink-0;
|
||||
}
|
||||
|
||||
.form-input::placeholder {
|
||||
color: var(--van-text-color-3);
|
||||
}
|
||||
|
||||
.form-input {
|
||||
@apply w-full border-b border-gray-200 px-2 py-2 focus:outline-none;
|
||||
}
|
||||
|
||||
.inquire-bg {
|
||||
background: url("@/assets/images/bg_2.png") no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
}
|
||||
</style>
|
||||
268
src/views/AppUserAgreement.vue
Normal file
@@ -0,0 +1,268 @@
|
||||
<script setup>
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="p-4">
|
||||
<!-- 页面标题 -->
|
||||
<div class="mb-4 text-center text-lg font-bold">用户协议</div>
|
||||
|
||||
<!-- 内容主体 -->
|
||||
<div class="indent-[2em]">
|
||||
<div class="mb-4 leading-relaxed">
|
||||
本协议是您(以下又称“用户”)在使用本服务时,约定您和海南省学宇思科技有限公司之间权利义务关系的有效协议。
|
||||
</div>
|
||||
|
||||
<div class="mb-4 leading-relaxed">
|
||||
在您使用本服务前,请您务必仔细阅读本协议,特别是隐私权保护及授权条款、免除或者限制海南省学宇思科技有限公司责任的条款、争议解决和法律适用条款。一旦您有对本服务的任何部分或全部的注册、查看、定制、使用等任何使用行为,即视为您已充分阅读、理解并接受本协议的全部内容,并与海南省学宇思科技有限公司达成本协议。如您对本协议有任何疑问,应向海南省学宇思科技有限公司客服咨询。如果您不同意本协议的部分或全部约定,您应立即停止使用本服务。
|
||||
</div>
|
||||
<div class="mb-4 leading-relaxed">
|
||||
您与海南省学宇思科技有限公司达成本协议后,您承诺接受并遵守本协议的约定,并不得以未阅读本协议的内容或者未获得海南省学宇思科技有限公司对您问询的解答等理由,主张本协议无效,或要求撤销本协议。在本协议履行过程中,海南省学宇思科技有限公司可以依其单独判断暂时停止提供、限制或改变本服务,并有权根据自身业务需要修订本协议。一旦本协议的内容发生变动,海南省学宇思科技有限公司将通过平台公布最新的服务协议,不再向您作个别通知。如果您不同意海南省学宇思科技有限公司对本服务协议所做的修改,您应立即停止使用本服务或通过海南省学宇思科技有限公司客服与海南省学宇思科技有限公司联系。如果您继续使用本服务,则视为您接受海南省学宇思科技有限公司对本协议所做的修改,并应遵照修改后的协议执行。
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">一、服务内容</div>
|
||||
<div class="leading-relaxed">
|
||||
本服务向您提供多项个人信息整理服务。您知悉并认可,如您需使用该类服务,必须满足如下所述条件;且您承诺,您向海南省学宇思科技有限公司提请服务申请时,已经满足如下所述条件。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>A.您已注册成为本服务的会员;</div>
|
||||
<div>
|
||||
B.您已在服务页面对应框中填写必要的个人信息;
|
||||
</div>
|
||||
<div>
|
||||
C.您确保被查询主体信息是您本人的信息或者被查询主体已授权您本人使用被查询主体信息进行查询(授权内容应包括本条D项所述内容),并且被查询主体已知悉该授权的风险。
|
||||
</div>
|
||||
<div>
|
||||
D.您接受海南省学宇思科技有限公司作为您的代理,根据您的指示执行相关操作。您授权海南省学宇思科技有限公司:a.可以根据您的指示处理相关信息;b.可以向您提供代理服务所需的必要信息;c.可以整理、保存您为获取服务所提供的必要信息。
|
||||
</div>
|
||||
<div>
|
||||
E.您已被明确告知使用本代理服务可能带来的各类风险以及其他可能的不利后果,包括但不限于信息安全风险等。
|
||||
</div>
|
||||
<div>F.您已全额支付相应的查询服务费用;</div>
|
||||
<div>
|
||||
G.验证码请不要轻易提供给他人,一旦填入手机号对应验证码,视为手机号机主本人操作。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
二、服务中断或故障
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
您同意,因下列原因导致海南省学宇思科技有限公司无法正常提供本服务的,海南省学宇思科技有限公司不承担责任:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>(1)承载本服务的系统停机维护期间;</div>
|
||||
<div>
|
||||
(2)您的电脑、手机软硬件和通信线路、供电线路出现故障的;
|
||||
</div>
|
||||
<div>
|
||||
(3)您操作不当或通过非海南省学宇思科技有限公司授权或认可的方式使用本服务的;
|
||||
</div>
|
||||
<div>
|
||||
(4)因病毒、木马、恶意程序攻击、网络拥堵、系统不稳定、系统或设备故障、通讯故障、电力故障或政府行为等原因;
|
||||
</div>
|
||||
<div>
|
||||
(5)由于黑客攻击、网络供应商技术调整或故障、网站升级、手机运营商系统方面的问题等原因而造成的本服务中断或延迟;
|
||||
</div>
|
||||
<div>
|
||||
(6)因台风、地震、海啸、洪水、停电、战争、恐怖袭击等不可抗力之因素,造成本服务系统障碍不能执行业务的。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
海南省学宇思科技有限公司不对因使用本服务而对用户造成的间接的、附带的、特殊的、后果性的损失承担任何法律责任;尽管有前款约定海南省学宇思科技有限公司将采取合理行动积极促使本服务恢复正常。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
三、信息的使用和保护
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
海南省学宇思科技有限公司深知您注重个人信息安全和保护,并理解保护被查询主体个人信息的重要性。
|
||||
海南省学宇思科技有限公司会严格遵守中国关于收集、使用、保存用户个人信息的相关法律法规,
|
||||
尽最大努力采用相应安全技术和管理手段保护您或被查询主体的个人信息,
|
||||
防止您或被查询主体个人信息遭受未经授权的访问、适用或泄露、毁损、篡改或者丢失。
|
||||
未经您或被查询主体的授权不会向任何第三方提供。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
您使用本服务,即表示您已授权海南省学宇思科技有限公司将您相关信息披露给海南省学宇思科技有限公司关联公司
|
||||
(关联公司是指直接或间接控制于本协议一方的任何法律实体,或者与本协议一方共同于另一法律实体的任何法律实体)使用,
|
||||
且海南省学宇思科技有限公司关联公司仅为了向您提供服务而使用您的相关信息。
|
||||
如海南省学宇思科技有限公司关联公司使用您的相关信息,则受本协议约束且会按照与海南省学宇思科技有限公司同等谨慎程度保护您的相关信息。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
海南省学宇思科技有限公司就下列原因导致的您或被查询主体个人信息的泄露,不承担任何法律责任:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)由于您个人原因将本服务的会员账号和密码告知他人或与他人共享海南省学宇思科技有限公司服务账户,由此导致的与您相关的信息的泄露。
|
||||
</div>
|
||||
<div>
|
||||
(2)您使用第三方提供的服务(包括您向第三方提供的任何个人信息),须受第三方自己的服务条款及个人信息保护协议(而非本协议)约束,您需要仔细阅读其条款。本协议仅适用于海南省学宇思科技有限公司所提供的服务,并不适用于任何第三方提供的服务或第三方的信息使用规则,海南省学宇思科技有限公司对任何第三方使用由您提供的信息不承担任何责任。
|
||||
</div>
|
||||
<div>
|
||||
(3)根据相关的法律法规、相关政府主管部门或相关证券交易所的要求提供、公布与您相关的信息。
|
||||
</div>
|
||||
<div>
|
||||
(4)或其他非因海南省学宇思科技有限公司原因导致的与您相关的信息的泄露。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第四部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
四、用户声明与保证
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)您使用本服务的前提是您依照适用的法律,是具有完全民事权利和民事行为能力,能够独立承担民事责任的自然人。
|
||||
</div>
|
||||
<div>
|
||||
(2)您如违反本协议第一条款中的承诺,您可能会对他人造成侵权。如由此给海南省学宇思科技有限公司或他人造成损失的,您需依照法律法规规定承担相应的法律责任。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第五部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
五、知识产权保护
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
本服务涉及的文档资料、软件、商标、图案、排版设计等(以下简称“海南省学宇思科技有限公司产品”)的著作权、商标以及其他知识产权或权益均为海南省学宇思科技有限公司享有或海南省学宇思科技有限公司获得授权使用。
|
||||
用户不得出租、出借、拷贝、仿冒、复制或修改海南省学宇思科技有限公司产品任何部分或用于其他任何商业目的,
|
||||
也不得将海南省学宇思科技有限公司产品做反向工程、反编译或反汇编,或以其他方式或工具取得海南省学宇思科技有限公司产品之目标程序或源代码。
|
||||
如果用户违反此约定,造成海南省学宇思科技有限公司及其他任何第三方任何损失的,甲方应予以全额赔偿。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第六部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">六、隐私保护</div>
|
||||
<div class="leading-relaxed">
|
||||
全能查保证不对外公开或向第三方提供单个用户的注册资料及存储在全能查的非公开内容,但下列情况下除外:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>1. 事先获得用户的明确授权;</div>
|
||||
<div>2. 根据有关的法律法规要求;</div>
|
||||
<div>3. 按照有关政府部门的要求;</div>
|
||||
<div>4. 为维护社会公众的利益;</div>
|
||||
<div>5. 为维护全能查的合法利益。</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
在不透露单个用户隐私资料的前提下,全能查有权利对整个用户数据库进行分析并对用户数据库进行商业上的利用。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第七部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">七、免责条款</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(一)不管基于任何直接的、间接的、特殊的、惩罚性的、惩戒性的、附带的、或结果性的损害、损失或费用,我们均不对其承担责任。即使有人告知我们或我们的员工存在出现这些损害、损失或费用的可能性。这些损害、损失或费用由以下这些情况引起或与这些情况有关:
|
||||
</div>
|
||||
<div>1. 使用我们网站上或其他链接网站上的信息;</div>
|
||||
<div>2. 无法使用这些信息;</div>
|
||||
<div>
|
||||
3.
|
||||
任何在操作或传输中出现的操作失败、错误、遗漏、中断、缺陷、延迟,计算机病毒,断线或系统运行失败。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(二)我们可以在不事先通知的情况下更改信息,并且不承担更新这些信息的义务。不经任何种类的授权,不做任何专门或暗指或法定的不侵犯第三方权利、名称、可出售性、出于某种特殊目的适当措施或不携带计算机病毒的保证。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(三)我们不对您查询信息内容的正确性、适当性、完整性、准确性、可靠性或适时性做出任何证明、声明和保证。我们不对任何因个人平台产生的错误、遗漏及失准承担任何责任。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(四)对于由于您违反本协议导致任何第三方针对我们及或我们的员工提出的任何申诉、起诉、要求或者诉讼或者其他法律程序,您同意自费作出赔偿并令其免受上述损害。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第八部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">八、违约</div>
|
||||
<div class="leading-relaxed">
|
||||
用户不得利用本服务进行任何损害海南省学宇思科技有限公司及其他第三方权益的行为,否则海南省学宇思科技有限公司有权立即终止为该用户提供本服务,并要求用户赔偿损失。由此产生的任何后果由用户自行承担,与海南省学宇思科技有限公司无关。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第九部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
九、数据来源及准确性说明
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
本产品数据来源于第三方,可能因数据未公开、更新延迟或信息受到限制,因此不一定能完全返回。不同数据格式及记录详细程度会有所差异,这是行业正常现象。本报告仅供参考,请结合实际情况做出决策。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十、退款协议</div>
|
||||
<div class="leading-relaxed">
|
||||
除非由于本程序的技术性问题导致用户无法正常使用本产品,否则我们不提供任何退款服务。
|
||||
用户在购买前应仔细阅读本用户协议及相关使用条款,确保对本产品有充分了解。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十一部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
十一、协议的变更和终止
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
鉴于网络服务的特殊性,我们变更本协议及其附件的若干条款时,将提前通过我们平台公告有关变更事项。
|
||||
修订后的条款或将来可能发布或更新的各类规则-经在我们平台公布后,立即自动生效。
|
||||
如您不同意相关修订,应当立即停止使用该项服务。
|
||||
如您在发布上述协议变更的有关公告后继续使用互联网查询的,视为您已接受协议的有关变更,并受其约束。
|
||||
本协议中的相关条款根据该变更而自动做相应修改,双方无须另行签订书面协议。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十二部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十二、适用法律</div>
|
||||
<div class="leading-relaxed">
|
||||
本协议条款的解释、效力及纠纷的解决,适用中华人民共和国大陆地区法律法规。
|
||||
如用户和海南省学宇思科技有限公司之间发生任何争议,首先应友好协商解决,协商不成的,应将争议提交至海南省学宇思科技有限公司注册地有管辖权的人民法院解决。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十三部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十三、问题咨询</div>
|
||||
<div class="leading-relaxed">
|
||||
如您对本协议及本服务有任何问题,请通过邮箱
|
||||
<text class="text-blue-500"> admin@iieeii.com </text> 或
|
||||
通过“联系客服”联系海南省学宇思科技有限公司进行咨询。
|
||||
海南省学宇思科技有限公司会尽最大努力解决您的问题。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十四部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十四、附则</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(一)本协议的某一条款被确认无效,均不影响本协议其他条款的效力。
|
||||
</div>
|
||||
<div>
|
||||
(二)本协议未尽事宜,根据我国相关法律、法规及我们相关业务规定办理。如需制定补充协议,其法律效力同本协议。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-2 leading-relaxed">
|
||||
本协议通过点击同意/勾选的方式签署,自签署之日生效。
|
||||
</div>
|
||||
<div class="text-right text-sm">
|
||||
<text>本协议于 2024 年 11 月 17 日生效。</text>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -31,6 +31,10 @@ const featureMap = {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||
},
|
||||
G22SC01: {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuitPP.vue')),
|
||||
},
|
||||
G05HZ01: {
|
||||
name: '股东人企关系',
|
||||
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
||||
@@ -100,6 +104,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,6 +130,10 @@ 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
|
||||
}
|
||||
@@ -178,6 +188,274 @@ const maskValue = computed(() => {
|
||||
return value;
|
||||
}
|
||||
});
|
||||
|
||||
// 计算综合评分的函数
|
||||
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)));
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -187,6 +465,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">
|
||||
@@ -209,7 +496,7 @@ const maskValue = computed(() => {
|
||||
<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-600">{{ maskValue("name", reportParams?.name)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.id_card">
|
||||
@@ -221,65 +508,65 @@ const maskValue = computed(() => {
|
||||
v-if="reportParams?.nameMan">
|
||||
<span class="text-gray-700 font-bold">男方姓名</span>
|
||||
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameMan)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.idCardMan">
|
||||
<span class="text-gray-700 font-bold">男方身份证号</span>
|
||||
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardMan)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.nameWoman">
|
||||
<span class="text-gray-700 font-bold">女方姓名</span>
|
||||
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameWoman)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.idCardWoman">
|
||||
<span class="text-gray-700 font-bold">女方身份证号</span>
|
||||
<span class="text-gray-600">{{ maskValue("id_card",
|
||||
reportParams?.idCardWoman)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.bank_card">
|
||||
<span class="text-gray-700 font-bold">银行卡号</span>
|
||||
<span class="text-gray-600">{{ maskValue("bank_card",
|
||||
reportParams?.bank_card)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.mobile">
|
||||
<span class="text-gray-700 font-bold">手机号</span>
|
||||
<span class="text-gray-600">{{ maskValue("mobile", reportParams?.mobile)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.verification_code">
|
||||
<span class="text-gray-700 font-bold">验证码</span>
|
||||
<span class="text-gray-600">{{ maskValue("code",
|
||||
reportParams?.verification_code)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.car_license">
|
||||
<span class="text-gray-700 font-bold">车牌号</span>
|
||||
<span class="text-gray-600">{{ maskValue("car_license",
|
||||
reportParams?.car_license)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.ent_name">
|
||||
<span class="text-gray-700 font-bold">企业名称</span>
|
||||
<span class="text-gray-600">{{ maskValue("ent_name", reportParams?.ent_name)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between border-b pb-2 pl-2"
|
||||
v-if="reportParams?.ent_code">
|
||||
<span class="text-gray-700 font-bold">企业代码</span>
|
||||
<span class="text-gray-600">{{ maskValue("ent_code", reportParams?.ent_code)
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex flex-col gap-4">
|
||||
<div class="flex items-center bg-blue-100 rounded-xl px-4 py-2 flex-1">
|
||||
|
||||
109
src/views/InvitationAgentApply.vue
Normal file
@@ -0,0 +1,109 @@
|
||||
<template>
|
||||
<div class="min-h-screen bg-[#D1D6FF]">
|
||||
|
||||
<img src="@/assets/images/invitation_agent_apply.png" alt="邀请代理申请">
|
||||
<!-- 统一状态处理容器 -->
|
||||
<div class="flex flex-col items-center justify-centerx">
|
||||
<!-- 申请成功状态 -->
|
||||
<div v-if="showSuccessMessage" class="text-center">
|
||||
<span class="text-xs text-gray-500">申请成功</span>
|
||||
<div class="bg-green-100 p-1 rounded-3xl shadow-xl mt-1">
|
||||
<div
|
||||
class="text-xl font-bold px-8 py-2 bg-gradient-to-t from-green-500 to-green-300 text-white rounded-3xl shadow-lg">
|
||||
请下载"全能查APP"开始进行代理
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 初始状态 - 未申请 -->
|
||||
<div v-else class="text-center">
|
||||
<span class="text-xs text-gray-500">{{ isSelf ? '立即申请成为代理人' : '邀您注册代理人' }}</span>
|
||||
<div class="bg-gray-100 p-1 rounded-3xl shadow-xl mt-1" @click="agentApply">
|
||||
<div
|
||||
class="text-xl font-bold px-8 py-2 bg-gradient-to-t from-blue-500 to-blue-300 text-white rounded-3xl shadow-lg cursor-pointer">
|
||||
立即成为代理方
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<AgentApplicationForm v-model:show="showApplyPopup" @submit="submitApplication" @close="showApplyPopup = false"
|
||||
:ancestor="ancestor" />
|
||||
</template>
|
||||
|
||||
|
||||
<script setup>
|
||||
import AgentApplicationForm from "@/components/AgentApplicationForm.vue";
|
||||
import { aesDecrypt } from "@/utils/crypto"
|
||||
import { ref, onBeforeMount } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
const showApplyPopup = ref(false);
|
||||
const showSuccessMessage = ref(false);
|
||||
const route = useRoute();
|
||||
const ancestor = ref("");
|
||||
const isSelf = ref(false);
|
||||
|
||||
const agentApply = () => {
|
||||
showApplyPopup.value = true;
|
||||
}
|
||||
|
||||
onBeforeMount(() => {
|
||||
if (route.name === "invitationAgentApplySelf") {
|
||||
isSelf.value = true;
|
||||
} else {
|
||||
try {
|
||||
const linkIdentifier = route.params.linkIdentifier;
|
||||
const decryptDataStr = aesDecrypt(decodeURIComponent(linkIdentifier), "8e3e7a2f60edb49221e953b9c029ed10");
|
||||
const decryptData = JSON.parse(decryptDataStr);
|
||||
ancestor.value = decryptData.mobile;
|
||||
} catch (err) {
|
||||
console.error('解析邀请链接失败', err);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const submitApplication = async (formData) => {
|
||||
// 提交代理申请的数据
|
||||
const { region, mobile, wechat_id, code } = formData;
|
||||
let postData = {
|
||||
region,
|
||||
mobile,
|
||||
wechat_id,
|
||||
code,
|
||||
};
|
||||
if (!isSelf.value) {
|
||||
postData.ancestor = ancestor.value;
|
||||
}
|
||||
|
||||
try {
|
||||
const { data, error } = await useApiFetch("/agent/apply")
|
||||
.post(postData)
|
||||
.json();
|
||||
|
||||
if (data.value && !error.value) {
|
||||
if (data.value.code === 200) {
|
||||
showApplyPopup.value = false;
|
||||
showToast({ message: "申请提交成功" });
|
||||
|
||||
// 保存token等信息
|
||||
// if (data.value.data?.accessToken) {
|
||||
// localStorage.setItem('token', data.value.data.accessToken);
|
||||
// localStorage.setItem('refreshAfter', data.value.data.refreshAfter);
|
||||
// localStorage.setItem('accessExpire', data.value.data.accessExpire);
|
||||
// }
|
||||
|
||||
// 显示成功信息
|
||||
showSuccessMessage.value = true;
|
||||
} else {
|
||||
// showToast({ message: data.value.message || "申请提交失败" });
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('申请提交出错', err);
|
||||
showToast({ message: "网络错误,请稍后重试" });
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@@ -1,14 +1,595 @@
|
||||
<template>
|
||||
<Inquire />
|
||||
<RecordFooter v-if="!webviewEnv" />
|
||||
<div
|
||||
class=" fixed right-2 top-3/4 px-4 py-2 text-sm bg-blue-400 rounded-xl text-white font-bold shadow active:bg-blue-500">
|
||||
历史查询
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Inquire from './Inquire.vue';
|
||||
import { ref, reactive, computed, onMounted, onUnmounted } from "vue";
|
||||
import { aesEncrypt } from "@/utils/crypto";
|
||||
import { useRoute } from "vue-router";
|
||||
|
||||
import Authorization from "@/components/Authorization.vue";
|
||||
import Payment from "@/components/Payment.vue";
|
||||
import CarNumberInput from "@/components/CarNumberInput.vue";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter()
|
||||
const showAuthorizationPopup = ref(false);
|
||||
const authorization = ref(true);
|
||||
const showPayment = ref(false);
|
||||
const queryId = ref(null);
|
||||
const name = ref("");
|
||||
const nameMan = ref("");
|
||||
const nameWoman = ref("");
|
||||
const idCard = ref("");
|
||||
const idCardMan = ref("");
|
||||
const idCardWoman = ref("");
|
||||
const mobile = ref("");
|
||||
const bankCard = ref("");
|
||||
const startDate = ref([])
|
||||
const dateVal = ref("")
|
||||
const showDatePicker = ref(false)
|
||||
// 当前日期
|
||||
const today = new Date();
|
||||
const maxDate = today; // 最大日期为当前日期
|
||||
// 最小日期为2000年1月1日
|
||||
const minDate = new Date('2000-01-01');
|
||||
const entName = ref("");
|
||||
const entCode = ref("");
|
||||
const verificationCode = ref("");
|
||||
const agreeToTerms = ref(false);
|
||||
const isCountingDown = ref(false);
|
||||
const countdown = ref(60);
|
||||
const feature = ref("");
|
||||
const featureData = ref({});
|
||||
const carLicense = ref("");
|
||||
const carType = ref("小型汽车");
|
||||
const carPickerVal = ref([{ value: "02", text: "小型汽车" }]);
|
||||
const linkIdentifier = ref("")
|
||||
const showCarTypePicker = ref(false);
|
||||
const carTypeColumns = [
|
||||
{ value: "01", text: "大型汽车" },
|
||||
{ value: "02", text: "小型汽车" },
|
||||
{ value: "03", text: "使馆汽车" },
|
||||
{ value: "04", text: "领馆汽车" },
|
||||
{ value: "05", text: "境外汽车" },
|
||||
{ value: "06", text: "外籍汽车" },
|
||||
{ value: "07", text: "普通摩托车" },
|
||||
{ value: "08", text: "轻便摩托车" },
|
||||
{ value: "09", text: "使馆摩托车" },
|
||||
{ value: "10", text: "领馆摩托车" },
|
||||
{ value: "11", text: "境外摩托车" },
|
||||
{ value: "12", text: "外籍摩托车" },
|
||||
{ value: "13", text: "低速车" },
|
||||
{ value: "14", text: "拖拉机" },
|
||||
{ value: "15", text: "挂车" },
|
||||
{ value: "16", text: "教练汽车" },
|
||||
{ value: "17", text: "教练摩托车" },
|
||||
{ value: "20", text: "临时入境汽车" },
|
||||
{ value: "21", text: "临时入境摩托车" },
|
||||
{ value: "22", text: "临时行驶车" },
|
||||
{ value: "23", text: "警用汽车" },
|
||||
{ value: "24", text: "警用摩托车" },
|
||||
{ value: "51", text: "新能源大型车" },
|
||||
{ value: "52", text: "新能源小型车" },
|
||||
];
|
||||
const formatterDate = (type, option) => {
|
||||
if (type === 'year') {
|
||||
option.text += '年';
|
||||
}
|
||||
if (type === 'month') {
|
||||
option.text += '月';
|
||||
}
|
||||
if (type === 'day') {
|
||||
option.text += '日';
|
||||
}
|
||||
return option;
|
||||
};
|
||||
const onConfirmDate = ({ selectedValues, selectedOptions }) => {
|
||||
dateVal.value = selectedOptions.map(item => item.text).join('');
|
||||
showDatePicker.value = false
|
||||
}
|
||||
const carLicenseChange = (e) => {
|
||||
carLicense.value = e;
|
||||
};
|
||||
const onConfirmCarType = ({ selectedValues, selectedOptions }) => {
|
||||
showCarTypePicker.value = false;
|
||||
carPickerVal.value = selectedValues;
|
||||
carType.value = selectedOptions[0].text;
|
||||
};
|
||||
|
||||
onBeforeMount(() => {
|
||||
getProduct();
|
||||
})
|
||||
onMounted(() => {
|
||||
isFinishPayment()
|
||||
initAuthorization();
|
||||
});
|
||||
const discountPrice = ref(false) // 是否应用折扣
|
||||
|
||||
function isFinishPayment() {
|
||||
const query = new URLSearchParams(window.location.search);
|
||||
let orderNo = query.get("out_trade_no");
|
||||
if (orderNo) {
|
||||
router.push({ path: '/report', query: { orderNo } });
|
||||
}
|
||||
}
|
||||
async function getProduct() {
|
||||
linkIdentifier.value = route.params.linkIdentifier
|
||||
// linkIdentifier.value = decodeURIComponent(linkIdentifier.value)
|
||||
console.log("linkIdentifier", linkIdentifier.value)
|
||||
const { data: agentLinkData, error: agentLinkError } = await useApiFetch(`/agent/link?link_identifier=${linkIdentifier.value}`)
|
||||
.get()
|
||||
.json();
|
||||
if (agentLinkData.value && !agentLinkError.value) {
|
||||
if (agentLinkData.value.code === 200) {
|
||||
feature.value = agentLinkData.value.data.product_en;
|
||||
featureData.value = agentLinkData.value.data;
|
||||
console.log("feature", feature.value)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
function initAuthorization() {
|
||||
if (NeedAuthorization.includes(feature.value)) {
|
||||
authorization.value = false;
|
||||
}
|
||||
}
|
||||
const isPhoneNumberValid = computed(() => {
|
||||
return /^1[3-9]\d{9}$/.test(mobile.value);
|
||||
});
|
||||
const isIdCardValid = computed(() => /^\d{17}[\dX]$/i.test(idCard.value));
|
||||
const isIdCardManValid = computed(() => /^\d{17}[\dX]$/i.test(idCardMan.value));
|
||||
const isIdCardWomanValid = computed(() =>
|
||||
/^\d{17}[\dX]$/i.test(idCardWoman.value)
|
||||
);
|
||||
const isCreditCodeValid = computed(() => /^.{18}$/.test(entCode.value));
|
||||
const isCarLicense = computed(() => carLicense.value.trim().length > 6);
|
||||
const isBankCardValid = computed(() => {
|
||||
const card = bankCard.value.replace(/\D/g, ""); // 移除所有非数字字符
|
||||
if (card.length < 13 || card.length > 19) {
|
||||
return false; // 校验长度
|
||||
}
|
||||
|
||||
let sum = 0;
|
||||
let shouldDouble = false;
|
||||
|
||||
// 从卡号的右边开始遍历
|
||||
for (let i = card.length - 1; i >= 0; i--) {
|
||||
let digit = parseInt(card.charAt(i));
|
||||
|
||||
if (shouldDouble) {
|
||||
digit *= 2;
|
||||
if (digit > 9) {
|
||||
digit -= 9;
|
||||
}
|
||||
}
|
||||
|
||||
sum += digit;
|
||||
shouldDouble = !shouldDouble; // 反转是否乘 2
|
||||
}
|
||||
|
||||
return sum % 10 === 0; // 如果最终和能被 10 整除,则银行卡号有效
|
||||
});
|
||||
|
||||
function handleSubmit() {
|
||||
if (!agreeToTerms.value) {
|
||||
showToast({ message: `请阅读并同意用户协议、隐私政策${!NeedAuthorization.includes(feature.value) ? '和授权书' : ''}` });
|
||||
return;
|
||||
}
|
||||
if (
|
||||
!validateField("name", name.value, (v) => v, "请输入姓名") ||
|
||||
!validateField("nameMan", nameMan.value, (v) => v, "请输入男方姓名") ||
|
||||
!validateField(
|
||||
"nameWoman",
|
||||
nameWoman.value,
|
||||
(v) => v,
|
||||
"请输入女方姓名"
|
||||
) ||
|
||||
!validateField(
|
||||
"mobile",
|
||||
mobile.value,
|
||||
(v) => isPhoneNumberValid.value,
|
||||
"请输入有效的手机号"
|
||||
) ||
|
||||
!validateField(
|
||||
"idCard",
|
||||
idCard.value,
|
||||
(v) => isIdCardValid.value,
|
||||
"请输入有效的身份证号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"idCardMan",
|
||||
idCardMan.value,
|
||||
(v) => isIdCardManValid.value,
|
||||
"请输入有效的男方身份证号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"idCardWoman",
|
||||
idCardWoman.value,
|
||||
(v) => isIdCardWomanValid.value,
|
||||
"请输入有效的女方身份证号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"bankCard",
|
||||
bankCard.value,
|
||||
(v) => isBankCardValid.value,
|
||||
"请输入有效的银行卡号码"
|
||||
) ||
|
||||
!validateField(
|
||||
"verificationCode",
|
||||
verificationCode.value,
|
||||
(v) => v,
|
||||
"请输入验证码"
|
||||
) ||
|
||||
!validateField(
|
||||
"carPickerVal",
|
||||
carPickerVal.value,
|
||||
(v) => v,
|
||||
"请选择车辆类型"
|
||||
) ||
|
||||
!validateField(
|
||||
"carLicense",
|
||||
carLicense.value,
|
||||
(v) => isCarLicense.value,
|
||||
"请输入正确的车牌号"
|
||||
) ||
|
||||
!validateField("entName", entName.value, (v) => v, "请输入企业名称") ||
|
||||
!validateField(
|
||||
"entCode",
|
||||
entCode.value,
|
||||
(v) => isCreditCodeValid.value,
|
||||
"请输入统一社会信用代码"
|
||||
) ||
|
||||
!validateField(
|
||||
"date",
|
||||
dateVal.value,
|
||||
(v) => v,
|
||||
"请选择日期"
|
||||
)
|
||||
|
||||
) {
|
||||
return;
|
||||
}
|
||||
submitRequest();
|
||||
}
|
||||
const validateField = (field, value, validationFn, errorMessage) => {
|
||||
if (isHasInput(field) && !validationFn(value)) {
|
||||
showToast({ message: errorMessage });
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
const defaultInput = ["name", "idCard", "mobile", "verificationCode"];
|
||||
const specialProduct = {
|
||||
toc_EnterpriseLawsuit: ["entName", "entCode", "mobile", "verificationCode"],
|
||||
toc_PhoneThreeElements: ["name", "idCard", "mobile"],
|
||||
toc_IDCardTwoElements: ["name", "idCard"],
|
||||
toc_PhoneTwoElements: ["name", "mobile"],
|
||||
toc_PersonVehicleVerification: ["name", "carType", "carLicense"],
|
||||
toc_VehiclesUnderName: ["name", "idCard"],
|
||||
toc_DualMarriage: ["nameMan", "idCardMan", "nameWoman", "idCardWoman"],
|
||||
toc_BankCardBlacklist: ["name", "idCard", "mobile", "bankCard"],
|
||||
toc_BankCardFourElements: ["name", "idCard", "mobile", "bankCard"],
|
||||
toc_NaturalLifeStatus: ["name", "idCard"],
|
||||
toc_NetworkDuration: ["mobile"],
|
||||
toc_PhoneSecondaryCard: ["mobile", "date"],
|
||||
toc_PhoneNumberRisk: ["mobile"],
|
||||
};
|
||||
const NeedAuthorization = [
|
||||
"toc_Marriage",
|
||||
"marriage"
|
||||
];
|
||||
const isHasInput = (input) => {
|
||||
if (specialProduct[feature.value]) {
|
||||
return specialProduct[feature.value].includes(input);
|
||||
} else {
|
||||
return defaultInput.includes(input);
|
||||
}
|
||||
};
|
||||
async function submitRequest() {
|
||||
const req = {};
|
||||
if (isHasInput("name")) {
|
||||
req.name = name.value;
|
||||
}
|
||||
if (isHasInput("idCard")) {
|
||||
req.id_card = idCard.value;
|
||||
}
|
||||
if (isHasInput("nameMan")) {
|
||||
req.name_man = nameMan.value;
|
||||
}
|
||||
if (isHasInput("idCardMan")) {
|
||||
req.id_card_man = idCardMan.value;
|
||||
}
|
||||
if (isHasInput("nameWoman")) {
|
||||
req.name_woman = nameWoman.value;
|
||||
}
|
||||
if (isHasInput("idCardWoman")) {
|
||||
req.id_card_woman = idCardWoman.value;
|
||||
}
|
||||
if (isHasInput("bankCard")) {
|
||||
req.bank_card = bankCard.value.replace(/\D/g, "");
|
||||
}
|
||||
if (isHasInput("mobile")) {
|
||||
req.mobile = mobile.value;
|
||||
}
|
||||
if (isHasInput("verificationCode")) {
|
||||
req.code = verificationCode.value;
|
||||
}
|
||||
if (isHasInput("carType")) {
|
||||
req.car_type = carPickerVal.value[0].value;
|
||||
}
|
||||
if (isHasInput("carLicense")) {
|
||||
req.car_license = carLicense.value.trim();
|
||||
}
|
||||
if (isHasInput("date")) {
|
||||
req.start_date = startDate.value.map(item => item).join('')
|
||||
}
|
||||
if (isHasInput("entName")) {
|
||||
req.ent_name = entName.value;
|
||||
}
|
||||
if (isHasInput("entCode")) {
|
||||
req.ent_code = entCode.value;
|
||||
}
|
||||
const reqStr = JSON.stringify(req);
|
||||
const encodeData = aesEncrypt(reqStr, "ff83609b2b24fc73196aac3d3dfb874f");
|
||||
|
||||
const { data, error } = await useApiFetch(`/query/service_agent/${feature.value}`)
|
||||
.post({ data: encodeData, agent_identifier: linkIdentifier.value })
|
||||
.json();
|
||||
if (data.value.code === 200) {
|
||||
queryId.value = data.value.data.id;
|
||||
localStorage.setItem('token', data.value.data.accessToken)
|
||||
localStorage.setItem('refreshAfter', data.value.data.refreshAfter)
|
||||
localStorage.setItem('accessExpire', data.value.data.accessExpire)
|
||||
if (authorization.value) {
|
||||
showPayment.value = true;
|
||||
} else {
|
||||
showAuthorizationPopup.value = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function sendVerificationCode() {
|
||||
if (isCountingDown.value || !isPhoneNumberValid.value) return;
|
||||
if (!isPhoneNumberValid.value) {
|
||||
showToast({ message: "请输入有效的手机号" });
|
||||
return;
|
||||
}
|
||||
|
||||
const { data, error } = await useApiFetch("/auth/sendSms")
|
||||
.post({ mobile: mobile.value, actionType: "query" })
|
||||
.json();
|
||||
|
||||
if (!error.value && data.value.code === 200) {
|
||||
showToast({ message: "验证码发送成功", type: "success" });
|
||||
startCountdown();
|
||||
} else {
|
||||
showToast({ message: "验证码发送失败,请重试" });
|
||||
}
|
||||
}
|
||||
let timer = null;
|
||||
|
||||
function startCountdown() {
|
||||
isCountingDown.value = true;
|
||||
countdown.value = 60;
|
||||
timer = setInterval(() => {
|
||||
if (countdown.value > 0) {
|
||||
countdown.value--;
|
||||
} else {
|
||||
clearInterval(timer);
|
||||
isCountingDown.value = false;
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
function toUserAgreement() {
|
||||
router.push(`/userAgreement`)
|
||||
}
|
||||
|
||||
function toPrivacyPolicy() {
|
||||
router.push(`/privacyPolicy`)
|
||||
}
|
||||
|
||||
function toAuthorization() {
|
||||
router.push(`/authorization`)
|
||||
}
|
||||
// 用户同意
|
||||
const agreed = () => {
|
||||
showAuthorizationPopup.value = false;
|
||||
authorization.value = true;
|
||||
showPayment.value = true;
|
||||
};
|
||||
|
||||
// 用户取消
|
||||
const cancel = () => {
|
||||
showAuthorizationPopup.value = false;
|
||||
};
|
||||
const toExample = () => {
|
||||
router.push(`/example?feature=${feature.value}`)
|
||||
};
|
||||
onUnmounted(() => {
|
||||
if (timer) {
|
||||
clearInterval(timer);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
<template>
|
||||
<div class="inquire-bg min-h-screen p-6">
|
||||
<div class="mb-6 text-center text-3xl font-bold text-blue-700">
|
||||
{{ featureData.product_name }}
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="mb-4 text-lg font-semibold text-gray-800">基本信息</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('name')">
|
||||
<label for="name" class="form-label">姓名</label>
|
||||
<input v-model="name" id="name" type="text" placeholder="请输入姓名" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('idCard')">
|
||||
<label for="idCard" class="form-label">身份证号</label>
|
||||
<input v-model="idCard" id="idCard" type="text" placeholder="请输入身份证号" class="form-input" />
|
||||
</div>
|
||||
<!-- 双人婚姻 -->
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('nameMan')">
|
||||
<label for="nameMan" class="form-label">男方姓名</label>
|
||||
<input v-model="nameMan" id="nameMan" type="text" placeholder="请输入男方姓名" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('idCardMan')">
|
||||
<label for="idCardMan" class="form-label">男方身份证号</label>
|
||||
<input v-model="idCardMan" id="idCardMan" type="text" placeholder="请输入男方身份证号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('nameWoman')">
|
||||
<label for="nameWoman" class="form-label">女方姓名</label>
|
||||
<input v-model="nameWoman" id="nameWoman" type="text" placeholder="请输入女方姓名" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('idCardWoman')">
|
||||
<label for="idCardWoman" class="form-label">女方身份证号</label>
|
||||
<input v-model="idCardWoman" id="idCardWoman" type="text" placeholder="请输入女方身份证号" class="form-input" />
|
||||
</div>
|
||||
<!-- 双人婚姻 -->
|
||||
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('entName')">
|
||||
<label for="entName" class="form-label">企业名称</label>
|
||||
<input v-model="entName" id="entName" type="text" placeholder="请输入企业名称" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('entCode')">
|
||||
<label for="entCode" class="form-label">统一社会信用代码</label>
|
||||
<input v-model="entCode" id="entCode" type="text" placeholder="请输入统一社会信用代码" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('carType')">
|
||||
<label for="carType" class="form-label">汽车类型</label>
|
||||
<van-field id="carType" v-model="carType" is-link readonly placeholder="点击选择汽车类型"
|
||||
@click="showCarTypePicker = true" class="form-input" />
|
||||
<van-popup v-model:show="showCarTypePicker" destroy-on-close round position="bottom">
|
||||
<van-picker :model-value="carPickerVal" :columns="carTypeColumns"
|
||||
@cancel="showCarTypePicker = false" @confirm="onConfirmCarType" />
|
||||
</van-popup>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('carLicense')">
|
||||
<!-- <label for="entCode" class="form-label">车牌号</label> -->
|
||||
<CarNumberInput class="form-input" @number-input-result="carLicenseChange" :default-str="carLicense">
|
||||
</CarNumberInput>
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('bankCard')">
|
||||
<label for="bankCard" class="form-label">银行卡号</label>
|
||||
<input v-model="bankCard" id="bankCard" type="tel" placeholder="请输入银行卡号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('mobile')">
|
||||
<label for="mobile" class="form-label">手机号</label>
|
||||
<input v-model="mobile" id="mobile" type="tel" placeholder="请输入手机号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('date')">
|
||||
<label for="date" class="form-label">业务日期</label>
|
||||
<van-field id="date" v-model="dateVal" is-link readonly placeholder="点击选择日期"
|
||||
@click="showDatePicker = true" class="form-input" />
|
||||
<van-popup v-model:show="showDatePicker" destroy-on-close round position="bottom">
|
||||
<van-date-picker v-model="startDate" :formatter="formatterDate" :min-date="minDate"
|
||||
:max-date="maxDate" title="选择日期" @confirm="onConfirmDate" @cancel="showDatePicker = false" />
|
||||
</van-popup>
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('verificationCode')">
|
||||
<label for="verificationCode" class="form-label">验证码</label>
|
||||
<div class="flex-1 flex items-center">
|
||||
<input v-model="verificationCode" id="verificationCode" type="text" placeholder="请输入验证码"
|
||||
class="form-input flex-1" />
|
||||
<button class="ml-2 px-4 py-2 text-sm text-blue-500 disabled:text-gray-400"
|
||||
:disabled="isCountingDown || !isPhoneNumberValid" @click="sendVerificationCode">
|
||||
{{
|
||||
isCountingDown
|
||||
? `${countdown}s重新获取`
|
||||
: "获取验证码"
|
||||
}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 flex items-center">
|
||||
<input type="checkbox" v-model="agreeToTerms" />
|
||||
<span class="ml-2 text-xs text-gray-400">
|
||||
我已阅读并同意
|
||||
<span @click="toUserAgreement" class="text-blue-500 ">用户协议、</span>
|
||||
<span @click="toPrivacyPolicy" class="text-blue-500 ">隐私政策</span>
|
||||
<template v-if="!NeedAuthorization.includes(feature)">
|
||||
<span @click="toAuthorization" class="text-blue-500 ">、授权书</span>
|
||||
</template>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<button class="w-24 rounded-l-xl bg-blue-400 py-2 text-white" @click="toExample">
|
||||
示例报告
|
||||
</button>
|
||||
<button class="flex-1 rounded-r-xl bg-blue-500 py-2 text-white" @click="handleSubmit">
|
||||
立即查询
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-4">
|
||||
<div class="mb-4 text-xl text-gray-800 font-bold">
|
||||
{{ featureData.product_name }}
|
||||
</div>
|
||||
<div class="mb-4 flex items-start justify-between">
|
||||
<div class="text-lg text-gray-500">价格:</div>
|
||||
<div>
|
||||
<div v-if="discountPrice" class="line-through text-gray-500" :class="{ 'text-lg': discountPrice }">
|
||||
¥ {{ featureData.sell_price }}
|
||||
</div>
|
||||
<div class="text-2xl text-red-600 font-semibold">
|
||||
¥{{ discountPrice ? (featureData.sell_price * 0.2).toFixed(2) : featureData.sell_price }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="discountPrice" class="text-sm text-right text-red-500 mb-4">
|
||||
限时活动价:2折优惠
|
||||
</div>
|
||||
<div class="mb-4 text-gray-600 leading-relaxed" v-html="featureData.description">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<template v-if="featureData.features && featureData.features.length > 1">
|
||||
<div class="mb-4 text-lg text-gray-800 font-semibold">
|
||||
报告包含内容
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div v-for="(feature, index) in featureData.features" :key="feature.id"
|
||||
class="rounded-lg py-2 text-center text-sm text-gray-700 font-medium" :class="[
|
||||
(Math.floor(index / 2) + (index % 2)) % 2 === 0
|
||||
? 'bg-gradient-to-r from-blue-200 via-blue-200 to-blue-100'
|
||||
: 'bg-gradient-to-r from-sky-200 via-sky-200 to-sky-100',
|
||||
]">
|
||||
{{ feature.name }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 底部弹出 -->
|
||||
<van-popup v-model:show="showAuthorizationPopup" position="bottom" :style="{ height: '80%' }">
|
||||
<Authorization :style="{ height: '100%' }" :name="name" :id-card="idCard" :mobile="mobile" @agreed="agreed"
|
||||
@cancel="cancel" />
|
||||
</van-popup>
|
||||
<Payment v-model="showPayment" :data="featureData" :id="queryId" @close="showPayment = false" />
|
||||
<RecordFooter v-if="!webviewEnv" />
|
||||
<!-- <div
|
||||
class=" fixed right-2 top-3/4 px-4 py-2 text-sm bg-blue-400 rounded-xl cursor-pointer text-white font-bold shadow active:bg-blue-500">
|
||||
历史查询
|
||||
</div> -->
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.form-label {
|
||||
@apply w-20 text-sm font-medium text-gray-700 flex-shrink-0;
|
||||
}
|
||||
|
||||
.form-input::placeholder {
|
||||
color: var(--van-text-color-3);
|
||||
}
|
||||
|
||||
.form-input {
|
||||
@apply w-full border-b border-gray-200 px-2 py-2 focus:outline-none;
|
||||
}
|
||||
|
||||
.inquire-bg {
|
||||
background: url("@/assets/images/bg_2.png") no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -31,6 +31,10 @@ const featureMap = {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||
},
|
||||
G22SC01: {
|
||||
name: '司法涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuitPP.vue')),
|
||||
},
|
||||
G05HZ01: {
|
||||
name: '股东人企关系',
|
||||
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
|
||||
@@ -115,6 +119,273 @@ onMounted(() => {
|
||||
getReport()
|
||||
});
|
||||
|
||||
// 计算综合评分的函数
|
||||
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 getReport = async () => {
|
||||
let queryUrl = ""
|
||||
if (orderNo.value) {
|
||||
@@ -137,6 +408,10 @@ 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) {
|
||||
@@ -207,6 +482,15 @@ const maskValue = computed(() => {
|
||||
<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">
|
||||
|
||||
@@ -15,7 +15,7 @@ export default defineConfig({
|
||||
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
|
||||
proxy: {
|
||||
"/api/v1": {
|
||||
target: "https://www.tianyuandb.com", // 本地接口地址
|
||||
target: "https://www.quannengcha.com", // 本地接口地址
|
||||
changeOrigin: true,
|
||||
},
|
||||
"/api/v1/chat": {
|
||||
|
||||