package com.sandu.ximon.admin.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.pagehelper.PageHelper; 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.MonitorParam; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.dao.bo.AirEquipmentBo; 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.mapper.MonitorMapper; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @AllArgsConstructor public class MonitorService extends BaseServiceImpl { private final MonitorMapper monitorMapper; //萤石云AppKey private static final String AppKey = "51a534ebadf54c31a0848dc575dfa206"; //萤石云 AppKey Secret private static final String Secret = "8c32c67a73c87b9e461b2e3bdf58967a"; //萤石云地址 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"; private final PoleBindingService poleBindingService; /** * 模糊查询 */ public List listMonitorByKeyword(BaseConditionVO baseConditionVO, MonitorParam monitorParam) { Long clientId = SecurityUtils.getClientId(); PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize()); List listAirEquipmentId; //绑定状态:已绑定/未绑定/全部 if (monitorParam.getBindingState() == null || 2 == monitorParam.getBindingState()) { //全部 int bindingState = 2; listAirEquipmentId = monitorMapper.listMonitorId(monitorParam.getKeyword(), clientId, bindingState); } else { listAirEquipmentId = monitorMapper.listMonitorId(monitorParam.getKeyword(), clientId, monitorParam.getBindingState()); } if (CollUtil.isEmpty(listAirEquipmentId)) { return CollUtil.newArrayList(); } List monitorList = monitorMapper.listMonitorByIds(listAirEquipmentId); return monitorList; } // /** // * 查询全部摄像头 // */ // public List listMonitor() { // LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(Monitor.class); // List list = list(wrapper); // // return list; // } // // /** // * 模糊查询 // */ // public List listMonitorByKeyword(MonitorParam monitorParam) { // //设备状态:在线/离线/全部 // int equipmentState1; // int equipmentState2; // if (2 == monitorParam.getEquipmentState()) { // //在线 // equipmentState1 = 1; // //离线 // equipmentState2 = 0; // } else { // equipmentState1 = monitorParam.getEquipmentState(); // equipmentState2 = monitorParam.getEquipmentState(); // } // // //绑定状态:已绑定/未绑定/全部 // int bindingState1; // int bindingState2; // if (2 == monitorParam.getBindingState()) { // //已绑定 // bindingState1 = 1; // //未绑定 // bindingState2 = 0; // } else { // bindingState1 = monitorParam.getBindingState(); // bindingState2 = monitorParam.getBindingState(); // } //// return monitorMapper.listMonitorByKeyword(monitorParam.getKeyword(), equipmentState1, equipmentState2, bindingState1, bindingState2); // return monitorMapper.listMonitorByKeyword1(baseConditionVO, monitorParam.getKeyword(), bindingState1, bindingState2); // } /** * 删除摄像头 * * @param Id * @return */ public boolean deleteMonitor(Long Id) { Monitor monitor = getById(Id); if (monitor == null) { throw new BusinessException("找不到摄像头"); } //删除摄像头设备前需要先解绑 poleBindingService.unBindPole(monitor.getDeviceSerial()); return removeById(Id); } /** * 获取萤石云accessToken */ public String getAccessToken() { Map 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(); } /** * 添加萤石云摄像头 * * @param accessToken 授权过程获取的access_token * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写 * @param validateCode 设备验证码,设备机身上的六位大写字母 */ public YSY_MonitorDto addYSYMonitor(String accessToken, String deviceSerial, String validateCode) { Map paramMap = new HashMap<>(); paramMap.put("accessToken", accessToken); paramMap.put("deviceSerial", deviceSerial); paramMap.put("validateCode", validateCode); String s = HttpUtil.post(YSY_URL + ADD_DEVICE_URL, paramMap); System.out.println(s); YSY_MonitorDto monitorDto = JSON.parseObject(s, YSY_MonitorDto.class); return monitorDto; } /** * 删除萤石云摄像头 * * @param accessToken 授权过程获取的access_token * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写 */ public YSY_MonitorDto deleteYSYMonitor(String accessToken, String deviceSerial) { Map paramMap = new HashMap<>(); paramMap.put("accessToken", accessToken); paramMap.put("deviceSerial", deviceSerial); String s = HttpUtil.post(YSY_URL + DELETE_DEVICE_URL, paramMap); System.out.println(s); YSY_MonitorDto monitorDto = JSON.parseObject(s, YSY_MonitorDto.class); return monitorDto; } /** * 获取萤石云摄像头单个设备信息 * * @param accessToken 授权过程获取的access_token * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写 */ public YSY_MonitorDto getYSYMonitorInfo(String accessToken, String deviceSerial) { Map 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 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()); } } }