Merge remote-tracking branch 'origin/station' into station

This commit is contained in:
panbaolin 2023-06-19 19:56:14 +08:00
commit 9d567d7d0d
11 changed files with 182 additions and 128 deletions

View File

@ -16,20 +16,20 @@ public class AlarmLogController {
@Autowired
private IAlarmLogService alarmLogService;
@ApiOperation("报警日志量总览-柱状图")
@GetMapping("viewAll")
@PostMapping("viewAll")
public Result viewAll(@RequestBody AlarmVo alarmVo){ return alarmLogService.viewAll(alarmVo); }
@ApiOperation("分页查询报警日志信息")
@GetMapping("findPage")
@PostMapping("findPage")
public Result findPage(@RequestBody AlarmVo alarmVo){
return alarmLogService.findPage(alarmVo);
}
@ApiOperation("各类型报警量统计-饼图")
@GetMapping("typeAlarms")
@PostMapping("typeAlarms")
public Result typeAlarms(@RequestBody AlarmVo alarmVo){
return alarmLogService.typeAlarms(alarmVo);
}
@ApiOperation("报警规则top5-柱状图")
@GetMapping("ruleTop")
@PostMapping("ruleTop")
public Result ruleTop5(@RequestBody AlarmVo alarmVo){
return alarmLogService.ruleTop5(alarmVo);
}

View File

@ -13,9 +13,7 @@ import java.util.Map;
public interface AlarmLogMapper extends BaseMapper<AlarmLog> {
List<Date> oneDay(Map<String,Object> params);
List<Date> oneMoreDay(Map<String,Object> params);
List<Date> rangeDay(Map<String,Object> params);
List<AlarmHistory> findPage(Map<String,Object> params);
List<TypeDto> typeAlarms(Map<String,Object> params);

View File

@ -1,6 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mapper.AlarmLogMapper">
<select id="rangeDay" parameterType="Map" resultType="Date">
SELECT
l.alarm_start_date
FROM
alarm_log l
INNER JOIN alarm_rule r ON l.rule_id = r.ID
<where>
<if test="type != null and type != ''">
r.source_type = #{type}
</if>
<if test="startDate != null and startDate != ''">
AND l.alarm_start_date &gt;= #{startDate}
</if>
<if test="endDate != null and endDate != ''">
AND l.alarm_start_date &lt;= #{endDate}
</if>
</where>
</select>
<select id="findPage" parameterType="Map" resultType="org.jeecg.modules.entity.AlarmHistory">
SELECT
*
@ -37,7 +55,9 @@
AND alarm_start_date &lt;= #{endDate}
</if>
</where>
LIMIT #{pageStart}, #{pageSize}
<if test="pageFlag == null">
LIMIT #{pageSize} OFFSET #{pageStart}
</if>
</select>
<select id="typeAlarms" parameterType="Map" resultType="org.jeecg.modules.dto.TypeDto">
SELECT
@ -88,37 +108,4 @@
</where>
ORDER BY l.ruleCount DESC
</select>
<select id="oneDay" parameterType="Map" resultType="Date">
SELECT
l.alarm_start_date
FROM
alarm_log l
INNER JOIN alarm_rule r ON l.rule_id = r.ID
<where>
<if test="type != null and type != ''">
r.source_type = #{type}
</if>
<if test="startDate != null and startDate != ''">
AND l.alarm_start_date = #{startDate}
</if>
</where>
</select>
<select id="oneMoreDay" parameterType="Map" resultType="Date">
SELECT
l.alarm_start_date
FROM
alarm_log l
INNER JOIN alarm_rule r ON l.rule_id = r.ID
<where>
<if test="type != null and type != ''">
r.source_type = #{type}
</if>
<if test="startDate != null and startDate != ''">
AND l.alarm_start_date &gt;= #{startDate}
</if>
<if test="endDate != null and endDate != ''">
AND l.alarm_start_date &lt;= #{endDate}
</if>
</where>
</select>
</mapper>

View File

@ -1,6 +1,7 @@
package org.jeecg.modules.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -37,11 +38,26 @@ public class AlarmLogServiceImpl extends ServiceImpl<AlarmLogMapper, AlarmLog> i
public Result viewAll(AlarmVo alarmVo) {
String startDate = alarmVo.getStartDate();
String endDate = alarmVo.getEndDate();
// 拼接日期为合理的日期+时间范围
alarmVo.setStartDate(startDate + " 00:00:00");
alarmVo.setEndDate(endDate + " 23:59:59");
// 定义返回结果
Set<String> xData = new HashSet<>();
Collection<Integer> YData = new ArrayList<>();
Map<String,Object> result = new HashMap<>();
// 转换参数 数据查询
Map<String, Object> params = BeanUtil.beanToMap(alarmVo);
List<Date> allDate;
/* 选择日期为同一天 按照小时划分 0-23小时 */
List<Date> allDate = baseMapper.rangeDay(params);
// 查询数据为空则直接返回空集合
if (CollUtil.isEmpty(allDate)){
result.put("xData",xData);
result.put("yData",YData);
return Result.OK(result);
}
// 分情况处理 1.按小时统计 2.按天统计
/* 1.选择日期为同一天 按照小时划分 0-23小时 */
if (startDate.equals(endDate)){
allDate = baseMapper.oneDay(params);
Map<Integer, List<Date>> groupTime = allDate.stream()
.sorted(Comparator.comparing(Date::getHours))
.collect(Collectors.groupingBy(Date::getHours));
@ -55,17 +71,14 @@ public class AlarmLogServiceImpl extends ServiceImpl<AlarmLogMapper, AlarmLog> i
}
}
// 返回x轴和y轴数据
Set<String> xData = statistic.keySet();
Collection<Integer> YData = statistic.values();
Map<String,Object> result = new HashMap<>();
xData = statistic.keySet();
YData = statistic.values();
result.put("xData",xData);
result.put("yData",YData);
return Result.OK(result);
}
/* 选择日期不是同一天 按照天划分(可以跨月选择,但不包括跨年) */
/* 2.选择日期不是同一天 按照天划分(可以跨月选择,但不包括跨年) */
else {
allDate = baseMapper.oneMoreDay(params);
Map<String,Integer> statistic = new HashMap<>();
// 通过mounth分组
Map<Integer, List<Date>> groupMounth = allDate.stream()
@ -102,16 +115,16 @@ public class AlarmLogServiceImpl extends ServiceImpl<AlarmLogMapper, AlarmLog> i
return dateStr;
})
.collect(Collectors.toList());
// 将startDate和endDate中没有预警信息的day设置为0
// startDate和endDate范围内无报警信息
// 的日期(哪一天),将其报警数量设置为0
for (String dateStr : allDateStr) {
if (!allDateStr.contains(dateStr)){
statistic.put(dateStr,0);
}
}
// 返回x轴和y轴数据
Set<String> xData = statistic.keySet();
Collection<Integer> YData = statistic.values();
Map<String,Object> result = new HashMap<>();
xData = statistic.keySet();
YData = statistic.values();
result.put("xData",xData);
result.put("yData",YData);
return Result.OK(result);
@ -134,8 +147,10 @@ public class AlarmLogServiceImpl extends ServiceImpl<AlarmLogMapper, AlarmLog> i
List<AlarmHistory> alarmHistories = baseMapper.findPage(params);
// 当前页数据
page.setRecords(alarmHistories);
// 数据总条数
page.setTotal(this.count());
// 获取数据总条数(经过查询条件过滤后的)
params.put("pageFlag","noPage");
Integer total = baseMapper.findPage(params).size();
page.setTotal(total);
return Result.OK(page);
}

