|
|
@@ -20,20 +20,21 @@
|
|
|
v-for="(item, idx) in scrollList"
|
|
|
:key="idx"
|
|
|
class="sensor-item"
|
|
|
- :class="{ alert: item.alert }"
|
|
|
+ :class="{ alert: item.hasException }"
|
|
|
>
|
|
|
<div class="sensor-item-head">
|
|
|
- <span class="sensor-name">{{ item.name }}({{ item.room }})</span>
|
|
|
+ <span class="sensor-name">{{ item.subName }}({{ item.roomNum }})</span>
|
|
|
<span class="sensor-unit">{{ item.unit }}</span>
|
|
|
- <span v-if="item.alert" class="sensor-status alarm-status">🚨 告警</span>
|
|
|
+ <span v-if="item.hasException" class="sensor-status alarm-status">🚨 告警</span>
|
|
|
<span v-else class="sensor-status normal-status">● 正常</span>
|
|
|
</div>
|
|
|
<div class="sensor-metrics">
|
|
|
- <div class="sensor-metric">🌡️ {{ item.t }}°C</div>
|
|
|
- <div class="sensor-metric">💧 {{ item.h }}%</div>
|
|
|
- <div class="sensor-metric" :class="{ alarm: item.tvoc > 0.6 }">🧪 TVOC {{ item.tvoc }}</div>
|
|
|
- <div class="sensor-metric" :class="{ alarm: item.co2 > 700 }">💨 CO₂ {{ item.co2 }}</div>
|
|
|
- <div class="sensor-metric">🫧 O₂ {{ item.o2 }}%</div>
|
|
|
+ <div class="sensor-metric" v-for="(minItem, mIdx) in item.sensorList" :key="mIdx">
|
|
|
+ <span class="span-svg">
|
|
|
+ <svgIcon icon-class="http://192.168.1.8/statics/2026/03/24/d3d2315f-4851-4563-8257-0bc64f08718f.svg"/>
|
|
|
+ </span>
|
|
|
+ <span class="span-text">{{ minItem.attributeName }} {{ minItem.deviceValue }}{{ minItem.unit }}</span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -43,9 +44,13 @@
|
|
|
|
|
|
<script>
|
|
|
import { getEnvMonitor } from '@/api/screen'
|
|
|
+import svgIcon from '@/components/svgIcon.vue'
|
|
|
|
|
|
export default {
|
|
|
name: 'LabEnvironment',
|
|
|
+ components: {
|
|
|
+ svgIcon,
|
|
|
+ },
|
|
|
data() {
|
|
|
return {
|
|
|
sensorList: [],
|
|
|
@@ -55,12 +60,20 @@ export default {
|
|
|
computed: {
|
|
|
/** Duplicate data for seamless CSS scroll loop */
|
|
|
scrollList() {
|
|
|
- return [...this.sensorList, ...this.sensorList]
|
|
|
+ if(this.sensorList[12]){
|
|
|
+ return [...this.sensorList, ...this.sensorList]
|
|
|
+ }else if(this.sensorList[0]){
|
|
|
+ return [...this.sensorList]
|
|
|
+ }else{
|
|
|
+ return []
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
mounted() {
|
|
|
this.fetchData()
|
|
|
- this.pollTimer = setInterval(this.fetchData, 5 * 60 * 1000)
|
|
|
+ if(this.sensorList[12]){
|
|
|
+ this.pollTimer = setInterval(this.fetchData, 5 * 60 * 1000)
|
|
|
+ }
|
|
|
},
|
|
|
beforeDestroy() {
|
|
|
if (this.pollTimer) clearInterval(this.pollTimer)
|
|
|
@@ -71,26 +84,7 @@ export default {
|
|
|
const res = await getEnvMonitor({ page: 1, pageSize: 20 })
|
|
|
if (res.code === 200) {
|
|
|
const records = (res.data.records || [])
|
|
|
- const list = []
|
|
|
- records.forEach(lab => {
|
|
|
- const sensors = lab.sensorList || []
|
|
|
- const get = (code) => {
|
|
|
- const s = sensors.find(s => s.code === code)
|
|
|
- return s ? s.deviceValue : null
|
|
|
- }
|
|
|
- list.push({
|
|
|
- name: lab.subName,
|
|
|
- room: lab.roomNum,
|
|
|
- unit: '',
|
|
|
- t: get('temperature'),
|
|
|
- h: get('humidity'),
|
|
|
- tvoc: get('tvoc'),
|
|
|
- co2: get('co2'),
|
|
|
- o2: get('o2'),
|
|
|
- alert: lab.hasException
|
|
|
- })
|
|
|
- })
|
|
|
- this.sensorList = list
|
|
|
+ this.sensorList = records
|
|
|
}
|
|
|
} catch (e) {
|
|
|
// 错误已由拦截器处理
|
|
|
@@ -336,4 +330,20 @@ export default {
|
|
|
animation: blinkRed 0.8s ease-in-out infinite;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.span-svg {
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ width: 28px;
|
|
|
+ height: 28px;
|
|
|
+ flex-shrink: 0;
|
|
|
+
|
|
|
+ img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: contain;
|
|
|
+ color:#fff;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|