Newer
Older
kad / src / main / java / com / casic / service / impl / DeviceServiceImpl.java
casic_zt on 10 Oct 8 KB first commit
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);
                }
            }
        }
    }
}