first commit

main
刘政 2 weeks ago
parent 35d6b29dda
commit bd1e474de7

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

@ -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;
}

@ -74,7 +74,7 @@ public class AlgorithmTask implements Serializable {
/** /**
* 0-1- * 0-1-
*/ */
@Column(isLogicDelete = true) // @Column(isLogicDelete = true)
@Schema(description = "是否删除") @Schema(description = "是否删除")
private String isDeleted; private String isDeleted;

@ -82,7 +82,7 @@ public class Camera implements Serializable {
/** /**
* 0-1- * 0-1-
*/ */
@Column(isLogicDelete = true) // @Column(isLogicDelete = true)
@Schema(description = "是否删除") @Schema(description = "是否删除")
private String isDeleted; private String isDeleted;

@ -48,7 +48,7 @@ public class CameraSnapshot implements Serializable {
/** /**
* 0-1- * 0-1-
*/ */
@Column(isLogicDelete = true) // @Column(isLogicDelete = true)
@Schema(description = "是否删除") @Schema(description = "是否删除")
private String isDeleted; private String isDeleted;

@ -47,7 +47,7 @@ public class Preset {
/** /**
* 0-1- * 0-1-
*/ */
@Column(isLogicDelete = true) // @Column(isLogicDelete = true)
@Schema(description = "是否删除") @Schema(description = "是否删除")
private String isDeleted; private String isDeleted;

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

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

Loading…
Cancel
Save