Ver código fonte

功能完善

zhouyang.xie 2 semanas atrás
pai
commit
6d85a3ed07

+ 47 - 37
src/main/java/com/energy/manage/analyse/controller/anomaly/AnomalyController.java

@@ -8,24 +8,26 @@ import com.energy.manage.analyse.domain.dto.AnomalyDTO;
 import com.energy.manage.analyse.domain.dto.AnomalyModelDTO;
 import com.energy.manage.analyse.domain.vo.anomaly.*;
 import com.energy.manage.analyse.domain.vo.healthscores.HealthscoresRegionVO;
+import com.energy.manage.analyse.po.anomaly.AnomalyModelPO;
 import com.energy.manage.analyse.service.anomaly.AnomalyService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
+
+import org.apache.ibatis.mapping.ResultMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
-
 /**
  * @author sy
  * @desc
  */
 @Slf4j
-@Api(value = "AnomalyController",tags = "风机异常检测查询接口")
+@Api(value = "AnomalyController", tags = "风机异常检测查询接口")
 @RestController
 @RequestMapping("/anomaly")
 public class AnomalyController extends BaseServiceController {
@@ -33,118 +35,126 @@ public class AnomalyController extends BaseServiceController {
     @Autowired
     private AnomalyService anomalyService;
 
+    @ApiOperation("查询数据完整度")
+    @PostMapping("/getDataCompleteness")
+    public ResultResp<List<DataCompletenessVO>> getDataCompleteness(@RequestParam(value = "fieldCode", required = false) String fieldCode,
+            @RequestParam(value = "dataType", required = false) String dataType,
+            @RequestParam(value = "datatime", required = false) String datatime) {
+        List<DataCompletenessVO> list = anomalyService.getDataCompleteness(fieldCode, dataType, datatime);
+        log.info("查询数据完整度 - datatime: {}, 结果数量: {}", datatime, list != null ? list.size() : 0);
+        return success(list);
+    }
 
     @ApiOperation("所有区域异常情况信息查询")
     @PostMapping("/getAnomalyRegionList")
     public ResultResp<List<AnomalyRegionVO>> getAnomalyRegionList(
-                                                                @ApiParam(value = "companyCode参数为平台内部公司编号", required = false)
-                                                                @RequestParam(value = "companyCode",required = false) String companyCode,
-                                                                @ApiParam(value = "datatime参数为查询日期,当参数为空时,默认查昨天日期的数据", required = false)
-                                                                @RequestParam(value = "datatime",required = false) String datatime){
-        List<AnomalyRegionVO> list =anomalyService.getAnomalyRegionList(companyCode,datatime);
+            @ApiParam(value = "companyCode参数为平台内部公司编号", required = false) @RequestParam(value = "companyCode", required = false) String companyCode,
+            @ApiParam(value = "datatime参数为查询日期,当参数为空时,默认查昨天日期的数据", required = false) @RequestParam(value = "datatime", required = false) String datatime) {
+        List<AnomalyRegionVO> list = anomalyService.getAnomalyRegionList(companyCode, datatime);
         return success(list);
     }
 
     @ApiOperation("查询异常风机概览")
     @PostMapping("/getAnomalyOverview")
-    public ResultResp<List<AnomalyOverviewVO>> getAnomalyOverview(@RequestBody List<AnomalyDTO> anomalyDTOList, HttpServletRequest request){
-        //判断是否是内网
+    public ResultResp<List<AnomalyOverviewVO>> getAnomalyOverview(@RequestBody List<AnomalyDTO> anomalyDTOList,
+            HttpServletRequest request) {
+        // 判断是否是内网
         boolean isIntranet = NetUtils.isIntranet(IPUtils.getIpAddr(request));
 
-        List<AnomalyOverviewVO> anomalyOverview= anomalyService.getAnomalyOverview(anomalyDTOList, isIntranet);
+        List<AnomalyOverviewVO> anomalyOverview = anomalyService.getAnomalyOverview(anomalyDTOList, isIntranet);
         return success(anomalyOverview);
     }
 
     @ApiOperation("查询柱状图")
     @PostMapping("/getBarChartStats")
-    public ResultResp<BarChartVO> getBarChartStats(@RequestBody AnomalyDTO anomalyDTO){
+    public ResultResp<BarChartVO> getBarChartStats(@RequestBody AnomalyDTO anomalyDTO) {
         BarChartVO barChartStats = anomalyService.getBarChartStats(anomalyDTO);
         return success(barChartStats);
     }
 
     @ApiOperation("查询热力图")
     @PostMapping("/getAnomalyModelMap")
-    public ResultResp<AnomalyChartVO> getAnomalyModelMap(@RequestBody AnomalyDTO anomalyDTO){
+    public ResultResp<AnomalyChartVO> getAnomalyModelMap(@RequestBody AnomalyDTO anomalyDTO) {
         AnomalyChartVO anomalyChartVO = anomalyService.getAnomalyModelMap(anomalyDTO);
         return success(anomalyChartVO);
     }
 
     @ApiOperation("风机卡片")
     @PostMapping("/getAnomalyModel")
-    public ResultResp<List<AnomalyModelVO>> getAnomalyModel(@RequestBody AnomalyDTO anomalyDTO){
+    public ResultResp<List<AnomalyModelVO>> getAnomalyModel(@RequestBody AnomalyDTO anomalyDTO) {
         List<AnomalyModelVO> anomalyModelVOS = anomalyService.getAnomalyModel(anomalyDTO);
         return success(anomalyModelVOS);
     }
 
-
     @ApiOperation("风速功率模块模块")
     @PostMapping("/getAnomalyWindpwr")
-    public ResultResp<AnomalyWindpwrVO> getAnomalyWindpwr(@RequestBody AnomalyModelDTO anomalyModelDTO, HttpServletRequest request){
+    public ResultResp<AnomalyWindpwrVO> getAnomalyWindpwr(@RequestBody AnomalyModelDTO anomalyModelDTO,
+            HttpServletRequest request) {
 
-        //判断是否是内网
+        // 判断是否是内网
         boolean isIntranet = NetUtils.isIntranet(IPUtils.getIpAddr(request));
-        AnomalyWindpwrVO anomalyWindpwrVO = anomalyService.getAnomalyWindpwr(anomalyModelDTO,isIntranet);
+        AnomalyWindpwrVO anomalyWindpwrVO = anomalyService.getAnomalyWindpwr(anomalyModelDTO, isIntranet);
         return success(anomalyWindpwrVO);
     }
 
-
     @ApiOperation("偏航模块模块")
     @PostMapping("/geAnomalyYaw")
-    public ResultResp<AnomalyYawVO> geAnomalyYaw(@RequestBody AnomalyModelDTO anomalyModelDTO, HttpServletRequest request){
-        log.warn("ip" + "=====>"+IPUtils.getIpAddr(request));
-        //判断是否是内网
+    public ResultResp<AnomalyYawVO> geAnomalyYaw(@RequestBody AnomalyModelDTO anomalyModelDTO,
+            HttpServletRequest request) {
+        log.warn("ip" + "=====>" + IPUtils.getIpAddr(request));
+        // 判断是否是内网
         boolean isIntranet = NetUtils.isIntranet(IPUtils.getIpAddr(request));
-        AnomalyYawVO anomalyYawVO = anomalyService.geAnomalyYaw(anomalyModelDTO,isIntranet);
+        AnomalyYawVO anomalyYawVO = anomalyService.geAnomalyYaw(anomalyModelDTO, isIntranet);
         return success(anomalyYawVO);
     }
 
     @ApiOperation("变桨模块模块")
     @PostMapping("/getAnomalyPitch")
-    public ResultResp<AnomalyPitchVO> getAnomalyPitch(@RequestBody AnomalyModelDTO anomalyModelDTO, HttpServletRequest request){
-        //判断是否是内网
+    public ResultResp<AnomalyPitchVO> getAnomalyPitch(@RequestBody AnomalyModelDTO anomalyModelDTO,
+            HttpServletRequest request) {
+        // 判断是否是内网
         boolean isIntranet = NetUtils.isIntranet(IPUtils.getIpAddr(request));
-        AnomalyPitchVO anomalyPitchVO = anomalyService.getAnomalyPitch(anomalyModelDTO,isIntranet);
+        AnomalyPitchVO anomalyPitchVO = anomalyService.getAnomalyPitch(anomalyModelDTO, isIntranet);
         return success(anomalyPitchVO);
     }
 
     @ApiOperation("气动性能")
     @PostMapping("/getAerodynamics")
-    public ResultResp<AnomalyAerodynamicsVO> getAerodynamics(@RequestBody AnomalyModelDTO anomalyModelDTO, HttpServletRequest request){
-        //判断是否是内网
+    public ResultResp<AnomalyAerodynamicsVO> getAerodynamics(@RequestBody AnomalyModelDTO anomalyModelDTO,
+            HttpServletRequest request) {
+        // 判断是否是内网
         boolean isIntranet = NetUtils.isIntranet(IPUtils.getIpAddr(request));
-        AnomalyAerodynamicsVO anomalyAerodynamicsVO = anomalyService.getAerodynamics(anomalyModelDTO,isIntranet);
+        AnomalyAerodynamicsVO anomalyAerodynamicsVO = anomalyService.getAerodynamics(anomalyModelDTO, isIntranet);
         return success(anomalyAerodynamicsVO);
     }
 
     @ApiOperation("运行状态模块模块")
     @PostMapping("/getAnomalyCtrlParam")
-    public ResultResp<AnomalyCtrlParamVO> getAnomalyCtrlParam(@RequestBody AnomalyModelDTO anomalyModelDTO,HttpServletRequest request){
-        //判断是否是内网
+    public ResultResp<AnomalyCtrlParamVO> getAnomalyCtrlParam(@RequestBody AnomalyModelDTO anomalyModelDTO,
+            HttpServletRequest request) {
+        // 判断是否是内网
         boolean isIntranet = NetUtils.isIntranet(IPUtils.getIpAddr(request));
-        AnomalyCtrlParamVO anomalyCtrlParamVO = anomalyService.getAnomalyCtrlParam(anomalyModelDTO,isIntranet);
+        AnomalyCtrlParamVO anomalyCtrlParamVO = anomalyService.getAnomalyCtrlParam(anomalyModelDTO, isIntranet);
         return success(anomalyCtrlParamVO);
     }
 
     @ApiOperation("获取模块异常趋势曲线图(支持年度分表+跨年跨表)")
     @PostMapping("/getPitchAnomalyTrend")
-    public ResultResp<List<AnomalyDailyVO>> getPitchAnomalyTrend(@RequestBody AnomalyModelDTO anomalyModelDTO){
+    public ResultResp<List<AnomalyDailyVO>> getPitchAnomalyTrend(@RequestBody AnomalyModelDTO anomalyModelDTO) {
         List<AnomalyDailyVO> anomalyDailyDTOS = anomalyService.getPitchAnomalyTrend(anomalyModelDTO);
         return success(anomalyDailyDTOS);
     }
 
-
-
     @ApiOperation("查询传感器异常台数 -- 雷达图")
     @PostMapping("/getAnomalySensorCount")
-    public ResultResp<AnomalySensorCountVO> getAnomalySensorCount(@RequestBody AnomalyDTO anomalyDTO){
+    public ResultResp<AnomalySensorCountVO> getAnomalySensorCount(@RequestBody AnomalyDTO anomalyDTO) {
         AnomalySensorCountVO anomalySensorCountVO = anomalyService.getAnomalySensorCount(anomalyDTO);
         return success(anomalySensorCountVO);
     }
 
-
     @ApiOperation("查询模块异常台数 -- 雷达图")
     @PostMapping("/getAnomalyModelCount")
-    public ResultResp<AnomalyCount> getAnomalyModelCount(@RequestBody AnomalyDTO anomalyDTO){
+    public ResultResp<AnomalyCount> getAnomalyModelCount(@RequestBody AnomalyDTO anomalyDTO) {
         AnomalyCount anomalyModelCount = anomalyService.getAnomalyModelCount(anomalyDTO);
         return success(anomalyModelCount);
     }

+ 53 - 0
src/main/java/com/energy/manage/analyse/domain/vo/anomaly/DataCompletenessVO.java

@@ -0,0 +1,53 @@
+package com.energy.manage.analyse.domain.vo.anomaly;
+
+import java.math.BigDecimal;
+
+import com.energy.manage.analyse.po.anomaly.AnomalyModelPO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Getter
+@Setter
+@ApiModel("数据完整度")
+public class DataCompletenessVO {
+    
+    @ApiModelProperty("主键编号")
+    private Integer id;
+
+    /**
+     * 风场id
+     */
+    @ApiModelProperty("风场id内部编号")
+    private String fieldId;
+
+    /**
+     * 机组id
+     */
+    @ApiModelProperty("机组id")
+    private String engineId;
+
+    @ApiModelProperty("机型型号")
+    private String machineTypeCode;
+
+    @ApiModelProperty ("分钟数据完整性")
+    private BigDecimal minuteDataCompleteness;
+
+    @ApiModelProperty ("秒数据完整性")
+    private BigDecimal secondDataCompleteness;
+
+    /**
+     * 数据来源时间,以天为单位
+     */
+    @ApiModelProperty("数据来源时间,以天为单位")
+    private Date sourceDatetime;
+
+    /**
+     * 风机名称
+     */
+    @ApiModelProperty("风机名称")
+    private String engineName;
+}

+ 16 - 1
src/main/java/com/energy/manage/analyse/mappers/anomaly/AnomalyWindfarmMapper.java

@@ -2,7 +2,6 @@ package com.energy.manage.analyse.mappers.anomaly;
 
 import com.energy.manage.analyse.common.mapper.MyMapper;
 import com.energy.manage.analyse.domain.vo.anomaly.*;
-import com.energy.manage.analyse.domain.vo.healthscores.HealthscoresRegionVO;
 import com.energy.manage.analyse.po.anomaly.AnomalyModelPO;
 import com.energy.manage.analyse.po.anomaly.AnomalyWindfarmPO;
 import com.energy.manage.analyse.po.anomaly.BaseAnomalyDetectorPO;
@@ -17,6 +16,22 @@ import java.util.List;
 @Repository
 public interface AnomalyWindfarmMapper extends MyMapper<AnomalyWindfarmPO> {
 
+         /**
+         * 数据完整度
+         * 
+         * @param fieldId
+         * @param dataType
+         * @param year
+         * @param beginTime
+         * @param endTime
+         * @return
+         */
+        List<AnomalyModelPO>  selectDataCompleteness(@Param("fieldId") String fieldId,
+                        @Param("dataType") String dataType,
+                        @Param("year") String year,
+                        @Param("beginTime") String beginTime,
+                        @Param("endTime") String endTime);
+
         /**
          * 查询区域异常情况信息
          * 

+ 6 - 0
src/main/java/com/energy/manage/analyse/po/anomaly/AnomalyModelPO.java

@@ -344,6 +344,12 @@ public class AnomalyModelPO {
     @ApiModelProperty("模块3(变桨)最小桨距角检测器测量值(相对基线漂移,单位°)")
     private BigDecimal model3PitchMinpitchRatio;
 
+    @ApiModelProperty ("分钟数据完整性")
+    private BigDecimal minuteDataCompleteness;
+
+    @ApiModelProperty ("秒数据完整性")
+    private BigDecimal secondDataCompleteness;
+
     /**
      * 数据来源时间,以天为单位
      */

+ 25 - 6
src/main/java/com/energy/manage/analyse/service/anomaly/AnomalyService.java

@@ -3,6 +3,7 @@ package com.energy.manage.analyse.service.anomaly;
 import com.energy.manage.analyse.domain.dto.AnomalyDTO;
 import com.energy.manage.analyse.domain.dto.AnomalyModelDTO;
 import com.energy.manage.analyse.domain.vo.anomaly.*;
+import com.energy.manage.analyse.po.anomaly.AnomalyModelPO;
 
 import java.util.List;
 
@@ -11,17 +12,28 @@ import java.util.List;
  */
 public interface AnomalyService {
 
-        /**
+    /**
+     * 数据完整度
+     * 
+     * @param fieldId
+     * @param dataType
+     * @param datatime
+     * @return
+     */
+    List<DataCompletenessVO> getDataCompleteness(String fieldCode, String dataType, String datatime);
+
+    /**
      * 查询区域异常情况信息集合
      * 
      * @param companyCode
      * @param datatime
      * @return
      */
-    List<AnomalyRegionVO> getAnomalyRegionList(String companyCode, String datatime) ;
+    List<AnomalyRegionVO> getAnomalyRegionList(String companyCode, String datatime);
 
     /**
      * 查询异常风机概览
+     * 
      * @param anomalyDTO
      * @return
      */
@@ -30,6 +42,7 @@ public interface AnomalyService {
 
     /**
      * 柱状图
+     * 
      * @param anomalyDTO
      * @return
      */
@@ -37,14 +50,15 @@ public interface AnomalyService {
 
     /**
      * 检测器热力图
+     * 
      * @param anomalyDTO
      * @return
      */
     AnomalyChartVO getAnomalyModelMap(AnomalyDTO anomalyDTO);
 
-
     /**
      * 风机卡片
+     * 
      * @param anomalyDTO
      * @return
      */
@@ -52,6 +66,7 @@ public interface AnomalyService {
 
     /**
      * 风速功率模块模块
+     * 
      * @param anomalyModelDTO
      * @return
      */
@@ -59,6 +74,7 @@ public interface AnomalyService {
 
     /**
      * 偏航模块模块
+     * 
      * @param anomalyModelDTO
      * @return
      */
@@ -66,6 +82,7 @@ public interface AnomalyService {
 
     /**
      * 变桨模块模块
+     * 
      * @param anomalyModelDTO
      * @return
      */
@@ -73,30 +90,31 @@ public interface AnomalyService {
 
     /**
      * 运行状态模块模块
+     * 
      * @param anomalyModelDTO
      * @return
      */
     AnomalyCtrlParamVO getAnomalyCtrlParam(AnomalyModelDTO anomalyModelDTO, boolean isIntranet);
 
-
     /**
      * 气动性能
+     * 
      * @param anomalyModelDTO
      * @return
      */
     AnomalyAerodynamicsVO getAerodynamics(AnomalyModelDTO anomalyModelDTO, boolean isIntranet);
 
-
     /**
      * 获取变桨模块异常趋势(支持年度分表+跨年跨表)
+     * 
      * @param anomalyModelDTO
      * @return
      */
     List<AnomalyDailyVO> getPitchAnomalyTrend(AnomalyModelDTO anomalyModelDTO);
 
-
     /**
      * 查询传感器异常台数
+     * 
      * @param anomalyDTO
      * @return
      */
@@ -104,6 +122,7 @@ public interface AnomalyService {
 
     /**
      * 异常检测模块统计异常风机台数
+     * 
      * @param anomalyDTO
      * @return
      */

+ 100 - 7
src/main/java/com/energy/manage/analyse/service/anomaly/impl/AnomalyServiceImpl.java

@@ -61,6 +61,97 @@ public class AnomalyServiceImpl implements AnomalyService {
     private static final String TABLE_PREFIX = "analyse.anomaly_model_";
 
     /**
+     * 数据完整度
+     * 
+     * @param fieldId
+     * @param dataType
+     * @param datatime
+     * @return
+     */
+    public List<DataCompletenessVO> getDataCompleteness(String fieldCode, String dataType, String datatime) {
+        String fieldId = null;
+        WindFieldPO windFieldPO = getWindField(fieldCode);
+        if (windFieldPO != null) {
+            fieldId = windFieldPO.getFieldId();
+        }
+
+        if (fieldId == null) {
+            log.warn(" 健康检测大唐内部风场编号没有对应台账fieldId  ");
+            return null;
+        }
+
+        String beginTime = null;
+        String endTime = null;
+        String year = null;
+
+        // 1. 时间区间计算逻辑
+        if (!StringUtils.isEmpty(datatime)) {
+            LocalDate baseDate = LocalDate.parse(datatime, DATE_FORMATTER);
+            LocalDate startDate;
+            LocalDate endDate = baseDate;
+
+            year = String.valueOf(baseDate.getYear());
+
+            if ("min".equals(dataType) || "all".equals(dataType)) {
+                // min / all 往前推90天
+                startDate = baseDate.minusDays(90);
+            } else if ("sec".equals(dataType)) {
+                // sec往前推14天
+                startDate = baseDate.minusDays(14);
+            } else {
+                // 非法dataType,兜底:使用基准日全天
+                log.warn("getDataCompleteness 非法dataType:{},使用当日区间", dataType);
+                startDate = baseDate;
+            }
+            beginTime = startDate.atStartOfDay().format(DATETIME_FORMATTER);
+            endTime = endDate.atTime(23, 59, 59).format(DATETIME_FORMATTER);
+        }
+
+        // 清除当前
+        DynamicDataSourceContextHolder.poll();
+        // 切换数据源
+        DynamicDataSourceContextHolder.push("slave");
+
+        List<AnomalyModelPO> list = null;
+        list = anomalyWindfarmMapper.selectDataCompleteness(fieldId, dataType, year, beginTime, endTime);
+
+        if (CollectionUtil.isEmpty(list)) {
+            // warn: 没有查询到对应的异常情况信息,可能是时间范围内没有数据,fieldId: {}, beginTime: {}, endTime: {}",
+            // fieldId,
+            return null;
+        }
+
+        // PO转VO,手动指定字段赋值,去除BeanUtil反射
+        List<DataCompletenessVO> anomalyModelVOS = list.stream()
+                .map(source -> {
+                    DataCompletenessVO vo = new DataCompletenessVO();
+                    vo.setId(source.getId());
+                    vo.setFieldId(source.getFieldId());
+                    vo.setEngineId(source.getEngineId());
+                    vo.setMinuteDataCompleteness(source.getMinuteDataCompleteness());
+                    vo.setSecondDataCompleteness(source.getSecondDataCompleteness());
+                    vo.setSourceDatetime(source.getSourceDatetime());
+                    return vo;
+                })
+                .collect(Collectors.toList());
+
+        Set<String> eids = anomalyModelVOS.parallelStream().map(DataCompletenessVO::getEngineId)
+                .collect(Collectors.toSet());
+        List<WindEngineGroupPO> windEngineGroupList = getWindEngineGroupList(eids);
+
+        // 构建Map,避免双重for循环,提升性能
+        Map<String, String> engineIdNameMap = windEngineGroupList.stream()
+                .collect(Collectors.toMap(WindEngineGroupPO::getEngineId, WindEngineGroupPO::getEngineName,
+                        (v1, v2) -> v1));
+
+        for (DataCompletenessVO vo : anomalyModelVOS) {
+            vo.setEngineName(engineIdNameMap.get(vo.getEngineId()));
+        }
+
+        return anomalyModelVOS;
+    }
+
+    /**
      * @param fids
      * @return
      */
@@ -149,7 +240,7 @@ public class AnomalyServiceImpl implements AnomalyService {
             regionAnomalyRegionVO = anomalyWindfarmMapper.getAnomalyListByFieldIds(fieldIds,
                     beginTime,
                     endTime);
-                    
+
             if (regionAnomalyRegionVO == null) {
                 log.warn("没有查询到对应的异常情况信息,可能是时间范围内没有数据,companyCode: {}, beginTime: {}, endTime: {}", companyCode,
                         beginTime, endTime);
@@ -212,17 +303,20 @@ public class AnomalyServiceImpl implements AnomalyService {
                 }
             }
 
-            vo.setModel1WindpwrPowercurveGraph(NetUtils.getFilePath(isIntranet,vo.getModel1WindpwrPowercurveGraph()));
+            vo.setModel1WindpwrPowercurveGraph(NetUtils.getFilePath(isIntranet, vo.getModel1WindpwrPowercurveGraph()));
             vo.setModel1WindpwrScatterGraph(NetUtils.getFilePath(isIntranet, vo.getModel1WindpwrScatterGraph()));
             vo.setModel2YawStaticyawGraph(NetUtils.getFilePath(isIntranet, vo.getModel2YawStaticyawGraph()));
             vo.setModel2YawCabletwistGraph(NetUtils.getFilePath(isIntranet, vo.getModel2YawCabletwistGraph()));
             vo.setModel2YawYawerrorGraph(NetUtils.getFilePath(isIntranet, vo.getModel2YawYawerrorGraph()));
             vo.setModel2YawYawcountGraph(NetUtils.getFilePath(isIntranet, vo.getModel2YawYawcountGraph()));
             vo.setModel3PitchPitchcoordGraph(NetUtils.getFilePath(isIntranet, vo.getModel3PitchPitchcoordGraph()));
-            vo.setModel3PitchPitchregulationGraph(NetUtils.getFilePath(isIntranet, vo.getModel3PitchPitchregulationGraph()));
+            vo.setModel3PitchPitchregulationGraph(
+                    NetUtils.getFilePath(isIntranet, vo.getModel3PitchPitchregulationGraph()));
             vo.setModel3PitchMinpitchGraph(NetUtils.getFilePath(isIntranet, vo.getModel3PitchMinpitchGraph()));
-            vo.setModel4CtrlparamPowerqualityGraph(NetUtils.getFilePath(isIntranet, vo.getModel4CtrlparamPowerqualityGraph()));
-            vo.setModel4CtrlparamOperationstateGraph(NetUtils.getFilePath(isIntranet, vo.getModel4CtrlparamOperationstateGraph()));
+            vo.setModel4CtrlparamPowerqualityGraph(
+                    NetUtils.getFilePath(isIntranet, vo.getModel4CtrlparamPowerqualityGraph()));
+            vo.setModel4CtrlparamOperationstateGraph(
+                    NetUtils.getFilePath(isIntranet, vo.getModel4CtrlparamOperationstateGraph()));
             vo.setModel4CtrlparamDeloadGraph(NetUtils.getFilePath(isIntranet, vo.getModel4CtrlparamDeloadGraph()));
             vo.setModel5AerodynamicsCpGraph(NetUtils.getFilePath(isIntranet, vo.getModel5AerodynamicsCpGraph()));
             vo.setModel5AerodynamicsTsrGraph(NetUtils.getFilePath(isIntranet, vo.getModel5AerodynamicsTsrGraph()));
@@ -642,7 +736,7 @@ public class AnomalyServiceImpl implements AnomalyService {
         // 逻辑关联异常列表
         AnomalyThermodynamicDiagramVO windPowerLogicAnomaly = null;
         AnomalyThermodynamicDiagramVO speedTorqueLogicAnomaly = null;
-        
+
         AnomalyThermodynamicDiagramVO sensorAnomalyFreeze = null;
 
         for (AnomalyModelPO anomalyModelPO : getAnomalyModelList) {
@@ -689,7 +783,6 @@ public class AnomalyServiceImpl implements AnomalyService {
             speedTorqueLogicAnomaly.setRatio(anomalyModelPO.getSensorAnomalySpeedRatio());
             speedTorqueLogicAnomalyList.add(speedTorqueLogicAnomaly);
 
-
             sensorAnomalyFreeze = new AnomalyThermodynamicDiagramVO();
             sensorAnomalyFreeze.setEngineName(engineMap.get(anomalyModelPO.getEngineId()));
             sensorAnomalyFreeze.setIfAbnorma(anomalyModelPO.getSensorAnomalyFreeze());

+ 42 - 1
src/main/resources/mybatis/anomaly/AnaomalyMapper.xml

@@ -161,9 +161,46 @@
         <result column="model2_yaw_yawcount_ratio" property="model2YawYawcountRatio" jdbcType="DECIMAL"/>
         <result column="model3_pitch_minpitch" property="model3PitchMinpitch" jdbcType="INTEGER"/>
         <result column="model3_pitch_minpitch_ratio" property="model3PitchMinpitchRatio" jdbcType="DECIMAL"/>
+        <result column="minute_data_completeness" property="minuteDataCompleteness" jdbcType="DECIMAL"/>
+        <result column="second_data_completeness" property="secondDataCompleteness" jdbcType="DECIMAL"/>
         <result property="sourceDatetime" column="source_datetime"/>
         <result property="createTime" column="create_time"/>
     </resultMap>
+
+    <!-- 查询数据完整度 -->
+    <select id="selectDataCompleteness" resultMap="AnomalyModelResultMap">
+    SELECT
+        id,
+        field_id,
+        engine_id,
+
+        <if test="dataType == 'min'">
+            minute_data_completeness
+        </if>
+        <if test="dataType == 'sec'">
+            second_data_completeness
+        </if>
+        <if test="dataType == 'all'">
+            minute_data_completeness,
+            second_data_completeness
+        </if>,
+        source_datetime
+    FROM
+        anomaly_model_${year}
+    where 1=1
+        <if test="fieldId!=null">
+            and  field_id = #{fieldId}
+        </if>
+        <if test="beginTime != null and beginTime != ''">
+            and source_datetime
+            <![CDATA[>= ]]> #{beginTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and source_datetime
+            <![CDATA[<= ]]> #{endTime}
+        </if>
+    </select>   
+
     <!-- 查询所有记录 -->
     <select id="selectAllAnomalyModel" resultMap="AnomalyModelResultMap">
     SELECT
@@ -239,6 +276,10 @@
         model2_yaw_yawcount_ratio,
         model3_pitch_minpitch,
         model3_pitch_minpitch_ratio,
+
+        minute_data_completeness,
+        second_data_completeness,
+
         create_time,
         source_datetime
     FROM
@@ -368,7 +409,7 @@
     <select id="selectAnomalySensorCountVO" resultType="com.energy.manage.analyse.domain.vo.anomaly.AnomalySensorCountVO">
 
        SELECT
-    field_id,
+        field_id,
 
 
         COUNT(DISTINCT CASE WHEN sensor_anomaly_power = 1 THEN engine_id END) AS 'sensorAnomalyPowerCount',