Compare commits

...

6 Commits

@ -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,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) @Column(typeHandler = JacksonTypeHandler.class)
private JsonNode userData; 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-离线") @Schema(description = "在线状态1-在线, 0-离线")
private Integer status; private Integer status;
/**
* 0-1-
*/
@Column(isLogicDelete = true)
@Schema(description = "是否删除")
private String isDeleted;
@Schema(description = "创建时间") @Schema(description = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;

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

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

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

@ -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. 批量删除预置位

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

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

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