Compare commits

...

2 Commits

Author SHA1 Message Date
981bb9e51e Merge branch 'master' into zjw 2024-09-29 17:11:03 +08:00
fd5a166fa4 监测数据看板功能更新 2024-09-29 17:09:50 +08:00
14 changed files with 2063 additions and 15 deletions

View File

@ -77,6 +77,46 @@ public class DataQueryController {
return success(resMap);
}
@GetMapping("/getCurrentData")
@Operation(summary = "获取/查询网关电流数据列表")
@PreAuthorize("@ss.hasPermission('data:query:list')")
public CommonResult<Map<String, Object>> getCurrentData(String equipId, String startTime, String endTime){
Map<String, Object> resMap = dataQueryService.getCurrentData(equipId, startTime, endTime);
return success(resMap);
}
@GetMapping("/getPressData")
@Operation(summary = "获取/查询网关液压数据列表")
@PreAuthorize("@ss.hasPermission('data:query:list')")
public CommonResult<Map<String, Object>> getPressData(String equipId, String startTime, String endTime){
Map<String, Object> resMap = dataQueryService.getPressData(equipId, startTime, endTime);
return success(resMap);
}
@GetMapping("/getTempData")
@Operation(summary = "获取/查询网关温度数据列表")
@PreAuthorize("@ss.hasPermission('data:query:list')")
public CommonResult<Map<String, Object>> getTempData(String equipId, String startTime, String endTime){
Map<String, Object> resMap = dataQueryService.getTempData(equipId, startTime, endTime);
return success(resMap);
}
@GetMapping("/getVibrData")
@Operation(summary = "获取/查询网关振动数据列表")
@PreAuthorize("@ss.hasPermission('data:query:list')")
public CommonResult<Map<String, Object>> getVibrData(String equipId, String startTime, String endTime){
Map<String, Object> resMap = dataQueryService.getVibrData(equipId, startTime, endTime);
return success(resMap);
}
@GetMapping("/getWorkData")
@Operation(summary = "获取/查询网关工作数据列表")
@PreAuthorize("@ss.hasPermission('data:query:list')")
public CommonResult<Map<String, Object>> getWorkData(String equipId, String startTime, String endTime){
Map<String, Object> resMap = dataQueryService.getWorkData(equipId, startTime, endTime);
return success(resMap);
}
@GetMapping("/export-current-excel")
@Operation(summary = "导出机床电流传感器参数 Excel")
@PreAuthorize("@ss.hasPermission('data:query:export')")

View File

