济菏高速数据中心代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

331 lines
16 KiB

package com.zc.business.controller;
import com.alibaba.excel.util.DateUtils;
import com.github.pagehelper.util.StringUtil;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.zc.business.constant.RedisKeyConstants;
import com.zc.business.domain.*;
import com.zc.business.enums.UniversalEnum;
import com.zc.business.service.IDcRoadSectionService;
import com.zc.business.service.IOnlineLogService;
import com.zc.business.service.IOnlineSumService;
import com.zc.business.service.impl.DcDeviceServiceImpl;
import com.zc.business.utils.MathUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "设备在线监测")
@RestController
9 months ago
@RequestMapping("/system/status")
public class DcDeviceOnlineController extends BaseController {
@Autowired
private DcDeviceServiceImpl dcDeviceService;
@Resource
private RedisCache redisCache;
@Resource
private IDcRoadSectionService dcRoadSectionService;
@Resource
private IOnlineSumService onlineSumService;
@Resource
private IOnlineLogService onlineLogService;
private static final String ORDERRULE = "orderRule";//排序策略key
@ApiOperation("设备状态列表按时间和类型")
@GetMapping("/tablist")
public TableDataInfo getTabList(@RequestParam("type") String[] deviceTypes,
@RequestParam(required = false) String orderByField,
@RequestParam(required = false) String orderDirection,
@RequestParam(required = false) String searchValue) {
if(ObjectUtils.isEmpty(deviceTypes)) {
return getDataTable(new ArrayList<>());
}
if(StringUtil.isEmpty(orderByField) ||"time".equals(orderByField)) {
orderByField = "online_rate";
}
startPage();
List<OnlineSum> sums = onlineSumService.queryByDeviceTypesOfToday(deviceTypes, orderByField, orderDirection, searchValue);
Map<String,OnlineSum> onlineSumMap = redisCache.getCacheMap(RedisKeyConstants.DEVICE_ONLINE);
String date = LocalDate.now().toString();
for (OnlineSum sum : sums) {
String deviceId = sum.getDeviceId().toString();
String hKey = date+":"+deviceId;
OnlineSum online = onlineSumMap.get(hKey);
if(ObjectUtils.isEmpty(online)) {
continue;
}
sum.setLastOnlineTime(onlineSumMap.get(hKey).getLastOnlineTime());
sum.setDeviceStatus(onlineSumMap.get(hKey).getDeviceStatus());
}
return getDataTable(sums);
}
//按时间划分设备柱状图
@ApiOperation("设备状态柱状图按时间和类型")
@GetMapping("/list")
public AjaxResult getStatusList(
@RequestParam("startTime") String startTime,
@RequestParam("time") String endTime,
@RequestParam("type") String[] types,
@RequestParam(value = "direction",required = false) String direction) {
9 months ago
Map<String, Map<String, String>> maps = new HashMap<>();
LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
List<OnlineSum> onlineSums = onlineSumService.queryByDeviceTypeAndDate(types, start.toLocalDate(), end.toLocalDate(),direction);
Map<String,List<OnlineSum>> stringListMap = onlineSums.stream().collect(Collectors.groupingBy(OnlineSum::getDeviceType));
for (String type : types) {
9 months ago
Map<String, String> map = new HashMap<>();
List<OnlineSum> listOfType = stringListMap.getOrDefault(type, new ArrayList<>());
Map<LocalDate,List<OnlineSum>> localDateListMap = listOfType.stream().collect(Collectors.groupingBy(OnlineSum::getStatisticalDate));
for (LocalDate date = start.toLocalDate(); date.isBefore(end.toLocalDate().plusDays(1)); date=date.plusDays(1)) {
List<OnlineSum> dayList = localDateListMap.getOrDefault(date, new ArrayList<>());
9 months ago
map.put(date.toString(), MathUtil.doubleTwoDecimalStr(dayList.stream().mapToDouble(OnlineSum::getOnlineRate).average().orElse(0.0))+"%");
}
maps.put(type, new TreeMap<>(map));
}
return AjaxResult.success(maps);
}
/**
* 查询设备在线率
* @param deviceId
* @return
*/
@ApiOperation("根据设备Id查询折线图数据")
@GetMapping("/deviceStatusList/{deviceId}")
public AjaxResult getDeviceStatusList(@PathVariable Long deviceId) {
LocalDate startDate = LocalDate.now().minusDays(30);
LocalDate endDate = LocalDate.now();
List<OnlineSum> onlineSums = onlineSumService.queryByDateRangeOfDevice(deviceId, startDate, endDate);
if(onlineSums.isEmpty()) {
return AjaxResult.success(UniversalEnum.NO_DATA_AVAILABLE.getValue());
}
Map<String, Object> map = new HashMap<>();
for (OnlineSum onlineSum : onlineSums) {
map.put(onlineSum.getStatisticalDate().toString(), onlineSum.getOnlineRate());
}
return AjaxResult.success(new TreeMap<>(map));
}
/**
* 缓存类型卡片排序规则
* @param rule 排序规则
* @return AjaxResult
*/
@ApiOperation("缓存类型卡片排序规则")
@GetMapping("/rule")
public AjaxResult setRule(String rule) {
redisCache.setCacheObject(ORDERRULE, rule);
return AjaxResult.success();
}
/**
* 设备分类当日在线率
*/
@ApiOperation("设备分类当日在线率")
@GetMapping("/type")
public AjaxResult getTypeList() {
String LOST_RATE = "lostRate";//丢包率
String SUCESS_RATE = "sucessRate";//在线率
String FAIL_RATE = "failRate";//离线率
String SUM_USE_STATE = "sumUseState";//在用数
String SUM = "sum";//总数
String RULE = "rule";
String All_TYPE = "全部设备";
String SORT_RULE = "排序规则";
Map<String, Object> returnMap = new HashMap<>();
List<OnlineSum> onlineSums = onlineSumService.queryByDateOfDeviceType(LocalDate.now());
List<DcDevice> dcDeviceList = dcDeviceService.list();
List<DcDevice> useDeviceList = dcDeviceList.stream().filter(device ->device.getUseState()!=null && device.getUseState()==1).collect(Collectors.toList());
//分类总数
Map<String, Long> totalCounts = dcDeviceList.stream()
.collect(Collectors.groupingBy(DcDevice::getRealType, Collectors.counting()));
//分类在用数
Map<String,Long> useCounts = useDeviceList.stream()
.collect(Collectors.groupingBy(DcDevice::getRealType, Collectors.counting()));
Map<String,List<OnlineSum>> typeSumGroup = onlineSums.stream().collect(Collectors.groupingBy(OnlineSum::getDeviceType));
DeviceType.toMap().forEach((k,v) -> {
Map<String,Object> itemMap = new HashMap<>();
9 months ago
itemMap.put(SUM,totalCounts.getOrDefault(k,0L).toString());//总数
itemMap.put(SUM_USE_STATE,useCounts.getOrDefault(k,0L).toString());//在用数
List<OnlineSum> onlineSumsOfType = typeSumGroup.getOrDefault(k,new ArrayList<>());
9 months ago
itemMap.put(LOST_RATE, MathUtil.doubleTwoDecimalStr(onlineSumsOfType.stream().mapToDouble(OnlineSum::getLossRate).average().orElse(0.0))+"%");
itemMap.put(SUCESS_RATE,MathUtil.doubleTwoDecimalStr(onlineSumsOfType.stream().mapToDouble(OnlineSum::getOnlineRate).average().orElse(0.0))+"%");
itemMap.put(FAIL_RATE,MathUtil.doubleTwoDecimalStr(onlineSumsOfType.stream().mapToDouble(OnlineSum::getOfflineRate).average().orElse(0.0))+"%");
returnMap.put(v,itemMap);
});
Map<String, Object> allMap = new HashMap<>();
9 months ago
allMap.put(SUM,dcDeviceList.size()+"");//总数
allMap.put(SUM_USE_STATE,useDeviceList.size()+"");//在用数
allMap.put(LOST_RATE,MathUtil.doubleTwoDecimalStr(onlineSums.stream().mapToDouble(OnlineSum::getLossRate).average().orElse(0.0))+"%");
allMap.put(SUCESS_RATE,MathUtil.doubleTwoDecimalStr(onlineSums.stream().mapToDouble(OnlineSum::getOnlineRate).average().orElse(0.0))+"%");
allMap.put(FAIL_RATE,MathUtil.doubleTwoDecimalStr(onlineSums.stream().mapToDouble(OnlineSum::getOfflineRate).average().orElse(0.0))+"%");
returnMap.put(All_TYPE,allMap);
Map<String, Object> sortMap = new TreeMap<>();
String orderRule = redisCache.getCacheObject(ORDERRULE);
if (StringUtil.isNotEmpty(orderRule)) {
sortMap.put(RULE, orderRule);
} else {
sortMap.put(RULE, DeviceType.defaultSortRule());
}
returnMap.put(SORT_RULE, sortMap);
return AjaxResult.success(returnMap);
}
//按路段统计设备在线率
@ApiOperation("设备状态列表按路段")
@GetMapping("/section")
public AjaxResult getSectionList() {
String LOST_RATE = "lostRate";//丢包率
String SUCESS_RATE = "sucessRate";//在线率
String FAIL_RATE = "failRate";//离线率
String SUM_USE_STATE = "sumUseState";//在用数
String SUM = "sum";//总数
Map<String, Object> returnMap = new HashMap<>();
List<Map<String, Object>> deviceOfRoad = dcDeviceService.selectDeviceOfRoad();
List<DcRoadSection> dcRoadSections = dcRoadSectionService.selectDcRoadSectionList(new DcRoadSection());
List<OnlineSum> onlineSums = onlineSumService.queryByDateOfRoad(LocalDate.now());
Map<String,Long> totalRoadCounts = deviceOfRoad.stream()
.collect(Collectors.groupingBy(m -> m.get("roadId").toString(),Collectors.counting()));
Map<String,Long> useRoadCounts = deviceOfRoad.stream().filter(dr -> dr.get("useStata")!=null && dr.get("useStata").toString().equals("1"))
.collect(Collectors.groupingBy(m -> m.get("roadId").toString(),Collectors.counting()));
Map<Long,List<OnlineSum>> onLineSumMap = onlineSums.stream().filter(onlineSum -> onlineSum.getRoadId() != null).collect(Collectors.groupingBy(OnlineSum::getRoadId));
for(DcRoadSection dcRoadSection : dcRoadSections) {
Map<String,Object> itemMap = new HashMap<>();
9 months ago
itemMap.put(SUM,totalRoadCounts.getOrDefault(dcRoadSection.getId().toString(),0L).toString());//总数
itemMap.put(SUM_USE_STATE,useRoadCounts.getOrDefault(dcRoadSection.getId().toString(),0L).toString());//在用数
List<OnlineSum> onlineSumsByRoad = onLineSumMap.getOrDefault(dcRoadSection.getId(),new ArrayList<>());
9 months ago
itemMap.put(LOST_RATE, MathUtil.doubleTwoDecimalStr(onlineSumsByRoad.stream().mapToDouble(OnlineSum::getLossRate).average().orElse(0.0))+"%");
itemMap.put(SUCESS_RATE,MathUtil.doubleTwoDecimalStr(onlineSumsByRoad.stream().mapToDouble(OnlineSum::getOnlineRate).average().orElse(0.0))+"%");
itemMap.put(FAIL_RATE,MathUtil.doubleTwoDecimalStr(onlineSumsByRoad.stream().mapToDouble(OnlineSum::getOfflineRate).average().orElse(0.0))+"%");
returnMap.put(dcRoadSection.getSectionName(),itemMap);
}
return AjaxResult.success(returnMap);
}
@ApiOperation("查询设备网络日志")
@GetMapping("/networkLogTable")
public TableDataInfo networkLogTable(
@RequestParam("deviceId") Long deviceId,
@RequestParam("queryDate")String queryDate) {
LocalDateTime start = LocalDateTime.parse(queryDate + " 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime end = LocalDateTime.now();
startPage();
List<OnlineLog> onlineLogs = onlineLogService.queryByDateAndDevice(start,end,deviceId);
return getDataTable(onlineLogs);
}
@ApiOperation("查询设备网络日志")
@GetMapping("/networkLogEcharts")
public AjaxResult networkLogEcharts(
@RequestParam("deviceId") Long deviceId,
@RequestParam("queryDate")String queryDate) {
String LOST_RATE = "lostRate";//丢包率
String RTT_AVG = "rttAvg";//平均往返时延
String MONITOR_TIME = "time";//监控时间
LocalDateTime start = LocalDateTime.parse(queryDate + " 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime end = LocalDateTime.now();
List<OnlineLog> onlineLogs = onlineLogService.queryByDateAndDevice(start,end,deviceId);
Map<String,Object> returnMap = new HashMap<>();
List<String> xAxis = new ArrayList<>();
List<Double> lossRate = new ArrayList<>();
List<Double> rttAvg = new ArrayList<>();
onlineLogs.stream().sorted(Comparator.comparing(OnlineLog::getMonitorTime)).forEach(onlineLog -> {
xAxis.add(onlineLog.getMonitorTime().format(DateTimeFormatter.ofPattern("HH:mm")));
lossRate.add(onlineLog.getLossRate());
rttAvg.add(onlineLog.getRttAvg());
});
returnMap.put(LOST_RATE,lossRate);
returnMap.put(RTT_AVG,rttAvg);
returnMap.put(MONITOR_TIME,xAxis);
return AjaxResult.success(returnMap);
}
enum DeviceType {
GUN_CAMERA("1-1","高清网络枪型固定摄像机"),
SPHERICAL_CAMERA("1-2", "高清网络球形摄像机"),
SPHERICAL_CAMERA_BRIDGE("1-3", "桥下高清网络球形摄像机"),
PANORAMIC_CAMERA_360("1-4", "360°全景摄像机"),
PANORAMIC_CAMERA_180("1-5", "180°全景摄像机"),
GANTRY_VMS("2-1", "门架式可变信息标志"),
STATION_FRONT_VMS("2-2", "站前可变信息标志"),
AWNING_VMS("2-3", "雨棚可变信息标志"),
//站前悬臂式可变信息标志2-4
MET_DET("3", "气象检测器"),
//出口诱导灯4
VOICE_BROADCAST("5", "路段语音广播系统"),
GUARDRAIL_COLLISION("6", "护栏碰撞预警系统"),
MMW_RADAR("7", "毫米波雷达"),
CA_EARLY("8", "合流区预警系统"),
//智慧锥桶9
LASER_FATIGUE_AWAKENING("10", "激光疲劳唤醒"),
TRAFFIC_SURVEY_STATION("11", "一类交通量调查站"),
DRIVING_GUIDANCE("12", "智能行车诱导系统"),
DEVICE_BOX("13", "智能设备箱"),
//光纤在线监测14
SOLAR_PANEL("15", "太阳能板"),
REMOTE_COMPUTER("16", "远端机");
private final String value;
private final String description;
public String getValue() {
return value;
}
public String getDescription() {
return description;
}
DeviceType(String value, String description) {
this.value = value;
this.description = description;
}
/**
* map转换{value,description}
* @return 转换后的map
*/
static Map<String,String> toMap(){
Map<String, String> map = new HashMap<>();
for (DeviceType deviceType : DeviceType.values()) {
map.put(deviceType.getValue(), deviceType.getDescription());
}
return map;
}
/**
* 默认排序规则
* @return 排序规则
*/
static String defaultSortRule(){
StringBuilder stringBuilder = new StringBuilder();
String ALL_TYPE = "全部设备";
stringBuilder.append(ALL_TYPE);
for (DeviceType deviceType : DeviceType.values()) {
stringBuilder.append(",").append(deviceType.getDescription());
}
return stringBuilder.toString();
}
}
}