Newer
Older
gas-app / src / main / java / com / casic / service / impl / DeviceServiceImpl.java
casic_zt on 6 Sep 2023 14 KB first commit
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;
    }

}