指标差值日统计算法提交
This commit is contained in:
@@ -0,0 +1,50 @@
|
|||||||
|
package com.njcn.prepare.harmonic.pojo.mysql.po.line;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类的介绍:
|
||||||
|
*
|
||||||
|
* @author xuyang
|
||||||
|
* @version 1.0.0
|
||||||
|
* @createTime 2023/5/8 9:53
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName(value = "r_mp_target_diff_d")
|
||||||
|
public class RMpTargetDiffDPO implements Serializable {
|
||||||
|
|
||||||
|
@MppMultiId(value = "time")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||||
|
private Date time;
|
||||||
|
|
||||||
|
@MppMultiId(value = "line_id")
|
||||||
|
private String lineId;
|
||||||
|
|
||||||
|
@TableField(value = "vl_dev")
|
||||||
|
private Double vlDev;
|
||||||
|
|
||||||
|
@TableField(value = "freq_dev")
|
||||||
|
private Double freqDev;
|
||||||
|
|
||||||
|
@TableField(value = "v_unbalance")
|
||||||
|
private Double vUnbalance;
|
||||||
|
|
||||||
|
@TableField(value = "v_harmonic")
|
||||||
|
private Double vHarmonic;
|
||||||
|
|
||||||
|
@TableField(value = "plt")
|
||||||
|
private Double plt;
|
||||||
|
|
||||||
|
@TableField(value = "sag_times")
|
||||||
|
private Integer sagTimes;
|
||||||
|
|
||||||
|
@TableField(value = "interrupt_times")
|
||||||
|
private Integer interruptTimes;
|
||||||
|
}
|
||||||
@@ -6,6 +6,9 @@ import com.njcn.device.pq.constant.Param;
|
|||||||
import com.njcn.system.pojo.po.DictData;
|
import com.njcn.system.pojo.po.DictData;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class PublicUtil {
|
public class PublicUtil {
|
||||||
@@ -144,6 +147,14 @@ public class PublicUtil {
|
|||||||
return sp.format(d);
|
return sp.format(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据指定的时间获取昨日时间
|
||||||
|
*/
|
||||||
|
public static String getYesterday(String time) {
|
||||||
|
LocalDate localDate = LocalDate.parse(time).minusDays(1);
|
||||||
|
return localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description: 根据电压字典获取电压等级
|
* @Description: 根据电压字典获取电压等级
|
||||||
* @Param: [id, dictDataList]
|
* @Param: [id, dictDataList]
|
||||||
|
|||||||
@@ -48,4 +48,17 @@ public class AlarmDetailController extends BaseController {
|
|||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xuyang
|
||||||
|
*/
|
||||||
|
@OperateInfo(info = LogEnum.BUSINESS_COMMON,operateType = OperateType.ADD)
|
||||||
|
@PostMapping("/targetDiff")
|
||||||
|
@ApiOperation("监测点稳态指标差值日统计")
|
||||||
|
@ApiImplicitParam(name = "lineParam", value = "算法通用查询参数", required = true)
|
||||||
|
public HttpResult<Boolean> targetDiff(@RequestBody @Validated LineParam lineParam) {
|
||||||
|
String methodDescribe = getMethodDescribe("targetDiff");
|
||||||
|
alarmDetailService.targetDiff(lineParam);
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.njcn.prepare.harmonic.mapper.mysql.line;
|
||||||
|
|
||||||
|
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
|
||||||
|
import com.njcn.prepare.harmonic.pojo.mysql.po.line.RMpTargetDiffDPO;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xuyang
|
||||||
|
* @date 2023/05/08
|
||||||
|
*/
|
||||||
|
public interface AlarmMapper extends MppBaseMapper<RMpTargetDiffDPO> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取监测点每日指标数据
|
||||||
|
* @param time 时间
|
||||||
|
* @return 集合
|
||||||
|
*/
|
||||||
|
List<RMpTargetDiffDPO> getDayData(@Param("time") String time);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
<?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="com.njcn.prepare.harmonic.mapper.mysql.line.AlarmMapper">
|
||||||
|
|
||||||
|
<select id="getDayData" resultType="com.njcn.prepare.harmonic.pojo.mysql.po.line.RMpTargetDiffDPO">
|
||||||
|
select
|
||||||
|
A.time,
|
||||||
|
A.lineId,
|
||||||
|
coalesce(A.vUnbalance, 0) vUnbalance,
|
||||||
|
coalesce(A.v, 0) vHarmonic,
|
||||||
|
coalesce(B.vlDev, 0) vlDev,
|
||||||
|
coalesce(B.freqDev, 0) freqDev,
|
||||||
|
coalesce(C.plt, 0) plt,
|
||||||
|
coalesce(D.sagTimes, 0) sagTimes,
|
||||||
|
coalesce(D.interruptTimes, 0) interruptTimes
|
||||||
|
from
|
||||||
|
(
|
||||||
|
select
|
||||||
|
`time`,
|
||||||
|
line_id lineId,
|
||||||
|
max(abs(v_unbalance)) vUnbalance,
|
||||||
|
max(greatest(abs(v_thd), v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15, v_16, v_17, v_18, v_19, v_20, v_21, v_22, v_23, v_24, v_25, v_26, v_27, v_28, v_29, v_30, v_31, v_32, v_33, v_34, v_35, v_36, v_37, v_38, v_39, v_40, v_41, v_42, v_43, v_44, v_45, v_46, v_47, v_48, v_49, v_50)) v
|
||||||
|
from
|
||||||
|
r_stat_data_v_d t0
|
||||||
|
where
|
||||||
|
`time` = #{time}
|
||||||
|
and value_type = 'CP95'
|
||||||
|
group by
|
||||||
|
`time`,
|
||||||
|
line_id
|
||||||
|
) A
|
||||||
|
left join
|
||||||
|
(
|
||||||
|
select
|
||||||
|
`time`,
|
||||||
|
line_id lineId,
|
||||||
|
max(abs(vl_dev)) vlDev,
|
||||||
|
max(abs(freq_dev)) freqDev
|
||||||
|
from
|
||||||
|
r_stat_data_v_d t0
|
||||||
|
where
|
||||||
|
`time` = #{time}
|
||||||
|
and value_type = 'MAX'
|
||||||
|
group by
|
||||||
|
`time`,
|
||||||
|
line_id
|
||||||
|
) B
|
||||||
|
on A.time = B.time and A.lineId = B.lineId
|
||||||
|
left join
|
||||||
|
(
|
||||||
|
select
|
||||||
|
`time` ,
|
||||||
|
line_id lineId,
|
||||||
|
max(plt) plt
|
||||||
|
from
|
||||||
|
r_stat_data_plt_d
|
||||||
|
where
|
||||||
|
`time` = #{time}
|
||||||
|
and value_type = 'MAX'
|
||||||
|
group by
|
||||||
|
`time`,
|
||||||
|
line_id
|
||||||
|
) C
|
||||||
|
on A.time = C.time and A.lineId = C.lineId
|
||||||
|
left join
|
||||||
|
(
|
||||||
|
select
|
||||||
|
measurement_point_id lineId,
|
||||||
|
data_date dataDate,
|
||||||
|
sag_times sagTimes,
|
||||||
|
interrupt_times interruptTimes
|
||||||
|
from
|
||||||
|
r_mp_event_detail_d
|
||||||
|
where
|
||||||
|
data_date = #{time}
|
||||||
|
) D
|
||||||
|
on A.time = D.dataDate and A.lineId = D.lineId
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@@ -3,6 +3,7 @@ package com.njcn.prepare.harmonic.service.mysql.Impl.line;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
|
||||||
import com.njcn.device.pms.api.DistributionMonitorClient;
|
import com.njcn.device.pms.api.DistributionMonitorClient;
|
||||||
import com.njcn.device.pms.api.MonitorClient;
|
import com.njcn.device.pms.api.MonitorClient;
|
||||||
import com.njcn.device.pms.pojo.po.DistributionMonitor;
|
import com.njcn.device.pms.pojo.po.DistributionMonitor;
|
||||||
@@ -10,17 +11,25 @@ import com.njcn.device.pms.pojo.po.Monitor;
|
|||||||
import com.njcn.harmonic.pojo.po.RMpTargetWarnDPO;
|
import com.njcn.harmonic.pojo.po.RMpTargetWarnDPO;
|
||||||
import com.njcn.prepare.harmonic.mapper.mysql.area.RMpTargetWarnDMapper;
|
import com.njcn.prepare.harmonic.mapper.mysql.area.RMpTargetWarnDMapper;
|
||||||
import com.njcn.prepare.harmonic.mapper.mysql.line.*;
|
import com.njcn.prepare.harmonic.mapper.mysql.line.*;
|
||||||
|
import com.njcn.prepare.harmonic.pojo.mysql.po.line.RMpTargetDiffDPO;
|
||||||
import com.njcn.prepare.harmonic.pojo.param.LineParam;
|
import com.njcn.prepare.harmonic.pojo.param.LineParam;
|
||||||
import com.njcn.prepare.harmonic.service.mysql.line.AlarmDetailService;
|
import com.njcn.prepare.harmonic.service.mysql.line.AlarmDetailService;
|
||||||
|
import com.njcn.prepare.harmonic.utils.PublicUtil;
|
||||||
import com.njcn.system.api.DicDataFeignClient;
|
import com.njcn.system.api.DicDataFeignClient;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据是否异常
|
* 数据是否异常
|
||||||
@@ -32,7 +41,7 @@ import java.util.Objects;
|
|||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AlarmDetailServiceImpl implements AlarmDetailService {
|
public class AlarmDetailServiceImpl extends MppServiceImpl<AlarmMapper, RMpTargetDiffDPO> implements AlarmDetailService {
|
||||||
|
|
||||||
private final DistributionMonitorClient distributionMonitorClient;
|
private final DistributionMonitorClient distributionMonitorClient;
|
||||||
|
|
||||||
@@ -104,6 +113,55 @@ public class AlarmDetailServiceImpl implements AlarmDetailService {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = {Exception.class})
|
||||||
|
@Async("asyncExecutor")
|
||||||
|
public void targetDiff(LineParam lineParam) {
|
||||||
|
String startTime,endTime;
|
||||||
|
//月处理
|
||||||
|
if (lineParam.getType() == 3){
|
||||||
|
int year = Integer.parseInt(lineParam.getDataDate().split("-")[0]);
|
||||||
|
int month = Integer.parseInt(lineParam.getDataDate().split("-")[1]);
|
||||||
|
List<String> dayList = PublicUtil.getDayByMonth(year,month);
|
||||||
|
for (String item : dayList) {
|
||||||
|
log.info(item+"-->开始执行");
|
||||||
|
startTime = item + " 00:00:00";
|
||||||
|
endTime = PublicUtil.getYesterday(item) + " 00:00:00";
|
||||||
|
diffData(startTime,endTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//日处理
|
||||||
|
else {
|
||||||
|
startTime = lineParam.getDataDate() + " 00:00:00";
|
||||||
|
endTime = PublicUtil.getYesterday(lineParam.getDataDate()) + " 00:00:00";
|
||||||
|
diffData(startTime,endTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成指标差值日统计
|
||||||
|
*/
|
||||||
|
public void diffData(String startTime, String endTime) {
|
||||||
|
List<RMpTargetDiffDPO> localData = this.baseMapper.getDayData(startTime);
|
||||||
|
List<RMpTargetDiffDPO> yesterdayData = this.baseMapper.getDayData(endTime);
|
||||||
|
if (!CollectionUtils.isEmpty(localData) && !CollectionUtils.isEmpty(yesterdayData)){
|
||||||
|
//取两个集合的交集,做算法处理取绝对值
|
||||||
|
List<RMpTargetDiffDPO> intersectionList = localData.stream().map(map->yesterdayData.stream().filter(m->Objects.equals(m.getLineId(),map.getLineId())).findFirst().map(m->{
|
||||||
|
map.setVlDev(Math.abs(map.getVlDev()-m.getVlDev()));
|
||||||
|
map.setFreqDev(Math.abs(map.getFreqDev()-m.getFreqDev()));
|
||||||
|
map.setVUnbalance(Math.abs(map.getVUnbalance()-m.getVUnbalance()));
|
||||||
|
map.setVHarmonic(Math.abs(map.getVHarmonic()-m.getVHarmonic()));
|
||||||
|
map.setPlt(Math.abs(map.getPlt()-m.getPlt()));
|
||||||
|
map.setSagTimes(Math.abs(map.getSagTimes()-m.getSagTimes()));
|
||||||
|
map.setInterruptTimes(Math.abs(map.getInterruptTimes()-m.getInterruptTimes()));
|
||||||
|
return map;
|
||||||
|
}).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
|
||||||
|
if (!CollectionUtils.isEmpty(intersectionList)){
|
||||||
|
this.saveOrUpdateBatchByMultiId(intersectionList,50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理数据(电压偏差告警日统计)
|
* 处理数据(电压偏差告警日统计)
|
||||||
* @author qijian
|
* @author qijian
|
||||||
|
|||||||
@@ -18,4 +18,6 @@ public interface AlarmDetailService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
boolean alarmDetailAlarm(LineParam lineParam);
|
boolean alarmDetailAlarm(LineParam lineParam);
|
||||||
|
|
||||||
|
void targetDiff(LineParam lineParam);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user