diff --git a/app/src/admin/pages/DataCheck.tsx b/app/src/admin/pages/DataCheck.tsx index a3cfd75..d4d9814 100644 --- a/app/src/admin/pages/DataCheck.tsx +++ b/app/src/admin/pages/DataCheck.tsx @@ -259,18 +259,12 @@ export default function DataCheck() { }; // 计算统计数据(优先使用后端返回的 summary 数据) - const completionRate = summary?.completenessRate ?? (dataStatus.length > 0 - ? Math.round((dataStatus.filter(d => d.status === 'complete').length / dataStatus.length) * 100) - : 0); + // 新的 summary 格式: { stockCount, quoteCount, klineCount, localLatestDate, externalLatestDate, externalStatus, daysBehind, syncStatus } + const completionRate = summary?.syncStatus === 'complete' ? 100 : summary?.syncStatus === 'incomplete' ? 70 : 0; - const totalMissing = summary?.missingQuotesCount ?? dataStatus.reduce((acc, item) => { - if (item.status !== 'complete') { - return acc + (item.total - item.current); - } - return acc; - }, 0); + const totalMissing = summary?.daysBehind ?? 0; - const estimatedTime = Math.ceil(totalMissing / 1000); // 估算时间(分钟) + const estimatedTime = Math.ceil(totalMissing * 1000); // 估算时间(分钟) return (
{currentTask && ( <> - 已处理: {currentTask.processedRecords.toLocaleString()} / {currentTask.totalRecords.toLocaleString()} + 已处理: {(currentTask.processedRecords || 0).toLocaleString()} / {(currentTask.totalRecords || 0).toLocaleString()} > )}
@@ -473,15 +467,17 @@ export default function DataCheck() { >数据完整度
-{summary.completenessRate}%
+数据同步状态
++ {summary.syncStatus === 'complete' ? '已同步' : summary.syncStatus === 'incomplete' ? '部分同步' : '未同步'} +
缺失数据条数
-{summary.missingQuotesCount.toLocaleString()}
+落后天数
+{summary.daysBehind ?? '-'} 天
- {summary.missingQuotesCount > 0 ? '建议执行一键缓冲' : '数据完整无需缓冲'} + {summary.daysBehind && summary.daysBehind > 0 ? '建议执行一键缓冲' : '数据已同步'}
@@ -513,15 +509,17 @@ export default function DataCheck() { >一年内可交易日
-{summary.tradingDaysCount} 天
+数据源状态
++ {summary.externalStatus === 'connected' ? '已连接' : summary.externalStatus === 'disabled' ? '未配置' : '异常'} +
- 参考日期: {summary.referenceDate}, 当日股票数: {summary.dailyStockCount}只 + 本地: {summary.localLatestDate || '无'}, 数据源: {summary.externalLatestDate || '无'}
预期数据条数
-{summary.expectedTotalQuotes.toLocaleString()}
+股票数量
+{(summary.stockCount || 0).toLocaleString()}
实际数据条数
-{summary.actualTotalQuotes.toLocaleString()}
+行情记录数
+{(summary.quoteCount || 0).toLocaleString()}
缺失数据条数
-0 ? 'text-red-400' : 'text-green-400'}`}> - {summary.missingQuotesCount.toLocaleString()} +
落后天数
+0 ? 'text-red-400' : 'text-green-400'}`}> + {summary.daysBehind ?? '-'} 天
数据完整度
-= 90 ? 'text-green-400' : summary.completenessRate >= 50 ? 'text-yellow-400' : 'text-red-400'}`}> - {summary.completenessRate}% -
+K线数据
+{(summary.klineCount || 0).toLocaleString()}
- * 计算公式: 预期数据 = 单日股票数({summary.dailyStockCount}只) × 可交易日({summary.tradingDaysCount}天) = {summary.expectedTotalQuotes.toLocaleString()}条 + * 本地最新数据: {summary.localLatestDate || '无'}, 数据源最新: {summary.externalLatestDate || '无'}
)} @@ -635,11 +631,11 @@ export default function DataCheck() { /> - {((item.current / item.total) * 100).toFixed(1)}% + {item.total > 0 ? ((item.current / item.total) * 100).toFixed(1) : '0.0'}%- {item.current.toLocaleString()} / {item.total.toLocaleString()} + {(item.current || 0).toLocaleString()} / {(item.total || 0).toLocaleString()}
{item.details && ( diff --git a/app/src/admin/pages/DataImport.tsx b/app/src/admin/pages/DataImport.tsx index 50ee730..bbc1053 100644 --- a/app/src/admin/pages/DataImport.tsx +++ b/app/src/admin/pages/DataImport.tsx @@ -320,9 +320,9 @@ export default function DataImport() {