package com.casic.service.impl; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.DataPressureMapper; import com.casic.model.AlarmPushConfig; import com.casic.model.DataPressure; import com.casic.model.PressureDataParam; import com.casic.model.ResponseData; import com.casic.service.AlarmPushService; import com.casic.service.MessagePusherService; import com.casic.service.ThirdDataService; import com.casic.util.SendBatchSmsUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Service @Slf4j public class ThirdDataServiceImpl extends ServiceImpl<DataPressureMapper, DataPressure> implements ThirdDataService { private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); @Autowired private AlarmPushService alarmPushService; @Autowired private MessagePusherService messagePusherService; @Autowired private SendBatchSmsUtil sendBatchSmsUtil; @Override public Object getDeviceRecentData(PressureDataParam pressureDataParam) { ResponseData responseData = new ResponseData(); try { batchSave(pressureDataParam); responseData.setMessage(ResponseData.DEFAULT_SUCCESS_MESSAGE); responseData.setCode(ResponseData.DEFAULT_SUCCESS_CODE); } catch (DataAccessException dae) { log.error("设备最近数据查询异常,设备类型{},异常信息{}", dae.getMessage()); responseData.setMessage(ResponseData.DEFAULT_ERROR_MESSAGE); responseData.setCode(ResponseData.DEFAULT_ERROR_CODE); } return responseData; } private void batchSave(PressureDataParam pressureDataParam) { String pressureDataJson = pressureDataParam.getRawData(); log.info("----" + pressureDataJson); Map<String, Object> pressureDataMap = JSON.parseObject(pressureDataJson, HashMap.class); Date uptime = null; try { uptime = dateFormat.parse(String.valueOf(pressureDataMap.get("times"))); } catch (Exception e) { log.error("主题,采集时间解析异常,异常信息{}", e.getMessage()); } List<Map<String, String>> pressureDataList = (List<Map<String, String>>) pressureDataMap.get("sensorDatas"); DataPressure dataPressure = initPrssureData(pressureDataList, uptime); if (dataPressure == null) { return; } checkAlarm(dataPressure); } private DataPressure initPrssureData(List<Map<String, String>> pressureDataList, Date uptime) { DataPressure dataPressure = new DataPressure(); String devcode = pressureDataList.get(pressureDataList.size() - 1).get("str"); Map<String, String> pressureDataMap = pressureDataList.stream().collect( Collectors.toMap(e -> String.valueOf(e.get("flag")), e -> String.valueOf(e.get("value"))) ); // if (CacheUtil.serialBuf.get(devcode)!=null&&CacheUtil.serialBuf.get(devcode).equals(pressureDataMap.get("F"))) { // return null; // } String wellCode = this.baseMapper.getWellCode(devcode); dataPressure.setWellCode(wellCode); dataPressure.setDevcode(devcode); dataPressure.setPci(pressureDataMap.get("Q")); dataPressure.setCell(Float.valueOf(pressureDataMap.get("V"))); dataPressure.setTemperature(pressureDataMap.get("T")); dataPressure.setPress(pressureDataMap.get("F")); dataPressure.setUptime(dateFormat.format(uptime)); dataPressure.setLogtime(dateFormat.format(new Date())); this.baseMapper.insert(dataPressure); // CacheUtil.serialBuf.put(devcode, pressureDataMap.get("F")); return dataPressure; } private void checkAlarm(DataPressure dataPressure) { final Float ruleValue = this.baseMapper.getRuleValue("24"); if (ruleValue == null) { return; } if (!StringUtils.isEmpty(dataPressure.getPress()) && !dataPressure.getPress().equals("null")) { if (Float.valueOf(dataPressure.getPress()) > ruleValue) { this.baseMapper.saveRecords(dataPressure.getPress(), new Date()); alarmPushBuilder(dataPressure.getDevcode(), dataPressure.getPress()); } } } // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" // + "设备" + devcode + "发生了压力超标,压力值为" + presss // private void alarmPushBuilder(String devcode, String presss) { ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); if (alarmPushConfig.getEnable().equals(1)) { if (alarmPushConfig.getWebsocketAlarm().equals(1)) { String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," + "设备" + devcode + "发生了压力超标,压力值为" + presss; try { messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); } catch (UnsupportedEncodingException uee) { log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); } } if (alarmPushConfig.getShortMessageAlarm().equals(1)) { Map<String, String> msgMap = new HashMap<>(); msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); msgMap.put("devcode", devcode); msgMap.put("value", presss); msgMap.put("content", "压力超标"); String phoneJson = ""; if (StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { String[] phones = alarmPushConfig.getPhoneArray().split(","); List<String> phoneList = new ArrayList<>(); for (String phone : phones) { phoneList.add(phone); } phoneJson = JSONObject.toJSONString(phoneList); } sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap)); } } } }