预处理模块:工单问题生成,主网有效监测时长计算,
过程监督模块:工单模块功能,其他模块的审核
This commit is contained in:
@@ -35,6 +35,12 @@
|
||||
<version>${project.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>process-api</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>common-influxDB</artifactId>
|
||||
|
||||
@@ -58,7 +58,6 @@ public class AreaCountController extends BaseController {
|
||||
Boolean result = true;
|
||||
List<String> orgIdList = new ArrayList<> ();
|
||||
if(CollectionUtils.isEmpty (primaryGridParam.getOrgIdList ())){
|
||||
/*todo 不知道是否需要补招*/
|
||||
List<PvTerminalTreeVO> dept = deptFeignClient.allDeptList().getData();
|
||||
orgIdList = dept.stream ( ).map (PvTerminalTreeVO::getId).collect (Collectors.toList ( ));
|
||||
}else{
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.njcn.prepare.harmonic.controller.area;
|
||||
|
||||
import com.njcn.common.pojo.annotation.OperateInfo;
|
||||
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.prepare.harmonic.pojo.param.PrimaryGridParam;
|
||||
import com.njcn.prepare.harmonic.service.mysql.area.EffectiveMinuteCountService;
|
||||
import com.njcn.user.api.DeptFeignClient;
|
||||
import com.njcn.user.pojo.vo.PvTerminalTreeVO;
|
||||
import com.njcn.web.controller.BaseController;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
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.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/23 14:18【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Api(tags = "主网有效监测时长)")
|
||||
@RestController
|
||||
@RequestMapping("EffectiveCount")
|
||||
@RequiredArgsConstructor
|
||||
public class EffectiveMinuteCountController extends BaseController {
|
||||
|
||||
private final
|
||||
DeptFeignClient deptFeignClient;
|
||||
|
||||
private final
|
||||
EffectiveMinuteCountService effectiveMinuteCount;
|
||||
|
||||
|
||||
@ApiOperation("主网有效监测时长")
|
||||
@ApiImplicitParam(value = "primaryGridParam",name = "primaryGridParam",required = true)
|
||||
@PostMapping("effectiveMinuteCount")
|
||||
@OperateInfo(info = LogEnum.BUSINESS_MEDIUM)
|
||||
public HttpResult<Boolean> effectiveMinuteCount(@RequestBody PrimaryGridParam primaryGridParam ){
|
||||
log.info(LocalDateTime.now()+"effectiveMinuteCount开始执行");
|
||||
String methodDescribe = getMethodDescribe("effectiveMinuteCount");
|
||||
Boolean result = true;
|
||||
List<String> orgIdList = new ArrayList<> ();
|
||||
if(CollectionUtils.isEmpty (primaryGridParam.getOrgIdList ())){
|
||||
List<PvTerminalTreeVO> dept = deptFeignClient.allDeptList().getData();
|
||||
orgIdList = dept.stream ( ).map (PvTerminalTreeVO::getId).collect (Collectors.toList ( ));
|
||||
}else{
|
||||
orgIdList = primaryGridParam.getOrgIdList ();
|
||||
}
|
||||
primaryGridParam.setOrgIdList (orgIdList);
|
||||
|
||||
effectiveMinuteCount.effectiveMinuteCount (primaryGridParam);
|
||||
if (result){
|
||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
|
||||
} else {
|
||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package com.njcn.prepare.harmonic.controller.area;
|
||||
|
||||
import com.njcn.common.pojo.annotation.OperateInfo;
|
||||
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.pms.api.PmsPowerDistributionareaClient;
|
||||
import com.njcn.device.pms.pojo.param.PowerDistributionareaParam;
|
||||
import com.njcn.device.pms.pojo.po.PowerDistributionarea;
|
||||
import com.njcn.prepare.harmonic.pojo.param.LineParam;
|
||||
import com.njcn.prepare.harmonic.service.influxdb.RStatWorkOrderCreateService;
|
||||
import com.njcn.redis.utils.RedisUtil;
|
||||
import com.njcn.user.api.DeptFeignClient;
|
||||
import com.njcn.web.controller.BaseController;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
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.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/9 9:16【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Api(tags = "工单生成批处理逻辑")
|
||||
@RestController
|
||||
@RequestMapping("RStatWorkOrderCreate")
|
||||
@RequiredArgsConstructor
|
||||
public class RStatWorkOrderCreateController extends BaseController {
|
||||
|
||||
|
||||
private final PmsPowerDistributionareaClient pmsPowerDistributionareaClient;
|
||||
|
||||
private final RStatWorkOrderCreateService rStatWorkOrderCreateService;
|
||||
private final DeptFeignClient deptFeignClient;
|
||||
private final RedisUtil redisUtil;
|
||||
|
||||
|
||||
@ApiOperation("工单生成批处理逻辑(台区测点)")
|
||||
@ApiImplicitParam(value = "lineParam",name = "lineParam",required = true)
|
||||
@PostMapping("workOrderCreate")
|
||||
@OperateInfo(info = LogEnum.BUSINESS_MEDIUM)
|
||||
public HttpResult<Boolean> workOrderCreate(@RequestBody LineParam lineParam ){
|
||||
log.info(LocalDateTime.now()+"workOrderCreate开始执行");
|
||||
String methodDescribe = getMethodDescribe("workOrderCreate");
|
||||
Boolean result = true;
|
||||
List<String> lineIds= new ArrayList<> ();
|
||||
if(CollectionUtils.isEmpty (lineParam.getLineIds ())){
|
||||
PowerDistributionareaParam powerDistributionareaParam = new PowerDistributionareaParam();
|
||||
List<PowerDistributionarea> data = pmsPowerDistributionareaClient.getPowerDistributionList (powerDistributionareaParam).getData ( );
|
||||
lineIds = data.stream ().map (PowerDistributionarea::getId).collect(Collectors.toList());
|
||||
}else{
|
||||
lineIds = lineParam.getLineIds ( );
|
||||
}
|
||||
lineParam.setLineIds (lineIds);
|
||||
rStatWorkOrderCreateService.workOrderCreate(lineParam);
|
||||
if (result){
|
||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
|
||||
} else {
|
||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,14 @@ package com.njcn.prepare.harmonic.mapper.oracle;
|
||||
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.njcn.prepare.harmonic.pojo.dto.DataVFiveItemDTO;
|
||||
import com.njcn.prepare.harmonic.pojo.oracle.DataVOraclePO;
|
||||
import com.njcn.prepare.harmonic.pojo.vo.DataVOracleVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
@@ -21,4 +24,6 @@ public interface DataVOraclePOMapper extends BaseMapper<DataVOraclePO> {
|
||||
DataVOracleVO getFiveItemsForDataException(@Param("lineId") Integer lineId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);
|
||||
|
||||
DataVOracleVO getFiveCountForDataIntegrityRate(@Param("lineId") Integer lineId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);
|
||||
|
||||
List<DataVFiveItemDTO> getFiveItems(@Param("lineId") Integer lineId, @Param("date") String date);
|
||||
}
|
||||
@@ -63,4 +63,33 @@
|
||||
GROUP BY
|
||||
LINEID
|
||||
</select>
|
||||
<select id="getFiveItems" resultType="com.njcn.prepare.harmonic.pojo.dto.DataVFiveItemDTO">
|
||||
select a.lineid,a.timeid,a.rmsMax,a.rmsMin,a.vThdMax,a.vThdMin,
|
||||
b.freqMax,b.freqMin,b.rmsLvrMax,b.rmsLvrMin,b.vUnbalanceMax,b.vUnbalanceMin from
|
||||
(SELECT lineid,
|
||||
timeid,
|
||||
Max(RMS_MAX) AS rmsMax,
|
||||
Min(RMS_MIN) AS rmsMin,
|
||||
Max(V_THD_MAX) AS vThdMax,
|
||||
Min(V_THD_MIN) AS vThdMin
|
||||
FROM DATA_V
|
||||
WHERE lineid = #{lineId}
|
||||
and TO_CHAR(TIMEID, 'yyyy-mm-dd') = #{date}
|
||||
AND PHASIC_TYPE IN ('A', 'B', 'C')
|
||||
group by lineid, TIMEID) a left join
|
||||
(SELECT lineid,
|
||||
timeid,
|
||||
Max(FREQ_MAX) AS freqMax,
|
||||
Min(FREQ_MIN) AS freqMin,
|
||||
GREATEST(MaX(RMSAB_MAX), MaX(RMSBC_MAX), MAX(RMSCA_MAX)) AS rmsLvrMax,
|
||||
least(MIN(RMSAB_MIN), MIN(RMSBC_MIN), MIN(RMSCA_MIN)) AS rmsLvrMin,
|
||||
Max(V_UNBALANCE_MAX) AS vUnbalanceMax,
|
||||
Min(V_UNBALANCE_MIN) AS vUnbalanceMin
|
||||
FROM DATA_V
|
||||
WHERE lineid = #{lineId}
|
||||
and TO_CHAR(TIMEID, 'yyyy-mm-dd') = #{date}
|
||||
AND PHASIC_TYPE = 'T'
|
||||
group by lineid, TIMEID) b
|
||||
on a.LINEID = b.LINEID and a.timeid =b.timeid
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.njcn.prepare.harmonic.service.influxdb;
|
||||
|
||||
import com.njcn.prepare.harmonic.pojo.dto.DataVFiveItemDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/23 10:31【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
public interface DataVInfluxdbService
|
||||
{
|
||||
/**
|
||||
* @Description: 1.1.1.2.1. 主网单位在线监测点数日统计 :data_v表中查询phasic_type = A当天RMS数据数量,数量大于1则该监测点为在线监测点
|
||||
* @Param:
|
||||
* @return:
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
Integer queryTransitMeasurementPoints(List<String> lineIds, String date, String type);
|
||||
|
||||
/**
|
||||
* @Description: 获取监测点当天数据
|
||||
* @Param: [lineId, date]
|
||||
* @return: java.util.List<com.njcn.prepare.harmonic.pojo.vo.DataVOracleVO>
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
List<DataVFiveItemDTO> getFiveItems(String lineId, String date, Integer statisticalInterval);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.njcn.prepare.harmonic.service.influxdb;
|
||||
|
||||
import com.njcn.prepare.harmonic.pojo.param.LineParam;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/10 15:42【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
public interface RStatWorkOrderCreateService {
|
||||
void workOrderCreate(LineParam lineParam);
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
package com.njcn.prepare.harmonic.service.influxdb.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import com.google.common.base.Objects;
|
||||
import com.njcn.device.pq.pojo.po.DataV;
|
||||
import com.njcn.influxdb.param.InfluxDBPublicParam;
|
||||
import com.njcn.influxdb.utils.InfluxDbUtils;
|
||||
import com.njcn.prepare.harmonic.pojo.dto.DataVFiveItemDTO;
|
||||
import com.njcn.prepare.harmonic.service.influxdb.DataVInfluxdbService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.influxdb.dto.QueryResult;
|
||||
import org.influxdb.impl.InfluxDBResultMapper;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/23 10:32【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class DataVInfluxdbServiceImpl implements DataVInfluxdbService {
|
||||
private final InfluxDbUtils influxDbUtils;
|
||||
/**
|
||||
* @param lineIds
|
||||
* @param date
|
||||
* @param type
|
||||
* @Description: 1.1.1.2.1. 主网单位在线监测点数日统计 :data_v表中查询phasic_type = A当天RMS数据数量,数量大于1则该监测点为在线监测点
|
||||
* @Param:
|
||||
* @return:
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
@Override
|
||||
public Integer queryTransitMeasurementPoints(List<String> lineIds, String date, String type) {
|
||||
String startTime = date+" "+"00:00:00";
|
||||
String endTime = date+" "+"23:59:59";
|
||||
Integer i =0;
|
||||
for (String temp:lineIds){
|
||||
String Sql = "SELECT count(rms) FROM \"data_v\" where line_id='"+temp+
|
||||
"'and "+ InfluxDBPublicParam.TIME+">='"+startTime+"'and "+ InfluxDBPublicParam.TIME+"<='"+endTime+"' and phasic_type ='A' and rms>1 "+ InfluxDBPublicParam.TIME_ZONE;
|
||||
QueryResult sqlResult4 = influxDbUtils.query(Sql);
|
||||
|
||||
List<QueryResult.Series> series = sqlResult4.getResults().get(0).getSeries();
|
||||
Double tem =0.0;
|
||||
if(CollUtil.isNotEmpty(series)){
|
||||
tem =(Double)series.get(0).getValues().get(0).get(1);
|
||||
}
|
||||
if(tem>0){
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param lineId
|
||||
* @param date
|
||||
* @Description: 获取监测点当天数据
|
||||
* @Param: [lineId, date]
|
||||
* @return: java.util.List<com.njcn.prepare.harmonic.pojo.vo.DataVOracleVO>
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
@Override
|
||||
public List<DataVFiveItemDTO> getFiveItems(String lineId, String date, Integer statisticalInterval) {
|
||||
/*按时间分组每组16条,*/
|
||||
/*freq,v_thd,v_unbalance 取T项数据*/
|
||||
String startTime = date+" "+"00:00:00";
|
||||
String endTime = date+" "+"23:59:59";
|
||||
String Sql = "SELECT time, MAX(freq) as freq_max,MIN(freq) as freq_min,MAX(v_thd) as v_thd_max,MIN(v_thd) as v_thd_min,MAX(v_unbalance) as v_unbalance_max,MIN(v_unbalance) as v_unbalance_min from data_v where line_id='"+lineId+
|
||||
"'and "+ InfluxDBPublicParam.TIME+">='"+startTime+"'and "+ InfluxDBPublicParam.TIME+"<='"+endTime+"' and phasic_type ='T' group by time("+statisticalInterval+"m ) fill(none) "+InfluxDBPublicParam.TIME_ZONE;
|
||||
QueryResult query = influxDbUtils.query(Sql);
|
||||
InfluxDBResultMapper resultMapper = new InfluxDBResultMapper();
|
||||
List<DataV> dataVS = resultMapper.toPOJO(query, DataV.class);
|
||||
/*rms,rms_lvr 取ABC项数据任意一个数据*/
|
||||
|
||||
String Sql2 = "SELECT time, MAX(rms) as rms_max,MIN(rms) as rms_min,MAX(rms_lvr) as rms_lvr_max,MIN(rms_lvr) as rms_lvr_min from data_v where line_id='"+lineId+
|
||||
"'and "+ InfluxDBPublicParam.TIME+">='"+startTime+"'and "+ InfluxDBPublicParam.TIME+"<='"+endTime+"' and phasic_type ='A' group by time("+statisticalInterval+"m ) fill(none) "+InfluxDBPublicParam.TIME_ZONE;
|
||||
QueryResult query2 = influxDbUtils.query(Sql2);
|
||||
InfluxDBResultMapper resultMapper2 = new InfluxDBResultMapper();
|
||||
List<DataV> dataVS2 = resultMapper2.toPOJO(query2, DataV.class);
|
||||
|
||||
|
||||
List<DataVFiveItemDTO> collect = dataVS.stream ( ).map (temp -> {
|
||||
DataVFiveItemDTO dataVFiveItemDTO = new DataVFiveItemDTO ( );
|
||||
BeanUtils.copyProperties (temp, dataVFiveItemDTO);
|
||||
DataV dataV = dataVS2.stream ( ).filter (temp2 -> Objects.equal (temp.getTime ( ), temp2.getTime ( ))).
|
||||
collect (Collectors.toList ( )).get (0);
|
||||
dataVFiveItemDTO.setRmsMax (dataV.getRmsMAX ());
|
||||
dataVFiveItemDTO.setRmsMin (dataV.getRmsMIN ( ));
|
||||
dataVFiveItemDTO.setRmsLvrMax (dataV.getRmsLvrMAX ());
|
||||
dataVFiveItemDTO.setRmsLvrMin (dataV.getRmsLvrMIN ());
|
||||
|
||||
return dataVFiveItemDTO;
|
||||
}).collect (Collectors.toList ( ));
|
||||
return collect;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,265 @@
|
||||
package com.njcn.prepare.harmonic.service.influxdb.impl;
|
||||
|
||||
import com.njcn.device.pms.api.MonitorClient;
|
||||
import com.njcn.device.pq.pojo.po.Overlimit;
|
||||
import com.njcn.influxdb.param.InfluxDBPublicParam;
|
||||
import com.njcn.influxdb.utils.InfluxDbUtils;
|
||||
import com.njcn.prepare.harmonic.pojo.dto.OverLimitFlagDTO;
|
||||
import com.njcn.prepare.harmonic.pojo.influxdb.po.DataIPO;
|
||||
import com.njcn.prepare.harmonic.pojo.influxdb.po.DataVPO;
|
||||
import com.njcn.prepare.harmonic.pojo.param.LineParam;
|
||||
import com.njcn.prepare.harmonic.service.influxdb.RStatWorkOrderCreateService;
|
||||
import com.njcn.process.api.RStatWorkOrderFeignClient;
|
||||
import com.njcn.system.enums.DicDataEnum;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.influxdb.dto.QueryResult;
|
||||
import org.influxdb.impl.InfluxDBResultMapper;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/10 15:43【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class RStatWorkOrderCreateServiceImpl implements RStatWorkOrderCreateService {
|
||||
|
||||
private final InfluxDbUtils influxDbUtils;
|
||||
private final MonitorClient monitorClient;
|
||||
private final RStatWorkOrderFeignClient rStatWorkOrderFeignClient;
|
||||
@Override
|
||||
public void workOrderCreate(LineParam lineParam) {
|
||||
List<String> lineIds = lineParam.getLineIds ( );
|
||||
List<OverLimitFlagDTO> overLimitFlagDTOList = new ArrayList();
|
||||
String startTime = lineParam.getDataDate ()+" "+"00:00:00";
|
||||
String endTime = lineParam.getDataDate ()+" "+"23:59:59";
|
||||
lineIds.stream ().forEach (lineId->{
|
||||
|
||||
Overlimit overlimit = monitorClient.getOverLimitData(lineId).getData ();
|
||||
List<DataVPO> dataV = getDataV(lineId,startTime,endTime);
|
||||
List<OverLimitFlagDTO> checkResultV = checkOverLimitV(dataV,overlimit);
|
||||
/*Datav3分钟一条数据连续4个小时越限说明OverLimitFlagDTO.overLimtFlag要连续80个是1才生成工单*/
|
||||
List<OverLimitFlagDTO> workOrderV = checkOverLimitFlag (checkResultV);
|
||||
for (OverLimitFlagDTO overLimitFlagDTO : workOrderV) {
|
||||
OverLimitFlagDTO result = new OverLimitFlagDTO ();
|
||||
BeanUtils.copyProperties (overLimitFlagDTO, result);
|
||||
result.setLineId (lineId);
|
||||
result.setOverLimtType (DicDataEnum.VOLTAGE_LIMIT.getCode ());
|
||||
overLimitFlagDTOList.add (result);
|
||||
}
|
||||
List<DataIPO> dataI = getDataI(lineId,startTime,endTime);
|
||||
List<OverLimitFlagDTO> checkResultI = checkOverLimitI(dataI,overlimit);
|
||||
List<OverLimitFlagDTO> workOrderI= checkOverLimitFlag (checkResultI);
|
||||
for (OverLimitFlagDTO overLimitFlagDTO : workOrderI) {
|
||||
OverLimitFlagDTO result = new OverLimitFlagDTO ();
|
||||
BeanUtils.copyProperties (overLimitFlagDTO, result);
|
||||
result.setLineId (lineId);
|
||||
result.setOverLimtType (DicDataEnum.CURRENT_LIMIT.getCode ());
|
||||
overLimitFlagDTOList.add (result);
|
||||
}
|
||||
|
||||
});
|
||||
rStatWorkOrderFeignClient.createProblem (overLimitFlagDTOList);
|
||||
}
|
||||
/**
|
||||
* @Description: 对比监测一天的电流是否越限,越限返回1,未越限返回0
|
||||
* @Param: [dataI, overlimit]
|
||||
* @return: java.util.List<com.njcn.prepare.harmonic.pojo.dto.OverLimitFlagDTO>
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/13
|
||||
*/
|
||||
private List<OverLimitFlagDTO> checkOverLimitI(List<DataIPO> dataI, Overlimit overlimit) {
|
||||
List<OverLimitFlagDTO> result = new ArrayList<> ();
|
||||
dataI.stream ().forEach (datai ->{
|
||||
Integer temp = 0;
|
||||
|
||||
for(int i=2 ;i<26;i++){
|
||||
|
||||
String vi = getFieldValueByFieldName("v"+i,datai);
|
||||
String overLimiti= getFieldValueByFieldName("uharm"+i,overlimit);
|
||||
if(Double.valueOf (vi)>Double.valueOf (overLimiti)){
|
||||
temp = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
OverLimitFlagDTO overLimitFlagDTO = new OverLimitFlagDTO();
|
||||
overLimitFlagDTO.setOverLimtFlag (temp);
|
||||
overLimitFlagDTO.setStartTime (LocalDateTime.ofInstant(datai.getTime (), ZoneId.systemDefault()));
|
||||
result.add (overLimitFlagDTO);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Datav3分钟一条数据,每天480条数据连续4个小时越限说明OverLimitFlagDTO.overLimtFlag要连续80个是1才生成工单
|
||||
* @Description: checkOverLimitFlag
|
||||
* @Param: [checkResult]
|
||||
* @return: java.util.List<com.njcn.prepare.harmonic.pojo.dto.OverLimitFlagDTO>
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/13
|
||||
*/
|
||||
private List<OverLimitFlagDTO> checkOverLimitFlag(List<OverLimitFlagDTO> checkResult) {
|
||||
List<OverLimitFlagDTO> result = new ArrayList<> ();
|
||||
int temp = checkResult.size ()-40;
|
||||
for (int i=0;i<temp;i++){
|
||||
List<OverLimitFlagDTO> collect = checkResult.stream ( ).skip (i).limit (80).collect (Collectors.toList ( ));
|
||||
int sum = collect.stream ( ).mapToInt (OverLimitFlagDTO::getOverLimtFlag).sum ( );
|
||||
if(sum==80){
|
||||
/*sum==80连续4个小时越限生成工单,统计越限时间*/
|
||||
OverLimitFlagDTO overLimitFlagDTO = new OverLimitFlagDTO();
|
||||
overLimitFlagDTO.setStartTime (checkResult.get (i).getStartTime ());
|
||||
Integer temp2 =i+80;
|
||||
while(checkResult.get (temp2).getOverLimtFlag ()==1){
|
||||
temp2++ ;
|
||||
if(temp2==checkResult.size ()-1){
|
||||
break;
|
||||
}
|
||||
}
|
||||
overLimitFlagDTO.setEndTime (checkResult.get (temp2-1).getStartTime ());
|
||||
i=temp2;
|
||||
result.add (overLimitFlagDTO);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Description: 对比监测一天的电压是否越限,越限返回1,未越限返回0
|
||||
* @Param: [dataV, overlimit]
|
||||
* @return: java.lang.String[]
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/13
|
||||
*/
|
||||
private List<OverLimitFlagDTO> checkOverLimitV(List<DataVPO> dataV, Overlimit overlimit) {
|
||||
List<OverLimitFlagDTO> result = new ArrayList<> ();
|
||||
dataV.stream ().forEach (datav ->{
|
||||
Integer temp = 0;
|
||||
|
||||
for(int i=1 ;i<26;i++){
|
||||
if(i==1){
|
||||
if(datav.getVThd ()>overlimit.getUaberrance ()){
|
||||
temp = 1;
|
||||
break;
|
||||
}
|
||||
}else {
|
||||
String vi = getFieldValueByFieldName("v"+i,datav);
|
||||
String overLimiti= getFieldValueByFieldName("uharm"+i,overlimit);
|
||||
if(Double.valueOf (vi)>Double.valueOf (overLimiti)){
|
||||
temp = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
OverLimitFlagDTO overLimitFlagDTO = new OverLimitFlagDTO();
|
||||
overLimitFlagDTO.setOverLimtFlag (temp);
|
||||
overLimitFlagDTO.setStartTime (LocalDateTime.ofInstant(datav.getTime (), ZoneId.systemDefault()));
|
||||
result.add (overLimitFlagDTO);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 功能描述:获取dataVCP95值数据
|
||||
* @author xy
|
||||
* @param lineIndex 监测点集ID
|
||||
* @param startTime 起始时间
|
||||
* @param endTime 结束时间
|
||||
* @date 2022/5/10 14:56
|
||||
* @return List<DataV>
|
||||
*/
|
||||
public List<DataVPO> getDataV(String lineIndex, String startTime, String endTime){
|
||||
List<DataVPO> result = new ArrayList<> ();
|
||||
|
||||
//CP95值
|
||||
StringBuilder stringBuilder7 = new StringBuilder();
|
||||
StringBuilder stringBuilder8 = new StringBuilder();
|
||||
stringBuilder7.append("MAX(v_thd) AS v_thd,");
|
||||
for (int i = 2; i <=25 ; i++) {
|
||||
if (i==25){
|
||||
stringBuilder7.append("MAX(v_").append(i).append(") AS v_").append(i);
|
||||
} else {
|
||||
stringBuilder7.append("MAX(v_").append(i).append(") AS v_").append(i).append(",");
|
||||
}
|
||||
}
|
||||
stringBuilder8.append ("line_id='").append (lineIndex).append ("' and ").append(InfluxDBPublicParam.TIME + " >= '").append(startTime).append("' and ").append(InfluxDBPublicParam.TIME).append(" <= '").append(endTime).append("' and value_type = 'CP95' group by time(3m) fill(0)").append(InfluxDBPublicParam.TIME_ZONE);
|
||||
String sql4 = "select "+stringBuilder7+" from "+ InfluxDBPublicParam.DATA_V+" where "+stringBuilder8;
|
||||
QueryResult sqlResult4 = influxDbUtils.query(sql4);
|
||||
InfluxDBResultMapper resultMapper4 = new InfluxDBResultMapper();
|
||||
List<DataVPO> list4 = resultMapper4.toPOJO(sqlResult4, DataVPO.class);
|
||||
list4.forEach(item->{
|
||||
item.setValueType("CP95");
|
||||
});
|
||||
result.addAll(list4);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 功能描述:获取dataI CP95数据
|
||||
* @author xy
|
||||
* @param lineIndex 监测点ID
|
||||
* @param startTime 起始时间
|
||||
* @param endTime 结束时间
|
||||
* @date 2022/5/10 14:56
|
||||
* @return List<DataIPO>
|
||||
*/
|
||||
public List<DataIPO> getDataI(String lineIndex, String startTime, String endTime){
|
||||
List<DataIPO> result = new ArrayList<>();
|
||||
|
||||
//CP95值
|
||||
StringBuilder stringBuilder7 = new StringBuilder();
|
||||
StringBuilder stringBuilder8 = new StringBuilder();
|
||||
for (int i = 2; i <=25 ; i++) {
|
||||
if (i==25){
|
||||
stringBuilder7.append("MAX(i_").append(i).append(") AS i_").append(i);
|
||||
} else {
|
||||
stringBuilder7.append("MAX(i_").append(i).append(") AS i_").append(i).append(",");
|
||||
}
|
||||
}
|
||||
stringBuilder8.append ("line_id='").append (lineIndex).append ("' and ").append(InfluxDBPublicParam.TIME + " >= '").append(startTime).append("' and ").append(InfluxDBPublicParam.TIME).append(" <= '").append(endTime).append("' and value_type = 'CP95' group by time(3m) fill(0)").append(InfluxDBPublicParam.TIME_ZONE);
|
||||
String sql4 = "select "+stringBuilder7+" from "+ InfluxDBPublicParam.DATA_I+" where "+stringBuilder8;
|
||||
QueryResult sqlResult4 = influxDbUtils.query(sql4);
|
||||
InfluxDBResultMapper resultMapper4 = new InfluxDBResultMapper();
|
||||
List<DataIPO> list4 = resultMapper4.toPOJO(sqlResult4, DataIPO.class);
|
||||
list4.forEach(item->{
|
||||
item.setValueType("CP95");
|
||||
});
|
||||
result.addAll(list4);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据属性名获取属性值
|
||||
*
|
||||
* @param fieldName
|
||||
* @param object
|
||||
* @return
|
||||
*/
|
||||
private String getFieldValueByFieldName(String fieldName, Object object) {
|
||||
try {
|
||||
Field field = object.getClass().getDeclaredField(fieldName);
|
||||
//设置对象的访问权限,保证对private的属性的访问
|
||||
field.setAccessible(true);
|
||||
return field.get(object)+"";
|
||||
} catch (Exception e) {
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,327 @@
|
||||
package com.njcn.prepare.harmonic.service.mysql.Impl.area;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.njcn.device.pq.constant.Param;
|
||||
import com.njcn.device.pq.pojo.po.PmsAbnormalRules;
|
||||
import com.njcn.harmonic.pojo.po.PmsMonitorPO;
|
||||
import com.njcn.harmonic.pojo.po.RMpIntegrityDPO;
|
||||
import com.njcn.harmonic.pojo.po.RStatAbnormalDPO;
|
||||
import com.njcn.prepare.harmonic.constant.AlgorithmParam;
|
||||
import com.njcn.prepare.harmonic.mapper.mysql.area.RStatAbnormalDPOMapper;
|
||||
import com.njcn.prepare.harmonic.mapper.mysql.line.PmsAbnormalRulesMapper;
|
||||
import com.njcn.prepare.harmonic.pojo.dto.DataVFiveItemDTO;
|
||||
import com.njcn.prepare.harmonic.pojo.oracle.PqLinedetailPO;
|
||||
import com.njcn.prepare.harmonic.pojo.param.PrimaryGridParam;
|
||||
import com.njcn.prepare.harmonic.service.influxdb.DataVInfluxdbService;
|
||||
import com.njcn.prepare.harmonic.service.mysql.area.EffectiveMinuteCountService;
|
||||
import com.njcn.prepare.harmonic.service.mysql.area.PmsMonitorPOService;
|
||||
import com.njcn.prepare.harmonic.service.mysql.area.RMpIntegrityDPOService;
|
||||
import com.njcn.prepare.harmonic.service.oracle.DataVOraclePOService;
|
||||
import com.njcn.prepare.harmonic.service.oracle.PqLinedetailPOService;
|
||||
import com.njcn.system.api.DicDataFeignClient;
|
||||
import com.njcn.system.enums.DicDataTypeEnum;
|
||||
import com.njcn.system.pojo.po.DictData;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/23 16:04【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class EffectiveMinuteCountServiceImpl implements EffectiveMinuteCountService {
|
||||
|
||||
private final
|
||||
PmsMonitorPOService pmsMonitorPOService;
|
||||
private final
|
||||
RStatAbnormalDPOMapper rStatAbnormalDPOMapper;
|
||||
private final
|
||||
PmsAbnormalRulesMapper pmsAbnormalRulesMapper;
|
||||
private final
|
||||
PqLinedetailPOService pqLinedetailPOService;
|
||||
private final
|
||||
DataVOraclePOService dataVOraclePOService;
|
||||
private final
|
||||
RMpIntegrityDPOService rMpIntegrityDPOService;
|
||||
private final
|
||||
DicDataFeignClient dicDataFeignClient;
|
||||
private final
|
||||
DataVInfluxdbService dataVInfluxdbService;
|
||||
|
||||
|
||||
/**
|
||||
* @param primaryGridParam
|
||||
* @Description: 主网有效监测时长计算
|
||||
* @Param: [primaryGridParam]
|
||||
* @return: void
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
@Override
|
||||
@Async("asyncExecutor")
|
||||
public void effectiveMinuteCount(PrimaryGridParam primaryGridParam) {
|
||||
if (Objects.equals (primaryGridParam.getDataSource ( ), AlgorithmParam.ORACLE_DATA)) {
|
||||
this.hanlderOracleData (primaryGridParam);
|
||||
} else if (Objects.equals (primaryGridParam.getDataSource ( ), AlgorithmParam.INFLUX_DATA)) {
|
||||
this.hanlderInfludxbData (primaryGridParam);
|
||||
}
|
||||
}
|
||||
|
||||
private void hanlderInfludxbData(PrimaryGridParam primaryGridParam) {
|
||||
Integer type = primaryGridParam.getType ( );
|
||||
switch (type) {
|
||||
// case 1:
|
||||
// this.hanlderInfludxdbYear (primaryGridParam);
|
||||
// break;
|
||||
// case 2:
|
||||
// this.hanlderInfludxdbQtr (primaryGridParam);
|
||||
// break;
|
||||
// case 3:
|
||||
// this.hanlderInfludxdbMonth (primaryGridParam);
|
||||
// break;
|
||||
case 5:
|
||||
this.hanlderInfludxdbDay (primaryGridParam);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@SneakyThrows
|
||||
private void hanlderInfludxdbDay(PrimaryGridParam primaryGridParam) {
|
||||
List<String> orgIdList = primaryGridParam.getOrgIdList ( );
|
||||
String dataDate = primaryGridParam.getDataDate ( );
|
||||
List<RMpIntegrityDPO> rMpIntegrityDPOS = new ArrayList<> ( );
|
||||
|
||||
//1、取出规则
|
||||
List<PmsAbnormalRules> pmsAbnormalRules = pmsAbnormalRulesMapper.selectList (null);
|
||||
//2、取出电压字典
|
||||
List<DictData> dictDataList = dicDataFeignClient.getDicDataByTypeName (DicDataTypeEnum.DEV_VOLTAGE.getName ( )).getData ( );
|
||||
|
||||
|
||||
final Date tempDate = new SimpleDateFormat ("yyyy-MM-dd").parse (dataDate);
|
||||
orgIdList.forEach (orgid -> {
|
||||
/*主网在运监测点*/
|
||||
List<PmsMonitorPO> pmsMonitorPOS = pmsMonitorPOService.qurymeasurementRunPoints (orgid);
|
||||
List<String> mysqlIndexList = pmsMonitorPOS.stream ( ).map (PmsMonitorPO::getId).collect (Collectors.toList ( ));
|
||||
if (CollectionUtil.isEmpty (mysqlIndexList)) {
|
||||
return;
|
||||
}
|
||||
/*过滤掉异常监测点*/
|
||||
QueryWrapper<RStatAbnormalDPO> rStatAbnormalDPOLambdaQueryWrapper = new QueryWrapper ( );
|
||||
rStatAbnormalDPOLambdaQueryWrapper.select ("measurementPointId").
|
||||
in ("measurement_point_id", mysqlIndexList).
|
||||
eq ("value_alarm", 1).
|
||||
eq ("DATE_FORMAT( data_date ,'%Y-%m-%d')", dataDate);
|
||||
List<RStatAbnormalDPO> rStatAbnormalDPOS = rStatAbnormalDPOMapper.selectList (rStatAbnormalDPOLambdaQueryWrapper);
|
||||
List<String> collect = rStatAbnormalDPOS.stream ( ).map (RStatAbnormalDPO::getMeasurementPointId).collect (Collectors.toList ( ));
|
||||
List<PmsMonitorPO> collect1 = pmsMonitorPOS.stream ( ).filter (temp -> collect.contains (temp.getId ( ))).collect (Collectors.toList ( ));
|
||||
// /*测试造的数据*/
|
||||
// List<PmsMonitorPO> collect1 = new ArrayList<> ();
|
||||
// PmsMonitorPO pmsMonitorPO = new PmsMonitorPO();
|
||||
// pmsMonitorPO.setVoltageLevel ("e3da890104e3c4ae1f005021411a1fd7");
|
||||
// pmsMonitorPO.setStatisticalInterval (3);
|
||||
// pmsMonitorPO.setId ("8696be1d170e05b7d848accc059f4558");
|
||||
// collect1.add (pmsMonitorPO);
|
||||
|
||||
collect1.forEach (temp -> {
|
||||
|
||||
Double voltage = getVoltage (temp.getVoltageLevel ( ), dictDataList);
|
||||
|
||||
/*2.查询DataV
|
||||
measurement_point_id 监测点编号
|
||||
data_date 时间
|
||||
phasic_type = A 相别
|
||||
value_type = AVG 数据类型
|
||||
*/
|
||||
/*统计间隔*/
|
||||
Integer statisticalInterval = temp.getStatisticalInterval ( );
|
||||
/*获取监测点当天的所有数据*/
|
||||
List<DataVFiveItemDTO> fiveItems = dataVInfluxdbService.getFiveItems (temp.getId (), dataDate,statisticalInterval);
|
||||
|
||||
/*过滤出有效接入分钟数量*/
|
||||
Integer count = calculateEffectiveMinute (fiveItems, pmsAbnormalRules, voltage);
|
||||
|
||||
RMpIntegrityDPO rMpIntegrityDPO = new RMpIntegrityDPO ( );
|
||||
rMpIntegrityDPO.setEffectiveMinuteCount (count * statisticalInterval);
|
||||
rMpIntegrityDPO.setDataDate (tempDate);
|
||||
rMpIntegrityDPOS.add (rMpIntegrityDPO);
|
||||
});
|
||||
});
|
||||
rMpIntegrityDPOService.saveOrUpdateBatch (rMpIntegrityDPOS, 500);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Description: 目前只计算日表
|
||||
* @Param: [primaryGridParam]
|
||||
* @return: void
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
private void hanlderOracleData(PrimaryGridParam primaryGridParam) {
|
||||
Integer type = primaryGridParam.getType ( );
|
||||
switch (type) {
|
||||
// case 1:
|
||||
// this.hanlderOracleYear (primaryGridParam);
|
||||
// break;
|
||||
// case 2:
|
||||
// this.hanlderOracleQtr (primaryGridParam);
|
||||
// break;
|
||||
// case 3:
|
||||
// this.hanlderOracleMonth (primaryGridParam);
|
||||
// break;
|
||||
case 5:
|
||||
this.hanlderOracleDay (primaryGridParam);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private void hanlderOracleDay(PrimaryGridParam primaryGridParam) {
|
||||
|
||||
List<String> orgIdList = primaryGridParam.getOrgIdList ( );
|
||||
String dataDate = primaryGridParam.getDataDate ( );
|
||||
List<RMpIntegrityDPO> rMpIntegrityDPOS = new ArrayList<> ( );
|
||||
|
||||
//1、取出规则
|
||||
List<PmsAbnormalRules> pmsAbnormalRules = pmsAbnormalRulesMapper.selectList (null);
|
||||
//2、取出电压字典
|
||||
List<DictData> dictDataList = dicDataFeignClient.getDicDataByTypeName (DicDataTypeEnum.DEV_VOLTAGE.getName ( )).getData ( );
|
||||
|
||||
|
||||
final Date tempDate = new SimpleDateFormat ("yyyy-MM-dd").parse (dataDate);
|
||||
orgIdList.forEach (orgid -> {
|
||||
/*主网在运监测点*/
|
||||
List<PmsMonitorPO> pmsMonitorPOS = pmsMonitorPOService.qurymeasurementRunPoints (orgid);
|
||||
List<String> mysqlIndexList = pmsMonitorPOS.stream ( ).map (PmsMonitorPO::getId).collect (Collectors.toList ( ));
|
||||
if (CollectionUtil.isEmpty (mysqlIndexList)) {
|
||||
return;
|
||||
}
|
||||
/*过滤掉异常监测点*/
|
||||
QueryWrapper<RStatAbnormalDPO> rStatAbnormalDPOLambdaQueryWrapper = new QueryWrapper ( );
|
||||
rStatAbnormalDPOLambdaQueryWrapper.select ("measurementPointId").
|
||||
in ("measurement_point_id", mysqlIndexList).
|
||||
eq ("value_alarm", 1).
|
||||
eq ("DATE_FORMAT( data_date ,'%Y-%m-%d')", dataDate);
|
||||
List<RStatAbnormalDPO> rStatAbnormalDPOS = rStatAbnormalDPOMapper.selectList (rStatAbnormalDPOLambdaQueryWrapper);
|
||||
List<String> collect = rStatAbnormalDPOS.stream ( ).map (RStatAbnormalDPO::getMeasurementPointId).collect (Collectors.toList ( ));
|
||||
List<PmsMonitorPO> collect1 = pmsMonitorPOS.stream ( ).filter (temp -> collect.contains (temp.getId ( ))).collect (Collectors.toList ( ));
|
||||
/*测试造的数据*/
|
||||
// List<PmsMonitorPO> collect1 = new ArrayList<> ();
|
||||
// PmsMonitorPO pmsMonitorPO = new PmsMonitorPO();
|
||||
// pmsMonitorPO.setVoltageLevel ("e3da890104e3c4ae1f005021411a1fd7");
|
||||
// pmsMonitorPO.setId ("666f03ed54f2288090f06d957d2d7b07");
|
||||
// pmsMonitorPO.setStatisticalInterval (3);
|
||||
// collect1.add (pmsMonitorPO);
|
||||
collect1.forEach (temp -> {
|
||||
|
||||
Double voltage = getVoltage (temp.getVoltageLevel ( ), dictDataList);
|
||||
|
||||
/*2.查询DataV
|
||||
measurement_point_id 监测点编号
|
||||
data_date 时间
|
||||
phasic_type = A 相别
|
||||
value_type = AVG 数据类型
|
||||
*/
|
||||
|
||||
/*获取mysql与Oracle监测点id对应关系*/
|
||||
|
||||
PqLinedetailPO pqLinedetailPO = pqLinedetailPOService.getOracleIndexIdByMonitorId (temp.getId ( ));
|
||||
|
||||
/*获取监测点当天的所有数据*/
|
||||
List<DataVFiveItemDTO> fiveItems = dataVOraclePOService.getFiveItems (pqLinedetailPO.getLineIndex ( ), dataDate);
|
||||
/*过滤出有效接入分钟数量*/
|
||||
Integer count = calculateEffectiveMinute (fiveItems, pmsAbnormalRules, voltage);
|
||||
/*统计间隔*/
|
||||
Integer statisticalInterval = temp.getStatisticalInterval ( );
|
||||
RMpIntegrityDPO rMpIntegrityDPO = new RMpIntegrityDPO ( );
|
||||
rMpIntegrityDPO.setEffectiveMinuteCount (count * statisticalInterval);
|
||||
rMpIntegrityDPO.setDataDate (tempDate);
|
||||
rMpIntegrityDPOS.add (rMpIntegrityDPO);
|
||||
});
|
||||
});
|
||||
rMpIntegrityDPOService.saveOrUpdateBatch (rMpIntegrityDPOS, 500);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @Description: 3、频率在【45,55】之间;
|
||||
* 4、相电压有效值在【0.85p.u.,1.2p.u.】之间;p.u=电压等级/1.732
|
||||
* 5、线电压有效值在【0.85p.u.,1.2p.u.】之间;p.u=电压等级
|
||||
* 6、电压总谐波畸变率在【0.1%,20%】之间;
|
||||
* 7、负序电压不平衡度在【0,20%】。满足以上条件则是一条有效数据
|
||||
* @Param: [fiveItems, pmsAbnormalRules, voltage]
|
||||
* @return: java.lang.Integer
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
private Integer calculateEffectiveMinute(List<DataVFiveItemDTO> fiveItems, List<PmsAbnormalRules> pmsAbnormalRules, Double voltage) {
|
||||
Integer result = 0;
|
||||
|
||||
for (DataVFiveItemDTO fiveItem : fiveItems) {
|
||||
Double freqMax = fiveItem.getFreqMax ();
|
||||
Double freqMin = fiveItem.getFreqMin ();
|
||||
|
||||
Double rmsMax = fiveItem.getRmsMax ();
|
||||
Double rmsMin = fiveItem.getRmsMin ();
|
||||
Double vThdMax = fiveItem.getVThdMax ();
|
||||
Double vThdMin = fiveItem.getVThdMin ();
|
||||
|
||||
Double vUnbalanceMax = fiveItem.getVUnbalanceMax ();
|
||||
Double vUnbalanceMin = fiveItem.getVUnbalanceMin ();
|
||||
Double rmsLvrMax = fiveItem.getRmsLvrMax ();
|
||||
Double rmsLvrMin = fiveItem.getRmsLvrMin ();
|
||||
|
||||
|
||||
PmsAbnormalRules freqLimit = pmsAbnormalRules.stream ( ).filter (temp -> Objects.equals (temp.getTarget ( ), Param.TARGET_FREQ)).collect (Collectors.toList ( )).get (0);
|
||||
PmsAbnormalRules rmsLimit = pmsAbnormalRules.stream ( ).filter (temp -> Objects.equals (temp.getTarget ( ), Param.TARGET_RMS)).collect (Collectors.toList ( )).get (0);
|
||||
PmsAbnormalRules rms_lvrLimit = pmsAbnormalRules.stream ( ).filter (temp -> Objects.equals (temp.getTarget ( ), Param.TARGET_RMS_LVR)).collect (Collectors.toList ( )).get (0);
|
||||
PmsAbnormalRules v_thdLimit = pmsAbnormalRules.stream ( ).filter (temp -> Objects.equals (temp.getTarget ( ), Param.TARGET_V_THD)).collect (Collectors.toList ( )).get (0);
|
||||
PmsAbnormalRules v_unbalanceLimit = pmsAbnormalRules.stream ( ).filter (temp -> Objects.equals (temp.getTarget ( ), Param.TARGET_V_UNBALANCE)).collect (Collectors.toList ( )).get (0);
|
||||
|
||||
if (freqLimit.getLowerLimit ( ) <= freqMin&&freqMax <= freqLimit.getUpperLimit ( ) &&
|
||||
rmsLimit.getLowerLimit ( ) * (voltage / rmsMin) <= rmsMax&&rmsMax <= rmsLimit.getUpperLimit ( ) * (voltage / 1.732) &&
|
||||
rms_lvrLimit.getLowerLimit ( )*voltage <= rmsLvrMin&&rmsLvrMax <= rms_lvrLimit.getUpperLimit ( )*voltage &&
|
||||
v_thdLimit.getLowerLimit ( ) <= vThdMin&&vThdMax <= v_thdLimit.getUpperLimit ( ) &&
|
||||
v_unbalanceLimit.getLowerLimit ( ) <= vUnbalanceMin&&vUnbalanceMax <= v_unbalanceLimit.getUpperLimit ( )
|
||||
|
||||
) {
|
||||
result++;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Description: 根据电压字典获取电压等级
|
||||
* @Param: [id, dictDataList]
|
||||
* @return: java.lang.Double
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
private Double getVoltage(String id, List<DictData> dictDataList) {
|
||||
for (DictData dictData : dictDataList) {
|
||||
if (dictData.getId ( ).equals (id)) {
|
||||
Double result = Double.valueOf (dictData.getValue ( ));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import com.njcn.prepare.harmonic.pojo.dto.MonitorDataIntegrityDTO;
|
||||
import com.njcn.prepare.harmonic.pojo.oracle.PqLinedetailPO;
|
||||
import com.njcn.prepare.harmonic.pojo.param.PrimaryGridDataIntegrityParam;
|
||||
import com.njcn.prepare.harmonic.pojo.param.PrimaryGridParam;
|
||||
import com.njcn.prepare.harmonic.service.influxdb.DataVInfluxdbService;
|
||||
import com.njcn.prepare.harmonic.service.mysql.area.*;
|
||||
import com.njcn.prepare.harmonic.service.oracle.DataVOraclePOService;
|
||||
import com.njcn.prepare.harmonic.service.oracle.PqLinedetailPOService;
|
||||
@@ -51,7 +52,8 @@ public class PrimaryGridDataServiceImpl implements PrimaryGridDataService {
|
||||
private @Autowired
|
||||
PmsTerminalPOService pmsTerminalPOService;
|
||||
|
||||
|
||||
private @Autowired
|
||||
DataVInfluxdbService dataVInfluxdbService;
|
||||
|
||||
private @Autowired
|
||||
PqLinedetailPOService pqLinedetailPOService;
|
||||
@@ -159,7 +161,88 @@ public class PrimaryGridDataServiceImpl implements PrimaryGridDataService {
|
||||
* @Date: 2022/11/25
|
||||
*/
|
||||
private void hanlderInfludxbData(PrimaryGridParam primaryGridParam) {
|
||||
Integer type = primaryGridParam.getType ( );
|
||||
/*月表,季表,年表都是重日表生成,不区分oralce,influxdb*/
|
||||
switch (type) {
|
||||
case 1:
|
||||
this.hanlderOracleYear (primaryGridParam);
|
||||
break;
|
||||
case 2:
|
||||
this.hanlderOracleQtr (primaryGridParam);
|
||||
break;
|
||||
case 3:
|
||||
this.hanlderOracleMonth (primaryGridParam);
|
||||
break;
|
||||
case 5:
|
||||
this.hanlderInfluxdbDay (primaryGridParam);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@SneakyThrows
|
||||
private void hanlderInfluxdbDay(PrimaryGridParam primaryGridParam) {
|
||||
List<String> orgIdList = primaryGridParam.getOrgIdList ( );
|
||||
String dataDate = primaryGridParam.getDataDate ( );
|
||||
List<ROperatingIndexDPO> rOperatingIndexDPOList = new ArrayList<> ( );
|
||||
|
||||
final Date tempDate = new SimpleDateFormat ("yyyy-MM-dd").parse(dataDate);
|
||||
|
||||
orgIdList.forEach (orgid -> {
|
||||
|
||||
/*measurement_run_points:在运监测点个数*/
|
||||
List<PmsMonitorPO> pmsMonitorPOS = pmsMonitorPOService.qurymeasurementRunPoints (orgid);
|
||||
Integer measurement_run_points = pmsMonitorPOS.size ( );
|
||||
|
||||
List<String> mysqlIndexList = pmsMonitorPOS.stream ( ).map (PmsMonitorPO::getId).collect (Collectors.toList ( ));
|
||||
|
||||
/*主网单位在线监测点数 transit_measurement_points*/
|
||||
Integer transit_measurement_points = dataVInfluxdbService.queryTransitMeasurementPoints(mysqlIndexList,primaryGridParam.getDataDate (),"A");
|
||||
|
||||
/*主网单位有效接入监测点个数 effective_access_measurement_count*/
|
||||
Integer effective_access_measurement_count = this.queryEffectiveAccessMeasurementCount(mysqlIndexList,primaryGridParam.getDataDate ());
|
||||
|
||||
/*监测终端数量 online_measurement_points*/
|
||||
List<PmsTerminalPO> pmsTerminalPOS = pmsTerminalPOService.queryOnlineMeasurementPoints(orgid);
|
||||
Integer online_measurement_points = pmsTerminalPOS.size ();
|
||||
|
||||
/*在运监测终端个数 online_measurement_count*/
|
||||
String state = redisUtil.getStringByKey (NAME_KEY+
|
||||
SPLIT_SIGN+ DicDataTypeEnum.DEV_STATUS.getCode ( )+
|
||||
SPLIT_SIGN+ DicDataEnum.RUNNING.getCode ( ));
|
||||
Integer online_measurement_count = Integer.valueOf (pmsTerminalPOS.stream ( ).filter (temp -> Objects.equals (temp.getTerminalState ( ),state)).count ( )+"");
|
||||
|
||||
/*主网单位数据完整率 data_integrity_rate*/
|
||||
double data_integrity_rate=0.00;
|
||||
List<MonitorDataIntegrityDTO> monitorDataIntegrityDTOList = rMpIntegrityDPOService.calculateDataIntegrity (mysqlIndexList, dataDate);
|
||||
/*求平均值*/
|
||||
if(!CollectionUtils.isEmpty (monitorDataIntegrityDTOList)){
|
||||
data_integrity_rate = monitorDataIntegrityDTOList.stream ( ).mapToDouble (temp -> {
|
||||
return temp.getDataIntegrity ( ).doubleValue ( );
|
||||
}).average ( ).getAsDouble ( );
|
||||
}
|
||||
|
||||
|
||||
/*主网单位数据异常监测点数日统计 is_unusual*/
|
||||
Integer is_unusual =this.queryIsUnusualCount(mysqlIndexList,primaryGridParam.getDataDate ());
|
||||
|
||||
ROperatingIndexDPO rOperatingIndexDPO = new ROperatingIndexDPO( );
|
||||
rOperatingIndexDPO.setOrgNo (orgid);
|
||||
rOperatingIndexDPO.setDataDate (tempDate);
|
||||
rOperatingIndexDPO.setMeasurementRunPoints (measurement_run_points);
|
||||
rOperatingIndexDPO.setTransitMeasurementPoints (transit_measurement_points);
|
||||
rOperatingIndexDPO.setEffectiveAccessMeasurementCount (effective_access_measurement_count);
|
||||
rOperatingIndexDPO.setOnlineMeasurementPoints (online_measurement_points);
|
||||
rOperatingIndexDPO.setOnlineMeasurementCount (online_measurement_count);
|
||||
rOperatingIndexDPO.setDataIntegrityRate (data_integrity_rate);
|
||||
rOperatingIndexDPO.setIsUnusual (is_unusual>0?1:0);
|
||||
rOperatingIndexDPOList.add (rOperatingIndexDPO);
|
||||
});
|
||||
if(!CollectionUtils.isEmpty (rOperatingIndexDPOList)){
|
||||
rOperatingIndexDPOService.saveOrUpdateBatchByMultiId (rOperatingIndexDPOList,30);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @Description: 处理Oracle数据
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.njcn.prepare.harmonic.service.mysql.area;
|
||||
|
||||
import com.njcn.prepare.harmonic.pojo.param.PrimaryGridParam;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/23 16:04【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
public interface EffectiveMinuteCountService {
|
||||
/**
|
||||
* @Description: 主网有效监测时长计算
|
||||
* @Param: [primaryGridParam]
|
||||
* @return: void
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
void effectiveMinuteCount(PrimaryGridParam primaryGridParam);
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.njcn.prepare.harmonic.service.oracle;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.njcn.prepare.harmonic.pojo.dto.DataVFiveItemDTO;
|
||||
import com.njcn.prepare.harmonic.pojo.oracle.DataVOraclePO;
|
||||
import com.njcn.prepare.harmonic.pojo.vo.DataVOracleVO;
|
||||
|
||||
@@ -40,4 +41,13 @@ public interface DataVOraclePOService extends IService<DataVOraclePO>{
|
||||
* @return
|
||||
*/
|
||||
Double queryVThdMax(Integer lineId,String datadate);
|
||||
/**
|
||||
* @Description: 获取监测点当天数据根据
|
||||
* @Param: [lineId, date]
|
||||
* @return: java.util.List<com.njcn.prepare.harmonic.pojo.vo.DataVOracleVO>
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
List<DataVFiveItemDTO> getFiveItems(Integer lineId, String date);
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.baomidou.dynamic.datasource.annotation.DS;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.njcn.prepare.harmonic.mapper.oracle.DataVOraclePOMapper;
|
||||
import com.njcn.prepare.harmonic.pojo.dto.DataVFiveItemDTO;
|
||||
import com.njcn.prepare.harmonic.pojo.oracle.DataVOraclePO;
|
||||
import com.njcn.prepare.harmonic.pojo.vo.DataVOracleVO;
|
||||
import com.njcn.prepare.harmonic.service.oracle.DataVOraclePOService;
|
||||
@@ -109,4 +110,21 @@ public class DataVOraclePOServiceImpl extends ServiceImpl<DataVOraclePOMapper, D
|
||||
Double vThdMax = dataVOraclePO.getVThdMax ( );
|
||||
return vThdMax;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param lineId
|
||||
* @param date
|
||||
* @Description: 获取监测点当天数据
|
||||
* @Param: [lineId, date]
|
||||
* @return: java.util.List<com.njcn.prepare.harmonic.pojo.vo.DataVOracleVO>
|
||||
* @Author: clam
|
||||
* @Date: 2023/2/23
|
||||
*/
|
||||
@Override
|
||||
public List<DataVFiveItemDTO> getFiveItems(Integer lineId, String date) {
|
||||
|
||||
List<DataVFiveItemDTO> collect = dataVOraclePOMapper.getFiveItems(lineId,date);
|
||||
|
||||
return collect;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,6 @@ public class PqsEventdetailServiceImpl extends MppServiceImpl<PqsEventdetailMapp
|
||||
|
||||
Integer integer = pqsEventdetailMapper.selectCount (queryWrapper);
|
||||
|
||||
|
||||
return integer;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package com.njcn.prepare.harmonic.pojo.dto;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class DataVFiveItemDTO {
|
||||
|
||||
@ApiModelProperty("监测点ID")
|
||||
private Integer lineid;
|
||||
|
||||
@ApiModelProperty("时间")
|
||||
private Date timeid;
|
||||
|
||||
@ApiModelProperty("相别")
|
||||
private String phasicType;
|
||||
|
||||
@ApiModelProperty("频率平均值实时量测值MAX")
|
||||
private Double freqMax;
|
||||
|
||||
@ApiModelProperty("频率平均值实时量测值MIN")
|
||||
private Double freqMin;
|
||||
|
||||
@ApiModelProperty("相电压有效值平均值实时量测值MAX")
|
||||
private Double rmsMax;
|
||||
|
||||
@ApiModelProperty("相电压有效值平均值实时量测值MIN")
|
||||
private Double rmsMin;
|
||||
|
||||
@ApiModelProperty("线电压有效值平均值实时量测值MAX")
|
||||
private Double rmsLvrMax;
|
||||
|
||||
@ApiModelProperty("线电压有效值平均值实时量测值MIN")
|
||||
private Double rmsLvrMin;
|
||||
|
||||
@ApiModelProperty("电压总谐波畸变率平均值实时量测值量MAX")
|
||||
private Double vThdMax;
|
||||
|
||||
@ApiModelProperty("电压总谐波畸变率平均值实时量测值量MIN")
|
||||
private Double vThdMin;
|
||||
|
||||
@ApiModelProperty("三相电压负序不平衡度平均值实时量测值MAX")
|
||||
private Double vUnbalanceMax;
|
||||
|
||||
@ApiModelProperty("三相电压负序不平衡度平均值实时量测值MIN")
|
||||
private Double vUnbalanceMin;
|
||||
|
||||
@ApiModelProperty("频率平均值数量")
|
||||
private Integer freqCount;
|
||||
|
||||
@ApiModelProperty("相电压有效值平均值数量")
|
||||
private Integer rmsCount;
|
||||
|
||||
@ApiModelProperty("线电压有效值平均值数量")
|
||||
private Integer rmsLvrCount;
|
||||
|
||||
@ApiModelProperty("电压总谐波畸变率平均值数量")
|
||||
private Integer vThdCount;
|
||||
|
||||
@ApiModelProperty("三相电压负序不平衡度平均值数量")
|
||||
private Integer vUnbalanceCount;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.njcn.prepare.harmonic.pojo.dto;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* Description:
|
||||
* 接口文档访问地址:http://serverIP:port/swagger-ui.html
|
||||
* Date: 2023/2/13 10:58【需求编号】
|
||||
*
|
||||
* @author clam
|
||||
* @version V1.0.0
|
||||
*/
|
||||
@Data
|
||||
public class OverLimitFlagDTO {
|
||||
@ApiModelProperty("监测点ID(台区id)")
|
||||
private String lineId;
|
||||
@ApiModelProperty("越限开始时间")
|
||||
private LocalDateTime startTime;
|
||||
@ApiModelProperty("越限结束时间")
|
||||
private LocalDateTime endTime ;
|
||||
@ApiModelProperty("越限类型")
|
||||
private String overLimtType;
|
||||
@ApiModelProperty("越限标志")
|
||||
private Integer overLimtFlag;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.njcn.prepare.harmonic.pojo.param;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author clam
|
||||
* Date: 2022/10/20 11:41
|
||||
* @version V1.0.0
|
||||
*/
|
||||
@Data
|
||||
public class WorkOrderCreateParam {
|
||||
|
||||
@ApiModelProperty(name = "orgIdList",value = "单位Id")
|
||||
private List<String> orgIdList;
|
||||
|
||||
@ApiModelProperty(name = "type",value = "报表类型,1,年,2季,3月,4周,5日")
|
||||
@NotNull(message = "报表类型不可为空")
|
||||
private Integer type;
|
||||
|
||||
@ApiModelProperty(name = "dataDate",value = "时间")
|
||||
@NotBlank(message = "报表时间不可为空")
|
||||
private String dataDate;
|
||||
|
||||
@ApiModelProperty(name = "dataSource",value = "数据源 0:oracle;1:influxdb")
|
||||
@NotBlank(message = "数据源")
|
||||
private Integer dataSource;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user