AlarmDetailsServiceImpl.java 16 KB

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