소스 검색

处理健康度

wukai 10 달 전
부모
커밋
07111a0840

+ 10 - 0
jjt-biz/src/main/java/com/jjt/hl/mapper/HlMetricsMapper.java

@@ -6,6 +6,7 @@ import com.jjt.hl.domain.HlMetrics;
 import com.jjt.hl.vo.HlMetricsVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -78,4 +79,13 @@ public interface HlMetricsMapper extends BaseMapper<HlMetrics> {
      * @return 结果
      */
     List<HlMetricsVO> hlMetricsList(Long hlClassId);
+    /**
+     * 根据日期和模型查询所有存在单次扣分的指标
+     * 并按metricsId分组
+     *
+     * @param modelId 健康度分类ID
+     * @param date    日期
+     * @return 结果
+     */
+    List<HlMetricsVO> hlMetricsDayList(@Param("modelId") Long modelId, @Param("date") Date date);
 }

+ 10 - 0
jjt-biz/src/main/java/com/jjt/hl/service/IHlMetricsService.java

@@ -4,6 +4,7 @@ import com.jjt.biz.domain.BizObjMetrics;
 import com.jjt.hl.domain.HlMetrics;
 import com.jjt.hl.vo.HlMetricsVO;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -88,4 +89,13 @@ public interface IHlMetricsService {
      * @return 结果
      */
     Map<Long,List<HlMetricsVO>> hlMetricsList(Long hlClassId);
+    /**
+     * 根据日期和模型查询所有存在单次扣分的指标
+     * 并按metricsId分组
+     *
+     * @param modelId 健康度分类ID
+     * @param date 日期
+     * @return 结果
+     */
+    Map<Long, List<HlMetricsVO>> hlMetricsDayList(Long modelId, Date date);
 }

+ 10 - 0
jjt-biz/src/main/java/com/jjt/hl/service/IHlScoreService.java

@@ -64,6 +64,7 @@ public interface IHlScoreService {
      * 健康度评分
      */
     void score();
+
     /**
      * 按模型ID进行评分
      *
@@ -73,7 +74,16 @@ public interface IHlScoreService {
 
     /**
      * 日健康度评分
+     *
      * @param date 时间
      */
     void day(Date date);
+
+    /**
+     * 日健康度评分
+     *
+     * @param date    时间
+     * @param modelId 模型Id
+     */
+    void day(Date date, Long modelId);
 }

+ 15 - 1
jjt-biz/src/main/java/com/jjt/hl/service/impl/HlMetricsServiceImpl.java

@@ -1,6 +1,5 @@
 package com.jjt.hl.service.impl;
 
-import com.jjt.biz.domain.BizObjMetrics;
 import com.jjt.common.utils.DateUtils;
 import com.jjt.hl.domain.HlMetrics;
 import com.jjt.hl.mapper.HlMetricsMapper;
@@ -9,6 +8,7 @@ import com.jjt.hl.vo.HlMetricsVO;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -136,4 +136,18 @@ public class HlMetricsServiceImpl implements IHlMetricsService {
         List<HlMetricsVO> list = hlMetricsMapper.hlMetricsList(hlClassId);
         return list.stream().collect(Collectors.groupingBy(HlMetricsVO::getMetricsId));
     }
+
+    /**
+     * 根据日期和模型查询所有存在单次扣分的指标
+     * 并按metricsId分组
+     *
+     * @param modelId 健康度分类ID
+     * @param date    日期
+     * @return 结果
+     */
+    @Override
+    public Map<Long, List<HlMetricsVO>> hlMetricsDayList(Long modelId, Date date) {
+        List<HlMetricsVO> list = hlMetricsMapper.hlMetricsDayList(modelId, date);
+        return list.stream().collect(Collectors.groupingBy(HlMetricsVO::getMetricsId));
+    }
 }

+ 88 - 6
jjt-biz/src/main/java/com/jjt/hl/service/impl/HlScoreServiceImpl.java

@@ -366,15 +366,97 @@ public class HlScoreServiceImpl implements IHlScoreService {
         }
     }
 