View File

@ -11,4 +11,6 @@ public class AlarmVo extends QueryRequest implements Serializable {
private String startDate;
private String endDate;
private Integer pageStart;
// 标记根据条件查询但不进行分页
private String pageFlag;
}

View File

@ -23,9 +23,11 @@ import org.jeecg.modules.system.entity.GardsNuclearfacility;
import org.jeecg.modules.system.entity.GardsStations;
import org.jeecg.modules.mapper.StationOperationMapper;
import org.jeecg.modules.service.IStationOperationService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@ -206,83 +208,113 @@ public class StationOperationServiceImpl extends ServiceImpl<StationOperationMap
if (Objects.isNull(radius)) {
result.error500("请传入半径");
}
if (CollectionUtils.isNotEmpty(stationIds)){
//查询全部台站信息
HashMap<String, Object> stationInfoMap = (HashMap<String, Object>) redisUtil.get("stationInfoMap");
//查询全部核设施信息
HashMap<String, GardsNuclearfacility> nuclearFacilityMap = (HashMap<String, GardsNuclearfacility>) redisUtil.get("nuclearFacilityMap");
if (CollectionUtils.isNotEmpty(nuclearFacilityMap)){
//声明一个集合存储转换经纬度后的核设施数据
List<Point> nuclearPoints = new ArrayList<>();
for (Map.Entry<String,GardsNuclearfacility> nuclearFacilityInfo:nuclearFacilityMap.entrySet()) {
GardsNuclearfacility facilityInfoValue = nuclearFacilityInfo.getValue();
Point point = new Point();
point.setNuclearFacilityId(String.valueOf(facilityInfoValue.getFacilityId()));
point.setNuclearFacilityName(facilityInfoValue.getFacilityName());
if (StringUtils.isNotBlank(facilityInfoValue.getLongitude())){
String pointValue = PointUtil.calculate(facilityInfoValue.getLongitude());
facilityInfoValue.setLatitude(pointValue);
point.setLat(pointValue);
try {
if (CollectionUtils.isNotEmpty(stationIds)){
//查询全部台站信息
HashMap<String, Object> stationInfoMap = (HashMap<String, Object>) redisUtil.get("stationInfoMap");
//查询全部核设施信息
HashMap<String, GardsNuclearfacility> nuclearFacilityMap = (HashMap<String, GardsNuclearfacility>) redisUtil.get("nuclearFacilityMap");
if (CollectionUtils.isNotEmpty(nuclearFacilityMap)){
//声明一个集合存储转换经纬度后的核设施数据
List<Point> nuclearPoints = new ArrayList<>();
for (Map.Entry<String,GardsNuclearfacility> nuclearFacilityInfo:nuclearFacilityMap.entrySet()) {
GardsNuclearfacility facilityInfoValue = nuclearFacilityInfo.getValue();
Point point = new Point();
point.setNuclearFacilityId(String.valueOf(facilityInfoValue.getFacilityId()));
point.setNuclearFacilityName(facilityInfoValue.getFacilityName());
if (StringUtils.isNotBlank(facilityInfoValue.getLongitude())){
String pointValue = PointUtil.calculate(facilityInfoValue.getLongitude());
facilityInfoValue.setLatitude(pointValue);
point.setLat(pointValue);
}
if (StringUtils.isNotBlank(facilityInfoValue.getLatitude())){
String pointValue = PointUtil.calculate(facilityInfoValue.getLatitude());
facilityInfoValue.setLongitude(pointValue);
point.setLon(pointValue);
}
nuclearPoints.add(point);
}
if (StringUtils.isNotBlank(facilityInfoValue.getLatitude())){
String pointValue = PointUtil.calculate(facilityInfoValue.getLatitude());
facilityInfoValue.setLongitude(pointValue);
point.setLon(pointValue);
for (String stationId:stationIds) {
GardsStations point = (GardsStations)stationInfoMap.get(stationId);
stationsList.add(point);
//声明一个数组存储对应的核设施经纬度信息
List<Point> nuclearFacilityPoints = deepCopy(nuclearPoints);
//获取当前查询的台站名称
String stationName = point.getStationCode();
//获取当前查询的经度 圆心位置经度信息
Double longitudeD = point.getLon();
//获取当前查询的纬度 圆心位置纬度信息
Double latitudeD = point.getLat();
if (Objects.isNull(longitudeD)) {
result.error500("请传入经度");
}
if (Objects.isNull(latitudeD)) {
result.error500("请传入纬度");
}
if (!(longitudeD >= -180 && longitudeD <= 180)) {
result.error500("经度不合法");
}
if (!(latitudeD >= -85.05112878 && latitudeD <= 85.05112878)) {
result.error500("纬度不合法");
}
// 1.获取外接正方形
Rectangle rectangle = getRectangle(radius, longitudeD, latitudeD);
// 2.获取位置在正方形内的所有设备 判断核设施的经纬度是否为空 不为空 判断经纬度是否在正方形的最大最小范围内 如果在则过滤出来继续使用否则弃用
nuclearFacilityPoints = nuclearFacilityPoints.stream().filter(item-> StringUtils.isNotBlank(item.getLon()) && StringUtils.isNotBlank(item.getLat()) &&
(Double.valueOf(item.getLon())>=rectangle.getMinX() && Double.valueOf(item.getLon())<= rectangle.getMaxX())
&& (Double.valueOf(item.getLat())>=rectangle.getMinY() && Double.valueOf(item.getLat())<= rectangle.getMaxY())).collect(Collectors.toList());
//遍历在正方形范围内的数据 根据点的经纬度信息以及圆心的经纬度信息 计算出两者之间的距离 半径进行比较 <=半径则说明点在范围内否则点超出半径范围
nuclearFacilityPoints = nuclearFacilityPoints.stream()
.filter(equ -> getDistance(Double.valueOf(equ.getLon()), Double.valueOf(equ.getLat()), longitudeD, latitudeD) <= radius).collect(Collectors.toList());
//在范围内的点信息 计算点与圆心间的半径距离返回信息
for (Point p:nuclearFacilityPoints) {
stationsList.add(nuclearFacilityMap.get(p.getNuclearFacilityId()));
//计算点与圆心间的距离信息
double radiusR = getDistance(Double.valueOf(p.getLon()), Double.valueOf(p.getLat()), longitudeD, latitudeD);
p.setRadius(String.valueOf(radiusR));
p.setStationName(stationName);
}
if (CollectionUtils.isNotEmpty(nuclearFacilityPoints)){
resultList.add(nuclearFacilityPoints);
}
}
nuclearPoints.add(point);
map.put("GIS", stationsList.stream().distinct().collect(Collectors.toList()));
map.put("table", resultList);
}
for (String stationId:stationIds) {
GardsStations point = (GardsStations)stationInfoMap.get(stationId);
stationsList.add(point);
//声明一个数组存储对应的核设施经纬度信息
List<Point> nuclearFacilityPoints = new ArrayList<>();
nuclearFacilityPoints.addAll(nuclearPoints);
//获取当前查询的台站名称
String stationName = point.getStationCode();
//获取当前查询的经度 圆心位置经度信息
Double longitudeD = point.getLon();
//获取当前查询的纬度 圆心位置纬度信息
Double latitudeD = point.getLat();
if (Objects.isNull(longitudeD)) {
result.error500("请传入经度");
}
if (Objects.isNull(latitudeD)) {
result.error500("请传入纬度");
}
if (!(longitudeD >= -180 && longitudeD <= 180)) {
result.error500("经度不合法");
}
if (!(latitudeD >= -85.05112878 && latitudeD <= 85.05112878)) {
result.error500("纬度不合法");
}
// 1.获取外接正方形
Rectangle rectangle = getRectangle(radius, longitudeD, latitudeD);
// 2.获取位置在正方形内的所有设备 判断核设施的经纬度是否为空 不为空 判断经纬度是否在正方形的最大最小范围内 如果在则过滤出来继续使用否则弃用
nuclearFacilityPoints = nuclearFacilityPoints.stream().filter(item-> StringUtils.isNotBlank(item.getLon()) && StringUtils.isNotBlank(item.getLat()) &&
(Double.valueOf(item.getLon())>=rectangle.getMinX() && Double.valueOf(item.getLon())<= rectangle.getMaxX())
&& (Double.valueOf(item.getLat())>=rectangle.getMinY() && Double.valueOf(item.getLat())<= rectangle.getMaxY())).collect(Collectors.toList());
//遍历在正方形范围内的数据 根据点的经纬度信息以及圆心的经纬度信息 计算出两者之间的距离 半径进行比较 <=半径则说明点在范围内否则点超出半径范围
nuclearFacilityPoints = nuclearFacilityPoints.stream()
.filter(equ -> getDistance(Double.valueOf(equ.getLon()), Double.valueOf(equ.getLat()), longitudeD, latitudeD) <= radius).collect(Collectors.toList());
//在范围内的点信息 计算点与圆心间的半径距离返回信息
for (Point p:nuclearFacilityPoints) {
stationsList.add(nuclearFacilityMap.get(p.getNuclearFacilityId()));
//计算点与圆心间的距离信息
double radiusR = getDistance(Double.valueOf(p.getLon()), Double.valueOf(p.getLat()), longitudeD, latitudeD);
p.setRadius(String.valueOf(radiusR));
p.setStationName(stationName);
}
resultList.add(nuclearFacilityPoints);
}
map.put("GIS", stationsList.stream().distinct().collect(Collectors.toList()));
map.put("table", resultList);
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
result.setSuccess(true);
result.setResult(map);
return result;
}
/**
* 通过序列化的方式对list进行深复制
*
* @param src
* @param <T>
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
@Override
public Result getDataReceivingStatus(List<String> stationIds) {
Result result = new Result();

View File

@ -88,7 +88,8 @@ public class LoginController {
//update-begin--Author:scott Date:20190805 for暂时注释掉密码加密逻辑有点问题
//update-begin-author:taoyan date:20190828 for:校验验证码
String captcha = sysLoginModel.getCaptcha();
/* String captcha = sysLoginModel.getCaptcha();
if(captcha==null){
result.error500("验证码无效");
return result;
@ -107,7 +108,7 @@ public class LoginController {
// 改成特殊的code 便于前端判断
result.setCode(HttpStatus.PRECONDITION_FAILED.value());
return result;
}
}*/
//update-end-author:taoyan date:20190828 for:校验验证码
//1. 校验用户是否有效
@ -135,7 +136,7 @@ public class LoginController {
//用户登录信息
userInfo(sysUser, result);
//update-begin--Author:liusq Date:20210126 for登录成功删除redis中的验证码
redisUtil.del(realKey);
//redisUtil.del(realKey);
//update-begin--Author:liusq Date:20210126 for登录成功删除redis中的验证码
redisUtil.del(CommonConstant.LOGIN_FAIL + username);
LoginUser loginUser = new LoginUser();

View File

@ -12,8 +12,12 @@
<artifactId>jeecg-abnormal-alarm-start</artifactId>
<dependencies>
<!-- jeecg-system-cloud-api -->
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-system-cloud-api</artifactId>
</dependency>
<!-- jeecg-module-abnormal-alarm模块 -->
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-abnormal-alarm</artifactId>

View File

@ -12,6 +12,11 @@
<artifactId>jeecg-log-manage-start</artifactId>
<dependencies>
<!-- jeecg-system-cloud-api -->
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-system-cloud-api</artifactId>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-log-manage</artifactId>

View File

@ -12,6 +12,11 @@
<artifactId>jeecg-station-operation-start</artifactId>
<dependencies>
<!-- jeecg-system-cloud-api -->
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-system-cloud-api</artifactId>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-station-operation</artifactId>

View File

@ -12,6 +12,11 @@
<artifactId>jeecg-web-statistics-start</artifactId>
<dependencies>
<!-- jeecg-system-cloud-api -->
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-system-cloud-api</artifactId>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-web-statistics</artifactId>