+ {/* Header */}
+
{t('pipeline.title')}
+
+ {/* Pipeline Flow */}
+
+
{t('pipeline.flowTitle')}
+
+
+
+ {/* Stage Metric Cards */}
+
+ {Object.entries(JOB_DISPLAY).map(([jobName, label]) => (
+
+ ))}
+
+
+ {/* Processing Delay + Cache Status */}
+
+
+
{t('pipeline.processingDelay')}
+ {delay ? (
+
+
+ {delay.delayMinutes ?? 0}
+ {t('pipeline.delayMin')}
+
+
+
+
+
{t('pipeline.aisLatest')}
+
{formatDateTime(delay.aisLatestTime)}
+
+
+
{t('pipeline.processLatest')}
+
{formatDateTime(delay.queryLatestTime)}
+
+
+
+ ) : (
+
{t('common.loading')}
+ )}
+
+
+
+
{t('pipeline.cacheOverview')}
+ {cacheDetails ? (
+
+
+
+
L1 (5min)
+
{formatNumber(cacheDetails.l1_fiveMin?.size)}
+
/ {formatNumber(cacheDetails.l1_fiveMin?.maxSize)}
+
+
+
L2 (Hourly)
+
{formatNumber(cacheDetails.l2_hourly?.size)}
+
/ {formatNumber(cacheDetails.l2_hourly?.maxSize)}
+
+
+
L3 (Daily)
+
{cacheDetails.l3_daily?.cachedDays ?? 0}
+
{t('pipeline.cachedDays')}
+
+
+ {cache && (
+
+
{t('pipeline.totalHitRate')}
+
+ {cache.hitRate}
+
+
+
+ )}
+
+ ) : (
+
{t('common.loading')}
+ )}
+
+
+
+ {/* Daily Throughput Timeline */}
+ {dailyChartData.length > 0 && (
+
+
{t('pipeline.dailyThroughput')}
+
+
+ )}
+
+ {/* Recent Job Executions */}
+
+
{t('pipeline.recentJobs')}
+
+ {recentJobs.length === 0 ? (
+
{t('common.noData')}
+ ) : (
+ recentJobs.slice(0, 10).map(job => (
+
+
+
+
+
{JOB_DISPLAY[job.jobName] ?? job.jobName}
+
#{job.executionId} · {formatDateTime(job.startTime)}
+
+
+
+
{formatDuration(job.durationSeconds)}
+
+ R:{formatNumber(job.totalRead)} W:{formatNumber(job.totalWrite)}
+
+
+
+ ))
+ )}
+
+
+
+ {/* Summary Stats */}
+ {stats && (
+
+
+
+
+
+
+ )}
+
+ )
+}