|
@@ -2,22 +2,24 @@ package com.jjt.hl.service.impl;
|
|
|
|
|
|
import com.googlecode.aviator.AviatorEvaluator;
|
|
|
import com.jjt.biz.domain.BizModel;
|
|
|
-import com.jjt.biz.service.IBizModelDetailService;
|
|
|
import com.jjt.biz.service.IBizModelService;
|
|
|
import com.jjt.common.utils.DateUtils;
|
|
|
import com.jjt.common.utils.bean.BeanUtils;
|
|
|
import com.jjt.hl.domain.*;
|
|
|
+import com.jjt.hl.mapper.HlMetricsScoreDetailMapper;
|
|
|
import com.jjt.hl.mapper.HlScoreMapper;
|
|
|
import com.jjt.hl.service.*;
|
|
|
+import com.jjt.hl.vo.HlMetricsVO;
|
|
|
+import org.apache.ibatis.session.ExecutorType;
|
|
|
+import org.apache.ibatis.session.SqlSession;
|
|
|
+import org.apache.ibatis.session.SqlSessionFactory;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Random;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.*;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
@@ -34,10 +36,6 @@ public class HlScoreServiceImpl implements IHlScoreService {
|
|
|
@Resource
|
|
|
private IBizModelService modelService;
|
|
|
@Resource
|
|
|
- private IBizModelDetailService modelDetailService;
|
|
|
- @Resource
|
|
|
- private IHlClassService hlClassService;
|
|
|
- @Resource
|
|
|
private IHlClassScoreService hlClassScoreService;
|
|
|
@Resource
|
|
|
private IHlObjService hlObjService;
|
|
@@ -46,10 +44,9 @@ public class HlScoreServiceImpl implements IHlScoreService {
|
|
|
@Resource
|
|
|
private IHlMetricsScoreService hlMetricsScoreService;
|
|
|
@Resource
|
|
|
- private IHlMetricsScoreDetailService hlMetricsScoreDetailService;
|
|
|
- @Resource
|
|
|
private JdbcTemplate jdbcTemplate;
|
|
|
-
|
|
|
+ @Resource
|
|
|
+ private SqlSessionFactory factory;
|
|
|
|
|
|
/**
|
|
|
* 查询健康度分数记录
|
|
@@ -189,6 +186,118 @@ public class HlScoreServiceImpl implements IHlScoreService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 按模型ID进行评分
|
|
|
+ *
|
|
|
+ * @param modelId 模型ID
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void score(Long modelId) {
|
|
|
+ HlScore score = new HlScore();
|
|
|
+ score.setModelId(modelId);
|
|
|
+ score.setHlDate(new Date());
|
|
|
+ //单次评分
|
|
|
+ score.setHlType("1");
|
|
|
+ insertHlScore(score);
|
|
|
+ BigDecimal totalScore = BigDecimal.ZERO;
|
|
|
+ //查找健康度分类
|
|
|
+ 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> vos = metricsMap.get(hlMetrics.getMetricsId());
|
|
|
+ if (vos == null || vos.size() == 0) {
|
|
|
+ //如果没有事件产生,则无事发生
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //扣分
|
|
|
+ BigDecimal lost = BigDecimal.ZERO;
|
|
|
+ //指标总数也
|
|
|
+ int total = vos.size();
|
|
|
+ //评分标准 1.当前值 2.持续1小时值
|
|
|
+ int eventNum = 0;
|
|
|
+ List<Long> eventIds = new ArrayList<>();
|
|
|
+ for (HlMetricsVO vo : vos) {
|
|
|
+ if (vo.getEventId() != null) {
|
|
|
+ eventIds.add(vo.getEventId());
|
|
|
+ if ("1".equals(hlMetrics.getHlStand())) {
|
|
|
+ //有事件就扣分
|
|
|
+ eventNum++;
|
|
|
+ } else {
|
|
|
+ //需要判断是否持续1小时
|
|
|
+ if (vo.getEndTime() == null) {
|
|
|
+ //如果没有结束时间,则判断至当前是否已经到1小时
|
|
|
+ vo.setEndTime(new Date());
|
|
|
+ }
|
|
|
+ if (vo.getEndTime().getTime() - vo.getStartTime().getTime() > 3600 * 1000) {
|
|
|
+ eventNum++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //(告警组件数量/总数量 )*细项分
|
|
|
+ if (eventNum > 0) {
|
|
|
+ lost = BigDecimal.valueOf(eventNum).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);
|
|
|
+
|
|
|
+ for (Long eventId : eventIds) {
|
|
|
+ HlMetricsScoreDetail detail = new HlMetricsScoreDetail();
|
|
|
+ detail.setScoreMetricsId(metricsScore.getScoreMetricsId());
|
|
|
+ detail.setEventId(eventId);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 日健康度评分
|
|
|
*
|
|
|
* @param date 时间
|