+
     /**
-     * 模拟扣分判断
+     * 日健康度评分
      *
-     * @return
+     * @param date    时间
+     * @param modelId 模型Id
      */
-    private boolean flag() {
-        Random r = new Random();
-        int x = r.nextInt(8889) + 1;
-        return x % 2 == 1;
+    @Override
+    public void day(Date date, Long modelId) {
+        HlScore score = new HlScore();
+        score.setModelId(modelId);
+        score.setHlDate(date);
+        score.setHlType("2");
+        insertHlScore(score);
+        BigDecimal totalScore = BigDecimal.ZERO;
+        //所有扣分的指标
+        Map<Long, List<HlMetricsVO>> lostMetricsMap = hlMetricsService.hlMetricsDayList(modelId, date);
+        //查找健康度分类
+        List<HlClass> classList = modelService.selectHlClassList4modelId(modelId);
+        List<HlMetricsScoreDetail> details = new ArrayList<>();
+        for (HlClass hlClass : classList) {
+            HlClassScore hlClassScore = new HlClassScore();
+            BeanUtils.copyBeanProp(hlClassScore, hlClass);
+            hlClassScore.setHlScoreId(score.getHlScoreId());
+            hlClassScoreService.insertHlClassScore(hlClassScore);
+            HlMetrics hm = new HlMetrics();
+            hm.setHlClassId(hlClass.getHlClassId());
+            List<HlMetrics> hlMetricsList = hlMetricsService.selectHlMetricsList(hm);
+            //当前分类下所有指标
+            Map<Long, List<HlMetricsVO>> metricsMap = hlMetricsService.hlMetricsList(hlClass.getHlClassId());
+            BigDecimal lostClass = BigDecimal.ZERO;
+            for (HlMetrics hlMetrics : hlMetricsList) {
+                if ("1".equals(hlClass.getScoreType())) {
+                    //1.均分 2.细项分
+                    //如果是均分,需要计算,如果是细项分,直接用
+                    BigDecimal metricsScore = hlClass.getHlScore().divide(BigDecimal.valueOf(hlMetricsList.size()), RoundingMode.HALF_UP);
+                    hlMetrics.setHlScore(metricsScore);
+                }
+
+                //总的指标数量
+                List<HlMetricsVO> vos1 = metricsMap.get(hlMetrics.getMetricsId());
+                int total = vos1 != null ? vos1.size() : 0;
+                //扣分指标数量
+                List<HlMetricsVO> vos = lostMetricsMap.get(hlMetrics.getMetricsId());
+                int lostNum = vos != null ? vos.size() : 0;
+                //扣分
+                BigDecimal lost = BigDecimal.ZERO;
+
+                //(告警组件数量/总数量 )*细项分
+                if (lostNum > 0) {
+                    lost = BigDecimal.valueOf(lostNum).divide(BigDecimal.valueOf(total), RoundingMode.HALF_UP).multiply(hlMetrics.getHlScore());
+                }
+                //最终得分 = 分数-扣分
+                BigDecimal score2 = BigDecimal.ZERO;
+                if (hlMetrics.getHlScore().compareTo(lost) >= 0) {
+                    score2 = hlMetrics.getHlScore().subtract(lost);
+                }
+                HlMetricsScore metricsScore = new HlMetricsScore();
+                BeanUtils.copyBeanProp(metricsScore, hlMetrics);
+                metricsScore.setLoseScore(lost);
+                metricsScore.setScore(score2);
+                metricsScore.setScoreClassId(hlClassScore.getScoreClassId());
+                hlMetricsScoreService.insertHlMetricsScore(metricsScore);
+                if (vos != null) {
+                    for (HlMetricsVO vo : vos) {
+                        HlMetricsScoreDetail detail = new HlMetricsScoreDetail();
+                        detail.setScoreMetricsId(metricsScore.getScoreMetricsId());
+                        detail.setEventId(vo.getEventId());
+                        details.add(detail);
+                    }
+                }
+                lostClass = lostClass.add(lost);
+            }
+            hlClassScore.setLoseScore(lostClass);
+            BigDecimal df = BigDecimal.ZERO;
+            if (hlClassScore.getHlScore().compareTo(lostClass) >= 0) {
+                df = hlClassScore.getHlScore().subtract(lostClass);
+            }
+            hlClassScore.setScore(df);
+            totalScore = totalScore.add(df);
+            hlClassScoreService.updateHlClassScore(hlClassScore);
+        }
+        if (details.size() > 0) {
+            try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+                HlMetricsScoreDetailMapper mapper = sqlSession.getMapper(HlMetricsScoreDetailMapper.class);
+                details.forEach(mapper::insertHlMetricsScoreDetail);
+                sqlSession.commit();
+            }
+        }
+        score.setHlScore(totalScore);
+        updateHlScore(score);
     }
 
 

