package com.casic.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.dao.AlarmRecordsMapper; import com.casic.dao.ButaneDataMapper; import com.casic.dto.DeviceDTO; import com.casic.dto.EventDTO; import com.casic.dto.ThirdEventDTO; import com.casic.entity.AlarmRecord; import com.casic.entity.ButaneData; import com.casic.service.AlarmRecordFly; import com.casic.service.DeviceService; import com.casic.util.HttpUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import xyz.downgoon.snowflake.Snowflake; import javax.annotation.Resource; import java.util.*; import java.util.concurrent.TimeUnit; @Slf4j @Service @RequiredArgsConstructor public class DeviceServiceImpl implements DeviceService { @Resource private RedisTemplate<String, String> redisTemplate; @Value("${casic.kad-token-url}") private String kadTokenUrl; @Value("${casic.client-id}") private String clientId; @Value("${casic.client-secret}") private String clientSecret; private final ButaneDataMapper butaneDataMapper; private final AlarmRecordsMapper alarmRecordsMapper; private static Snowflake snowflake = new Snowflake(0, 2); @Override public String getGasToken() { //获取token String accessToken = redisTemplate.opsForValue().get("token"); // String accessToken = ""; if (StringUtils.isEmpty(accessToken)) { StringBuilder builder = new StringBuilder(); builder.append("client_id="); builder.append(clientId); builder.append("&client_secret="); builder.append(clientSecret); builder.append("&grant_type=client_credentials"); builder.append("&scope=server"); String param = builder.toString(); try { accessToken = HttpUtils.doPost(kadTokenUrl, param); if (StringUtils.isNotEmpty(accessToken)) { JSONObject jsonObject = JSONObject.parseObject(accessToken); accessToken = jsonObject.getString("access_token"); redisTemplate.opsForValue().set("token", accessToken, 1, TimeUnit.HOURS); } } catch (Exception e) { e.printStackTrace(); } } return accessToken; } @Override public void getDeviceList() { //由于每次只能取100台设备的数据,需分批获取,先默认500台 for (int deviceIndex = 0; deviceIndex < 5; deviceIndex++) { List<DeviceDTO> deviceDTOList = new ArrayList<>(); Map<String, Long> paramMap = new HashMap<>(); paramMap.put("pageNum", (deviceIndex + 1) * 1L); paramMap.put("pageSize", 100L); String deviceListStr = HttpUtils.post("https://openapi.wisualarm.com:443/device/api/page/deviceList", JSON.toJSONString(paramMap), getGasToken()); if (StringUtils.isNotEmpty(deviceListStr)) { JSONObject jsonObject = JSONObject.parseObject(deviceListStr); if ("0".equals(jsonObject.getString("code"))) { JSONObject dataJson = jsonObject.getJSONObject("data"); JSONArray jsonArray = dataJson.getJSONArray("rows"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject deviceJson = (JSONObject) jsonArray.get(i); //在线 if ("1".equals(deviceJson.getString("onOffLine"))) { DeviceDTO deviceDTO = new DeviceDTO(deviceJson.getString("deviceId") , deviceJson.getString("onOffLine") , deviceJson.getString("onOffLineName") , deviceJson.getString("productSubTypeName") , deviceJson.getString("alarmStatusName") , deviceJson.getString("devStatusName")); deviceDTOList.add(deviceDTO); } } } } if (deviceDTOList.size() > 0) { List<String> devCodes = new ArrayList<>(); deviceDTOList.forEach(deviceDTO -> { ButaneData butaneData = ButaneData.builder() .devcode(deviceDTO.getDeviceId()) .id(snowflake.nextId()) .descn("状态正常") .status("0") .logtime(new Date()) .build(); butaneDataMapper.insert(butaneData); devCodes.add(deviceDTO.getDeviceId()); }); //消除离线告警 clearAlarmData(devCodes); } } } private void clearAlarmData(List<String> devcodeList) { try { QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper(); queryWrapper.in("DEVICE_CODE", devcodeList); queryWrapper.in("RECORDCODE", "1"); AlarmRecord alarmRecord = new AlarmRecord(); alarmRecord.setActive(0); alarmRecordsMapper.update(alarmRecord, queryWrapper); } catch (Exception e) { log.error("清除报警失败,设备编号为{},异常信息{}", devcodeList, e); } } @Override public void saveAlarm(EventDTO eventDTO) { if (null != eventDTO) { String devCode = eventDTO.getDeviceId(); ThirdEventDTO thirdEventDTO = eventDTO.getThirdEvent(); if (thirdEventDTO == null) return; //火警 if ("7000".equals(thirdEventDTO.getEventCode())) { //告警 if ("1".equals(thirdEventDTO.getEventStatus())) { Long deviceId = alarmRecordsMapper.getDevcode(devCode); //设备未入库,舍弃 if (null == deviceId) return; AlarmRecord alarmRecord = AlarmRecordFly.getAlarmRecord(); alarmRecord.setDbid(null); alarmRecord.setDeviceCode(devCode); alarmRecord.setDeviceId(deviceId); alarmRecordsMapper.insert(alarmRecord); } //消警 else if ("0".equals(thirdEventDTO.getEventStatus())) { { QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper(); queryWrapper.in("DEVICE_CODE", devCode); queryWrapper.in("RECORDCODE", "0"); AlarmRecord alarmRecord = new AlarmRecord(); alarmRecord.setActive(0); alarmRecordsMapper.update(alarmRecord, queryWrapper); } } } //离线报警 else if ("7010".equals(thirdEventDTO.getEventCode())) { //告警 if ("1".equals(thirdEventDTO.getEventStatus())) { AlarmRecord alarmRecord = AlarmRecordFly.getAlarmRecord(); alarmRecord.setDbid(null); alarmRecord.setDeviceCode(devCode); alarmRecord.setDeviceId(alarmRecordsMapper.getDevcode(devCode)); alarmRecord.setRecordcode("1"); alarmRecord.setMessage("2"); alarmRecordsMapper.insert(alarmRecord); } } else if ("7014".equals(thirdEventDTO.getEventCode())) { //在线通知 if ("1".equals(thirdEventDTO.getEventStatus())) { QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper(); queryWrapper.in("DEVICE_CODE", devCode); queryWrapper.in("RECORDCODE", "1"); AlarmRecord alarmRecord = new AlarmRecord(); alarmRecord.setActive(0); alarmRecordsMapper.update(alarmRecord, queryWrapper); } } } } }