This commit is contained in:
高云鹏 2024-11-06 16:10:45 +08:00
commit 73567cca71
12 changed files with 634 additions and 103 deletions

View File

@ -7,6 +7,7 @@ import com.das.common.result.R;
import com.das.common.utils.PageDataInfo; import com.das.common.utils.PageDataInfo;
import com.das.modules.equipment.domain.dto.SysEnumTypesDto; import com.das.modules.equipment.domain.dto.SysEnumTypesDto;
import com.das.modules.equipment.domain.dto.SysEnumValuesDto; import com.das.modules.equipment.domain.dto.SysEnumValuesDto;
import com.das.modules.equipment.domain.vo.SysEnumDictVo;
import com.das.modules.equipment.domain.vo.SysEnumTypesVo; import com.das.modules.equipment.domain.vo.SysEnumTypesVo;
import com.das.modules.equipment.domain.vo.SysEnumValuesVo; import com.das.modules.equipment.domain.vo.SysEnumValuesVo;
import com.das.modules.equipment.service.SysEnumService; import com.das.modules.equipment.service.SysEnumService;
@ -153,6 +154,17 @@ public class SysEnumController {
sysEnumService.deleteEnumTypes(sysEnumTypesDto); sysEnumService.deleteEnumTypes(sysEnumTypesDto);
return R.success(); return R.success();
} }
/**
* 获取枚举字典
* @return 枚举值字典
*/
@PostMapping("/getEnumDict")
public R<List<SysEnumDictVo>> getEnumDict() {
List<SysEnumDictVo> list = sysEnumService.getEnumDict();
return R.success(list);
}
} }

View File

@ -0,0 +1,26 @@
package com.das.modules.equipment.domain.vo;
import lombok.Data;
import java.util.Map;
/**
* 枚举值值字典
*/
@Data
public class SysEnumDictVo {
/**
* 枚举类型名称
*/
private String name;
/**
* 枚举类型描述
*/
private String description;
/**
* 枚举类型值集合
* key: 枚举值
* value: 枚举值描述
*/
private Map<String,String> enumValues;
}

View File

@ -5,9 +5,10 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data; import lombok.Data;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable;
@Data @Data
public class SysEnumValuesVo { public class SysEnumValuesVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -3,6 +3,7 @@ package com.das.modules.equipment.service;
import com.das.common.utils.PageDataInfo; import com.das.common.utils.PageDataInfo;
import com.das.modules.equipment.domain.dto.SysEnumTypesDto; import com.das.modules.equipment.domain.dto.SysEnumTypesDto;
import com.das.modules.equipment.domain.dto.SysEnumValuesDto; import com.das.modules.equipment.domain.dto.SysEnumValuesDto;
import com.das.modules.equipment.domain.vo.SysEnumDictVo;
import com.das.modules.equipment.domain.vo.SysEnumTypesVo; import com.das.modules.equipment.domain.vo.SysEnumTypesVo;
import com.das.modules.equipment.domain.vo.SysEnumValuesVo; import com.das.modules.equipment.domain.vo.SysEnumValuesVo;
@ -26,5 +27,9 @@ public interface SysEnumService {
void deleteEnumValues(SysEnumValuesDto sysEnumValuesDto); void deleteEnumValues(SysEnumValuesDto sysEnumValuesDto);
/**
* 获取系统枚举字典
* @return
*/
List<SysEnumDictVo> getEnumDict();
} }

View File

