2024-06-13 11:30:23 +08:00
|
|
|
<template>
|
2024-11-11 16:24:03 +08:00
|
|
|
<div class="default-main" ref="HomeHight">
|
2024-11-19 13:44:32 +08:00
|
|
|
<el-row style="margin: 0px;">
|
2024-11-20 15:45:12 +08:00
|
|
|
<el-col :md="24" :lg="24" class="col-center" style="padding-right: 10px;">
|
2024-10-24 09:04:51 +08:00
|
|
|
<div class="grid-content ep-bg-purple-light">
|
|
|
|
<!--风机矩阵-->
|
|
|
|
<div class="matrix panelBg">
|
2024-11-20 15:45:12 +08:00
|
|
|
<div class="homeHeader">
|
|
|
|
<div class="cardLabel">风机矩阵</div>
|
|
|
|
<div class="realAlert"
|
|
|
|
ref="scrollRef"
|
|
|
|
@mouseover.native="clearScroll"
|
|
|
|
@mouseleave.native="createScroll">
|
|
|
|
<p v-for="(item,index) in tableData"
|
|
|
|
:key="index"
|
|
|
|
@click="open(item)" >
|
|
|
|
<span>{{item.deviceCode}}、</span>
|
|
|
|
<span>{{item.eventText}}、</span>
|
|
|
|
<span>{{item.eventTimeFormate}}</span>
|
|
|
|
</p>
|
|
|
|
<!-- <span v-if="tableData.length==0">暂无告警</span>-->
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
2024-11-11 16:38:43 +08:00
|
|
|
<el-scrollbar>
|
|
|
|
<WindContent :parentData="FanList" @StatusListData="StatusListData"></WindContent>
|
|
|
|
</el-scrollbar>
|
2024-06-13 11:30:23 +08:00
|
|
|
</div>
|
2024-10-24 09:04:51 +08:00
|
|
|
</div>
|
|
|
|
</el-col>
|
2024-11-20 15:45:12 +08:00
|
|
|
<!-- <el-col :md="24" :lg="8" style="padding: 0px">
|
2024-11-11 16:24:03 +08:00
|
|
|
<div class="grid-content ep-bg-purple cardContentRight">
|
2024-11-20 15:45:12 +08:00
|
|
|
<!–实时告警–>
|
2024-11-08 15:59:03 +08:00
|
|
|
<div class="realPart panelBg" style="margin-bottom: 0">
|
2024-10-24 09:04:51 +08:00
|
|
|
<el-text class="mx-1 homelabel">实时告警</el-text>
|
2024-11-19 13:44:32 +08:00
|
|
|
<div class="realAlert"
|
|
|
|
ref="scrollRef"
|
|
|
|
@mouseover.native="clearScroll"
|
|
|
|
@mouseleave.native="createScroll">
|
|
|
|
<ul>
|
|
|
|
<li v-for="(item,index) in tableData"
|
|
|
|
:key="index"
|
|
|
|
@click="open(item)"
|
2024-11-08 15:44:06 +08:00
|
|
|
>
|
2024-11-19 13:44:32 +08:00
|
|
|
<span>{{item.deviceCode}}、</span>
|
|
|
|
<span>{{item.eventText}}、</span>
|
|
|
|
<span>{{item.eventTimeFormate}}</span>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
2024-10-24 09:04:51 +08:00
|
|
|
</div>
|
|
|
|
</div>
|
2024-11-20 15:45:12 +08:00
|
|
|
</el-col>-->
|
2024-10-24 09:04:51 +08:00
|
|
|
</el-row>
|
2024-06-13 11:30:23 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2024-11-08 15:44:06 +08:00
|
|
|
import { nextTick, onActivated, onMounted, reactive, ref, onBeforeMount, onUnmounted, VNodeRef } from 'vue'
|
2024-06-13 11:30:23 +08:00
|
|
|
import * as echarts from 'echarts'
|
2024-11-08 15:44:06 +08:00
|
|
|
import { useTemplateRefsList, useEventListener } from '@vueuse/core'
|
|
|
|
import { useI18n } from 'vue-i18n'
|
2024-10-24 09:04:51 +08:00
|
|
|
import WindContent from '/@/views/backend/home/windMatrix.vue'
|
2024-11-06 16:10:25 +08:00
|
|
|
import { equipList } from '/@/api/backend/realData/request'
|
2024-11-08 15:44:06 +08:00
|
|
|
import { getWindFarmRealData, getWindTurbineMatrixData, getHistoryData } from '/@/api/backend/dashboard.ts'
|
|
|
|
import { dayjs, ElMessage, ElMessageBox, TableInstance } from 'element-plus'
|
2024-10-31 13:48:17 +08:00
|
|
|
import { getRealTimeState } from '/@/views/backend/equipment/airBlower/utils.ts'
|
2024-11-08 15:44:06 +08:00
|
|
|
import { useRoute } from 'vue-router'
|
2024-11-06 16:31:28 +08:00
|
|
|
import { getAlarmListReq, eventComfirm } from '/@/api/backend/alarms/request'
|
2024-10-31 16:49:12 +08:00
|
|
|
const route = useRoute()
|
2024-10-24 09:04:51 +08:00
|
|
|
|
2024-06-13 11:30:23 +08:00
|
|
|
const d = new Date()
|
|
|
|
const { t } = useI18n()
|
2024-11-08 15:44:06 +08:00
|
|
|
let timer: any = null
|
2024-10-31 16:49:12 +08:00
|
|
|
let myTable = ref<TableInstance>()
|
2024-10-24 09:04:51 +08:00
|
|
|
|
2024-11-08 15:44:06 +08:00
|
|
|
const realData = ref({
|
2024-10-31 09:21:15 +08:00
|
|
|
windFarmId: '',
|
2024-11-08 15:44:06 +08:00
|
|
|
attributeMap: {},
|
2024-10-24 09:04:51 +08:00
|
|
|
})
|
2024-10-31 16:49:12 +08:00
|
|
|
|
2024-11-08 15:44:06 +08:00
|
|
|
const formatAttributeValue = (value: any) => {
|
|
|
|
if (value === undefined) {
|
|
|
|
return '-'
|
|
|
|
}
|
|
|
|
if (typeof value !== 'number') {
|
|
|
|
throw new Error('Invalid data type for attribute value')
|
|
|
|
}
|
|
|
|
return value % 1 === 0 ? value : value.toFixed(2)
|
2024-10-31 16:49:12 +08:00
|
|
|
}
|
2024-10-31 09:21:15 +08:00
|
|
|
const overviewList = () => {
|
|
|
|
getWindFarmRealData().then((res) => {
|
|
|
|
if (res.code == 200) {
|
2024-11-08 15:44:06 +08:00
|
|
|
res.data.attributeMap.windfarmdayprodenergy = formatAttributeValue(res.data.attributeMap.windfarmdayprodenergy)
|
|
|
|
res.data.attributeMap.windfarmmonthprodenergy = formatAttributeValue(res.data.attributeMap.windfarmmonthprodenergy)
|
|
|
|
res.data.attributeMap.windfarmactivepower = formatAttributeValue(res.data.attributeMap.windfarmactivepower)
|
|
|
|
res.data.attributeMap.windfarmavgwindspeed = formatAttributeValue(res.data.attributeMap.windfarmavgwindspeed)
|
|
|
|
res.data.attributeMap.windfarmdayoperationhours = formatAttributeValue(res.data.attributeMap.windfarmdayoperationhours)
|
|
|
|
res.data.attributeMap.windfarmmonthoperationhours = formatAttributeValue(res.data.attributeMap.windfarmmonthoperationhours)
|
|
|
|
res.data.attributeMap.windfarmyearprodenergy = formatAttributeValue(res.data.attributeMap.windfarmyearprodenergy)
|
|
|
|
res.data.attributeMap.windfarmtotalprodenergy = formatAttributeValue(res.data.attributeMap.windfarmtotalprodenergy)
|
|
|
|
const data: any = {
|
2024-10-31 13:48:17 +08:00
|
|
|
windFarmId: res.data.windFarmId,
|
|
|
|
attributeMap: {
|
|
|
|
windfarmdayprodenergy: res.data.attributeMap.windfarmdayprodenergy,
|
|
|
|
windfarmmonthprodenergy: res.data.attributeMap.windfarmmonthprodenergy,
|
|
|
|
windfarmactivepower: res.data.attributeMap.windfarmactivepower,
|
|
|
|
windfarmavgwindspeed: res.data.attributeMap.windfarmavgwindspeed,
|
|
|
|
windfarmdayoperationhours: res.data.attributeMap.windfarmdayoperationhours,
|
|
|
|
windfarmmonthoperationhours: res.data.attributeMap.windfarmmonthoperationhours,
|
|
|
|
windfarmyearprodenergy: res.data.attributeMap.windfarmyearprodenergy,
|
|
|
|
windfarmtotalprodenergy: res.data.attributeMap.windfarmtotalprodenergy,
|
2024-11-08 15:44:06 +08:00
|
|
|
},
|
2024-10-31 13:48:17 +08:00
|
|
|
}
|
|
|
|
|
2024-11-08 15:44:06 +08:00
|
|
|
realData.value = data
|
|
|
|
} else {
|
2024-10-31 09:21:15 +08:00
|
|
|
ElMessage.error({
|
|
|
|
message: res.msg,
|
|
|
|
type: 'error',
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
const currentDayStatus = ref({
|
2024-10-31 09:21:15 +08:00
|
|
|
windTurbineNum: 0,
|
|
|
|
installedCapacity: 0,
|
|
|
|
runCapacityTotal: 0,
|
|
|
|
runNum: 0,
|
|
|
|
standbyCapacityTotal: 0,
|
|
|
|
standbyNum: 0,
|
|
|
|
faultCapacityTotal: 0,
|
|
|
|
faultNum: 0,
|
|
|
|
offlineCapacityTotal: 0,
|
|
|
|
offlineNum: 0,
|
|
|
|
StandCapacityTotal: 0,
|
|
|
|
StandNum: 0,
|
|
|
|
StartCapacityTotal: 0,
|
2024-11-08 15:44:06 +08:00
|
|
|
StarteNum: 0,
|
2024-10-24 09:04:51 +08:00
|
|
|
})
|
2024-11-08 15:44:06 +08:00
|
|
|
const deviceCode = ref([])
|
2024-10-31 13:48:17 +08:00
|
|
|
const FanList = ref([])
|
2024-10-31 09:21:15 +08:00
|
|
|
const StatusListData = () => {
|
|
|
|
getWindTurbineMatrixData().then((res) => {
|
|
|
|
if (res.code == 200) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.windTurbineNum = res.data.length
|
|
|
|
const data = res.data.map((item, index) => {
|
2024-10-31 13:48:17 +08:00
|
|
|
const state = getRealTimeState(item.attributeMap)
|
2024-11-08 15:44:06 +08:00
|
|
|
item.attributeMap.iwindspeed =
|
|
|
|
item.attributeMap.iwindspeed !== undefined
|
|
|
|
? item.attributeMap.iwindspeed % 1 === 0
|
|
|
|
? item.attributeMap.iwindspeed
|
|
|
|
: item.attributeMap.iwindspeed.toFixed(2)
|
|
|
|
: '--'
|
|
|
|
item.attributeMap.igenpower =
|
|
|
|
item.attributeMap.igenpower !== undefined
|
|
|
|
? item.attributeMap.igenpower % 1 === 0
|
|
|
|
? item.attributeMap.igenpower
|
|
|
|
: item.attributeMap.igenpower.toFixed(2)
|
|
|
|
: '--'
|
|
|
|
item.attributeMap.ikwhthisday =
|
|
|
|
item.attributeMap.ikwhthisday !== undefined
|
|
|
|
? item.attributeMap.ikwhthisday % 1 === 0
|
|
|
|
? item.attributeMap.ikwhthisday
|
|
|
|
: item.attributeMap.ikwhthisday.toFixed(2)
|
|
|
|
: '--'
|
2024-10-31 09:21:15 +08:00
|
|
|
// 初始化计数器和累加器
|
|
|
|
if (index === 0) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.runNum = 0
|
|
|
|
currentDayStatus.value.standbyNum = 0
|
|
|
|
currentDayStatus.value.StandNum = 0
|
|
|
|
currentDayStatus.value.StarteNum = 0
|
|
|
|
currentDayStatus.value.offlineNum = 0
|
|
|
|
currentDayStatus.value.faultNum = 0
|
|
|
|
|
|
|
|
currentDayStatus.value.runCapacityTotal = 0
|
|
|
|
currentDayStatus.value.standbyCapacityTotal = 0
|
|
|
|
currentDayStatus.value.StandCapacityTotal = 0
|
|
|
|
currentDayStatus.value.StartCapacityTotal = 0
|
|
|
|
currentDayStatus.value.offlineCapacityTotal = 0
|
|
|
|
currentDayStatus.value.faultCapacityTotal = 0
|
|
|
|
currentDayStatus.value.installedCapacity = 0
|
2024-10-31 09:21:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// 更新容量
|
|
|
|
if (item.nominalCapacity !== undefined) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.installedCapacity += item.nominalCapacity
|
2024-10-31 09:21:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// 根据运行模式更新状态和数量
|
2024-10-31 13:48:17 +08:00
|
|
|
//const mode = item.attributeMap.iturbineoperationmode
|
|
|
|
if ([7, 8, 17, 18, 19, 20, 21].includes(state)) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.runCapacityTotal += item.nominalCapacity
|
|
|
|
currentDayStatus.value.runNum += 1
|
2024-10-31 13:48:17 +08:00
|
|
|
} else if ([1, 2, 3, 4, 5, 6].includes(state)) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.standbyCapacityTotal += item.nominalCapacity
|
|
|
|
currentDayStatus.value.standbyNum += 1
|
2024-10-31 13:48:17 +08:00
|
|
|
} else if ([9, 10, 12, 13, 14, 15].includes(state)) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.StandCapacityTotal += item.nominalCapacity
|
|
|
|
currentDayStatus.value.StandNum += 1
|
2024-10-31 13:48:17 +08:00
|
|
|
} else if (state === 16) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.StartCapacityTotal += item.nominalCapacity
|
|
|
|
currentDayStatus.value.StarteNum += 1
|
2024-10-31 13:48:17 +08:00
|
|
|
} else if (state === 0) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.offlineCapacityTotal += item.nominalCapacity
|
|
|
|
currentDayStatus.value.offlineNum += 1
|
2024-10-31 13:48:17 +08:00
|
|
|
} else if (state === 11) {
|
2024-11-08 15:44:06 +08:00
|
|
|
currentDayStatus.value.faultCapacityTotal += item.nominalCapacity
|
|
|
|
currentDayStatus.value.faultNum += 1
|
2024-10-31 09:21:15 +08:00
|
|
|
}
|
2024-10-31 13:48:17 +08:00
|
|
|
const propertiesToFormat = [
|
|
|
|
'runCapacityTotal',
|
|
|
|
'standbyCapacityTotal',
|
|
|
|
'StandCapacityTotal',
|
|
|
|
'StartCapacityTotal',
|
|
|
|
'offlineCapacityTotal',
|
|
|
|
'faultCapacityTotal',
|
2024-11-08 15:44:06 +08:00
|
|
|
'installedCapacity',
|
|
|
|
]
|
2024-10-31 13:48:17 +08:00
|
|
|
|
2024-11-08 15:44:06 +08:00
|
|
|
propertiesToFormat.forEach((property) => {
|
2024-10-31 13:48:17 +08:00
|
|
|
if (currentDayStatus.value[property] !== null && currentDayStatus.value[property] !== undefined) {
|
2024-11-08 15:59:03 +08:00
|
|
|
currentDayStatus.value[property] = Number(currentDayStatus.value[property].toFixed(1))
|
2024-10-31 13:48:17 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
})
|
2024-10-31 13:48:17 +08:00
|
|
|
return {
|
2024-11-08 15:44:06 +08:00
|
|
|
irn: item.irn,
|
|
|
|
name: item.name ?? '-',
|
|
|
|
model: item.model || '-',
|
|
|
|
modelId: item.modelId,
|
|
|
|
belongLine: item.belongLine || '-',
|
|
|
|
standard: item.standard,
|
|
|
|
attributeMap: {
|
|
|
|
iwindspeed: item.attributeMap.iwindspeed,
|
|
|
|
igenpower: item.attributeMap.igenpower,
|
|
|
|
ikwhthisday: item.attributeMap.ikwhthisday,
|
|
|
|
iturbineoperationmode: state,
|
|
|
|
locked: item.attributeMap.locked,
|
2024-11-18 18:14:19 +08:00
|
|
|
irotorspeed: item.attributeMap.irotorspeed,
|
2024-11-08 15:44:06 +08:00
|
|
|
},
|
2024-10-31 13:48:17 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
})
|
|
|
|
FanList.value = data
|
|
|
|
} else {
|
2024-10-31 09:21:15 +08:00
|
|
|
ElMessage.error({
|
|
|
|
message: res.msg,
|
|
|
|
type: 'error',
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
|
2024-11-01 17:16:10 +08:00
|
|
|
|
2024-10-31 16:49:12 +08:00
|
|
|
|
|
|
|
|
2024-11-06 16:10:25 +08:00
|
|
|
const timestampToTime = (timestamp: any) => {
|
|
|
|
timestamp = timestamp ? timestamp : null
|
|
|
|
let date = new Date(timestamp)
|
|
|
|
let Y = date.getFullYear() + '-'
|
|
|
|
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
|
|
|
|
let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '
|
|
|
|
let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
|
|
|
|
let m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
|
|
|
|
return Y + M + D + h + m
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
const tableData = ref()
|
2024-06-13 11:30:23 +08:00
|
|
|
|
2024-11-06 16:10:25 +08:00
|
|
|
const getTableData = (deviceCode) => {
|
2024-11-08 15:44:06 +08:00
|
|
|
const today = new Date()
|
|
|
|
const threeDaysAgo = new Date(today)
|
|
|
|
threeDaysAgo.setDate(today.getDate() - 3)
|
|
|
|
const startTime = threeDaysAgo.getTime()
|
|
|
|
const data: any = {
|
2024-11-06 16:10:25 +08:00
|
|
|
startTime: startTime,
|
|
|
|
endTime: Date.now(),
|
2024-11-08 15:44:06 +08:00
|
|
|
deviceCode: deviceCode,
|
|
|
|
limit: 100,
|
2024-10-24 09:04:51 +08:00
|
|
|
}
|
2024-11-06 16:10:25 +08:00
|
|
|
console.log(JSON.stringify(data))
|
2024-11-06 16:31:28 +08:00
|
|
|
getAlarmListReq(data).then((res) => {
|
2024-11-06 16:10:25 +08:00
|
|
|
if (res.code == 200) {
|
|
|
|
//tableData.value = res.rows
|
|
|
|
tableData.value = res.rows.map((item: any) => {
|
|
|
|
return {
|
|
|
|
...item,
|
|
|
|
eventTimeFormate: timestampToTime(item.eventTime),
|
|
|
|
}
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
ElMessage.error(res.msg ?? '查询失败')
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
const open = (val: any) => {
|
|
|
|
ElMessageBox.confirm('是否确认?', '提示', {
|
|
|
|
confirmButtonText: '确认',
|
|
|
|
cancelButtonText: '取消',
|
|
|
|
type: 'warning',
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
okSubmit(val)
|
|
|
|
})
|
|
|
|
.catch(() => {
|
|
|
|
ElMessage({
|
|
|
|
type: 'info',
|
|
|
|
message: '取消确认',
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
const okSubmit = (val: any) => {
|
|
|
|
const reqData: any = [
|
|
|
|
{
|
|
|
|
eventTime: val.eventTime,
|
|
|
|
eventId: val.eventId,
|
|
|
|
confirmed: 1,
|
|
|
|
deviceId: val.deviceId,
|
|
|
|
},
|
|
|
|
]
|
2024-11-06 16:31:28 +08:00
|
|
|
eventComfirm(reqData)
|
2024-11-06 16:10:25 +08:00
|
|
|
.then((res: any) => {
|
|
|
|
if (res.code == 200) {
|
|
|
|
ElMessage.success(res.msg ?? '确认成功')
|
|
|
|
getTableData(deviceCode.value)
|
|
|
|
} else {
|
|
|
|
ElMessage.error(res.msg ?? '查询失败')
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch((err) => {
|
|
|
|
ElMessage.error(err?.response?.data?.msg ?? '查询失败')
|
|
|
|
})
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
|
2024-11-19 13:44:32 +08:00
|
|
|
const scrollRef=ref()
|
2024-10-24 09:04:51 +08:00
|
|
|
const clearScroll = () => {
|
|
|
|
clearInterval(timer)
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-10-24 09:04:51 +08:00
|
|
|
const createScroll = () => {
|
|
|
|
clearScroll()
|
2024-11-19 13:44:32 +08:00
|
|
|
timer =setInterval(() => {
|
2024-11-20 15:45:12 +08:00
|
|
|
scrollRef.value.scrollLeft += 1;
|
|
|
|
if (scrollRef.value.clientWidth + scrollRef.value.scrollLeft == scrollRef.value.scrollWidth) {
|
|
|
|
scrollRef.value.scrollLeft = 0
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-20 15:45:12 +08:00
|
|
|
//scrollRef.value.scrollTop += 1
|
|
|
|
/* if (scrollRef.value.clientHeight + scrollRef.value.scrollTop == scrollRef.value.scrollHeight) {
|
|
|
|
scrollRef.value.scrollTop = 0
|
|
|
|
}*/
|
2024-11-19 13:44:32 +08:00
|
|
|
}, 30);
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
|
|
|
|
2024-11-01 17:16:10 +08:00
|
|
|
|
|
|
|
|
2024-10-24 09:04:51 +08:00
|
|
|
const activeName = ref('first')
|
2024-11-01 17:16:10 +08:00
|
|
|
//let autoUpdateTimer: any = null
|
|
|
|
let autoUpdateForSecondTimer: any = null
|
|
|
|
let autoUpdateTimerForMinuteTimer: any = null
|
|
|
|
let autoUpdateTimerForHourTimer: any = null
|
2024-10-31 09:21:15 +08:00
|
|
|
const autoUpdate = () => {
|
2024-11-01 17:16:10 +08:00
|
|
|
if (!autoUpdateForSecondTimer) {
|
|
|
|
autoUpdateForSecondTimer = setInterval(() => {
|
2024-10-31 09:21:15 +08:00
|
|
|
StatusListData()
|
2024-11-01 17:16:10 +08:00
|
|
|
overviewList()
|
2024-10-31 09:21:15 +08:00
|
|
|
}, 2000)
|
|
|
|
}
|
2024-11-19 13:44:32 +08:00
|
|
|
|
2024-10-31 09:21:15 +08:00
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
const HomeHight = ref()
|
|
|
|
const computedHeight = reactive({
|
|
|
|
powerHeight: '298px',
|
|
|
|
centerHeight: '1100px',
|
|
|
|
alarmHeight: '350px',
|
|
|
|
})
|
|
|
|
const sizeChange = () => {
|
|
|
|
const rect = HomeHight.value?.getBoundingClientRect()
|
|
|
|
if (!rect) return
|
2024-11-13 17:28:29 +08:00
|
|
|
computedHeight.powerHeight = rect.height - 630 + 'px'
|
2024-11-19 13:44:32 +08:00
|
|
|
computedHeight.alarmHeight = rect.height - 5 + 'px'
|
2024-11-20 15:45:12 +08:00
|
|
|
computedHeight.centerHeight = rect.height - 0 + 'px'
|
2024-11-13 10:46:37 +08:00
|
|
|
if (window.screen.width < 1360) {
|
2024-11-19 13:44:32 +08:00
|
|
|
computedHeight.alarmHeight = '300px'
|
2024-11-13 10:46:37 +08:00
|
|
|
computedHeight.powerHeight = '200px'
|
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
window.addEventListener('resize', sizeChange)
|
|
|
|
sizeChange()
|
2024-11-19 13:44:32 +08:00
|
|
|
//getAllChartData()
|
2024-11-11 16:24:03 +08:00
|
|
|
createScroll()
|
2024-11-19 13:44:32 +08:00
|
|
|
// overviewList()
|
2024-11-11 16:24:03 +08:00
|
|
|
StatusListData()
|
|
|
|
autoUpdate()
|
|
|
|
|
|
|
|
equipList({ objectType: 10002 }).then((res) => {
|
|
|
|
res.data.map((item: any) => {
|
|
|
|
deviceCode.value.push(item.name)
|
|
|
|
})
|
|
|
|
|
|
|
|
getTableData(deviceCode.value)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2024-10-31 09:21:15 +08:00
|
|
|
onUnmounted(() => {
|
2024-11-11 16:24:03 +08:00
|
|
|
window.removeEventListener('resize', sizeChange)
|
2024-10-31 09:21:15 +08:00
|
|
|
clearInterval(timer)
|
2024-11-01 17:16:10 +08:00
|
|
|
autoUpdateForSecondTimer && clearInterval(autoUpdateForSecondTimer)
|
2024-11-19 13:44:32 +08:00
|
|
|
/*const chartKeys = Object.keys(state.charts) as Array<keyof typeof state.charts>
|
2024-10-31 16:49:12 +08:00
|
|
|
chartKeys.forEach((key) => {
|
|
|
|
state.charts[key].dispose()
|
2024-11-19 13:44:32 +08:00
|
|
|
})*/
|
2024-11-08 15:44:06 +08:00
|
|
|
})
|
2024-06-13 11:30:23 +08:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
2024-11-11 16:24:03 +08:00
|
|
|
$marginNum: 10px;
|
2024-11-20 15:45:12 +08:00
|
|
|
$labelHeight: 30px;
|
2024-11-11 16:24:03 +08:00
|
|
|
@mixin cardDefaultStyle {
|
|
|
|
margin-top: $marginNum;
|
|
|
|
margin-bottom: $marginNum;
|
|
|
|
padding: 10px;
|
|
|
|
border-radius: 10px;
|
|
|
|
background-color: #fff;
|
|
|
|
}
|
|
|
|
@mixin cardlabel {
|
|
|
|
.cardLabel {
|
2024-11-20 15:45:12 +08:00
|
|
|
width: 200px;
|
2024-11-11 16:24:03 +08:00
|
|
|
height: $labelHeight;
|
|
|
|
font-size: 18px;
|
|
|
|
font-weight: 600;
|
|
|
|
color: #4e5969;
|
2024-11-20 15:45:12 +08:00
|
|
|
line-height: 30px;
|
|
|
|
/* padding-left: 10px;*/
|
2024-11-08 15:44:06 +08:00
|
|
|
}
|
|
|
|
}
|
2024-10-24 09:04:51 +08:00
|
|
|
.default-main {
|
2024-11-11 16:24:03 +08:00
|
|
|
width: 100%;
|
2024-11-13 17:28:29 +08:00
|
|
|
height: 100%;
|
2024-11-19 13:44:32 +08:00
|
|
|
/* min-height: 920px;*/
|
2024-10-24 09:04:51 +08:00
|
|
|
padding: 0;
|
|
|
|
margin: 0;
|
2024-11-08 15:44:06 +08:00
|
|
|
color: #4e5969;
|
|
|
|
background-color: #f2f3f5;
|
2024-11-18 18:14:19 +08:00
|
|
|
.el-row {
|
2024-11-13 17:28:29 +08:00
|
|
|
width: calc(100% - 0px);
|
2024-11-18 18:14:19 +08:00
|
|
|
.el-col {
|
2024-11-13 17:28:29 +08:00
|
|
|
height: calc(100% - 10px);
|
|
|
|
}
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.content-number {
|
2024-10-24 09:04:51 +08:00
|
|
|
color: #333333;
|
|
|
|
font-size: 20px;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.homelabel {
|
2024-10-24 09:04:51 +08:00
|
|
|
font-family: PingFangSC-Semibold;
|
|
|
|
font-size: 18px;
|
2024-11-08 15:44:06 +08:00
|
|
|
color: #4e5969;
|
2024-10-24 09:04:51 +08:00
|
|
|
letter-spacing: 0;
|
|
|
|
line-height: 18px;
|
|
|
|
font-weight: 600;
|
2024-11-20 15:45:12 +08:00
|
|
|
margin-bottom: 10px;
|
2024-06-13 11:30:23 +08:00
|
|
|
display: block;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.grid-content {
|
2024-11-13 10:46:37 +08:00
|
|
|
/* overflow-x: hidden;*/
|
2024-11-06 17:53:49 +08:00
|
|
|
width: 100%;
|
2024-10-24 09:04:51 +08:00
|
|
|
height: 100%;
|
2024-11-08 15:44:06 +08:00
|
|
|
.panelBg {
|
2024-10-24 09:04:51 +08:00
|
|
|
background-color: #ffffff;
|
2024-11-20 15:45:12 +08:00
|
|
|
padding: 10px;
|
2024-10-24 09:04:51 +08:00
|
|
|
border-radius: 5px;
|
2024-11-20 15:45:12 +08:00
|
|
|
margin-bottom: 10px;
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.overview {
|
2024-11-13 10:46:37 +08:00
|
|
|
/* @include cardDefaultStyle;
|
2024-11-11 16:24:03 +08:00
|
|
|
@include cardlabel;*/
|
|
|
|
min-height: 216px;
|
2024-11-08 15:44:06 +08:00
|
|
|
.small-panel {
|
2024-10-24 09:04:51 +08:00
|
|
|
display: flex;
|
2024-11-08 15:44:06 +08:00
|
|
|
border: 1px solid #e1edf6;
|
2024-10-24 09:04:51 +08:00
|
|
|
border-radius: 10px;
|
|
|
|
padding: 10px;
|
2024-11-08 15:44:06 +08:00
|
|
|
.small-panel-pic {
|
2024-10-31 09:32:37 +08:00
|
|
|
width: 36px;
|
|
|
|
height: 36px;
|
2024-10-24 09:04:51 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.small-base {
|
2024-11-11 16:24:03 +08:00
|
|
|
word-break: keep-all;
|
2024-10-24 09:04:51 +08:00
|
|
|
margin-left: 10px;
|
|
|
|
color: #2c3f5d;
|
|
|
|
}
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.status {
|
2024-11-13 10:46:37 +08:00
|
|
|
/* @include cardDefaultStyle;
|
2024-11-11 16:24:03 +08:00
|
|
|
@include cardlabel;*/
|
|
|
|
min-height: 374px;
|
2024-11-08 15:44:06 +08:00
|
|
|
.statusrow {
|
2024-10-24 09:04:51 +08:00
|
|
|
margin-bottom: 10px;
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.status-con {
|
2024-10-24 09:04:51 +08:00
|
|
|
padding-left: 20px !important;
|
2024-11-08 15:44:06 +08:00
|
|
|
background: #f0f6ff;
|
2024-10-24 09:04:51 +08:00
|
|
|
border-radius: 10px;
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.status-panel {
|
2024-10-24 09:04:51 +08:00
|
|
|
display: flex;
|
|
|
|
padding: 10px;
|
|
|
|
font-size: 12px;
|
2024-11-08 15:44:06 +08:00
|
|
|
.status-panel-pic {
|
2024-10-24 09:04:51 +08:00
|
|
|
width: 60px;
|
|
|
|
height: 60px;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.status-base-main {
|
2024-11-11 16:24:03 +08:00
|
|
|
word-break: keep-all;
|
2024-10-24 09:04:51 +08:00
|
|
|
margin-left: 10px;
|
|
|
|
line-height: 23px;
|
|
|
|
padding-top: 6px;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.status-base {
|
2024-10-31 09:21:15 +08:00
|
|
|
margin-left: 10px;
|
|
|
|
line-height: 23px;
|
2024-11-08 15:44:06 +08:00
|
|
|
padding: 6px 10px 0 10px;
|
2024-10-31 09:21:15 +08:00
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
width: 100%;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.status-panel-piczt {
|
2024-10-31 09:32:37 +08:00
|
|
|
width: 24px;
|
|
|
|
height: 24px;
|
2024-10-24 09:04:51 +08:00
|
|
|
}
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.power {
|
2024-11-11 16:24:03 +08:00
|
|
|
@include cardDefaultStyle;
|
|
|
|
@include cardlabel;
|
|
|
|
width: 100%;
|
2024-11-13 17:28:29 +08:00
|
|
|
min-height: 290px;
|
2024-11-11 16:24:03 +08:00
|
|
|
height: v-bind('computedHeight.powerHeight');
|
2024-11-13 10:46:37 +08:00
|
|
|
.chartBox {
|
2024-11-11 16:24:03 +08:00
|
|
|
height: calc(100% - $labelHeight);
|
2024-11-08 17:45:25 +08:00
|
|
|
.power-chart {
|
2024-11-11 16:24:03 +08:00
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
2024-11-07 16:06:22 +08:00
|
|
|
}
|
2024-10-24 09:04:51 +08:00
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.matrix {
|
2024-11-20 15:45:12 +08:00
|
|
|
@include cardlabel;
|
2024-11-08 15:44:06 +08:00
|
|
|
background: url('/@/assets/dashboard/bg1.png') no-repeat #ffffff;
|
2024-10-24 09:04:51 +08:00
|
|
|
background-size: 100% 100%;
|
2024-11-19 13:44:32 +08:00
|
|
|
/* min-height: 900px;*/
|
2024-11-11 16:24:03 +08:00
|
|
|
width: 100%;
|
|
|
|
height: v-bind('computedHeight.centerHeight');
|
|
|
|
margin-bottom: 0;
|
2024-11-18 18:14:19 +08:00
|
|
|
.el-scrollbar {
|
2024-11-13 17:28:29 +08:00
|
|
|
height: calc(100% - 20px);
|
|
|
|
}
|
2024-11-20 15:45:12 +08:00
|
|
|
.homeHeader{
|
|
|
|
display: flex;
|
|
|
|
}
|
|
|
|
.realAlert{
|
|
|
|
overflow: hidden;
|
|
|
|
white-space: nowrap;
|
|
|
|
cursor: pointer;
|
|
|
|
line-height: 30px;
|
|
|
|
p{
|
|
|
|
padding-right: 30px;
|
|
|
|
display: inline-block;
|
|
|
|
}
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.summarize {
|
2024-11-11 16:24:03 +08:00
|
|
|
padding: 10px;
|
|
|
|
border-radius: 10px;
|
|
|
|
background-color: #fff;
|
|
|
|
margin-bottom: 20px;
|
|
|
|
word-break: keep-all;
|
|
|
|
@include cardlabel;
|
|
|
|
min-height: 224px;
|
|
|
|
.summarize-panel-list {
|
|
|
|
width: 100%;
|
2024-10-24 09:04:51 +08:00
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.summarize-panel {
|
2024-10-24 09:04:51 +08:00
|
|
|
margin: 5px;
|
2024-11-11 16:24:03 +08:00
|
|
|
width: 25%;
|
|
|
|
display: flex;
|
|
|
|
padding: 20px 0;
|
|
|
|
flex-direction: column;
|
|
|
|
align-items: center;
|
|
|
|
background-color: #f0f6ff;
|
|
|
|
border-radius: 10px;
|
2024-11-08 15:44:06 +08:00
|
|
|
.summarize-panel-base {
|
2024-11-11 16:24:03 +08:00
|
|
|
width: 100%;
|
|
|
|
flex-direction: column;
|
|
|
|
align-items: center;
|
|
|
|
div {
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
font-size: 14px;
|
|
|
|
color: rgb(78, 89, 105);
|
|
|
|
.content-number {
|
|
|
|
color: #333333;
|
|
|
|
font-size: 20px;
|
|
|
|
}
|
|
|
|
}
|
2024-10-24 09:04:51 +08:00
|
|
|
}
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
|
2024-11-08 15:44:06 +08:00
|
|
|
.trend {
|
2024-11-11 16:24:03 +08:00
|
|
|
min-height: 300px;
|
|
|
|
height: 335px;
|
2024-10-24 09:04:51 +08:00
|
|
|
overflow: hidden;
|
2024-11-08 15:44:06 +08:00
|
|
|
.trend-tabs {
|
|
|
|
:deep(.el-tabs__item) {
|
2024-10-24 09:04:51 +08:00
|
|
|
border: none;
|
|
|
|
text-align: center;
|
|
|
|
width: 40px;
|
|
|
|
padding: 0;
|
|
|
|
line-height: 24px;
|
|
|
|
height: 24px;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
:deep(.el-tabs__header .el-tabs__nav) {
|
2024-10-24 09:04:51 +08:00
|
|
|
border-radius: 0;
|
|
|
|
border: none;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
:deep(.el-tabs__header) {
|
2024-10-24 09:04:51 +08:00
|
|
|
border-bottom: 0;
|
|
|
|
float: right;
|
2024-11-08 15:44:06 +08:00
|
|
|
margin-top: -43px;
|
2024-10-24 09:04:51 +08:00
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
:deep(.el-tabs__content) {
|
2024-10-24 09:04:51 +08:00
|
|
|
clear: both;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
:deep(.el-tabs__item.is-active) {
|
|
|
|
background: rgba(2, 119, 179, 0.2);
|
2024-10-24 09:04:51 +08:00
|
|
|
border-radius: 4px;
|
|
|
|
border: none;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
:deep(.el-tabs__nav-wrap:after) {
|
2024-10-24 09:04:51 +08:00
|
|
|
background: none;
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
:deep(.el-tabs__active-bar) {
|
2024-10-24 09:04:51 +08:00
|
|
|
background: none;
|
|
|
|
}
|
|
|
|
}
|
2024-11-08 15:44:06 +08:00
|
|
|
.trend-chart {
|
2024-10-24 09:04:51 +08:00
|
|
|
width: 100%;
|
|
|
|
height: 260px;
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
2024-11-08 15:59:03 +08:00
|
|
|
.realPart {
|
2024-11-11 16:24:03 +08:00
|
|
|
height: v-bind('computedHeight.alarmHeight');
|
2024-11-19 13:44:32 +08:00
|
|
|
.realAlert{
|
|
|
|
height: calc(100% - 20px);
|
|
|
|
overflow: hidden;
|
|
|
|
ul li{
|
|
|
|
list-style: none;
|
|
|
|
line-height: 30px;
|
|
|
|
border-bottom: 1px #dddddd dashed;
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
}
|
2024-11-08 11:31:40 +08:00
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@media screen and (max-width: 1920px) {
|
|
|
|
.default-main {
|
2024-11-13 10:46:37 +08:00
|
|
|
.trend {
|
|
|
|
height: 315px !important;
|
2024-11-08 17:45:25 +08:00
|
|
|
}
|
2024-11-13 10:46:37 +08:00
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
}
|
|
|
|
@media screen and (max-width: 1280px) {
|
|
|
|
.default-main {
|
2024-11-13 17:28:29 +08:00
|
|
|
/*height: auto !important;*/
|
2024-11-18 18:14:19 +08:00
|
|
|
.windtitle {
|
2024-11-13 17:28:29 +08:00
|
|
|
margin-bottom: 10px;
|
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
.summarize {
|
2024-11-13 10:46:37 +08:00
|
|
|
.summarize-panel {
|
2024-11-11 16:24:03 +08:00
|
|
|
margin: 2px !important;
|
2024-11-13 17:28:29 +08:00
|
|
|
.summarize-panel-base {
|
|
|
|
white-space: normal !important;
|
|
|
|
}
|
2024-11-08 11:31:40 +08:00
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-11-18 18:27:52 +08:00
|
|
|
@media screen and (max-width: 1360px) {
|
2024-11-13 17:28:29 +08:00
|
|
|
.default-main {
|
2024-11-18 18:27:52 +08:00
|
|
|
font-size: 11px !important;
|
2024-11-13 17:28:29 +08:00
|
|
|
.summarize {
|
|
|
|
word-break: break-all !important;
|
|
|
|
}
|
2024-11-13 10:46:37 +08:00
|
|
|
.overview {
|
|
|
|
.small-panel {
|
2024-11-11 16:24:03 +08:00
|
|
|
.small-base {
|
|
|
|
margin-left: 0px !important;
|
2024-11-13 17:28:29 +08:00
|
|
|
font-size: 11px !important;
|
2024-11-11 16:24:03 +08:00
|
|
|
}
|
2024-11-07 16:06:22 +08:00
|
|
|
}
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
@media screen and (max-width: 1480px) {
|
2024-11-08 15:59:03 +08:00
|
|
|
.default-main {
|
2024-11-11 16:24:03 +08:00
|
|
|
font-size: 12px !important;
|
2024-11-13 10:46:37 +08:00
|
|
|
.overview {
|
|
|
|
.small-panel {
|
2024-11-11 16:24:03 +08:00
|
|
|
padding: 13px 0px !important;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.status {
|
|
|
|
.status-panel {
|
2024-11-13 10:46:37 +08:00
|
|
|
.status-base-main {
|
2024-11-11 16:24:03 +08:00
|
|
|
margin-left: 5px !important;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
}
|
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
@media screen and (max-width: 1680px) {
|
2024-11-08 17:45:25 +08:00
|
|
|
.default-main {
|
2024-11-11 16:24:03 +08:00
|
|
|
/*font-size: 12px !important;*/
|
|
|
|
.content-number {
|
|
|
|
font-size: 16px !important;
|
|
|
|
}
|
|
|
|
|
|
|
|
.homelabel {
|
|
|
|
font-size: 16px !important;
|
|
|
|
margin-bottom: 10px !important;
|
|
|
|
}
|
|
|
|
.grid-content {
|
2024-11-18 18:14:19 +08:00
|
|
|
.cardLabel {
|
2024-11-13 17:28:29 +08:00
|
|
|
font-size: 16px !important;
|
|
|
|
}
|
2024-11-11 16:24:03 +08:00
|
|
|
.panelBg {
|
|
|
|
/* padding: 10px !important;*/
|
|
|
|
margin-bottom: 10px !important;
|
|
|
|
}
|
2024-11-13 10:46:37 +08:00
|
|
|
.summarize {
|
2024-11-11 16:24:03 +08:00
|
|
|
margin-bottom: 10px !important;
|
|
|
|
}
|
|
|
|
}
|
2024-11-13 10:46:37 +08:00
|
|
|
.toal-panel {
|
2024-11-11 16:24:03 +08:00
|
|
|
padding: 0 !important;
|
|
|
|
padding-bottom: 10px !important;
|
|
|
|
}
|
2024-11-18 18:27:52 +08:00
|
|
|
// .matrix {
|
|
|
|
// height: 900px !important;
|
|
|
|
// }
|
2024-11-11 16:24:03 +08:00
|
|
|
:deep(.el-tabs__header) {
|
|
|
|
margin-top: -33px !important;
|
|
|
|
}
|
2024-11-13 10:46:37 +08:00
|
|
|
.overview {
|
|
|
|
.small-panel {
|
2024-11-11 16:24:03 +08:00
|
|
|
.small-base {
|
|
|
|
margin-left: 5px !important;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-11-08 17:45:25 +08:00
|
|
|
}
|
|
|
|
}
|
2024-06-13 11:30:23 +08:00
|
|
|
</style>
|