Commit d73d80d6 authored by 赵啸非's avatar 赵啸非

添加告警统计信息

parent 64ea760a
......@@ -85,6 +85,7 @@ public class CustomerKeyExpirationListener implements MessageListener {
alarmInfoEntity.initAttrValue();
alarmInfoEntity.setAlarmDevice(deviceEntity.getId());
alarmInfoEntity.setSiteId(deviceEntity.getSiteId());
alarmInfoEntity.setAlarmTime(new Date());
alarmInfoEntity.setDeviceName(deviceEntity.getDeviceName());
alarmInfoEntity.setDeviceCode(deviceEntity.getDeviceCode());
alarmInfoEntity.setAlarmContent(String.format("设备告警:%s设备:%s已离线,请注意检查!", productEntity.getProductName(), deviceEntity.getDeviceName() + ":" + deviceEntity.getDeviceName()));
......
......@@ -4,12 +4,15 @@ import java.util.LinkedHashMap;
import java.util.Map;
/**
* 告警类型,(0.离线)枚举类
*
* @author zxfei
*/
* 告警类型,(0.离线)枚举类
*
* @author zxfei
*/
public enum AlarmTypeEnum {
离线(0, "离线");
离线(0, "离线"),
在线(1, "在线"),
缺纸(2, "缺纸"),
;
private Integer value;
private String desc;
......@@ -36,11 +39,11 @@ public enum AlarmTypeEnum {
}
/**
* 获取Map集合
*
* @param eItem 不包含项
* @return
*/
* 获取Map集合
*
* @param eItem 不包含项
* @return
*/
public static Map<String, String> getEnumMap(Integer... eItem) {
Map<String, String> resultMap = new LinkedHashMap<>();
for (AlarmTypeEnum item : AlarmTypeEnum.values()) {
......
......@@ -4,6 +4,7 @@ import com.mortals.xhx.module.device.model.vo.DeviceAlarmInfoVo;
import lombok.Data;
import java.util.Date;
/**
* 设备告警日志实体对象
*
......@@ -23,7 +24,7 @@ public class DeviceAlarmInfoEntity extends DeviceAlarmInfoVo {
*/
private Long alarmDevice;
/**
* 告警类型,(0.离线)
* 告警类型,(0.离线,1.在线,2.缺纸)
*/
private Integer alarmType;
/**
......@@ -58,23 +59,25 @@ public class DeviceAlarmInfoEntity extends DeviceAlarmInfoVo {
* 设备名称
*/
private String deviceName;
@Override
public int hashCode() {
return this.getId().hashCode();
return this.getAlarmDevice().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof DeviceAlarmInfoEntity) {
DeviceAlarmInfoEntity tmp = (DeviceAlarmInfoEntity) obj;
if (this.getId() == tmp.getId()) {
if (this.getAlarmDevice() == tmp.getAlarmDevice()) {
return true;
}
}
return false;
}
public void initAttrValue(){
public void initAttrValue() {
this.alarmTime = null;
......
......@@ -230,7 +230,7 @@ public class DeviceEntity extends DeviceVo {
this.homeUrl = "";
this.deviceFirmId = null;
this.deviceFirmId = 1L;
this.deviceFirmname = "";
......
package com.mortals.xhx.module.device.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.device.model.DeviceAlarmInfoEntity;
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 设备告警日志视图对象
*
* @author zxfei
* @date 2022-07-01
*/
* 设备告警日志视图对象
*
* @author zxfei
* @date 2022-07-01
*/
@Data
public class DeviceAlarmInfoVo extends BaseEntityLong {
/** 开始 告警时间 */
/**
* 开始 告警时间
*/
private String alarmTimeStart;
/** 结束 告警时间 */
/**
* 结束 告警时间
*/
private String alarmTimeEnd;
private Integer deviceTotalCount;
private Integer siteSize;
private Map<String, Long> siteDeviceCollect;
private Map<String, Long> siteDeviceAlarmCollect;
private Map<String, String> deviceConnTypeCollect;
private Map<String, String> deviceFirmCollect;
private int todayAlarmInfoCount;
private long todayAlarmDeviceCount;
private Map<String, String> alarmTypeCollect;
private Map<String, String> alarmLevelCollect;
private List<HashMap<String, Object>> deviceAlarmMapInfoList;
}
\ No newline at end of file
package com.mortals.xhx.module.device.service;
import com.mortals.framework.common.Rest;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.device.model.DeviceAlarmInfoEntity;
/**
* DeviceAlarmInfoService
*
* 设备告警日志 service接口
*
* @author zxfei
* @date 2022-06-27
*/
public interface DeviceAlarmInfoService extends ICRUDService<DeviceAlarmInfoEntity,Long>{
* DeviceAlarmInfoService
* <p>
* 设备告警日志 service接口
*
* @author zxfei
* @date 2022-06-27
*/
public interface DeviceAlarmInfoService extends ICRUDService<DeviceAlarmInfoEntity, Long> {
Rest<DeviceAlarmInfoEntity> alarmStats(DeviceAlarmInfoEntity deviceAlarmInfo, Context context);
}
\ No newline at end of file
package com.mortals.xhx.module.device.service.impl;
import org.springframework.stereotype.Service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.mortals.framework.common.Rest;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.common.code.AlarmLevelEnum;
import com.mortals.xhx.common.code.AlarmTypeEnum;
import com.mortals.xhx.common.code.DeviceSrcEnum;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.site.SitePdu;
import com.mortals.xhx.feign.site.ISiteFeign;
import com.mortals.xhx.module.device.dao.DeviceAlarmInfoDao;
import com.mortals.xhx.module.device.model.DeviceAlarmInfoEntity;
import com.mortals.xhx.module.device.model.DeviceAlarmInfoQuery;
import com.mortals.xhx.module.device.model.DeviceEntity;
import com.mortals.xhx.module.device.model.DeviceQuery;
import com.mortals.xhx.module.device.service.DeviceAlarmInfoService;
import com.mortals.xhx.module.device.service.DeviceService;
import com.mortals.xhx.module.firm.model.FirmEntity;
import com.mortals.xhx.module.firm.service.FirmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import static java.math.BigDecimal.ROUND_HALF_DOWN;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
/**
* DeviceAlarmInfoService
* 设备告警日志 service实现
*
* @author zxfei
* @date 2022-06-27
*/
* DeviceAlarmInfoService
* 设备告警日志 service实现
*
* @author zxfei
* @date 2022-06-27
*/
@Service("deviceAlarmInfoService")
public class DeviceAlarmInfoServiceImpl extends AbstractCRUDServiceImpl<DeviceAlarmInfoDao, DeviceAlarmInfoEntity, Long> implements DeviceAlarmInfoService {
@Autowired
private DeviceService deviceService;
@Autowired
private ISiteFeign siteFeign;
@Autowired
private FirmService firmService;
@Override
public Rest<DeviceAlarmInfoEntity> alarmStats(DeviceAlarmInfoEntity deviceAlarmInfo, Context context) {
try {
Rest<RespData<List<SitePdu>>> rest = siteFeign.list(new SitePdu());
Map<Long, SitePdu> siteMap = rest.getData().getData().stream().collect(Collectors.toMap(x -> x.getId(), y -> y, (o, n) -> n));
if (ObjectUtils.isEmpty(siteMap)) {
return Rest.fail("获取站点列表异常!");
}
Map<Long, FirmEntity> FirmMap = firmService.findToMap(new FirmEntity(), context);
Long siteId = deviceAlarmInfo.getSiteId();
DeviceAlarmInfoQuery deviceAlarmInfoQuery = new DeviceAlarmInfoQuery();
deviceAlarmInfoQuery.setAlarmTimeStart(DateUtil.today());
deviceAlarmInfoQuery.setAlarmTimeEnd(DateUtil.today());
List<OrderCol> orderCols = new ArrayList<>();
OrderCol orderCol = new OrderCol();
orderCol.setColName("alarmTime");
orderCol.setSortKind(OrderCol.DESCENDING);
orderCols.add(orderCol);
deviceAlarmInfoQuery.setOrderColList(orderCols);
List<DeviceAlarmInfoEntity> deviceAlarmInfoList = this.find(deviceAlarmInfoQuery);
//统计总设备数量
List<DeviceEntity> deviceList = deviceService.find(new DeviceQuery().siteId(siteId));
//设备总量
Integer deviceTotalCount = deviceList.size();
deviceAlarmInfo.setDeviceTotalCount(deviceTotalCount);
//监控站点数量
int siteSize = rest.getData().getData().size();
deviceAlarmInfo.setSiteSize(siteSize);
//分站点统计设备数量
Map<String, Long> siteDeviceCollect = deviceList.parallelStream().collect(groupingBy(x -> x.getSiteName(), counting()));
deviceAlarmInfo.setSiteDeviceCollect(siteDeviceCollect);
//分站点统计设备今日告警数量
Map<String, Long> siteDeviceAlarmCollect = deviceAlarmInfoList.parallelStream().distinct().collect(groupingBy(x -> x.getSiteId(), counting()))
.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(
x -> siteMap.get(x).getSiteName(),
Map.Entry::getValue,
(oldVal, newVal) -> oldVal));
deviceAlarmInfo.setSiteDeviceAlarmCollect(siteDeviceAlarmCollect);
//设备类型分布
Map<String, String> deviceConnTypeCollect = deviceList.parallelStream().collect(groupingBy(x -> DeviceSrcEnum.getByValue(x.getDeviceSrc()).getDesc(), Collectors.collectingAndThen(counting(), y ->
NumberUtil.div(y, deviceTotalCount).multiply(new BigDecimal(100)).setScale(2, ROUND_HALF_DOWN).toString()
)));
deviceAlarmInfo.setDeviceConnTypeCollect(deviceConnTypeCollect);
//设备厂商分布
Map<String, String> deviceFirmCollect = deviceList.parallelStream().collect(groupingBy(x -> FirmMap.get(x) == null ? "未知厂商" : FirmMap.get(x).getFirmName(), Collectors.collectingAndThen(counting(), y ->
NumberUtil.div(y, deviceTotalCount).multiply(new BigDecimal(100)).setScale(2, ROUND_HALF_DOWN).toString()
)));
deviceAlarmInfo.setDeviceFirmCollect(deviceFirmCollect);
//今日告警次数
int todayAlarmInfoCount = deviceAlarmInfoList.size();
deviceAlarmInfo.setTodayAlarmInfoCount(todayAlarmInfoCount);
//今日告警设备数量
long todayAlarmDeviceCount = deviceAlarmInfoList.parallelStream().distinct().count();
deviceAlarmInfo.setTodayAlarmDeviceCount(todayAlarmDeviceCount);
//告警类型分布
Map<String, String> alarmTypeCollect = deviceAlarmInfoList.parallelStream().collect(groupingBy(x -> AlarmTypeEnum.getByValue(x.getAlarmType()).getDesc(), Collectors.collectingAndThen(counting(), y ->
NumberUtil.div(String.valueOf(y), String.valueOf(todayAlarmInfoCount)).multiply(new BigDecimal(100)).setScale(2, ROUND_HALF_DOWN).toString()
)));
deviceAlarmInfo.setAlarmTypeCollect(alarmTypeCollect);
//告警等级分布
Map<String, String> alarmLevelCollect = deviceAlarmInfoList.parallelStream().collect(groupingBy(x -> AlarmLevelEnum.getByValue(x.getAlarmLevel()).getDesc(), Collectors.collectingAndThen(counting(), y ->
NumberUtil.div(String.valueOf(y), String.valueOf(todayAlarmInfoCount)).multiply(new BigDecimal(100)).setScale(2, ROUND_HALF_DOWN).toString()
)));
deviceAlarmInfo.setAlarmLevelCollect(alarmLevelCollect);
Map<Long, Long> deviceAlarmCountMap = deviceAlarmInfoList.parallelStream().collect(groupingBy(x -> x.getAlarmDevice(), counting()));
//最近的告警信息 选择前20条
List<HashMap<String, Object>> deviceAlarmMapInfoList = deviceAlarmInfoList.stream().limit(20).map(item -> {
HashMap<String, Object> map = new HashMap<>();
map.put("deviceName", item.getDeviceName());
map.put("count", deviceAlarmCountMap.getOrDefault(item.getAlarmDevice(), 1L));
map.put("alarmTime", item.getAlarmTime());
map.put("alarmType", AlarmTypeEnum.getByValue(item.getAlarmType()).getDesc());
return map;
}).collect(Collectors.toList());
deviceAlarmInfo.setDeviceAlarmMapInfoList(deviceAlarmMapInfoList);
return Rest.ok(deviceAlarmInfo);
} catch (Exception e) {
log.error("设备告警信息统计异常", e);
return Rest.fail(e.getMessage());
}
}
}
\ No newline at end of file
......@@ -2,27 +2,14 @@ package com.mortals.xhx.module.device.service.impl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.xhx.module.alarm.model.AlarmConfigEntity;
import com.mortals.xhx.module.alarm.model.AlarmConfigQuery;
import com.mortals.xhx.module.device.model.DeviceEntity;
import com.mortals.xhx.module.device.model.DeviceModuleQuery;
import com.mortals.xhx.module.device.service.DeviceService;
import com.mortals.xhx.module.platform.model.PlatformEntity;
import com.mortals.xhx.module.platform.service.PlatformService;
import com.mortals.xhx.module.product.model.ProductEntity;
import com.mortals.xhx.module.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.module.device.dao.DeviceModuleDao;
import com.mortals.xhx.module.device.model.DeviceModuleEntity;
import com.mortals.xhx.module.device.model.DeviceModuleQuery;
import com.mortals.xhx.module.device.service.DeviceModuleService;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.List;
/**
* DeviceModuleService
* 设备模块信息 service实现
......@@ -33,7 +20,6 @@ import java.util.List;
@Service("deviceModuleService")
public class DeviceModuleServiceImpl extends AbstractCRUDServiceImpl<DeviceModuleDao, DeviceModuleEntity, Long> implements DeviceModuleService {
@Override
protected void validData(DeviceModuleEntity entity, Context context) throws AppException {
if (entity.newEntity()) {
......
......@@ -75,8 +75,6 @@ public class DeviceServiceImpl extends AbstractCRUDCacheServiceImpl<DeviceDao, D
private ProductService productService;
@Autowired
private PlatformService platformService;
// @Autowired
private DefaultTbCoreConsumerService consumerService;
@Autowired
private ISiteFeign siteFeign;
@Autowired
......@@ -311,13 +309,13 @@ public class DeviceServiceImpl extends AbstractCRUDCacheServiceImpl<DeviceDao, D
Set<TopicPartitionInfo> set = new HashSet<>();
set.add(topicPartitionInfo);
if (status == YesNoEnum.YES.getValue()) {
/* if (status == YesNoEnum.YES.getValue()) {
//开启
consumerService.getMainConsumer().subscribe(set);
} else {
//关闭
consumerService.getMainConsumer().unsubscribe(set);
}
}*/
}
......
package com.mortals.xhx.module.device.web;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
......@@ -10,6 +11,8 @@ import com.mortals.xhx.module.device.model.DeviceQuery;
import com.mortals.xhx.module.device.service.DeviceAlarmInfoService;
import com.mortals.xhx.module.device.service.DeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -61,7 +64,24 @@ public class DeviceAlarmInfoController extends BaseCRUDJsonBodyMappingController
model.put("dangerCount", collect.getOrDefault(0, 0L));
model.put("subCount", collect.getOrDefault(1, 0L));
model.put("normalCount", collect.getOrDefault(2, 0L));
return super.doListAfter(query, model, context);
}
/**
* 设备告警信息统计
*/
@PostMapping(value = "stats")
public Rest<DeviceAlarmInfoEntity> alarmStats(@RequestBody DeviceAlarmInfoEntity deviceAlarmInfo) {
String busiDesc = this.getModuleDesc() + "设备告警统计";
try {
Rest<DeviceAlarmInfoEntity> rest = this.service.alarmStats(deviceAlarmInfo, getContext());
recordSysLog(request, busiDesc + " 【成功】");
return rest;
} catch (Exception e) {
log.error("设备告警信息统计", e);
return Rest.fail(super.convertException(e));
}
}
}
\ No newline at end of file
......@@ -346,8 +346,7 @@ public class DeviceController extends BaseCRUDJsonBodyMappingController<DeviceSe
*/
@PostMapping(value = "batchUpdateHall")
public Rest<Void> batchUpdateHall(@RequestBody DeviceEntity deviceEntity) {
log.info("批量设备重启", deviceEntity.getDeviceCode());
log.info("批量设备重启:{}", deviceEntity.getDeviceCode());
String busiDesc = this.getModuleDesc() + "批量更新所属大厅";
Rest<Void> rest = Rest.ok(busiDesc + " 【成功】");
try {
......
package com.mortals.xhx.module.sitestat.web;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.IAuthTokenService;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.common.code.PlatformTypeEnum;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.site.SitePdu;
import com.mortals.xhx.common.pdu.user.UserPdu;
import com.mortals.xhx.feign.site.ISiteFeign;
import com.mortals.xhx.feign.user.IUserFeign;
import com.mortals.xhx.module.device.service.DeviceService;
import com.mortals.xhx.module.site.model.SiteEntity;
import com.mortals.xhx.module.site.model.SiteQuery;
import com.mortals.xhx.module.site.service.SiteService;
......@@ -28,11 +22,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
......@@ -188,7 +180,6 @@ public class SitestatController extends BaseCRUDJsonBodyMappingController<Sitest
SiteEntity siteEntity = siteService.get(siteId, getContext());
if (!ObjectUtils.isEmpty(siteEntity)) {
jsonObject.put(KEY_RESULT_DATA, siteEntity);
jsonObject.put(KEY_RESULT_MSG, busiDesc + "成功!");
}
} else {
......
......@@ -8,7 +8,7 @@
"baseLogin": "http://192.168.0.98:11078/base"
},
"test": {
"baseUrl": "http://192.168.0.98:11091/m",
"baseUrl": "http://192.168.0.98:11078/m",
"baseLogin": "http://192.168.0.98:11078/base"
},
"portal": {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment