From 80d5a608f4543a68a30bab5842d9f793702d6b53 Mon Sep 17 00:00:00 2001
From: dengzedong <dengzedong@email>
Date: 星期三, 23 四月 2025 13:36:47 +0800
Subject: [PATCH] 焦化 异常数据建议生成

---
 ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/impl/CokingTraceSuggestServiceImpl.java |   26 ++++++++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingOverviewTask.java                    |   94 +++++++++++++++++++++++++++---
 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/CokingController.java             |    9 ++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceSuggestEntity.java            |    4 +
 ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/CokingTraceSuggestService.java          |    4 +
 5 files changed, 124 insertions(+), 13 deletions(-)

diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/CokingController.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/CokingController.java
index 39ca218..d9ac9c3 100644
--- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/CokingController.java
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/CokingController.java
@@ -117,12 +117,19 @@
 
 
     @GetMapping("/overview/list")
-    @Operation(summary = "各工序-概况")
+    @Operation(summary = "各工序-概况数据")
     public CommonResult<Map<String,List<CokingOverviewDTO>>> getOverviewList(@RequestParam Map<String, Object> params) {
         Map<String,List<CokingOverviewDTO>> result = cokingOverviewService.list(params);
         return success(result);
     }
 
+    @GetMapping("/overview/abnormal-data")
+    @Operation(summary = "各工序-异常数据")
+    public CommonResult<List<CokingTraceSuggestEntity>> getAbnormalData(@RequestParam Map<String, Object> params) {
+        List<CokingTraceSuggestEntity> result = cokingTraceSuggestService.getAbnormalData(params);
+        return success(result);
+    }
+
     @GetMapping("/trace-suggest/list")
     @Operation(summary = "焦化工序-异常溯源及优化建议")
     public CommonResult<List<CokingTraceSuggestDTO>> getTraceSuggestList(@RequestParam Map<String, Object> params) {
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceSuggestEntity.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceSuggestEntity.java
index f4a568c..82c88e2 100644
--- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceSuggestEntity.java
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingTraceSuggestEntity.java
@@ -3,7 +3,9 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.util.Date;
 
@@ -14,6 +16,8 @@
  * @since 1.0.0 2025-04-16
  */
 @Data
+@AllArgsConstructor
+@NoArgsConstructor
 @TableName("t_coking_trace_suggest")
 public class CokingTraceSuggestEntity {
 
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/CokingTraceSuggestService.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/CokingTraceSuggestService.java
index 7cc4464..d7ecafb 100644
--- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/CokingTraceSuggestService.java
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/CokingTraceSuggestService.java
@@ -16,4 +16,8 @@
     List<CokingTraceSuggestEntity> list(Map<String, Object> params);
 
     void save(CokingTraceSuggestEntity suggestEntity);
+
+    void insert(List<CokingTraceSuggestEntity> suggestEntitieList);
+
+    List<CokingTraceSuggestEntity> getAbnormalData(Map<String, Object> params);
 }
\ No newline at end of file
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/impl/CokingTraceSuggestServiceImpl.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/impl/CokingTraceSuggestServiceImpl.java
index 9bb2b19..6da3ddf 100644
--- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/impl/CokingTraceSuggestServiceImpl.java
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/impl/CokingTraceSuggestServiceImpl.java
@@ -1,6 +1,7 @@
 package com.iailab.module.ansteel.coking.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iailab.framework.common.util.date.DateUtils;
 import com.iailab.module.ansteel.coking.dao.CokingTraceSuggestDao;
 import com.iailab.module.ansteel.coking.entity.CokingTraceSuggestEntity;
 import com.iailab.module.ansteel.coking.service.CokingTraceSuggestService;
@@ -8,6 +9,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
 
@@ -31,7 +33,7 @@
         QueryWrapper<CokingTraceSuggestEntity> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("rel_id", relId)
                 .eq(StringUtils.isNotBlank(sugObj), "sug_obj", sugObj)
-                .orderByAsc("sug_obj");
+                .orderByAsc("create_date");
         return cokingTraceSuggestDao.selectList(queryWrapper);
     }
 
@@ -39,4 +41,26 @@
     public void save(CokingTraceSuggestEntity suggestEntity) {
         cokingTraceSuggestDao.insert(suggestEntity);
     }
