package com.jjt.biz.service.impl; import com.googlecode.aviator.AviatorEvaluator; import com.jjt.biz.domain.*; import com.jjt.biz.mapper.HlBaseMapper; import com.jjt.biz.service.*; import com.jjt.common.utils.DateUtils; import com.jjt.common.utils.StringUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneId; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * 健康度配置基本Service业务层处理 * * @author jjt * @date 2024-08-28 */ @Service public class HlBaseServiceImpl implements IHlBaseService { @Resource private HlBaseMapper hlBaseMapper; @Resource private IHlClassService classService; @Resource private IHlObjService objService; @Resource private IHlDetailService detailService; @Resource private JdbcTemplate jdbcTemplate; @Resource private IHlScoreService scoreService; @Resource private IHlScoreDetailService scoreDetailService; @Resource private IHlDayService dayService; @Resource private IHlDayDetailService dayDetailService; @Resource private IHlMetricsRelaService relaService; @Resource private IMetricsDefService defService; @Resource private IBizModelService modelService; /** * 查询健康度配置基本 * * @param hlBaseId 健康度配置基本主键 * @return 健康度配置基本 */ @Override public HlBase selectHlBaseByHlBaseId(Long hlBaseId) { return hlBaseMapper.selectHlBaseByHlBaseId(hlBaseId); } /** * 根据模型ID查询 * * @param modelId 健康度配置基本主键 * @return 结果 */ @Override public HlBase selectHlBaseByModelId(Long modelId) { return hlBaseMapper.selectHlBaseByModelId(modelId); } /** * 查询健康度配置基本列表 * * @param hlBase 健康度配置基本 * @return 健康度配置基本 */ @Override public List selectHlBaseList(HlBase hlBase) { return hlBaseMapper.selectHlBaseList(hlBase); } /** * 新增健康度配置基本 * * @param hlBase 健康度配置基本 * @return 结果 */ @Override public int insertHlBase(HlBase hlBase) { hlBase.setCreateTime(DateUtils.getNowDate()); return hlBaseMapper.insertHlBase(hlBase); } /** * 修改健康度配置基本 * * @param hlBase 健康度配置基本 * @return 结果 */ @Override public int updateHlBase(HlBase hlBase) { hlBase.setUpdateTime(DateUtils.getNowDate()); return hlBaseMapper.updateHlBase(hlBase); } /** * 批量删除健康度配置基本 * * @param hlBaseIds 需要删除的健康度配置基本主键 * @return 结果 */ @Override public int deleteHlBaseByHlBaseIds(Long[] hlBaseIds) { return hlBaseMapper.deleteHlBaseByHlBaseIds(hlBaseIds); } /** * 删除健康度配置基本信息 * * @param hlBaseId 健康度配置基本主键 * @return 结果 */ @Override public int deleteHlBaseByHlBaseId(Long hlBaseId) { return hlBaseMapper.deleteHlBaseByHlBaseId(hlBaseId); } /** * 根据模型ID插入健康度数据 * * @param modelId 模型ID */ @Override public void insertHlBase4ModelId(Long modelId) { //如果没有数据,则复制基础数据到模型 HlBase base = selectHlBaseByHlBaseId(1L); base.setHlBaseId(null); base.setModelId(modelId); insertHlBase(base); List classes = base.getHlClassList(); HlBase finalBase = base; classes.forEach(cs -> { cs.setClassId(null); cs.setHlBaseId(finalBase.getHlBaseId()); classService.insertHlClass(cs); List objs = cs.getHlObjList(); objs.forEach(ob -> { ob.setClassId(cs.getClassId()); ob.setHlObjId(null); objService.insertHlObj(ob); List details = ob.getHlDetailList(); details.forEach(d -> { d.setHlObjId(ob.getHlObjId()); d.setHlDetailId(null); detailService.insertHlDetail(d); }); }); }); } /** * 根据模型ID删除健康度数据 * * @param modelId 模型ID */ @Override public void deleteHlBase4ModelId(Long modelId) { if (modelId == -1) { return; } try { // 开始事务 jdbcTemplate.execute("BEGIN"); // 执行删除语句 jdbcTemplate.update("DELETE FROM hl_detail WHERE HL_OBJ_ID IN (SELECT HL_OBJ_ID FROM hl_obj WHERE CLASS_ID IN (SELECT CLASS_ID FROM hl_class WHERE hl_base_id IN (SELECT hl_base_id FROM hl_base WHERE model_id = ?)))", modelId); jdbcTemplate.update("DELETE FROM hl_obj WHERE CLASS_ID IN (SELECT CLASS_ID FROM hl_class WHERE hl_base_id IN (SELECT hl_base_id FROM hl_base WHERE model_id = ?))", modelId); jdbcTemplate.update("DELETE FROM hl_class WHERE hl_base_id IN (SELECT hl_base_id FROM hl_base WHERE model_id = ?)", modelId); jdbcTemplate.update("DELETE FROM hl_base WHERE model_id = ?", modelId); // 提交事务 jdbcTemplate.execute("COMMIT"); } catch (Exception e) { // 回滚事务 jdbcTemplate.execute("ROLLBACK"); throw new RuntimeException(e); } } /** * 健康度评分 */ @Override public void score() { Map expMap = relaService.selectHlMetricsRelaList(new HlMetricsRela()).stream() .collect(Collectors.toMap(HlMetricsRela::getHlCode, HlMetricsRela::getExp)); Map defMap = defService.selectMetricsDefList(new MetricsDef()).stream().collect(Collectors.toMap(MetricsDef::getMetricsCode, MetricsDef::getMetricsId)); List list = selectHlBaseList(new HlBase()); list.forEach(base -> { if (base.getModelId() != -1) { Map> metricsGroup = modelService.selectBizModelMetricsList(base.getModelId()).stream().collect(Collectors.groupingBy(BizObjMetrics::getMetricsId)); HlScore score = new HlScore(); score.setModelId(base.getModelId()); scoreService.insertHlScore(score); List classes = base.getHlClassList(); AtomicReference total = new AtomicReference<>(new BigDecimal(0)); classes.forEach(cs -> { HlScoreDetail csDetail = new HlScoreDetail(); csDetail.setHlScoreId(score.getHlScoreId()); csDetail.setHlType("CLASS"); csDetail.setHlCode(cs.getClassCode()); List objs = cs.getHlObjList(); AtomicReference scc = new AtomicReference<>(new BigDecimal(0)); objs.forEach(ob -> { List details = ob.getHlDetailList(); HlScoreDetail obDetail = new HlScoreDetail(); obDetail.setHlScoreId(score.getHlScoreId()); obDetail.setHlType("OBJ"); obDetail.setHlCode(ob.getHlObjCode()); AtomicReference sc = new AtomicReference<>(new BigDecimal(0)); if ("LINK".equals(ob.getHlObjCode())) { details.forEach(d -> { HlScoreDetail scoreDetail = new HlScoreDetail(); scoreDetail.setHlScoreId(score.getHlScoreId()); scoreDetail.setHlType("DETAIL"); scoreDetail.setHlCode(d.getHlDetailCode()); String hlCode = d.getHlDetailCode(); String exp = expMap.get(hlCode); BigDecimal standScore = new BigDecimal(d.getHlDetailScore()); switch (hlCode) { case "C01": case "C02": case "C03": if (StringUtils.isNotEmpty(exp)) { Matcher matcher = match(exp); Map> originalMap = new HashMap<>(); //先拿到一个code,好获取组件数量 String oneCode = ""; while (matcher.find()) { String code = matcher.group(1); String old = String.format("${%s}", code); String newCode = code.replace(".", ""); oneCode = newCode; exp = exp.replace(old, newCode); Long mid = defMap.get(code); List omList = metricsGroup.get(mid); originalMap.put(newCode, omList); } // 获取组件数量 int size = originalMap.get(oneCode).size(); int alarmSize = 0; // 遍历列表并创建新的 Map for (int i = 0; i < size; i++) { Map singleEntryMap = new HashMap<>(); for (String s : originalMap.keySet()) { singleEntryMap.put(s, originalMap.get(s).get(i).getDValue().floatValue()); } boolean flag = evaluator(exp, singleEntryMap); if (flag) { alarmSize++; } } //最终得分(告警组件数量/总数量 )*细项分 BigDecimal df = standScore.subtract(BigDecimal.valueOf(alarmSize).divide(BigDecimal.valueOf(size)).multiply(standScore)); scoreDetail.setHlScore(df); scoreDetailService.insertHlScoreDetail(scoreDetail); } break; default: break; } }); } else { sc.set(random(ob.getHlObjScore())); } obDetail.setHlScore(sc.get()); scoreDetailService.insertHlScoreDetail(obDetail); scc.set(scc.get().add(obDetail.getHlScore())); }); csDetail.setHlScore(scc.get()); scoreDetailService.insertHlScoreDetail(csDetail); total.set(total.get().add(csDetail.getHlScore())); }); score.setHlScore(total.get()); scoreService.updateHlScore(score); } }); } /** * 昨日健康度评分 */ @Override public void yesterday() { LocalDate localDate = LocalDate.now().minusDays(1); List list = selectHlBaseList(new HlBase()); list.forEach(base -> { if (base.getModelId() != -1) { HlDay hlDay = new HlDay(); hlDay.setModelId(base.getModelId()); hlDay.setHlDate(Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant())); dayService.insertHlDay(hlDay); List classes = base.getHlClassList(); AtomicReference total = new AtomicReference<>(new BigDecimal(0)); classes.forEach(cs -> { HlDayDetail csDetail = new HlDayDetail(); csDetail.setDayId(hlDay.getDayId()); csDetail.setHlType("CLASS"); csDetail.setHlCode(cs.getClassCode()); List objs = cs.getHlObjList(); AtomicReference scc = new AtomicReference<>(new BigDecimal(0)); objs.forEach(ob -> { List details = ob.getHlDetailList(); HlDayDetail obDetail = new HlDayDetail(); obDetail.setDayId(hlDay.getDayId()); obDetail.setHlType("OBJ"); obDetail.setHlCode(ob.getHlObjCode()); AtomicReference sc = new AtomicReference<>(new BigDecimal(0)); if ("LINK".equals(ob.getHlObjCode())) { details.forEach(d -> { HlDayDetail scoreDetail = new HlDayDetail(); scoreDetail.setDayId(hlDay.getDayId()); scoreDetail.setHlType("DETAIL"); scoreDetail.setHlCode(d.getHlDetailCode()); switch (d.getHlDetailCode()) { case "C01": case "C02": case "C03": BigDecimal dc = random(d.getHlDetailScore()); scoreDetail.setHlScore(dc); sc.set(sc.get().add(dc)); dayDetailService.insertHlDayDetail(scoreDetail); break; default: break; } }); } else { sc.set(random(ob.getHlObjScore())); } obDetail.setHlScore(sc.get()); dayDetailService.insertHlDayDetail(obDetail); scc.set(scc.get().add(obDetail.getHlScore())); }); csDetail.setHlScore(scc.get()); dayDetailService.insertHlDayDetail(csDetail); total.set(total.get().add(csDetail.getHlScore())); }); hlDay.setHlScore(total.get()); dayService.updateHlDay(hlDay); } }); } private BigDecimal random(Long s) { Random random = new Random(); int randomNumber = random.nextInt(3); // 生01到3的随机数 int v = s.intValue() - randomNumber; return BigDecimal.valueOf(v); } /** * 公式计算 * * @param exp 表达式 * @param env 值 * @return 结果 */ private boolean evaluator(String exp, Map env) { return (boolean) AviatorEvaluator.execute(exp, env); } /** * 正则匹配 * * @param exp 表达式 * @return 结果 */ private Matcher match(String exp) { //正则表达式匹配变量 Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}"); return pattern.matcher(exp); } }