算法:监测到暂态指标的用户信息

This commit is contained in:
2023-11-23 18:22:36 +08:00
parent 1e0e9c9daa
commit 73d37d99ba
17 changed files with 452 additions and 11 deletions

View File

@@ -398,7 +398,8 @@ public class MeasurementExecutor extends BaseExecutor {
}
/**
* 算法名: 3.4.1.9.1-----监测点基准水平评估_日、月、季、年统计(r_mp_benchmark_level_d、r_mp_benchmark_level_m、r_mp_benchmark_level_q、r_mp_benchmark_level_y)
* 算法名: 3.4.1.9.1-----监测点基准水平评估_日、月、季、年统计
* (r_mp_benchmark_level_d、r_mp_benchmark_level_m、r_mp_benchmark_level_q、r_mp_benchmark_level_y)
*
* @author xuyang
* @date 2023年11月21日 14:40

View File

@@ -2,9 +2,11 @@ package com.njcn.prepare.executor;
import com.njcn.device.biz.commApi.CommTerminalGeneralClient;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenDTO;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimBusGlobalDService;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimObjEventDService;
import com.njcn.user.api.DeptFeignClient;
import com.njcn.user.pojo.po.Dept;
import com.yomahub.liteflow.annotation.LiteflowComponent;
@@ -30,8 +32,7 @@ public class PmsDimExecutor extends BaseExecutor{
private final DeptFeignClient deptFeignClient;
private final CommTerminalGeneralClient commTerminalGeneralClient;
private final IRDimObjEventDService irDimObjEventDService;
private final IRDimBusGlobalDService irDimBusGlobalDService;
@@ -62,4 +63,31 @@ public class PmsDimExecutor extends BaseExecutor{
irDimBusGlobalDService.globalCalBusBarDay(bindCmp.getRequestData());
}
/********************************************算法负责人:xy***********************************************************/
@LiteflowMethod(value = LiteFlowMethodEnum.IS_ACCESS, nodeId = "rDimObjEvent", nodeType = NodeTypeEnum.COMMON)
public boolean rDimObjEventAccess(NodeComponent bindCmp) {
return isAccess(bindCmp);
}
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "rDimObjEvent", nodeType = NodeTypeEnum.COMMON)
public void rDimObjEventProcess(NodeComponent bindCmp) {
String tag = bindCmp.getTag();
CalculatedParam<DeptGetChildrenDTO> calculatedParam = bindCmp.getRequestData();
if (tag.equalsIgnoreCase("r_dim_obj_event_d")) {
//日表
irDimObjEventDService.eventUserRatio(calculatedParam);
} else if (tag.equalsIgnoreCase("r_dim_obj_event_m")) {
//数据补招不执行非日表算法
if (!calculatedParam.isRepair()) {
//月表
}
}else if (tag.equalsIgnoreCase("r_dim_obj_event_y")) {
//数据补招不执行非日表算法
if (!calculatedParam.isRepair()) {
//年表
}
}
}
/*********************************************结束******************************************************************/
}

View File

