添加算法

This commit is contained in:
huangzj
2023-11-23 19:57:53 +08:00
parent e1f308d3a4
commit 67b738e5b3
14 changed files with 244 additions and 23 deletions

View File

@@ -1,6 +1,7 @@
package com.njcn.harmonic.pojo.po.dim;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.time.LocalDate;
@@ -18,38 +19,37 @@ import lombok.Setter;
@Getter
@Setter
@TableName("r_dim_obj_target_d")
public class RDimObjTargetD extends BaseEntity {
public class RDimObjTargetD {
private static final long serialVersionUID = 1L;
@MppMultiId(value = "Org_Id")
private String orgId;
@MppMultiId(value = "Statis_Date")
private LocalDate statisDate;
/**
* 源荷对象类型
*/
@MppMultiId(value = "Object_Type")
private String objectType;
/**
* 稳态指标类型
*/
@MppMultiId(value = "Target_type")
private String targetType;
/**
* **源荷对象**指标超标占比(%
*/
private Float monitorRate;
private Double monitorRate;
/**
* **源荷对象**指标平均超标占比(%
*/
private Float limitRate;
private Double limitRate;
/**
* **源荷对象**指标平均超标天数(天)
*/
private Float limitAvgRate;
}

View File

@@ -1,6 +1,7 @@
package com.njcn.harmonic.pojo.po.dim;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.time.LocalDate;
@@ -22,18 +23,21 @@ public class RDimObjTargetM extends BaseEntity {
private static final long serialVersionUID = 1L;
@MppMultiId(value = "Org_Id")
private String orgId;
@MppMultiId(value = "Statis_Date")
private LocalDate statisDate;
/**
* 源荷对象类型
*/
@MppMultiId(value = "Object_Type")
private String objectType;
/**
* 稳态指标类型
*/
@MppMultiId(value = "Target_type")
private String targetType;
/**

View File

@@ -1,6 +1,7 @@
package com.njcn.harmonic.pojo.po.dim;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.time.LocalDate;
@@ -22,18 +23,21 @@ public class RDimObjTargetY extends BaseEntity {
private static final long serialVersionUID = 1L;
@MppMultiId(value = "Org_Id")
private String orgId;
@MppMultiId(value = "Statis_Date")
private LocalDate statisDate;
/**
* 源荷对象类型
*/
@MppMultiId(value = "Object_Type")
private String objectType;
/**
* 稳态指标类型
*/
@MppMultiId(value = "Target_type")
private String targetType;
/**

View File

@@ -57,6 +57,10 @@ public class OrgPointExecutor extends BaseExecutor{
private final RDimBusTargetMPOService rDimBusTargetMPOService;
private final RDimBusTargetYPOService rDimBusTargetYPOService;
private final IRDimObjTargetDService irDimObjTargetDService;
private final IRDimObjTargetMService irDimObjTargetMService;
private final IRDimObjTargetYService irDimObjTargetYService;
/**
@@ -500,5 +504,34 @@ public class OrgPointExecutor extends BaseExecutor{
}
}
/**
* 河北主网新增算法表r_dim_obj_target_d/m/y
*/
@LiteflowMethod(value = LiteFlowMethodEnum.IS_ACCESS, nodeId = "rDimObjTarget", nodeType = NodeTypeEnum.COMMON)
public boolean processRDimObjTargetAccess(NodeComponent bindCmp) {
return isAccess(bindCmp);
}
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "rDimObjTarget", nodeType = NodeTypeEnum.COMMON)
public void processRDimObjTargetProcess(NodeComponent bindCmp) {
String tag = bindCmp.getTag();
CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam = bindCmp.getRequestData();
if (tag.equalsIgnoreCase("r_dim_obj_target_d")) {
//日表
irDimObjTargetDService.handleDay(calculatedParam);
} else if (tag.equalsIgnoreCase("r_dim_obj_target_m")) {
//数据补招不执行非日表算法
if (!calculatedParam.isRepair()) {
//月表
irDimObjTargetMService.handleMonth(calculatedParam);
}
}else if (tag.equalsIgnoreCase("r_dim_obj_target_y")) {
//数据补招不执行非日表算法
if (!calculatedParam.isRepair()) {
//年表
irDimObjTargetYService.handleYear(calculatedParam);
}
}
}
}

View File

@@ -1,6 +1,7 @@
package com.njcn.prepare.harmonic.mapper.mysql.dim;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetD;
/**
@@ -11,6 +12,6 @@ import com.njcn.harmonic.pojo.po.dim.RDimObjTargetD;
* @author cdf
* @since 2023-11-22
*/
public interface RDimObjTargetDMapper extends BaseMapper<RDimObjTargetD> {
public interface RDimObjTargetDMapper extends MppBaseMapper<RDimObjTargetD> {
}

View File

@@ -1,6 +1,7 @@
package com.njcn.prepare.harmonic.mapper.mysql.dim;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetM;
/**
@@ -11,6 +12,6 @@ import com.njcn.harmonic.pojo.po.dim.RDimObjTargetM;
* @author cdf
* @since 2023-11-22
*/
public interface RDimObjTargetMMapper extends BaseMapper<RDimObjTargetM> {
public interface RDimObjTargetMMapper extends MppBaseMapper<RDimObjTargetM> {
}

View File

@@ -1,6 +1,7 @@
package com.njcn.prepare.harmonic.mapper.mysql.dim;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetY;
/**
@@ -11,6 +12,6 @@ import com.njcn.harmonic.pojo.po.dim.RDimObjTargetY;
* @author cdf
* @since 2023-11-22
*/
public interface RDimObjTargetYMapper extends BaseMapper<RDimObjTargetY> {
public interface RDimObjTargetYMapper extends MppBaseMapper<RDimObjTargetY> {
}

View File

@@ -1,7 +1,10 @@
package com.njcn.prepare.harmonic.service.mysql.dim;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetD;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
/**
* <p>
@@ -11,6 +14,7 @@ import com.njcn.harmonic.pojo.po.dim.RDimObjTargetD;
* @author cdf
* @since 2023-11-22
*/
public interface IRDimObjTargetDService extends IService<RDimObjTargetD> {
public interface IRDimObjTargetDService extends IMppService<RDimObjTargetD> {
void handleDay(CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam);
}

View File

@@ -1,7 +1,10 @@
package com.njcn.prepare.harmonic.service.mysql.dim;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetM;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
/**
* <p>
@@ -11,6 +14,7 @@ import com.njcn.harmonic.pojo.po.dim.RDimObjTargetM;
* @author cdf
* @since 2023-11-22
*/
public interface IRDimObjTargetMService extends IService<RDimObjTargetM> {
public interface IRDimObjTargetMService extends IMppService<RDimObjTargetM> {
void handleMonth(CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam);
}

View File

@@ -1,7 +1,10 @@
package com.njcn.prepare.harmonic.service.mysql.dim;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetY;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
/**
* <p>
@@ -11,6 +14,7 @@ import com.njcn.harmonic.pojo.po.dim.RDimObjTargetY;
* @author cdf
* @since 2023-11-22
*/
public interface IRDimObjTargetYService extends IService<RDimObjTargetY> {
public interface IRDimObjTargetYService extends IMppService<RDimObjTargetY> {
void handleYear(CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam);
}

View File

@@ -1,11 +1,32 @@
package com.njcn.prepare.harmonic.service.mysql.dim.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.device.biz.pojo.dto.LineDevGetDTO;
import com.njcn.device.pms.pojo.po.Monitor;
import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetD;
import com.njcn.prepare.harmonic.mapper.mysql.dim.RDimObjTargetDMapper;
import com.njcn.prepare.harmonic.mapper.mysql.line.PmsMonitorMapper;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.pojo.mysql.ROperatingMonitorDPO;
import com.njcn.prepare.harmonic.service.mysql.day.IRStatLimitRateDService;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimObjTargetDService;
import com.njcn.prepare.harmonic.service.mysql.line.ROperatingMonitorService;
import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicDataTypeEnum;
import com.njcn.system.pojo.po.DictData;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
@@ -16,6 +37,133 @@ import org.springframework.stereotype.Service;
* @since 2023-11-22
*/
@Service
public class RDimObjTargetDServiceImpl extends ServiceImpl<RDimObjTargetDMapper, RDimObjTargetD> implements IRDimObjTargetDService {
@RequiredArgsConstructor
public class RDimObjTargetDServiceImpl extends MppServiceImpl<RDimObjTargetDMapper, RDimObjTargetD> implements IRDimObjTargetDService {
private final DicDataFeignClient dicDataFeignClient;
private final ROperatingMonitorService rOperatingMonitorService;
private final IRStatLimitRateDService irStatLimitRateDService;
//咨询后直接用Mapper查询这个算法只用pms补考虑pq后续不知道要不要改
private final PmsMonitorMapper pmsMonitorMapper;
@Override
public void handleDay(CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam) {
List<RDimObjTargetD> rdiObjTargetDs = new ArrayList<>();
LocalDate localDate = LocalDateTimeUtil.parseDate(calculatedParam.getDataDate(), DatePattern.NORM_DATE_PATTERN);
String beginDay = LocalDateTimeUtil.format(LocalDateTimeUtil.beginOfDay(LocalDateTimeUtil.parse(calculatedParam.getDataDate(), DatePattern.NORM_DATE_PATTERN)),DatePattern.NORM_DATETIME_PATTERN);
String endDay = LocalDateTimeUtil.format(LocalDateTimeUtil.endOfDay(LocalDateTimeUtil.parse(calculatedParam.getDataDate(), DatePattern.NORM_DATE_PATTERN)),DatePattern.NORM_DATETIME_PATTERN);
List<DictData> indicatorTypeDate = dicDataFeignClient.getDicDataByTypeCode(
DicDataTypeEnum.STEADY_STATIS.getCode()).getData();
//过滤电压总谐波畸变率、2-50次谐波电流、三相不平衡、负序电流、闪变
List<DictData> finalIndicatorTypeDate = indicatorTypeDate.stream().filter(temp -> Objects.equals(temp.getCode(), DicDataEnum.VOLTAGE_DEV.getCode()) ||
Objects.equals(temp.getCode(), DicDataEnum.FLICKER.getCode()) ||
Objects.equals(temp.getCode(), DicDataEnum.PHASE_VOLTAGE.getCode()) ||
Objects.equals(temp.getCode(), DicDataEnum.THD_V.getCode())||
Objects.equals(temp.getCode(), DicDataEnum.HARMONIC_CURRENT.getCode())).collect(Collectors.toList());
List<DictData> monitoringLabels = dicDataFeignClient.getDicDataByTypeCode(
DicDataTypeEnum.MONITORING_LABELS.getCode()).getData();
//过滤监测对象包括牵引站、风电场、光伏电站、重要,敏感用户
List<String> monitoringLabelIds = monitoringLabels.stream().filter(temp -> Objects.equals(
temp.getCode(), DicDataEnum.POWER_STATION.getCode()) ||
Objects.equals(temp.getCode(), DicDataEnum.WIND_FARM.getCode()) ||
Objects.equals(temp.getCode(), DicDataEnum.SENSITIVE_USERS.getCode()) ||
Objects.equals(temp.getCode(), DicDataEnum.IMPORTANT_USERS.getCode())||
Objects.equals(temp.getCode(), DicDataEnum.TRACTION_STATION.getCode())).map(DictData::getId).collect(Collectors.toList());
for (DeptGetChildrenMoreDTO deptGetChildrenMoreDTO : calculatedParam.getIdList()) {
if (!CollectionUtils.isEmpty(deptGetChildrenMoreDTO.getLineBaseList())) {
List<LineDevGetDTO> lineBaseList = deptGetChildrenMoreDTO.getLineBaseList();
if (CollectionUtils.isEmpty(lineBaseList)) {
continue;
}
List<String> collect2 = lineBaseList.stream().map(LineDevGetDTO::getPointId).collect(Collectors.toList());
List<ROperatingMonitorDPO> list = rOperatingMonitorService.lambdaQuery().
in(ROperatingMonitorDPO::getMeasurementPointId, collect2).
eq(ROperatingMonitorDPO::getDataDate, localDate).
ge(ROperatingMonitorDPO::getDataIntegrityRate, 0.95).
eq(ROperatingMonitorDPO::getIsUnusual, 1).list();
List<Monitor> monitorList = new ArrayList<>();
if(CollectionUtils.isEmpty(list)){
continue;
}
List<String> collect = list.stream().map(ROperatingMonitorDPO::getMeasurementPointId).distinct().collect(Collectors.toList());
monitorList = pmsMonitorMapper.queryEffectiveBusbars(collect);
monitorList = monitorList.stream().filter(temp -> monitoringLabelIds.contains(temp.getMonitorTag())).collect(Collectors.toList());
Map<String, List<Monitor>> collect1 = monitorList.stream().
collect(Collectors.groupingBy(Monitor::getMonitorTag));
List<String> linids = monitorList.stream().map(Monitor::getId).collect(Collectors.toList());
List<RStatLimitRateDPO> rStatLimitRateDPOS = irStatLimitRateDService.findList(linids, beginDay, endDay);
if(CollectionUtils.isEmpty(rStatLimitRateDPOS)){
continue;
}
collect1.forEach((tag, monitors)->{
finalIndicatorTypeDate.stream().forEach(temp->{
RDimObjTargetD rDimObjTargetD = new RDimObjTargetD();
rDimObjTargetD.setOrgId(deptGetChildrenMoreDTO.getUnitId());
rDimObjTargetD.setStatisDate(localDate);
rDimObjTargetD.setTargetType(temp.getId());
rDimObjTargetD.setObjectType(tag);
//有效接入监测点
int effectivePoint = monitors.size();
//对应指标的超表监测点
int overLimitsPoint = overLimitsPointCount(temp,rStatLimitRateDPOS);
double v = Double.valueOf(overLimitsPoint) / effectivePoint;
rDimObjTargetD.setMonitorRate(Math.round(v * 100.0) / 100.0);
rDimObjTargetD.setLimitRate(Math.round(v * 100.0) / 100.0);
rdiObjTargetDs.add(rDimObjTargetD);
});
});
}
}
if (!CollectionUtils.isEmpty(rdiObjTargetDs)) {
this.saveOrUpdateBatchByMultiId(rdiObjTargetDs, 500);
}
}
private int overLimitsPointCount(DictData temp, List<RStatLimitRateDPO> rStatLimitRateDPOS) {
Integer overLimiCount =0;
if (Objects.equals(temp.getCode(), DicDataEnum.THD_V.getCode())) {
overLimiCount = Integer.valueOf(rStatLimitRateDPOS.stream().filter(po->po.getUaberranceOvertime()>0).count()+"");
} else if ( Objects.equals(temp.getCode(), DicDataEnum.HARMONIC_CURRENT.getCode())) {
overLimiCount = Integer.valueOf(rStatLimitRateDPOS.stream().filter(po->
po.getIharm2Overtime()>0||
po.getIharm3Overtime() >0||
po.getIharm4Overtime() >0||
po.getIharm5Overtime() >0||
po.getIharm6Overtime() >0||
po.getIharm7Overtime() >0||
po.getIharm8Overtime() >0||
po.getIharm9Overtime() >0||
po.getIharm10Overtime() >0||
po.getIharm11Overtime() >0||
po.getIharm12Overtime() >0||
po.getIharm13Overtime() >0||
po.getIharm14Overtime() >0||
po.getIharm15Overtime() >0||
po.getIharm16Overtime() >0||
po.getIharm17Overtime() >0||
po.getIharm18Overtime() >0||
po.getIharm19Overtime() >0||
po.getIharm20Overtime() >0||
po.getIharm21Overtime() >0||
po.getIharm22Overtime() >0||
po.getIharm23Overtime() >0||
po.getIharm24Overtime() >0||
po.getIharm25Overtime()>0).count()+"");
} else if ( Objects.equals(temp.getCode(), DicDataEnum.PHASE_VOLTAGE.getCode())) {
overLimiCount = Integer.valueOf(rStatLimitRateDPOS.stream().filter(po->po.getUaberranceOvertime()>0).count()+"");
} else if ( Objects.equals(temp.getCode(), DicDataEnum.FLICKER.getCode())) {
overLimiCount = Integer.valueOf(rStatLimitRateDPOS.stream().filter(po->po.getFlickerOvertime()>0).count()+"");
} else if (Objects.equals(temp.getCode(), DicDataEnum.NEG_CURRENT.getCode())){
overLimiCount = Integer.valueOf(rStatLimitRateDPOS.stream().filter(po->po.getINegOvertime()>0).count()+"");
}
return overLimiCount;
}
}

View File

@@ -2,8 +2,11 @@ package com.njcn.prepare.harmonic.service.mysql.dim.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetM;
import com.njcn.prepare.harmonic.mapper.mysql.dim.RDimObjTargetMMapper;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimObjTargetMService;
import org.springframework.stereotype.Service;
@@ -16,6 +19,10 @@ import org.springframework.stereotype.Service;
* @since 2023-11-22
*/
@Service
public class RDimObjTargetMServiceImpl extends ServiceImpl<RDimObjTargetMMapper, RDimObjTargetM> implements IRDimObjTargetMService {
public class RDimObjTargetMServiceImpl extends MppServiceImpl<RDimObjTargetMMapper, RDimObjTargetM> implements IRDimObjTargetMService {
@Override
public void handleMonth(CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam) {
}
}

View File

@@ -2,8 +2,11 @@ package com.njcn.prepare.harmonic.service.mysql.dim.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.harmonic.pojo.po.dim.RDimObjTargetY;
import com.njcn.prepare.harmonic.mapper.mysql.dim.RDimObjTargetYMapper;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimObjTargetYService;
import org.springframework.stereotype.Service;
@@ -16,6 +19,10 @@ import org.springframework.stereotype.Service;
* @since 2023-11-22
*/
@Service
public class RDimObjTargetYServiceImpl extends ServiceImpl<RDimObjTargetYMapper, RDimObjTargetY> implements IRDimObjTargetYService {
public class RDimObjTargetYServiceImpl extends MppServiceImpl<RDimObjTargetYMapper, RDimObjTargetY> implements IRDimObjTargetYService {
@Override
public void handleYear(CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam) {
}
}

View File

@@ -219,8 +219,11 @@ public enum DicDataEnum {
ELECTRIFIED_RAILWAYS("电气化铁路", "Electrified_Railways"),
SMELT_LOAD("冶炼负荷", "Smelt_Load"),
DISTRIBUTED_PHOTOVOLTAICS("分布式光伏", "Distributed_Photovoltaics"),
SENSITIVE_USERS("敏感用户","Sensitive_Users"),
IMPORTANT_USERS("重要用户","Important_Users"),
WIND_FARM("风电场", "Wind_Farm"),
SENSITIVE_USERS("敏感用户", "Sensitive_Users"),
IMPORTANT_USERS("重要用户", "Important_Users"),
TRACTION_STATION("牵引站", "Traction_Station"),
/**
* 电压等级