package com.casic.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.dao.AlarmDeviceMapper; import com.casic.dao.AlarmRecordsMapper; import com.casic.dao.ButaneDataMapper; import com.casic.entity.AlarmRecord; import com.casic.entity.ButaneData; import com.casic.entity.Device; import com.casic.model.ResponseData; import com.casic.service.AlarmRecordFly; import com.casic.service.DeviceService; import com.casic.util.DateUtils; import com.casic.util.SendUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import xyz.downgoon.snowflake.Snowflake; import java.text.ParseException; import java.util.*; import java.util.function.Supplier; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor public class DeviceServiceImpl implements DeviceService { private final ButaneDataMapper butaneDataMapper; private final AlarmRecordsMapper alarmRecordsMapper; private final AlarmDeviceMapper alarmDeviceMapper; private static Snowflake snowflake = new Snowflake(0, 2); @Autowired private SendUtil sendUtil; public List<Device> getGasList(List<String> devCodes) { QueryWrapper<Device> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("ACTIVE", "1"); queryWrapper.in(devCodes != null && devCodes.size() > 0, "DEVCODE", devCodes); return alarmDeviceMapper.selectList(queryWrapper); } public List<AlarmRecord> getAlarms(List<String> devCodes) { QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<>(); queryWrapper.select("DEVICE_CODE as deviceCode,RECORDCODE as recordcode ,max(RECORDDATE) as recorddate"); queryWrapper.eq("ACTIVE", "1"); queryWrapper.in(devCodes != null && devCodes.size() > 0, "DEVICE_CODE", devCodes); queryWrapper.groupBy("DEVICE_CODE","RECORDCODE"); queryWrapper.orderByDesc("RECORDDATE"); return alarmRecordsMapper.selectList(queryWrapper); } @Override public Page<Device> getDevices(String phone,String devCode,String shop, int pageNo, int pageSize) { Page<Device> page = new Page<>(pageNo, pageSize); QueryWrapper<Device> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("ACTIVE", "1"); queryWrapper.eq("DEVICETYPE_ID", 30); queryWrapper.eq(StringUtils.isNotEmpty(devCode),"DEVCODE", devCode); queryWrapper.like(StringUtils.isNotEmpty(shop),"FACTORY", shop); queryWrapper.like(StringUtils.isNotEmpty(phone), "SIMID", phone); Page<Device> iPage = alarmDeviceMapper.selectPage(page, queryWrapper); List<Device> deviceList = iPage.getRecords(); List<String> devStr = new ArrayList<>(); List<AlarmRecord> alarmRecordList = new ArrayList<>(); if (null != deviceList && deviceList.size() > 0) { devStr = deviceList.stream().map(Device::getDevCode).collect(Collectors.toList()); alarmRecordList = this.getAlarms(devStr); for (Device device : deviceList) { if (StringUtils.isNotEmpty(device.getFactory()) && device.getFactory().contains("(") && device.getFactory().contains(")")) { device.setDoorName(device.getFactory().substring(device.getFactory().indexOf("(")+1, device.getFactory().indexOf(")"))); device.setPosition(device.getFactory().substring(0, device.getFactory().indexOf("("))); } if (StringUtils.isNotEmpty(device.getFactory()) && device.getFactory().contains("(") && device.getFactory().contains(")")) { device.setDoorName(device.getFactory().substring(device.getFactory().indexOf("(")+1, device.getFactory().indexOf(")"))); device.setPosition(device.getFactory().substring(0, device.getFactory().indexOf("("))); } device.setStatus("正常"); for (AlarmRecord alarmRecord : alarmRecordList) { if (device.getDevCode().equals(alarmRecord.getDeviceCode())) { device.setStatus("0".equals(alarmRecord.getRecordcode())?"报警":"离线"); break; } } } } return iPage; } @Override public Page<ButaneData> getDatas(String devCode, int pageNo, int pageSize) { Page<ButaneData> page = new Page<>(pageNo, pageSize); QueryWrapper<ButaneData> queryWrapper = new QueryWrapper<>(); queryWrapper.eq(StringUtils.isNotEmpty(devCode), "DEVCODE", devCode); queryWrapper.orderByDesc("LOGTIME"); Page<ButaneData> dataPage = butaneDataMapper.selectPage(page, queryWrapper); List<ButaneData> butaneDataList = dataPage.getRecords(); butaneDataList.forEach(butaneData -> { if (null != butaneData.getLogtime()) { butaneData.setLogtimeStr(DateUtils.sdf7.format(butaneData.getLogtime())); } }); return dataPage; } @Override public Page<AlarmRecord> getAlarmRecords(String devCode, String begTime, String endTime, int pageNo, int pageSize) { Page<AlarmRecord> page = new Page<>(pageNo, pageSize); QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("active", 1); queryWrapper.eq("RECORDCODE", 0); queryWrapper.eq("DEVICE_TYPE_NAME", "可燃气体探测器"); queryWrapper.eq(StringUtils.isNotEmpty(devCode), "DEVICE_CODE", devCode); try { if (StringUtils.isNotEmpty(begTime)) { queryWrapper.ge("RECORDDATE", DateUtils.sdf4.parse(begTime)); } if (StringUtils.isNotEmpty(endTime)) { queryWrapper.le("RECORDDATE", DateUtils.sdf4.parse(endTime)); } } catch (ParseException e) { e.printStackTrace(); } queryWrapper.orderByDesc("RECORDDATE"); Page<AlarmRecord> dataPage = alarmRecordsMapper.selectPage(page, queryWrapper); List<AlarmRecord> alarmRecordList = dataPage.getRecords(); List<String> devCodeList = null; List<Device> deviceList = new ArrayList<>(); if (null != alarmRecordList && alarmRecordList.size() > 0) { devCodeList = alarmRecordList.stream().map(AlarmRecord::getDeviceCode).collect(Collectors.toList()); devCodeList = devCodeList.stream().distinct().collect(Collectors.toList()); deviceList = this.getGasList(devCodeList); } for (AlarmRecord alarmRecord : alarmRecordList) { if (null != alarmRecord.getRecorddate()) { alarmRecord.setRecorddateStr(DateUtils.sdf4.format(alarmRecord.getRecorddate())); } deviceList.forEach(device -> { if (alarmRecord.getDeviceCode().equals(device.getDevCode())) alarmRecord.setAlarmMsg("位于" .concat(StringUtils.isNotEmpty(device.getFactory()) ? device.getFactory() : "") .concat("的可燃气体探测器") .concat(alarmRecord.getDeviceCode()) .concat("发生报警!")); }); } return dataPage; } @Override public ResponseData testMysql() { ResponseData responseData = new ResponseData(); responseData.setMessage("保存成功"); responseData.setCode(1); return responseData; } /** * 处理上线/下线 * 数据上报 */ @Override public ResponseData saveDataGas(Map<String, Object> receiveData) { ResponseData responseData = new ResponseData(); try { Map<String, Object> payloadData = receiveData; if (receiveData.containsKey("payload")) { payloadData = (Map<String, Object>) receiveData.get("payload"); } this.flagSelectProcessor("gas_sensor_state", payloadData, () -> gasStatusUpdate(receiveData)) .flagSelectProcessor("heartbeat_time", payloadData, () -> dealNormalData(receiveData)); responseData.setCode(200); responseData.setMessage("保存成功"); } catch (Exception dex) { log.error("主题:燃气设备存储异常,异常信息:{}", dex.getMessage()); responseData.setCode(500); responseData.setMessage("保存异常"); } return responseData; } private DeviceServiceImpl flagSelectProcessor(String flagField, Map<String, Object> contentMap, Supplier cse) { if (contentMap.containsKey(flagField)) { cse.get(); } return this; } /** * 设备心跳数据保存 * * @param receiveData * @return */ private Boolean gasStatusUpdate(Map<String, Object> receiveData) { AlarmRecord alarmRecord = AlarmRecordFly.getAlarmRecord(); Map<String, Object> payloadData = (Map<String, Object>) receiveData.get("payload"); //判断事件类型 0正常 1低报 2高报 String alarmSituation = payloadData.get("gas_sensor_state").toString(); String devcode = receiveData.get("IMEI").toString(); //构建数据 ButaneData butaneData = ButaneData.builder() .devcode(devcode) .id(snowflake.nextId()) .build(); populateTime(receiveData, butaneData, alarmRecord); switch (alarmSituation) { case "0": // butaneData.setDescn("状态正常"); // butaneData.setStatus("0"); break; default: //第一条上来,消除报警 clearAlarmData(devcode); //产生新的报警,消除报警 butaneData.setDescn("可燃气体探测器报警"); butaneData.setStatus("1"); synchronized (alarmRecord) { alarmRecord.setDbid(null); alarmRecord.setDeviceCode(devcode); alarmRecord.setDeviceId(alarmRecordsMapper.getDevcode(devcode)); alarmRecordsMapper.insert(alarmRecord); } butaneDataMapper.insert(butaneData); try { //推送短信至第三方 Device device = alarmRecordsMapper.getDevice(devcode); if (null == device) { log.error("设备不存在,编号:" + devcode); return false; } JSONObject eventObj = new JSONObject(); eventObj.put("type", "燃气报警"); sendUtil.sendEventBySms(device, eventObj); } catch (Exception exception) { exception.printStackTrace(); } } return true; } public Boolean dealNormalData(Map<String, Object> receiveData) { String devcode = receiveData.get("IMEI").toString(); //第一条上来,消除报警 // clearAlarmData(devcode); ButaneData butaneData = ButaneData.builder() .devcode(devcode) .id(snowflake.nextId()) .descn("状态正常") .status("0") .build(); if (!ObjectUtils.isEmpty(receiveData) && receiveData.containsKey("timestamp")) { butaneData.setLogtime(new Date(Long.valueOf(receiveData.get("timestamp").toString()))); } else { butaneData.setLogtime(new Date()); } butaneDataMapper.insert(butaneData); return false; } private void populateTime(Map<String, Object> receiveData, ButaneData butaneData, AlarmRecord alarmRecord) { if (!ObjectUtils.isEmpty(receiveData) && receiveData.containsKey("timestamp")) { Date logtime = new Date(Long.valueOf(receiveData.get("timestamp").toString())); butaneData.setLogtime(logtime); alarmRecord.setRecorddate(logtime); } else { alarmRecord.setRecorddate(new Date()); butaneData.setLogtime(new Date()); } } private void clearAlarmData(String devcode) { QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper(); queryWrapper.eq("DEVICE_CODE", devcode); try { AlarmRecord alarmRecord = new AlarmRecord(); alarmRecord.setActive(0); alarmRecordsMapper.update(alarmRecord, queryWrapper); } catch (Exception e) { log.error("清除报警失败,设备编号为{},异常信息{}", devcode, e); } } @Override public Map<String,Object> getIndex() { QueryWrapper<Device> queryWrapper = new QueryWrapper<>(); queryWrapper.select("DEVCODE as devCode"); queryWrapper.eq("ACTIVE", "1"); queryWrapper.eq("DEVICETYPE_ID", 30); List<Device> deviceList = alarmDeviceMapper.selectList(queryWrapper); Map<String,Object> resultMap = new HashMap<>(); int devCount=0,alarmCount=0,offCount=0; if(null!=deviceList&&deviceList.size()>0) { devCount= deviceList.size(); List<String> devCodes = deviceList.stream().map(Device::getDevCode).collect(Collectors.toList()); QueryWrapper<AlarmRecord> recordQueryWrapper = new QueryWrapper<>(); recordQueryWrapper.select("DEVICE_CODE as deviceCode, RECORDCODE as recordcode ,max(RECORDDATE) as recorddate "); recordQueryWrapper.eq("ACTIVE", "1"); recordQueryWrapper.in("DEVICE_CODE", devCodes); recordQueryWrapper.groupBy("DEVICE_CODE","RECORDCODE"); recordQueryWrapper.orderByDesc("RECORDDATE"); List<AlarmRecord> alarmRecordList = alarmRecordsMapper.selectList(recordQueryWrapper); for(Device device:deviceList){ for(AlarmRecord alarmRecord:alarmRecordList){ if(device.getDevCode().equals(alarmRecord.getDeviceCode())){ if ("0".equals(alarmRecord.getRecordcode())) { alarmCount++; } else { offCount++; } break; } } } } resultMap.put("devCount",devCount); resultMap.put("alarmCount",alarmCount); resultMap.put("offCount",offCount); resultMap.put("onCount",devCount-offCount); return resultMap; } }