1164 lines
36 KiB
HTML
1164 lines
36 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>供应链金融数据价值分析 - 可信数据空间</title>
|
||
<!-- Bootstrap 5 CSS -->
|
||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||
<!-- Font Awesome -->
|
||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
|
||
<!-- 自定义样式 -->
|
||
<link href="../../assets/css/style.css" rel="stylesheet">
|
||
<!-- 组件样式 -->
|
||
<link rel="stylesheet" href="../../assets/css/components/header.css">
|
||
<link rel="stylesheet" href="../../assets/css/components/footer.css">
|
||
<!-- 页面样式 -->
|
||
<link rel="stylesheet" href="../../assets/css/pages/bi-dashboard.css">
|
||
<style>
|
||
:root {
|
||
--flow-line-color: #E2E8F0;
|
||
--node-primary: #3B82F6;
|
||
--node-success: #10B981;
|
||
--node-warning: #F59E0B;
|
||
--node-danger: #EF4444;
|
||
}
|
||
|
||
.flow-container {
|
||
position: relative;
|
||
padding: 2rem;
|
||
margin: 2rem 0;
|
||
background: white;
|
||
border-radius: 12px;
|
||
min-height: 400px;
|
||
}
|
||
|
||
.flow-node {
|
||
position: relative;
|
||
padding: 1rem;
|
||
border-radius: 8px;
|
||
background: white;
|
||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||
margin: 1rem 0;
|
||
transition: transform 0.3s;
|
||
}
|
||
|
||
.flow-node:hover {
|
||
transform: translateY(-3px);
|
||
}
|
||
|
||
.flow-line {
|
||
position: absolute;
|
||
background: var(--flow-line-color);
|
||
z-index: 0;
|
||
}
|
||
|
||
.flow-line-horizontal {
|
||
height: 2px;
|
||
}
|
||
|
||
.flow-line-vertical {
|
||
width: 2px;
|
||
}
|
||
|
||
.flow-arrow {
|
||
position: absolute;
|
||
color: var(--flow-line-color);
|
||
font-size: 1.2rem;
|
||
}
|
||
|
||
.flow-stage {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
position: relative;
|
||
margin-bottom: 3rem;
|
||
}
|
||
|
||
.flow-stage:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.node-metrics {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
margin-top: 1rem;
|
||
padding-top: 1rem;
|
||
border-top: 1px solid #E2E8F0;
|
||
}
|
||
|
||
.metric-item {
|
||
text-align: center;
|
||
}
|
||
|
||
.metric-value {
|
||
font-size: 1.2rem;
|
||
font-weight: bold;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.metric-label {
|
||
font-size: 0.8rem;
|
||
color: #64748B;
|
||
}
|
||
|
||
.chart-container {
|
||
height: 200px;
|
||
margin-top: 1rem;
|
||
}
|
||
|
||
.node-header {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.node-header i {
|
||
margin-right: 0.5rem;
|
||
font-size: 1.2rem;
|
||
}
|
||
|
||
.node-title {
|
||
margin: 0;
|
||
font-size: 1rem;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.node-status {
|
||
margin-left: auto;
|
||
padding: 0.25rem 0.5rem;
|
||
border-radius: 4px;
|
||
font-size: 0.8rem;
|
||
}
|
||
|
||
.status-active {
|
||
background: rgba(59, 130, 246, 0.1);
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.bi-header {
|
||
text-align: center;
|
||
padding: 2rem 0;
|
||
background: linear-gradient(135deg, #1a365d 0%, #2a4365 100%);
|
||
color: white;
|
||
border-radius: 12px;
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.bi-title {
|
||
font-size: 2.5rem;
|
||
font-weight: bold;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.bi-subtitle {
|
||
font-size: 1.2rem;
|
||
opacity: 0.8;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.bi-meta {
|
||
font-size: 0.9rem;
|
||
opacity: 0.6;
|
||
}
|
||
|
||
.bi-meta span {
|
||
margin: 0 1rem;
|
||
}
|
||
|
||
.time-selector {
|
||
text-align: center;
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.time-selector .btn {
|
||
margin: 0 0.5rem;
|
||
}
|
||
|
||
.supply-chain-flow {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
padding: 2rem;
|
||
position: relative;
|
||
}
|
||
|
||
.chain-node {
|
||
flex: 1;
|
||
padding: 1.5rem;
|
||
background: white;
|
||
border-radius: 12px;
|
||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||
position: relative;
|
||
margin: 0 1rem;
|
||
}
|
||
|
||
.node-icon {
|
||
font-size: 2rem;
|
||
margin-bottom: 1rem;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.node-info h3 {
|
||
font-size: 1.2rem;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.node-stats {
|
||
display: flex;
|
||
justify-content: space-around;
|
||
}
|
||
|
||
.stat-item {
|
||
text-align: center;
|
||
}
|
||
|
||
.stat-value {
|
||
display: block;
|
||
font-size: 1.5rem;
|
||
font-weight: bold;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.stat-label {
|
||
font-size: 0.8rem;
|
||
color: #64748B;
|
||
}
|
||
|
||
.data-flow-indicator {
|
||
position: absolute;
|
||
right: -2rem;
|
||
top: 50%;
|
||
transform: translateY(-50%);
|
||
z-index: 1;
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
}
|
||
|
||
.flow-arrow {
|
||
font-size: 2rem;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.flow-value {
|
||
font-size: 0.8rem;
|
||
color: #64748B;
|
||
}
|
||
|
||
@keyframes flowAnimation {
|
||
0% { opacity: 0.3; }
|
||
50% { opacity: 1; }
|
||
100% { opacity: 0.3; }
|
||
}
|
||
|
||
.data-flow-indicator {
|
||
animation: flowAnimation 2s infinite;
|
||
}
|
||
|
||
/* 数据质量监控样式 */
|
||
.quality-monitor-section {
|
||
background: white;
|
||
border-radius: 12px;
|
||
padding: 1.5rem;
|
||
margin: 2rem 0;
|
||
}
|
||
|
||
.section-title {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 1.5rem;
|
||
}
|
||
|
||
.section-title i {
|
||
margin-right: 0.5rem;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.quality-score {
|
||
margin-left: auto;
|
||
background: rgba(59, 130, 246, 0.1);
|
||
color: var(--node-primary);
|
||
padding: 0.5rem 1rem;
|
||
border-radius: 20px;
|
||
font-size: 0.9rem;
|
||
}
|
||
|
||
.quality-card {
|
||
background: #f8fafc;
|
||
border-radius: 8px;
|
||
padding: 1rem;
|
||
height: 100%;
|
||
}
|
||
|
||
.quality-header {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 1rem;
|
||
color: #1e293b;
|
||
}
|
||
|
||
.quality-header i {
|
||
margin-right: 0.5rem;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.progress-ring {
|
||
text-align: center;
|
||
margin-bottom: 1rem;
|
||
position: relative;
|
||
width: 80px;
|
||
height: 80px;
|
||
margin: 0 auto 1rem;
|
||
background: conic-gradient(
|
||
var(--node-primary) calc(var(--progress) * 1%),
|
||
#e2e8f0 0
|
||
);
|
||
border-radius: 50%;
|
||
}
|
||
|
||
.progress-value {
|
||
font-size: 1.2rem;
|
||
font-weight: bold;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.progress-label {
|
||
font-size: 0.8rem;
|
||
color: #64748b;
|
||
}
|
||
|
||
.quality-stats {
|
||
margin-top: 1rem;
|
||
}
|
||
|
||
.stat-row {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
margin-bottom: 0.5rem;
|
||
font-size: 0.9rem;
|
||
}
|
||
|
||
.stat-row .value {
|
||
font-weight: 500;
|
||
color: var(--node-primary);
|
||
}
|
||
|
||
.quality-trend-chart {
|
||
margin-top: 2rem;
|
||
height: 300px;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<!-- 网格背景 -->
|
||
<div class="grid-background"></div>
|
||
|
||
<div class="container-fluid py-3">
|
||
<!-- BI看板头部 -->
|
||
<div class="bi-header">
|
||
<div class="header-content">
|
||
<div class="d-flex justify-content-between align-items-center">
|
||
<h1 class="bi-title">供应链金融数据价值分析</h1>
|
||
<div class="time-selector">
|
||
<div class="btn-group" role="group">
|
||
<button type="button" class="btn btn-primary active">今日</button>
|
||
<button type="button" class="btn btn-primary">本周</button>
|
||
<button type="button" class="btn btn-primary">本月</button>
|
||
<button type="button" class="btn btn-primary">本季度</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="bi-meta">
|
||
<span><i class="far fa-clock"></i> 更新时间:2024-01-18 10:30:45</span>
|
||
<span><i class="far fa-calendar-alt"></i> 统计周期:近30天</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Tab导航 -->
|
||
<div class="bi-tabs">
|
||
<div class="nav-wrapper">
|
||
<nav class="nav nav-tabs">
|
||
<a class="nav-link active" data-bs-toggle="tab" href="#revenue">
|
||
<i class="fas fa-chart-line"></i>
|
||
数据收益分析
|
||
</a>
|
||
<a class="nav-link" data-bs-toggle="tab" href="#catalog">
|
||
<i class="fas fa-database"></i>
|
||
数据资源目录
|
||
</a>
|
||
<a class="nav-link" data-bs-toggle="tab" href="#usage">
|
||
<i class="fas fa-users"></i>
|
||
数据使用统计
|
||
</a>
|
||
<a class="nav-link" data-bs-toggle="tab" href="#security">
|
||
<i class="fas fa-shield-alt"></i>
|
||
安全合规监控
|
||
</a>
|
||
</nav>
|
||
</div>
|
||
|
||
<!-- Tab内容 -->
|
||
<div class="tab-content">
|
||
<!-- 数据收益分析 -->
|
||
<div class="tab-pane fade show active" id="revenue">
|
||
<div class="row g-3">
|
||
<!-- 收益概览卡片 -->
|
||
<div class="col-md-3">
|
||
<div class="metric-card">
|
||
<div class="metric-value">¥ 1,234,567</div>
|
||
<div class="metric-label">本月数据收益</div>
|
||
<div class="metric-trend up">
|
||
<i class="fas fa-arrow-up"></i>
|
||
12.5%
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<!-- 更多收益指标卡片 -->
|
||
</div>
|
||
|
||
<!-- 收益分配图表 -->
|
||
<div class="row g-3 mt-3">
|
||
<div class="col-md-8">
|
||
<div class="chart-container">
|
||
<!-- 收益分配趋势图 -->
|
||
</div>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<div class="chart-container">
|
||
<!-- 收益分配饼图 -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 供应方明细表格 -->
|
||
<div class="data-table-section mt-4">
|
||
<h3 class="section-title">供应方收益明细</h3>
|
||
<div class="data-table-wrapper">
|
||
<table class="data-table">
|
||
<!-- 表格内容 -->
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 数据资源目录 -->
|
||
<div class="tab-pane fade" id="catalog">
|
||
<!-- 数据目录搜索 -->
|
||
<div class="catalog-search">
|
||
<div class="search-box">
|
||
<i class="fas fa-search"></i>
|
||
<input type="text" placeholder="搜索数据表或字段...">
|
||
</div>
|
||
<div class="filter-tags">
|
||
<!-- 筛选标签 -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 数据目录列表 -->
|
||
<div class="catalog-list">
|
||
<!-- 数据表卡片 -->
|
||
</div>
|
||
|
||
<!-- 数据字典 -->
|
||
<div class="data-dictionary">
|
||
<!-- 字典内容 -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 数据使用统计 -->
|
||
<div class="tab-pane fade" id="usage">
|
||
<!-- 使用量趋势 -->
|
||
<div class="usage-trends">
|
||
<!-- 趋势图表 -->
|
||
</div>
|
||
|
||
<!-- 用户分析 -->
|
||
<div class="user-analysis">
|
||
<!-- 用户分析图表 -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 安全合规监控 -->
|
||
<div class="tab-pane fade" id="security">
|
||
<!-- 风险预警 -->
|
||
<div class="risk-alerts">
|
||
<!-- 预警列表 -->
|
||
</div>
|
||
|
||
<!-- 合规检查 -->
|
||
<div class="compliance-checks">
|
||
<!-- 合规检查结果 -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 脚本引用 -->
|
||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
|
||
<script src="../../assets/js/common/components.js"></script>
|
||
<script src="../../assets/js/pages/bi.js"></script>
|
||
<script>
|
||
// 初始化图表
|
||
const dataValueChart = echarts.init(document.getElementById('dataValueChart'));
|
||
const contributionChart = echarts.init(document.getElementById('contributionChart'));
|
||
const businessValueChart = echarts.init(document.getElementById('businessValueChart'));
|
||
|
||
// 数据要素价值分配图表配置
|
||
const dataValueOption = {
|
||
tooltip: {
|
||
trigger: 'item',
|
||
formatter: '{b}: {c} ({d}%)'
|
||
},
|
||
legend: {
|
||
orient: 'vertical',
|
||
right: 10,
|
||
top: 'center'
|
||
},
|
||
series: [{
|
||
type: 'pie',
|
||
radius: ['40%', '70%'],
|
||
avoidLabelOverlap: false,
|
||
itemStyle: {
|
||
borderRadius: 10,
|
||
borderColor: '#fff',
|
||
borderWidth: 2
|
||
},
|
||
label: {
|
||
show: false
|
||
},
|
||
data: [
|
||
{value: 35, name: '原始数据提供方'},
|
||
{value: 25, name: '数据清洗加工方'},
|
||
{value: 20, name: '数据标注方'},
|
||
{value: 15, name: '算法模型贡献方'},
|
||
{value: 5, name: '其他'}
|
||
]
|
||
}]
|
||
};
|
||
|
||
// 渲染图表
|
||
dataValueChart.setOption(dataValueOption);
|
||
|
||
// 新增图表初始化
|
||
const creditScoreChart = echarts.init(document.getElementById('creditScoreChart'));
|
||
const riskTrendChart = echarts.init(document.getElementById('riskTrendChart'));
|
||
const heatmapChart = echarts.init(document.getElementById('heatmapChart'));
|
||
const supplierValueChart = echarts.init(document.getElementById('supplierValueChart'));
|
||
const blockchainChart = echarts.init(document.getElementById('blockchainChart'));
|
||
|
||
// 企业信用评分分布图表配置
|
||
const creditScoreOption = {
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
axisPointer: {
|
||
type: 'shadow'
|
||
}
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '4%',
|
||
bottom: '3%',
|
||
containLabel: true
|
||
},
|
||
xAxis: {
|
||
type: 'category',
|
||
data: ['AAA', 'AA', 'A', 'BBB', 'BB', 'B', 'CCC']
|
||
},
|
||
yAxis: {
|
||
type: 'value'
|
||
},
|
||
series: [{
|
||
name: '企业数量',
|
||
type: 'bar',
|
||
data: [120, 200, 150, 80, 70, 110, 30],
|
||
itemStyle: {
|
||
color: function(params) {
|
||
const colorList = ['#67e0e3', '#37a2da', '#9fe6b8', '#ffdb5c', '#ff9f7f', '#fb7293', '#e062ae'];
|
||
return colorList[params.dataIndex];
|
||
}
|
||
}
|
||
}]
|
||
};
|
||
|
||
// 风险指标趋势图表配置
|
||
const riskTrendOption = {
|
||
tooltip: {
|
||
trigger: 'axis'
|
||
},
|
||
legend: {
|
||
data: ['逾期率', '不良率', '代偿率', '回收率']
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '4%',
|
||
bottom: '3%',
|
||
containLabel: true
|
||
},
|
||
xAxis: {
|
||
type: 'category',
|
||
boundaryGap: false,
|
||
data: ['1月', '2月', '3月', '4月', '5月', '6月']
|
||
},
|
||
yAxis: {
|
||
type: 'value',
|
||
axisLabel: {
|
||
formatter: '{value}%'
|
||
}
|
||
},
|
||
series: [{
|
||
name: '逾期率',
|
||
type: 'line',
|
||
data: [3.2, 3.5, 3.1, 2.8, 2.9, 2.7]
|
||
}, {
|
||
name: '不良率',
|
||
type: 'line',
|
||
data: [1.8, 1.9, 1.7, 1.6, 1.5, 1.4]
|
||
}, {
|
||
name: '代偿率',
|
||
type: 'line',
|
||
data: [0.8, 0.9, 0.7, 0.6, 0.5, 0.4]
|
||
}, {
|
||
name: '回收率',
|
||
type: 'line',
|
||
data: [85, 83, 86, 87, 88, 89]
|
||
}]
|
||
};
|
||
|
||
// 数据使用热力图配置
|
||
const heatmapOption = {
|
||
tooltip: {
|
||
position: 'top'
|
||
},
|
||
grid: {
|
||
top: '15%'
|
||
},
|
||
xAxis: {
|
||
type: 'category',
|
||
data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
|
||
splitArea: {
|
||
show: true
|
||
}
|
||
},
|
||
yAxis: {
|
||
type: 'category',
|
||
data: ['上午', '下午', '晚上'],
|
||
splitArea: {
|
||
show: true
|
||
}
|
||
},
|
||
visualMap: {
|
||
min: 0,
|
||
max: 100,
|
||
calculable: true,
|
||
orient: 'horizontal',
|
||
left: 'center',
|
||
top: '0'
|
||
},
|
||
series: [{
|
||
name: '数据调用量',
|
||
type: 'heatmap',
|
||
data: [
|
||
// 示例数据
|
||
[0, 0, 85], [0, 1, 90], [0, 2, 40],
|
||
[1, 0, 75], [1, 1, 80], [1, 2, 35],
|
||
[2, 0, 65], [2, 1, 70], [2, 2, 30]
|
||
// ... 更多数据点
|
||
],
|
||
label: {
|
||
show: true
|
||
},
|
||
emphasis: {
|
||
itemStyle: {
|
||
shadowBlur: 10,
|
||
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||
}
|
||
}
|
||
}]
|
||
};
|
||
|
||
// 渲染新增图表
|
||
creditScoreChart.setOption(creditScoreOption);
|
||
riskTrendChart.setOption(riskTrendOption);
|
||
heatmapChart.setOption(heatmapOption);
|
||
|
||
// 数据价值贡献度分析配置
|
||
const contributionOption = {
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
axisPointer: {
|
||
type: 'shadow'
|
||
}
|
||
},
|
||
legend: {
|
||
data: ['权重']
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '4%',
|
||
bottom: '3%',
|
||
containLabel: true
|
||
},
|
||
xAxis: {
|
||
type: 'value',
|
||
max: 100
|
||
},
|
||
yAxis: {
|
||
type: 'category',
|
||
data: ['数据新鲜度', '数据质量', '数据唯一性', '数据规模', '数据完整性']
|
||
},
|
||
series: [{
|
||
name: '权重',
|
||
type: 'bar',
|
||
data: [85, 92, 78, 65, 88],
|
||
label: {
|
||
show: true,
|
||
position: 'right',
|
||
formatter: '{c}%'
|
||
},
|
||
itemStyle: {
|
||
color: function(params) {
|
||
const colorList = ['#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6'];
|
||
return colorList[params.dataIndex];
|
||
}
|
||
}
|
||
}]
|
||
};
|
||
|
||
// 业务价值分配配置
|
||
const businessValueOption = {
|
||
tooltip: {
|
||
trigger: 'item',
|
||
formatter: '{b}: {c}%'
|
||
},
|
||
legend: {
|
||
orient: 'vertical',
|
||
left: 'left',
|
||
},
|
||
series: [{
|
||
type: 'pie',
|
||
radius: '50%',
|
||
data: [
|
||
{value: 35, name: '核心企业'},
|
||
{value: 30, name: '金融机构'},
|
||
{value: 20, name: '供应商/经销商'},
|
||
{value: 15, name: '平台运营方'}
|
||
],
|
||
emphasis: {
|
||
itemStyle: {
|
||
shadowBlur: 10,
|
||
shadowOffsetX: 0,
|
||
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||
}
|
||
},
|
||
itemStyle: {
|
||
borderRadius: 10,
|
||
borderColor: '#fff',
|
||
borderWidth: 2
|
||
}
|
||
}]
|
||
};
|
||
|
||
// 数据供应方价值面板配置(更新现有配置)
|
||
const supplierValueOption = {
|
||
tooltip: {
|
||
trigger: 'item'
|
||
},
|
||
legend: {
|
||
bottom: '0%'
|
||
},
|
||
radar: {
|
||
radius: '60%',
|
||
indicator: [
|
||
{name: '数据质量', max: 100},
|
||
{name: '使用频次', max: 100},
|
||
{name: '收益贡献', max: 100},
|
||
{name: '行业影响', max: 100},
|
||
{name: '生态贡献', max: 100}
|
||
],
|
||
splitArea: {
|
||
areaStyle: {
|
||
color: ['#f8f9fa', '#e9ecef', '#dee2e6', '#ced4da', '#adb5bd']
|
||
}
|
||
}
|
||
},
|
||
series: [{
|
||
name: '供应方价值评估',
|
||
type: 'radar',
|
||
data: [{
|
||
value: [85, 90, 75, 80, 70],
|
||
name: '综合评分',
|
||
areaStyle: {
|
||
color: 'rgba(59, 130, 246, 0.2)'
|
||
},
|
||
lineStyle: {
|
||
color: '#3B82F6'
|
||
},
|
||
itemStyle: {
|
||
color: '#3B82F6'
|
||
}
|
||
}]
|
||
}]
|
||
};
|
||
|
||
// 区块链存证记录配置(更新现有配置)
|
||
const blockchainOption = {
|
||
tooltip: {
|
||
trigger: 'item',
|
||
formatter: function(params) {
|
||
return `${params.name}<br/>时间:${params.value[0]}<br/>类型:${params.value[1]}`;
|
||
}
|
||
},
|
||
legend: {
|
||
data: ['数据使用', '收益分配', '权限变更'],
|
||
bottom: '0'
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '4%',
|
||
bottom: '15%',
|
||
containLabel: true
|
||
},
|
||
xAxis: {
|
||
type: 'time',
|
||
splitLine: {
|
||
show: false
|
||
}
|
||
},
|
||
yAxis: {
|
||
type: 'category',
|
||
data: ['数据使用', '收益分配', '权限变更'],
|
||
splitLine: {
|
||
show: false
|
||
}
|
||
},
|
||
series: [{
|
||
name: '存证记录',
|
||
type: 'scatter',
|
||
symbolSize: 12,
|
||
data: [
|
||
{
|
||
value: ['2024-01-15 10:00:00', '数据使用'],
|
||
itemStyle: {color: '#10B981'}
|
||
},
|
||
{
|
||
value: ['2024-01-15 14:30:00', '收益分配'],
|
||
itemStyle: {color: '#3B82F6'}
|
||
},
|
||
{
|
||
value: ['2024-01-16 09:15:00', '权限变更'],
|
||
itemStyle: {color: '#F59E0B'}
|
||
},
|
||
{
|
||
value: ['2024-01-16 15:45:00', '数据使用'],
|
||
itemStyle: {color: '#10B981'}
|
||
},
|
||
{
|
||
value: ['2024-01-17 11:20:00', '收益分配'],
|
||
itemStyle: {color: '#3B82F6'}
|
||
}
|
||
]
|
||
}]
|
||
};
|
||
|
||
// 模型迭代效果分析配置
|
||
const modelIterationOption = {
|
||
tooltip: {
|
||
trigger: 'axis'
|
||
},
|
||
legend: {
|
||
data: ['AUC', 'KS', 'PSI']
|
||
},
|
||
xAxis: {
|
||
type: 'category',
|
||
data: ['V1.0', 'V1.1', 'V1.2', 'V2.0', 'V2.1']
|
||
},
|
||
yAxis: {
|
||
type: 'value',
|
||
splitLine: {
|
||
show: false
|
||
}
|
||
},
|
||
series: [{
|
||
name: 'AUC',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [0.75, 0.78, 0.82, 0.85, 0.87]
|
||
}, {
|
||
name: 'KS',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [0.35, 0.38, 0.42, 0.45, 0.48]
|
||
}, {
|
||
name: 'PSI',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [0.15, 0.12, 0.10, 0.08, 0.07]
|
||
}]
|
||
};
|
||
|
||
// 渲染所有图表
|
||
contributionChart.setOption(contributionOption);
|
||
businessValueChart.setOption(businessValueOption);
|
||
supplierValueChart.setOption(supplierValueOption);
|
||
blockchainChart.setOption(blockchainOption);
|
||
|
||
// 初始化新图表
|
||
const modelIterationChart = echarts.init(document.getElementById('modelIterationChart'));
|
||
const modelTrainingChart = echarts.init(document.getElementById('modelTrainingChart'));
|
||
|
||
// 渲染模型相关图表
|
||
modelIterationChart.setOption(modelIterationOption);
|
||
|
||
// 模型训练监控配置
|
||
const modelTrainingOption = {
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
axisPointer: {
|
||
type: 'cross'
|
||
}
|
||
},
|
||
legend: {
|
||
data: ['样本规模', '特征覆盖率', '数据质量分布', 'GPU使用率'],
|
||
top: 10
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '4%',
|
||
bottom: '3%',
|
||
containLabel: true
|
||
},
|
||
xAxis: [
|
||
{
|
||
type: 'category',
|
||
boundaryGap: false,
|
||
data: ['1月', '2月', '3月', '4月', '5月', '6月'],
|
||
axisLine: {
|
||
lineStyle: {
|
||
color: '#666'
|
||
}
|
||
}
|
||
}
|
||
],
|
||
yAxis: [
|
||
{
|
||
type: 'value',
|
||
name: '数量/比率',
|
||
min: 0,
|
||
max: 100,
|
||
position: 'left',
|
||
axisLabel: {
|
||
formatter: '{value}%'
|
||
}
|
||
},
|
||
{
|
||
type: 'value',
|
||
name: '样本规模',
|
||
min: 0,
|
||
max: 1000000,
|
||
position: 'right',
|
||
axisLabel: {
|
||
formatter: function(value) {
|
||
return (value/10000).toFixed(1) + '万';
|
||
}
|
||
}
|
||
}
|
||
],
|
||
series: [
|
||
{
|
||
name: '样本规模',
|
||
type: 'bar',
|
||
yAxisIndex: 1,
|
||
data: [450000, 520000, 580000, 650000, 750000, 850000],
|
||
itemStyle: {
|
||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||
{offset: 0, color: '#83bff6'},
|
||
{offset: 0.5, color: '#188df0'},
|
||
{offset: 1, color: '#188df0'}
|
||
])
|
||
}
|
||
},
|
||
{
|
||
name: '特征覆盖率',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [85, 87, 90, 92, 95, 96],
|
||
itemStyle: {
|
||
color: '#10B981'
|
||
}
|
||
},
|
||
{
|
||
name: '数据质量分布',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [78, 82, 85, 88, 90, 92],
|
||
itemStyle: {
|
||
color: '#F59E0B'
|
||
}
|
||
},
|
||
{
|
||
name: 'GPU使用率',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [65, 75, 70, 85, 80, 90],
|
||
itemStyle: {
|
||
color: '#EF4444'
|
||
},
|
||
markLine: {
|
||
silent: true,
|
||
lineStyle: {
|
||
color: '#EF4444'
|
||
},
|
||
data: [{
|
||
yAxis: 80,
|
||
name: '警戒线'
|
||
}]
|
||
}
|
||
}
|
||
]
|
||
};
|
||
|
||
// 渲染模型训练监控图表
|
||
modelTrainingChart.setOption(modelTrainingOption);
|
||
|
||
// 添加加载状态控制
|
||
function showLoading(chartId) {
|
||
const chart = echarts.getInstanceByDom(document.getElementById(chartId));
|
||
chart.showLoading({
|
||
text: '数据加载中...',
|
||
maskColor: 'rgba(255, 255, 255, 0.8)'
|
||
});
|
||
}
|
||
|
||
function hideLoading(chartId) {
|
||
const chart = echarts.getInstanceByDom(document.getElementById(chartId));
|
||
chart.hideLoading();
|
||
}
|
||
|
||
// 添加图表工具栏
|
||
const baseChartOption = {
|
||
toolbox: {
|
||
feature: {
|
||
dataZoom: {},
|
||
magicType: {type: ['line', 'bar']},
|
||
restore: {},
|
||
saveAsImage: {}
|
||
}
|
||
}
|
||
};
|
||
|
||
// 添加防抖处理
|
||
function debounce(fn, delay) {
|
||
let timer = null;
|
||
return function() {
|
||
const context = this;
|
||
const args = arguments;
|
||
clearTimeout(timer);
|
||
timer = setTimeout(() => {
|
||
fn.apply(context, args);
|
||
}, delay);
|
||
};
|
||
}
|
||
|
||
// 优化响应式处理
|
||
window.addEventListener('resize', debounce(function() {
|
||
[dataValueChart, contributionChart, businessValueChart, creditScoreChart, riskTrendChart, heatmapChart, supplierValueChart, blockchainChart, modelIterationChart, modelTrainingChart].forEach(chart => {
|
||
chart && chart.resize();
|
||
});
|
||
}, 200));
|
||
|
||
// 添加图表联动
|
||
function setupChartLinkage() {
|
||
dataValueChart.on('click', function(params) {
|
||
// 更新相关图表数据
|
||
updateRelatedCharts(params.name);
|
||
});
|
||
}
|
||
|
||
// 添加数据刷新机制
|
||
function setupDataRefresh() {
|
||
const refreshInterval = 5 * 60 * 1000; // 5分钟
|
||
setInterval(() => {
|
||
refreshAllCharts();
|
||
}, refreshInterval);
|
||
}
|
||
|
||
// 添加数据质量趋势图配置
|
||
const qualityTrendChart = echarts.init(document.getElementById('qualityTrendChart'));
|
||
const qualityTrendOption = {
|
||
title: {
|
||
text: '数据质量趋势分析',
|
||
left: 'center'
|
||
},
|
||
tooltip: {
|
||
trigger: 'axis'
|
||
},
|
||
legend: {
|
||
data: ['完整性', '准确性', '时效性', '一致性'],
|
||
bottom: 0
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '4%',
|
||
bottom: '10%',
|
||
containLabel: true
|
||
},
|
||
xAxis: {
|
||
type: 'category',
|
||
boundaryGap: false,
|
||
data: ['1月', '2月', '3月', '4月', '5月', '6月']
|
||
},
|
||
yAxis: {
|
||
type: 'value',
|
||
min: 60,
|
||
max: 100,
|
||
axisLabel: {
|
||
formatter: '{value}%'
|
||
}
|
||
},
|
||
series: [
|
||
{
|
||
name: '完整性',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [92, 93, 94, 95, 95.5, 95.8],
|
||
lineStyle: {
|
||
color: '#3B82F6'
|
||
}
|
||
},
|
||
{
|
||
name: '准确性',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [90, 91, 92, 92.5, 93, 93.2],
|
||
lineStyle: {
|
||
color: '#10B981'
|
||
}
|
||
},
|
||
{
|
||
name: '时效性',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [85, 86, 87, 88, 89, 89.5],
|
||
lineStyle: {
|
||
color: '#F59E0B'
|
||
}
|
||
},
|
||
{
|
||
name: '一致性',
|
||
type: 'line',
|
||
smooth: true,
|
||
data: [88, 89, 90, 90.5, 91, 91.7],
|
||
lineStyle: {
|
||
color: '#8B5CF6'
|
||
}
|
||
}
|
||
]
|
||
};
|
||
|
||
qualityTrendChart.setOption(qualityTrendOption);
|
||
</script>
|
||
</body>
|
||
</html> |