Files
emsapp/pages/work/index.vue

434 lines
11 KiB
Vue
Raw Normal View History

2025-07-29 23:05:58 +08:00
<template>
<view class="work-container">
<!-- 站点选择列表 -->
2025-08-15 17:41:26 +08:00
<uni-section title="业态选择" type="line" :titleFontSize="titleFontSize" class="sections-list">
<uni-row>
<uni-col :span="10" :offset='1'>
<uni-section title="业态列表" titleFontSize="14px">
<uni-data-select :clear="false" :value="siteType" :localdata="siteTypeOptions"
@change="selectedSiteType"></uni-data-select>
</uni-section>
</uni-col>
<uni-col :span="10" :offset='2'>
<uni-section title="可选清单" titleFontSize="14px">
<uni-data-select ref="siteListSelect" :clear="false" :value="siteId"
:localdata="siteType ===1 ? siteList : []" @change="selectedSite"></uni-data-select>
</uni-section>
</uni-col>
</uni-row>
</uni-section>
<!-- 静态信息 -->
<uni-section title="静态信息" type="line" :titleFontSize="titleFontSize" class="sections-list">
<view class="base-lists" v-for="(item,index) in singleZdInfo" :key="index+'zdBaseInfo'">
<text class="left">{{item.title}}</text>
<text class="right">{{baseInfo[item.attr]}}</text>
</view>
2025-07-29 23:05:58 +08:00
</uni-section>
2025-08-16 19:31:59 +08:00
<!-- 工作台 -->
2025-08-15 17:41:26 +08:00
<uni-section title="工作台" type="line" :titleFontSize="titleFontSize" class="sections-list">
<view class="grid-body">
<uni-grid :column="4" :showBorder="false" @change="toDetail">
2025-10-15 18:16:56 +08:00
<uni-grid-item v-for="(item,index) in siteGirdList" :index="index" :key="index+'work'">
2025-08-15 17:41:26 +08:00
<view class="grid-item-box">
<view class="icon iconfont" :class="item.icon" size="30"></view>
<text class="text">{{item.text}}</text>
</view>
</uni-grid-item>
</uni-grid>
</view>
</uni-section>
2025-08-16 19:31:59 +08:00
<!-- 一周充放曲线 uchart的组件最好放在同级-->
<uni-section title="一周充放曲线" type="line" :titleFontSize="titleFontSize" class="sections-list">
<date-range-select ref="weekChartDateRangeSelect" @updateDate="updateWeekChartDate" />
2025-08-15 17:41:26 +08:00
<view style="width:100%;height: 250px;">
2025-08-16 19:31:59 +08:00
<qiun-data-charts type="line" :chartData="weekChartData" :optsWatch='false' :inScrollView="true"
2025-08-16 23:15:33 +08:00
:pageScrollTop="pageScrollTop" :opts="options" :ontouch="true" />
2025-08-16 19:31:59 +08:00
</view>
</uni-section>
<!-- 当日功率曲线 uchart的组件最好放在同级-->
<uni-section title="当日功率曲线" type="line" :titleFontSize="titleFontSize" class="sections-list">
<date-range-select ref="activeChartDateRangeSelect" @updateDate="updateActiveChartDate" />
<view style="width:100%;height: 250px;">
<qiun-data-charts type="line" :chartData="activeChartData" :optsWatch='false' :inScrollView="true"
2025-10-15 18:16:56 +08:00
:pageScrollTop="pageScrollTop" :opts="glqxOptions" :ontouch="true" />
2025-08-15 17:41:26 +08:00
</view>
</uni-section>
2025-07-29 23:05:58 +08:00
</view>
</template>
<script>
2025-08-16 19:31:59 +08:00
import DateRangeSelect from './DateRangeSelect.vue'
2025-07-29 23:05:58 +08:00
import {
2025-08-15 17:41:26 +08:00
getAllSites,
getSingleSiteBaseInfo,
getSevenChargeData,
2025-10-15 18:16:56 +08:00
getPointData,
getSiteAllDeviceCategory
2025-07-29 23:05:58 +08:00
} from '@/api/ems/site.js'
export default {
2025-08-15 17:41:26 +08:00
components: {
2025-08-16 19:31:59 +08:00
DateRangeSelect
2025-08-15 17:41:26 +08:00
},
2025-07-29 23:05:58 +08:00
data() {
return {
2025-08-15 17:41:26 +08:00
// 图表数据
2025-08-16 19:31:59 +08:00
weekChartTimeRange: [],
activeChartTimeRange: [],
weekChartData: {},
activeChartData: {},
2025-08-15 17:41:26 +08:00
pageScrollTop: 0,
2025-10-15 18:16:56 +08:00
glqxOptions: {
dataLabel: false,
enableScroll: true,
xAxis: {
scrollShow: true,
itemCount: 3,
disableGrid: true
},
// update: true,
// duration: 2,
// animation: false,
// enableScroll: true,
// padding: [10, 15, 10, 15]
},
2025-08-15 17:41:26 +08:00
options: {
2025-08-17 01:13:04 +08:00
dataLabel: false,
2025-08-15 17:41:26 +08:00
enableScroll: true,
xAxis: {
scrollShow: true,
itemCount: 5,
2025-08-15 17:41:26 +08:00
disableGrid: true
},
2025-08-17 01:13:04 +08:00
// update: true,
2025-08-15 17:41:26 +08:00
// duration: 2,
// animation: false,
// enableScroll: true,
// padding: [10, 15, 10, 15]
},
// 图表数据结束
2025-10-15 18:16:56 +08:00
deviceCategoryOptions: [], //当前站点包含的设备类别
2025-08-15 17:41:26 +08:00
titleFontSize: '16px',
siteType: 1,
siteTypeOptions: [{
text: '储能',
value: 1,
},
{
text: '光能',
value: 2,
},
{
text: '岸电',
value: 3,
}
],
2025-07-29 23:05:58 +08:00
siteList: [],
siteId: '', //选择的站点ID
2025-08-15 17:41:26 +08:00
baseInfo: {}, //站点基本信息
singleZdInfo: [{
title: "电站位置",
attr: "siteAddress",
},
{
title: "投运时间",
attr: "runningTime",
},
{
title: "装机功率(MW)",
attr: "installPower",
},
{
title: "装机容量(MW)",
attr: "installCapacity",
},
],
2025-07-29 23:05:58 +08:00
gridList: [{
page: 'bmszl',
2025-08-07 15:19:49 +08:00
icon: 'icon-BMS',
2025-07-29 23:05:58 +08:00
text: 'BMS总览',
2025-10-15 18:16:56 +08:00
categoryName: 'STACK'
2025-07-29 23:05:58 +08:00
},
{
page: 'bmsdcc',
2025-08-07 15:19:49 +08:00
icon: 'icon-a-dianchicunengliangkuai',
2025-07-29 23:05:58 +08:00
text: 'BMS电池簇',
2025-10-15 18:16:56 +08:00
categoryName: 'CLUSTER'
2025-07-29 23:05:58 +08:00
},
{
page: 'pcs',
2025-08-07 15:19:49 +08:00
icon: 'icon-PCS',
2025-07-29 23:05:58 +08:00
text: 'PCS',
2025-10-15 18:16:56 +08:00
categoryName: 'PCS'
2025-07-29 23:05:58 +08:00
},
{
page: 'db',
2025-08-07 15:19:49 +08:00
icon: 'icon-dianbiao4',
2025-07-29 23:05:58 +08:00
text: '电表',
2025-10-15 18:16:56 +08:00
categoryName: 'AMMETER'
2025-07-29 23:05:58 +08:00
},
{
page: 'dtdc',
2025-08-07 15:19:49 +08:00
icon: 'icon-dantidianchi',
2025-07-29 23:05:58 +08:00
text: '单体电池',
2025-10-15 18:16:56 +08:00
categoryName: 'BATTERY'
2025-07-29 23:05:58 +08:00
}
]
}
},
2025-10-15 18:16:56 +08:00
computed: {
siteGirdList() {
return this.gridList.filter(i => this.deviceCategoryOptions.includes(i.categoryName))
}
},
2025-07-29 23:05:58 +08:00
methods: {
2025-08-16 19:31:59 +08:00
// 更新一周冲放曲线时间范围 重置图表
updateWeekChartDate(data) {
this.weekChartTimeRange = data || []
this.siteId && this.getWeekChartData()
},
// 更新当日功率曲线时间范围 重置图表
updateActiveChartDate(data) {
2025-10-15 18:16:56 +08:00
this.activeChartTimeRange = data || []
this.siteId && this.getGVQXData()
2025-08-16 19:31:59 +08:00
},
2025-07-29 23:05:58 +08:00
toDetail(e) {
2025-08-15 17:41:26 +08:00
if (!this.siteId) return uni.showToast({
title: "请选择清单",
icon: 'none'
})
2025-07-29 23:05:58 +08:00
const {
index
} = e.detail
this.$tab.navigateTo(`/pages/work/${this.gridList[index].page}/index?siteId=${this.siteId}`)
},
selectedSite(id) {
2025-08-15 17:41:26 +08:00
if (id === this.siteId) return
2025-07-29 23:05:58 +08:00
this.siteId = id
2025-08-15 17:41:26 +08:00
if (this.siteType === 1) {
2025-10-15 18:16:56 +08:00
this.updateSiteInfo()
2025-08-15 17:41:26 +08:00
}
},
2025-10-15 18:16:56 +08:00
updateSiteInfo() {
if (!this.siteId) return
this.getSiteBaseInfo()
this.getWeekChartData()
this.getGVQXData()
this.getSiteDeviceCategory()
},
2025-08-15 17:41:26 +08:00
selectedSiteType(id) {
if (id === this.siteType) return
this.siteType = id
this.siteId = ''
this.baseInfo = {}
2025-08-16 19:31:59 +08:00
this.weekChartData = {}
this.activeChartData = {}
2025-08-15 17:41:26 +08:00
},
getSiteList() {
getAllSites().then(response => {
const data = response?.data || []
this.siteList = data.map(item => {
return {
text: item.siteName,
value: item.siteId,
id: item.id
}
})
// 设置默认展示的站点
if (data.length > 0) {
this.siteId = data[0].siteId
2025-10-15 18:16:56 +08:00
this.updateSiteInfo()
2025-08-15 17:41:26 +08:00
}
})
},
2025-10-15 18:16:56 +08:00
getSiteBaseInfo() {
getSingleSiteBaseInfo({
siteId: this.siteId
}).then(response => {
console.log('获取站点基本信息', response)
this.baseInfo = response?.data || {}
})
},
getSiteDeviceCategory() {
getSiteAllDeviceCategory({
siteId: this.siteId
}).then(response => {
this.deviceCategoryOptions = response?.data || []
})
},
handleDate(date) {
if (!date) return date
const time = new Date(date)
const month = time.getMonth() + 1,
day = time.getDate()
return `${month<10?'0'+month : month}/${day<10 ? '0'+day : day}`
},
2025-10-15 18:16:56 +08:00
getGVQXData() {
this.$refs.activeChartDateRangeSelect.showBtnLoading(true)
getPointData({
siteId: this.siteId,
startDate: this.activeChartTimeRange[0],
endDate: this.activeChartTimeRange[1]
}).then(response => {
console.log('当日功率曲线', response)
let data = response?.data || [],
categories = [],
source = [{
name: '电网功率',
attr: 'gridPower',
data: []
},
{
name: '负载功率',
attr: 'loadPower',
data: []
},
{
name: '储能功率',
attr: 'storagePower',
data: []
},
{
name: '光伏功率',
attr: 'pvPower',
data: []
},
{
name: 'soc平均值',
attr: 'avgSoc',
data: []
},
{
name: 'soh平均值',
attr: 'avgSoh',
data: []
},
{
name: '电池平均温度平均值平均值',
attr: 'avgTemp',
data: []
},
]
data.forEach((item) => {
categories.push(item.statisDate || undefined)
source.forEach(i => i.data.push(item[i.attr]))
})
this.activeChartData = JSON.parse(JSON.stringify({
categories,
series: source
}))
}).finally(() => this.$refs.activeChartDateRangeSelect.showBtnLoading(false))
},
2025-08-15 17:41:26 +08:00
getWeekChartData() {
2025-08-16 19:31:59 +08:00
this.$refs.weekChartDateRangeSelect.showBtnLoading(true)
2025-08-15 17:41:26 +08:00
getSevenChargeData({
siteId: this.siteId,
2025-08-16 19:31:59 +08:00
startDate: this.weekChartTimeRange[0],
endDate: this.weekChartTimeRange[1]
2025-08-15 17:41:26 +08:00
}).then(response => {
console.log('一周功率曲线', response)
let data = response?.data || [],
categories = [],
chargedCap = [],
disChargedCap = []
data.forEach(item => {
categories.push(this.handleDate(item.ammeterDate) || undefined)
chargedCap.push(item.chargedCap)
disChargedCap.push(item.disChargedCap)
2025-08-15 17:41:26 +08:00
})
2025-08-16 19:31:59 +08:00
this.weekChartData = JSON.parse(JSON.stringify({
2025-08-15 17:41:26 +08:00
categories,
series: [{
"name": '充电量',
"data": chargedCap
},
{
"name": '放电量',
"data": disChargedCap
}
]
}))
2025-08-16 19:31:59 +08:00
}).finally(() => this.$refs.weekChartDateRangeSelect.showBtnLoading(false))
2025-07-29 23:05:58 +08:00
}
},
// 页面切换不会重新调用如果希望每次切换页面都重新调接口使用onShow
mounted() {
2025-08-16 19:31:59 +08:00
this.$nextTick(() => {
this.$refs.weekChartDateRangeSelect.init()
2025-10-15 18:16:56 +08:00
this.$refs.activeChartDateRangeSelect.init(true)
2025-08-16 19:31:59 +08:00
if (this.siteType === 1) {
this.getSiteList()
}
})
2025-08-15 17:41:26 +08:00
},
2025-08-16 19:31:59 +08:00
// 页面滚动 设置pageScrollTop chart显示需要
2025-08-15 17:41:26 +08:00
onPageScroll(e) {
this.pageScrollTop = e.scrollTop
},
2025-07-29 23:05:58 +08:00
}
</script>
<style lang="scss" scoped>
/* #ifndef APP-NVUE */
page {
display: flex;
flex-direction: column;
box-sizing: border-box;
background-color: #fff;
min-height: 100%;
height: auto;
}
view {
font-size: 14px;
line-height: inherit;
}
/* #endif */
.text {
text-align: center;
font-size: 26rpx;
margin-top: 10rpx;
}
2025-08-15 17:41:26 +08:00
.sections-list:not(:first-child) {
margin-top: 40rpx;
}
2025-07-29 23:05:58 +08:00
.grid-item-box {
flex: 1;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
align-items: center;
justify-content: center;
2025-08-15 17:41:26 +08:00
padding: 30rpx 0;
2025-07-29 23:05:58 +08:00
}
2025-08-07 15:19:49 +08:00
.icon {
2025-08-15 17:41:26 +08:00
font-size: 52rpx;
2025-08-16 19:31:59 +08:00
color: #3a98ff;
2025-08-07 15:19:49 +08:00
}
2025-08-15 17:41:26 +08:00
.base-lists {
font-size: 28rpx;
line-height: 40rpx;
padding: 10rpx 20rpx;
padding-left: 40rpx;
.left {
width: 220rpx;
display: inline-block;
color: #666;
}
.right {
color: #333;
}
}
2025-07-29 23:05:58 +08:00
@media screen and (min-width: 500px) {}
</style>