Compare commits

...

6 Commits

@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableScheduling;

@ -0,0 +1,26 @@
package com.sz.admin.monitor.listener.event;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
/**
* ClassName: ApplicationEventListener
* Package: com.sz.admin.monitor.listener.event
* Description:
*/
//@Slf4j
//@Service
public class ApplicationEventListener {
/**
*
*
* @param event
*/
// 监听ApplicationContext 初始化完成后的事件
// @EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
//log.info("执行相关的操作");
}
}

@ -0,0 +1,105 @@
package com.sz.admin.monitor.listener.event;
import com.sz.admin.monitor.listener.mode.CameraDeleteEvent;
import com.sz.admin.monitor.mapper.EdgeBoxMapper;
import com.sz.admin.monitor.pojo.po.Camera;
import com.sz.admin.monitor.pojo.po.EdgeBox;
import com.sz.admin.monitor.pojo.vo.edgebox.AlgorithmTaskVO;
import com.sz.admin.monitor.service.AlgorithmTaskService;
import com.sz.admin.monitor.service.CameraService;
import com.sz.admin.monitor.service.impl.CameraServiceImpl;
import com.sz.admin.monitor.utils.AiBoxRequestUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* ClassName: CameraDeleteEventListener
* Package: com.sz.admin.monitor.listener.event
* Description:
*/
@Component
@Slf4j
public class CameraDeleteEventListener {
@Resource
private CameraService cameraService;
@Resource
private AlgorithmTaskService algorithmTaskService;
@Resource
private EdgeBoxMapper edgeBoxMapper;
@Resource
private AiBoxRequestUtil aiBoxRequestUtil;
@EventListener
@Async
public void handleCameraDelete(CameraDeleteEvent event) {
List<Long> ids = event.getCameraIds();
try {
List<Camera> cameraList = cameraService.listByIds(ids);
if (cameraList.isEmpty()) return;
List<AlgorithmTaskVO> taskList = algorithmTaskService.listByCameraIds(ids);
// 一次性查询出这批摄像头管理的盒子
Set<Long> boxIdset = cameraList
.stream()
.map(Camera::getBoxId)
.collect(Collectors.toSet());
Map<Long, EdgeBox> boxMap=new HashMap<>();
if(!boxIdset.isEmpty())
{
List<EdgeBox> edgeBoxList = edgeBoxMapper.selectListByIds(boxIdset);
boxMap = edgeBoxList.stream().collect(Collectors.toMap(EdgeBox::getId, edgeBox -> edgeBox));
}
try {
// 批量删除本地数据
cameraService.batchDeleteLocalData(ids, taskList);
} catch (Exception e) {
log.error("本地数据库删除失败,中止后续硬件清理逻辑以防数据割裂!", e);
return;
}
// 清理盒子的算法任务
for (AlgorithmTaskVO task : taskList) {
if(task!=null && task.getAlgTaskSession()!=null)
{
Camera camera = cameraList.stream().filter(c -> c.getId().equals(task.getCameraId()))
.findFirst()
.orElse(null);
if(camera==null) continue;
EdgeBox edgeBox = boxMap.get(camera.getBoxId());
if(edgeBox==null) continue;
try {
aiBoxRequestUtil.controlTask(edgeBox.getIp(), edgeBox.getPort(), task.getAlgTaskSession(), 0);
aiBoxRequestUtil.deleteTask(edgeBox.getIp(), edgeBox.getPort(), task.getAlgTaskSession());
} catch (Exception e) {
log.error("清理 AI 盒子任务失败摄像机ID: {}, 忽略该错误继续执行...", task.getCameraId(), e);
}
}
}
// 清理盒子的通道
for (Camera camera : cameraList) {
Long boxId = camera.getBoxId();
if (boxId == null) continue;
EdgeBox edgeBox = boxMap.get(boxId);
if (edgeBox == null) continue;
try {
aiBoxRequestUtil.deleteVideoChannel(edgeBox.getIp(), edgeBox.getPort(), camera.getId().toString());
} catch (Exception e) {
log.error("清理 AI 盒子视频通道失败摄像机ID: {}", camera.getId(), e);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

@ -0,0 +1,18 @@
package com.sz.admin.monitor.listener.mode;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* ClassName: CameraDeleteEvent
* Package: com.sz.admin.monitor.listener.mode
* Description:
*/
@Data
@AllArgsConstructor
public class CameraDeleteEvent {
// 携带需要删除的摄像头 ID 集合
private List<Long> cameraIds;
}

@ -71,12 +71,6 @@ public class AlgorithmTask implements Serializable {
@Column(typeHandler = JacksonTypeHandler.class)
private JsonNode userData;
/**
* 0-1-
*/
@Column(isLogicDelete = true)
@Schema(description = "是否删除")
private String isDeleted;
/**
*

@ -79,12 +79,6 @@ public class Camera implements Serializable {
@Schema(description = "在线状态1-在线, 0-离线")
private Integer status;
/**
* 0-1-
*/
@Column(isLogicDelete = true)
@Schema(description = "是否删除")
private String isDeleted;
@Schema(description = "创建时间")
private LocalDateTime createTime;

@ -45,12 +45,7 @@ public class CameraSnapshot implements Serializable {
@Schema(description = "0-正常, 1-移位")
private Integer isAbnormal;
/**
* 0-1-
*/
@Column(isLogicDelete = true)
@Schema(description = "是否删除")
private String isDeleted;
@Schema(description = "抓拍时间")
private LocalDateTime createTime;

@ -44,12 +44,6 @@ public class Preset {
@Schema(description = "上报的url")
private String presetUrl;
/**
* 0-1-
*/
@Column(isLogicDelete = true)
@Schema(description = "是否删除")
private String isDeleted;
@Schema(description = "创建时间")
private LocalDateTime createdTime;

@ -14,6 +14,7 @@ import com.sz.admin.monitor.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

@ -1,34 +1,23 @@
package com.sz.admin.monitor.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mybatisflex.core.logicdelete.LogicDeleteManager;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.sz.admin.monitor.enums.HKPTZPreEnum;
import com.sz.admin.monitor.listener.mode.CameraDeleteEvent;
import com.sz.admin.monitor.mapper.*;
import com.sz.admin.monitor.pojo.dto.camera.CameraListDTO;
import com.sz.admin.monitor.pojo.dto.camera.CameraUpdateDTO;
import com.sz.admin.monitor.pojo.po.AlgorithmTask;
import com.sz.admin.monitor.pojo.po.Camera;
import com.sz.admin.monitor.pojo.po.EdgeBox;
import com.sz.admin.monitor.pojo.po.Nvr;
import com.sz.admin.monitor.pojo.po.table.CameraTableDef;
import com.sz.admin.monitor.pojo.vo.camera.CameraVO;
import com.sz.admin.monitor.pojo.vo.camerasnapshot.CameraSnapshotVO;
import com.sz.admin.monitor.pojo.vo.edgebox.AlgorithmTaskVO;
import com.sz.admin.monitor.pojo.vo.preset.PresetVO;
import com.sz.admin.monitor.sdk.ManageNVR;
import com.sz.admin.monitor.enums.HCPlayControlEnum;
import com.sz.admin.monitor.service.*;
import com.sz.admin.monitor.service.AlgorithmTaskService;
import com.sz.admin.monitor.service.CameraService;
import com.sz.admin.monitor.utils.AiBoxRequestUtil;
import com.sz.admin.monitor.utils.RtspUtil;
import com.sz.admin.monitor.utils.ZLMediaKitUtils;
import com.sz.admin.teacher.pojo.po.TeacherStatistics;
import com.sz.admin.teacher.pojo.vo.TeacherStatisticsVO;
import com.sz.core.common.entity.PageResult;
import com.sz.core.common.entity.SelectIdsDTO;
import com.sz.core.common.enums.CommonResponseEnum;
@ -38,10 +27,10 @@ import com.sz.core.util.BeanCopyUtils;
import com.sz.core.util.PageUtils;
import com.sz.core.util.Utils;
import com.sz.platform.enums.AdminResponseEnum;
import com.sz.security.core.util.LoginUtils;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -49,7 +38,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static com.sz.admin.monitor.pojo.po.table.NvrTableDef.NVR;
@ -75,6 +63,8 @@ public class CameraServiceImpl extends ServiceImpl<CameraMapper, Camera> impleme
private AiBoxRequestUtil aiBoxRequestUtil;
@Resource
private EdgeBoxMapper edgeBoxMapper;
@Resource
private ApplicationEventPublisher applicationEventPublisher;
// 自己注入自己
@Resource
@Lazy
@ -136,37 +126,45 @@ public class CameraServiceImpl extends ServiceImpl<CameraMapper, Camera> impleme
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void remove(SelectIdsDTO dto) {
CommonResponseEnum.INVALID_ID.assertTrue(dto.getIds().isEmpty());
List<Camera> cameraList = listByIds(dto.getIds());
if (cameraList.isEmpty()) {
return;
}
List<AlgorithmTaskVO> taskList = algorithmTaskService.listByCameraIds(dto.getIds());
for (AlgorithmTaskVO task : taskList) {
if (task != null && task.getAlgTaskSession() != null) {
try {
Long cameraId = task.getCameraId();
Camera camera = this.getById(cameraId);
Long boxId = camera.getBoxId();
EdgeBox edgeBox = edgeBoxMapper.selectOneById(boxId);
// 删除任务
aiBoxRequestUtil.controlTask(edgeBox.getIp(), edgeBox.getPort(), task.getAlgTaskSession(), 0);
aiBoxRequestUtil.deleteTask(edgeBox.getIp(), edgeBox.getPort(), task.getAlgTaskSession());
} catch (Exception e) {
log.error("清理 AI 盒子任务失败摄像机ID: {}, Session: {}", task.getCameraId(), task.getAlgTaskSession(), e);
throw new BusinessException(AdminResponseEnum.OPERATION_FAIL,null,"同步清理设备算法任务失败,请检查网络后重试");
}
}
}
for (Camera camera : cameraList) {
// 删除通道
Long boxId = camera.getBoxId();
EdgeBox edgeBox = edgeBoxMapper.selectOneById(boxId);
aiBoxRequestUtil.deleteVideoChannel(edgeBox.getIp(), edgeBox.getPort(), camera.getId().toString());
}
cameraService.batchDeleteLocalData(dto.getIds(), taskList);
// 直接删除摄像头
cameraMapper.deleteBatchByIds(dto.getIds());
// 发布事件
applicationEventPublisher.publishEvent(new CameraDeleteEvent((List<Long>) dto.getIds()));
// List<AlgorithmTaskVO> taskList = algorithmTaskService.listByCameraIds(dto.getIds());
// for (AlgorithmTaskVO task : taskList) {
// if (task != null && task.getAlgTaskSession() != null) {
// try {
// Long cameraId = task.getCameraId();
// Camera camera = this.getById(cameraId);
// Long boxId = camera.getBoxId();
// EdgeBox edgeBox = edgeBoxMapper.selectOneById(boxId);
// // 删除任务
// aiBoxRequestUtil.controlTask(edgeBox.getIp(), edgeBox.getPort(), task.getAlgTaskSession(), 0);
// aiBoxRequestUtil.deleteTask(edgeBox.getIp(), edgeBox.getPort(), task.getAlgTaskSession());
// } catch (Exception e) {
// log.error("清理 AI 盒子任务失败摄像机ID: {}, Session: {}", task.getCameraId(), task.getAlgTaskSession(), e);
// throw new BusinessException(AdminResponseEnum.OPERATION_FAIL,null,"同步清理设备算法任务失败,请检查网络后重试");
// }
// }
// }
// for (Camera camera : cameraList) {
// // 删除通道
// Long boxId = camera.getBoxId();
// if (boxId == null)
// continue;
// EdgeBox edgeBox = edgeBoxMapper.selectOneById(boxId);
// aiBoxRequestUtil.deleteVideoChannel(edgeBox.getIp(), edgeBox.getPort(), camera.getId().toString());
// }
// cameraService.batchDeleteLocalData(dto.getIds(), taskList);
}
@Transactional(rollbackFor = Exception.class)
public void batchDeleteLocalData(List<? extends Serializable> cameraIds, List<AlgorithmTaskVO> taskList) {
// 1. 批量删除预置位

@ -228,7 +228,7 @@ public class IpChannelServiceImpl extends ServiceImpl<CameraMapper, Camera> impl
}
// 开启和关闭云台守望
// 开启和关闭云台守望 0表示关闭1表示开启
@Override
@Transactional
public boolean ControlSentinel(Long id, int openOrNo, int watchTime, Integer presetIndex) {
@ -237,15 +237,19 @@ public class IpChannelServiceImpl extends ServiceImpl<CameraMapper, Camera> impl
{
flag = manageNVR.watchful(id.intValue(), openOrNo, watchTime, -1);
}else {
if(presetIndex==null)
{
throw new BusinessException(AdminResponseEnum.OPERATION_FAIL, null, "预置点不能为空");
}
flag = manageNVR.watchful(id.intValue(), openOrNo, watchTime, presetIndex);
}
if (flag) {
// 获取当前预置点的ptz坐标并且保存
PTZVO ptzLocation = manageNVR.getPTZLocation(id);
ptzLocation.setCameraId(id);
// PTZVO ptzLocation = manageNVR.getPTZLocation(id);
// ptzLocation.setCameraId(id);
// 将ptz保存到redis中
stringRedisTemplate.opsForValue().set("camera:sentinel", JSON.toJSONString(ptzLocation));
log.info("ptz 坐标:{}", ptzLocation);
// stringRedisTemplate.opsForValue().set("camera:sentinel", JSON.toJSONString(ptzLocation));
// log.info("ptz 坐标:{}", ptzLocation);
Camera camera = this.getById(id);
// 保存守望信息
camera.setWatchfulTime(watchTime);
@ -336,7 +340,6 @@ public class IpChannelServiceImpl extends ServiceImpl<CameraMapper, Camera> impl
algorithmTaskDTO.setUserData(userDataDto);
// DTO转PO
AlgorithmTask algorithmTask = BeanCopyUtils.copy(algorithmTaskDTO, AlgorithmTask.class);
algorithmTask.setIsDeleted("F");
algorithmTask.setCreateTime(createTime);
ObjectMapper mapper = new ObjectMapper();
try {

@ -1,6 +1,7 @@
package com.sz.admin.monitor.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.sz.admin.monitor.mapper.CameraMapper;
import com.sz.admin.monitor.mapper.PresetMapper;
@ -84,13 +85,12 @@ public class PresetServiceImpl extends ServiceImpl<PresetMapper, Preset> impleme
throw new BusinessException(AdminResponseEnum.CHANNEL_PRESET_FAIL, null, "当前预置位被设置为守望位,请先关闭或者修改守望位");
}
if (watchful.getWatchfulState() == 0 && isCurrentWatchful) {
Camera updateEntity = new Camera();
updateEntity.setWatchfulIndex(null);
QueryWrapper updateWrapper = QueryWrapper.create()
.from(CameraTableDef.CAMERA)
// update Camera set watchfulIndex = null where id = 132 and watchfulIndex = 1
UpdateChain.of(Camera.class)
.set(CameraTableDef.CAMERA.WATCHFUL_INDEX, null)
.where(CameraTableDef.CAMERA.ID.eq(dto.getCameraId()))
.and(CameraTableDef.CAMERA.WATCHFUL_INDEX.eq(dto.getCurrentPresetIndex()));
int updateCount = cameraMapper.updateByQuery(updateEntity, updateWrapper);
.and(CameraTableDef.CAMERA.WATCHFUL_INDEX.eq(dto.getCurrentPresetIndex()))
.update();
}
}
// 3. 删除预置位表中的数据

@ -96,7 +96,6 @@ public class AiBoxRequestUtil {
JSONObject responseJSON = new JSONObject();
responseJSON.put("code", CommonResponseEnum.MEDIA_HTTP_FAIL.getCode());
responseJSON.put("msg", CommonResponseEnum.MEDIA_HTTP_FAIL.getMessage());
MediaType JSON_TYPE = MediaType.parse("application/json; charset=utf-8");
String jsonString = "";
if (param != null) {

Loading…
Cancel
Save