package com.huaxu.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.huaxu.client.OperationManagerClient; import com.huaxu.client.UserCenterClient; import com.huaxu.dao.AlarmDetailMapper; import com.huaxu.dto.*; import com.huaxu.entity.AlarmDetailsEntity; import com.huaxu.entity.Message; import com.huaxu.model.LoginUser; import com.huaxu.service.AlarmDetailsService; import com.huaxu.util.DatesUtil; import com.huaxu.util.MessageSendUtil; import com.huaxu.util.UserUtil; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * @description * @auto wangli * @data 2020-11-17 15:48 */ @Service @Log4j2 public class AlarmDetailsServiceImpl implements AlarmDetailsService { @Resource private AlarmDetailMapper alarmDetailMapper; @Autowired private OperationManagerClient operationManagerClient; @Autowired private UserCenterClient userCenterClient; @Autowired private MessageSendUtil messageSendUtil; @Override public AlarmDetailsDto selectById(Integer id) { return alarmDetailMapper.selectById(id); } @Override public List selectByDeviceId(Integer deviceId) { return alarmDetailMapper.selectByDeviceId(deviceId); } @Override public List selectRealTimeByIds(List ids) { return alarmDetailMapper.selectRealTimeByIds(ids); } @Override public List selectHistoryByIds(List ids) { return alarmDetailMapper.selectHistoryByIds(ids); } @Override public Integer insert(AlarmDetailsEntity alarmDetailsEntity) { return alarmDetailMapper.insert(alarmDetailsEntity); } @Override public Integer batchInsert(List alarmDetails) { return alarmDetailMapper.batchInsert(alarmDetails); } @Override public Integer deleteById(Integer id) { return alarmDetailMapper.deleteById(id); } @Override public Integer batchDelete(List ids) { return alarmDetailMapper.batchDelete(ids); } @Override public Integer suspendedById(Integer id , Integer opState) { LoginUser loginUser = UserUtil.getCurrentUser(); return alarmDetailMapper.suspendedById(id,opState,new Date(),loginUser.getUsername()); } @Override public Integer update(AlarmDetailsEntity alarmDetailsEntity) { return alarmDetailMapper.update(alarmDetailsEntity); } @Override public List selectList(AlarmDetailsDto alarmDetailsDto) { LoginUser loginUser = UserUtil.getCurrentUser(); alarmDetailsDto.setTenantId(loginUser.getTenantId()); alarmDetailsDto.setProgramItems(loginUser.getProgramItemList()); alarmDetailsDto.setUserType(loginUser.getType()); //1是公司,2是公司及以下,3部门,4部门及以下,5自定义 alarmDetailsDto.setPermissonType(loginUser.getPermissonType()); return alarmDetailMapper.selectList(alarmDetailsDto); } @Override public IPage selectPage(IPage page, AlarmDetailsDto alarmDetailsDto) { LoginUser loginUser = UserUtil.getCurrentUser(); alarmDetailsDto.setTenantId(loginUser.getTenantId()); alarmDetailsDto.setProgramItems(loginUser.getProgramItemList()); alarmDetailsDto.setUserType(loginUser.getType()); //1是公司,2是公司及以下,3部门,4部门及以下,5自定义 alarmDetailsDto.setPermissonType(loginUser.getPermissonType()); return alarmDetailMapper.selectPage(page,alarmDetailsDto); } @Override public List selectRealTimeList(AlarmDetailsDto alarmDetailsDto) { LoginUser loginUser = UserUtil.getCurrentUser(); alarmDetailsDto.setTenantId(loginUser.getTenantId()); alarmDetailsDto.setProgramItems(loginUser.getProgramItemList()); alarmDetailsDto.setUserType(loginUser.getType()); //1是公司,2是公司及以下,3部门,4部门及以下,5自定义 alarmDetailsDto.setPermissonType(loginUser.getPermissonType()); return alarmDetailMapper.selectRealTimeList(alarmDetailsDto); } @Override public IPage selectRealTimePage(IPage page, AlarmDetailsDto alarmDetailsDto) { LoginUser loginUser = UserUtil.getCurrentUser(); alarmDetailsDto.setTenantId(loginUser.getTenantId()); alarmDetailsDto.setProgramItems(loginUser.getProgramItemList()); alarmDetailsDto.setUserType(loginUser.getType()); //1是公司,2是公司及以下,3部门,4部门及以下,5自定义 alarmDetailsDto.setPermissonType(loginUser.getPermissonType()); return alarmDetailMapper.selectRealTimePage(page,alarmDetailsDto); } @Override public List selectHistoryList(AlarmDetailsDto alarmDetailsDto) { LoginUser loginUser = UserUtil.getCurrentUser(); alarmDetailsDto.setTenantId(loginUser.getTenantId()); alarmDetailsDto.setProgramItems(loginUser.getProgramItemList()); alarmDetailsDto.setUserType(loginUser.getType()); //1是公司,2是公司及以下,3部门,4部门及以下,5自定义 alarmDetailsDto.setPermissonType(loginUser.getPermissonType()); return alarmDetailMapper.selectHistoryList(alarmDetailsDto); } @Override public IPage selectHistoryPage(IPage page, AlarmDetailsDto alarmDetailsDto) { LoginUser loginUser = UserUtil.getCurrentUser(); alarmDetailsDto.setTenantId(loginUser.getTenantId()); alarmDetailsDto.setProgramItems(loginUser.getProgramItemList()); alarmDetailsDto.setUserType(loginUser.getType()); //1是公司,2是公司及以下,3部门,4部门及以下,5自定义 alarmDetailsDto.setPermissonType(loginUser.getPermissonType()); return alarmDetailMapper.selectHistoryPage(page,alarmDetailsDto); } public void checkStateAlarm(){ //所有设备数据 List deviceCheckAlarmDtos = alarmDetailMapper.selectDeviceForCheckAlarm(null,"状态报警"); //根据设置筛选出离线设备 List alarmlist = deviceCheckAlarmDtos.stream().filter(deviceCheckAlarmDto -> deviceCheckAlarmDto.checkdeviceOffLine()).collect(Collectors.toList()); //系统中已存在的离线报警 List alarmDetailsDtos = alarmDetailMapper.selectStateAlarm(null,"状态报警"); //已存在的报警信息转为map方便匹配 Map alarmDetailsDtoMap = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAlarmSettingId, a -> a,(k1, k2)->k1)); //需要新增的 List deviceStateAlarmDtoNews =alarmlist.stream() .filter(deviceCheckAlarmDto -> !alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId())) .map(d ->{ AlarmDetailsEntity alarmDetailsEntity = new AlarmDetailsEntity(); alarmDetailsEntity.setDateUpdate(new Date()); alarmDetailsEntity.setDateCreate(new Date()); alarmDetailsEntity.setStatus(1); alarmDetailsEntity.setOpState(1); alarmDetailsEntity.setState(1); alarmDetailsEntity.setParentSceneId(d.getParentSceneId()); alarmDetailsEntity.setParentSceneName(d.getParentSceneName()); alarmDetailsEntity.setSceneId(d.getSceneId()); alarmDetailsEntity.setSceneName(d.getSceneName()); alarmDetailsEntity.setAlarmStartTime(new Date()); alarmDetailsEntity.setAlarmContent(d.getDeviceName()+"离线时间"+d.getAlarmCondition() +d.getAlarmValue()+"分钟"); alarmDetailsEntity.setAlarmValue(d.getDuration()); alarmDetailsEntity.setAttributeId(d.getAttributeId()); alarmDetailsEntity.setAlarmType("状态报警"); alarmDetailsEntity.setDeptOrgId(d.getDeptOrgId()); alarmDetailsEntity.setCompanyOrgId(d.getCompanyOrgId()); alarmDetailsEntity.setDeviceId(d.getDeviceId()); alarmDetailsEntity.setTenantId(d.getTenantId()); alarmDetailsEntity.setAlarmSettingId(d.getAlarmSettingId()); Message message=new Message(); message.setStatus(1); message.setTenantId(d.getTenantId()); message.setMessageId(UUID.randomUUID().toString()); JSONObject jsonObject = new JSONObject(); //${场景名称}${设备名称}${状态}${报警规则}【${数值单位}】 jsonObject.put("场景名称",d.getSceneName()); jsonObject.put("设备名称",d.getDeviceName()); jsonObject.put("状态","离线"); jsonObject.put("报警规则",d.getAlarmCondition() +d.getAlarmValue()); jsonObject.put("数值单位","分钟"); message.setMessageContent(jsonObject.toJSONString()); //消息内容,如果需要动态使用,配合模板使用{key:value} message.setMessageType(2); //消息类型 message.setMessageTemplateId(2); //模板id message.setChannel(0); //渠道 Integer companyOrgId = d.getCompanyOrgId(); Integer departmentOrgId = d.getDeptOrgId(); List taskUsers = userCenterClient.findUserIdsByPermissonOrg(d.getTenantId(),companyOrgId,departmentOrgId); try{ if(taskUsers!=null){ taskUsers.forEach(id->{ message.setUserId(id); messageSendUtil.send(message); }); } }catch(Exception e){ e.printStackTrace(); log.info("推送报警消息失败:{}"+e.getMessage()); } return alarmDetailsEntity; }) .collect(Collectors.toList()); if(deviceStateAlarmDtoNews.size()>0){ alarmDetailMapper.batchInsert(deviceStateAlarmDtoNews); } //需要更新的 List DeviceStateAlarmDtoOlds =alarmlist.stream() .filter(deviceCheckAlarmDto -> alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId())) .map(d ->{ AlarmDetailsDto alarmDetailsDto = alarmDetailsDtoMap.get(d.getAlarmSettingId()); alarmDetailsDto.setDateUpdate(new Date()); alarmDetailsDto.setAlarmContent(d.getDeviceName()+"离线时间"+d.getAlarmCondition() +d.getAlarmValue()+"分钟"); alarmDetailsDto.setAlarmValue(d.getDuration()); alarmDetailMapper.update(alarmDetailsDto);//直接更新 alarmDetailsDtoMap.remove(d.getAlarmSettingId());//更新完成后从集合中移除,只剩下未处理的 return alarmDetailsDto; }) .collect(Collectors.toList()); //集合中剩下未处理的需要修改状态 Long currentTime =System.currentTimeMillis(); for(AlarmDetailsDto alarmDetailsDto:alarmDetailsDtoMap.values()){ alarmDetailsDto.setDateUpdate(new Date()); //从对象中拿到时间 Long startTime = alarmDetailsDto.getAlarmStartTime().getTime(); Long diff=(currentTime-startTime)/1000/60; alarmDetailsDto.setAlarmValue(diff.doubleValue()); alarmDetailsDto.setAlarmEndTime(new Date()); alarmDetailsDto.setState(0); alarmDetailMapper.update(alarmDetailsDto);//直接更新 } } public void saveWorkOrderManageInfo(){ List deviceAlarmInfoForOrders = alarmDetailMapper.getAlarmInfoForWorkOrderManage(); if(deviceAlarmInfoForOrders.size()>0){ List workOrderManageByAlarms = new ArrayList<>(); List errData= new ArrayList<>(); //组合工单,并发送消息 for(DeviceAlarmInfoForOrder deviceAlarmInfoForOrder : deviceAlarmInfoForOrders){ WorkOrderManageByAlarmDto workOrderManageByAlarm = new WorkOrderManageByAlarmDto(); workOrderManageByAlarm.setTaskNo(DatesUtil.formatDate(new Date(),"yyyyMMddHHmmssSSS")+((int) (Math.random()*(9999-1000)+1000))); workOrderManageByAlarm.setTenantId(deviceAlarmInfoForOrder.getTenantId()); workOrderManageByAlarm.setCompanyOrgId(deviceAlarmInfoForOrder.getCompanyOrgId()); workOrderManageByAlarm.setDepartmentOrgId(deviceAlarmInfoForOrder.getDepartmentOrgId()); workOrderManageByAlarm.setAddress(deviceAlarmInfoForOrder.getAddress()); workOrderManageByAlarm.setGeo(deviceAlarmInfoForOrder.getGeo()); workOrderManageByAlarm.setOrderTime(deviceAlarmInfoForOrder.getOrderTime()); workOrderManageByAlarm.setTaskDesc(deviceAlarmInfoForOrder.getTaskDesc()); Message message=new Message(); message.setStatus(1); message.setTenantId(deviceAlarmInfoForOrder.getTenantId()); message.setMessageId(UUID.randomUUID().toString()); JSONObject jsonObject = new JSONObject(); jsonObject.put("工单类型",""); jsonObject.put("工单编号",workOrderManageByAlarm.getTaskNo()); message.setMessageContent(jsonObject.toJSONString()); //消息内容,如果需要动态使用,配合模板使用{key:value} message.setMessageType(7); //消息类型 message.setMessageTemplateId(7); //模板id message.setChannel(0); //渠道 Integer companyOrgId = null; Integer departmentOrgId = null; if(StringUtils.isNotBlank(workOrderManageByAlarm.getCompanyOrgId())){ companyOrgId=Integer.valueOf(workOrderManageByAlarm.getCompanyOrgId()); } if(StringUtils.isNotBlank(workOrderManageByAlarm.getDepartmentOrgId())){ departmentOrgId=Integer.valueOf(workOrderManageByAlarm.getDepartmentOrgId()); } try{ List taskUsers = userCenterClient.findUserIdsByPermissonOrg(workOrderManageByAlarm.getTenantId(),companyOrgId,departmentOrgId); if(taskUsers!=null){ taskUsers.forEach(id->{ message.setUserId(id); messageSendUtil.send(message); }); } workOrderManageByAlarms.add(workOrderManageByAlarm); }catch (Exception e){ e.printStackTrace(); errData.add(deviceAlarmInfoForOrder); } } //去掉推送失败的数据 if(errData.size()>0){ deviceAlarmInfoForOrders.removeAll(errData); } //保存工单 Integer resut = operationManagerClient.saveByAlarms(workOrderManageByAlarms); if(resut > 0) { alarmDetailMapper.updateAlarmSendMessageState(deviceAlarmInfoForOrders); } } } }