+ 12 - 18
jjt-biz/src/main/java/com/jjt/task/HlTask.java

@@ -2,7 +2,6 @@ package com.jjt.task;
 
 import com.jjt.biz.domain.BizModel;
 import com.jjt.biz.service.IBizModelService;
-import com.jjt.common.utils.StringUtils;
 import com.jjt.hl.service.IHlScoreService;
 import org.springframework.stereotype.Component;
 
@@ -30,23 +29,18 @@ public class HlTask {
     }
 
     public void day() {
-        LocalDate time = LocalDate.now().minusDays(8);
-        for (int j = 0; j < 7; j++) {
-            time = time.plusDays(1);
-            Date date = Date.from(time.atStartOfDay(ZoneId.systemDefault()).toInstant());
-            scoreService.day(date);
-        }
-    }
-
-    public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) {
-        System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
-    }
-
-    public void ryParams(String params) {
-        System.out.println("执行有参方法:" + params);
-    }
+        LocalDate time = LocalDate.now();
+//        time = time.minusDays(1);
+        Date date = Date.from(time.atStartOfDay(ZoneId.systemDefault()).toInstant());
+        bizModelService.selectBizModelList(new BizModel()).forEach(bm -> {
+            scoreService.day(date, bm.getModelId());
+        });
 
-    public void ryNoParams() {
-        System.out.println("执行无参方法");
+//        LocalDate time = LocalDate.now().minusDays(8);
+//        for (int j = 0; j < 7; j++) {
+//            time = time.plusDays(1);
+//            Date date = Date.from(time.atStartOfDay(ZoneId.systemDefault()).toInstant());
+//            scoreService.day(date);
+//        }
     }
 }

+ 18 - 0
jjt-biz/src/main/resources/mapper/hl/HlMetricsMapper.xml

@@ -93,6 +93,24 @@
                  (SELECT * FROM hl_event WHERE event_status = 1) b ON a.OBJ_METRICS_ID = b.obj_metrics_id
 
     </select>
+    <select id="hlMetricsDayList" resultType="com.jjt.hl.vo.HlMetricsVO">
+        SELECT c.metrics_id, c.obj_metrics_id, MAX(b.event_id) EVENT_ID
+        FROM (SELECT *
+              FROM hl_metrics_score_detail
+              WHERE score_metrics_id IN (SELECT score_metrics_id
+                                         FROM hl_metrics_score
+                                         WHERE score_class_id IN (SELECT score_class_id
+                                                                  FROM hl_class_score
+                                                                  WHERE hl_score_id IN (SELECT t.hl_score_id
+                                                                                        FROM hl_score t
+                                                                                        WHERE model_id = #{modelId} AND DATE (hl_date)=#{date}
+                                                                                        )
+                                                                )
+                                        )
+            ) a,hl_event b,biz_obj_metrics c
+        WHERE a.event_id=b.event_id AND b.obj_metrics_id= c.OBJ_METRICS_ID
+        GROUP BY c.METRICS_ID, c.obj_metrics_id
+    </select>
 
     <insert id="insertHlMetrics" parameterType="HlMetrics" useGeneratedKeys="true"
             keyProperty="hlMetricsId">