AlarmDetailsServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package com.huaxu.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.huaxu.client.OperationManagerClient;
  5. import com.huaxu.client.UserCenterClient;
  6. import com.huaxu.dao.AlarmDetailMapper;
  7. import com.huaxu.dto.*;
  8. import com.huaxu.entity.AlarmDetailsEntity;
  9. import com.huaxu.entity.Message;
  10. import com.huaxu.model.LoginUser;
  11. import com.huaxu.service.AlarmDetailsService;
  12. import com.huaxu.util.DatesUtil;
  13. import com.huaxu.util.MessageSendUtil;
  14. import com.huaxu.util.UserUtil;
  15. import lombok.extern.log4j.Log4j2;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Service;
  19. import javax.annotation.Resource;
  20. import java.util.*;
  21. import java.util.function.Function;
  22. import java.util.stream.Collectors;
  23. /**
  24. * @description
  25. * @auto wangli
  26. * @data 2020-11-17 15:48
  27. */
  28. @Service
  29. @Log4j2
  30. public class AlarmDetailsServiceImpl implements AlarmDetailsService {
  31. @Resource
  32. private AlarmDetailMapper alarmDetailMapper;
  33. @Autowired
  34. private OperationManagerClient operationManagerClient;
  35. @Autowired
  36. private UserCenterClient userCenterClient;
  37. @Autowired
  38. private MessageSendUtil messageSendUtil;
  39. @Override
  40. public AlarmDetailsDto selectById(Integer id) {
  41. return alarmDetailMapper.selectById(id);
  42. }
  43. @Override
  44. public List<AlarmDetailsDto> selectByDeviceId(Integer deviceId) {
  45. return alarmDetailMapper.selectByDeviceId(deviceId);
  46. }
  47. @Override
  48. public List<AlarmDetailsRealTimeDto> selectRealTimeByIds(List<Integer> ids) {
  49. return alarmDetailMapper.selectRealTimeByIds(ids);
  50. }
  51. @Override
  52. public List<AlarmDetailsHistoryDto> selectHistoryByIds(List<Integer> ids) {
  53. return alarmDetailMapper.selectHistoryByIds(ids);
  54. }
  55. @Override
  56. public Integer insert(AlarmDetailsEntity alarmDetailsEntity) {
  57. return alarmDetailMapper.insert(alarmDetailsEntity);
  58. }
  59. @Override
  60. public Integer batchInsert(List<AlarmDetailsEntity> alarmDetails) {
  61. return alarmDetailMapper.batchInsert(alarmDetails);
  62. }
  63. @Override
  64. public Integer deleteById(Integer id) {
  65. return alarmDetailMapper.deleteById(id);
  66. }
  67. @Override
  68. public Integer batchDelete(List<Integer> ids) {
  69. return alarmDetailMapper.batchDelete(ids);
  70. }
  71. @Override
  72. public Integer suspendedById(Integer id , Integer opState) {
  73. LoginUser loginUser = UserUtil.getCurrentUser();
  74. return alarmDetailMapper.suspendedById(id,opState,new Date(),loginUser.getUsername());
  75. }
  76. @Override
  77. public Integer update(AlarmDetailsEntity alarmDetailsEntity) {
  78. return alarmDetailMapper.update(alarmDetailsEntity);
  79. }
  80. @Override
  81. public List<AlarmDetailsDto> selectList(AlarmDetailsDto alarmDetailsDto) {
  82. LoginUser loginUser = UserUtil.getCurrentUser();
  83. alarmDetailsDto.setTenantId(loginUser.getTenantId());
  84. alarmDetailsDto.setProgramItems(loginUser.getProgramItemList());
  85. alarmDetailsDto.setUserType(loginUser.getType());
  86. //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
  87. alarmDetailsDto.setPermissonType(loginUser.getPermissonType());
  88. return alarmDetailMapper.selectList(alarmDetailsDto);
  89. }
  90. @Override
  91. public IPage<AlarmDetailsDto> selectPage(IPage<AlarmDetailsDto> page, AlarmDetailsDto alarmDetailsDto) {
  92. LoginUser loginUser = UserUtil.getCurrentUser();
  93. alarmDetailsDto.setTenantId(loginUser.getTenantId());
  94. alarmDetailsDto.setProgramItems(loginUser.getProgramItemList());
  95. alarmDetailsDto.setUserType(loginUser.getType());
  96. //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
  97. alarmDetailsDto.setPermissonType(loginUser.getPermissonType());
  98. return alarmDetailMapper.selectPage(page,alarmDetailsDto);
  99. }
  100. @Override
  101. public List<AlarmDetailsRealTimeDto> selectRealTimeList(AlarmDetailsDto alarmDetailsDto) {
  102. LoginUser loginUser = UserUtil.getCurrentUser();
  103. alarmDetailsDto.setTenantId(loginUser.getTenantId());
  104. alarmDetailsDto.setProgramItems(loginUser.getProgramItemList());
  105. alarmDetailsDto.setUserType(loginUser.getType());
  106. //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
  107. alarmDetailsDto.setPermissonType(loginUser.getPermissonType());
  108. return alarmDetailMapper.selectRealTimeList(alarmDetailsDto);
  109. }
  110. @Override
  111. public IPage<AlarmDetailsRealTimeDto> selectRealTimePage(IPage<AlarmDetailsRealTimeDto> page, AlarmDetailsDto alarmDetailsDto) {
  112. LoginUser loginUser = UserUtil.getCurrentUser();
  113. alarmDetailsDto.setTenantId(loginUser.getTenantId());
  114. alarmDetailsDto.setProgramItems(loginUser.getProgramItemList());
  115. alarmDetailsDto.setUserType(loginUser.getType());
  116. //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
  117. alarmDetailsDto.setPermissonType(loginUser.getPermissonType());
  118. return alarmDetailMapper.selectRealTimePage(page,alarmDetailsDto);
  119. }
  120. @Override
  121. public List<AlarmDetailsHistoryDto> selectHistoryList(AlarmDetailsDto alarmDetailsDto) {
  122. LoginUser loginUser = UserUtil.getCurrentUser();
  123. alarmDetailsDto.setTenantId(loginUser.getTenantId());
  124. alarmDetailsDto.setProgramItems(loginUser.getProgramItemList());
  125. alarmDetailsDto.setUserType(loginUser.getType());
  126. //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
  127. alarmDetailsDto.setPermissonType(loginUser.getPermissonType());
  128. return alarmDetailMapper.selectHistoryList(alarmDetailsDto);
  129. }
  130. @Override
  131. public IPage<AlarmDetailsHistoryDto> selectHistoryPage(IPage<AlarmDetailsHistoryDto> page, AlarmDetailsDto alarmDetailsDto) {
  132. LoginUser loginUser = UserUtil.getCurrentUser();
  133. alarmDetailsDto.setTenantId(loginUser.getTenantId());
  134. alarmDetailsDto.setProgramItems(loginUser.getProgramItemList());
  135. alarmDetailsDto.setUserType(loginUser.getType());
  136. //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
  137. alarmDetailsDto.setPermissonType(loginUser.getPermissonType());
  138. return alarmDetailMapper.selectHistoryPage(page,alarmDetailsDto);
  139. }
  140. public void checkStateAlarm(){
  141. //所有设备数据
  142. List<DeviceCheckAlarmDto> deviceCheckAlarmDtos = alarmDetailMapper.selectDeviceForCheckAlarm(null,"状态报警");
  143. //根据设置筛选出离线设备
  144. List<DeviceCheckAlarmDto> alarmlist = deviceCheckAlarmDtos.stream().filter(deviceCheckAlarmDto -> deviceCheckAlarmDto.checkdeviceOffLine()).collect(Collectors.toList());
  145. //系统中已存在的离线报警
  146. List<AlarmDetailsDto> alarmDetailsDtos = alarmDetailMapper.selectStateAlarm(null,"状态报警");
  147. //已存在的报警信息转为map方便匹配
  148. Map<Integer,AlarmDetailsDto> alarmDetailsDtoMap = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAlarmSettingId, a -> a,(k1, k2)->k1));
  149. //需要新增的
  150. List<AlarmDetailsEntity> deviceStateAlarmDtoNews =alarmlist.stream()
  151. .filter(deviceCheckAlarmDto -> !alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId()))
  152. .map(d ->{
  153. AlarmDetailsEntity alarmDetailsEntity = new AlarmDetailsEntity();
  154. alarmDetailsEntity.setDateUpdate(new Date());
  155. alarmDetailsEntity.setDateCreate(new Date());
  156. alarmDetailsEntity.setStatus(1);
  157. alarmDetailsEntity.setOpState(1);
  158. alarmDetailsEntity.setState(1);
  159. alarmDetailsEntity.setParentSceneId(d.getParentSceneId());
  160. alarmDetailsEntity.setParentSceneName(d.getParentSceneName());
  161. alarmDetailsEntity.setSceneId(d.getSceneId());
  162. alarmDetailsEntity.setSceneName(d.getSceneName());
  163. alarmDetailsEntity.setAlarmStartTime(new Date());
  164. alarmDetailsEntity.setAlarmContent(d.getDeviceName()+"离线时间"+d.getAlarmCondition() +d.getAlarmValue()+"分钟");
  165. alarmDetailsEntity.setAlarmValue(d.getDuration());
  166. alarmDetailsEntity.setAttributeId(d.getAttributeId());
  167. alarmDetailsEntity.setAlarmType("状态报警");
  168. alarmDetailsEntity.setDeptOrgId(d.getDeptOrgId());
  169. alarmDetailsEntity.setCompanyOrgId(d.getCompanyOrgId());
  170. alarmDetailsEntity.setDeviceId(d.getDeviceId());
  171. alarmDetailsEntity.setTenantId(d.getTenantId());
  172. alarmDetailsEntity.setAlarmSettingId(d.getAlarmSettingId());
  173. Message message=new Message();
  174. message.setStatus(1);
  175. message.setTenantId(d.getTenantId());
  176. message.setMessageId(UUID.randomUUID().toString());
  177. JSONObject jsonObject = new JSONObject();
  178. //${场景名称}${设备名称}${状态}${报警规则}【${数值单位}】
  179. jsonObject.put("场景名称",d.getSceneName());
  180. jsonObject.put("设备名称",d.getDeviceName());
  181. jsonObject.put("状态","离线");
  182. jsonObject.put("报警规则",d.getAlarmCondition() +d.getAlarmValue());
  183. jsonObject.put("数值单位","分钟");
  184. message.setMessageContent(jsonObject.toJSONString()); //消息内容,如果需要动态使用,配合模板使用{key:value}
  185. message.setMessageType(2); //消息类型
  186. message.setMessageTemplateId(2); //模板id
  187. message.setChannel(0); //渠道
  188. Integer companyOrgId = d.getCompanyOrgId();
  189. Integer departmentOrgId = d.getDeptOrgId();
  190. List<Integer> taskUsers = userCenterClient.findUserIdsByPermissonOrg(d.getTenantId(),companyOrgId,departmentOrgId);
  191. try{
  192. if(taskUsers!=null){
  193. taskUsers.forEach(id->{
  194. message.setUserId(id);
  195. messageSendUtil.send(message);
  196. });
  197. }
  198. }catch(Exception e){
  199. e.printStackTrace();
  200. log.info("推送报警消息失败:{}"+e.getMessage());
  201. }
  202. return alarmDetailsEntity;
  203. })
  204. .collect(Collectors.toList());
  205. if(deviceStateAlarmDtoNews.size()>0){
  206. alarmDetailMapper.batchInsert(deviceStateAlarmDtoNews);
  207. }
  208. //需要更新的
  209. List<AlarmDetailsEntity> deviceStateAlarmDtoOlds =alarmlist.stream()
  210. .filter(deviceCheckAlarmDto -> alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId()))
  211. .map(d ->{
  212. AlarmDetailsDto alarmDetailsDto = alarmDetailsDtoMap.get(d.getAlarmSettingId());
  213. alarmDetailsDto.setDateUpdate(new Date());
  214. alarmDetailsDto.setAlarmContent(d.getDeviceName()+"离线时间"+d.getAlarmCondition() +d.getAlarmValue()+"分钟");
  215. alarmDetailsDto.setAlarmValue(d.getDuration());
  216. alarmDetailMapper.update(alarmDetailsDto);//直接更新
  217. alarmDetailsDtoMap.remove(d.getAlarmSettingId());//更新完成后从集合中移除,只剩下未处理的
  218. return alarmDetailsDto;
  219. })
  220. .collect(Collectors.toList());
  221. //集合中剩下未处理的需要修改状态
  222. Long currentTime =System.currentTimeMillis();
  223. for(AlarmDetailsDto alarmDetailsDto:alarmDetailsDtoMap.values()){
  224. alarmDetailsDto.setDateUpdate(new Date());
  225. //从对象中拿到时间
  226. Long startTime = alarmDetailsDto.getAlarmStartTime().getTime();
  227. Long diff=(currentTime-startTime)/1000/60;
  228. alarmDetailsDto.setAlarmValue(diff.doubleValue());
  229. alarmDetailsDto.setAlarmEndTime(new Date());
  230. alarmDetailsDto.setState(0);
  231. alarmDetailMapper.update(alarmDetailsDto);//直接更新
  232. }
  233. //报警恢复的删除工单
  234. Map<Integer,AlarmDetailsEntity> AlarmDtoNewsMap = deviceStateAlarmDtoNews.stream().collect(Collectors.toMap(AlarmDetailsEntity::getDeviceId, a -> a,(k1, k2)->k1));
  235. Map<Integer,AlarmDetailsEntity> AlarmDtoOldsMap = deviceStateAlarmDtoOlds.stream().collect(Collectors.toMap(AlarmDetailsEntity::getDeviceId, a -> a,(k1, k2)->k1));
  236. Set<Long> deviceIds = alarmDetailsDtoMap.values().stream()
  237. .filter(a -> !(AlarmDtoNewsMap.containsKey(a.getDeviceId())||AlarmDtoOldsMap.containsKey(a.getDeviceId())))
  238. .map(a -> a.getDeviceId().longValue())
  239. .collect(Collectors.toSet());
  240. if(deviceIds.size()>0){
  241. operationManagerClient.batchDeleteByAlarms(new ArrayList<>(deviceIds));
  242. }
  243. }
  244. public void saveWorkOrderManageInfo(){
  245. List<DeviceAlarmInfoForOrder> deviceAlarmInfoForOrders = alarmDetailMapper.getAlarmInfoForWorkOrderManage();
  246. if(deviceAlarmInfoForOrders.size()>0){
  247. //获取已经存在的设备工单
  248. Set<Long> deviceIdSet = deviceAlarmInfoForOrders.stream().map(DeviceAlarmInfoForOrder::getDeviceId).collect(Collectors.toSet());
  249. List<WorkOrderManageByAlarmDto> workOrders = operationManagerClient.findWorkOrderByDeviceIds(new ArrayList<>(deviceIdSet));
  250. Map<Long,WorkOrderManageByAlarmDto> workOrderMap = workOrders.stream().collect(Collectors.toMap(WorkOrderManageByAlarmDto::getDeviceId, Function.identity(), (key1, key2) -> key2));
  251. List<WorkOrderManageByAlarmDto> workOrderManageByAlarms = new ArrayList<>();
  252. List<WorkOrderManageByAlarmDto> updates = new ArrayList<>();
  253. List<DeviceAlarmInfoForOrder> errData= new ArrayList<>();
  254. //组合工单,并发送消息
  255. for(DeviceAlarmInfoForOrder deviceAlarmInfoForOrder : deviceAlarmInfoForOrders){
  256. if(workOrderMap.containsKey(deviceAlarmInfoForOrder.getDeviceId()) && workOrderMap.get(deviceAlarmInfoForOrder.getDeviceId()) != null){
  257. WorkOrderManageByAlarmDto orderManageByAlarmDto = workOrderMap.get(deviceAlarmInfoForOrder.getDeviceId());
  258. orderManageByAlarmDto.setTaskDesc(orderManageByAlarmDto.getTaskDesc()+";"+deviceAlarmInfoForOrder.getTaskDesc());
  259. updates.add(orderManageByAlarmDto);
  260. continue;
  261. }
  262. WorkOrderManageByAlarmDto workOrderManageByAlarm = new WorkOrderManageByAlarmDto();
  263. workOrderManageByAlarm.setTaskNo(DatesUtil.formatDate(new Date(),"yyyyMMddHHmmssSSS")+((int) (Math.random()*(9999-1000)+1000)));
  264. workOrderManageByAlarm.setTenantId(deviceAlarmInfoForOrder.getTenantId());
  265. workOrderManageByAlarm.setParentSceneId(deviceAlarmInfoForOrder.getParentSceneId());
  266. workOrderManageByAlarm.setParentSceneName(deviceAlarmInfoForOrder.getParentSceneName());
  267. workOrderManageByAlarm.setDeviceId(deviceAlarmInfoForOrder.getDeviceId());
  268. workOrderManageByAlarm.setDeviceName(deviceAlarmInfoForOrder.getDeviceName());
  269. workOrderManageByAlarm.setCompanyOrgId(deviceAlarmInfoForOrder.getCompanyOrgId());
  270. workOrderManageByAlarm.setDepartmentOrgId(deviceAlarmInfoForOrder.getDepartmentOrgId());
  271. workOrderManageByAlarm.setAddress(deviceAlarmInfoForOrder.getAddress());
  272. workOrderManageByAlarm.setGeo(deviceAlarmInfoForOrder.getGeo());
  273. workOrderManageByAlarm.setOrderTime(deviceAlarmInfoForOrder.getOrderTime());
  274. workOrderManageByAlarm.setTaskDesc(deviceAlarmInfoForOrder.getTaskDesc());
  275. Message message=new Message();
  276. message.setStatus(1);
  277. message.setTenantId(deviceAlarmInfoForOrder.getTenantId());
  278. message.setMessageId(UUID.randomUUID().toString());
  279. JSONObject jsonObject = new JSONObject();
  280. jsonObject.put("工单类型"," ");
  281. jsonObject.put("工单编号",workOrderManageByAlarm.getTaskNo());
  282. message.setMessageContent(jsonObject.toJSONString()); //消息内容,如果需要动态使用,配合模板使用{key:value}
  283. message.setMessageType(7); //消息类型
  284. message.setMessageTemplateId(7); //模板id
  285. message.setChannel(0); //渠道
  286. Integer companyOrgId = null;
  287. Integer departmentOrgId = null;
  288. if(StringUtils.isNotBlank(workOrderManageByAlarm.getCompanyOrgId())){
  289. companyOrgId=Integer.valueOf(workOrderManageByAlarm.getCompanyOrgId());
  290. }
  291. if(StringUtils.isNotBlank(workOrderManageByAlarm.getDepartmentOrgId())){
  292. departmentOrgId=Integer.valueOf(workOrderManageByAlarm.getDepartmentOrgId());
  293. }
  294. try{
  295. List<Integer> taskUsers = userCenterClient.findUserIdsByPermissonOrg(workOrderManageByAlarm.getTenantId(),companyOrgId,departmentOrgId);
  296. if(taskUsers!=null){
  297. taskUsers.forEach(id->{
  298. message.setUserId(id);
  299. messageSendUtil.send(message);
  300. });
  301. }
  302. workOrderManageByAlarms.add(workOrderManageByAlarm);
  303. }catch (Exception e){
  304. e.printStackTrace();
  305. errData.add(deviceAlarmInfoForOrder);
  306. }
  307. }
  308. //去掉推送失败的数据
  309. if(errData.size()>0){
  310. deviceAlarmInfoForOrders.removeAll(errData);
  311. }
  312. //保存工单
  313. if(workOrderManageByAlarms.size()>0){
  314. operationManagerClient.saveByAlarms(workOrderManageByAlarms);
  315. }
  316. if(updates.size()>0){
  317. operationManagerClient.updateByAlarms(updates);
  318. }
  319. if(deviceAlarmInfoForOrders.size()>0){
  320. //标记报警已生成工单
  321. alarmDetailMapper.updateAlarmSendMessageState(deviceAlarmInfoForOrders);
  322. }
  323. }
  324. }
  325. }