合格率报告功能

This commit is contained in:
2023-06-08 10:07:20 +08:00
parent 1f2bc40a0a
commit a82529a088
26 changed files with 802 additions and 120 deletions

View File

@@ -1,5 +1,6 @@
package com.njcn.harmonic.controller.report;
import cn.hutool.core.date.TimeInterval;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
@@ -16,12 +17,15 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.validation.annotation.Validated;
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.util.List;
/**
* pqs
* 合格率报告
@@ -40,16 +44,19 @@ public class QualifiedReport extends BaseController {
/**
* 合格率报告
* @author cdf
* @date \
* @date 2023/6/7
*/
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/page")
@ApiOperation("合格率报告")
@PostMapping("/pageTable")
@ApiOperation("合格率报告_列表")
@ApiImplicitParam(name = "qualifiedReportParam", value = "合格率报告参数", required = true)
public HttpResult<FpyReportDTO> page(@RequestBody @Validated QualifiedReportParam qualifiedReportParam) {
String methodDescribe = getMethodDescribe("page");
//AssesVO list = assesService.getQualityAssessData(pulicTimeStatisParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
public HttpResult<List<FpyReportDTO>> pageTable(@RequestBody @Validated QualifiedReportParam qualifiedReportParam) {
TimeInterval timeInterval = new TimeInterval();
String methodDescribe = getMethodDescribe("pageTable");
List<FpyReportDTO> result = qualifiedReportService.pageTable(qualifiedReportParam);
log.info("合格率报告执行时长:"+timeInterval.interval());
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}

View File

@@ -0,0 +1,32 @@
package com.njcn.harmonic.mapper.report;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* pqs
* 合格率报告
* @author cdf
* @date 2023/6/7
*/
public interface QualifiedReportMapper {
/**
* 获取合格率详情
* @author cdf
* @date 2023/6/8
*/
List<Map<String,Object>> getLimitRateData(@Param("page") Page<List<Map<String,Object>>> page, @Param("lineIds")List<String> lineIds, @Param("startTime")LocalDateTime startTime, @Param("endTime")LocalDateTime endTime);
/**
*
* @author cdf
* @date 2023/6/8
*/
List<Map<String,Object>> getLimitRateDataIHarm(@Param("lineIds")List<String> lineIds, @Param("startTime")String startTime, @Param("endTime")String endTime);
}

View File

@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.njcn.harmonic.mapper.report.QualifiedReportMapper">
<select id="getLimitRateData" resultType="map">
select my_index,
SUM( UHARM_2_OVERTIME ) UHARM_2_OVERTIME,
SUM( IHARM_2_OVERTIME ) IHARM_2_OVERTIME,
SUM( UHARM_3_OVERTIME ) UHARM_3_OVERTIME,
SUM( IHARM_3_OVERTIME ) IHARM_3_OVERTIME,
SUM( UHARM_4_OVERTIME ) UHARM_4_OVERTIME,
SUM( IHARM_4_OVERTIME ) IHARM_4_OVERTIME,
SUM( UHARM_5_OVERTIME ) UHARM_5_OVERTIME,
SUM( IHARM_5_OVERTIME ) IHARM_5_OVERTIME,
SUM( UHARM_6_OVERTIME ) UHARM_6_OVERTIME,
SUM( IHARM_6_OVERTIME ) IHARM_6_OVERTIME,
SUM( UHARM_7_OVERTIME ) UHARM_7_OVERTIME,
SUM( IHARM_7_OVERTIME ) IHARM_7_OVERTIME,
SUM( UHARM_8_OVERTIME ) UHARM_8_OVERTIME,
SUM( IHARM_8_OVERTIME ) IHARM_8_OVERTIME,
SUM( UHARM_9_OVERTIME ) UHARM_9_OVERTIME,
SUM( IHARM_9_OVERTIME ) IHARM_9_OVERTIME,
SUM( UHARM_10_OVERTIME ) UHARM_10_OVERTIME,
SUM( IHARM_10_OVERTIME ) IHARM_10_OVERTIME,
SUM( UHARM_11_OVERTIME ) UHARM_11_OVERTIME,
SUM( IHARM_11_OVERTIME ) IHARM_11_OVERTIME,
SUM( UHARM_12_OVERTIME ) UHARM_12_OVERTIME,
SUM( IHARM_12_OVERTIME ) IHARM_12_OVERTIME,
SUM( UHARM_13_OVERTIME ) UHARM_13_OVERTIME,
SUM( IHARM_13_OVERTIME ) IHARM_13_OVERTIME,
SUM( UHARM_14_OVERTIME ) UHARM_14_OVERTIME,
SUM( IHARM_14_OVERTIME ) IHARM_14_OVERTIME,
SUM( UHARM_15_OVERTIME ) UHARM_15_OVERTIME,
SUM( IHARM_15_OVERTIME ) IHARM_15_OVERTIME,
SUM( UHARM_16_OVERTIME ) UHARM_16_OVERTIME,
SUM( IHARM_16_OVERTIME ) IHARM_16_OVERTIME,
SUM( UHARM_17_OVERTIME ) UHARM_17_OVERTIME,
SUM( IHARM_17_OVERTIME ) IHARM_17_OVERTIME,
SUM( UHARM_18_OVERTIME ) UHARM_18_OVERTIME,
SUM( IHARM_18_OVERTIME ) IHARM_18_OVERTIME,
SUM( UHARM_19_OVERTIME ) UHARM_19_OVERTIME,
SUM( IHARM_19_OVERTIME ) IHARM_19_OVERTIME,
SUM( UHARM_20_OVERTIME ) UHARM_20_OVERTIME,
SUM( IHARM_20_OVERTIME ) IHARM_20_OVERTIME,
SUM( UHARM_21_OVERTIME ) UHARM_21_OVERTIME,
SUM( IHARM_21_OVERTIME ) IHARM_21_OVERTIME,
SUM( UHARM_22_OVERTIME ) UHARM_22_OVERTIME,
SUM( IHARM_22_OVERTIME ) IHARM_22_OVERTIME,
SUM( UHARM_23_OVERTIME ) UHARM_23_OVERTIME,
SUM( IHARM_23_OVERTIME ) IHARM_23_OVERTIME,
SUM( UHARM_24_OVERTIME ) UHARM_24_OVERTIME,
SUM( IHARM_24_OVERTIME ) IHARM_24_OVERTIME,
SUM( UHARM_25_OVERTIME ) UHARM_25_OVERTIME,
SUM( IHARM_25_OVERTIME ) IHARM_25_OVERTIME,
SUM( VOLTAGE_DEV_OVERTIME ) VOLTAGE_DEV_OVERTIME,
SUM( UABERRANCE_OVERTIME ) UABERRANCE_OVERTIME,
SUM( UBALANCE_OVERTIME ) UBALANCE_OVERTIME,
SUM( FLICKER_OVERTIME ) FLICKER_OVERTIME,
SUM( flicker_all_time ) FLICKET_ALL_TIME,
sum( Freq_Dev_OverTime ) FREQ_DEV_OVERTIME,
SUM( ALL_TIME ) ALLTIME
FROM
r_stat_limit_target_d
WHERE
my_index in
<foreach collection="lineIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
and time_id BETWEEN #{startTime} AND #{endTime}
AND Phasic_Type = 'T'
group by MY_INDEX
</select>
<select id="getLimitRateDataIHarm" resultType="map">
select line_id MYINDEX,
max( I_2 ) IHARM_2_OVERTIME,
max( I_3 ) IHARM_3_OVERTIME,
max( I_4 ) IHARM_4_OVERTIME,
max( I_5 ) IHARM_5_OVERTIME,
max( I_6 ) IHARM_6_OVERTIME,
max( I_7 ) IHARM_7_OVERTIME,
max( I_8 ) IHARM_8_OVERTIME,
max( I_9 ) IHARM_9_OVERTIME,
max( I_10 ) IHARM_10_OVERTIME,
max( I_11 ) IHARM_11_OVERTIME,
max( I_12 ) IHARM_12_OVERTIME,
max( I_13 ) IHARM_13_OVERTIME,
max( I_14 ) IHARM_14_OVERTIME,
max( I_15 ) IHARM_15_OVERTIME,
max( I_16 ) IHARM_16_OVERTIME,
max( I_17 ) IHARM_17_OVERTIME,
max( I_18 ) IHARM_18_OVERTIME,
max( I_19 ) IHARM_19_OVERTIME,
max( I_20 ) IHARM_20_OVERTIME,
max( I_21 ) IHARM_21_OVERTIME,
max( I_22 ) IHARM_22_OVERTIME,
max( I_23 ) IHARM_23_OVERTIME,
max( I_24 ) IHARM_24_OVERTIME,
max( I_25 ) IHARM_25_OVERTIME
FROM r_stat_data_i_d
WHERE line_id in
<foreach collection="lineIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
and time BETWEEN #{startTime} AND #{endTime}
group by line_id
</select>
</mapper>

View File

@@ -6,6 +6,8 @@ import com.njcn.harmonic.pojo.param.QualifiedReportParam;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* pqs
*
@@ -15,9 +17,9 @@ import org.springframework.web.bind.annotation.RequestBody;
public interface QualifiedReportService {
/**
* 合格率报告
* 合格率报告_列表
* @author cdf
* @date \
* @date 2023/6/7
*/
HttpResult<FpyReportDTO> page(@RequestBody @Validated QualifiedReportParam qualifiedReportParam);
List<FpyReportDTO> pageTable(QualifiedReportParam qualifiedReportParam);
}

View File

@@ -1,11 +1,40 @@
package com.njcn.harmonic.service.majornetwork.impl;
import com.njcn.common.pojo.response.HttpResult;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.utils.PubUtils;
import com.njcn.device.biz.pojo.po.Overlimit;
import com.njcn.device.pq.api.GeneralDeviceInfoClient;
import com.njcn.device.pq.api.LineFeignClient;
import com.njcn.device.pq.api.LineIntegrityClient;
import com.njcn.device.pq.api.OverLimitClient;
import com.njcn.device.pq.pojo.param.LineBaseQueryParam;
import com.njcn.device.pq.pojo.po.RStatIntegrityD;
import com.njcn.device.pq.pojo.vo.AreaLineInfoVO;
import com.njcn.harmonic.mapper.report.QualifiedReportMapper;
import com.njcn.harmonic.pojo.dto.FpyReportDTO;
import com.njcn.harmonic.pojo.dto.FpyTagContent;
import com.njcn.harmonic.pojo.param.QualifiedReportParam;
import com.njcn.harmonic.pojo.po.report.EnumPass;
import com.njcn.harmonic.service.majornetwork.QualifiedReportService;
import com.njcn.web.factory.PageFactory;
import lombok.RequiredArgsConstructor;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Service;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* pqs
*
@@ -13,16 +42,177 @@ import org.springframework.stereotype.Service;
* @date 2023/5/31
*/
@Service
@RequiredArgsConstructor
public class QualifiedReportServiceImpl implements QualifiedReportService {
private final QualifiedReportMapper qualifiedReportMapper;
private final GeneralDeviceInfoClient generalDeviceInfoClient;
private final LineFeignClient lineFeignClient;
private final LineIntegrityClient lineIntegrityClient;
private final OverLimitClient overLimitClient;
@Override
public List<FpyReportDTO> pageTable(QualifiedReportParam qualifiedReportParam) {
List<FpyReportDTO> fpyReportDTOList = new ArrayList<>();
List<String> lineIds = generalDeviceInfoClient.deptGetRunLine(qualifiedReportParam.getDeptId()).getData();
if(CollUtil.isEmpty(lineIds)){
return fpyReportDTOList;
}
LineBaseQueryParam lineBaseQueryParam = new LineBaseQueryParam();
lineBaseQueryParam.setLineIds(lineIds);
lineBaseQueryParam.setSearchValue(qualifiedReportParam.getSearchValue());
List<AreaLineInfoVO> areaLineInfoVOList = lineFeignClient.getRichLineInfo(lineBaseQueryParam).getData();
List<String> lineNewIds = areaLineInfoVOList.stream().map(AreaLineInfoVO::getLineId).distinct().collect(Collectors.toList());
Map<String, AreaLineInfoVO> lineMap = areaLineInfoVOList.stream().collect(Collectors.toMap(AreaLineInfoVO::getLineId,Function.identity()));
List<Map<String,Object>> limitMap = qualifiedReportMapper.getLimitRateData(new Page<>(PageFactory.getPageNum(qualifiedReportParam),PageFactory.getPageSize(qualifiedReportParam)),lineNewIds, PubUtils.beginTimeToLocalDateTime(qualifiedReportParam.getBeginTime()),PubUtils.endTimeToLocalDateTime(qualifiedReportParam.getEndTime()));
List<String> realLineIds = limitMap.stream().map(item->item.get("my_index").toString()).distinct().collect(Collectors.toList());
List<Map<String, Object>> dayIhMapList = qualifiedReportMapper.getLimitRateDataIHarm(lineIds,qualifiedReportParam.getBeginTime(),qualifiedReportParam.getEndTime());
Map<String, Map<String, Object>> mapMap = dayIhMapList.stream().collect(Collectors.toMap(it->it.get("MYINDEX").toString(),Function.identity()));
if(CollUtil.isNotEmpty(limitMap)){
}
List<RStatIntegrityD> rStatIntegrityList = lineIntegrityClient.getIntegrityByLineIds(realLineIds,qualifiedReportParam.getBeginTime(),qualifiedReportParam.getEndTime()).getData();
Map<String, RStatIntegrityD> rStatIntegrityMap = rStatIntegrityList.stream().collect(Collectors.toMap(RStatIntegrityD::getLineIndex, Function.identity()));
List<Overlimit> overLimitList = overLimitClient.getOverLimitByLineIds(realLineIds).getData();
Map<String, Overlimit> overLimitMap = overLimitList.stream().collect(Collectors.toMap(Overlimit::getId, Function.identity()));
for(Map<String, Object> map:limitMap){
String lineId = map.get("my_index").toString();
Map<String, Object> mapOverLimit = new HashMap<>();
try {
BeanUtils.describe(overLimitMap.get(lineId)).forEach((key, value) -> mapOverLimit.put((String) key, value));
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
//获取平均值的最大值
Map<String, Object> iM = mapMap.get(lineId);
FpyTagContent fpyTagContent = calAllTag(map, mapOverLimit,iM);
FpyReportDTO fpyReportData = new FpyReportDTO();
if (lineMap.containsKey(lineId)) {
AreaLineInfoVO areaLineInfoVO = lineMap.get(lineId);
BeanUtil.copyProperties(areaLineInfoVO, fpyReportData);
fpyReportData.setHarmDes(fpyTagContent.getPassFlag());
fpyReportData.setPowerDes(fpyTagContent.getContent());
fpyReportDTOList.add(fpyReportData);
}
if(rStatIntegrityMap.containsKey(lineId)) {
RStatIntegrityD rStatIntegrityD = rStatIntegrityMap.get(lineId);
fpyReportData.setIntegrityValue(rStatIntegrityD.getIntegrityData());
}else {
fpyReportData.setIntegrityValue(3.14159f);
}
}
return fpyReportDTOList;
}
/**
* 合格率报告
* @author cdf
* @date
* 其他指标计算
*/
@Override
public HttpResult<FpyReportDTO> page(QualifiedReportParam qualifiedReportParam) {
return null;
private FpyTagContent calAllTag(Map<String, Object> map, Map<String, Object> mapOverLimit,Map<String, Object> iMap) {
StrBuilder content = new StrBuilder();
BigDecimal alltime = (BigDecimal) map.get("ALLTIME");
BigDecimal flicketAllTime = (BigDecimal)map.get("FLICKET_ALL_TIME");
FpyTagContent fpyTagContent = new FpyTagContent();
if(alltime.intValue() > 0) {
//频率偏差
BigDecimal freq = (BigDecimal) map.get("FREQ_DEV_OVERTIME");
if (freq.intValue() > 0) {
BigDecimal freqRate = alltime.subtract(freq).divide(alltime, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
content.append("频率偏差合格率").append(String.valueOf(freqRate.floatValue())).append("%;");
}
//电压偏差
BigDecimal voltageDev = (BigDecimal) map.get("VOLTAGE_DEV_OVERTIME");
if (voltageDev.intValue() > 0) {
BigDecimal voltageDevRate = alltime.subtract(voltageDev).divide(alltime, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
content.append("电压偏差合格率").append(String.valueOf(voltageDevRate.floatValue())).append("%;");
}
//三项不平衡
BigDecimal ubalance = (BigDecimal) map.get("UBALANCE_OVERTIME");
if (ubalance.intValue() > 0) {
BigDecimal ubalanceRate = alltime.subtract(ubalance).divide(alltime, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
content.append("三相电压不平衡合格率").append(String.valueOf(ubalanceRate.floatValue())).append("%;");
}
//闪变
BigDecimal flickOver = (BigDecimal) map.get("FLICKER_OVERTIME");
if (flickOver.intValue() > 0) {
BigDecimal flickOverRate = flicketAllTime.subtract(flickOver).divide(flicketAllTime, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
content.append("闪变合格率").append(String.valueOf(flickOverRate.floatValue())).append("%;");
}
//电压畸变
BigDecimal uab = (BigDecimal) map.get("UABERRANCE_OVERTIME");
BigDecimal uabRate = alltime.subtract(uab).divide(alltime, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
if (uabRate.floatValue() < 95) {
content.append("电压总畸变率").append(String.valueOf(uabRate.floatValue())).append("%;");
}
//计算组装谐波含电压有率
int flagV = 0;
for (int i = 2; i < 26; i++) {
BigDecimal v = (BigDecimal) map.get("UHARM_" + i + "_OVERTIME");
BigDecimal hegeRate = alltime.subtract(v).divide(alltime, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
if (hegeRate.floatValue() < 95) {
content.append(String.valueOf(i)).append("次谐波电压含有率合格率").append(String.valueOf(hegeRate.floatValue())).append("%;");
flagV++;
}
}
//计算组装谐波电流幅值
int flagI = 0;
for (int i = 2; i < 26; i++) {
String key = "IHARM_" + i + "_OVERTIME";
BigDecimal ih = (BigDecimal) map.get(key);
BigDecimal hegeRate = alltime.subtract(ih).divide(alltime, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
if (hegeRate.floatValue() < 95) {
BigDecimal maxI = (BigDecimal)iMap.get(key);
BigDecimal overLimit = new BigDecimal(mapOverLimit.get("iharm" + i).toString());
content.append(String.valueOf(i)).append("次谐波电流合格率").append(String.valueOf(hegeRate.floatValue())).append("%,限值为").append(String.valueOf(overLimit.floatValue())).append("A," + "最大值为").append(String.valueOf(maxI.setScale(2,RoundingMode.HALF_UP))).append("A;");
flagI++;
}
}
if(flagV==0 && flagI==0){
fpyTagContent.setPassFlag(EnumPass.PASS.getDescribe());
}else if(flagV>0 && flagI==0){
fpyTagContent.setPassFlag("谐波电压");
}else if(flagV==0 && flagI>0){
fpyTagContent.setPassFlag("谐波电流");
}else {
fpyTagContent.setPassFlag("谐波电压;谐波电流");
}
if(StrUtil.isBlank(content)){
fpyTagContent.setContent("合格;");
}else {
fpyTagContent.setContent(content.toString());
}
}else {
fpyTagContent.setPassFlag("暂无数据");
fpyTagContent.setContent("暂无数据;");
}
return fpyTagContent;
}
}