@ -90,8 +90,12 @@ public class MyMqttCallback implements MqttCallback {
String deviceType = (String) map.get("deviceType");
String gatewayCode = deviceName.substring(0,17);
Map<String,Object> mapping = getGatewayMapping(gatewayCode);
if(mapping == null){
logger.info("未找到对应网关!");
return;
}
String msgType = (String) mapping.get(deviceType + "MsgType");
if(map.get("msgType") != null && msgType.equals(map.get("msgType"))){
if(map.get("msgType") != null && msgType != null && msgType.equals(map.get("msgType"))){
process((String)mapping.get(deviceType),(String)mapping.get("equipId"),(Map<String,String>)mapping.get(deviceType + "Params"),(Map<String,Object>)map.get("msg"));
}else{
logger.info("数据未存储!");
@ -136,6 +140,9 @@ public class MyMqttCallback implements MqttCallback {
private Map<String, Object> getGatewayMapping(String gatewayCode) {
GatewayInfoService gatewayInfoService = SpringUtils.getBean(GatewayInfoService.class);
GatewayInfoDO gatewayInfo = gatewayInfoService.getGatewayInfoByGatewayCode(gatewayCode);
if(gatewayInfo == null){
return null;
}
//通过配置获取
Map<String, Object> cardMapping = gatewayInfoService.getGatewayCardAndParamByCatch(gatewayInfo.getGatewayId());
cardMapping.put("equipId", gatewayInfo.getEquipId());

View File

@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author zhangjunwen
@ -57,17 +58,17 @@ public class DataQueryService implements IDataQueryService{
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");
}
// 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天以上6min一个
// list = selectLongTimeDataByColumnNameandDate(null,tableName, columnName, startTime, endTime, "6m");
// }
List<Map<String, Object>> list = selectDataByColumnNameandDateSegmentation(equipId, tableName, columnName, startTime, endTime, intervalHours);
Map<String, Object> resMap = new HashMap<>();
if (list.size() == 0){
return null;
@ -89,6 +90,119 @@ public class DataQueryService implements IDataQueryService{
return resMap;
}
/**
* 根据设备id获取排屑电流数据
*/
public Map<String, Object> getCurrentData(String equipId, String startTime, String endTime){
String tableName = "gateway_current_data";
String columnName = "chip_removal_1,chip_removal_2";
return getAllData2ChartData(equipId,tableName,columnName, startTime, endTime);
}
/**
* 根据设备id获取液压数据
*/
public Map<String, Object> getPressData(String equipId, String startTime, String endTime){
String tableName = "gateway_hy_data";
String columnName = "hy_1,hy_2,hy_3";
return getAllData2ChartData(equipId,tableName,columnName, startTime, endTime);
}
/**
* 根据设备id获取温度数据
*/
public Map<String, Object> getTempData(String equipId, String startTime, String endTime){
String tableName = "gateway_temp_data";
String columnName = "cr1_temp,cr2_temp,x0_temp,xp_temp,xn_temp,y0_temp,yp_temp,yn_temp,z0_temp,zp_temp,zn_temp";
return getAllData2ChartData(equipId,tableName,columnName, startTime, endTime);
}
/**
* 根据设备id获取振动数据
*/
public Map<String, Object> getVibrData(String equipId, String startTime, String endTime){
String tableName = "gateway_aclr_data";
String columnName = "x_aclr_rms,x_speed_rms,x_dis_rms,y_aclr_rms,y_speed_rms,y_dis_rms,z_aclr_rms,z_speed_rms,z_dis_rms," +
"x_aclr_peak,x_speed_peak,x_dis_peak,y_aclr_peak,y_speed_peak,y_dis_peak,z_aclr_peak,z_speed_peak,z_dis_peak";
return getAllData2ChartData(equipId,tableName,columnName, startTime, endTime);
}
/**
* 根据设备id获取工作数据
*/
public Map<String, Object> getWorkData(String equipId, String startTime, String endTime){
String tableName = "gateway_fanuc_data";
String columnName = "power_time,process_num,total_process,work_time";
Map<String, Object> resultMap = getAllData2ChartData(equipId,tableName,columnName, startTime, endTime);
List<Double> workTimeList = (List<Double>) resultMap.get("work_time");
List<Double> powerTimeList = (List<Double>) resultMap.get("power_time");
resultMap.put("work_time", workTimeList.stream().map(w -> w / 60.0).collect(Collectors.toList()));
resultMap.put("power_time", powerTimeList.stream().map(p -> p / 60.0).collect(Collectors.toList()));
return resultMap;
}
public Map<String, Object> getAllData2ChartData(String equipId,String tableName,String columns, String startTime, String endTime){
LocalDateTime stime = DateUtils.tranUTCtoLocalDateTime(startTime);
LocalDateTime etime = DateUtils.tranUTCtoLocalDateTime(endTime);
long intervalHours = ChronoUnit.HOURS.between(stime, etime);
List<Map<String, Object>> list = selectDataByColumnNameandDateSegmentation(equipId, tableName, columns, startTime, endTime, intervalHours);
Map<String, Object> resMap = new HashMap<>();
if (list.size() == 0){
return null;
}
List<Object> columnList = new ArrayList<>();
List<String> timelist = new ArrayList<>();
String[] columnName = columns.split(",");
if(intervalHours > 6){
for(int i=0;i < columnName.length;i++){
columnName[i] = "mean_" + columnName[i];
}
}
for (String cn : columnName) {
if(cn.trim().length() == 0){
continue;
}
String realCn = cn;
if(cn.startsWith("mean")){
realCn = cn.replaceFirst("mean_", "");
}
resMap.put(realCn, list.stream().map(map->{
Double data = (Double)map.get(cn);
if("gateway_temp_data".equals(tableName)){//温度处理
return data/10.0;
}
if("work_time".equals(columnName) || "power_time".equals(columnName)){//时间转小时
return data/60.0;
}
return data;
}).collect(Collectors.toList()));
resMap.put("time", list.stream().map(map -> DateUtils.utcToCst(map.get("time").toString())).collect(Collectors.toList()));
}
return resMap;
}
/**
*按照策略分段查询数据列表
*/
private List<Map<String, Object>> selectDataByColumnNameandDateSegmentation(String equipId, String tableName, String columnName, String startTime, String endTime,long intervalHours)
{
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天以上每6min一个
list = selectLongTimeDataByColumnNameandDate(null,tableName, columnName, startTime, endTime, "6m");
}
return list;
}
private List<Map<String, Object>> queryDataByTime(String tableName, String equipId, String beginTime, String endTime, Integer pageNum, Integer pageSize) {
StringBuilder sql = new StringBuilder("select * from ")
.append("\"").append(tableName).append("\"");
@ -184,6 +298,9 @@ public class DataQueryService implements IDataQueryService{
* 查询长时间数据每分钟取一条展示最长3个月
*/
private List<Map<String, Object>> selectLongTimeDataByColumnNameandDate(String equipId,String tableName, String columnName, String beginTime, String endTime, String interval){
if(columnName.split(",").length > 1){
columnName = "*";
}
StringBuilder sql = new StringBuilder("select time, mean(").append(columnName).append(") from ")
.append("\"").append(tableName).append("\"");
if(equipId != null){

View File

@ -22,4 +22,28 @@ public interface IDataQueryService {
*/
public Map<String, Object> queryDataListByColumnNameandDate(String equipId, String tableName, String columnName, String startTime, String endTime) throws ParseException;
/**
* 根据设备id获取排屑电流数据
*/
public Map<String, Object> getCurrentData(String equipId, String startTime, String endTime);
/**
* 根据设备id获取液压数据
*/
public Map<String, Object> getPressData(String equipId, String startTime, String endTime);
/**
* 根据设备id获取温度数据
*/
public Map<String, Object> getTempData(String equipId, String startTime, String endTime);
/**
* 根据设备id获取振动数据
*/
public Map<String, Object> getVibrData(String equipId, String startTime, String endTime);
/**
* 根据设备id获取工作数据
*/
public Map<String, Object> getWorkData(String equipId, String startTime, String endTime);
}

View File

@ -43,4 +43,9 @@ public interface GatewayInfoMapper extends BaseMapperX<GatewayInfoDO> {
* 根据网关编号查询网关信息
*/
public GatewayInfoDO selectGatewayByGatewayCode(@Param("gatewayCode") String gatewayCode);
/**
* 获取网关信息列表
*/
public List<GatewayInfoDO> selectAllGatewayList();
}

View File

@ -1,11 +1,14 @@
package com.inspur.module.system.service.gatewayinfo;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.TimeUnit;
import com.inspur.module.system.controller.admin.gatewayinfo.vo.*;
import com.inspur.module.system.dal.dataobject.gatewayinfo.GatewayCardParamsDO;
import com.inspur.framework.common.pojo.PageResult;
@ -29,6 +32,9 @@ public class GatewayCardParamsServiceImpl implements GatewayCardParamsService {
@Resource
private GatewayCardParamsMapper gatewayCardParamsMapper;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public String createGatewayCardParams(GatewayCardParamsSaveReqVO createReqVO) {
// 插入
@ -46,6 +52,10 @@ public class GatewayCardParamsServiceImpl implements GatewayCardParamsService {
if(paramsList.isEmpty()){
return true;
}
String gatewayId = paramsList.get(0).getGatewayId();
if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("cardmapping_" + gatewayId))){
stringRedisTemplate.delete("cardmapping_" + gatewayId);
}
List<GatewayCardParamsDO> gatewayCardParamsList = BeanUtils.toBean(paramsList, GatewayCardParamsDO.class);
return gatewayCardParamsMapper.insertBatch(gatewayCardParamsList);
}
@ -66,6 +76,10 @@ public class GatewayCardParamsServiceImpl implements GatewayCardParamsService {
if (paramsList.isEmpty()){
return true;
}
String gatewayId = paramsList.get(0).getGatewayId();
if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("cardmapping_" + gatewayId))){
stringRedisTemplate.delete("cardmapping_" + gatewayId);
}
List<GatewayCardParamsDO> gatewayCardParamsList = BeanUtils.toBean(paramsList, GatewayCardParamsDO.class);
return gatewayCardParamsMapper.updateBatch(gatewayCardParamsList);
}

View File

@ -53,6 +53,11 @@ public interface GatewayInfoService {
*/
PageResult<GatewayInfoDO> getGatewayInfoPage(GatewayInfoPageReqVO pageReqVO);
/**
* 获取机床网关列表
*/
List<GatewayInfoDO> getGatewayInfoList();
/**
* 根据机床网关编号获取机床网关信息
*/

View File

@ -10,6 +10,7 @@ import com.inspur.module.system.dal.dataobject.gatewayinfo.GatewayCardParamsDO;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -49,6 +50,15 @@ public class GatewayInfoServiceImpl implements GatewayInfoService {
@Resource
private StringRedisTemplate stringRedisTemplate;
@PostConstruct
public void init() {
List<GatewayInfoDO> gatewayInfoList = getGatewayInfoList();
for (GatewayInfoDO gatewayInfo : gatewayInfoList) {
getGatewayCardAndParamByCatch(gatewayInfo.getGatewayId());
}
}
@Override
@TenantIgnore
public String createGatewayInfo(GatewayInfoSaveReqVO createReqVO) {
@ -100,6 +110,14 @@ public class GatewayInfoServiceImpl implements GatewayInfoService {
return new PageResult<>(page.getRecords(), page.getTotal());
}
/**
* 获取机床网关列表
*/
@Override
public List<GatewayInfoDO> getGatewayInfoList(){
return gatewayInfoMapper.selectAllGatewayList();
}
/**
* 根据机床网关编号获取机床网关信息
*/
@ -117,12 +135,12 @@ public class GatewayInfoServiceImpl implements GatewayInfoService {
public Map<String, Object> getGatewayCardAndParamByCatch(String gatewayId){
//先从缓存中获取
if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("cardmapping_" + gatewayId))){
return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("gateway_" + gatewayId), Map.class);
return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("cardmapping_" + gatewayId), Map.class);
}
//获取网卡信息
List<GatewayCardInfoDO> cardList = gatewayCardInfoService.getGatewayCardInfoListByGatewayId(gatewayId);
//获取参数信息
List<GatewayCardParamsDO> paramsList = gatewayCardParamsService.getGatewayCardParamsByCardId(gatewayId);
List<GatewayCardParamsDO> paramsList = gatewayCardParamsService.getGatewayCardParamsByGatewayId(gatewayId);
if(cardList.size() == 0 || paramsList.size() == 0){
return null;
}

View File

@ -50,4 +50,8 @@
and igi.status = 0
and igi.deleted = '0'
</select>
<select id="selectAllGatewayList" resultMap="GatewayInfoResult">
<include refid="selectGatewayInfoVo"/>
</select>
</mapper>

View File

@ -67,3 +67,48 @@ export function exportProcessDataExcel(params) {
responseType: "blob",
});
}
// 根据设备id和时间获取电流数据
export function getCurrentData(params) {
return request({
url: "/data/query/getCurrentData",
method: "get",
params: params,
});
}
// 根据设备id和时间获取液压数据
export function getPressData(params) {
return request({
url: "/data/query/getPressData",
method: "get",
params: params,
});
}
// 根据设备id和时间获取温度数据
export function getTempData(params) {
return request({
url: "/data/query/getTempData",
method: "get",
params: params,
});
}
// 根据设备id和时间获取振动数据
export function getVibrData(params) {
return request({
url: "/data/query/getVibrData",
method: "get",
params: params,
});
}
// 根据设备id和时间获取振动数据
export function getWorkData(params) {
return request({
url: "/data/query/getWorkData",
method: "get",
params: params,
});
}

View File

@ -33,6 +33,7 @@ export const DICT_TYPE = {
ALARM_TYPE: "equip_alarm_type",
CARD_TYPE: "card_type",
MSG_TYPE: "msg_type",
EQUIP_RUN_STATUS: "equip_run_status",
// ========== SYSTEM 模块 ==========
SYSTEM_USER_SEX: "system_user_sex",
SYSTEM_MENU_TYPE: "system_menu_type",

View File

@ -624,7 +624,6 @@ export default {
if (this.datetime == null) {
this.datetime = this.getDefaultTimeRange();
}
// this.stopRefresh();
let startTime = new Date(this.datetime[0]);
this.queryParams.startTime = startTime.toISOString();
let endTime = new Date(this.datetime[1]);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,226 @@
<template>
<div :class="getClass(equipList.length)">
<el-card
v-for="(item, index) in equipList"
:key="index"
class="box-card"
>
<div
slot="header"
class="title"
>
<div class="equ-info">
<span class="name">设备型号</span>
<span class="prop">{{ item.modelName }}</span>
</div>
<div class="equ-info">
<span class="name">设备编号</span>
<span class="prop">{{ item.equipNo }}</span>
</div>
</div>
<div class="content">
<div class="equ-content">
<span class="con-name">运行状态</span>
<span
class="con-prop"
:style="statusColor(item.runStatus)"
>
<template>
<dict-tag
:type="DICT_TYPE.EQUIP_RUN_STATUS"
:value="item.runStatus"
/>
</template></span>
</div>
<div class="equ-content">
<span class="con-name">健康状态</span>
<span
class="con-prop"
:style="statusColor(item.status)"
>
<template>
<dict-tag
:type="DICT_TYPE.EQUIP_STATUS"
:value="item.status"
/>
</template></span>
</div>
<div class="equ-content">
<span class="con-name">报警数量</span>
<span class="con-prop">{{ item.alarmNum }}</span>
</div>
</div>
<div
class="content"
style="margin-top:5%"
>
<div class="equ-content">
<span class="con-name">通电时间</span>
<span class="con-prop">{{ item.powerTime }}</span>
</div>
<div class="equ-content">
<span class="con-name">加工件数</span>
<span class="con-prop">{{ item.processNum }}</span>
</div>
<div class="equ-content">
<span class="con-name">加工时长</span>
<span class="con-prop">{{ item.workTime }}</span>
</div>
</div>
<el-card
v-if="item.status == 2"
style="margin-top:15px"
>
<div class="maintanance">
<span class="prograss-title">维修进度</span>
<el-steps
:active="item.maintananceStatus"
finish-status="success"
style="margin-top:10px"
align-center
>
<el-step title="未提交"></el-step>
<el-step title="审批中"></el-step>
<el-step title="已派单"></el-step>
<el-step title="维修中"></el-step>
<el-step title="已完成"></el-step>
</el-steps>
</div>
</el-card>
</el-card>
<!-- <el-card class="box-card">
<div
slot="header"
class="clearfix"
>
<span>卡片名称</span>
<el-button
style="float: right; padding: 3px 0"
type="text"
>操作按钮</el-button>
</div>
</el-card> -->
</div>
</template>
<script>
import * as EquipInfoApi from "@/api/system/equip/equipInfo";
export default {
name: "EquipInfo",
data() {
return {
equipList: [
{
modelName: "MK15043",
equipNo: 370577891,
runStatus: 1,
status: 0,
alarmNum: 1,
powerTime: "13:00:00",
processNum: 100,
workTime: "08:30:21",
maintananceStatus: 1,
},
{
modelName: "QB18043",
equipNo: 370755763,
runStatus: 0,
status: 2,
alarmNum: 5,
powerTime: "09:00:00",
processNum: 100,
workTime: "03:24:11",
maintananceStatus: 2,
},
],
};
},
created() {},
methods: {
/** 查询列表 */
async getList() {
try {
this.loading = true;
const res = await EquipInfoApi.getEquipInfoPage(this.queryParams);
this.list = res.data.list;
this.total = res.data.total;
} finally {
this.loading = false;
}
},
statusColor(status) {
switch (status) {
case 0:
return "color:green";
case 1:
return "color:yellow";
case 2:
return "color: red";
}
},
getClass(num) {
if (num === 1) {
return "single-card";
} else {
return "dashboard";
}
},
},
};
</script>
<style scoped>
@font-face {
font-family: "BIAOTI";
src: url(../../../../assets/biaoti.ttf);
}
.dashboard {
display: grid;
grid-template-columns: 49% 49%;
column-gap: 2%;
margin: 1% 1% 1% 1%;
}
.single-card {
display: grid;
margin: 1% 1% 1% 1%;
}
.title {
display: flex;
justify-content: space-around;
}
/* .equ-info {
} */
.name {
font-size: 18px;
font-weight: 700;
}
.prop {
font-size: 16px;
color: darkgray;
}
.content {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 2%;
padding: 10px;
}
.equ-content {
display: grid;
text-align: center;
}
.con-name {
font-family: "BIAOTI";
font-size: 20px;
/* font-weight: 700; */
}
.con-prop {
font-size: 16px;
font-weight: 600;
}
.maintanance {
text-align: center;
}
.prograss-title {
font-size: 20px;
font-weight: 700;
}
</style>