You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
4.9 KiB
Vue

<template>
<div class="dashboard-container">
<div class="bg-grid"></div>
<div class="bg-scan"><div class="scan-line"></div></div>
<DashboardHeader />
<main>
<div class="layout">
<!-- 第一行 -->
<el-row :gutter="10" class="row-1">
<el-col :span="12">
<!-- 产线任务看板 -->
<TaskBoard />
</el-col>
<el-col :span="6">
<!-- 日产能达成情况 -->
<DayCapacity />
</el-col>
<el-col :span="6">
<!-- 月产能达成情况 -->
<MonthCapacity />
</el-col>
</el-row>
<!-- 第二行 -->
<el-row :gutter="10" class="row-2">
<el-col :span="9">
<!-- 周生产趋势 -->
<WeekTrend />
</el-col>
<el-col :span="8">
<!-- 开机率/稼动率趋势 -->
<OpsTrend />
</el-col>
<el-col :span="7">
<!-- 今日开机率/稼动率 -->
<TodayOps />
</el-col>
</el-row>
<!-- 第三行 -->
<el-row :gutter="10" class="row-3">
<el-col :span="8">
<!-- 成品检合格率趋势图 -->
<QualityTrend />
</el-col>
<el-col :span="8">
<!-- 实时报警信息 -->
<RealAlarm />
</el-col>
<el-col :span="8">
<!-- 能耗周趋势 -->
<EnergyTrend />
</el-col>
</el-row>
</div>
</main>
</div>
</template>
<script setup lang="ts">
import DashboardHeader from './components/DashboardHeader.vue'
import TaskBoard from './components/TaskBoard.vue'
import DayCapacity from './components/DayCapacity.vue'
import MonthCapacity from './components/MonthCapacity.vue'
import WeekTrend from './components/WeekTrend.vue'
import OpsTrend from './components/OpsTrend.vue'
import TodayOps from './components/TodayOps.vue'
import QualityTrend from './components/QualityTrend.vue'
import RealAlarm from './components/RealAlarm.vue'
import EnergyTrend from './components/EnergyTrend.vue'
</script>
<style scoped>
@keyframes scanDown {
0% { transform: translateY(-100%); }
100% { transform: translateY(260%); }
}
@media (width <= 1366px) {
/* Adjust if needed, but flex: 1 should handle it automatically */
}
.dashboard-container {
--bg: #050816;
--bg-deep: #020617;
--card-bg: rgb(15 23 42 / 86%);
--border: rgb(56 189 248 / 35%);
--text: #e5f0ff;
--muted: #94a3b8;
--primary: #38bdf8;
--accent: #22d3ee;
--blue: #1e90ff;
--green: #22c55e;
--purple: #8b5cf6;
--warn: #f59e0b;
--danger: #ef4444;
--gap: 10px;
--header-h: 86px;
position: relative;
display: flex;
width: 100%;
min-height: 100vh;
overflow: hidden;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Microsoft Yahei", Arial, sans-serif;
color: var(--text);
background-color: var(--bg-deep);
background-image:
radial-gradient(circle at 20% 0, rgb(56 189 248 / 26%) 0, transparent 48%),
radial-gradient(circle at 80% 110%, rgb(129 140 248 / 22%) 0, transparent 52%),
linear-gradient(135deg, #020617 0%, #020617 45%, #020617 100%);
flex-direction: column;
}
.bg-grid {
position: absolute;
z-index: 0;
pointer-events: none;
background-image: linear-gradient(rgb(15 23 42 / 80%) 1px, transparent 1px),
linear-gradient(90deg, rgb(15 23 42 / 80%) 1px, transparent 1px);
background-size: 70px 70px;
opacity: 0.55;
inset: 0;
}
.bg-scan {
position: absolute;
z-index: 0;
overflow: hidden;
pointer-events: none;
inset: 0;
}
.scan-line {
position: absolute;
top: -40%;
left: 0;
width: 100%;
height: 40%;
background: radial-gradient(circle at 50% 0, rgb(56 189 248 / 38%), transparent 70%);
opacity: 0.5;
filter: blur(32px);
animation: scanDown 16s linear infinite;
}
main {
position: relative;
z-index: 1;
display: flex;
min-height: 0;
padding: 8px var(--gap) var(--gap);
flex: 1;
flex-direction: column;
gap: var(--gap);
}
.layout {
display: flex;
width: 100%; /* Ensure full width */
max-width: 1920px;
min-height: 0;
margin: 0 auto;
flex: 1;
flex-direction: column;
gap: var(--gap);
}
.row-1, .row-2, .row-3 {
flex: 1 1 0; /* Ensure equal height distribution */
min-height: 0;
overflow: hidden; /* Prevent content from expanding the row */
}
/* Ensure el-col takes full height */
:deep(.el-col) {
height: 100%;
}
/* Ensure card takes full height and ignores inline flex styles */
:deep(.card) {
height: 100% !important;
flex: none !important;
box-sizing: border-box; /* Ensure padding/border doesn't add to height */
}
/* Fix chart containers if they are not sizing correctly */
:deep(.chart), :deep(.echarts) {
width: 100% !important;
height: 100% !important;
}
/* Define CSS Variables locally for this dashboard */
</style>