+
+    @Override
+    public void insert(List<CokingTraceSuggestEntity> suggestEntitieList) {
+        cokingTraceSuggestDao.insert(suggestEntitieList);
+    }
+
+    @Override
+    public List<CokingTraceSuggestEntity> getAbnormalData(Map<String, Object> params) {
+        String processType = (String) params.get("processType");
+        String clock = (String) params.get("clock");
+        if (StringUtils.isBlank(clock)) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.DAY_OF_YEAR, -1);
+            clock = DateUtils.format(calendar.getTime(), "yyyy-MM-dd");
+        }
+
+        QueryWrapper<CokingTraceSuggestEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("sug_obj", processType)
+                .eq("clock", clock)
+                .orderByAsc("create_date");
+        return cokingTraceSuggestDao.selectList(queryWrapper);
+    }
 }
\ No newline at end of file
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingOverviewTask.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingOverviewTask.java
index b52cf2a..0f79733 100644
--- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingOverviewTask.java
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingOverviewTask.java
@@ -2,19 +2,16 @@
 
 import cn.hutool.core.bean.BeanUtil;
 import com.iailab.framework.common.util.date.DateUtils;
-import com.iailab.module.ansteel.coking.entity.CokingOverviewEntity;
-import com.iailab.module.ansteel.coking.entity.CokingProcessConfEntity;
-import com.iailab.module.ansteel.coking.entity.CokingTraceChartEntity;
-import com.iailab.module.ansteel.coking.entity.CokingTraceReportEntity;
-import com.iailab.module.ansteel.coking.service.CokingOverviewService;
-import com.iailab.module.ansteel.coking.service.CokingProcessConfService;
-import com.iailab.module.ansteel.coking.service.CokingTraceChartService;
-import com.iailab.module.ansteel.coking.service.CokingTraceReportService;
+import com.iailab.module.ansteel.coking.entity.*;
+import com.iailab.module.ansteel.coking.service.*;
 import com.iailab.module.ansteel.common.enums.ProcessConfDataTypeEnum;
 import com.iailab.module.ansteel.common.enums.ProcessTypeEnum;
 import com.iailab.module.data.api.ind.IndItemApi;
+import com.iailab.module.data.api.ind.dto.ApiIndItemQueryDTO;
 import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO;
 import com.iailab.module.data.api.point.DataPointApi;
+import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
+import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -25,7 +22,6 @@
 import javax.annotation.Resource;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * 备煤工序-概况
@@ -51,6 +47,8 @@
     private CokingTraceReportService cokingTraceReportService;
     @Resource
     private CokingTraceChartService cokingTraceChartService;
+    @Resource
+    private CokingTraceSuggestService cokingTraceSuggestService;
 
     @Override
     public void run(String processTypes) {
@@ -83,6 +81,7 @@
                 reportEntity.setReportName(ProcessTypeEnum.getEumByCode(processType).getReportName());
                 reportEntity.setAnalyDate(clock);
                 reportEntity.setClock(clock);
+                reportEntity.setCreateDate(new Date());
                 cokingTraceReportService.save(reportEntity);
 
                 // 整体情况
@@ -138,6 +137,7 @@
                 // 指标运行趋势
                 List<CokingProcessConfEntity> indRunTrend = list.stream().filter(e -> e.getInfoType().equals("1")).collect(Collectors.toList());
                 List<CokingTraceChartEntity> cokingTraceChartEntityList = new ArrayList<>(indRunTrend.size());
+                List<CokingTraceSuggestEntity> suggestEntitieList = new ArrayList<>();
                 indRunTrend.forEach(e -> {
                     CokingTraceChartEntity cokingTraceChartEntity = new CokingTraceChartEntity();
                     cokingTraceChartEntity.setRelId(relId);
@@ -156,15 +156,87 @@
                     cokingTraceChartEntity.setStartTime(clone.getTime());
                     cokingTraceChartEntity.setCreateDate(new Date());
                     cokingTraceChartEntityList.add(cokingTraceChartEntity);
+
+                    // 异常数据处理
+                    suggestEntitieList.addAll(handleAbnormalData(e, cokingTraceChartEntity.getStartTime(), cokingTraceChartEntity.getEndTime(),relId,clock));
                 });
                 cokingTraceChartService.insert(cokingTraceChartEntityList);
+                cokingTraceSuggestService.insert(suggestEntitieList);
 
             }
         } catch (Exception ex) {
-            logger.error("runCokingOverviewTask运行异常");
-            ex.printStackTrace();
+            logger.error("runCokingOverviewTask运行异常",ex);
         }
         logger.info("runCokingOverviewTask运行完成");
 
     }
