2025-07-29 23:05:58 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<view class="container">
|
2025-07-31 14:24:05 +08:00
|
|
|
|
<view class="search-icon" @click="openSearch">
|
|
|
|
|
|
<uni-icons type="search" size="40" color="#fff"></uni-icons>
|
2025-07-29 23:05:58 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
<view class="list-container">
|
|
|
|
|
|
<view class="no-data" v-if="list.length === 0">暂无数据</view>
|
|
|
|
|
|
<uni-list v-else>
|
|
|
|
|
|
<uni-list-item v-for="(item,index) in list" :key="index+'dtdc'">
|
|
|
|
|
|
<template v-slot:header>
|
|
|
|
|
|
<view class="list-header">
|
|
|
|
|
|
单体编号:{{item.deviceId}}
|
2025-07-31 14:24:05 +08:00
|
|
|
|
<button type="primary" size="mini" class="charts" @click="toDetail(item)">图表</button>
|
2025-07-29 23:05:58 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<template v-slot:body>
|
|
|
|
|
|
<view class="list-body">
|
|
|
|
|
|
<uni-row>
|
|
|
|
|
|
<uni-col :span="8">
|
|
|
|
|
|
<view>簇号</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
<uni-col :span="14">
|
|
|
|
|
|
<view class="right">{{item.clusterDeviceId}}</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
</uni-row>
|
|
|
|
|
|
<uni-row>
|
|
|
|
|
|
<uni-col :span="8">
|
|
|
|
|
|
<view>电压(V)</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
<uni-col :span="14">
|
2025-07-30 22:56:25 +08:00
|
|
|
|
<view class="right color" @click="toDetail(item,'voltage')">{{item.voltage}}
|
2025-07-29 23:05:58 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
</uni-row>
|
|
|
|
|
|
<uni-row>
|
|
|
|
|
|
<uni-col :span="8">
|
|
|
|
|
|
<view>温度(℃)</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
<uni-col :span="14">
|
2025-07-30 22:56:25 +08:00
|
|
|
|
<view class="right color" @click="toDetail(item,'temperature')">
|
2025-07-29 23:05:58 +08:00
|
|
|
|
{{item.temperature}}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
</uni-row>
|
|
|
|
|
|
<uni-row>
|
|
|
|
|
|
<uni-col :span="8">
|
|
|
|
|
|
<view>SOC(%)</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
<uni-col :span="14">
|
2025-07-30 22:56:25 +08:00
|
|
|
|
<view class="right color" @click="toDetail(item,'soc')">{{item.soc}}</view>
|
2025-07-29 23:05:58 +08:00
|
|
|
|
</uni-col>
|
|
|
|
|
|
</uni-row>
|
|
|
|
|
|
<uni-row>
|
|
|
|
|
|
<uni-col :span="8">
|
|
|
|
|
|
<view>SOH(%)</view>
|
|
|
|
|
|
</uni-col>
|
|
|
|
|
|
<uni-col :span="14">
|
2025-07-30 22:56:25 +08:00
|
|
|
|
<view class="right color" @click="toDetail(item,'soh')">{{item.soh}}</view>
|
2025-07-29 23:05:58 +08:00
|
|
|
|
</uni-col>
|
|
|
|
|
|
</uni-row>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</uni-list-item>
|
|
|
|
|
|
</uni-list>
|
|
|
|
|
|
</view>
|
2025-07-30 22:56:25 +08:00
|
|
|
|
<chart ref="chart" :pageScrollTop="pageScrollTop" />
|
2025-07-31 14:24:05 +08:00
|
|
|
|
<uni-popup ref="searchPopup" type="center">
|
|
|
|
|
|
<view class="uni-pa-5 search-container">
|
|
|
|
|
|
<uni-forms ref="form">
|
|
|
|
|
|
<uni-forms-item label="电池堆">
|
|
|
|
|
|
<uni-data-select :clear="false" v-model="search.stackId" :localdata="stackOptions"
|
|
|
|
|
|
@change="changeStackId"></uni-data-select>
|
|
|
|
|
|
</uni-forms-item>
|
|
|
|
|
|
<uni-forms-item label="电池簇">
|
|
|
|
|
|
<uni-data-select :clear="false" v-model="search.clusterId"
|
|
|
|
|
|
:localdata="clusterOptions"></uni-data-select>
|
|
|
|
|
|
</uni-forms-item>
|
|
|
|
|
|
</uni-forms>
|
|
|
|
|
|
<view class="button-group" style="text-align: center;">
|
|
|
|
|
|
<button type="default" size="mini" @click="onReset">重置</button>
|
|
|
|
|
|
<button type="primary" size="mini" @click="onSearch" style="margin-left: 20px;">搜索</button>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</uni-popup>
|
2025-07-29 23:05:58 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
2025-07-30 22:56:25 +08:00
|
|
|
|
import Chart from './Chart.vue'
|
2025-07-29 23:05:58 +08:00
|
|
|
|
import {
|
|
|
|
|
|
getStackNameList,
|
|
|
|
|
|
getClusterNameList,
|
|
|
|
|
|
getClusterDataInfoList,
|
|
|
|
|
|
} from '@/api/ems/site.js'
|
|
|
|
|
|
import {
|
|
|
|
|
|
mapState
|
|
|
|
|
|
} from 'vuex'
|
|
|
|
|
|
export default {
|
2025-07-30 22:56:25 +08:00
|
|
|
|
components: {
|
|
|
|
|
|
Chart
|
|
|
|
|
|
},
|
2025-07-29 23:05:58 +08:00
|
|
|
|
computed: {
|
|
|
|
|
|
...mapState({
|
|
|
|
|
|
workStatusOptions: (state) =>
|
|
|
|
|
|
state.ems.workStatusOptions,
|
|
|
|
|
|
communicationStatusOptions: (state) =>
|
|
|
|
|
|
state.ems.communicationStatusOptions,
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
data() {
|
|
|
|
|
|
return {
|
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
|
pageSize: 20,
|
|
|
|
|
|
total: 0,
|
|
|
|
|
|
stackOptions: [],
|
|
|
|
|
|
clusterOptions: [],
|
|
|
|
|
|
search: {
|
|
|
|
|
|
stackId: '',
|
|
|
|
|
|
clusterId: ''
|
|
|
|
|
|
},
|
|
|
|
|
|
list: [],
|
|
|
|
|
|
siteId: '',
|
2025-07-30 22:56:25 +08:00
|
|
|
|
pageScrollTop: 0,
|
2025-07-29 23:05:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
2025-07-30 22:56:25 +08:00
|
|
|
|
onPageScroll(e) {
|
|
|
|
|
|
this.pageScrollTop = e.scrollTop
|
|
|
|
|
|
},
|
2025-07-29 23:05:58 +08:00
|
|
|
|
methods: {
|
2025-07-31 14:24:05 +08:00
|
|
|
|
openSearch() {
|
|
|
|
|
|
this.$refs.searchPopup.open()
|
|
|
|
|
|
},
|
|
|
|
|
|
closeSearch() {
|
|
|
|
|
|
this.$refs.searchPopup.close()
|
|
|
|
|
|
},
|
2025-07-30 22:56:25 +08:00
|
|
|
|
toDetail(item, dataType) {
|
|
|
|
|
|
const {
|
|
|
|
|
|
clusterDeviceId,
|
|
|
|
|
|
deviceId
|
|
|
|
|
|
} = item, {
|
|
|
|
|
|
siteId
|
|
|
|
|
|
} = this
|
|
|
|
|
|
this.$refs.chart.open({
|
|
|
|
|
|
siteId,
|
|
|
|
|
|
clusterDeviceId,
|
|
|
|
|
|
deviceId
|
|
|
|
|
|
}, dataType)
|
|
|
|
|
|
},
|
2025-07-29 23:05:58 +08:00
|
|
|
|
onReachBottom() {
|
|
|
|
|
|
console.log('触底了')
|
|
|
|
|
|
this.pageNum += 1 //每次搜索从1开始搜索
|
|
|
|
|
|
this.getTableData()
|
|
|
|
|
|
},
|
|
|
|
|
|
// 搜索
|
|
|
|
|
|
onSearch() {
|
|
|
|
|
|
this.pageNum = 1 //每次搜索从1开始搜索
|
|
|
|
|
|
this.getTableData(true)
|
2025-07-31 14:24:05 +08:00
|
|
|
|
this.closeSearch()
|
2025-07-29 23:05:58 +08:00
|
|
|
|
},
|
|
|
|
|
|
// 重置
|
|
|
|
|
|
// 清空搜索栏选中数据
|
|
|
|
|
|
// 清空电池簇列表,保留电池堆列表
|
|
|
|
|
|
onReset() {
|
|
|
|
|
|
this.search = {
|
|
|
|
|
|
stackId: '',
|
|
|
|
|
|
clusterId: ''
|
|
|
|
|
|
}
|
|
|
|
|
|
this.clusterOptions = []
|
|
|
|
|
|
this.pageNum = 1
|
|
|
|
|
|
this.getTableData(true)
|
2025-07-31 14:24:05 +08:00
|
|
|
|
this.closeSearch()
|
2025-07-29 23:05:58 +08:00
|
|
|
|
},
|
|
|
|
|
|
changeStackId(val) {
|
|
|
|
|
|
if (val) {
|
|
|
|
|
|
console.log('选择了电池堆,需要获取对应的电池簇', val, this.search.stackId)
|
|
|
|
|
|
this.search.clusterId = ''
|
|
|
|
|
|
this.getClusterList()
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
getStackList() {
|
|
|
|
|
|
getStackNameList({
|
|
|
|
|
|
siteId: this.siteId
|
|
|
|
|
|
}).then(response => {
|
|
|
|
|
|
this.stackOptions = JSON.parse(JSON.stringify(response?.data || [])).map(item => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
text: item.deviceName,
|
|
|
|
|
|
value: item.id
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
getClusterList() {
|
|
|
|
|
|
getClusterNameList({
|
|
|
|
|
|
stackDeviceId: this.search.stackId,
|
|
|
|
|
|
siteId: this.siteId
|
|
|
|
|
|
}).then(response => {
|
|
|
|
|
|
this.clusterOptions = JSON.parse(JSON.stringify(response?.data || [])).map(item => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
text: item.deviceName,
|
|
|
|
|
|
value: item.id
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}).finally(() => {})
|
|
|
|
|
|
},
|
|
|
|
|
|
//表格数据
|
|
|
|
|
|
getTableData(reset = false) {
|
|
|
|
|
|
if (!reset && this.list.length === this.total) return
|
|
|
|
|
|
uni.showLoading()
|
|
|
|
|
|
if (reset) {
|
|
|
|
|
|
this.list = []
|
|
|
|
|
|
this.total = 0
|
|
|
|
|
|
}
|
|
|
|
|
|
const {
|
|
|
|
|
|
stackId: stackDeviceId,
|
|
|
|
|
|
clusterId: clusterDeviceId
|
|
|
|
|
|
} = this.search
|
|
|
|
|
|
const {
|
|
|
|
|
|
siteId,
|
|
|
|
|
|
pageNum,
|
|
|
|
|
|
pageSize
|
|
|
|
|
|
} = this
|
|
|
|
|
|
getClusterDataInfoList({
|
|
|
|
|
|
stackDeviceId,
|
|
|
|
|
|
clusterDeviceId,
|
|
|
|
|
|
siteId,
|
|
|
|
|
|
pageNum,
|
|
|
|
|
|
pageSize
|
|
|
|
|
|
}).then(response => {
|
|
|
|
|
|
this.list = this.list.concat(response?.rows || []);
|
|
|
|
|
|
this.total = response?.total || 0
|
|
|
|
|
|
}).finally(() => {
|
|
|
|
|
|
uni.hideLoading()
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
mounted() {
|
|
|
|
|
|
// uni.showLoading()
|
|
|
|
|
|
this.siteId = this.$route.query.siteId || ''
|
|
|
|
|
|
this.getStackList()
|
|
|
|
|
|
this.getTableData(true)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
|
.container {
|
|
|
|
|
|
position: relative;
|
2025-07-31 14:24:05 +08:00
|
|
|
|
|
2025-07-29 23:05:58 +08:00
|
|
|
|
// position: fixed;
|
|
|
|
|
|
// width: 100%;
|
|
|
|
|
|
// height: 100%;
|
|
|
|
|
|
// overflow-y: auto;
|
2025-07-31 14:24:05 +08:00
|
|
|
|
.search-icon {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
bottom: 20px;
|
|
|
|
|
|
right: 20px;
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
height: 50px;
|
|
|
|
|
|
width: 50px;
|
|
|
|
|
|
background-color: #007aff;
|
|
|
|
|
|
border-radius: 100%;
|
|
|
|
|
|
line-height: 50px;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
}
|
2025-07-29 23:05:58 +08:00
|
|
|
|
|
|
|
|
|
|
.search-container {
|
|
|
|
|
|
background: #ffffff;
|
2025-07-31 14:24:05 +08:00
|
|
|
|
width: 360px;
|
|
|
|
|
|
padding: 15px 20px;
|
2025-07-29 23:05:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.list-container {
|
|
|
|
|
|
// z-index: 10;
|
|
|
|
|
|
padding-top: 20px;
|
|
|
|
|
|
padding-bottom: 50px;
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
|
|
|
|
|
|
::v-deep {
|
|
|
|
|
|
.uni-list-item__container {
|
|
|
|
|
|
display: block;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.uni-list--border-top,
|
|
|
|
|
|
.uni-list--border-bottom,
|
|
|
|
|
|
.uni-list--border::after {
|
|
|
|
|
|
background-color: transparent;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.list-header {
|
|
|
|
|
|
background-color: #05AEA3;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
padding: 10px 15px;
|
|
|
|
|
|
border-radius: 5px 5px 0 0;
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
|
|
|
|
|
|
.charts {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
top: 50%;
|
|
|
|
|
|
right: 15px;
|
|
|
|
|
|
transform: translateY(-50%);
|
2025-07-31 14:24:05 +08:00
|
|
|
|
// background-color: #ff7300;
|
2025-07-29 23:05:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.list-body {
|
|
|
|
|
|
padding: 10px 15px;
|
|
|
|
|
|
border: 1px solid #eee;
|
|
|
|
|
|
border-top: none;
|
|
|
|
|
|
border-radius: 0 0 5px 5px;
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
color: #666;
|
|
|
|
|
|
|
|
|
|
|
|
.right {
|
|
|
|
|
|
color: #000;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color {
|
|
|
|
|
|
color: #007aff;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.uni-row {
|
|
|
|
|
|
margin-bottom: 10px;
|
|
|
|
|
|
|
|
|
|
|
|
&:last-child {
|
|
|
|
|
|
margin-bottom: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|