| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | |
| | | <!-- ç»è®¡æ¦è§å¡ç --> |
| | | <div class="stats-overview"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-card class="stats-card"> |
| | | <div class="stats-content"> |
| | | <div class="stats-icon running"> |
| | | <el-icon><VideoPlay /></el-icon> |
| | | </div> |
| | | <div class="stats-info"> |
| | | <div class="stats-value">{{ overviewData.runningDevices }}</div> |
| | | <div class="stats-label">è¿è¡è®¾å¤</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="stats-card"> |
| | | <div class="stats-content"> |
| | | <div class="stats-icon stopped"> |
| | | <el-icon><VideoPause /></el-icon> |
| | | </div> |
| | | <div class="stats-info"> |
| | | <div class="stats-value">{{ overviewData.stoppedDevices }}</div> |
| | | <div class="stats-label">åæºè®¾å¤</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="stats-card"> |
| | | <div class="stats-content"> |
| | | <div class="stats-icon alarm"> |
| | | <el-icon><Warning /></el-icon> |
| | | </div> |
| | | <div class="stats-info"> |
| | | <div class="stats-value">{{ overviewData.alarmCount }}</div> |
| | | <div class="stats-label">æ¥è¦æ°é</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="stats-card"> |
| | | <div class="stats-content"> |
| | | <div class="stats-icon maintenance"> |
| | | <el-icon><Tools /></el-icon> |
| | | </div> |
| | | <div class="stats-info"> |
| | | <div class="stats-value">{{ overviewData.maintenanceCount }}</div> |
| | | <div class="stats-label">ç»´æ¤ä¸</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <!-- 主è¦å
容åºå --> |
| | | <el-row :gutter="20"> |
| | | <!-- 左侧ï¼è®¾å¤å¯åè®°å½ --> |
| | | <el-col :span="12"> |
| | | <el-card class="main-card"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span>设å¤å¯åè®°å½</span> |
| | | <el-button type="primary" size="small" @click="refreshDeviceRecords"> |
| | | <el-icon><Refresh /></el-icon> |
| | | å·æ° |
| | | </el-button> |
| | | </div> |
| | | </template> |
| | | |
| | | <!-- 设å¤ç¶æçé --> |
| | | <div class="filter-section"> |
| | | <el-radio-group v-model="deviceFilter" @change="filterDeviceRecords"> |
| | | <el-radio-button label="all">å
¨é¨</el-radio-button> |
| | | <el-radio-button label="start">å¯å¨</el-radio-button> |
| | | <el-radio-button label="stop">åæº</el-radio-button> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | <!-- 设å¤è®°å½å表 --> |
| | | <div class="device-records"> |
| | | <div |
| | | v-for="record in filteredDeviceRecords" |
| | | :key="record.id" |
| | | class="device-record" |
| | | :class="record.type" |
| | | > |
| | | <div class="record-icon"> |
| | | <el-icon v-if="record.type === 'start'"><VideoPlay /></el-icon> |
| | | <el-icon v-else><VideoPause /></el-icon> |
| | | </div> |
| | | <div class="record-content"> |
| | | <div class="device-name">{{ record.deviceName }}</div> |
| | | <div class="record-time">{{ record.time }}</div> |
| | | <div class="record-status" :class="record.type"> |
| | | {{ record.type === 'start' ? '设å¤å¯å¨' : '设å¤åæº' }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | |
| | | <!-- å³ä¾§ï¼è£
ç½®å¼åå·¥ä¿¡æ¯ --> |
| | | <el-col :span="12"> |
| | | <el-card class="main-card"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span>è£
ç½®å¼å工信æ¯</span> |
| | | <el-button type="success" size="small" @click="refreshUnitInfo"> |
| | | <el-icon><Refresh /></el-icon> |
| | | å·æ° |
| | | </el-button> |
| | | </div> |
| | | </template> |
| | | |
| | | <!-- è£
ç½®ç¶æçé --> |
| | | <div class="filter-section"> |
| | | <el-radio-group v-model="unitFilter" @change="filterUnitInfo"> |
| | | <el-radio-button label="all">å
¨é¨</el-radio-button> |
| | | <el-radio-button label="startup">å¼å·¥</el-radio-button> |
| | | <el-radio-button label="shutdown">åå·¥</el-radio-button> |
| | | <el-radio-button label="unplanned">é计ååå·¥</el-radio-button> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | <!-- è£
置信æ¯å表 --> |
| | | <div class="unit-info"> |
| | | <div |
| | | v-for="unit in filteredUnitInfo" |
| | | :key="unit.id" |
| | | class="unit-item" |
| | | :class="unit.status" |
| | | > |
| | | <div class="unit-header"> |
| | | <div class="unit-name">{{ unit.unitName }}</div> |
| | | <div class="unit-status" :class="unit.status"> |
| | | {{ getUnitStatusText(unit.status) }} |
| | | </div> |
| | | </div> |
| | | <div class="unit-details"> |
| | | <div class="detail-item"> |
| | | <span class="label">å¼å§æ¶é´ï¼</span> |
| | | <span class="value">{{ unit.startTime }}</span> |
| | | </div> |
| | | <div class="detail-item" v-if="unit.endTime"> |
| | | <span class="label">ç»ææ¶é´ï¼</span> |
| | | <span class="value">{{ unit.endTime }}</span> |
| | | </div> |
| | | <div class="detail-item" v-if="unit.reason"> |
| | | <span class="label">åå ï¼</span> |
| | | <span class="value">{{ unit.reason }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- æ¥è¦ä¿¡æ¯éä¸å±ç¤º --> |
| | | <el-card class="alarm-card"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span>æ¥è¦ä¿¡æ¯éä¸å±ç¤º</span> |
| | | <div class="alarm-actions"> |
| | | <el-button type="warning" size="small" @click="refreshAlarms"> |
| | | <el-icon><Refresh /></el-icon> |
| | | å·æ° |
| | | </el-button> |
| | | <el-button type="danger" size="small" @click="clearAlarms"> |
| | | <el-icon><Delete /></el-icon> |
| | | æ¸
é¤å·²å¤ç |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <!-- æ¥è¦çº§å«çé --> |
| | | <div class="filter-section"> |
| | | <el-radio-group v-model="alarmFilter" @change="filterAlarms"> |
| | | <el-radio-button label="all">å
¨é¨</el-radio-button> |
| | | <el-radio-button label="critical">严é</el-radio-button> |
| | | <el-radio-button label="warning">è¦å</el-radio-button> |
| | | <el-radio-button label="info">ä¿¡æ¯</el-radio-button> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | <!-- æ¥è¦ä¿¡æ¯è¡¨æ ¼ --> |
| | | <el-table |
| | | :data="filteredAlarms" |
| | | style="width: 100%" |
| | | :header-cell-style="{ background: '#F0F1F5', color: '#333333' }" |
| | | max-height="400" |
| | | > |
| | | <el-table-column |
| | | align="center" |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" |
| | | /> |
| | | <el-table-column |
| | | label="æ¥è¦æ¶é´" |
| | | prop="alarmTime" |
| | | width="150" |
| | | align="center" |
| | | /> |
| | | <el-table-column |
| | | label="设å¤åç§°" |
| | | prop="deviceName" |
| | | width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æ¥è¦çº§å«" |
| | | prop="level" |
| | | width="100" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag |
| | | :type="getAlarmTagType(scope.row.level)" |
| | | size="small" |
| | | > |
| | | {{ scope.row.level }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æ¥è¦å
容" |
| | | prop="content" |
| | | min-width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="å¤çç¶æ" |
| | | prop="status" |
| | | width="100" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag |
| | | :type="scope.row.status === 'å·²å¤ç' ? 'success' : 'danger'" |
| | | size="small" |
| | | > |
| | | {{ scope.row.status }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å¤ç人" |
| | | prop="handler" |
| | | width="100" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æä½" |
| | | width="120" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-button |
| | | v-if="scope.row.status === 'æªå¤ç'" |
| | | type="primary" |
| | | size="small" |
| | | @click="handleAlarm(scope.row)" |
| | | > |
| | | å¤ç |
| | | </el-button> |
| | | <el-button |
| | | v-else |
| | | type="info" |
| | | size="small" |
| | | disabled |
| | | > |
| | | å·²å¤ç |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted, computed } from 'vue' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import { |
| | | VideoPlay, |
| | | VideoPause, |
| | | Warning, |
| | | Tools, |
| | | Refresh, |
| | | Delete |
| | | } from '@element-plus/icons-vue' |
| | | |
| | | // ååºå¼æ°æ® |
| | | const deviceFilter = ref('all') |
| | | const unitFilter = ref('all') |
| | | const alarmFilter = ref('all') |
| | | |
| | | // æ¦è§æ°æ® |
| | | const overviewData = reactive({ |
| | | runningDevices: 15, |
| | | stoppedDevices: 3, |
| | | alarmCount: 8, |
| | | maintenanceCount: 2 |
| | | }) |
| | | |
| | | // 设å¤å¯åè®°å½æ°æ® |
| | | const deviceRecords = ref([ |
| | | { |
| | | id: 1, |
| | | deviceName: 'å缩æºA-001', |
| | | type: 'start', |
| | | time: '2024-01-15 08:30:25' |
| | | }, |
| | | { |
| | | id: 2, |
| | | deviceName: 'æ³µB-002', |
| | | type: 'stop', |
| | | time: '2024-01-15 08:25:10' |
| | | }, |
| | | { |
| | | id: 3, |
| | | deviceName: '飿ºC-003', |
| | | type: 'start', |
| | | time: '2024-01-15 08:20:15' |
| | | }, |
| | | { |
| | | id: 4, |
| | | deviceName: 'æ
æå¨D-004', |
| | | type: 'start', |
| | | time: '2024-01-15 08:15:30' |
| | | }, |
| | | { |
| | | id: 5, |
| | | deviceName: 'å çå¨E-005', |
| | | type: 'stop', |
| | | time: '2024-01-15 08:10:45' |
| | | }, |
| | | { |
| | | id: 6, |
| | | deviceName: 'å·å´å¨F-006', |
| | | type: 'start', |
| | | time: '2024-01-15 08:05:20' |
| | | } |
| | | ]) |
| | | |
| | | // è£
ç½®å¼åå·¥ä¿¡æ¯æ°æ® |
| | | const unitInfo = ref([ |
| | | { |
| | | id: 1, |
| | | unitName: 'ååºè£
ç½®A', |
| | | status: 'startup', |
| | | startTime: '2024-01-15 08:00:00', |
| | | endTime: null, |
| | | reason: null |
| | | }, |
| | | { |
| | | id: 2, |
| | | unitName: 'å离è£
ç½®B', |
| | | status: 'shutdown', |
| | | startTime: '2024-01-15 07:30:00', |
| | | endTime: '2024-01-15 08:00:00', |
| | | reason: '计åç»´æ¤' |
| | | }, |
| | | { |
| | | id: 3, |
| | | unitName: 'ç²¾å¶è£
ç½®C', |
| | | status: 'unplanned', |
| | | startTime: '2024-01-15 07:45:00', |
| | | endTime: null, |
| | | reason: 'è®¾å¤æ
é' |
| | | }, |
| | | { |
| | | id: 4, |
| | | unitName: 'å
è£
è£
ç½®D', |
| | | status: 'startup', |
| | | startTime: '2024-01-15 08:15:00', |
| | | endTime: null, |
| | | reason: null |
| | | } |
| | | ]) |
| | | |
| | | // æ¥è¦ä¿¡æ¯æ°æ® |
| | | const alarms = ref([ |
| | | { |
| | | id: 1, |
| | | alarmTime: '2024-01-15 08:30:00', |
| | | deviceName: 'å缩æºA-001', |
| | | level: '严é', |
| | | content: '温度è¿é«æ¥è¦', |
| | | status: 'æªå¤ç', |
| | | handler: '' |
| | | }, |
| | | { |
| | | id: 2, |
| | | alarmTime: '2024-01-15 08:25:00', |
| | | deviceName: 'æ³µB-002', |
| | | level: 'è¦å', |
| | | content: 'ååå¼å¸¸', |
| | | status: 'å·²å¤ç', |
| | | handler: 'å¼ ä¸' |
| | | }, |
| | | { |
| | | id: 3, |
| | | alarmTime: '2024-01-15 08:20:00', |
| | | deviceName: '飿ºC-003', |
| | | level: 'ä¿¡æ¯', |
| | | content: 'è¿è¡æ¶é´è¾¾å°ç»´æ¤å¨æ', |
| | | status: 'æªå¤ç', |
| | | handler: '' |
| | | }, |
| | | { |
| | | id: 4, |
| | | alarmTime: '2024-01-15 08:15:00', |
| | | deviceName: 'æ
æå¨D-004', |
| | | level: '严é', |
| | | content: 'æ¯å¨å¼å¸¸', |
| | | status: 'æªå¤ç', |
| | | handler: '' |
| | | }, |
| | | { |
| | | id: 5, |
| | | alarmTime: '2024-01-15 08:10:00', |
| | | deviceName: 'å çå¨E-005', |
| | | level: 'è¦å', |
| | | content: 'å çæçä¸é', |
| | | status: 'å·²å¤ç', |
| | | handler: 'æå' |
| | | } |
| | | ]) |
| | | |
| | | // 计ç®å±æ§ - è¿æ»¤åç设å¤è®°å½ |
| | | const filteredDeviceRecords = computed(() => { |
| | | if (deviceFilter.value === 'all') { |
| | | return deviceRecords.value |
| | | } |
| | | return deviceRecords.value.filter(record => record.type === deviceFilter.value) |
| | | }) |
| | | |
| | | // 计ç®å±æ§ - è¿æ»¤åçè£
ç½®ä¿¡æ¯ |
| | | const filteredUnitInfo = computed(() => { |
| | | if (unitFilter.value === 'all') { |
| | | return unitInfo.value |
| | | } |
| | | return unitInfo.value.filter(unit => unit.status === unitFilter.value) |
| | | }) |
| | | |
| | | // 计ç®å±æ§ - è¿æ»¤åçæ¥è¦ä¿¡æ¯ |
| | | const filteredAlarms = computed(() => { |
| | | if (alarmFilter.value === 'all') { |
| | | return alarms.value |
| | | } |
| | | return alarms.value.filter(alarm => alarm.level === alarmFilter.value) |
| | | }) |
| | | |
| | | // æ¹æ³ |
| | | const refreshDeviceRecords = () => { |
| | | ElMessage.success('设å¤è®°å½å·²å·æ°') |
| | | // è¿éå¯ä»¥è°ç¨APIè·åææ°æ°æ® |
| | | } |
| | | |
| | | const refreshUnitInfo = () => { |
| | | ElMessage.success('è£
置信æ¯å·²å·æ°') |
| | | // è¿éå¯ä»¥è°ç¨APIè·åææ°æ°æ® |
| | | } |
| | | |
| | | const refreshAlarms = () => { |
| | | ElMessage.success('æ¥è¦ä¿¡æ¯å·²å·æ°') |
| | | // è¿éå¯ä»¥è°ç¨APIè·åææ°æ°æ® |
| | | } |
| | | |
| | | const clearAlarms = async () => { |
| | | try { |
| | | await ElMessageBox.confirm('ç¡®å®è¦æ¸
餿æå·²å¤ççæ¥è¦ä¿¡æ¯åï¼', '确认æ¸
é¤', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }) |
| | | |
| | | alarms.value = alarms.value.filter(alarm => alarm.status === 'æªå¤ç') |
| | | ElMessage.success('å·²æ¸
餿æå·²å¤ççæ¥è¦ä¿¡æ¯') |
| | | } catch { |
| | | // ç¨æ·åæ¶æä½ |
| | | } |
| | | } |
| | | |
| | | const filterDeviceRecords = () => { |
| | | // è¿æ»¤é»è¾å·²å¨è®¡ç®å±æ§ä¸å¤ç |
| | | } |
| | | |
| | | const filterUnitInfo = () => { |
| | | // è¿æ»¤é»è¾å·²å¨è®¡ç®å±æ§ä¸å¤ç |
| | | } |
| | | |
| | | const filterAlarms = () => { |
| | | // è¿æ»¤é»è¾å·²å¨è®¡ç®å±æ§ä¸å¤ç |
| | | } |
| | | |
| | | const getUnitStatusText = (status) => { |
| | | const statusMap = { |
| | | startup: 'å¼å·¥ä¸', |
| | | shutdown: 'å·²åå·¥', |
| | | unplanned: 'é计ååå·¥' |
| | | } |
| | | return statusMap[status] || status |
| | | } |
| | | |
| | | const getAlarmTagType = (level) => { |
| | | const typeMap = { |
| | | '严é': 'danger', |
| | | 'è¦å': 'warning', |
| | | 'ä¿¡æ¯': 'info' |
| | | } |
| | | return typeMap[level] || 'info' |
| | | } |
| | | |
| | | const handleAlarm = (alarm) => { |
| | | ElMessageBox.prompt('请è¾å
¥å¤ç说æ', 'å¤çæ¥è¦', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | inputPlaceholder: '请è¾å
¥å¤ç说æ' |
| | | }).then(({ value }) => { |
| | | alarm.status = 'å·²å¤ç' |
| | | alarm.handler = 'å½åç¨æ·' // è¿éåºè¯¥è·åå½åç»å½ç¨æ· |
| | | ElMessage.success('æ¥è¦å¤ç宿') |
| | | }).catch(() => { |
| | | // ç¨æ·åæ¶æä½ |
| | | }) |
| | | } |
| | | |
| | | // ç»ä»¶æè½½æ¶åå§åæ°æ® |
| | | onMounted(() => { |
| | | // è¿éå¯ä»¥è°ç¨APIè·ååå§æ°æ® |
| | | console.log('è¿è¡ç®¡ç页é¢å·²å è½½') |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .app-container { |
| | | padding: 20px; |
| | | background: #f5f7fa; |
| | | min-height: 100vh; |
| | | } |
| | | |
| | | |
| | | .stats-overview { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .stats-card { |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .stats-content { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | .stats-icon { |
| | | width: 50px; |
| | | height: 50px; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-right: 15px; |
| | | font-size: 24px; |
| | | color: #fff; |
| | | } |
| | | |
| | | .stats-icon.running { |
| | | background: linear-gradient(135deg, #67C23A, #85CE61); |
| | | } |
| | | |
| | | .stats-icon.stopped { |
| | | background: linear-gradient(135deg, #F56C6C, #F78989); |
| | | } |
| | | |
| | | .stats-icon.alarm { |
| | | background: linear-gradient(135deg, #E6A23C, #EEBE77); |
| | | } |
| | | |
| | | .stats-icon.maintenance { |
| | | background: linear-gradient(135deg, #409EFF, #66B1FF); |
| | | } |
| | | |
| | | .stats-info { |
| | | flex: 1; |
| | | } |
| | | |
| | | .stats-value { |
| | | font-size: 24px; |
| | | font-weight: bold; |
| | | color: #333; |
| | | line-height: 1; |
| | | margin-bottom: 5px; |
| | | } |
| | | |
| | | .stats-label { |
| | | font-size: 14px; |
| | | color: #666; |
| | | } |
| | | |
| | | .main-card { |
| | | margin-bottom: 20px; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .card-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | .filter-section { |
| | | margin-bottom: 15px; |
| | | } |
| | | |
| | | .device-records { |
| | | max-height: 400px; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .device-record { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 12px; |
| | | margin-bottom: 8px; |
| | | border-radius: 6px; |
| | | background: #f8f9fa; |
| | | border-left: 4px solid #ddd; |
| | | } |
| | | |
| | | .device-record.start { |
| | | border-left-color: #67C23A; |
| | | background: #f0f9ff; |
| | | } |
| | | |
| | | .device-record.stop { |
| | | border-left-color: #F56C6C; |
| | | background: #fef0f0; |
| | | } |
| | | |
| | | .record-icon { |
| | | width: 32px; |
| | | height: 32px; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-right: 12px; |
| | | font-size: 16px; |
| | | color: #fff; |
| | | } |
| | | |
| | | .device-record.start .record-icon { |
| | | background: #67C23A; |
| | | } |
| | | |
| | | .device-record.stop .record-icon { |
| | | background: #F56C6C; |
| | | } |
| | | |
| | | .record-content { |
| | | flex: 1; |
| | | } |
| | | |
| | | .device-name { |
| | | font-weight: 500; |
| | | color: #333; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .record-time { |
| | | font-size: 12px; |
| | | color: #666; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .record-status { |
| | | font-size: 12px; |
| | | padding: 2px 8px; |
| | | border-radius: 12px; |
| | | display: inline-block; |
| | | } |
| | | |
| | | .record-status.start { |
| | | background: #e1f3d8; |
| | | color: #67C23A; |
| | | } |
| | | |
| | | .record-status.stop { |
| | | background: #fde2e2; |
| | | color: #F56C6C; |
| | | } |
| | | |
| | | .unit-info { |
| | | max-height: 400px; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .unit-item { |
| | | padding: 15px; |
| | | margin-bottom: 12px; |
| | | border-radius: 6px; |
| | | background: #f8f9fa; |
| | | border-left: 4px solid #ddd; |
| | | } |
| | | |
| | | .unit-item.startup { |
| | | border-left-color: #67C23A; |
| | | background: #f0f9ff; |
| | | } |
| | | |
| | | .unit-item.shutdown { |
| | | border-left-color: #409EFF; |
| | | background: #f0f9ff; |
| | | } |
| | | |
| | | .unit-item.unplanned { |
| | | border-left-color: #E6A23C; |
| | | background: #fdf6ec; |
| | | } |
| | | |
| | | .unit-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .unit-name { |
| | | font-weight: 500; |
| | | color: #333; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .unit-status { |
| | | font-size: 12px; |
| | | padding: 4px 8px; |
| | | border-radius: 12px; |
| | | display: inline-block; |
| | | } |
| | | |
| | | .unit-status.startup { |
| | | background: #e1f3d8; |
| | | color: #67C23A; |
| | | } |
| | | |
| | | .unit-status.shutdown { |
| | | background: #e1f3ff; |
| | | color: #409EFF; |
| | | } |
| | | |
| | | .unit-status.unplanned { |
| | | background: #fdf6ec; |
| | | color: #E6A23C; |
| | | } |
| | | |
| | | .unit-details { |
| | | font-size: 12px; |
| | | color: #666; |
| | | } |
| | | |
| | | .detail-item { |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .detail-item .label { |
| | | font-weight: 500; |
| | | margin-right: 4px; |
| | | } |
| | | |
| | | .alarm-card { |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .alarm-actions { |
| | | display: flex; |
| | | gap: 8px; |
| | | } |
| | | |
| | | :deep(.el-card__header) { |
| | | background: #f8f9fa; |
| | | border-bottom: 1px solid #e9ecef; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | :deep(.el-table .el-table__header-wrapper th) { |
| | | background-color: #F0F1F5 !important; |
| | | color: #333333; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | :deep(.el-table .el-table__body-wrapper td) { |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | :deep(.el-radio-button__inner) { |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-radio-button:first-child .el-radio-button__inner) { |
| | | border-left: 1px solid #dcdfe6; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-radio-button:last-child .el-radio-button__inner) { |
| | | border-radius: 4px; |
| | | } |
| | | </style> |