单位稳态指标数据统计日表 算法

This commit is contained in:
2023-07-20 13:42:37 +08:00
parent 9df7075f3c
commit 32aae811e8
5 changed files with 344 additions and 41 deletions

View File

@@ -0,0 +1,76 @@
package com.njcn.prepare.harmonic.controller.area;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.constant.ServerInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.device.biz.commApi.CommTerminalGeneralClient;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.prepare.harmonic.pojo.param.OrgParam;
import com.njcn.prepare.harmonic.service.mysql.area.IRStatHarmonicOrgDService;
import com.njcn.user.api.DeptFeignClient;
import com.njcn.user.pojo.po.Dept;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.List;
/**
* 类的介绍:
*
* @author xuyang
* @version 1.0.0
* @createTime 2023/7/19 14:09
*/
@Slf4j
@Api(tags = "单位稳态指标数据统计")
@RestController
@RequestMapping("AreaHarmonic")
@AllArgsConstructor
public class RStatHarmonicOrgController extends BaseController {
private final DeptFeignClient deptFeignClient;
private final CommTerminalGeneralClient commTerminalGeneralClient;
private final IRStatHarmonicOrgDService irStatHarmonicOrgDService;
@OperateInfo(info = LogEnum.BUSINESS_MEDIUM)
@ApiOperation("日统计")
@PostMapping("day")
@ApiImplicitParam(value = "orgParam",name = "orgParam",required = true)
@ApiModelProperty("r_stat_harmonic_org_d表数据需要先生成r_stat_org_d表")
public HttpResult<Boolean> dayHandle(@RequestBody OrgParam orgParam){
log.info(LocalDateTime.now()+"dayHandle开始执行");
String methodDescribe = getMethodDescribe("dayHandle");
/**
* 支持补录
*/
DeptGetLineParam deptGetLineParam = new DeptGetLineParam();
if(StringUtils.isEmpty(orgParam.getOrgId())){
Dept data = deptFeignClient.getRootDept().getData();
deptGetLineParam.setDeptId(data.getId());
}else {
deptGetLineParam.setDeptId(orgParam.getOrgId());
}
deptGetLineParam.setServerName(ServerInfo.PREPARE_BOOT);
List<DeptGetChildrenMoreDTO> data = commTerminalGeneralClient.deptGetLine(deptGetLineParam).getData();
irStatHarmonicOrgDService.dayHandle(data,orgParam.getDataDate());
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
}

View File

@@ -0,0 +1,13 @@
package com.njcn.prepare.harmonic.mapper.mysql.area;
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.njcn.harmonic.pojo.po.RStatHarmonicOrgD;
import org.apache.ibatis.annotations.Mapper;
/**
* @author xuyang
*/
@Mapper
public interface RStatHarmonicOrgDMapper extends MppBaseMapper<RStatHarmonicOrgD> {
}

View File

@@ -0,0 +1,191 @@
package com.njcn.prepare.harmonic.service.mysql.Impl.area;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.harmonic.pojo.po.RMpPartHarmonicDetailD;
import com.njcn.harmonic.pojo.po.RMpSurplusHarmonicDetailD;
import com.njcn.harmonic.pojo.po.RStatHarmonicOrgD;
import com.njcn.harmonic.pojo.po.RStatOrgDPO;
import com.njcn.prepare.harmonic.mapper.mysql.area.RStatHarmonicOrgDMapper;
import com.njcn.prepare.harmonic.mapper.mysql.area.RStatOrgDMapper;
import com.njcn.prepare.harmonic.mapper.mysql.line.RMpPartHarmonicDetailDMapper;
import com.njcn.prepare.harmonic.mapper.mysql.line.RMpSurplusHarmonicDetailDMapper;
import com.njcn.prepare.harmonic.service.mysql.area.IRStatHarmonicOrgDService;
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.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.DecimalFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* 类的介绍:
*
* @author xuyang
* @version 1.0.0
* @createTime 2023/7/20 9:31
*/
@Service
@AllArgsConstructor
public class RStatHarmonicOrgDServiceImpl extends MppServiceImpl<RStatHarmonicOrgDMapper, RStatHarmonicOrgD> implements IRStatHarmonicOrgDService {
private final DicDataFeignClient dicDataFeignClient;
private final RMpPartHarmonicDetailDMapper rMpPartHarmonicDetailDMapper;
private final RMpSurplusHarmonicDetailDMapper rMpSurplusHarmonicDetailDMapper;
private final RStatOrgDMapper rStatOrgDMapper;
@Override
public void dayHandle(List<DeptGetChildrenMoreDTO> data, String dataDate) {
List<RStatHarmonicOrgD> orgDList = new ArrayList<>();
Date date = DateUtil.parse(dataDate);
QueryWrapper<RMpPartHarmonicDetailD> queryWrapper = new QueryWrapper<>();
QueryWrapper<RMpSurplusHarmonicDetailD> rMpSurplusHarmonicDetailDQueryWrapper = new QueryWrapper<>();
QueryWrapper<RStatOrgDPO> rStatOrgDPOQueryWrapper = new QueryWrapper<>();
DecimalFormat df = new DecimalFormat("0.00");
/*获取稳态统计指标*/
List<DictData> steadyStatis = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.STEADY_STATIS.getCode()).getData();
/*获取数据类型*/
List<DictData> dataTypeList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DATA_TYPE.getCode()).getData();
Map<String, DictData> dataTypeMap = dataTypeList.stream().collect(Collectors.toMap(DictData::getCode, dictData -> dictData));
data.forEach(deptGetChildrenMoreDTO -> {
/*主网*/
if(!CollectionUtils.isEmpty(deptGetChildrenMoreDTO.getLineBaseList())){
List<LineDevGetDTO> lineBaseList = deptGetChildrenMoreDTO.getLineBaseList();
Map<Integer, List<LineDevGetDTO>> collect = lineBaseList.stream().collect(Collectors.groupingBy(LineDevGetDTO::getLineType));
collect.forEach((k, v)->{
List<String> collect1 = v.stream().map(LineDevGetDTO::getPointId).collect(Collectors.toList());
queryWrapper.clear();
queryWrapper.select("is_freq","is_v_dev","is_v","is_i","is_unbalance","is_i_neg").
in("measurement_point_id",collect1).
eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",dataDate);
List<RMpPartHarmonicDetailD> rMpPartHarmonicDetailDS = rMpPartHarmonicDetailDMapper.selectList(queryWrapper);
rMpSurplusHarmonicDetailDQueryWrapper.clear();
rMpSurplusHarmonicDetailDQueryWrapper.select("is_flicker","is_inuharm").
in("measurement_point_id",collect1).
eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",dataDate);
List<RMpSurplusHarmonicDetailD> rMpSurplusHarmonicDetailDS = rMpSurplusHarmonicDetailDMapper.selectList(rMpSurplusHarmonicDetailDQueryWrapper);
rStatOrgDPOQueryWrapper.clear();
rStatOrgDPOQueryWrapper.select("effective_measurement").
eq("org_no",deptGetChildrenMoreDTO.getUnitId()).
eq("data_type",dataTypeMap.get(DicDataEnum.MAINNET_POINT.getCode()).getId()).
eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",dataDate);
RStatOrgDPO rStatOrgDPO = rStatOrgDMapper.selectOne(rStatOrgDPOQueryWrapper);
steadyStatis.forEach(dictData -> {
if(Objects.equals(dictData.getCode(),DicDataEnum.TOTAL_INDICATOR.getCode())){
return;
}
RStatHarmonicOrgD rStatHarmonicOrgD = new RStatHarmonicOrgD();
rStatHarmonicOrgD.setOrgNo(deptGetChildrenMoreDTO.getUnitId());
rStatHarmonicOrgD.setDataDate(date);
rStatHarmonicOrgD.setHarmonicType(dictData.getId());
rStatHarmonicOrgD.setDataType(dataTypeMap.get(DicDataEnum.MAINNET_POINT.getCode()).getId());
rStatHarmonicOrgD.setOverLimitMeasurementAverage(getSteadyStatisData(dictData,rMpPartHarmonicDetailDS,rMpSurplusHarmonicDetailDS));
if(rStatOrgDPO.getEffectiveMeasurement()==0){
rStatHarmonicOrgD.setOverLimitMeasurementRatioAverage(1.00F);
}else{
String value = df.format((float)rStatHarmonicOrgD.getOverLimitMeasurementAverage()/ rStatOrgDPO.getEffectiveMeasurement());
rStatHarmonicOrgD.setOverLimitMeasurementRatioAverage(Float.parseFloat(value));
}
orgDList.add(rStatHarmonicOrgD);
});
});
}
/*配网*/
if(!CollectionUtils.isEmpty(deptGetChildrenMoreDTO.getPwMonitorIds())) {
List<LineDevGetDTO> pwMonitorIds = deptGetChildrenMoreDTO.getPwMonitorIds();
Map<Integer, List<LineDevGetDTO>> pwMonitorMap = pwMonitorIds.stream().collect(Collectors.groupingBy(LineDevGetDTO::getLineType));
pwMonitorMap.forEach((k, v) -> {
List<String> collect1 = v.stream().map(LineDevGetDTO::getPointId).collect(Collectors.toList());
queryWrapper.clear();
queryWrapper.select("is_freq", "is_v_dev", "is_v", "is_i", "is_unbalance", "is_i_neg").
in("measurement_point_id", collect1).
eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", dataDate);
List<RMpPartHarmonicDetailD> rMpPartHarmonicDetailDS = rMpPartHarmonicDetailDMapper.selectList(queryWrapper);
rMpSurplusHarmonicDetailDQueryWrapper.clear();
rMpSurplusHarmonicDetailDQueryWrapper.select("is_flicker", "is_inuharm").
in("measurement_point_id", collect1).
eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", dataDate);
List<RMpSurplusHarmonicDetailD> rMpSurplusHarmonicDetailDS = rMpSurplusHarmonicDetailDMapper.selectList(rMpSurplusHarmonicDetailDQueryWrapper);
rStatOrgDPOQueryWrapper.clear();
rStatOrgDPOQueryWrapper.select("effective_measurement").
eq("org_no", deptGetChildrenMoreDTO.getUnitId()).
eq("data_type", dataTypeMap.get(DicDataEnum.DISTRIBUTION_POINT.getCode()).getId()).
eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", dataDate);
RStatOrgDPO rStatOrgDPO = rStatOrgDMapper.selectOne(rStatOrgDPOQueryWrapper);
steadyStatis.forEach(dictData -> {
if (Objects.equals(dictData.getCode(), DicDataEnum.NEG_CURRENT.getCode())) {
return;
}
RStatHarmonicOrgD rStatHarmonicOrgD = new RStatHarmonicOrgD();
rStatHarmonicOrgD.setOrgNo(deptGetChildrenMoreDTO.getUnitId());
rStatHarmonicOrgD.setDataDate(date);
rStatHarmonicOrgD.setHarmonicType(dictData.getId());
rStatHarmonicOrgD.setDataType(dataTypeMap.get(DicDataEnum.MAINNET_POINT.getCode()).getId());
rStatHarmonicOrgD.setOverLimitMeasurementAverage(getSteadyStatisData(dictData,rMpPartHarmonicDetailDS,rMpSurplusHarmonicDetailDS));
if(rStatOrgDPO.getEffectiveMeasurement()==0){
rStatHarmonicOrgD.setOverLimitMeasurementRatioAverage(1.00F);
}else{
String value = df.format((float)rStatHarmonicOrgD.getOverLimitMeasurementAverage()/ rStatOrgDPO.getEffectiveMeasurement());
rStatHarmonicOrgD.setOverLimitMeasurementRatioAverage(Float.parseFloat(value));
}
orgDList.add(rStatHarmonicOrgD);
});
});
}
});
System.out.println("orgDList===:" + orgDList);
// if(!CollectionUtils.isEmpty(orgDList)){
// this.saveOrUpdateBatchByMultiId(orgDList,1000);
// }
}
private Integer getSteadyStatisData(DictData dictData, List<RMpPartHarmonicDetailD> rMpPartHarmonicDetailDS, List<RMpSurplusHarmonicDetailD> rMpSurplusHarmonicDetailDS) {
Integer value = 0;
if (Objects.equals(dictData.getCode(),DicDataEnum.VOLTAGE_DEV.getCode())) {
value = Integer.valueOf(rMpPartHarmonicDetailDS.stream().filter(temp ->temp.getIsVDev()==1).count()+"");
}
if (Objects.equals(dictData.getCode(),DicDataEnum.FLICKER.getCode())) {
value = Integer.valueOf(rMpSurplusHarmonicDetailDS.stream().filter(temp ->temp.getIsFlicker()==1).count()+"");
}
if (Objects.equals(dictData.getCode(),DicDataEnum.HARMONIC_VOLTAGE.getCode())) {
value = Integer.valueOf(rMpPartHarmonicDetailDS.stream().filter(temp ->temp.getIsV()==1).count()+"");
}
if (Objects.equals(dictData.getCode(),DicDataEnum.HARMONIC_CURRENT.getCode())) {
value = Integer.valueOf(rMpPartHarmonicDetailDS.stream().filter(temp ->temp.getIsI()==1).count()+"");
}
if (Objects.equals(dictData.getCode(),DicDataEnum.INTERHARMONIC_VOLTAGE.getCode())) {
value = Integer.valueOf(rMpSurplusHarmonicDetailDS.stream().filter(temp ->temp.getIsInuharm()==1).count()+"");
}
if (Objects.equals(dictData.getCode(),DicDataEnum.PHASE_VOLTAGE.getCode())) {
value = Integer.valueOf(rMpPartHarmonicDetailDS.stream().filter(temp ->temp.getIsUnbalance()==1).count()+"");
}
if (Objects.equals(dictData.getCode(),DicDataEnum.FREQUENCY_DEV.getCode())) {
value = Integer.valueOf(rMpPartHarmonicDetailDS.stream().filter(temp ->temp.getIsFreq()==1).count()+"");
}
if (Objects.equals(dictData.getCode(),DicDataEnum.NEG_CURRENT.getCode())) {
value = Integer.valueOf(rMpPartHarmonicDetailDS.stream().filter(temp ->temp.getIsINeg()==1).count()+"");
}
return value;
}
}

