指标差值日统计算法提交

This commit is contained in:
2023-05-08 18:13:39 +08:00
parent b7fe1aad64
commit c2745b6536
7 changed files with 237 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -6,6 +6,9 @@ import com.njcn.device.pq.constant.Param;
import com.njcn.system.pojo.po.DictData;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class PublicUtil {
@@ -144,6 +147,14 @@ public class PublicUtil {
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: 根据电压字典获取电压等级
* @Param: [id, dictDataList]

View File

@@ -48,4 +48,17 @@ public class AlarmDetailController extends BaseController {
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);
}
}

View File

@@ -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);
}

View File

@@ -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>

View File

@@ -3,6 +3,7 @@ package com.njcn.prepare.harmonic.service.mysql.Impl.line;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
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.MonitorClient;
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.prepare.harmonic.mapper.mysql.area.RMpTargetWarnDMapper;
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.service.mysql.line.AlarmDetailService;
import com.njcn.prepare.harmonic.utils.PublicUtil;
import com.njcn.system.api.DicDataFeignClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
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.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 数据是否异常
@@ -32,7 +41,7 @@ import java.util.Objects;
@Service
@RequiredArgsConstructor
@Slf4j
public class AlarmDetailServiceImpl implements AlarmDetailService {
public class AlarmDetailServiceImpl extends MppServiceImpl<AlarmMapper, RMpTargetDiffDPO> implements AlarmDetailService {
private final DistributionMonitorClient distributionMonitorClient;
@@ -104,6 +113,55 @@ public class AlarmDetailServiceImpl implements AlarmDetailService {
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

View File

@@ -18,4 +18,6 @@ public interface AlarmDetailService {
* @return
*/
boolean alarmDetailAlarm(LineParam lineParam);
void targetDiff(LineParam lineParam);
}