@ -3,6 +3,7 @@ package com.das.modules.equipment.service.impl;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.das.common.config.SessionUtil; import com.das.common.config.SessionUtil;
import com.das.common.exceptions.ServiceException; import com.das.common.exceptions.ServiceException;
import com.das.common.utils.BeanCopyUtils; import com.das.common.utils.BeanCopyUtils;
@ -11,6 +12,7 @@ import com.das.common.utils.PageQuery;
import com.das.modules.auth.domain.vo.SysUserVo; import com.das.modules.auth.domain.vo.SysUserVo;
import com.das.modules.equipment.domain.dto.SysEnumTypesDto; import com.das.modules.equipment.domain.dto.SysEnumTypesDto;
import com.das.modules.equipment.domain.dto.SysEnumValuesDto; import com.das.modules.equipment.domain.dto.SysEnumValuesDto;
import com.das.modules.equipment.domain.vo.SysEnumDictVo;
import com.das.modules.equipment.domain.vo.SysEnumTypesVo; import com.das.modules.equipment.domain.vo.SysEnumTypesVo;
import com.das.modules.equipment.domain.vo.SysEnumValuesVo; import com.das.modules.equipment.domain.vo.SysEnumValuesVo;
import com.das.modules.equipment.entity.SysEnumTypes; import com.das.modules.equipment.entity.SysEnumTypes;
@ -24,6 +26,8 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class SysEnumServiceImpl implements SysEnumService { public class SysEnumServiceImpl implements SysEnumService {
@ -177,4 +181,29 @@ public class SysEnumServiceImpl implements SysEnumService {
sysEnumValues.setIsActive(0); sysEnumValues.setIsActive(0);
sysEnumValuesMapper.updateById(sysEnumValues); sysEnumValuesMapper.updateById(sysEnumValues);
} }
/**
* 获取系统枚举字典
* @return 枚举字典
*/
@Override
public List<SysEnumDictVo> getEnumDict() {
List<SysEnumDictVo> dict = new ArrayList<>();
List<SysEnumTypesVo> list = queryEnumTypesList();
for (SysEnumTypesVo sysEnumTypesVo : list) {
SysEnumDictVo sysEnumDictVo = new SysEnumDictVo();
sysEnumDictVo.setName(sysEnumTypesVo.getName());
sysEnumDictVo.setDescription(sysEnumTypesVo.getDescription());
List<SysEnumValues> values = sysEnumValuesMapper.selectList(Wrappers.<SysEnumValues>lambdaQuery().eq(SysEnumValues::getEnumTypeId, sysEnumTypesVo.getId()));
Map<String, String> map = values.stream().collect(Collectors.toMap(SysEnumValues::getValue, SysEnumValues::getDescription));
sysEnumDictVo.setEnumValues(map);
dict.add(sysEnumDictVo);
}
return dict;
}
} }

View File

@ -6,10 +6,7 @@ import com.das.modules.page.domian.vo.TemperatureLimitVo;
import com.das.modules.page.service.TemperatureDashboardService; import com.das.modules.page.service.TemperatureDashboardService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
@ -25,7 +22,7 @@ public class TemperatureDashboardController {
* @param device 设备{id:XXX} 只用到id即可 * @param device 设备{id:XXX} 只用到id即可
* @return * @return
*/ */
@GetMapping("/getTemperatureLimitByDeviceId") @PostMapping("/getTemperatureLimitByDeviceId")
public R<List<TemperatureLimitVo>> getTemperatureLimitByDeviceId(@RequestBody SysEquipmentDto device){ public R<List<TemperatureLimitVo>> getTemperatureLimitByDeviceId(@RequestBody SysEquipmentDto device){
List<TemperatureLimitVo> windTurbinesPageVos = service.getTemperatureLimitByDeviceId(device.getId()); List<TemperatureLimitVo> windTurbinesPageVos = service.getTemperatureLimitByDeviceId(device.getId());
return R.success(windTurbinesPageVos); return R.success(windTurbinesPageVos);

View File

@ -29,8 +29,8 @@ public class TemperatureDashboardServiceImpl implements TemperatureDashboardServ
String params = mapping.getParams(); String params = mapping.getParams();
if (params != null && !params.isEmpty()) { if (params != null && !params.isEmpty()) {
JSONObject json = JSONObject.parseObject(params); JSONObject json = JSONObject.parseObject(params);
String code = json.getString("code"); String code = json.getString("measPointCode");
String name = json.getString("name"); String name = json.getString("measPointName");
Double limit1High=0.0; Double limit1High=0.0;
Double limit1Low=0.0; Double limit1Low=0.0;
Double limit2High=0.0; Double limit2High=0.0;

View File

@ -8,7 +8,8 @@
- [人工操作接口](api/operation.md) - [人工操作接口](api/operation.md)
- [页面访问接口](api/pages/) - [页面访问接口](api/pages/)
- [告警事件接口](api/event.md) - [告警事件接口](api/event.md)
- [首页接口](api/pages/home.md) - [首页](api/pages/home.md)
- [报表管理](api/pages/report.md)
- [数据采集](datacollect/) - [数据采集](datacollect/)
- [系统部署](deploy/) - [系统部署](deploy/)
- [Linux系统部署](deploy/linux.md) - [Linux系统部署](deploy/linux.md)

View File

@ -12,6 +12,7 @@
| | 2.1.6删除枚举值 | /api/enum/deleteEnumValues | SYS_AUTHORITY_ID_DEVICE_MGR | | | 2.1.6删除枚举值 | /api/enum/deleteEnumValues | SYS_AUTHORITY_ID_DEVICE_MGR |
| | 2.1.7修改枚举类型 | /api/enum/updateEnumTypes | SYS_AUTHORITY_ID_DEVICE_MGR | | | 2.1.7修改枚举类型 | /api/enum/updateEnumTypes | SYS_AUTHORITY_ID_DEVICE_MGR |
| | 2.1.8删除枚举类型 | /api/enum/deleteEnumTypes | SYS_AUTHORITY_ID_DEVICE_MGR | | | 2.1.8删除枚举类型 | /api/enum/deleteEnumTypes | SYS_AUTHORITY_ID_DEVICE_MGR |
| | 2.1.9获取枚举字典 | /api/enum/getEnumDict | |
### 2.1 枚举类型配置相关接口 ### 2.1 枚举类型配置相关接口
@ -387,4 +388,75 @@ POST 请求接口
"success": true, "success": true,
"msg": "操作成功" "msg": "操作成功"
} }
``` ```
#### 2.1.9获取枚举字典
POST 请求接口
> /api/enum/getEnumDict
请求参数
返回报文
```json
{
"code": 200,
"success": true,
"data": [
{
"name": "iTurbineOperationMode",
"description": "运行模式",
"enumValues": {
"0": "通讯断开",
"1": "紧急停机",
"2": "安全链停机",
"3": "199刹车停机",
"4": "198刹车停机"
}
},
{
"name": "iBPLevel",
"description": "刹车等级",
"enumValues": {
"0": "无故障",
"30": "限功率",
"50": "降转速"
}
},
{
"name": "iYPLevel",
"description": "偏航运行模式",
"enumValues": {
"0": "自动偏航",
"5": "自动解缆时待机",
"10": "自动解缆",
"20": "偏航节能"
}
},
{
"name": "ActiveStatusCode",
"description": "故障代码",
"enumValues": {
"16842753": "01_01_001风机由于变桨系统安全链断开导致机组急停",
"16973825": "01_03_001风机轮毂温度>60℃",
"16973826": "01_03_002风机轮毂温度<-20",
"16973827": "01_03_003风机轮毂温度>50℃24小时内允许出现3次"
}
}
],
"msg": "操作成功"
}
```
返参描述
| 参数名 | 参数类型 | 可选 | 描述 |
|-------------|------------------------|-----|--------|
| name | String | 否 | 枚举类型名称 |
| description | String | 否 | 枚举类型描述 |
| enumValues | Map<String,String> map | 否 | 枚举类型值集合 |

View File

@ -0,0 +1,24 @@
import createAxios from '/@/utils/axios'
export function equipList(params: object = {}) {
return createAxios({
url: '/api/equipment/list',
method: 'POST',
data: params,
})
}
export function getTemperatureLimitByDeviceId(params: object = {}) {
return createAxios({
url: '/api/page/temperature/getTemperatureLimitByDeviceId',
method: 'POST',
data: params,
})
}
export function getsnapshotData(params: object = {}) {
return createAxios({
url: '/api/data/snapshot',
method: 'POST',
data: params,
})
}

View File

@ -296,12 +296,15 @@
ref="myTable" ref="myTable"
@mouseover.native="clearScroll" @mouseover.native="clearScroll"
@mouseleave.native="createScroll"> @mouseleave.native="createScroll">
<el-table-column fixed prop="time" label="时间" /> <el-table-column fixed prop="eventTimeFormate" label="时间" />
<el-table-column prop="name" label="风机" /> <el-table-column prop="deviceCode" label="风机" />
<el-table-column prop="alertcontent" label="告警内容" /> <el-table-column prop="eventText" label="告警内容" />
<el-table-column label="操作"> <el-table-column label="操作">
<template #default="scope"> <template #default="scope">
<a @click="">确认</a> <div class="tableOperate comfirmed" style="color: #333333;" v-if="scope.row.confirmed">已确认</div>
<div class="tableOperate" v-else>
<a style="color: #0277B3; cursor: pointer;" @click="open(scope.row)">确认</a>
</div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -320,12 +323,15 @@ import * as echarts from 'echarts'
import { useTemplateRefsList,useEventListener } from '@vueuse/core' import { useTemplateRefsList,useEventListener } from '@vueuse/core'
import {useI18n} from "vue-i18n"; import {useI18n} from "vue-i18n";
import WindContent from '/@/views/backend/home/windMatrix.vue' import WindContent from '/@/views/backend/home/windMatrix.vue'
import { equipList } from '/@/api/backend/realData/request'
import { import {
getWindFarmRealData, getWindFarmRealData,
getWindTurbineMatrixData, getWindTurbineMatrixData,
getHistoryData getHistoryData,
getAlarmList,
alertComfirm
} from "/@/api/backend/dashboard.ts"; } from "/@/api/backend/dashboard.ts";
import {dayjs, ElMessage, TableInstance} from "element-plus"; import {dayjs, ElMessage, ElMessageBox, TableInstance} from "element-plus";
import { getRealTimeState } from '/@/views/backend/equipment/airBlower/utils.ts' import { getRealTimeState } from '/@/views/backend/equipment/airBlower/utils.ts'
import {useRoute} from "vue-router"; import {useRoute} from "vue-router";
const route = useRoute() const route = useRoute()
@ -403,6 +409,7 @@ const currentDayStatus=ref({
StartCapacityTotal: 0, StartCapacityTotal: 0,
StarteNum: 0 StarteNum: 0
}) })
const deviceCode=ref([])
const FanList = ref([]) const FanList = ref([])
const StatusListData = () => { const StatusListData = () => {
getWindTurbineMatrixData().then((res) => { getWindTurbineMatrixData().then((res) => {
@ -489,7 +496,6 @@ const StatusListData = () => {
} }
}); });
FanList.value=data FanList.value=data
}else{ }else{
ElMessage.error({ ElMessage.error({
message: res.msg, message: res.msg,
@ -500,6 +506,8 @@ const StatusListData = () => {
}) })
} }
const state: { const state: {
charts: { powerChart: any; trendChart: any } charts: { powerChart: any; trendChart: any }
remark: string remark: string
@ -668,23 +676,6 @@ const initpowerChart = () => {
const trendChartRef = ref<VNodeRef>() const trendChartRef = ref<VNodeRef>()
/*const TrendDataForDay = [
{
currentPeriod: 86.3,
samePeriod: 63.5,
generationTime: '2024-10-01',
},
{
currentPeriod: 86.3,
samePeriod: 53.5,
generationTime: '2024-10-02',
},
{
currentPeriod: 86.3,
samePeriod: 43.5,
generationTime: '2024-10-03',
},
]*/
const TrendDataForDay: { const TrendDataForDay: {
currentPeriod: { currentPeriod: {
time: string[] time: string[]
@ -724,28 +715,8 @@ const TrendDataForMonth :{
value: [], value: [],
}, },
} }
/*const TrendDataForMonth = [
{
currentPeriod: 26.3,
samePeriod: 53.5,
generationTime: '2024-10-01',
},
{
currentPeriod: 36.3,
samePeriod: 53.5,
generationTime: '2024-10-02',
},
{
currentPeriod: 46.3,
samePeriod: 53.5,
generationTime: '2024-10-03',
},
]*/
const inittrendChart = (type: 'day' | 'month') => { const inittrendChart = (type: 'day' | 'month') => {
/* const currentPeriod: number[] = type === 'day' ? TrendDataForDay.currentPeriod.value : TrendDataForMonth.map((item) => item.currentPeriod)
const samePeriod: number[] = type === 'day' ? TrendDataForDay.samePeriod.value : TrendDataForMonth.map((item) => item.samePeriod)
const xAxisdata: string[] = type === 'day' ? TrendDataForDay.currentPeriod.time : TrendDataForMonth.map((item) => item.generationTime)*/
const currentPeriod: number[] = type === 'day' ? TrendDataForDay.currentPeriod.value : TrendDataForMonth.currentPeriod.value const currentPeriod: number[] = type === 'day' ? TrendDataForDay.currentPeriod.value : TrendDataForMonth.currentPeriod.value
const samePeriod: number[] = type === 'day' ? TrendDataForDay.samePeriod.value : TrendDataForMonth.samePeriod.value const samePeriod: number[] = type === 'day' ? TrendDataForDay.samePeriod.value : TrendDataForMonth.samePeriod.value
const xAxisdata: string[] = type === 'day' ? TrendDataForDay.currentPeriod.time : TrendDataForMonth.currentPeriod.time const xAxisdata: string[] = type === 'day' ? TrendDataForDay.currentPeriod.time : TrendDataForMonth.currentPeriod.time
@ -866,50 +837,86 @@ const echartsResize = () => {
onActivated(() => { onActivated(() => {
echartsResize() echartsResize()
}) })
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
}
const tableData= ref()
const getTableData = (deviceCode) => {
const tableData = ref([ const today = new Date();
{ const threeDaysAgo = new Date(today);
time: '2016-05-03', threeDaysAgo.setDate(today.getDate() - 3);
name: 'SC-01', const startTime = threeDaysAgo.getTime();
alertcontent: '故障', const data:any = {
}, startTime: startTime,
{ endTime: Date.now(),
time: '2016-05-02', deviceCode:deviceCode,
name: 'SC-02', limit:100
alertcontent: '待机',
},
{
time: '2016-05-04',
name: 'SC-03',
alertcontent: '停机',
},
{
time: '2016-05-01',
name: 'SC-04',
alertcontent: '变桨叶1伺服驱动器故障',
},
{
time: '2016-05-03',
name: 'SC-01',
alertcontent: '故障',
},
{
time: '2016-05-02',
name: 'SC-02',
alertcontent: '待机',
},
{
time: '2016-05-04',
name: 'SC-03',
alertcontent: '停机',
},
{
time: '2016-05-01',
name: 'SC-04',
alertcontent: '变桨叶1伺服驱动器故障',
} }
]) console.log(JSON.stringify(data))
getAlarmList(data).then((res) => {
debugger
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,
},
]
debugger
alertComfirm(reqData)
.then((res: any) => {
debugger
if (res.code == 200) {
ElMessage.success(res.msg ?? '确认成功')
getTableData(deviceCode.value)
} else {
ElMessage.error(res.msg ?? '查询失败')
}
})
.catch((err) => {
ElMessage.error(err?.response?.data?.msg ?? '查询失败')
})
}
const clearScroll = () => { const clearScroll = () => {
@ -947,7 +954,7 @@ const getChartData = <T extends string = any>(params: {
], ],
interval: params.interval, interval: params.interval,
} }
console.log(JSON.stringify(data)) /* console.log(JSON.stringify(data))*/
getHistoryData(data).then((res) => { getHistoryData(data).then((res) => {
if (res.success) { if (res.success) {
if (typeof res.data === 'object' && res.data !== null && Object.keys(res.data).length === 0) { if (typeof res.data === 'object' && res.data !== null && Object.keys(res.data).length === 0) {
@ -1123,13 +1130,17 @@ onMounted(() => {
overviewList() overviewList()
StatusListData() StatusListData()
autoUpdate() autoUpdate()
equipList({objectType: 10002,}).then((res) => {
res.data.map((item: any) => {
deviceCode.value.push(item.name)
})
getTableData(deviceCode.value)
})
useEventListener(window, 'resize', echartsResize) useEventListener(window, 'resize', echartsResize)
}) })
/*onBeforeMount(() => {
for (const key in state.charts) {
state.charts[key].dispose()
}
})*/
const activeName = ref('first') const activeName = ref('first')
//let autoUpdateTimer: any = null //let autoUpdateTimer: any = null
let autoUpdateForSecondTimer: any = null let autoUpdateForSecondTimer: any = null

View File

@ -0,0 +1,353 @@
<template>
<div class="temperature">
<el-container class="containerPart">
<el-aside class="defaultAside">
<el-main class="treeMain">
<el-tree
style="max-width: 600px;margin-top: 2.2%"
ref="equipTreeRef"
:data="deviceData"
:props="defaultProps"
node-key="id"
@node-click="handleNodeClick"
/>
</el-main>
</el-aside>
<el-container class="defaultMainContainer">
<div class="temperature-chart" ref="temperatureChartRef"></div>
</el-container>
</el-container>
</div>
</template>
<script setup lang="ts">
import {nextTick, onActivated, onMounted, onUnmounted, reactive, ref} from 'vue'
import {equipList,getTemperatureLimitByDeviceId,getsnapshotData} from "/@/api/backend/temperature/request.ts";
import * as echarts from "echarts";
import {useEventListener } from '@vueuse/core'
import {dayjs} from "element-plus";
const defaultProps = {
children: 'children',
label: 'name'
}
const devicelistData = reactive({
objectType: 10002,
})
const deviceData = ref([{
id: 0,
name: "风机列表",
children: []
}])
const deviceId=ref()
const equipTreeRef = ref()
const deviceQuery = (data: any) => {
equipList(data).then((res) => {
deviceData.value[0].children = res.data
nextTick(() => {
deviceId.value=res.data[0]?.id
equipTreeRef.value?.setCurrentKey(deviceData.value[0].id!, false)
getChartData({id:deviceId.value})
})
})
}
const handleNodeClick = (data: any) => {
deviceId.value=data.id
state.charts.temperatureChart.clear()
getChartData({id:deviceId.value})
}
const state: {
charts: { temperatureChart: any; }
remark: string
workingTimeFormat: string
pauseWork: boolean
} = reactive({
charts: { temperatureChart: null },
remark: 'dashboard.Loading',
workingTimeFormat: '',
pauseWork: false,
})
const temperatureChartRef = ref()
const temperatureData:any ={
name: [],
values: [],
limit1High: [],
limit1Low: [],
limit2High: [],
limit2Low: []
}
const inittemperatureChar = () => {
const temperatureChart = state.charts.temperatureChart ?? echarts.init(temperatureChartRef.value as unknown as HTMLElement)
const option = {
grid: {
show:true,
top: 50,
right: 23,
bottom: 10,
left: 25,
containLabel: true,
borderColor:'transparent',
backgroundColor:'rgba(254,55,49,0.20)'
},
// tooltip: {
// trigger: 'axis',
// axisPointer: {
// type: 'shadow',
// },
// },
xAxis: {
type: 'value',
interval: 10,
axisLine: {
show: true,
lineStyle: {
color: '#ffffff',
width: 1,
type: 'solid',
},
},
axisLabel: {
//x
show: true,
textStyle: {
color: '#4E5969',
},
interval: 10,
//rotate: 45
},
splitLine: {
//线
show: true,
lineStyle: {
color: '#ffffff',
},
}
},
yAxis: [
{
type: 'category',
nameTextStyle: {
color: '#4E5969',
},
axisLine: {
show: true,
lineStyle: {
color: '#ffffff',
width: 0,
type: 'solid',
},
},
axisLabel: {
//x
show: true,
textStyle: {
color: '#4E5969',
},
},
axisTick: { show: false },
splitLine: {
interval: 50,
lineStyle: {
type: 'solid',
color: '#ffffff',
},
},
data: temperatureData.name
},
],
series: [
{
type: 'bar',
barWidth: 40,
itemStyle: {
color: '#0064AA',
barBorderRadius: 2
},
label:{
show:true,
position:'insideRight',
color:'#ffffff'
},
data: temperatureData.values,
z:3
},
{
name: '上限值',
type: 'bar',
barWidth: 40,
barGap: '-100%',
data: temperatureData.limit1High,
itemStyle: {
color: '#ccecea',
},
z:2
},
{
name: '下限值',
type: 'bar',
barWidth: 40,
barGap: '-100%',
data: temperatureData.limit1Low,
itemStyle: {
color: '#ccecea',
},
z:2
},
{
name: '上上限值',
type: 'bar',
barWidth: 40,
barGap: '-100%',
itemStyle: {
color: '#fff0cc',
},
data: temperatureData.limit2High,
z:1
},
{
name: '下下限值',
type: 'bar',
barWidth: 40,
barGap: '-100%',
data: temperatureData.limit2Low,
itemStyle: {
color: '#fff0cc',
},
z:1
},
],
}
temperatureChart.setOption(option)
state.charts.temperatureChart = temperatureChart
}
const attributesCode:any[]=[]
const getChartData = (data: any) => {
console.log(JSON.stringify(data))
getTemperatureLimitByDeviceId(data).then((res) => {
if (res.code=='200') {
temperatureData.name=[]
temperatureData.values=[]
temperatureData.limit1High=[]
temperatureData.limit1Low=[]
temperatureData.limit2High=[]
temperatureData.limit2Low=[]
res.data.forEach((item,index) => {
temperatureData.name.push(item.measPointName)
attributesCode.push(item.measPointCode)
if(item.limit1Enable){
temperatureData.limit1High.push(item.limit1High)
temperatureData.limit1Low.push(item.limit1Low)
}
if(item.limit2Enable){
temperatureData.limit2High.push(item.limit2High)
temperatureData.limit2Low.push(item.limit2Low)
}
})
getTemperaData([{deviceId:data.id,attributes:attributesCode}])
}
})
}
const getTemperaData = (data:any) => {
getsnapshotData(data).then((res) => {
if (res.code == 200) {
const data = res.data[deviceId.value]
const rangeKeys = Object.keys(data)
attributesCode.forEach((attribute, index) => {
if (attribute) {
const attributeLower = attribute.toLowerCase();
const foundKey = Object.keys(rangeKeys).find(key => rangeKeys[key] === attributeLower);
if (foundKey) {
const value=data[rangeKeys[foundKey]]
const formattedValue=value !== undefined ? (value % 1 === 0 ? value : value.toFixed(2)) : '-';
temperatureData.values = temperatureData.values.concat({value:formattedValue,itemStyle:{color:'#0064AA'}});
}
}
});
const values = temperatureData.values
const limit1High = temperatureData.limit1High
const limit1Low = temperatureData.limit1Low
const limit2High = temperatureData.limit2High
const limit2Low = temperatureData.limit2Low
inittemperatureChar()
seriesStyle(values, limit1High, limit1Low, limit2High, limit2Low)
}
})
}
const seriesStyle= (values, limit1High, limit1Low, limit2High, limit2Low) =>{
const option = state.charts.temperatureChart.getOption();
const series = option?.series?.[0];
values.forEach((item,index) => {
if (Number(item.value) > Number(limit1High[index]) || Number(item.value) < Number(limit1Low[index])) {
//debugger
item.itemStyle.color= 'red'
series.data[index].itemStyle = { color: 'red' };
} else if (Number(item.value) > Number(limit2High[index]) || Number(item.value) < Number(limit2Low[index])) {
item.itemStyle.color= 'red'
series.data[index].itemStyle = { color: 'red' };
} else {
item.itemStyle.color= '#0064AA'
}
})
state.charts.temperatureChart.setOption(option);
}
let autoUpdateTimer: any = null
const autoUpdate = () => {
if (!autoUpdateTimer) {
autoUpdateTimer = setInterval(() => {
getChartData({id:deviceId.value})
}, 2000)
}
}
const echartsResize = () => {
nextTick(() => {
const chartKeys = Object.keys(state.charts) as Array<keyof typeof state.charts>
chartKeys.forEach((key) => {
state.charts[key].resize()
})
})
}
onActivated(() => {
echartsResize()
})
onMounted(() => {
deviceQuery(devicelistData)
autoUpdate()
useEventListener(window, 'resize', echartsResize)
})
onUnmounted(() => {
autoUpdateTimer && clearInterval(autoUpdateTimer)
const chartKeys = Object.keys(state.charts) as Array<keyof typeof state.charts>
chartKeys.forEach((key) => {
state.charts[key] && state.charts[key].dispose()
})
})
</script>
<style scoped lang="scss">
.temperature{
width: 100%;
height: 100%;
.containerPart {
height: 100%;
.defaultAside {
width: 260px;
height: 100%;
border-right: 1px solid #eaebed;
}
.defaultMainContainer{
width: calc(100% - 260px);
height: 100%;
.temperature-chart{
width: 100%;
height: calc(100% - 50px);
}
}
}
}
</style>