View File

@@ -0,0 +1,21 @@
package com.njcn.prepare.harmonic.service.mysql.area;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.harmonic.pojo.po.RStatHarmonicOrgD;
import java.util.List;
/**
* @author xuyang
*/
public interface IRStatHarmonicOrgDService extends IMppService<RStatHarmonicOrgD> {
/**
* 日表处理
* @param data 监测点信息
* @param dataDate 时间
*/
void dayHandle(List<DeptGetChildrenMoreDTO> data, String dataDate);
}

View File

@@ -116,48 +116,49 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
}
}
}
//开始执行短信发送
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的几个参数
//短信API产品名称短信产品名固定无需修改
final String product = "Dysmsapi";
//短信API产品域名接口地址固定无需修改
final String domain = "dysmsapi.aliyuncs.com";
//替换成你的AK
//你的accessKeyId,参考本文档步骤2
final String accessKeyId = "LTAI4FxsR76x2dq3w9c5puUe";
//你的accessKeySecret参考本文档步骤2
final String accessKeySecret = "GxkTR8fsrvHtixTlD9UPmOGli35tZs";
//初始化ascClient,暂时不支持多region请勿修改
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName("灿能云");
//必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
request.setTemplateCode(msgTemplate);
// //开始执行短信发送
// //设置超时时间-可自行调整
// System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
// System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// //初始化ascClient需要的几个参数
// //短信API产品名称短信产品名固定无需修改
// final String product = "Dysmsapi";
// //短信API产品域名接口地址固定无需修改
// final String domain = "dysmsapi.aliyuncs.com";
// //替换成你的AK
// //你的accessKeyId,参考本文档步骤2
// final String accessKeyId = "LTAI4FxsR76x2dq3w9c5puUe";
// //你的accessKeySecret参考本文档步骤2
// final String accessKeySecret = "GxkTR8fsrvHtixTlD9UPmOGli35tZs";
// //初始化ascClient,暂时不支持多region请勿修改
// IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
// DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
// IAcsClient acsClient = new DefaultAcsClient(profile);
// SendSmsRequest request = new SendSmsRequest();
// request.setMethod(MethodType.POST);
// request.setPhoneNumbers(phone);
// //必填:短信签名-可在短信控制台中找到
// request.setSignName("灿能云");
// //必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
// request.setTemplateCode(msgTemplate);
String vcode = getMessageCode();
String code = "{\"code\":\"" + vcode + "\"}";
request.setTemplateParam(code);
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
// String code = "{\"code\":\"" + vcode + "\"}";
// request.setTemplateParam(code);
// //请求失败这里会抛ClientException异常
// SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
String key = RedisKeyEnum.SMS_LOGIN_KEY.getKey() + phone;
if (sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
//成功发送短信验证码后保存进redis
// if (sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
// //成功发送短信验证码后保存进redis
// redisUtil.saveByKey(key, vcode);
// } else {
// throw new BusinessException(UserResponseEnum.SEND_CODE_FAIL);
// }
redisUtil.saveByKey(key, vcode);
} else {
throw new BusinessException(UserResponseEnum.SEND_CODE_FAIL);
}
AppSendMsg appSendMsg = new AppSendMsg();
appSendMsg.setPhone(phone);
appSendMsg.setMessage(vcode);
appSendMsg.setSendTime(LocalDateTime.now());
appSendMsg.setSendStatus(sendSmsResponse.getCode() == null ? "无状态" : sendSmsResponse.getCode());
// appSendMsg.setSendStatus(sendSmsResponse.getCode() == null ? "无状态" : sendSmsResponse.getCode());
appSendMsgService.save(appSendMsg);
} catch (Exception e) {
logger.error("发送短信异常,异常为:"+e.getMessage());
@@ -283,11 +284,12 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
throw new BusinessException(UserResponseEnum.REGISTER_PHONE_REPEAT);
}
user = new User();
user.setName(phoneNew);
user.setLoginName(phoneNew);
user.setPhone(phoneNew);
user.setDevCode(devCode);
this.updateById(user);
User user2 = this.lambdaQuery().eq(User::getId,userId).one();
user2.setName(phoneNew);
user2.setLoginName(phoneNew);
user2.setPhone(phoneNew);
user2.setDevCode(devCode);
this.updateById(user2);
}