Compare commits
4 Commits
f8c1987110
...
c78d159756
Author | SHA1 | Date | |
---|---|---|---|
c78d159756 | |||
e6363bd94e | |||
1ced104c19 | |||
7d006e87f7 |
@ -5,6 +5,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
|
|||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.*;
|
import java.time.*;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
@ -157,4 +158,26 @@ public class DateUtils {
|
|||||||
localFormat.setTimeZone(TimeZone.getDefault()); // 设置为系统默认时区
|
localFormat.setTimeZone(TimeZone.getDefault()); // 设置为系统默认时区
|
||||||
return localFormat.format(utcDate); // 转换为系统时区时间
|
return localFormat.format(utcDate); // 转换为系统时区时间
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static LocalDateTime tranUTCtoLocalDateTime(String utcTimeString){
|
||||||
|
Instant instant = Instant.parse(utcTimeString);
|
||||||
|
// 获取本地时区
|
||||||
|
ZoneId localZoneId = ZoneId.systemDefault();
|
||||||
|
// 将Instant对象转换为LocalDateTime
|
||||||
|
return LocalDateTime.ofInstant(instant, localZoneId);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将utc时间转北京时间
|
||||||
|
* @param date utc时间
|
||||||
|
* @return 北京时间
|
||||||
|
*/
|
||||||
|
public static String utcToCst(String date) {
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
|
||||||
|
LocalDateTime localDateTime = LocalDateTime.parse(date, formatter);
|
||||||
|
localDateTime.plusHours(8);
|
||||||
|
DateTimeFormatter returnFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
|
return localDateTime.format(returnFormatter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package com.inspur.module.data.controller.admin.query;
|
|||||||
import com.inspur.framework.apilog.core.annotation.ApiAccessLog;
|
import com.inspur.framework.apilog.core.annotation.ApiAccessLog;
|
||||||
import com.inspur.framework.common.pojo.CommonResult;
|
import com.inspur.framework.common.pojo.CommonResult;
|
||||||
import com.inspur.framework.common.pojo.PageParam;
|
import com.inspur.framework.common.pojo.PageParam;
|
||||||
|
import com.inspur.framework.common.util.json.JsonUtils;
|
||||||
import com.inspur.framework.common.util.object.BeanUtils;
|
import com.inspur.framework.common.util.object.BeanUtils;
|
||||||
import com.inspur.framework.excel.core.util.ExcelUtils;
|
import com.inspur.framework.excel.core.util.ExcelUtils;
|
||||||
import com.inspur.module.data.controller.admin.query.vo.*;
|
import com.inspur.module.data.controller.admin.query.vo.*;
|
||||||
@ -11,6 +12,7 @@ import com.inspur.module.system.controller.admin.alarm.vo.AlarmDataPageReqVO;
|
|||||||
import com.inspur.module.system.controller.admin.alarm.vo.AlarmDataRespVO;
|
import com.inspur.module.system.controller.admin.alarm.vo.AlarmDataRespVO;
|
||||||
import com.inspur.module.system.dal.dataobject.alarm.AlarmDataDO;
|
import com.inspur.module.system.dal.dataobject.alarm.AlarmDataDO;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@ -40,6 +42,9 @@ public class DataQueryController {
|
|||||||
@Resource
|
@Resource
|
||||||
private IDataQueryService dataQueryService;
|
private IDataQueryService dataQueryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StringRedisTemplate stringRedisTemplate;
|
||||||
|
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
@Operation(summary = "获取/查询网关数据列表")
|
@Operation(summary = "获取/查询网关数据列表")
|
||||||
@PreAuthorize("@ss.hasPermission('data:query:list')")
|
@PreAuthorize("@ss.hasPermission('data:query:list')")
|
||||||
@ -54,6 +59,24 @@ public class DataQueryController {
|
|||||||
return success(resMap);
|
return success(resMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/getFieldList")
|
||||||
|
@Operation(summary = "获取/查询网关数据列表")
|
||||||
|
@PreAuthorize("@ss.hasPermission('data:query:list')")
|
||||||
|
public CommonResult<Map<String, Object>> getFieldList(String equipId,String nameKey,String tableName, String startTime, String endTime){
|
||||||
|
Map<String,Object> resMap = new HashMap<>();
|
||||||
|
Map<String,String> mappingMap = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("alarmKey2MeasurementMapping"),Map.class);
|
||||||
|
if (!mappingMap.containsKey(nameKey)){
|
||||||
|
return CommonResult.error(800,"找不到给参数匹配名对应的表名!");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
resMap = dataQueryService.queryDataListByColumnNameandDate(equipId,mappingMap.get(nameKey),nameKey,startTime,endTime);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return CommonResult.error(800,"时间格式错误");
|
||||||
|
}
|
||||||
|
return success(resMap);
|
||||||
|
}
|
||||||
|
|
||||||
@GetMapping("/export-current-excel")
|
@GetMapping("/export-current-excel")
|
||||||
@Operation(summary = "导出机床电流传感器参数 Excel")
|
@Operation(summary = "导出机床电流传感器参数 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('data:query:export')")
|
@PreAuthorize("@ss.hasPermission('data:query:export')")
|
||||||
|
@ -7,6 +7,10 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -44,6 +48,46 @@ public class DataQueryService implements IDataQueryService{
|
|||||||
return resMap;
|
return resMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据起止时间和字段名称查询数据
|
||||||
|
*/
|
||||||
|
public Map<String, Object> queryDataListByColumnNameandDate(String equipId, String tableName, String columnName, String startTime, String endTime) throws ParseException {
|
||||||
|
LocalDateTime stime = DateUtils.tranUTCtoLocalDateTime(startTime);
|
||||||
|
LocalDateTime etime = DateUtils.tranUTCtoLocalDateTime(endTime);
|
||||||
|
long intervalHours = ChronoUnit.HOURS.between(stime, etime);
|
||||||
|
|
||||||
|
List<Map<String, Object>> list = new ArrayList<>();
|
||||||
|
if(intervalHours <= 6){//6小时内全查
|
||||||
|
list = selectDataByColumnNameandDate(null,tableName, columnName, startTime, endTime);
|
||||||
|
}else if(intervalHours <= 7*24 ){//7天内,每30s一个
|
||||||
|
list = selectLongTimeDataByColumnNameandDate(null,tableName, columnName, startTime, endTime, "30s");
|
||||||
|
}else if(intervalHours <= 30*24 ){//30天内,每2min一个
|
||||||
|
list = selectLongTimeDataByColumnNameandDate(null,tableName, columnName, startTime, endTime, "2m");
|
||||||
|
}else if (intervalHours <= 90*24){//90天以上,每4h一个
|
||||||
|
list = selectLongTimeDataByColumnNameandDate(null,tableName, columnName, startTime, endTime, "6m");
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, Object> resMap = new HashMap<>();
|
||||||
|
if (list.size() == 0){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Object> columnList = new ArrayList<>();
|
||||||
|
List<String> timelist = new ArrayList<>();
|
||||||
|
if(intervalHours > 6){
|
||||||
|
columnName = "mean";
|
||||||
|
}
|
||||||
|
for (Map<String, Object> data : list) {
|
||||||
|
columnList.add(data.get(columnName));
|
||||||
|
timelist.add(DateUtils.utcToCst(data.get("time").toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
resMap.put("y", columnList);
|
||||||
|
resMap.put("x", timelist);
|
||||||
|
|
||||||
|
return resMap;
|
||||||
|
}
|
||||||
|
|
||||||
private List<Map<String, Object>> queryDataByTime(String tableName, String equipId, String beginTime, String endTime, Integer pageNum, Integer pageSize) {
|
private List<Map<String, Object>> queryDataByTime(String tableName, String equipId, String beginTime, String endTime, Integer pageNum, Integer pageSize) {
|
||||||
StringBuilder sql = new StringBuilder("select * from ")
|
StringBuilder sql = new StringBuilder("select * from ")
|
||||||
.append("\"").append(tableName).append("\"");
|
.append("\"").append(tableName).append("\"");
|
||||||
@ -100,4 +144,67 @@ public class DataQueryService implements IDataQueryService{
|
|||||||
}
|
}
|
||||||
return influxDBService.countResultProcess(influxDBService.query(sql.toString()));
|
return influxDBService.countResultProcess(influxDBService.query(sql.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据字段名称和起止时间查询数据
|
||||||
|
* @param tableName 表名
|
||||||
|
* @param columnName 字段名称
|
||||||
|
* @param beginTime 起始时间
|
||||||
|
* @param endTime 结束时间
|
||||||
|
* @return 数据
|
||||||
|
*/
|
||||||
|
private List<Map<String, Object>> selectDataByColumnNameandDate(String equipId, String tableName, String columnName, String beginTime, String endTime){
|
||||||
|
StringBuilder sql = new StringBuilder("select time,").append(columnName).append(" from ")
|
||||||
|
.append("\"").append(tableName).append("\"");//TODO 修改时间
|
||||||
|
if(equipId != null){
|
||||||
|
sql.append(" where equip_id = '").append(equipId).append("'");
|
||||||
|
}
|
||||||
|
if(beginTime != null){
|
||||||
|
if(!sql.toString().contains("where")){
|
||||||
|
sql.append(" where");
|
||||||
|
}else{
|
||||||
|
sql.append(" and");
|
||||||
|
}
|
||||||
|
sql.append(" time >= '").append(beginTime).append("'");
|
||||||
|
}
|
||||||
|
if(endTime != null){
|
||||||
|
if(!sql.toString().contains("where")){
|
||||||
|
sql.append(" where");
|
||||||
|
}else{
|
||||||
|
sql.append(" and");
|
||||||
|
}
|
||||||
|
sql.append(" time <= '").append(endTime).append("'");
|
||||||
|
}
|
||||||
|
return influxDBService.queryResultProcess(influxDBService.query(sql.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询长时间数据,每分钟取一条展示(最长3个月)
|
||||||
|
*/
|
||||||
|
private List<Map<String, Object>> selectLongTimeDataByColumnNameandDate(String equipId,String tableName, String columnName, String beginTime, String endTime, String interval){
|
||||||
|
StringBuilder sql = new StringBuilder("select time, mean(").append(columnName).append(") from ")
|
||||||
|
.append("\"").append(tableName).append("\"");
|
||||||
|
if(equipId != null){
|
||||||
|
sql.append(" where equip_id = '").append(equipId).append("'");
|
||||||
|
}
|
||||||
|
if(beginTime != null){
|
||||||
|
if(!sql.toString().contains("where")){
|
||||||
|
sql.append(" where");
|
||||||
|
}else{
|
||||||
|
sql.append(" and");
|
||||||
|
}
|
||||||
|
sql.append(" time >= '").append(beginTime).append("'");
|
||||||
|
}
|
||||||
|
if(endTime != null){
|
||||||
|
if(!sql.toString().contains("where")){
|
||||||
|
sql.append(" where");
|
||||||
|
}else{
|
||||||
|
sql.append(" and");
|
||||||
|
}
|
||||||
|
sql.append(" time <= '").append(endTime).append("'");
|
||||||
|
}
|
||||||
|
sql.append(" group by time(").append(interval).append(") fill(none)");
|
||||||
|
return influxDBService.queryResultProcess(influxDBService.query(sql.toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,4 +17,9 @@ public interface IDataQueryService {
|
|||||||
*/
|
*/
|
||||||
Map<String, Object> selectDataListByPages(String equipId,String tableName,String startTime,String endTime,Integer pageSize,Integer pageNum) throws ParseException;
|
Map<String, Object> selectDataListByPages(String equipId,String tableName,String startTime,String endTime,Integer pageSize,Integer pageNum) throws ParseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据起止时间和字段名称查询数据
|
||||||
|
*/
|
||||||
|
public Map<String, Object> queryDataListByColumnNameandDate(String equipId, String tableName, String columnName, String startTime, String endTime) throws ParseException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.inspur.module.data.service;
|
package com.inspur.module.data.service;
|
||||||
|
|
||||||
|
import com.inspur.framework.common.util.json.JsonUtils;
|
||||||
import com.inspur.module.data.config.InfluxDBConfig;
|
import com.inspur.module.data.config.InfluxDBConfig;
|
||||||
import org.influxdb.InfluxDB;
|
import org.influxdb.InfluxDB;
|
||||||
import org.influxdb.InfluxDBFactory;
|
import org.influxdb.InfluxDBFactory;
|
||||||
@ -10,9 +11,11 @@ import org.influxdb.dto.QueryResult;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -30,6 +33,9 @@ public class InfluxDBService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private InfluxDBConfig influxDBConfig;
|
private InfluxDBConfig influxDBConfig;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StringRedisTemplate stringRedisTemplate;
|
||||||
|
|
||||||
//保留策略
|
//保留策略
|
||||||
private String retentionPolicy;
|
private String retentionPolicy;
|
||||||
private InfluxDB influxDB;
|
private InfluxDB influxDB;
|
||||||
@ -37,6 +43,7 @@ public class InfluxDBService {
|
|||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void initInfluxDb() {
|
public void initInfluxDb() {
|
||||||
|
alarmKey2MeasurementMapping();//influxDB报警键值与表名映射
|
||||||
LOGGER.info("-->>开始连接influxDB数据库");
|
LOGGER.info("-->>开始连接influxDB数据库");
|
||||||
this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy;
|
this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy;
|
||||||
this.influxDB = influxDbBuild();
|
this.influxDB = influxDbBuild();
|
||||||
@ -52,6 +59,27 @@ public class InfluxDBService {
|
|||||||
// insert(measurement, tags, fields);
|
// insert(measurement, tags, fields);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
public void alarmKey2MeasurementMapping(){
|
||||||
|
Map<String,String> alarmKey2MeasurementMapping = new HashMap<>();
|
||||||
|
alarmKey2MeasurementMapping.put("x_push_temp", "gateway_channel_current_data");
|
||||||
|
alarmKey2MeasurementMapping.put("y_push_temp", "gateway_channel_current_data");
|
||||||
|
alarmKey2MeasurementMapping.put("x_lube_press", "gateway_channel_hydra_data");
|
||||||
|
alarmKey2MeasurementMapping.put("y_lube_press", "gateway_channel_hydra_data");
|
||||||
|
alarmKey2MeasurementMapping.put("z_lube_press", "gateway_channel_hydra_data");
|
||||||
|
alarmKey2MeasurementMapping.put("at_temp", "gateway_channel_temp_data");
|
||||||
|
alarmKey2MeasurementMapping.put("x_bear_temp", "gateway_channel_temp_data");
|
||||||
|
alarmKey2MeasurementMapping.put("y_bear_temp", "gateway_channel_temp_data");
|
||||||
|
alarmKey2MeasurementMapping.put("z_bear_temp", "gateway_channel_temp_data");
|
||||||
|
alarmKey2MeasurementMapping.put("x_debris_temp", "gateway_channel_temp_data");
|
||||||
|
alarmKey2MeasurementMapping.put("z_debris_temp", "gateway_channel_temp_data");
|
||||||
|
alarmKey2MeasurementMapping.put("x_entropy", "gateway_channel_vibr_data");
|
||||||
|
alarmKey2MeasurementMapping.put("on_time", "gateway_channel_work_data");
|
||||||
|
alarmKey2MeasurementMapping.put("work_items", "gateway_channel_work_data");
|
||||||
|
alarmKey2MeasurementMapping.put("work_time", "gateway_channel_work_data");
|
||||||
|
alarmKey2MeasurementMapping.put("work_total", "gateway_channel_work_data");
|
||||||
|
stringRedisTemplate.opsForValue().set("alarmKey2MeasurementMapping", JsonUtils.toJsonString(alarmKey2MeasurementMapping));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置数据保存策略 defalut 策略名 /database 数据库名/ 30d 数据保存时限30天/ 1 副本个数为1/ 结尾DEFAULT
|
* 设置数据保存策略 defalut 策略名 /database 数据库名/ 30d 数据保存时限30天/ 1 副本个数为1/ 结尾DEFAULT
|
||||||
* 表示 设为默认的策略
|
* 表示 设为默认的策略
|
||||||
|
@ -135,6 +135,7 @@ public class AlarmRulesApiImpl implements AlarmRulesApi{
|
|||||||
updateData.setLastAlarmTime(LocalDateTime.now());
|
updateData.setLastAlarmTime(LocalDateTime.now());
|
||||||
updateData.setAlarmLevel(rule.getAlarmLevel());
|
updateData.setAlarmLevel(rule.getAlarmLevel());
|
||||||
updateData.setEquipId(rule.getEquipId());
|
updateData.setEquipId(rule.getEquipId());
|
||||||
|
updateData.setReasonDescription(rule.getReasonDescription());
|
||||||
alarmDataService.updateAlarmData(updateData);
|
alarmDataService.updateAlarmData(updateData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
|
|
||||||
// 根据时间查询超压底缸数据
|
// 根据时间查询数据
|
||||||
export function getDataList(params) {
|
export function getDataList(params) {
|
||||||
return request({
|
return request({
|
||||||
url: "/data/query/list",
|
url: "/data/query/list",
|
||||||
@ -9,6 +9,15 @@ export function getDataList(params) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据时间查询参数的数据
|
||||||
|
export function getFieldList(params) {
|
||||||
|
return request({
|
||||||
|
url: "/data/query/getFieldList",
|
||||||
|
method: "get",
|
||||||
|
params: params,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 导出机床电流参数报警记录 Excel
|
// 导出机床电流参数报警记录 Excel
|
||||||
export function exportCurrentDataExcel(params) {
|
export function exportCurrentDataExcel(params) {
|
||||||
return request({
|
return request({
|
||||||
|
@ -103,7 +103,14 @@
|
|||||||
label="等级"
|
label="等级"
|
||||||
align="center"
|
align="center"
|
||||||
prop="alarmLevel"
|
prop="alarmLevel"
|
||||||
|
>
|
||||||
|
<template v-slot="scope">
|
||||||
|
<dict-tag
|
||||||
|
:type="DICT_TYPE.ALARM_LEVEL"
|
||||||
|
:value="scope.row.alarmLevel"
|
||||||
/>
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
label="客户名"
|
label="客户名"
|
||||||
align="center"
|
align="center"
|
||||||
@ -184,13 +191,13 @@
|
|||||||
size="mini"
|
size="mini"
|
||||||
type="text"
|
type="text"
|
||||||
icon="el-icon-data-line"
|
icon="el-icon-data-line"
|
||||||
@click="handleAlarmTrend(scope.row.nameKey)"
|
@click="handleAlarmTrend(scope.row)"
|
||||||
>报警趋势</el-button>
|
>报警趋势</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
size="mini"
|
size="mini"
|
||||||
type="text"
|
type="text"
|
||||||
icon="el-icon-tickets"
|
icon="el-icon-tickets"
|
||||||
@click="handleReason"
|
@click="handleReason(scope.row)"
|
||||||
>报警原因参考</el-button>
|
>报警原因参考</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@ -328,14 +335,14 @@
|
|||||||
size="mini"
|
size="mini"
|
||||||
type="text"
|
type="text"
|
||||||
icon="el-icon-data-line"
|
icon="el-icon-data-line"
|
||||||
@click="handleAlarmTrend"
|
@click="handleAlarmTrend(scope.row)"
|
||||||
>报警趋势</el-button>
|
>报警趋势</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
size="mini"
|
size="mini"
|
||||||
type="text"
|
type="text"
|
||||||
icon="el-icon-tickets"
|
icon="el-icon-tickets"
|
||||||
@click="handleReason"
|
@click="handleReason(scope.row)"
|
||||||
>报警原因参考</el-button>
|
>故障原因参考</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@ -369,12 +376,142 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!--规则详情弹窗框-->
|
||||||
|
<el-dialog
|
||||||
|
:title="detailTitle"
|
||||||
|
:visible.sync="detailOpen"
|
||||||
|
width="40%"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
:model="detailForm"
|
||||||
|
v-loading="detailLoading"
|
||||||
|
label-width="100px"
|
||||||
|
>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="客户名称"
|
||||||
|
prop="customerName"
|
||||||
|
>
|
||||||
|
{{ detailForm.customerName }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="机床型号"
|
||||||
|
prop="equipNo"
|
||||||
|
>
|
||||||
|
{{ detailForm.modelName }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="设备编号"
|
||||||
|
prop="equipNo"
|
||||||
|
>
|
||||||
|
{{ detailForm.equipNo }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="规则参数"
|
||||||
|
prop="nameKey"
|
||||||
|
>
|
||||||
|
{{ detailForm.nameKey }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="报警内容"
|
||||||
|
prop="content"
|
||||||
|
>
|
||||||
|
{{ detailForm.content }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="报警值"
|
||||||
|
prop="alarmValue"
|
||||||
|
>
|
||||||
|
{{ detailForm.alarmValue }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="首次报警时间"
|
||||||
|
prop="firstAlarmTime"
|
||||||
|
>
|
||||||
|
{{ parseTime(detailForm.firstAlarmTime) }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item
|
||||||
|
label="最新报警时间"
|
||||||
|
prop="lastAlarmTime"
|
||||||
|
>
|
||||||
|
{{ parseTime(detailForm.lastAlarmTime) }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item
|
||||||
|
label="可能故障原因"
|
||||||
|
prop="reasonDescription"
|
||||||
|
>
|
||||||
|
<div v-html="detailForm.reasonDescription" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-form>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!--报警参数趋势查询弹窗-->
|
||||||
|
<el-dialog
|
||||||
|
:title="alarmDataTitle"
|
||||||
|
:visible.sync="alarmDataOpen"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
width="1000px"
|
||||||
|
:before-close="beforeAlarmDataClose"
|
||||||
|
center
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="block"
|
||||||
|
style="text-align:center;"
|
||||||
|
>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="datetimeRange"
|
||||||
|
type="datetimerange"
|
||||||
|
range-separator="至"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
align="right"
|
||||||
|
style="margin-right:10px"
|
||||||
|
>
|
||||||
|
</el-date-picker>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-search"
|
||||||
|
size="mini"
|
||||||
|
@click="handleAlarmDataQuery(null)"
|
||||||
|
>查 询</el-button>
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-refresh"
|
||||||
|
size="mini"
|
||||||
|
@click="resetAlarmDataQuery"
|
||||||
|
>重 置</el-button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-loading="loading"
|
||||||
|
ref="chart"
|
||||||
|
style="height:500px"
|
||||||
|
></div>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import * as echarts from "echarts";
|
||||||
import * as AlarmDataApi from "@/api/system/alarm/alarmdata";
|
import * as AlarmDataApi from "@/api/system/alarm/alarmdata";
|
||||||
import AlarmDataForm from "./AlarmDataForm.vue";
|
import AlarmDataForm from "./AlarmDataForm.vue";
|
||||||
|
import { getFieldList } from "@/api/data/query.js";
|
||||||
export default {
|
export default {
|
||||||
name: "AlarmData",
|
name: "AlarmData",
|
||||||
components: {
|
components: {
|
||||||
@ -414,6 +551,7 @@ export default {
|
|||||||
lastAlarmTime: [],
|
lastAlarmTime: [],
|
||||||
createTime: [],
|
createTime: [],
|
||||||
equipAlarmId: null,
|
equipAlarmId: null,
|
||||||
|
alarmType: 0,
|
||||||
},
|
},
|
||||||
treQueryParams: {
|
treQueryParams: {
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
@ -427,6 +565,7 @@ export default {
|
|||||||
lastAlarmTime: [],
|
lastAlarmTime: [],
|
||||||
createTime: [],
|
createTime: [],
|
||||||
equipAlarmId: null,
|
equipAlarmId: null,
|
||||||
|
alarmType: 1,
|
||||||
},
|
},
|
||||||
thrActiveName: "threshold",
|
thrActiveName: "threshold",
|
||||||
treActiveName: "trend",
|
treActiveName: "trend",
|
||||||
@ -434,6 +573,23 @@ export default {
|
|||||||
modelName: null,
|
modelName: null,
|
||||||
equipNo: null,
|
equipNo: null,
|
||||||
alarmLevel: null,
|
alarmLevel: null,
|
||||||
|
// 查询参数
|
||||||
|
dataQueryParams: {
|
||||||
|
equipId: null,
|
||||||
|
nameKey: null,
|
||||||
|
startTime: null,
|
||||||
|
endTime: null,
|
||||||
|
},
|
||||||
|
detailTitle: null,
|
||||||
|
detailOpen: false,
|
||||||
|
detailForm: {},
|
||||||
|
detailLoading: false,
|
||||||
|
//报警参数趋势查询弹窗数据
|
||||||
|
alarmDataTitle: null,
|
||||||
|
alarmDataOpen: false,
|
||||||
|
loading: false,
|
||||||
|
selectedRow: {},
|
||||||
|
datetimeRange: [],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@ -445,10 +601,66 @@ export default {
|
|||||||
this.alarmLevel = this.$route.query.alarmLevel;
|
this.alarmLevel = this.$route.query.alarmLevel;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
async handleAlarmDataQuery(row) {
|
||||||
|
//需要row提供匹配数据名称和单位等信息
|
||||||
|
this.loading = true;
|
||||||
|
//根据时间查询参数数据
|
||||||
|
this.dataQueryParams.nameKey = row
|
||||||
|
? row.nameKey
|
||||||
|
: this.selectedRow.nameKey;
|
||||||
|
if (this.datetimeRange == null || this.datetimeRange.length == 0) {
|
||||||
|
this.datetimeRange = this.getDefaultTimeRange(row.lastAlarmTime);
|
||||||
|
} else if (row == null) {
|
||||||
|
this.datetimeRange = this.formatTimeRange(this.datetimeRange);
|
||||||
|
}
|
||||||
|
this.dataQueryParams.startTime = this.datetimeRange[0];
|
||||||
|
this.dataQueryParams.endTime = this.datetimeRange[1];
|
||||||
|
|
||||||
|
const data = await getFieldList(this.dataQueryParams);
|
||||||
|
console.log("9999:", data.data);
|
||||||
|
this.getEchartData(data.data);
|
||||||
|
},
|
||||||
|
getEchartData(data) {
|
||||||
|
if (data == null) {
|
||||||
|
this.initchart([], [], "", "");
|
||||||
|
} else {
|
||||||
|
this.initchart(data.x, data.y, "", "");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resetAlarmDataQuery() {},
|
||||||
/**报警原因 */
|
/**报警原因 */
|
||||||
handleReason() {},
|
handleReason(row) {
|
||||||
|
this.detailLoading = true;
|
||||||
|
this.detailTitle = "报警可能原因";
|
||||||
|
this.detailOpen = true;
|
||||||
|
this.detailForm = row;
|
||||||
|
this.detailLoading = false;
|
||||||
|
},
|
||||||
/**报警趋势 */
|
/**报警趋势 */
|
||||||
handleAlarmTrend(key) {},
|
handleAlarmTrend(row) {
|
||||||
|
this.selectedRow = row;
|
||||||
|
this.alarmDataOpen = true;
|
||||||
|
this.alarmDataTitle = "参数报警趋势";
|
||||||
|
this.datetimeRange = this.getDefaultTimeRange(row.lastAlarmTime); //最新报警时间前一小时数据
|
||||||
|
this.handleAlarmDataQuery(row);
|
||||||
|
},
|
||||||
|
getDefaultTimeRange(time) {
|
||||||
|
const alarmTime = new Date(time);
|
||||||
|
const hoursAgo = new Date(alarmTime.getTime() - 1 * 60 * 60 * 1000);
|
||||||
|
return [hoursAgo.toISOString(), alarmTime.toISOString()];
|
||||||
|
},
|
||||||
|
formatTimeRange(datetimerange) {
|
||||||
|
if (datetimerange || datetimerange.length != 0) {
|
||||||
|
// const startTime = new Date(datetimerange[0]);
|
||||||
|
return [datetimerange[0].toISOString(), datetimerange[1].toISOString()];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
beforeAlarmDataClose() {
|
||||||
|
// this.chart && this.chart.dispose();
|
||||||
|
// done();
|
||||||
|
this.alarmDataOpen = false;
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* 全部关闭报警
|
* 全部关闭报警
|
||||||
*/
|
*/
|
||||||
@ -457,6 +669,157 @@ export default {
|
|||||||
* 维修工单
|
* 维修工单
|
||||||
*/
|
*/
|
||||||
handelMaintanence() {},
|
handelMaintanence() {},
|
||||||
|
/**echart表初始化 */
|
||||||
|
initchart(xData, yData, name, unit) {
|
||||||
|
let p = new Promise((resolve) => {
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
p.then(() => {
|
||||||
|
this.chart = echarts.init(this.$refs.chart);
|
||||||
|
let option = {
|
||||||
|
color: ["#637DCB"],
|
||||||
|
title: {
|
||||||
|
text: "",
|
||||||
|
right: "100",
|
||||||
|
textStyle: { fontWeight: "normal", color: "#637DCB" },
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
top: 0,
|
||||||
|
itemSize: 13, //工具栏 icon 的大小
|
||||||
|
iconStyle: {
|
||||||
|
color: "transparent",
|
||||||
|
borderColor: "#fff",
|
||||||
|
},
|
||||||
|
feature: {
|
||||||
|
dataZoom: {
|
||||||
|
yAxisIndex: "none",
|
||||||
|
},
|
||||||
|
restore: { show: false },
|
||||||
|
saveAsImage: { show: false },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
//提示框
|
||||||
|
trigger: "axis",
|
||||||
|
axisPointer: {
|
||||||
|
type: "line", //显示提示框的时候的背景 line是一条线 shadow是个背景框
|
||||||
|
},
|
||||||
|
backgroundColor: "#fff",
|
||||||
|
extraCssText: "box-shadow: 4px 4px 4px 2px rgba(0, 0, 0, 0.2)", //提示框加阴影效果
|
||||||
|
textStyle: {
|
||||||
|
color: "#4E5969", //设置文字颜色
|
||||||
|
},
|
||||||
|
formatter: (prams) => {
|
||||||
|
let name = parseFloat(_.get(prams, [0, "name"])).toFixed(4);
|
||||||
|
let value = parseFloat(_.get(prams, [0, "value"])).toFixed(4);
|
||||||
|
return (
|
||||||
|
"<span style='color:#6D85CE'>" +
|
||||||
|
`(${name}` +
|
||||||
|
"," +
|
||||||
|
`${value})` +
|
||||||
|
"</span>"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: "category",
|
||||||
|
name: "时间",
|
||||||
|
data: xData,
|
||||||
|
nameTextStyle: { fontSize: "9" },
|
||||||
|
axisLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
width: 0, //这里是为了突出显示加上的
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
textStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: "9",
|
||||||
|
},
|
||||||
|
showMaxLabel: true,
|
||||||
|
showMinLabel: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
name: "单位: " + unit,
|
||||||
|
type: "value",
|
||||||
|
nameLocation: "end",
|
||||||
|
nameTextStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: "9",
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
interval: 0,
|
||||||
|
textStyle: {
|
||||||
|
fontSize: "9",
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
//修改背景线条样式
|
||||||
|
show: true, //是否展示
|
||||||
|
lineStyle: {
|
||||||
|
color: "#3C506B", //线条颜色
|
||||||
|
type: "dashed", //线条样式,默认是实现,dashed是虚线
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
grid: {
|
||||||
|
left: "3%",
|
||||||
|
right: "8%",
|
||||||
|
bottom: "18%",
|
||||||
|
top: "14%",
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
dataZoom: [
|
||||||
|
{
|
||||||
|
show: true,
|
||||||
|
type: "slider",
|
||||||
|
xAxisIndex: 0,
|
||||||
|
filterMode: "none",
|
||||||
|
start: 0,
|
||||||
|
end: xData.length,
|
||||||
|
bottom: "1%",
|
||||||
|
fillerColor: "rgba(167,183,204,0.4)", //选中范围的填充颜色。
|
||||||
|
borderColor: "#3C506B",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
show: true,
|
||||||
|
type: "inside",
|
||||||
|
xAxisIndex: 0,
|
||||||
|
filterMode: "none",
|
||||||
|
start: 0,
|
||||||
|
end: 10,
|
||||||
|
bottom: "1%",
|
||||||
|
fillerColor: "rgba(167,183,204,0.4)", //选中范围的填充颜色。
|
||||||
|
borderColor: "#E0E6F3",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: name,
|
||||||
|
type: "line",
|
||||||
|
data: yData,
|
||||||
|
symbol: "none",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
this.chart.setOption(option);
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
async getThrList() {
|
async getThrList() {
|
||||||
try {
|
try {
|
||||||
@ -523,7 +886,7 @@ export default {
|
|||||||
.company-line-wrap-info {
|
.company-line-wrap-info {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-rows: 9% 42% 42% 3%;
|
grid-template-rows: 9% 45% 45% 3%;
|
||||||
grid-gap: 1%;
|
grid-gap: 1%;
|
||||||
//min-height: calc(100vh - 90px);
|
//min-height: calc(100vh - 90px);
|
||||||
margin: 0 40px;
|
margin: 0 40px;
|
||||||
|
Loading…
Reference in New Issue
Block a user