xieb
2024-06-25 94b2c9db484f97cb84ead85bd4e5268d9c823ed2
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/service/impl/AlarmRecordServiceImpl.java
@@ -1,12 +1,31 @@
package cn.gistack.alerts.alarmRule.service.impl;
import cn.gistack.alerts.alarmRule.entity.AlarmRecord;
import cn.gistack.alerts.alarmRule.entity.AlarmRule;
import cn.gistack.alerts.alarmRule.mapper.AlarmRecordMapper;
import cn.gistack.alerts.alarmRule.service.AlarmRecordService;
import cn.gistack.alerts.alarmRule.service.AlarmRuleService;
import cn.gistack.alerts.alarmRule.vo.AlarmRecordVO;
import cn.gistack.alerts.alarmRule.vo.StatisticAlarmRecord;
import cn.gistack.alerts.sms.vo.Temp;
import cn.gistack.sm.intelligentCall.entity.Scene;
import cn.gistack.sm.patrol.feign.PatrolTaskClient;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.logging.log4j.util.Strings;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * 告警记录服务实现层
@@ -16,6 +35,12 @@
@Service
public class AlarmRecordServiceImpl extends BaseServiceImpl<AlarmRecordMapper, AlarmRecord> implements AlarmRecordService {
   @Autowired
   private AlarmRuleService alarmRuleService;
   @Autowired
   private PatrolTaskClient patrolTaskClient;
   /**
    * 自定义分页列表查询
    * @param page
@@ -24,9 +49,229 @@
    */
   @Override
   public Object selectAlarmRecordPage(IPage<AlarmRecordVO> page, AlarmRecordVO alarmRecord) {
//      if (!Strings.isBlank(alarmRecord.getAdCode())){
//         alarmRecord.setAdCode(alarmRecord.getAdCode().replaceAll("0+$", ""));
//      }
      if (null != alarmRecord.getIsExport()){
         return baseMapper.selectAlarmRecordPage(null,alarmRecord);
      }
      return page.setRecords(baseMapper.selectAlarmRecordPage(page,alarmRecord));
   }
   /**
    * 按行政区统计告警-按三大类
    * @param alarmRecord
    * @return
    */
   @Override
   public Object statisticAlarmRecordByType(AlarmRecordVO alarmRecord) {
      if (!Strings.isBlank(alarmRecord.getAdCode())){
         alarmRecord.setAdCode(alarmRecord.getAdCode().replaceAll("0+$", ""));
      }
      // 查询统计数据
      List<StatisticAlarmRecord> list = baseMapper.statisticAlarmRecordByType(alarmRecord);
      // 返回数据
      return list;
   }
   @Override
   public Object statisticAlarmRecordByAlarmRuleType(AlarmRecordVO alarmRecord) {
      if (!Strings.isBlank(alarmRecord.getAdCode())){
         alarmRecord.setAdCode(alarmRecord.getAdCode().replaceAll("0+$", ""));
      }
      // 查询统计数据
      List<StatisticAlarmRecord> list = baseMapper.statisticAlarmRecordByAlarmRuleType(alarmRecord);
      // 返回数据
      return list;
   }
   /**
    * 按行政区统计告警
    * @param alarmRecord
    * @return
    */
   @Override
   public Object statisticAlarmRecord(AlarmRecordVO alarmRecord) {
      if (Strings.isBlank(alarmRecord.getAdCode())){
         // 获取当前用户的行政区划
         alarmRecord.setAdCode("420000000000");
      }
      // 查询所有的市级行政区
      List<String> adNameList = baseMapper.getAdNameList(alarmRecord.getAdCode());
      if (alarmRecord.getAdLevel().equals("4")) {
         adNameList = baseMapper.getAdNameListByAdCode(alarmRecord.getAdCode());
      }
      // 查询符合条件的告警类型
      List<AlarmRule> alarmRuleList = baseMapper.listAlarmRule(alarmRecord);
      // 查询统计数据
      if (!Strings.isBlank(alarmRecord.getAdCode())){
         alarmRecord.setAdCode(alarmRecord.getAdCode().replaceAll("0+$", ""));
      }
      List<StatisticAlarmRecord> list = baseMapper.statisticAlarmRecord(alarmRecord);
      // 按行政区分组
      Map<String, List<StatisticAlarmRecord>> listMap = list.stream().filter(item->null!=item.getAdName()).collect(Collectors.groupingBy(StatisticAlarmRecord::getAdName));
      // 补全行政区
      for (String adName : adNameList) {
         if (!listMap.containsKey(adName)){
            List<StatisticAlarmRecord> arrayList = new ArrayList<>();
            listMap.put(adName,arrayList);
         }
      }
      List<String> ruleNameList = alarmRuleList.stream().map(alarmRule -> alarmRule.getRuleName()).collect(Collectors.toList());
      // 补全告警类型
      listMap.forEach((adName,statisticAlarmRecords)->{
         // 取出已有的告警类型
         List<String> newRuleNameList = statisticAlarmRecords.stream().map(alarmRule -> alarmRule.getRuleName()).collect(Collectors.toList());
         // 取差集
         List<String> resultAlarmRuleList = ruleNameList.stream().filter(item -> !newRuleNameList.contains(item)).collect(Collectors.toList());
         for (String ruleName : resultAlarmRuleList) {
            StatisticAlarmRecord newStatisticAlarmRecord = new StatisticAlarmRecord();
            newStatisticAlarmRecord.setRuleName(ruleName);
            newStatisticAlarmRecord.setNum(0);
            newStatisticAlarmRecord.setAdName(adName);
            statisticAlarmRecords.add(newStatisticAlarmRecord);
         }
      });
      List<Object> objects = new ArrayList<>();
      // 重新录入排序
      for (String adName : adNameList) {
         if (listMap.containsKey(adName)){
            objects.add(listMap.get(adName));
         }
      }
      // 返回数据
      return objects;
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public Boolean updateStatus(AlarmRecord alarmRecord) {
      AlarmRecordVO  vo = baseMapper.getVODetail(alarmRecord.getId());
      String processDefinitionId = "c2d5326e-e27b-11ed-a04e-00ff0b362ee4";
      //日常巡查
      String taskType = "1641037874390999041";
      String title = StringUtil.format("{}{}巡查",
         vo.getReservoirName(),vo.getAlarmRuleType());
      String tm = DateUtil.format(vo.getCreateTime(),"MM月dd日HH时mm分");
      //杨树堰水库在20231206 080005时近1h水位陡降
      String content = StringUtil.format("{}在{}时{}",
         vo.getReservoirName(),tm,vo.getRuleName());
      //创建新任务
      String taskId = patrolTaskClient.createTask(processDefinitionId, taskType, title, content, vo.getReservoirNumber());
      //更新状态
      alarmRecord.setTaskId(taskId);
      boolean b = updateById(alarmRecord);
      return b;
   }
   @Override
   public Object statisticsPie(AlarmRecordVO alarmRecordVO) {
      if (!Strings.isBlank(alarmRecordVO.getAdCode())){
         alarmRecordVO.setAdCode(alarmRecordVO.getAdCode().replaceAll("0+$", ""));
      }
      // 查询统计数据
      List<StatisticAlarmRecord> list = baseMapper.statisticsPie(alarmRecordVO);
      return list;
   }
   /**
    * 告警统计按告警分类-等级统计
    * @param alarmRecord
    * @return
    */
   @Override
   public Object statisticAlaByTypeAndLev(AlarmRecordVO alarmRecord) {
      Map<String, Object> map = new HashMap<>(4);
      List<StatisticAlarmRecord> recordList = baseMapper.statisticAlaByTypeAndLev(alarmRecord);
      if (recordList.size()>0){
         map.put("水情监测",setAlaStatisticListByData(recordList,"水情监测"));
         map.put("雨情监测",setAlaStatisticListByData(recordList,"雨情监测"));
         map.put("渗压监测",setAlaStatisticListByData(recordList,"渗压监测"));
         map.put("渗流监测",setAlaStatisticListByData(recordList,"渗流监测"));
         map.put("变形监测",setAlaStatisticListByData(recordList,"变形监测"));
      }else {
         map.put("水情监测",setAlaStatisticList());
         map.put("雨情监测",setAlaStatisticList());
         map.put("渗压监测",setAlaStatisticList());
         map.put("渗流监测",setAlaStatisticList());
         map.put("变形监测",setAlaStatisticList());
      }
      return map;
   }
   /**
    * 设置组装预警统计数据-带参数
    * @return
    */
   private List<StatisticAlarmRecord> setAlaStatisticListByData(List<StatisticAlarmRecord> recordList, String typeName) {
      List<StatisticAlarmRecord> list = new ArrayList<>();
      List<String> levelList = new ArrayList<>(){{
         add("蓝色预警");
         add("黄色预警");
         add("橙色预警");
         add("红色预警");
      }};
      List<String> alarmLevelList = recordList.stream()
         .filter(a -> a.getRuleName().equals(typeName))
         .map(StatisticAlarmRecord::getAlarmLevel)
         .distinct()
         .collect(Collectors.toList());
      // 先取差集
      List<String> diffList = levelList.stream().filter(item -> !alarmLevelList.contains(item)).collect(Collectors.toList());
      for (StatisticAlarmRecord alarmRecord : recordList) {
         if (alarmRecord.getRuleName().equals(typeName)){
            StatisticAlarmRecord statisticAlarmRecord = new StatisticAlarmRecord();
            statisticAlarmRecord.setAlarmLevel(alarmRecord.getAlarmLevel());
            statisticAlarmRecord.setNum(alarmRecord.getNum());
            list.add(statisticAlarmRecord);
         }
      }
      if (diffList.size()>0){
         for (String level : diffList) {
            StatisticAlarmRecord statisticAlarmRecord = new StatisticAlarmRecord();
            statisticAlarmRecord.setAlarmLevel(level);
            statisticAlarmRecord.setNum(0);
            list.add(statisticAlarmRecord);
         }
      }
      return list;
   }
   /**
    * 设置组装预警统计数据
    * @return
    */
   private List<StatisticAlarmRecord> setAlaStatisticList() {
      List<StatisticAlarmRecord> list = new ArrayList<>();
      StatisticAlarmRecord statisticAlarmRecord1 = new StatisticAlarmRecord();
      statisticAlarmRecord1.setAlarmLevel("蓝色预警");
      statisticAlarmRecord1.setNum(0);
      StatisticAlarmRecord statisticAlarmRecord2 = new StatisticAlarmRecord();
      statisticAlarmRecord2.setAlarmLevel("黄色预警");
      statisticAlarmRecord2.setNum(0);
      StatisticAlarmRecord statisticAlarmRecord3 = new StatisticAlarmRecord();
      statisticAlarmRecord3.setAlarmLevel("橙色预警");
      statisticAlarmRecord3.setNum(0);
      StatisticAlarmRecord statisticAlarmRecord4 = new StatisticAlarmRecord();
      statisticAlarmRecord4.setAlarmLevel("红色预警");
      statisticAlarmRecord4.setNum(0);
      list.add(statisticAlarmRecord1);
      list.add(statisticAlarmRecord2);
      list.add(statisticAlarmRecord3);
      list.add(statisticAlarmRecord4);
      return list;
   }
}