diff --git a/jeecg-module-abnormal-alarm/pom.xml b/jeecg-module-abnormal-alarm/pom.xml index ca43b195..00247819 100644 --- a/jeecg-module-abnormal-alarm/pom.xml +++ b/jeecg-module-abnormal-alarm/pom.xml @@ -11,12 +11,22 @@ jeecg-module-abnormal-alarm + + 5.8.19 + + org.jeecgframework.boot jeecg-boot-base-core + + \ No newline at end of file diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java index b56a8882..0754205c 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java @@ -4,6 +4,7 @@ import org.jeecg.common.api.QueryRequest; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.entity.AlarmLog; import org.jeecg.modules.service.IAlarmLogService; +import org.jeecg.modules.vo.AlarmVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -14,9 +15,22 @@ public class AlarmLogController { @Autowired private IAlarmLogService alarmLogService; + @GetMapping("viewAll") + public Result viewAll(@RequestBody AlarmVo alarmVo){ return alarmLogService.viewAll(alarmVo); } + @GetMapping("findPage") - public Result findPage(QueryRequest queryRequest, AlarmLog alarmLog){ - return alarmLogService.findPage(queryRequest, alarmLog); + public Result findPage(@RequestBody AlarmVo alarmVo){ + return alarmLogService.findPage(alarmVo); + } + + @GetMapping("typeAlarms") + public Result typeAlarms(@RequestBody AlarmVo alarmVo){ + return alarmLogService.typeAlarms(alarmVo); + } + + @GetMapping("ruleTop") + public Result ruleTop5(@RequestBody AlarmVo alarmVo){ + return alarmLogService.ruleTop5(alarmVo); } @GetMapping("findInfo") @@ -38,7 +52,4 @@ public class AlarmLogController { public Result deleteById(String id){ return alarmLogService.deleteById(id); } - - - } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/dto/TypeDto.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/dto/TypeDto.java new file mode 100644 index 00000000..0705453d --- /dev/null +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/dto/TypeDto.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.dto; + +import lombok.Data; + +@Data +public class TypeDto { + // 1.资源类型 Server|Database|Email + // 2.规则名 + private String name; + // 1.报警量 + // 2.规则使用量 + private Integer value; +} diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/entity/AlarmHistory.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/entity/AlarmHistory.java index 4158a87c..bc8ce841 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/entity/AlarmHistory.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/entity/AlarmHistory.java @@ -19,4 +19,5 @@ public class AlarmHistory { private String operator; + private String sourceType; } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmLogMapper.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmLogMapper.java index a1577f43..602bd02f 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmLogMapper.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmLogMapper.java @@ -1,7 +1,24 @@ package org.jeecg.modules.mapper; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.dto.TypeDto; +import org.jeecg.modules.entity.AlarmHistory; import org.jeecg.modules.entity.AlarmLog; +import org.jeecg.modules.vo.AlarmVo; + +import java.util.Date; +import java.util.List; +import java.util.Map; public interface AlarmLogMapper extends BaseMapper { + + List oneDay(Map params); + + List oneMoreDay(Map params); + List findPage(Map params); + + List typeAlarms(Map params); + + List ruleTop5(Map params); } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/AlarmLogMapper.xml b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/AlarmLogMapper.xml new file mode 100644 index 00000000..ceca8246 --- /dev/null +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/AlarmLogMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + \ No newline at end of file diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmLogService.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmLogService.java index 21c9ac89..02984b2f 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmLogService.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmLogService.java @@ -4,10 +4,17 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.common.api.QueryRequest; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.entity.AlarmLog; +import org.jeecg.modules.vo.AlarmVo; public interface IAlarmLogService extends IService { - Result findPage(QueryRequest queryRequest, AlarmLog alarmLog); + Result viewAll(AlarmVo alarmVo); + + Result findPage(AlarmVo alarmVo); + + Result typeAlarms(AlarmVo alarmVo); + + Result ruleTop5(AlarmVo alarmVo); Result findInfo(String id); diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmLogServiceImpl.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmLogServiceImpl.java index b74c9a83..cc2719ed 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmLogServiceImpl.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmLogServiceImpl.java @@ -1,32 +1,183 @@ package org.jeecg.modules.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.jeecg.common.api.QueryRequest; import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.dto.TypeDto; +import org.jeecg.modules.entity.AlarmHistory; import org.jeecg.modules.entity.AlarmLog; import org.jeecg.modules.mapper.AlarmLogMapper; import org.jeecg.modules.service.IAlarmLogService; +import org.jeecg.modules.vo.AlarmVo; import org.springframework.stereotype.Service; -import java.util.Objects; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; @Service("alarmLogService") public class AlarmLogServiceImpl extends ServiceImpl implements IAlarmLogService { + /** + * 总体统计柱状图 + * @param alarmVo + * @return + */ @Override - public Result findPage(QueryRequest queryRequest, AlarmLog alarmLog) { - Result result = new Result(); - Page page = new Page<>(queryRequest.getPageNo(), queryRequest.getPageSize()); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - Page alarmLogPage = this.baseMapper.selectPage(page, queryWrapper); - result.setSuccess(true); - result.setResult(alarmLogPage); - return result; + public Result viewAll(AlarmVo alarmVo) { + String startDate = alarmVo.getStartDate(); + String endDate = alarmVo.getEndDate(); + Map params = BeanUtil.beanToMap(alarmVo); + List allDate; + /* 选择日期为同一天 按照小时划分 0-23小时 */ + if (startDate.equals(endDate)){ + allDate = baseMapper.oneDay(params); + Map> groupTime = allDate.stream() + .sorted(Comparator.comparing(Date::getHours)) + .collect(Collectors.groupingBy(Date::getHours)); + Map statistic = new HashMap<>(); + for (int i = 0; i < 24; i++) { + if(groupTime.containsKey(i)){ + Integer count = groupTime.get(i).size(); + statistic.put(timeStr(i),count); + }else { + statistic.put(timeStr(i),0); + } + } + // 返回x轴和y轴数据 + Set xData = statistic.keySet(); + Collection YData = statistic.values(); + Map result = new HashMap<>(); + result.put("xData",xData); + result.put("yData",YData); + return Result.OK(result); + } + /* 选择日期不是同一天 按照天划分(可以跨月选择,但不包括跨年) */ + else { + allDate = baseMapper.oneMoreDay(params); + + Map statistic = new HashMap<>(); + // 通过mounth分组 + Map> groupMounth = allDate.stream() + .sorted(Comparator.comparing(Date::getMonth)) + .collect(Collectors.groupingBy(Date::getMonth)); + // 通过day分组 + for (Map.Entry> entry : groupMounth.entrySet()) { + Integer mounth = entry.getKey() + 1;// 当前月份 + List allDay = entry.getValue(); // 当前月份有报警的day + Map> groupDay = allDay.stream() + .sorted(Comparator.comparing(Date::getDate)) + .collect(Collectors.groupingBy(Date::getDate)); + for (Map.Entry> entryDay : groupDay.entrySet()) { + Integer day = entryDay.getKey(); // 当前是几号 + Integer count = entryDay.getValue().size(); + statistic.put(dateStr(mounth,day),count); + } + } + // 列举startDate和endDate之间所有日期(已考虑闰年情况) + LocalDate start = LocalDate.parse(startDate); + LocalDate end = LocalDate.parse(endDate); + List dateList = new ArrayList<>(); + LocalDate current = start; + while (!current.isAfter(end)) { + dateList.add(current); + current = current.plusDays(1); + } + List allDateStr = dateList.stream() + .map(item -> { + // 2023-06-15 格式截取为 06-15 + String dateStr = item + .format(DateTimeFormatter.ISO_LOCAL_DATE) + .substring(5); + return dateStr; + }) + .collect(Collectors.toList()); + // 将startDate和endDate中没有预警信息的day设置为0 + for (String dateStr : allDateStr) { + if (!allDateStr.contains(dateStr)){ + statistic.put(dateStr,0); + } + } + // 返回x轴和y轴数据 + Set xData = statistic.keySet(); + Collection YData = statistic.values(); + Map result = new HashMap<>(); + result.put("xData",xData); + result.put("yData",YData); + return Result.OK(result); + } + } + + /** + * 报警信息分页列表 + * @param alarmVo + * @return + */ + @Override + public Result findPage(AlarmVo alarmVo) { + Integer pageNo = alarmVo.getPageNo(); + Integer pageSize = alarmVo.getPageSize(); + Page page = new Page<>(pageNo,pageSize); + Integer pageStart = (pageNo - 1) * pageSize; + alarmVo.setPageStart(pageStart); + Map params = BeanUtil.beanToMap(alarmVo); + List alarmHistories = baseMapper.findPage(params); + // 当前页数据 + page.setRecords(alarmHistories); + // 数据总条数 + page.setTotal(this.count()); + return Result.OK(page); + } + + /** + * ALARM ANALYSIS -> Monitor Type Alarms + * @return + */ + @Override + public Result typeAlarms(AlarmVo alarmVo) { + /* 饼图数据 */ + // 警报类型-警报数 + Map params = BeanUtil.beanToMap(alarmVo); + List typeAlarms = baseMapper.typeAlarms(params); + // 警报总数 + Integer total = typeAlarms.stream().mapToInt(TypeDto::getValue).sum(); + Map result = new HashMap<>(); + result.put("pieData",typeAlarms); + result.put("pieTotal",total); + return Result.OK(result); + } + + /** + * ALARM ANALYSIS -> Alarms Rule Top5 + * @return + */ + @Override + public Result ruleTop5(AlarmVo alarmVo) { + /* 柱状图数据 */ + Map params = BeanUtil.beanToMap(alarmVo); + List ruleTop5 = baseMapper.ruleTop5(params); + // x轴数据 + List xData = ruleTop5.stream() + .map(TypeDto::getName) + .collect(Collectors.toList()); + // y轴数据 + List yData = ruleTop5.stream() + .map(TypeDto::getValue) + .collect(Collectors.toList()); + Map result = new HashMap<>(); + result.put("xData",xData); + result.put("yData",yData); + return Result.OK(result); } @Override @@ -88,4 +239,36 @@ public class AlarmLogServiceImpl extends ServiceImpl i return result; } + private String timeStr(Integer time){ + if (time < 10){ + return "0" + time + ":00"; + } + return time + ":00"; + } + + private String dateStr(Integer mounth,Integer day){ + StringBuilder sb = new StringBuilder(); + if (mounth < 10){ + sb.append("0").append(mounth).append("-"); + }else { + sb.append(mounth).append("-"); + } + if (day < 10){ + sb.append("0").append(day); + }else { + sb.append(day); + } + return sb.toString(); + } + + public static void main(String[] args) throws ParseException { + List allDate = new ArrayList<>(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date1 = sdf.parse("2013-04-29"); + Date date2 = sdf.parse("2013-04-29"); + Date date3 = sdf.parse("2013-05-01"); + Date date4 = sdf.parse("2013-05-02"); + allDate.addAll(Arrays.asList(date1,date2,date3,date4)); + } + } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/vo/AlarmVo.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/vo/AlarmVo.java new file mode 100644 index 00000000..c3e3a8ed --- /dev/null +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/vo/AlarmVo.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.vo; + +import lombok.Data; +import org.jeecg.common.api.QueryRequest; +import java.io.Serializable; + +@Data +public class AlarmVo extends QueryRequest implements Serializable { + private String name; + private String type; + private String startDate; + private String endDate; + private Integer pageStart; +}