@@ -0,0 +1,17 @@
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.prepare.harmonic.pojo.po.RDimObjEventD;
/**
* <p>
* 监测到暂态指标的用户-日表 Mapper 接口
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
public interface RDimObjEventDMapper extends MppBaseMapper<RDimObjEventD> {
}

View File

@@ -0,0 +1,16 @@
package com.njcn.prepare.harmonic.mapper.mysql.dim;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventM;
/**
* <p>
* 监测到暂态指标的用户-月表 Mapper 接口
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
public interface RDimObjEventMMapper extends BaseMapper<RDimObjEventM> {
}

View File

@@ -0,0 +1,16 @@
package com.njcn.prepare.harmonic.mapper.mysql.dim;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventY;
/**
* <p>
* 监测到暂态指标的用户-年表 Mapper 接口
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
public interface RDimObjEventYMapper extends BaseMapper<RDimObjEventY> {
}

View File

@@ -0,0 +1,23 @@
package com.njcn.prepare.harmonic.service.mysql.dim;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenDTO;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventD;
import java.util.List;
/**
* <p>
* 监测到暂态指标的用户-日表 服务类
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
public interface IRDimObjEventDService extends IService<RDimObjEventD> {
void eventUserRatio(CalculatedParam<DeptGetChildrenDTO> calculatedParam);
}

View File

@@ -0,0 +1,16 @@
package com.njcn.prepare.harmonic.service.mysql.dim;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventM;
/**
* <p>
* 监测到暂态指标的用户-月表 服务类
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
public interface IRDimObjEventMService extends IService<RDimObjEventM> {
}

View File

@@ -0,0 +1,16 @@
package com.njcn.prepare.harmonic.service.mysql.dim;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventY;
/**
* <p>
* 监测到暂态指标的用户-年表 服务类
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
public interface IRDimObjEventYService extends IService<RDimObjEventY> {
}

View File

@@ -0,0 +1,127 @@
package com.njcn.prepare.harmonic.service.mysql.dim.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenDTO;
import com.njcn.device.pms.pojo.po.Monitor;
import com.njcn.harmonic.pojo.po.RMpEventDetailDPO;
import com.njcn.harmonic.pojo.po.RMpTargetWarnDPO;
import com.njcn.prepare.harmonic.mapper.mysql.area.PmsMonitorPOMapper;
import com.njcn.prepare.harmonic.mapper.mysql.area.RMpTargetWarnDMapper;
import com.njcn.prepare.harmonic.mapper.mysql.dim.RDimObjEventDMapper;
import com.njcn.prepare.harmonic.mapper.mysql.line.RMpEventDetailDMapper;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventD;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimObjEventDService;
import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.enums.DicDataEnum;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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;
/**
* <p>
* 监测到暂态指标的用户-日表 服务实现类
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
@Service
@RequiredArgsConstructor
public class RDimObjEventDServiceImpl extends MppServiceImpl<RDimObjEventDMapper, RDimObjEventD> implements IRDimObjEventDService {
private final RMpTargetWarnDMapper rMpTargetWarnDMapper;
private final PmsMonitorPOMapper pmsMonitorPOMapper;
private final DicDataFeignClient dicDataFeignClient;
private final RMpEventDetailDMapper rMpEventDetailDMapper;
@Override
@Transactional(rollbackFor = {Exception.class})
public void eventUserRatio(CalculatedParam<DeptGetChildrenDTO> calculatedParam) {
List<RDimObjEventD> result = new ArrayList<>();
List<DeptGetChildrenDTO> deptList = calculatedParam.getIdList();
//获取敏感用户、重要用户字典id
String sensitiveUserId = dicDataFeignClient.getDicDataByCode(DicDataEnum.SENSITIVE_USERS.getCode()).getData().getId();
String importantUserId = dicDataFeignClient.getDicDataByCode(DicDataEnum.IMPORTANT_USERS.getCode()).getData().getId();
deptList.forEach(item->{
RDimObjEventD rDimObjEventD = new RDimObjEventD();
rDimObjEventD.setOrgId(item.getDeptId());
rDimObjEventD.setStatisDate(LocalDate.parse(calculatedParam.getDataDate(), DatePattern.NORM_DATE_FORMATTER));
rDimObjEventD.setMonitorRate(3.1415926f);
rDimObjEventD.setLimitFreqRate(3.1415926f);
List<String> lineList = item.getLineIds();
if (CollectionUtil.isNotEmpty(lineList)){
//获取当前单位下的重要用户、敏感用户监测点信息
List<Monitor> monitorList = getUser(lineList,Arrays.asList(sensitiveUserId,importantUserId));
if(CollectionUtil.isNotEmpty(monitorList)){
List<String> userList = monitorList.stream().map(Monitor::getId).collect(Collectors.toList());
//获取当前单位下的有效接入重要、敏感用户监测点信息
List<RMpTargetWarnDPO> effectiveList = getEffective(userList,calculatedParam.getDataDate());
if (CollectionUtil.isNotEmpty(effectiveList)){
rDimObjEventD.setMonitorRate((float)monitorList.size()/effectiveList.size()*100);
//获取重要用户、敏感用户监测点发生的暂态次数之和
float times = getEventTimes(userList,calculatedParam.getDataDate());
if (!Objects.equals(3.1415926f,times)){
rDimObjEventD.setLimitFreqRate(times/effectiveList.size());
}
} else {
rDimObjEventD.setMonitorRate(-1.0f);
rDimObjEventD.setLimitFreqRate(-1.0f);
}
}
}
result.add(rDimObjEventD);
});
if (CollectionUtil.isNotEmpty(result)){
this.saveOrUpdateBatchByMultiId(result,100);
}
}
public List<Monitor> getUser(List<String> lineList, List<String> monitorTag) {
LambdaQueryWrapper<Monitor> monitorLambdaQueryWrapper = new LambdaQueryWrapper<>();
monitorLambdaQueryWrapper.select(Monitor::getId, Monitor::getMonitorTag)
.in(Monitor::getId, lineList)
.in(Monitor::getMonitorTag, monitorTag)
.eq(Monitor::getStatus, DataStateEnum.ENABLE.getCode());
return pmsMonitorPOMapper.selectList(monitorLambdaQueryWrapper);
}
public List<RMpTargetWarnDPO> getEffective(List<String> lineList, String time) {
LambdaQueryWrapper<RMpTargetWarnDPO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(RMpTargetWarnDPO::getMeasurementPointId)
.in(RMpTargetWarnDPO::getMeasurementPointId,lineList)
.eq(RMpTargetWarnDPO::getDataDate,time)
.eq(RMpTargetWarnDPO::getIsEffective, DataStateEnum.ENABLE.getCode());
return rMpTargetWarnDMapper.selectList(lambdaQueryWrapper);
}
public float getEventTimes(List<String> lineList, String time) {
float result = 3.1415926f;
int data = 0;
LambdaQueryWrapper<RMpEventDetailDPO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(RMpEventDetailDPO::getSwellTimes,RMpEventDetailDPO::getSagTimes,RMpEventDetailDPO::getInterruptTimes)
.in(RMpEventDetailDPO::getMeasurementPointId,lineList)
.eq(RMpEventDetailDPO::getDataDate,time);
List<RMpEventDetailDPO> eventDay = rMpEventDetailDMapper.selectList(lambdaQueryWrapper);
if (CollectionUtil.isNotEmpty(eventDay)){
for (RMpEventDetailDPO item : eventDay) {
int times = item.getSwellTimes() + item.getSagTimes() + item.getInterruptTimes();
data = data + times;
}
result = (float) data;
}
return result;
}
}

View File

@@ -0,0 +1,20 @@
package com.njcn.prepare.harmonic.service.mysql.dim.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.prepare.harmonic.mapper.mysql.dim.RDimObjEventMMapper;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventM;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimObjEventMService;
import org.springframework.stereotype.Service;
/**
* <p>
* 监测到暂态指标的用户-月表 服务实现类
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
@Service
public class RDimObjEventMServiceImpl extends ServiceImpl<RDimObjEventMMapper, RDimObjEventM> implements IRDimObjEventMService {
}

View File

@@ -0,0 +1,20 @@
package com.njcn.prepare.harmonic.service.mysql.dim.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.prepare.harmonic.mapper.mysql.dim.RDimObjEventYMapper;
import com.njcn.prepare.harmonic.pojo.po.RDimObjEventY;
import com.njcn.prepare.harmonic.service.mysql.dim.IRDimObjEventYService;
import org.springframework.stereotype.Service;
/**
* <p>
* 监测到暂态指标的用户-年表 服务实现类
* </p>
*
* @author xuyang
* @since 2023-11-23
*/
@Service
public class RDimObjEventYServiceImpl extends ServiceImpl<RDimObjEventYMapper, RDimObjEventY> implements IRDimObjEventYService {
}

View File

@@ -6,7 +6,6 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.harmonic.pojo.po.RMpBenchmarkLevelD;
import com.njcn.harmonic.pojo.po.RMpBenchmarkLevelM;
import com.njcn.harmonic.pojo.po.day.RStatDataPltDPO;
import com.njcn.harmonic.pojo.po.day.RStatDataVDPO;
import com.njcn.prepare.harmonic.mapper.mysql.day.RStatDataPltDMapper;