Compare commits
10 Commits
e6ae3c4a28
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c4921b34e | |||
| 7b472db9d8 | |||
| d617763d2c | |||
| b1b301306e | |||
| ce06f3a958 | |||
| 6c7169c206 | |||
| 84ed26f1e0 | |||
| 994f16f8bf | |||
| 70b611a328 | |||
| 0190e21287 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -228,4 +228,5 @@ secrets/
|
||||
*.pem
|
||||
*.key
|
||||
*.cert
|
||||
|
||||
*.md
|
||||
!README.md
|
||||
|
||||
217
README.md
217
README.md
@@ -1,137 +1,88 @@
|
||||
# 报告查看器 - 独立 Vue3 项目
|
||||
## 报告查看器(report-viewer)
|
||||
|
||||
这是一个独立的 Vue3 项目,用于展示报告组件。项目使用本地 JSON 文件(`example.json`)作为数据源,不依赖网络请求。
|
||||
|
||||
## 📋 已包含的组件
|
||||
|
||||
1. **DWBG6A2C** - 司南报告(包含所有子模块)
|
||||
2. **FLXG0V4B** - 司法涉诉
|
||||
3. **QYGL3F8E** - 人企关系加强版(包含所有子模块)
|
||||
4. **JRZQ4B6C** - 信贷表现
|
||||
5. **JRZQ09J8** - 收入评估
|
||||
6. **QCXG9P1C** - 名下车辆
|
||||
7. **DWBG8B4D** - 谛听多维报告(包含所有子模块)
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
cd report-viewer
|
||||
npm install
|
||||
# 或
|
||||
pnpm install
|
||||
# 或
|
||||
yarn install
|
||||
```
|
||||
|
||||
### 2. 启动开发服务器
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
访问:`http://localhost:3000`
|
||||
|
||||
### 3. 构建生产版本
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
## 📁 项目结构
|
||||
|
||||
```
|
||||
report-viewer/
|
||||
├── public/
|
||||
│ └── example.json # 示例数据文件
|
||||
├── src/
|
||||
│ ├── components/ # 基础组件
|
||||
│ │ ├── BaseReport.vue # ⭐ 核心组件
|
||||
│ │ ├── GaugeChart.vue
|
||||
│ │ ├── ShareReportButton.vue
|
||||
│ │ └── ...
|
||||
│ ├── views/
|
||||
│ │ └── Report.vue # ⭐ 报告页面
|
||||
│ ├── ui/ # ⭐ 业务组件
|
||||
│ │ ├── DWBG6A2C/ # 司南报告
|
||||
│ │ ├── CFLXG0V4B/ # 司法涉诉
|
||||
│ │ ├── CQYGL3F8E/ # 人企关系加强版
|
||||
│ │ ├── JRZQ4B6C/ # 信贷表现
|
||||
│ │ ├── JRZQ09J8/ # 收入评估
|
||||
│ │ ├── CQCXG9P1C.vue # 名下车辆
|
||||
│ │ └── CDWBG8B4D/ # 谛听多维报告
|
||||
│ ├── assets/ # 样式和图片
|
||||
│ └── composables/ # 工具函数(已移除网络请求)
|
||||
├── package.json
|
||||
├── vite.config.js
|
||||
└── tailwind.config.js
|
||||
```
|
||||
|
||||
## ⚙️ 配置说明
|
||||
|
||||
### 数据源
|
||||
|
||||
项目从 `public/example.json` 加载示例数据。可以直接修改该文件来更新显示的内容。
|
||||
|
||||
### 已移除的功能
|
||||
|
||||
- ✅ 产品背景图片(已移除背景图显示)
|
||||
- ✅ 网络请求(改为从本地 JSON 文件加载)
|
||||
- ✅ API 调用(ShareReportButton 在示例模式下不进行网络请求)
|
||||
|
||||
## 📝 使用说明
|
||||
|
||||
1. 启动项目后,会自动加载 `public/example.json` 中的数据
|
||||
2. 数据会自动排序并显示在报告页面中
|
||||
3. 所有组件都会根据数据进行渲染
|
||||
|
||||
## 🔧 注意事项
|
||||
|
||||
1. **图片资源**:确保所有必要的图片文件已复制到 `src/assets/images/` 目录
|
||||
2. **样式依赖**:项目依赖 Tailwind CSS 和 Vant UI,确保正确引入
|
||||
3. **浏览器兼容**:需要现代浏览器支持(ES2015+)
|
||||
4. **数据格式**:`example.json` 必须符合组件期望的数据结构
|
||||
|
||||
## 📦 依赖说明
|
||||
|
||||
### 核心依赖
|
||||
|
||||
- **vue** ^3.5.12 - Vue 框架
|
||||
- **vue-router** ^4.4.5 - 路由管理
|
||||
- **vant** ^4.9.9 - UI 组件库
|
||||
- **echarts** ^5.5.1 - 图表库
|
||||
- **vue-echarts** ^7.0.3 - Vue ECharts 封装
|
||||
- **@vueuse/core** ^11.3.0 - Vue 工具库
|
||||
- **lodash** ^4.17.21 - 工具函数库
|
||||
|
||||
### 开发依赖
|
||||
|
||||
- **vite** ^5.4.10 - 构建工具
|
||||
- **tailwindcss** ^3.4.15 - CSS 框架
|
||||
- **@vitejs/plugin-vue** - Vite Vue 插件
|
||||
- **unplugin-auto-import** - 自动导入插件
|
||||
- **unplugin-vue-components** - 自动组件导入插件
|
||||
|
||||
## 🐛 常见问题
|
||||
|
||||
### Q: 图片加载失败?
|
||||
A: 确保图片文件已复制到 `src/assets/images/report/` 目录
|
||||
|
||||
### Q: 样式不生效?
|
||||
A: 确保 `tailwind.config.js` 中包含了正确的 content 路径
|
||||
|
||||
### Q: 数据不显示?
|
||||
A: 检查 `public/example.json` 文件格式是否正确,确保数据符合组件期望的结构
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如有问题,请检查:
|
||||
1. 控制台错误信息
|
||||
2. `public/example.json` 文件是否存在且格式正确
|
||||
3. 依赖是否正确安装
|
||||
4. 文件路径是否正确
|
||||
一个基于 **Vue 3 + Vite + Tailwind CSS + Vant** 的移动端报告查看器,用于展示各类风控 / 报告数据(如司法涉诉、消费交易特征等),支持图表可视化和多页报告浏览。
|
||||
|
||||
---
|
||||
|
||||
**提示**:这是一个独立的 Vue3 项目,使用本地 JSON 文件作为数据源,无需后端 API 支持。
|
||||
## 功能概览
|
||||
|
||||
- **报告展示**:按模块展示多种报告内容与字段说明
|
||||
- **图表可视化**:基于 `ECharts` 和 `vue-echarts` 渲染图表
|
||||
- **移动端 UI**:使用 `Vant 4` 组件库,适配手机端浏览体验
|
||||
- **组合式 API**:使用 Vue 3 组合式写法封装业务逻辑(如风险提示 hook 等)
|
||||
|
||||
---
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **框架**:Vue 3
|
||||
- **构建工具**:Vite
|
||||
- **UI 组件库**:Vant 4
|
||||
- **样式**:Tailwind CSS、Sass
|
||||
- **数据请求**:Axios
|
||||
- **图表**:ECharts、vue-echarts
|
||||
|
||||
---
|
||||
|
||||
## 环境要求
|
||||
|
||||
- **Node.js**:建议 >= 18
|
||||
- **包管理器**:推荐使用 `pnpm`(项目中已指定 `pnpm` 版本)
|
||||
|
||||
---
|
||||
|
||||
## 安装与运行
|
||||
|
||||
```bash
|
||||
# 安装依赖(推荐)
|
||||
pnpm install
|
||||
|
||||
# 如果使用 npm / yarn,也可以:
|
||||
# npm install
|
||||
# 或
|
||||
# yarn install
|
||||
```
|
||||
|
||||
### 本地开发
|
||||
|
||||
```bash
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
启动后,按终端提示在浏览器中访问对应地址(通常为 `http://localhost:5173`)。
|
||||
|
||||
### 打包构建
|
||||
|
||||
```bash
|
||||
pnpm build
|
||||
```
|
||||
|
||||
构建产物会输出到 `dist` 目录,可部署到任意静态资源服务器。
|
||||
|
||||
### 预览构建结果
|
||||
|
||||
```bash
|
||||
pnpm preview
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 目录结构(简要)
|
||||
|
||||
以下仅列出与前端页面关系最紧密的部分:
|
||||
|
||||
- `src/main.js`:应用入口文件,挂载 Vue 应用
|
||||
- `src/views/Report.vue`:报告主页面
|
||||
- `src/ui/`:报告相关的 UI 组件(如 `CIVYZ9A2B.vue` 等)
|
||||
- `src/composables/`:组合式函数(如 `useRiskNotifier` 等)
|
||||
- `tailwind.config.js`:Tailwind CSS 配置
|
||||
|
||||
---
|
||||
|
||||
## 开发说明
|
||||
|
||||
- 若需新增报告模块,建议:
|
||||
- 在 `src/ui/` 下新增对应的 Vue 组件
|
||||
- 在 `Report.vue` 中注册或路由中引用新组件
|
||||
- 如需共享逻辑,可在 `src/composables/` 中抽离成 hook
|
||||
- 图表相关逻辑优先封装在单独组件或 composable 中,避免在视图中直接写大量配置。
|
||||
|
||||
32
d.md
32
d.md
@@ -1,32 +0,0 @@
|
||||
|
||||
|
||||
## 请求参数
|
||||
|
||||
| 参数code | 参数名称 | 描述&备注 |
|
||||
| --------- | -------- | --------- |
|
||||
| name | 姓名 | **必填** |
|
||||
| bank_card | 银行卡号 | **必填** |
|
||||
| id_card | 身份证号 | **必填** |
|
||||
| mobile_no | 手机号 | 选填 |
|
||||
|
||||
## 返回参数
|
||||
|
||||
| 参数code | 参数名称 | 描述&备注 |
|
||||
| ------------ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| name | 姓名 | - |
|
||||
| cardNo | 身份证号 | - |
|
||||
| cardId | 卡号 | - |
|
||||
| phone | 手机号 | - |
|
||||
| respCode | 验证结果代码 | 详见响应码说明 |
|
||||
| respDesc | 验证结果信息 | 详见响应码说明 |
|
||||
| respDetail | 验证结果详情 | 验证不通过时的详细说明<br>• 卡状态异常,请换卡重试或联系发卡行<br>• 无效卡号或卡状态异常,请换卡重试或联系发卡行 |
|
||||
| cardType | 卡类型 | 可能值:<br>• 贷记卡<br>• 准贷记卡<br>• 预付卡<br>• 借记卡 |
|
||||
| cardCategory | 卡等级 | 可能值:<br>• 银联支付标记<br>• 无限卡<br>• 准贷记卡<br>• 社保卡<br>• 电子现金卡<br>• 公务卡<br>• 预付卡<br>• 普卡<br>• 白金卡<br>• 钻石卡<br>• 借记卡<br>• 金卡<br>• 小额贷款卡<br>• 信用卡 |
|
||||
| cardName | 银行名称 | - |
|
||||
|
||||
## 响应码说明 (respCode & respDesc)
|
||||
|
||||
| respCode | respDesc |
|
||||
| -------- | ---------- |
|
||||
| 2000 | 认证一致 |
|
||||
| 2001 | 认证不一致 |
|
||||
206
demo.html
206
demo.html
@@ -1,206 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>系统流 卡牌对战 Demo</title>
|
||||
<style>
|
||||
body {
|
||||
background: #111;
|
||||
color: #eee;
|
||||
font-family: sans-serif;
|
||||
padding: 20px;
|
||||
}
|
||||
#log {
|
||||
background: #222;
|
||||
padding: 10px;
|
||||
height: 250px;
|
||||
overflow-y: auto;
|
||||
border: 1px solid #444;
|
||||
margin-bottom: 10px;
|
||||
white-space: pre-line;
|
||||
}
|
||||
.card {
|
||||
display: inline-block;
|
||||
background: #333;
|
||||
border: 1px solid #666;
|
||||
padding: 10px;
|
||||
margin: 5px;
|
||||
cursor: pointer;
|
||||
width: 160px;
|
||||
}
|
||||
.card:hover {
|
||||
background: #444;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h2>《系统流:校园日常攻略》卡牌演示 Demo</h2>
|
||||
|
||||
<div id="stats"></div>
|
||||
<div id="log"></div>
|
||||
<h3>我的手牌</h3>
|
||||
<div id="cards"></div>
|
||||
<button onclick="nextTurn()" style="margin-top: 10px">重新抽卡</button>
|
||||
|
||||
<script>
|
||||
/////////////////////////////////////////////////////
|
||||
// 游戏初始配置
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
let player = {
|
||||
favor: 0, // 女生对玩家好感
|
||||
energy: 100,
|
||||
};
|
||||
|
||||
let npc = {
|
||||
favor: 30, // 初始好感
|
||||
};
|
||||
|
||||
let systemTask = {
|
||||
desc: "让对方情绪波动 +10",
|
||||
target: 10,
|
||||
progress: 0,
|
||||
};
|
||||
|
||||
// 卡牌池 —— 演示可後续扩展
|
||||
const cardPool = [
|
||||
{
|
||||
name: "夸赞(行动卡)",
|
||||
type: "action",
|
||||
effect: () => changeFavor(3),
|
||||
desc: "+3 好感",
|
||||
},
|
||||
{
|
||||
name: "冷幽默(行动卡)",
|
||||
type: "action",
|
||||
effect: () => changeFavor(5),
|
||||
desc: "+5 好感",
|
||||
},
|
||||
{
|
||||
name: "装酷(行动卡)",
|
||||
type: "action",
|
||||
effect: () => changeFavor(1),
|
||||
desc: "+1 好感",
|
||||
},
|
||||
{
|
||||
name: "系统加持(系统卡)",
|
||||
type: "system",
|
||||
effect: () =>
|
||||
changeFavor(Math.floor(Math.random() * 6) + 2),
|
||||
desc: "随机 +2~7 好感",
|
||||
},
|
||||
{
|
||||
name: "语言暴击(系统卡)",
|
||||
type: "system",
|
||||
effect: () => changeFavor(8),
|
||||
desc: "+8 好感",
|
||||
},
|
||||
{
|
||||
name: "冷场(情绪负面)",
|
||||
type: "bad",
|
||||
effect: () => changeFavor(-4),
|
||||
desc: "-4 好感",
|
||||
},
|
||||
];
|
||||
|
||||
// 当前手牌
|
||||
let hand = [];
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// 功能函数
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
// 抽牌
|
||||
function drawCards(num = 3) {
|
||||
hand = [];
|
||||
for (let i = 0; i < num; i++) {
|
||||
let c =
|
||||
cardPool[Math.floor(Math.random() * cardPool.length)];
|
||||
hand.push(c);
|
||||
}
|
||||
render();
|
||||
}
|
||||
|
||||
// 使用卡牌
|
||||
function playCard(index) {
|
||||
let card = hand[index];
|
||||
writeLog(`你使用了【${card.name}】 → ${card.desc}`);
|
||||
card.effect();
|
||||
systemCheck();
|
||||
npcAction();
|
||||
drawCards();
|
||||
}
|
||||
|
||||
// 修改好感 / 数值
|
||||
function changeFavor(v) {
|
||||
npc.favor += v;
|
||||
systemTask.progress += v;
|
||||
if (npc.favor < 0) npc.favor = 0;
|
||||
render();
|
||||
}
|
||||
|
||||
// 系统任务检测
|
||||
function systemCheck() {
|
||||
if (systemTask.progress >= systemTask.target) {
|
||||
writeLog(`📢 系统任务达成:${systemTask.desc}`);
|
||||
writeLog(`奖励:获得 500万软妹币(精神上的)`);
|
||||
systemTask = {
|
||||
desc: "让女生惊讶一次(好感一次增长≥6)",
|
||||
target: 6,
|
||||
progress: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// NPC 回合逻辑(简单演示)
|
||||
function npcAction() {
|
||||
let r = Math.random();
|
||||
if (r < 0.5) {
|
||||
writeLog("女生回应:嗯……还不错。");
|
||||
} else if (r < 0.8) {
|
||||
writeLog("女生:你怎么突然这样?(情绪波动+3)");
|
||||
changeFavor(3);
|
||||
} else {
|
||||
writeLog("女生:无语……你是系统选中的人吗?(好感-2)");
|
||||
changeFavor(-2);
|
||||
}
|
||||
}
|
||||
|
||||
// 日志输出
|
||||
function writeLog(t) {
|
||||
let log = document.getElementById("log");
|
||||
log.innerHTML += t + "\n";
|
||||
log.scrollTop = log.scrollHeight;
|
||||
}
|
||||
|
||||
// UI 渲染
|
||||
function render() {
|
||||
document.getElementById("stats").innerHTML =
|
||||
`女生好感:${npc.favor} ` +
|
||||
`任务:${systemTask.desc}(当前进度 ${systemTask.progress}/${systemTask.target})`;
|
||||
|
||||
let cardDiv = document.getElementById("cards");
|
||||
cardDiv.innerHTML = "";
|
||||
hand.forEach((c, i) => {
|
||||
let div = document.createElement("div");
|
||||
div.className = "card";
|
||||
div.innerHTML = `<b>${c.name}</b><br>${c.desc}`;
|
||||
div.onclick = () => playCard(i);
|
||||
cardDiv.appendChild(div);
|
||||
});
|
||||
}
|
||||
|
||||
// 下一回合(抽新卡)
|
||||
function nextTurn() {
|
||||
drawCards();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// 开始
|
||||
/////////////////////////////////////////////////////
|
||||
writeLog("系统启动:新手引导中……");
|
||||
writeLog("任务:让对方情绪波动 +10");
|
||||
drawCards();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
695
demo2.html
695
demo2.html
@@ -1,695 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>天选打工人 - 系统对战Demo</title>
|
||||
<style>
|
||||
:root {
|
||||
--primary: #00ff9d; /* 赛博绿 */
|
||||
--danger: #ff0055; /* 故障红 */
|
||||
--bg: #0a0a0a;
|
||||
--card-bg: #1a1a1a;
|
||||
--text: #e0e0e0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "Consolas", "Courier New", monospace;
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* --- 顶部:敌人区域 --- */
|
||||
#enemy-area {
|
||||
flex: 2;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-bottom: 1px solid #333;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background: #333;
|
||||
border: 2px solid var(--danger);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 40px;
|
||||
margin-bottom: 10px;
|
||||
transition: transform 0.1s;
|
||||
}
|
||||
|
||||
.hp-bar-container {
|
||||
width: 200px;
|
||||
height: 20px;
|
||||
background: #333;
|
||||
border: 1px solid #555;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.hp-bar-fill {
|
||||
height: 100%;
|
||||
background: var(--danger);
|
||||
width: 100%;
|
||||
transition: width 0.3s ease-out;
|
||||
}
|
||||
|
||||
.intent-bubble {
|
||||
margin-top: 10px;
|
||||
background: #222;
|
||||
padding: 5px 10px;
|
||||
border-radius: 10px;
|
||||
border: 1px solid var(--danger);
|
||||
color: var(--danger);
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* --- 中间:战斗日志 (LLM文字流) --- */
|
||||
#battle-log {
|
||||
flex: 3;
|
||||
overflow-y: auto;
|
||||
padding: 20px;
|
||||
background: rgba(0, 20, 10, 0.5);
|
||||
border-bottom: 1px solid #333;
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.log-entry {
|
||||
margin-bottom: 8px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
.log-system {
|
||||
color: var(--primary);
|
||||
font-weight: bold;
|
||||
}
|
||||
.log-player {
|
||||
color: #fff;
|
||||
}
|
||||
.log-enemy {
|
||||
color: var(--danger);
|
||||
}
|
||||
.log-desc {
|
||||
color: #888;
|
||||
font-style: italic;
|
||||
font-size: 0.9em;
|
||||
margin-left: 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* --- 底部:玩家区域 --- */
|
||||
#player-area {
|
||||
flex: 3;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: #111;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#stats-bar {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
padding: 10px;
|
||||
background: #000;
|
||||
border: 1px solid #333;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.stat-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
}
|
||||
.icon {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
/* --- 卡牌区域 --- */
|
||||
#hand-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 10px;
|
||||
flex-grow: 1;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card {
|
||||
width: 120px;
|
||||
height: 160px;
|
||||
background: var(--card-bg);
|
||||
border: 1px solid var(--primary);
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
cursor: pointer;
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
user-select: none;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
transform: translateY(-20px) scale(1.05);
|
||||
box-shadow: 0 0 15px rgba(0, 255, 157, 0.3);
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.card-cost {
|
||||
background: var(--primary);
|
||||
color: #000;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.card-name {
|
||||
font-weight: bold;
|
||||
color: var(--primary);
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.card-desc {
|
||||
font-size: 11px;
|
||||
color: #aaa;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.card-type-attack {
|
||||
border-color: #ff4444;
|
||||
}
|
||||
.card-type-skill {
|
||||
border-color: #4488ff;
|
||||
}
|
||||
.card-type-money {
|
||||
border-color: #ffd700;
|
||||
box-shadow: 0 0 5px rgba(255, 215, 0, 0.2);
|
||||
}
|
||||
|
||||
/* 按钮 */
|
||||
#end-turn-btn {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 100px;
|
||||
padding: 15px 30px;
|
||||
background: #333;
|
||||
color: white;
|
||||
border: 1px solid #666;
|
||||
cursor: pointer;
|
||||
font-family: inherit;
|
||||
font-weight: bold;
|
||||
}
|
||||
#end-turn-btn:hover {
|
||||
background: #444;
|
||||
}
|
||||
|
||||
/* 动画特效 */
|
||||
@keyframes shake {
|
||||
0% {
|
||||
transform: translate(1px, 1px) rotate(0deg);
|
||||
}
|
||||
10% {
|
||||
transform: translate(-1px, -2px) rotate(-1deg);
|
||||
}
|
||||
20% {
|
||||
transform: translate(-3px, 0px) rotate(1deg);
|
||||
}
|
||||
30% {
|
||||
transform: translate(3px, 2px) rotate(0deg);
|
||||
}
|
||||
40% {
|
||||
transform: translate(1px, -1px) rotate(1deg);
|
||||
}
|
||||
50% {
|
||||
transform: translate(-1px, 2px) rotate(-1deg);
|
||||
}
|
||||
60% {
|
||||
transform: translate(-3px, 1px) rotate(0deg);
|
||||
}
|
||||
70% {
|
||||
transform: translate(3px, 1px) rotate(-1deg);
|
||||
}
|
||||
80% {
|
||||
transform: translate(-1px, -1px) rotate(1deg);
|
||||
}
|
||||
90% {
|
||||
transform: translate(1px, 2px) rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: translate(1px, -2px) rotate(-1deg);
|
||||
}
|
||||
}
|
||||
|
||||
.shake-anim {
|
||||
animation: shake 0.5s;
|
||||
}
|
||||
|
||||
.damage-text {
|
||||
position: absolute;
|
||||
color: red;
|
||||
font-size: 30px;
|
||||
font-weight: bold;
|
||||
animation: floatUp 1s forwards;
|
||||
}
|
||||
|
||||
@keyframes floatUp {
|
||||
0% {
|
||||
transform: translateY(0);
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
transform: translateY(-50px);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* 状态提示 */
|
||||
#game-over {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.9);
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 100;
|
||||
}
|
||||
#game-over h1 {
|
||||
color: var(--primary);
|
||||
font-size: 40px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="enemy-area">
|
||||
<div class="avatar" id="enemy-avatar">🤡</div>
|
||||
<h3 id="enemy-name">势利眼班长</h3>
|
||||
<div class="hp-bar-container">
|
||||
<div class="hp-bar-fill" id="enemy-hp-bar"></div>
|
||||
</div>
|
||||
<div style="margin-top: 5px; font-size: 12px">
|
||||
面子 (HP): <span id="enemy-hp-text">80</span>/80
|
||||
</div>
|
||||
|
||||
<div class="intent-bubble" id="enemy-intent">
|
||||
💬 正在酝酿一句很难听的话 (10点伤害)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="battle-log">
|
||||
<div class="log-entry log-system">> 系统初始化完成...</div>
|
||||
<div class="log-entry log-system">> 目标锁定:[势利眼班长]</div>
|
||||
<div class="log-entry log-system">> 任务:让他当众出丑。</div>
|
||||
</div>
|
||||
|
||||
<div id="player-area">
|
||||
<div id="stats-bar">
|
||||
<div class="stat-item" style="color: #ff4444">
|
||||
<span class="icon">❤️</span> 面子:
|
||||
<span id="player-hp">100</span>
|
||||
</div>
|
||||
<div class="stat-item" style="color: #4488ff">
|
||||
<span class="icon">🛡️</span> 厚脸皮:
|
||||
<span id="player-block">0</span>
|
||||
</div>
|
||||
<div class="stat-item" style="color: #00ff9d">
|
||||
<span class="icon">⚡</span> 精力:
|
||||
<span id="player-energy">3</span>/3
|
||||
</div>
|
||||
<div class="stat-item" style="color: #ffd700">
|
||||
<span class="icon">💰</span> 余额: ¥<span id="player-money"
|
||||
>5000</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="hand-container"></div>
|
||||
</div>
|
||||
|
||||
<button id="end-turn-btn" onclick="endTurn()">结束回合</button>
|
||||
|
||||
<div id="game-over">
|
||||
<h1 id="game-result">任务完成</h1>
|
||||
<button
|
||||
onclick="location.reload()"
|
||||
style="padding: 10px 20px; cursor: pointer"
|
||||
>
|
||||
重新开始
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
/* --- 1. 游戏数据设定 (配置表) --- */
|
||||
|
||||
const GAME_STATE = {
|
||||
player: {
|
||||
hp: 100,
|
||||
maxHp: 100,
|
||||
block: 0,
|
||||
energy: 3,
|
||||
maxEnergy: 3,
|
||||
money: 5000,
|
||||
},
|
||||
enemy: {
|
||||
name: "势利眼班长",
|
||||
hp: 80,
|
||||
maxHp: 80,
|
||||
nextDmg: 10,
|
||||
avatar: "🤡",
|
||||
},
|
||||
hand: [],
|
||||
deck: [],
|
||||
turn: 1,
|
||||
isGameOver: false,
|
||||
};
|
||||
|
||||
// 模拟 LLM 的文案库 (实际开发中这里接 API)
|
||||
const LLM_TEXTS = {
|
||||
start: [
|
||||
"班长看了看你的衣服,露出了鄙夷的眼神。",
|
||||
"系统检测到装逼场力波动,请宿主做好准备。",
|
||||
],
|
||||
atk_normal: [
|
||||
"你冷冷一笑:'这就是你的实力?'",
|
||||
"你指出了他话里的逻辑漏洞,全场鸦雀无声。",
|
||||
"你说:'去年你借我的五百块还没还呢。'",
|
||||
],
|
||||
atk_money: [
|
||||
"你打开手机银行,语音播报:'到账一百万元'。",
|
||||
"你随手掏出一把车钥匙扔在桌上:'挪下车。'",
|
||||
"你用钱扇了扇风:'这屋里穷酸气太重。'",
|
||||
],
|
||||
defend: [
|
||||
"你假装在回消息,完全无视了他的废话。",
|
||||
"你使用了【左耳进右耳出】,他的嘲讽无效。",
|
||||
"你微笑着看着他,就像看着一只猴子。",
|
||||
],
|
||||
enemy_atk: [
|
||||
"班长嘲笑道:'听说你还在租房住?'",
|
||||
"班长向大家展示他的劳力士绿水鬼。",
|
||||
"班长说:'服务员,给这位加把椅子,别让他站着。'",
|
||||
],
|
||||
};
|
||||
|
||||
// 卡牌数据库 (原型)
|
||||
const CARD_DATABASE = [
|
||||
{
|
||||
id: "atk_1",
|
||||
name: "阴阳怪气",
|
||||
type: "attack",
|
||||
cost: 1,
|
||||
val: 8,
|
||||
desc: "造成 8 点面子伤害",
|
||||
flavorType: "atk_normal",
|
||||
},
|
||||
{
|
||||
id: "atk_2",
|
||||
name: "揭露黑历史",
|
||||
type: "attack",
|
||||
cost: 2,
|
||||
val: 18,
|
||||
desc: "造成 18 点面子伤害",
|
||||
flavorType: "atk_normal",
|
||||
},
|
||||
{
|
||||
id: "def_1",
|
||||
name: "装聋作哑",
|
||||
type: "skill",
|
||||
cost: 1,
|
||||
val: 8,
|
||||
desc: "获得 8 点厚脸皮(护盾)",
|
||||
flavorType: "defend",
|
||||
},
|
||||
{
|
||||
id: "money_1",
|
||||
name: "钞能力打击",
|
||||
type: "money",
|
||||
cost: 1,
|
||||
val: 25,
|
||||
moneyCost: 500,
|
||||
desc: "消耗¥500,造成 25 点伤害",
|
||||
flavorType: "atk_money",
|
||||
},
|
||||
{
|
||||
id: "def_2",
|
||||
name: "战术喝水",
|
||||
type: "skill",
|
||||
cost: 0,
|
||||
val: 4,
|
||||
desc: "获得 4 点厚脸皮(0费)",
|
||||
flavorType: "defend",
|
||||
},
|
||||
];
|
||||
|
||||
/* --- 2. 核心逻辑函数 --- */
|
||||
|
||||
function initGame() {
|
||||
updateUI();
|
||||
startPlayerTurn();
|
||||
log(getRandomText(LLM_TEXTS.start), "system");
|
||||
}
|
||||
|
||||
function startPlayerTurn() {
|
||||
GAME_STATE.player.energy = GAME_STATE.player.maxEnergy;
|
||||
GAME_STATE.player.block = 0; // 回合开始护盾清零(简化规则)
|
||||
|
||||
// 简单的抽牌逻辑:随机抽 4 张
|
||||
GAME_STATE.hand = [];
|
||||
for (let i = 0; i < 4; i++) {
|
||||
const randomCard =
|
||||
CARD_DATABASE[
|
||||
Math.floor(Math.random() * CARD_DATABASE.length)
|
||||
];
|
||||
// 深拷贝以防止修改原数据
|
||||
GAME_STATE.hand.push({
|
||||
...randomCard,
|
||||
uid: Date.now() + i,
|
||||
});
|
||||
}
|
||||
|
||||
updateUI();
|
||||
log(`=== 第 ${GAME_STATE.turn} 回合 ===`, "system");
|
||||
}
|
||||
|
||||
function playCard(index) {
|
||||
if (GAME_STATE.isGameOver) return;
|
||||
|
||||
const card = GAME_STATE.hand[index];
|
||||
const player = GAME_STATE.player;
|
||||
|
||||
// 1. 检查资源
|
||||
if (player.energy < card.cost) {
|
||||
log("精力不足!", "system");
|
||||
shakeScreen("stats-bar");
|
||||
return;
|
||||
}
|
||||
if (card.type === "money" && player.money < card.moneyCost) {
|
||||
log("余额不足!无法使用钞能力!", "system");
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 扣除资源
|
||||
player.energy -= card.cost;
|
||||
if (card.type === "money") player.money -= card.moneyCost;
|
||||
|
||||
// 3. 执行效果
|
||||
let logMsg = "";
|
||||
if (card.type === "attack" || card.type === "money") {
|
||||
dealDamage(card.val);
|
||||
logMsg = getRandomText(LLM_TEXTS[card.flavorType]);
|
||||
} else if (card.type === "skill") {
|
||||
player.block += card.val;
|
||||
logMsg = getRandomText(LLM_TEXTS[card.flavorType]);
|
||||
}
|
||||
|
||||
// 4. 移除手牌 & 更新UI
|
||||
GAME_STATE.hand.splice(index, 1);
|
||||
log(`你使用了【${card.name}】`, "player");
|
||||
log(logMsg, "desc");
|
||||
|
||||
updateUI();
|
||||
checkWin();
|
||||
}
|
||||
|
||||
function dealDamage(amount) {
|
||||
GAME_STATE.enemy.hp -= amount;
|
||||
if (GAME_STATE.enemy.hp < 0) GAME_STATE.enemy.hp = 0;
|
||||
|
||||
// 视觉特效
|
||||
const enemyEl = document.getElementById("enemy-avatar");
|
||||
enemyEl.classList.add("shake-anim");
|
||||
setTimeout(() => enemyEl.classList.remove("shake-anim"), 500);
|
||||
|
||||
// 飘字
|
||||
showFloatingText(`-${amount}`);
|
||||
}
|
||||
|
||||
function endTurn() {
|
||||
if (GAME_STATE.isGameOver) return;
|
||||
|
||||
// 敌人行动
|
||||
setTimeout(() => {
|
||||
enemyAction();
|
||||
}, 500);
|
||||
}
|
||||
|
||||
function enemyAction() {
|
||||
const dmg = GAME_STATE.enemy.nextDmg;
|
||||
const player = GAME_STATE.player;
|
||||
|
||||
// 扣除护盾逻辑
|
||||
let actualDmg = dmg;
|
||||
if (player.block >= actualDmg) {
|
||||
player.block -= actualDmg;
|
||||
actualDmg = 0;
|
||||
} else {
|
||||
actualDmg -= player.block;
|
||||
player.block = 0;
|
||||
}
|
||||
|
||||
player.hp -= actualDmg;
|
||||
|
||||
log(getRandomText(LLM_TEXTS.enemy_atk), "enemy");
|
||||
if (actualDmg > 0) {
|
||||
log(`> 受到 ${actualDmg} 点精神伤害!`, "enemy");
|
||||
document.body.classList.add("shake-anim"); // 全屏震动
|
||||
setTimeout(
|
||||
() => document.body.classList.remove("shake-anim"),
|
||||
500
|
||||
);
|
||||
} else {
|
||||
log(`> 你的厚脸皮完全抵挡了伤害!`, "system");
|
||||
}
|
||||
|
||||
// 随机生成下回合意图
|
||||
GAME_STATE.enemy.nextDmg = Math.floor(Math.random() * 10) + 5;
|
||||
|
||||
GAME_STATE.turn++;
|
||||
updateUI();
|
||||
checkLoss();
|
||||
|
||||
if (!GAME_STATE.isGameOver) {
|
||||
setTimeout(startPlayerTurn, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
/* --- 3. 辅助函数 --- */
|
||||
|
||||
function checkWin() {
|
||||
if (GAME_STATE.enemy.hp <= 0) {
|
||||
GAME_STATE.isGameOver = true;
|
||||
document.getElementById("game-result").innerText =
|
||||
"打脸成功!奖励 ¥10000";
|
||||
document.getElementById("game-result").style.color =
|
||||
"#00ff9d";
|
||||
document.getElementById("game-over").style.display = "flex";
|
||||
}
|
||||
}
|
||||
|
||||
function checkLoss() {
|
||||
if (GAME_STATE.player.hp <= 0) {
|
||||
GAME_STATE.isGameOver = true;
|
||||
document.getElementById("game-result").innerText =
|
||||
"任务失败:你社死了";
|
||||
document.getElementById("game-result").style.color =
|
||||
"#ff0055";
|
||||
document.getElementById("game-over").style.display = "flex";
|
||||
}
|
||||
}
|
||||
|
||||
function updateUI() {
|
||||
// 敌人 UI
|
||||
const hpPercent =
|
||||
(GAME_STATE.enemy.hp / GAME_STATE.enemy.maxHp) * 100;
|
||||
document.getElementById(
|
||||
"enemy-hp-bar"
|
||||
).style.width = `${hpPercent}%`;
|
||||
document.getElementById("enemy-hp-text").innerText =
|
||||
GAME_STATE.enemy.hp;
|
||||
document.getElementById(
|
||||
"enemy-intent"
|
||||
).innerText = `💬 准备造成 ${GAME_STATE.enemy.nextDmg} 点伤害`;
|
||||
|
||||
// 玩家 UI
|
||||
document.getElementById("player-hp").innerText =
|
||||
GAME_STATE.player.hp;
|
||||
document.getElementById("player-block").innerText =
|
||||
GAME_STATE.player.block;
|
||||
document.getElementById("player-energy").innerText =
|
||||
GAME_STATE.player.energy;
|
||||
document.getElementById("player-money").innerText =
|
||||
GAME_STATE.player.money;
|
||||
|
||||
// 渲染手牌
|
||||
const handContainer = document.getElementById("hand-container");
|
||||
handContainer.innerHTML = "";
|
||||
GAME_STATE.hand.forEach((card, index) => {
|
||||
const cardEl = document.createElement("div");
|
||||
cardEl.className = `card card-type-${card.type}`;
|
||||
cardEl.onclick = () => playCard(index);
|
||||
|
||||
cardEl.innerHTML = `
|
||||
<div class="card-cost">${card.cost}</div>
|
||||
<div class="card-name">${card.name}</div>
|
||||
<div class="card-desc">${card.desc}</div>
|
||||
`;
|
||||
handContainer.appendChild(cardEl);
|
||||
});
|
||||
}
|
||||
|
||||
function log(text, type) {
|
||||
const logArea = document.getElementById("battle-log");
|
||||
const entry = document.createElement("div");
|
||||
entry.className = `log-entry log-${type}`;
|
||||
entry.innerText = text;
|
||||
logArea.appendChild(entry);
|
||||
logArea.scrollTop = logArea.scrollHeight;
|
||||
}
|
||||
|
||||
function getRandomText(array) {
|
||||
return array[Math.floor(Math.random() * array.length)];
|
||||
}
|
||||
|
||||
function showFloatingText(text) {
|
||||
const enemyArea = document.getElementById("enemy-area");
|
||||
const el = document.createElement("div");
|
||||
el.className = "damage-text";
|
||||
el.innerText = text;
|
||||
el.style.left = "50%";
|
||||
el.style.top = "50%";
|
||||
enemyArea.appendChild(el);
|
||||
setTimeout(() => el.remove(), 1000);
|
||||
}
|
||||
|
||||
function shakeScreen(elementId) {
|
||||
const el = document.getElementById(elementId);
|
||||
el.classList.add("shake-anim");
|
||||
setTimeout(() => el.classList.remove("shake-anim"), 500);
|
||||
}
|
||||
|
||||
// 启动游戏
|
||||
initGame();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -95,7 +95,13 @@
|
||||
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
<script>
|
||||
console.log('[index.html] 页面脚本开始执行');
|
||||
window.onerror = function(msg, url, lineNo, columnNo, error) {
|
||||
console.error('[index.html] 全局错误捕捉:', msg, 'at', url, 'line:', lineNo);
|
||||
return false;
|
||||
};
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
console.log('[index.html] DOMContentLoaded 已触发');
|
||||
const loadingElement = document.getElementById('app-loading');
|
||||
if (loadingElement) {
|
||||
loadingElement.style.opacity = '0';
|
||||
|
||||
1700
public/example.json
1700
public/example.json
File diff suppressed because it is too large
Load Diff
@@ -87,24 +87,6 @@ onMounted(async () => {
|
||||
await loadTrapezoidBackground();
|
||||
});
|
||||
|
||||
// 处理数据拆分(支持DWBG8B4D、DWBG6A2C、CJRZQ5E9F和CQYGL3F8E)
|
||||
const processedReportData = computed(() => {
|
||||
let data = reportData.value;
|
||||
|
||||
// 拆分DWBG8B4D数据
|
||||
data = splitDWBG8B4DForTabs(data);
|
||||
|
||||
// 拆分DWBG6A2C数据
|
||||
data = splitDWBG6A2CForTabs(data);
|
||||
|
||||
// 拆分CQYGL3F8E数据
|
||||
data = splitCQYGL3F8EForTabs(data);
|
||||
// 过滤掉在featureMap中没有对应的项
|
||||
return data.filter(item => featureMap[item.data.apiID]);
|
||||
});
|
||||
|
||||
|
||||
// 牌匾背景图片样式
|
||||
const trapezoidBgStyle = computed(() => {
|
||||
if (trapezoidBgImage.value) {
|
||||
return {
|
||||
@@ -170,6 +152,10 @@ const featureMap = {
|
||||
name: "关联风险监督",
|
||||
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskSupervisionSection.vue")),
|
||||
},
|
||||
DWBG6A2C_CourtRiskInfo:{
|
||||
name:"法院风险信息",
|
||||
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")),
|
||||
},
|
||||
|
||||
// 司法涉诉
|
||||
FLXG0V4B: {
|
||||
@@ -179,6 +165,15 @@ const featureMap = {
|
||||
),
|
||||
},
|
||||
|
||||
// 法院被执行人高级版
|
||||
FLXGK5D2: {
|
||||
name: "法院被执行人高级版",
|
||||
component: defineAsyncComponent(() =>
|
||||
import("@/ui/FLXGK5D2/index.vue")
|
||||
),
|
||||
remark: '法院被执行人高级版展示申请人作为失信被执行人或限高被执行人的详细情况。数据来源于法院公开信息,包括案号、执行法院、立案时间及风险信号描述等。'
|
||||
},
|
||||
|
||||
// 个人涉诉
|
||||
FLXG7E8F: {
|
||||
name: "个人涉诉",
|
||||
@@ -251,7 +246,7 @@ const featureMap = {
|
||||
remark: '基于个人收入指数进行消费能力等级评估,展示用户的月消费能力范围。消费能力等级反映用户的消费水平,等级越高对应的月消费能力越强。数据来源于个人收入指数评分,实际消费能力可能因个人消费习惯、地区差异等因素而有所不同,建议结合其他消费行为数据进行综合评估。'
|
||||
},
|
||||
|
||||
// 名下车辆
|
||||
// 名下车辆详细版
|
||||
QCXG9P1C: {
|
||||
name: "名下车辆",
|
||||
component: defineAsyncComponent(() => import("@/ui/CQCXG9P1C.vue")),
|
||||
@@ -270,6 +265,56 @@ const featureMap = {
|
||||
component: defineAsyncComponent(() => import("@/ui/DWBG7F3A/index.vue")),
|
||||
remark: '多头借贷行业风险版提供全面的多头借贷风险评估,包括多头共债子分、多头申请、多头逾期、圈团风险和可疑欺诈风险等多维度分析。'
|
||||
},
|
||||
JRZQ5E9F: {
|
||||
name: "贷款风险评估",
|
||||
component: defineAsyncComponent(() => import("@/ui/CJRZQ5E9F/index.vue")),
|
||||
remark: '贷款风险评估提供全面的个人贷款风险分析,包括风险概览、信用评分、贷款行为分析、机构分析等多维度评估。'
|
||||
},
|
||||
FLXG3D56: {
|
||||
name: "违约失信",
|
||||
component: defineAsyncComponent(() => import("@/ui/CFLXG3D56.vue")),
|
||||
remark: '违约失信用于检测个人在法院失信、银行风险、非银机构风险等多个维度的不良记录,包括法院失信被执行人、银行不良记录、非银机构逾期、失联等各类风险名单。'
|
||||
},
|
||||
FLXGDEA9: {
|
||||
name: "本人不良",
|
||||
component: defineAsyncComponent(() => import("@/ui/CFLXGDEA9.vue")),
|
||||
remark: '本人不良记录查询结果来源于公安部门等权威机构,包括各类违法犯罪前科记录。查询结果仅供参考,具体信息以相关部门官方记录为准。'
|
||||
},
|
||||
IVYZ81NC:{
|
||||
name: "婚姻状态",
|
||||
component: defineAsyncComponent(() => import("@/ui/CIVYZ81NC.vue")),
|
||||
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异。如您对查询结果有疑问,请联系客服反馈。',
|
||||
},
|
||||
IVYZ5733:{
|
||||
name: "婚姻状态",
|
||||
component: defineAsyncComponent(() => import("@/ui/CIVYZ5733.vue")),
|
||||
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异。如您对查询结果有疑问,请联系客服反馈。',
|
||||
},
|
||||
JRZQ0A03:{
|
||||
name: "借贷申请记录",
|
||||
component: defineAsyncComponent(() => import("@/ui/CJRZQ0A03.vue")),
|
||||
remark: '借贷申请记录通过分析用户在不同时间段的借贷申请行为、机构类型分布、申请频率等数据,评估用户的借贷意向强度和风险特征,帮助识别潜在的过度借贷风险。'
|
||||
},
|
||||
JRZQ4AA8:{
|
||||
name: "偿债压力指数",
|
||||
component: defineAsyncComponent(() => import("@/ui/CJRZQ4AA8.vue")),
|
||||
remark: '偿债压力指数通过分析用户的债务规模、还款能力、收入水平等因素,计算并评估用户的偿债压力等级,帮助金融机构评估用户的还款能力和违约风险。'
|
||||
},
|
||||
JRZQ8203:{
|
||||
name: "借贷行为记录",
|
||||
component: defineAsyncComponent(() => import("@/ui/CJRZQ8203.vue")),
|
||||
remark: '借贷行为记录通过分析用户的借款行为、还款行为、时间趋势等多维度数据,全面评估用户的借贷行为特征和信用表现,帮助识别异常借贷模式和潜在风险。'
|
||||
},
|
||||
QCXG7A2B:{
|
||||
name: "名下车辆",
|
||||
component: defineAsyncComponent(() => import("@/ui/CQCXG7A2B.vue")),
|
||||
remark: '名下车辆查询结果来源于车辆管理部门等权威机构,包括各类车辆登记记录。查询结果仅供参考,具体信息以相关部门官方记录为准。'
|
||||
},
|
||||
IVYZ3P9M: {
|
||||
name: "学历信息",
|
||||
component: defineAsyncComponent(() => import("@/ui/IVYZ3P9M.vue")),
|
||||
remark: '学历信息展示学生姓名、身份证号、学校、专业、入学与毕业时间、学历层次以及学习形式等字段,可结合字典编码了解具体含义。',
|
||||
},
|
||||
|
||||
// 特殊名单验证B
|
||||
JRZQ8A2D: {
|
||||
@@ -313,6 +358,12 @@ const featureMap = {
|
||||
remark: '手机在网时长查询用于检测用户手机号码的在网使用时长。在网时长越长,通常表示用户身份越稳定,信用风险越低。需要注意的是,如果手机号码存在携号转网的情况,那么在网时长会从转网的时候重新计算,转网前的在网时长不计入当前在网时长。建议结合手机携号转网查询结果进行综合评估。'
|
||||
},
|
||||
|
||||
IVYZ0S0D:{
|
||||
name: "劳动仲裁信息查询(个人版)",
|
||||
component: defineAsyncComponent(() => import("@/ui/IVYZ0S0D.vue")),
|
||||
remark: '劳动仲裁信息查询(个人版)用于查询个人在劳动仲裁方面的信息,包括劳动仲裁案件数量、劳动仲裁案件类型、劳动仲裁案件结果等。',
|
||||
},
|
||||
|
||||
// 谛听多维报告
|
||||
DWBG8B4D: {
|
||||
name: "谛听多维报告",
|
||||
@@ -355,6 +406,10 @@ const featureMap = {
|
||||
name: "规则风险提示",
|
||||
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/RiskWarningTab.vue")),
|
||||
},
|
||||
// DWBG3B4DCourtInfo:{
|
||||
// name: "规则风险提示",
|
||||
// component: defineAsyncComponent(() => import("@/ui/cDwBG8B4D/components/MultcourtInfosection.vue")),
|
||||
// }
|
||||
};
|
||||
|
||||
const maskValue = computed(() => {
|
||||
@@ -428,6 +483,7 @@ const maskValue = computed(() => {
|
||||
const featureRiskLevels = {
|
||||
// 🔴 高风险类
|
||||
'FLXG0V4B': 20, // 司法涉诉
|
||||
'FLXGK5D2': 20, // 法院被执行人高级版
|
||||
'FLXG7E8F': 20, // 个人涉诉
|
||||
|
||||
// 🟠 中高风险类 - 权重 7
|
||||
@@ -436,15 +492,27 @@ const featureRiskLevels = {
|
||||
'JRZQ8A2D': 9, // 特殊名单验证
|
||||
'JRZQ7F1A': 8, // 全景雷达
|
||||
'JRZQ6F2A': 7, // 借贷意向验证A
|
||||
'JRZQ5E9F': 8, // 借选指数评估
|
||||
'JRZQ0A03': 7, // 借贷意向验证
|
||||
'JRZQ8203': 7, // 借贷行为验证
|
||||
'JRZQ4AA8': 6, // 偿债压力指数
|
||||
'FLXG3D56': 9, // 特殊名单验证
|
||||
'JRZQ3C9R': 7, // 支付行为指数
|
||||
'YYSY7D3E': 5, // 手机携号转网
|
||||
'YYSY8B1C': 5, // 手机在网时长
|
||||
|
||||
// 🟡 中风险类 - 权重 5
|
||||
'QYGL3F8E': 5, // 人企关系加强版
|
||||
'QCXG9P1C': 5, // 名下车辆
|
||||
'QCXG9P1C': 5, // 名下车辆贷前
|
||||
'QCXG7A2B': 3, // 名下车辆(简化版)
|
||||
'JRZQ09J8': 5, // 收入评估
|
||||
'JRZQ8B3C': 5, // 个人消费能力等级
|
||||
'IVYZ3P9M': 4, // 学籍学历核验(实时版)
|
||||
'FLXGDEA9': 15, // 公安不良人员名单(加强版)
|
||||
'IVYZ81NC': 3, // 单人婚姻查询(登记时间版)
|
||||
'IVYZ5733': 3, // 单人婚姻状态A
|
||||
'IVYZ0S0D': 3, // 劳动仲裁信息查询(个人版)
|
||||
|
||||
|
||||
// 📊 复合报告类 - 按子模块动态计算
|
||||
'DWBG8B4D': 0, // 谛听多维报告(由子模块计算)
|
||||
@@ -461,6 +529,8 @@ const featureRiskLevels = {
|
||||
'DWBG8B4D_LeasingRisk': 6,
|
||||
'DWBG8B4D_RiskSupervision': 8,
|
||||
'DWBG8B4D_RiskWarningTab': 9,
|
||||
'DWBG6A2C_CourtRiskInfo':9,
|
||||
|
||||
|
||||
// 司南报告子模块
|
||||
'DWBG6A2C_StandLiveInfo': 4,
|
||||
@@ -475,6 +545,7 @@ const featureRiskLevels = {
|
||||
'DWBG6A2C_CreditDetail': 5,
|
||||
'DWBG6A2C_RentalBehavior': 5,
|
||||
'DWBG6A2C_RiskSupervision': 8,
|
||||
'DWBG6A2C_CourtRiskInfo':9,
|
||||
|
||||
// 人企关系加强版子模块
|
||||
'CQYGL3F8E_Investment': 4,
|
||||
@@ -487,6 +558,32 @@ const featureRiskLevels = {
|
||||
'CQYGL3F8E_TaxRisk': 7,
|
||||
};
|
||||
|
||||
// 处理数据拆分(支持DWBG8B4D、DWBG6A2C、CJRZQ5E9F和CQYGL3F8E)
|
||||
const processedReportData = computed(() => {
|
||||
console.log('[BaseReport.vue] 开始计算 processedReportData...');
|
||||
let data = reportData.value || [];
|
||||
|
||||
// 拆分DWBG8B4D数据
|
||||
data = splitDWBG8B4DForTabs(data);
|
||||
|
||||
// 拆分DWBG6A2C数据
|
||||
data = splitDWBG6A2CForTabs(data);
|
||||
|
||||
// 拆分CQYGL3F8E数据
|
||||
data = splitCQYGL3F8EForTabs(data);
|
||||
// 过滤掉在featureMap中没有对应的项
|
||||
const filtered = data.filter(item => {
|
||||
const apiID = item?.data?.apiID;
|
||||
const exists = item && item.data && apiID && featureMap[apiID];
|
||||
if (!exists && item?.data?.apiID) {
|
||||
console.warn(`[BaseReport.vue] 未找到 API ID "${apiID}" 的对应组件配置,已过滤。`);
|
||||
}
|
||||
return exists;
|
||||
});
|
||||
console.log('[BaseReport.vue] 过滤后模块数量:', filtered.length);
|
||||
return filtered;
|
||||
});
|
||||
|
||||
// 存储每个组件的 ref 引用
|
||||
const componentRefs = ref({});
|
||||
|
||||
@@ -506,6 +603,7 @@ defineExpose({
|
||||
|
||||
// 计算综合评分的函数(分数越高越安全)
|
||||
const calculateScore = () => {
|
||||
console.log('[BaseReport.vue] 开始计算报告评分...');
|
||||
// 收集实际存在的 features 及其风险权重
|
||||
const presentFeatures = [];
|
||||
|
||||
@@ -526,6 +624,7 @@ const calculateScore = () => {
|
||||
});
|
||||
});
|
||||
|
||||
console.log('[BaseReport.vue] 参与评分的特征数量:', presentFeatures.length);
|
||||
if (presentFeatures.length === 0) return 100; // 无有效特征时返回满分(最安全)
|
||||
|
||||
// 累计总风险分数
|
||||
@@ -562,12 +661,14 @@ const calculateScore = () => {
|
||||
totalRiskScore += riskContribution;
|
||||
});
|
||||
|
||||
console.log('[BaseReport.vue] 计算得出的总风险分数:', totalRiskScore);
|
||||
// 将总风险分数限制在 0-90 范围内(确保最低分为10分)
|
||||
const finalRiskScore = Math.max(0, Math.min(90, Math.round(totalRiskScore)));
|
||||
|
||||
// 转换为安全分数:分数越高越安全(100 - 风险分数)
|
||||
// 最终分数范围:10-100分
|
||||
const safetyScore = 100 - finalRiskScore;
|
||||
console.log('[BaseReport.vue] 最终安全评分:', safetyScore);
|
||||
|
||||
return safetyScore;
|
||||
};
|
||||
@@ -581,11 +682,11 @@ watch([reportData, componentRiskScores], () => {
|
||||
timestamp: new Date().toISOString(),
|
||||
finalScore: reportScore.value,
|
||||
reportModules: processedReportData.value.map((item, index) => ({
|
||||
apiID: item.data.apiID,
|
||||
name: featureMap[item.data.apiID]?.name || '未知',
|
||||
apiID: item?.data?.apiID || 'unknown',
|
||||
name: featureMap[item?.data?.apiID]?.name || '未知',
|
||||
index: index,
|
||||
riskScore: componentRiskScores.value[`${item.data.apiID}_${index}`] ?? '未上报',
|
||||
weight: featureRiskLevels[item.data.apiID] ?? 0
|
||||
riskScore: componentRiskScores.value[`${item?.data?.apiID}_${index}`] ?? '未上报',
|
||||
weight: featureRiskLevels[item?.data?.apiID] ?? 0
|
||||
})),
|
||||
componentScores: componentRiskScores.value,
|
||||
riskLevels: featureRiskLevels
|
||||
|
||||
80
src/components/LTable.vue
Normal file
80
src/components/LTable.vue
Normal file
@@ -0,0 +1,80 @@
|
||||
<script setup>
|
||||
import { computed, onMounted } from "vue";
|
||||
|
||||
// 接收表格数据和类型的 props
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
default: "purple-pink", // 默认渐变颜色
|
||||
},
|
||||
});
|
||||
// 根据 type 设置不同的渐变颜色(偶数行)
|
||||
const evenClass = computed(() => {
|
||||
// 统一使用主题色浅色背景
|
||||
return "bg-red-50/40";
|
||||
});
|
||||
|
||||
// 动态计算表头的背景颜色和文本颜色
|
||||
const headerClass = computed(() => {
|
||||
// 统一使用主题色浅色背景
|
||||
return "bg-red-100";
|
||||
});
|
||||
// 斑马纹样式,偶数行带颜色,奇数行没有颜色,且从第二行开始
|
||||
function zebraClass(index) {
|
||||
return index % 2 === 1 ? evenClass.value : "";
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="l-table overflow-x-auto">
|
||||
<table
|
||||
class="min-w-full border-collapse table-auto text-center text-size-xs"
|
||||
>
|
||||
<thead :class="headerClass">
|
||||
<tr>
|
||||
<!-- 插槽渲染表头 -->
|
||||
<slot name="header" />
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr
|
||||
v-for="(row, index) in props.data"
|
||||
:key="index"
|
||||
:class="zebraClass(index)"
|
||||
class="border-t"
|
||||
>
|
||||
<slot :row="row" />
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* 基础表格样式 */
|
||||
th {
|
||||
font-weight: bold;
|
||||
padding: 12px;
|
||||
text-align: left;
|
||||
border: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
/* 表格行样式 */
|
||||
td {
|
||||
padding: 12px;
|
||||
border: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
}
|
||||
.l-table {
|
||||
@apply rounded-xl;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
6417
src/data/ivyz3p9m-dictionary.json
Normal file
6417
src/data/ivyz3p9m-dictionary.json
Normal file
File diff suppressed because it is too large
Load Diff
11132
src/data/multiLoanHourlyDictionary.json
Normal file
11132
src/data/multiLoanHourlyDictionary.json
Normal file
File diff suppressed because it is too large
Load Diff
43
src/main.js
43
src/main.js
@@ -1,31 +1,28 @@
|
||||
import './assets/main.css'
|
||||
import { createApp } from 'vue'
|
||||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import App from './App.vue'
|
||||
console.log('[main.js] 脚本开始执行...');
|
||||
import "./assets/main.css";
|
||||
import { createApp } from "vue";
|
||||
import { createRouter, createWebHistory } from "vue-router";
|
||||
import App from "./App.vue";
|
||||
|
||||
console.log('[main.js] 依赖库导入完成');
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
routes: [
|
||||
{
|
||||
path: '/',
|
||||
name: 'Report',
|
||||
component: () => import('./views/Report.vue')
|
||||
path: "/",
|
||||
name: "Report",
|
||||
component: () => {
|
||||
console.log('[main.js] 路由正在加载 Report.vue...');
|
||||
return import("./views/Report.vue");
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/report',
|
||||
name: 'ReportView',
|
||||
component: () => import('./views/Report.vue')
|
||||
},
|
||||
{
|
||||
path: '/report-pdf',
|
||||
name: 'ReportPDF',
|
||||
component: () => import('./views/ReportPDF.vue')
|
||||
}
|
||||
]
|
||||
})
|
||||
],
|
||||
});
|
||||
|
||||
const app = createApp(App)
|
||||
app.use(router)
|
||||
|
||||
app.mount('#app')
|
||||
const app = createApp(App);
|
||||
app.use(router);
|
||||
|
||||
console.log('[main.js] 准备挂载应用...');
|
||||
app.mount("#app");
|
||||
console.log('[main.js] 应用挂载指令已发出');
|
||||
|
||||
747
src/ui/CBehaviorRiskScan.vue
Normal file
747
src/ui/CBehaviorRiskScan.vue
Normal file
@@ -0,0 +1,747 @@
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
})
|
||||
|
||||
// 风险等级转换为文字描述
|
||||
const riskLevelText = (level, type) => {
|
||||
if (type === 'black_gray_level') {
|
||||
const levels = {
|
||||
'': '无风险',
|
||||
1: '低风险',
|
||||
2: '中等风险',
|
||||
3: '高风险',
|
||||
4: '极高风险',
|
||||
}
|
||||
return levels[level] || '未知风险'
|
||||
} else if (type === 'telefraud_level') {
|
||||
const levels = {
|
||||
0: '无风险',
|
||||
1: '极低风险',
|
||||
2: '低风险',
|
||||
3: '中低风险',
|
||||
4: '中等风险',
|
||||
5: '高风险',
|
||||
6: '极高风险',
|
||||
}
|
||||
return levels[level] || '未知风险'
|
||||
} else if (type === 'frg_list_level') {
|
||||
if (level >= '3' && level <= '5') return '低风险团伙'
|
||||
if (level >= '6' && level <= '7') return '中风险团伙'
|
||||
if (level >= '8' && level <= '10') return '高风险团伙'
|
||||
return '无风险'
|
||||
} else if (type === 'risk_level') {
|
||||
const levels = {
|
||||
A: '无风险',
|
||||
F: '低风险',
|
||||
C: '中风险',
|
||||
D: '中风险',
|
||||
B: '高风险',
|
||||
E: '高风险',
|
||||
}
|
||||
return levels[level] || '未知风险'
|
||||
} else if (type === 'gaming') {
|
||||
const levelNum = parseInt(level)
|
||||
if (levelNum === 0) return '无风险'
|
||||
if (levelNum > 0 && levelNum <= 20) return '极低风险'
|
||||
if (levelNum > 20 && levelNum <= 40) return '低风险'
|
||||
if (levelNum > 40 && levelNum <= 60) return '中等风险'
|
||||
if (levelNum > 60 && levelNum <= 80) return '高风险'
|
||||
if (levelNum > 80) return '极高风险'
|
||||
return '未知风险'
|
||||
}
|
||||
return '未知风险'
|
||||
}
|
||||
|
||||
// 风险等级转换为颜色
|
||||
const riskLevelColor = (level, type) => {
|
||||
if (type === 'black_gray_level') {
|
||||
if (level === '' || level === '1') return 'bg-gradient-to-r from-emerald-400 to-teal-500'
|
||||
if (level === '2') return 'bg-gradient-to-r from-amber-400 to-yellow-500'
|
||||
if (level === '3') return 'bg-gradient-to-r from-orange-400 to-amber-600'
|
||||
if (level === '4') return 'bg-gradient-to-r from-rose-400 to-red-500'
|
||||
return 'bg-gradient-to-r from-gray-400 to-gray-500'
|
||||
} else if (type === 'telefraud_level') {
|
||||
if (level === '0') return 'bg-gradient-to-r from-emerald-400 to-teal-500'
|
||||
if (level === '1' || level === '2') return 'bg-gradient-to-r from-teal-300 to-green-400'
|
||||
if (level === '3' || level === '4') return 'bg-gradient-to-r from-amber-400 to-yellow-500'
|
||||
if (level === '5') return 'bg-gradient-to-r from-orange-400 to-amber-600'
|
||||
if (level === '6') return 'bg-gradient-to-r from-rose-400 to-red-500'
|
||||
return 'bg-gradient-to-r from-gray-400 to-gray-500'
|
||||
} else if (type === 'frg_list_level') {
|
||||
if (level >= '3' && level <= '5') return 'bg-gradient-to-r from-emerald-400 to-teal-500'
|
||||
if (level >= '6' && level <= '7') return 'bg-gradient-to-r from-amber-400 to-yellow-500'
|
||||
if (level >= '8' && level <= '10') return 'bg-gradient-to-r from-rose-400 to-red-500'
|
||||
return 'bg-gradient-to-r from-gray-400 to-gray-500'
|
||||
} else if (type === 'risk_level') {
|
||||
if (level === 'A') return 'bg-gradient-to-r from-emerald-400 to-teal-500'
|
||||
if (level === 'F') return 'bg-gradient-to-r from-amber-400 to-yellow-500'
|
||||
if (level === 'C' || level === 'D') return 'bg-gradient-to-r from-orange-400 to-amber-600'
|
||||
if (level === 'B' || level === 'E') return 'bg-gradient-to-r from-rose-400 to-red-500'
|
||||
return 'bg-gradient-to-r from-gray-400 to-gray-500'
|
||||
} else if (type === 'gaming') {
|
||||
const levelNum = parseInt(level)
|
||||
if (levelNum === 0) return 'bg-gradient-to-r from-emerald-400 to-teal-500'
|
||||
if (levelNum > 0 && levelNum <= 20) return 'bg-gradient-to-r from-teal-300 to-green-400'
|
||||
if (levelNum > 20 && levelNum <= 40) return 'bg-gradient-to-r from-green-400 to-green-500'
|
||||
if (levelNum > 40 && levelNum <= 60) return 'bg-gradient-to-r from-amber-400 to-yellow-500'
|
||||
if (levelNum > 60 && levelNum <= 80) return 'bg-gradient-to-r from-orange-400 to-amber-600'
|
||||
if (levelNum > 80) return 'bg-gradient-to-r from-rose-400 to-red-500'
|
||||
return 'bg-gradient-to-r from-gray-400 to-gray-500'
|
||||
}
|
||||
return 'bg-gradient-to-r from-gray-400 to-gray-500'
|
||||
}
|
||||
|
||||
// 根据风险类型获取名称
|
||||
const getRiskTypeName = type => {
|
||||
const types = {
|
||||
110: '疑似欺诈',
|
||||
130: '疑似赌博庄家',
|
||||
150: '疑似赌博玩家',
|
||||
170: '疑似涉赌跑分',
|
||||
}
|
||||
return types[type] || '未知类型'
|
||||
}
|
||||
|
||||
// 获取团伙规模描述
|
||||
const getGroupSizeDesc = code => {
|
||||
const sizes = {
|
||||
a: '小规模(少于50人)',
|
||||
b: '中等规模(50-100人)',
|
||||
c: '大规模(100-500人)',
|
||||
d: '超大规模(500人以上)',
|
||||
}
|
||||
return sizes[code] || '未知规模'
|
||||
}
|
||||
|
||||
// 获取风险图标
|
||||
const getRiskIcon = type => {
|
||||
switch (type) {
|
||||
case '110':
|
||||
return 'fa-exclamation-triangle'
|
||||
case '130':
|
||||
return 'fa-dice'
|
||||
case '150':
|
||||
return 'fa-gamepad'
|
||||
case '170':
|
||||
return 'fa-money-bill-wave'
|
||||
default:
|
||||
return 'fa-question-circle'
|
||||
}
|
||||
}
|
||||
|
||||
// 获取不良记录详情
|
||||
const getRiskLevelDetail = level => {
|
||||
switch (level) {
|
||||
case 'A':
|
||||
return '无任何不良记录'
|
||||
case 'F':
|
||||
return '涉稳、寻衅滋事'
|
||||
case 'C':
|
||||
case 'D':
|
||||
return '吸毒、涉毒、犯罪前科'
|
||||
case 'B':
|
||||
case 'E':
|
||||
return '涉案人员、在逃、犯罪嫌疑人'
|
||||
default:
|
||||
return '未知记录'
|
||||
}
|
||||
}
|
||||
|
||||
// 风险评估总结
|
||||
const getRiskSummary = () => {
|
||||
if (!props.data) return { text: '无法评估风险', level: 'low', color: 'text-gray-500' }
|
||||
|
||||
let highRiskCount = 0
|
||||
let mediumRiskCount = 0
|
||||
|
||||
// 检查黑灰产等级
|
||||
if (props.data.black_gray_level && parseInt(props.data.black_gray_level) > 2) {
|
||||
highRiskCount++
|
||||
} else if (props.data.black_gray_level && parseInt(props.data.black_gray_level) === 2) {
|
||||
mediumRiskCount++
|
||||
}
|
||||
|
||||
// 检查电诈风险
|
||||
if (props.data.telefraud_level && parseInt(props.data.telefraud_level) > 4) {
|
||||
highRiskCount++
|
||||
} else if (props.data.telefraud_level && parseInt(props.data.telefraud_level) > 2) {
|
||||
mediumRiskCount++
|
||||
}
|
||||
|
||||
// 检查团伙欺诈
|
||||
if (
|
||||
props.data.fraud_group &&
|
||||
props.data.fraud_group.frg_list_level &&
|
||||
parseInt(props.data.fraud_group.frg_list_level) > 7
|
||||
) {
|
||||
highRiskCount++
|
||||
} else if (
|
||||
props.data.fraud_group &&
|
||||
props.data.fraud_group.frg_list_level &&
|
||||
parseInt(props.data.fraud_group.frg_list_level) > 5
|
||||
) {
|
||||
mediumRiskCount++
|
||||
}
|
||||
|
||||
// 检查风险等级
|
||||
if (props.data.risk_level && props.data.risk_level.risk_level) {
|
||||
if (['B', 'E'].includes(props.data.risk_level.risk_level)) {
|
||||
highRiskCount++
|
||||
} else if (['C', 'D'].includes(props.data.risk_level.risk_level)) {
|
||||
mediumRiskCount++
|
||||
} else if (props.data.risk_level.risk_level === 'F') {
|
||||
// 低风险,不增加计数
|
||||
}
|
||||
}
|
||||
|
||||
// 检查反诈反赌核验
|
||||
if (props.data.anti_fraud_gaming) {
|
||||
props.data.anti_fraud_gaming.forEach(item => {
|
||||
const levelNum = parseInt(item.riskLevel)
|
||||
if (levelNum > 60) {
|
||||
highRiskCount++
|
||||
} else if (levelNum > 40) {
|
||||
mediumRiskCount++
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (highRiskCount > 0) {
|
||||
return {
|
||||
text: '该用户存在较高风险行为,建议进行进一步核实和监控',
|
||||
level: 'high',
|
||||
color: 'text-red-500',
|
||||
}
|
||||
} else if (mediumRiskCount > 0) {
|
||||
return {
|
||||
text: '该用户存在一定风险行为,建议提高警惕',
|
||||
level: 'medium',
|
||||
color: 'text-yellow-500',
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
text: '该用户行为正常,风险较低',
|
||||
level: 'low',
|
||||
color: 'text-green-500',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const summary = getRiskSummary()
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
// 计算总风险项数量
|
||||
const totalRiskCount = Object.values(summary).reduce((sum, item) => sum + item.count, 0);
|
||||
|
||||
// 根据风险项数量计算评分
|
||||
// 0项:100分(最安全)
|
||||
// 1-2项:80分(较安全)
|
||||
// 3-5项:60分(中等风险)
|
||||
// 6-10项:40分(较高风险)
|
||||
// 10项以上:20分(高风险)
|
||||
if (totalRiskCount === 0) return 100;
|
||||
if (totalRiskCount <= 2) return 80;
|
||||
if (totalRiskCount <= 5) return 60;
|
||||
if (totalRiskCount <= 10) return 40;
|
||||
return 20;
|
||||
});
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore);
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card main-card">
|
||||
<div v-if="!data || Object.keys(data).length === 0" class="py-4 text-center text-gray-500">
|
||||
暂无风险行为扫描数据
|
||||
</div>
|
||||
<div v-else class="risk-content">
|
||||
<!-- 风险总结 -->
|
||||
<div class="summary-card" :class="{
|
||||
'border-red-500 glow-red': summary.level === 'high',
|
||||
'border-yellow-500 glow-yellow': summary.level === 'medium',
|
||||
'border-green-500 glow-green': summary.level === 'low',
|
||||
}">
|
||||
<div class="flex items-center">
|
||||
<div class="summary-icon" :class="summary.color">
|
||||
<i class="fas" :class="summary.level === 'high'
|
||||
? 'fa-exclamation-triangle'
|
||||
: summary.level === 'medium'
|
||||
? 'fa-exclamation-circle'
|
||||
: 'fa-check-circle'
|
||||
"></i>
|
||||
</div>
|
||||
<div class="font-bold text-lg" :class="summary.color">风险评估总结</div>
|
||||
</div>
|
||||
<div class="mt-1 text-gray-700">{{ summary.text }}</div>
|
||||
</div>
|
||||
|
||||
<div class="grid-container">
|
||||
<!-- 左侧列 -->
|
||||
<div class="grid-left">
|
||||
<!-- 黑灰产等级 -->
|
||||
<!-- <div class="risk-section hover-lift">
|
||||
<div class="section-title flex items-center">
|
||||
<div class="title-icon bg-indigo-100 text-indigo-600">
|
||||
<i class="fas fa-user-secret"></i>
|
||||
</div>
|
||||
<span>黑灰产等级</span>
|
||||
</div>
|
||||
<div class="section-content">
|
||||
<div class="risk-level-indicator">
|
||||
<div class="indicator-label">风险等级</div>
|
||||
<div class="indicator-bar">
|
||||
<div class="indicator-value" :class="riskLevelColor(data.black_gray_level || '', 'black_gray_level')"
|
||||
:style="{
|
||||
width: data.black_gray_level ? `${Math.min(parseInt(data.black_gray_level) * 25, 100)}%` : '0%',
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="indicator-text" :class="{
|
||||
'text-green-500': (data.black_gray_level || '') === '' || (data.black_gray_level || '') === '1',
|
||||
'text-yellow-500': (data.black_gray_level || '') === '2',
|
||||
'text-orange-500': (data.black_gray_level || '') === '3',
|
||||
'text-red-500': (data.black_gray_level || '') === '4',
|
||||
}">
|
||||
{{ riskLevelText(data.black_gray_level || '', 'black_gray_level') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="description">黑灰产等级评估用户是否参与非法活动,等级越高风险越大</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- 电诈风险预警 -->
|
||||
<!-- <div class="risk-section hover-lift">
|
||||
<div class="section-title flex items-center">
|
||||
<div class="title-icon bg-red-100 text-red-600">
|
||||
<i class="fas fa-phone-slash"></i>
|
||||
</div>
|
||||
<span>电诈风险预警</span>
|
||||
</div>
|
||||
<div class="section-content">
|
||||
<div class="risk-level-indicator">
|
||||
<div class="indicator-label">风险等级</div>
|
||||
<div class="indicator-bar">
|
||||
<div class="indicator-value" :class="riskLevelColor(data.telefraud_level || '0', 'telefraud_level')"
|
||||
:style="{ width: `${Math.min(parseInt(data.telefraud_level || '0') * 16.6, 100)}%` }"></div>
|
||||
</div>
|
||||
<div class="indicator-text" :class="{
|
||||
'text-green-500':
|
||||
(data.telefraud_level || '0') === '0' ||
|
||||
(data.telefraud_level || '0') === '1' ||
|
||||
(data.telefraud_level || '0') === '2',
|
||||
'text-yellow-500': (data.telefraud_level || '0') === '3' || (data.telefraud_level || '0') === '4',
|
||||
'text-orange-500': (data.telefraud_level || '0') === '5',
|
||||
'text-red-500': (data.telefraud_level || '0') === '6',
|
||||
}">
|
||||
{{ riskLevelText(data.telefraud_level || '0', 'telefraud_level') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="description">电诈风险预警评估用户是否涉及电信诈骗活动,值越大风险越高</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- 综合风险等级 -->
|
||||
<!-- <div class="risk-section hover-lift">
|
||||
<div class="section-title flex items-center">
|
||||
<div class="title-icon bg-emerald-100 text-emerald-600">
|
||||
<i class="fas fa-shield-alt"></i>
|
||||
</div>
|
||||
<span>不良个人核查</span>
|
||||
</div>
|
||||
<div class="section-content">
|
||||
<div v-if="data.risk_level" class="flex items-center justify-center py-3">
|
||||
<div
|
||||
class="risk-level-badge"
|
||||
:class="{
|
||||
'bg-green-100 text-green-700 badge-pulse-green': data.risk_level.risk_level === 'A',
|
||||
'bg-yellow-100 text-yellow-700 badge-pulse-yellow': data.risk_level.risk_level === 'F',
|
||||
'bg-orange-100 text-orange-700 badge-pulse-orange': ['C', 'D'].includes(data.risk_level.risk_level),
|
||||
'bg-red-100 text-red-700 badge-pulse-red': ['B', 'E'].includes(data.risk_level.risk_level),
|
||||
}"
|
||||
>
|
||||
<span class="text-xl font-bold">{{
|
||||
riskLevelText(data.risk_level.risk_level || 'A', 'risk_level')
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="ml-4 text-sm">
|
||||
<div class="font-medium">详情:</div>
|
||||
<div
|
||||
class="mt-1"
|
||||
:class="{
|
||||
'text-green-600': data.risk_level.risk_level === 'A',
|
||||
'text-yellow-600': data.risk_level.risk_level === 'F',
|
||||
'text-orange-600': ['C', 'D'].includes(data.risk_level.risk_level),
|
||||
'text-red-600': ['B', 'E'].includes(data.risk_level.risk_level),
|
||||
}"
|
||||
>
|
||||
{{ getRiskLevelDetail(data.risk_level.risk_level || 'A') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="text-center py-2 text-gray-500">暂无不良个人核查数据</div>
|
||||
<div class="description">不良个人核查评估用户的风险状况,从无风险到高风险分级</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
|
||||
<div class="grid-right">
|
||||
<!-- <div class="risk-section hover-lift">
|
||||
<div class="section-title flex items-center">
|
||||
<div class="title-icon bg-amber-100 text-amber-600">
|
||||
<i class="fas fa-users-slash"></i>
|
||||
</div>
|
||||
<span>团伙欺诈排查</span>
|
||||
</div>
|
||||
<div class="section-content">
|
||||
<div v-if="data.fraud_group" class="flex flex-col md:flex-row gap-3">
|
||||
<div class="risk-level-indicator flex-1">
|
||||
<div class="indicator-label">团伙风险等级</div>
|
||||
<div class="indicator-bar">
|
||||
<div class="indicator-value"
|
||||
:class="riskLevelColor(data.fraud_group.frg_list_level || '3', 'frg_list_level')" :style="{
|
||||
width: `${Math.min((parseInt(data.fraud_group.frg_list_level || '3') - 2) * 12.5, 100)}%`,
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="indicator-text" :class="{
|
||||
'text-green-500': parseInt(data.fraud_group.frg_list_level || '3') <= 5,
|
||||
'text-yellow-500':
|
||||
parseInt(data.fraud_group.frg_list_level || '3') >= 6 &&
|
||||
parseInt(data.fraud_group.frg_list_level || '3') <= 7,
|
||||
'text-red-500': parseInt(data.fraud_group.frg_list_level || '3') >= 8,
|
||||
}">
|
||||
{{ riskLevelText(data.fraud_group.frg_list_level || '3', 'frg_list_level') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group-size flex-1">
|
||||
<div class="font-medium text-gray-700">团伙规模</div>
|
||||
<div class="mt-2 flex items-center">
|
||||
<i class="fas fa-users text-blue-500 mr-2 text-xl"></i>
|
||||
<span>{{ getGroupSizeDesc(data.fraud_group.frg_group_num || 'a') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="text-center py-2 text-gray-500">暂无团伙欺诈数据</div>
|
||||
<div class="description mt-1">团伙欺诈排查评估用户是否属于欺诈团伙及团伙规模大小</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="risk-section hover-lift">
|
||||
<div class="section-title flex items-center">
|
||||
<div class="title-icon bg-purple-100 text-purple-600">
|
||||
<i class="fas fa-dice-slash"></i>
|
||||
</div>
|
||||
<span>反诈反赌核验</span>
|
||||
</div>
|
||||
<div class="section-content">
|
||||
<div v-if="data.anti_fraud_gaming && data.anti_fraud_gaming.length > 0" class="grid grid-cols-1 gap-3">
|
||||
<div v-for="(item, index) in data.anti_fraud_gaming" :key="index" class="gaming-item" :class="parseInt(item.riskLevel) === 0
|
||||
? 'border-green-500'
|
||||
: parseInt(item.riskLevel) < 4
|
||||
? 'border-green-400'
|
||||
: parseInt(item.riskLevel) < 7
|
||||
? 'border-yellow-500'
|
||||
: 'border-red-500'
|
||||
">
|
||||
<div class="gaming-icon" :class="parseInt(item.riskLevel) === 0
|
||||
? 'bg-green-100 text-green-500'
|
||||
: parseInt(item.riskLevel) < 4
|
||||
? 'bg-green-100 text-green-500'
|
||||
: parseInt(item.riskLevel) < 7
|
||||
? 'bg-yellow-100 text-yellow-600'
|
||||
: 'bg-red-100 text-red-500'
|
||||
">
|
||||
<i class="fas" :class="getRiskIcon(item.riskType)"></i>
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-medium text-sm">{{ getRiskTypeName(item.riskType) }}</div>
|
||||
<div class="flex items-center mt-2">
|
||||
<div class="progress-container">
|
||||
<div class="progress-bar" :class="riskLevelColor(item.riskLevel, 'gaming')"
|
||||
:style="{ width: `${Math.min(parseInt(item.riskLevel), 100)}%` }"></div>
|
||||
</div>
|
||||
<span class="risk-level-text" :class="{
|
||||
'text-green-500': parseInt(item.riskLevel) <= 20,
|
||||
'text-green-600': parseInt(item.riskLevel) > 20 && parseInt(item.riskLevel) <= 40,
|
||||
'text-yellow-500': parseInt(item.riskLevel) > 40 && parseInt(item.riskLevel) <= 60,
|
||||
'text-orange-500': parseInt(item.riskLevel) > 60 && parseInt(item.riskLevel) <= 80,
|
||||
'text-red-500': parseInt(item.riskLevel) > 80,
|
||||
}">
|
||||
{{ riskLevelText(item.riskLevel, 'gaming') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="text-center py-2 text-gray-500">暂无反诈反赌核验数据</div>
|
||||
<div class="description mt-1">反诈反赌核验评估用户是否有涉及诈骗或赌博活动的风险</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="security-tips hover-lift">
|
||||
<div class="flex items-center">
|
||||
<div class="title-icon bg-blue-100 text-blue-600 mr-2">
|
||||
<i class="fas fa-lightbulb"></i>
|
||||
</div>
|
||||
<div class="font-bold text-blue-700">安全建议</div>
|
||||
</div>
|
||||
<div class="tip-list">
|
||||
<div class="tip-item">
|
||||
<i class="fas fa-check-circle text-green-500 mr-1"></i>
|
||||
<span>定期更新密码,使用复杂且不易猜测的密码</span>
|
||||
</div>
|
||||
<div class="tip-item">
|
||||
<i class="fas fa-check-circle text-green-500 mr-1"></i>
|
||||
<span>开启双因素认证,提高账户安全性</span>
|
||||
</div>
|
||||
<div class="tip-item">
|
||||
<i class="fas fa-check-circle text-green-500 mr-1"></i>
|
||||
<span>不点击来源不明的链接或下载不明文件</span>
|
||||
</div>
|
||||
<div class="tip-item">
|
||||
<i class="fas fa-check-circle text-green-500 mr-1"></i>
|
||||
<span>不向陌生人透露个人敏感信息</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.main-card {
|
||||
@apply bg-white shadow-md rounded-xl p-4 mb-3 border border-gray-100;
|
||||
}
|
||||
|
||||
.risk-content {
|
||||
@apply space-y-4;
|
||||
}
|
||||
|
||||
.grid-container {
|
||||
@apply grid grid-cols-1 md:grid-cols-2 gap-4;
|
||||
}
|
||||
|
||||
.grid-left,
|
||||
.grid-right {
|
||||
@apply flex flex-col gap-4;
|
||||
}
|
||||
|
||||
.summary-card {
|
||||
@apply p-4 rounded-xl shadow-sm bg-gradient-to-br from-sky-50 to-indigo-100 border-l-4 transition-all duration-300;
|
||||
}
|
||||
|
||||
.glow-red {
|
||||
box-shadow: 0 4px 12px rgba(239, 68, 68, 0.15);
|
||||
border-color: rgba(239, 68, 68, 0.6);
|
||||
}
|
||||
|
||||
.glow-yellow {
|
||||
box-shadow: 0 4px 12px rgba(245, 158, 11, 0.15);
|
||||
border-color: rgba(245, 158, 11, 0.6);
|
||||
}
|
||||
|
||||
.glow-green {
|
||||
box-shadow: 0 4px 12px rgba(16, 185, 129, 0.15);
|
||||
border-color: rgba(16, 185, 129, 0.6);
|
||||
}
|
||||
|
||||
.summary-icon {
|
||||
@apply mr-2 text-xl;
|
||||
}
|
||||
|
||||
.risk-section {
|
||||
@apply bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden transition-all duration-300;
|
||||
}
|
||||
|
||||
.hover-lift:hover {
|
||||
transform: translateY(-3px);
|
||||
box-shadow:
|
||||
0 8px 16px -2px rgba(0, 0, 0, 0.1),
|
||||
0 4px 8px -2px rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
.section-title {
|
||||
@apply bg-gradient-to-r from-gray-50 to-gray-100 px-4 py-3 font-bold text-gray-700 border-b border-gray-200 flex items-center;
|
||||
}
|
||||
|
||||
.title-icon {
|
||||
@apply w-7 h-7 rounded-full flex items-center justify-center mr-3 shadow-sm;
|
||||
}
|
||||
|
||||
.section-content {
|
||||
@apply p-4;
|
||||
}
|
||||
|
||||
.risk-level-indicator {
|
||||
@apply mb-2;
|
||||
}
|
||||
|
||||
.indicator-label {
|
||||
@apply text-gray-700 font-medium mb-1 text-sm;
|
||||
}
|
||||
|
||||
.indicator-bar {
|
||||
@apply w-full bg-gray-200 rounded-full h-3 overflow-hidden shadow-inner;
|
||||
}
|
||||
|
||||
.indicator-value {
|
||||
@apply h-3 rounded-full transition-all duration-500;
|
||||
}
|
||||
|
||||
.indicator-text {
|
||||
@apply mt-1 font-medium text-sm;
|
||||
}
|
||||
|
||||
.description {
|
||||
@apply text-xs text-gray-500 mt-2 italic;
|
||||
}
|
||||
|
||||
.risk-level-badge {
|
||||
@apply flex flex-col items-center justify-center w-20 h-20 rounded-full shadow-md border transition-transform duration-300 backdrop-blur-sm;
|
||||
}
|
||||
|
||||
.badge-pulse-green {
|
||||
background: linear-gradient(135deg, rgba(16, 185, 129, 0.15), rgba(5, 150, 105, 0.3));
|
||||
border-color: rgba(5, 150, 105, 0.4);
|
||||
animation: pulse-green 3s infinite;
|
||||
}
|
||||
|
||||
.badge-pulse-yellow {
|
||||
background: linear-gradient(135deg, rgba(245, 158, 11, 0.15), rgba(217, 119, 6, 0.3));
|
||||
border-color: rgba(217, 119, 6, 0.4);
|
||||
animation: pulse-yellow 3s infinite;
|
||||
}
|
||||
|
||||
.badge-pulse-orange {
|
||||
background: linear-gradient(135deg, rgba(249, 115, 22, 0.15), rgba(234, 88, 12, 0.3));
|
||||
border-color: rgba(234, 88, 12, 0.4);
|
||||
animation: pulse-orange 3s infinite;
|
||||
}
|
||||
|
||||
.badge-pulse-red {
|
||||
background: linear-gradient(135deg, rgba(239, 68, 68, 0.15), rgba(220, 38, 38, 0.3));
|
||||
border-color: rgba(220, 38, 38, 0.4);
|
||||
animation: pulse-red 3s infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse-green {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.3);
|
||||
}
|
||||
|
||||
70% {
|
||||
box-shadow: 0 0 0 8px rgba(16, 185, 129, 0);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(16, 185, 129, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse-yellow {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(245, 158, 11, 0.3);
|
||||
}
|
||||
|
||||
70% {
|
||||
box-shadow: 0 0 0 8px rgba(245, 158, 11, 0);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(245, 158, 11, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse-orange {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(249, 115, 22, 0.3);
|
||||
}
|
||||
|
||||
70% {
|
||||
box-shadow: 0 0 0 8px rgba(249, 115, 22, 0);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(249, 115, 22, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse-red {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.3);
|
||||
}
|
||||
|
||||
70% {
|
||||
box-shadow: 0 0 0 8px rgba(239, 68, 68, 0);
|
||||
}
|
||||
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(239, 68, 68, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.group-size {
|
||||
@apply bg-gradient-to-br from-gray-50 to-gray-100 p-3 rounded-lg shadow-sm;
|
||||
}
|
||||
|
||||
.gaming-item {
|
||||
@apply flex items-center bg-white shadow-sm rounded-lg p-3 border-l-2 transition-all duration-300;
|
||||
}
|
||||
|
||||
.gaming-item:hover {
|
||||
@apply shadow-md;
|
||||
transform: scale(1.01);
|
||||
}
|
||||
|
||||
.gaming-icon {
|
||||
@apply w-9 h-9 flex items-center justify-center rounded-full mr-3 shadow-sm;
|
||||
}
|
||||
|
||||
.progress-container {
|
||||
@apply w-full bg-gray-200 rounded-full h-3 mr-3 flex-1 shadow-inner;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
@apply h-3 rounded-full transition-all duration-500;
|
||||
}
|
||||
|
||||
.risk-level-text {
|
||||
@apply text-xs whitespace-nowrap min-w-[3.5rem] text-right font-semibold;
|
||||
}
|
||||
|
||||
.security-tips {
|
||||
@apply bg-gradient-to-br from-sky-50 to-indigo-100 rounded-xl p-4 shadow-sm border border-blue-200;
|
||||
}
|
||||
|
||||
.tip-list {
|
||||
@apply mt-3 space-y-2;
|
||||
}
|
||||
|
||||
.tip-item {
|
||||
@apply flex items-start text-sm text-gray-700 bg-white p-2 rounded-lg shadow-sm border border-gray-100;
|
||||
}
|
||||
</style>
|
||||
Binary file not shown.
1007
src/ui/CFLXG3D56.vue
Normal file
1007
src/ui/CFLXG3D56.vue
Normal file
File diff suppressed because it is too large
Load Diff
666
src/ui/CFLXGDEA9.vue
Normal file
666
src/ui/CFLXGDEA9.vue
Normal file
@@ -0,0 +1,666 @@
|
||||
<template>
|
||||
<div class="personal-bad-record card">
|
||||
<!-- 空数据提示 -->
|
||||
<div v-if="!hasData" class="py-8 text-center text-gray-500">
|
||||
<div class="flex flex-col items-center">
|
||||
<div class="w-16 h-16 bg-gray-100 rounded-full flex items-center justify-center mb-3">
|
||||
<span class="text-2xl text-gray-400">📋</span>
|
||||
</div>
|
||||
<p>暂无本人不良数据</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else class="space-y-4">
|
||||
<!-- 风险总览 -->
|
||||
<div class="">
|
||||
<div class="flex items-center mb-3">
|
||||
<div class="w-12 h-12">
|
||||
<img src="@/assets/images/report/gazdryhycp.png" alt="本人不良记录" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 class="text-lg font-bold text-gray-800">风险总览</h2>
|
||||
<p class="text-sm text-[#999999]">本人不良记录风险评估</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 风险统计 -->
|
||||
<div class="bg-[#FFF0F0] border border-red-200 rounded-lg p-4" v-if="!isNormalPerson">
|
||||
<div class="grid grid-cols-3 gap-4">
|
||||
<div class="text-center">
|
||||
<div class="text-sm text-[#666666] mb-1">总风险点</div>
|
||||
<div class="text-lg font-bold text-[#E53935]">{{ hitRiskTypes.length }}条</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<div class="text-sm text-[#666666] mb-1">高风险</div>
|
||||
<div class="text-lg font-bold text-[#E53935]">{{ getHighRiskCount() }}条</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<div class="text-sm text-[#666666] mb-1">中风险</div>
|
||||
<div class="text-lg font-bold text-[#FFC107]">{{ getMiddleRiskCount() }}条</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 正常人员显示 -->
|
||||
<div class="bg-[#F0FFF0] border border-green-200 rounded-lg p-4" v-else>
|
||||
<div class="flex items-center justify-center">
|
||||
<div class="w-10 h-10 mr-4">
|
||||
<img src="@/assets/images/report/zq.png" alt="暂无风险" class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] text-center">正常人员</div>
|
||||
<div class="text-sm text-[#999999] text-center">无不良记录,属于正常人员</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 所有风险类型列表 -->
|
||||
<div class="space-y-3">
|
||||
<!-- 正常人员 -->
|
||||
<div class="rounded-lg p-4 border-2 relative" :class="getRiskItemClass('0')">
|
||||
<div
|
||||
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-sm font-bold text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeClass('0')]">
|
||||
{{ getNormalPersonBadgeText() }}
|
||||
</div>
|
||||
<div class="flex items-center pr-12">
|
||||
<div class="w-8 h-8 mr-3 flex-shrink-0 flex items-center justify-center">
|
||||
<img :src="getRiskItemIcon('0')" alt="正常人员" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-sm" :class="getRiskItemTextColor('0')">
|
||||
{{ getRiskTypeInfo('0').text }}
|
||||
</div>
|
||||
<div class="text-sm text-[#999999] mt-0.5">{{ getRiskTypeInfo('0').description }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- A类:侵犯公民人身权利,民主权利 -->
|
||||
<div class="risk-group">
|
||||
<div class="text-sm font-semibold text-gray-700 mb-2 px-2">A类:侵犯公民人身权利,民主权利</div>
|
||||
<div class="space-y-2">
|
||||
<div v-for="code in ['A', 'A1', 'A2', 'A3', 'A4', 'A5']" :key="code"
|
||||
class="rounded-lg p-4 border-2 relative" :class="getRiskItemClass(code)">
|
||||
<div
|
||||
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-sm font-bold text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeClass(code)]">
|
||||
{{ isHit(code) ? '异常' : '正常' }}
|
||||
</div>
|
||||
<div class="flex items-center pr-12">
|
||||
<div class="w-8 h-8 mr-3 flex-shrink-0 flex items-center justify-center">
|
||||
<img :src="getRiskItemIcon(code)" :alt="getRiskTypeInfo(code).text"
|
||||
class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-sm" :class="getRiskItemTextColor(code)">
|
||||
{{ getRiskTypeInfo(code).text }}
|
||||
</div>
|
||||
<div class="text-sm text-[#999999] mt-0.5">{{ getRiskTypeInfo(code).description }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- B类:经济类前科 -->
|
||||
<div class="risk-group">
|
||||
<div class="text-sm font-semibold text-gray-700 mb-2 px-2">B类:经济类前科</div>
|
||||
<div class="space-y-2">
|
||||
<div v-for="code in ['B', 'B1', 'B2', 'B3', 'B4', 'B5']" :key="code"
|
||||
class="rounded-lg p-4 border-2 relative" :class="getRiskItemClass(code)">
|
||||
<div
|
||||
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-sm font-bold text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeClass(code)]">
|
||||
{{ isHit(code) ? '异常' : '正常' }}
|
||||
</div>
|
||||
<div class="flex items-center pr-12">
|
||||
<div class="w-8 h-8 mr-3 flex-shrink-0 flex items-center justify-center">
|
||||
<img :src="getRiskItemIcon(code)" :alt="getRiskTypeInfo(code).text"
|
||||
class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-sm" :class="getRiskItemTextColor(code)">
|
||||
{{ getRiskTypeInfo(code).text }}
|
||||
</div>
|
||||
<div class="text-sm text-[#999999] mt-0.5">{{ getRiskTypeInfo(code).description }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- C类:妨害社会管理秩序 -->
|
||||
<div class="risk-group">
|
||||
<div class="text-sm font-semibold text-gray-700 mb-2 px-2">C类:妨害社会管理秩序</div>
|
||||
<div class="space-y-2">
|
||||
<div v-for="code in ['C', 'C1', 'C2', 'C3', 'C4', 'C5']" :key="code"
|
||||
class="rounded-lg p-4 border-2 relative" :class="getRiskItemClass(code)">
|
||||
<div
|
||||
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-sm font-bold text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeClass(code)]">
|
||||
{{ isHit(code) ? '异常' : '正常' }}
|
||||
</div>
|
||||
<div class="flex items-center pr-12">
|
||||
<div class="w-8 h-8 mr-3 flex-shrink-0 flex items-center justify-center">
|
||||
<img :src="getRiskItemIcon(code)" :alt="getRiskTypeInfo(code).text"
|
||||
class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-sm" :class="getRiskItemTextColor(code)">
|
||||
{{ getRiskTypeInfo(code).text }}
|
||||
</div>
|
||||
<div class="text-sm text-[#999999] mt-0.5">{{ getRiskTypeInfo(code).description }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- D类:重点 -->
|
||||
<div class="risk-group">
|
||||
<div class="text-sm font-semibold text-gray-700 mb-2 px-2">D类:重点</div>
|
||||
<div class="space-y-2">
|
||||
<div v-for="code in ['D', 'D1', 'D2', 'D3', 'D4', 'D5']" :key="code"
|
||||
class="rounded-lg p-4 border-2 relative" :class="getRiskItemClass(code)">
|
||||
<div
|
||||
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-sm font-bold text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeClass(code)]">
|
||||
{{ isHit(code) ? '异常' : '正常' }}
|
||||
</div>
|
||||
<div class="flex items-center pr-12">
|
||||
<div class="w-8 h-8 mr-3 flex-shrink-0 flex items-center justify-center">
|
||||
<img :src="getRiskItemIcon(code)" :alt="getRiskTypeInfo(code).text"
|
||||
class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-sm" :class="getRiskItemTextColor(code)">
|
||||
{{ getRiskTypeInfo(code).text }}
|
||||
</div>
|
||||
<div class="text-sm text-[#999999] mt-0.5">{{ getRiskTypeInfo(code).description }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- E类:涉交通案件 -->
|
||||
<div class="risk-group">
|
||||
<div class="text-sm font-semibold text-gray-700 mb-2 px-2">E类:涉交通案件</div>
|
||||
<div class="space-y-2">
|
||||
<div class="rounded-lg p-4 border-2 relative" :class="getRiskItemClass('E')">
|
||||
<div
|
||||
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-sm font-bold text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeClass('E')]">
|
||||
{{ isHit('E') ? '异常' : '正常' }}
|
||||
</div>
|
||||
<div class="flex items-center pr-12">
|
||||
<div class="w-8 h-8 mr-3 flex-shrink-0 flex items-center justify-center">
|
||||
<img :src="getRiskItemIcon('E')" :alt="getRiskTypeInfo('E').text"
|
||||
class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-sm" :class="getRiskItemTextColor('E')">
|
||||
{{ getRiskTypeInfo('E').text }}
|
||||
</div>
|
||||
<div class="text-sm text-[#999999] mt-0.5">{{ getRiskTypeInfo('E').description }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- F类:法院文书 -->
|
||||
<div class="risk-group">
|
||||
<div class="text-sm font-semibold text-gray-700 mb-2 px-2">F类:法院文书</div>
|
||||
<div class="space-y-2">
|
||||
<div class="rounded-lg p-4 border-2 relative" :class="getRiskItemClass('F')">
|
||||
<div
|
||||
:class="['absolute top-0 right-0 px-1.5 py-0.5 text-sm font-bold text-white rounded-bl-lg rounded-tr-lg', getRiskBadgeClass('F')]">
|
||||
{{ isHit('F') ? '异常' : '正常' }}
|
||||
</div>
|
||||
<div class="flex items-center pr-12">
|
||||
<div class="w-8 h-8 mr-3 flex-shrink-0 flex items-center justify-center">
|
||||
<img :src="getRiskItemIcon('F')" :alt="getRiskTypeInfo('F').text"
|
||||
class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-sm" :class="getRiskItemTextColor('F')">
|
||||
{{ getRiskTypeInfo('F').text }}
|
||||
</div>
|
||||
<div class="text-sm text-[#999999] mt-0.5">{{ getRiskTypeInfo('F').description }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { computed } from "vue";
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
import { useRiskNotifier } from '@/composables/useRiskNotifier'
|
||||
|
||||
// 导入风险类型图标
|
||||
import iconZfx from '@/assets/images/report/zfx.png'
|
||||
import iconGfx from '@/assets/images/report/gfx.png'
|
||||
import iconSafe from '@/assets/images/report/zq.png'
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
params: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
})
|
||||
|
||||
// 风险类型代码映射
|
||||
const riskTypeMap = {
|
||||
'0': {
|
||||
text: '正常人员',
|
||||
description: '无不良记录,属于正常人员',
|
||||
level: 'normal',
|
||||
riskLevel: '正常'
|
||||
},
|
||||
'A': {
|
||||
text: '前科:侵犯公民人身权利,民主权利',
|
||||
description: '存在侵犯公民人身权利、民主权利的前科记录(在逃,盗窃、诈骗、抢劫、故意伤害、强奸等在刑或前科等)',
|
||||
level: 'high',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'A1': {
|
||||
text: '盗窃',
|
||||
description: '存在盗窃前科记录',
|
||||
level: 'high',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'A2': {
|
||||
text: '诈骗',
|
||||
description: '存在诈骗前科记录',
|
||||
level: 'high',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'A3': {
|
||||
text: '抢劫/夺',
|
||||
description: '存在抢劫、抢夺前科记录',
|
||||
level: 'high',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'A4': {
|
||||
text: '故意伤害/杀人',
|
||||
description: '存在故意伤害、杀人前科记录',
|
||||
level: 'high',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'A5': {
|
||||
text: '强奸/性侵/猥亵',
|
||||
description: '存在强奸、性侵、猥亵前科记录',
|
||||
level: 'high',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'B': {
|
||||
text: '经济类前科',
|
||||
description: '存在破坏金融秩序、非法吸存、违发贷款、金融诈骗、集资诈骗、保险诈骗、假币等在刑或前科等',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'B1': {
|
||||
text: '走私',
|
||||
description: '存在走私前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'B2': {
|
||||
text: '破坏金融管理秩序',
|
||||
description: '存在破坏金融管理秩序前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'B3': {
|
||||
text: '金融诈骗',
|
||||
description: '存在金融诈骗前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'B4': {
|
||||
text: '洗钱',
|
||||
description: '存在洗钱前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'B5': {
|
||||
text: '偷漏税',
|
||||
description: '存在偷漏税前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'C': {
|
||||
text: '妨害社会管理秩序',
|
||||
description: '存在扰乱公共秩序、妨害司法、妨害国境管理、妨害文物管理、涉毒、涉黄等在刑或前科等',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'C1': {
|
||||
text: '扰乱公共秩序',
|
||||
description: '存在扰乱公共秩序前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'C2': {
|
||||
text: '妨害司法',
|
||||
description: '存在妨害司法前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'C3': {
|
||||
text: '涉毒',
|
||||
description: '存在涉毒前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'C4': {
|
||||
text: '涉黄刑案',
|
||||
description: '存在涉黄刑案前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'C5': {
|
||||
text: '帮信/掩隐/侵公',
|
||||
description: '存在帮助信息网络犯罪活动、掩饰隐瞒犯罪所得、侵犯公民个人信息前科记录',
|
||||
level: 'medium',
|
||||
riskLevel: '中风险'
|
||||
},
|
||||
'D': {
|
||||
text: '重点',
|
||||
description: '存在危害国家、公共安全,涉恐、疆藏,涉稳、涉黑、涉及境外等',
|
||||
level: 'critical',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'D1': {
|
||||
text: '危害国家、公共安全',
|
||||
description: '存在危害国家、公共安全前科记录',
|
||||
level: 'critical',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'D2': {
|
||||
text: '涉稳',
|
||||
description: '存在涉稳前科记录',
|
||||
level: 'critical',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'D3': {
|
||||
text: '涉及境外',
|
||||
description: '存在涉及境外前科记录',
|
||||
level: 'critical',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'D4': {
|
||||
text: '涉恐、疆藏',
|
||||
description: '存在涉恐、疆藏前科记录',
|
||||
level: 'critical',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'D5': {
|
||||
text: '涉黑',
|
||||
description: '存在涉黑前科记录',
|
||||
level: 'critical',
|
||||
riskLevel: '高风险'
|
||||
},
|
||||
'E': {
|
||||
text: '涉交通案件',
|
||||
description: '存在危险驾驶、交通肇事等交通案件前科记录',
|
||||
level: 'low',
|
||||
riskLevel: '低风险'
|
||||
},
|
||||
'F': {
|
||||
text: '法院文书',
|
||||
description: '存在法院文书记录',
|
||||
level: 'low',
|
||||
riskLevel: '低风险'
|
||||
}
|
||||
}
|
||||
|
||||
// 获取风险类型信息
|
||||
const getRiskTypeInfo = (type) => {
|
||||
return riskTypeMap[type] || riskTypeMap['F']
|
||||
}
|
||||
|
||||
// 解析命中的风险代码
|
||||
const hitRiskCodes = computed(() => {
|
||||
const levelData = props.data?.data?.level || props.data?.level
|
||||
if (!levelData) return []
|
||||
|
||||
const levelStr = levelData.toString()
|
||||
return levelStr.split(',').map(code => code.trim()).filter(code => code)
|
||||
})
|
||||
|
||||
// 判断是否命中某个风险代码
|
||||
const isHit = (code) => {
|
||||
if (code === '0') {
|
||||
// 如果level是'0',则正常人员命中
|
||||
return hitRiskCodes.value.includes('0')
|
||||
}
|
||||
|
||||
// 如果直接包含该代码,则命中
|
||||
if (hitRiskCodes.value.includes(code)) {
|
||||
return true
|
||||
}
|
||||
|
||||
// 对于父级类型(A、B、C、D),如果子类型命中,父类型也算命中
|
||||
if (code === 'A') {
|
||||
// 如果 A1、A2、A3、A4、A5 任何一个命中,A 也算命中
|
||||
return ['A1', 'A2', 'A3', 'A4', 'A5'].some(subCode => hitRiskCodes.value.includes(subCode))
|
||||
}
|
||||
if (code === 'B') {
|
||||
// 如果 B1、B2、B3、B4、B5 任何一个命中,B 也算命中
|
||||
return ['B1', 'B2', 'B3', 'B4', 'B5'].some(subCode => hitRiskCodes.value.includes(subCode))
|
||||
}
|
||||
if (code === 'C') {
|
||||
// 如果 C1、C2、C3、C4、C5 任何一个命中,C 也算命中
|
||||
return ['C1', 'C2', 'C3', 'C4', 'C5'].some(subCode => hitRiskCodes.value.includes(subCode))
|
||||
}
|
||||
if (code === 'D') {
|
||||
// 如果 D1、D2、D3、D4、D5 任何一个命中,D 也算命中
|
||||
return ['D1', 'D2', 'D3', 'D4', 'D5'].some(subCode => hitRiskCodes.value.includes(subCode))
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// 获取命中的风险类型列表
|
||||
const hitRiskTypes = computed(() => {
|
||||
return hitRiskCodes.value.filter(code => code !== '0').map(code => ({
|
||||
code,
|
||||
...getRiskTypeInfo(code)
|
||||
}))
|
||||
})
|
||||
|
||||
// 判断是否有数据
|
||||
const hasData = computed(() => {
|
||||
const levelData = props.data?.data?.level || props.data?.level
|
||||
return levelData && Object.keys(props.data || {}).length > 0
|
||||
})
|
||||
|
||||
// 判断是否为正常人员
|
||||
const isNormalPerson = computed(() => {
|
||||
return hitRiskCodes.value.includes('0') && hitRiskCodes.value.length === 1
|
||||
})
|
||||
|
||||
// 获取高风险数量
|
||||
const getHighRiskCount = () => {
|
||||
return hitRiskTypes.value.filter(risk =>
|
||||
risk.level === 'high' || risk.level === 'critical'
|
||||
).length
|
||||
}
|
||||
|
||||
// 获取中风险数量
|
||||
const getMiddleRiskCount = () => {
|
||||
return hitRiskTypes.value.filter(risk => risk.level === 'medium').length
|
||||
}
|
||||
|
||||
// 获取风险项样式类
|
||||
const getRiskItemClass = (code) => {
|
||||
const hit = isHit(code)
|
||||
const riskInfo = getRiskTypeInfo(code)
|
||||
|
||||
if (code === '0') {
|
||||
// 正常人员:如果是正常人员显示绿色,否则显示红色(存在异常)
|
||||
return isNormalPerson.value ? 'bg-green-50 border-green-200' : 'bg-red-50 border-red-200'
|
||||
}
|
||||
|
||||
if (hit) {
|
||||
if (riskInfo.level === 'critical' || riskInfo.level === 'high') {
|
||||
return 'bg-red-50 border-red-200'
|
||||
} else if (riskInfo.level === 'medium') {
|
||||
return 'bg-orange-50 border-orange-200'
|
||||
} else {
|
||||
return 'bg-yellow-50 border-yellow-200'
|
||||
}
|
||||
}
|
||||
|
||||
return 'bg-gray-50 border-gray-200'
|
||||
}
|
||||
|
||||
// 获取风险项文本颜色
|
||||
const getRiskItemTextColor = (code) => {
|
||||
const hit = isHit(code)
|
||||
const riskInfo = getRiskTypeInfo(code)
|
||||
|
||||
if (code === '0') {
|
||||
// 正常人员:如果是正常人员显示绿色,否则显示红色(存在异常)
|
||||
return isNormalPerson.value ? 'text-green-600' : 'text-red-600'
|
||||
}
|
||||
|
||||
if (hit) {
|
||||
if (riskInfo.level === 'critical' || riskInfo.level === 'high') {
|
||||
return 'text-red-600'
|
||||
} else if (riskInfo.level === 'medium') {
|
||||
return 'text-orange-600'
|
||||
} else {
|
||||
return 'text-yellow-600'
|
||||
}
|
||||
}
|
||||
|
||||
return 'text-gray-600'
|
||||
}
|
||||
|
||||
// 获取风险项图标
|
||||
const getRiskItemIcon = (code) => {
|
||||
const hit = isHit(code)
|
||||
const riskInfo = getRiskTypeInfo(code)
|
||||
|
||||
if (code === '0') {
|
||||
// 正常人员:如果是正常人员显示安全图标,否则显示风险图标(存在异常)
|
||||
return isNormalPerson.value ? iconSafe : iconGfx
|
||||
}
|
||||
|
||||
if (hit) {
|
||||
if (riskInfo.level === 'critical' || riskInfo.level === 'high') {
|
||||
return iconGfx
|
||||
} else {
|
||||
return iconZfx
|
||||
}
|
||||
}
|
||||
|
||||
return iconSafe
|
||||
}
|
||||
|
||||
// 获取正常人员标签文本
|
||||
const getNormalPersonBadgeText = () => {
|
||||
// 只有当 level 只有 '0' 时才显示"正常人员"
|
||||
if (isNormalPerson.value) {
|
||||
return '正常'
|
||||
}
|
||||
// 否则显示"存在异常"
|
||||
return '存在异常'
|
||||
}
|
||||
|
||||
// 获取风险标签样式类
|
||||
const getRiskBadgeClass = (code) => {
|
||||
const hit = isHit(code)
|
||||
const riskInfo = getRiskTypeInfo(code)
|
||||
|
||||
if (code === '0') {
|
||||
// 正常人员:如果是正常人员显示绿色,否则显示红色(存在异常)
|
||||
return isNormalPerson.value ? 'bg-green-500' : 'bg-[#E53935]'
|
||||
}
|
||||
|
||||
if (hit) {
|
||||
if (riskInfo.level === 'critical' || riskInfo.level === 'high') {
|
||||
return 'bg-[#E53935]'
|
||||
} else if (riskInfo.level === 'medium') {
|
||||
return 'bg-[#D6943E]'
|
||||
} else {
|
||||
return 'bg-yellow-500'
|
||||
}
|
||||
}
|
||||
|
||||
// 未命中显示绿色(正常)
|
||||
return 'bg-green-500'
|
||||
}
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
if (isNormalPerson.value) {
|
||||
return 100 // 正常人员,最安全
|
||||
}
|
||||
|
||||
if (hitRiskTypes.value.length === 0) {
|
||||
return 100 // 无风险数据,最安全
|
||||
}
|
||||
|
||||
// 获取高风险和中风险数量
|
||||
const highRiskCount = getHighRiskCount()
|
||||
const middleRiskCount = getMiddleRiskCount()
|
||||
|
||||
// 高风险数量越多,分数越低
|
||||
let score = 100
|
||||
|
||||
// 高风险扣分(每个高风险扣15分)
|
||||
score -= highRiskCount * 15
|
||||
|
||||
// 中风险扣分(每个中风险扣8分)
|
||||
score -= middleRiskCount * 8
|
||||
|
||||
// 确保分数在合理范围内(最低20分)
|
||||
return Math.max(20, Math.min(100, score))
|
||||
})
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore)
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.personal-bad-record {
|
||||
@apply space-y-4;
|
||||
}
|
||||
|
||||
.risk-group {
|
||||
@apply mb-4;
|
||||
}
|
||||
</style>
|
||||
120
src/ui/CIVYZ5733.vue
Normal file
120
src/ui/CIVYZ5733.vue
Normal file
@@ -0,0 +1,120 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
import { computed, watch } from "vue";
|
||||
import { useRiskNotifier } from "@/composables/useRiskNotifier";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
});
|
||||
const { data } = props;
|
||||
|
||||
// 状态映射,包括显示的文字和样式
|
||||
const statusMap = {
|
||||
0: {
|
||||
text: "未婚或尚未登记结婚",
|
||||
bgClass: "bg-yellow-100",
|
||||
textClass: "text-yellow-700",
|
||||
description: "未进行民政登记婚姻",
|
||||
},
|
||||
1: {
|
||||
text: "已婚",
|
||||
bgClass: "bg-green-100",
|
||||
textClass: "text-green-700",
|
||||
description: "已登记婚姻,家庭幸福美满",
|
||||
},
|
||||
2: {
|
||||
text: "离异",
|
||||
bgClass: "bg-red-100",
|
||||
textClass: "text-red-700",
|
||||
description: "离异状态,未来生活可期",
|
||||
},
|
||||
3: {
|
||||
text: "离婚冷静期",
|
||||
bgClass: "bg-blue-100",
|
||||
textClass: "text-blue-700",
|
||||
description: "目前处于离婚冷静期,请谨慎决策",
|
||||
},
|
||||
};
|
||||
|
||||
// 根据 `data.status` 确定当前状态,默认值为 "无相关记录"
|
||||
const currentStatus =
|
||||
data && data.status !== undefined
|
||||
? statusMap[data.status] || statusMap["0"]
|
||||
: {
|
||||
text: "无相关记录",
|
||||
bgClass: "bg-gray-200",
|
||||
textClass: "text-gray-500",
|
||||
description: "暂无婚姻相关记录",
|
||||
};
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
// 未婚(0)或已婚(1):100分(最安全)
|
||||
// 离异(2):30分(有风险)
|
||||
// 离婚冷静期(3):20分(高风险)
|
||||
if (data?.status === 0 || data?.status === 1) return 100;
|
||||
if (data?.status === 2) return 30;
|
||||
if (data?.status === 3) return 20;
|
||||
return 100; // 默认最安全
|
||||
});
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore);
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="status-info flex flex-col items-center">
|
||||
<div
|
||||
:class="`status-label rounded-full px-6 py-3 text-center font-bold shadow-md ${currentStatus.bgClass} ${currentStatus.textClass}`">
|
||||
{{ currentStatus.text }}
|
||||
</div>
|
||||
<p class="status-description mt-3 text-sm text-gray-600">
|
||||
{{ currentStatus.description }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.status-info {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.status-label {
|
||||
font-size: 1.25rem;
|
||||
padding: 0.75rem 1.5rem;
|
||||
border-radius: 9999px;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.status-description {
|
||||
color: #4a5568;
|
||||
margin-top: 0.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.additional-info p {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
</style>
|
||||
108
src/ui/CIVYZ81NC.vue
Normal file
108
src/ui/CIVYZ81NC.vue
Normal file
@@ -0,0 +1,108 @@
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: false,
|
||||
default: () => null,
|
||||
},
|
||||
});
|
||||
console.log("data", props.data);
|
||||
// 获取实际的数据对象
|
||||
const actualData = props.data?.data;
|
||||
|
||||
// 日期格式化函数,将 2009-04-16 转换为 2009年04月16日
|
||||
const formatDate = (dateStr) => {
|
||||
if (!dateStr) return "";
|
||||
const [year, month, day] = dateStr.split("-");
|
||||
return `${year}年${month}月${day}日`;
|
||||
};
|
||||
|
||||
// 状态映射,根据 op_type 判断
|
||||
const statusMap = {
|
||||
IA: {
|
||||
text: "已婚",
|
||||
bgClass: "bg-green-100",
|
||||
textClass: "text-green-700",
|
||||
description: "已登记婚姻,家庭幸福美满",
|
||||
},
|
||||
IB: {
|
||||
text: "离异",
|
||||
bgClass: "bg-red-100",
|
||||
textClass: "text-red-700",
|
||||
description: "离异状态,未来生活可期",
|
||||
},
|
||||
INR: {
|
||||
text: "未登记",
|
||||
bgClass: "bg-yellow-100",
|
||||
textClass: "text-yellow-700",
|
||||
description: "未进行民政登记婚姻",
|
||||
},
|
||||
};
|
||||
|
||||
// 无记录时的状态
|
||||
const noRecordStatus = {
|
||||
text: "无相关记录",
|
||||
bgClass: "bg-gray-200",
|
||||
textClass: "text-gray-500",
|
||||
description: "暂无婚姻相关记录",
|
||||
opDate: null,
|
||||
};
|
||||
|
||||
// 根据 op_type 确定当前状态,默认值为 "无相关记录"
|
||||
const currentStatus = !actualData
|
||||
? noRecordStatus
|
||||
: actualData.op_type
|
||||
? { ...statusMap[actualData.op_type], opDate: formatDate(actualData.op_date) }
|
||||
: noRecordStatus;
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="status-info flex flex-col items-center">
|
||||
<div
|
||||
:class="`status-label rounded-full px-6 py-3 text-center font-bold shadow-md ${currentStatus.bgClass} ${currentStatus.textClass}`">
|
||||
{{ currentStatus.text }}
|
||||
</div>
|
||||
|
||||
<p v-html="currentStatus.description" class="status-description mt-3 text-sm text-gray-600"></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<!-- <div v-if="currentStatus.opDate" class="op-date-container mt-4 px-4 py-2 bg-blue-50 rounded-lg border border-blue-200">
|
||||
<p class="op-date text-sm font-medium text-blue-700">
|
||||
登记日期:{{ currentStatus.opDate }}
|
||||
</p>
|
||||
</div> -->
|
||||
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.status-info {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.status-label {
|
||||
font-size: 1.25rem;
|
||||
padding: 0.75rem 1.5rem;
|
||||
border-radius: 9999px;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.status-description {
|
||||
color: #4a5568;
|
||||
margin-top: 0.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.additional-info p {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.op-date-container {
|
||||
box-shadow: 0 2px 4px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
.op-date-container:hover {
|
||||
box-shadow: 0 4px 8px rgba(59, 130, 246, 0.15);
|
||||
}
|
||||
</style>
|
||||
818
src/ui/CIVYZ9A2B.vue
Normal file
818
src/ui/CIVYZ9A2B.vue
Normal file
@@ -0,0 +1,818 @@
|
||||
<script setup>
|
||||
import { computed, watch } from 'vue';
|
||||
import { useRiskNotifier } from '@/composables/useRiskNotifier';
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
});
|
||||
onMounted(() => {
|
||||
console.log("data", props.data);
|
||||
});
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
// 学历信息不算风险,始终返回100分(最安全)
|
||||
return 100;
|
||||
});
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore);
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
});
|
||||
// 格式化日期,从YYMM格式转换为YYYY年MM月格式
|
||||
const formatDate = (dateStr) => {
|
||||
if (!dateStr || dateStr.length !== 4) return "未知";
|
||||
|
||||
const yearShort = dateStr.substring(0, 2);
|
||||
const month = dateStr.substring(2, 4);
|
||||
|
||||
// 假设都是21世纪的年份
|
||||
const fullYear = `20${yearShort}`;
|
||||
|
||||
return `${fullYear}年${month}月`;
|
||||
};
|
||||
|
||||
// 获取学历等级对应的描述
|
||||
const getEducationDesc = (education) => {
|
||||
const descriptions = {
|
||||
大学专科:
|
||||
"专科学历是高等教育的重要组成部分,培养具有专业知识和技能的应用型人才。",
|
||||
大学本科:
|
||||
"本科学历是高等教育的基础学位,培养具有系统专业知识和基本技能的高级人才。",
|
||||
硕士研究生:
|
||||
"硕士学位是较高层次的学位,培养具有较深厚理论基础和专业技能的高级专门人才。",
|
||||
博士研究生:
|
||||
"博士学位是最高学位,培养能够独立从事科学研究工作、具有创新能力的高级专门人才。",
|
||||
博士后: "博士后是在获得博士学位后进行的进一步研究和深造,是学术界的高级研究人员。",
|
||||
};
|
||||
return descriptions[education] || "";
|
||||
};
|
||||
|
||||
// 根据学校类型获取不同的样式类
|
||||
const getSchoolTypeClass = (type) => {
|
||||
const classes = {
|
||||
"985学校": "border-amber-500 bg-amber-50",
|
||||
"211学校": "border-blue-500 bg-blue-50",
|
||||
双一流学校: "border-green-500 bg-green-50",
|
||||
其他: "border-gray-300 bg-gray-50",
|
||||
};
|
||||
return classes[type] || "border-gray-300 bg-gray-50";
|
||||
};
|
||||
|
||||
// 根据学历等级获取时间线点的样式类
|
||||
const getTimelinePointClass = (education) => {
|
||||
const classes = {
|
||||
大学专科: "bg-gray-500",
|
||||
大学本科: "bg-blue-500",
|
||||
硕士研究生: "bg-green-500",
|
||||
博士研究生: "bg-amber-500",
|
||||
博士后: "bg-amber-500",
|
||||
};
|
||||
return classes[education] || "bg-blue-500";
|
||||
};
|
||||
|
||||
// 获取学校类型对应的标语
|
||||
const getSchoolSlogan = (type) => {
|
||||
if (type === "985学校") return "国家重点建设的高水平大学";
|
||||
if (type === "211学校") return "面向21世纪重点建设的高等学校";
|
||||
if (type === "双一流学校") return "世界一流大学和一流学科建设高校";
|
||||
return "";
|
||||
};
|
||||
|
||||
// 获取学历等级
|
||||
const getEducationLevel = (education) => {
|
||||
const levels = {
|
||||
大学专科: 1,
|
||||
大学本科: 2,
|
||||
硕士研究生: 3,
|
||||
博士研究生: 4,
|
||||
博士后: 5,
|
||||
};
|
||||
return levels[education] || 0;
|
||||
};
|
||||
|
||||
// 获取学历图标SVG(根据学历类型返回不同的图标)
|
||||
const getEducationSvgIcon = (education) => {
|
||||
// 默认图标 - 毕业帽
|
||||
let svgIcon = `<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 14l9-5-9-5-9 5 9 5z"></path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 14l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14z"></path>
|
||||
</svg>`;
|
||||
|
||||
if (education === "大学本科") {
|
||||
// 本科 - 文凭
|
||||
svgIcon = `<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path>
|
||||
</svg>`;
|
||||
} else if (education === "硕士研究生") {
|
||||
// 硕士 - 书和毕业帽
|
||||
svgIcon = `<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"></path>
|
||||
</svg>`;
|
||||
} else if (education === "博士研究生" || education === "博士后") {
|
||||
// 博士/博士后 - 灯泡(创新)
|
||||
svgIcon = `<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>
|
||||
</svg>`;
|
||||
}
|
||||
|
||||
return svgIcon;
|
||||
};
|
||||
|
||||
// 计算排序后的学历数据
|
||||
const sortedEducations = computed(() => {
|
||||
const educationList = props.data?.data || [];
|
||||
|
||||
if (educationList.length <= 1) return educationList;
|
||||
|
||||
// 按照入学日期从早到晚排序
|
||||
return [...educationList].sort((a, b) => {
|
||||
// 假设ksrq是MMDD格式,转为数字比较
|
||||
const dateA = parseInt(a.ksrq || "0000");
|
||||
const dateB = parseInt(b.ksrq || "0000");
|
||||
return dateA - dateB;
|
||||
});
|
||||
});
|
||||
|
||||
// 判断是否有学历数据
|
||||
const hasEducationData = computed(() => {
|
||||
return props.data?.status === 1 && sortedEducations.value.length > 0;
|
||||
});
|
||||
|
||||
// 判断是否有多个学历
|
||||
const hasMultipleEducations = computed(() => {
|
||||
return sortedEducations.value.length > 1;
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="w-full max-w-md mx-auto bg-white rounded-xl overflow-hidden font-sans shadow-md">
|
||||
<div v-if="hasEducationData" class="p-6 pl-2">
|
||||
<!-- 学历时间线 -->
|
||||
<div class="relative pb-4">
|
||||
<!-- 垂直时间线 -->
|
||||
<div v-if="hasMultipleEducations"
|
||||
class="absolute left-0 top-14 h-[calc(100%-44px)] w-0.5 bg-gradient-to-b from-blue-400 to-blue-200 rounded-full ml-5">
|
||||
</div>
|
||||
|
||||
<!-- 学历卡片列表 -->
|
||||
<div class="space-y-10 relative">
|
||||
<div v-for="(education, index) in sortedEducations" :key="index" class="relative">
|
||||
<!-- 时间线点 -->
|
||||
<div v-if="hasMultipleEducations" :class="[
|
||||
'absolute left-5 w-10 h-10 rounded-full border-4 border-white shadow-md flex items-center justify-center text-white transform -translate-x-1/2',
|
||||
getTimelinePointClass(education.xl),
|
||||
]">
|
||||
<span class="text-sm font-bold">{{
|
||||
index + 1
|
||||
}}</span>
|
||||
</div>
|
||||
|
||||
<!-- 学历卡片 -->
|
||||
<div :class="[
|
||||
'relative rounded-lg transition-all duration-300 ml-12',
|
||||
'p-6 hover:-translate-y-1 hover:shadow-lg',
|
||||
getSchoolTypeClass(education.xxlx),
|
||||
]">
|
||||
<!-- 顶部彩色条 -->
|
||||
<div :class="[
|
||||
'absolute top-0 left-0 w-full h-1.5 rounded-t-lg',
|
||||
education.xxlx === '985学校'
|
||||
? 'bg-gradient-to-r from-amber-500 to-amber-300'
|
||||
: education.xxlx === '211学校'
|
||||
? 'bg-gradient-to-r from-blue-500 to-blue-300'
|
||||
: education.xxlx === '双一流学校'
|
||||
? 'bg-gradient-to-r from-green-500 to-green-300'
|
||||
: 'bg-gradient-to-r from-gray-400 to-gray-300',
|
||||
]"></div>
|
||||
|
||||
<!-- 时间和学校类型标签 -->
|
||||
<div class="flex flex-col sm:flex-row sm:justify-between mb-5 pt-2">
|
||||
<!-- 学校类型标签 -->
|
||||
<div v-if="education.xxlx !== '其他'"
|
||||
class="bg-gradient-to-r from-yellow-400 to-yellow-500 text-white text-sm font-medium px-4 py-1.5 rounded-full shadow-sm inline-flex items-center mb-3 sm:mb-0 max-w-fit">
|
||||
<svg class="w-4 h-4 mr-1.5" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
d="M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
{{ education.xxlx }}
|
||||
</div>
|
||||
|
||||
<!-- 时间信息 -->
|
||||
<div class="flex items-center text-gray-600 text-sm sm:text-base mt-1 sm:mt-0">
|
||||
<svg class="w-4 h-4 text-blue-500 mr-2 flex-shrink-0" fill="none"
|
||||
stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z">
|
||||
</path>
|
||||
</svg>
|
||||
<span>{{ formatDate(education.ksrq) }} -
|
||||
{{ formatDate(education.jsrq) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 学历标题区域 -->
|
||||
<div class="flex items-start mb-6">
|
||||
<div
|
||||
class="w-14 h-14 rounded-full bg-blue-50 flex items-center justify-center mr-5 flex-shrink-0 text-blue-500">
|
||||
<span v-html="getEducationSvgIcon(education.xl)
|
||||
"></span>
|
||||
</div>
|
||||
|
||||
<div class="flex-1">
|
||||
<div class="flex justify-between items-start">
|
||||
<h3 class="text-xl font-semibold text-gray-800 mb-1">
|
||||
{{ education.xl }}
|
||||
</h3>
|
||||
|
||||
<!-- 高级学历标签 -->
|
||||
<div v-if="
|
||||
getEducationLevel(
|
||||
education.xl
|
||||
) >= 4
|
||||
"
|
||||
class="bg-red-500 text-white text-xs font-bold px-2.5 py-1 rounded-md shadow ml-2 animate-pulse">
|
||||
顶级
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p v-if="education.xxlx !== '其他'" class="text-sm text-yellow-600 italic">
|
||||
"{{ getSchoolSlogan(education.xxlx) }}"
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 分隔线 -->
|
||||
<div class="w-full h-px bg-gray-200 my-5"></div>
|
||||
|
||||
<!-- 学历详情 -->
|
||||
<div class="space-y-4 mb-6">
|
||||
<!-- 入学和毕业时间(改为两行布局) -->
|
||||
<!-- 入学时间 -->
|
||||
<div class="flex items-center text-gray-700">
|
||||
<svg class="w-5 h-5 text-green-500 mr-3 flex-shrink-0" fill="none"
|
||||
stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z">
|
||||
</path>
|
||||
</svg>
|
||||
<span class="text-gray-500 mr-3 text-sm sm:text-base">入学时间:</span>
|
||||
<span class="text-gray-700 text-sm sm:text-base font-medium">{{
|
||||
formatDate(education.ksrq) }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 毕业时间 -->
|
||||
<div class="flex items-center text-gray-700">
|
||||
<svg class="w-5 h-5 text-red-500 mr-3 flex-shrink-0" fill="none"
|
||||
stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z">
|
||||
</path>
|
||||
</svg>
|
||||
<span class="text-gray-500 mr-3 text-sm sm:text-base">毕业时间:</span>
|
||||
<span class="text-gray-700 text-sm sm:text-base font-medium">{{
|
||||
formatDate(education.jsrq) }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 专业 -->
|
||||
<div class="flex items-center text-gray-700">
|
||||
<svg class="w-5 h-5 text-blue-400 mr-3 flex-shrink-0" fill="none"
|
||||
stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253">
|
||||
</path>
|
||||
</svg>
|
||||
<span class="text-gray-500 mr-3 text-sm sm:text-base">专业:</span>
|
||||
<span class="text-gray-700 text-sm sm:text-base">{{ education.zymc }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 学习方式 -->
|
||||
<div class="flex items-center text-gray-700">
|
||||
<svg class="w-5 h-5 text-blue-400 mr-3 flex-shrink-0" fill="none"
|
||||
stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
<span class="text-gray-500 mr-3 text-sm sm:text-base">学习方式:</span>
|
||||
<span class="text-gray-700 text-sm sm:text-base">{{ education.xxxs }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 学历描述 -->
|
||||
<div class="relative overflow-hidden rounded-lg mt-5">
|
||||
<!-- 背景效果 -->
|
||||
<div class="absolute inset-0 bg-gradient-to-br from-blue-50 to-gray-50 rounded-lg">
|
||||
</div>
|
||||
|
||||
<!-- 装饰性元素 - 只在高级学历显示 -->
|
||||
<div v-if="getEducationLevel(education.xl) >= 4"
|
||||
class="absolute -right-4 -top-4 w-16 h-16 bg-yellow-100 rounded-full opacity-50">
|
||||
</div>
|
||||
<div v-if="getEducationLevel(education.xl) >= 4"
|
||||
class="absolute -left-4 -bottom-4 w-12 h-12 bg-blue-100 rounded-full opacity-50">
|
||||
</div>
|
||||
|
||||
<!-- 内容 -->
|
||||
<div class="relative z-10 p-5">
|
||||
<h4 class="font-medium text-base text-gray-700 mb-2 flex items-center">
|
||||
<span class="mr-2">{{ education.xl }}学历</span>
|
||||
<span v-if="
|
||||
getEducationLevel(
|
||||
education.xl
|
||||
) >= 4
|
||||
" class="text-xs bg-yellow-400 text-white px-2 py-0.5 rounded">高级</span>
|
||||
</h4>
|
||||
<p class="text-gray-600 text-sm leading-relaxed">
|
||||
{{ getEducationDesc(education.xl) }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 无数据状态 -->
|
||||
<div v-else class="flex flex-col items-center py-10 px-5 text-center bg-gray-50">
|
||||
<svg class="w-16 h-16 text-gray-400 mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253">
|
||||
</path>
|
||||
</svg>
|
||||
<div class="text-gray-600 text-sm max-w-md">
|
||||
暂无学历信息记录。这可能是因为:
|
||||
<ul class="text-left mt-3 pl-5">
|
||||
<li
|
||||
class="mb-2 relative before:content-['•'] before:absolute before:left-[-15px] before:text-blue-500">
|
||||
学历信息不公开
|
||||
</li>
|
||||
<li
|
||||
class="mb-2 relative before:content-['•'] before:absolute before:left-[-15px] before:text-blue-500">
|
||||
暂无高等教育学历
|
||||
</li>
|
||||
<li
|
||||
class="mb-2 relative before:content-['•'] before:absolute before:left-[-15px] before:text-blue-500">
|
||||
学历较早,暂未被教育部门数字化收录
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.education-history {
|
||||
padding: 24px;
|
||||
border-radius: 16px;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08);
|
||||
font-family: "PingFang SC", "Helvetica Neue", Arial, sans-serif;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.education-history::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
background: radial-gradient(circle at top right,
|
||||
rgba(64, 158, 255, 0.05),
|
||||
transparent 70%);
|
||||
border-radius: 0 0 0 100%;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.education-content {
|
||||
padding: 10px 0;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.decoration-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.decoration-line {
|
||||
height: 1px;
|
||||
background: linear-gradient(to right,
|
||||
transparent,
|
||||
rgba(64, 158, 255, 0.5),
|
||||
transparent);
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.decoration-icon {
|
||||
font-size: 22px;
|
||||
margin: 0 15px;
|
||||
background-color: #f0f7ff;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-shadow: 0 2px 8px rgba(64, 158, 255, 0.2);
|
||||
}
|
||||
|
||||
.decoration-bottom {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.decoration-dot {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 50%;
|
||||
background-color: #409eff;
|
||||
margin: 0 3px;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.timeline {
|
||||
position: relative;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.timeline-item {
|
||||
position: relative;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
.timeline-item:last-child {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.timeline-point {
|
||||
position: absolute;
|
||||
left: -10px;
|
||||
top: 0;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
background-color: #409eff;
|
||||
border: 4px solid #fff;
|
||||
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.3);
|
||||
z-index: 2;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.edu-associate .timeline-point {
|
||||
background-color: #909399;
|
||||
}
|
||||
|
||||
.edu-bachelor .timeline-point {
|
||||
background-color: #409eff;
|
||||
}
|
||||
|
||||
.edu-master .timeline-point {
|
||||
background-color: #67c23a;
|
||||
}
|
||||
|
||||
.edu-doctor .timeline-point,
|
||||
.edu-postdoc .timeline-point {
|
||||
background-color: #ff9900;
|
||||
}
|
||||
|
||||
.timeline-item:hover .timeline-point {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
.timeline-line {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 20px;
|
||||
height: calc(100% - 20px);
|
||||
width: 2px;
|
||||
background: linear-gradient(to bottom, #409eff, #67c23a);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.education-card {
|
||||
margin-left: 20px;
|
||||
padding: 20px;
|
||||
border-radius: 12px;
|
||||
background-color: #f5f7fa;
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border-left: none;
|
||||
}
|
||||
|
||||
.education-card::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 5px;
|
||||
background: linear-gradient(to right, #409eff, #67c23a);
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.school-985::after {
|
||||
background: linear-gradient(to right, #ff9900, #ffba56);
|
||||
}
|
||||
|
||||
.school-211::after {
|
||||
background: linear-gradient(to right, #409eff, #6ac0ff);
|
||||
}
|
||||
|
||||
.school-double-first-class::after {
|
||||
background: linear-gradient(to right, #67c23a, #95d475);
|
||||
}
|
||||
|
||||
.education-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.card-corner {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
background: linear-gradient(to bottom right,
|
||||
transparent 49%,
|
||||
rgba(64, 158, 255, 0.1) 50%);
|
||||
}
|
||||
|
||||
.school-985 .card-corner {
|
||||
background: linear-gradient(to bottom right,
|
||||
transparent 49%,
|
||||
rgba(255, 153, 0, 0.1) 50%);
|
||||
}
|
||||
|
||||
.school-211 .card-corner {
|
||||
background: linear-gradient(to bottom right,
|
||||
transparent 49%,
|
||||
rgba(64, 158, 255, 0.1) 50%);
|
||||
}
|
||||
|
||||
.school-double-first-class .card-corner {
|
||||
background: linear-gradient(to bottom right,
|
||||
transparent 49%,
|
||||
rgba(103, 194, 58, 0.1) 50%);
|
||||
}
|
||||
|
||||
.education-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 16px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
.education-time {
|
||||
font-size: 16px;
|
||||
color: #606266;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.time-icon {
|
||||
margin-right: 5px;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.education-level {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
color: #303133;
|
||||
padding: 4px 12px;
|
||||
border-radius: 30px;
|
||||
background-color: rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
|
||||
.education-details {
|
||||
margin-bottom: 16px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.school-type-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding: 6px 12px;
|
||||
margin-bottom: 12px;
|
||||
border-radius: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
background-color: #409eff;
|
||||
color: white;
|
||||
box-shadow: 0 2px 6px rgba(64, 158, 255, 0.3);
|
||||
}
|
||||
|
||||
.badge-icon {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.school-985 .school-type-badge {
|
||||
background-color: #ff9900;
|
||||
box-shadow: 0 2px 6px rgba(255, 153, 0, 0.3);
|
||||
}
|
||||
|
||||
.school-211 .school-type-badge {
|
||||
background-color: #409eff;
|
||||
box-shadow: 0 2px 6px rgba(64, 158, 255, 0.3);
|
||||
}
|
||||
|
||||
.school-double-first-class .school-type-badge {
|
||||
background-color: #67c23a;
|
||||
box-shadow: 0 2px 6px rgba(103, 194, 58, 0.3);
|
||||
}
|
||||
|
||||
.education-major,
|
||||
.education-mode {
|
||||
margin-bottom: 10px;
|
||||
font-size: 15px;
|
||||
color: #606266;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.label {
|
||||
color: #909399;
|
||||
margin-right: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.major-icon,
|
||||
.mode-icon {
|
||||
font-style: normal;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.value {
|
||||
color: #303133;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.education-description {
|
||||
margin-top: 16px;
|
||||
padding: 14px;
|
||||
background-color: rgba(0, 0, 0, 0.02);
|
||||
border-radius: 8px;
|
||||
border-left: 3px solid rgba(64, 158, 255, 0.3);
|
||||
}
|
||||
|
||||
.school-985 .education-description {
|
||||
border-left: 3px solid rgba(255, 153, 0, 0.3);
|
||||
}
|
||||
|
||||
.school-211 .education-description {
|
||||
border-left: 3px solid rgba(64, 158, 255, 0.3);
|
||||
}
|
||||
|
||||
.school-double-first-class .education-description {
|
||||
border-left: 3px solid rgba(103, 194, 58, 0.3);
|
||||
}
|
||||
|
||||
.desc-title {
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8px;
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.desc-content {
|
||||
font-size: 14px;
|
||||
color: #606266;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* 不同学历等级的样式 */
|
||||
.edu-associate .education-level {
|
||||
color: #909399;
|
||||
background-color: rgba(144, 147, 153, 0.1);
|
||||
}
|
||||
|
||||
.edu-bachelor .education-level {
|
||||
color: #409eff;
|
||||
background-color: rgba(64, 158, 255, 0.1);
|
||||
}
|
||||
|
||||
.edu-master .education-level {
|
||||
color: #67c23a;
|
||||
background-color: rgba(103, 194, 58, 0.1);
|
||||
}
|
||||
|
||||
.edu-doctor .education-level,
|
||||
.edu-postdoc .education-level {
|
||||
color: #ff9900;
|
||||
background-color: rgba(255, 153, 0, 0.1);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.edu-doctor .education-level:after,
|
||||
.edu-postdoc .education-level:after {
|
||||
content: "🎓";
|
||||
position: absolute;
|
||||
right: -24px;
|
||||
top: -2px;
|
||||
}
|
||||
|
||||
.edu-postdoc .education-level:after {
|
||||
content: "🏆";
|
||||
}
|
||||
|
||||
/* 无数据样式 */
|
||||
.no-data {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 40px 20px;
|
||||
text-align: center;
|
||||
background: linear-gradient(to bottom, #ffffff, #f5f7fa);
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.no-data-icon {
|
||||
font-size: 54px;
|
||||
margin-bottom: 20px;
|
||||
opacity: 0.6;
|
||||
background: linear-gradient(to bottom, #409eff, #67c23a);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.no-data-text {
|
||||
color: #606266;
|
||||
font-size: 15px;
|
||||
max-width: 400px;
|
||||
}
|
||||
|
||||
.no-data-text ul {
|
||||
text-align: left;
|
||||
margin-top: 10px;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.no-data-text li {
|
||||
margin-bottom: 8px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.no-data-text li:before {
|
||||
content: "•";
|
||||
position: absolute;
|
||||
left: -15px;
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
/* 适配移动端 */
|
||||
@media screen and (max-width: 768px) {
|
||||
.education-history {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.education-card {
|
||||
margin-left: 10px;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.timeline-point {
|
||||
left: -8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.education-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.education-level {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
1307
src/ui/CJRZQ0A03.vue
Normal file
1307
src/ui/CJRZQ0A03.vue
Normal file
File diff suppressed because it is too large
Load Diff
369
src/ui/CJRZQ4AA8.vue
Normal file
369
src/ui/CJRZQ4AA8.vue
Normal file
@@ -0,0 +1,369 @@
|
||||
<script setup>
|
||||
import { computed, ref, onMounted, onUnmounted, watch } from "vue";
|
||||
import * as echarts from "echarts";
|
||||
import { useRiskNotifier } from "@/composables/useRiskNotifier";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
});
|
||||
|
||||
// 计算得分,如果没有数据则默认为0
|
||||
const score = computed(() => {
|
||||
return props.data?.score ? Number(props.data.score) : 0;
|
||||
});
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
// 还款压力分数越高风险越大,转换为安全分数
|
||||
// 压力分数 0-20:100分(最安全)
|
||||
// 压力分数 20-50:70分(较安全)
|
||||
// 压力分数 50-80:40分(有风险)
|
||||
// 压力分数 80-100:10分(高风险)
|
||||
const pressure = score.value;
|
||||
if (pressure <= 20) return 100;
|
||||
if (pressure <= 50) return 70;
|
||||
if (pressure <= 80) return 40;
|
||||
return 10;
|
||||
});
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore);
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
});
|
||||
|
||||
// 根据分值确定压力等级
|
||||
const pressureLevel = computed(() => {
|
||||
if (score.value <= 20)
|
||||
return {
|
||||
level: "低",
|
||||
color: "#67C23A",
|
||||
text: "还款压力小",
|
||||
bgGradient: "from-green-500 to-green-300",
|
||||
lightBg: "bg-green-50",
|
||||
borderColor: "border-green-200",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#67C23A" },
|
||||
{ offset: 1, color: "#85ce61" }
|
||||
]
|
||||
};
|
||||
if (score.value <= 50)
|
||||
return {
|
||||
level: "中",
|
||||
color: "#E6A23C",
|
||||
text: "还款压力中等",
|
||||
bgGradient: "from-yellow-500 to-yellow-300",
|
||||
lightBg: "bg-yellow-50",
|
||||
borderColor: "border-yellow-200",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#E6A23C" },
|
||||
{ offset: 1, color: "#ebb563" }
|
||||
]
|
||||
};
|
||||
if (score.value <= 80)
|
||||
return {
|
||||
level: "高",
|
||||
color: "#E53E3E",
|
||||
text: "还款压力较大",
|
||||
bgGradient: "from-orange-500 to-red-400",
|
||||
lightBg: "bg-red-50",
|
||||
borderColor: "border-red-200",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#E53E3E" },
|
||||
{ offset: 1, color: "#fc8181" }
|
||||
]
|
||||
};
|
||||
return {
|
||||
level: "极高",
|
||||
color: "#FF0000",
|
||||
text: "还款压力非常大",
|
||||
bgGradient: "from-red-600 to-red-500",
|
||||
lightBg: "bg-red-50",
|
||||
borderColor: "border-red-300",
|
||||
gradient: [
|
||||
{ offset: 0, color: "#FF0000" },
|
||||
{ offset: 1, color: "#ff3333" }
|
||||
]
|
||||
};
|
||||
});
|
||||
|
||||
// 计算进度条宽度百分比
|
||||
const progressWidth = computed(() => {
|
||||
return `${score.value}%`;
|
||||
});
|
||||
|
||||
// 计算评分对应的Tailwind文本颜色类
|
||||
const scoreColorClass = computed(() => {
|
||||
if (score.value <= 20) return "text-green-500";
|
||||
if (score.value <= 50) return "text-yellow-500";
|
||||
if (score.value <= 80) return "text-orange-500";
|
||||
return "text-red-600";
|
||||
});
|
||||
|
||||
// 获取图标路径(根据压力等级)
|
||||
const getIconPath = () => {
|
||||
// 低压力使用 zq
|
||||
if (score.value <= 20) {
|
||||
return new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
}
|
||||
// 中等压力使用 zfx
|
||||
if (score.value <= 50) {
|
||||
return new URL('@/assets/images/report/zfx.png', import.meta.url).href
|
||||
}
|
||||
// 高压力和极高压力使用 gfx
|
||||
return new URL('@/assets/images/report/gfx.png', import.meta.url).href
|
||||
};
|
||||
|
||||
// 获取边框颜色
|
||||
const getBorderColor = () => {
|
||||
if (score.value <= 20) return '#bbf7d0'; // 绿色
|
||||
if (score.value <= 50) return '#fef3c7'; // 黄色
|
||||
if (score.value <= 80) return '#fecaca'; // 红色
|
||||
return '#fecaca'; // 极高压力也是红色
|
||||
};
|
||||
|
||||
// ECharts 仪表盘
|
||||
const chartRef = ref(null);
|
||||
let chartInstance = null;
|
||||
|
||||
const initChart = () => {
|
||||
if (!chartRef.value) return;
|
||||
chartInstance = echarts.init(chartRef.value);
|
||||
updateChart();
|
||||
};
|
||||
|
||||
const updateChart = () => {
|
||||
if (!chartInstance) return;
|
||||
|
||||
const risk = pressureLevel.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: 6,
|
||||
shadowColor: risk.color,
|
||||
},
|
||||
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: risk.color + "30"
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: risk.color + "25"
|
||||
}
|
||||
])]
|
||||
]
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: true,
|
||||
distance: -30,
|
||||
length: 6,
|
||||
splitNumber: 10,
|
||||
lineStyle: {
|
||||
color: risk.color,
|
||||
width: 1,
|
||||
opacity: 0.5
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
distance: -36,
|
||||
length: 12,
|
||||
splitNumber: 9,
|
||||
lineStyle: {
|
||||
color: risk.color,
|
||||
width: 2,
|
||||
opacity: 0.5
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
show: false,
|
||||
},
|
||||
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: score.value
|
||||
}
|
||||
],
|
||||
title: {
|
||||
fontSize: 14,
|
||||
color: risk.color,
|
||||
offsetCenter: [0, "10%"],
|
||||
formatter: risk.level + "级还款压力"
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
chartInstance.setOption(option);
|
||||
};
|
||||
|
||||
watch(
|
||||
() => score.value,
|
||||
() => {
|
||||
updateChart();
|
||||
}
|
||||
);
|
||||
|
||||
onMounted(() => {
|
||||
initChart();
|
||||
window.addEventListener("resize", () => {
|
||||
if (chartInstance) {
|
||||
chartInstance.resize();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
if (chartInstance) {
|
||||
chartInstance.dispose();
|
||||
chartInstance = null;
|
||||
}
|
||||
window.removeEventListener("resize", chartInstance?.resize);
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="rounded-lg border border-gray-200 pb-2 mb-4">
|
||||
|
||||
<!-- 标题栏 -->
|
||||
<div class="flex items-center mb-4 p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/hkylfx.png" alt="还款压力分析" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">还款压力分析</span>
|
||||
</div>
|
||||
|
||||
<div class="px-4 pb-4">
|
||||
<!-- 仪表盘图表 -->
|
||||
<div class="mb-6">
|
||||
<div ref="chartRef" :style="{ width: '100%', height: '200px' }"></div>
|
||||
</div>
|
||||
|
||||
<!-- 压力等级显示 -->
|
||||
<div class="mb-6">
|
||||
<div class="space-y-3 p-4 rounded-lg border" :class="pressureLevel.lightBg"
|
||||
:style="{ borderColor: getBorderColor() }">
|
||||
<div class="flex items-start">
|
||||
<div class="mr-3 mt-1">
|
||||
<img :src="getIconPath()" alt="还款压力" class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<h4 class="font-semibold text-gray-800 mb-2">{{ pressureLevel.text }}</h4>
|
||||
<p class="text-gray-400 text-sm">
|
||||
分值越高表示还款压力越大,建议关注债务比例
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 财务建议 -->
|
||||
<div class="mb-6">
|
||||
<div class="flex items-center mb-3">
|
||||
<div class="w-4 h-4 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/wxts_icon.png" alt="财务建议" class="w-4 h-4 object-contain" />
|
||||
</div>
|
||||
<div class="font-bold text-gray-800">财务建议</div>
|
||||
</div>
|
||||
<div class="ml-6 text-sm text-gray-600 space-y-1">
|
||||
<p v-if="score > 50">
|
||||
建议合理规划财务,控制债务比例,增加收入来源,避免过度负债。
|
||||
</p>
|
||||
<p v-if="score > 50" class="mt-1">
|
||||
可尝试分期付款或延长还款周期,减轻每月还款压力。
|
||||
</p>
|
||||
<p v-else>
|
||||
当前还款压力在可控范围内,继续保持良好的财务习惯。
|
||||
</p>
|
||||
<p v-if="score <= 50" class="mt-1">
|
||||
建议定期检查收支平衡,确保及时还款,维持良好信用记录。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* 样式已通过 Tailwind CSS 类实现 */
|
||||
</style>
|
||||
246
src/ui/CJRZQ5E9F/README.md
Normal file
246
src/ui/CJRZQ5E9F/README.md
Normal file
@@ -0,0 +1,246 @@
|
||||
# 贷款风险报告组件 (CJRZQ5E9F) - 模块化架构
|
||||
|
||||
## 概述
|
||||
|
||||
贷款风险报告组件采用模块化架构设计,将完整的贷款风险评估拆分成7个独立的模块,每个模块都可以作为独立的tab显示,具有独立的大标题。
|
||||
|
||||
## 数据结构
|
||||
|
||||
贷款风险报告的数据结构如下:
|
||||
|
||||
```javascript
|
||||
{
|
||||
"apiID": "CJRZQ5E9F",
|
||||
"data": {
|
||||
"xyp_cpl0001": "5", // 贷款总机构数
|
||||
"xyp_cpl0002": "3", // 已结清机构数
|
||||
"xyp_cpl0007": "2", // 消费金融类机构数
|
||||
"xyp_cpl0008": "1", // 网络贷款类机构数
|
||||
"xyp_cpl0009": "1", // 最近7天机构数
|
||||
"xyp_cpl0014": "15", // 历史成功还款笔数
|
||||
"xyp_cpl0015": "2", // 历史失败还款笔数
|
||||
"xyp_cpl0016": "1", // 最近1天失败笔数
|
||||
"xyp_cpl0017": "3", // 最近1天成功笔数
|
||||
"xyp_cpl0018": "1", // 最近7天失败笔数
|
||||
"xyp_cpl0019": "5", // 最近7天成功笔数
|
||||
"xyp_cpl0020": "1", // 最近14天失败笔数
|
||||
"xyp_cpl0021": "7", // 最近14天成功笔数
|
||||
"xyp_cpl0022": "2", // 最近30天失败笔数
|
||||
"xyp_cpl0023": "10", // 最近30天成功笔数
|
||||
"xyp_cpl0024": "2", // 最近90天失败笔数
|
||||
"xyp_cpl0025": "12", // 最近90天成功笔数
|
||||
"xyp_cpl0026": "2", // 最近180天失败笔数
|
||||
"xyp_cpl0027": "14", // 最近180天成功笔数
|
||||
"xyp_cpl0028": "0", // 最近1天逾期标识
|
||||
"xyp_cpl0029": "0", // 最近7天逾期标识
|
||||
"xyp_cpl0030": "0", // 最近14天逾期标识
|
||||
"xyp_cpl0031": "0", // 最近30天逾期标识
|
||||
"xyp_cpl0032": "1000", // 最近1天失败金额
|
||||
"xyp_cpl0033": "5000", // 最近1天成功金额
|
||||
"xyp_cpl0034": "2000", // 最近7天失败金额
|
||||
"xyp_cpl0035": "8000", // 最近7天成功金额
|
||||
"xyp_cpl0036": "1500", // 最近14天失败金额
|
||||
"xyp_cpl0037": "12000", // 最近14天成功金额
|
||||
"xyp_cpl0038": "3000", // 最近30天失败金额
|
||||
"xyp_cpl0039": "20000", // 最近30天成功金额
|
||||
"xyp_cpl0040": "4000", // 最近90天失败金额
|
||||
"xyp_cpl0041": "35000", // 最近90天成功金额
|
||||
"xyp_cpl0042": "5000", // 最近180天失败金额
|
||||
"xyp_cpl0043": "45000", // 最近180天成功金额
|
||||
"xyp_cpl0044": "0", // 当前逾期状态
|
||||
"xyp_cpl0045": "365", // 信用贷款时长
|
||||
"xyp_cpl0046": "30", // 最近一次交易距今天数
|
||||
"xyp_cpl0064": "1", // 最近21天成功笔数
|
||||
"xyp_cpl0065": "0", // 最近21天失败笔数
|
||||
"xyp_cpl0066": "1000", // 最近21天失败金额
|
||||
"xyp_cpl0067": "6000", // 最近21天成功金额
|
||||
"xyp_cpl0068": "15", // 最近一次还款距今天数
|
||||
"xyp_cpl0070": "1", // 最近1天机构数
|
||||
"xyp_cpl0071": "0", // 当前逾期机构数
|
||||
"xyp_cpl0072": "0", // 当前逾期金额
|
||||
"xyp_cpl0073": "0.85", // 近5次金额成功率
|
||||
"xyp_cpl0074": "0.80", // 近5次还款成功率
|
||||
"xyp_cpl0075": "0.75", // 近20次小贷成功率
|
||||
"xyp_cpl0079": "0.70", // 近90天金额成功率
|
||||
"xyp_cpl0080": "0.65", // 近90天还款成功率
|
||||
"xyp_cpl0081": "0.25", // 信用风险评分
|
||||
"xyp_cpl0082": "0.30", // 履约金额综合指数
|
||||
"xyp_cpl0083": "0.35", // 履约笔数综合指数
|
||||
"xyp_model_score_high": "750", // 小额网贷分
|
||||
"xyp_model_score_mid": "680", // 小额分期分
|
||||
"xyp_model_score_low": "720", // 中大额分期分
|
||||
"xyp_t0400002": "0.78", // 近20次还款成功率
|
||||
"xyp_t0400003": "0.82", // 近50次还款成功率
|
||||
"xyp_t0400004": "0.80" // 近100次还款成功率
|
||||
},
|
||||
"success": true,
|
||||
"timestamp": "2025-01-20 21:19:58"
|
||||
}
|
||||
```
|
||||
|
||||
## 模块拆分
|
||||
|
||||
贷款风险报告被拆分成以下7个独立模块:
|
||||
|
||||
| API ID | 模块名称 | 包含数据 | 组件文件 |
|
||||
|--------|----------|----------|----------|
|
||||
| `CJRZQ5E9F_RiskOverview` | 风险概览 | 综合风险等级、当前状态、关键指标 | RiskOverview.vue |
|
||||
| `CJRZQ5E9F_CreditScores` | 信用评分 | 综合信用指数、专业模型评分、还款表现 | CreditScores.vue |
|
||||
| `CJRZQ5E9F_LoanBehaviorAnalysis` | 贷款行为分析 | 机构类型分布、还款表现统计、时间维度分析 | LoanBehaviorAnalysis.vue |
|
||||
| `CJRZQ5E9F_InstitutionAnalysis` | 机构分析 | 机构类型分析、合作机构详情 | InstitutionAnalysis.vue |
|
||||
| `CJRZQ5E9F_TimeTrendAnalysis` | 时间趋势分析 | 历史趋势、周期性分析 | TimeTrendAnalysis.vue |
|
||||
| `CJRZQ5E9F_RiskIndicators` | 风险指标详情 | 详细风险指标、风险因子分析 | RiskIndicators.vue |
|
||||
| `CJRZQ5E9F_RiskAdvice` | 专业建议 | 风险评估建议、优化建议 | RiskAdvice.vue |
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 前端自动拆分
|
||||
|
||||
BaseReport.vue 已自动配置支持贷款风险报告的模块化显示:
|
||||
|
||||
```javascript
|
||||
import { splitCJRZQ5E9FForTabs } from '@/ui/CJRZQ5E9F/utils/simpleSplitter.js';
|
||||
|
||||
// 处理数据拆分(支持DWBG8B4D、DWBG6A2C和CJRZQ5E9F)
|
||||
const processedReportData = computed(() => {
|
||||
let data = reportData.value;
|
||||
|
||||
// 拆分DWBG8B4D数据
|
||||
data = splitDWBG8B4DForTabs(data);
|
||||
|
||||
// 拆分DWBG6A2C数据
|
||||
data = splitDWBG6A2CForTabs(data);
|
||||
|
||||
// 拆分CJRZQ5E9F数据
|
||||
data = splitCJRZQ5E9FForTabs(data);
|
||||
|
||||
return data;
|
||||
});
|
||||
```
|
||||
|
||||
### 2. 组件配置
|
||||
|
||||
BaseReport.vue 中已配置所有贷款风险报告模块:
|
||||
|
||||
```javascript
|
||||
// 贷款风险报告
|
||||
JRZQ5E9F: {
|
||||
name: "贷款风险评估",
|
||||
component: defineAsyncComponent(() => import("@/ui/CJRZQ5E9F/index.vue")),
|
||||
remark: '贷款风险评估提供全面的个人贷款风险分析,包括风险概览、信用评分、贷款行为分析、机构分析等多维度评估。'
|
||||
},
|
||||
// ... 其他模块配置
|
||||
```
|
||||
|
||||
## 组件结构
|
||||
|
||||
```
|
||||
src/ui/CJRZQ5E9F/
|
||||
├── index.vue # 原始完整组件(保留)
|
||||
├── README.md # 文档说明
|
||||
├── components/ # 子组件目录
|
||||
│ ├── RiskOverview.vue # 风险概览
|
||||
│ ├── CreditScores.vue # 信用评分
|
||||
│ ├── LoanBehaviorAnalysis.vue # 贷款行为分析
|
||||
│ ├── InstitutionAnalysis.vue # 机构分析
|
||||
│ ├── TimeTrendAnalysis.vue # 时间趋势分析
|
||||
│ ├── RiskIndicators.vue # 风险指标详情
|
||||
│ └── RiskAdvice.vue # 专业建议
|
||||
└── utils/
|
||||
└── simpleSplitter.js # 数据拆分工具
|
||||
```
|
||||
|
||||
## 特色功能
|
||||
|
||||
### 1. 智能风险评估
|
||||
- 多维度风险等级计算
|
||||
- 智能颜色编码
|
||||
- 动态风险提示
|
||||
|
||||
### 2. 数据可视化
|
||||
- 渐变色彩设计
|
||||
- 图标化展示
|
||||
- 响应式布局
|
||||
- 交互式图表
|
||||
|
||||
### 3. 用户友好
|
||||
- 清晰的层次结构
|
||||
- 详细的说明文档
|
||||
- 直观的风险提示
|
||||
- 专业的建议指导
|
||||
|
||||
### 4. 模块化设计
|
||||
- 独立的模块组件
|
||||
- 可复用的工具函数
|
||||
- 灵活的数据拆分
|
||||
- 易于维护和扩展
|
||||
|
||||
## 工具函数
|
||||
|
||||
`utils/simpleSplitter.js` 提供了以下工具函数:
|
||||
|
||||
- `splitCJRZQ5E9FForTabs()` - 数据拆分
|
||||
- `parseIntervalValue()` - 解析区间化数值
|
||||
- `formatMetricValue()` - 格式化指标值
|
||||
- `formatDays()` - 格式化天数显示
|
||||
- `formatAmount()` - 格式化金额显示
|
||||
- `calculateRiskLevel()` - 计算风险等级
|
||||
- `calculateCreditScore()` - 计算信用评分
|
||||
- `getCreditScoreLevel()` - 获取信用等级描述
|
||||
- `getCreditScoreBadgeClass()` - 获取信用等级样式
|
||||
- `getScoreClass()` - 获取评分样式
|
||||
- `getCircleStyle()` - 获取圆形进度样式
|
||||
- `hasRiskData()` - 检查是否有风险数据
|
||||
|
||||
## 使用示例
|
||||
|
||||
```javascript
|
||||
// 在页面中使用
|
||||
<BaseReport
|
||||
:reportData="reportData"
|
||||
:reportParams="reportParams"
|
||||
reportName="贷款风险评估"
|
||||
feature="CJRZQ5E9F"
|
||||
:isEmpty="false"
|
||||
:isDone="true"
|
||||
/>
|
||||
```
|
||||
|
||||
## 数据字段说明
|
||||
|
||||
### 主要指标字段
|
||||
- `xyp_cpl0001`: 贷款总机构数
|
||||
- `xyp_cpl0002`: 已结清机构数
|
||||
- `xyp_cpl0044`: 当前逾期状态 (0: 无逾期, 1: 有逾期)
|
||||
- `xyp_cpl0081`: 信用风险评分 (0-1)
|
||||
- `xyp_cpl0082`: 履约金额综合指数 (0-1)
|
||||
- `xyp_cpl0083`: 履约笔数综合指数 (0-1)
|
||||
|
||||
### 模型评分字段
|
||||
- `xyp_model_score_high`: 小额网贷分 (350-950)
|
||||
- `xyp_model_score_mid`: 小额分期分 (350-950)
|
||||
- `xyp_model_score_low`: 中大额分期分 (350-950)
|
||||
|
||||
### 还款表现字段
|
||||
- `xyp_cpl0073`: 近5次金额成功率
|
||||
- `xyp_cpl0074`: 近5次还款成功率
|
||||
- `xyp_t0400002`: 近20次还款成功率
|
||||
- `xyp_t0400003`: 近50次还款成功率
|
||||
- `xyp_t0400004`: 近100次还款成功率
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 确保数据格式符合贷款风险报告的标准结构
|
||||
2. 所有模块都支持数据为空的情况
|
||||
3. 风险评估基于实际数据动态计算
|
||||
4. 组件采用 Tailwind CSS 进行样式设计
|
||||
5. 支持移动端响应式布局
|
||||
6. 区间化数值会自动解析为具体数值进行显示
|
||||
|
||||
## 更新日志
|
||||
|
||||
- v1.0.0: 初始版本,支持完整的贷款风险报告模块化显示
|
||||
- 包含7个独立模块
|
||||
- 支持自动数据拆分
|
||||
- 提供完整的风险评估功能
|
||||
- 支持多种数据可视化方式
|
||||
579
src/ui/CJRZQ5E9F/components/CreditScores.vue
Normal file
579
src/ui/CJRZQ5E9F/components/CreditScores.vue
Normal file
@@ -0,0 +1,579 @@
|
||||
<template>
|
||||
<div class="rounded-lg border border-[#99999933]">
|
||||
<div class="mb-4">
|
||||
<!-- 标题栏 -->
|
||||
<div class="flex items-center mb-4 p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/xypf2.png" alt="信用评分" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">信用评分</span>
|
||||
</div>
|
||||
|
||||
<div class="pb-4">
|
||||
<!-- 综合信用指数 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="综合信用指数" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">基于多维度风险评估的综合评分</p>
|
||||
|
||||
<!-- 信用分仪表盘 -->
|
||||
<div class="flex flex-col items-center mb-4">
|
||||
<div ref="chartRef" :style="{ width: '100%', height: '200px' }"></div>
|
||||
<div class="text-center mt-[-14px]">
|
||||
<div class=" text-[#999999]">评分范围: 150-1000</div>
|
||||
<div class="px-10 py-1 rounded-full font-medium inline-block mt-2" :class="getCreditScoreBadgeClass()">
|
||||
{{ getCreditScoreLevel() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 详细指标 -->
|
||||
<div class="space-y-3 px-4 ">
|
||||
<div class="bg-green-50 rounded-lg p-4 border border-green-200">
|
||||
<div class="flex items-start">
|
||||
<img src="@/assets/images/report/zq.png" alt="信用风险评分"
|
||||
class="w-10 h-10 object-contain mr-4 flex-shrink-0" />
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-gray-800">信用风险评分</span>
|
||||
<span class="text-sm font-bold" :class="getScoreTextClass()">{{ (creditRiskScore * 100).toFixed(0)
|
||||
}}%</span>
|
||||
</div>
|
||||
<div class="h-2" :style="`background-color: ${getLightScoreColor()}`">
|
||||
<div class="h-2 transition-all duration-500"
|
||||
:style="`width: ${Math.max(creditRiskScore * 100, 2)}%; background-color: ${getScoreColor()}`">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-green-50 rounded-lg p-4 border border-green-200">
|
||||
<div class="flex items-start">
|
||||
<img src="@/assets/images/report/zq.png" alt="履约金额综合指数"
|
||||
class="w-10 h-10 object-contain mr-4 flex-shrink-0" />
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-gray-800">履约金额综合指数</span>
|
||||
<span class="text-sm font-bold" :class="getScoreTextClass()">{{ (amountComplianceIndex *
|
||||
100).toFixed(0)
|
||||
}}%</span>
|
||||
</div>
|
||||
<div class="h-2" :style="`background-color: ${getLightScoreColor()}`">
|
||||
<div class="h-2 transition-all duration-500"
|
||||
:style="`width: ${Math.max(amountComplianceIndex * 100, 2)}%; background-color: ${getScoreColor()}`">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-green-50 rounded-lg p-4 border border-green-200">
|
||||
<div class="flex items-start">
|
||||
<img src="@/assets/images/report/zq.png" alt="履约笔数综合指数"
|
||||
class="w-10 h-10 object-contain mr-4 flex-shrink-0" />
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-gray-800">履约笔数综合指数</span>
|
||||
<span class="text-sm font-bold" :class="getScoreTextClass()">{{ (countComplianceIndex *
|
||||
100).toFixed(0)
|
||||
}}%</span>
|
||||
</div>
|
||||
<div class="h-2" :style="`background-color: ${getLightScoreColor()}`">
|
||||
<div class="h-2 transition-all duration-500"
|
||||
:style="`width: ${Math.max(countComplianceIndex * 100, 2)}%; background-color: ${getScoreColor()}`">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 专业模型评分 -->
|
||||
<div class=" mb-4">
|
||||
<div class="">
|
||||
<LTitle title="专业模型评分" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">星耀Pro系列AI评分模型</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 小额网贷分 V1 -->
|
||||
<div :class="getModelCardClass(highRiskScore)">
|
||||
<div class="flex items-center mb-2">
|
||||
<img :src="getModelIcon(highRiskScore)" alt="小额网贷分 V1"
|
||||
class="w-10 h-10 object-contain mr-3 flex-shrink-0" />
|
||||
<div class="flex-1">
|
||||
<div class="font-medium text-gray-800 mb-1">小额网贷分 V1</div>
|
||||
<div class="text-sm text-gray-600">针对小额网贷风险评估</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600 ml-[52px]">评分: <span class="font-bold">350-950</span></div>
|
||||
<div class="absolute top-0 right-0 bg-[#999999] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatModelScore(highRiskScore) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 小额分期分 V1 -->
|
||||
<div :class="getModelCardClass(midRiskScore)">
|
||||
<div class="flex items-center mb-2">
|
||||
<img :src="getModelIcon(midRiskScore)" alt="小额分期分 V1"
|
||||
class="w-10 h-10 object-contain mr-3 flex-shrink-0" />
|
||||
<div class="flex-1">
|
||||
<div class="font-medium text-gray-800 mb-1">小额分期分 V1</div>
|
||||
<div class="text-sm text-gray-600">针对小额分期产品评估</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600 ml-[52px]">评分: <span class="font-bold">350-950</span></div>
|
||||
<div class="absolute top-0 right-0 bg-[#999999] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatModelScore(midRiskScore) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 中大额分期分 V1 -->
|
||||
<div :class="getModelCardClass(lowRiskScore)">
|
||||
<div class="flex items-center mb-2">
|
||||
<img :src="getModelIcon(lowRiskScore)" alt="中大额分期分 V1"
|
||||
class="w-10 h-10 object-contain mr-3 flex-shrink-0" />
|
||||
<div class="flex-1">
|
||||
<div class="font-medium text-gray-800 mb-1">中大额分期分 V1</div>
|
||||
<div class="text-sm text-gray-600">针对中大额分期产品评估</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600 ml-[52px]">评分: <span class="font-bold">350-950</span></div>
|
||||
<div class="absolute top-0 right-0 bg-[#999999] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatModelScore(lowRiskScore) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 还款表现指标 -->
|
||||
<div class="mb-8">
|
||||
<div class="">
|
||||
<LTitle title="还款表现指标" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">近期还款成功率统计</p>
|
||||
|
||||
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3 px-4">
|
||||
<!-- 近5次 -->
|
||||
<div class="bg-[#ECF9EF] rounded-lg p-3 border border-[#91D69F]">
|
||||
<div class="flex flex-col items-center justify-center h-full w-full">
|
||||
<div class="flex flex-col items-center justify-center w-full h-full text-center">
|
||||
<div class="text-lg text-[#999999] mt-1">金额: <span class="font-bold text-green-600 text-2xl">{{
|
||||
(recent5AmountRatio * 100).toFixed(0) }}</span> %</div>
|
||||
<div class="font-medium text-[#666666] mb-2">近5次</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 近20次 -->
|
||||
<div class="bg-[#ECF9EF] rounded-lg p-3 border border-[#91D69F]">
|
||||
<div class="flex flex-col items-center justify-center h-full w-full">
|
||||
<div class="flex flex-col items-center justify-center w-full h-full text-center">
|
||||
<div class="text-lg text-[#999999] mt-1">小贷: <span class="font-bold text-green-600 text-2xl">{{
|
||||
(recent20SmallLoanRatio * 100).toFixed(0) }}</span> %</div>
|
||||
<div class="font-medium text-[#666666] mb-2">近20次</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 近90天 -->
|
||||
<div class="bg-[#ECF9EF] rounded-lg p-3 border border-[#91D69F]">
|
||||
<div class="flex flex-col items-center justify-center h-full w-full">
|
||||
<div class="flex flex-col items-center justify-center w-full h-full text-center">
|
||||
<div class="text-lg text-[#999999] mt-1">金额: <span class="font-bold text-green-600 text-2xl">{{
|
||||
(recent90AmountRatio * 100).toFixed(0) }}</span> %</div>
|
||||
<div class="font-medium text-[#666666] mb-2">近90天</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 近50次 -->
|
||||
<div class="bg-[#ECF9EF] rounded-lg p-3 border border-[#91D69F]">
|
||||
<div class="flex flex-col items-center justify-center h-full w-full">
|
||||
<div class="flex flex-col items-center justify-center w-full h-full text-center">
|
||||
<div class="text-lg text-[#999999] mt-1">成功率: <span class="font-bold text-green-600 text-2xl">{{
|
||||
(recent50PaymentRatio * 100).toFixed(0) }}</span> %</div>
|
||||
<div class="font-medium text-[#666666] mb-2">近50次</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 近100次 -->
|
||||
<div class="bg-[#ECF9EF] rounded-lg p-3 border border-[#91D69F]">
|
||||
<div class="flex flex-col items-center justify-center h-full w-full">
|
||||
<div class="flex flex-col items-center justify-center w-full h-full text-center">
|
||||
<div class="text-lg text-[#999999] mt-1">成功率: <span class="font-bold text-green-600 text-2xl">{{
|
||||
(recent100PaymentRatio * 100).toFixed(0) }}</span> %</div>
|
||||
<div class="font-medium text-[#666666] mb-2">近100次</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<LRemark
|
||||
content="信用评分系统基于多维度数据建立的综合信用评估模型,提供综合信用指数、分类信用评分和信用等级分析。评分范围为0-1000分,分数越高代表信用状况越好。系统会根据还款表现、借贷历史、负债情况等因素进行评分。建议结合具体业务场景设定信用门槛,并定期更新评分模型以提高预测准确性。" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
import * as echarts from 'echarts'
|
||||
|
||||
export default {
|
||||
name: 'CreditScores',
|
||||
components: {
|
||||
LTitle,
|
||||
LRemark
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
chartInstance: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
creditRiskScore() {
|
||||
return parseFloat(this.data.xyp_cpl0081) || 0
|
||||
},
|
||||
amountComplianceIndex() {
|
||||
return parseFloat(this.data.xyp_cpl0082) || 0
|
||||
},
|
||||
countComplianceIndex() {
|
||||
return parseFloat(this.data.xyp_cpl0083) || 0
|
||||
},
|
||||
|
||||
// 模型评分
|
||||
highRiskScore() {
|
||||
const score = parseInt(this.data.xyp_model_score_high)
|
||||
return isNaN(score) || score === -1 ? null : score
|
||||
},
|
||||
midRiskScore() {
|
||||
const score = parseInt(this.data.xyp_model_score_mid)
|
||||
return isNaN(score) || score === -1 ? null : score
|
||||
},
|
||||
lowRiskScore() {
|
||||
const score = parseInt(this.data.xyp_model_score_low)
|
||||
return isNaN(score) || score === -1 ? null : score
|
||||
},
|
||||
|
||||
// 综合信用评分计算
|
||||
creditScoreDisplay() {
|
||||
const avgRisk = (this.creditRiskScore + this.amountComplianceIndex + this.countComplianceIndex) / 3
|
||||
// 风险越高,信用分越低
|
||||
return Math.round((1 - avgRisk) * 850 + 150)
|
||||
},
|
||||
|
||||
creditScoreColor() {
|
||||
if (this.creditScoreDisplay >= 750) return '#1FBE5D'
|
||||
if (this.creditScoreDisplay >= 650) return '#f59e0b'
|
||||
return '#ef4444'
|
||||
},
|
||||
|
||||
// 还款比例计算
|
||||
recent5PaymentRatio() {
|
||||
return parseFloat(this.data.xyp_cpl0074) || 0
|
||||
},
|
||||
recent5AmountRatio() {
|
||||
return parseFloat(this.data.xyp_cpl0073) || 0
|
||||
},
|
||||
recent20PaymentRatio() {
|
||||
return parseFloat(this.data.xyp_t0400002) || 0
|
||||
},
|
||||
recent20SmallLoanRatio() {
|
||||
return parseFloat(this.data.xyp_cpl0075) || 0
|
||||
},
|
||||
recent90DayRatio() {
|
||||
return parseFloat(this.data.xyp_cpl0080) || 0
|
||||
},
|
||||
recent90AmountRatio() {
|
||||
return parseFloat(this.data.xyp_cpl0079) || 0
|
||||
},
|
||||
recent50PaymentRatio() {
|
||||
return parseFloat(this.data.xyp_t0400003) || 0
|
||||
},
|
||||
recent100PaymentRatio() {
|
||||
return parseFloat(this.data.xyp_t0400004) || 0
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.initChart()
|
||||
window.addEventListener('resize', this.handleResize)
|
||||
},
|
||||
|
||||
beforeUnmount() {
|
||||
if (this.chartInstance) {
|
||||
this.chartInstance.dispose()
|
||||
this.chartInstance = null
|
||||
}
|
||||
window.removeEventListener('resize', this.handleResize)
|
||||
},
|
||||
|
||||
watch: {
|
||||
creditScoreDisplay() {
|
||||
this.updateChart()
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
initChart() {
|
||||
if (!this.$refs.chartRef) return
|
||||
this.chartInstance = echarts.init(this.$refs.chartRef)
|
||||
this.updateChart()
|
||||
},
|
||||
|
||||
updateChart() {
|
||||
if (!this.chartInstance) return
|
||||
|
||||
const scoreColor = this.creditScoreColor
|
||||
const gradientColors = this.getGradientColors()
|
||||
|
||||
const option = {
|
||||
series: [
|
||||
{
|
||||
type: 'gauge',
|
||||
startAngle: 180,
|
||||
endAngle: 0,
|
||||
min: 150,
|
||||
max: 1000,
|
||||
radius: '100%',
|
||||
center: ['50%', '80%'],
|
||||
itemStyle: {
|
||||
color: scoreColor,
|
||||
shadowBlur: 6,
|
||||
shadowColor: scoreColor
|
||||
},
|
||||
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: scoreColor + '30' },
|
||||
{ offset: 1, color: scoreColor + '25' }
|
||||
])]
|
||||
]
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: true,
|
||||
distance: -30,
|
||||
length: 6,
|
||||
splitNumber: 10,
|
||||
lineStyle: {
|
||||
color: scoreColor,
|
||||
width: 1,
|
||||
opacity: 0.5
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
distance: -36,
|
||||
length: 12,
|
||||
splitNumber: 9,
|
||||
lineStyle: {
|
||||
color: scoreColor,
|
||||
width: 2,
|
||||
opacity: 0.5
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
show: false
|
||||
},
|
||||
anchor: {
|
||||
show: false
|
||||
},
|
||||
pointer: {
|
||||
show: false
|
||||
},
|
||||
detail: {
|
||||
valueAnimation: true,
|
||||
fontSize: 30,
|
||||
fontWeight: 'bold',
|
||||
color: scoreColor,
|
||||
offsetCenter: [0, 0],
|
||||
formatter: (value) => {
|
||||
return `{value|${value}}{label|信用分}`
|
||||
},
|
||||
rich: {
|
||||
value: {
|
||||
fontSize: 30,
|
||||
fontWeight: 'bold',
|
||||
color: scoreColor,
|
||||
padding: [0, 0, 5, 10]
|
||||
},
|
||||
label: {
|
||||
fontSize: 14,
|
||||
fontWeight: 'normal',
|
||||
color: scoreColor,
|
||||
padding: [0, 0, 0, 5]
|
||||
}
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: this.creditScoreDisplay
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
this.chartInstance.setOption(option)
|
||||
},
|
||||
|
||||
getGradientColors() {
|
||||
const color = this.creditScoreColor
|
||||
return [
|
||||
{ offset: 0, color: color },
|
||||
{ offset: 1, color: this.lightenColor(color, 0.3) }
|
||||
]
|
||||
},
|
||||
|
||||
lightenColor(color, amount) {
|
||||
const num = parseInt(color.replace('#', ''), 16)
|
||||
const r = Math.min(255, (num >> 16) + amount * 255)
|
||||
const g = Math.min(255, ((num >> 8) & 0x00ff) + amount * 255)
|
||||
const b = Math.min(255, (num & 0x0000ff) + amount * 255)
|
||||
return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`
|
||||
},
|
||||
|
||||
handleResize() {
|
||||
if (this.chartInstance) {
|
||||
this.chartInstance.resize()
|
||||
}
|
||||
},
|
||||
|
||||
formatModelScore(score) {
|
||||
return score === null ? '未命中' : score.toString()
|
||||
},
|
||||
|
||||
getScoreClass(score) {
|
||||
if (score === null) return 'text-gray-400'
|
||||
if (score >= 750) return 'text-green-600'
|
||||
if (score >= 650) return 'text-yellow-600'
|
||||
return 'text-red-600'
|
||||
},
|
||||
|
||||
getScoreTextClass() {
|
||||
if (this.creditScoreDisplay >= 750) return 'text-green-600'
|
||||
if (this.creditScoreDisplay >= 650) return 'text-yellow-600'
|
||||
return 'text-red-600'
|
||||
},
|
||||
|
||||
getScoreColor() {
|
||||
return this.creditScoreColor
|
||||
},
|
||||
|
||||
getLightScoreColor() {
|
||||
const color = this.creditScoreColor
|
||||
// 将颜色转换为淡色版本(增加透明度)
|
||||
if (color === '#1FBE5D') return '#E8F8F0' // 绿色淡色
|
||||
if (color === '#f59e0b') return '#FEF3C7' // 黄色淡色
|
||||
if (color === '#ef4444') return '#FEE2E2' // 红色淡色
|
||||
return '#F3F4F6' // 默认灰色
|
||||
},
|
||||
|
||||
getModelIcon(score) {
|
||||
// 如果分数为null或未命中,返回灰色图标
|
||||
if (score === null) {
|
||||
return new URL('@/assets/images/report/wmz.png', import.meta.url).href
|
||||
}
|
||||
// 如果命中,返回绿色图标
|
||||
return new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
},
|
||||
|
||||
getModelCardClass(score) {
|
||||
// 如果分数为null或未命中,返回未命中样式
|
||||
if (score === null) {
|
||||
return 'bg-[#F0F0F0] rounded-lg p-4 border border-[#D4D4D4] relative'
|
||||
}
|
||||
// 如果命中,返回默认样式
|
||||
return 'bg-gray-50 rounded-lg p-4 border border-gray-200 relative'
|
||||
},
|
||||
|
||||
getCircleStyle(ratio) {
|
||||
let color = '#ef4444'
|
||||
if (ratio >= 0.8) color = '#10b981'
|
||||
else if (ratio >= 0.6) color = '#f59e0b'
|
||||
|
||||
// 确保至少显示10度,让用户知道是图表
|
||||
const minDegree = 10
|
||||
const actualDegree = Math.max(ratio * 360, minDegree)
|
||||
|
||||
return {
|
||||
background: `conic-gradient(${color} ${actualDegree}deg, #e5e7eb 0deg)`
|
||||
}
|
||||
},
|
||||
|
||||
getCreditScoreLevel() {
|
||||
if (this.creditScoreDisplay >= 800) return '优秀'
|
||||
if (this.creditScoreDisplay >= 700) return '良好'
|
||||
if (this.creditScoreDisplay >= 600) return '一般'
|
||||
if (this.creditScoreDisplay >= 500) return '较差'
|
||||
return '很差'
|
||||
},
|
||||
|
||||
getCreditScoreBadgeClass() {
|
||||
if (this.creditScoreDisplay >= 800) return 'bg-[#1FBE5D] text-white'
|
||||
if (this.creditScoreDisplay >= 700) return 'bg-blue-600 text-white'
|
||||
if (this.creditScoreDisplay >= 600) return 'bg-yellow-600 text-white'
|
||||
if (this.creditScoreDisplay >= 500) return 'bg-orange-600 text-white'
|
||||
return 'bg-red-600 text-white'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 组件容器样式 */
|
||||
.credit-scores {
|
||||
background: white;
|
||||
border-radius: 0.75rem;
|
||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
||||
border: 1px solid #e5e7eb;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 1.25rem;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.credit-scores:hover {
|
||||
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||
transform: translateY(-0.25rem);
|
||||
}
|
||||
|
||||
.section-spacing {
|
||||
height: 1.25rem;
|
||||
}
|
||||
|
||||
/* 响应式设计 */
|
||||
@media (max-width: 768px) {
|
||||
.credit-scores {
|
||||
padding: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.credit-scores {
|
||||
padding: 0.75rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
372
src/ui/CJRZQ5E9F/components/InstitutionAnalysis.vue
Normal file
372
src/ui/CJRZQ5E9F/components/InstitutionAnalysis.vue
Normal file
@@ -0,0 +1,372 @@
|
||||
<template>
|
||||
<div class="">
|
||||
<div class="rounded-lg border border-[#99999933] mb-4">
|
||||
<div class="pb-4">
|
||||
<!-- 标题栏 -->
|
||||
<div class="flex items-center mb-4 p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/jgfx.png" alt="机构分析" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">机构分析</span>
|
||||
</div>
|
||||
|
||||
<!-- 机构数量统计 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="机构数量统计" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">不同类型贷款机构数量统计</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 消费金融类 -->
|
||||
<div class="bg-[#ECF2FD] rounded-lg p-4 border border-[#CADAF9] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">消费金融类</div>
|
||||
<div class="text-sm text-[#999999]">有场景分期贷款</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5079EA] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(consumerFinanceInstitutions) }} 家机构
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 小贷担保类 -->
|
||||
<div class="bg-[#ECF2FD] rounded-lg p-4 border border-[#CADAF9] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">小贷担保类</div>
|
||||
<div class="text-sm text-[#999999]">现金贷等小额贷款</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5079EA] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(smallLoanSuccessInstitutions) }} 家机构
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 网络贷款类 -->
|
||||
<div class="bg-[#ECF2FD] rounded-lg p-4 border border-[#CADAF9] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">网络贷款类</div>
|
||||
<div class="text-sm text-[#999999]">网络现金贷</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5079EA] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(networkLoanInstitutions) }} 家机构
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 交易金额统计 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="交易金额统计" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">不同时间段的交易金额分析</p>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<div class="mb-4 border border-gray-200 rounded-lg overflow-hidden mx-4">
|
||||
<!-- 表头 -->
|
||||
<div class="bg-[#922D2A] text-white">
|
||||
<div class="grid grid-cols-5 text-sm" style="grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr;">
|
||||
<div class="py-3 px-4 text-left font-semibold border-r border-white whitespace-nowrap">时间段</div>
|
||||
<div class="py-3 px-4 text-center font-semibold border-r border-white whitespace-nowrap">最大</div>
|
||||
<div class="py-3 px-4 text-center font-semibold border-r border-white whitespace-nowrap">最小</div>
|
||||
<div class="py-3 px-4 text-center font-semibold border-r border-white whitespace-nowrap">平均</div>
|
||||
<div class="py-3 px-4 text-center font-semibold whitespace-nowrap">总计</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 数据行 -->
|
||||
<div class="bg-white">
|
||||
<!-- 近5次 -->
|
||||
<div class="grid grid-cols-5 border-b border-gray-200 text-sm"
|
||||
style="grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr;">
|
||||
<div class="py-3 px-4 font-medium text-gray-800 border-r border-gray-200 whitespace-nowrap">近5次</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent5.max) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent5.min) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent5.avg) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] font-semibold whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent5.sum) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 近20次 -->
|
||||
<div class="grid grid-cols-5 border-b border-gray-200 text-sm"
|
||||
style="grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr;">
|
||||
<div class="py-3 px-4 font-medium text-gray-800 border-r border-gray-200 whitespace-nowrap">近20次</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent20.max) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent20.min) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent20.avg) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] font-semibold whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent20.sum) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 近50次 -->
|
||||
<div class="grid grid-cols-5 border-b border-gray-200 text-sm"
|
||||
style="grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr;">
|
||||
<div class="py-3 px-4 font-medium text-gray-800 border-r border-gray-200 whitespace-nowrap">近50次</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent50.max) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent50.min) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent50.avg) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] font-semibold whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent50.sum) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 近100次 -->
|
||||
<div class="grid grid-cols-5 text-sm" style="grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr;">
|
||||
<div class="py-3 px-4 font-medium text-gray-800 border-r border-gray-200 whitespace-nowrap">近100次</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent100.max) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent100.min) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] border-r border-gray-200 whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent100.avg) }}
|
||||
</div>
|
||||
<div class="py-3 px-4 text-center text-[#333333] font-semibold whitespace-nowrap">
|
||||
{{ formatAmount(transactionAmountStats.recent100.sum) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 机构风险评估 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="机构风险评估" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">不同风险等级的机构分布</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 高风险 -->
|
||||
<div class="bg-[#FFF0F0] rounded-lg p-4 border border-[#F0CACA] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">高风险</div>
|
||||
<div class="text-sm text-[#999999]">多次失败</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#D44643] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(highRiskInstitutions) }} 家
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 中风险 -->
|
||||
<div class="bg-[#FFF8E7] rounded-lg p-4 border border-[#F5D980] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">中风险</div>
|
||||
<div class="text-sm text-[#999999]">偶有失败</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#F5A623] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(mediumRiskInstitutions) }} 家
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 低风险 -->
|
||||
<div class="bg-[#ECF9EF] rounded-lg p-4 border border-[#CAECD3] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">低风险</div>
|
||||
<div class="text-sm text-[#999999]">记录良好</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5EBC62] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(lowRiskInstitutions) }} 家
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<LRemark
|
||||
content="机构分析提供申请人在不同类型金融机构中的借贷表现和风险情况。包括消费金融类、小贷担保类和网络贷款类机构的数量统计和交易金额分析。通过机构分布情况可以了解申请人的借贷偏好和风险集中度。建议关注机构数量过多或单一机构集中度过高的情况,这可能暗示过度借贷或特定风险。" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
|
||||
export default {
|
||||
name: 'InstitutionAnalysis',
|
||||
components: {
|
||||
LTitle,
|
||||
LRemark
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// 消费金融类机构数
|
||||
consumerFinanceInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0007)
|
||||
},
|
||||
|
||||
// 小贷担保类成功还款机构数
|
||||
smallLoanSuccessInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_t01degzbc)
|
||||
},
|
||||
|
||||
// 网络贷款类机构数(估算)
|
||||
networkLoanInstitutions() {
|
||||
const total = this.parseIntervalValue(this.data.xyp_cpl0001)
|
||||
const consumer = this.consumerFinanceInstitutions
|
||||
const smallLoan = this.parseIntervalValue(this.data.xyp_cpl0008)
|
||||
return Math.max(0, total - consumer - smallLoan)
|
||||
},
|
||||
|
||||
// 交易金额统计(最大值、最小值、平均值)
|
||||
transactionAmountStats() {
|
||||
return {
|
||||
// 近5次交易
|
||||
recent5: {
|
||||
max: this.parseIntervalValue(this.data.xyp_t01aaizzz),
|
||||
min: this.parseIntervalValue(this.data.xyp_t01abizbz),
|
||||
avg: this.parseIntervalValue(this.data.xyp_t01adizzz),
|
||||
sum: this.parseIntervalValue(this.data.xyp_t01acizzz)
|
||||
},
|
||||
// 近20次交易
|
||||
recent20: {
|
||||
max: this.parseIntervalValue(this.data.xyp_t01aajzzc),
|
||||
min: this.parseIntervalValue(this.data.xyp_t01abjzzc),
|
||||
avg: this.parseIntervalValue(this.data.xyp_t01adjzzc),
|
||||
sum: this.parseIntervalValue(this.data.xyp_t01acjzzz)
|
||||
},
|
||||
// 近50次交易
|
||||
recent50: {
|
||||
max: this.parseIntervalValue(this.data.xyp_t01aakzzz),
|
||||
min: this.parseIntervalValue(this.data.xyp_t01abkzbz),
|
||||
avg: this.parseIntervalValue(this.data.xyp_t01adkzzc),
|
||||
sum: this.parseIntervalValue(this.data.xyp_t01ackzzz)
|
||||
},
|
||||
// 近100次交易
|
||||
recent100: {
|
||||
max: this.parseIntervalValue(this.data.xyp_t01aalzzz),
|
||||
min: this.parseIntervalValue(this.data.xyp_t01ablzbc),
|
||||
avg: this.parseIntervalValue(this.data.xyp_t01adlzzc),
|
||||
sum: this.parseIntervalValue(this.data.xyp_t01aclzzz)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 机构风险评估
|
||||
highRiskInstitutions() {
|
||||
// 基于交易失败机构数估算
|
||||
return this.parseIntervalValue(this.data.xyp_t03td111) || 0
|
||||
},
|
||||
|
||||
mediumRiskInstitutions() {
|
||||
// 基于部分失败机构数估算
|
||||
const total = this.parseIntervalValue(this.data.xyp_cpl0001)
|
||||
const high = this.highRiskInstitutions
|
||||
const low = this.lowRiskInstitutions
|
||||
return Math.max(0, total - high - low)
|
||||
},
|
||||
|
||||
lowRiskInstitutions() {
|
||||
// 基于成功还款机构数
|
||||
return this.parseIntervalValue(this.data.xyp_t01degzzc) || 0
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
parseIntervalValue(value) {
|
||||
if (value === null || value === undefined || value === '') return 0
|
||||
const num = parseInt(value)
|
||||
if (isNaN(num)) return 0
|
||||
|
||||
// 根据区间值返回中位数估算
|
||||
switch (num) {
|
||||
case 1: return 2
|
||||
case 2: return 7
|
||||
case 3: return 15
|
||||
case 4: return 25
|
||||
case 5: return 35
|
||||
default: return num
|
||||
}
|
||||
},
|
||||
|
||||
formatMetricValue(value) {
|
||||
if (value === 0) return '0'
|
||||
if (value < 5) return `${value}`
|
||||
return `${value}+`
|
||||
},
|
||||
|
||||
formatAmount(value) {
|
||||
if (value === 0) return '0元'
|
||||
if (value < 1000) return `${value}元`
|
||||
if (value < 10000) return `${(value / 1000).toFixed(1)}千元`
|
||||
return `${(value / 10000).toFixed(1)}万元`
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.institution-analysis {
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
border: 1px solid #e5e7eb;
|
||||
padding: 24px;
|
||||
margin-bottom: 20px;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.section-spacing {
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.institution-analysis:hover {
|
||||
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* 表格样式 */
|
||||
.border-b:last-child {
|
||||
@apply border-b-0;
|
||||
}
|
||||
|
||||
/* 响应式设计 */
|
||||
@media (max-width: 768px) {
|
||||
.institution-analysis {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.grid {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.institution-analysis {
|
||||
padding: 12px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
715
src/ui/CJRZQ5E9F/components/LoanBehaviorAnalysis.vue
Normal file
715
src/ui/CJRZQ5E9F/components/LoanBehaviorAnalysis.vue
Normal file
@@ -0,0 +1,715 @@
|
||||
<template>
|
||||
<div class="">
|
||||
<div class="rounded-lg border border-[#99999933] mb-4">
|
||||
<div class="pb-4">
|
||||
<!-- 标题栏 -->
|
||||
<div class="flex items-center mb-4 p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/dkxwfx.png" alt="贷款行为分析" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">贷款行为分析</span>
|
||||
</div>
|
||||
|
||||
<!-- 机构类型分布 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="机构类型分布" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">不同类型贷款机构数量统计</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 消费金融类 -->
|
||||
<div class="bg-[#ECF2FD] rounded-lg p-4 border border-[#CADAF9] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">消费金融类</div>
|
||||
<div class="text-sm text-[#999999]">有场景分期贷款</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5079EA] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(consumerFinanceInstitutions) }} 家机构
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 小贷担保类 -->
|
||||
<div class="bg-[#ECF2FD] rounded-lg p-4 border border-[#CADAF9] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">小贷担保类</div>
|
||||
<div class="text-sm text-[#999999]">现金贷等小额贷款</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5079EA] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(smallLoanInstitutions) }} 家机构
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 网络贷款类 -->
|
||||
<div class="bg-[#ECF2FD] rounded-lg p-4 border border-[#CADAF9] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">网络贷款类</div>
|
||||
<div class="text-sm text-[#999999]">网络现金贷</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5079EA] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(networkLoanInstitutions) }} 家机构
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 还款表现统计 -->
|
||||
<div class="">
|
||||
<LTitle title="还款表现统计" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">历史还款成功与失败记录</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 历史成功还款 -->
|
||||
<div class="bg-[#ECF9EF] rounded-lg p-4 border border-[#CAECD3] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">历史成功还款</div>
|
||||
<div class="text-sm text-[#999999]">成功还款记录</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5EBC62] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(historicalSuccessPayments) }} 笔
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 历史交易失败 -->
|
||||
<div class="bg-[#F9ECEC] rounded-lg p-4 border border-[#F0CACA] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">历史交易失败</div>
|
||||
<div class="text-sm text-[#999999]">失败交易记录</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#D44643] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ formatMetricValue(historicalFailurePayments) }} 笔
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 整体成功率 -->
|
||||
<div class="bg-[#ECF2FD] rounded-lg p-4 border border-[#CADAF9] relative">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-[#333333] mb-1">整体成功率</div>
|
||||
<div class="text-sm text-[#999999]">还款成功比例</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-0 right-0 bg-[#5079EA] text-white px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs">
|
||||
{{ overallSuccessRate }} %
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 时间维度还款分析 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="时间维度还款分析" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">不同时间段的还款成功和失败统计</p>
|
||||
|
||||
<!-- ECharts 图表 -->
|
||||
<div class="mb-6">
|
||||
<div ref="chartRef" :style="{ width: '100%', height: '300px' }"></div>
|
||||
</div>
|
||||
|
||||
<!-- 标签页布局 -->
|
||||
<div class="">
|
||||
<div class="space-y-4">
|
||||
<div class="performance-item">
|
||||
<div class="loan-evaluation-wrap">
|
||||
<!-- 标签页 -->
|
||||
<div class="mb-3">
|
||||
<van-tabs v-model:active="activeTimePeriod" line-width="20" line-height="2"
|
||||
color="var(--color-primary)" class="loan-evaluation-tabs">
|
||||
<van-tab v-for="period in timePeriods" :key="period.name" :name="period.name"
|
||||
:title="period.name" />
|
||||
</van-tabs>
|
||||
</div>
|
||||
|
||||
<!-- 内容显示 -->
|
||||
<div class="loan-evaluation-content">
|
||||
<!-- 总笔数 -->
|
||||
<div class="text-lg text-gray-800 mb-3">
|
||||
总 <span class="font-bold">{{ currentPeriod.total }}</span> 笔
|
||||
</div>
|
||||
|
||||
<div class="space-y-3">
|
||||
<!-- 还款成功率 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">还款成功率</span>
|
||||
<span class="text-sm font-bold text-gray-800">{{ currentPeriod.successRate.toFixed(1) }}%</span>
|
||||
</div>
|
||||
<div class="h-2 rounded-full" :style="`background-color: ${getSuccessRateLightColor()}`">
|
||||
<div class="h-2 rounded-full transition-all duration-500"
|
||||
:style="`width: ${Math.max(currentPeriod.successRate, 2)}%; background-color: ${getSuccessRateColor()}`">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 成功笔数 -->
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">成功笔数</span>
|
||||
<span class="text-sm font-bold text-gray-800">{{ currentPeriod.success }} 笔</span>
|
||||
</div>
|
||||
|
||||
<!-- 失败笔数 -->
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">失败笔数</span>
|
||||
<span class="text-sm font-bold text-gray-800">{{ currentPeriod.failure }} 笔</span>
|
||||
</div>
|
||||
|
||||
<!-- 成功金额 -->
|
||||
<div class="flex justify-between items-center" v-if="currentPeriod.amounts">
|
||||
<span class="text-sm text-gray-600">成功金额</span>
|
||||
<span class="text-sm font-bold text-gray-800">{{ formatAmount(currentPeriod.amounts.success)
|
||||
}}</span>
|
||||
</div>
|
||||
|
||||
<!-- 失败金额 -->
|
||||
<div class="flex justify-between items-center" v-if="currentPeriod.amounts">
|
||||
<span class="text-sm text-gray-600">失败金额</span>
|
||||
<span class="text-sm font-bold text-gray-800">{{ formatAmount(currentPeriod.amounts.failure)
|
||||
}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 逾期行为分析 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="逾期行为分析" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">各时间段逾期情况统计</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<div class="rounded-xl p-4 relative" :class="getOverdueTimelineCardClass(item.hasOverdue)"
|
||||
v-for="item in overdueTimeline" :key="item.period">
|
||||
<div class="absolute top-0 right-0">
|
||||
<div class="px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl"
|
||||
:class="getOverdueTimelineTagClass(item.hasOverdue)">
|
||||
{{ item.hasOverdue ? '有逾期' : '无逾期' }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<div class="w-10 h-10 mr-4">
|
||||
<img :src="getOverdueTimelineIcon(item.hasOverdue)" :alt="item.hasOverdue ? '有逾期' : '无逾期'"
|
||||
class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="font-bold text-gray-800">{{ item.period }}</div>
|
||||
<div class="text-sm text-[#999999] mt-1">{{ item.description }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 当前逾期详情 -->
|
||||
<div class="mb-6" v-if="hasCurrentOverdue">
|
||||
<LTitle title="当前逾期提醒" class="mb-2" />
|
||||
<p class="text-gray-400 text-sm mb-4 px-4">需要立即处理的逾期情况</p>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 px-4">
|
||||
<div class="bg-[#F9ECEC] rounded-lg p-4 border border-[#F0CACA]">
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-[#999999] text-sm">逾期机构数量</span>
|
||||
<span class="font-bold text-[#D44643] text-lg">{{ formatMetricValue(currentOverdueInstitutions) }}家</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-[#F9ECEC] rounded-lg p-4 border border-[#F0CACA]">
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-[#999999] text-sm">逾期金额</span>
|
||||
<span class="font-bold text-[#D44643] text-lg">{{ formatAmount(currentOverdueAmount) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<LRemark
|
||||
content="贷款行为分析通过多维度数据展示申请人的借贷行为模式,包括机构类型分布、交易金额分析、申请频率统计和风险事件分析。消费金融类、小贷担保类和网络贷款类机构的数据分别统计,有助于了解申请人的借贷偏好。建议重点关注短期内频繁申请和大额借贷行为,这可能暗示资金紧张或过度借贷风险。分析结果可为风险评估提供重要参考。" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
import * as echarts from 'echarts'
|
||||
|
||||
export default {
|
||||
name: 'LoanBehaviorAnalysis',
|
||||
components: {
|
||||
LTitle,
|
||||
LRemark
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
chartInstance: null,
|
||||
activeTimePeriod: '最近1天'
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// 平均成功率
|
||||
averageSuccessRate() {
|
||||
if (this.timePeriods.length === 0) return 0
|
||||
const totalRate = this.timePeriods.reduce((sum, period) => sum + period.successRate, 0)
|
||||
return totalRate / this.timePeriods.length
|
||||
},
|
||||
|
||||
// 最高成功率
|
||||
maxSuccessRate() {
|
||||
if (this.timePeriods.length === 0) return 0
|
||||
return Math.max(...this.timePeriods.map(period => period.successRate))
|
||||
},
|
||||
|
||||
// 最低成功率
|
||||
minSuccessRate() {
|
||||
if (this.timePeriods.length === 0) return 0
|
||||
return Math.min(...this.timePeriods.map(period => period.successRate))
|
||||
},
|
||||
|
||||
// 机构类型统计
|
||||
consumerFinanceInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0007)
|
||||
},
|
||||
smallLoanInstitutions() {
|
||||
// 通过总机构数减去消费金融和网络贷款推算
|
||||
const total = this.parseIntervalValue(this.data.xyp_cpl0001)
|
||||
const consumer = this.consumerFinanceInstitutions
|
||||
const network = this.networkLoanInstitutions
|
||||
return Math.max(0, total - consumer - network)
|
||||
},
|
||||
networkLoanInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0008)
|
||||
},
|
||||
|
||||
// 机构类型比例
|
||||
totalInstitutions() {
|
||||
return this.consumerFinanceInstitutions + this.smallLoanInstitutions + this.networkLoanInstitutions || 1
|
||||
},
|
||||
consumerFinanceRatio() {
|
||||
return this.consumerFinanceInstitutions / this.totalInstitutions
|
||||
},
|
||||
smallLoanRatio() {
|
||||
return this.smallLoanInstitutions / this.totalInstitutions
|
||||
},
|
||||
networkLoanRatio() {
|
||||
return this.networkLoanInstitutions / this.totalInstitutions
|
||||
},
|
||||
|
||||
// 还款表现统计
|
||||
historicalSuccessPayments() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0014)
|
||||
},
|
||||
historicalFailurePayments() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0015)
|
||||
},
|
||||
overallSuccessRate() {
|
||||
const total = this.historicalSuccessPayments + this.historicalFailurePayments
|
||||
if (total === 0) return 0
|
||||
return Math.round((this.historicalSuccessPayments / total) * 100)
|
||||
},
|
||||
|
||||
// 时间维度分析
|
||||
timePeriods() {
|
||||
return [
|
||||
{
|
||||
name: '最近1天',
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0017),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0016),
|
||||
amounts: {
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0033),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0032)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '最近7天',
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0019),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0018),
|
||||
amounts: {
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0035),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0034)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '最近14天',
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0021),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0020),
|
||||
amounts: {
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0037),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0036)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '最近21天',
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0064),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0065),
|
||||
amounts: {
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0067),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0066)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '最近30天',
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0023),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0022),
|
||||
amounts: {
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0039),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0038)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '最近90天',
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0025),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0024),
|
||||
amounts: {
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0041),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0040)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '最近180天',
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0027),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0026),
|
||||
amounts: {
|
||||
success: this.parseIntervalValue(this.data.xyp_cpl0043),
|
||||
failure: this.parseIntervalValue(this.data.xyp_cpl0042)
|
||||
}
|
||||
}
|
||||
].map(period => {
|
||||
const total = period.success + period.failure || 1
|
||||
return {
|
||||
...period,
|
||||
total,
|
||||
successRate: (period.success / total) * 100,
|
||||
failureRate: (period.failure / total) * 100
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 逾期时间线
|
||||
overdueTimeline() {
|
||||
return [
|
||||
{
|
||||
period: '最近1天',
|
||||
hasOverdue: this.data.xyp_cpl0028 === '1',
|
||||
description: this.data.xyp_cpl0028 === '1' ? '检测到逾期行为' : '无逾期记录'
|
||||
},
|
||||
{
|
||||
period: '最近7天',
|
||||
hasOverdue: this.data.xyp_cpl0029 === '1',
|
||||
description: this.data.xyp_cpl0029 === '1' ? '检测到逾期行为' : '无逾期记录'
|
||||
},
|
||||
{
|
||||
period: '最近14天',
|
||||
hasOverdue: this.data.xyp_cpl0030 === '1',
|
||||
description: this.data.xyp_cpl0030 === '1' ? '检测到逾期行为' : '无逾期记录'
|
||||
},
|
||||
{
|
||||
period: '最近30天',
|
||||
hasOverdue: this.data.xyp_cpl0031 === '1',
|
||||
description: this.data.xyp_cpl0031 === '1' ? '检测到逾期行为' : '无逾期记录'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// 当前逾期状态
|
||||
hasCurrentOverdue() {
|
||||
return this.data.xyp_cpl0044 === '1'
|
||||
},
|
||||
currentOverdueInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0071)
|
||||
},
|
||||
currentOverdueAmount() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0072)
|
||||
},
|
||||
|
||||
// 当前选中的时间段
|
||||
currentPeriod() {
|
||||
return this.timePeriods.find(p => p.name === this.activeTimePeriod) || this.timePeriods[0]
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.initChart()
|
||||
window.addEventListener('resize', this.handleResize)
|
||||
},
|
||||
|
||||
beforeUnmount() {
|
||||
if (this.chartInstance) {
|
||||
this.chartInstance.dispose()
|
||||
this.chartInstance = null
|
||||
}
|
||||
window.removeEventListener('resize', this.handleResize)
|
||||
},
|
||||
|
||||
watch: {
|
||||
timePeriods() {
|
||||
this.updateChart()
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
initChart() {
|
||||
if (!this.$refs.chartRef) return
|
||||
this.chartInstance = echarts.init(this.$refs.chartRef)
|
||||
this.updateChart()
|
||||
},
|
||||
|
||||
updateChart() {
|
||||
if (!this.chartInstance) return
|
||||
|
||||
const option = {
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'shadow'
|
||||
},
|
||||
formatter: (params) => {
|
||||
const data = params[0]
|
||||
const period = this.timePeriods[data.dataIndex]
|
||||
return `${data.name}<br/>成功率: ${period.successRate.toFixed(1)}%<br/>${period.success}/${period.total}笔`
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '15%',
|
||||
top: '5%',
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: this.timePeriods.map(p => p.name),
|
||||
axisLabel: {
|
||||
rotate: 45,
|
||||
fontSize: 12,
|
||||
color: '#666'
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#e0e0e0'
|
||||
}
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
max: 100,
|
||||
axisLabel: {
|
||||
formatter: '{value}%',
|
||||
fontSize: 12,
|
||||
color: '#666'
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#e0e0e0'
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: '#f0f0f0'
|
||||
}
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '还款成功率',
|
||||
type: 'bar',
|
||||
data: this.timePeriods.map(p => Math.max(p.successRate, 2)),
|
||||
barWidth: '25%',
|
||||
barMinHeight: 2,
|
||||
itemStyle: {
|
||||
color: '#10b981',
|
||||
borderRadius: [4, 4, 0, 0]
|
||||
},
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
formatter: (params) => {
|
||||
const period = this.timePeriods[params.dataIndex]
|
||||
return period.successRate > 0 ? `${period.successRate.toFixed(1)}%` : '0%'
|
||||
},
|
||||
fontSize: 11,
|
||||
color: '#333'
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
this.chartInstance.setOption(option)
|
||||
},
|
||||
|
||||
handleResize() {
|
||||
if (this.chartInstance) {
|
||||
this.chartInstance.resize()
|
||||
}
|
||||
},
|
||||
|
||||
getSuccessRateColor() {
|
||||
const rate = this.currentPeriod.successRate
|
||||
if (rate >= 80) return '#10b981'
|
||||
if (rate >= 60) return '#f59e0b'
|
||||
return '#ef4444'
|
||||
},
|
||||
|
||||
getSuccessRateLightColor() {
|
||||
const rate = this.currentPeriod.successRate
|
||||
if (rate >= 80) return '#E8F8F0'
|
||||
if (rate >= 60) return '#FEF3C7'
|
||||
return '#FEE2E2'
|
||||
},
|
||||
|
||||
getOverdueTimelineCardClass(hasOverdue) {
|
||||
if (hasOverdue) return 'bg-[#FFF0F0] border border-red-200'
|
||||
return 'bg-[#F0FFF0] border border-green-200'
|
||||
},
|
||||
|
||||
getOverdueTimelineTagClass(hasOverdue) {
|
||||
if (hasOverdue) return 'bg-[#E53935]'
|
||||
return 'bg-[#4CAF50]'
|
||||
},
|
||||
|
||||
getOverdueTimelineIcon(hasOverdue) {
|
||||
if (hasOverdue) return new URL('@/assets/images/report/gfx.png', import.meta.url).href
|
||||
return new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
},
|
||||
|
||||
parseIntervalValue(value) {
|
||||
if (!value || value === '' || value === '-1') return 0
|
||||
const num = parseInt(value)
|
||||
if (isNaN(num)) return 0
|
||||
|
||||
// 根据区间映射返回大致范围的中值
|
||||
switch (num) {
|
||||
case 1: return 1
|
||||
case 2: return 3
|
||||
case 3: return 7
|
||||
case 4: return 15
|
||||
case 5: return 25
|
||||
default: return num
|
||||
}
|
||||
},
|
||||
|
||||
formatMetricValue(value) {
|
||||
if (value === 0) return '0'
|
||||
if (value < 5) return `${value}`
|
||||
return `${value}+`
|
||||
},
|
||||
|
||||
formatAmount(value) {
|
||||
if (value === 0) return '0元'
|
||||
if (value < 1000) return `${value}元`
|
||||
if (value < 10000) return `${(value / 1000).toFixed(1)}千元`
|
||||
return `${(value / 10000).toFixed(1)}万元`
|
||||
},
|
||||
|
||||
getSliceStyle(ratio, startAngle) {
|
||||
const angle = ratio * 360
|
||||
return {
|
||||
'--start-angle': `${startAngle * 360}deg`,
|
||||
'--end-angle': `${(startAngle + ratio) * 360}deg`,
|
||||
'--slice-percent': `${ratio * 100}%`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.loan-behavior-analysis {
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
border: 1px solid #e5e7eb;
|
||||
padding: 24px;
|
||||
margin-bottom: 20px;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.section-spacing {
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.loan-behavior-analysis:hover {
|
||||
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* 标签页样式 */
|
||||
.loan-evaluation-tabs {}
|
||||
|
||||
.loan-evaluation-tabs :deep(.van-tabs__wrap) {
|
||||
height: 32px !important;
|
||||
background-color: transparent !important;
|
||||
padding: 0 !important;
|
||||
border-bottom: 1px solid #DDDDDD !important;
|
||||
}
|
||||
|
||||
.loan-evaluation-tabs :deep(.van-tabs__nav) {
|
||||
background-color: transparent !important;
|
||||
gap: 0;
|
||||
height: 32px !important;
|
||||
}
|
||||
|
||||
.loan-evaluation-tabs :deep(.van-tab) {
|
||||
color: #999999 !important;
|
||||
font-size: 14px !important;
|
||||
font-weight: 400 !important;
|
||||
}
|
||||
|
||||
.loan-evaluation-tabs :deep(.van-tab--active) {
|
||||
color: var(--van-theme-primary) !important;
|
||||
background-color: unset !important;
|
||||
}
|
||||
|
||||
.loan-evaluation-tabs :deep(.van-tabs__line) {
|
||||
height: 2px !important;
|
||||
border-radius: 1px !important;
|
||||
}
|
||||
|
||||
/* 内容区域样式 */
|
||||
.loan-evaluation-wrap {
|
||||
@apply mx-4 my-1;
|
||||
border: 1px solid #DDDDDD;
|
||||
background-color: #F9F9F9;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.loan-evaluation-content {
|
||||
padding: 8px 16px;
|
||||
}
|
||||
|
||||
/* 响应式设计 */
|
||||
@media (max-width: 768px) {
|
||||
.loan-behavior-analysis {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.grid {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.loan-behavior-analysis {
|
||||
padding: 12px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
414
src/ui/CJRZQ5E9F/components/RiskAdvice.vue
Normal file
414
src/ui/CJRZQ5E9F/components/RiskAdvice.vue
Normal file
@@ -0,0 +1,414 @@
|
||||
<template>
|
||||
<div class="rounded-lg border border-[#99999933] mb-4">
|
||||
<!-- 标题栏 -->
|
||||
<div class="flex items-center p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/zyjy.png" alt="专业建议" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">专业建议</span>
|
||||
</div>
|
||||
|
||||
<!-- 风险评估结论 -->
|
||||
<div class="mb-6 px-4">
|
||||
<div class="rounded-xl p-4 relative border" :class="overallRiskLevel.bgClass">
|
||||
<!-- 风险分标签 -->
|
||||
<div
|
||||
class="absolute top-0 right-0 px-3 py-1 rounded-bl-lg rounded-tr-lg text-sm font-bold text-white whitespace-nowrap"
|
||||
:class="getRiskBadgeClass()">
|
||||
风险分:{{ overallRiskScore }}
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-4 mb-3">
|
||||
<div class="w-10 h-10 flex-shrink-0">
|
||||
<img :src="getRiskIcon()" :alt="overallRiskLevel.title" class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<h3 class="text-base font-bold text-[#333333]">{{ overallRiskLevel.title }}</h3>
|
||||
<p class="text-sm text-[#999999]">{{ overallRiskLevel.subtitle }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-sm text-[#333333] leading-relaxed">
|
||||
{{ overallRiskLevel.description }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 关键建议 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="关键建议" class="mb-2" />
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<div class="rounded-xl p-4 relative" v-for="recommendation in keyRecommendations" :key="recommendation.id"
|
||||
:class="getRecommendationCardClass(recommendation.priority)">
|
||||
<!-- 优先级标签 -->
|
||||
<div class="absolute top-0 right-0 px-2 py-1 rounded-bl-lg rounded-tr-lg text-xs font-bold text-white"
|
||||
:class="getRecommendationBadgeClass(recommendation.priority)">
|
||||
{{ recommendation.priorityText }}
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-10 h-10 flex-shrink-0">
|
||||
<img :src="getRecommendationIcon(recommendation.priority)" :alt="recommendation.title"
|
||||
class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1 min-w-0">
|
||||
<h4 class="text-base font-bold text-[#333333] mb-2">{{ recommendation.title }}</h4>
|
||||
<p class="text-sm text-[#999999] mb-3 leading-relaxed">{{ recommendation.description }}</p>
|
||||
<div class="flex flex-wrap gap-2" v-if="recommendation.actions.length > 0">
|
||||
<span class="inline-flex items-center px-3 py-1 rounded-xl text-sm"
|
||||
:class="getRecommendationActionClass(recommendation.priority)"
|
||||
v-for="action in recommendation.actions.slice(0, 3)" :key="action">
|
||||
{{ action }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<!-- <div class="px-4 pb-4">
|
||||
<LRemark
|
||||
content="专业建议基于综合风险评估结果,为不同风险等级的申请人提供针对性的审核廊议和风险管控措施。建议内容包括关键建议、风险管控措施、注意事项和后续跟进等方面。系统会根据当前风险等级动态调整建议内容,但最终决策仍需结合具体业务情况和风险政策进行综合判断。建议定期复评风险状况和调整风险管控策略。" />
|
||||
</div> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
|
||||
export default {
|
||||
name: 'RiskAdvice',
|
||||
components: {
|
||||
LTitle,
|
||||
LRemark
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// 综合风险评估
|
||||
overallRiskScore() {
|
||||
const creditScore = parseFloat(this.data.xyp_cpl0081) || 0
|
||||
const amountIndex = parseFloat(this.data.xyp_cpl0082) || 0
|
||||
const countIndex = parseFloat(this.data.xyp_cpl0083) || 0
|
||||
|
||||
// 风险分数 (0-100, 分数越高风险越低)
|
||||
const avgRisk = (creditScore + amountIndex + countIndex) / 3
|
||||
return Math.round((1 - avgRisk) * 100)
|
||||
},
|
||||
|
||||
overallRiskLevel() {
|
||||
const score = this.overallRiskScore
|
||||
const hasCurrentOverdue = this.data.xyp_cpl0044 === '1'
|
||||
const hasRecentOverdue = this.data.xyp_cpl0028 === '1' || this.data.xyp_cpl0029 === '1'
|
||||
|
||||
if (hasCurrentOverdue || score < 30) {
|
||||
return {
|
||||
title: '高风险用户',
|
||||
subtitle: '需要立即关注',
|
||||
description: '当前信用状况较差,建议立即处理逾期问题并暂停新申请。',
|
||||
bgClass: 'bg-red-50 border-red-200',
|
||||
iconBg: 'bg-red-500',
|
||||
iconComponent: 'ExclamationTriangleIcon'
|
||||
}
|
||||
} else if (hasRecentOverdue || score < 60) {
|
||||
return {
|
||||
title: '中风险用户',
|
||||
subtitle: '需要改善',
|
||||
description: '信用状况一般,建议优化还款表现并控制申请频率。',
|
||||
bgClass: 'bg-yellow-50 border-yellow-200',
|
||||
iconBg: 'bg-yellow-500',
|
||||
iconComponent: 'ExclamationCircleIcon'
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
title: '低风险用户',
|
||||
subtitle: '状况良好',
|
||||
description: '信用状况良好,建议继续保持良好的还款习惯。',
|
||||
bgClass: 'bg-green-50 border-green-200',
|
||||
iconBg: 'bg-green-500',
|
||||
iconComponent: 'CheckCircleIcon'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 关键建议
|
||||
keyRecommendations() {
|
||||
const recommendations = []
|
||||
|
||||
// 当前逾期处理
|
||||
if (this.data.xyp_cpl0044 === '1') {
|
||||
recommendations.push({
|
||||
id: 'handle_overdue',
|
||||
title: '立即处理逾期',
|
||||
description: '尽快联系机构协商还款,避免影响征信。',
|
||||
priority: 'urgent',
|
||||
priorityText: '紧急',
|
||||
iconComponent: 'ExclamationTriangleIcon',
|
||||
iconBg: 'bg-red-500',
|
||||
borderClass: 'border-l-red-500',
|
||||
badgeClass: 'bg-red-100 text-red-800',
|
||||
actions: [
|
||||
'联系机构协商',
|
||||
'优先还小额',
|
||||
'制定还款计划'
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
// 高频申请警告
|
||||
const recent1Day = this.parseIntervalValue(this.data.xyp_cpl0070)
|
||||
const recent7Day = this.parseIntervalValue(this.data.xyp_cpl0009)
|
||||
if (recent1Day > 0 || recent7Day > 5) {
|
||||
recommendations.push({
|
||||
id: 'reduce_applications',
|
||||
title: '控制申请频率',
|
||||
description: '近期申请过频,建议暂停新申请3-6个月。',
|
||||
priority: 'high',
|
||||
priorityText: '重要',
|
||||
iconComponent: 'PauseCircleIcon',
|
||||
iconBg: 'bg-orange-500',
|
||||
borderClass: 'border-l-orange-500',
|
||||
badgeClass: 'bg-orange-100 text-orange-800',
|
||||
actions: [
|
||||
'暂停新申请',
|
||||
'整理现有贷款',
|
||||
'制定资金规划'
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
// 还款表现改善
|
||||
const successRate = parseFloat(this.data.xyp_cpl0080) || 0
|
||||
const recent5SuccessRate = parseFloat(this.data.xyp_cpl0074) || 0
|
||||
const recent20SuccessRate = parseFloat(this.data.xyp_t0400002) || 0
|
||||
|
||||
if (successRate < 0.8 || recent5SuccessRate < 0.8 || recent20SuccessRate < 0.8) {
|
||||
recommendations.push({
|
||||
id: 'improve_repayment',
|
||||
title: '提升还款表现',
|
||||
description: `还款成功率偏低,建议设置自动还款。`,
|
||||
priority: 'high',
|
||||
priorityText: '重要',
|
||||
iconComponent: 'CalendarIcon',
|
||||
iconBg: 'bg-blue-500',
|
||||
borderClass: 'border-l-blue-500',
|
||||
badgeClass: 'bg-blue-100 text-blue-800',
|
||||
actions: [
|
||||
'设置自动还款',
|
||||
'确保账户余额',
|
||||
'按时还款'
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
// 机构数量管理
|
||||
const totalInstitutions = this.parseIntervalValue(this.data.xyp_cpl0001)
|
||||
if (totalInstitutions > 10) {
|
||||
recommendations.push({
|
||||
id: 'manage_institutions',
|
||||
title: '优化机构数量',
|
||||
description: '机构数量较多,建议优先结清小额贷款。',
|
||||
priority: 'medium',
|
||||
priorityText: '建议',
|
||||
iconComponent: 'AdjustmentsIcon',
|
||||
iconBg: 'bg-purple-500',
|
||||
borderClass: 'border-l-purple-500',
|
||||
badgeClass: 'bg-purple-100 text-purple-800',
|
||||
actions: [
|
||||
'结清小额贷款',
|
||||
'合并同类贷款',
|
||||
'控制新增机构'
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
// 交易失败后恢复分析
|
||||
const consumerFailureRecoveryDays = this.parseIntervalValue(this.data.xyp_cpl0054)
|
||||
const smallLoanFailureRecoveryDays = this.parseIntervalValue(this.data.xyp_cpl0055)
|
||||
const overallFailureRecoveryDays = this.parseIntervalValue(this.data.xyp_cpl0056)
|
||||
|
||||
if (consumerFailureRecoveryDays > 30 || smallLoanFailureRecoveryDays > 30 || overallFailureRecoveryDays > 30) {
|
||||
recommendations.push({
|
||||
id: 'improve_recovery_time',
|
||||
title: '快速恢复能力',
|
||||
description: '失败后恢复较慢,建议建立应急资金。',
|
||||
priority: 'medium',
|
||||
priorityText: '建议',
|
||||
iconComponent: 'ClockIcon',
|
||||
iconBg: 'bg-indigo-500',
|
||||
borderClass: 'border-l-indigo-500',
|
||||
badgeClass: 'bg-indigo-100 text-indigo-800',
|
||||
actions: [
|
||||
'建立应急资金',
|
||||
'优化资金流',
|
||||
'快速处理失败'
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
// 信用修复
|
||||
const settledInstitutions = this.parseIntervalValue(this.data.xyp_cpl0002)
|
||||
if (settledInstitutions > 0) {
|
||||
recommendations.push({
|
||||
id: 'credit_repair',
|
||||
title: '继续信用修复',
|
||||
description: '已有良好结清记录,建议继续保持。',
|
||||
priority: 'medium',
|
||||
priorityText: '建议',
|
||||
iconComponent: 'TrendingUpIcon',
|
||||
iconBg: 'bg-green-500',
|
||||
borderClass: 'border-l-green-500',
|
||||
badgeClass: 'bg-green-100 text-green-800',
|
||||
actions: [
|
||||
'保持还款记录',
|
||||
'结清剩余贷款',
|
||||
'稳定收入来源'
|
||||
]
|
||||
})
|
||||
}
|
||||
|
||||
return recommendations
|
||||
},
|
||||
|
||||
// 改善步骤
|
||||
improvementSteps() {
|
||||
const steps = []
|
||||
|
||||
if (this.data.xyp_cpl0044 === '1') {
|
||||
steps.push({
|
||||
id: 'immediate_action',
|
||||
title: '立即行动期',
|
||||
description: '处理逾期问题,停止新申请',
|
||||
duration: '1-2周',
|
||||
impact: '高',
|
||||
badgeClass: 'bg-red-100 text-red-800'
|
||||
})
|
||||
}
|
||||
|
||||
steps.push({
|
||||
id: 'stabilization',
|
||||
title: '稳定期',
|
||||
description: '建立稳定还款计划,按时还款',
|
||||
duration: '3-6个月',
|
||||
impact: '中',
|
||||
badgeClass: 'bg-yellow-100 text-yellow-800'
|
||||
})
|
||||
|
||||
steps.push({
|
||||
id: 'optimization',
|
||||
title: '优化期',
|
||||
description: '减少机构数量,优化债务结构',
|
||||
duration: '6-12个月',
|
||||
impact: '中',
|
||||
badgeClass: 'bg-yellow-100 text-yellow-800'
|
||||
})
|
||||
|
||||
steps.push({
|
||||
id: 'recovery',
|
||||
title: '恢复期',
|
||||
description: '建立良好信用记录,恢复信用状况',
|
||||
duration: '12-24个月',
|
||||
impact: '高',
|
||||
badgeClass: 'bg-green-100 text-green-800'
|
||||
})
|
||||
|
||||
return steps
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
parseIntervalValue(value) {
|
||||
if (!value || value === '' || value === '-1') return 0
|
||||
const num = parseInt(value)
|
||||
if (isNaN(num)) return 0
|
||||
|
||||
// 根据区间映射返回大致范围的中值
|
||||
switch (num) {
|
||||
case 1: return 1
|
||||
case 2: return 3
|
||||
case 3: return 7
|
||||
case 4: return 15
|
||||
case 5: return 25
|
||||
default: return num
|
||||
}
|
||||
},
|
||||
|
||||
getRiskIcon() {
|
||||
// 根据风险等级返回对应的图标
|
||||
if (this.overallRiskLevel.iconComponent === 'ExclamationTriangleIcon') {
|
||||
return new URL('@/assets/images/report/gfx.png', import.meta.url).href
|
||||
} else if (this.overallRiskLevel.iconComponent === 'ExclamationCircleIcon') {
|
||||
return new URL('@/assets/images/report/zfx.png', import.meta.url).href
|
||||
} else {
|
||||
return new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
}
|
||||
},
|
||||
|
||||
getRiskBadgeClass() {
|
||||
// 根据风险等级返回徽章样式
|
||||
if (this.overallRiskLevel.iconComponent === 'ExclamationTriangleIcon') {
|
||||
return 'bg-[#D44643]'
|
||||
} else if (this.overallRiskLevel.iconComponent === 'ExclamationCircleIcon') {
|
||||
return 'bg-[#F5A623]'
|
||||
} else {
|
||||
return 'bg-[#5EBC62]'
|
||||
}
|
||||
},
|
||||
|
||||
getRecommendationCardClass(priority) {
|
||||
// 根据优先级返回卡片样式
|
||||
if (priority === 'urgent') {
|
||||
return 'bg-[#FFF0F0] border border-[#F0CACA]'
|
||||
} else if (priority === 'high') {
|
||||
return 'bg-[#ECF2FD] border border-[#CADAF9]'
|
||||
} else {
|
||||
return 'bg-[#F0FFF0] border border-green-200'
|
||||
}
|
||||
},
|
||||
|
||||
getRecommendationIcon(priority) {
|
||||
// 根据优先级返回图标
|
||||
if (priority === 'urgent') {
|
||||
return new URL('@/assets/images/report/gfx.png', import.meta.url).href
|
||||
} else if (priority === 'high') {
|
||||
return new URL('@/assets/images/report/wxts_icon.png', import.meta.url).href
|
||||
} else {
|
||||
return new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
}
|
||||
},
|
||||
|
||||
getRecommendationBadgeClass(priority) {
|
||||
// 根据优先级返回徽章样式
|
||||
if (priority === 'urgent') {
|
||||
return 'bg-[#D44643]'
|
||||
} else if (priority === 'high') {
|
||||
return 'bg-[#5079EA]'
|
||||
} else {
|
||||
return 'bg-[#5EBC62]'
|
||||
}
|
||||
},
|
||||
|
||||
getRecommendationActionClass(priority) {
|
||||
// 根据优先级返回操作按钮样式
|
||||
if (priority === 'urgent') {
|
||||
return 'bg-[#F0CACA] text-[#D44643]'
|
||||
} else if (priority === 'high') {
|
||||
return 'bg-[#DBE6FC] text-[#2B79EE]'
|
||||
} else {
|
||||
return 'bg-green-200 text-[#5EBC62]'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 组件样式已使用 Tailwind CSS */
|
||||
</style>
|
||||
638
src/ui/CJRZQ5E9F/components/RiskIndicators.vue
Normal file
638
src/ui/CJRZQ5E9F/components/RiskIndicators.vue
Normal file
@@ -0,0 +1,638 @@
|
||||
<template>
|
||||
<div class="rounded-lg border border-[#99999933] mb-4">
|
||||
<!-- 标题栏 -->
|
||||
<div class="flex items-center mb-4 p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/fxzbxq.png" alt="风险指标详情" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">风险指标详情</span>
|
||||
</div>
|
||||
|
||||
<!-- 核心风险指标 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="核心风险指标" class="mb-2" />
|
||||
<p class="text-xs text-[#999999] px-4 mb-3">关键风险评估指标汇总</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 警示指标 -->
|
||||
<div class="bg-[#F9F5ED] border border-[#F0E2CB] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] border-b border-[#F0E2CB] px-4 py-2">警示指标</h4>
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">最近1天申请机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatMetricValue(recent1DayInstitutions) }}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">最近7天申请机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatMetricValue(recent7DayInstitutions) }}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">履约金额指数</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ (amountComplianceIndex * 100).toFixed(0) }}%</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">履约笔数指数</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ (countComplianceIndex * 100).toFixed(0) }}%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 正面指标 -->
|
||||
<div class="bg-[#ECF9EF] border border-[#CAECD3] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#CAECD3]">正面指标</h4>
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">已结清机构数</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatMetricValue(settledInstitutions) }}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">信用贷款时长</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatDays(creditLoanDuration) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">历史成功还款</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatMetricValue(historicalSuccessPayments)
|
||||
}}笔</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 交易失败后还款分析 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="交易失败后还款分析" class="mb-2" />
|
||||
<p class="text-xs text-[#999999] px-4 mb-3">失败后的恢复能力评估</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 失败后还款次数 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">失败后还款次数</h4>
|
||||
<div class="space-y-3 p-4">
|
||||
<div class="flex items-center gap-3">
|
||||
<span class="text-sm text-[#999999] min-w-20">已结清机构数</span>
|
||||
<div class="flex-1 h-2 bg-[#E3EFFD] rounded-full overflow-hidden">
|
||||
<div class="h-full bg-[#2B79EE] rounded-full transition-all duration-300"
|
||||
:style="`width: ${Math.max(getRecoveryPercentage(consumerFailureRecovery), 2)}%`"></div>
|
||||
</div>
|
||||
<span class="text-base font-bold text-[#333333] min-w-12 text-right">{{
|
||||
formatMetricValue(consumerFailureRecovery) }}次</span>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
<span class="text-sm text-[#999999] min-w-20">信用贷款时长</span>
|
||||
<div class="flex-1 h-2 bg-[#E3EFFD] rounded-full overflow-hidden">
|
||||
<div class="h-full bg-[#2B79EE] rounded-full transition-all duration-300"
|
||||
:style="`width: ${Math.max(getRecoveryPercentage(smallLoanFailureRecovery), 2)}%`"></div>
|
||||
</div>
|
||||
<span class="text-base font-bold text-[#333333] min-w-12 text-right">{{
|
||||
formatMetricValue(smallLoanFailureRecovery) }}次</span>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
<span class="text-sm text-[#999999] min-w-20">历史成功还款</span>
|
||||
<div class="flex-1 h-2 bg-[#E3EFFD] rounded-full overflow-hidden">
|
||||
<div class="h-full bg-[#2B79EE] rounded-full transition-all duration-300"
|
||||
:style="`width: ${Math.max(getRecoveryPercentage(overallFailureRecovery), 2)}%`"></div>
|
||||
</div>
|
||||
<span class="text-base font-bold text-[#333333] min-w-12 text-right">{{
|
||||
formatMetricValue(overallFailureRecovery) }}次</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 恢复时间分析 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">恢复时间分析</h4>
|
||||
<div class="p-4">
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<span class="text-sm text-[#999999]">平均恢复时间</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatDays(avgRecoveryTime) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between text-sm text-[#999999]">
|
||||
<span>最短: {{ formatDays(minRecoveryTime) }}</span>
|
||||
<span>最长: {{ formatDays(maxRecoveryTime) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 比例指标分析 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="比例指标分析" class="mb-2" />
|
||||
<p class="text-xs text-[#999999] px-4 mb-3">各类交易行为的比例统计</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 金额比例指标 -->
|
||||
<div class="text-base font-bold text-[#333333]">金额比例指标</div>
|
||||
<div class="space-y-3">
|
||||
<div v-for="item in amountRatios" :key="item.id">
|
||||
<div class="bg-[#ECF2FD] border border-[#CADAF9] rounded-xl p-4">
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<span class="text-base font-bold text-[#333333]">{{ item.name }}</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ (item.ratio * 100).toFixed(1) }}%</span>
|
||||
</div>
|
||||
<div class="h-2 bg-[#DBE6FC] rounded-full overflow-hidden mb-1.5">
|
||||
<div class="h-full rounded-full transition-all duration-300"
|
||||
:style="`width: ${Math.max(item.ratio * 100, 2)}%; background-color: #5079EA;`"></div>
|
||||
</div>
|
||||
<div class="text-sm text-[#999999]">{{ item.description }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 笔数比例指标 -->
|
||||
<div class="text-base font-bold text-[#333333]">笔数比例指标</div>
|
||||
<div class="space-y-3">
|
||||
<div v-for="item in countRatios" :key="item.id">
|
||||
<div class="rounded-xl p-4" :class="getRatioCardClass(item.id)">
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<span class="text-base font-bold text-[#333333]">{{ item.name }}</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ (item.ratio * 100).toFixed(1) }}%</span>
|
||||
</div>
|
||||
<div class="h-2 rounded-full overflow-hidden mb-1.5" :class="getRatioBarBgClass(item.id)">
|
||||
<div class="h-full rounded-full transition-all duration-300"
|
||||
:style="`width: ${Math.max(item.ratio * 100, 2)}%; background-color: ${getRatioBarColor(item.id)};`">
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-sm text-[#999999]">{{ item.description }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 特殊指标 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="特殊指标" class="mb-2" />
|
||||
<p class="text-xs text-[#999999] px-4 mb-3">其他重要风险评估指标</p>
|
||||
|
||||
<div class="space-y-3 px-4">
|
||||
<!-- 时间相关指标 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">时间相关指标</h4>
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">最近一次交易距今</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatDays(lastTransactionDays) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">最近一次还款距今</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatDays(lastRepaymentDays) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">信用贷款总时长</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatDays(creditLoanDuration) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 交易失败机构 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">交易失败机构</h4>
|
||||
<div class="p-4">
|
||||
<div class="space-y-2" v-for="item in failureInstitutionTimeline" :key="item.period">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">{{ item.period }}</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatMetricValue(item.count) }}家</span>
|
||||
</div>
|
||||
<div class="h-2 bg-[#E3EFFD] rounded-full overflow-hidden">
|
||||
<div class="h-full rounded-full transition-all duration-300 bg-[#2B79EE]"
|
||||
:style="`width: ${Math.max(item.percentage, 2)}%`"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 新增机构比例 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">新增机构比例</h4>
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center" v-for="item in newInstitutionRatios" :key="item.period">
|
||||
<span class="text-sm text-[#999999]">{{ item.period }}</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ (item.ratio * 100).toFixed(0) }}%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 交易金额统计 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">交易金额统计</h4>
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">近90天最大交易金额</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatAmount(parseIntervalValue(data.xyp_t01aafzzz))
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">近90天最小交易金额</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatAmount(parseIntervalValue(data.xyp_t01abfzzz))
|
||||
}}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">近90天平均交易金额</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{ formatAmount(parseIntervalValue(data.xyp_t01adfzzz))
|
||||
}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 机构去重统计 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">机构去重统计</h4>
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">近20次交易还款成功机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{
|
||||
formatMetricValue(parseIntervalValue(data.xyp_t01dejzzc)) }}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">近50次交易还款成功机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{
|
||||
formatMetricValue(parseIntervalValue(data.xyp_t01dekzzc)) }}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">近100次交易还款成功机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{
|
||||
formatMetricValue(parseIntervalValue(data.xyp_t01delzzc)) }}家</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 特殊风险指标 -->
|
||||
<div class="bg-[#F9F9F9] border border-[#EEEEEE] rounded-xl">
|
||||
<h4 class="text-base font-bold text-[#333333] px-4 py-2 border-b border-[#EEEEEE]">特殊风险指标</h4>
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">最近90天交易失败机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{
|
||||
formatMetricValue(parseIntervalValue(data.xyp_t03td111))
|
||||
}}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">最近180天交易失败机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{
|
||||
formatMetricValue(parseIntervalValue(data.xyp_t03td115))
|
||||
}}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-[#999999]">最近一次交易为失败机构</span>
|
||||
<span class="text-base font-bold text-[#333333]">{{
|
||||
formatMetricValue(parseIntervalValue(data.xyp_t03td148))
|
||||
}}家</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<div class="px-4 pb-4">
|
||||
<LRemark
|
||||
content="风险指标详情提供全面的风险评估指标分析,包括核心风险指标、警示指标和风险分布统计。核心风险指标包括当前逾期、近期逾期和信用风险评分等严重风险项目。警示指标涵盖申请频率、机构数量等预警信息。建议重点关注严重风险指标,及时评估申请人的还款能力和信用状况。指标数据基于多维度风险模型计算,具有较高的预测准确性。" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
|
||||
export default {
|
||||
name: 'RiskIndicators',
|
||||
components: {
|
||||
LTitle,
|
||||
LRemark
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// 核心风险指标
|
||||
hasCurrentOverdue() {
|
||||
return this.data.xyp_cpl0044 === '1'
|
||||
},
|
||||
currentOverdueInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0071)
|
||||
},
|
||||
hasRecentOverdue() {
|
||||
return this.data.xyp_cpl0028 === '1' || this.data.xyp_cpl0029 === '1' || this.data.xyp_cpl0030 === '1'
|
||||
},
|
||||
creditRiskScore() {
|
||||
return parseFloat(this.data.xyp_cpl0081) || 0
|
||||
},
|
||||
highCreditRisk() {
|
||||
return this.creditRiskScore > 0.7
|
||||
},
|
||||
hasCriticalRisk() {
|
||||
return this.hasCurrentOverdue || this.hasRecentOverdue || this.highCreditRisk
|
||||
},
|
||||
|
||||
// 警示指标
|
||||
recent1DayInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0070)
|
||||
},
|
||||
recent7DayInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0009)
|
||||
},
|
||||
amountComplianceIndex() {
|
||||
return parseFloat(this.data.xyp_cpl0082) || 0
|
||||
},
|
||||
countComplianceIndex() {
|
||||
return parseFloat(this.data.xyp_cpl0083) || 0
|
||||
},
|
||||
|
||||
// 正面指标
|
||||
settledInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0002)
|
||||
},
|
||||
creditLoanDuration() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0045)
|
||||
},
|
||||
historicalSuccessPayments() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0014)
|
||||
},
|
||||
|
||||
// 交易失败后还款分析
|
||||
consumerFailureRecovery() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0052)
|
||||
},
|
||||
smallLoanFailureRecovery() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0053)
|
||||
},
|
||||
overallFailureRecovery() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0069)
|
||||
},
|
||||
|
||||
// 恢复时间分析
|
||||
avgRecoveryTime() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0062)
|
||||
},
|
||||
minRecoveryTime() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0059)
|
||||
},
|
||||
maxRecoveryTime() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0056)
|
||||
},
|
||||
|
||||
// 金额比例指标
|
||||
amountRatios() {
|
||||
return [
|
||||
{
|
||||
id: 'recent_90_amount_ratio',
|
||||
name: '近90天还款成功金额比例',
|
||||
ratio: parseFloat(this.data.xyp_t02acfzbc_acfzbz) || 0,
|
||||
description: '小贷担保类近90天还款成功金额占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_180_amount_ratio',
|
||||
name: '近180天还款成功金额比例',
|
||||
ratio: parseFloat(this.data.xyp_t02acgzbc_acgzbz) || 0,
|
||||
description: '小贷担保类近180天还款成功金额占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_360_amount_ratio',
|
||||
name: '近360天还款成功金额比例',
|
||||
ratio: parseFloat(this.data.xyp_t02achzbc_achzbz) || 0,
|
||||
description: '小贷担保类近360天还款成功金额占比'
|
||||
},
|
||||
{
|
||||
id: 'failure_amount_ratio',
|
||||
name: '交易失败金额比例',
|
||||
ratio: parseFloat(this.data.xyp_t02aczzza_aczzzz) || 0,
|
||||
description: '因交易能力不足导致失败的金额占总交易金额比例'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// 笔数比例指标
|
||||
countRatios() {
|
||||
return [
|
||||
{
|
||||
id: 'recent_90_count_ratio',
|
||||
name: '近90天还款成功笔数比例',
|
||||
ratio: parseFloat(this.data.xyp_t02ccfzbc_ccfzbz) || 0,
|
||||
description: '小贷担保类近90天还款成功笔数占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_180_count_ratio',
|
||||
name: '近180天还款成功笔数比例',
|
||||
ratio: parseFloat(this.data.xyp_t02ccgzbc_ccgzbz) || 0,
|
||||
description: '小贷担保类近180天还款成功笔数占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_360_count_ratio',
|
||||
name: '近360天还款成功笔数比例',
|
||||
ratio: parseFloat(this.data.xyp_t02cchzbc_cchzbz) || 0,
|
||||
description: '小贷担保类近360天还款成功笔数占比'
|
||||
},
|
||||
{
|
||||
id: 'overall_success_ratio',
|
||||
name: '总体还款成功率',
|
||||
ratio: parseFloat(this.data.xyp_t02cczzzc_cczzzz) || 0,
|
||||
description: '历史总体还款成功笔数占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_5_failure_ratio',
|
||||
name: '近5次交易失败比例',
|
||||
ratio: parseFloat(this.data.xyp_t02ccizza_cczzza) || 0,
|
||||
description: '近5次交易中因交易能力不足导致失败的笔数占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_30_failure_ratio',
|
||||
name: '近30天交易失败比例',
|
||||
ratio: parseFloat(this.data.xyp_t02ccezza_cczzza) || 0,
|
||||
description: '近30天因交易能力不足导致失败的笔数占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_90_failure_ratio',
|
||||
name: '近90天交易失败比例',
|
||||
ratio: parseFloat(this.data.xyp_t02ccfzza_cczzza) || 0,
|
||||
description: '近90天因交易能力不足导致失败的笔数占比'
|
||||
},
|
||||
{
|
||||
id: 'recent_180_failure_ratio',
|
||||
name: '近180天交易失败比例',
|
||||
ratio: parseFloat(this.data.xyp_t02ccgzza_ccgzzz) || 0,
|
||||
description: '近180天因交易能力不足导致失败的笔数占比'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// 特殊指标
|
||||
lastTransactionDays() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0046)
|
||||
},
|
||||
lastRepaymentDays() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0068)
|
||||
},
|
||||
|
||||
// 交易失败机构时间线
|
||||
failureInstitutionTimeline() {
|
||||
const items = [
|
||||
{ period: '7天', count: this.parseIntervalValue(this.data.xyp_cpl0048) },
|
||||
{ period: '14天', count: this.parseIntervalValue(this.data.xyp_cpl0049) },
|
||||
{ period: '21天', count: this.parseIntervalValue(this.data.xyp_cpl0050) },
|
||||
{ period: '30天', count: this.parseIntervalValue(this.data.xyp_cpl0051) },
|
||||
{ period: '90天', count: this.parseIntervalValue(this.data.xyp_t03td045) },
|
||||
{ period: '180天', count: this.parseIntervalValue(this.data.xyp_t03td053) }
|
||||
]
|
||||
|
||||
const maxCount = Math.max(...items.map(item => item.count)) || 1
|
||||
return items.map(item => ({
|
||||
...item,
|
||||
percentage: (item.count / maxCount) * 100
|
||||
}))
|
||||
},
|
||||
|
||||
// 新增机构比例
|
||||
newInstitutionRatios() {
|
||||
return [
|
||||
{
|
||||
period: '30天',
|
||||
ratio: parseFloat(this.data.xyp_t02dezezz_dezzzz) || 0
|
||||
},
|
||||
{
|
||||
period: '90天',
|
||||
ratio: parseFloat(this.data.xyp_t02dezfzz_dezzzz) || 0
|
||||
},
|
||||
{
|
||||
period: '180天',
|
||||
ratio: parseFloat(this.data.xyp_t02dezgzz_dezzzz) || 0
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
parseIntervalValue(value) {
|
||||
if (!value || value === '' || value === '-1') return 0
|
||||
const num = parseInt(value)
|
||||
if (isNaN(num)) return 0
|
||||
|
||||
// 根据区间映射返回大致范围的中值
|
||||
switch (num) {
|
||||
case 1: return 1
|
||||
case 2: return 3
|
||||
case 3: return 7
|
||||
case 4: return 15
|
||||
case 5: return 25
|
||||
default: return num
|
||||
}
|
||||
},
|
||||
|
||||
formatMetricValue(value) {
|
||||
if (value === 0) return '0'
|
||||
if (value < 5) return `${value}`
|
||||
return `${value}+`
|
||||
},
|
||||
|
||||
formatDays(value) {
|
||||
if (value === 0) return '无记录'
|
||||
if (value < 30) return `${value}天`
|
||||
if (value < 365) return `${Math.floor(value / 30)}个月`
|
||||
return `${Math.floor(value / 365)}年`
|
||||
},
|
||||
|
||||
formatAmount(value) {
|
||||
if (value === 0) return '0元'
|
||||
if (value < 1000) return `${value}元`
|
||||
if (value < 10000) return `${(value / 1000).toFixed(1)}千元`
|
||||
return `${(value / 10000).toFixed(1)}万元`
|
||||
},
|
||||
|
||||
getWarningClass(value) {
|
||||
if (value === 0) return 'text-green-600'
|
||||
if (value < 3) return 'text-yellow-600'
|
||||
return 'text-red-600'
|
||||
},
|
||||
|
||||
getIndexClass(index) {
|
||||
if (index < 0.3) return 'text-green-600'
|
||||
if (index < 0.7) return 'text-yellow-600'
|
||||
return 'text-red-600'
|
||||
},
|
||||
|
||||
getRecoveryPercentage(recovery) {
|
||||
// 假设最大恢复次数为10次
|
||||
return Math.min((recovery / 10) * 100, 100)
|
||||
},
|
||||
|
||||
getRatioClass(ratio) {
|
||||
if (ratio >= 0.8) return 'text-green-600'
|
||||
if (ratio >= 0.6) return 'text-yellow-600'
|
||||
return 'text-red-600'
|
||||
},
|
||||
|
||||
getRatioBarClass(ratio) {
|
||||
if (ratio >= 0.8) return 'bg-green-500'
|
||||
if (ratio >= 0.6) return 'bg-yellow-500'
|
||||
return 'bg-red-500'
|
||||
},
|
||||
|
||||
getFailureClass(count) {
|
||||
if (count === 0) return 'text-green-600'
|
||||
if (count < 3) return 'text-yellow-600'
|
||||
return 'text-red-600'
|
||||
},
|
||||
|
||||
getFailureBarClass(count) {
|
||||
if (count === 0) return 'bg-green-500'
|
||||
if (count < 3) return 'bg-yellow-500'
|
||||
return 'bg-red-500'
|
||||
},
|
||||
|
||||
getCircleStyle(ratio) {
|
||||
let color = '#ef4444'
|
||||
if (ratio < 0.3) color = '#10b981'
|
||||
else if (ratio < 0.6) color = '#f59e0b'
|
||||
|
||||
// 确保至少显示10度,让用户知道是图表
|
||||
const minDegree = 10
|
||||
const actualDegree = Math.max(ratio * 360, minDegree)
|
||||
|
||||
return {
|
||||
background: `conic-gradient(${color} ${actualDegree}deg, #e5e7eb 0deg)`
|
||||
}
|
||||
},
|
||||
|
||||
getRatioCardClass(id) {
|
||||
// 失败相关的指标使用红色,总体还款成功率使用绿色,其他使用蓝色
|
||||
if (id === 'overall_success_ratio') {
|
||||
return 'bg-[#ECF9EF] border border-[#CAECD3]'
|
||||
} else if (id.includes('failure')) {
|
||||
return 'bg-[#F9ECEC] border border-[#F0CACA]'
|
||||
}
|
||||
return 'bg-[#ECF2FD] border border-[#CADAF9]'
|
||||
},
|
||||
|
||||
getRatioBarBgClass(id) {
|
||||
// 失败相关的指标使用红色背景,总体还款成功率使用绿色背景,其他使用蓝色背景
|
||||
if (id === 'overall_success_ratio') {
|
||||
return 'bg-[#CAECD3]'
|
||||
} else if (id.includes('failure')) {
|
||||
return 'bg-[#F0CACA]'
|
||||
}
|
||||
return 'bg-[#DBE6FC]'
|
||||
},
|
||||
|
||||
getRatioBarColor(id) {
|
||||
// 失败相关的指标使用红色,总体还款成功率使用绿色,其他使用蓝色
|
||||
if (id === 'overall_success_ratio') {
|
||||
return '#5EBC62'
|
||||
} else if (id.includes('failure')) {
|
||||
return '#D44643'
|
||||
}
|
||||
return '#5079EA'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 组件样式已使用 Tailwind CSS */
|
||||
</style>
|
||||
375
src/ui/CJRZQ5E9F/components/RiskOverview.vue
Normal file
375
src/ui/CJRZQ5E9F/components/RiskOverview.vue
Normal file
@@ -0,0 +1,375 @@
|
||||
<template>
|
||||
<div class="">
|
||||
<div class="rounded-lg border border-[#99999933] pb-2 mb-4">
|
||||
|
||||
<!-- 标题栏 -->
|
||||
<div class="flex items-center mb-4 p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/fxgl.png" alt="风险概览" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">风险概览</span>
|
||||
</div>
|
||||
|
||||
<div class="px-4 pb-4">
|
||||
<!-- 综合风险等级 -->
|
||||
<div class="mb-6">
|
||||
<div class="p-4 rounded-lg" :class="getRiskCardClass()">
|
||||
<div class="flex items-start">
|
||||
<div class="mr-3 mt-1">
|
||||
<img :src="getRiskIconPath()" alt="综合风险等级" class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<h4 class="font-semibold text-gray-800">综合风险等级</h4>
|
||||
<div class="risk-level-badge" :class="getRiskLevelClass()">
|
||||
{{ riskLevel }}
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-gray-400 text-sm mb-2">
|
||||
基于多维度数据分析的风险评估
|
||||
</p>
|
||||
<p class=" text-sm" :class="riskLevelTextClass">
|
||||
{{ riskDescription }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 当前状态 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="当前状态" class="mb-4" />
|
||||
<div class="space-y-4">
|
||||
<!-- 逾期状态 -->
|
||||
<div class="p-4 rounded-lg" :class="getOverdueCardClass()">
|
||||
<div class="flex items-start">
|
||||
<div class="mr-3 mt-1">
|
||||
<img :src="getOverdueIconPath()" alt="逾期状态" class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<h4 class="font-semibold text-gray-800">逾期状态</h4>
|
||||
<div class="risk-level-badge" :class="getOverdueStatusClass()">
|
||||
{{ overdueStatus }}
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-gray-400 text-sm">
|
||||
当前逾期情况
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 当前逾期机构 -->
|
||||
<div class="p-4 rounded-lg" :class="getOverdueInstitutionCardClass()">
|
||||
<div class="flex items-start">
|
||||
<div class="mr-3 mt-1">
|
||||
<img :src="getOverdueInstitutionIconPath()" alt="当前逾期机构" class="w-10 h-10 object-contain" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<h4 class="font-semibold text-gray-800">当前逾期机构</h4>
|
||||
<div class="risk-level-badge" :class="getOverdueInstitutionClass()">
|
||||
{{ currentOverdueInstitutions }}家
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-gray-400 text-sm">
|
||||
逾期机构数量
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 关键指标 -->
|
||||
<div class="">
|
||||
<LTitle title="关键指标" />
|
||||
<div class="space-y-2 p-4">
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
<span class="text-[#999999]">贷款总机构数</span>
|
||||
<span class="text-[#333333] font-bold">{{ formatMetricValue(totalInstitutions) }}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
<span class="text-[#999999]">已结清机构数</span>
|
||||
<span class="text-[#333333] font-bold">{{ formatMetricValue(settledInstitutions) }}家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
<span class="text-[#999999]">信用贷款时长</span>
|
||||
<span class="text-[#333333] font-bold">{{ formatDays(creditLoanDuration) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
<span class="text-[#999999]">最近一次交易距今</span>
|
||||
<span class="text-[#333333] font-bold">{{ formatDays(lastTransactionDays) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
<span class="text-[#999999]">最近一次还款距今</span>
|
||||
<span class="text-[#333333] font-bold">{{ formatDays(lastRepaymentDays) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<LRemark
|
||||
content="风险概览提供申请人的整体风险状况总结,包括综合风险等级、当前状态和关键指标。风险等级基于多维度数据分析计算得出,包括但不限于逾期情况、借贷历史、还款表现等。当前状态展示申请人的实时风险指标,包括逾期状态、最近交易情况等。建议结合具体业务场景和风险政策进行综合判断。" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
|
||||
export default {
|
||||
name: 'RiskOverview',
|
||||
components: {
|
||||
LTitle,
|
||||
LRemark
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// 解析区间化数据的辅助方法
|
||||
totalInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0001)
|
||||
},
|
||||
settledInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0002)
|
||||
},
|
||||
currentOverdueStatus() {
|
||||
return this.data.xyp_cpl0044 === '1'
|
||||
},
|
||||
currentOverdueInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0071)
|
||||
},
|
||||
creditLoanDuration() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0045)
|
||||
},
|
||||
recent1DayInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0070)
|
||||
},
|
||||
recent7DayInstitutions() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0009)
|
||||
},
|
||||
lastTransactionDays() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0046)
|
||||
},
|
||||
lastRepaymentDays() {
|
||||
return this.parseIntervalValue(this.data.xyp_cpl0068)
|
||||
},
|
||||
|
||||
// 综合风险等级计算
|
||||
riskLevel() {
|
||||
const creditScore = parseFloat(this.data.xyp_cpl0081) || 0
|
||||
const overdueIndex = parseFloat(this.data.xyp_cpl0082) || 0
|
||||
|
||||
if (creditScore > 0.7 || overdueIndex > 0.7 || this.currentOverdueStatus) {
|
||||
return '高风险'
|
||||
} else if (creditScore > 0.4 || overdueIndex > 0.4) {
|
||||
return '中风险'
|
||||
} else {
|
||||
return '低风险'
|
||||
}
|
||||
},
|
||||
|
||||
riskLevelClass() {
|
||||
switch (this.riskLevel) {
|
||||
case '高风险': return 'risk-high'
|
||||
case '中风险': return 'risk-medium'
|
||||
default: return 'risk-low'
|
||||
}
|
||||
},
|
||||
|
||||
riskLevelIconClass() {
|
||||
switch (this.riskLevel) {
|
||||
case '高风险': return 'bg-red-500'
|
||||
case '中风险': return 'bg-yellow-500'
|
||||
default: return 'bg-green-500'
|
||||
}
|
||||
},
|
||||
|
||||
riskLevelTextClass() {
|
||||
switch (this.riskLevel) {
|
||||
case '高风险': return 'text-red-600'
|
||||
case '中风险': return 'text-yellow-600'
|
||||
default: return 'text-green-600'
|
||||
}
|
||||
},
|
||||
|
||||
overdueStatusIconClass() {
|
||||
return this.hasOverdue ? 'bg-red-500' : 'bg-green-500'
|
||||
},
|
||||
|
||||
overdueStatusTextClass() {
|
||||
return this.hasOverdue ? 'text-red-600' : 'text-green-600'
|
||||
},
|
||||
|
||||
riskDescription() {
|
||||
switch (this.riskLevel) {
|
||||
case '高风险': return '存在较高信用风险,建议谨慎放贷'
|
||||
case '中风险': return '信用风险适中,需要进一步评估'
|
||||
default: return '信用风险较低,具备良好还款能力'
|
||||
}
|
||||
},
|
||||
|
||||
overdueStatus() {
|
||||
return this.currentOverdueStatus ? '存在逾期' : '无逾期'
|
||||
},
|
||||
|
||||
overdueStatusClass() {
|
||||
return this.currentOverdueStatus ? 'status-danger' : 'status-success'
|
||||
},
|
||||
|
||||
hasRecentActivity() {
|
||||
return this.recent1DayInstitutions > 0 || this.recent7DayInstitutions > 0
|
||||
},
|
||||
|
||||
hasOverdue() {
|
||||
return this.currentOverdueStatus
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 获取综合风险等级卡片样式
|
||||
getRiskCardClass() {
|
||||
switch (this.riskLevel) {
|
||||
case '高风险':
|
||||
return 'bg-red-50 border border-red-200'
|
||||
case '中风险':
|
||||
return 'bg-yellow-50 border border-yellow-200'
|
||||
default:
|
||||
return 'bg-green-50 border border-green-200'
|
||||
}
|
||||
},
|
||||
|
||||
// 获取综合风险等级图标路径
|
||||
getRiskIconPath() {
|
||||
switch (this.riskLevel) {
|
||||
case '高风险':
|
||||
return new URL('@/assets/images/report/gfx.png', import.meta.url).href
|
||||
case '中风险':
|
||||
return new URL('@/assets/images/report/zfx.png', import.meta.url).href
|
||||
default:
|
||||
return new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
}
|
||||
},
|
||||
|
||||
// 获取综合风险等级标签样式
|
||||
getRiskLevelClass() {
|
||||
switch (this.riskLevel) {
|
||||
case '高风险':
|
||||
return 'bg-red-600 text-white'
|
||||
case '中风险':
|
||||
return 'bg-yellow-600 text-white'
|
||||
default:
|
||||
return 'bg-green-600 text-white'
|
||||
}
|
||||
},
|
||||
|
||||
// 获取逾期状态卡片样式
|
||||
getOverdueCardClass() {
|
||||
return this.hasOverdue
|
||||
? 'bg-red-50 border border-red-200'
|
||||
: 'bg-green-50 border border-green-200'
|
||||
},
|
||||
|
||||
// 获取逾期状态图标路径
|
||||
getOverdueIconPath() {
|
||||
return this.hasOverdue
|
||||
? new URL('@/assets/images/report/gfx.png', import.meta.url).href
|
||||
: new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
},
|
||||
|
||||
// 获取逾期状态标签样式
|
||||
getOverdueStatusClass() {
|
||||
return this.hasOverdue
|
||||
? 'bg-red-600 text-white'
|
||||
: 'bg-green-600 text-white'
|
||||
},
|
||||
|
||||
// 获取当前逾期机构卡片样式
|
||||
getOverdueInstitutionCardClass() {
|
||||
return this.currentOverdueInstitutions > 0
|
||||
? 'bg-red-50 border border-red-200'
|
||||
: 'bg-green-50 border border-green-200'
|
||||
},
|
||||
|
||||
// 获取当前逾期机构图标路径
|
||||
getOverdueInstitutionIconPath() {
|
||||
return this.currentOverdueInstitutions > 0
|
||||
? new URL('@/assets/images/report/gfx.png', import.meta.url).href
|
||||
: new URL('@/assets/images/report/zq.png', import.meta.url).href
|
||||
},
|
||||
|
||||
// 获取当前逾期机构标签样式
|
||||
getOverdueInstitutionClass() {
|
||||
return this.currentOverdueInstitutions > 0
|
||||
? 'bg-red-600 text-white'
|
||||
: 'bg-green-600 text-white'
|
||||
},
|
||||
// 解析区间化数值
|
||||
parseIntervalValue(value) {
|
||||
if (!value || value === '' || value === '-1') return 0
|
||||
const num = parseInt(value)
|
||||
if (isNaN(num)) return 0
|
||||
|
||||
// 根据区间映射返回大致范围的中值
|
||||
switch (num) {
|
||||
case 1: return 1
|
||||
case 2: return 3
|
||||
case 3: return 7
|
||||
case 4: return 15
|
||||
case 5: return 25
|
||||
default: return num
|
||||
}
|
||||
},
|
||||
|
||||
formatMetricValue(value) {
|
||||
if (value === 0) return '0'
|
||||
if (value < 5) return `${value}`
|
||||
if (value < 10) return `${value}`
|
||||
return `${value}+`
|
||||
},
|
||||
|
||||
formatDays(value) {
|
||||
if (value === 0) return '无记录'
|
||||
if (value < 30) return `${value}天`
|
||||
if (value < 365) return `${Math.floor(value / 30)}个月`
|
||||
return `${Math.floor(value / 365)}年`
|
||||
},
|
||||
|
||||
getMetricClass(value) {
|
||||
if (value > 10) return 'text-red-600'
|
||||
if (value > 5) return 'text-orange-600'
|
||||
return 'text-green-600'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 风险等级标签 */
|
||||
.risk-level-badge {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
padding: 2px 6px;
|
||||
border-radius: 0 8px 0 8px;
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
/* 卡片需要相对定位 */
|
||||
.p-4.rounded-lg {
|
||||
position: relative;
|
||||
}
|
||||
</style>
|
||||
1466
src/ui/CJRZQ5E9F/components/TimeTrendAnalysis.vue
Normal file
1466
src/ui/CJRZQ5E9F/components/TimeTrendAnalysis.vue
Normal file
File diff suppressed because it is too large
Load Diff
122
src/ui/CJRZQ5E9F/index.vue
Normal file
122
src/ui/CJRZQ5E9F/index.vue
Normal file
@@ -0,0 +1,122 @@
|
||||
<template>
|
||||
<div class="card">
|
||||
<!-- 风险概览 -->
|
||||
<RiskOverview :data="riskData" />
|
||||
|
||||
<!-- 信用评分 -->
|
||||
<CreditScores :data="riskData" />
|
||||
|
||||
<!-- 贷款行为分析 -->
|
||||
<LoanBehaviorAnalysis :data="riskData" />
|
||||
|
||||
<!-- 机构分析 -->
|
||||
<InstitutionAnalysis :data="riskData" />
|
||||
|
||||
<!-- 时间趋势分析 -->
|
||||
<TimeTrendAnalysis :data="riskData" />
|
||||
|
||||
<!-- 风险指标详情 -->
|
||||
<RiskIndicators :data="riskData" />
|
||||
|
||||
<!-- 专业建议 -->
|
||||
<RiskAdvice :data="riskData" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import RiskOverview from './components/RiskOverview.vue'
|
||||
import CreditScores from './components/CreditScores.vue'
|
||||
import LoanBehaviorAnalysis from './components/LoanBehaviorAnalysis.vue'
|
||||
import InstitutionAnalysis from './components/InstitutionAnalysis.vue'
|
||||
import TimeTrendAnalysis from './components/TimeTrendAnalysis.vue'
|
||||
import RiskIndicators from './components/RiskIndicators.vue'
|
||||
import RiskAdvice from './components/RiskAdvice.vue'
|
||||
|
||||
export default {
|
||||
name: 'LoanRiskReport',
|
||||
components: {
|
||||
RiskOverview,
|
||||
CreditScores,
|
||||
LoanBehaviorAnalysis,
|
||||
InstitutionAnalysis,
|
||||
TimeTrendAnalysis,
|
||||
RiskIndicators,
|
||||
RiskAdvice
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
riskData() {
|
||||
return this.data || {}
|
||||
},
|
||||
hasRisk() {
|
||||
return Object.keys(this.data || {}).length > 0;
|
||||
},
|
||||
riskScore() {
|
||||
const d = this.riskData;
|
||||
|
||||
// 检查是否有数据
|
||||
if (!d || Object.keys(d).length === 0) {
|
||||
return 100; // 无数据视为最安全
|
||||
}
|
||||
|
||||
// 根据风险概览数据计算评分
|
||||
// 假设数据中有风险评分字段
|
||||
const riskLevel = d.riskLevel || d.risk_level || '';
|
||||
const riskScore = d.riskScore || d.risk_score || 0;
|
||||
|
||||
// 如果有风险评分,直接使用
|
||||
if (riskScore > 0) {
|
||||
// 风险评分转换为安全评分(分数越高越安全)
|
||||
// 假设风险评分是0-100,分数越高风险越大
|
||||
return Math.max(0, 100 - riskScore);
|
||||
}
|
||||
|
||||
// 根据风险等级计算
|
||||
if (riskLevel === 'high' || riskLevel === 'HIGH' || riskLevel === '高风险') {
|
||||
return 20; // 高风险
|
||||
}
|
||||
if (riskLevel === 'medium' || riskLevel === 'MEDIUM' || riskLevel === '中风险') {
|
||||
return 60; // 中等风险
|
||||
}
|
||||
if (riskLevel === 'low' || riskLevel === 'LOW' || riskLevel === '低风险') {
|
||||
return 80; // 低风险
|
||||
}
|
||||
|
||||
// 默认中等风险
|
||||
return 70;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
riskScore(newValue) {
|
||||
if (this.apiId && this.notifyRiskStatus) {
|
||||
this.notifyRiskStatus(this.apiId, this.index, newValue);
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// 立即通知一次
|
||||
if (this.apiId && this.notifyRiskStatus) {
|
||||
this.notifyRiskStatus(this.apiId, this.index, this.riskScore);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
317
src/ui/CJRZQ5E9F/utils/simpleSplitter.js
Normal file
317
src/ui/CJRZQ5E9F/utils/simpleSplitter.js
Normal file
@@ -0,0 +1,317 @@
|
||||
/**
|
||||
* 贷款风险报告(CJRZQ5E9F)数据拆分工具
|
||||
* 将完整的贷款风险报告数据拆分成多个独立的模块,用于在不同的tab中显示
|
||||
*/
|
||||
|
||||
/**
|
||||
* 将CJRZQ5E9F数据拆分为多个独立的tab模块
|
||||
* @param {Array} reportData - 原始报告数据数组
|
||||
* @returns {Array} 拆分后的模块数组
|
||||
*/
|
||||
export function splitCJRZQ5E9FForTabs(reportData) {
|
||||
// 查找CJRZQ5E9F数据
|
||||
const cjrzq5e9fData = reportData.find(
|
||||
(item) => item.data?.apiID === "JRZQ5E9F"
|
||||
);
|
||||
|
||||
if (!cjrzq5e9fData || !cjrzq5e9fData.data?.data) {
|
||||
return reportData; // 如果没有找到CJRZQ5E9F数据,返回原数据
|
||||
}
|
||||
|
||||
const originalData = cjrzq5e9fData.data.data;
|
||||
const baseTimestamp = cjrzq5e9fData.data.timestamp;
|
||||
|
||||
// 创建拆分后的模块数组
|
||||
const splitModules = [];
|
||||
|
||||
// 1. 风险概览
|
||||
if (originalData && Object.keys(originalData).length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: "CJRZQ5E9F_RiskOverview",
|
||||
data: originalData,
|
||||
success: true,
|
||||
timestamp: baseTimestamp,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 2. 信用评分
|
||||
if (originalData && Object.keys(originalData).length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: "CJRZQ5E9F_CreditScores",
|
||||
data: originalData,
|
||||
success: true,
|
||||
timestamp: baseTimestamp,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 3. 贷款行为分析
|
||||
if (originalData && Object.keys(originalData).length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: "CJRZQ5E9F_LoanBehaviorAnalysis",
|
||||
data: originalData,
|
||||
success: true,
|
||||
timestamp: baseTimestamp,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 4. 机构分析
|
||||
if (originalData && Object.keys(originalData).length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: "CJRZQ5E9F_InstitutionAnalysis",
|
||||
data: originalData,
|
||||
success: true,
|
||||
timestamp: baseTimestamp,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 5. 时间趋势分析
|
||||
if (originalData && Object.keys(originalData).length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: "CJRZQ5E9F_TimeTrendAnalysis",
|
||||
data: originalData,
|
||||
success: true,
|
||||
timestamp: baseTimestamp,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 6. 风险指标详情
|
||||
if (originalData && Object.keys(originalData).length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: "CJRZQ5E9F_RiskIndicators",
|
||||
data: originalData,
|
||||
success: true,
|
||||
timestamp: baseTimestamp,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 7. 专业建议
|
||||
if (originalData && Object.keys(originalData).length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: "CJRZQ5E9F_RiskAdvice",
|
||||
data: originalData,
|
||||
success: true,
|
||||
timestamp: baseTimestamp,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 移除原始的JRZQ5E9F数据,添加拆分后的模块
|
||||
const otherData = reportData.filter(
|
||||
(item) => item.data?.apiID !== "JRZQ5E9F"
|
||||
);
|
||||
|
||||
return [...otherData, ...splitModules];
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析区间化数值
|
||||
* @param {string|number} value - 原始值
|
||||
* @returns {number} 解析后的数值
|
||||
*/
|
||||
export function parseIntervalValue(value) {
|
||||
if (!value || value === "" || value === "-1") return 0;
|
||||
const num = parseInt(value);
|
||||
if (isNaN(num)) return 0;
|
||||
|
||||
// 根据区间映射返回大致范围的中值
|
||||
switch (num) {
|
||||
case 1:
|
||||
return 1;
|
||||
case 2:
|
||||
return 3;
|
||||
case 3:
|
||||
return 7;
|
||||
case 4:
|
||||
return 15;
|
||||
case 5:
|
||||
return 25;
|
||||
default:
|
||||
return num;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化指标值显示
|
||||
* @param {number} value - 数值
|
||||
* @returns {string} 格式化后的显示文本
|
||||
*/
|
||||
export function formatMetricValue(value) {
|
||||
if (value === 0) return "0";
|
||||
if (value < 5) return `${value}`;
|
||||
return `${value}+`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化天数显示
|
||||
* @param {number} value - 天数
|
||||
* @returns {string} 格式化后的显示文本
|
||||
*/
|
||||
export function formatDays(value) {
|
||||
if (value === 0) return "无记录";
|
||||
if (value < 30) return `${value}天`;
|
||||
if (value < 365) return `${Math.floor(value / 30)}个月`;
|
||||
return `${Math.floor(value / 365)}年`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化金额显示
|
||||
* @param {number} value - 金额
|
||||
* @returns {string} 格式化后的显示文本
|
||||
*/
|
||||
export function formatAmount(value) {
|
||||
if (value === 0) return "0元";
|
||||
if (value < 1000) return `${value}元`;
|
||||
if (value < 10000) return `${(value / 1000).toFixed(1)}千元`;
|
||||
return `${(value / 10000).toFixed(1)}万元`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算风险等级
|
||||
* @param {number} creditScore - 信用风险评分
|
||||
* @param {number} overdueIndex - 逾期指数
|
||||
* @param {boolean} currentOverdue - 当前是否逾期
|
||||
* @returns {object} 包含等级、颜色和描述的对象
|
||||
*/
|
||||
export function calculateRiskLevel(creditScore, overdueIndex, currentOverdue) {
|
||||
if (creditScore > 0.7 || overdueIndex > 0.7 || currentOverdue) {
|
||||
return {
|
||||
level: "高风险",
|
||||
color: "text-red-600",
|
||||
bgColor: "bg-red-100",
|
||||
iconColor: "bg-red-500",
|
||||
description: "存在较高信用风险,建议谨慎放贷",
|
||||
};
|
||||
} else if (creditScore > 0.4 || overdueIndex > 0.4) {
|
||||
return {
|
||||
level: "中风险",
|
||||
color: "text-yellow-600",
|
||||
bgColor: "bg-yellow-100",
|
||||
iconColor: "bg-yellow-500",
|
||||
description: "信用风险适中,需要进一步评估",
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
level: "低风险",
|
||||
color: "text-green-600",
|
||||
bgColor: "bg-green-100",
|
||||
iconColor: "bg-green-500",
|
||||
description: "信用风险较低,具备良好还款能力",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算信用评分显示
|
||||
* @param {number} creditRiskScore - 信用风险评分
|
||||
* @param {number} amountComplianceIndex - 履约金额综合指数
|
||||
* @param {number} countComplianceIndex - 履约笔数综合指数
|
||||
* @returns {object} 包含评分、进度和颜色的对象
|
||||
*/
|
||||
export function calculateCreditScore(
|
||||
creditRiskScore,
|
||||
amountComplianceIndex,
|
||||
countComplianceIndex
|
||||
) {
|
||||
const avgRisk =
|
||||
(creditRiskScore + amountComplianceIndex + countComplianceIndex) / 3;
|
||||
// 风险越高,信用分越低
|
||||
const score = Math.round((1 - avgRisk) * 850 + 150);
|
||||
const progress = (score / 1000) * 283;
|
||||
|
||||
let color = "#ef4444";
|
||||
if (score >= 750) color = "#10b981";
|
||||
else if (score >= 650) color = "#f59e0b";
|
||||
|
||||
return {
|
||||
score,
|
||||
progress,
|
||||
color,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取信用等级描述
|
||||
* @param {number} score - 信用评分
|
||||
* @returns {string} 等级描述
|
||||
*/
|
||||
export function getCreditScoreLevel(score) {
|
||||
if (score >= 800) return "优秀";
|
||||
if (score >= 700) return "良好";
|
||||
if (score >= 600) return "一般";
|
||||
if (score >= 500) return "较差";
|
||||
return "很差";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取信用等级样式类
|
||||
* @param {number} score - 信用评分
|
||||
* @returns {string} 样式类名
|
||||
*/
|
||||
export function getCreditScoreBadgeClass(score) {
|
||||
if (score >= 800) return "bg-green-100 text-green-800";
|
||||
if (score >= 700) return "bg-blue-100 text-blue-800";
|
||||
if (score >= 600) return "bg-yellow-100 text-yellow-800";
|
||||
if (score >= 500) return "bg-orange-100 text-orange-800";
|
||||
return "bg-red-100 text-red-800";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取评分样式类
|
||||
* @param {number} score - 评分
|
||||
* @returns {string} 样式类名
|
||||
*/
|
||||
export function getScoreClass(score) {
|
||||
if (score === null) return "text-gray-400";
|
||||
if (score >= 750) return "text-green-600";
|
||||
if (score >= 650) return "text-yellow-600";
|
||||
return "text-red-600";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取圆形进度样式
|
||||
* @param {number} ratio - 比例值 (0-1)
|
||||
* @returns {object} 样式对象
|
||||
*/
|
||||
export function getCircleStyle(ratio) {
|
||||
let color = "#ef4444";
|
||||
if (ratio >= 0.8) color = "#10b981";
|
||||
else if (ratio >= 0.6) color = "#f59e0b";
|
||||
|
||||
// 确保至少显示10度,让用户知道是图表
|
||||
const minDegree = 10;
|
||||
const actualDegree = Math.max(ratio * 360, minDegree);
|
||||
|
||||
return {
|
||||
background: `conic-gradient(${color} ${actualDegree}deg, #e5e7eb 0deg)`,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否有风险数据
|
||||
* @param {Object} data - 数据对象
|
||||
* @returns {boolean} 是否有风险
|
||||
*/
|
||||
export function hasRiskData(data) {
|
||||
if (!data) return false;
|
||||
|
||||
// 检查对象中是否有非0值
|
||||
return Object.values(data).some((value) => {
|
||||
if (typeof value === "number") return value > 0;
|
||||
if (typeof value === "string")
|
||||
return value !== "0" && value !== "-" && value !== "";
|
||||
return false;
|
||||
});
|
||||
}
|
||||
908
src/ui/CJRZQ8203.vue
Normal file
908
src/ui/CJRZQ8203.vue
Normal file
@@ -0,0 +1,908 @@
|
||||
<script setup>
|
||||
import * as echarts from 'echarts' // 引入 ECharts
|
||||
import LTable from '@/components/LTable.vue'
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import { ref, onMounted, watch, computed } from 'vue'
|
||||
import { useRiskNotifier } from '@/composables/useRiskNotifier'
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
mode: {
|
||||
type: String,
|
||||
default: 'idOnly', // 'full' 或 'idOnly'
|
||||
validator: value => ['full', 'idOnly'].includes(value),
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
})
|
||||
|
||||
const { data, mode } = props
|
||||
|
||||
// 数据类型切换
|
||||
const dataType = ref('id') // 'id' 或 'cell'
|
||||
|
||||
// 监听mode变化,如果是idOnly模式,强制selectedDataSource为"id"
|
||||
watch(
|
||||
() => props.mode,
|
||||
newMode => {
|
||||
if (newMode === 'idOnly') {
|
||||
dataType.value = 'id'
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
// 图表实例
|
||||
const borrowChartRef = ref(null)
|
||||
const repayChartRef = ref(null)
|
||||
const trendChartRef = ref(null)
|
||||
const borrowChartInstance = ref(null)
|
||||
const repayChartInstance = ref(null)
|
||||
const trendChartInstance = ref(null)
|
||||
|
||||
// 表格数据
|
||||
const borrowTable = ref([])
|
||||
const institutionTable = ref([])
|
||||
|
||||
// 获取参考日期
|
||||
const getReferenceDate = computed(() => {
|
||||
const prefix = `tl_${dataType.value}`
|
||||
const dateStr = data[`${prefix}_eletail_lasttime`]
|
||||
if (dateStr) {
|
||||
// 将字符串转为日期对象
|
||||
return new Date(dateStr)
|
||||
}
|
||||
// 如果没有日期信息,则使用当前日期
|
||||
return new Date()
|
||||
})
|
||||
|
||||
// 根据相对月份获取实际年月
|
||||
function getActualMonthYear(monthsBack) {
|
||||
const month = monthsBack.replace('m', '')
|
||||
if (month === '12') {
|
||||
return '近1年'
|
||||
}
|
||||
return `近${month}月`
|
||||
// const refDate = new Date(getReferenceDate.value);
|
||||
// refDate.setMonth(refDate.getMonth() - monthsBack);
|
||||
|
||||
// const year = refDate.getFullYear();
|
||||
// const month = refDate.getMonth() + 1; // JavaScript月份从0开始
|
||||
|
||||
// return `${year}年${month}月`;
|
||||
}
|
||||
function getActualMonthYearT(monthsBack) {
|
||||
if (monthsBack === 't0') {
|
||||
return '1年内'
|
||||
}
|
||||
return `近${monthsBack.replace('t', '')}月`
|
||||
}
|
||||
// 金额转换函数
|
||||
function getLevelAmount(level) {
|
||||
const levelNum = Number(level) || 1
|
||||
const baseAmount = 3000
|
||||
return baseAmount * (levelNum - 1)
|
||||
}
|
||||
|
||||
// 等级范围转换
|
||||
function getLevelRange(level) {
|
||||
const levelNum = Number(level) || 1
|
||||
const baseAmount = 3000
|
||||
const lowerLimit = baseAmount * (levelNum - 1)
|
||||
const upperLimit = baseAmount * levelNum
|
||||
return `${lowerLimit}元 - ${upperLimit}元`
|
||||
}
|
||||
|
||||
// 计算借贷金额数据(按月)
|
||||
const monthlyBorrowData = computed(() => {
|
||||
const months = ['m1', 'm3', 'm6', 'm9', 'm12']
|
||||
|
||||
const prefix = `tl_${dataType.value}`
|
||||
|
||||
return months
|
||||
.map((month, index) => {
|
||||
const borrowKey = `${prefix}_${month}_nbank_passlendamt`
|
||||
const borrowAmount = getLevelAmount(data[borrowKey])
|
||||
console.log(borrowKey, borrowAmount)
|
||||
return {
|
||||
month: getActualMonthYear(month),
|
||||
amount: borrowAmount,
|
||||
displayAmount: formatAmount(borrowAmount),
|
||||
level: data[borrowKey] || '0',
|
||||
levelRange: getLevelRange(data[borrowKey]),
|
||||
}
|
||||
})
|
||||
.reverse()
|
||||
})
|
||||
// 计算应还金额数据(按月)
|
||||
const monthlyRepayData = computed(() => {
|
||||
const months = ['m1', 'm3', 'm6', 'm9', 'm12']
|
||||
const prefix = `tl_${dataType.value}`
|
||||
|
||||
return months
|
||||
.map((month, index) => {
|
||||
const repayKey = `${prefix}_${month}_nbank_reamt`
|
||||
const repayAmount = getLevelAmount(data[repayKey])
|
||||
return {
|
||||
month: getActualMonthYear(month),
|
||||
amount: repayAmount,
|
||||
displayAmount: formatAmount(repayAmount),
|
||||
level: data[repayKey] || '0',
|
||||
levelRange: getLevelRange(data[repayKey]),
|
||||
}
|
||||
})
|
||||
.reverse()
|
||||
})
|
||||
|
||||
// 计算机构数和借还差值(按月)
|
||||
const monthlyInstitutionData = computed(() => {
|
||||
const months = ['m1', 'm3', 'm6', 'm9', 'm12']
|
||||
const prefix = `tl_${dataType.value}`
|
||||
|
||||
return months
|
||||
.map((month, index) => {
|
||||
const orgKey = `${prefix}_${month}_nbank_passorg`
|
||||
const numKey = `${prefix}_${month}_nbank_passnum`
|
||||
const borrowKey = `${prefix}_${month}_nbank_passlendamt`
|
||||
const repayKey = `${prefix}_${month}_nbank_reamt`
|
||||
|
||||
const orgCount = Number(data[orgKey] || 0)
|
||||
const loanCount = Number(data[numKey] || 0)
|
||||
const borrowAmount = getLevelAmount(data[borrowKey])
|
||||
const repayAmount = getLevelAmount(data[repayKey])
|
||||
|
||||
let ratio = 0
|
||||
if (borrowAmount > 0) {
|
||||
ratio = ((repayAmount / borrowAmount) * 100).toFixed(2)
|
||||
}
|
||||
|
||||
return {
|
||||
month: getActualMonthYear(month),
|
||||
orgCount,
|
||||
loanCount,
|
||||
borrowAmount: formatAmount(borrowAmount),
|
||||
repayAmount: formatAmount(repayAmount),
|
||||
ratio: `${ratio}%`,
|
||||
}
|
||||
})
|
||||
.reverse()
|
||||
})
|
||||
|
||||
// 计算近期借贷趋势数据(3月、6月、9月、12月)
|
||||
const recentBorrowTrends = computed(() => {
|
||||
const months = ['t0']
|
||||
const prefix = `tl_${dataType.value}`
|
||||
|
||||
return months
|
||||
.map((month, index) => {
|
||||
const orgKey = `${prefix}_${month}_nbank_org`
|
||||
const numKey = `${prefix}_${month}_nbank_num`
|
||||
const borrowKey = `${prefix}_${month}_nbank_lendamt`
|
||||
const repayKey = `${prefix}_${month}_nbank_reamt`
|
||||
|
||||
const orgCount = Number(data[orgKey] || 0)
|
||||
const loanCount = Number(data[numKey] || 0)
|
||||
const borrowAmount = getLevelAmount(data[borrowKey])
|
||||
const repayAmount = getLevelAmount(data[repayKey])
|
||||
|
||||
let ratio = 0
|
||||
if (borrowAmount > 0) {
|
||||
ratio = ((repayAmount / borrowAmount) * 100).toFixed(2)
|
||||
}
|
||||
|
||||
return {
|
||||
month: getActualMonthYearT(month),
|
||||
orgCount,
|
||||
loanCount,
|
||||
borrowAmount: formatAmount(borrowAmount),
|
||||
repayAmount: formatAmount(repayAmount),
|
||||
ratio: `${ratio}%`,
|
||||
}
|
||||
})
|
||||
.reverse()
|
||||
})
|
||||
|
||||
// 获取最近一次借贷信息
|
||||
const lastLoanInfo = computed(() => {
|
||||
const prefix = `tl_${dataType.value}`
|
||||
return {
|
||||
time: data[`${prefix}_eletail_lasttime`] || '--',
|
||||
type: getLoanTypeDesc(data[`${prefix}_eletail_lasttype`]),
|
||||
count: Number(data[`${prefix}_eletail_num`] || 0),
|
||||
orgCount: Number(data[`${prefix}_eletail_org`] || 0),
|
||||
}
|
||||
})
|
||||
|
||||
// 获取借贷类型描述
|
||||
function getLoanTypeDesc(type) {
|
||||
const typeMap = {
|
||||
a: '传统银行',
|
||||
b: '网络零售银行',
|
||||
c: '持牌网络小贷',
|
||||
d: '持牌小贷',
|
||||
e: '持牌消费金融',
|
||||
f: '持牌融资租赁',
|
||||
g: '持牌汽车金融',
|
||||
h: '其他',
|
||||
}
|
||||
return typeMap[type] || '未知'
|
||||
}
|
||||
|
||||
// 金额格式化
|
||||
function formatAmount(amount) {
|
||||
return amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
|
||||
}
|
||||
|
||||
// 借贷行为总结
|
||||
const behaviorSummary = computed(() => {
|
||||
const prefix = `tl_${dataType.value}`
|
||||
|
||||
// 获取近一年数据
|
||||
const yearData = recentBorrowTrends.value[0]
|
||||
|
||||
// 计算平均月申请次数
|
||||
const avgMonthlyApplications = (yearData.loanCount / 12).toFixed(1)
|
||||
|
||||
// 计算平均月审批额度
|
||||
const totalBorrowAmount = Number(yearData.borrowAmount.replace(/,/g, ''))
|
||||
const avgMonthlyAmount = (totalBorrowAmount / 12).toFixed(0)
|
||||
|
||||
// 计算平均月应还金额
|
||||
const totalRepayAmount = Number(yearData.repayAmount.replace(/,/g, ''))
|
||||
const avgMonthlyRepay = (totalRepayAmount / 12).toFixed(0)
|
||||
|
||||
// 计算还款比例
|
||||
const repayRatio = totalBorrowAmount > 0 ? ((totalRepayAmount / totalBorrowAmount) * 100).toFixed(1) : 0
|
||||
|
||||
// 风险评估
|
||||
let riskLevel = '低'
|
||||
let riskDesc = '借贷行为健康,借贷金额合理'
|
||||
|
||||
// 基于机构数评估
|
||||
if (yearData.orgCount > 5) {
|
||||
riskLevel = '高'
|
||||
riskDesc = '多头借贷风险较高,借贷机构过多'
|
||||
} else if (yearData.orgCount > 3) {
|
||||
riskLevel = '中'
|
||||
riskDesc = '存在多头借贷风险,借贷机构较多'
|
||||
}
|
||||
|
||||
// 基于月均申请次数评估
|
||||
if (avgMonthlyApplications > 3) {
|
||||
riskLevel = riskLevel === '低' ? '中' : '高'
|
||||
riskDesc += ',月均申请次数较多'
|
||||
}
|
||||
|
||||
// 基于还款比例评估
|
||||
if (repayRatio < 50) {
|
||||
riskLevel = riskLevel === '低' ? '中' : '高'
|
||||
riskDesc += ',还款比例较低'
|
||||
}
|
||||
|
||||
return {
|
||||
totalApplications: yearData.loanCount,
|
||||
totalOrgs: yearData.orgCount,
|
||||
totalAmount: formatAmount(totalBorrowAmount),
|
||||
avgMonthlyApplications,
|
||||
avgMonthlyAmount: formatAmount(avgMonthlyAmount),
|
||||
avgMonthlyRepay: formatAmount(avgMonthlyRepay),
|
||||
repayRatio: `${repayRatio}%`,
|
||||
riskLevel,
|
||||
riskDesc,
|
||||
}
|
||||
})
|
||||
|
||||
// 绘制借贷金额图表
|
||||
function drawBorrowChart() {
|
||||
if (!borrowChartRef.value) return
|
||||
|
||||
if (!borrowChartInstance.value) {
|
||||
borrowChartInstance.value = echarts.init(borrowChartRef.value)
|
||||
}
|
||||
|
||||
const chartData = monthlyBorrowData.value
|
||||
const option = {
|
||||
title: {
|
||||
text: '月度审批额度(元)',
|
||||
left: 'center',
|
||||
textStyle: {
|
||||
fontWeight: 'bold',
|
||||
fontSize: 16,
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
formatter: function (params) {
|
||||
const data = params[0].data
|
||||
return `${params[0].name}<br/>${params[0].seriesName}: ${data.displayAmount}<br/>等级: ${data.level} (${data.levelRange})`
|
||||
},
|
||||
backgroundColor: 'rgba(255, 255, 255, 0.8)',
|
||||
borderColor: '#5470C6',
|
||||
borderWidth: 1,
|
||||
textStyle: {
|
||||
color: '#333',
|
||||
},
|
||||
shadowBlur: 10,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.2)',
|
||||
},
|
||||
grid: {
|
||||
left: '5%',
|
||||
right: '5%',
|
||||
bottom: '0%',
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: chartData.map(item => item.month),
|
||||
axisLabel: {
|
||||
interval: 0,
|
||||
rotate: 45,
|
||||
fontWeight: 'bold',
|
||||
margin: 15,
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#999',
|
||||
},
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
name: '金额(元)',
|
||||
nameTextStyle: {
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
type: 'dashed',
|
||||
opacity: 0.6,
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '审批额度',
|
||||
type: 'bar',
|
||||
data: chartData.map(item => ({
|
||||
value: item.amount,
|
||||
displayAmount: item.displayAmount,
|
||||
level: item.level,
|
||||
levelRange: item.levelRange,
|
||||
})),
|
||||
itemStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: '#83bff6' },
|
||||
{ offset: 0.5, color: '#5470C6' },
|
||||
{ offset: 1, color: '#4662a4' },
|
||||
]),
|
||||
borderRadius: [5, 5, 0, 0],
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: '#5470C6' },
|
||||
{ offset: 0.7, color: '#4662a4' },
|
||||
{ offset: 1, color: '#3c5390' },
|
||||
]),
|
||||
},
|
||||
},
|
||||
barWidth: '60%',
|
||||
barMinHeight: 3,
|
||||
showBackground: true,
|
||||
backgroundStyle: {
|
||||
color: 'rgba(180, 180, 180, 0.1)',
|
||||
},
|
||||
},
|
||||
],
|
||||
animation: true,
|
||||
}
|
||||
|
||||
borrowChartInstance.value.setOption(option)
|
||||
}
|
||||
|
||||
// 绘制应还金额图表
|
||||
function drawRepayChart() {
|
||||
if (!repayChartRef.value) return
|
||||
|
||||
if (!repayChartInstance.value) {
|
||||
repayChartInstance.value = echarts.init(repayChartRef.value)
|
||||
}
|
||||
|
||||
const chartData = monthlyRepayData.value
|
||||
const option = {
|
||||
title: {
|
||||
text: '月度应还金额(元)',
|
||||
left: 'center',
|
||||
textStyle: {
|
||||
fontWeight: 'bold',
|
||||
fontSize: 16,
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
formatter: function (params) {
|
||||
const data = params[0].data
|
||||
return `${params[0].name}<br/>${params[0].seriesName}: ${data.displayAmount}<br/>等级: ${data.level} (${data.levelRange})`
|
||||
},
|
||||
backgroundColor: 'rgba(255, 255, 255, 0.8)',
|
||||
borderColor: '#91CC75',
|
||||
borderWidth: 1,
|
||||
textStyle: {
|
||||
color: '#333',
|
||||
},
|
||||
shadowBlur: 10,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.2)',
|
||||
},
|
||||
grid: {
|
||||
left: '5%',
|
||||
right: '5%',
|
||||
bottom: '15%',
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: chartData.map(item => item.month),
|
||||
axisLabel: {
|
||||
interval: 0,
|
||||
rotate: 45,
|
||||
fontWeight: 'bold',
|
||||
margin: 15,
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#999',
|
||||
},
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
name: '金额(元)',
|
||||
nameTextStyle: {
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
type: 'dashed',
|
||||
opacity: 0.6,
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '应还金额',
|
||||
type: 'bar',
|
||||
data: chartData.map(item => ({
|
||||
value: item.amount,
|
||||
displayAmount: item.displayAmount,
|
||||
level: item.level,
|
||||
levelRange: item.levelRange,
|
||||
})),
|
||||
itemStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: '#b8e986' },
|
||||
{ offset: 0.5, color: '#91CC75' },
|
||||
{ offset: 1, color: '#7cb362' },
|
||||
]),
|
||||
borderRadius: [5, 5, 0, 0],
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: '#91CC75' },
|
||||
{ offset: 0.7, color: '#7cb362' },
|
||||
{ offset: 1, color: '#6a9c53' },
|
||||
]),
|
||||
},
|
||||
},
|
||||
barWidth: '60%',
|
||||
barMinHeight: 3,
|
||||
showBackground: true,
|
||||
backgroundStyle: {
|
||||
color: 'rgba(180, 180, 180, 0.1)',
|
||||
},
|
||||
},
|
||||
],
|
||||
animation: true,
|
||||
}
|
||||
|
||||
repayChartInstance.value.setOption(option)
|
||||
}
|
||||
|
||||
// 绘制借贷应还趋势对比图
|
||||
function drawTrendChart() {
|
||||
if (!trendChartRef.value) return
|
||||
|
||||
if (!trendChartInstance.value) {
|
||||
trendChartInstance.value = echarts.init(trendChartRef.value)
|
||||
}
|
||||
|
||||
const borrowData = monthlyBorrowData.value
|
||||
const repayData = monthlyRepayData.value
|
||||
|
||||
const option = {
|
||||
title: {
|
||||
text: '审批额度与应还金额趋势对比',
|
||||
left: 'center',
|
||||
textStyle: {
|
||||
fontWeight: 'bold',
|
||||
fontSize: 16,
|
||||
},
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
backgroundColor: 'rgba(255, 255, 255, 0.8)',
|
||||
borderColor: '#ccc',
|
||||
borderWidth: 1,
|
||||
textStyle: {
|
||||
color: '#333',
|
||||
},
|
||||
shadowBlur: 10,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.2)',
|
||||
},
|
||||
legend: {
|
||||
data: ['审批额度', '应还金额'],
|
||||
top: 30,
|
||||
textStyle: {
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
},
|
||||
grid: {
|
||||
left: '5%',
|
||||
right: '5%',
|
||||
bottom: '15%',
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: borrowData.map(item => item.month),
|
||||
axisLabel: {
|
||||
interval: 0,
|
||||
rotate: 45,
|
||||
fontWeight: 'bold',
|
||||
margin: 15,
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#999',
|
||||
},
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
name: '金额(元)',
|
||||
nameTextStyle: {
|
||||
fontWeight: 'bold',
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
type: 'dashed',
|
||||
opacity: 0.6,
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '审批额度',
|
||||
type: 'line',
|
||||
data: borrowData.map(item => item.amount),
|
||||
smooth: true,
|
||||
symbol: 'emptyCircle',
|
||||
symbolSize: 8,
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.3)',
|
||||
shadowBlur: 10,
|
||||
shadowOffsetY: 8,
|
||||
},
|
||||
itemStyle: {
|
||||
color: '#5470C6',
|
||||
borderWidth: 2,
|
||||
},
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: 'rgba(84, 112, 198, 0.5)' },
|
||||
{ offset: 1, color: 'rgba(84, 112, 198, 0.1)' },
|
||||
]),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: '应还金额',
|
||||
type: 'line',
|
||||
data: repayData.map(item => item.amount),
|
||||
smooth: true,
|
||||
symbol: 'emptyCircle',
|
||||
symbolSize: 8,
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.3)',
|
||||
shadowBlur: 10,
|
||||
shadowOffsetY: 8,
|
||||
},
|
||||
itemStyle: {
|
||||
color: '#91CC75',
|
||||
borderWidth: 2,
|
||||
},
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: 'rgba(145, 204, 117, 0.5)' },
|
||||
{ offset: 1, color: 'rgba(145, 204, 117, 0.1)' },
|
||||
]),
|
||||
},
|
||||
},
|
||||
],
|
||||
animation: true,
|
||||
}
|
||||
|
||||
trendChartInstance.value.setOption(option)
|
||||
}
|
||||
|
||||
// 监听数据类型变化
|
||||
watch(dataType, () => {
|
||||
drawBorrowChart()
|
||||
drawRepayChart()
|
||||
drawTrendChart()
|
||||
})
|
||||
|
||||
// 初始化所有图表
|
||||
function initCharts() {
|
||||
drawBorrowChart()
|
||||
drawRepayChart()
|
||||
drawTrendChart()
|
||||
}
|
||||
|
||||
// 窗口大小变化时重绘图表
|
||||
function handleResize() {
|
||||
if (borrowChartInstance.value) borrowChartInstance.value.resize()
|
||||
if (repayChartInstance.value) repayChartInstance.value.resize()
|
||||
if (trendChartInstance.value) trendChartInstance.value.resize()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
initCharts()
|
||||
window.addEventListener('resize', handleResize)
|
||||
})
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
// 计算总借贷金额和还款金额
|
||||
const totalBorrowAmount = monthlyBorrowData.value.reduce((sum, item) => sum + item.totalAmount, 0);
|
||||
const totalRepayAmount = monthlyRepayData.value.reduce((sum, item) => sum + item.totalAmount, 0);
|
||||
|
||||
// 根据借贷金额计算风险评分
|
||||
// 0元:100分(最安全)
|
||||
// 1-10万:90分(较安全)
|
||||
// 10-50万:70分(中等风险)
|
||||
// 50-100万:50分(较高风险)
|
||||
// 100万以上:30分(高风险)
|
||||
const totalAmount = totalBorrowAmount + totalRepayAmount;
|
||||
if (totalAmount === 0) return 100;
|
||||
if (totalAmount <= 100000) return 90;
|
||||
if (totalAmount <= 500000) return 70;
|
||||
if (totalAmount <= 1000000) return 50;
|
||||
return 30;
|
||||
});
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore);
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('resize', handleResize)
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-4">
|
||||
<!-- 数据类型切换 -->
|
||||
<div class="p-6 bg-white rounded-lg shadow-sm border border-gray-100 relative overflow-hidden mb-4">
|
||||
<!-- 背景装饰元素 -->
|
||||
<div class="absolute top-0 right-0 w-32 h-32 bg-blue-50 rounded-full -mr-8 -mt-8 opacity-60"></div>
|
||||
<div class="absolute bottom-0 left-0 w-20 h-20 bg-green-50 rounded-full -ml-10 -mb-10 opacity-50"></div>
|
||||
|
||||
<div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4 relative z-10">
|
||||
<div class="space-y-2">
|
||||
<h2 class="text-xl font-semibold text-gray-800 flex items-center">借贷行为分析报告</h2>
|
||||
<p class="text-sm text-gray-600 ml-6">本报告统计审批额度与应还情况,帮助评估信贷风险</p>
|
||||
</div>
|
||||
<div v-if="mode === 'full'" class="flex flex-wrap gap-6 w-full md:w-auto">
|
||||
<div class="flex-1 md:flex-none flex rounded-md shadow-sm relative">
|
||||
<button type="button"
|
||||
class="flex-1 py-2 px-4 text-sm font-medium rounded-l-md border transition-all duration-200 flex items-center"
|
||||
:class="[
|
||||
dataType === 'id'
|
||||
? 'bg-gradient-to-r from-blue-500 to-blue-600 text-white border-blue-500 shadow-md'
|
||||
: 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50',
|
||||
]" @click="dataType = 'id'">
|
||||
<svg v-if="dataType === 'id'" class="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
<svg v-else class="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M10 6H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V8a2 2 0 00-2-2h-5m-4 0V5a2 2 0 114 0v1m-4 0a2 2 0 104 0m-5 8a2 2 0 100-4 2 2 0 000 4zm0 0c1.306 0 2.417.835 2.83 2M9 14a3.001 3.001 0 00-2.83 2M15 11h3m-3 4h2">
|
||||
</path>
|
||||
</svg>
|
||||
身份证数据
|
||||
</button>
|
||||
<button type="button"
|
||||
class="flex-1 py-2 px-4 text-sm font-medium rounded-r-md border transition-all duration-200 flex items-center"
|
||||
:class="[
|
||||
dataType === 'cell'
|
||||
? 'bg-gradient-to-r from-green-500 to-green-600 text-white border-green-500 shadow-md'
|
||||
: 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50',
|
||||
]" @click="dataType = 'cell'">
|
||||
<svg v-if="dataType === 'cell'" class="w-4 h-4 mr-1" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
<svg v-else class="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"></path>
|
||||
</svg>
|
||||
手机号数据
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 数据类型说明 -->
|
||||
<div v-if="mode === 'full'" class="mt-4 bg-blue-50 p-3 rounded-lg text-xs text-gray-700">
|
||||
<p class="font-medium text-blue-800 mb-1">数据类型说明:</p>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-2">
|
||||
<div class="flex items-start">
|
||||
<span class="inline-block w-2 h-2 mt-1 mr-2 rounded-full flex-shrink-0 bg-blue-500"></span>
|
||||
<span><strong>身份证数据:</strong>通过身份证号码匹配获取的借贷记录,反映与身份证关联的所有借贷行为</span>
|
||||
</div>
|
||||
<div class="flex items-start">
|
||||
<span class="inline-block w-2 h-2 mt-1 mr-2 rounded-full flex-shrink-0 bg-green-500"></span>
|
||||
<span><strong>手机号数据:</strong>通过手机号码匹配获取的借贷记录,反映与手机号关联的所有借贷行为</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 借贷金额图表 -->
|
||||
<LTitle title="近期审批额度" />
|
||||
<div ref="borrowChartRef" class="chart-container"></div>
|
||||
|
||||
<!-- 借贷机构数和借还差值比例表格 -->
|
||||
<LTitle title="近期通过借贷审批情况" />
|
||||
<div class="overflow-x-auto">
|
||||
<LTable :data="monthlyInstitutionData">
|
||||
<template #header>
|
||||
<th class="border px-1 py-2 text-xs min-w-[25%]">时间</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">借贷机构数</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">借贷次数</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">审批额度</th>
|
||||
</template>
|
||||
<template #default="{ row }">
|
||||
<td class="border px-1 py-2 text-xs">
|
||||
{{ row.month }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.orgCount }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.loanCount }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.borrowAmount }}
|
||||
</td>
|
||||
</template>
|
||||
</LTable>
|
||||
</div>
|
||||
|
||||
<!-- 近期借贷趋势表格 -->
|
||||
<LTitle title="近1年借贷情况" />
|
||||
<div class="overflow-x-auto">
|
||||
<LTable :data="recentBorrowTrends">
|
||||
<template #header>
|
||||
<th class="border px-1 py-2 text-xs min-w-[25%]">时间</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">借贷机构数</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">借贷次数</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">审批额度</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">应还金额</th>
|
||||
<th class="border px-1 py-2 text-xs min-w-[15%]">审批与应还比例</th>
|
||||
</template>
|
||||
<template #default="{ row }">
|
||||
<td class="border px-1 py-2 text-xs">
|
||||
{{ row.month }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.orgCount }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.loanCount }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.borrowAmount }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.repayAmount }}
|
||||
</td>
|
||||
<td class="border px-1 py-2 text-xs text-center">
|
||||
{{ row.ratio }}
|
||||
</td>
|
||||
</template>
|
||||
</LTable>
|
||||
</div>
|
||||
|
||||
<!-- 借贷行为总结 -->
|
||||
<LTitle title="借贷行为总结分析" />
|
||||
<div class="summary-container bg-blue-50 p-4 rounded-md">
|
||||
<div class="text-xs text-gray-500 mb-2">数据时间范围: 近1年</div>
|
||||
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-4">
|
||||
<div class="info-card p-3 bg-white rounded shadow-sm">
|
||||
<div class="text-sm text-gray-500">总申请次数</div>
|
||||
<div class="text-lg font-semibold">{{ behaviorSummary.totalApplications }}次</div>
|
||||
</div>
|
||||
<div class="info-card p-3 bg-white rounded shadow-sm">
|
||||
<div class="text-sm text-gray-500">借贷机构数</div>
|
||||
<div class="text-lg font-semibold">{{ behaviorSummary.totalOrgs }}家</div>
|
||||
</div>
|
||||
<div class="info-card p-3 bg-white rounded shadow-sm">
|
||||
<div class="text-sm text-gray-500">总审批额度</div>
|
||||
<div class="text-lg font-semibold">{{ behaviorSummary.totalAmount }}元</div>
|
||||
</div>
|
||||
<div class="info-card p-3 bg-white rounded shadow-sm">
|
||||
<div class="text-sm text-gray-500">月均申请次数</div>
|
||||
<div class="text-lg font-semibold">{{ behaviorSummary.avgMonthlyApplications }}次</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="risk-assessment p-4 bg-white rounded-md">
|
||||
<div class="text-lg font-bold mb-2">
|
||||
风险评估:
|
||||
<span :class="{
|
||||
'text-red-500': behaviorSummary.riskLevel === '高',
|
||||
'text-yellow-500': behaviorSummary.riskLevel === '中',
|
||||
'text-green-500': behaviorSummary.riskLevel === '低',
|
||||
}">{{ behaviorSummary.riskLevel }}风险</span>
|
||||
</div>
|
||||
<div class="text-gray-700">
|
||||
<p>
|
||||
· 月均审批额度:
|
||||
{{ behaviorSummary.avgMonthlyAmount }}元
|
||||
</p>
|
||||
<p>
|
||||
· 月均应还金额:
|
||||
{{ behaviorSummary.avgMonthlyRepay }}元
|
||||
</p>
|
||||
<p>· 还款比例: {{ behaviorSummary.repayRatio }}</p>
|
||||
<p>· {{ behaviorSummary.riskDesc }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.chart-container {
|
||||
width: 100%;
|
||||
height: 300px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
</style>
|
||||
65
src/ui/CQCXG7A2B.vue
Normal file
65
src/ui/CQCXG7A2B.vue
Normal file
@@ -0,0 +1,65 @@
|
||||
<template>
|
||||
<div class="card">
|
||||
<!-- 名下车辆信息展示 -->
|
||||
<div class="bg-yellow-100 text-yellow-700 p-4 rounded-lg">
|
||||
<h3 class="text-xl font-semibold">名下车辆</h3>
|
||||
<p class="text-sm">此人名下拥有车辆:{{ data?.carNum }} 辆</p>
|
||||
</div>
|
||||
|
||||
<!-- 校验对象展示 -->
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps, watch, computed } from 'vue';
|
||||
import { useRiskNotifier } from '@/composables/useRiskNotifier';
|
||||
|
||||
// 接收父组件传入的 props
|
||||
const props = defineProps({
|
||||
data: Object,
|
||||
params: Object,
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
});
|
||||
|
||||
// 脱敏函数:姓名脱敏(保留首位)
|
||||
const maskName = (name) => {
|
||||
if (!name) return '';
|
||||
return name.length > 1 ? name[0] + "*".repeat(name.length - 1) : "*";
|
||||
};
|
||||
|
||||
// 脱敏函数:身份证号脱敏(保留前6位和最后4位)
|
||||
const maskIdCard = (idCard) => {
|
||||
if (!idCard) return '';
|
||||
return idCard.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
|
||||
};
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
// 名下车辆不算风险,始终返回100分(最安全)
|
||||
return 100;
|
||||
});
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore);
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 自定义样式 */
|
||||
</style>
|
||||
@@ -1,238 +0,0 @@
|
||||
# CQYGL3F8E 人企关系加强版模块
|
||||
|
||||
## 概述
|
||||
|
||||
CQYGL3F8E 是人企关系加强版模块,提供全面的企业关联分析功能。该模块通过拆分功能,将原本的单一组件分解为三个独立的子模块,每个子模块专注于特定类型的企业关联信息展示。
|
||||
|
||||
## 模块结构
|
||||
|
||||
### 主模块
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/index.vue`
|
||||
- **功能**: 整合三个子模块,提供完整的人企关系分析视图
|
||||
- **API ID**: `QYGL3F8E`
|
||||
|
||||
### 子模块
|
||||
|
||||
#### 1. 投资企业记录 (Investment)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/Investment.vue`
|
||||
- **API ID**: `CQYGL3F8E_Investment`
|
||||
- **功能**: 展示用户作为股东、历史股东、法人、历史法人的企业记录
|
||||
- **数据来源**: 过滤 `relationship` 字段包含 `["sh", "his_sh", "lp", "his_lp"]` 的企业
|
||||
|
||||
#### 2. 高管任职记录 (SeniorExecutive)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/SeniorExecutive.vue`
|
||||
- **API ID**: `CQYGL3F8E_SeniorExecutive`
|
||||
- **功能**: 展示用户作为高管、历史高管的企业任职记录
|
||||
- **数据来源**: 过滤 `relationship` 字段包含 `["tm", "his_tm"]` 的企业
|
||||
|
||||
#### 3. 涉诉风险 (Lawsuit)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/Lawsuit.vue`
|
||||
- **API ID**: `CQYGL3F8E_Lawsuit`
|
||||
- **功能**: 展示存在涉诉风险的企业信息
|
||||
- **数据来源**: 过滤 `lawsuitInfo` 字段包含有效涉诉数据的企业
|
||||
|
||||
#### 4. 对外投资历史 (InvestHistory)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/InvestHistory.vue`
|
||||
- **API ID**: `CQYGL3F8E_InvestHistory`
|
||||
- **功能**: 展示企业的对外投资历史记录
|
||||
- **数据来源**: `invest_history` 字段
|
||||
|
||||
#### 5. 融资历史 (FinancingHistory)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/FinancingHistory.vue`
|
||||
- **API ID**: `CQYGL3F8E_FinancingHistory`
|
||||
- **功能**: 展示企业的融资历史记录
|
||||
- **数据来源**: `financing_history` 字段
|
||||
|
||||
#### 6. 行政处罚 (Punishment)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/Punishment.vue`
|
||||
- **API ID**: `CQYGL3F8E_Punishment`
|
||||
- **功能**: 展示企业的行政处罚记录
|
||||
- **数据来源**: `punishment_info` 字段
|
||||
|
||||
#### 7. 经营异常 (Abnormal)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/Abnormal.vue`
|
||||
- **API ID**: `CQYGL3F8E_Abnormal`
|
||||
- **功能**: 展示企业的经营异常记录
|
||||
- **数据来源**: `abnormal_info` 字段
|
||||
|
||||
#### 8. 欠税公告 (OwnTax)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/OwnTax.vue`
|
||||
- **API ID**: `CQYGL3F8E_OwnTax`
|
||||
- **功能**: 展示企业的欠税公告记录
|
||||
- **数据来源**: `own_tax` 字段
|
||||
|
||||
#### 9. 税收违法 (TaxContravention)
|
||||
- **文件位置**: `src/ui/CQYGL3F8E/components/TaxContravention.vue`
|
||||
- **API ID**: `CQYGL3F8E_TaxContravention`
|
||||
- **功能**: 展示企业的税收违法记录
|
||||
- **数据来源**: `tax_contravention` 字段
|
||||
|
||||
## 数据拆分逻辑
|
||||
|
||||
### 数据源结构
|
||||
```javascript
|
||||
{
|
||||
data: {
|
||||
apiID: 'QYGL3F8E',
|
||||
data: {
|
||||
items: [
|
||||
{
|
||||
orgName: '企业名称',
|
||||
relationship: ['sh', 'tm'], // 关系类型
|
||||
lawsuitInfo: { ... }, // 涉诉信息
|
||||
basicInfo: { ... }, // 基本信息
|
||||
stockHolderItem: { ... }, // 持股信息
|
||||
staffList: { ... } // 人员列表
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 拆分规则
|
||||
|
||||
#### 投资企业记录
|
||||
- **过滤条件**: `relationship` 包含投资类关系
|
||||
- **关系类型**: `["sh", "his_sh", "lp", "his_lp"]`
|
||||
- **包含字段**: 完整的企业信息,包括持股详情
|
||||
|
||||
#### 高管任职记录
|
||||
- **过滤条件**: `relationship` 包含高管类关系
|
||||
- **关系类型**: `["tm", "his_tm"]`
|
||||
- **包含字段**: 完整的企业信息,重点关注任职信息
|
||||
|
||||
#### 涉诉风险
|
||||
- **过滤条件**: `lawsuitInfo` 包含有效涉诉数据
|
||||
- **检查字段**:
|
||||
- `lawsuitInfo.entout.data` (非空对象)
|
||||
- `lawsuitInfo.sxbzxr.data.sxbzxr` (非空数组)
|
||||
- `lawsuitInfo.xgbzxr.data.xgbzxr` (非空数组)
|
||||
- **包含字段**: 涉诉企业和总数统计
|
||||
|
||||
#### 对外投资历史
|
||||
- **数据来源**: `invest_history.items` 数组
|
||||
- **包含字段**: 投资企业信息、持股比例、注册资本等
|
||||
|
||||
#### 融资历史
|
||||
- **数据来源**: `financing_history.items` 数组
|
||||
- **包含字段**: 融资轮次、融资金额、投资者、新闻信息等
|
||||
|
||||
#### 行政处罚
|
||||
- **数据来源**: `punishment_info.items` 数组
|
||||
- **包含字段**: 处罚类型、处罚金额、处罚原因、处罚部门等
|
||||
|
||||
#### 经营异常
|
||||
- **数据来源**: `abnormal_info.items` 数组
|
||||
- **包含字段**: 异常原因、列入/移出日期、相关部门等
|
||||
|
||||
#### 欠税公告
|
||||
- **数据来源**: `own_tax.items` 数组
|
||||
- **包含字段**: 欠税金额、税务类型、欠税税种、纳税人信息、税务机关等
|
||||
|
||||
#### 税收违法
|
||||
- **数据来源**: `tax_contravention.items` 数组
|
||||
- **包含字段**: 案件性质、违法ID、税务机关、发布时间、纳税人名称等
|
||||
|
||||
## 工具函数
|
||||
|
||||
### simpleSplitter.js
|
||||
位置: `src/ui/CQYGL3F8E/utils/simpleSplitter.js`
|
||||
|
||||
#### 主要函数
|
||||
- `splitCQYGL3F8EForTabs(reportData)`: 数据拆分主函数
|
||||
- `getRelationshipText(relation)`: 获取关系文本描述
|
||||
- `getRelationshipClass(relation)`: 获取关系样式类
|
||||
- `getStatusClass(status)`: 获取企业状态样式类
|
||||
- `formatCapital(capital, currency)`: 格式化资本金额
|
||||
- `formatDate(dateStr)`: 格式化日期显示
|
||||
|
||||
## 集成配置
|
||||
|
||||
### BaseReport.vue 配置
|
||||
```javascript
|
||||
// 导入拆分函数
|
||||
import { splitCQYGL3F8EForTabs } from '@/ui/CQYGL3F8E/utils/simpleSplitter.js';
|
||||
|
||||
// 数据处理
|
||||
const processedReportData = computed(() => {
|
||||
let data = reportData.value;
|
||||
// ... 其他拆分
|
||||
data = splitCQYGL3F8EForTabs(data);
|
||||
return data;
|
||||
});
|
||||
|
||||
// 功能映射
|
||||
const featureMap = {
|
||||
QYGL3F8E: {
|
||||
name: "人企关系加强版",
|
||||
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/index.vue")),
|
||||
remark: '人企关系加强版提供全面的企业关联分析,包括投资企业记录、高管任职记录和涉诉风险等多维度信息。'
|
||||
},
|
||||
CQYGL3F8E_Investment: {
|
||||
name: "投资企业记录",
|
||||
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/Investment.vue")),
|
||||
},
|
||||
CQYGL3F8E_SeniorExecutive: {
|
||||
name: "高管任职记录",
|
||||
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/SeniorExecutive.vue")),
|
||||
},
|
||||
CQYGL3F8E_Lawsuit: {
|
||||
name: "涉诉风险",
|
||||
component: defineAsyncComponent(() => import("@/ui/CQYGL3F8E/components/Lawsuit.vue")),
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## 使用方式
|
||||
|
||||
### 完整视图
|
||||
访问 `QYGL3F8E` 将显示完整的人企关系分析,包含所有九个子模块。
|
||||
|
||||
### 独立子模块
|
||||
- 访问 `CQYGL3F8E_Investment` 仅显示投资企业记录
|
||||
- 访问 `CQYGL3F8E_SeniorExecutive` 仅显示高管任职记录
|
||||
- 访问 `CQYGL3F8E_Lawsuit` 仅显示涉诉风险
|
||||
- 访问 `CQYGL3F8E_InvestHistory` 仅显示对外投资历史
|
||||
- 访问 `CQYGL3F8E_FinancingHistory` 仅显示融资历史
|
||||
- 访问 `CQYGL3F8E_Punishment` 仅显示行政处罚
|
||||
- 访问 `CQYGL3F8E_Abnormal` 仅显示经营异常
|
||||
- 访问 `CQYGL3F8E_OwnTax` 仅显示欠税公告
|
||||
- 访问 `CQYGL3F8E_TaxContravention` 仅显示税收违法
|
||||
|
||||
## 特性
|
||||
|
||||
### 1. 数据过滤
|
||||
- 基于关系类型智能过滤企业数据
|
||||
- 支持多种关系类型的组合展示
|
||||
|
||||
### 2. 展开式详情
|
||||
- 企业卡片支持点击展开查看详细信息
|
||||
- 包含持股信息、基本信息、联系方式等
|
||||
|
||||
### 3. 状态标识
|
||||
- 企业状态颜色编码(存续、注销、吊销等)
|
||||
- 关系类型标签展示
|
||||
|
||||
### 4. 数据格式化
|
||||
- 资本金额自动转换为万元单位
|
||||
- 日期格式化显示
|
||||
- 持股比例可视化进度条
|
||||
|
||||
### 5. 响应式设计
|
||||
- 支持移动端和桌面端
|
||||
- 自适应布局和交互
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **数据完整性**: 拆分后的数据保持原始结构的完整性
|
||||
2. **性能优化**: 使用 `defineAsyncComponent` 实现组件懒加载
|
||||
3. **错误处理**: 对缺失数据进行安全处理,避免渲染错误
|
||||
4. **样式一致性**: 保持与整体设计系统的视觉一致性
|
||||
|
||||
## 更新历史
|
||||
|
||||
- **v1.0.0**: 初始版本,支持基本的企业关联信息展示
|
||||
- **v2.0.0**: 模块拆分重构,支持独立子模块访问
|
||||
- **v2.1.0**: 优化数据处理逻辑,增强错误处理能力
|
||||
- **v2.2.0**: 新增欠税公告和税收违法模块,完善企业风险分析功能
|
||||
@@ -256,11 +256,129 @@ const props = defineProps({
|
||||
},
|
||||
})
|
||||
|
||||
// 从data中解构出需要的字段
|
||||
// 从data中解构出需要的字段 - 优先使用新数据结构
|
||||
const courtRiskInfos = computed(() => {
|
||||
return props.data?.judiciaRiskInfos || []
|
||||
// 检查是否存在新数据结构 (judicialLeaseReport)
|
||||
if (props.data?.judicialLeaseReport) {
|
||||
return transformJudicialLeaseReport(props.data.judicialLeaseReport)
|
||||
}
|
||||
|
||||
// 兼容旧数据结构 (judiciaRiskInfos)
|
||||
if (props.data?.judiciaRiskInfos && Array.isArray(props.data.judiciaRiskInfos)) {
|
||||
return props.data.judiciaRiskInfos
|
||||
}
|
||||
|
||||
return []
|
||||
})
|
||||
|
||||
// 转换司法数据报告为新格式
|
||||
const transformJudicialLeaseReport = (judicialLeaseReport) => {
|
||||
const result = []
|
||||
const newMultCourtInfo = judicialLeaseReport?.courtInfo?.newMultCourtInfo || {}
|
||||
|
||||
// 定义案件类型映射
|
||||
const caseTypeMappings = [
|
||||
{ key: 'criminalCases', type: '刑事案件', caseTypeLabel: '涉案公告' },
|
||||
{ key: 'enforcementCases', type: '执行案件', caseTypeLabel: '执行公告' },
|
||||
{ key: 'civilCases', type: '民事案件', caseTypeLabel: '涉案公告' },
|
||||
{ key: 'administrativeCases', type: '行政案件', caseTypeLabel: '涉案公告' },
|
||||
{ key: 'preservationCases', type: '非诉保全审查案件', caseTypeLabel: '非诉保全审查案件' },
|
||||
{ key: 'bankruptcyCases', type: '强制清算与破产案件', caseTypeLabel: '强制清算与破产案件' },
|
||||
]
|
||||
|
||||
// 转换各类案件
|
||||
caseTypeMappings.forEach(mapping => {
|
||||
const cases = newMultCourtInfo[mapping.key]
|
||||
if (cases && Array.isArray(cases)) {
|
||||
cases.forEach(caseItem => {
|
||||
result.push(transformCourtCaseItem(caseItem, mapping.caseTypeLabel))
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// 转换失信公告
|
||||
const disinCases = newMultCourtInfo.disinCases
|
||||
if (disinCases && Array.isArray(disinCases)) {
|
||||
disinCases.forEach(disinItem => {
|
||||
result.push(transformDisinCaseItem(disinItem))
|
||||
})
|
||||
}
|
||||
|
||||
// 转换限高公告
|
||||
const limitCases = newMultCourtInfo.limitCases
|
||||
if (limitCases && Array.isArray(limitCases)) {
|
||||
limitCases.forEach(limitItem => {
|
||||
result.push(transformLimitCaseItem(limitItem))
|
||||
})
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// 转换普通案件项
|
||||
const transformCourtCaseItem = (caseItem, typeLabel) => {
|
||||
return {
|
||||
caseNumber: caseItem.caseNumber || '',
|
||||
caseReason: caseItem.nlaayTree || '',
|
||||
caseStatus: caseItem.caseStatus || '',
|
||||
caseType: caseItem.najlx || '',
|
||||
court: caseItem.njbfy || caseItem.zxfy || '',
|
||||
disposalMethod: caseItem.njafs || '',
|
||||
disposalTime: caseItem.djarq || '',
|
||||
executionAmount: caseItem.nsqzxbdje || caseItem.njabdje || '',
|
||||
filingTime: caseItem.dlarq || '',
|
||||
judgmentResult: caseItem.cgkwsPjjg || '',
|
||||
litigantType: caseItem.nssdw || '',
|
||||
type: typeLabel,
|
||||
oldCaseNumber: caseItem.cahHx || '',
|
||||
repaidAmount: caseItem.nsjdwje || '',
|
||||
matchScore: null
|
||||
}
|
||||
}
|
||||
|
||||
// 转换失信公告项
|
||||
const transformDisinCaseItem = (disinItem) => {
|
||||
return {
|
||||
caseNumber: disinItem.ah || '',
|
||||
caseReason: '失信被执行人',
|
||||
caseStatus: '失信中',
|
||||
caseType: '失信公告',
|
||||
court: disinItem.zxfy || '',
|
||||
disposalMethod: '失信',
|
||||
disposalTime: disinItem.fbrq || '',
|
||||
executionAmount: disinItem.pjjeGj || '',
|
||||
filingTime: disinItem.larq || '',
|
||||
judgmentResult: disinItem.yw || '',
|
||||
litigantType: '被执行人',
|
||||
type: '失信公告',
|
||||
oldCaseNumber: disinItem.zxyjwh || '',
|
||||
repaidAmount: '',
|
||||
contentSummary: `失信情形: ${disinItem.xwqx || ''}\n履行情况: ${disinItem.lxqk || ''}`,
|
||||
matchScore: null
|
||||
}
|
||||
}
|
||||
|
||||
// 转换限高公告项
|
||||
const transformLimitCaseItem = (limitItem) => {
|
||||
return {
|
||||
caseNumber: limitItem.ah || '',
|
||||
caseReason: '限制高消费',
|
||||
caseStatus: '限高中',
|
||||
caseType: '限高公告',
|
||||
court: limitItem.zxfy || '',
|
||||
disposalMethod: '限高',
|
||||
disposalTime: limitItem.fbrq || '',
|
||||
executionAmount: '',
|
||||
filingTime: limitItem.larq || '',
|
||||
judgmentResult: '',
|
||||
litigantType: '被执行人',
|
||||
type: '限高公告',
|
||||
oldCaseNumber: '',
|
||||
repaidAmount: '',
|
||||
matchScore: null
|
||||
}
|
||||
}
|
||||
|
||||
// 折叠面板状态
|
||||
const activeCases = ref({})
|
||||
|
||||
|
||||
@@ -205,6 +205,7 @@ export function splitDWBG6A2CForTabs(reportData) {
|
||||
}
|
||||
|
||||
// 14. 法院风险信息
|
||||
// 检查旧数据结构 (judiciaRiskInfos)
|
||||
if (originalData.judiciaRiskInfos && originalData.judiciaRiskInfos.length > 0) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
@@ -217,6 +218,19 @@ export function splitDWBG6A2CForTabs(reportData) {
|
||||
}
|
||||
});
|
||||
}
|
||||
// 检查新数据结构 (judicialLeaseReport)
|
||||
else if (originalData.judicialLeaseReport) {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: 'DWBG6A2C_CourtRiskInfo',
|
||||
data: {
|
||||
judicialLeaseReport: originalData.judicialLeaseReport
|
||||
},
|
||||
success: true,
|
||||
timestamp: baseTimestamp
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 移除原始的DWBG6A2C数据,添加拆分后的模块
|
||||
const otherData = reportData.filter(item => item.data?.apiID !== 'DWBG6A2C');
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
<!-- 说明 -->
|
||||
<div class="p-4">
|
||||
<div class="text-xs text-gray-500">
|
||||
<div class="text-sm text-gray-500">
|
||||
<div>分数区间为0~100分,分数越高风险越大</div>
|
||||
<div class="mt-1">风险等级:1=低风险、2=中风险、3=高风险</div>
|
||||
</div>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
<!-- 说明 -->
|
||||
<div class="p-4">
|
||||
<div class="text-xs text-gray-500">
|
||||
<div class="text-sm text-gray-500">
|
||||
<div>风险等级:1=低风险、2=中风险、3=高风险</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
</div>
|
||||
<div class="text-xs text-gray-500 px-4">注:白天8-23点,夜晚0点-7点</div>
|
||||
<div class="text-sm text-gray-500 px-4">注:白天8-23点,夜晚0点-7点</div>
|
||||
</div>
|
||||
|
||||
<!-- 白天/凌晨申请平台数统计 -->
|
||||
@@ -257,7 +257,7 @@
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
</div>
|
||||
<div class="text-xs text-gray-500 px-4 mt-2">注:格式为 银行平台/总平台</div>
|
||||
<div class="text-sm text-gray-500 px-4 mt-2">注:格式为 银行平台/总平台</div>
|
||||
</div>
|
||||
|
||||
<!-- 查询天数差 -->
|
||||
@@ -394,7 +394,7 @@ const applicationCountChartOption = computed(() => {
|
||||
type: 'category',
|
||||
data: periods,
|
||||
axisLabel: {
|
||||
fontSize: 10,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
rotate: 45
|
||||
},
|
||||
@@ -407,7 +407,7 @@ const applicationCountChartOption = computed(() => {
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
formatter: '{value} 次'
|
||||
},
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
{{ formatScore(data.longCycle) }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="text-xs text-gray-500 ml-2">长周期指窗口期6个月+</div>
|
||||
<div class="text-sm text-gray-500 ml-2">长周期指窗口期6个月+</div>
|
||||
<div class="flex justify-between items-center text-sm">
|
||||
<span class="text-gray-600">非银行多头共债子分</span>
|
||||
<span class="text-[#333333] font-bold" :class="getScoreClass(data.nonBank)">
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
<!-- 说明 -->
|
||||
<div class="p-4">
|
||||
<div class="text-xs text-gray-500">
|
||||
<div class="text-sm text-gray-500">
|
||||
<div>注:分数区间为0~100分,分数越高风险越大</div>
|
||||
<div class="mt-1">短周期指窗口期7天~3个月</div>
|
||||
</div>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<span class="font-bold text-gray-800">多头逾期</span>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<div class="text-xs text-gray-500 px-4 mb-4">注:行为推断得到</div>
|
||||
<div class="text-sm text-gray-500 px-4 mb-4">注:行为推断得到</div>
|
||||
|
||||
<!-- 逾期概览 -->
|
||||
<div class="mb-6">
|
||||
@@ -271,7 +271,7 @@ const overduePlatformChartOption = computed(() => {
|
||||
type: 'category',
|
||||
data: periods,
|
||||
axisLabel: {
|
||||
fontSize: 10,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
rotate: 45
|
||||
},
|
||||
@@ -284,7 +284,7 @@ const overduePlatformChartOption = computed(() => {
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
formatter: '{value} 家'
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="flex flex-col gap-4">
|
||||
<!-- 多头共债子分 -->
|
||||
<MultipleDebtScoreSection :data="riskData.multipleDebtScore" />
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 解析多头借贷行业风险版数据
|
||||
* 解析多头借贷数据
|
||||
* @param {Array} riskInfo - riskInfo_report_v3.1 数组
|
||||
* @returns {Object} 解析后的结构化数据
|
||||
*/
|
||||
|
||||
@@ -358,7 +358,7 @@
|
||||
<span class="text-base text-[#666666]">后续案件:</span>
|
||||
<span class="text-base font-medium text-[#333333]">
|
||||
{{ caseData.next.c_ah }}
|
||||
<span v-if="caseData.next.stage_type" class="ml-2 text-xs px-2 py-0.5 rounded bg-[#EB3C3C1A] text-[#EB3C3C]">
|
||||
<span v-if="caseData.next.stage_type" class="ml-2 text-sm px-2 py-0.5 rounded bg-[#EB3C3C1A] text-[#EB3C3C]">
|
||||
{{
|
||||
caseData.next.stage_type === 2
|
||||
? "二审"
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<div class="p-4 bg-[#EB3C3C1A] border border-[#EB3C3C4D] rounded-xl text-center">
|
||||
<div class="text-2xl font-bold text-[#EB3C3C] mb-1">{{ stats.totalRiskItems || 0 }}项</div>
|
||||
<div class="text-sm font-medium text-gray-800 mb-1">风险事项</div>
|
||||
<div class="text-xs text-gray-500">
|
||||
<div class="text-sm text-gray-500">
|
||||
平均{{ stats.totalRiskItems && totalCases > 0 ?
|
||||
(stats.totalRiskItems / totalCases).toFixed(1) :
|
||||
'0.0'
|
||||
@@ -42,12 +42,12 @@
|
||||
<div class="p-4 bg-[#EB3C3C1A] border border-[#EB3C3C4D] rounded-xl text-center">
|
||||
<div class="text-2xl font-bold text-[#EB3C3C] mb-1">{{ stats.highRiskItems || 0 }}家</div>
|
||||
<div class="text-sm font-medium text-gray-800 mb-1">高风险案件</div>
|
||||
<div class="text-xs text-gray-500 mb-1">
|
||||
<div class="text-sm text-gray-500 mb-1">
|
||||
占比{{ totalCases > 0 && stats ?
|
||||
((stats.highRiskItems /
|
||||
totalCases) * 100).toFixed(1) : '0.0' }}%
|
||||
</div>
|
||||
<div class="text-xs text-orange-600">
|
||||
<div class="text-sm text-orange-600">
|
||||
<span class="mr-3">失信{{ stats.breachCaseCount || 0 }}</span>
|
||||
<span style="color: #D6943E;">限高{{ stats.consumptionRestrictionCount || 0 }}</span>
|
||||
</div>
|
||||
@@ -57,7 +57,7 @@
|
||||
<div class="p-4 bg-[#2B79EE1A] border border-[#2B79EE4D] rounded-xl text-center">
|
||||
<div class="text-2xl font-bold text-[#2B79EE] mb-1">{{ stats.closedCases || 0 }}家</div>
|
||||
<div class="text-sm font-medium text-gray-800 mb-1">已结案件</div>
|
||||
<div class="text-xs text-gray-500">
|
||||
<div class="text-sm text-gray-500">
|
||||
占比{{ totalCases > 0 && stats ?
|
||||
Math.round((stats.closedCases / totalCases) * 100) :
|
||||
0
|
||||
@@ -69,7 +69,7 @@
|
||||
<div class="p-4 bg-[#2B79EE1A] border border-[#2B79EE4D] rounded-xl text-center">
|
||||
<div class="text-2xl font-bold text-[#2B79EE] mb-1">{{ stats.caseTypes.length || 0 }}家</div>
|
||||
<div class="text-sm font-medium text-gray-800 mb-1">案件类型</div>
|
||||
<div class="text-xs text-gray-500">
|
||||
<div class="text-sm text-gray-500">
|
||||
涉及多种类型
|
||||
</div>
|
||||
</div>
|
||||
@@ -200,7 +200,7 @@ const caseTypeChartOption = computed(() => {
|
||||
},
|
||||
},
|
||||
axisLabel: {
|
||||
fontSize: 10,
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
},
|
||||
axisLine: {
|
||||
@@ -213,7 +213,7 @@ const caseTypeChartOption = computed(() => {
|
||||
type: 'category',
|
||||
data: categories,
|
||||
axisLabel: {
|
||||
fontSize: 10,
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
},
|
||||
axisLine: {
|
||||
@@ -242,7 +242,7 @@ const caseTypeChartOption = computed(() => {
|
||||
label: {
|
||||
show: true,
|
||||
position: 'right',
|
||||
fontSize: 10,
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
formatter: function (params) {
|
||||
// 如果是0.1(实际为0),显示为0
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
<div class="font-bold text-base text-[#333333] mr-2">{{ caseItem.c_ah || caseItem.caseNumber || '暂无案号' }}</div>
|
||||
|
||||
<!-- 案件类型标签 -->
|
||||
<span class="px-2 py-1 text-xs rounded-md font-medium bg-[#F9ECEC] text-[#EB3C3C]">
|
||||
<span class="px-2 py-1 text-sm rounded-md font-medium bg-[#F9ECEC] text-[#EB3C3C]">
|
||||
{{ getCaseTypeText(caseItem.type) }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -68,19 +68,19 @@
|
||||
<!-- 底部区域:风险等级和案件状态 -->
|
||||
<div class="flex items-center gap-2">
|
||||
<!-- 风险等级标签 -->
|
||||
<span class="px-2 py-1 text-xs rounded-md font-medium"
|
||||
<span class="px-2 py-1 text-sm rounded-md font-medium"
|
||||
:class="getCaseTypeRiskLevel(caseItem.type).color">
|
||||
{{ getCaseTypeRiskLevel(caseItem.type).text }}
|
||||
</span>
|
||||
<!-- 案件状态标签 -->
|
||||
<span v-if="caseItem.n_ajjzjd" class="px-2 py-1 text-xs rounded-md font-medium"
|
||||
<span v-if="caseItem.n_ajjzjd" class="px-2 py-1 text-sm rounded-md font-medium"
|
||||
:class="getCaseStatusClass(caseItem.n_ajjzjd)">
|
||||
{{ caseItem.n_ajjzjd }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- 展开指示器 -->
|
||||
<div class="absolute right-4 bottom-3 flex items-center text-xs text-gray-500">
|
||||
<div class="absolute right-4 bottom-3 flex items-center text-sm text-gray-500">
|
||||
<img src="@/assets/images/report/zk.png" alt="展开" class="w-4 h-4 container"
|
||||
:class="{ 'rotate-180': isCaseExpanded(caseItem.id || index, 'case', index) }" />
|
||||
</div>
|
||||
|
||||
@@ -1,337 +1,317 @@
|
||||
// 案件类型映射表
|
||||
export const lawsuitTypeMap = {
|
||||
breachCase: {
|
||||
text: "失信被执行",
|
||||
color: "text-red-600 bg-red-50",
|
||||
darkColor: "bg-red-500",
|
||||
riskLevel: "high", // 高风险
|
||||
},
|
||||
consumptionRestriction: {
|
||||
text: "限高被执行",
|
||||
color: "text-orange-600 bg-orange-50",
|
||||
darkColor: "bg-orange-500",
|
||||
riskLevel: "high", // 高风险
|
||||
},
|
||||
criminal: {
|
||||
text: "刑事案件",
|
||||
color: "text-red-600 bg-red-50",
|
||||
darkColor: "bg-red-500",
|
||||
riskLevel: "high", // 高风险
|
||||
},
|
||||
civil: {
|
||||
text: "民事案件",
|
||||
color: "text-blue-600 bg-blue-50",
|
||||
darkColor: "bg-blue-500",
|
||||
riskLevel: "medium", // 中风险
|
||||
},
|
||||
administrative: {
|
||||
text: "行政案件",
|
||||
color: "text-purple-600 bg-purple-50",
|
||||
darkColor: "bg-purple-500",
|
||||
riskLevel: "medium", // 中风险
|
||||
},
|
||||
implement: {
|
||||
text: "执行案件",
|
||||
color: "text-orange-600 bg-orange-50",
|
||||
darkColor: "bg-orange-500",
|
||||
riskLevel: "medium", // 中风险
|
||||
},
|
||||
bankrupt: {
|
||||
text: "强制清算与破产案件",
|
||||
color: "text-rose-600 bg-rose-50",
|
||||
darkColor: "bg-rose-500",
|
||||
riskLevel: "high", // 高风险
|
||||
},
|
||||
preservation: {
|
||||
text: "非诉保全审查",
|
||||
color: "text-amber-600 bg-amber-50",
|
||||
darkColor: "bg-amber-500",
|
||||
riskLevel: "low", // 低风险
|
||||
},
|
||||
};
|
||||
breachCase: {
|
||||
text: '失信被执行',
|
||||
color: 'text-red-600 bg-red-50',
|
||||
darkColor: 'bg-red-500',
|
||||
riskLevel: 'high', // 高风险
|
||||
},
|
||||
consumptionRestriction: {
|
||||
text: '限高被执行',
|
||||
color: 'text-orange-600 bg-orange-50',
|
||||
darkColor: 'bg-orange-500',
|
||||
riskLevel: 'high', // 高风险
|
||||
},
|
||||
criminal: {
|
||||
text: '刑事案件',
|
||||
color: 'text-red-600 bg-red-50',
|
||||
darkColor: 'bg-red-500',
|
||||
riskLevel: 'high', // 高风险
|
||||
},
|
||||
civil: {
|
||||
text: '民事案件',
|
||||
color: 'text-blue-600 bg-blue-50',
|
||||
darkColor: 'bg-blue-500',
|
||||
riskLevel: 'medium', // 中风险
|
||||
},
|
||||
administrative: {
|
||||
text: '行政案件',
|
||||
color: 'text-purple-600 bg-purple-50',
|
||||
darkColor: 'bg-purple-500',
|
||||
riskLevel: 'medium', // 中风险
|
||||
},
|
||||
implement: {
|
||||
text: '执行案件',
|
||||
color: 'text-orange-600 bg-orange-50',
|
||||
darkColor: 'bg-orange-500',
|
||||
riskLevel: 'medium', // 中风险
|
||||
},
|
||||
bankrupt: {
|
||||
text: '强制清算与破产案件',
|
||||
color: 'text-rose-600 bg-rose-50',
|
||||
darkColor: 'bg-rose-500',
|
||||
riskLevel: 'high', // 高风险
|
||||
},
|
||||
preservation: {
|
||||
text: '非诉保全审查',
|
||||
color: 'text-amber-600 bg-amber-50',
|
||||
darkColor: 'bg-amber-500',
|
||||
riskLevel: 'low', // 低风险
|
||||
},
|
||||
}
|
||||
|
||||
// 案件类型文本
|
||||
export const getCaseTypeText = (type) => {
|
||||
return lawsuitTypeMap[type]?.text || "其他案件";
|
||||
};
|
||||
export const getCaseTypeText = type => {
|
||||
return lawsuitTypeMap[type]?.text || '其他案件'
|
||||
}
|
||||
|
||||
// 案件类型颜色
|
||||
export const getCaseTypeColor = (type) => {
|
||||
return lawsuitTypeMap[type]?.color || "text-gray-600 bg-gray-50";
|
||||
};
|
||||
export const getCaseTypeColor = type => {
|
||||
return lawsuitTypeMap[type]?.color || 'text-gray-600 bg-gray-50'
|
||||
}
|
||||
|
||||
// 案件类型深色
|
||||
export const getCaseTypeDarkColor = (type) => {
|
||||
return lawsuitTypeMap[type]?.darkColor || "bg-gray-500";
|
||||
};
|
||||
export const getCaseTypeDarkColor = type => {
|
||||
return lawsuitTypeMap[type]?.darkColor || 'bg-gray-500'
|
||||
}
|
||||
|
||||
// 格式化日期显示
|
||||
export const formatDate = (dateStr) => {
|
||||
if (!dateStr) return "—";
|
||||
// 转换YYYY-MM-DD为年月日格式
|
||||
if (dateStr.includes("-")) {
|
||||
const parts = dateStr.split("-");
|
||||
if (parts.length === 3) {
|
||||
return `${parts[0]}年${parts[1]}月${parts[2]}日`;
|
||||
}
|
||||
export const formatDate = dateStr => {
|
||||
if (!dateStr) return '—'
|
||||
// 转换YYYY-MM-DD为年月日格式
|
||||
if (dateStr.includes('-')) {
|
||||
const parts = dateStr.split('-')
|
||||
if (parts.length === 3) {
|
||||
return `${parts[0]}年${parts[1]}月${parts[2]}日`
|
||||
}
|
||||
return dateStr; // 如果不是标准格式则返回原始字符串
|
||||
};
|
||||
}
|
||||
return dateStr // 如果不是标准格式则返回原始字符串
|
||||
}
|
||||
|
||||
// 格式化金额显示(默认单位:元)
|
||||
export const formatLawsuitMoney = (money) => {
|
||||
if (!money) return "—";
|
||||
// 格式化金额显示(单位:元)
|
||||
export const formatLawsuitMoney = money => {
|
||||
if (!money) return '—'
|
||||
|
||||
const value = parseFloat(money);
|
||||
if (isNaN(value)) return "—";
|
||||
|
||||
// 超过1亿(100000000元)显示亿元
|
||||
if (value >= 100000000) {
|
||||
return (
|
||||
(value / 100000000).toLocaleString("zh-CN", {
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 2,
|
||||
}) + " 亿元"
|
||||
);
|
||||
// 如果是字符串类型,检查是否已经包含单位
|
||||
if (typeof money === 'string') {
|
||||
// 匹配常见的金额单位:元、万元、亿元、万、亿等
|
||||
const unitPattern = /(元|万元|亿元|万|亿|千元|百元|角|分)\s*$/
|
||||
const unitMatch = money.match(unitPattern)
|
||||
|
||||
if (unitMatch) {
|
||||
// 已经包含单位,提取数字部分和单位
|
||||
const unit = unitMatch[1]
|
||||
// 提取数字部分(包括小数点和逗号分隔符)
|
||||
const numMatch = money.replace(unitPattern, '').trim().replace(/,/g, '')
|
||||
const value = parseFloat(numMatch)
|
||||
|
||||
if (isNaN(value)) return '—'
|
||||
|
||||
// 格式化数字并保留原有单位
|
||||
return (
|
||||
value.toLocaleString('zh-CN', {
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 2,
|
||||
}) + (unit.includes('元') ? ` ${unit}` : ` ${unit}元`)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// 超过1万(10000元)显示万元
|
||||
if (value >= 10000) {
|
||||
return (
|
||||
(value / 10000).toLocaleString("zh-CN", {
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 2,
|
||||
}) + " 万元"
|
||||
);
|
||||
}
|
||||
|
||||
// 小于1万直接显示元
|
||||
return (
|
||||
value.toLocaleString("zh-CN", {
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 2,
|
||||
}) + " 元"
|
||||
);
|
||||
};
|
||||
// 没有单位,按数字处理并添加"元"
|
||||
const value = parseFloat(money)
|
||||
if (isNaN(value)) return '—'
|
||||
return (
|
||||
value.toLocaleString('zh-CN', {
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 2,
|
||||
}) + ' 元'
|
||||
)
|
||||
}
|
||||
|
||||
// 获取案件状态样式
|
||||
export const getCaseStatusClass = (status) => {
|
||||
if (!status) return "bg-gray-100 text-gray-500";
|
||||
export const getCaseStatusClass = status => {
|
||||
if (!status) return 'bg-gray-100 text-gray-500'
|
||||
|
||||
if (status.includes("已结") || status.includes("已办结")) {
|
||||
return "bg-green-50 text-green-600";
|
||||
} else if (status.includes("执行中") || status.includes("审理中")) {
|
||||
return "bg-blue-50 text-blue-600";
|
||||
} else if (status.includes("未执行")) {
|
||||
return "bg-amber-50 text-amber-600";
|
||||
} else {
|
||||
return "bg-gray-100 text-gray-500";
|
||||
}
|
||||
};
|
||||
if (status.includes('已结') || status.includes('已办结')) {
|
||||
return 'bg-green-50 text-green-600'
|
||||
} else if (status.includes('执行中') || status.includes('审理中')) {
|
||||
return 'bg-blue-50 text-blue-600'
|
||||
} else if (status.includes('未执行')) {
|
||||
return 'bg-amber-50 text-amber-600'
|
||||
} else {
|
||||
return 'bg-gray-100 text-gray-500'
|
||||
}
|
||||
}
|
||||
|
||||
// 获取企业状态对应的样式
|
||||
export const getStatusClass = (status) => {
|
||||
if (!status) return "bg-gray-100 text-gray-500";
|
||||
export const getStatusClass = status => {
|
||||
if (!status) return 'bg-gray-100 text-gray-500'
|
||||
|
||||
if (status.includes("注销") || status.includes("吊销")) {
|
||||
return "bg-red-50 text-red-600";
|
||||
} else if (status.includes("存续") || status.includes("在营")) {
|
||||
return "bg-green-50 text-green-600";
|
||||
} else if (status.includes("筹建") || status.includes("新设")) {
|
||||
return "bg-blue-50 text-blue-600";
|
||||
} else {
|
||||
return "bg-yellow-50 text-yellow-600";
|
||||
}
|
||||
};
|
||||
if (status.includes('注销') || status.includes('吊销')) {
|
||||
return 'bg-red-50 text-red-600'
|
||||
} else if (status.includes('存续') || status.includes('在营')) {
|
||||
return 'bg-green-50 text-green-600'
|
||||
} else if (status.includes('筹建') || status.includes('新设')) {
|
||||
return 'bg-blue-50 text-blue-600'
|
||||
} else {
|
||||
return 'bg-yellow-50 text-yellow-600'
|
||||
}
|
||||
}
|
||||
|
||||
// 格式化资本金额显示
|
||||
export const formatCapital = (capital, currency) => {
|
||||
if (!capital) return "—";
|
||||
if (!capital) return '—'
|
||||
|
||||
// 检查是否包含"万"字或需要显示为万元
|
||||
let unit = "";
|
||||
let value = parseFloat(capital);
|
||||
// 检查是否包含"万"字或需要显示为万元
|
||||
let unit = ''
|
||||
let value = parseFloat(capital)
|
||||
|
||||
// 处理原始数据中可能带有的单位
|
||||
if (typeof capital === "string" && capital.includes("万")) {
|
||||
unit = "万";
|
||||
// 提取数字部分
|
||||
const numMatch = capital.match(/[\d.]+/);
|
||||
value = numMatch ? parseFloat(numMatch[0]) : 0;
|
||||
} else if (value >= 10000) {
|
||||
// 大额数字转换为万元显示
|
||||
value = value / 10000;
|
||||
unit = "万";
|
||||
}
|
||||
// 处理原始数据中可能带有的单位
|
||||
if (typeof capital === 'string' && capital.includes('万')) {
|
||||
unit = '万'
|
||||
// 提取数字部分
|
||||
const numMatch = capital.match(/[\d.]+/)
|
||||
value = numMatch ? parseFloat(numMatch[0]) : 0
|
||||
} else if (value >= 10000) {
|
||||
// 大额数字转换为万元显示
|
||||
value = value / 10000
|
||||
unit = '万'
|
||||
}
|
||||
|
||||
// 格式化数字,保留两位小数(如果有小数部分)
|
||||
const formattedValue = value.toLocaleString("zh-CN", {
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 2,
|
||||
});
|
||||
// 格式化数字,保留两位小数(如果有小数部分)
|
||||
const formattedValue = value.toLocaleString('zh-CN', {
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 2,
|
||||
})
|
||||
|
||||
return `${formattedValue}${unit} ${currency || "人民币"}`;
|
||||
};
|
||||
return `${formattedValue}${unit} ${currency || '人民币'}`
|
||||
}
|
||||
|
||||
// 获取涉诉风险等级
|
||||
export const getRiskLevel = (lawsuitInfo) => {
|
||||
if (!lawsuitInfo) {
|
||||
return {
|
||||
level: "low",
|
||||
text: "低风险",
|
||||
color: "text-green-600 bg-green-50",
|
||||
};
|
||||
}
|
||||
|
||||
// 失信被执行人是最高风险
|
||||
if (lawsuitInfo.breachCaseList && lawsuitInfo.breachCaseList.length > 0) {
|
||||
return {
|
||||
level: "high",
|
||||
text: "高风险",
|
||||
color: "text-red-600 bg-red-50",
|
||||
};
|
||||
}
|
||||
|
||||
// 限高被执行人是最高风险
|
||||
if (
|
||||
lawsuitInfo.consumptionRestrictionList &&
|
||||
lawsuitInfo.consumptionRestrictionList.length > 0
|
||||
) {
|
||||
return {
|
||||
level: "high",
|
||||
text: "高风险",
|
||||
color: "text-red-600 bg-red-50",
|
||||
};
|
||||
}
|
||||
|
||||
// 有涉诉数据的风险级别
|
||||
if (
|
||||
lawsuitInfo.lawsuitStat &&
|
||||
Object.keys(lawsuitInfo.lawsuitStat).length > 0
|
||||
) {
|
||||
// 检查是否有未结案的案件
|
||||
const data = lawsuitInfo.lawsuitStat;
|
||||
if (
|
||||
data.count &&
|
||||
data.count.count_wei_total &&
|
||||
data.count.count_wei_total > 0
|
||||
) {
|
||||
return {
|
||||
level: "medium",
|
||||
text: "中风险",
|
||||
color: "text-amber-600 bg-amber-50",
|
||||
};
|
||||
}
|
||||
|
||||
// 只有已结案的为低中风险
|
||||
return {
|
||||
level: "low-medium",
|
||||
text: "低中风险",
|
||||
color: "text-yellow-600 bg-yellow-50",
|
||||
};
|
||||
}
|
||||
|
||||
export const getRiskLevel = lawsuitInfo => {
|
||||
if (!lawsuitInfo) {
|
||||
return {
|
||||
level: "low",
|
||||
text: "低风险",
|
||||
color: "text-green-600 bg-green-50",
|
||||
};
|
||||
};
|
||||
level: 'low',
|
||||
text: '低风险',
|
||||
color: 'text-green-600 bg-green-50',
|
||||
}
|
||||
}
|
||||
|
||||
// 失信被执行人是最高风险
|
||||
if (lawsuitInfo.breachCaseList && lawsuitInfo.breachCaseList.length > 0) {
|
||||
return {
|
||||
level: 'high',
|
||||
text: '高风险',
|
||||
color: 'text-red-600 bg-red-50',
|
||||
}
|
||||
}
|
||||
|
||||
// 限高被执行人是最高风险
|
||||
if (lawsuitInfo.consumptionRestrictionList && lawsuitInfo.consumptionRestrictionList.length > 0) {
|
||||
return {
|
||||
level: 'high',
|
||||
text: '高风险',
|
||||
color: 'text-red-600 bg-red-50',
|
||||
}
|
||||
}
|
||||
|
||||
// 有涉诉数据的风险级别
|
||||
if (lawsuitInfo.lawsuitStat && Object.keys(lawsuitInfo.lawsuitStat).length > 0) {
|
||||
// 检查是否有未结案的案件
|
||||
const data = lawsuitInfo.lawsuitStat
|
||||
if (data.count && data.count.count_wei_total && data.count.count_wei_total > 0) {
|
||||
return {
|
||||
level: 'medium',
|
||||
text: '中风险',
|
||||
color: 'text-amber-600 bg-amber-50',
|
||||
}
|
||||
}
|
||||
|
||||
// 只有已结案的为低中风险
|
||||
return {
|
||||
level: 'low-medium',
|
||||
text: '低中风险',
|
||||
color: 'text-yellow-600 bg-yellow-50',
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
level: 'low',
|
||||
text: '低风险',
|
||||
color: 'text-green-600 bg-green-50',
|
||||
}
|
||||
}
|
||||
|
||||
// 获取涉诉案件统计
|
||||
export const getLawsuitStats = (lawsuitInfo) => {
|
||||
if (!lawsuitInfo) return null;
|
||||
export const getLawsuitStats = lawsuitInfo => {
|
||||
if (!lawsuitInfo) return null
|
||||
|
||||
const stats = {
|
||||
total: 0,
|
||||
types: [],
|
||||
};
|
||||
const stats = {
|
||||
total: 0,
|
||||
types: [],
|
||||
}
|
||||
|
||||
// 统计各类型案件数量
|
||||
Object.keys(lawsuitTypeMap).forEach((type) => {
|
||||
let count = 0;
|
||||
// 统计各类型案件数量
|
||||
Object.keys(lawsuitTypeMap).forEach(type => {
|
||||
let count = 0
|
||||
|
||||
if (type === "breachCase") {
|
||||
count =
|
||||
lawsuitInfo.breachCaseList &&
|
||||
lawsuitInfo.breachCaseList.length > 0
|
||||
? lawsuitInfo.breachCaseList.length
|
||||
: 0;
|
||||
} else if (type === "consumptionRestriction") {
|
||||
count =
|
||||
lawsuitInfo.consumptionRestrictionList &&
|
||||
lawsuitInfo.consumptionRestrictionList.length > 0
|
||||
? lawsuitInfo.consumptionRestrictionList.length
|
||||
: 0;
|
||||
} else if (
|
||||
lawsuitInfo.lawsuitStat &&
|
||||
lawsuitInfo.lawsuitStat[type] &&
|
||||
Object.keys(lawsuitInfo.lawsuitStat[type]).length > 0
|
||||
) {
|
||||
const typeData = lawsuitInfo.lawsuitStat[type];
|
||||
count =
|
||||
typeData.cases && typeData.cases.length
|
||||
? typeData.cases.length
|
||||
: 0;
|
||||
}
|
||||
if (type === 'breachCase') {
|
||||
count = lawsuitInfo.breachCaseList && lawsuitInfo.breachCaseList.length > 0 ? lawsuitInfo.breachCaseList.length : 0
|
||||
} else if (type === 'consumptionRestriction') {
|
||||
count = lawsuitInfo.consumptionRestrictionList && lawsuitInfo.consumptionRestrictionList.length > 0 ? lawsuitInfo.consumptionRestrictionList.length : 0
|
||||
} else if (lawsuitInfo.lawsuitStat && lawsuitInfo.lawsuitStat[type] && Object.keys(lawsuitInfo.lawsuitStat[type]).length > 0) {
|
||||
const typeData = lawsuitInfo.lawsuitStat[type]
|
||||
count = typeData.cases && typeData.cases.length ? typeData.cases.length : 0
|
||||
}
|
||||
|
||||
if (count > 0) {
|
||||
stats.total += count;
|
||||
stats.types.push({
|
||||
type,
|
||||
count,
|
||||
name: getCaseTypeText(type),
|
||||
color: getCaseTypeColor(type),
|
||||
darkColor: getCaseTypeDarkColor(type),
|
||||
});
|
||||
}
|
||||
});
|
||||
if (count > 0) {
|
||||
stats.total += count
|
||||
stats.types.push({
|
||||
type,
|
||||
count,
|
||||
name: getCaseTypeText(type),
|
||||
color: getCaseTypeColor(type),
|
||||
darkColor: getCaseTypeDarkColor(type),
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return stats;
|
||||
};
|
||||
return stats
|
||||
}
|
||||
|
||||
// 获取案件类型优先级顺序
|
||||
export const getCaseTypePriority = () => {
|
||||
return [
|
||||
"breachCase", // 失信被执行人(最高风险)
|
||||
"consumptionRestriction", // 限高被执行人
|
||||
"criminal", // 刑事案件
|
||||
"civil", // 民事案件
|
||||
"administrative", // 行政案件
|
||||
"implement", // 执行案件
|
||||
"bankrupt", // 强制清算与破产案件
|
||||
"preservation", // 非诉保全审查
|
||||
];
|
||||
};
|
||||
return [
|
||||
'breachCase', // 失信被执行人(最高风险)
|
||||
'consumptionRestriction', // 限高被执行人
|
||||
'criminal', // 刑事案件
|
||||
'civil', // 民事案件
|
||||
'administrative', // 行政案件
|
||||
'implement', // 执行案件
|
||||
'bankrupt', // 强制清算与破产案件
|
||||
'preservation', // 非诉保全审查
|
||||
]
|
||||
}
|
||||
|
||||
// 根据案件类型获取风险等级
|
||||
export const getCaseTypeRiskLevel = (caseType) => {
|
||||
const typeInfo = lawsuitTypeMap[caseType];
|
||||
if (!typeInfo) {
|
||||
return {
|
||||
level: "low",
|
||||
text: "低风险",
|
||||
color: "text-green-600 bg-green-50",
|
||||
};
|
||||
}
|
||||
|
||||
const riskLevelMap = {
|
||||
high: {
|
||||
text: "高风险",
|
||||
color: "text-red-600 bg-red-50",
|
||||
},
|
||||
medium: {
|
||||
text: "中风险",
|
||||
color: "text-amber-600 bg-amber-50",
|
||||
},
|
||||
low: {
|
||||
text: "低风险",
|
||||
color: "text-green-600 bg-green-50",
|
||||
},
|
||||
};
|
||||
|
||||
export const getCaseTypeRiskLevel = caseType => {
|
||||
const typeInfo = lawsuitTypeMap[caseType]
|
||||
if (!typeInfo) {
|
||||
return {
|
||||
level: typeInfo.riskLevel,
|
||||
...riskLevelMap[typeInfo.riskLevel],
|
||||
};
|
||||
};
|
||||
level: 'low',
|
||||
text: '低风险',
|
||||
color: 'text-green-600 bg-green-50',
|
||||
}
|
||||
}
|
||||
|
||||
const riskLevelMap = {
|
||||
high: {
|
||||
text: '高风险',
|
||||
color: 'text-red-600 bg-red-50',
|
||||
},
|
||||
medium: {
|
||||
text: '中风险',
|
||||
color: 'text-amber-600 bg-amber-50',
|
||||
},
|
||||
low: {
|
||||
text: '低风险',
|
||||
color: 'text-green-600 bg-green-50',
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
level: typeInfo.riskLevel,
|
||||
...riskLevelMap[typeInfo.riskLevel],
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BIN
src/ui/FLXGK5D2.zip
Normal file
BIN
src/ui/FLXGK5D2.zip
Normal file
Binary file not shown.
76
src/ui/FLXGK5D2/components/CaseDetail.vue
Normal file
76
src/ui/FLXGK5D2/components/CaseDetail.vue
Normal file
@@ -0,0 +1,76 @@
|
||||
<template>
|
||||
<div class="px-4 pb-4">
|
||||
<div class="grid grid-cols-[max-content_1fr] gap-x-2 gap-y-3">
|
||||
<!-- 执行法院 -->
|
||||
<span class="text-base text-[#666666]">执行法院:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.courtname || "—" }}</span>
|
||||
|
||||
<!-- 所属地域 -->
|
||||
<span class="text-base text-[#666666]">所属地域:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.areaname || "—" }}</span>
|
||||
|
||||
<!-- 立案时间 -->
|
||||
<template v-if="caseData.regdate">
|
||||
<span class="text-base text-[#666666]">立案时间:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ formatDate(caseData.regdate) }}</span>
|
||||
</template>
|
||||
|
||||
<!-- 发布时间 -->
|
||||
<template v-if="caseData.publishdate">
|
||||
<span class="text-base text-[#666666]">发布时间:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ formatDate(caseData.publishdate) }}</span>
|
||||
</template>
|
||||
|
||||
<!-- 性别 -->
|
||||
<template v-if="caseData.sexname">
|
||||
<span class="text-base text-[#666666]">性别:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.sexname || "—" }}</span>
|
||||
</template>
|
||||
|
||||
<!-- 人员/企业类型 -->
|
||||
<template v-if="caseData.partytypename !== undefined">
|
||||
<span class="text-base text-[#666666]">主体类型:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.partytypename === '0' ? '自然人' : (caseData.partytypename === '1' ? '企业' : '未知') }}</span>
|
||||
</template>
|
||||
|
||||
<!-- 年龄 -->
|
||||
<template v-if="caseData.age">
|
||||
<span class="text-base text-[#666666]">年龄:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.age || "—" }}</span>
|
||||
</template>
|
||||
|
||||
<!-- 执行依据文号 -->
|
||||
<template v-if="caseData.gistcid">
|
||||
<span class="text-base text-[#666666]">执行依据文号:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.gistcid || "—" }}</span>
|
||||
</template>
|
||||
|
||||
<!-- 信号描述 -->
|
||||
<template v-if="caseData.signalDesc">
|
||||
<span class="text-base text-[#666666]">信号描述:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.signalDesc || "—" }}</span>
|
||||
</template>
|
||||
|
||||
<!-- 信号等级 -->
|
||||
<template v-if="caseData.signalRating">
|
||||
<span class="text-base text-[#666666]">信号等级:</span>
|
||||
<span class="text-base font-medium text-[#333333]">{{ caseData.signalRating || "—" }} (1为最高, 7为最低)</span>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { formatDate } from '../utils/lawsuitUtils.js'
|
||||
|
||||
const props = defineProps({
|
||||
caseData: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
caseType: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
})
|
||||
</script>
|
||||
93
src/ui/FLXGK5D2/components/StatisticsOverview.vue
Normal file
93
src/ui/FLXGK5D2/components/StatisticsOverview.vue
Normal file
@@ -0,0 +1,93 @@
|
||||
<template>
|
||||
<div class="">
|
||||
<!-- 概览标题 -->
|
||||
<div class="p-4">
|
||||
<!-- 风险概览总结 -->
|
||||
<div class="p-4 rounded-lg" :class="getRiskOverviewClass()">
|
||||
<div class="flex items-center">
|
||||
<div class="w-12 h-12 mr-3 flex-shrink-0">
|
||||
<img :src="getRiskIcon()" alt="风险" class="w-12 h-12 object-contain" />
|
||||
</div>
|
||||
<div class="text-gray-700">
|
||||
{{ totalCases }}
|
||||
起涉诉案件中,
|
||||
<span v-if="stats.highRiskItems > 0" class="text-orange-600 font-medium">
|
||||
{{ stats.highRiskItems }}
|
||||
</span>
|
||||
<span v-else class="text-green-600 font-medium">0</span>
|
||||
起高风险案件
|
||||
<span v-if="stats.caseTypes.length > 0" class="ml-1">
|
||||
,涉及 {{ stats.caseTypes.length }} 种案件类型
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 主要风险指标 -->
|
||||
<div class="grid grid-cols-2 gap-3 p-4">
|
||||
<!-- 风险事项卡片 -->
|
||||
<div class="p-4 bg-[#EB3C3C1A] border border-[#EB3C3C4D] rounded-xl text-center">
|
||||
<div class="text-2xl font-bold text-[#EB3C3C] mb-1">{{ stats.totalRiskItems || 0 }}项</div>
|
||||
<div class="text-sm font-medium text-gray-800 mb-1">风险事项</div>
|
||||
<div class="text-xs text-gray-500">
|
||||
命中{{ stats.totalRiskItems || 0 }}个规则
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 高风险案件卡片 -->
|
||||
<div class="p-4 bg-[#EB3C3C1A] border border-[#EB3C3C4D] rounded-xl text-center">
|
||||
<div class="text-2xl font-bold text-[#EB3C3C] mb-1">{{ stats.highRiskItems || 0 }}件</div>
|
||||
<div class="text-sm font-medium text-gray-800 mb-1">高风险案件</div>
|
||||
<div class="text-xs text-orange-600">
|
||||
<span class="mr-3">失信{{ stats.sxbzxrCount || 0 }}</span>
|
||||
<span>限高{{ stats.xgbzxrCount || 0 }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { computed } from 'vue'
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
|
||||
const props = defineProps({
|
||||
stats: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
totalCases: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
})
|
||||
|
||||
// 获取风险概览样式
|
||||
const getRiskOverviewClass = () => {
|
||||
// 有高风险案件 - 红色警告
|
||||
if (props.stats.highRiskItems > 0) {
|
||||
return 'bg-[#F9ECEC] border border-[#F0CACA]'
|
||||
}
|
||||
// 有案件但无高风险 - 黄色警示
|
||||
if (props.totalCases > 0) {
|
||||
return 'bg-[#FFF8E1] border border-[#FFE082]'
|
||||
}
|
||||
// 无案件 - 绿色正常
|
||||
return 'bg-[#ECF9EF] border border-[#CAECD3]'
|
||||
}
|
||||
|
||||
// 获取风险图标
|
||||
const getRiskIcon = () => {
|
||||
// 有高风险案件 - 高风险图标
|
||||
if (props.stats.highRiskItems > 0) {
|
||||
return new URL('../../../assets/images/report/gfx.png', import.meta.url).href
|
||||
}
|
||||
// 有案件但无高风险 - 中风险图标
|
||||
if (props.totalCases > 0) {
|
||||
return new URL('../../../assets/images/report/zfx.png', import.meta.url).href
|
||||
}
|
||||
// 无案件 - 正常图标
|
||||
return new URL('../../../assets/images/report/zq.png', import.meta.url).href
|
||||
}
|
||||
</script>
|
||||
344
src/ui/FLXGK5D2/index.vue
Normal file
344
src/ui/FLXGK5D2/index.vue
Normal file
@@ -0,0 +1,344 @@
|
||||
<template>
|
||||
<div class="card shadow-sm rounded-xl overflow-hidden p-4">
|
||||
<div class="border border-[#EEEEEE] rounded-xl">
|
||||
<!-- 标题 -->
|
||||
<div class="flex items-center mb-3 p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/ssfxfx.png" alt="涉诉风险整体" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">法院被执行人高级版</span>
|
||||
</div>
|
||||
|
||||
<LTitle title="涉诉风险整体概览" />
|
||||
|
||||
<!-- 全局风险概览面板 -->
|
||||
<StatisticsOverview
|
||||
v-if="totalCases > 0 && lawsuitStats"
|
||||
:stats="lawsuitStats"
|
||||
:total-cases="totalCases"
|
||||
/>
|
||||
|
||||
<!-- 案件类型筛选tab -->
|
||||
<div v-if="totalCases > 0" class="p-4">
|
||||
<van-tabs v-model:active="activeCaseTypeFilter" line-width="30px" class="lawsuit-tabs">
|
||||
<!-- 全部风险 -->
|
||||
<van-tab name="all">
|
||||
<template #title>
|
||||
<div class="flex items-center gap-1">
|
||||
<span>全部风险</span>
|
||||
<span>({{ caseTypeCounts.all }})</span>
|
||||
</div>
|
||||
</template>
|
||||
</van-tab>
|
||||
|
||||
<!-- 各类型案件 - 使用v-for渲染 -->
|
||||
<van-tab v-for="(typeInfo, type) in lawsuitTypeMap" :key="type" :name="type">
|
||||
<template #title>
|
||||
<div class="flex items-center gap-1">
|
||||
<span>{{ typeInfo.text }}({{ caseTypeCounts[type] || 0 }})</span>
|
||||
</div>
|
||||
</template>
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
|
||||
<!-- 空状态展示 - 放在 tabs 外部以避免切换干扰 -->
|
||||
<div v-if="filteredCases.length === 0" class="p-8 text-center text-gray-500">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<van-empty :description="`暂无相关记录`" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 案件列表 -->
|
||||
<div v-if="filteredCases.length > 0" class="space-y-3 px-4 mb-4">
|
||||
<div v-for="(caseItem, index) in filteredCases" :key="index" class="case-wrapper">
|
||||
<!-- 案件卡片 - 可点击展开 -->
|
||||
<div class="bg-white rounded-xl overflow-hidden border px-4 pt-3 border-[#DDDDDD]">
|
||||
<div class="cursor-pointer relative" @click="toggleCaseExpand(caseItem.id || index, 'case', index)">
|
||||
<!-- 顶部区域:案件标题和案件类型 -->
|
||||
<div class=" flex items-center">
|
||||
<!-- 案件标题 -->
|
||||
<div class="font-bold text-base text-[#333333] mr-2">{{ caseItem.ah || '暂无案号' }}</div>
|
||||
|
||||
<!-- 案件类型标签 -->
|
||||
<span class="px-2 py-1 text-xs rounded-md font-medium bg-[#F9ECEC] text-[#EB3C3C]">
|
||||
{{ getCaseTypeText(caseItem.type) }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- 中间区域:立案时间 -->
|
||||
<div class="pb-2">
|
||||
<span class="text-sm text-[#666666]">立案:</span>
|
||||
<span class="text-sm text-[#333333]">{{ formatDate(caseItem.regdate) }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 底部区域:风险等级 -->
|
||||
<div class="flex items-center gap-2">
|
||||
<!-- 风险等级标签 -->
|
||||
<span class="px-2 py-1 text-xs rounded-md font-medium"
|
||||
:class="getCaseTypeRiskLevel(caseItem.type).color">
|
||||
{{ getCaseTypeRiskLevel(caseItem.type).text }}
|
||||
</span>
|
||||
<!-- 下架状态 -->
|
||||
<span v-if="caseItem.sign === '0'" class="px-2 py-1 text-xs rounded-md font-medium bg-gray-100 text-gray-500">
|
||||
已下架
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- 展开指示器 -->
|
||||
<div class="absolute right-4 bottom-3 flex items-center text-xs text-gray-500">
|
||||
<img src="@/assets/images/report/zk.png" alt="展开" class="w-4 h-4 container"
|
||||
:class="{ 'rotate-180': isCaseExpanded(caseItem.id || index, 'case', index) }" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 案件详情抽屉 -->
|
||||
<div class="mt-4 overflow-hidden transition-all duration-300 ease-in-out" :class="{
|
||||
'max-h-0 opacity-0': !isCaseExpanded(caseItem.id || index, 'case', index),
|
||||
'max-h-none opacity-100': isCaseExpanded(caseItem.id || index, 'case', index),
|
||||
}">
|
||||
<div class="mt-1 transform transition-all duration-300">
|
||||
<div class="relative">
|
||||
<CaseDetail :case-data="caseItem" :case-type="caseItem.type" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 无涉诉风险时的空状态展示 -->
|
||||
<div v-else class="text-gray-500 py-10 text-center bg-gray-50 rounded-lg mx-4 mb-4">
|
||||
<div class="text-gray-300 text-3xl mb-2">⚖️</div>
|
||||
暂无涉诉风险记录
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<LRemark
|
||||
content="法院被执行人高级版展示申请人作为失信被执行人或限高被执行人的详细情况。数据来源于法院公开信息,包括案号、执行法院、立案时间及风险信号描述等。建议关注风险等级较高的案件及近年发生的执行记录。" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed } from 'vue'
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import LRemark from '@/components/LRemark.vue'
|
||||
import StatisticsOverview from './components/StatisticsOverview.vue'
|
||||
import CaseDetail from './components/CaseDetail.vue'
|
||||
import { useRiskNotifier } from '@/composables/useRiskNotifier'
|
||||
import {
|
||||
lawsuitTypeMap,
|
||||
getCaseTypeText,
|
||||
getCaseTypeColor,
|
||||
formatDate,
|
||||
getCaseTypeRiskLevel,
|
||||
parseFlatData
|
||||
} from './utils/lawsuitUtils.js'
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
})
|
||||
|
||||
// 解析扁平数据
|
||||
const parsedData = computed(() => {
|
||||
const data = props.data || {}
|
||||
return parseFlatData(data)
|
||||
})
|
||||
|
||||
const sx = computed(() => parsedData.value.sx)
|
||||
const xg = computed(() => parsedData.value.xg)
|
||||
|
||||
// 用于跟踪展开的案件卡片
|
||||
const expandedCases = ref({})
|
||||
|
||||
// 切换展开/收起案件详情
|
||||
const toggleCaseExpand = (caseId, listType, index) => {
|
||||
const uniqueKey = `${caseId}_${listType}_${index}`
|
||||
expandedCases.value[uniqueKey] = !expandedCases.value[uniqueKey]
|
||||
}
|
||||
|
||||
// 检查案件是否展开
|
||||
const isCaseExpanded = (caseId, listType, index) => {
|
||||
const uniqueKey = `${caseId}_${listType}_${index}`
|
||||
return !!expandedCases.value[uniqueKey]
|
||||
}
|
||||
|
||||
// 当前选中的案件类型筛选
|
||||
const activeCaseTypeFilter = ref('all')
|
||||
|
||||
// 计算所有案件数据
|
||||
const allCases = computed(() => {
|
||||
return [...sx.value, ...xg.value]
|
||||
})
|
||||
|
||||
// 计算总案件数
|
||||
const totalCases = computed(() => allCases.value.length)
|
||||
|
||||
// 计算涉诉风险统计
|
||||
const lawsuitStats = computed(() => {
|
||||
if (totalCases.value === 0) return null
|
||||
|
||||
const stats = {
|
||||
totalRiskItems: 0,
|
||||
highRiskItems: 0,
|
||||
mediumRiskItems: 0,
|
||||
lowRiskItems: 0,
|
||||
sxbzxrCount: sx.value.length,
|
||||
xgbzxrCount: xg.value.length,
|
||||
caseTypes: [],
|
||||
}
|
||||
|
||||
// 统计规则命中数
|
||||
const data = props.data || {}
|
||||
Object.keys(data).forEach(key => {
|
||||
if (key.startsWith('Rule_name_')) {
|
||||
stats.totalRiskItems++
|
||||
}
|
||||
})
|
||||
|
||||
// 统计各类型案件数量
|
||||
const typeCounts = {}
|
||||
Object.keys(lawsuitTypeMap).forEach(type => {
|
||||
typeCounts[type] = 0
|
||||
})
|
||||
|
||||
allCases.value.forEach(caseItem => {
|
||||
// 根据案件类型统计风险等级
|
||||
const riskLevel = getCaseTypeRiskLevel(caseItem.type).level
|
||||
if (riskLevel === 'high') {
|
||||
stats.highRiskItems++
|
||||
} else if (riskLevel === 'medium') {
|
||||
stats.mediumRiskItems++
|
||||
} else {
|
||||
stats.lowRiskItems++
|
||||
}
|
||||
|
||||
// 统计案件类型
|
||||
if (caseItem.type) {
|
||||
typeCounts[caseItem.type] = (typeCounts[caseItem.type] || 0) + 1
|
||||
}
|
||||
})
|
||||
|
||||
// 转换为数组格式
|
||||
stats.caseTypes = Object.keys(typeCounts)
|
||||
.filter(type => typeCounts[type] > 0)
|
||||
.map(type => ({
|
||||
type,
|
||||
count: typeCounts[type],
|
||||
name: getCaseTypeText(type),
|
||||
color: getCaseTypeColor(type),
|
||||
}))
|
||||
.sort((a, b) => b.count - a.count)
|
||||
|
||||
return stats
|
||||
})
|
||||
|
||||
// 按案件类型筛选案件
|
||||
const filteredCases = computed(() => {
|
||||
if (activeCaseTypeFilter.value === 'all') {
|
||||
return allCases.value
|
||||
}
|
||||
|
||||
return allCases.value.filter(caseItem => caseItem.type === activeCaseTypeFilter.value)
|
||||
})
|
||||
|
||||
// 获取每种案件类型的数量
|
||||
const caseTypeCounts = computed(() => {
|
||||
const counts = {
|
||||
all: totalCases.value,
|
||||
}
|
||||
|
||||
// 初始化所有案件类型的计数
|
||||
Object.keys(lawsuitTypeMap).forEach(type => {
|
||||
counts[type] = 0
|
||||
})
|
||||
|
||||
// 计算每种类型的案件数量
|
||||
allCases.value.forEach(caseItem => {
|
||||
if (caseItem.type) {
|
||||
counts[caseItem.type]++
|
||||
}
|
||||
})
|
||||
|
||||
return counts
|
||||
})
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
const cases = totalCases.value;
|
||||
if (cases === 0) return 100;
|
||||
|
||||
const data = props.data || {}
|
||||
const weight = parseInt(data.Rule_final_weight) || 0;
|
||||
|
||||
// 如果有明确的 weight,根据 weight 计算
|
||||
// weight 越高风险越高,所以 score = 100 - weight
|
||||
if (weight > 0) {
|
||||
return Math.max(0, 100 - weight);
|
||||
}
|
||||
|
||||
if (cases <= 2) return 70;
|
||||
if (cases <= 5) return 50;
|
||||
if (cases <= 10) return 30;
|
||||
return 10;
|
||||
});
|
||||
|
||||
// 使用 composable 通知父组件风险评分
|
||||
useRiskNotifier(props, riskScore);
|
||||
|
||||
// 暴露给父组件
|
||||
defineExpose({
|
||||
riskScore
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.case-wrapper {
|
||||
@apply relative;
|
||||
}
|
||||
|
||||
.lawsuit-tabs :deep(.van-tabs__wrap) {
|
||||
height: 32px !important;
|
||||
background-color: transparent !important;
|
||||
padding: 0 !important;
|
||||
border-bottom: 1px solid #DDDDDD !important;
|
||||
}
|
||||
|
||||
.lawsuit-tabs :deep(.van-tabs__nav) {
|
||||
background-color: transparent !important;
|
||||
gap: 0;
|
||||
height: 32px !important;
|
||||
}
|
||||
|
||||
.lawsuit-tabs :deep(.van-tab) {
|
||||
color: #999999 !important;
|
||||
font-size: 14px !important;
|
||||
font-weight: 400 !important;
|
||||
}
|
||||
|
||||
.lawsuit-tabs :deep(.van-tab--active) {
|
||||
color: var(--van-theme-primary) !important;
|
||||
background-color: unset !important;
|
||||
}
|
||||
|
||||
.lawsuit-tabs :deep(.van-tabs__line) {
|
||||
height: 3px !important;
|
||||
border-radius: 1px !important;
|
||||
}
|
||||
</style>
|
||||
143
src/ui/FLXGK5D2/utils/lawsuitUtils.js
Normal file
143
src/ui/FLXGK5D2/utils/lawsuitUtils.js
Normal file
@@ -0,0 +1,143 @@
|
||||
// 案件类型映射表
|
||||
export const lawsuitTypeMap = {
|
||||
sxbzxr: {
|
||||
text: '失信被执行',
|
||||
color: 'text-red-600 bg-red-50',
|
||||
darkColor: 'bg-red-500',
|
||||
riskLevel: 'high', // 高风险
|
||||
},
|
||||
xgbzxr: {
|
||||
text: '限高被执行',
|
||||
color: 'text-orange-600 bg-orange-50',
|
||||
darkColor: 'bg-orange-500',
|
||||
riskLevel: 'high', // 高风险
|
||||
}
|
||||
}
|
||||
|
||||
// 案件类型文本
|
||||
export const getCaseTypeText = type => {
|
||||
return lawsuitTypeMap[type]?.text || '其他案件'
|
||||
}
|
||||
|
||||
// 案件类型颜色
|
||||
export const getCaseTypeColor = type => {
|
||||
return lawsuitTypeMap[type]?.color || 'text-gray-600 bg-gray-50'
|
||||
}
|
||||
|
||||
// 案件类型深色
|
||||
export const getCaseTypeDarkColor = type => {
|
||||
return lawsuitTypeMap[type]?.darkColor || 'bg-gray-500'
|
||||
}
|
||||
|
||||
// 格式化日期显示
|
||||
export const formatDate = dateStr => {
|
||||
if (!dateStr) return '—'
|
||||
// 转换YYYY-MM-DD为年月日格式
|
||||
if (dateStr.includes('-')) {
|
||||
const parts = dateStr.split('-')
|
||||
if (parts.length === 3) {
|
||||
return `${parts[0]}年${parts[1]}月${parts[2]}日`
|
||||
}
|
||||
}
|
||||
return dateStr // 如果不是标准格式则返回原始字符串
|
||||
}
|
||||
|
||||
// 获取案件状态样式
|
||||
export const getCaseStatusClass = status => {
|
||||
if (!status) return 'bg-gray-100 text-gray-500'
|
||||
|
||||
if (status.includes('已结') || status.includes('已办结')) {
|
||||
return 'bg-green-50 text-green-600'
|
||||
} else if (status.includes('执行中') || status.includes('审理中')) {
|
||||
return 'bg-blue-50 text-blue-600'
|
||||
} else if (status.includes('未执行') || status.includes('未履行')) {
|
||||
return 'bg-amber-50 text-amber-600'
|
||||
} else {
|
||||
return 'bg-gray-100 text-gray-500'
|
||||
}
|
||||
}
|
||||
|
||||
// 根据案件类型获取风险等级
|
||||
export const getCaseTypeRiskLevel = caseType => {
|
||||
const typeInfo = lawsuitTypeMap[caseType]
|
||||
if (!typeInfo) {
|
||||
return {
|
||||
level: 'low',
|
||||
text: '低风险',
|
||||
color: 'text-green-600 bg-green-50',
|
||||
}
|
||||
}
|
||||
|
||||
const riskLevelMap = {
|
||||
high: {
|
||||
text: '高风险',
|
||||
color: 'text-red-600 bg-red-50',
|
||||
},
|
||||
medium: {
|
||||
text: '中风险',
|
||||
color: 'text-amber-600 bg-amber-50',
|
||||
},
|
||||
low: {
|
||||
text: '低风险',
|
||||
color: 'text-green-600 bg-green-50',
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
level: typeInfo.riskLevel,
|
||||
...riskLevelMap[typeInfo.riskLevel],
|
||||
}
|
||||
}
|
||||
|
||||
// 解析扁平数据为结构化数组
|
||||
export const parseFlatData = (data) => {
|
||||
const sx = [];
|
||||
const xg = [];
|
||||
|
||||
// 最多10个
|
||||
for (let i = 1; i <= 10; i++) {
|
||||
// 检查失信
|
||||
if (data[`el_sx${i}_casecode`]) {
|
||||
sx.push({
|
||||
ah: data[`el_sx${i}_casecode`],
|
||||
casecode: data[`el_sx${i}_casecode`],
|
||||
iname: data[`el_sx${i}_iname`],
|
||||
sexname: data[`el_sx${i}_sexname`],
|
||||
age: data[`el_sx${i}_age`],
|
||||
courtname: data[`el_sx${i}_courtname`],
|
||||
areaname: data[`el_sx${i}_areaname`],
|
||||
publishdate: data[`el_sx${i}_publishdate`],
|
||||
regdate: data[`el_sx${i}_regdate`],
|
||||
gistcid: data[`el_sx${i}_gistcid`],
|
||||
signalDesc: data[`el_sx${i}_signalDesc`],
|
||||
signalRating: data[`el_sx${i}_signalRating`],
|
||||
datatype: data[`el_sx${i}_datatype`],
|
||||
partytypename: data[`el_sx${i}_partytypename`],
|
||||
sign: data[`el_sx${i}_sign`],
|
||||
type: 'sxbzxr'
|
||||
});
|
||||
}
|
||||
|
||||
// 检查限高
|
||||
if (data[`el_xg${i}_casecode`]) {
|
||||
xg.push({
|
||||
ah: data[`el_xg${i}_casecode`],
|
||||
casecode: data[`el_xg${i}_casecode`],
|
||||
iname: data[`el_xg${i}_iname`],
|
||||
sexname: data[`el_xg${i}_sexname`],
|
||||
age: data[`el_xg${i}_age`],
|
||||
courtname: data[`el_xg${i}_courtname`],
|
||||
areaname: data[`el_xg${i}_areaname`],
|
||||
publishdate: data[`el_xg${i}_publishdate`],
|
||||
regdate: data[`el_xg${i}_regdate`],
|
||||
signalDesc: data[`el_xg${i}_signalDesc`],
|
||||
signalRating: data[`el_xg${i}_signalRating`],
|
||||
datatype: data[`el_xg${i}_datatype`],
|
||||
sign: data[`el_xg${i}_sign`],
|
||||
type: 'xgbzxr'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return { sx, xg };
|
||||
}
|
||||
811
src/ui/IVYZ0S0D.vue
Normal file
811
src/ui/IVYZ0S0D.vue
Normal file
@@ -0,0 +1,811 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, ref } from 'vue';
|
||||
|
||||
// 接收父组件传入的 props
|
||||
const props = defineProps({
|
||||
data: Object,
|
||||
params: Object,
|
||||
});
|
||||
|
||||
// 当前激活的标签页
|
||||
const activeTab = ref('summary');
|
||||
|
||||
// 定义组件名称,用于在控制台输出调试信息
|
||||
const componentName = 'IVYZ0S0D';
|
||||
|
||||
// 将 props.data 赋值给 reportData 变量
|
||||
let reportData: any = props.data || {};
|
||||
|
||||
// 如果 reportData 不为空,则将其赋值给变量
|
||||
if (reportData) {
|
||||
console.log(`${componentName} 组件接收到的数据:`, reportData);
|
||||
} else {
|
||||
console.log(`${componentName} 组件未接收到数据`);
|
||||
}
|
||||
|
||||
// 获取状态描述文本
|
||||
const getStatusText = (value: number) => {
|
||||
if (value === 1) return '未命中';
|
||||
if (value === 2) return '命中';
|
||||
return '未知';
|
||||
};
|
||||
|
||||
// 获取通知函状态描述文本
|
||||
const getNoticeLetterStatusText = (value: number) => {
|
||||
if (value === 1) return '未命中';
|
||||
if (value === 2) return '命中';
|
||||
return '未知';
|
||||
};
|
||||
|
||||
// 获取通知函期间描述文本
|
||||
const getNoticeLetterPeriodText = (period: number) => {
|
||||
const periodMap: Record<number, string> = {
|
||||
0: '没有被发送通知函',
|
||||
1: '近2年内',
|
||||
2: '2-4年',
|
||||
3: '5年以上'
|
||||
};
|
||||
|
||||
return periodMap[period] || '未知期间';
|
||||
};
|
||||
|
||||
// 获取背景颜色
|
||||
const getBackgroundColor = (value: number) => {
|
||||
if (value === 1) return '#e8f5e8'; // 浅绿色
|
||||
if (value === 2) return '#ffe8e8'; // 浅红色
|
||||
return '#f5f5f5'; // 默认灰色
|
||||
};
|
||||
|
||||
// 获取边框颜色
|
||||
const getBorderColor = (value: number) => {
|
||||
if (value === 1) return '#4caf50'; // 绿色边框
|
||||
if (value === 2) return '#f44336'; // 红色边框
|
||||
return '#ccc'; // 默认灰色边框
|
||||
};
|
||||
|
||||
// 检查是否至少有一个数据类别有内容
|
||||
const hasAnyData = computed(() => {
|
||||
return Object.keys(reportData).length > 0;
|
||||
});
|
||||
|
||||
// 汇总数据 - 只包含基础字段,不包含时间相关字段
|
||||
const summaryData = computed(() => {
|
||||
const risks: {title: string, value: number, details: string | string[], bgColor: string, borderColor: string, fieldName: string}[] = [];
|
||||
|
||||
// 该人员是否有风险
|
||||
if (reportData.risk_flag !== undefined) {
|
||||
risks.push({
|
||||
title: '该人员是否有风险',
|
||||
value: reportData.risk_flag,
|
||||
details: getStatusText(reportData.risk_flag),
|
||||
bgColor: getBackgroundColor(reportData.risk_flag),
|
||||
borderColor: getBorderColor(reportData.risk_flag),
|
||||
fieldName: 'basic_info'
|
||||
});
|
||||
}
|
||||
|
||||
// 失信/限高风险
|
||||
if (reportData.dishonesty && reportData.dishonesty.dishonesty !== undefined) {
|
||||
risks.push({
|
||||
title: '失信人员风险',
|
||||
value: reportData.dishonesty.dishonesty,
|
||||
details: getStatusText(reportData.dishonesty.dishonesty),
|
||||
bgColor: getBackgroundColor(reportData.dishonesty.dishonesty),
|
||||
borderColor: getBorderColor(reportData.dishonesty.dishonesty),
|
||||
fieldName: 'dishonesty'
|
||||
});
|
||||
}
|
||||
|
||||
// high_consumption
|
||||
if (reportData.high_consumption && reportData.high_consumption.high_consumption !== undefined) {
|
||||
risks.push({
|
||||
title: '限制高消费人员风险',
|
||||
value: reportData.high_consumption.high_consumption,
|
||||
details: getStatusText(reportData.high_consumption.high_consumption),
|
||||
bgColor: getBackgroundColor(reportData.high_consumption.high_consumption),
|
||||
borderColor: getBorderColor(reportData.high_consumption.high_consumption),
|
||||
fieldName: 'high_consumption'
|
||||
});
|
||||
}
|
||||
|
||||
// 是否包含劳动争议 - 只显示基本的劳动争议状态,不显示时间相关
|
||||
if (reportData.labor_disputes) {
|
||||
let details: string[] = [];
|
||||
if (reportData.labor_disputes.labor_disputes !== undefined) {
|
||||
details.push(`劳动争议: ${getStatusText(reportData.labor_disputes.labor_disputes)}`);
|
||||
}
|
||||
if (reportData.labor_disputes.labor_contract !== undefined) {
|
||||
details.push(`劳动合同: ${getStatusText(reportData.labor_disputes.labor_contract)}`);
|
||||
}
|
||||
if (reportData.labor_disputes.labor_relation !== undefined) {
|
||||
details.push(`劳动关系: ${getStatusText(reportData.labor_disputes.labor_relation)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '是否包含劳动争议',
|
||||
value: Math.max(
|
||||
reportData.labor_disputes.labor_disputes || 0,
|
||||
reportData.labor_disputes.labor_contract || 0,
|
||||
reportData.labor_disputes.labor_relation || 0
|
||||
),
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(Math.max(
|
||||
reportData.labor_disputes.labor_disputes || 0,
|
||||
reportData.labor_disputes.labor_contract || 0,
|
||||
reportData.labor_disputes.labor_relation || 0
|
||||
)),
|
||||
borderColor: getBorderColor(Math.max(
|
||||
reportData.labor_disputes.labor_disputes || 0,
|
||||
reportData.labor_disputes.labor_contract || 0,
|
||||
reportData.labor_disputes.labor_relation || 0
|
||||
)),
|
||||
fieldName: 'labor_disputes'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// social_insurance - 只显示基本的社保相关状态,不显示时间相关
|
||||
if (reportData.social_insurance) {
|
||||
let details: string[] = [];
|
||||
if (reportData.social_insurance.social_insurance !== undefined) {
|
||||
details.push(`社保纠纷: ${getStatusText(reportData.social_insurance.social_insurance)}`);
|
||||
}
|
||||
if (reportData.social_insurance.pension !== undefined) {
|
||||
details.push(`养老纠纷: ${getStatusText(reportData.social_insurance.pension)}`);
|
||||
}
|
||||
if (reportData.social_insurance.injury_insurance !== undefined) {
|
||||
details.push(`工伤纠纷: ${getStatusText(reportData.social_insurance.injury_insurance)}`);
|
||||
}
|
||||
if (reportData.social_insurance.unemployment_insurance !== undefined) {
|
||||
details.push(`失业纠纷: ${getStatusText(reportData.social_insurance.unemployment_insurance)}`);
|
||||
}
|
||||
if (reportData.social_insurance.medical_insurance !== undefined) {
|
||||
details.push(`医疗纠纷: ${getStatusText(reportData.social_insurance.medical_insurance)}`);
|
||||
}
|
||||
if (reportData.social_insurance.maternity_insurance !== undefined) {
|
||||
details.push(`生育纠纷: ${getStatusText(reportData.social_insurance.maternity_insurance)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '社会保险纠纷风险',
|
||||
value: Math.max(
|
||||
reportData.social_insurance.social_insurance || 0,
|
||||
reportData.social_insurance.pension || 0,
|
||||
reportData.social_insurance.injury_insurance || 0,
|
||||
reportData.social_insurance.unemployment_insurance || 0,
|
||||
reportData.social_insurance.medical_insurance || 0,
|
||||
reportData.social_insurance.maternity_insurance || 0
|
||||
),
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(Math.max(
|
||||
reportData.social_insurance.social_insurance || 0,
|
||||
reportData.social_insurance.pension || 0,
|
||||
reportData.social_insurance.injury_insurance || 0,
|
||||
reportData.social_insurance.unemployment_insurance || 0,
|
||||
reportData.social_insurance.medical_insurance || 0,
|
||||
reportData.social_insurance.maternity_insurance || 0
|
||||
)),
|
||||
borderColor: getBorderColor(Math.max(
|
||||
reportData.social_insurance.social_insurance || 0,
|
||||
reportData.social_insurance.pension || 0,
|
||||
reportData.social_insurance.injury_insurance || 0,
|
||||
reportData.social_insurance.unemployment_insurance || 0,
|
||||
reportData.social_insurance.medical_insurance || 0,
|
||||
reportData.social_insurance.maternity_insurance || 0
|
||||
)),
|
||||
fieldName: 'social_insurance'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// welfare_disputes
|
||||
if (reportData.welfare_disputes && reportData.welfare_disputes.welfare !== undefined) {
|
||||
risks.push({
|
||||
title: '福利待遇纠纷',
|
||||
value: reportData.welfare_disputes.welfare,
|
||||
details: getStatusText(reportData.welfare_disputes.welfare),
|
||||
bgColor: getBackgroundColor(reportData.welfare_disputes.welfare),
|
||||
borderColor: getBorderColor(reportData.welfare_disputes.welfare),
|
||||
fieldName: 'welfare_disputes'
|
||||
});
|
||||
}
|
||||
|
||||
// 人事争议 - 只显示基本的人事争议状态,不显示时间相关
|
||||
if (reportData.personnel_disputes) {
|
||||
let details: string[] = [];
|
||||
if (reportData.personnel_disputes.personnel_dispute !== undefined) {
|
||||
details.push(`人事争议: ${getStatusText(reportData.personnel_disputes.personnel_dispute)}`);
|
||||
}
|
||||
if (reportData.personnel_disputes.resignation_dispute !== undefined) {
|
||||
details.push(`辞职争议: ${getStatusText(reportData.personnel_disputes.resignation_dispute)}`);
|
||||
}
|
||||
if (reportData.personnel_disputes.dismissal_dispute !== undefined) {
|
||||
details.push(`辞退争议: ${getStatusText(reportData.personnel_disputes.dismissal_dispute)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '人事争议',
|
||||
value: Math.max(
|
||||
reportData.personnel_disputes.personnel_dispute || 0,
|
||||
reportData.personnel_disputes.resignation_dispute || 0,
|
||||
reportData.personnel_disputes.dismissal_dispute || 0
|
||||
),
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(Math.max(
|
||||
reportData.personnel_disputes.personnel_dispute || 0,
|
||||
reportData.personnel_disputes.resignation_dispute || 0,
|
||||
reportData.personnel_disputes.dismissal_dispute || 0
|
||||
)),
|
||||
borderColor: getBorderColor(Math.max(
|
||||
reportData.personnel_disputes.personnel_dispute || 0,
|
||||
reportData.personnel_disputes.resignation_dispute || 0,
|
||||
reportData.personnel_disputes.dismissal_dispute || 0
|
||||
)),
|
||||
fieldName: 'personnel_disputes'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 仲裁流程相关 - 只显示基本的仲裁状态,不显示时间相关
|
||||
if (reportData.arbitration) {
|
||||
let details: string[] = [];
|
||||
if (reportData.arbitration.arbitration_confirmation !== undefined) {
|
||||
details.push(`仲裁确认: ${getStatusText(reportData.arbitration.arbitration_confirmation)}`);
|
||||
}
|
||||
if (reportData.arbitration.arbitration_revocation !== undefined) {
|
||||
details.push(`仲裁撤销: ${getStatusText(reportData.arbitration.arbitration_revocation)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '仲裁流程相关',
|
||||
value: Math.max(
|
||||
reportData.arbitration.arbitration_confirmation || 0,
|
||||
reportData.arbitration.arbitration_revocation || 0
|
||||
),
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(Math.max(
|
||||
reportData.arbitration.arbitration_confirmation || 0,
|
||||
reportData.arbitration.arbitration_revocation || 0
|
||||
)),
|
||||
borderColor: getBorderColor(Math.max(
|
||||
reportData.arbitration.arbitration_confirmation || 0,
|
||||
reportData.arbitration.arbitration_revocation || 0
|
||||
)),
|
||||
fieldName: 'arbitration'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 通知函触达
|
||||
if (reportData.notice_letter && reportData.notice_letter.notice_letter !== undefined) {
|
||||
let statusText = getNoticeLetterStatusText(reportData.notice_letter.notice_letter);
|
||||
let periodText = '';
|
||||
|
||||
if (reportData.notice_letter.notice_letter_period !== undefined) {
|
||||
periodText = `该人员被发送通知函,仲裁、调解、涉诉距今时间: ${getNoticeLetterPeriodText(reportData.notice_letter.notice_letter_period)}`;
|
||||
}
|
||||
|
||||
const detailParts = [`状态: ${statusText}`];
|
||||
if (periodText) {
|
||||
detailParts.push(periodText);
|
||||
}
|
||||
|
||||
risks.push({
|
||||
title: '该人员是否有被发送仲裁、调解、涉诉通知函风险',
|
||||
value: reportData.notice_letter.notice_letter,
|
||||
details: detailParts,
|
||||
bgColor: getBackgroundColor(reportData.notice_letter.notice_letter),
|
||||
borderColor: getBorderColor(reportData.notice_letter.notice_letter),
|
||||
fieldName: 'notice_letter'
|
||||
});
|
||||
}
|
||||
|
||||
return risks;
|
||||
});
|
||||
|
||||
// 近三年案件数据 - 只显示命中的时间相关字段
|
||||
const recentThreeYearsData = computed(() => {
|
||||
const risks: {title: string, value: number, details: string | string[], bgColor: string, borderColor: string, fieldName: string}[] = [];
|
||||
|
||||
// 劳动争议风险 - 近3年,只显示命中的
|
||||
if (reportData.labor_disputes) {
|
||||
let details: string[] = [];
|
||||
if (reportData.labor_disputes.labor_disputes_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年劳动争议: ${getStatusText(reportData.labor_disputes.labor_disputes_3y)}`);
|
||||
}
|
||||
if (reportData.labor_disputes.labor_relation_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年劳动关系: ${getStatusText(reportData.labor_disputes.labor_relation_3y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '劳动争议风险',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'labor_disputes_3y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 社会保险纠纷风险 - 近3年,只显示命中的
|
||||
if (reportData.social_insurance) {
|
||||
let details: string[] = [];
|
||||
if (reportData.social_insurance.pension_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年养老: ${getStatusText(reportData.social_insurance.pension_3y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.injury_insurance_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年工伤: ${getStatusText(reportData.social_insurance.injury_insurance_3y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.unemployment_insurance_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年失业: ${getStatusText(reportData.social_insurance.unemployment_insurance_3y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.medical_insurance_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年医疗: ${getStatusText(reportData.social_insurance.medical_insurance_3y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.maternity_insurance_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年生育: ${getStatusText(reportData.social_insurance.maternity_insurance_3y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '社会保险纠纷风险',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'social_insurance_3y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 人事争议类纠纷 - 近3年,只显示命中的
|
||||
if (reportData.personnel_disputes) {
|
||||
let details: string[] = [];
|
||||
if (reportData.personnel_disputes.resignation_dispute_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年辞职: ${getStatusText(reportData.personnel_disputes.resignation_dispute_3y)}`);
|
||||
}
|
||||
if (reportData.personnel_disputes.dismissal_dispute_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年辞退: ${getStatusText(reportData.personnel_disputes.dismissal_dispute_3y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '人事争议类纠纷',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'personnel_disputes_3y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 仲裁相关案件 - 近3年,只显示命中的
|
||||
if (reportData.arbitration) {
|
||||
let details: string[] = [];
|
||||
if (reportData.arbitration.arbitration_confirmation_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年仲裁确认: ${getStatusText(reportData.arbitration.arbitration_confirmation_3y)}`);
|
||||
}
|
||||
if (reportData.arbitration.arbitration_revocation_3y === 2) { // 只显示命中的
|
||||
details.push(`近3年仲裁撤销: ${getStatusText(reportData.arbitration.arbitration_revocation_3y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '仲裁相关案件',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'arbitration_3y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return risks;
|
||||
});
|
||||
|
||||
// 近五年案件数据 - 只显示命中的时间相关字段
|
||||
const recentFiveYearsData = computed(() => {
|
||||
const risks: {title: string, value: number, details: string | string[], bgColor: string, borderColor: string, fieldName: string}[] = [];
|
||||
|
||||
// 劳动争议风险 - 近5年,只显示命中的
|
||||
if (reportData.labor_disputes) {
|
||||
let details: string[] = [];
|
||||
if (reportData.labor_disputes.labor_disputes_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年劳动争议: ${getStatusText(reportData.labor_disputes.labor_disputes_5y)}`);
|
||||
}
|
||||
if (reportData.labor_disputes.labor_relation_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年劳动关系: ${getStatusText(reportData.labor_disputes.labor_relation_5y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '劳动争议风险',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'labor_disputes_5y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 社会保险纠纷风险 - 近5年,只显示命中的
|
||||
if (reportData.social_insurance) {
|
||||
let details: string[] = [];
|
||||
if (reportData.social_insurance.pension_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年养老: ${getStatusText(reportData.social_insurance.pension_5y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.injury_insurance_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年工伤: ${getStatusText(reportData.social_insurance.injury_insurance_5y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.unemployment_insurance_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年失业: ${getStatusText(reportData.social_insurance.unemployment_insurance_5y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.medical_insurance_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年医疗: ${getStatusText(reportData.social_insurance.medical_insurance_5y)}`);
|
||||
}
|
||||
if (reportData.social_insurance.maternity_insurance_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年生育: ${getStatusText(reportData.social_insurance.maternity_insurance_5y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '社会保险纠纷风险',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'social_insurance_5y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 人事争议类纠纷 - 近5年,只显示命中的
|
||||
if (reportData.personnel_disputes) {
|
||||
let details: string[] = [];
|
||||
if (reportData.personnel_disputes.resignation_dispute_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年辞职: ${getStatusText(reportData.personnel_disputes.resignation_dispute_5y)}`);
|
||||
}
|
||||
if (reportData.personnel_disputes.dismissal_dispute_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年辞退: ${getStatusText(reportData.personnel_disputes.dismissal_dispute_5y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '人事争议类纠纷',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'personnel_disputes_5y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 仲裁相关案件 - 近5年,只显示命中的
|
||||
if (reportData.arbitration) {
|
||||
let details: string[] = [];
|
||||
if (reportData.arbitration.arbitration_confirmation_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年仲裁确认: ${getStatusText(reportData.arbitration.arbitration_confirmation_5y)}`);
|
||||
}
|
||||
if (reportData.arbitration.arbitration_revocation_5y === 2) { // 只显示命中的
|
||||
details.push(`近5年仲裁撤销: ${getStatusText(reportData.arbitration.arbitration_revocation_5y)}`);
|
||||
}
|
||||
|
||||
if (details.length > 0) {
|
||||
risks.push({
|
||||
title: '仲裁相关案件',
|
||||
value: 2, // 因为至少有一个命中,所以值设为2
|
||||
details: details,
|
||||
bgColor: getBackgroundColor(2),
|
||||
borderColor: getBorderColor(2),
|
||||
fieldName: 'arbitration_5y'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return risks;
|
||||
});
|
||||
|
||||
// 切换标签页
|
||||
const switchTab = (tabName: string) => {
|
||||
activeTab.value = tabName;
|
||||
};
|
||||
|
||||
// 获取当前显示的数据
|
||||
const currentData = computed(() => {
|
||||
switch (activeTab.value) {
|
||||
case 'summary':
|
||||
return summaryData.value;
|
||||
case 'threeYears':
|
||||
return recentThreeYearsData.value;
|
||||
case 'fiveYears':
|
||||
return recentFiveYearsData.value;
|
||||
default:
|
||||
return summaryData.value;
|
||||
}
|
||||
});
|
||||
|
||||
// 获取当前标签页标题
|
||||
const currentTabTitle = computed(() => {
|
||||
switch (activeTab.value) {
|
||||
case 'summary':
|
||||
return '汇总';
|
||||
case 'threeYears':
|
||||
return '近三年案件';
|
||||
case 'fiveYears':
|
||||
return '近五年案件';
|
||||
default:
|
||||
return '汇总';
|
||||
}
|
||||
});
|
||||
|
||||
// 获取当前标签页副标题
|
||||
const currentTabSubtitle = computed(() => {
|
||||
switch (activeTab.value) {
|
||||
case 'summary':
|
||||
return '基础风险概览';
|
||||
case 'threeYears':
|
||||
return '近期风险动态';
|
||||
case 'fiveYears':
|
||||
return '长期风险趋势';
|
||||
default:
|
||||
return '基础风险概览';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="ivyz0s0d-container">
|
||||
<div class="card">
|
||||
<!-- 标签页导航 -->
|
||||
<div class="tabs-nav">
|
||||
<button
|
||||
class="tab-button"
|
||||
:class="{ 'active': activeTab === 'summary' }"
|
||||
@click="switchTab('summary')"
|
||||
>
|
||||
汇总
|
||||
</button>
|
||||
<button
|
||||
class="tab-button"
|
||||
:class="{ 'active': activeTab === 'threeYears' }"
|
||||
@click="switchTab('threeYears')"
|
||||
>
|
||||
近三年案件
|
||||
</button>
|
||||
<button
|
||||
class="tab-button"
|
||||
:class="{ 'active': activeTab === 'fiveYears' }"
|
||||
@click="switchTab('fiveYears')"
|
||||
>
|
||||
近五年案件
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- 标签页内容 -->
|
||||
<div class="tab-content">
|
||||
<div class="tab-header">
|
||||
<h3 class="tab-title">{{ currentTabTitle }}</h3>
|
||||
<div class="tab-subtitle">{{ currentTabSubtitle }}</div>
|
||||
</div>
|
||||
|
||||
<div v-if="hasAnyData" class="risk-cards-container">
|
||||
<div
|
||||
v-for="(risk, index) in currentData"
|
||||
:key="index"
|
||||
class="risk-card"
|
||||
:class="{ 'hit-risk': risk.value === 2 }"
|
||||
:style="{ backgroundColor: risk.bgColor, borderLeft: `4px solid ${risk.borderColor}` }"
|
||||
>
|
||||
<div class="risk-card__content">
|
||||
<h4 class="risk-card__title">{{ risk.title }}</h4>
|
||||
<div class="risk-card__status">
|
||||
<!-- 当 details 是字符串时显示单行 -->
|
||||
<p v-if="typeof risk.details === 'string'" class="risk-detail-item">{{ risk.details }}</p>
|
||||
<!-- 当 details 是数组时,每项占一行 -->
|
||||
<p
|
||||
v-else
|
||||
v-for="(detail, idx) in risk.details"
|
||||
:key="idx"
|
||||
class="risk-detail-item"
|
||||
>{{ detail }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 如果当前标签页没有数据,显示提示 -->
|
||||
<div v-if="currentData.length === 0" class="no-data-tab">
|
||||
<p>暂无{{ currentTabTitle }}数据</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 无数据提示 -->
|
||||
<div v-if="!hasAnyData" class="no-data">
|
||||
<p>暂无相关风险数据</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.ivyz0s0d-container {
|
||||
padding: 20px;
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #f8fafc;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: white;
|
||||
border-radius: 0.75rem;
|
||||
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
padding: 1.25rem;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.tabs-nav {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
border-bottom: 2px solid #e5e7eb;
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
.tab-button {
|
||||
flex: 1;
|
||||
padding: 0.75rem 1rem;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
font-size: 0.875rem;
|
||||
color: #6b7280;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-bottom: 2px solid transparent;
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.tab-button:hover {
|
||||
color: #4b5563;
|
||||
background-color: #f9fafb;
|
||||
}
|
||||
|
||||
.tab-button.active {
|
||||
color: #3b82f6;
|
||||
border-bottom-color: #3b82f6;
|
||||
background-color: #eff6ff;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
min-height: 300px;
|
||||
}
|
||||
|
||||
.tab-header {
|
||||
margin-bottom: 1rem;
|
||||
padding-bottom: 0.75rem;
|
||||
border-bottom: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
.tab-title {
|
||||
margin: 0 0 0.25rem 0;
|
||||
font-size: 1.25rem;
|
||||
font-weight: bold;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
.tab-subtitle {
|
||||
margin: 0;
|
||||
font-size: 0.875rem;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
.risk-cards-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.risk-card {
|
||||
border: 1px solid #e5e7eb;
|
||||
border-radius: 0.5rem;
|
||||
padding: 1rem;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.risk-card.hit-risk {
|
||||
border-left: 4px solid #f44336 !important; /* 命中风险的红色边框 */
|
||||
background-color: #ffe8e8 !important; /* 命中风险的浅红色背景 */
|
||||
}
|
||||
|
||||
.risk-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
.risk-card__content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.risk-card__title {
|
||||
margin: 0 0 0.5rem 0;
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.risk-card__status {
|
||||
margin: 0;
|
||||
font-size: 0.875rem;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.risk-detail-item {
|
||||
margin: 0 0 0.25rem 0;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.risk-detail-item:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.no-data {
|
||||
text-align: center;
|
||||
color: #999;
|
||||
font-style: italic;
|
||||
padding: 2.5rem 1.25rem;
|
||||
background-color: white;
|
||||
border-radius: 0.75rem;
|
||||
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
.no-data-tab {
|
||||
text-align: center;
|
||||
color: #9ca3af;
|
||||
font-style: italic;
|
||||
padding: 1.5rem 1rem;
|
||||
background-color: #f9fafb;
|
||||
border-radius: 0.5rem;
|
||||
border: 1px dashed #e5e7eb;
|
||||
}
|
||||
|
||||
/* 响应式设计 */
|
||||
@media (max-width: 768px) {
|
||||
.ivyz0s0d-container {
|
||||
padding: 0.75rem;
|
||||
}
|
||||
|
||||
.card {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.tab-button {
|
||||
font-size: 0.8rem;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.tab-title {
|
||||
font-size: 1.125rem;
|
||||
}
|
||||
|
||||
.risk-card__title {
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.risk-card__status {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
696
src/ui/IVYZ3P9M.vue
Normal file
696
src/ui/IVYZ3P9M.vue
Normal file
@@ -0,0 +1,696 @@
|
||||
<script setup>
|
||||
import { computed } from 'vue';
|
||||
import { useRiskNotifier } from '@/composables/useRiskNotifier';
|
||||
|
||||
import xlIcon from '@/assets/images/report/xl.png';
|
||||
import zymcIcon from '@/assets/images/report/zymc.png';
|
||||
import xxxsIcon from '@/assets/images/report/xxxs.png';
|
||||
import xxlxIcon from '@/assets/images/report/xxlx.png';
|
||||
import bysjIcon from '@/assets/images/report/bysj.png';
|
||||
import dictionaries from '@/data/ivyz3p9m-dictionary.json';
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: [Array, Object],
|
||||
default: () => [],
|
||||
},
|
||||
apiId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
index: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
notifyRiskStatus: {
|
||||
type: Function,
|
||||
default: () => { },
|
||||
},
|
||||
});
|
||||
|
||||
const riskScore = computed(() => 100);
|
||||
useRiskNotifier(props, riskScore);
|
||||
defineExpose({ riskScore });
|
||||
const educationLevelMap = dictionaries.educationLevel ?? {};
|
||||
const learningFormMap = dictionaries.learningForm ?? {};
|
||||
const schoolDictionary = dictionaries.schools ?? {};
|
||||
const specialtyDictionary = dictionaries.specialties ?? {};
|
||||
|
||||
const educationTagColorMap = {
|
||||
'1': 'bg-emerald-50 text-emerald-700 border-emerald-200',
|
||||
'2': 'bg-blue-50 text-blue-700 border-blue-200',
|
||||
'3': 'bg-indigo-50 text-indigo-700 border-indigo-200',
|
||||
'4': 'bg-purple-50 text-purple-700 border-purple-200',
|
||||
'5': 'bg-amber-50 text-amber-700 border-amber-200',
|
||||
};
|
||||
|
||||
const learningFormColorMap = {
|
||||
'1': 'bg-sky-50 text-sky-700 border-sky-200',
|
||||
'2': 'bg-blue-50 text-blue-700 border-blue-200',
|
||||
'3': 'bg-blue-50 text-blue-700 border-blue-200',
|
||||
'4': 'bg-cyan-50 text-cyan-700 border-cyan-200',
|
||||
'5': 'bg-orange-50 text-orange-700 border-orange-200',
|
||||
'6': 'bg-lime-50 text-lime-700 border-lime-200',
|
||||
'7': 'bg-indigo-50 text-indigo-700 border-indigo-200',
|
||||
'8': 'bg-violet-50 text-violet-700 border-violet-200',
|
||||
'9': 'bg-fuchsia-50 text-fuchsia-700 border-fuchsia-200',
|
||||
};
|
||||
|
||||
const normalizeCode = (value) => {
|
||||
if (value === null || value === undefined) return '';
|
||||
return String(value).trim();
|
||||
};
|
||||
|
||||
const getEducationLevelText = (code) => {
|
||||
const normalized = normalizeCode(code);
|
||||
if (!normalized) return '未知';
|
||||
return educationLevelMap[normalized] || '未知';
|
||||
};
|
||||
|
||||
const getLearningFormText = (code) => {
|
||||
const normalized = normalizeCode(code);
|
||||
if (!normalized) return '未知';
|
||||
return learningFormMap[normalized] || '未知';
|
||||
};
|
||||
|
||||
const getSchoolNameText = (code, fallback) => {
|
||||
const normalized = normalizeCode(code);
|
||||
if (!normalized) return fallback || '未知学校';
|
||||
return schoolDictionary[normalized] || fallback || '未知学校';
|
||||
};
|
||||
|
||||
const getSpecialtyNameText = (code, fallback) => {
|
||||
const normalized = normalizeCode(code);
|
||||
if (!normalized) return fallback || '未知专业';
|
||||
return specialtyDictionary[normalized] || fallback || '未知专业';
|
||||
};
|
||||
|
||||
const getEducationLevelClass = (code) => {
|
||||
const normalized = normalizeCode(code);
|
||||
return educationTagColorMap[normalized] || 'bg-gray-50 text-gray-700 border-gray-200';
|
||||
};
|
||||
|
||||
const getLearningFormClass = (code) => {
|
||||
const normalized = normalizeCode(code);
|
||||
return learningFormColorMap[normalized] || 'bg-gray-50 text-gray-700 border-gray-200';
|
||||
};
|
||||
|
||||
const maskIdNumber = (idNumber) => {
|
||||
if (!idNumber) return '未知';
|
||||
const normalized = String(idNumber).trim();
|
||||
if (normalized.length <= 6) {
|
||||
return `${normalized.slice(0, 1)}****${normalized.slice(-1)}`;
|
||||
}
|
||||
return `${normalized.slice(0, 3)}********${normalized.slice(-4)}`;
|
||||
};
|
||||
|
||||
const formatDate = (dateStr) => {
|
||||
if (!dateStr) return '未知';
|
||||
const normalized = String(dateStr).trim();
|
||||
if (!/^\d+$/.test(normalized)) return '未知';
|
||||
|
||||
if (normalized.length === 8) {
|
||||
const year = normalized.substring(0, 4);
|
||||
const month = normalized.substring(4, 6);
|
||||
const day = normalized.substring(6, 8);
|
||||
return `${year}年${month}月${day}日`;
|
||||
}
|
||||
|
||||
if (normalized.length === 6) {
|
||||
const year = normalized.substring(0, 4);
|
||||
const month = normalized.substring(4, 6);
|
||||
return `${year}年${month}月`;
|
||||
}
|
||||
|
||||
if (normalized.length === 4) {
|
||||
const shortYear = normalized.substring(0, 2);
|
||||
const month = normalized.substring(2, 4);
|
||||
return `20${shortYear}年${month}月`;
|
||||
}
|
||||
|
||||
return '未知';
|
||||
};
|
||||
|
||||
const parseDate = (value) => {
|
||||
if (!value) return null;
|
||||
const normalized = String(value).trim();
|
||||
if (!/^\d+$/.test(normalized)) return null;
|
||||
|
||||
let year;
|
||||
let month;
|
||||
let day = 1;
|
||||
|
||||
if (normalized.length === 8) {
|
||||
year = Number(normalized.substring(0, 4));
|
||||
month = Number(normalized.substring(4, 6));
|
||||
day = Number(normalized.substring(6, 8));
|
||||
} else if (normalized.length === 6) {
|
||||
year = Number(normalized.substring(0, 4));
|
||||
month = Number(normalized.substring(4, 6));
|
||||
} else if (normalized.length === 4) {
|
||||
year = Number(`20${normalized.substring(0, 2)}`);
|
||||
month = Number(normalized.substring(2, 4));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!year || !month) return null;
|
||||
return new Date(year, month - 1, day);
|
||||
};
|
||||
|
||||
const calculateStudyDuration = (start, end) => {
|
||||
const startDate = parseDate(start);
|
||||
const endDate = parseDate(end);
|
||||
|
||||
if (!startDate || !endDate || endDate < startDate) {
|
||||
return '时长未知';
|
||||
}
|
||||
|
||||
const totalMonths =
|
||||
(endDate.getFullYear() - startDate.getFullYear()) * 12 +
|
||||
(endDate.getMonth() - startDate.getMonth());
|
||||
|
||||
if (totalMonths <= 0) {
|
||||
return '不足 1 个月';
|
||||
}
|
||||
|
||||
const years = Math.floor(totalMonths / 12);
|
||||
const months = totalMonths % 12;
|
||||
|
||||
const parts = [];
|
||||
if (years > 0) parts.push(`${years}年`);
|
||||
if (months > 0) parts.push(`${months}个月`);
|
||||
|
||||
return parts.length > 0 ? `约 ${parts.join('')}` : '约 1 个月';
|
||||
};
|
||||
|
||||
const educationRecords = computed(() => {
|
||||
const source = props.data;
|
||||
if (Array.isArray(source)) return source;
|
||||
if (Array.isArray(source?.data)) return source.data;
|
||||
if (Array.isArray(source?.records)) return source.records;
|
||||
if (Array.isArray(source?.list)) return source.list;
|
||||
return [];
|
||||
});
|
||||
|
||||
const enhancedRecords = computed(() =>
|
||||
educationRecords.value.map((record, index) => {
|
||||
const educationLevelCode = normalizeCode(record.educationLevel);
|
||||
const learningFormCode = normalizeCode(record.learningForm);
|
||||
const schoolCode = normalizeCode(record.schoolName);
|
||||
const specialtyCode = normalizeCode(record.specialtyName);
|
||||
|
||||
const schoolName = getSchoolNameText(schoolCode, record.schoolName);
|
||||
const specialtyName = getSpecialtyNameText(specialtyCode, record.specialtyName);
|
||||
|
||||
return {
|
||||
index: index + 1,
|
||||
studentName: record.studentName || '未知',
|
||||
idNumber: record.idNumber || '',
|
||||
maskedIdNumber: maskIdNumber(record.idNumber),
|
||||
schoolName,
|
||||
specialtyName,
|
||||
isUnknownSchool: schoolName === '未知学校' || (!schoolCode && !record.schoolName),
|
||||
isUnknownSpecialty: specialtyName === '未知专业' || (!specialtyCode && !record.specialtyName),
|
||||
educationLevelCode,
|
||||
educationLevel: getEducationLevelText(educationLevelCode),
|
||||
learningFormCode,
|
||||
learningForm: getLearningFormText(learningFormCode),
|
||||
enrollmentDate: formatDate(record.enrollmentDate),
|
||||
graduationDate: formatDate(record.graduationDate),
|
||||
rawEnrollmentDate: record.enrollmentDate || '',
|
||||
rawGraduationDate: record.graduationDate || '',
|
||||
studyDuration: calculateStudyDuration(record.enrollmentDate, record.graduationDate),
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
const getTimestamp = (value) => {
|
||||
const date = parseDate(value);
|
||||
return date ? date.getTime() : null;
|
||||
};
|
||||
|
||||
const orderedRecords = computed(() => {
|
||||
if (enhancedRecords.value.length <= 1) return enhancedRecords.value;
|
||||
|
||||
return [...enhancedRecords.value].sort((a, b) => {
|
||||
const startA =
|
||||
getTimestamp(a.rawEnrollmentDate) ??
|
||||
getTimestamp(a.rawGraduationDate) ??
|
||||
Number.MAX_SAFE_INTEGER;
|
||||
const startB =
|
||||
getTimestamp(b.rawEnrollmentDate) ??
|
||||
getTimestamp(b.rawGraduationDate) ??
|
||||
Number.MAX_SAFE_INTEGER;
|
||||
|
||||
if (startA === startB) {
|
||||
const endA = getTimestamp(a.rawGraduationDate) ?? Number.MAX_SAFE_INTEGER;
|
||||
const endB = getTimestamp(b.rawGraduationDate) ?? Number.MAX_SAFE_INTEGER;
|
||||
return endA - endB;
|
||||
}
|
||||
|
||||
return startA - startB;
|
||||
});
|
||||
});
|
||||
|
||||
const educationRankMap = {
|
||||
'1': 1,
|
||||
'2': 2,
|
||||
'3': 3,
|
||||
'4': 4,
|
||||
'5': 2.5,
|
||||
};
|
||||
|
||||
const getEducationRank = (code) => {
|
||||
const normalized = normalizeCode(code);
|
||||
return educationRankMap[normalized] ?? 0;
|
||||
};
|
||||
|
||||
const summaryRecord = computed(() => {
|
||||
if (orderedRecords.value.length === 0) return null;
|
||||
|
||||
return orderedRecords.value.reduce((best, current) => {
|
||||
if (!best) return current;
|
||||
|
||||
const currentRank = getEducationRank(current.educationLevelCode);
|
||||
const bestRank = getEducationRank(best.educationLevelCode);
|
||||
|
||||
if (currentRank > bestRank) return current;
|
||||
if (currentRank < bestRank) return best;
|
||||
|
||||
const currentGrad = getTimestamp(current.rawGraduationDate) ?? Number.NEGATIVE_INFINITY;
|
||||
const bestGrad = getTimestamp(best.rawGraduationDate) ?? Number.NEGATIVE_INFINITY;
|
||||
|
||||
return currentGrad >= bestGrad
|
||||
? current
|
||||
: best;
|
||||
}, null);
|
||||
});
|
||||
|
||||
const latestGraduationText = computed(() => {
|
||||
if (orderedRecords.value.length === 0) return '未知';
|
||||
|
||||
const latest = orderedRecords.value.reduce((latestRecord, current) => {
|
||||
if (!latestRecord) return current;
|
||||
const currentGrad = getTimestamp(current.rawGraduationDate) ?? Number.NEGATIVE_INFINITY;
|
||||
const latestGrad = getTimestamp(latestRecord.rawGraduationDate) ?? Number.NEGATIVE_INFINITY;
|
||||
return currentGrad >= latestGrad
|
||||
? current
|
||||
: latestRecord;
|
||||
}, null);
|
||||
|
||||
return latest?.graduationDate || '未知';
|
||||
});
|
||||
|
||||
const hasData = computed(() => orderedRecords.value.length > 0);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="hasData" class="card max-w-4xl mx-auto">
|
||||
<div class="flex flex-col gap-6">
|
||||
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-12 h-12 flex items-center justify-center">
|
||||
<img :src="xlIcon" alt="学历信息" class="w-12 h-12" />
|
||||
</div>
|
||||
<div>
|
||||
<h2 class="text-2xl font-bold text-gray-900">学历信息查询</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col items-start md:items-end gap-1">
|
||||
<div class="text-lg font-semibold text-blue-600">
|
||||
共 {{ orderedRecords.length }} 条记录
|
||||
</div>
|
||||
<div v-if="summaryRecord" class="summary-meta text-sm text-gray-500">
|
||||
<span class="summary-meta__item">最高学历:{{ summaryRecord.educationLevel }}</span>
|
||||
<span v-if="latestGraduationText" class="summary-meta__divider">·</span>
|
||||
<span class="summary-meta__item">最新毕业时间:{{ latestGraduationText }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="summaryRecord" class="summary-banner">
|
||||
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="w-14 h-14 rounded-full bg-white/80 flex items-center justify-center shadow-inner">
|
||||
<img :src="xlIcon" alt="学历图标" class="w-10 h-10" />
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-xl font-semibold text-gray-900">{{ summaryRecord.studentName }}</div>
|
||||
<div class="text-sm text-slate-600">身份证:{{ summaryRecord.maskedIdNumber }}</div>
|
||||
<div class="summary-highlight">
|
||||
<span class="summary-highlight__badge">{{ summaryRecord.educationLevel }}</span>
|
||||
<div class="summary-highlight__text flex flex-col gap-1">
|
||||
<span class="flex items-center gap-2">
|
||||
{{ summaryRecord.schoolName }}
|
||||
<span v-if="summaryRecord.isUnknownSchool" class="unknown-hint">
|
||||
<svg class="unknown-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
</span>
|
||||
</span>
|
||||
<span v-if="summaryRecord.isUnknownSchool" class="unknown-text">该学校名称信息未找到,可能是学校已改名</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="flex flex-wrap items-center gap-3">
|
||||
<div class="summary-chip">
|
||||
<span class="chip-label">入学时间</span>
|
||||
<span class="chip-value">{{ summaryRecord.enrollmentDate }}</span>
|
||||
</div>
|
||||
<div class="summary-chip">
|
||||
<span class="chip-label">毕业时间</span>
|
||||
<span class="chip-value">{{ summaryRecord.graduationDate }}</span>
|
||||
</div>
|
||||
<div class="summary-chip">
|
||||
<span class="chip-label">学习时长</span>
|
||||
<span class="chip-value">{{ summaryRecord.studyDuration }}</span>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-5">
|
||||
<div v-for="record in orderedRecords" :key="record.index" class="record-card">
|
||||
<div class="flex flex-col lg:flex-row lg:items-start lg:justify-between gap-4">
|
||||
<div class="record-header">
|
||||
<div class="record-index">
|
||||
{{ record.index }}
|
||||
</div>
|
||||
<div class="record-title">
|
||||
<div class="record-title__name flex flex-col gap-1">
|
||||
<span class="flex items-center gap-2">
|
||||
{{ record.schoolName }}
|
||||
<span v-if="record.isUnknownSchool" class="unknown-hint">
|
||||
<svg class="unknown-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
</span>
|
||||
</span>
|
||||
<span v-if="record.isUnknownSchool" class="unknown-text">该学校名称信息未找到,可能是学校已改名</span>
|
||||
</div>
|
||||
<div class="record-title__meta" v-if="record.enrollmentDate !== '未知' || record.graduationDate !== '未知'">
|
||||
<span v-if="record.enrollmentDate !== '未知'">{{ record.enrollmentDate }}</span>
|
||||
<span v-if="record.enrollmentDate !== '未知' && record.graduationDate !== '未知'"> - </span>
|
||||
<span v-if="record.graduationDate !== '未知'">{{ record.graduationDate }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center gap-3">
|
||||
<span :class="['tag', getEducationLevelClass(record.educationLevelCode)]">
|
||||
{{ record.educationLevel }}学历
|
||||
</span>
|
||||
<span :class="['tag', getLearningFormClass(record.learningFormCode)]">
|
||||
学习形式:{{ record.learningForm }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-6">
|
||||
<div class="info-block">
|
||||
<div class="info-icon">
|
||||
<img :src="zymcIcon" alt="专业名称" class="w-7 h-7" />
|
||||
</div>
|
||||
<div>
|
||||
<div class="info-label">专业名称</div>
|
||||
<div class="info-value flex flex-col gap-1">
|
||||
<span class="flex items-center gap-2">
|
||||
{{ record.specialtyName }}
|
||||
<span v-if="record.isUnknownSpecialty" class="unknown-hint">
|
||||
<svg class="unknown-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
</span>
|
||||
</span>
|
||||
<span v-if="record.isUnknownSpecialty" class="unknown-text">该专业名称信息未找到,可能是该学校专业已受到变动</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-block">
|
||||
<div class="info-icon">
|
||||
<img :src="xxxsIcon" alt="学习形式" class="w-7 h-7" />
|
||||
</div>
|
||||
<div>
|
||||
<div class="info-label">学习形式</div>
|
||||
<div class="info-value">
|
||||
{{ record.learningForm }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-block">
|
||||
<div class="info-icon">
|
||||
<img :src="xxlxIcon" alt="入学时间" class="w-7 h-7" />
|
||||
</div>
|
||||
<div>
|
||||
<div class="info-label">入学时间</div>
|
||||
<div class="info-value">{{ record.enrollmentDate }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-block">
|
||||
<div class="info-icon">
|
||||
<img :src="bysjIcon" alt="毕业时间" class="w-7 h-7" />
|
||||
</div>
|
||||
<div>
|
||||
<div class="info-label">毕业时间</div>
|
||||
<div class="info-value">{{ record.graduationDate }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else class="card max-w-3xl mx-auto">
|
||||
<div class="flex flex-col items-center py-12 text-center">
|
||||
<div class="w-20 h-20 flex items-center justify-center mb-4">
|
||||
<img :src="xlIcon" alt="学历图标" class="w-20 h-20 opacity-40" />
|
||||
</div>
|
||||
<h3 class="text-lg font-medium text-gray-900 mb-2">暂无学历记录</h3>
|
||||
<p class="text-sm text-gray-500 max-w-md">
|
||||
未查询到相关的学历信息,可能是数据正在更新或尚未录入。建议稍后重试或联系数据提供方确认。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.card {
|
||||
padding: 1.5rem;
|
||||
box-shadow: 0px 0px 24px 0px #3f3f3f0f;
|
||||
border-radius: 12px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.summary-banner {
|
||||
border-radius: 16px;
|
||||
padding: 1.5rem;
|
||||
background: linear-gradient(135deg, rgba(59, 130, 246, 0.1), rgba(79, 70, 229, 0.12));
|
||||
border: 1px solid rgba(59, 130, 246, 0.25);
|
||||
}
|
||||
|
||||
.summary-chip {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
gap: 0.15rem;
|
||||
padding: 0.5rem 0.75rem;
|
||||
border-radius: 0.75rem;
|
||||
background-color: rgba(255, 255, 255, 0.9);
|
||||
border: 1px solid rgba(148, 163, 184, 0.3);
|
||||
}
|
||||
|
||||
.chip-label {
|
||||
font-size: 0.7rem;
|
||||
color: #64748b;
|
||||
letter-spacing: 0.02em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.chip-value {
|
||||
font-size: 0.95rem;
|
||||
font-weight: 600;
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
.summary-meta {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.35rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.summary-meta__divider {
|
||||
color: #94a3b8;
|
||||
}
|
||||
|
||||
.summary-highlight {
|
||||
margin-top: 0.35rem;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.summary-highlight__badge {
|
||||
padding: 0.2rem 0.6rem;
|
||||
border-radius: 9999px;
|
||||
background: rgba(59, 130, 246, 0.12);
|
||||
color: #2563eb;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.summary-highlight__text {
|
||||
font-size: 0.9rem;
|
||||
color: #1e293b;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.record-card {
|
||||
position: relative;
|
||||
padding: 1.5rem;
|
||||
border-radius: 16px;
|
||||
border: 1px solid rgba(226, 232, 240, 0.9);
|
||||
background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);
|
||||
box-shadow: 0 10px 25px rgba(15, 23, 42, 0.06);
|
||||
transition: all 0.25s ease;
|
||||
}
|
||||
|
||||
.record-card::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
background: linear-gradient(90deg, rgba(59, 130, 246, 0.75), rgba(129, 140, 248, 0.75));
|
||||
border-radius: 12px 12px 0 0;
|
||||
}
|
||||
|
||||
.record-card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 16px 35px rgba(59, 130, 246, 0.16);
|
||||
}
|
||||
|
||||
.record-header {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.record-index {
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
border-radius: 999px;
|
||||
background: rgba(59, 130, 246, 0.18);
|
||||
color: #2563eb;
|
||||
font-weight: 700;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 1.05rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.record-title {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.2rem;
|
||||
}
|
||||
|
||||
.record-title__name {
|
||||
font-size: 1.125rem;
|
||||
font-weight: 600;
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
.record-title__meta {
|
||||
font-size: 0.85rem;
|
||||
color: #64748b;
|
||||
}
|
||||
|
||||
.tag {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.25rem;
|
||||
padding: 0.4rem 0.85rem;
|
||||
border-radius: 9999px;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
}
|
||||
|
||||
.info-block {
|
||||
display: flex;
|
||||
gap: 0.75rem;
|
||||
padding: 1rem;
|
||||
border-radius: 12px;
|
||||
background-color: rgba(248, 250, 252, 0.9);
|
||||
border: 1px solid rgba(226, 232, 240, 0.8);
|
||||
transition: border-color 0.2s ease, transform 0.2s ease;
|
||||
}
|
||||
|
||||
.info-block:hover {
|
||||
border-color: rgba(59, 130, 246, 0.3);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.info-icon {
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
border-radius: 0.75rem;
|
||||
background: rgba(59, 130, 246, 0.12);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.info-label {
|
||||
font-size: 0.75rem;
|
||||
color: #64748b;
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
.info-value {
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
color: #0f172a;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.unknown-hint {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.unknown-icon {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
color: #f59e0b;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.unknown-text {
|
||||
font-size: 0.75rem;
|
||||
color: #f59e0b;
|
||||
line-height: 1.4;
|
||||
margin-top: 0.125rem;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.record-card {
|
||||
padding: 1.25rem;
|
||||
}
|
||||
|
||||
.info-block {
|
||||
padding: 0.85rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div v-for="item in detectionItems" :key="item.key" class="rounded-xl p-4 relative"
|
||||
:class="getItemResultClass(item.hit)">
|
||||
<div class="absolute top-0 right-0">
|
||||
<div class="px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl"
|
||||
<div class="px-2 py-1 text-sm text-white rounded-bl-xl rounded-tr-xl"
|
||||
:class="getItemTagClass(item.hit)">
|
||||
{{ getItemText(item.hit) }}
|
||||
</div>
|
||||
@@ -33,6 +33,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<LRemark
|
||||
content="是否与黑中介有关联:与从事包装客户资料,伪造客户资料,冒用客户资料,套取机构政策等职业的用户或者机构成员有关联。\n是否疑似与异常行业有关联:互联网行为疑似涉嫌色情、赌博、毒品等不良行为。\n是否疑似虚假资料:在社交平台提供过虚假资料,或者有恶意申请/操作记录,或者个人信息疑似泄漏、冒用、伪造等。\n是否疑似羊毛党:在网贷、电商、O2O等平台有薅羊毛行为的用户。\n是否身份信息存疑:未获取到社交平台中的身份信息或者身份信息(身份证、手机号、姓名)疑似涉嫌伪造。\n是否严重异常行为:疑似有恶意消费的行为。\n是否存在失信行为:客户有失信行为。\n是否存在支付异常行为:支付行为异常包括支付频次、额度、场景等方面有过异常行为。\n是否存在其他异常行为:用户和以下高风险行为可能存在较高关联度:被盗风险较高、社交圈子不固定、地理圈子变化较大。\n是否上网环境异常:用户上网时,有使用虚拟机、代理设备、代理IP、猫池等行为。" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
Binary file not shown.
@@ -6,7 +6,7 @@
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">申请行为详情</span>
|
||||
</div>
|
||||
|
||||
<span class="text-sm text-gray-500 mb-2 mx-4">0-1之间指数越大用户逾期可能性越高</span>
|
||||
<div class="p-4">
|
||||
<!-- 核心指标 -->
|
||||
<div class="grid grid-cols-2 gap-4 mb-6">
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
<!-- 申请命中情况 -->
|
||||
<LTitle title="申请命中情况" />
|
||||
<div class="grid grid-cols-2 gap-4 mb-6 mt-3">
|
||||
<div class="grid grid-cols-1 gap-4 mb-6 mt-3">
|
||||
<div class="bg-gray-50 rounded-lg p-3">
|
||||
<div class="text-sm text-gray-600 mb-1">申请命中机构数</div>
|
||||
<div class="text-lg font-bold text-gray-800">{{ getValue(data.A22160003, '0') }} 家</div>
|
||||
@@ -59,17 +59,17 @@
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-3 gap-3">
|
||||
<div class="bg-blue-50 rounded-lg p-3 text-center border border-[#2B79EE8F]">
|
||||
<div class="text-xl font-bold text-[#2B79EE] mb-1">{{ getValue(data.A22160008, '0') }}</div>
|
||||
<div class="text-xs text-gray-600">近1个月查询笔数</div>
|
||||
<div class="bg-blue-50 rounded-lg px-3 py-6 text-center border border-[#2B79EE8F]">
|
||||
<div class="text-3xl font-bold text-[#2B79EE] mb-1">{{ getValue(data.A22160008, '0') }}</div>
|
||||
<div class="text-sm text-gray-600">近1个月查询笔数</div>
|
||||
</div>
|
||||
<div class="bg-blue-50 rounded-lg p-3 text-center border border-[#2B79EE8F]">
|
||||
<div class="text-xl font-bold text-[#2B79EE] mb-1">{{ getValue(data.A22160009, '0') }}</div>
|
||||
<div class="text-xs text-gray-600">近3个月查询笔数</div>
|
||||
<div class="bg-blue-50 rounded-lg px-3 py-6 text-center border border-[#2B79EE8F]">
|
||||
<div class="text-3xl font-bold text-[#2B79EE] mb-1">{{ getValue(data.A22160009, '0') }}</div>
|
||||
<div class="text-sm text-gray-600">近3个月查询笔数</div>
|
||||
</div>
|
||||
<div class="bg-blue-50 rounded-lg p-3 text-center border border-[#2B79EE8F]">
|
||||
<div class="text-xl font-bold text-[#2B79EE] mb-1">{{ getValue(data.A22160010, '0') }}</div>
|
||||
<div class="text-xs text-gray-600">近6个月查询笔数</div>
|
||||
<div class="bg-blue-50 rounded-lg px-3 py-6 text-center border border-[#2B79EE8F]">
|
||||
<div class="text-3xl font-bold text-[#2B79EE] mb-1">{{ getValue(data.A22160010, '0') }}</div>
|
||||
<div class="text-sm text-gray-600">近6个月查询笔数</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -197,7 +197,7 @@ const applyScoreGaugeOption = computed(() => {
|
||||
axisLabel: {
|
||||
show: true,
|
||||
distance: -18,
|
||||
fontSize: 10,
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
formatter: function(value) {
|
||||
if (value === 0) return '0'
|
||||
@@ -318,7 +318,7 @@ const applyConfidenceGaugeOption = computed(() => {
|
||||
axisLabel: {
|
||||
show: true,
|
||||
distance: -15,
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
formatter: function(value) {
|
||||
// 将百分比映射回置信度值
|
||||
@@ -413,7 +413,7 @@ const queryTrendChartOption = computed(() => {
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
formatter: '{value} 次'
|
||||
},
|
||||
@@ -441,7 +441,7 @@ const queryTrendChartOption = computed(() => {
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#333'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,17 +237,17 @@
|
||||
<div class="text-sm font-medium text-gray-700 mb-3">M0+逾期</div>
|
||||
<div class="space-y-2">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-xs text-gray-600">近6个月</span>
|
||||
<span class="text-sm text-gray-600">近6个月</span>
|
||||
<span class="text-sm font-bold text-[#EB3C3C]">{{ getValue(data.B22170025, '0') }}
|
||||
笔</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-xs text-gray-600">近12个月</span>
|
||||
<span class="text-sm text-gray-600">近12个月</span>
|
||||
<span class="text-sm font-bold text-[#EB3C3C]">{{ getValue(data.B22170026, '0') }}
|
||||
笔</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-xs text-gray-600">近24个月</span>
|
||||
<span class="text-sm text-gray-600">近24个月</span>
|
||||
<span class="text-sm font-bold text-[#EB3C3C]">{{ getValue(data.B22170027, '0') }}
|
||||
笔</span>
|
||||
</div>
|
||||
@@ -259,17 +259,17 @@
|
||||
<div class="text-sm font-medium text-gray-700 mb-3">M1+逾期</div>
|
||||
<div class="space-y-2">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-xs text-gray-600">近6个月</span>
|
||||
<span class="text-sm text-gray-600">近6个月</span>
|
||||
<span class="text-sm font-bold text-[#EB3C3C]">{{ getValue(data.B22170028, '0') }}
|
||||
笔</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-xs text-gray-600">近12个月</span>
|
||||
<span class="text-sm text-gray-600">近12个月</span>
|
||||
<span class="text-sm font-bold text-[#EB3C3C]">{{ getValue(data.B22170029, '0') }}
|
||||
笔</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-xs text-gray-600">近24个月</span>
|
||||
<span class="text-sm text-gray-600">近24个月</span>
|
||||
<span class="text-sm font-bold text-[#EB3C3C]">{{ getValue(data.B22170030, '0') }}
|
||||
笔</span>
|
||||
</div>
|
||||
@@ -516,7 +516,7 @@ const behaviorScoreGaugeOption = computed(() => {
|
||||
axisLabel: {
|
||||
show: true,
|
||||
distance: -18,
|
||||
fontSize: 10,
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
formatter: function (value) {
|
||||
if (value === 0) return '0'
|
||||
@@ -637,7 +637,7 @@ const behaviorConfidenceGaugeOption = computed(() => {
|
||||
axisLabel: {
|
||||
show: true,
|
||||
distance: -15,
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#666',
|
||||
formatter: function (value) {
|
||||
// 将百分比映射回置信度值
|
||||
@@ -722,7 +722,7 @@ const loanTrendChartOption = computed(() => {
|
||||
type: 'category',
|
||||
data: periods,
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
rotate: 15
|
||||
},
|
||||
@@ -735,7 +735,7 @@ const loanTrendChartOption = computed(() => {
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
formatter: '{value} 笔'
|
||||
},
|
||||
@@ -763,7 +763,7 @@ const loanTrendChartOption = computed(() => {
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#333'
|
||||
}
|
||||
}
|
||||
@@ -829,7 +829,7 @@ const overdueComparisonChartOption = computed(() => {
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
formatter: '{value} 笔'
|
||||
},
|
||||
@@ -857,7 +857,7 @@ const overdueComparisonChartOption = computed(() => {
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#333'
|
||||
}
|
||||
},
|
||||
@@ -878,7 +878,7 @@ const overdueComparisonChartOption = computed(() => {
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#333'
|
||||
}
|
||||
}
|
||||
@@ -921,7 +921,7 @@ const amountDistributionChartOption = computed(() => {
|
||||
type: 'category',
|
||||
data: categories,
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280'
|
||||
},
|
||||
axisLine: {
|
||||
@@ -933,7 +933,7 @@ const amountDistributionChartOption = computed(() => {
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
formatter: '{value} 笔'
|
||||
},
|
||||
@@ -961,7 +961,7 @@ const amountDistributionChartOption = computed(() => {
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
fontSize: 11,
|
||||
fontSize: 12,
|
||||
color: '#333'
|
||||
}
|
||||
}
|
||||
|
||||
456
src/ui/JRZQ7F1A/components/BigDataReportSection.vue
Normal file
456
src/ui/JRZQ7F1A/components/BigDataReportSection.vue
Normal file
@@ -0,0 +1,456 @@
|
||||
<template>
|
||||
<div class="big-data-report-section bg-white rounded-lg border border-gray-200">
|
||||
<div class="flex items-center p-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center mr-2">
|
||||
<img src="@/assets/images/report/gl.png" alt="大数据详情" class="w-8 h-8 object-contain" />
|
||||
</div>
|
||||
<span class="font-bold text-gray-800">大数据详情</span>
|
||||
</div>
|
||||
|
||||
<div class="p-4">
|
||||
<!-- 网络贷款类信用 -->
|
||||
<LTitle title="网络贷款类信用" />
|
||||
<div class="mt-3 mb-6">
|
||||
<div class="space-y-4 mb-4">
|
||||
<!-- 网贷授信额度 -->
|
||||
<div class="rounded-lg border border-[#2B79EE8F] bg-[#2B79EE1A] p-4 text-center">
|
||||
<div class="text-xl font-bold text-[#2B79EE] mb-1">
|
||||
{{ formatCreditAmount(data.C22180001) }}
|
||||
</div>
|
||||
<div class="text-sm font-medium text-gray-700 mb-1">网贷授信额度</div>
|
||||
</div>
|
||||
|
||||
<!-- 网贷额度置信度 -->
|
||||
<div class="rounded-lg border border-[#2B79EE8F] bg-[#2B79EE1A] p-4">
|
||||
<div class="text-sm font-medium text-gray-700 mb-2 text-center">网贷额度置信度</div>
|
||||
<div class="h-40">
|
||||
<v-chart class="chart-container" :option="p2pConfidenceGaugeOption" autoresize />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-gray-50 rounded-lg p-4 space-y-3">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">网络贷款类机构数</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ getValue(data.C22180003, '0') }} 家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">网络贷款类产品数</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ getValue(data.C22180004, '0') }} 个</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">网络贷款机构最大授信额度</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ formatCreditAmount(data.C22180005) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">网络贷款机构平均授信额度</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ formatCreditAmount(data.C22180006) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 授信额度对比图 -->
|
||||
<div class="mb-6">
|
||||
<LTitle title="授信额度对比" />
|
||||
<div class="h-64 mt-3">
|
||||
<v-chart class="chart-container" :option="creditAmountChartOption" autoresize />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 消金贷款类信用 -->
|
||||
<LTitle title="消金贷款类信用" />
|
||||
<div class="mt-3 mb-6">
|
||||
<div class="space-y-4 mb-4">
|
||||
<!-- 消金建议授信额度 -->
|
||||
<div class="rounded-lg border border-[#1FBE5D8F] bg-[#1FBE5D1A] p-4 text-center">
|
||||
<div class="text-xl font-bold text-[#1FBE5D] mb-1">
|
||||
{{ formatCreditAmount(data.C22180011) }}
|
||||
</div>
|
||||
<div class="text-sm font-medium text-gray-700 mb-1">消金建议授信额度</div>
|
||||
</div>
|
||||
|
||||
<!-- 消金额度置信度 -->
|
||||
<div class="rounded-lg border border-[#1FBE5D8F] bg-[#1FBE5D1A] p-4">
|
||||
<div class="text-sm font-medium text-gray-700 mb-2 text-center">消金额度置信度</div>
|
||||
<div class="h-40">
|
||||
<v-chart class="chart-container" :option="consumerConfidenceGaugeOption" autoresize />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-gray-50 rounded-lg p-4 space-y-3">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">消金贷款类机构数</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ getValue(data.C22180007, '0') }} 家</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">消金贷款类产品数</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ getValue(data.C22180008, '0') }} 个</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">消金贷款类机构最大授信额度</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ formatCreditAmount(data.C22180009) }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">消金贷款类机构平均授信额度</span>
|
||||
<span class="text-lg font-bold text-gray-800">{{ formatCreditAmount(data.C22180010) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 温馨提示 -->
|
||||
<Remark
|
||||
content="大数据详情展示申请人在网络贷款和消金贷款领域的授信情况,包括授信额度、机构数、产品数等指标。授信额度反映了金融机构对申请人信用状况的评估,额度越高通常表示信用状况越好。建议关注授信额度置信度,置信度越高表示评估结果越可靠。同时需要结合申请人的实际借贷行为和还款记录进行综合评估。" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { computed } from 'vue'
|
||||
import LTitle from '@/components/LTitle.vue'
|
||||
import Remark from '@/components/Remark.vue'
|
||||
import VChart from 'vue-echarts'
|
||||
import { use } from 'echarts/core'
|
||||
import { CanvasRenderer } from 'echarts/renderers'
|
||||
import { BarChart, GaugeChart } from 'echarts/charts'
|
||||
import {
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
GridComponent
|
||||
} from 'echarts/components'
|
||||
import { formatCreditAmount, formatConfidence, getValue } from '../utils/formatUtils'
|
||||
|
||||
// 注册ECharts组件
|
||||
use([
|
||||
CanvasRenderer,
|
||||
BarChart,
|
||||
GaugeChart,
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
GridComponent
|
||||
])
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
// 网贷额度置信度仪表盘配置(50-100)
|
||||
const p2pConfidenceGaugeOption = computed(() => {
|
||||
const confidence = parseInt(getValue(props.data.C22180002, '0')) || 0
|
||||
const percentage = confidence >= 50 ? ((confidence - 50) / 50) * 100 : 0
|
||||
|
||||
// 根据置信度确定颜色
|
||||
let color = '#2B79EE' // 蓝色 - 高置信度
|
||||
if (confidence < 60) {
|
||||
color = '#faad14' // 黄色 - 中等置信度
|
||||
} else if (confidence < 70) {
|
||||
color = '#fa8c16' // 橙色 - 较低置信度
|
||||
}
|
||||
|
||||
return {
|
||||
series: [
|
||||
{
|
||||
type: 'gauge',
|
||||
startAngle: 180,
|
||||
endAngle: 0,
|
||||
min: 0,
|
||||
max: 100,
|
||||
radius: '90%',
|
||||
center: ['50%', '75%'],
|
||||
itemStyle: {
|
||||
color: color,
|
||||
shadowBlur: 6,
|
||||
shadowColor: color,
|
||||
},
|
||||
progress: {
|
||||
show: true,
|
||||
width: 18,
|
||||
roundCap: true,
|
||||
},
|
||||
axisLine: {
|
||||
roundCap: true,
|
||||
lineStyle: {
|
||||
width: 18,
|
||||
color: [
|
||||
[percentage / 100, color],
|
||||
[1, '#e5e7eb']
|
||||
]
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
show: false
|
||||
},
|
||||
pointer: {
|
||||
show: false
|
||||
},
|
||||
detail: {
|
||||
valueAnimation: true,
|
||||
fontSize: 24,
|
||||
fontWeight: 'bold',
|
||||
color: color,
|
||||
offsetCenter: [0, '-5%'],
|
||||
formatter: '{value}%',
|
||||
rich: {
|
||||
value: {
|
||||
fontSize: 24,
|
||||
fontWeight: 'bold',
|
||||
color: color,
|
||||
lineHeight: 28
|
||||
}
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: percentage
|
||||
}
|
||||
],
|
||||
title: {
|
||||
fontSize: 14,
|
||||
color: '#666',
|
||||
offsetCenter: [0, '25%'],
|
||||
formatter: () => `${confidence}%`
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
// 消金额度置信度仪表盘配置(50-100)
|
||||
const consumerConfidenceGaugeOption = computed(() => {
|
||||
const confidence = parseInt(getValue(props.data.C22180012, '0')) || 0
|
||||
const percentage = confidence >= 50 ? ((confidence - 50) / 50) * 100 : 0
|
||||
|
||||
// 根据置信度确定颜色
|
||||
let color = '#1FBE5D' // 绿色 - 高置信度
|
||||
if (confidence < 60) {
|
||||
color = '#faad14' // 黄色 - 中等置信度
|
||||
} else if (confidence < 70) {
|
||||
color = '#fa8c16' // 橙色 - 较低置信度
|
||||
}
|
||||
|
||||
return {
|
||||
series: [
|
||||
{
|
||||
type: 'gauge',
|
||||
startAngle: 180,
|
||||
endAngle: 0,
|
||||
min: 0,
|
||||
max: 100,
|
||||
radius: '90%',
|
||||
center: ['50%', '75%'],
|
||||
itemStyle: {
|
||||
color: color,
|
||||
shadowBlur: 6,
|
||||
shadowColor: color,
|
||||
},
|
||||
progress: {
|
||||
show: true,
|
||||
width: 18,
|
||||
roundCap: true,
|
||||
},
|
||||
axisLine: {
|
||||
roundCap: true,
|
||||
lineStyle: {
|
||||
width: 18,
|
||||
color: [
|
||||
[percentage / 100, color],
|
||||
[1, '#e5e7eb']
|
||||
]
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
show: false
|
||||
},
|
||||
pointer: {
|
||||
show: false
|
||||
},
|
||||
detail: {
|
||||
valueAnimation: true,
|
||||
fontSize: 24,
|
||||
fontWeight: 'bold',
|
||||
color: color,
|
||||
offsetCenter: [0, '-5%'],
|
||||
formatter: '{value}%',
|
||||
rich: {
|
||||
value: {
|
||||
fontSize: 24,
|
||||
fontWeight: 'bold',
|
||||
color: color,
|
||||
lineHeight: 28
|
||||
}
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: percentage
|
||||
}
|
||||
],
|
||||
title: {
|
||||
fontSize: 14,
|
||||
color: '#666',
|
||||
offsetCenter: [0, '25%'],
|
||||
formatter: () => `${confidence}%`
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
// 授信额度对比图配置
|
||||
const creditAmountChartOption = computed(() => {
|
||||
const categories = ['网贷', '消金']
|
||||
const maxData = [
|
||||
parseInt(getValue(props.data.C22180005, '0')) || 0,
|
||||
parseInt(getValue(props.data.C22180009, '0')) || 0
|
||||
]
|
||||
const avgData = [
|
||||
parseInt(getValue(props.data.C22180006, '0')) || 0,
|
||||
parseInt(getValue(props.data.C22180010, '0')) || 0
|
||||
]
|
||||
|
||||
return {
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'shadow'
|
||||
},
|
||||
formatter: function (params) {
|
||||
let result = params[0].name + '<br/>'
|
||||
params.forEach(item => {
|
||||
const value = item.value >= 10000
|
||||
? `${(item.value / 10000).toFixed(2)}万元`
|
||||
: `${item.value}元`
|
||||
result += `${item.seriesName}: ${value}<br/>`
|
||||
})
|
||||
return result
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
data: ['最大授信额度', '平均授信额度'],
|
||||
top: '5%',
|
||||
textStyle: {
|
||||
fontSize: 12
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
top: '20%',
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: categories,
|
||||
axisLabel: {
|
||||
fontSize: 12,
|
||||
color: '#6b7280'
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#e5e7eb'
|
||||
}
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: 12,
|
||||
color: '#6b7280',
|
||||
formatter: function (value) {
|
||||
if (value >= 10000) {
|
||||
return `${(value / 10000).toFixed(1)}万`
|
||||
}
|
||||
return value
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: '#f3f4f6'
|
||||
}
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '最大授信额度',
|
||||
type: 'bar',
|
||||
data: maxData,
|
||||
barWidth: '30%',
|
||||
itemStyle: {
|
||||
color: '#2B79EE',
|
||||
borderRadius: [4, 4, 0, 0]
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: '#1e5bb8'
|
||||
}
|
||||
},
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
fontSize: 12,
|
||||
color: '#333',
|
||||
formatter: function (params) {
|
||||
const value = params.value
|
||||
return value >= 10000
|
||||
? `${(value / 10000).toFixed(1)}万`
|
||||
: value
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '平均授信额度',
|
||||
type: 'bar',
|
||||
data: avgData,
|
||||
barWidth: '30%',
|
||||
itemStyle: {
|
||||
color: '#1FBE5D',
|
||||
borderRadius: [4, 4, 0, 0]
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: '#179e4d'
|
||||
}
|
||||
},
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
fontSize: 12,
|
||||
color: '#333',
|
||||
formatter: function (params) {
|
||||
const value = params.value
|
||||
return value >= 10000
|
||||
? `${(value / 10000).toFixed(1)}万`
|
||||
: value
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.chart-container {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<!-- 放款还款详情 -->
|
||||
<BehaviorReportSection :data="behaviorData" />
|
||||
|
||||
<!-- 信用详情 -->
|
||||
<CurrentReportSection :data="currentData" />
|
||||
<!-- 大数据详情 -->
|
||||
<BigDataReportSection :data="bigDataData" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -16,7 +16,7 @@ import { computed } from 'vue'
|
||||
import { useRiskNotifier } from '@/composables/useRiskNotifier'
|
||||
import ApplyReportSection from './components/ApplyReportSection.vue'
|
||||
import BehaviorReportSection from './components/BehaviorReportSection.vue'
|
||||
import CurrentReportSection from './components/CurrentReportSection.vue'
|
||||
import BigDataReportSection from './components/BigDataReportSection.vue'
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
@@ -47,17 +47,17 @@ const applyData = computed(() => rawData.value.apply_report_detail || {})
|
||||
// 放款还款详情
|
||||
const behaviorData = computed(() => rawData.value.behavior_report_detail || {})
|
||||
|
||||
// 信用详情
|
||||
const currentData = computed(() => rawData.value.current_report_detail || {})
|
||||
// 大数据详情
|
||||
const bigDataData = computed(() => rawData.value.current_report_detail || {})
|
||||
|
||||
// 计算风险评分(0-100分,分数越高越安全)
|
||||
const riskScore = computed(() => {
|
||||
const apply = applyData.value
|
||||
const behavior = behaviorData.value
|
||||
const current = currentData.value
|
||||
const bigData = bigDataData.value
|
||||
|
||||
// 检查是否有数据
|
||||
if (!apply || !behavior || !current || Object.keys(apply).length === 0) {
|
||||
if (!apply || !behavior || !bigData || Object.keys(apply).length === 0) {
|
||||
return 100 // 无数据视为最安全
|
||||
}
|
||||
|
||||
|
||||
206
src/ui/JRZQ7F1A/utils/simpleSplitter.js
Normal file
206
src/ui/JRZQ7F1A/utils/simpleSplitter.js
Normal file
@@ -0,0 +1,206 @@
|
||||
/**
|
||||
* 全景雷达(JRZQ7F1A) 数据拆分工具
|
||||
* 将原始的全景雷达报告拆分为申请行为详情、放款还款详情和大数据详情三个独立模块
|
||||
* 以便在 BaseReport 中按 Tab 展示
|
||||
*/
|
||||
|
||||
/**
|
||||
* 判断数据对象是否有效(非空且包含至少一个键)
|
||||
* @param {object} data
|
||||
* @returns {boolean}
|
||||
*/
|
||||
const EMPTY_STRING_MARKERS = new Set(['-', '--', '0', '0.0', '暂无数据', '无数据', 'null', 'NULL'])
|
||||
|
||||
function hasData(data, visited = new WeakSet()) {
|
||||
if (data === null || data === undefined) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (typeof data === 'number') {
|
||||
return data !== 0 && !Number.isNaN(data)
|
||||
}
|
||||
|
||||
if (typeof data === 'string') {
|
||||
const trimmed = data.trim()
|
||||
if (!trimmed) return false
|
||||
return !EMPTY_STRING_MARKERS.has(trimmed)
|
||||
}
|
||||
|
||||
if (typeof data === 'boolean') {
|
||||
return data
|
||||
}
|
||||
|
||||
if (Array.isArray(data)) {
|
||||
if (data.length === 0) return false
|
||||
return data.some(item => hasData(item, visited))
|
||||
}
|
||||
|
||||
if (typeof data === 'object') {
|
||||
if (visited.has(data)) return false
|
||||
visited.add(data)
|
||||
const values = Object.values(data)
|
||||
if (values.length === 0) return false
|
||||
return values.some(value => hasData(value, visited))
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
const createDefaultObject = (fields, defaultValue = '0') =>
|
||||
fields.reduce((acc, key) => {
|
||||
acc[key] = defaultValue
|
||||
return acc
|
||||
}, {})
|
||||
|
||||
const APPLY_REPORT_FIELDS = [
|
||||
'A22160001',
|
||||
'A22160002',
|
||||
'A22160003',
|
||||
'A22160004',
|
||||
'A22160005',
|
||||
'A22160006',
|
||||
'A22160007',
|
||||
'A22160008',
|
||||
'A22160009',
|
||||
'A22160010'
|
||||
]
|
||||
|
||||
const APPLY_REPORT_DEFAULTS = createDefaultObject(APPLY_REPORT_FIELDS)
|
||||
|
||||
const BEHAVIOR_REPORT_FIELDS = [
|
||||
'B22170001',
|
||||
'B22170002',
|
||||
'B22170003',
|
||||
'B22170004',
|
||||
'B22170005',
|
||||
'B22170006',
|
||||
'B22170007',
|
||||
'B22170008',
|
||||
'B22170009',
|
||||
'B22170010',
|
||||
'B22170011',
|
||||
'B22170012',
|
||||
'B22170013',
|
||||
'B22170014',
|
||||
'B22170015',
|
||||
'B22170016',
|
||||
'B22170017',
|
||||
'B22170018',
|
||||
'B22170019',
|
||||
'B22170020',
|
||||
'B22170021',
|
||||
'B22170022',
|
||||
'B22170023',
|
||||
'B22170024',
|
||||
'B22170025',
|
||||
'B22170026',
|
||||
'B22170027',
|
||||
'B22170028',
|
||||
'B22170029',
|
||||
'B22170030',
|
||||
'B22170031',
|
||||
'B22170032',
|
||||
'B22170033',
|
||||
'B22170034',
|
||||
'B22170035',
|
||||
'B22170036',
|
||||
'B22170037',
|
||||
'B22170038',
|
||||
'B22170039',
|
||||
'B22170040',
|
||||
'B22170041',
|
||||
'B22170042',
|
||||
'B22170043',
|
||||
'B22170044',
|
||||
'B22170045',
|
||||
'B22170046',
|
||||
'B22170047',
|
||||
'B22170048',
|
||||
'B22170049',
|
||||
'B22170050',
|
||||
'B22170051',
|
||||
'B22170052',
|
||||
'B22170053',
|
||||
'B22170054'
|
||||
]
|
||||
|
||||
const BEHAVIOR_REPORT_DEFAULTS = createDefaultObject(BEHAVIOR_REPORT_FIELDS)
|
||||
|
||||
const BIG_DATA_REPORT_FIELDS = [
|
||||
'C22180001',
|
||||
'C22180002',
|
||||
'C22180003',
|
||||
'C22180004',
|
||||
'C22180005',
|
||||
'C22180006',
|
||||
'C22180007',
|
||||
'C22180008',
|
||||
'C22180009',
|
||||
'C22180010',
|
||||
'C22180011',
|
||||
'C22180012'
|
||||
]
|
||||
|
||||
const BIG_DATA_REPORT_DEFAULTS = createDefaultObject(BIG_DATA_REPORT_FIELDS)
|
||||
|
||||
const normalizeModuleData = (source, defaults) => {
|
||||
const normalized = { ...defaults }
|
||||
if (!source || typeof source !== 'object') {
|
||||
return normalized
|
||||
}
|
||||
|
||||
Object.entries(source).forEach(([key, value]) => {
|
||||
if (value === undefined || value === null) {
|
||||
return
|
||||
}
|
||||
normalized[key] = value
|
||||
})
|
||||
|
||||
return normalized
|
||||
}
|
||||
|
||||
/**
|
||||
* 拆分 JRZQ7F1A 报告数据
|
||||
* @param {Array} reportData - 原始报告数据数组
|
||||
* @returns {Array} 拆分后的报告数据数组
|
||||
*/
|
||||
export function splitJRZQ7F1AForTabs(reportData) {
|
||||
const targetIndex = reportData.findIndex(item => item.data?.apiID === 'JRZQ7F1A');
|
||||
const target = targetIndex >= 0 ? reportData[targetIndex] : null;
|
||||
|
||||
if (!target || !target.data?.data) {
|
||||
return reportData;
|
||||
}
|
||||
|
||||
const originalData = target.data.data;
|
||||
const baseTimestamp = target.data.timestamp;
|
||||
const success = target.data.success ?? true;
|
||||
|
||||
const splitModules = [];
|
||||
|
||||
const pushModule = (suffix, payload, defaults) => {
|
||||
splitModules.push({
|
||||
data: {
|
||||
apiID: `JRZQ7F1A_${suffix}`,
|
||||
data: normalizeModuleData(payload, defaults),
|
||||
success,
|
||||
timestamp: baseTimestamp,
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
pushModule('ApplyReport', originalData.apply_report_detail, APPLY_REPORT_DEFAULTS);
|
||||
pushModule('BehaviorReport', originalData.behavior_report_detail, BEHAVIOR_REPORT_DEFAULTS);
|
||||
pushModule('BigDataReport', originalData.current_report_detail, BIG_DATA_REPORT_DEFAULTS);
|
||||
|
||||
// 未能拆出子模块则直接返回原数据
|
||||
if (splitModules.length === 0) {
|
||||
return reportData;
|
||||
}
|
||||
|
||||
const result = [...reportData];
|
||||
result.splice(targetIndex, 1, ...splitModules);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<div v-for="rule in hitRules" :key="rule.ruleId"
|
||||
class="bg-white rounded-xl p-4 border border-gray-200 relative">
|
||||
<!-- <div class="absolute top-0 right-0">
|
||||
<div class="px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl bg-orange-500">
|
||||
<div class="px-2 py-1 text-sm text-white rounded-bl-xl rounded-tr-xl bg-orange-500">
|
||||
权重: {{ rule.weight }}
|
||||
</div>
|
||||
</div> -->
|
||||
@@ -49,7 +49,7 @@
|
||||
medium: '严重逾期',
|
||||
high: '无法收回',
|
||||
}" :key="key"
|
||||
class="px-2 py-3 text-center cursor-pointer transition-all duration-300 font-medium text-xs sm:text-sm relative border-b-2"
|
||||
class="px-2 py-3 text-center cursor-pointer transition-all duration-300 font-medium text-sm sm:text-sm relative border-b-2"
|
||||
:class="[
|
||||
key === 'summary'
|
||||
? activeTab === key
|
||||
@@ -73,7 +73,7 @@
|
||||
summaryData.byRiskLevel &&
|
||||
summaryData.byRiskLevel.find(level => level.id === key && level.triggered > 0)
|
||||
" :class="[
|
||||
'absolute -top-1 -right-1 inline-flex items-center justify-center w-4 h-4 text-xs font-bold leading-none text-white rounded-full',
|
||||
'absolute -top-1 -right-1 inline-flex items-center justify-center w-4 h-4 text-sm font-bold leading-none text-white rounded-full',
|
||||
key === 'low' ? 'bg-blue-500' : key === 'medium' ? 'bg-orange-500' : 'bg-red-500',
|
||||
]">
|
||||
{{summaryData.byRiskLevel.find(level => level.id === key).triggered}}
|
||||
@@ -97,7 +97,7 @@
|
||||
]" @click="handleRiskLevelClick(levelSummary.id)">
|
||||
<div class="absolute top-0 right-0">
|
||||
<div :class="[
|
||||
'px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl',
|
||||
'px-2 py-1 text-sm text-white rounded-bl-xl rounded-tr-xl',
|
||||
levelSummary.triggered > 0
|
||||
? levelSummary.id === 'low'
|
||||
? 'bg-blue-500'
|
||||
@@ -125,7 +125,7 @@
|
||||
</div>
|
||||
<div class="mt-3 flex items-end justify-between">
|
||||
<div>
|
||||
<p class="text-xs text-gray-600">命中项</p>
|
||||
<p class="text-sm text-gray-600">命中项</p>
|
||||
<p class="text-xl font-bold" :class="levelSummary.triggered > 0
|
||||
? levelSummary.id === 'low'
|
||||
? 'text-blue-600'
|
||||
@@ -138,7 +138,7 @@
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
class="text-xs px-3 py-1.5 rounded-full focus:outline-none transition-all duration-300"
|
||||
class="text-sm px-3 py-1.5 rounded-full focus:outline-none transition-all duration-300"
|
||||
:class="levelSummary.id === 'low'
|
||||
? 'bg-blue-100 text-blue-600 hover:bg-blue-200'
|
||||
: levelSummary.id === 'medium'
|
||||
@@ -162,8 +162,8 @@
|
||||
{{ typeSummary.label }}
|
||||
</div>
|
||||
<div class="flex items-center space-x-1">
|
||||
<span class="text-xs text-gray-500">命中项</span>
|
||||
<span class="text-xs font-medium px-1.5 py-0.5 rounded-full" :class="[
|
||||
<span class="text-sm text-gray-500">命中项</span>
|
||||
<span class="text-sm font-medium px-1.5 py-0.5 rounded-full" :class="[
|
||||
typeSummary.triggered > 0
|
||||
? getRateColor(typeSummary.triggered, typeSummary.total) === 'red'
|
||||
? 'bg-red-100 text-red-700'
|
||||
@@ -174,8 +174,8 @@
|
||||
]">
|
||||
{{ typeSummary.triggered }}
|
||||
</span>
|
||||
<span class="text-xs text-gray-500">/</span>
|
||||
<span class="text-xs text-gray-500">{{ typeSummary.total }}</span>
|
||||
<span class="text-sm text-gray-500">/</span>
|
||||
<span class="text-sm text-gray-500">{{ typeSummary.total }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-full h-2 bg-gray-100 rounded-full mt-2 overflow-hidden">
|
||||
@@ -225,10 +225,10 @@
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<h4 class="text-xs font-medium text-gray-900 truncate max-w-[100px]">
|
||||
<h4 class="text-sm font-medium text-gray-900 truncate max-w-[100px]">
|
||||
{{ institutionSummary.label }}
|
||||
</h4>
|
||||
<div class="flex items-center mt-1 text-xs text-gray-500">
|
||||
<div class="flex items-center mt-1 text-sm text-gray-500">
|
||||
<span>命中项:{{ institutionSummary.triggered }}/{{ institutionSummary.total
|
||||
}}</span>
|
||||
</div>
|
||||
@@ -259,7 +259,7 @@
|
||||
">
|
||||
{{ tabConfigs[activeTab].title }}
|
||||
</h3>
|
||||
<p class="text-xs text-gray-600 mt-1">
|
||||
<p class="text-sm text-gray-600 mt-1">
|
||||
{{ tabConfigs[activeTab].description }}
|
||||
</p>
|
||||
</div>
|
||||
@@ -283,7 +283,7 @@
|
||||
]">
|
||||
<div class="absolute top-0 right-0">
|
||||
<div :class="[
|
||||
'px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl',
|
||||
'px-2 py-1 text-sm text-white rounded-bl-xl rounded-tr-xl',
|
||||
item.isTriggered
|
||||
? item.levelType === 'low'
|
||||
? 'bg-blue-500'
|
||||
@@ -306,7 +306,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-2 text-xs mt-3">
|
||||
<div class="grid grid-cols-2 gap-2 text-sm mt-3">
|
||||
<div>
|
||||
<span class="text-gray-500">发生次数:</span>
|
||||
<span
|
||||
@@ -349,7 +349,7 @@
|
||||
]">
|
||||
<div class="absolute top-0 right-0">
|
||||
<div :class="[
|
||||
'px-2 py-1 text-xs text-white rounded-bl-xl rounded-tr-xl',
|
||||
'px-2 py-1 text-sm text-white rounded-bl-xl rounded-tr-xl',
|
||||
item.isTriggered
|
||||
? item.levelType === 'low'
|
||||
? 'bg-blue-500'
|
||||
@@ -372,7 +372,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-2 text-xs mt-3">
|
||||
<div class="grid grid-cols-2 gap-2 text-sm mt-3">
|
||||
<div>
|
||||
<span class="text-gray-500">发生次数:</span>
|
||||
<span
|
||||
|
||||
Binary file not shown.
@@ -24,7 +24,7 @@
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="text-sm text-gray-600">是否转网</span>
|
||||
<div class="flex items-center">
|
||||
<span class="px-2 py-1 text-xs text-white rounded-md mr-2"
|
||||
<span class="px-2 py-1 text-sm text-white rounded-md mr-2"
|
||||
:class="getPortabilityTagClass(item.result)">
|
||||
{{ getPortabilityText(item.result) }}
|
||||
</span>
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
<div class="text-sm font-medium" :class="specialStatusTextClass">
|
||||
{{ specialStatusText }}
|
||||
</div>
|
||||
<div class="text-xs mt-1" :class="specialStatusDescClass">
|
||||
<div class="text-sm mt-1" :class="specialStatusDescClass">
|
||||
{{ specialStatusDesc }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -40,10 +40,13 @@ onMounted(async () => {
|
||||
});
|
||||
|
||||
const loadExampleData = async () => {
|
||||
console.log('[Report.vue] 开始加载示例数据...');
|
||||
try {
|
||||
// 从 public 目录加载示例数据
|
||||
const response = await fetch('/example.json');
|
||||
console.log('[Report.vue] 数据请求响应状态:', response.status);
|
||||
const data = await response.json();
|
||||
console.log('[Report.vue] 原始数据条数:', Array.isArray(data) ? data.length : '非数组');
|
||||
|
||||
if (Array.isArray(data) && data.length > 0) {
|
||||
// 直接使用任意产品类型(不影响显示)
|
||||
@@ -53,15 +56,18 @@ const loadExampleData = async () => {
|
||||
reportData.value = data.sort((a, b) => {
|
||||
return (a.feature?.sort || 0) - (b.feature?.sort || 0);
|
||||
});
|
||||
console.log('[Report.vue] 数据排序完成,准备渲染...');
|
||||
|
||||
isEmpty.value = false;
|
||||
isDone.value = true;
|
||||
console.log('[Report.vue] isDone 设置为 true');
|
||||
} else {
|
||||
console.warn('[Report.vue] 数据为空或非数组');
|
||||
isEmpty.value = true;
|
||||
isDone.value = true;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载示例数据失败:', error);
|
||||
console.error('[Report.vue] 加载示例数据失败:', error);
|
||||
isEmpty.value = true;
|
||||
isDone.value = true;
|
||||
}
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
<template>
|
||||
<div class="pdf-page">
|
||||
<div v-if="isLoading" class="loading-container">
|
||||
<div class="loading-spinner"></div>
|
||||
<p>加载中,请稍候...</p>
|
||||
</div>
|
||||
<div v-else-if="reportData" class="pdf-content">
|
||||
<CDWBG8B4DPDF :data="reportData" />
|
||||
</div>
|
||||
<div v-else class="error-container">
|
||||
<p>未找到报告数据</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
import CDWBG8B4DPDF from '@/ui/CDWBG8B4D/CDWBG8B4D-PDF.vue'
|
||||
|
||||
const isLoading = ref(true)
|
||||
const reportData = ref(null)
|
||||
|
||||
onMounted(async () => {
|
||||
await loadReportData()
|
||||
})
|
||||
|
||||
const loadReportData = async () => {
|
||||
try {
|
||||
// 从 public 目录加载示例数据
|
||||
const response = await fetch('/example.json')
|
||||
const data = await response.json()
|
||||
|
||||
if (Array.isArray(data) && data.length > 0) {
|
||||
// 查找 DWBG8B4D 的数据
|
||||
const cdwbg8b4dItem = data.find(item =>
|
||||
item.data?.apiID === 'DWBG8B4D' || item.data?.apiID === 'CDWBG8B4D'
|
||||
)
|
||||
|
||||
if (cdwbg8b4dItem && cdwbg8b4dItem.data?.data) {
|
||||
reportData.value = cdwbg8b4dItem.data.data
|
||||
} else {
|
||||
console.warn('未找到 DWBG8B4D 数据')
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载报告数据失败:', error)
|
||||
} finally {
|
||||
isLoading.value = false
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.pdf-page {
|
||||
min-height: 100vh;
|
||||
background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf0 100%);
|
||||
padding: 32px 20px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.pdf-content {
|
||||
width: 100%;
|
||||
max-width: 794px;
|
||||
background-color: #ffffff;
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.loading-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.loading-spinner {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
border: 4px solid #f3f3f3;
|
||||
border-top: 4px solid #3498db;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.loading-container p {
|
||||
color: #666;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.error-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.error-container p {
|
||||
color: #e74c3c;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
/* 打印样式 */
|
||||
@media print {
|
||||
.pdf-page {
|
||||
padding: 0;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
.pdf-content {
|
||||
box-shadow: none;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
26
t.json
26
t.json
@@ -1,26 +0,0 @@
|
||||
[
|
||||
{
|
||||
"api_code": "DWBG8B4D"
|
||||
},
|
||||
{
|
||||
"api_code": "QCXG9P1C"
|
||||
},
|
||||
{
|
||||
"api_code": "JRZQ09J8"
|
||||
},
|
||||
{
|
||||
"api_code": "JRZQ4AA8"
|
||||
},
|
||||
{
|
||||
"api_code": "JRZQ5E9F"
|
||||
},
|
||||
{
|
||||
"api_code": "FLXG7E8F"
|
||||
},
|
||||
{
|
||||
"api_code": "IVYZ81NC"
|
||||
},
|
||||
{
|
||||
"api_code": "IVYZ3P9M"
|
||||
}
|
||||
]
|
||||
542
tt.json
542
tt.json
@@ -1,542 +0,0 @@
|
||||
{
|
||||
"responses": {
|
||||
"DWBG8B4D": {
|
||||
"api_code": "DWBG8B4D",
|
||||
"data": {
|
||||
"baseInfo": {
|
||||
"age": 25,
|
||||
"channel": "中国移动",
|
||||
"idCard": "4521**200008***23X",
|
||||
"location": "广西壮族自治区南宁地区横县",
|
||||
"name": "张*宏",
|
||||
"phone": "182****1590",
|
||||
"phoneArea": "广西壮族自治区-南宁",
|
||||
"sex": "男",
|
||||
"status": 1
|
||||
},
|
||||
"checkSuggest": "建议审核",
|
||||
"creditScore": 599,
|
||||
"elementVerificationDetail": {
|
||||
"antiFraudInfo": {
|
||||
"gamblerPlayer": "A",
|
||||
"moneyLaundering": "A"
|
||||
},
|
||||
"belongRiskFlag": 2,
|
||||
"belongRisks": {
|
||||
"num": "1",
|
||||
"personCity": "南宁地区",
|
||||
"personProvence": "广西壮族自治区",
|
||||
"phoneCardType": "移动",
|
||||
"phoneCity": "南宁",
|
||||
"phoneProvence": "广西壮族自治区"
|
||||
},
|
||||
"highRiskFlag": 2,
|
||||
"keyPersonCheckList": {
|
||||
"fangAiFlag": 0,
|
||||
"fontFlag": 0,
|
||||
"jingJiFontFlag": 0,
|
||||
"num": "1",
|
||||
"sheJiaoTongFlag": 0,
|
||||
"zhongDianFlag": 0
|
||||
},
|
||||
"onlineRiskFlag": 2,
|
||||
"onlineRiskList": {
|
||||
"lineType": "移动",
|
||||
"num": "1",
|
||||
"onLineTimes": "24,+(个月)"
|
||||
},
|
||||
"personCheckDetails": {
|
||||
"ele": "身份证号、姓名",
|
||||
"num": "1",
|
||||
"result": "一致"
|
||||
},
|
||||
"phoneCheckDetails": {
|
||||
"ele": "身份证号、手机号、姓名",
|
||||
"num": "1",
|
||||
"phoneCompany": "中国移动",
|
||||
"result": "一致"
|
||||
},
|
||||
"phoneVailRiskFlag": 2,
|
||||
"phoneVailRisks": {
|
||||
"num": "1",
|
||||
"phoneCompany": "移动",
|
||||
"phoneStatus": "实号",
|
||||
"phoneTimes": "24(单位:月)"
|
||||
},
|
||||
"sfzeysFlag": 2,
|
||||
"sjsysFlag": 2
|
||||
},
|
||||
"fraudRule": "低风险",
|
||||
"fraudScore": -1,
|
||||
"leasingRiskAssessment": {
|
||||
"riskFlag": 2,
|
||||
"threeCInstitutionApplicationCountLast12Months": "6/6",
|
||||
"threeCInstitutionApplicationCountLast12MonthsNight": "0/0",
|
||||
"threeCInstitutionApplicationCountLast12MonthsWeekend": "1/0",
|
||||
"threeCInstitutionApplicationCountLast14Days": "0/0",
|
||||
"threeCInstitutionApplicationCountLast14DaysNight": "0/0",
|
||||
"threeCInstitutionApplicationCountLast14DaysWeekend": "0/0",
|
||||
"threeCInstitutionApplicationCountLast3Days": "0/0",
|
||||
"threeCInstitutionApplicationCountLast3DaysNight": "0/0",
|
||||
"threeCInstitutionApplicationCountLast3DaysWeekend": "0/0",
|
||||
"threeCInstitutionApplicationCountLast3Months": "4/4",
|
||||
"threeCInstitutionApplicationCountLast3MonthsNight": "0/0",
|
||||
"threeCInstitutionApplicationCountLast3MonthsWeekend": "1/0",
|
||||
"threeCInstitutionApplicationCountLast6Months": "6/6",
|
||||
"threeCInstitutionApplicationCountLast6MonthsNight": "0/0",
|
||||
"threeCInstitutionApplicationCountLast6MonthsWeekend": "1/0",
|
||||
"threeCInstitutionApplicationCountLast7Days": "0/0",
|
||||
"threeCInstitutionApplicationCountLast7DaysNight": "0/0",
|
||||
"threeCInstitutionApplicationCountLast7DaysWeekend": "0/0",
|
||||
"threeCInstitutionApplicationCountLastMonth": "1/1",
|
||||
"threeCInstitutionApplicationCountLastMonthNight": "0/0",
|
||||
"threeCInstitutionApplicationCountLastMonthWeekend": "0/0",
|
||||
"threeCPlatformApplicationCountLast12Months": "3/3",
|
||||
"threeCPlatformApplicationCountLast12MonthsNight": "0/0",
|
||||
"threeCPlatformApplicationCountLast12MonthsWeekend": "1/0",
|
||||
"threeCPlatformApplicationCountLast14Days": "0/0",
|
||||
"threeCPlatformApplicationCountLast14DaysNight": "0/0",
|
||||
"threeCPlatformApplicationCountLast14DaysWeekend": "0/0",
|
||||
"threeCPlatformApplicationCountLast3Days": "0/0",
|
||||
"threeCPlatformApplicationCountLast3DaysNight": "0/0",
|
||||
"threeCPlatformApplicationCountLast3DaysWeekend": "0/0",
|
||||
"threeCPlatformApplicationCountLast3Months": "3/3",
|
||||
"threeCPlatformApplicationCountLast3MonthsNight": "0/0",
|
||||
"threeCPlatformApplicationCountLast3MonthsWeekend": "1/0",
|
||||
"threeCPlatformApplicationCountLast6Months": "3/3",
|
||||
"threeCPlatformApplicationCountLast6MonthsNight": "0/0",
|
||||
"threeCPlatformApplicationCountLast6MonthsWeekend": "1/0",
|
||||
"threeCPlatformApplicationCountLast7Days": "0/0",
|
||||
"threeCPlatformApplicationCountLast7DaysNight": "0/0",
|
||||
"threeCPlatformApplicationCountLast7DaysWeekend": "0/0",
|
||||
"threeCPlatformApplicationCountLastMonth": "1/1",
|
||||
"threeCPlatformApplicationCountLastMonthNight": "0/0",
|
||||
"threeCPlatformApplicationCountLastMonthWeekend": "0/0"
|
||||
},
|
||||
"loanEvaluationVerificationDetail": {
|
||||
"businessLoanPerformances": [
|
||||
{
|
||||
"last12Month": "2/2",
|
||||
"last12MonthCount": "8/8",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "2/2",
|
||||
"last6MonthCount": "3/3",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "信用卡(类信用卡)"
|
||||
},
|
||||
{
|
||||
"last12Month": "2/2",
|
||||
"last12MonthCount": "2/2",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "线上小额现金贷"
|
||||
},
|
||||
{
|
||||
"last12Month": "0/0",
|
||||
"last12MonthCount": "0/0",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "汽车金融"
|
||||
},
|
||||
{
|
||||
"last12Month": "2/2",
|
||||
"last12MonthCount": "4/5",
|
||||
"last15Day": "1/1",
|
||||
"last15DayCount": "1/1",
|
||||
"last1Month": "1/1",
|
||||
"last1MonthCount": "1/2",
|
||||
"last3Month": "1/1",
|
||||
"last3MonthCount": "3/4",
|
||||
"last6Month": "2/2",
|
||||
"last6MonthCount": "4/5",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "线上消费分期"
|
||||
},
|
||||
{
|
||||
"last12Month": "1/1",
|
||||
"last12MonthCount": "4/4",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "线下消费分期"
|
||||
},
|
||||
{
|
||||
"last12Month": "6/6",
|
||||
"last12MonthCount": "10/10",
|
||||
"last15Day": "1/1",
|
||||
"last15DayCount": "1/1",
|
||||
"last1Month": "1/1",
|
||||
"last1MonthCount": "1/1",
|
||||
"last3Month": "1/1",
|
||||
"last3MonthCount": "2/2",
|
||||
"last6Month": "2/2",
|
||||
"last6MonthCount": "3/3",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "其他"
|
||||
}
|
||||
],
|
||||
"customerLoanPerformances": [
|
||||
{
|
||||
"last12Month": "2/2",
|
||||
"last12MonthCount": "2/2",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "1/1",
|
||||
"last6MonthCount": "1/1",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "银行汇总"
|
||||
},
|
||||
{
|
||||
"last12Month": "2/2",
|
||||
"last12MonthCount": "2/2",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "1/1",
|
||||
"last6MonthCount": "1/1",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "传统银行"
|
||||
},
|
||||
{
|
||||
"last12Month": "0/0",
|
||||
"last12MonthCount": "0/0",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "网络零售银行"
|
||||
},
|
||||
{
|
||||
"last12Month": "8/8",
|
||||
"last12MonthCount": "19/19",
|
||||
"last15Day": "1/1",
|
||||
"last15DayCount": "1/1",
|
||||
"last1Month": "1/1",
|
||||
"last1MonthCount": "1/1",
|
||||
"last3Month": "1/1",
|
||||
"last3MonthCount": "2/2",
|
||||
"last6Month": "4/4",
|
||||
"last6MonthCount": "6/6",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "非银汇总"
|
||||
},
|
||||
{
|
||||
"last12Month": "1/1",
|
||||
"last12MonthCount": "1/1",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "持牌网络小贷"
|
||||
},
|
||||
{
|
||||
"last12Month": "4/4",
|
||||
"last12MonthCount": "8/8",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "1/1",
|
||||
"last6MonthCount": "1/1",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "持牌消费金融"
|
||||
},
|
||||
{
|
||||
"last12Month": "0/0",
|
||||
"last12MonthCount": "0/0",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "持牌融资租赁机构"
|
||||
},
|
||||
{
|
||||
"last12Month": "0/0",
|
||||
"last12MonthCount": "0/0",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "持牌汽车金融"
|
||||
},
|
||||
{
|
||||
"last12Month": "4/4",
|
||||
"last12MonthCount": "6/7",
|
||||
"last15Day": "1/1",
|
||||
"last15DayCount": "1/1",
|
||||
"last1Month": "1/1",
|
||||
"last1MonthCount": "1/2",
|
||||
"last3Month": "1/1",
|
||||
"last3MonthCount": "3/4",
|
||||
"last6Month": "2/2",
|
||||
"last6MonthCount": "4/5",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "其他"
|
||||
}
|
||||
],
|
||||
"organLoanPerformances": [
|
||||
{
|
||||
"applyCount": "银行",
|
||||
"last12Month": "0/0",
|
||||
"last15Day": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last7Day": "0/0"
|
||||
},
|
||||
{
|
||||
"applyCount": "非银",
|
||||
"last12Month": "0/0",
|
||||
"last15Day": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last7Day": "0/0"
|
||||
}
|
||||
],
|
||||
"riskFlag": 2,
|
||||
"timeLoanPerformances": [
|
||||
{
|
||||
"last12Month": "1/1",
|
||||
"last12MonthCount": "1/1",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "夜间-银行"
|
||||
},
|
||||
{
|
||||
"last12Month": "4/4",
|
||||
"last12MonthCount": "4/4",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "夜间-非银"
|
||||
},
|
||||
{
|
||||
"last12Month": "0/0",
|
||||
"last12MonthCount": "0/0",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "周末-银行"
|
||||
},
|
||||
{
|
||||
"last12Month": "5/5",
|
||||
"last12MonthCount": "7/7",
|
||||
"last15Day": "0/0",
|
||||
"last15DayCount": "0/0",
|
||||
"last1Month": "0/0",
|
||||
"last1MonthCount": "0/0",
|
||||
"last3Month": "0/0",
|
||||
"last3MonthCount": "0/0",
|
||||
"last6Month": "0/0",
|
||||
"last6MonthCount": "0/0",
|
||||
"last7Day": "0/0",
|
||||
"last7DayCount": "0/0",
|
||||
"type": "周末-非银"
|
||||
}
|
||||
]
|
||||
},
|
||||
"overdueRiskProduct": {
|
||||
"currentOverdueAmount": "-",
|
||||
"currentOverdueInstitutionCount": "-",
|
||||
"daysSinceLastSuccessfulRepayment": "-",
|
||||
"dkzhktjFlag": 2,
|
||||
"hasUnsettledOverdue": "-",
|
||||
"lyjlhyFlag": 0,
|
||||
"overdueLast14Days": "-",
|
||||
"overdueLast1Day": "-",
|
||||
"overdueLast30Days": "-",
|
||||
"overdueLast7Days": "-",
|
||||
"repaymentFailureAmountLast14Days": "-",
|
||||
"repaymentFailureAmountLast3Months": "-",
|
||||
"repaymentFailureAmountLast6Months": "-",
|
||||
"repaymentFailureAmountLast7Days": "-",
|
||||
"repaymentFailureAmountLastMonth": "-",
|
||||
"repaymentFailureCountLast14Days": "-",
|
||||
"repaymentFailureCountLast3Months": "-",
|
||||
"repaymentFailureCountLast6Months": "-",
|
||||
"repaymentFailureCountLast7Days": "-",
|
||||
"repaymentFailureCountLastMonth": "-",
|
||||
"repaymentSuccessAmountLast14Days": "-",
|
||||
"repaymentSuccessAmountLast3Months": "-",
|
||||
"repaymentSuccessAmountLast6Months": "-",
|
||||
"repaymentSuccessAmountLast7Days": "-",
|
||||
"repaymentSuccessAmountLastMonth": "-",
|
||||
"repaymentSuccessCountLast14Days": "-",
|
||||
"repaymentSuccessCountLast3Months": "-",
|
||||
"repaymentSuccessCountLast6Months": "-",
|
||||
"repaymentSuccessCountLast7Days": "-",
|
||||
"repaymentSuccessCountLastMonth": "-",
|
||||
"settledInstitutionCount": "-",
|
||||
"specialListVerification": [],
|
||||
"totalLoanInstitutions": "-",
|
||||
"totalLoanRepaymentAmount": "-",
|
||||
"tsmdyzFlag": 0
|
||||
},
|
||||
"riskSupervision": {
|
||||
"details": "无",
|
||||
"leastApplicationTime": "2025-09-11",
|
||||
"rentalRiskListIdCardRelationsPhones": 0,
|
||||
"rentalRiskListPhoneRelationsIdCards": 0
|
||||
},
|
||||
"riskWarning": {
|
||||
"frequentApplicationRecent": 0,
|
||||
"frequentBankApplications": 0,
|
||||
"frequentNonBankApplications": 0,
|
||||
"frequentRentalApplications": 0,
|
||||
"hasCriminalRecord": 0,
|
||||
"highDebtPressure": 0,
|
||||
"highFraudGangLevel": 0,
|
||||
"hitAdministrativeCase": 0,
|
||||
"hitBankruptcyAndLiquidation": 0,
|
||||
"hitCivilCase": 0,
|
||||
"hitCompensationCase": 0,
|
||||
"hitCriminalRisk": 0,
|
||||
"hitCurrentOverdue": 0,
|
||||
"hitDirectlyUnderCase": 0,
|
||||
"hitExecutionCase": 0,
|
||||
"hitHighRiskBankLastTwoYears": 0,
|
||||
"hitHighRiskNonBankLastTwoYears": 0,
|
||||
"hitPreservationReview": 0,
|
||||
"idCardPhoneProvinceMismatch": 0,
|
||||
"idCardTwoElementMismatch": 0,
|
||||
"isAntiFraudInfo": 1,
|
||||
"isDisrupSocial": 0,
|
||||
"isEconomyFront": 0,
|
||||
"isKeyPerson": 0,
|
||||
"isTrafficRelated": 0,
|
||||
"level": "0",
|
||||
"moreFrequentBankApplications": 0,
|
||||
"moreFrequentNonBankApplications": 0,
|
||||
"noPhoneDuration": 0,
|
||||
"phoneThreeElementMismatch": 0,
|
||||
"shortPhoneDuration": 0,
|
||||
"shortPhoneDurationSlight": 0,
|
||||
"totalRiskCounts": 1,
|
||||
"veryFrequentRentalApplications": 0
|
||||
},
|
||||
"standLiveInfo": {
|
||||
"finalAuthResult": "0",
|
||||
"inTime": "24",
|
||||
"verification": "0"
|
||||
},
|
||||
"verifyRule": "低风险"
|
||||
},
|
||||
"error": null,
|
||||
"success": true
|
||||
},
|
||||
"FLXG0V4B": {
|
||||
"api_code": "FLXG0V4B",
|
||||
"data": {
|
||||
"entout": {
|
||||
"msg": "没有找到"
|
||||
},
|
||||
"sxbzxr": {
|
||||
"msg": "没有找到"
|
||||
},
|
||||
"xgbzxr": {
|
||||
"msg": "没有找到"
|
||||
}
|
||||
},
|
||||
"error": null,
|
||||
"success": true
|
||||
},
|
||||
"QYGLB4C0": {
|
||||
"api_code": "QYGLB4C0",
|
||||
"data": null,
|
||||
"error": "查询为空\n查询为空\n库中无此记录",
|
||||
"success": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,323 +0,0 @@
|
||||
## 返回字段说明
|
||||
|
||||
| 名称 | 类型 | 必选 | 中文名 | 说明 |
|
||||
|------|------|------|--------|------|
|
||||
| lawsuitStat | object | False | 个⼈涉诉案件案件明 细 | |
|
||||
| crc | integer | False | 本次查询当事⼈的 | |
|
||||
| | | | CRC 值, ⽤于判断两 次查询当事⼈数据变 化情况 | |
|
||||
| count | object | False | 全部涉诉案件的统计 信息 | 具体属性参考: |
|
||||
| | | | | 息字段 |
|
||||
| civil | object | False | ⺠事案件详情 | 具体属性参考: |
|
||||
| | | | | 情 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| criminal | object | False | 刑事案件详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| administrative | object | False | ⾏政案件详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| preservation | object | False | ⾮诉保全审查案件详 情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| implement | object | False | 执⾏案件详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| bankrupt | object | False | 强制清算与破产案件 详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| cases_tree | object | False | 案件串联树 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| consumptionRestri ctionList | object | False | 限制消费被执⾏案件 记录列表 | 具体属性参考: 限制消 费被执⾏案件记录 |
|
||||
| | | | | |
|
||||
| breachCaseList | object | False | 失信列表 | 具体属性参考:失信详 情 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 统计信息字段 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| count_total | number | False | 案件总数 | |
|
||||
| count_jie_total | number | False | 已结案件总数 | |
|
||||
| count_wei_total | number | False | 未结案件总数 | |
|
||||
| count_yuangao | number | False | 原告总数 | |
|
||||
| count_jie_yuangao | number | False | 原告已结案总数 | |
|
||||
| count_wei_yuangao | number | False | 原告未结案总数 | |
|
||||
| count_beigao | number | False | 被告总数 | |
|
||||
| count_jie_beigao | number | False | 被告已结案总数 | |
|
||||
| count_wei_beigao | number | False | 被告未结案总数 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| count_other | number | False | 第三⼈总数 | |
|
||||
| count_jie_other | number | False | 第三⼈已结案总数 | |
|
||||
| count_wei_other | number | False | 第三⼈未结案总数 | |
|
||||
| money_total | number | False | 涉案总⾦额 | |
|
||||
| money_jie_total | number | False | 已结案⾦额 | |
|
||||
| money_wei_total | number | False | 未结案⾦额 | |
|
||||
| money_wei_percent | number | False | 未结案⾦额百分⽐ | |
|
||||
| money_yuangao | number | False | 原告⾦额 | |
|
||||
| money_jie_yuangao | number | False | 原告已结案⾦额 | |
|
||||
| money_wei_yuangao | number | False | 原告未结案⾦额 | |
|
||||
| money_beigao | number | False | 被告⾦额 | |
|
||||
| money_jie_beigao | number | False | 被告已结案⾦额 | |
|
||||
| money_wei_beigao | number | False | 被告未结案⾦额 | |
|
||||
| money_other | number | False | 第三⼈⾦额 | |
|
||||
| money_jie_other | number | False | 第三⼈已结案⾦额 | |
|
||||
| money_wei_other | number | False | 第三⼈未结案⾦额 | |
|
||||
| ay_stat | string | False | 涉案案由分布 | |
|
||||
| area_stat | string | False | 涉案地点分布 | |
|
||||
| larq_stat | string | False | 涉案时间分布 | |
|
||||
| jafs_stat | string | False | 结案⽅式分布 | |
|
||||
| | | | | |
|
||||
| 案件详情 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | 说明 |
|
||||
| count | object | False | 统计信息字段 | 属性参考: |
|
||||
| | | | | 统计信息字段 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| cases | object | False | 案件明细信息 | 具体属性参考: |
|
||||
| | | | | cases案件明细 信息 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| cases案件明细信息 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | 说明 |
|
||||
| c_id | string | False | 案件唯— ID | |
|
||||
| n_crc | string | False | 本次查询案件的 CRC 值, ⽤ 于判断 两次查询案件数据变 化情况 | |
|
||||
| n_ajlx | string | False | 案件类型 | |
|
||||
| c_ah | string | False | 案号 | |
|
||||
| c_ah_ys | string | False | 原审案号, 格式: <案号>:< 案件标识> | |
|
||||
| c_ah_hx | string | False | 后续案号, 格式: <案号>:< 案件标识> | |
|
||||
| n_ajbs | string | False | 案件标识 | |
|
||||
| n_jbfy | string | False | 经办法院 | |
|
||||
| n_jbfy_cj | string | False | 法院所属层级 | |
|
||||
| n_ajjzjd | string | False | 案件进展阶段 | |
|
||||
| n_slcx | string | False | 审理程序 | |
|
||||
| c_ssdy | string | False | 所属地域 | |
|
||||
| d_larq | string | False | ⽴案时间, 格式:YYYY- MM-DD | |
|
||||
| n_laay | string | False | ⽴案案由 | |
|
||||
| n_laay_tag | string | False | ⽴案案由标签 | |
|
||||
| n_laay_tree | string | False | ⽴案案由详细, 格式: <案 由 1>,<案由 2>,<案由 3> | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| n_qsbdje_level | string | False | 起诉标的⾦额等级 | |
|
||||
| n_qsbdje | string | False | 起诉标的⾦额 | |
|
||||
| n_qsbdje_gj_le vel | string | False | 起诉标的⾦额估计等级 | |
|
||||
| n_qsbdje_gj | string | False | 起诉标的⾦额估计 | |
|
||||
| c_slfsxx | string | False | 审 理 ⽅ 式 信 息 , 格 式 | |
|
||||
| | | | : "< 厅次>,YYYY-MM-DD HHmmSS,<地点>,<是否公开 审理>;..." 。可包含多次开庭 信息 | |
|
||||
| d_jarq | string | False | 结案时间, 格式:YYYY- MM-DD | |
|
||||
| n_jaay | string | False | 结案案由 | |
|
||||
| n_jaay_tag | string | False | 结案案由标签 | |
|
||||
| n_jaay_tree | string | False | 结案案由详细, 格式: "<案 由 1>,<案由 2>,<案由 3>" | |
|
||||
| n_jabdje_level | string | False | 结案标的⾦额等级 | |
|
||||
| n_jabdje | string | False | 结案标的⾦额 | |
|
||||
| n_jabdje_gj_lev el | string | False | 结案标的⾦额估计等级 | |
|
||||
| n_jabdje_gj | string | False | 结案标的⾦额估计 | |
|
||||
| n_jafs | string | False | 结案⽅式 | |
|
||||
| n_pj_victory | string | False | 胜诉估计 | |
|
||||
| n_ssdw | string | False | 诉讼地位 | |
|
||||
| n_ssdw_ys | string | False | —审诉讼地位 | |
|
||||
| c_gkws_id | string | False | 公开⽂书 ID,仅被查询⼈为组 织机构时提供 | |
|
||||
| c_gkws_glah | string | False | 相关案件号 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| c_gkws_dsr | string | False | 当事⼈ | |
|
||||
| c_gkws_pjjg | string | False | 判决结果 | |
|
||||
| c_dsrxx | object | False | 当事⼈信息 | 属性参考: |
|
||||
| | | | | 当事⼈信息 |
|
||||
| n_fzje_level | number | False | 犯罪⾦额等级, 此字段只在 案件为刑事案件才会出现 | |
|
||||
| n_fzje | number | False | 犯罪⾦额 ,此字段只在案件 为刑事案件才会出现 | |
|
||||
| n_bqqpcje_lev el | number | False | 被请求赔偿⾦额等级, 此字 段只在案件为刑事案件才会 出现 | |
|
||||
| n_bqqpcje | number | False | 被请求赔偿⾦额 ,此字段只 在案件为刑事案件才会出现 | |
|
||||
| n_ccxzxje_level | number | False | 财产刑执⾏⾦额等级, 。此 字段只在案件为刑事案件才 会出现 | |
|
||||
| n_ccxzxje | number | False | 财产刑执⾏⾦额 ,此字段只 在案件为刑事案件才会出现 | |
|
||||
| n_ccxzxje_gj_l evel | number | False | 财产刑执⾏⾦额估计等级 。 此字段只在案件为刑事案件 才会出现 | |
|
||||
| n_ccxzxje_gj | number | False | 财产刑执⾏⾦额估计 ,此字 段只在案件为刑事案件才会 出现 | |
|
||||
| n_pcpcje_level | number | False | 判处赔偿⾦额等级 ,此字段 只在案件为刑事案件才会出 现 | |
|
||||
| n_pcpcje | number | False | 判处赔偿⾦额 ,此字段只在 案件为刑事案件才会出现 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| n_pcpcje_gj_le vel | number | False | 判处赔偿⾦额估计等级 。此 字段只在案件为刑事案件才 会出现 | |
|
||||
| n_pcpcje_gj | number | False | 判处赔偿⾦额估计 ,此字段 只在案件为刑事案件才会出 现 | |
|
||||
| n_pcjg | string | False | 判处结果 ,此字段只在案件 为刑事案件才会出现 | |
|
||||
| n_dzzm | string | False | 定罪罪名 ,此字段只在案件 为刑事案件才会出现 | |
|
||||
| n_dzzm_tree | string | False | 定罪罪名详细 ,此字段只在 案件为刑事案件才会出现 | |
|
||||
| n_sqzxbdje | number | False | 申请执⾏标的⾦额 ,此字段 只在案件为执⾏案件才会出 现 | |
|
||||
| n_sjdwje | number | False | 实际到位⾦额 ,此字段只在 案件为执⾏案件才会出现 | |
|
||||
| n_wzxje | number | False | 未执⾏⾦额 ,此字段只在案 件为执⾏案件才会出现 | |
|
||||
| n_sqbqse_level | number | False | 申请保全数额等级 ,此字段 只在案件为⾮诉保全审查案 件才会出现 | |
|
||||
| n_sqbqse | number | False | 申请保全数额 ,此字段只在 案件为⾮诉保全审查案件才 会出现 | |
|
||||
| c_sqbqbdw | number | False | 申请保全标的物 ,此字段只 在案件为⾮诉保全审查案件 才会出现 | |
|
||||
| | | | | |
|
||||
| 当事⼈信息 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| c_mc | string | False | 当事⼈名称 | |
|
||||
| n_dsrlx | string | False | 当事⼈类型 | |
|
||||
| n_ssdw | string | False | 诉讼地位 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 失信详情 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| caseNumber | string | False | 案号 | |
|
||||
| issueDate | string | False | 发布⽇期( ⽇期) | |
|
||||
| id | string | False | 标识 | |
|
||||
| fileDate | string | False | ⽴案时间( ⽇期) | |
|
||||
| fulfillStatus | string | False | 被执⾏⼈的履⾏情况 | |
|
||||
| estimatedJudg ementAmount | string | False | 判决⾦额估计 | |
|
||||
| province | string | False | 省份 | |
|
||||
| sex | string | False | 性别 | |
|
||||
| concreteDetails | string | False | 失信被执⾏⼈⾏为具体情形 | |
|
||||
| obligation | string | False | ⽣效法律⽂书确定的义务 | |
|
||||
| executiveCourt | string | False | 执⾏法院 | |
|
||||
| enforcementB asisOrganizati on | string | False | 出执⾏依据单位 | |
|
||||
| enforcementB asisNumber | string | False | 执⾏依据⽂号 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 限制消费被执⾏案件记录 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| caseNumber | string | False | 案件编号 | |
|
||||
| issueDate | string | False | 发布⽇期 | |
|
||||
| id | string | False | 标识 | |
|
||||
| fileDate | string | False | ⽴案时间(⽇期) | |
|
||||
| executiveCourt | string | False | 执⾏法院 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 枚举字段说明 | | | | |
|
||||
| | | | | |
|
||||
| ⾦额等级 | | | | |
|
||||
| | | | | |
|
||||
| 等级 | 说明 | | | |
|
||||
| 0 | 未填写或 0 | | | |
|
||||
| 1 | N < 1 | | | |
|
||||
| 2 | 1 <= N < 2 | | | |
|
||||
| 3 | 2 <= N < 3 | | | |
|
||||
| 4 | 3 <= N < 4 | | | |
|
||||
| 5 | 4 <= N < 5 | | | |
|
||||
| 6 | 5 <= N < 6 | | | |
|
||||
| 7 | 6 <= N < 7 | | | |
|
||||
| 8 | 7 <= N < 8 | | | |
|
||||
| 9 | 8 <= N < 9 | | | |
|
||||
| 10 | 9 <= N < 10 | | | |
|
||||
| 11 | 10 <= N < 20 | | | |
|
||||
| 12 | 20 <= N < 30 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 13 | 30 <= N < 40 | | | |
|
||||
| 14 | 40 <= N < 50 | | | |
|
||||
| 15 | 50 <= N < 60 | | | |
|
||||
| 16 | 60 <= N < 70 | | | |
|
||||
| 17 | 70 <= N < 80 | | | |
|
||||
| 18 | 80 <= N < 90 | | | |
|
||||
| 19 | 90 <= N < 100 | | | |
|
||||
| 20 | 100 <= N < 150 | | | |
|
||||
| 21 | 150 <= N < 200 | | | |
|
||||
| 22 | 200 <= N < 250 | | | |
|
||||
| 23 | 250 <= N < 300 | | | |
|
||||
| 24 | 300 <= N < 350 | | | |
|
||||
| 25 | 350 <= N < 400 | | | |
|
||||
| 26 | 400 <= N < 450 | | | |
|
||||
| 27 | 450 <= N < 500 | | | |
|
||||
| 28 | 500 <= N < 550 | | | |
|
||||
| 29 | 550 <= N < 600 | | | |
|
||||
| 30 | 600 <= N < 650 | | | |
|
||||
| 31 | 650 <= N < 700 | | | |
|
||||
| 32 | 700 <= N < 750 | | | |
|
||||
| 33 | 750 <= N < 800 | | | |
|
||||
| 34 | 800 <= N < 850 | | | |
|
||||
| 35 | 850 <= N < 900 | | | |
|
||||
| 36 | 900 <= N < 950 | | | |
|
||||
| 37 | 950 <= N < 1000 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 38 | 1000 <= N < 1500 | | | |
|
||||
| 39 | 1500 <= N < 2000 | | | |
|
||||
| 40 | 2000 <= N < 2500 | | | |
|
||||
| 41 | 2500 <= N < 3000 | | | |
|
||||
| 42 | 3000 <= N < 3500 | | | |
|
||||
| 43 | 3500 <= N < 4000 | | | |
|
||||
| 44 | 4000 <= N < 4500 | | | |
|
||||
| 45 | 4500 <= N < 5000 | | | |
|
||||
| 46 | 5000 <= N < 5500 | | | |
|
||||
| 47 | 5500 <= N < 6000 | | | |
|
||||
| 48 | 6000 <= N < 6500 | | | |
|
||||
| 49 | 6500 <= N < 7000 | | | |
|
||||
| 50 | 7000 <= N < 7500 | | | |
|
||||
| 51 | 7500 <= N < 8000 | | | |
|
||||
| 52 | 8000 <= N < 8500 | | | |
|
||||
| 53 | 8500 <= N < 9000 | | | |
|
||||
| 54 | 9000 <= N < 9500 | | | |
|
||||
| 55 | 9500 <= N < 10000 | | | |
|
||||
| 56 | 10000 <= N < 15000 | | | |
|
||||
| 57 | 15000 <= N < 20000 | | | |
|
||||
| 58 | 20000 <= N < 25000 | | | |
|
||||
| 59 | 25000 <= N < 30000 | | | |
|
||||
| 60 | 30000 <= N < 35000 | | | |
|
||||
| 61 | 35000 <= N < 40000 | | | |
|
||||
| 62 | 40000 <= N < 45000 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 63 | 45000 <= N < 50000 | | | |
|
||||
| 64 | 50000 <= N < 55000 | | | |
|
||||
| 65 | 55000 <= N < 60000 | | | |
|
||||
| 66 | 60000 <= N < 65000 | | | |
|
||||
| 67 | 65000 <= N < 70000 | | | |
|
||||
| 68 | 70000 <= N < 75000 | | | |
|
||||
| 69 | 75000 <= N < 80000 | | | |
|
||||
| 70 | 80000 <= N < 85000 | | | |
|
||||
| 71 | 85000 <= N < 90000 | | | |
|
||||
| 72 | 90000 <= N < 95000 | | | |
|
||||
| 73 | 95000 <= N < 100000 | | | |
|
||||
| 74 | 100000 <= N < 150000 | | | |
|
||||
| 75 | 150000 <= N < 200000 | | | |
|
||||
| 76 | 200000 <= N < 250000 | | | |
|
||||
| 77 | 250000 <= N < 300000 | | | |
|
||||
| 78 | 300000 <= N < 350000 | | | |
|
||||
| 79 | 350000 <= N < 400000 | | | |
|
||||
| 80 | 400000 <= N < 450000 | | | |
|
||||
| 81 | 450000 <= N < 500000 | | | |
|
||||
| 82 | 500000 <= N < 550000 | | | |
|
||||
| 83 | 550000 <= N < 600000 | | | |
|
||||
| 84 | 600000 <= N < 650000 | | | |
|
||||
| 85 | 650000 <= N < 700000 | | | |
|
||||
| 86 | 700000 <= N < 750000 | | | |
|
||||
| 87 | 750000 <= N < 800000 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 88 | 800000 <= N < 850000 | | | |
|
||||
| 89 | 850000 <= N < 900000 | | | |
|
||||
| 90 | 900000 <= N < 950000 | | | |
|
||||
| 91 | 950000 <= N < 1000000 | | | |
|
||||
| 92 | 1000000 <= N < 1500000 | | | |
|
||||
| 93 | 1500000 <= N < 2000000 | | | |
|
||||
| 94 | 2000000 <= N < 2500000 | | | |
|
||||
| 95 | 2500000 <= N < 3000000 | | | |
|
||||
| 96 | 3000000 <= N < 3500000 | | | |
|
||||
| 97 | 3500000 <= N < 4000000 | | | |
|
||||
| 98 | 4000000 <= N < 4500000 | | | |
|
||||
| 99 | 4500000 <= N < 5000000 | | | |
|
||||
| 100 | 5000000 <= N | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 审理阶段或类型 | | | | |
|
||||
| | | | | |
|
||||
| 代码 | 说明 | | | |
|
||||
| 1 | —审 | | | |
|
||||
| 2 | ⼆审 | | | |
|
||||
| 3 | 再审审查 | | | |
|
||||
| 4 | 再审 | | | |
|
||||
| 5 | 执⾏ | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 案件类型 | | | | |
|
||||
| | | | | |
|
||||
| 代码 | 说明 | | | |
|
||||
| 200 | 刑事案件 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 300 | ⺠事案件 | | | |
|
||||
| 400 | ⾏政案件 | | | |
|
||||
| 1000 | 执⾏案件 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
@@ -1,323 +0,0 @@
|
||||
## 返回字段说明
|
||||
|
||||
| 名称 | 类型 | 必选 | 中文名 | 说明 |
|
||||
|------|------|------|--------|------|
|
||||
| lawsuitStat | object | False | 个⼈涉诉案件案件明 细 | |
|
||||
| crc | integer | False | 本次查询当事⼈的 | |
|
||||
| | | | CRC 值, ⽤于判断两 次查询当事⼈数据变 化情况 | |
|
||||
| count | object | False | 全部涉诉案件的统计 信息 | 具体属性参考: |
|
||||
| | | | | 息字段 |
|
||||
| civil | object | False | ⺠事案件详情 | 具体属性参考: |
|
||||
| | | | | 情 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| criminal | object | False | 刑事案件详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| administrative | object | False | ⾏政案件详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| preservation | object | False | ⾮诉保全审查案件详 情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| implement | object | False | 执⾏案件详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| bankrupt | object | False | 强制清算与破产案件 详情 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| cases_tree | object | False | 案件串联树 | 具体属性参考:案件详 情 |
|
||||
| | | | | |
|
||||
| consumptionRestri ctionList | object | False | 限制消费被执⾏案件 记录列表 | 具体属性参考: 限制消 费被执⾏案件记录 |
|
||||
| | | | | |
|
||||
| breachCaseList | object | False | 失信列表 | 具体属性参考:失信详 情 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 统计信息字段 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| count_total | number | False | 案件总数 | |
|
||||
| count_jie_total | number | False | 已结案件总数 | |
|
||||
| count_wei_total | number | False | 未结案件总数 | |
|
||||
| count_yuangao | number | False | 原告总数 | |
|
||||
| count_jie_yuangao | number | False | 原告已结案总数 | |
|
||||
| count_wei_yuangao | number | False | 原告未结案总数 | |
|
||||
| count_beigao | number | False | 被告总数 | |
|
||||
| count_jie_beigao | number | False | 被告已结案总数 | |
|
||||
| count_wei_beigao | number | False | 被告未结案总数 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| count_other | number | False | 第三⼈总数 | |
|
||||
| count_jie_other | number | False | 第三⼈已结案总数 | |
|
||||
| count_wei_other | number | False | 第三⼈未结案总数 | |
|
||||
| money_total | number | False | 涉案总⾦额 | |
|
||||
| money_jie_total | number | False | 已结案⾦额 | |
|
||||
| money_wei_total | number | False | 未结案⾦额 | |
|
||||
| money_wei_percent | number | False | 未结案⾦额百分⽐ | |
|
||||
| money_yuangao | number | False | 原告⾦额 | |
|
||||
| money_jie_yuangao | number | False | 原告已结案⾦额 | |
|
||||
| money_wei_yuangao | number | False | 原告未结案⾦额 | |
|
||||
| money_beigao | number | False | 被告⾦额 | |
|
||||
| money_jie_beigao | number | False | 被告已结案⾦额 | |
|
||||
| money_wei_beigao | number | False | 被告未结案⾦额 | |
|
||||
| money_other | number | False | 第三⼈⾦额 | |
|
||||
| money_jie_other | number | False | 第三⼈已结案⾦额 | |
|
||||
| money_wei_other | number | False | 第三⼈未结案⾦额 | |
|
||||
| ay_stat | string | False | 涉案案由分布 | |
|
||||
| area_stat | string | False | 涉案地点分布 | |
|
||||
| larq_stat | string | False | 涉案时间分布 | |
|
||||
| jafs_stat | string | False | 结案⽅式分布 | |
|
||||
| | | | | |
|
||||
| 案件详情 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | 说明 |
|
||||
| count | object | False | 统计信息字段 | 属性参考: |
|
||||
| | | | | 统计信息字段 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| cases | object | False | 案件明细信息 | 具体属性参考: |
|
||||
| | | | | cases案件明细 信息 |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| cases案件明细信息 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | 说明 |
|
||||
| c_id | string | False | 案件唯— ID | |
|
||||
| n_crc | string | False | 本次查询案件的 CRC 值, ⽤ 于判断 两次查询案件数据变 化情况 | |
|
||||
| n_ajlx | string | False | 案件类型 | |
|
||||
| c_ah | string | False | 案号 | |
|
||||
| c_ah_ys | string | False | 原审案号, 格式: <案号>:< 案件标识> | |
|
||||
| c_ah_hx | string | False | 后续案号, 格式: <案号>:< 案件标识> | |
|
||||
| n_ajbs | string | False | 案件标识 | |
|
||||
| n_jbfy | string | False | 经办法院 | |
|
||||
| n_jbfy_cj | string | False | 法院所属层级 | |
|
||||
| n_ajjzjd | string | False | 案件进展阶段 | |
|
||||
| n_slcx | string | False | 审理程序 | |
|
||||
| c_ssdy | string | False | 所属地域 | |
|
||||
| d_larq | string | False | ⽴案时间, 格式:YYYY- MM-DD | |
|
||||
| n_laay | string | False | ⽴案案由 | |
|
||||
| n_laay_tag | string | False | ⽴案案由标签 | |
|
||||
| n_laay_tree | string | False | ⽴案案由详细, 格式: <案 由 1>,<案由 2>,<案由 3> | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| n_qsbdje_level | string | False | 起诉标的⾦额等级 | |
|
||||
| n_qsbdje | string | False | 起诉标的⾦额 | |
|
||||
| n_qsbdje_gj_le vel | string | False | 起诉标的⾦额估计等级 | |
|
||||
| n_qsbdje_gj | string | False | 起诉标的⾦额估计 | |
|
||||
| c_slfsxx | string | False | 审 理 ⽅ 式 信 息 , 格 式 | |
|
||||
| | | | : "< 厅次>,YYYY-MM-DD HHmmSS,<地点>,<是否公开 审理>;..." 。可包含多次开庭 信息 | |
|
||||
| d_jarq | string | False | 结案时间, 格式:YYYY- MM-DD | |
|
||||
| n_jaay | string | False | 结案案由 | |
|
||||
| n_jaay_tag | string | False | 结案案由标签 | |
|
||||
| n_jaay_tree | string | False | 结案案由详细, 格式: "<案 由 1>,<案由 2>,<案由 3>" | |
|
||||
| n_jabdje_level | string | False | 结案标的⾦额等级 | |
|
||||
| n_jabdje | string | False | 结案标的⾦额 | |
|
||||
| n_jabdje_gj_lev el | string | False | 结案标的⾦额估计等级 | |
|
||||
| n_jabdje_gj | string | False | 结案标的⾦额估计 | |
|
||||
| n_jafs | string | False | 结案⽅式 | |
|
||||
| n_pj_victory | string | False | 胜诉估计 | |
|
||||
| n_ssdw | string | False | 诉讼地位 | |
|
||||
| n_ssdw_ys | string | False | —审诉讼地位 | |
|
||||
| c_gkws_id | string | False | 公开⽂书 ID,仅被查询⼈为组 织机构时提供 | |
|
||||
| c_gkws_glah | string | False | 相关案件号 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| c_gkws_dsr | string | False | 当事⼈ | |
|
||||
| c_gkws_pjjg | string | False | 判决结果 | |
|
||||
| c_dsrxx | object | False | 当事⼈信息 | 属性参考: |
|
||||
| | | | | 当事⼈信息 |
|
||||
| n_fzje_level | number | False | 犯罪⾦额等级, 此字段只在 案件为刑事案件才会出现 | |
|
||||
| n_fzje | number | False | 犯罪⾦额 ,此字段只在案件 为刑事案件才会出现 | |
|
||||
| n_bqqpcje_lev el | number | False | 被请求赔偿⾦额等级, 此字 段只在案件为刑事案件才会 出现 | |
|
||||
| n_bqqpcje | number | False | 被请求赔偿⾦额 ,此字段只 在案件为刑事案件才会出现 | |
|
||||
| n_ccxzxje_level | number | False | 财产刑执⾏⾦额等级, 。此 字段只在案件为刑事案件才 会出现 | |
|
||||
| n_ccxzxje | number | False | 财产刑执⾏⾦额 ,此字段只 在案件为刑事案件才会出现 | |
|
||||
| n_ccxzxje_gj_l evel | number | False | 财产刑执⾏⾦额估计等级 。 此字段只在案件为刑事案件 才会出现 | |
|
||||
| n_ccxzxje_gj | number | False | 财产刑执⾏⾦额估计 ,此字 段只在案件为刑事案件才会 出现 | |
|
||||
| n_pcpcje_level | number | False | 判处赔偿⾦额等级 ,此字段 只在案件为刑事案件才会出 现 | |
|
||||
| n_pcpcje | number | False | 判处赔偿⾦额 ,此字段只在 案件为刑事案件才会出现 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| n_pcpcje_gj_le vel | number | False | 判处赔偿⾦额估计等级 。此 字段只在案件为刑事案件才 会出现 | |
|
||||
| n_pcpcje_gj | number | False | 判处赔偿⾦额估计 ,此字段 只在案件为刑事案件才会出 现 | |
|
||||
| n_pcjg | string | False | 判处结果 ,此字段只在案件 为刑事案件才会出现 | |
|
||||
| n_dzzm | string | False | 定罪罪名 ,此字段只在案件 为刑事案件才会出现 | |
|
||||
| n_dzzm_tree | string | False | 定罪罪名详细 ,此字段只在 案件为刑事案件才会出现 | |
|
||||
| n_sqzxbdje | number | False | 申请执⾏标的⾦额 ,此字段 只在案件为执⾏案件才会出 现 | |
|
||||
| n_sjdwje | number | False | 实际到位⾦额 ,此字段只在 案件为执⾏案件才会出现 | |
|
||||
| n_wzxje | number | False | 未执⾏⾦额 ,此字段只在案 件为执⾏案件才会出现 | |
|
||||
| n_sqbqse_level | number | False | 申请保全数额等级 ,此字段 只在案件为⾮诉保全审查案 件才会出现 | |
|
||||
| n_sqbqse | number | False | 申请保全数额 ,此字段只在 案件为⾮诉保全审查案件才 会出现 | |
|
||||
| c_sqbqbdw | number | False | 申请保全标的物 ,此字段只 在案件为⾮诉保全审查案件 才会出现 | |
|
||||
| | | | | |
|
||||
| 当事⼈信息 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| c_mc | string | False | 当事⼈名称 | |
|
||||
| n_dsrlx | string | False | 当事⼈类型 | |
|
||||
| n_ssdw | string | False | 诉讼地位 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 失信详情 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| caseNumber | string | False | 案号 | |
|
||||
| issueDate | string | False | 发布⽇期( ⽇期) | |
|
||||
| id | string | False | 标识 | |
|
||||
| fileDate | string | False | ⽴案时间( ⽇期) | |
|
||||
| fulfillStatus | string | False | 被执⾏⼈的履⾏情况 | |
|
||||
| estimatedJudg ementAmount | string | False | 判决⾦额估计 | |
|
||||
| province | string | False | 省份 | |
|
||||
| sex | string | False | 性别 | |
|
||||
| concreteDetail s | string | False | 失信被执⾏⼈⾏为具体情形 | |
|
||||
| obligation | string | False | ⽣效法律⽂书确定的义务 | |
|
||||
| executiveCourt | string | False | 执⾏法院 | |
|
||||
| enforcementB asisOrganizati on | string | False | 出执⾏依据单位 | |
|
||||
| enforcementB asisNumber | string | False | 执⾏依据⽂号 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 限制消费被执⾏案件记录 | | | | |
|
||||
| | | | | |
|
||||
| 名称 | 类型 | 必选 | 中⽂名 | |
|
||||
| caseNumber | string | False | 案件编号 | |
|
||||
| issueDate | string | False | 发布⽇期 | |
|
||||
| id | string | False | 标识 | |
|
||||
| fileDate | string | False | ⽴案时间(⽇期) | |
|
||||
| executiveCourt | string | False | 执⾏法院 | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 枚举字段说明 | | | | |
|
||||
| | | | | |
|
||||
| ⾦额等级 | | | | |
|
||||
| | | | | |
|
||||
| 等级 | 说明 | | | |
|
||||
| 0 | 未填写或 0 | | | |
|
||||
| 1 | N < 1 | | | |
|
||||
| 2 | 1 <= N < 2 | | | |
|
||||
| 3 | 2 <= N < 3 | | | |
|
||||
| 4 | 3 <= N < 4 | | | |
|
||||
| 5 | 4 <= N < 5 | | | |
|
||||
| 6 | 5 <= N < 6 | | | |
|
||||
| 7 | 6 <= N < 7 | | | |
|
||||
| 8 | 7 <= N < 8 | | | |
|
||||
| 9 | 8 <= N < 9 | | | |
|
||||
| 10 | 9 <= N < 10 | | | |
|
||||
| 11 | 10 <= N < 20 | | | |
|
||||
| 12 | 20 <= N < 30 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 13 | 30 <= N < 40 | | | |
|
||||
| 14 | 40 <= N < 50 | | | |
|
||||
| 15 | 50 <= N < 60 | | | |
|
||||
| 16 | 60 <= N < 70 | | | |
|
||||
| 17 | 70 <= N < 80 | | | |
|
||||
| 18 | 80 <= N < 90 | | | |
|
||||
| 19 | 90 <= N < 100 | | | |
|
||||
| 20 | 100 <= N < 150 | | | |
|
||||
| 21 | 150 <= N < 200 | | | |
|
||||
| 22 | 200 <= N < 250 | | | |
|
||||
| 23 | 250 <= N < 300 | | | |
|
||||
| 24 | 300 <= N < 350 | | | |
|
||||
| 25 | 350 <= N < 400 | | | |
|
||||
| 26 | 400 <= N < 450 | | | |
|
||||
| 27 | 450 <= N < 500 | | | |
|
||||
| 28 | 500 <= N < 550 | | | |
|
||||
| 29 | 550 <= N < 600 | | | |
|
||||
| 30 | 600 <= N < 650 | | | |
|
||||
| 31 | 650 <= N < 700 | | | |
|
||||
| 32 | 700 <= N < 750 | | | |
|
||||
| 33 | 750 <= N < 800 | | | |
|
||||
| 34 | 800 <= N < 850 | | | |
|
||||
| 35 | 850 <= N < 900 | | | |
|
||||
| 36 | 900 <= N < 950 | | | |
|
||||
| 37 | 950 <= N < 1000 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 38 | 1000 <= N < 1500 | | | |
|
||||
| 39 | 1500 <= N < 2000 | | | |
|
||||
| 40 | 2000 <= N < 2500 | | | |
|
||||
| 41 | 2500 <= N < 3000 | | | |
|
||||
| 42 | 3000 <= N < 3500 | | | |
|
||||
| 43 | 3500 <= N < 4000 | | | |
|
||||
| 44 | 4000 <= N < 4500 | | | |
|
||||
| 45 | 4500 <= N < 5000 | | | |
|
||||
| 46 | 5000 <= N < 5500 | | | |
|
||||
| 47 | 5500 <= N < 6000 | | | |
|
||||
| 48 | 6000 <= N < 6500 | | | |
|
||||
| 49 | 6500 <= N < 7000 | | | |
|
||||
| 50 | 7000 <= N < 7500 | | | |
|
||||
| 51 | 7500 <= N < 8000 | | | |
|
||||
| 52 | 8000 <= N < 8500 | | | |
|
||||
| 53 | 8500 <= N < 9000 | | | |
|
||||
| 54 | 9000 <= N < 9500 | | | |
|
||||
| 55 | 9500 <= N < 10000 | | | |
|
||||
| 56 | 10000 <= N < 15000 | | | |
|
||||
| 57 | 15000 <= N < 20000 | | | |
|
||||
| 58 | 20000 <= N < 25000 | | | |
|
||||
| 59 | 25000 <= N < 30000 | | | |
|
||||
| 60 | 30000 <= N < 35000 | | | |
|
||||
| 61 | 35000 <= N < 40000 | | | |
|
||||
| 62 | 40000 <= N < 45000 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 63 | 45000 <= N < 50000 | | | |
|
||||
| 64 | 50000 <= N < 55000 | | | |
|
||||
| 65 | 55000 <= N < 60000 | | | |
|
||||
| 66 | 60000 <= N < 65000 | | | |
|
||||
| 67 | 65000 <= N < 70000 | | | |
|
||||
| 68 | 70000 <= N < 75000 | | | |
|
||||
| 69 | 75000 <= N < 80000 | | | |
|
||||
| 70 | 80000 <= N < 85000 | | | |
|
||||
| 71 | 85000 <= N < 90000 | | | |
|
||||
| 72 | 90000 <= N < 95000 | | | |
|
||||
| 73 | 95000 <= N < 100000 | | | |
|
||||
| 74 | 100000 <= N < 150000 | | | |
|
||||
| 75 | 150000 <= N < 200000 | | | |
|
||||
| 76 | 200000 <= N < 250000 | | | |
|
||||
| 77 | 250000 <= N < 300000 | | | |
|
||||
| 78 | 300000 <= N < 350000 | | | |
|
||||
| 79 | 350000 <= N < 400000 | | | |
|
||||
| 80 | 400000 <= N < 450000 | | | |
|
||||
| 81 | 450000 <= N < 500000 | | | |
|
||||
| 82 | 500000 <= N < 550000 | | | |
|
||||
| 83 | 550000 <= N < 600000 | | | |
|
||||
| 84 | 600000 <= N < 650000 | | | |
|
||||
| 85 | 650000 <= N < 700000 | | | |
|
||||
| 86 | 700000 <= N < 750000 | | | |
|
||||
| 87 | 750000 <= N < 800000 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 88 | 800000 <= N < 850000 | | | |
|
||||
| 89 | 850000 <= N < 900000 | | | |
|
||||
| 90 | 900000 <= N < 950000 | | | |
|
||||
| 91 | 950000 <= N < 1000000 | | | |
|
||||
| 92 | 1000000 <= N < 1500000 | | | |
|
||||
| 93 | 1500000 <= N < 2000000 | | | |
|
||||
| 94 | 2000000 <= N < 2500000 | | | |
|
||||
| 95 | 2500000 <= N < 3000000 | | | |
|
||||
| 96 | 3000000 <= N < 3500000 | | | |
|
||||
| 97 | 3500000 <= N < 4000000 | | | |
|
||||
| 98 | 4000000 <= N < 4500000 | | | |
|
||||
| 99 | 4500000 <= N < 5000000 | | | |
|
||||
| 100 | 5000000 <= N | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 审理阶段或类型 | | | | |
|
||||
| | | | | |
|
||||
| 代码 | 说明 | | | |
|
||||
| 1 | —审 | | | |
|
||||
| 2 | ⼆审 | | | |
|
||||
| 3 | 再审审查 | | | |
|
||||
| 4 | 再审 | | | |
|
||||
| 5 | 执⾏ | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 案件类型 | | | | |
|
||||
| | | | | |
|
||||
| 代码 | 说明 | | | |
|
||||
| 200 | 刑事案件 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 300 | ⺠事案件 | | | |
|
||||
| 400 | ⾏政案件 | | | |
|
||||
| 1000 | 执⾏案件 | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
@@ -1,31 +0,0 @@
|
||||
## 返回字段说明
|
||||
|
||||
## 个人收入指数字段说明
|
||||
|
||||
| 字段名 | 数据类型 | 描述 |
|
||||
|--------|----------|------|
|
||||
| personincome_index_2.0 | STRING | 个人收入指数评分 |
|
||||
|
||||
### 评分分档说明
|
||||
| 分值 | 收入区间(元) | 消费能力等级 |
|
||||
|------|---------------|------------|
|
||||
| 100 | (1000, 2000] | 第1档 |
|
||||
| 200 | (2000, 4000] | 第2档 |
|
||||
| 300 | (4000, 6000] | 第3档 |
|
||||
| 400 | (6000, 8000] | 第4档 |
|
||||
| 500 | (8000, 10000] | 第5档 |
|
||||
| 600 | (10000, 12000] | 第6档 |
|
||||
| 700 | (12000, 15000] | 第7档 |
|
||||
| 800 | (15000, 20000] | 第8档 |
|
||||
| 900 | (20000, 25000] | 第9档 |
|
||||
| 1000 | (25000, +∞) | 第10档 |
|
||||
|
||||
### 特殊值说明
|
||||
- **-1**: 表示未命中(无法获取收入信息)
|
||||
- **评分范围**: 100-1000分,共10个等级
|
||||
- **等级意义**: 等级越高,对应的消费能力越强
|
||||
|
||||
### 使用说明
|
||||
- 该字段为字符串类型,但实际包含数值信息
|
||||
- 收入区间为左开右闭区间(如:1000 < 收入 ≤ 2000)
|
||||
- 最高档1000分对应月收入25000元以上
|
||||
975
代理.md
975
代理.md
@@ -1,975 +0,0 @@
|
||||
# 代理系统重构方案
|
||||
|
||||
## 文档概述
|
||||
|
||||
本文档定义了代理系统的核心规则和实现逻辑,包括:
|
||||
- **代理等级体系**:普通、黄金、钻石三个等级
|
||||
- **团队结构规则**:上下级关系约束、升级规则、团队统计
|
||||
- **业务推广规则**:价格体系、收益分配规则
|
||||
- **升级机制**:升级方式、费用规则、返佣规则
|
||||
- **核心算法**:团队统计、收益分配、升级流程等业务逻辑伪代码
|
||||
|
||||
## 一、代理等级体系
|
||||
|
||||
### 1.1 等级定义
|
||||
- **普通代理**(Level 1):初始等级
|
||||
- **黄金代理**(Level 2):中级等级
|
||||
- **钻石代理**(Level 3):最高等级,团队首领
|
||||
|
||||
### 1.2 等级数值映射
|
||||
```javascript
|
||||
代理等级 = {
|
||||
普通: 1,
|
||||
黄金: 2,
|
||||
钻石: 3
|
||||
}
|
||||
```
|
||||
|
||||
## 二、团队结构规则
|
||||
|
||||
### 2.1 团队定义
|
||||
- **团队**:由一个钻石代理作为首领,及其所有下级代理组成的层级关系链
|
||||
- **团队首领**:必须是钻石代理,每个团队有且仅有一个首领
|
||||
- **团队关系**:从普通到钻石的完整链路属于同一个团队
|
||||
|
||||
### 2.2 上下级关系规则
|
||||
|
||||
#### 2.2.1 直接上下级约束
|
||||
- **核心原则**:
|
||||
1. **下级不能比上级等级高**:下级等级必须 ≤ 上级等级
|
||||
2. **同级不能作为上下级**(除了普通代理):黄金和钻石不能作为同级上下级
|
||||
- **允许关系**:
|
||||
- 普通 → 普通 ✓(同级普通允许)
|
||||
- 黄金 → 普通 ✓(上级等级高于下级,允许)
|
||||
- 钻石 → 普通 ✓(上级等级高于下级,允许)
|
||||
- 钻石 → 黄金 ✓(上级等级高于下级,允许)
|
||||
- **禁止关系**:
|
||||
- 普通 → 黄金 ✗(下级等级高于上级,禁止)
|
||||
- 普通 → 钻石 ✗(下级等级高于上级,禁止)
|
||||
- 黄金 → 黄金 ✗(同级不能作为上下级)
|
||||
- 钻石 → 钻石 ✗(同级不能作为上下级)
|
||||
- 黄金 → 钻石 ✗(下级等级高于上级,禁止)
|
||||
|
||||
#### 2.2.2 升级规则
|
||||
|
||||
**核心规则**:代理升级后,其所有下级(直接+间接)会跟随该代理。
|
||||
|
||||
1. **普通 → 黄金**:
|
||||
- **升级后必须脱离直接上级关系**(因为黄金等级高于普通,或与黄金同级,或钻石→黄金禁止)
|
||||
- 保留团队关系(通过团队首领钻石代理)
|
||||
- 仍属于原团队
|
||||
- **下级跟随**:所有下级(直接+间接)继续跟随该代理
|
||||
|
||||
2. **黄金 → 钻石**:
|
||||
- 独立成为新团队
|
||||
- 成为新团队的首领
|
||||
- **下级跟随**:所有下级(直接+间接)跟随该代理到新团队
|
||||
|
||||
3. **普通 → 钻石**:
|
||||
- 独立成为新团队
|
||||
- 成为新团队的首领
|
||||
- **下级跟随**:所有下级(直接+间接)跟随该代理到新团队
|
||||
|
||||
#### 2.2.3 升级方法和费用规则
|
||||
|
||||
**升级方式**:
|
||||
|
||||
1. **钻石代理升级下级**:
|
||||
- 钻石代理可以将下级的普通代理升级为黄金代理
|
||||
- 升级方式:钻石代理操作,无需被升级代理付费
|
||||
|
||||
2. **代理自主付费升级**:
|
||||
- 普通代理可以付费升级为黄金代理
|
||||
- 普通代理可以付费升级为钻石代理
|
||||
- 黄金代理可以付费升级为钻石代理
|
||||
|
||||
**升级费用和返佣规则**:
|
||||
|
||||
| 升级类型 | 升级费用 | 直接上级返佣 | 说明 |
|
||||
| ------------------------- | -------- | ------------ | -------------------------------- |
|
||||
| 普通→黄金 | 199元 | 139元 | 付费后立即返佣给直接上级 |
|
||||
| 普通→钻石 | 980元 | 680元 | 付费后立即返佣给直接上级 |
|
||||
| 黄金→钻石 | 980元 | 680元 | 付费后立即返佣给直接上级 |
|
||||
| 钻石升级下级(普通→黄金) | 免费 | 无 | 钻石代理操作,被升级代理无需付费 |
|
||||
|
||||
**重要规则**:
|
||||
- ✅ **返佣给原直接上级**:即使升级后脱离直接上下级关系,返佣仍然给原直接上级
|
||||
- ✅ **返佣时机**:付费成功后立即返佣,然后执行升级操作
|
||||
- ✅ **升级流程**:付费 → 返佣给直接上级 → 升级 → 根据情况脱离关系
|
||||
|
||||
**升级流程示例**:
|
||||
|
||||
**场景1:普通代理付费升级为黄金**
|
||||
```
|
||||
升级前:钻石D → 普通A → 普通B
|
||||
流程:
|
||||
1. 普通B支付199元
|
||||
2. 普通A获得139元返佣(原直接上级)
|
||||
3. 普通B升级为黄金
|
||||
4. 黄金B脱离普通A的直接关系(因为黄金等级高于普通,下级不能比上级等级高)
|
||||
5. 黄金B仍属于钻石D的团队
|
||||
结果:钻石D → 普通A(获得139元返佣)
|
||||
→ 黄金B(支付199元,脱离A的直接关系)
|
||||
```
|
||||
|
||||
**场景1-2:普通代理付费升级为黄金(直接上级是黄金/钻石)**
|
||||
```
|
||||
升级前:钻石D → 黄金A → 普通B
|
||||
流程:
|
||||
1. 普通B支付199元
|
||||
2. 黄金A获得139元返佣(原直接上级)
|
||||
3. 普通B升级为黄金
|
||||
4. 黄金B脱离黄金A的直接关系(因为黄金 → 黄金是禁止的,同级不能作为上下级)
|
||||
5. 黄金B仍属于钻石D的团队
|
||||
结果:钻石D → 黄金A(获得139元返佣)
|
||||
→ 黄金B(支付199元,脱离A的直接关系)
|
||||
```
|
||||
|
||||
**场景2:普通代理付费升级为钻石**
|
||||
```
|
||||
升级前:钻石D → 普通A → 普通B
|
||||
流程:
|
||||
1. 普通B支付980元
|
||||
2. 普通A获得680元返佣(原直接上级)
|
||||
3. 普通B升级为钻石
|
||||
4. 钻石B独立成新团队(脱离普通A的直接关系)
|
||||
5. 钻石B的下级跟随到新团队
|
||||
结果:钻石D → 普通A(获得680元返佣)
|
||||
钻石B(新团队,支付980元)
|
||||
```
|
||||
|
||||
**场景3:钻石代理升级下级**
|
||||
```
|
||||
升级前:钻石D → 普通A → 普通B
|
||||
流程:
|
||||
1. 钻石D操作,将普通B升级为黄金
|
||||
2. 无需付费
|
||||
3. 普通B升级为黄金
|
||||
4. 黄金B脱离普通A的直接关系(因为黄金等级高于普通,下级不能比上级等级高)
|
||||
5. 黄金B仍属于钻石D的团队
|
||||
结果:钻石D → 普通A
|
||||
→ 黄金B(免费升级,脱离A的直接关系)
|
||||
```
|
||||
|
||||
**场景3-2:钻石代理升级下级(直接上级是黄金/钻石)**
|
||||
```
|
||||
升级前:钻石D → 黄金A → 普通B
|
||||
流程:
|
||||
1. 钻石D操作,将普通B升级为黄金
|
||||
2. 无需付费
|
||||
3. 普通B升级为黄金
|
||||
4. 黄金B脱离黄金A的直接关系(因为黄金 → 黄金是禁止的,同级不能作为上下级)
|
||||
5. 黄金B仍属于钻石D的团队
|
||||
结果:钻石D → 黄金A
|
||||
→ 黄金B(免费升级,脱离A的直接关系)
|
||||
```
|
||||
|
||||
**返佣规则总结**:
|
||||
- 返佣金额 = 升级费用 × 返佣比例
|
||||
- 普通→黄金:139元 = 199元 × 69.8%
|
||||
- 升级为钻石:680元 = 980元 × 69.4%
|
||||
- 返佣对象:原直接上级(即使升级后脱离关系)
|
||||
- 返佣时机:付费成功后立即返佣,然后执行升级
|
||||
|
||||
### 2.3 团队结构树状图示例
|
||||
|
||||
以下是从钻石代理作为团队首领的各种层级组合情况:
|
||||
|
||||
#### 2.3.1 基础层级结构
|
||||
|
||||
**场景1:钻石 → 普通 → 普通 → 普通**
|
||||
```
|
||||
钻石D (团队首领)
|
||||
└── 普通A
|
||||
└── 普通B
|
||||
└── 普通C
|
||||
```
|
||||
|
||||
**场景2:钻石 → 黄金 → 普通**
|
||||
```
|
||||
钻石D (团队首领)
|
||||
└── 黄金A
|
||||
└── 普通B
|
||||
```
|
||||
|
||||
**场景3:钻石 → 普通 → 钻石(新团队)**
|
||||
```
|
||||
钻石D (团队1首领)
|
||||
└── 普通A
|
||||
└── 钻石B (团队2首领,独立新团队)
|
||||
```
|
||||
|
||||
**场景4:钻石 → 黄金 → 普通**
|
||||
```
|
||||
钻石D (团队首领)
|
||||
└── 黄金A
|
||||
└── 普通B
|
||||
```
|
||||
|
||||
**场景5:钻石 → 黄金 → 钻石(新团队)**
|
||||
```
|
||||
钻石D (团队1首领)
|
||||
└── 黄金A
|
||||
└── 钻石B (团队2首领,独立新团队)
|
||||
```
|
||||
|
||||
#### 2.3.2 复杂多分支结构
|
||||
|
||||
**场景6:钻石下多个分支**
|
||||
```
|
||||
钻石D (团队首领)
|
||||
├── 普通A
|
||||
│ ├── 普通B
|
||||
│ │ └── 普通C
|
||||
│ └── 普通D
|
||||
├── 普通G
|
||||
│ └── 普通H
|
||||
├── 黄金E
|
||||
│ └── 普通F
|
||||
└── 黄金I
|
||||
└── 普通J
|
||||
```
|
||||
|
||||
**场景7:多层级混合结构**
|
||||
```
|
||||
钻石D
|
||||
├── 黄金A
|
||||
│ ├── 普通A
|
||||
│ │ ├── 普通E
|
||||
│ │ └── 普通F
|
||||
│ │ └── 普通G
|
||||
│ └── 普通H
|
||||
│ └── 普通I
|
||||
└── 黄金B
|
||||
├── 普通C
|
||||
│ └── 普通J
|
||||
└── 普通D
|
||||
```
|
||||
**说明**:此结构符合所有关系约束规则
|
||||
|
||||
#### 2.3.3 升级后的结构变化
|
||||
|
||||
**场景8:普通升级为黄金(脱离直接上级)**
|
||||
```
|
||||
升级前:
|
||||
钻石D (团队首领)
|
||||
└── 普通A
|
||||
└── 普通B
|
||||
└── 普通C
|
||||
|
||||
升级后(B升级为黄金,黄金等级高于普通,必须脱离A的直接关系):
|
||||
钻石D (团队首领)
|
||||
├── 普通A
|
||||
│ └── (B已脱离直接关系)
|
||||
└── 黄金B (仍属于D的团队,但脱离A的直接关系)
|
||||
└── 普通C
|
||||
```
|
||||
|
||||
**场景8-2:普通升级为黄金(直接上级是黄金/钻石,脱离关系)**
|
||||
```
|
||||
升级前:
|
||||
钻石D (团队首领)
|
||||
└── 黄金A
|
||||
└── 普通B
|
||||
└── 普通C
|
||||
|
||||
升级后(B升级为黄金,黄金 → 黄金是禁止关系,需脱离):
|
||||
钻石D (团队首领)
|
||||
├── 黄金A
|
||||
│ └── (B已脱离直接关系)
|
||||
└── 黄金B (仍属于D的团队,但脱离A的直接关系)
|
||||
└── 普通C
|
||||
```
|
||||
|
||||
**场景9:普通升级为钻石(独立新团队)**
|
||||
```
|
||||
升级前:
|
||||
钻石D (团队1首领)
|
||||
└── 普通A
|
||||
└── 普通B
|
||||
└── 普通C
|
||||
|
||||
升级后(B升级为钻石):
|
||||
钻石D (团队1首领)
|
||||
└── 普通A
|
||||
└── (B已独立成新团队)
|
||||
|
||||
钻石B (团队2首领,新团队)
|
||||
└── 普通C (跟随B到新团队)
|
||||
```
|
||||
|
||||
**场景10:黄金升级为钻石(独立新团队)**
|
||||
```
|
||||
升级前:
|
||||
钻石D (团队1首领)
|
||||
└── 黄金A
|
||||
├── 普通B
|
||||
└── 普通C
|
||||
|
||||
升级后(A升级为钻石):
|
||||
钻石D (团队1首领)
|
||||
└── (A已独立成新团队)
|
||||
|
||||
钻石A (团队2首领,新团队)
|
||||
├── 普通B (跟随A到新团队)
|
||||
└── 普通C (跟随A到新团队)
|
||||
```
|
||||
|
||||
#### 2.3.4 特殊边界情况
|
||||
|
||||
**场景11:普通直接升级为钻石(跳过黄金)**
|
||||
```
|
||||
升级前:
|
||||
钻石D (团队1首领)
|
||||
└── 普通A
|
||||
└── 普通B
|
||||
└── 普通C
|
||||
|
||||
升级后(B直接升级为钻石):
|
||||
钻石D (团队1首领)
|
||||
└── 普通A
|
||||
└── (B已独立成新团队)
|
||||
|
||||
钻石B (团队2首领,新团队)
|
||||
└── 普通C (跟随B到新团队)
|
||||
```
|
||||
|
||||
**场景12:多级普通代理链**
|
||||
```
|
||||
钻石D (团队首领)
|
||||
└── 普通A
|
||||
└── 普通B
|
||||
└── 普通C
|
||||
└── 普通D
|
||||
└── 普通E
|
||||
```
|
||||
|
||||
**场景13:黄金代理下多级普通代理**
|
||||
```
|
||||
钻石D (团队首领)
|
||||
└── 黄金A
|
||||
└── 普通B
|
||||
└── 普通C
|
||||
└── 普通D
|
||||
```
|
||||
|
||||
#### 2.3.5 图例说明
|
||||
|
||||
- **钻石D**:团队首领,等级3
|
||||
- **黄金A**:中级代理,等级2
|
||||
- **普通A**:初始代理,等级1
|
||||
- **→**:直接上下级关系
|
||||
- **└──**:树状图分支线
|
||||
- **├──**:树状图分支线(有后续分支)
|
||||
- **团队1/团队2**:不同团队的标识
|
||||
|
||||
#### 2.3.6 关键规则总结
|
||||
|
||||
1. **团队首领**:必须是钻石代理
|
||||
2. **直接关系约束**:黄金/钻石不能直接管理黄金/钻石
|
||||
3. **升级影响**:
|
||||
- 普通→黄金:脱离直接上级,保留团队关系
|
||||
- 黄金→钻石:独立成新团队,下级跟随
|
||||
- 普通→钻石:独立成新团队,下级跟随
|
||||
4. **团队归属**:通过向上查找钻石代理确定团队归属
|
||||
|
||||
### 2.4 团队查找算法
|
||||
```
|
||||
function findTeamLeader(agent):
|
||||
current = agent
|
||||
while current.parent exists:
|
||||
if current.level == 钻石:
|
||||
return current
|
||||
current = current.parent
|
||||
return null // 无上级则自己就是首领
|
||||
```
|
||||
|
||||
### 2.5 团队统计规则
|
||||
|
||||
#### 2.5.1 核心规则定义
|
||||
|
||||
**团队统计的基本概念**:
|
||||
- **团队定义**:每个代理的团队 = 自己 + 所有下级(直接+间接,递归)
|
||||
- **统计范围**:以代理自己为起点,向下递归包含所有下级代理
|
||||
- **团队独立性**:不同代理的团队是不同的,互不干扰
|
||||
- **权限统一**:所有代理(普通、黄金、钻石)的权限范围相同,都只能查看自己团队范围内的数据
|
||||
|
||||
**关键规则**:
|
||||
1. ✅ **团队范围统一**:无论代理等级如何,团队统计范围都是"自己 + 所有下级"
|
||||
2. ✅ **权限范围统一**:所有代理只能查看自己团队的数据,无法查看其他代理的团队数据
|
||||
3. ✅ **升级后下级跟随**:代理升级后,其所有下级(直接+间接)会跟随该代理
|
||||
4. ✅ **团队归属不变**:下级升级脱离直接关系后,不影响上级的团队归属,上级的团队归属保持不变
|
||||
5. ✅ **单一上级原则**:每个代理只可能有一个上级,不可能有多个上级
|
||||
|
||||
#### 2.5.2 不同等级代理的团队统计
|
||||
|
||||
**统一规则**:所有等级的代理(普通、黄金、钻石)的团队统计规则完全相同。
|
||||
|
||||
| 代理等级 | 团队统计范围 | 权限范围 | 说明 |
|
||||
| -------- | --------------- | ---------------- | ---------------------------------------------- |
|
||||
| 钻石 | 自己 + 所有下级 | 只能查看自己团队 | 下级可以是普通、黄金(钻石下级会独立成新团队) |
|
||||
| 黄金 | 自己 + 所有下级 | 只能查看自己团队 | 下级只能是普通(黄金下级会脱离关系) |
|
||||
| 普通 | 自己 + 所有下级 | 只能查看自己团队 | 下级只能是普通(普通不能作为黄金或钻石的上级) |
|
||||
|
||||
**重要说明**:
|
||||
- 同一代理可能出现在多个上级的团队统计中(这是正常的)
|
||||
- 例如:A的下级是B,B的下级是C,那么C会同时出现在A和B的团队统计中
|
||||
- 每个代理的团队统计是独立计算的,互不影响
|
||||
|
||||
#### 2.5.3 升级后下级跟随规则
|
||||
|
||||
**核心规则**:代理升级后,其所有下级(直接+间接)会跟随该代理。
|
||||
|
||||
| 升级类型 | 升级前结构 | 升级后结构 | 下级跟随情况 |
|
||||
| --------- | ---------------------------- | ---------------------------------------------- | ----------------- |
|
||||
| 普通→黄金 | 上级 → 普通A → 下级B → 下级C | 上级 → 普通A<br>黄金A → 下级B → 下级C | B和C跟随A |
|
||||
| 黄金→钻石 | 上级 → 黄金A → 下级B → 下级C | 上级<br>钻石A(新团队)→ 下级B → 下级C | B和C跟随A到新团队 |
|
||||
| 普通→钻石 | 上级 → 普通A → 下级B → 下级C | 上级 → 普通A<br>钻石A(新团队)→ 下级B → 下级C | B和C跟随A到新团队 |
|
||||
|
||||
**重要说明**:
|
||||
- 升级后脱离直接关系的代理,其下级会跟随该代理
|
||||
- 如果升级为钻石,会独立成新团队,下级跟随到新团队
|
||||
- 升级不影响上级的团队归属,上级的团队归属保持不变
|
||||
|
||||
#### 2.5.4 团队统计算法
|
||||
|
||||
```
|
||||
function getTeamMembers(agent):
|
||||
// 获取代理的团队成员(包括自己和所有下级)
|
||||
team_members = [agent] // 包括自己
|
||||
|
||||
function collectChildren(agent):
|
||||
// 递归收集所有下级
|
||||
for each child in agent.children: // 直接下级
|
||||
team_members.append(child)
|
||||
collectChildren(child) // 递归收集间接下级
|
||||
|
||||
collectChildren(agent)
|
||||
return team_members
|
||||
|
||||
function getTeamStatistics(agent):
|
||||
// 获取代理的团队统计数据
|
||||
team_members = getTeamMembers(agent)
|
||||
|
||||
statistics = {
|
||||
total_count: team_members的数量, // 团队总人数(包括自己)
|
||||
self: agent, // 自己
|
||||
members: team_members, // 所有成员(自己+所有下级)
|
||||
by_level: {
|
||||
钻石: 从team_members中筛选出等级为钻石的,
|
||||
黄金: 从team_members中筛选出等级为黄金的,
|
||||
普通: 从team_members中筛选出等级为普通的
|
||||
},
|
||||
direct_children: agent.children, // 直接下级
|
||||
indirect_children: team_members中排除自己和直接下级的 // 间接下级
|
||||
}
|
||||
|
||||
return statistics
|
||||
|
||||
function hasPermissionToView(agent, target_agent):
|
||||
// 检查代理是否有权限查看目标代理的数据
|
||||
if agent.id == target_agent.id:
|
||||
return true // 可以查看自己
|
||||
|
||||
// 检查目标代理是否是当前代理的下级
|
||||
team_members = getTeamMembers(agent)
|
||||
return target_agent是否在team_members中
|
||||
```
|
||||
|
||||
#### 2.5.5 团队统计示例
|
||||
|
||||
**示例1:不同代理的团队统计范围**
|
||||
|
||||
```
|
||||
整体结构:
|
||||
钻石D
|
||||
├── 普通A
|
||||
│ ├── 普通B
|
||||
│ └── 普通C
|
||||
├── 黄金E
|
||||
│ └── 普通F
|
||||
└── 黄金G
|
||||
└── 普通H
|
||||
```
|
||||
|
||||
**各代理的团队统计**:
|
||||
|
||||
| 代理 | 团队统计范围 | 总计 | 说明 |
|
||||
| ----- | -------------------------------- | ---- | ------------------------------------------------ |
|
||||
| 钻石D | 自己 + A + B + C + E + F + G + H | 8人 | 包含所有下级 |
|
||||
| 黄金E | 自己 + F | 2人 | 只包含自己的下级 |
|
||||
| 黄金G | 自己 + H | 2人 | 只包含自己的下级 |
|
||||
| 普通A | 自己 + B + C | 3人 | 只包含自己的下级(普通代理的下级只能是普通代理) |
|
||||
|
||||
**权限说明**:
|
||||
- 钻石D只能查看自己团队(8人)的数据
|
||||
- 黄金E只能查看自己团队(2人)的数据,看不到D、A、B、C、G、H的数据
|
||||
- 黄金G只能查看自己团队(2人)的数据,看不到D、A、B、C、E、F的数据
|
||||
- 普通A只能查看自己团队(3人)的数据,看不到D、E、F、G、H的数据
|
||||
|
||||
**示例2:升级后团队统计变化**
|
||||
|
||||
```
|
||||
升级前:
|
||||
钻石D → 黄金A → 普通B → 普通C
|
||||
|
||||
升级后(A升级为钻石,独立成新团队):
|
||||
钻石D
|
||||
钻石A(新团队)→ 普通B → 普通C(B和C跟随A)
|
||||
```
|
||||
|
||||
**升级后的团队统计**:
|
||||
|
||||
| 代理 | 升级前统计 | 升级后统计 | 变化说明 |
|
||||
| ----- | ----------------------- | ------------------- | -------------------------- |
|
||||
| 钻石A | 自己 + B + C(3人) | 自己 + B + C(3人) | 下级跟随,统计不变 |
|
||||
| 钻石D | 自己 + A + B + C(4人) | 自己(1人) | A独立后,不再包含A及其下级 |
|
||||
|
||||
**关键点**:
|
||||
- A升级后,B和C跟随A到新团队
|
||||
- D的团队统计不再包含A、B、C(因为A已独立)
|
||||
- A的团队统计仍然包含B和C(因为下级跟随)
|
||||
|
||||
## 三、业务推广规则
|
||||
|
||||
### 3.1 价格体系
|
||||
|
||||
#### 3.1.1 基础底价
|
||||
- **系统基础底价**:BasePrice(系统配置)
|
||||
|
||||
#### 3.1.2 等级加成规则
|
||||
```javascript
|
||||
等级加成 = {
|
||||
钻石: 0,
|
||||
黄金: 3,
|
||||
普通: 6
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.1.3 实际底价计算
|
||||
```
|
||||
实际底价 = 基础底价 + 等级加成[代理等级]
|
||||
```
|
||||
|
||||
#### 3.1.4 价格设定范围
|
||||
- **最低价**:实际底价
|
||||
- **最高价**:系统设定上限(SystemMaxPrice)
|
||||
- **代理设定价格**:必须在最低价和最高价之间(包含两端),即:实际底价 ≤ 设定价格 ≤ SystemMaxPrice
|
||||
|
||||
### 3.2 收益分配规则
|
||||
|
||||
#### 3.2.1 核心分配原则
|
||||
|
||||
**重要规则**:
|
||||
- **平台固定收入**:无论哪个等级的代理推广,平台固定收到 **基础底价(BasePrice)**
|
||||
- **等级加成部分**:作为返佣分配给上级链
|
||||
- 钻石代理:等级加成 = 0,无返佣分配
|
||||
- 黄金代理:等级加成 = 3,全部作为返佣给钻石上级
|
||||
- 普通代理:等级加成 = 6,按规则分配给上级链
|
||||
|
||||
**分配结构**:
|
||||
```
|
||||
用户支付金额 = 代理设定价格
|
||||
├── 代理收益 = 设定价格 - 实际底价 - 提价成本
|
||||
├── 实际底价 = 基础底价 + 等级加成
|
||||
├── 基础底价 → 平台(固定)
|
||||
└── 等级加成 → 上级链返佣(按规则分配)
|
||||
```
|
||||
|
||||
#### 3.2.2 代理收益计算
|
||||
```
|
||||
提价成本 = 0
|
||||
if (设定价格 > 提价标准阈值):
|
||||
提价成本 = (设定价格 - 提价标准阈值) × 提价手续费比例
|
||||
|
||||
代理收益 = 设定价格 - 实际底价 - 提价成本
|
||||
```
|
||||
|
||||
#### 3.2.3 等级加成返佣分配规则
|
||||
|
||||
**分配算法**:
|
||||
|
||||
```
|
||||
function distributeLevelBonus(agent):
|
||||
// 分配等级加成返佣
|
||||
levelBonus = LevelBonus[agent.level]
|
||||
|
||||
// 钻石代理:等级加成为0,无返佣分配
|
||||
if agent.level == 钻石:
|
||||
return { platform: 0 } // 无返佣,平台也不收这部分(因为加成本身就是0)
|
||||
|
||||
// 黄金代理:等级加成3元,全部给钻石上级
|
||||
if agent.level == 黄金:
|
||||
diamondParent = findDiamondParent(agent)
|
||||
if diamondParent存在:
|
||||
return { [diamondParent.id]: levelBonus } // 3元给钻石上级
|
||||
// 找不到钻石上级,返佣归平台(异常情况)
|
||||
return { platform: levelBonus }
|
||||
|
||||
// 普通代理:等级加成6元,按规则分配给上级链
|
||||
if agent.level == 普通:
|
||||
return distributeNormalAgentBonus(agent, levelBonus)
|
||||
|
||||
return { platform: levelBonus }
|
||||
|
||||
function distributeNormalAgentBonus(agent, amount):
|
||||
// 普通代理的等级加成返佣分配(6元)
|
||||
// 核心规则:
|
||||
// 1. 根据直接上级等级分配固定金额给直接上级
|
||||
// 2. 剩余金额按优先级分配给上级链:钻石优先(全部),黄金次之(最多3元),平台兜底
|
||||
|
||||
parent = agent.parent
|
||||
if parent不存在:
|
||||
return { platform: amount } // 无上级,全部归平台
|
||||
|
||||
// 步骤1:给直接上级分配固定金额
|
||||
// 直接上级分配规则:钻石6元,黄金3元,普通2元
|
||||
directParentAmount = {
|
||||
钻石: 6,
|
||||
黄金: 3,
|
||||
普通: 2
|
||||
}[parent.level]
|
||||
|
||||
result = { [parent.id]: directParentAmount }
|
||||
remaining = amount - directParentAmount // 剩余金额
|
||||
|
||||
// 步骤2:分配剩余金额(如果直接上级是钻石,则无剩余)
|
||||
if remaining > 0:
|
||||
// 确定查找起点:直接上级是普通时从直接上级开始查找,否则从直接上级的上级开始查找
|
||||
searchStart = parent if parent.level == 普通 else parent.parent
|
||||
|
||||
if searchStart存在:
|
||||
// 查找上级链中的钻石和黄金
|
||||
diamondParent = findDiamondParent(searchStart)
|
||||
goldParent = findGoldParent(searchStart)
|
||||
|
||||
// 按优先级分配剩余金额
|
||||
if diamondParent存在:
|
||||
// 优先级1:有钻石,剩余金额全部给钻石
|
||||
result[diamondParent.id] = remaining
|
||||
else if goldParent存在:
|
||||
// 优先级2:只有黄金,最多3元给黄金,剩余归平台
|
||||
goldAmount = min(remaining, 3) // 黄金最多3元
|
||||
result[goldParent.id] = goldAmount
|
||||
if remaining > goldAmount:
|
||||
result.platform = remaining - goldAmount
|
||||
else:
|
||||
// 优先级3:都没有,剩余金额归平台
|
||||
result.platform = remaining
|
||||
else:
|
||||
// 无法查找上级链,剩余金额归平台
|
||||
result.platform = remaining
|
||||
|
||||
return result
|
||||
|
||||
function findDiamondParent(agent):
|
||||
// 向上查找钻石上级
|
||||
current = agent.parent
|
||||
while current存在:
|
||||
if current.level == 钻石:
|
||||
return current
|
||||
current = current.parent
|
||||
return null
|
||||
|
||||
function findGoldParent(agent):
|
||||
// 向上查找黄金上级
|
||||
current = agent.parent
|
||||
while current存在:
|
||||
if current.level == 黄金:
|
||||
return current
|
||||
current = current.parent
|
||||
return null
|
||||
```
|
||||
|
||||
#### 3.2.4 分配规则总结表
|
||||
|
||||
**核心原则**:
|
||||
- **基础底价(BasePrice)**:无论哪个等级,全部归平台(固定收入)
|
||||
- **等级加成部分**:作为返佣分配给上级链
|
||||
|
||||
| 代理等级 | 等级加成 | 直接上级 | 等级加成返佣分配规则 |
|
||||
| -------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------ |
|
||||
| 钻石 | 0元 | 无 | 无返佣分配(加成为0) |
|
||||
| 黄金 | 3元 | 钻石 | 3元全部给钻石上级 |
|
||||
| 普通 | 6元 | 钻石 | 6元全部给钻石上级 |
|
||||
| 普通 | 6元 | 黄金 | 3元给黄金上级,3元给钻石上级(上上级) |
|
||||
| 普通 | 6元 | 普通 | 2元给直接上级普通,剩余4元:<br>- 有钻石:4元全部给钻石<br>- 只有黄金:3元给黄金,1元归平台<br>- 都没有:4元归平台 |
|
||||
|
||||
**收益分配示例**:
|
||||
- **钻石代理推广**:用户支付 = 基础底价,平台收入 = 基础底价,返佣 = 0
|
||||
- **黄金代理推广**:用户支付 = 基础底价 + 3,平台收入 = 基础底价,返佣 = 3元给钻石
|
||||
- **普通代理推广**:用户支付 = 基础底价 + 6,平台收入 = 基础底价,返佣 = 6元按规则分配
|
||||
|
||||
## 四、系统配置参数
|
||||
|
||||
### 4.1 价格相关
|
||||
- `BasePrice`: 基础底价
|
||||
- `SystemMaxPrice`: 系统价格上限
|
||||
- `PriceThreshold`: 提价标准阈值
|
||||
- `PriceFeeRate`: 提价手续费比例
|
||||
|
||||
### 4.2 分配相关
|
||||
- `BasePrice`: 基础底价(固定归平台)
|
||||
- `LevelBonus`: 等级加成配置
|
||||
- `钻石`: 0元
|
||||
- `黄金`: 3元(全部给钻石上级)
|
||||
- `普通`: 6元(按规则分配给上级链)
|
||||
- `DirectParentAmount`: 直接上级分配金额配置
|
||||
- `普通→钻石`: 6元
|
||||
- `普通→黄金`: 3元
|
||||
- `普通→普通`: 2元
|
||||
- `MaxGoldAmount`: 黄金代理最大分配金额(3元)
|
||||
- `GoldToDiamondAmount`: 黄金→钻石分配金额(3元)
|
||||
|
||||
### 4.3 等级加成
|
||||
- `LevelBonus`: { 钻石: 0, 黄金: 3, 普通: 6 }
|
||||
|
||||
### 4.4 升级费用和返佣
|
||||
- `UpgradeFee`: 升级费用配置
|
||||
- `NormalToGold`: 199元(普通→黄金)
|
||||
- `NormalToDiamond`: 980元(普通→钻石)
|
||||
- `GoldToDiamond`: 980元(黄金→钻石)
|
||||
- `UpgradeRebate`: 升级返佣配置
|
||||
- `NormalToGoldRebate`: 139元(普通→黄金,给直接上级)
|
||||
- `ToDiamondRebate`: 680元(升级为钻石,给直接上级)
|
||||
- `UpgradeRebateRate`: 升级返佣比例
|
||||
- `NormalToGoldRate`: 69.8%(139/199)
|
||||
- `ToDiamondRate`: 69.4%(680/980)
|
||||
|
||||
## 五、核心算法伪代码
|
||||
|
||||
### 6.1 计算实际底价
|
||||
```
|
||||
function calculateActualBasePrice(agentLevel, basePrice):
|
||||
levelBonus = LevelBonus[agentLevel]
|
||||
return basePrice + levelBonus
|
||||
```
|
||||
|
||||
### 6.2 计算代理收益
|
||||
```
|
||||
function calculateAgentProfit(setPrice, actualBasePrice, priceThreshold, feeRate):
|
||||
priceCost = 0
|
||||
if setPrice > priceThreshold:
|
||||
priceCost = (setPrice - priceThreshold) × feeRate
|
||||
return setPrice - actualBasePrice - priceCost
|
||||
```
|
||||
|
||||
### 6.3 收益分配主流程
|
||||
```
|
||||
function distributeRevenue(agent, setPrice, basePrice):
|
||||
// 1. 计算实际底价
|
||||
levelBonus = LevelBonus[agent.level]
|
||||
actualBasePrice = basePrice + levelBonus
|
||||
|
||||
// 2. 计算代理收益
|
||||
priceCost = calculatePriceCost(setPrice)
|
||||
agentProfit = setPrice - actualBasePrice - priceCost
|
||||
|
||||
// 3. 基础底价部分:全部归平台(固定)
|
||||
platformRevenue = basePrice
|
||||
|
||||
// 4. 等级加成部分:按规则分配给上级链
|
||||
levelBonusDistribution = distributeLevelBonus(agent)
|
||||
|
||||
// 5. 汇总分配结果
|
||||
return {
|
||||
agentProfit: agentProfit,
|
||||
platformRevenue: platformRevenue,
|
||||
levelBonusDistribution: levelBonusDistribution
|
||||
}
|
||||
```
|
||||
|
||||
### 6.4 等级加成返佣分配流程
|
||||
```
|
||||
function distributeLevelBonus(agent):
|
||||
levelBonus = LevelBonus[agent.level]
|
||||
|
||||
if agent.level == 钻石:
|
||||
return {} // 无返佣(加成为0)
|
||||
|
||||
if agent.level == 黄金:
|
||||
diamondParent = findDiamondParent(agent)
|
||||
return { [diamondParent.id]: levelBonus } // 3元给钻石
|
||||
|
||||
if agent.level == 普通:
|
||||
return distributeNormalAgentBonus(agent, levelBonus) // 6元按规则分配
|
||||
```
|
||||
|
||||
### 6.5 代理升级流程
|
||||
```
|
||||
function upgradeAgent(agent, targetLevel, upgradeType):
|
||||
// 参数说明:
|
||||
// agent: 被升级的代理
|
||||
// targetLevel: 目标等级(2=黄金, 3=钻石)
|
||||
// upgradeType: 'self_paid'(自主付费)or 'diamond_upgrade'(钻石升级)
|
||||
|
||||
// 1. 验证升级条件
|
||||
if not canUpgrade(agent, targetLevel, upgradeType):
|
||||
return { error: '升级条件不满足' }
|
||||
|
||||
// 2. 如果是自主付费升级,处理付费
|
||||
if upgradeType == 'self_paid':
|
||||
upgradeFee = getUpgradeFee(agent.level, targetLevel)
|
||||
rebateAmount = getUpgradeRebate(agent.level, targetLevel)
|
||||
originalParent = agent.parent
|
||||
|
||||
// 2.1 代理付费
|
||||
paymentResult = processPayment(agent, upgradeFee)
|
||||
if not paymentResult.success:
|
||||
return { error: '付费失败' }
|
||||
|
||||
// 2.2 返佣给原直接上级(即使升级后脱离关系)
|
||||
if originalParent:
|
||||
rebateResult = processRebate(originalParent, rebateAmount)
|
||||
if not rebateResult.success:
|
||||
// 如果返佣失败,需要退款
|
||||
refundPayment(agent, upgradeFee)
|
||||
return { error: '返佣失败,已退款' }
|
||||
|
||||
// 3. 执行升级操作
|
||||
agent.level = targetLevel
|
||||
|
||||
// 4. 检查是否需要脱离直接上级关系
|
||||
if needDetachFromParent(agent, agent.parent):
|
||||
agent.parent = null // 脱离直接关系
|
||||
// 但保留团队关系(通过钻石首领)
|
||||
|
||||
// 5. 如果升级为钻石,独立成新团队
|
||||
if targetLevel == 钻石:
|
||||
agent.teamLeaderId = agent.id // 成为新团队首领
|
||||
// 下级会跟随(已在升级规则中定义)
|
||||
|
||||
return { success: true, agent: agent }
|
||||
|
||||
function canUpgrade(agent, targetLevel, upgradeType):
|
||||
// 检查升级条件
|
||||
if upgradeType == 'diamond_upgrade':
|
||||
// 钻石升级下级:必须是钻石操作,且下级是普通代理
|
||||
return agent.level == 普通 and targetLevel == 黄金
|
||||
else if upgradeType == 'self_paid':
|
||||
// 自主付费:普通可以升级为黄金或钻石,黄金可以升级为钻石
|
||||
if agent.level == 普通:
|
||||
return targetLevel == 黄金 or targetLevel == 钻石
|
||||
else if agent.level == 黄金:
|
||||
return targetLevel == 钻石
|
||||
return false
|
||||
|
||||
function getUpgradeFee(fromLevel, toLevel):
|
||||
if fromLevel == 普通 and toLevel == 黄金:
|
||||
return 199
|
||||
else if toLevel == 钻石:
|
||||
return 980
|
||||
return 0
|
||||
|
||||
function getUpgradeRebate(fromLevel, toLevel):
|
||||
if fromLevel == 普通 and toLevel == 黄金:
|
||||
return 139
|
||||
else if toLevel == 钻石:
|
||||
return 680
|
||||
return 0
|
||||
|
||||
function needDetachFromParent(agent, parent):
|
||||
// 检查是否需要脱离直接上级关系
|
||||
// 规则1:下级不能比上级等级高
|
||||
// 规则2:同级不能作为上下级(除了普通代理)
|
||||
if not parent:
|
||||
return false
|
||||
|
||||
// 如果代理等级高于上级等级,必须脱离
|
||||
if agent.level > parent.level:
|
||||
return true
|
||||
|
||||
// 同级不能作为上下级(除了普通代理)
|
||||
if agent.level == parent.level:
|
||||
if agent.level == 黄金 or agent.level == 钻石:
|
||||
return true // 黄金 → 黄金、钻石 → 钻石禁止
|
||||
|
||||
// 钻石 → 黄金禁止(虽然钻石等级高于黄金,但这是特殊禁止规则)
|
||||
if agent.level == 黄金 and parent.level == 钻石:
|
||||
return true
|
||||
|
||||
return false
|
||||
```
|
||||
|
||||
## 六、业务流程图
|
||||
|
||||
### 7.1 代理升级流程
|
||||
|
||||
#### 7.1.1 自主付费升级流程
|
||||
```
|
||||
代理发起升级请求
|
||||
↓
|
||||
检查升级条件(等级、权限等)
|
||||
↓
|
||||
计算升级费用和返佣金额
|
||||
↓
|
||||
代理支付升级费用
|
||||
↓
|
||||
付费成功后,立即返佣给原直接上级
|
||||
↓
|
||||
执行升级操作(更新代理等级)
|
||||
↓
|
||||
检查是否需要脱离直接上级关系
|
||||
↓
|
||||
如果升级为钻石
|
||||
→ 独立成新团队
|
||||
→ 成为团队首领
|
||||
→ 下级跟随到新团队
|
||||
↓
|
||||
完成升级
|
||||
```
|
||||
|
||||
#### 7.1.2 钻石升级下级流程
|
||||
```
|
||||
钻石代理操作升级下级
|
||||
↓
|
||||
检查升级条件(必须是普通代理升级为黄金)
|
||||
↓
|
||||
无需付费,直接执行升级操作
|
||||
↓
|
||||
检查是否需要脱离直接上级关系
|
||||
↓
|
||||
完成升级
|
||||
```
|
||||
|
||||
#### 7.1.3 升级费用和返佣流程
|
||||
```
|
||||
升级费用表:
|
||||
- 普通→黄金:199元,返佣139元给直接上级
|
||||
- 普通→钻石:980元,返佣680元给直接上级
|
||||
- 黄金→钻石:980元,返佣680元给直接上级
|
||||
|
||||
返佣规则:
|
||||
- 返佣对象:原直接上级(即使升级后脱离关系)
|
||||
- 返佣时机:付费成功后立即返佣
|
||||
- 返佣金额:固定金额,不随升级后关系变化而改变
|
||||
```
|
||||
|
||||
### 7.2 业务推广收益分配流程
|
||||
```
|
||||
用户付费查询(支付代理设定价格)
|
||||
↓
|
||||
计算实际底价 = 基础底价 + 等级加成
|
||||
↓
|
||||
计算代理收益 = 设定价格 - 实际底价 - 提价成本
|
||||
↓
|
||||
收益分配:
|
||||
├── 基础底价部分 → 平台(固定收入)
|
||||
└── 等级加成部分 → 按规则分配给上级链
|
||||
├── 钻石代理:加成=0,无返佣
|
||||
├── 黄金代理:加成=3,全部给钻石上级
|
||||
└── 普通代理:加成=6,按规则分配给上级链
|
||||
```
|
||||
|
||||
## 七、边界情况处理
|
||||
|
||||
1. **钻石代理有上级**:理论上不应存在,但系统需处理异常情况
|
||||
2. **团队链断裂**:如果上级链中找不到钻石代理,剩余金额归平台
|
||||
3. **价格异常**:设定价格低于实际底价时,拒绝交易
|
||||
4. **升级冲突**:升级时检查是否违反直接上下级约束规则
|
||||
5. **升级关系判断**:
|
||||
- 普通 → 黄金升级时,必须脱离直接上级关系
|
||||
- 原因:黄金等级高于普通(下级不能比上级等级高),或与黄金同级(同级不能作为上下级),或钻石→黄金禁止
|
||||
- 普通/黄金 → 钻石升级时,独立成新团队,脱离所有上级关系
|
||||
6. **返佣处理**:返佣给原直接上级,即使升级后脱离关系,返佣不受影响
|
||||
7. **团队统计更新**:所有关系变更后,需要正确更新团队统计范围
|
||||
@@ -1,826 +0,0 @@
|
||||
## 返回字段说明
|
||||
|
||||
|
||||
| 序号 | 参数名 | 类型 | 长度 | 中文名称 | 取值解释 |
|
||||
|-------:|:----------------------------------|:-------|-------:|:-------------------------------------------------------------------|:---------------------------------------------------------------------------------|
|
||||
| 1 | flag_applyloanstr | string | 10 | 产品输出标识 | 1(输出成功),0(未匹配上无输出),98(用户输入信息不足),99(系统异常) |
|
||||
| 2 | als_d7_id_pdl_allnum | string | 10 | 按身份证号查询,近7天申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 3 | als_d7_id_pdl_orgnum | string | 10 | 按身份证号查询,近7天申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 4 | als_d7_id_caon_allnum | string | 10 | 按身份证号查询,近7天申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 5 | als_d7_id_caon_orgnum | string | 10 | 按身份证号查询,近7天申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 6 | als_d7_id_rel_allnum | string | 10 | 按身份证号查询,近7天申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 7 | als_d7_id_rel_orgnum | string | 10 | 按身份证号查询,近7天申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 8 | als_d7_id_caoff_allnum | string | 10 | 按身份证号查询,近7天申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 9 | als_d7_id_caoff_orgnum | string | 10 | 按身份证号查询,近7天申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 10 | als_d7_id_cooff_allnum | string | 10 | 按身份证号查询,近7天申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 11 | als_d7_id_cooff_orgnum | string | 10 | 按身份证号查询,近7天申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 12 | als_d7_id_af_allnum | string | 10 | 按身份证号查询,近7天申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 13 | als_d7_id_af_orgnum | string | 10 | 按身份证号查询,近7天申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 14 | als_d7_id_coon_allnum | string | 10 | 按身份证号查询,近7天申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 15 | als_d7_id_coon_orgnum | string | 10 | 按身份证号查询,近7天申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 16 | als_d7_id_oth_allnum | string | 10 | 按身份证号查询,近7天申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 17 | als_d7_id_oth_orgnum | string | 10 | 按身份证号查询,近7天申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 18 | als_d7_id_bank_selfnum | string | 10 | 按身份证号查询,近7天在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 19 | als_d7_id_bank_allnum | string | 10 | 按身份证号查询,近7天在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 20 | als_d7_id_bank_tra_allnum | string | 10 | 按身份证号查询,近7天在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 21 | als_d7_id_bank_ret_allnum | string | 10 | 按身份证号查询,近7天在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 22 | als_d7_id_bank_orgnum | string | 10 | 按身份证号查询,近7天在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 23 | als_d7_id_bank_tra_orgnum | string | 10 | 按身份证号查询,近7天在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 24 | als_d7_id_bank_ret_orgnum | string | 10 | 按身份证号查询,近7天在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 25 | als_d7_id_bank_week_allnum | string | 10 | 按身份证号查询,近7天在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 26 | als_d7_id_bank_week_orgnum | string | 10 | 按身份证号查询,近7天在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 27 | als_d7_id_bank_night_allnum | string | 10 | 按身份证号查询,近7天在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 28 | als_d7_id_bank_night_orgnum | string | 10 | 按身份证号查询,近7天在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 29 | als_d7_id_nbank_selfnum | string | 10 | 按身份证号查询,近7天在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 30 | als_d7_id_nbank_allnum | string | 10 | 按身份证号查询,近7天在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 31 | als_d7_id_nbank_p2p_allnum | string | 10 | 按身份证号查询,近7天在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 32 | als_d7_id_nbank_mc_allnum | string | 10 | 按身份证号查询,近7天在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 33 | als_d7_id_nbank_ca_allnum | string | 10 | 按身份证号查询,近7天在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 34 | als_d7_id_nbank_cf_allnum | string | 10 | 按身份证号查询,近7天在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 35 | als_d7_id_nbank_com_allnum | string | 10 | 按身份证号查询,近7天在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 36 | als_d7_id_nbank_oth_allnum | string | 10 | 按身份证号查询,近7天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 37 | als_d7_id_nbank_nsloan_allnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 38 | als_d7_id_nbank_autofin_allnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 39 | als_d7_id_nbank_sloan_allnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 40 | als_d7_id_nbank_cons_allnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 41 | als_d7_id_nbank_finlea_allnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 42 | als_d7_id_nbank_else_allnum | string | 10 | 按身份证号查询,近7天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 43 | als_d7_id_nbank_orgnum | string | 10 | 按身份证号查询,近7天在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 44 | als_d7_id_nbank_p2p_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 45 | als_d7_id_nbank_mc_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 46 | als_d7_id_nbank_ca_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 47 | als_d7_id_nbank_cf_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 48 | als_d7_id_nbank_com_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 49 | als_d7_id_nbank_oth_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 50 | als_d7_id_nbank_nsloan_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 51 | als_d7_id_nbank_autofin_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 52 | als_d7_id_nbank_sloan_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 53 | als_d7_id_nbank_cons_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 54 | als_d7_id_nbank_finlea_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 55 | als_d7_id_nbank_else_orgnum | string | 10 | 按身份证号查询,近7天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 56 | als_d7_id_nbank_week_allnum | string | 10 | 按身份证号查询,近7天在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 57 | als_d7_id_nbank_week_orgnum | string | 10 | 按身份证号查询,近7天在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 58 | als_d7_id_nbank_night_allnum | string | 10 | 按身份证号查询,近7天在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 59 | als_d7_id_nbank_night_orgnum | string | 10 | 按身份证号查询,近7天在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 60 | als_d7_cell_pdl_allnum | string | 10 | 按手机号查询,近7天申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 61 | als_d7_cell_pdl_orgnum | string | 10 | 按手机号查询,近7天申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 62 | als_d7_cell_caon_allnum | string | 10 | 按手机号查询,近7天申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 63 | als_d7_cell_caon_orgnum | string | 10 | 按手机号查询,近7天申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 64 | als_d7_cell_rel_allnum | string | 10 | 按手机号查询,近7天申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 65 | als_d7_cell_rel_orgnum | string | 10 | 按手机号查询,近7天申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 66 | als_d7_cell_caoff_allnum | string | 10 | 按手机号查询,近7天申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 67 | als_d7_cell_caoff_orgnum | string | 10 | 按手机号查询,近7天申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 68 | als_d7_cell_cooff_allnum | string | 10 | 按手机号查询,近7天申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 69 | als_d7_cell_cooff_orgnum | string | 10 | 按手机号查询,近7天申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 70 | als_d7_cell_af_allnum | string | 10 | 按手机号查询,近7天申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 71 | als_d7_cell_af_orgnum | string | 10 | 按手机号查询,近7天申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 72 | als_d7_cell_coon_allnum | string | 10 | 按手机号查询,近7天申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 73 | als_d7_cell_coon_orgnum | string | 10 | 按手机号查询,近7天申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 74 | als_d7_cell_oth_allnum | string | 10 | 按手机号查询,近7天申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 75 | als_d7_cell_oth_orgnum | string | 10 | 按手机号查询,近7天申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 76 | als_d7_cell_bank_selfnum | string | 10 | 按手机号查询,近7天在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 77 | als_d7_cell_bank_allnum | string | 10 | 按手机号查询,近7天在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 78 | als_d7_cell_bank_tra_allnum | string | 10 | 按手机号查询,近7天在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 79 | als_d7_cell_bank_ret_allnum | string | 10 | 按手机号查询,近7天在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 80 | als_d7_cell_bank_orgnum | string | 10 | 按手机号查询,近7天在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 81 | als_d7_cell_bank_tra_orgnum | string | 10 | 按手机号查询,近7天在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 82 | als_d7_cell_bank_ret_orgnum | string | 10 | 按手机号查询,近7天在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 83 | als_d7_cell_bank_week_allnum | string | 10 | 按手机号查询,近7天在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 84 | als_d7_cell_bank_week_orgnum | string | 10 | 按手机号查询,近7天在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 85 | als_d7_cell_bank_night_allnum | string | 10 | 按手机号查询,近7天在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 86 | als_d7_cell_bank_night_orgnum | string | 10 | 按手机号查询,近7天在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 87 | als_d7_cell_nbank_selfnum | string | 10 | 按手机号查询,近7天在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 88 | als_d7_cell_nbank_allnum | string | 10 | 按手机号查询,近7天在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 89 | als_d7_cell_nbank_p2p_allnum | string | 10 | 按手机号查询,近7天在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 90 | als_d7_cell_nbank_mc_allnum | string | 10 | 按手机号查询,近7天在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 91 | als_d7_cell_nbank_ca_allnum | string | 10 | 按手机号查询,近7天在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 92 | als_d7_cell_nbank_cf_allnum | string | 10 | 按手机号查询,近7天在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 93 | als_d7_cell_nbank_com_allnum | string | 10 | 按手机号查询,近7天在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 94 | als_d7_cell_nbank_oth_allnum | string | 10 | 按手机号查询,近7天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 95 | als_d7_cell_nbank_nsloan_allnum | string | 10 | 按手机号查询,近7天在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 96 | als_d7_cell_nbank_autofin_allnum | string | 10 | 按手机号查询,近7天在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 97 | als_d7_cell_nbank_sloan_allnum | string | 10 | 按手机号查询,近7天在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 98 | als_d7_cell_nbank_cons_allnum | string | 10 | 按手机号查询,近7天在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 99 | als_d7_cell_nbank_finlea_allnum | string | 10 | 按手机号查询,近7天在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 100 | als_d7_cell_nbank_else_allnum | string | 10 | 按手机号查询,近7天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 101 | als_d7_cell_nbank_orgnum | string | 10 | 按手机号查询,近7天在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 102 | als_d7_cell_nbank_p2p_orgnum | string | 10 | 按手机号查询,近7天在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 103 | als_d7_cell_nbank_mc_orgnum | string | 10 | 按手机号查询,近7天在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 104 | als_d7_cell_nbank_ca_orgnum | string | 10 | 按手机号查询,近7天在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 105 | als_d7_cell_nbank_cf_orgnum | string | 10 | 按手机号查询,近7天在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 106 | als_d7_cell_nbank_com_orgnum | string | 10 | 按手机号查询,近7天在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 107 | als_d7_cell_nbank_oth_orgnum | string | 10 | 按手机号查询,近7天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 108 | als_d7_cell_nbank_nsloan_orgnum | string | 10 | 按手机号查询,近7天在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 109 | als_d7_cell_nbank_autofin_orgnum | string | 10 | 按手机号查询,近7天在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 110 | als_d7_cell_nbank_sloan_orgnum | string | 10 | 按手机号查询,近7天在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 111 | als_d7_cell_nbank_cons_orgnum | string | 10 | 按手机号查询,近7天在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 112 | als_d7_cell_nbank_finlea_orgnum | string | 10 | 按手机号查询,近7天在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 113 | als_d7_cell_nbank_else_orgnum | string | 10 | 按手机号查询,近7天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 114 | als_d7_cell_nbank_week_allnum | string | 10 | 按手机号查询,近7天在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 115 | als_d7_cell_nbank_week_orgnum | string | 10 | 按手机号查询,近7天在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 116 | als_d7_cell_nbank_night_allnum | string | 10 | 按手机号查询,近7天在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 117 | als_d7_cell_nbank_night_orgnum | string | 10 | 按手机号查询,近7天在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 118 | als_d15_id_pdl_allnum | string | 10 | 按身份证号查询,近15天申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 119 | als_d15_id_pdl_orgnum | string | 10 | 按身份证号查询,近15天申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 120 | als_d15_id_caon_allnum | string | 10 | 按身份证号查询,近15天申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 121 | als_d15_id_caon_orgnum | string | 10 | 按身份证号查询,近15天申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 122 | als_d15_id_rel_allnum | string | 10 | 按身份证号查询,近15天申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 123 | als_d15_id_rel_orgnum | string | 10 | 按身份证号查询,近15天申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 124 | als_d15_id_caoff_allnum | string | 10 | 按身份证号查询,近15天申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 125 | als_d15_id_caoff_orgnum | string | 10 | 按身份证号查询,近15天申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 126 | als_d15_id_cooff_allnum | string | 10 | 按身份证号查询,近15天申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 127 | als_d15_id_cooff_orgnum | string | 10 | 按身份证号查询,近15天申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 128 | als_d15_id_af_allnum | string | 10 | 按身份证号查询,近15天申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 129 | als_d15_id_af_orgnum | string | 10 | 按身份证号查询,近15天申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 130 | als_d15_id_coon_allnum | string | 10 | 按身份证号查询,近15天申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 131 | als_d15_id_coon_orgnum | string | 10 | 按身份证号查询,近15天申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 132 | als_d15_id_oth_allnum | string | 10 | 按身份证号查询,近15天申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 133 | als_d15_id_oth_orgnum | string | 10 | 按身份证号查询,近15天申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 134 | als_d15_id_bank_selfnum | string | 10 | 按身份证号查询,近15天在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 135 | als_d15_id_bank_allnum | string | 10 | 按身份证号查询,近15天在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 136 | als_d15_id_bank_tra_allnum | string | 10 | 按身份证号查询,近15天在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 137 | als_d15_id_bank_ret_allnum | string | 10 | 按身份证号查询,近15天在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 138 | als_d15_id_bank_orgnum | string | 10 | 按身份证号查询,近15天在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 139 | als_d15_id_bank_tra_orgnum | string | 10 | 按身份证号查询,近15天在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 140 | als_d15_id_bank_ret_orgnum | string | 10 | 按身份证号查询,近15天在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 141 | als_d15_id_bank_week_allnum | string | 10 | 按身份证号查询,近15天在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 142 | als_d15_id_bank_week_orgnum | string | 10 | 按身份证号查询,近15天在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 143 | als_d15_id_bank_night_allnum | string | 10 | 按身份证号查询,近15天在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 144 | als_d15_id_bank_night_orgnum | string | 10 | 按身份证号查询,近15天在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 145 | als_d15_id_nbank_selfnum | string | 10 | 按身份证号查询,近15天在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 146 | als_d15_id_nbank_allnum | string | 10 | 按身份证号查询,近15天在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 147 | als_d15_id_nbank_p2p_allnum | string | 10 | 按身份证号查询,近15天在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 148 | als_d15_id_nbank_mc_allnum | string | 10 | 按身份证号查询,近15天在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 149 | als_d15_id_nbank_ca_allnum | string | 10 | 按身份证号查询,近15天在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 150 | als_d15_id_nbank_cf_allnum | string | 10 | 按身份证号查询,近15天在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 151 | als_d15_id_nbank_com_allnum | string | 10 | 按身份证号查询,近15天在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 152 | als_d15_id_nbank_oth_allnum | string | 10 | 按身份证号查询,近15天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 153 | als_d15_id_nbank_nsloan_allnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 154 | als_d15_id_nbank_autofin_allnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 155 | als_d15_id_nbank_sloan_allnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 156 | als_d15_id_nbank_cons_allnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 157 | als_d15_id_nbank_finlea_allnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 158 | als_d15_id_nbank_else_allnum | string | 10 | 按身份证号查询,近15天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 159 | als_d15_id_nbank_orgnum | string | 10 | 按身份证号查询,近15天在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 160 | als_d15_id_nbank_p2p_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 161 | als_d15_id_nbank_mc_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 162 | als_d15_id_nbank_ca_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 163 | als_d15_id_nbank_cf_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 164 | als_d15_id_nbank_com_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 165 | als_d15_id_nbank_oth_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 166 | als_d15_id_nbank_nsloan_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 167 | als_d15_id_nbank_autofin_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 168 | als_d15_id_nbank_sloan_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 169 | als_d15_id_nbank_cons_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 170 | als_d15_id_nbank_finlea_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 171 | als_d15_id_nbank_else_orgnum | string | 10 | 按身份证号查询,近15天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 172 | als_d15_id_nbank_week_allnum | string | 10 | 按身份证号查询,近15天在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 173 | als_d15_id_nbank_week_orgnum | string | 10 | 按身份证号查询,近15天在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 174 | als_d15_id_nbank_night_allnum | string | 10 | 按身份证号查询,近15天在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 175 | als_d15_id_nbank_night_orgnum | string | 10 | 按身份证号查询,近15天在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 176 | als_d15_cell_pdl_allnum | string | 10 | 按手机号查询,近15天申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 177 | als_d15_cell_pdl_orgnum | string | 10 | 按手机号查询,近15天申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 178 | als_d15_cell_caon_allnum | string | 10 | 按手机号查询,近15天申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 179 | als_d15_cell_caon_orgnum | string | 10 | 按手机号查询,近15天申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 180 | als_d15_cell_rel_allnum | string | 10 | 按手机号查询,近15天申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 181 | als_d15_cell_rel_orgnum | string | 10 | 按手机号查询,近15天申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 182 | als_d15_cell_caoff_allnum | string | 10 | 按手机号查询,近15天申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 183 | als_d15_cell_caoff_orgnum | string | 10 | 按手机号查询,近15天申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 184 | als_d15_cell_cooff_allnum | string | 10 | 按手机号查询,近15天申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 185 | als_d15_cell_cooff_orgnum | string | 10 | 按手机号查询,近15天申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 186 | als_d15_cell_af_allnum | string | 10 | 按手机号查询,近15天申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 187 | als_d15_cell_af_orgnum | string | 10 | 按手机号查询,近15天申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 188 | als_d15_cell_coon_allnum | string | 10 | 按手机号查询,近15天申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 189 | als_d15_cell_coon_orgnum | string | 10 | 按手机号查询,近15天申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 190 | als_d15_cell_oth_allnum | string | 10 | 按手机号查询,近15天申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 191 | als_d15_cell_oth_orgnum | string | 10 | 按手机号查询,近15天申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 192 | als_d15_cell_bank_selfnum | string | 10 | 按手机号查询,近15天在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 193 | als_d15_cell_bank_allnum | string | 10 | 按手机号查询,近15天在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 194 | als_d15_cell_bank_tra_allnum | string | 10 | 按手机号查询,近15天在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 195 | als_d15_cell_bank_ret_allnum | string | 10 | 按手机号查询,近15天在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 196 | als_d15_cell_bank_orgnum | string | 10 | 按手机号查询,近15天在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 197 | als_d15_cell_bank_tra_orgnum | string | 10 | 按手机号查询,近15天在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 198 | als_d15_cell_bank_ret_orgnum | string | 10 | 按手机号查询,近15天在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 199 | als_d15_cell_bank_week_allnum | string | 10 | 按手机号查询,近15天在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 200 | als_d15_cell_bank_week_orgnum | string | 10 | 按手机号查询,近15天在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 201 | als_d15_cell_bank_night_allnum | string | 10 | 按手机号查询,近15天在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 202 | als_d15_cell_bank_night_orgnum | string | 10 | 按手机号查询,近15天在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 203 | als_d15_cell_nbank_selfnum | string | 10 | 按手机号查询,近15天在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 204 | als_d15_cell_nbank_allnum | string | 10 | 按手机号查询,近15天在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 205 | als_d15_cell_nbank_p2p_allnum | string | 10 | 按手机号查询,近15天在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 206 | als_d15_cell_nbank_mc_allnum | string | 10 | 按手机号查询,近15天在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 207 | als_d15_cell_nbank_ca_allnum | string | 10 | 按手机号查询,近15天在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 208 | als_d15_cell_nbank_cf_allnum | string | 10 | 按手机号查询,近15天在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 209 | als_d15_cell_nbank_com_allnum | string | 10 | 按手机号查询,近15天在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 210 | als_d15_cell_nbank_oth_allnum | string | 10 | 按手机号查询,近15天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 211 | als_d15_cell_nbank_nsloan_allnum | string | 10 | 按手机号查询,近15天在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 212 | als_d15_cell_nbank_autofin_allnum | string | 10 | 按手机号查询,近15天在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 213 | als_d15_cell_nbank_sloan_allnum | string | 10 | 按手机号查询,近15天在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 214 | als_d15_cell_nbank_cons_allnum | string | 10 | 按手机号查询,近15天在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 215 | als_d15_cell_nbank_finlea_allnum | string | 10 | 按手机号查询,近15天在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 216 | als_d15_cell_nbank_else_allnum | string | 10 | 按手机号查询,近15天在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 217 | als_d15_cell_nbank_orgnum | string | 10 | 按手机号查询,近15天在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 218 | als_d15_cell_nbank_p2p_orgnum | string | 10 | 按手机号查询,近15天在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 219 | als_d15_cell_nbank_mc_orgnum | string | 10 | 按手机号查询,近15天在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 220 | als_d15_cell_nbank_ca_orgnum | string | 10 | 按手机号查询,近15天在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 221 | als_d15_cell_nbank_cf_orgnum | string | 10 | 按手机号查询,近15天在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 222 | als_d15_cell_nbank_com_orgnum | string | 10 | 按手机号查询,近15天在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 223 | als_d15_cell_nbank_oth_orgnum | string | 10 | 按手机号查询,近15天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 224 | als_d15_cell_nbank_nsloan_orgnum | string | 10 | 按手机号查询,近15天在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 225 | als_d15_cell_nbank_autofin_orgnum | string | 10 | 按手机号查询,近15天在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 226 | als_d15_cell_nbank_sloan_orgnum | string | 10 | 按手机号查询,近15天在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 227 | als_d15_cell_nbank_cons_orgnum | string | 10 | 按手机号查询,近15天在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 228 | als_d15_cell_nbank_finlea_orgnum | string | 10 | 按手机号查询,近15天在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 229 | als_d15_cell_nbank_else_orgnum | string | 10 | 按手机号查询,近15天在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 230 | als_d15_cell_nbank_week_allnum | string | 10 | 按手机号查询,近15天在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 231 | als_d15_cell_nbank_week_orgnum | string | 10 | 按手机号查询,近15天在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 232 | als_d15_cell_nbank_night_allnum | string | 10 | 按手机号查询,近15天在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 233 | als_d15_cell_nbank_night_orgnum | string | 10 | 按手机号查询,近15天在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 234 | als_m1_id_pdl_allnum | string | 10 | 按身份证号查询,近1个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 235 | als_m1_id_pdl_orgnum | string | 10 | 按身份证号查询,近1个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 236 | als_m1_id_caon_allnum | string | 10 | 按身份证号查询,近1个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 237 | als_m1_id_caon_orgnum | string | 10 | 按身份证号查询,近1个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 238 | als_m1_id_rel_allnum | string | 10 | 按身份证号查询,近1个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 239 | als_m1_id_rel_orgnum | string | 10 | 按身份证号查询,近1个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 240 | als_m1_id_caoff_allnum | string | 10 | 按身份证号查询,近1个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 241 | als_m1_id_caoff_orgnum | string | 10 | 按身份证号查询,近1个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 242 | als_m1_id_cooff_allnum | string | 10 | 按身份证号查询,近1个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 243 | als_m1_id_cooff_orgnum | string | 10 | 按身份证号查询,近1个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 244 | als_m1_id_af_allnum | string | 10 | 按身份证号查询,近1个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 245 | als_m1_id_af_orgnum | string | 10 | 按身份证号查询,近1个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 246 | als_m1_id_coon_allnum | string | 10 | 按身份证号查询,近1个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 247 | als_m1_id_coon_orgnum | string | 10 | 按身份证号查询,近1个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 248 | als_m1_id_oth_allnum | string | 10 | 按身份证号查询,近1个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 249 | als_m1_id_oth_orgnum | string | 10 | 按身份证号查询,近1个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 250 | als_m1_id_bank_selfnum | string | 10 | 按身份证号查询,近1个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 251 | als_m1_id_bank_allnum | string | 10 | 按身份证号查询,近1个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 252 | als_m1_id_bank_tra_allnum | string | 10 | 按身份证号查询,近1个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 253 | als_m1_id_bank_ret_allnum | string | 10 | 按身份证号查询,近1个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 254 | als_m1_id_bank_orgnum | string | 10 | 按身份证号查询,近1个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 255 | als_m1_id_bank_tra_orgnum | string | 10 | 按身份证号查询,近1个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 256 | als_m1_id_bank_ret_orgnum | string | 10 | 按身份证号查询,近1个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 257 | als_m1_id_bank_week_allnum | string | 10 | 按身份证号查询,近1个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 258 | als_m1_id_bank_week_orgnum | string | 10 | 按身份证号查询,近1个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 259 | als_m1_id_bank_night_allnum | string | 10 | 按身份证号查询,近1个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 260 | als_m1_id_bank_night_orgnum | string | 10 | 按身份证号查询,近1个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 261 | als_m1_id_nbank_selfnum | string | 10 | 按身份证号查询,近1个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 262 | als_m1_id_nbank_allnum | string | 10 | 按身份证号查询,近1个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 263 | als_m1_id_nbank_p2p_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 264 | als_m1_id_nbank_mc_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 265 | als_m1_id_nbank_ca_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 266 | als_m1_id_nbank_cf_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 267 | als_m1_id_nbank_com_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 268 | als_m1_id_nbank_oth_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 269 | als_m1_id_nbank_nsloan_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 270 | als_m1_id_nbank_autofin_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 271 | als_m1_id_nbank_sloan_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 272 | als_m1_id_nbank_cons_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 273 | als_m1_id_nbank_finlea_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 274 | als_m1_id_nbank_else_allnum | string | 10 | 按身份证号查询,近1个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 275 | als_m1_id_nbank_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 276 | als_m1_id_nbank_p2p_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 277 | als_m1_id_nbank_mc_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 278 | als_m1_id_nbank_ca_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 279 | als_m1_id_nbank_cf_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 280 | als_m1_id_nbank_com_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 281 | als_m1_id_nbank_oth_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 282 | als_m1_id_nbank_nsloan_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 283 | als_m1_id_nbank_autofin_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 284 | als_m1_id_nbank_sloan_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 285 | als_m1_id_nbank_cons_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 286 | als_m1_id_nbank_finlea_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 287 | als_m1_id_nbank_else_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 288 | als_m1_id_nbank_week_allnum | string | 10 | 按身份证号查询,近1个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 289 | als_m1_id_nbank_week_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 290 | als_m1_id_nbank_night_allnum | string | 10 | 按身份证号查询,近1个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 291 | als_m1_id_nbank_night_orgnum | string | 10 | 按身份证号查询,近1个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 292 | als_m1_cell_pdl_allnum | string | 10 | 按手机号查询,近1个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 293 | als_m1_cell_pdl_orgnum | string | 10 | 按手机号查询,近1个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 294 | als_m1_cell_caon_allnum | string | 10 | 按手机号查询,近1个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 295 | als_m1_cell_caon_orgnum | string | 10 | 按手机号查询,近1个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 296 | als_m1_cell_rel_allnum | string | 10 | 按手机号查询,近1个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 297 | als_m1_cell_rel_orgnum | string | 10 | 按手机号查询,近1个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 298 | als_m1_cell_caoff_allnum | string | 10 | 按手机号查询,近1个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 299 | als_m1_cell_caoff_orgnum | string | 10 | 按手机号查询,近1个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 300 | als_m1_cell_cooff_allnum | string | 10 | 按手机号查询,近1个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 301 | als_m1_cell_cooff_orgnum | string | 10 | 按手机号查询,近1个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 302 | als_m1_cell_af_allnum | string | 10 | 按手机号查询,近1个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 303 | als_m1_cell_af_orgnum | string | 10 | 按手机号查询,近1个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 304 | als_m1_cell_coon_allnum | string | 10 | 按手机号查询,近1个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 305 | als_m1_cell_coon_orgnum | string | 10 | 按手机号查询,近1个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 306 | als_m1_cell_oth_allnum | string | 10 | 按手机号查询,近1个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 307 | als_m1_cell_oth_orgnum | string | 10 | 按手机号查询,近1个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 308 | als_m1_cell_bank_selfnum | string | 10 | 按手机号查询,近1个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 309 | als_m1_cell_bank_allnum | string | 10 | 按手机号查询,近1个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 310 | als_m1_cell_bank_tra_allnum | string | 10 | 按手机号查询,近1个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 311 | als_m1_cell_bank_ret_allnum | string | 10 | 按手机号查询,近1个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 312 | als_m1_cell_bank_orgnum | string | 10 | 按手机号查询,近1个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 313 | als_m1_cell_bank_tra_orgnum | string | 10 | 按手机号查询,近1个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 314 | als_m1_cell_bank_ret_orgnum | string | 10 | 按手机号查询,近1个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 315 | als_m1_cell_bank_week_allnum | string | 10 | 按手机号查询,近1个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 316 | als_m1_cell_bank_week_orgnum | string | 10 | 按手机号查询,近1个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 317 | als_m1_cell_bank_night_allnum | string | 10 | 按手机号查询,近1个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 318 | als_m1_cell_bank_night_orgnum | string | 10 | 按手机号查询,近1个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 319 | als_m1_cell_nbank_selfnum | string | 10 | 按手机号查询,近1个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 320 | als_m1_cell_nbank_allnum | string | 10 | 按手机号查询,近1个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 321 | als_m1_cell_nbank_p2p_allnum | string | 10 | 按手机号查询,近1个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 322 | als_m1_cell_nbank_mc_allnum | string | 10 | 按手机号查询,近1个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 323 | als_m1_cell_nbank_ca_allnum | string | 10 | 按手机号查询,近1个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 324 | als_m1_cell_nbank_cf_allnum | string | 10 | 按手机号查询,近1个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 325 | als_m1_cell_nbank_com_allnum | string | 10 | 按手机号查询,近1个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 326 | als_m1_cell_nbank_oth_allnum | string | 10 | 按手机号查询,近1个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 327 | als_m1_cell_nbank_nsloan_allnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 328 | als_m1_cell_nbank_autofin_allnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 329 | als_m1_cell_nbank_sloan_allnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 330 | als_m1_cell_nbank_cons_allnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 331 | als_m1_cell_nbank_finlea_allnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 332 | als_m1_cell_nbank_else_allnum | string | 10 | 按手机号查询,近1个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 333 | als_m1_cell_nbank_orgnum | string | 10 | 按手机号查询,近1个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 334 | als_m1_cell_nbank_p2p_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 335 | als_m1_cell_nbank_mc_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 336 | als_m1_cell_nbank_ca_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 337 | als_m1_cell_nbank_cf_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 338 | als_m1_cell_nbank_com_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 339 | als_m1_cell_nbank_oth_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 340 | als_m1_cell_nbank_nsloan_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 341 | als_m1_cell_nbank_autofin_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 342 | als_m1_cell_nbank_sloan_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 343 | als_m1_cell_nbank_cons_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 344 | als_m1_cell_nbank_finlea_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 345 | als_m1_cell_nbank_else_orgnum | string | 10 | 按手机号查询,近1个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 346 | als_m1_cell_nbank_week_allnum | string | 10 | 按手机号查询,近1个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 347 | als_m1_cell_nbank_week_orgnum | string | 10 | 按手机号查询,近1个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 348 | als_m1_cell_nbank_night_allnum | string | 10 | 按手机号查询,近1个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 349 | als_m1_cell_nbank_night_orgnum | string | 10 | 按手机号查询,近1个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 350 | als_m3_id_max_inteday | string | 10 | 按身份证号查询,近3个月申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 351 | als_m3_id_min_inteday | string | 10 | 按身份证号查询,近3个月申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 352 | als_m3_id_tot_mons | string | 10 | 按身份证号查询,近3个月有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 353 | als_m3_id_avg_monnum | string | 10 | 按身份证号查询,近3个月平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 354 | als_m3_id_max_monnum | string | 10 | 按身份证号查询,近3个月最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 355 | als_m3_id_min_monnum | string | 10 | 按身份证号查询,近3个月最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 356 | als_m3_id_pdl_allnum | string | 10 | 按身份证号查询,近3个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 357 | als_m3_id_pdl_orgnum | string | 10 | 按身份证号查询,近3个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 358 | als_m3_id_caon_allnum | string | 10 | 按身份证号查询,近3个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 359 | als_m3_id_caon_orgnum | string | 10 | 按身份证号查询,近3个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 360 | als_m3_id_rel_allnum | string | 10 | 按身份证号查询,近3个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 361 | als_m3_id_rel_orgnum | string | 10 | 按身份证号查询,近3个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 362 | als_m3_id_caoff_allnum | string | 10 | 按身份证号查询,近3个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 363 | als_m3_id_caoff_orgnum | string | 10 | 按身份证号查询,近3个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 364 | als_m3_id_cooff_allnum | string | 10 | 按身份证号查询,近3个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 365 | als_m3_id_cooff_orgnum | string | 10 | 按身份证号查询,近3个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 366 | als_m3_id_af_allnum | string | 10 | 按身份证号查询,近3个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 367 | als_m3_id_af_orgnum | string | 10 | 按身份证号查询,近3个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 368 | als_m3_id_coon_allnum | string | 10 | 按身份证号查询,近3个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 369 | als_m3_id_coon_orgnum | string | 10 | 按身份证号查询,近3个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 370 | als_m3_id_oth_allnum | string | 10 | 按身份证号查询,近3个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 371 | als_m3_id_oth_orgnum | string | 10 | 按身份证号查询,近3个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 372 | als_m3_id_bank_selfnum | string | 10 | 按身份证号查询,近3个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 373 | als_m3_id_bank_allnum | string | 10 | 按身份证号查询,近3个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 374 | als_m3_id_bank_tra_allnum | string | 10 | 按身份证号查询,近3个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 375 | als_m3_id_bank_ret_allnum | string | 10 | 按身份证号查询,近3个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 376 | als_m3_id_bank_orgnum | string | 10 | 按身份证号查询,近3个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 377 | als_m3_id_bank_tra_orgnum | string | 10 | 按身份证号查询,近3个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 378 | als_m3_id_bank_ret_orgnum | string | 10 | 按身份证号查询,近3个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 379 | als_m3_id_bank_tot_mons | string | 10 | 按身份证号查询,近3个月在银行机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 380 | als_m3_id_bank_avg_monnum | string | 10 | 按身份证号查询,近3个月在银行机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 381 | als_m3_id_bank_max_monnum | string | 10 | 按身份证号查询,近3个月在银行机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 382 | als_m3_id_bank_min_monnum | string | 10 | 按身份证号查询,近3个月在银行机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 383 | als_m3_id_bank_max_inteday | string | 10 | 按身份证号查询,近3个月在银行机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 384 | als_m3_id_bank_min_inteday | string | 10 | 按身份证号查询,近3个月在银行机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 385 | als_m3_id_bank_week_allnum | string | 10 | 按身份证号查询,近3个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 386 | als_m3_id_bank_week_orgnum | string | 10 | 按身份证号查询,近3个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 387 | als_m3_id_bank_night_allnum | string | 10 | 按身份证号查询,近3个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 388 | als_m3_id_bank_night_orgnum | string | 10 | 按身份证号查询,近3个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 389 | als_m3_id_nbank_selfnum | string | 10 | 按身份证号查询,近3个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 390 | als_m3_id_nbank_allnum | string | 10 | 按身份证号查询,近3个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 391 | als_m3_id_nbank_p2p_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 392 | als_m3_id_nbank_mc_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 393 | als_m3_id_nbank_ca_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 394 | als_m3_id_nbank_cf_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 395 | als_m3_id_nbank_com_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 396 | als_m3_id_nbank_oth_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 397 | als_m3_id_nbank_nsloan_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 398 | als_m3_id_nbank_autofin_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 399 | als_m3_id_nbank_sloan_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 400 | als_m3_id_nbank_cons_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 401 | als_m3_id_nbank_finlea_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 402 | als_m3_id_nbank_else_allnum | string | 10 | 按身份证号查询,近3个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 403 | als_m3_id_nbank_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 404 | als_m3_id_nbank_p2p_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 405 | als_m3_id_nbank_mc_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 406 | als_m3_id_nbank_ca_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 407 | als_m3_id_nbank_cf_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 408 | als_m3_id_nbank_com_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 409 | als_m3_id_nbank_oth_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 410 | als_m3_id_nbank_nsloan_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 411 | als_m3_id_nbank_autofin_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 412 | als_m3_id_nbank_sloan_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 413 | als_m3_id_nbank_cons_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 414 | als_m3_id_nbank_finlea_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 415 | als_m3_id_nbank_else_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 416 | als_m3_id_nbank_tot_mons | string | 10 | 按身份证号查询,近3个月在非银机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 417 | als_m3_id_nbank_avg_monnum | string | 10 | 按身份证号查询,近3个月在非银机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 418 | als_m3_id_nbank_max_monnum | string | 10 | 按身份证号查询,近3个月在非银机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 419 | als_m3_id_nbank_min_monnum | string | 10 | 按身份证号查询,近3个月在非银机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 420 | als_m3_id_nbank_max_inteday | string | 10 | 按身份证号查询,近3个月在非银机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 421 | als_m3_id_nbank_min_inteday | string | 10 | 按身份证号查询,近3个月在非银机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 422 | als_m3_id_nbank_week_allnum | string | 10 | 按身份证号查询,近3个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 423 | als_m3_id_nbank_week_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 424 | als_m3_id_nbank_night_allnum | string | 10 | 按身份证号查询,近3个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 425 | als_m3_id_nbank_night_orgnum | string | 10 | 按身份证号查询,近3个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 426 | als_m3_cell_max_inteday | string | 10 | 按手机号查询,近3个月申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 427 | als_m3_cell_min_inteday | string | 10 | 按手机号查询,近3个月申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 428 | als_m3_cell_tot_mons | string | 10 | 按手机号查询,近3个月有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 429 | als_m3_cell_avg_monnum | string | 10 | 按手机号查询,近3个月平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 430 | als_m3_cell_max_monnum | string | 10 | 按手机号查询,近3个月最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 431 | als_m3_cell_min_monnum | string | 10 | 按手机号查询,近3个月最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 432 | als_m3_cell_pdl_allnum | string | 10 | 按手机号查询,近3个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 433 | als_m3_cell_pdl_orgnum | string | 10 | 按手机号查询,近3个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 434 | als_m3_cell_caon_allnum | string | 10 | 按手机号查询,近3个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 435 | als_m3_cell_caon_orgnum | string | 10 | 按手机号查询,近3个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 436 | als_m3_cell_rel_allnum | string | 10 | 按手机号查询,近3个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 437 | als_m3_cell_rel_orgnum | string | 10 | 按手机号查询,近3个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 438 | als_m3_cell_caoff_allnum | string | 10 | 按手机号查询,近3个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 439 | als_m3_cell_caoff_orgnum | string | 10 | 按手机号查询,近3个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 440 | als_m3_cell_cooff_allnum | string | 10 | 按手机号查询,近3个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 441 | als_m3_cell_cooff_orgnum | string | 10 | 按手机号查询,近3个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 442 | als_m3_cell_af_allnum | string | 10 | 按手机号查询,近3个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 443 | als_m3_cell_af_orgnum | string | 10 | 按手机号查询,近3个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 444 | als_m3_cell_coon_allnum | string | 10 | 按手机号查询,近3个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 445 | als_m3_cell_coon_orgnum | string | 10 | 按手机号查询,近3个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 446 | als_m3_cell_oth_allnum | string | 10 | 按手机号查询,近3个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 447 | als_m3_cell_oth_orgnum | string | 10 | 按手机号查询,近3个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 448 | als_m3_cell_bank_selfnum | string | 10 | 按手机号查询,近3个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 449 | als_m3_cell_bank_allnum | string | 10 | 按手机号查询,近3个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 450 | als_m3_cell_bank_tra_allnum | string | 10 | 按手机号查询,近3个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 451 | als_m3_cell_bank_ret_allnum | string | 10 | 按手机号查询,近3个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 452 | als_m3_cell_bank_orgnum | string | 10 | 按手机号查询,近3个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 453 | als_m3_cell_bank_tra_orgnum | string | 10 | 按手机号查询,近3个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 454 | als_m3_cell_bank_ret_orgnum | string | 10 | 按手机号查询,近3个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 455 | als_m3_cell_bank_tot_mons | string | 10 | 按手机号查询,近3个月在银行机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 456 | als_m3_cell_bank_avg_monnum | string | 10 | 按手机号查询,近3个月在银行机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 457 | als_m3_cell_bank_max_monnum | string | 10 | 按手机号查询,近3个月在银行机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 458 | als_m3_cell_bank_min_monnum | string | 10 | 按手机号查询,近3个月在银行机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 459 | als_m3_cell_bank_max_inteday | string | 10 | 按手机号查询,近3个月在银行机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 460 | als_m3_cell_bank_min_inteday | string | 10 | 按手机号查询,近3个月在银行机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 461 | als_m3_cell_bank_week_allnum | string | 10 | 按手机号查询,近3个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 462 | als_m3_cell_bank_week_orgnum | string | 10 | 按手机号查询,近3个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 463 | als_m3_cell_bank_night_allnum | string | 10 | 按手机号查询,近3个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 464 | als_m3_cell_bank_night_orgnum | string | 10 | 按手机号查询,近3个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 465 | als_m3_cell_nbank_selfnum | string | 10 | 按手机号查询,近3个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 466 | als_m3_cell_nbank_allnum | string | 10 | 按手机号查询,近3个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 467 | als_m3_cell_nbank_p2p_allnum | string | 10 | 按手机号查询,近3个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 468 | als_m3_cell_nbank_mc_allnum | string | 10 | 按手机号查询,近3个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 469 | als_m3_cell_nbank_ca_allnum | string | 10 | 按手机号查询,近3个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 470 | als_m3_cell_nbank_cf_allnum | string | 10 | 按手机号查询,近3个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 471 | als_m3_cell_nbank_com_allnum | string | 10 | 按手机号查询,近3个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 472 | als_m3_cell_nbank_oth_allnum | string | 10 | 按手机号查询,近3个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 473 | als_m3_cell_nbank_nsloan_allnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 474 | als_m3_cell_nbank_autofin_allnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 475 | als_m3_cell_nbank_sloan_allnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 476 | als_m3_cell_nbank_cons_allnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 477 | als_m3_cell_nbank_finlea_allnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 478 | als_m3_cell_nbank_else_allnum | string | 10 | 按手机号查询,近3个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 479 | als_m3_cell_nbank_orgnum | string | 10 | 按手机号查询,近3个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 480 | als_m3_cell_nbank_p2p_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 481 | als_m3_cell_nbank_mc_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 482 | als_m3_cell_nbank_ca_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 483 | als_m3_cell_nbank_cf_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 484 | als_m3_cell_nbank_com_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 485 | als_m3_cell_nbank_oth_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 486 | als_m3_cell_nbank_nsloan_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 487 | als_m3_cell_nbank_autofin_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 488 | als_m3_cell_nbank_sloan_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 489 | als_m3_cell_nbank_cons_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 490 | als_m3_cell_nbank_finlea_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 491 | als_m3_cell_nbank_else_orgnum | string | 10 | 按手机号查询,近3个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 492 | als_m3_cell_nbank_tot_mons | string | 10 | 按手机号查询,近3个月在非银机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 493 | als_m3_cell_nbank_avg_monnum | string | 10 | 按手机号查询,近3个月在非银机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 494 | als_m3_cell_nbank_max_monnum | string | 10 | 按手机号查询,近3个月在非银机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 495 | als_m3_cell_nbank_min_monnum | string | 10 | 按手机号查询,近3个月在非银机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 496 | als_m3_cell_nbank_max_inteday | string | 10 | 按手机号查询,近3个月在非银机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 497 | als_m3_cell_nbank_min_inteday | string | 10 | 按手机号查询,近3个月在非银机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 498 | als_m3_cell_nbank_week_allnum | string | 10 | 按手机号查询,近3个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 499 | als_m3_cell_nbank_week_orgnum | string | 10 | 按手机号查询,近3个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 500 | als_m3_cell_nbank_night_allnum | string | 10 | 按手机号查询,近3个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 501 | als_m3_cell_nbank_night_orgnum | string | 10 | 按手机号查询,近3个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 502 | als_m6_id_max_inteday | string | 10 | 按身份证号查询,近6个月申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 503 | als_m6_id_min_inteday | string | 10 | 按身份证号查询,近6个月申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 504 | als_m6_id_tot_mons | string | 10 | 按身份证号查询,近6个月有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 505 | als_m6_id_avg_monnum | string | 10 | 按身份证号查询,近6个月平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 506 | als_m6_id_max_monnum | string | 10 | 按身份证号查询,近6个月最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 507 | als_m6_id_min_monnum | string | 10 | 按身份证号查询,近6个月最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 508 | als_m6_id_pdl_allnum | string | 10 | 按身份证号查询,近6个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 509 | als_m6_id_pdl_orgnum | string | 10 | 按身份证号查询,近6个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 510 | als_m6_id_caon_allnum | string | 10 | 按身份证号查询,近6个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 511 | als_m6_id_caon_orgnum | string | 10 | 按身份证号查询,近6个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 512 | als_m6_id_rel_allnum | string | 10 | 按身份证号查询,近6个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 513 | als_m6_id_rel_orgnum | string | 10 | 按身份证号查询,近6个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 514 | als_m6_id_caoff_allnum | string | 10 | 按身份证号查询,近6个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 515 | als_m6_id_caoff_orgnum | string | 10 | 按身份证号查询,近6个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 516 | als_m6_id_cooff_allnum | string | 10 | 按身份证号查询,近6个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 517 | als_m6_id_cooff_orgnum | string | 10 | 按身份证号查询,近6个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 518 | als_m6_id_af_allnum | string | 10 | 按身份证号查询,近6个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 519 | als_m6_id_af_orgnum | string | 10 | 按身份证号查询,近6个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 520 | als_m6_id_coon_allnum | string | 10 | 按身份证号查询,近6个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 521 | als_m6_id_coon_orgnum | string | 10 | 按身份证号查询,近6个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 522 | als_m6_id_oth_allnum | string | 10 | 按身份证号查询,近6个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 523 | als_m6_id_oth_orgnum | string | 10 | 按身份证号查询,近6个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 524 | als_m6_id_bank_selfnum | string | 10 | 按身份证号查询,近6个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 525 | als_m6_id_bank_allnum | string | 10 | 按身份证号查询,近6个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 526 | als_m6_id_bank_tra_allnum | string | 10 | 按身份证号查询,近6个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 527 | als_m6_id_bank_ret_allnum | string | 10 | 按身份证号查询,近6个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 528 | als_m6_id_bank_orgnum | string | 10 | 按身份证号查询,近6个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 529 | als_m6_id_bank_tra_orgnum | string | 10 | 按身份证号查询,近6个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 530 | als_m6_id_bank_ret_orgnum | string | 10 | 按身份证号查询,近6个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 531 | als_m6_id_bank_tot_mons | string | 10 | 按身份证号查询,近6个月在银行机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 532 | als_m6_id_bank_avg_monnum | string | 10 | 按身份证号查询,近6个月在银行机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 533 | als_m6_id_bank_max_monnum | string | 10 | 按身份证号查询,近6个月在银行机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 534 | als_m6_id_bank_min_monnum | string | 10 | 按身份证号查询,近6个月在银行机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 535 | als_m6_id_bank_max_inteday | string | 10 | 按身份证号查询,近6个月在银行机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 536 | als_m6_id_bank_min_inteday | string | 10 | 按身份证号查询,近6个月在银行机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 537 | als_m6_id_bank_week_allnum | string | 10 | 按身份证号查询,近6个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 538 | als_m6_id_bank_week_orgnum | string | 10 | 按身份证号查询,近6个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 539 | als_m6_id_bank_night_allnum | string | 10 | 按身份证号查询,近6个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 540 | als_m6_id_bank_night_orgnum | string | 10 | 按身份证号查询,近6个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 541 | als_m6_id_nbank_selfnum | string | 10 | 按身份证号查询,近6个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 542 | als_m6_id_nbank_allnum | string | 10 | 按身份证号查询,近6个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 543 | als_m6_id_nbank_p2p_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 544 | als_m6_id_nbank_mc_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 545 | als_m6_id_nbank_ca_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 546 | als_m6_id_nbank_cf_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 547 | als_m6_id_nbank_com_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 548 | als_m6_id_nbank_oth_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 549 | als_m6_id_nbank_nsloan_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 550 | als_m6_id_nbank_autofin_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 551 | als_m6_id_nbank_sloan_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 552 | als_m6_id_nbank_cons_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 553 | als_m6_id_nbank_finlea_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 554 | als_m6_id_nbank_else_allnum | string | 10 | 按身份证号查询,近6个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 555 | als_m6_id_nbank_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 556 | als_m6_id_nbank_p2p_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 557 | als_m6_id_nbank_mc_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 558 | als_m6_id_nbank_ca_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 559 | als_m6_id_nbank_cf_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 560 | als_m6_id_nbank_com_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 561 | als_m6_id_nbank_oth_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 562 | als_m6_id_nbank_nsloan_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 563 | als_m6_id_nbank_autofin_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 564 | als_m6_id_nbank_sloan_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 565 | als_m6_id_nbank_cons_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 566 | als_m6_id_nbank_finlea_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 567 | als_m6_id_nbank_else_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 568 | als_m6_id_nbank_tot_mons | string | 10 | 按身份证号查询,近6个月在非银机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 569 | als_m6_id_nbank_avg_monnum | string | 10 | 按身份证号查询,近6个月在非银机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 570 | als_m6_id_nbank_max_monnum | string | 10 | 按身份证号查询,近6个月在非银机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 571 | als_m6_id_nbank_min_monnum | string | 10 | 按身份证号查询,近6个月在非银机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 572 | als_m6_id_nbank_max_inteday | string | 10 | 按身份证号查询,近6个月在非银机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 573 | als_m6_id_nbank_min_inteday | string | 10 | 按身份证号查询,近6个月在非银机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 574 | als_m6_id_nbank_week_allnum | string | 10 | 按身份证号查询,近6个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 575 | als_m6_id_nbank_week_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 576 | als_m6_id_nbank_night_allnum | string | 10 | 按身份证号查询,近6个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 577 | als_m6_id_nbank_night_orgnum | string | 10 | 按身份证号查询,近6个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 578 | als_m6_cell_max_inteday | string | 10 | 按手机号查询,近6个月申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 579 | als_m6_cell_min_inteday | string | 10 | 按手机号查询,近6个月申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 580 | als_m6_cell_tot_mons | string | 10 | 按手机号查询,近6个月有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 581 | als_m6_cell_avg_monnum | string | 10 | 按手机号查询,近6个月平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 582 | als_m6_cell_max_monnum | string | 10 | 按手机号查询,近6个月最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 583 | als_m6_cell_min_monnum | string | 10 | 按手机号查询,近6个月最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 584 | als_m6_cell_pdl_allnum | string | 10 | 按手机号查询,近6个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 585 | als_m6_cell_pdl_orgnum | string | 10 | 按手机号查询,近6个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 586 | als_m6_cell_caon_allnum | string | 10 | 按手机号查询,近6个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 587 | als_m6_cell_caon_orgnum | string | 10 | 按手机号查询,近6个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 588 | als_m6_cell_rel_allnum | string | 10 | 按手机号查询,近6个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 589 | als_m6_cell_rel_orgnum | string | 10 | 按手机号查询,近6个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 590 | als_m6_cell_caoff_allnum | string | 10 | 按手机号查询,近6个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 591 | als_m6_cell_caoff_orgnum | string | 10 | 按手机号查询,近6个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 592 | als_m6_cell_cooff_allnum | string | 10 | 按手机号查询,近6个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 593 | als_m6_cell_cooff_orgnum | string | 10 | 按手机号查询,近6个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 594 | als_m6_cell_af_allnum | string | 10 | 按手机号查询,近6个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 595 | als_m6_cell_af_orgnum | string | 10 | 按手机号查询,近6个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 596 | als_m6_cell_coon_allnum | string | 10 | 按手机号查询,近6个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 597 | als_m6_cell_coon_orgnum | string | 10 | 按手机号查询,近6个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 598 | als_m6_cell_oth_allnum | string | 10 | 按手机号查询,近6个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 599 | als_m6_cell_oth_orgnum | string | 10 | 按手机号查询,近6个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 600 | als_m6_cell_bank_selfnum | string | 10 | 按手机号查询,近6个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 601 | als_m6_cell_bank_allnum | string | 10 | 按手机号查询,近6个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 602 | als_m6_cell_bank_tra_allnum | string | 10 | 按手机号查询,近6个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 603 | als_m6_cell_bank_ret_allnum | string | 10 | 按手机号查询,近6个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 604 | als_m6_cell_bank_orgnum | string | 10 | 按手机号查询,近6个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 605 | als_m6_cell_bank_tra_orgnum | string | 10 | 按手机号查询,近6个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 606 | als_m6_cell_bank_ret_orgnum | string | 10 | 按手机号查询,近6个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 607 | als_m6_cell_bank_tot_mons | string | 10 | 按手机号查询,近6个月在银行机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 608 | als_m6_cell_bank_avg_monnum | string | 10 | 按手机号查询,近6个月在银行机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 609 | als_m6_cell_bank_max_monnum | string | 10 | 按手机号查询,近6个月在银行机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 610 | als_m6_cell_bank_min_monnum | string | 10 | 按手机号查询,近6个月在银行机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 611 | als_m6_cell_bank_max_inteday | string | 10 | 按手机号查询,近6个月在银行机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 612 | als_m6_cell_bank_min_inteday | string | 10 | 按手机号查询,近6个月在银行机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 613 | als_m6_cell_bank_week_allnum | string | 10 | 按手机号查询,近6个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 614 | als_m6_cell_bank_week_orgnum | string | 10 | 按手机号查询,近6个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 615 | als_m6_cell_bank_night_allnum | string | 10 | 按手机号查询,近6个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 616 | als_m6_cell_bank_night_orgnum | string | 10 | 按手机号查询,近6个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 617 | als_m6_cell_nbank_selfnum | string | 10 | 按手机号查询,近6个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 618 | als_m6_cell_nbank_allnum | string | 10 | 按手机号查询,近6个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 619 | als_m6_cell_nbank_p2p_allnum | string | 10 | 按手机号查询,近6个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 620 | als_m6_cell_nbank_mc_allnum | string | 10 | 按手机号查询,近6个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 621 | als_m6_cell_nbank_ca_allnum | string | 10 | 按手机号查询,近6个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 622 | als_m6_cell_nbank_cf_allnum | string | 10 | 按手机号查询,近6个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 623 | als_m6_cell_nbank_com_allnum | string | 10 | 按手机号查询,近6个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 624 | als_m6_cell_nbank_oth_allnum | string | 10 | 按手机号查询,近6个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 625 | als_m6_cell_nbank_nsloan_allnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 626 | als_m6_cell_nbank_autofin_allnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 627 | als_m6_cell_nbank_sloan_allnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 628 | als_m6_cell_nbank_cons_allnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 629 | als_m6_cell_nbank_finlea_allnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 630 | als_m6_cell_nbank_else_allnum | string | 10 | 按手机号查询,近6个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 631 | als_m6_cell_nbank_orgnum | string | 10 | 按手机号查询,近6个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 632 | als_m6_cell_nbank_p2p_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 633 | als_m6_cell_nbank_mc_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 634 | als_m6_cell_nbank_ca_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 635 | als_m6_cell_nbank_cf_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 636 | als_m6_cell_nbank_com_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 637 | als_m6_cell_nbank_oth_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 638 | als_m6_cell_nbank_nsloan_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 639 | als_m6_cell_nbank_autofin_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 640 | als_m6_cell_nbank_sloan_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 641 | als_m6_cell_nbank_cons_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 642 | als_m6_cell_nbank_finlea_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 643 | als_m6_cell_nbank_else_orgnum | string | 10 | 按手机号查询,近6个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 644 | als_m6_cell_nbank_tot_mons | string | 10 | 按手机号查询,近6个月在非银机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 645 | als_m6_cell_nbank_avg_monnum | string | 10 | 按手机号查询,近6个月在非银机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 646 | als_m6_cell_nbank_max_monnum | string | 10 | 按手机号查询,近6个月在非银机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 647 | als_m6_cell_nbank_min_monnum | string | 10 | 按手机号查询,近6个月在非银机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 648 | als_m6_cell_nbank_max_inteday | string | 10 | 按手机号查询,近6个月在非银机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 649 | als_m6_cell_nbank_min_inteday | string | 10 | 按手机号查询,近6个月在非银机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 650 | als_m6_cell_nbank_week_allnum | string | 10 | 按手机号查询,近6个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 651 | als_m6_cell_nbank_week_orgnum | string | 10 | 按手机号查询,近6个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 652 | als_m6_cell_nbank_night_allnum | string | 10 | 按手机号查询,近6个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 653 | als_m6_cell_nbank_night_orgnum | string | 10 | 按手机号查询,近6个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 654 | als_m12_id_max_inteday | string | 10 | 按身份证号查询,近12个月申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 655 | als_m12_id_min_inteday | string | 10 | 按身份证号查询,近12个月申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 656 | als_m12_id_tot_mons | string | 10 | 按身份证号查询,近12个月有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 657 | als_m12_id_avg_monnum | string | 10 | 按身份证号查询,近12个月平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 658 | als_m12_id_max_monnum | string | 10 | 按身份证号查询,近12个月最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 659 | als_m12_id_min_monnum | string | 10 | 按身份证号查询,近12个月最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 660 | als_m12_id_pdl_allnum | string | 10 | 按身份证号查询,近12个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 661 | als_m12_id_pdl_orgnum | string | 10 | 按身份证号查询,近12个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 662 | als_m12_id_caon_allnum | string | 10 | 按身份证号查询,近12个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 663 | als_m12_id_caon_orgnum | string | 10 | 按身份证号查询,近12个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 664 | als_m12_id_rel_allnum | string | 10 | 按身份证号查询,近12个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 665 | als_m12_id_rel_orgnum | string | 10 | 按身份证号查询,近12个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 666 | als_m12_id_caoff_allnum | string | 10 | 按身份证号查询,近12个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 667 | als_m12_id_caoff_orgnum | string | 10 | 按身份证号查询,近12个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 668 | als_m12_id_cooff_allnum | string | 10 | 按身份证号查询,近12个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 669 | als_m12_id_cooff_orgnum | string | 10 | 按身份证号查询,近12个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 670 | als_m12_id_af_allnum | string | 10 | 按身份证号查询,近12个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 671 | als_m12_id_af_orgnum | string | 10 | 按身份证号查询,近12个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 672 | als_m12_id_coon_allnum | string | 10 | 按身份证号查询,近12个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 673 | als_m12_id_coon_orgnum | string | 10 | 按身份证号查询,近12个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 674 | als_m12_id_oth_allnum | string | 10 | 按身份证号查询,近12个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 675 | als_m12_id_oth_orgnum | string | 10 | 按身份证号查询,近12个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 676 | als_m12_id_bank_selfnum | string | 10 | 按身份证号查询,近12个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 677 | als_m12_id_bank_allnum | string | 10 | 按身份证号查询,近12个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 678 | als_m12_id_bank_tra_allnum | string | 10 | 按身份证号查询,近12个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 679 | als_m12_id_bank_ret_allnum | string | 10 | 按身份证号查询,近12个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 680 | als_m12_id_bank_orgnum | string | 10 | 按身份证号查询,近12个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 681 | als_m12_id_bank_tra_orgnum | string | 10 | 按身份证号查询,近12个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 682 | als_m12_id_bank_ret_orgnum | string | 10 | 按身份证号查询,近12个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 683 | als_m12_id_bank_tot_mons | string | 10 | 按身份证号查询,近12个月在银行机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 684 | als_m12_id_bank_avg_monnum | string | 10 | 按身份证号查询,近12个月在银行机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 685 | als_m12_id_bank_max_monnum | string | 10 | 按身份证号查询,近12个月在银行机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 686 | als_m12_id_bank_min_monnum | string | 10 | 按身份证号查询,近12个月在银行机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 687 | als_m12_id_bank_max_inteday | string | 10 | 按身份证号查询,近12个月在银行机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 688 | als_m12_id_bank_min_inteday | string | 10 | 按身份证号查询,近12个月在银行机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 689 | als_m12_id_bank_week_allnum | string | 10 | 按身份证号查询,近12个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 690 | als_m12_id_bank_week_orgnum | string | 10 | 按身份证号查询,近12个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 691 | als_m12_id_bank_night_allnum | string | 10 | 按身份证号查询,近12个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 692 | als_m12_id_bank_night_orgnum | string | 10 | 按身份证号查询,近12个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 693 | als_m12_id_nbank_selfnum | string | 10 | 按身份证号查询,近12个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 694 | als_m12_id_nbank_allnum | string | 10 | 按身份证号查询,近12个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 695 | als_m12_id_nbank_p2p_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 696 | als_m12_id_nbank_mc_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 697 | als_m12_id_nbank_ca_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 698 | als_m12_id_nbank_cf_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 699 | als_m12_id_nbank_com_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 700 | als_m12_id_nbank_oth_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 701 | als_m12_id_nbank_nsloan_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 702 | als_m12_id_nbank_autofin_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 703 | als_m12_id_nbank_sloan_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 704 | als_m12_id_nbank_cons_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 705 | als_m12_id_nbank_finlea_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 706 | als_m12_id_nbank_else_allnum | string | 10 | 按身份证号查询,近12个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 707 | als_m12_id_nbank_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 708 | als_m12_id_nbank_p2p_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 709 | als_m12_id_nbank_mc_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 710 | als_m12_id_nbank_ca_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 711 | als_m12_id_nbank_cf_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 712 | als_m12_id_nbank_com_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 713 | als_m12_id_nbank_oth_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 714 | als_m12_id_nbank_nsloan_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 715 | als_m12_id_nbank_autofin_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 716 | als_m12_id_nbank_sloan_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 717 | als_m12_id_nbank_cons_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 718 | als_m12_id_nbank_finlea_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 719 | als_m12_id_nbank_else_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 720 | als_m12_id_nbank_tot_mons | string | 10 | 按身份证号查询,近12个月在非银机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 721 | als_m12_id_nbank_avg_monnum | string | 10 | 按身份证号查询,近12个月在非银机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 722 | als_m12_id_nbank_max_monnum | string | 10 | 按身份证号查询,近12个月在非银机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 723 | als_m12_id_nbank_min_monnum | string | 10 | 按身份证号查询,近12个月在非银机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 724 | als_m12_id_nbank_max_inteday | string | 10 | 按身份证号查询,近12个月在非银机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 725 | als_m12_id_nbank_min_inteday | string | 10 | 按身份证号查询,近12个月在非银机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 726 | als_m12_id_nbank_week_allnum | string | 10 | 按身份证号查询,近12个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 727 | als_m12_id_nbank_week_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 728 | als_m12_id_nbank_night_allnum | string | 10 | 按身份证号查询,近12个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 729 | als_m12_id_nbank_night_orgnum | string | 10 | 按身份证号查询,近12个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 730 | als_m12_cell_max_inteday | string | 10 | 按手机号查询,近12个月申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 731 | als_m12_cell_min_inteday | string | 10 | 按手机号查询,近12个月申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 732 | als_m12_cell_tot_mons | string | 10 | 按手机号查询,近12个月有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 733 | als_m12_cell_avg_monnum | string | 10 | 按手机号查询,近12个月平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 734 | als_m12_cell_max_monnum | string | 10 | 按手机号查询,近12个月最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 735 | als_m12_cell_min_monnum | string | 10 | 按手机号查询,近12个月最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 736 | als_m12_cell_pdl_allnum | string | 10 | 按手机号查询,近12个月申请线上小额现金贷的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 737 | als_m12_cell_pdl_orgnum | string | 10 | 按手机号查询,近12个月申请线上小额现金贷的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 738 | als_m12_cell_caon_allnum | string | 10 | 按手机号查询,近12个月申请线上现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 739 | als_m12_cell_caon_orgnum | string | 10 | 按手机号查询,近12个月申请线上现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 740 | als_m12_cell_rel_allnum | string | 10 | 按手机号查询,近12个月申请信用卡(类信用卡)的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 741 | als_m12_cell_rel_orgnum | string | 10 | 按手机号查询,近12个月申请信用卡(类信用卡)的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 742 | als_m12_cell_caoff_allnum | string | 10 | 按手机号查询,近12个月申请线下现金分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 743 | als_m12_cell_caoff_orgnum | string | 10 | 按手机号查询,近12个月申请线下现金分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 744 | als_m12_cell_cooff_allnum | string | 10 | 按手机号查询,近12个月申请线下消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 745 | als_m12_cell_cooff_orgnum | string | 10 | 按手机号查询,近12个月申请线下消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 746 | als_m12_cell_af_allnum | string | 10 | 按手机号查询,近12个月申请汽车金融的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 747 | als_m12_cell_af_orgnum | string | 10 | 按手机号查询,近12个月申请汽车金融的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 748 | als_m12_cell_coon_allnum | string | 10 | 按手机号查询,近12个月申请线上消费分期的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 749 | als_m12_cell_coon_orgnum | string | 10 | 按手机号查询,近12个月申请线上消费分期的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 750 | als_m12_cell_oth_allnum | string | 10 | 按手机号查询,近12个月申请其他的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 751 | als_m12_cell_oth_orgnum | string | 10 | 按手机号查询,近12个月申请其他的机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 752 | als_m12_cell_bank_selfnum | string | 10 | 按手机号查询,近12个月在本机构(本机构为银行)的申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他银行机构有申请;N申请记录详情 |
|
||||
| 753 | als_m12_cell_bank_allnum | string | 10 | 按手机号查询,近12个月在银行机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 754 | als_m12_cell_bank_tra_allnum | string | 10 | 按手机号查询,近12个月在银行机构-传统银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 755 | als_m12_cell_bank_ret_allnum | string | 10 | 按手机号查询,近12个月在银行机构-网络零售银行申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 756 | als_m12_cell_bank_orgnum | string | 10 | 按手机号查询,近12个月在银行机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 757 | als_m12_cell_bank_tra_orgnum | string | 10 | 按手机号查询,近12个月在银行机构-传统银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 758 | als_m12_cell_bank_ret_orgnum | string | 10 | 按手机号查询,近12个月在银行机构-网络零售银行申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 759 | als_m12_cell_bank_tot_mons | string | 10 | 按手机号查询,近12个月在银行机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 760 | als_m12_cell_bank_avg_monnum | string | 10 | 按手机号查询,近12个月在银行机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 761 | als_m12_cell_bank_max_monnum | string | 10 | 按手机号查询,近12个月在银行机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 762 | als_m12_cell_bank_min_monnum | string | 10 | 按手机号查询,近12个月在银行机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 763 | als_m12_cell_bank_max_inteday | string | 10 | 按手机号查询,近12个月在银行机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 764 | als_m12_cell_bank_min_inteday | string | 10 | 按手机号查询,近12个月在银行机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 765 | als_m12_cell_bank_week_allnum | string | 10 | 按手机号查询,近12个月在银行机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 766 | als_m12_cell_bank_week_orgnum | string | 10 | 按手机号查询,近12个月在银行机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 767 | als_m12_cell_bank_night_allnum | string | 10 | 按手机号查询,近12个月在银行机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 768 | als_m12_cell_bank_night_orgnum | string | 10 | 按手机号查询,近12个月在银行机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 769 | als_m12_cell_nbank_selfnum | string | 10 | 按手机号查询,近12个月在本机构(本机构为非银)申请次数 | 取"空/0/N";空:无申请记录;0本机构无申请记录但其他非银机构有申请;N申请记录详情 |
|
||||
| 770 | als_m12_cell_nbank_allnum | string | 10 | 按手机号查询,近12个月在非银机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 771 | als_m12_cell_nbank_p2p_allnum | string | 10 | 按手机号查询,近12个月在非银机构-改制机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 772 | als_m12_cell_nbank_mc_allnum | string | 10 | 按手机号查询,近12个月在非银机构-小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 773 | als_m12_cell_nbank_ca_allnum | string | 10 | 按手机号查询,近12个月在非银机构-现金类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 774 | als_m12_cell_nbank_cf_allnum | string | 10 | 按手机号查询,近12个月在非银机构-消费类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 775 | als_m12_cell_nbank_com_allnum | string | 10 | 按手机号查询,近12个月在非银机构-代偿类分期机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 776 | als_m12_cell_nbank_oth_allnum | string | 10 | 按手机号查询,近12个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 777 | als_m12_cell_nbank_nsloan_allnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌网络小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 778 | als_m12_cell_nbank_autofin_allnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌汽车金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 779 | als_m12_cell_nbank_sloan_allnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌小贷机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 780 | als_m12_cell_nbank_cons_allnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌消费金融机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 781 | als_m12_cell_nbank_finlea_allnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌融资租赁机构申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 782 | als_m12_cell_nbank_else_allnum | string | 10 | 按手机号查询,近12个月在非银机构-其他申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 783 | als_m12_cell_nbank_orgnum | string | 10 | 按手机号查询,近12个月在非银机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 784 | als_m12_cell_nbank_p2p_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-改制机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 785 | als_m12_cell_nbank_mc_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-小贷申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 786 | als_m12_cell_nbank_ca_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-现金类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 787 | als_m12_cell_nbank_cf_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-消费类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 788 | als_m12_cell_nbank_com_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-代偿类分期申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 789 | als_m12_cell_nbank_oth_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 790 | als_m12_cell_nbank_nsloan_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌网络小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 791 | als_m12_cell_nbank_autofin_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌汽车金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 792 | als_m12_cell_nbank_sloan_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌小贷机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 793 | als_m12_cell_nbank_cons_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌消费金融机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 794 | als_m12_cell_nbank_finlea_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-持牌融资租赁机构申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 795 | als_m12_cell_nbank_else_orgnum | string | 10 | 按手机号查询,近12个月在非银机构-其他申请机构数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 796 | als_m12_cell_nbank_tot_mons | string | 10 | 按手机号查询,近12个月在非银机构有申请记录月份数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 797 | als_m12_cell_nbank_avg_monnum | string | 10 | 按手机号查询,近12个月在非银机构平均每月申请次数(有申请月份平均) | 取"空/N";空:无申请记录;N申请记录详情(保留两位小数) |
|
||||
| 798 | als_m12_cell_nbank_max_monnum | string | 10 | 按手机号查询,近12个月在非银机构最大月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 799 | als_m12_cell_nbank_min_monnum | string | 10 | 按手机号查询,近12个月在非银机构最小月申请次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 800 | als_m12_cell_nbank_max_inteday | string | 10 | 按手机号查询,近12个月在非银机构申请最大间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 801 | als_m12_cell_nbank_min_inteday | string | 10 | 按手机号查询,近12个月在非银机构申请最小间隔天数 | 取"空/0-N";空:无申请记录;0-N申请记录详情 |
|
||||
| 802 | als_m12_cell_nbank_week_allnum | string | 10 | 按手机号查询,近12个月在非银机构周末申请次数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 803 | als_m12_cell_nbank_week_orgnum | string | 10 | 按手机号查询,近12个月在非银机构周末申请机构数 | 取"空/0/N";空:无申请记录;0,其它时间段有申请,周末无申请;N申请记录详情 |
|
||||
| 804 | als_m12_cell_nbank_night_allnum | string | 10 | 按手机号查询,近12个月在非银机构夜间申请次数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 805 | als_m12_cell_nbank_night_orgnum | string | 10 | 按手机号查询,近12个月在非银机构夜间申请机构数 | 取"空/0/N";空:无申请记录;0:其它时间段有申请,夜间无申请;N申请记录详情 |
|
||||
| 806 | als_fst_id_bank_inteday | string | 10 | 按身份证号查询,距最早在银行机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 807 | als_fst_id_nbank_inteday | string | 10 | 按身份证号查询,距最早在非银行机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 808 | als_fst_cell_bank_inteday | string | 10 | 按手机号查询,距最早在银行机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 809 | als_fst_cell_nbank_inteday | string | 10 | 按手机号查询,距最早在非银机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 810 | als_lst_id_bank_inteday | string | 10 | 按身份证号查询,距最近在银行机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 811 | als_lst_id_bank_consnum | string | 10 | 按身份证号查询,最近开始在银行机构连续申请的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 812 | als_lst_id_bank_csinteday | string | 10 | 按身份证号查询,最近开始在银行机构连续申请的持续天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 813 | als_lst_id_nbank_inteday | string | 10 | 按身份证号查询,距最近在非银行机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 814 | als_lst_id_nbank_consnum | string | 10 | 按身份证号查询,最近开始在非银行机构连续申请的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 815 | als_lst_id_nbank_csinteday | string | 10 | 按身份证号查询,最近开始在非银机构连续申请的持续天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 816 | als_lst_cell_bank_inteday | string | 10 | 按手机号查询,距最近在银行机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 817 | als_lst_cell_bank_consnum | string | 10 | 按手机号查询,最近开始在银行机构连续申请的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 818 | als_lst_cell_bank_csinteday | string | 10 | 按手机号查询,最近开始在银行机构连续申请的持续天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 819 | als_lst_cell_nbank_inteday | string | 10 | 按手机号查询,距最近在非银机构申请的间隔天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 820 | als_lst_cell_nbank_consnum | string | 10 | 按手机号查询,最近开始在非银机构连续申请的次数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
| 821 | als_lst_cell_nbank_csinteday | string | 10 | 按手机号查询,最近开始在非银机构连续申请的持续天数 | 取"空/N";空:无申请记录;N申请记录详情 |
|
||||
561
支付行为指数_返回字段说明.md
561
支付行为指数_返回字段说明.md
@@ -1,561 +0,0 @@
|
||||
## 返回字段说明
|
||||
|
||||
| 字段名 | 类型 | 说明 |
|
||||
| ------- | ------- | -------------- |
|
||||
| code | String | 返回状态码 |
|
||||
| message | String | 响应状态码说明 |
|
||||
| data | Object | 响应的主体数据 |
|
||||
| success | Boolean | 请求是否成功 |
|
||||
|
||||
|
||||
## data返回字段说明
|
||||
|
||||
| 输出内容(data) | 中文解释 | 说明 |
|
||||
| ----------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
||||
| flag | 查得标识 | 取值范围:0、1;0:查无;1:查得 |
|
||||
| flagdb | 库有标识 | 取值范围:0、1;0:库无;1:库有 |
|
||||
| ppcm_behav_score | 支付行为评分 | 取值范围:[300,900],未命中输出-1;分数越高风险越低 |
|
||||
| ppcm_d7_bank_qynum | 近7天在银行的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_qynum | 近7天在消费金融的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_qynum | 近7天在其他机构的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_qynum | 近7天总查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_qynum | 近1个月在银行的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_qynum | 近1个月在消费金融的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_qynum | 近1个月在其他机构的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_qynum | 近1个月总查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_qynum | 近3个月在银行的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_qynum | 近3个月在消费金融的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_qynum | 近3个月在其他机构的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_qynum | 近3个月总查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_qynum | 近6个月在银行的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_qynum | 近6个月在消费金融的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_qynum | 近6个月在其他机构的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_qynum | 近6个月总查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_qynum | 近1年在银行的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_qynum | 近1年在消费金融的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_qynum | 近1年在其他机构的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_qynum | 近1年总查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_qynum | 近2年在银行的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_qynum | 近2年在消费金融的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_qynum | 近2年在其他机构的查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_qynum | 近2年总查验次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_qynum_avg | 近3个月月均查验次数 | 取值范围:>0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_qynum_avg | 近6个月月均查验次数 | 取值范围:>0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_bank_qyorg | 近7天在银行的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_qyorg | 近7天在消费金融的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_qyorg | 近7天在其他机构的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_qyorg | 近7天总查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_qyorg | 近1个月在银行的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_qyorg | 近1个月在消费金融的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_qyorg | 近1个月在其他机构的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_qyorg | 近1个月总查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_qyorg | 近3个月在银行的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_qyorg | 近3个月在消费金融的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_qyorg | 近3个月在其他机构的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_qyorg | 近3个月总查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_qyorg | 近6个月在银行的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_qyorg | 近6个月在消费金融的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_qyorg | 近6个月在其他机构的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_qyorg | 近6个月总查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_qyorg | 近1年在银行的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_qyorg | 近1年在消费金融的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_qyorg | 近1年在其他机构的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_qyorg | 近1年总查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_qyorg | 近2年在银行的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_qyorg | 近2年在消费金融的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_qyorg | 近2年在其他机构的查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_qyorg | 近2年总查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_qyorg_new | 近1个月总新增查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_qyorg_new | 近3个月总新增查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_qyorg_new | 近6个月总新增查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_qyorg_new | 近1年总新增查验机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_qyday | 近1个月总查验天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_qyday | 近3个月总查验天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_qyday | 近6个月总查验天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_qyday | 近1年总查验天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_qyday | 近2年总查验天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_latest_qytoday | 最近一次查验距今天数 | 1:(0,7];2:(7,15];3:(15,30];4:(30,60];5:(60,90];6:(90,120];7:(120,150];8:(150,180];9:(180,360];10:(360,+);-1:未命中 |
|
||||
| ppcm_d7_bank_succ_repnum | 近7天在银行的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_succ_repnum | 近7天在消费金融的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_succ_repnum | 近7天在其他机构的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_succ_repnum | 近7天总还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_succ_repnum | 近1个月在银行的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_succ_repnum | 近1个月在消费金融的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_succ_repnum | 近1个月在其他机构的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_succ_repnum | 近1个月总还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_succ_repnum | 近3个月在银行的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_succ_repnum | 近3个月在消费金融的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_succ_repnum | 近3个月在其他机构的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_succ_repnum | 近3个月总还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_succ_repnum | 近6个月在银行的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_succ_repnum | 近6个月在消费金融的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_succ_repnum | 近6个月在其他机构的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_succ_repnum | 近6个月总还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_succ_repnum | 近1年在银行的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_succ_repnum | 近1年在消费金融的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_succ_repnum | 近1年在其他机构的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_succ_repnum | 近1年总还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_succ_repnum | 近2年在银行的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_succ_repnum | 近2年在消费金融的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_succ_repnum | 近2年在其他机构的还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_succ_repnum | 近2年总还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_bank_fail_repnum | 近7天在银行的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_fail_repnum | 近7天在消费金融的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_fail_repnum | 近7天在其他机构的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_fail_repnum | 近7天总还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_fail_repnum | 近1个月在银行的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_fail_repnum | 近1个月在消费金融的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_fail_repnum | 近1个月在其他机构的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_fail_repnum | 近1个月总还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_fail_repnum | 近3个月在银行的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_fail_repnum | 近3个月在消费金融的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_fail_repnum | 近3个月在其他机构的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_fail_repnum | 近3个月总还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_fail_repnum | 近6个月在银行的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_fail_repnum | 近6个月在消费金融的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_fail_repnum | 近6个月在其他机构的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_fail_repnum | 近6个月总还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_fail_repnum | 近1年在银行的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_fail_repnum | 近1年在消费金融的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_fail_repnum | 近1年在其他机构的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_fail_repnum | 近1年总还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_fail_repnum | 近2年在银行的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_fail_repnum | 近2年在消费金融的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_fail_repnum | 近2年在其他机构的还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_fail_repnum | 近2年总还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_bank_neh_repnum_ratio | 近7天在银行的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_neh_repnum_ratio | 近7天在消费金融的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_neh_repnum_ratio | 近7天在其他机构的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_fail_neh_repnum_ratio | 近7天总还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_bank_neh_repnum_ratio | 近1个月在银行的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_neh_repnum_ratio | 近1个月在消费金融的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_neh_repnum_ratio | 近1个月在其他机构的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_fail_neh_repnum_ratio | 近1个月总还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_bank_neh_repnum_ratio | 近3个月在银行的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_neh_repnum_ratio | 近3个月在消费金融的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_neh_repnum_ratio | 近3个月在其他机构的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_fail_neh_repnum_ratio | 近3个月总还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_bank_neh_repnum_ratio | 近6个月在银行的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_neh_repnum_ratio | 近6个月在消费金融的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_neh_repnum_ratio | 近6个月在其他机构的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_fail_neh_repnum_ratio | 近6个月总还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m12_bank_neh_repnum_ratio | 近1年在银行的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_neh_repnum_ratio | 近1年在消费金融的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_neh_repnum_ratio | 近1年在其他机构的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m12_fail_neh_repnum_ratio | 近1年总还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m24_bank_neh_repnum_ratio | 近2年在银行的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_neh_repnum_ratio | 近2年在消费金融的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_neh_repnum_ratio | 近2年在其他机构的还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m24_fail_neh_repnum_ratio | 近2年总还款失败-余额不足次数占比 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_succ_repnum_avg | 近3个月月均还款成功次数 | >0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_succ_repnum_avg | 近6个月月均还款成功次数 | >0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_fail_repnum_avg | 近3个月月均还款失败次数 | >0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_fail_repnum_avg | 近6个月月均还款失败次数 | >0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_reporg | 近7天总还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_reporg | 近1个月总还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_reporg | 近3个月总还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_reporg | 近6个月总还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_reporg | 近1年总还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_reporg | 近2年总还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_reporg_new | 近1个月总新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_reporg_new | 近3个月总新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_reporg_new | 近6个月总新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_reporg_new | 近1年总新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_bank_succ_reporg | 近7天在银行的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_succ_reporg | 近7天在消费金融的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_succ_reporg | 近7天在其他机构的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_succ_reporg | 近7天总还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_succ_reporg | 近1个月在银行的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_succ_reporg | 近1个月在消费金融的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_succ_reporg | 近1个月在其他机构的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_succ_reporg | 近1个月总还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_succ_reporg | 近3个月在银行的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_succ_reporg | 近3个月在消费金融的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_succ_reporg | 近3个月在其他机构的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_succ_reporg | 近3个月总还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_succ_reporg | 近6个月在银行的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_succ_reporg | 近6个月在消费金融的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_succ_reporg | 近6个月在其他机构的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_succ_reporg | 近6个月总还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_succ_reporg | 近1年在银行的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_succ_reporg | 近1年在消费金融的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_succ_reporg | 近1年在其他机构的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_succ_reporg | 近1年总还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_succ_reporg | 近2年在银行的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_succ_reporg | 近2年在消费金融的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_succ_reporg | 近2年在其他机构的还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_succ_reporg | 近2年总还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_succ_reporg_new | 近1个月总新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_succ_reporg_new | 近3个月总新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_succ_reporg_new | 近6个月总新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_succ_reporg_new | 近1年总新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_bank_fail_reporg | 近7天在银行的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_fail_reporg | 近7天在消费金融的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_fail_reporg | 近7天在其他机构的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_fail_reporg | 近7天总还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_fail_reporg | 近1个月在银行的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_fail_reporg | 近1个月在消费金融的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_fail_reporg | 近1个月在其他机构的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_fail_reporg | 近1个月总还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_fail_reporg | 近3个月在银行的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_fail_reporg | 近3个月在消费金融的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_fail_reporg | 近3个月在其他机构的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_fail_reporg | 近3个月总还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_fail_reporg | 近6个月在银行的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_fail_reporg | 近6个月在消费金融的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_fail_reporg | 近6个月在其他机构的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_fail_reporg | 近6个月总还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_fail_reporg | 近1年在银行的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_fail_reporg | 近1年在消费金融的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_fail_reporg | 近1年在其他机构的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_fail_reporg | 近1年总还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_fail_reporg | 近2年在银行的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_fail_reporg | 近2年在消费金融的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_fail_reporg | 近2年在其他机构的还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_fail_reporg | 近2年总还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_fail_reporg_new | 近1个月总新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_fail_reporg_new | 近3个月总新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_fail_reporg_new | 近6个月总新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_fail_reporg_new | 近1年总新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_bank_succ_repamt | 近7天在银行的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_succ_repamt | 近7天在消费金融的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_succ_repamt | 近7天在其他机构的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_succ_repamt | 近7天还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_bank_succ_repamt | 近1个月在银行的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_succ_repamt | 近1个月在消费金融的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_succ_repamt | 近1个月在其他机构的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_succ_repamt | 近1个月还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_bank_succ_repamt | 近3个月在银行的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_succ_repamt | 近3个月在消费金融的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_succ_repamt | 近3个月在其他机构的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_succ_repamt | 近3个月还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_bank_succ_repamt | 近6个月在银行的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_succ_repamt | 近6个月在消费金融的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_succ_repamt | 近6个月在其他机构的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_succ_repamt | 近6个月还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_bank_succ_repamt | 近1年在银行的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_succ_repamt | 近1年在消费金融的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_succ_repamt | 近1年在其他机构的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_succ_repamt | 近1年还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_bank_succ_repamt | 近2年在银行的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_succ_repamt | 近2年在消费金融的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_succ_repamt | 近2年在其他机构的还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_succ_repamt | 近2年还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_bank_fail_repamt | 近7天在银行的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_fail_repamt | 近7天在消费金融的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_fail_repamt | 近7天在其他机构的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_fail_repamt | 近7天还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_bank_fail_repamt | 近1个月在银行的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_fail_repamt | 近1个月在消费金融的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_fail_repamt | 近1个月在其他机构的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_fail_repamt | 近1个月还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_bank_fail_repamt | 近3个月在银行的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_fail_repamt | 近3个月在消费金融的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_fail_repamt | 近3个月在其他机构的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_fail_repamt | 近3个月还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_bank_fail_repamt | 近6个月在银行的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_fail_repamt | 近6个月在消费金融的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_fail_repamt | 近6个月在其他机构的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_fail_repamt | 近6个月还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_bank_fail_repamt | 近1年在银行的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_fail_repamt | 近1年在消费金融的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_fail_repamt | 近1年在其他机构的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_fail_repamt | 近1年还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_bank_fail_repamt | 近2年在银行的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_fail_repamt | 近2年在消费金融的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_fail_repamt | 近2年在其他机构的还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_fail_repamt | 近2年还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_succ_repamt_max | 近7天最大还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_succ_repamt_max | 近1个月最大还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_succ_repamt_max | 近3个月最大还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_succ_repamt_max | 近6个月最大还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_succ_repamt_max | 近1年最大还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_succ_repamt_max | 近2年最大还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_fail_repamt_max | 近7天最大还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_fail_repamt_max | 近1个月最大还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_fail_repamt_max | 近3个月最大还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_fail_repamt_max | 近6个月最大还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_fail_repamt_max | 近1年最大还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_fail_repamt_max | 近2年最大还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_repday | 近1个月总还款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_repday | 近3个月总还款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_repday | 近6个月总还款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_repday | 近1年总还款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_repday | 近2年总还款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_latest_succ_reptoday | 最近一次还款成功距今天数 | 1:(0,7];2:(7,15];3:(15,30];4:(30,60];5:(60,90];6:(90,120];7:(120,150];8:(150,180];9:(180,360];10:(360,+);-1:未命中 |
|
||||
| ppcm_latest_fail_reptoday | 最近一次还款失败距今天数 | 1:(0,7];2:(7,15];3:(15,30];4:(30,60];5:(60,90];6:(90,120];7:(120,150];8:(150,180];9:(180,360];10:(360,+);-1:未命中 |
|
||||
| ppcm_latest_rep_status | 当前最后一笔还款状态 | 1:成功;2:失败;-1:未命中 |
|
||||
| ppcm_d7_bank_loannum | 近7天在银行的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_loannum | 近7天在消费金融的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_loannum | 近7天在其他机构的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_loannum | 近7天总借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_loannum | 近1个月在银行的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_loannum | 近1个月在消费金融的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_loannum | 近1个月在其他机构的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_loannum | 近1个月总借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_loannum | 近3个月在银行的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_loannum | 近3个月在消费金融的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_loannum | 近3个月在其他机构的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_loannum | 近3个月总借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_loannum | 近6个月在银行的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_loannum | 近6个月在消费金融的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_loannum | 近6个月在其他机构的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_loannum | 近6个月总借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_loannum | 近1年在银行的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_loannum | 近1年在消费金融的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_loannum | 近1年在其他机构的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_loannum | 近1年总借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_loannum | 近2年在银行的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_loannum | 近2年在消费金融的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_loannum | 近2年在其他机构的借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_loannum | 近2年总借款次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_loannum_avg | 近3个月月均借款次数 | >0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_loannum_avg | 近6个月月均借款次数 | >0,四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_bank_loanorg | 近7天在银行的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_loanorg | 近7天在消费金融的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_loanorg | 近7天在其他机构的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_loanorg | 近7天总借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_bank_loanorg | 近1个月在银行的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_loanorg | 近1个月在消费金融的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_loanorg | 近1个月在其他机构的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_loanorg | 近1个月总借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_bank_loanorg | 近3个月在银行的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_loanorg | 近3个月在消费金融的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_loanorg | 近3个月在其他机构的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_loanorg | 近3个月总借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_bank_loanorg | 近6个月在银行的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_loanorg | 近6个月在消费金融的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_loanorg | 近6个月在其他机构的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_loanorg | 近6个月总借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_bank_loanorg | 近1年在银行的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_loanorg | 近1年在消费金融的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_loanorg | 近1年在其他机构的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_loanorg | 近1年总借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_bank_loanorg | 近2年在银行的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_loanorg | 近2年在消费金融的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_loanorg | 近2年在其他机构的借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_loanorg | 近2年总借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_loanorg_new | 近1个月总新增借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_loanorg_new | 近3个月总新增借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_loanorg_new | 近6个月总新增借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_loanorg_new | 近1年总新增借款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_bank_loanamt | 近7天在银行的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_nbank_fin_loanamt | 近7天在消费金融的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_nbank_other_loanamt | 近7天在其他机构的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_loanamt | 近7天借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_bank_loanamt | 近1个月在银行的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_nbank_fin_loanamt | 近1个月在消费金融的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_nbank_other_loanamt | 近1个月在其他机构的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_loanamt | 近1个月借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_bank_loanamt | 近3个月在银行的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_nbank_fin_loanamt | 近3个月在消费金融的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_nbank_other_loanamt | 近3个月在其他机构的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_loanamt | 近3个月借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_bank_loanamt | 近6个月在银行的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_nbank_fin_loanamt | 近6个月在消费金融的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_nbank_other_loanamt | 近6个月在其他机构的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_loanamt | 近6个月借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_bank_loanamt | 近1年在银行的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_nbank_fin_loanamt | 近1年在消费金融的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_nbank_other_loanamt | 近1年在其他机构的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_loanamt | 近1年借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_bank_loanamt | 近2年在银行的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_nbank_fin_loanamt | 近2年在消费金融的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_nbank_other_loanamt | 近2年在其他机构的借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_loanamt | 近2年借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_loanamt_max | 近7天最大借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_loanamt_max | 近1个月最大借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_loanamt_max | 近3个月最大借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_loanamt_max | 近6个月最大借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_loanamt_max | 近1年最大借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_loanamt_max | 近2年最大借款等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_loanday | 近1个月总借款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_loanday | 近3个月总借款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_loanday | 近6个月总借款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_loanday | 近1年总借款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_loanday | 近2年总借款天数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_latest_loantoday | 最近一次借款距今天数 | 1:(0,7];2:(7,15];3:(15,30];4:(30,60];5:(60,90];6:(90,120];7:(120,150];8:(150,180];9:(180,360];10:(360,+);-1:未命中 |
|
||||
| ppcm_d7_cred_succ_repnum | 近7天信用卡还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_succ_repnum | 近1个月信用卡还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_succ_repnum | 近3个月信用卡还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_succ_repnum | 近6个月信用卡还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_succ_repnum | 近1年信用卡还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_cred_succ_repnum | 近2年信用卡还款成功次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_cred_fail_repnum | 近7天信用卡还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_fail_repnum | 近1个月信用卡还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_fail_repnum | 近3个月信用卡还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_fail_repnum | 近6个月信用卡还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_fail_repnum | 近1年信用卡还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_cred_fail_repnum | 近2年信用卡还款失败次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_cred_succ_repamt | 近7天信用卡还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_cred_succ_repamt | 近1个月信用卡还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_cred_succ_repamt | 近3个月信用卡还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_cred_succ_repamt | 近6个月信用卡还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_cred_succ_repamt | 近1年信用卡还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_cred_succ_repamt | 近2年信用卡还款成功等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_cred_fail_repamt | 近7天信用卡还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_cred_fail_repamt | 近1个月信用卡还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_cred_fail_repamt | 近3个月信用卡还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_cred_fail_repamt | 近6个月信用卡还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_cred_fail_repamt | 近1年信用卡还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_cred_fail_repamt | 近2年信用卡还款失败等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_d7_cred_reporg | 近7天信用卡还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_reporg | 近1个月信用卡还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_reporg | 近3个月信用卡还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_reporg | 近6个月信用卡还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_reporg | 近1年信用卡还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_cred_reporg | 近2年信用卡还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_cred_succ_reporg | 近7天信用卡还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_succ_reporg | 近1个月信用卡还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_succ_reporg | 近3个月信用卡还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_succ_reporg | 近6个月信用卡还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_succ_reporg | 近1年信用卡还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_cred_succ_reporg | 近2年信用卡还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_cred_fail_reporg | 近7天信用卡还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_fail_reporg | 近1个月信用卡还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_fail_reporg | 近3个月信用卡还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_fail_reporg | 近6个月信用卡还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_fail_reporg | 近1年信用卡还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_cred_fail_reporg | 近2年信用卡还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_reporg_new | 近1个月信用卡新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_reporg_new | 近3个月信用卡新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_reporg_new | 近6个月信用卡新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_reporg_new | 近1年信用卡新增还款机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_succ_reporg_new | 近1个月信用卡新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_succ_reporg_new | 近3个月信用卡新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_succ_reporg_new | 近6个月信用卡新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_succ_reporg_new | 近1年信用卡新增还款成功机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_cred_fail_reporg_new | 近1个月信用卡新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_cred_fail_reporg_new | 近3个月信用卡新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_cred_fail_reporg_new | 近6个月信用卡新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_cred_fail_reporg_new | 近1年信用卡新增还款失败机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_latest_cred_succ_reptoday | 最近一次信用卡还款成功距今天数 | 1:(0,7];2:(7,15];3:(15,30];4:(30,60];5:(60,90];6:(90,120];7:(120,150];8:(150,180];9:(180,360];10:(360,+);-1:未命中 |
|
||||
| ppcm_latest_cred_fail_reptoday | 最近一次信用卡还款失败距今天数 | 1:(0,7];2:(7,15];3:(15,30];4:(30,60];5:(60,90];6:(90,120];7:(120,150];8:(150,180];9:(180,360];10:(360,+);-1:未命中 |
|
||||
| ppcm_d7_overnum | 近7天总逾期次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_overnum | 近1个月总逾期次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_overnum | 近3个月总逾期次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_overnum | 近6个月总逾期次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_overnum | 近1年总逾期次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_overnum | 近2年总逾期次数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_overorg | 近7天总逾期机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_overorg | 近1个月总逾期机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_overorg | 近3个月总逾期机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_overorg | 近6个月总逾期机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_overorg | 近1年总逾期机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_overorg | 近2年总逾期机构数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_overamt | 近7天逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_overamt | 近1个月逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_overamt | 近3个月逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_overamt | 近6个月逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_overamt | 近1年逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_overamt | 近2年逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_p1_overamt | 近1个月逾期天数30天及以内的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_p1_overamt | 近3个月逾期天数30天及以内的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_p1_overamt | 近6个月逾期天数30天及以内的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_p1_overamt | 近1年逾期天数30天及以内的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_p1_overamt | 近2年逾期天数30天及以内的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_p2_overamt | 近1个月逾期天数30-60天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_p2_overamt | 近3个月逾期天数30-60天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_p2_overamt | 近6个月逾期天数30-60天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_p2_overamt | 近1年逾期天数30-60天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_p2_overamt | 近2年逾期天数30-60天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_p3_overamt | 近1个月逾期天数60-90天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_p3_overamt | 近3个月逾期天数60-90天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_p3_overamt | 近6个月逾期天数60-90天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_p3_overamt | 近1年逾期天数60-90天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_p3_overamt | 近2年逾期天数60-90天的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m1_p4_overamt | 近1个月逾期天数90天以上的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m3_p4_overamt | 近3个月逾期天数90天以上的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m6_p4_overamt | 近6个月逾期天数90天以上的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m12_p4_overamt | 近1年逾期天数90天以上的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_m24_p4_overamt | 近2年逾期天数90天以上的逾期等级 | 1-23,未命中输出-1 |
|
||||
| ppcm_history_cardnum | 历史持有银行卡数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_recent_cardnum | 当前活跃银行卡数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_history_cellnum | 历史持有手机号数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_recent_cellnum | 当前活跃手机号数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_d7_m12_bank_qynum_ratio | 近7天在银行的查验次数/近1年在银行的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_m12_nbank_fin_qynum_ratio | 近7天在消费金融的查验次数/近1年在消费金融的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_m12_nbank_other_qynum_ratio | 近7天在其他机构的查验次数/近1年在其他机构的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_d7_m12_qynum_ratio | 近7天总查验次数/近1年总查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m6_bank_qynum_ratio | 近1个月在银行的查验次数/近6个月在银行的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m6_nbank_fin_qynum_ratio | 近1个月在消费金融的查验次数/近6个月在消费金融的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m6_nbank_other_qynum_ratio | 近1个月在其他机构的查验次数/近6个月在其他机构的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m6_qynum_ratio | 近1个月总查验次数/近6个月总查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_bank_qynum_ratio | 近3个月在银行的查验次数/近1年在银行的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_nbank_fin_qynum_ratio | 近3个月在消费金融的查验次数/近1年在消费金融的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_nbank_other_qynum_ratio | 近3个月在其他机构的查验次数/近1年在其他机构的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_qynum_ratio | 近3个月总查验次数/近1年总查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_bank_qynum_ratio | 近个月在银行的查验次数/近2年在银行的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_nbank_fin_qynum_ratio | 近3个月在消费金融的查验次数/近2年在消费金融的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_nbank_other_qynum_ratio | 近3个月在其他机构的查验次数/近2年在其他机构的查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_qynum_ratio | 近3个月总查验次数/近2年总查验次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_bank_succ_repnum_ratio | 近1个月在银行的还款成功次数/近2年在银行的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_nbank_fin_succ_repnum_ratio | 近1个月在消费金融的还款成功次数/近2年在消费金融的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_nbank_other_succ_repnum_ratio | 近1个月在其他机构的还款成功次数/近2年在其他机构的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_succ_repnum_ratio | 近1个月总还款成功次数/近2年总还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_bank_succ_repnum_ratio | 近3个月在银行的还款成功次数/近2年在银行的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_nbank_fin_succ_repnum_ratio | 近3个月在消费金融的还款成功次数/近2年在消费金融的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_nbank_other_succ_repnum_ratio | 近3个月在其他机构的还款成功次数/近2年在其他机构的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_succ_repnum_ratio | 近3个月总还款成功次数/近2年总还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_bank_succ_repnum_ratio | 近6个月在银行的还款成功次数/近2年在银行的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_nbank_fin_succ_repnum_ratio | 近6个月在消费金融的还款成功次数/近2年在消费金融的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_nbank_other_succ_repnum_ratio | 近6个月在其他机构的还款成功次数/近2年在其他机构的还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_succ_repnum_ratio | 近6个月总还款成功次数/近2年总还款成功次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_bank_fail_repnum_ratio | 近1个月在银行的还款失败次数/近2年在银行的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_nbank_fin_fail_repnum_ratio | 近1个月在消费金融的还款失败次数/近2年在消费金融的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_nbank_other_fail_repnum_ratio | 近1个月在其他机构的还款失败次数/近2年在其他机构的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m24_fail_repnum_ratio | 近1个月总还款失败次数/近2年总还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_bank_fail_repnum_ratio | 近3个月在银行的还款失败次数/近2年在银行的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_nbank_fin_fail_repnum_ratio | 近3个月在消费金融的还款失败次数/近2年在消费金融的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_nbank_other_fail_repnum_ratio | 近3个月在其他机构的还款失败次数/近2年在其他机构的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m24_fail_repnum_ratio | 近3个月总还款失败次数/近2年总还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_bank_fail_repnum_ratio | 近6个月在银行的还款失败次数/近2年在银行的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_nbank_fin_fail_repnum_ratio | 近6个月在消费金融的还款失败次数/近2年在消费金融的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_nbank_other_fail_repnum_ratio | 近6个月在其他机构的还款失败次数/近2年在其他机构的还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m6_m24_fail_repnum_ratio | 近6个月总还款失败次数/近2年总还款失败次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m12_bank_loannum_ratio | 近1个月在银行的借款次数/近1年在银行的借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m12_nbank_fin_loannum_ratio | 近1个月在消费金融的借款次数/近1年在消费金融的借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m12_nbank_other_loannum_ratio | 近1个月在其他机构的借款次数/近1年在其他机构的借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_m12_loannum_ratio | 近1个月总借款次数/近1年总借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_bank_loannum_ratio | 近3个月在银行的借款次数/近1年在银行的借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_nbank_fin_loannum_ratio | 近3个月在消费金融的借款次数/近1年在消费金融的借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_nbank_other_loannum_ratio | 近3个月在其他机构的借款次数/近1年在其他机构的借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m3_m12_loannum_ratio | 近3个月总借款次数/近1年总借款次数 | [0,1],四舍五入保留2位小数,未命中输出-1 |
|
||||
| ppcm_m1_qy_rep_ratio | 近1个月查贷比 | 大于等于0及-1、四舍五入保留2位小数(不足2位小数不补0)、未命中输出-1 |
|
||||
| ppcm_m3_qy_rep_ratio | 近3个月查贷比 | 大于等于0及-1、四舍五入保留2位小数(不足2位小数不补0)、未命中输出-1 |
|
||||
| ppcm_m6_qy_rep_ratio | 近6个月查贷比 | 大于等于0及-1、四舍五入保留2位小数(不足2位小数不补0)、未命中输出-1 |
|
||||
| ppcm_m12_qy_rep_ratio | 近1年查贷比 | 大于等于0及-1、四舍五入保留2位小数(不足2位小数不补0)、未命中输出-1 |
|
||||
| ppcm_d7_allnum | 近7天全部事件数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m1_allnum | 近1个月全部事件数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m3_allnum | 近3个月全部事件数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m6_allnum | 近6个月全部事件数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m12_allnum | 近1年全部事件数 | 取值范围:>0,未命中输出-1 |
|
||||
| ppcm_m24_allnum | 近2年全部事件数 | 取值范围:>0,未命中输出-1 |
|
||||
|
||||
|
||||
|
||||
# 状态码附录
|
||||
|
||||
| 返回状态码 | 说明 |
|
||||
| ---------- | ---------------------- |
|
||||
| 200 | 请求成功 |
|
||||
| 201 | 查询无记录 |
|
||||
| 302 | 业务参数缺失 |
|
||||
| 303 | 参数错误 |
|
||||
| 304 | 请求头参数缺失 |
|
||||
| 305 | 姓名错误 |
|
||||
| 306 | 手机号错误 |
|
||||
| 307 | 身份证号错误 |
|
||||
| 308 | 服务不存在 |
|
||||
| 309 | 服务未开通 |
|
||||
| 310 | 余额不足 |
|
||||
| 311 | 调用远程数据异常 |
|
||||
| 312 | 用户不存在 |
|
||||
| 313 | 用户状态异常 |
|
||||
| 314 | 用户未授权 |
|
||||
| 315 | 白名单错误 |
|
||||
| 316 | timestamp 不合法 |
|
||||
| 317 | timestamp 已过期 |
|
||||
| 318 | 验签失败 |
|
||||
| 319 | 解密失败 |
|
||||
| 500 | 系统异常,请联系管理员 |
|
||||
218
消费交易特征-附件.md
218
消费交易特征-附件.md
@@ -1,218 +0,0 @@
|
||||
# 消费交易特征-附件
|
||||
|
||||
## 消费交易特征
|
||||
|
||||
| 输出内容 | 字段类型 | 解释 |
|
||||
|:-----------|:----------------------------------------------------------------------------------------------------|:---------------------------------------------------|
|
||||
| 参数 | 中文 | nan |
|
||||
| tap001 | 名下常⽤卡数量(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap002 | 名下常⽤⼿机号数量(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap003 | 最近⼀次成功交易时间(年⽉⽇) | 历史上最近一次成功交易的时间 |
|
||||
| tap004 | 最近⼀次成功交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | 历史上最近一次成功交易的金额 |
|
||||
| tap005 | 最近⼀次成功交易⼀级⾏业(详见5.3⾏业码表) | 5.3行业码表 |
|
||||
| tap006 | 初次⽹络交易时间(年⽉) | 初次网络交易的时间,包含支付成功和未成功的交易 |
|
||||
| tap007 | 单⽇最⾼交易额(区间化输出,具体映射见5.2输出字段映射词典) | 历史上单日最大交易额 |
|
||||
| tap008 | 平均单⽇交易额(区间化输出,具体映射见5.2输出字段映射词典) | 历史单日平均交易额 |
|
||||
| tap009 | 最⾼单⽉交易额(区间化输出,具体映射见5.2输出字段映射词典) | 近12个月,单月交易的最大金额 |
|
||||
| tap010 | 平均单⽉交易额(区间化输出,具体映射见5.2输出字段映射词典) | 近12个月,平均单月的交易金额 |
|
||||
| tap011 | 平均单⽉交易笔数(区间化输出,具体映射见5.2输出字段映射词典) | 近12个月,平均单月的交易笔数 |
|
||||
| tap012 | 历史交易订单数(区间化输出,具体映射见5.2输出字段映射词典) | 计算所有支付状态的交易,包含支付成功和未成功的交易 |
|
||||
| tap013 | 历史交易总⾦额(区间化输出,具体映射见5.2输出字段映射词典) | 历史上支付成功的交易总金额 |
|
||||
| tap014 | 过去⼀年发⽣交易⽉份数 | nan |
|
||||
| tap015 | ⽀付成功率:⽀付成功次数/(⽀付成功次数+⽀付失败次数) | nan |
|
||||
| tap016 | 交易笔数最多的⾏业分类(详见5.3⾏业码表) | 5.3行业码表 |
|
||||
| tap017 | 交易⾦额最⾼的⾏业分类(详见5.3⾏业码表) | 5.3行业码表 |
|
||||
| tap018 | ⽣活购物类消费笔数最多的⾦额区间(详见5.4⾦额区间表) | 5.4金额区间表 |
|
||||
| tap019 | 出⾏旅游类消费笔数最多的⾦额区间(详见5.4⾦额区间表) | 5.4金额区间表 |
|
||||
| tap020 | ⾦融及实物投资类消费笔数最多的⾦额区间(详见5.4⾦额区间表) | 5.4金额区间表 |
|
||||
| tap021 | 教育培训类消费笔数最多的⾦额区间(详见5.4⾦额区间表) | 5.4金额区间表 |
|
||||
| tap022 | 娱乐服务类消费笔数最多的⾦额区间(详见5.4⾦额区间表) | 5.4金额区间表 |
|
||||
| tap023 | 其他类消费笔数最多的⾦额区间(详见5.4⾦额区间表) | 5.4金额区间表 |
|
||||
| tap024 | 保险类交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap025 | 房屋租赁类交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap026 | 航旅类交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap027 | 互⾦平台交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap028 | 消费能⼒评分(计算过去12个⽉的消费⾏为评分,200分为过去⼀年⽆成功交易,240分~900分为有成功交易评分) | nan |
|
||||
| tap029 | ⽤户标签(详见5.5⽤户标签表) | nan |
|
||||
| tap030 | 个⼈消费偏好:0-⽆成功交易其他-详见5.3⾏业码表 | 5.3行业码表 |
|
||||
| tap031 | 近3个⽉交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap032 | 近6个⽉交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap033 | 近12个⽉交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap034 | 近3个⽉交易笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap035 | 近6个⽉交易笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap036 | 近12个⽉交易笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap037 | 近3个⽉发⽣交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap038 | 近3个⽉发⽣交易的⼀级⾏业数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap039 | 近3个⽉发⽣交易的⼆级⾏业数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap040 | 近6个⽉发⽣交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap041 | 近6个⽉发⽣交易的⼀级⾏业数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap042 | 近6个⽉发⽣交易的⼆级⾏业数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap043 | 近12个⽉发⽣交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap044 | 近12个⽉发⽣交易的⼀级⾏业数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap045 | 近12个⽉发⽣交易的⼆级⾏业数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap046 | 近12个⽉在⽣活购物类交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap047 | 近12个⽉在出⾏旅游类交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap048 | 近12个⽉在⾦融及实物投资类交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap049 | 近12个⽉在教育培训类交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap050 | 近12个⽉在娱乐服务类交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap051 | 近12个⽉在其他交易的商户数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap052 | 近3个⽉最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap053 | 近6个⽉最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap054 | 近12个⽉最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap055 | 近12个⽉在⽣活购物类的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap056 | 近12个⽉在出⾏旅游类的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap057 | 近12个⽉在⾦融及实物投资类的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap058 | 近12个⽉在教育培训类的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap059 | 近12个⽉在娱乐服务类的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap060 | 近12个⽉在其他的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap061 | 近12个⽉平均单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap062 | 近12个⽉在⽣活购物类的平均单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap063 | 近12个⽉在出⾏旅游类的平均单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap064 | 近12个⽉在⾦融及实物投资类的平均单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap065 | 近12个⽉在教育培训类的平均单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap066 | 近12个⽉在娱乐服务类的平均单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap067 | 近12个⽉在其他的平均单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap068 | 近6个⽉在⽣活购物类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap069 | 近6个⽉在出⾏旅游类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap070 | 近6个⽉在⾦融及实物投资类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap071 | 近6个⽉在教育培训类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap072 | 近6个⽉在娱乐服务类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap073 | 近6个⽉在其他交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap074 | 近6个⽉在⽣活购物类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap075 | 近6个⽉在出⾏旅游类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap076 | 近6个⽉在⾦融及实物投资类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap077 | 近6个⽉在教育培训类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap078 | 近6个⽉在娱乐服务类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap079 | 近6个⽉在其他交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap080 | 近12个⽉在⽣活购物类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap081 | 近12个⽉在出⾏旅游类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap082 | 近12个⽉在⾦融及实物投资类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap083 | 近12个⽉在教育培训类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap084 | 近12个⽉在娱乐服务类交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap085 | 近12个⽉在其他交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap086 | 近12个⽉在⽣活购物类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap087 | 近12个⽉在出⾏旅游类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap088 | 近12个⽉在⾦融及实物投资类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap089 | 近12个⽉在教育培训类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap090 | 近12个⽉在娱乐服务类交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap091 | 近12个⽉在其他交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap092 | 近12个⽉在⼯作⽇⼯作时段交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap093 | 近12个⽉在⼯作⽇⾮⼯作时段交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap094 | 近12个⽉在⾮⼯作⽇交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap095 | 近12个⽉在⼯作⽇⼯作时段交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap096 | 近12个⽉在⼯作⽇⾮⼯作时段交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap097 | 近12个⽉在⾮⼯作⽇交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap098 | 近6个⽉使⽤借记卡交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap099 | 近6个⽉使⽤贷记卡交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap100 | 近12个⽉使⽤借记卡交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap101 | 近12个⽉使⽤贷记卡交易的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap102 | 近6个⽉使⽤借记卡交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap103 | 近6个⽉使⽤贷记卡交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap104 | 近12个⽉使⽤借记卡交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap105 | 近12个⽉使⽤贷记卡交易的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap106 | 近12个⽉使⽤借记卡的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap107 | 近12个⽉使⽤贷记卡的最⾼单笔交易⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap108 | 近12个⽉消费⾦额在[0,50]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap109 | 近12个⽉消费⾦额在(50,200]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap110 | 近12个⽉消费⾦额在(200,1000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap111 | 近12个⽉消费⾦额在(1000,5000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap112 | 近12个⽉消费⾦额在(5000,10000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap113 | 近12个⽉消费⾦额在10000+的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap114 | 近12个⽉使⽤借记卡在⽣活购物类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap115 | 近12个⽉使⽤借记卡在出⾏旅游类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap116 | 近12个⽉使⽤借记卡在⾦融及实物投资类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap117 | 近12个⽉使⽤借记卡在教育培训类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap118 | 近12个⽉使⽤借记卡在娱乐服务类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap119 | 近12个⽉使⽤借记卡在其他消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap120 | 近12个⽉使⽤贷记卡在⽣活购物类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap121 | 近12个⽉使⽤贷记卡在出⾏旅游类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap122 | 近12个⽉使⽤贷记卡在⾦融及实物投资类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap123 | 近12个⽉使⽤贷记卡在教育培训类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap124 | 近12个⽉使⽤贷记卡在娱乐服务类消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap125 | 近12个⽉使⽤贷记卡在其他消费的⾦额(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap126 | 近12个⽉在⽣活购物类交易的⾦额在[0,50]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap127 | 近12个⽉在⽣活购物类交易的⾦额在(50,200]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap128 | 近12个⽉在⽣活购物类交易的⾦额在(200,1000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap129 | 近12个⽉在⽣活购物类交易的⾦额在(1000,5000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap130 | 近12个⽉在⽣活购物类交易的⾦额在(5000,10000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap131 | 近12个⽉在⽣活购物类交易的⾦额在10000+的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap132 | 近12个⽉在出⾏旅游类交易的⾦额在[0,50]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap133 | 近12个⽉在出⾏旅游类交易的⾦额在(50,200]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap134 | 近12个⽉在出⾏旅游类交易的⾦额在(200,1000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap135 | 近12个⽉在出⾏旅游类交易的⾦额在(1000,5000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap136 | 近12个⽉在出⾏旅游类交易的⾦额在(5000,10000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap137 | 近12个⽉在出⾏旅游类交易的⾦额在10000+的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap138 | 近12个⽉在⾦融及实物投资类交易的⾦额在[0,50]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap139 | 近12个⽉在⾦融及实物投资类交易的⾦额在(50,200]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap140 | 近12个⽉在⾦融及实物投资类交易的⾦额在(200,1000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap141 | 近12个⽉在⾦融及实物投资类交易的⾦额在(1000,5000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap142 | 近12个⽉在⾦融及实物投资类交易的⾦额在(5000,10000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap143 | 近12个⽉在⾦融及实物投资类交易的⾦额在10000+的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap144 | 近12个⽉在教育培训类交易的⾦额在[0,50]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap145 | 近12个⽉在教育培训类交易的⾦额在(50,200]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap146 | 近12个⽉在教育培训类交易的⾦额在(200,1000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap147 | 近12个⽉在教育培训类交易的⾦额在(1000,5000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap148 | 近12个⽉在教育培训类交易的⾦额在(5000,10000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap149 | 近12个⽉在教育培训类交易的⾦额在10000+的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap150 | 近12个⽉在娱乐服务类交易的⾦额在[0,50]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap151 | 近12个⽉在娱乐服务类交易的⾦额在(50,200]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap152 | 近12个⽉在娱乐服务类交易的⾦额在(200,1000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap153 | 近12个⽉在娱乐服务类交易的⾦额在(1000,5000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap154 | 近12个⽉在娱乐服务类交易的⾦额在(5000,10000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap155 | 近12个⽉在娱乐服务类交易的⾦额在10000+的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap156 | 近12个⽉在其他交易的⾦额在[0,50]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap157 | 近12个⽉在其他交易的⾦额在(50,200]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap158 | 近12个⽉在其他交易的⾦额在(200,1000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap159 | 近12个⽉在其他交易的⾦额在(1000,5000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap160 | 近12个⽉在其他交易的⾦额在(5000,10000]的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
| tap161 | 近12个⽉在其他交易的⾦额在10000+的笔数(区间化输出,具体映射见5.2输出字段映射词典) | nan |
|
||||
|
||||
## 5.2 输出字段映射词典
|
||||
|
||||
| 字段名称 | 字段代码 | 数据类型 | 说明 | 备注 | 示例 | 其他 |
|
||||
|:-----------|:-----------|:---------------------------------|-------:|:-------|:-------|:-----------|
|
||||
| 变量名 | 输出值 | 原始值区间范围(⾦额区间单位:元) | nan | 变量名 | 输出值 | 阈值范围 |
|
||||
| tap001 | 1 | (0,2) | nan | tap134 | 1 | (0,3] |
|
||||
| nan | 2 | [2,3) | nan | nan | 2 | (3,5] |
|
||||
| nan | 3 | [3,Inf) | nan | nan | 3 | (5,8] |
|
||||
| nan | 1 | (0,3] | nan | nan | 4 | (8,10] |
|
||||
| tap002 | 2 | (3,5] | nan | nan | 5 | (10,15] |
|
||||
| nan | 3 | (5,8] | nan | nan | 6 | (15,20] |
|
||||
| nan | 4 | (8,10] | nan | nan | 7 | (20,30] |
|
||||
| nan | 5 | (10,15] | nan | nan | 8 | (30,50] |
|
||||
| nan | 6 | (15,20] | nan | nan | 9 | (50,100] |
|
||||
| nan | 7 | (20,30] | nan | nan | 10 | (100,200] |
|
||||
| nan | 8 | (30,50] | nan | nan | 11 | (200,500] |
|
||||
| nan | 9 | (50,100] | nan | nan | 12 | (500,1000] |
|
||||
| nan | 10 | (100,200] | nan | nan | 13 | (1000,Inf) |
|
||||
| nan | 11 | (200,500] | nan | tap135 | 1 | (0,3] |
|
||||
| nan | 12 | (500,1000] | nan | nan | 2 | (3,5] |
|
||||
| nan | 13 | (1000,Inf) | nan | nan | 3 | (5,8] |
|
||||
| tap004 | 1 | (0,100) | nan | nan | 4 | (8,10] |
|
||||
| nan | 2 | [100,500) | nan | nan | 5 | (10,15] |
|
||||
| nan | 3 | [500,2000) | nan | nan | 6 | (15,20] |
|
||||
| nan | 4 | [2000,Inf) | nan | nan | 7 | (20,30] |
|
||||
| tap007 | 1 | (0,500) | nan | nan | 8 | (30,50] |
|
||||
| nan | 2 | [500,1000) | nan | nan | 9 | (50,100] |
|
||||
| nan | 3 | [1000,2000) | nan | nan | 10 | (100,200] |
|
||||
| nan | 4 | [2000,2500) | nan | nan | 11 | (200,500] |
|
||||
| nan | 5 | [2500,Inf) | nan | nan | 12 | (500,1000] |
|
||||
| tap008 | 1 | (0,100) | nan | nan | 13 | (1000,Inf) |
|
||||
| nan | 2 | [100,1700) | nan | tap136 | 1 | (0,3] |
|
||||
| nan | 3 | [1700,Inf) | nan | nan | 2 | (3,5] |
|
||||
| tap009 | 1 | (0,1000) | nan | nan | 3 | (5,8] |
|
||||
|
||||
## 补充表
|
||||
|
||||
| 行业码表 | 行业代码 | 行业描述 | 金额区间表 | 金额区间代码 | 金额区间描述 | 用户标签 | 标签描述 |
|
||||
|:-----------|:-----------------|-----------:|:-------------|:---------------|---------------:|:-----------|:-------------------------|
|
||||
| 值 | 描述 | nan | 值 | 描述 | nan | 值 | 描述 |
|
||||
| SHOP | ⽣活购物类 | nan | A | (10000,Inf) | nan | A | 低价值⽇间交易⽤户 |
|
||||
| TRV | 出⾏旅游类 | nan | B | (5000,10000] | nan | B | ⾼频低价值⽇间交易⽤户 |
|
||||
| FIN | ⾦融及实物投资类 | nan | C | (1000,5000] | nan | C | 低频⾼价值⽇间交易⽤户 |
|
||||
| EDU | 教育培训类 | nan | D | (200,1000] | nan | D | ⾼价值⽇间交易⽤户 |
|
||||
| ENT | 娱乐服务类 | nan | E | (50,200] | nan | E | 低价值⾮⽇间交易⽤户 |
|
||||
| OTH | 其他 | nan | F | [0,50] | nan | F | ⾼频低价值⾮⽇间交易⽤户 |
|
||||
| nan | nan | nan | nan | nan | nan | G | 低频⾼价值⾮⽇间交易⽤户 |
|
||||
| nan | nan | nan | nan | nan | nan | H | 低价值⽇间交易⽤户 |
|
||||
|
||||
Reference in New Issue
Block a user