定版bug修改
This commit is contained in:
@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Deprecated
|
||||
public interface OnlineRateMapper extends BaseMapper<OnlineRate> {
|
||||
|
||||
List<OnlineRate> getOnlineRateByDevId(@Param("list") List<String> devIndexs, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTimem);
|
||||
|
||||
@@ -1,25 +1,34 @@
|
||||
package com.njcn.device.pq.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.date.*;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.njcn.device.pq.mapper.OnlineRateMapper;
|
||||
import com.njcn.device.pq.mapper.RStatIntegrityDMapper;
|
||||
import com.njcn.device.pq.mapper.RStatOnlinerateDMapper;
|
||||
import com.njcn.device.pq.pojo.param.OnlineRateParam;
|
||||
import com.njcn.device.pq.pojo.param.PulicTimeParam;
|
||||
import com.njcn.device.pq.pojo.param.PulicTimeStatisParam;
|
||||
import com.njcn.device.pq.pojo.po.RStatOnlinerateD;
|
||||
import com.njcn.device.pq.pojo.vo.*;
|
||||
import com.njcn.device.pq.service.CommunicateService;
|
||||
import com.njcn.device.pq.service.LineService;
|
||||
import com.njcn.device.pq.utils.PublicDateUtil;
|
||||
import com.njcn.web.enums.DateFlagEnum;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
|
||||
/**
|
||||
@@ -30,6 +39,8 @@ import java.util.*;
|
||||
@AllArgsConstructor
|
||||
public class CommunicateServiceImpl implements CommunicateService {
|
||||
|
||||
final float DEFAULT_ONLINE_RATE = 3.14159f;
|
||||
|
||||
private final LineService lineService;
|
||||
|
||||
private final RStatOnlinerateDMapper onlinerateDMapper;
|
||||
@@ -49,101 +60,79 @@ public class CommunicateServiceImpl implements CommunicateService {
|
||||
String devId = lineService.getLineIdByDevId(pulicTimeStatisParam.getId());
|
||||
List<Float> floatList = new ArrayList<>();
|
||||
List<Float> floats = new ArrayList<>();
|
||||
floatList.add( getCondition(pulicTimeStatisParam.getId(), pulicTimeStatisParam.getSearchBeginTime(), pulicTimeStatisParam.getSearchEndTime(), 0) );
|
||||
floats.add( getCondition(devId, pulicTimeStatisParam.getSearchBeginTime(), pulicTimeStatisParam.getSearchEndTime(), 1) );
|
||||
floatList.add(getCondition(pulicTimeStatisParam.getId(), pulicTimeStatisParam.getSearchBeginTime(), pulicTimeStatisParam.getSearchEndTime(), 0));
|
||||
floats.add(getCondition(devId, pulicTimeStatisParam.getSearchBeginTime(), pulicTimeStatisParam.getSearchEndTime(), 1));
|
||||
if (StringUtils.isNotBlank(pulicTimeStatisParam.getPeriodBeginTime()) && StringUtils.isNotBlank(pulicTimeStatisParam.getPeriodEndTime())) {
|
||||
floatList.add( getCondition(pulicTimeStatisParam.getId(), pulicTimeStatisParam.getPeriodBeginTime(), pulicTimeStatisParam.getPeriodEndTime(), 0) );
|
||||
floats.add( getCondition(devId, pulicTimeStatisParam.getPeriodBeginTime(), pulicTimeStatisParam.getPeriodEndTime(), 1) );
|
||||
floatList.add(getCondition(pulicTimeStatisParam.getId(), pulicTimeStatisParam.getPeriodBeginTime(), pulicTimeStatisParam.getPeriodEndTime(), 0));
|
||||
floats.add(getCondition(devId, pulicTimeStatisParam.getPeriodBeginTime(), pulicTimeStatisParam.getPeriodEndTime(), 1));
|
||||
}
|
||||
communicateStatisticsVO.setOnlineRateData(floats);
|
||||
communicateStatisticsVO.setIntegrityData(floatList);
|
||||
return communicateStatisticsVO;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public List<DeviceOnlineDataVO> getRunOnlineRateData(PulicTimeParam pulicTimeParam) {
|
||||
List<DeviceOnlineDataVO> deviceOnlineDataList = new ArrayList<>();
|
||||
//根据监测点id获取终端id
|
||||
String devId = lineService.getLineIdByDevId(pulicTimeParam.getId());
|
||||
DecimalFormat decimalFormat = new DecimalFormat(".00");
|
||||
Float floatList;
|
||||
if (pulicTimeParam.getTimeFlag() == 0) {
|
||||
// 获取两个时间的之间的月份
|
||||
List<String> intervalTime = this.getIntervalTime(pulicTimeParam.getSearchBeginTime(), pulicTimeParam.getSearchEndTime());
|
||||
|
||||
LambdaQueryWrapper<RStatOnlinerateD> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
lambdaQueryWrapper.eq(RStatOnlinerateD::getDevIndex, devId)
|
||||
.between(RStatOnlinerateD::getTimeId, pulicTimeParam.getSearchBeginTime(), pulicTimeParam.getSearchEndTime());
|
||||
List<RStatOnlinerateD> rStatOnlinerateDList = onlinerateDMapper.selectList(lambdaQueryWrapper);
|
||||
|
||||
|
||||
List<String> intervalTime = processDateRange(pulicTimeParam.getSearchBeginTime(), pulicTimeParam.getSearchEndTime(),pulicTimeParam.getTimeFlag());
|
||||
|
||||
if (isMonthlyTimeFlag(pulicTimeParam.getTimeFlag())) {
|
||||
// 按月处理
|
||||
Map<String, List<RStatOnlinerateD>> map = rStatOnlinerateDList.stream().collect(Collectors.groupingBy(it -> it.getTimeId().format(DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN))));
|
||||
for (String interTime : intervalTime) {
|
||||
DeviceOnlineDataVO inter = new DeviceOnlineDataVO();
|
||||
String startTime, endTime;
|
||||
inter.setMonth(interTime.substring(5));
|
||||
inter.setYear(interTime.substring(0, 4));
|
||||
inter.setDay("/");
|
||||
startTime = PublicDateUtil.getFisrtDayOfMonth(Integer.parseInt(interTime.substring(0, 4)), Integer.parseInt(interTime.substring(5)));
|
||||
endTime = PublicDateUtil.getLastDayOfMonth(Integer.parseInt(interTime.substring(0, 4)), Integer.parseInt(interTime.substring(5)));
|
||||
floatList = getCondition(devId, startTime, endTime, 1);
|
||||
if (floatList == 0) {
|
||||
inter.setOnlineRate(3.14159f);
|
||||
} else {
|
||||
inter.setOnlineRate(Float.parseFloat(decimalFormat.format(floatList)));
|
||||
DeviceOnlineDataVO deviceOnlineDataVO = new DeviceOnlineDataVO();
|
||||
deviceOnlineDataVO.setDateView(interTime);
|
||||
if (map.containsKey(interTime)) {
|
||||
double rate = map.get(interTime).stream().mapToDouble(it -> (double) it.getOnlineMin() / (it.getOnlineMin() + it.getOfflineMin())).average().orElse(3.14159);
|
||||
deviceOnlineDataVO.setOnlineRate(rate == DEFAULT_ONLINE_RATE ? DEFAULT_ONLINE_RATE : new BigDecimal(rate * 100).setScale(2, RoundingMode.HALF_UP).floatValue());
|
||||
}else {
|
||||
deviceOnlineDataVO.setOnlineRate(DEFAULT_ONLINE_RATE);
|
||||
}
|
||||
deviceOnlineDataList.add(inter);
|
||||
deviceOnlineDataList.add(deviceOnlineDataVO);
|
||||
}
|
||||
} else {
|
||||
List<String> intervalTime = this.getIntervalTime(pulicTimeParam.getSearchBeginTime(),pulicTimeParam.getSearchEndTime());
|
||||
for (int j = 0; j < intervalTime.size(); j++) {
|
||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
||||
Date dt ;
|
||||
Date dtDate;
|
||||
if(j==0){
|
||||
dt= simpleDateFormat.parse(pulicTimeParam.getSearchBeginTime());
|
||||
}else{
|
||||
String startTime = PublicDateUtil.getFisrtDayOfMonth(Integer.parseInt(intervalTime.get(j).substring(0, 4)), Integer.parseInt(intervalTime.get(j).substring(5)));
|
||||
dt= simpleDateFormat.parse(startTime);
|
||||
|
||||
}
|
||||
int beginDay = Integer.valueOf(String.format("%td", dt));
|
||||
if(j==intervalTime.size()-1){
|
||||
dtDate= simpleDateFormat.parse(pulicTimeParam.getSearchEndTime());
|
||||
}else{
|
||||
String startTime = PublicDateUtil.getLastDayOfMonth(Integer.parseInt(intervalTime.get(j).substring(0, 4)), Integer.parseInt(intervalTime.get(j).substring(5)));
|
||||
dtDate= simpleDateFormat.parse(startTime);
|
||||
}
|
||||
Integer year = Integer.valueOf(String.format("%tY", dt));
|
||||
Integer mon = Integer.valueOf(String.format("%tm", dt));
|
||||
|
||||
Integer day = Integer.valueOf(String.format("%td", dtDate));
|
||||
List<String> dayTime = this.getIntervalDateTime(year,beginDay, mon, day);
|
||||
for (String interTime : dayTime) {
|
||||
DeviceOnlineDataVO inter = new DeviceOnlineDataVO();
|
||||
String startTime, endTime;
|
||||
inter.setMonth(interTime.substring(5, 7));
|
||||
inter.setYear(interTime.substring(0, 4));
|
||||
inter.setDay(interTime.substring(8));
|
||||
startTime =simpleDateFormat.format(DateUtil.beginOfDay(DateUtil.parse(interTime)));
|
||||
endTime = simpleDateFormat.format(DateUtil.endOfDay(DateUtil.parse(interTime)));
|
||||
floatList = getCondition(devId, startTime, endTime, 1);
|
||||
if (floatList == 0) {
|
||||
inter.setOnlineRate(3.14159f);
|
||||
} else {
|
||||
inter.setOnlineRate(Float.parseFloat(decimalFormat.format(floatList)));
|
||||
}
|
||||
deviceOnlineDataList.add(inter);
|
||||
// 按日处理
|
||||
Map<String, List<RStatOnlinerateD>> map = rStatOnlinerateDList.stream().collect(Collectors.groupingBy(it -> it.getTimeId().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))));
|
||||
for (String interTime : intervalTime) {
|
||||
DeviceOnlineDataVO deviceOnlineDataVO = new DeviceOnlineDataVO();
|
||||
deviceOnlineDataVO.setDateView(interTime);
|
||||
if (map.containsKey(interTime)) {
|
||||
double rate = map.get(interTime).stream().mapToDouble(it -> (double) it.getOnlineMin() / (it.getOnlineMin() + it.getOfflineMin())).average().orElse(3.14159);
|
||||
deviceOnlineDataVO.setOnlineRate(rate == DEFAULT_ONLINE_RATE ? DEFAULT_ONLINE_RATE : new BigDecimal(rate * 100).setScale(2, RoundingMode.HALF_UP).floatValue());
|
||||
}else {
|
||||
deviceOnlineDataVO.setOnlineRate(DEFAULT_ONLINE_RATE);
|
||||
}
|
||||
deviceOnlineDataList.add(deviceOnlineDataVO);
|
||||
}
|
||||
|
||||
}
|
||||
return deviceOnlineDataList;
|
||||
}
|
||||
|
||||
// 判断是否为按月/季/年统计
|
||||
private boolean isMonthlyTimeFlag(int timeFlag) {
|
||||
return timeFlag == 1 || timeFlag == 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* influxDB相关操作
|
||||
* 查询监测点的数据完整性
|
||||
*/
|
||||
private Float getCondition(String lineList, String startTime, String endTime, Integer state) {
|
||||
final Float[] resultList = {0.0f};
|
||||
OnlineRateParam param=new OnlineRateParam();
|
||||
OnlineRateParam param = new OnlineRateParam();
|
||||
param.setIds(Arrays.asList(lineList));
|
||||
param.setStartTime( DateUtil.beginOfDay(DateUtil.parse(startTime)).toString());
|
||||
param.setEndTime( DateUtil.endOfDay(DateUtil.parse(endTime)).toString());
|
||||
param.setStartTime(DateUtil.beginOfDay(DateUtil.parse(startTime)).toString());
|
||||
param.setEndTime(DateUtil.endOfDay(DateUtil.parse(endTime)).toString());
|
||||
if (state == 1) {
|
||||
//在线率
|
||||
List<RStatOnlinerateVO> onlineRateByDevIds = onlinerateDMapper.getOnlineRateByDevIds(param);
|
||||
@@ -166,131 +155,34 @@ public class CommunicateServiceImpl implements CommunicateService {
|
||||
return resultList[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户选择的时间区间返回月份日期
|
||||
*/
|
||||
@SneakyThrows
|
||||
private List<String> getIntervalTime(String startTime, String endTime) {
|
||||
List<String> times = new ArrayList<>();
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
|
||||
Date start = sdf.parse(startTime);
|
||||
Date end = sdf.parse(endTime);
|
||||
// 同月
|
||||
if (start.getTime() == end.getTime()) {
|
||||
String time = startTime.substring(0, 7);
|
||||
times.add(time);
|
||||
} else if (start.getYear() == end.getYear()) {
|
||||
// 同年
|
||||
int startM = start.getMonth() + 1;
|
||||
int endM = end.getMonth() + 1;
|
||||
int temp = endM - startM;
|
||||
for (int i = 0; i <= temp; i++) {
|
||||
String time = start.getYear() + 1900 + "";
|
||||
int month = startM + i;
|
||||
if (month < 10) {
|
||||
time = time + "-0" + month;
|
||||
} else {
|
||||
time = time + "-" + month;
|
||||
}
|
||||
times.add(time);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static List<String> processDateRange(String startDateStr, String endDateStr, Integer timeType) {
|
||||
DateTime startDate = DateUtil.parse(startDateStr, DatePattern.NORM_DATE_PATTERN);
|
||||
DateTime endDate = DateUtil.parse(endDateStr, DatePattern.NORM_DATE_PATTERN);
|
||||
|
||||
List<String> result = new ArrayList<>();
|
||||
|
||||
// 计算月份差(基于每月1号计算)
|
||||
DateTime startMonth = DateUtil.beginOfMonth(startDate);
|
||||
DateTime endMonth = DateUtil.beginOfMonth(endDate);
|
||||
long monthsBetween = DateUtil.betweenMonth(startMonth, endMonth, false);
|
||||
|
||||
if (Objects.equals(timeType, DateFlagEnum.WEEK_FLAG.getCode()) ||Objects.equals(timeType, DateFlagEnum.CUSTOM_FLAG.getCode()) ||Objects.equals(timeType, DateFlagEnum.MONTH_FLAG.getCode())) {
|
||||
// 同一个月,返回每天日期
|
||||
DateRange dailyRange = new DateRange(startDate, endDate, DateField.DAY_OF_MONTH);
|
||||
dailyRange.forEach(date -> result.add(DateUtil.format(date, DatePattern.NORM_DATE_PATTERN)));
|
||||
} else {
|
||||
// 不同年!!!!这里忽略了年份之间跨年的情况
|
||||
int startY = start.getYear() + 1900;
|
||||
int startM = start.getMonth() + 1;
|
||||
int endY = end.getYear() + 1900;
|
||||
int endM = end.getMonth() + 1;
|
||||
int tempS = 12 - startM;
|
||||
// 连续的年份
|
||||
if (endY - startY == 1) {
|
||||
// 第一年的时间获取
|
||||
for (int i = 0; i <= tempS; i++) {
|
||||
int month = startM + i;
|
||||
String time = startY + "-";
|
||||
if (month < 10) {
|
||||
time = time + "0" + month;
|
||||
} else {
|
||||
time = time + month;
|
||||
}
|
||||
times.add(time);
|
||||
}
|
||||
// 第二年的时间获取
|
||||
|
||||
for (int i = 1; i <= endM; i++) {
|
||||
String time = endY + "-";
|
||||
if (i < 10) {
|
||||
time = time + "0" + i;
|
||||
} else {
|
||||
time = time + i;
|
||||
}
|
||||
times.add(time);
|
||||
}
|
||||
} else {
|
||||
// 不连续的年份
|
||||
// 第一年的时间获取
|
||||
for (int i = 0; i <= tempS; i++) {
|
||||
int month = startM + i;
|
||||
String time = startY + "-";
|
||||
if (month < 10) {
|
||||
time = time + "0" + month;
|
||||
} else {
|
||||
time = time + month;
|
||||
}
|
||||
times.add(time);
|
||||
}
|
||||
int tempY = endY - startY;
|
||||
// 中间年份的时间
|
||||
for (int i = 1; i < tempY; i++) {
|
||||
for (int j = 1; j <= 12; j++) {
|
||||
String time = startY + i + "-";
|
||||
if (j < 10) {
|
||||
time = time + "0" + j;
|
||||
} else {
|
||||
time = time + j;
|
||||
}
|
||||
times.add(time);
|
||||
}
|
||||
}
|
||||
// 最后一年的时间获取
|
||||
for (int i = 1; i <= endM; i++) {
|
||||
String time = endY + "-";
|
||||
if (i < 10) {
|
||||
time = time + "0" + i;
|
||||
} else {
|
||||
time = time + i;
|
||||
}
|
||||
times.add(time);
|
||||
}
|
||||
// 大于一个季度,返回每月第一天日期
|
||||
DateTime current = DateUtil.beginOfMonth(startDate);
|
||||
while (current.isBeforeOrEquals(endDate)) {
|
||||
result.add(DateUtil.format(current, DatePattern.NORM_MONTH_PATTERN));
|
||||
current = DateUtil.offsetMonth(current, 1);
|
||||
}
|
||||
|
||||
}
|
||||
return times;
|
||||
return result;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private List<String> getIntervalDateTime(Integer startTime, int beginDay,Integer endTime,Integer dd) {
|
||||
List<String> list = new ArrayList<>();
|
||||
Calendar calendar = Calendar.getInstance(Locale.CHINA);
|
||||
calendar.set(startTime, endTime - 1, 1);
|
||||
int year = calendar.get(Calendar.YEAR);//年份
|
||||
int month = calendar.get(Calendar.MONTH) + 1;//月份
|
||||
for (int i = beginDay; i <= dd; i++) {
|
||||
String date = null;
|
||||
if (month < 10 && i < 10) {
|
||||
date = year + "-0" + month + "-0" + i;
|
||||
}
|
||||
if (month < 10 && i >= 10) {
|
||||
date = year + "-0" + month + "-" + i;
|
||||
}
|
||||
if (month >= 10 && i < 10) {
|
||||
date = year + "-" + month + "-0" + i;
|
||||
}
|
||||
if (month >= 10 && i >= 10) {
|
||||
date = year + "-" + month + "-" + i;
|
||||
}
|
||||
|
||||
list.add(date);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user