package com.casic.service.impl; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; import com.casic.model.DataH2s; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; @Service @Slf4j @RequiredArgsConstructor public class ThirdDataServiceImpl extends ServiceImpl<DataH2sMapper, DataH2s> implements ThirdDataService, H2sParamsEnum { private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; @Override public Object h2sData(Map<String, String> h2sDataMap) { try { if (h2sDataMap.containsKey(ICCID)) { //开机上报->存储映射管理->查询是否有下发配置-进行回应 return powerOnReport(h2sDataMap); } else if (h2sDataMap.containsKey(H2S_VALUE)) { //数据上报 if (ObjectUtils.isNotEmpty(h2sDataMap.get(DEVCODE))) { //清除离线-清除报警-报警-存库-查询是否有下发配置-进行回应 return dataSave(h2sDataMap); } } } catch (DataAccessException dae) { log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); } return defaultDeliveryConfig(null); } @Override public void configConfirm(Map<String, String> configConfirmMap) { if (configConfirmMap.containsKey(DEVCODE) && !StringUtils.isEmpty(configConfirmMap.get(DEVCODE))) { this.baseMapper.configConfirm(configConfirmMap.get(DEVCODE)); } } private Map<String, Object> defaultDeliveryConfig(Map<String, Object> configDataMap) { Map<String, Object> map = new HashMap(); //必带参数,否则会被thingsboard舍弃 map.put("method", "setParams"); //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { configDataMap.put("cycle", String.valueOf((Integer) configDataMap.get("interval"))); configDataMap.put("port", String.valueOf((Integer) configDataMap.get("port"))); configDataMap.put("period", String.valueOf((Integer) configDataMap.get("period"))); configDataMap.put("repeat", String.valueOf((Integer) configDataMap.get("repeat"))); configDataMap.remove("interval"); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); return map; } /** * 开机上报->储存,是否有下发配置,选择合适的格式返回 * * @param h2sDataMap */ private Map<String, Object> powerOnReport(Map<String, String> h2sDataMap) { /** * 三码上报 */ String iccid = (String) h2sDataMap.get(ICCID); String imei = (String) h2sDataMap.get(IMEI); String devcode = (String) h2sDataMap.get(DEVCODE); //清除离线 this.baseMapper.clearOnline(devcode); //先查,是否有数据,有数据直接覆盖,否则插入数据 String isImei = this.baseMapper.getImeiByDevcode(devcode); int save = StringUtils.isEmpty(isImei) ? this.baseMapper.addImeiDevcode(devcode, imei, iccid) : this.baseMapper.updateImeiDevcode(devcode, imei, iccid); if (save > 0) { //保存三码关系 Map<String, Object> configDataMap = redisCommon.getMsg((String) h2sDataMap.get(DEVCODE)); if (ObjectUtils.isNotEmpty(configDataMap)) { return defaultDeliveryConfig(configDataMap); } } else { throw new RuntimeException("三码上传保存异常,异常数据为" + JSON.toJSON(h2sDataMap)); } return defaultDeliveryConfig(null); } private Map<String, Object> dataSave(Map<String, String> h2sDataMap) { DataH2s dataH2s = initH2sData(h2sDataMap); this.baseMapper.clearOnline((String) h2sDataMap.get(DEVCODE)); if (ObjectUtils.isNotEmpty(dataH2s)) { checkAlarm(dataH2s); Map<String, Object> configDataMap = redisCommon.getMsg((String) h2sDataMap.get(DEVCODE)); if (ObjectUtils.isNotEmpty(configDataMap)) { return defaultDeliveryConfig(configDataMap); } } return defaultDeliveryConfig(null); } private DataH2s initH2sData(Map<String, String> h2sDataMap) { DataH2s dataH2s = new DataH2s(); String devcode = (String) h2sDataMap.get(DEVCODE); String wellCode = this.baseMapper.getWellCode(devcode); dataH2s.setWellCode(wellCode); dataH2s.setDevcode(devcode); dataH2s.setStrength((String) h2sDataMap.get(H2S_VALUE)); dataH2s.setCell((String) h2sDataMap.get(BATTERY_VALUE)); dataH2s.setUptime(dateFormat.format(new Date())); dataH2s.setLogtime(dateFormat.format(new Date())); this.baseMapper.insert(dataH2s); return dataH2s; } /** * 检查是否有报警 * * @param dataH2s */ private void checkAlarm(DataH2s dataH2s) { final Float ruleValue = this.baseMapper.getRuleValue("24"); if (ruleValue == null) { return; } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "3"; if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { //因新的报警消警 “0” status = "0"; alarmRecordMapper.insert(buildAlarmRecord(dataH2s)); } this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); } } private AlarmRecord buildAlarmRecord(DataH2s dataH2s) { AlarmRecord alarmRecord = AlarmRecord.builder() .devcode(dataH2s.getDevcode()) .wellCode(dataH2s.getWellCode()) .alarmType(dataH2s.getStrength()) .alarmMessage("浓度超限") .deviceId(dataH2s.getId()) .alarmType("1") .alarmContent("浓度超限") .status("1") .build(); return alarmRecord; } // "在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)) { // JSONArray msglist = new JSONArray(); // JSONObject msgMap = new JSONObject(); // 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 = ""; // List<String> aliSignNameList = new ArrayList<>(); // String aliSignName = aliYunConfig.getSignNameJson(); // if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { // String[] phones = alarmPushConfig.getPhoneArray().split(","); // List<String> phoneList = new ArrayList<>(); // for (String phone : phones) { // msglist.add(msgMap); // phoneList.add(phone); // aliSignNameList.add(aliSignName); // } // phoneJson = JSONObject.toJSONString(phoneList); // } // sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); // } // } } }