+
+    private List<CokingTraceSuggestEntity> handleAbnormalData(CokingProcessConfEntity e, Date startTime, Date endTime, String relId, String clock) {
+        List<CokingTraceSuggestEntity> suggestEntities = new ArrayList<>();
+        switch (ProcessConfDataTypeEnum.getEumByCode(e.getDataType())) {
+            case DATAPOINT:
+                ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
+                queryDTO.setPointNo(e.getPointNo());
+                queryDTO.setStart(startTime);
+                queryDTO.setEnd(endTime);
+                List<ApiPointValueDTO> pointValues = dataPointApi.queryPointHistoryValue(queryDTO);
+                Map<Date, Double> pointValueMap = pointValues.stream().collect(Collectors.toMap(ApiPointValueDTO::getT, ApiPointValueDTO::getV, (e1, e2) -> e1));
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(startTime);
+                while (!calendar.getTime().after(endTime)) {
+                    String content = null;
+                    if (pointValueMap.containsKey(calendar.getTime())) {
+                        Double value = pointValueMap.get(calendar.getTime());
+                        if (value.equals(0.0)) {
+                            content = DateUtils.format(calendar.getTime()) + " " + e.getIndName() + "数据异常(数据为0)";
+                        }else if (value.compareTo(Double.valueOf(e.getExt3())) > 0) {
+                            content = DateUtils.format(calendar.getTime()) + " " + e.getIndName() + "数据异常(超上限)";
+                        }else if (value.compareTo(Double.valueOf(e.getExt4())) < 0) {
+                            content = DateUtils.format(calendar.getTime()) + " " + e.getIndName() + "数据异常(超下限)";
+                        }
+                    }else {
+                        content = DateUtils.format(calendar.getTime()) + " " + e.getIndName() + "数据异常(无数据)";
+                    }
+                    if (StringUtils.isNotBlank(content)) {
+                        suggestEntities.add(new CokingTraceSuggestEntity(UUID.randomUUID().toString(),relId,ProcessTypeEnum.getEumByCode(e.getIndType()).getReportName(),e.getIndType()+"_AD",clock,content,new Date()));
+                    }
+                    calendar.add(Calendar.DAY_OF_YEAR,1);
+                }
+                break;
+            case IND:
+                ApiIndItemQueryDTO query = new ApiIndItemQueryDTO();
+                query.setItemNo(e.getPointNo());
+                query.setStart(startTime);
+                query.setEnd(endTime);
+                List<ApiIndItemValueDTO> indValues = indItemApi.queryIndItemHistoryValue(query);
+                Map<String, Double> indValueMap = indValues.stream().collect(Collectors.toMap(ApiIndItemValueDTO::getDataTime, ind -> Double.valueOf(ind.getDataValue().toString()), (e1, e2) -> e1));
+                Calendar intCalendar = Calendar.getInstance();
+                intCalendar.setTime(startTime);
+                while (!intCalendar.getTime().after(endTime)) {
+                    String content = null;
+                    String time = DateUtils.format(intCalendar.getTime());
+                    if (indValueMap.containsKey(time)) {
+                        Double value = indValueMap.get(time);
+                        if (value.equals(0.0)) {
+                            content = time + " " + e.getIndName() + "数据异常(数据为0)";
+                        }else if (value.compareTo(Double.valueOf(e.getExt3())) > 0) {
+                            content = time + " " + e.getIndName() + "数据异常(超上限)";
+                        }else if (value.compareTo(Double.valueOf(e.getExt4())) < 0) {
+                            content = time + " " + e.getIndName() + "数据异常(超下限)";
+                        }
+                    }else {
+                        content = time + " " + e.getIndName() + "数据异常(无数据)";
+                    }
+                    if (StringUtils.isNotBlank(content)) {
+                        suggestEntities.add(new CokingTraceSuggestEntity(UUID.randomUUID().toString(),relId,ProcessTypeEnum.getEumByCode(e.getIndType()).getReportName(),e.getIndType()+"_AD",clock,content,new Date()));
+                    }
+                    intCalendar.add(Calendar.DAY_OF_YEAR,1);
+                }
+                break;
+            default:
+                break;
+
+        }
+        return suggestEntities;
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3