2021与蓝度共同重构项目,服务端
fix
zhanzhiqin
2022-05-10 120fdb31f376deaf55001286bdeef26d268eeab2
ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java
@@ -1,65 +1,147 @@
package com.sandu.ximon.admin.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.domain.CommonPage;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.param.BannerParam;
import com.sandu.ximon.admin.param.MonitorParam;
import com.sandu.ximon.dao.domain.Banner;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.ListPagingUtils;
import com.sandu.ximon.admin.vo.EquipmentInfomation;
import com.sandu.ximon.dao.bo.MonitorBo;
import com.sandu.ximon.dao.domain.Monitor;
import com.sandu.ximon.admin.dto.YSY_AccessTokenDto;
import com.sandu.ximon.admin.dto.YSY_MonitorDto;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.mapper.MonitorMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
@Service
@AllArgsConstructor
public class MonitorService extends BaseServiceImpl<MonitorMapper, Monitor> {
    private final MonitorMapper monitorMapper;
    //萤石云AppKey
    private static final String AppKey = "51a534ebadf54c31a0848dc575dfa206";
    //萤石云 AppKey Secret
    private static final String Secret = "8c32c67a73c87b9e461b2e3bdf58967a";
    /**
     * 查询全部摄像头
     */
    public List<Monitor> listMonitor() {
        LambdaQueryWrapper<Monitor> wrapper = Wrappers.lambdaQuery(Monitor.class);
        List<Monitor> list = list(wrapper);
    //萤石云地址
    private static final String YSY_URL = "https://open.ys7.com/api/lapp";
    //获取萤石云accessToken地址
    private static final String ACCESSTOKEN_URL = "/token/get";
    //添加萤石云摄像头
    private static final String ADD_DEVICE_URL = "/device/add";
    //删除萤石云摄像头
    private static final String DELETE_DEVICE_URL = "/device/delete";
    //获取萤石云单个设备信息
    private static final String GET_DEVICE_URL = "/device/info";
    //获取萤石云摄像头播放地址URL
    private static final String GET_VEDIO_URL = "/v2/live/address/get";
        return list;
    }
    private final PoleBindingService poleBindingService;
    /**
     * 模糊查询
     */
    public List<Monitor> listMonitorByKeyword(MonitorParam monitorParam) {
        //设备状态:在线/离线/全部
        int equipmentState1;
        int equipmentState2;
        if (2 == monitorParam.getEquipmentState()) {
            //在线
            equipmentState1 = 1;
            //离线
            equipmentState2 = 0;
    public CommonPage listMonitorByKeyword(BaseConditionVO baseConditionVO, MonitorParam monitorParam) {
        //绑定状态:已绑定/未绑定/全部
        if (monitorParam.getBindingState() == null) {
            //全部
            monitorParam.setBindingState(2);
        }
        List<MonitorBo> list;
        if (SecurityUtils.getClientId() == null) {
            list = monitorMapper.listMonitorDeviceSerial1(null, monitorParam.getKeyword(), monitorParam.getBindingState());
        } else {
            equipmentState1 = monitorParam.getEquipmentState();
            equipmentState2 = monitorParam.getEquipmentState();
            list = monitorMapper.listMonitorDeviceSerial1(SecurityUtils.getUserId(), monitorParam.getKeyword(), monitorParam.getBindingState());
        }
        //绑定状态:已绑定/未绑定/全部
        int bindingState1;
        int bindingState2;
        if (2 == monitorParam.getBindingState()) {
            //已绑定
            bindingState1 = 1;
            //未绑定
            bindingState2 = 0;
        } else {
            bindingState1 = monitorParam.getBindingState();
            bindingState2 = monitorParam.getBindingState();
        //没有数据时候直接返回空数组
        if (list.size() == 0 || list == null) {
            return new CommonPage();
        }
        return monitorMapper.listMonitorByKeyword(monitorParam.getKeyword(), equipmentState1, equipmentState2, bindingState1, bindingState2);
        List<String> device_serialList = new ArrayList<>(list.size());
        CountDownLatch latch = new CountDownLatch(list.size());
        for (Monitor demo : list) {
            device_serialList.add(demo.getDeviceSerial());
            getMonitorInfo_Async(demo, latch);
        }
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (monitorParam.getEquipmentState() == null) {
            //全部
            monitorParam.setEquipmentState(2);
        }
        List<MonitorBo> temp = new ArrayList<>();
        if (monitorParam.getEquipmentState() == 2) {
            temp.addAll(list);
        } else {
            for (MonitorBo monitorBo : list) {
                //筛选状态数据
                if (monitorBo.getEquipmentState().equals(monitorParam.getEquipmentState())) {
                    temp.add(monitorBo);
                }
            }
        }
        if (baseConditionVO == null) {
            baseConditionVO = new BaseConditionVO();
            baseConditionVO.setPageSize(null);
            baseConditionVO.setPageNo(null);
        }
        CommonPage commonPage = ListPagingUtils.pages(temp, baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        return commonPage;
    }
    public Monitor getYSYMonitorInfoAndaddMonitorToTable(String deviceSerial) {
        YSY_MonitorDto getMonitorDto = getYSYMonitorInfo(getAccessToken(), deviceSerial);
        if ("200".equals(getMonitorDto.getCode())) {
            Monitor monitor = getOne(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, deviceSerial));
            if (monitor != null) {
                monitor.setDeviceSerial(getMonitorDto.getData().getDeviceSerial());
                monitor.setDeviceName(getMonitorDto.getData().getDeviceName());
                monitor.setDeviceType(getMonitorDto.getData().getModel());
                monitor.setEquipmentState(getMonitorDto.getData().getStatus());
                monitor.setIsEncrypt(getMonitorDto.getData().getIsEncrypt());
                monitor.setAddTime(getMonitorDto.getData().getUpdateTime());
                monitor.setNetAddress(getMonitorDto.getData().getNetAddress());
                //更新摄像头状态
                updateById(monitor);
            } else {
                monitor = new Monitor();
                monitor.setDeviceSerial(getMonitorDto.getData().getDeviceSerial());
                monitor.setDeviceName(getMonitorDto.getData().getDeviceName());
                monitor.setDeviceType(getMonitorDto.getData().getModel());
                monitor.setEquipmentState(getMonitorDto.getData().getStatus());
                monitor.setIsEncrypt(getMonitorDto.getData().getIsEncrypt());
                monitor.setAddTime(getMonitorDto.getData().getUpdateTime());
                monitor.setNetAddress(getMonitorDto.getData().getNetAddress());
                //更新摄像头状态
                save(monitor);
            }
            return monitor;
        } else {
            return null;
        }
    }
    /**
@@ -73,8 +155,254 @@
        if (monitor == null) {
            throw new BusinessException("找不到摄像头");
        }
        PoleBinding one = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, monitor.getDeviceSerial()));
        if (one != null) {
            //删除摄像头设备前需要先解绑
            poleBindingService.unBindPole(null, monitor.getDeviceSerial());
        }
        return removeById(Id);
    }
    /**
     * 获取萤石云accessToken
     */
    public String getAccessToken() {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("appKey", AppKey);
        paramMap.put("appSecret", Secret);
        String s = HttpUtil.post(YSY_URL + ACCESSTOKEN_URL, paramMap);
        YSY_AccessTokenDto accessTokenDto = JSON.parseObject(s, YSY_AccessTokenDto.class);
        return accessTokenDto.getData().getAccessToken();
    }
    /**
     * 获取萤石云摄像头信息(异步)
     *
     * @return
     */
    public void getMonitorInfo_Async(Monitor monitor, CountDownLatch countDownLatch) {
        Thread t = new Thread() {
            @Override
            public void run() {
                String token = getAccessToken();
                Map<String, Object> paramMap = new HashMap<>();
                paramMap.put("accessToken", token);
                paramMap.put("deviceSerial", monitor.getDeviceSerial());
                String s = HttpUtil.post(YSY_URL + GET_DEVICE_URL, paramMap);
                YSY_MonitorDto monitorDto = null;
                try {
                    monitorDto = JSON.parseObject(s, YSY_MonitorDto.class);
                    System.out.println(s + "       ----------");
                    monitor.setEquipmentState(monitorDto.getData().getStatus());
                    countDownLatch.countDown();
                } catch (Exception e) {
                    monitor.setEquipmentState(0);
                    countDownLatch.countDown();
                }
            }
        };
        t.start();
    }
    /**
     * 获取萤石云摄像头信息  无需验证accessToken
     *
     * @return
     */
    public EquipmentInfomation getMonitorInfo(String deviceSerial) {
        EquipmentInfomation equipmentInfo = new EquipmentInfomation();
        equipmentInfo.setEquipmentType("摄像头");
        if (deviceSerial == null || deviceSerial.trim().length() == 0) {
            return equipmentInfo;
        }
        Monitor one = getOne(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, deviceSerial));
        if (one != null) {
            equipmentInfo.setEquipmentCreateTime(one.getAddTime());
            equipmentInfo.setEquipmentMac(one.getDeviceSerial());
        }
        String token = getAccessToken();
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("accessToken", token);
        paramMap.put("deviceSerial", deviceSerial);
        String s = HttpUtil.post(YSY_URL + GET_DEVICE_URL, paramMap);
        try {
            YSY_MonitorDto monitorDto = JSON.parseObject(s, YSY_MonitorDto.class);
            if (monitorDto != null) {
                //在线状态:0-不在线,1-在线
                if (monitorDto.getData().getStatus() == 1) {
                    equipmentInfo.setEquipmentState("在线");
                } else {
                    equipmentInfo.setEquipmentState("离线");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return equipmentInfo;
    }
    /**
     * 添加萤石云摄像头
     *
     * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写
     *                     //     * @param validateCode 设备验证码,设备机身上的六位大写字母
     */
    public boolean addYSYMonitor(String deviceSerial, String validateCode) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("accessToken", getAccessToken());
        paramMap.put("deviceSerial", deviceSerial);
        if (validateCode != null && validateCode.trim().length() != 0) {
            paramMap.put("validateCode", validateCode);
        }
        String s = HttpUtil.post(YSY_URL + ADD_DEVICE_URL, paramMap);
        YSY_MonitorDto monitorDto = JSON.parseObject(s, YSY_MonitorDto.class);
        if ("200".equals(monitorDto.getCode()) || "20017".equals(monitorDto.getCode())) {
            Monitor monitor = new Monitor();
            monitor.setDeviceSerial(monitorDto.getData().getDeviceSerial());
            monitor.setDevicesCode(validateCode);
            monitor.setDeviceName(monitorDto.getData().getDeviceName());
            monitor.setEquipmentState(monitorDto.getData().getStatus());
            monitor.setIsEncrypt(monitorDto.getData().getIsEncrypt());
            monitor.setDeviceType(monitorDto.getData().getModel());
            monitor.setNetAddress(monitorDto.getData().getNetAddress());
            return addMonitorInfoToTable(monitor);
        } else {
            return false;
        }
    }
    /**
     * 获取萤石云摄像头单个设备信息
     *
     * @param accessToken  授权过程获取的access_token
     * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写
     */
    public YSY_MonitorDto getYSYMonitorInfo(String accessToken, String deviceSerial) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("accessToken", accessToken);
        paramMap.put("deviceSerial", deviceSerial);
        String s = HttpUtil.post(YSY_URL + GET_DEVICE_URL, paramMap);
        System.out.println(s);
        YSY_MonitorDto monitor = JSON.parseObject(s, YSY_MonitorDto.class);
        return monitor;
    }
    /**
     * 将摄像头设备相关信息存储到数据库
     *
     * @param monitor 摄像头对象
     * @return
     */
    public boolean addMonitorInfoToTable(Monitor monitor) {
        Monitor one = getOne(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, monitor.getDeviceSerial()));
        if (one == null) {
            return save(monitor);
        } else {
            monitor.setId(one.getId());
            return updateById(monitor);
        }
    }
    /**
     * 将摄像头设备相关信息更新到数据库
     *
     * @param monitor 摄像头对象
     * @return
     */
    public boolean upDateMonitorInfo(Monitor monitor) {
        if (monitor.getId() == null) {
            throw new BusinessException("缺少摄像头相关ID参数");
        }
        Monitor info = getById(monitor.getId());
        if (info == null) {
            throw new BusinessException("找不到相关摄像头");
        }
        if (!monitor.getDevicesCode().equals(info.getDevicesCode()) || !monitor.getDeviceSerial().equals(info.getDeviceSerial())) {
            throw new BusinessException("监控序列号或监控验证码不正确");
        }
        return updateById(monitor);
    }
    /**
     * 返回摄像头实时画面播放地址
     *
     * @param accessToken
     * @param deviceSerial
     * @return
     */
    public String getMonitorVideoUrl(String accessToken, String deviceSerial, int protocol, int expireTime) {
        if (expireTime < 30 || expireTime > 62208000) {
            throw new BusinessException("设置的URL播放地址过期时长数据错误");
        }
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("accessToken", accessToken);
        paramMap.put("deviceSerial", deviceSerial);
        paramMap.put("protocol", protocol);
        paramMap.put("expireTime", expireTime);
        String s = HttpUtil.post(YSY_URL + GET_VEDIO_URL, paramMap);
        System.out.println(s);
        YSY_MonitorDto monitor = JSON.parseObject(s, YSY_MonitorDto.class);
        if ("200".equals(monitor.getCode())) {
            return monitor.getData().getUrl();
        } else {
            throw new BusinessException(monitor.getMsg());
        }
    }
    /**
     * 修改设备绑定状态
     *
     * @param flag true为绑定  false 为解绑
     */
    public void updateBingdingState(boolean flag, String deviceCode) {
        if (flag) {//绑定
            Monitor monitor = getOne(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, deviceCode));
            if (monitor == null) {
                return;
            }
            monitor.setBindingState(1);
            updateById(monitor);
        } else {//解绑
            Monitor monitor = getOne(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, deviceCode));
            if (monitor == null) {
                return;
            }
            monitor.setBindingState(0);
            updateById(monitor);
        }
    }
    /**
     * 修改note
     *
     * @param deviceSerial
     * @param notes
     * @return
     */
    public boolean updateNotes(String deviceSerial, String notes) {
        if (deviceSerial == null || deviceSerial.trim().length() == 0 || notes == null) {
            throw new BusinessException("修改备注参数有误!");
        }
        Monitor one = getOne(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, deviceSerial));
        if (one != null) {
            one.setNote(notes);
            return updateById(one);
        } else {
            throw new BusinessException("摄像头设备不存在!");
        }
    }
}