执法记录仪的状态改成取isc的监控状态

This commit is contained in:
guoshengxiong 2025-11-05 17:32:55 +08:00
parent 702642e49b
commit 856a176426
5 changed files with 147 additions and 42 deletions

View File

@ -123,9 +123,9 @@ public class PoliceCameraItem implements Serializable {
@ApiModelProperty(value = "电量")
private java.lang.String batteryLevel;
/**
* 设备状态1在线2离线
* 设备状态1在线2离线监控
*/
@ApiModelProperty(value = "设备状态1在线2离线")
@ApiModelProperty(value = "设备状态1在线2离线(监控)")
private java.lang.Integer deviceState;
/**
* 排序

View File

@ -0,0 +1,14 @@
package com.zhgd.xmgl.modules.policecamera.entity.bo;
import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PoliceCameraVideoConfigBo extends PoliceCameraVideoConfig {
/**
*projectSns
*/
@ApiModelProperty("projectSns")
private String projectSns;
}

View File

@ -1,18 +1,17 @@
package com.zhgd.xmgl.modules.policecamera.mapper;
import java.util.List;
import java.util.HashMap;
import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig;
import com.zhgd.xmgl.modules.policecamera.entity.vo.PoliceCameraVideoConfigVo;
import com.zhgd.xmgl.modules.policecamera.entity.dto.PoliceCameraVideoConfigDto;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig;
import com.zhgd.xmgl.modules.policecamera.entity.vo.PoliceCameraVideoConfigVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.HashMap;
import java.util.List;
/**
* @Description: 执法记录仪视频配置

View File

@ -61,24 +61,24 @@ public class Mcs8Task {
}
/**
* 定时更新执法仪设备状态
*/
@Scheduled(cron = "*/5 * * * * ?")
@RequestMapping("updateStatus")
public void updateStatus() {
List<Project> projects = projectService.list();
for (Project project : projects) {
try {
PoliceCameraManufacturer manufacturer = policeCameraManufacturerFactory.getPoliceCameraManufacturer(project.getProjectSn());
if (manufacturer != null) {
manufacturer.updateStatus(3L);
}
} catch (Exception e) {
log.error("定时更新执法仪设备状态err{}", project.getProjectName(), e);
}
}
}
// /**
// * 定时更新执法仪设备状态
// */
// @Scheduled(cron = "*/5 * * * * ?")
// @RequestMapping("updateStatus")
// public void updateStatus() {
// List<Project> projects = projectService.list();
// for (Project project : projects) {
// try {
// PoliceCameraManufacturer manufacturer = policeCameraManufacturerFactory.getPoliceCameraManufacturer(project.getProjectSn());
// if (manufacturer != null) {
// manufacturer.updateStatus(3L);
// }
// } catch (Exception e) {
// log.error("定时更新执法仪设备状态err{}", project.getProjectName(), e);
// }
// }
// }
}

View File

@ -10,6 +10,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zhgd.xmgl.async.AsyncEnvironment;
import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraItem;
import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig;
import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraItemService;
import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraVideoConfigService;
import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig;
import com.zhgd.xmgl.modules.project.entity.bo.ProjectVideoConfigBo;
import com.zhgd.xmgl.modules.project.enums.ProjectVideoConfigVideoTypeEnum;
@ -55,6 +59,12 @@ public class VideoTask {
@Lazy
@Autowired
private VideoItemServiceImpl videoItemService;
@Lazy
@Autowired
private IPoliceCameraVideoConfigService policeCameraVideoConfigService;
@Lazy
@Autowired
private IPoliceCameraItemService policeCameraItemService;
@SchedulerLock(name = "updateVideoState", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5)
@Scheduled(cron = "0 */3 * * * ?")
@ -151,20 +161,23 @@ public class VideoTask {
if (CollUtil.isEmpty(itemDbs)) {
continue;
}
do {
resultJo = HikVideoUtil.callPostApiOnlineStatus(videoConfig.getAccount(),
videoConfig.getPassword(), videoConfig.getAppId(),
videoConfig.getAppSecret(), ++pageNo);
if (resultJo != null && "0".equals(resultJo.getString("code"))) {
alls.addAll(resultJo.getJSONObject("data").getJSONArray("list"));
} else {
log.error("高频更新isc监控状态返回错误:项目sn:{}:code:{},msg:{}",
videoConfig.getProjectSn(), resultJo != null ? resultJo.getString("code") : "",
resultJo != null ? resultJo.getString("msg") : "");
break;
}
} while (pageNo * 1000 < resultJo.getJSONObject("data").getInteger("total"));
try {
do {
resultJo = HikVideoUtil.callPostApiOnlineStatus(videoConfig.getAccount(),
videoConfig.getPassword(), videoConfig.getAppId(),
videoConfig.getAppSecret(), ++pageNo);
if (resultJo != null && "0".equals(resultJo.getString("code"))) {
alls.addAll(resultJo.getJSONObject("data").getJSONArray("list"));
} else {
log.error("高频更新isc监控状态返回错误:项目sn:{}:code:{},msg:{}",
videoConfig.getProjectSn(), resultJo != null ? resultJo.getString("code") : "",
resultJo != null ? resultJo.getString("msg") : "");
break;
}
} while (pageNo * 1000 < resultJo.getJSONObject("data").getInteger("total"));
} catch (Exception e) {
log.error("高频更新isc监控状态返回异常", e);
}
Map<String, JSONObject> indexCodeMap = alls.stream().collect(Collectors.toMap(j -> ((JSONObject) j).getString("indexCode"), j -> ((JSONObject) j), (o1, o2) -> o1));
for (VideoItem videoItem : itemDbs) {
JSONObject jsonObject = indexCodeMap.get(videoItem.getSerialNumber());
@ -183,7 +196,8 @@ public class VideoTask {
.set(VideoItem::getDeviceState, 1)
.in(VideoItem::getItemId, onlineIds)
);
} List<Long> offlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 2)).map(VideoItem::getItemId).collect(Collectors.toList());
}
List<Long> offlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 2)).map(VideoItem::getItemId).collect(Collectors.toList());
if (CollUtil.isNotEmpty(offlineIds)) {
videoItemService.update(null, new LambdaUpdateWrapper<VideoItem>()
.set(VideoItem::getDeviceState, 2)
@ -197,6 +211,84 @@ public class VideoTask {
}
}
/**
* 高频更新执法记录仪的isc监控状态
*/
@Scheduled(cron = "*/10 * * * * ?")
@RequestMapping("updatePoliceCameraItemIscVideoState")
public void updatePoliceCameraItemIscVideoState() {
try {
List<PoliceCameraVideoConfig> configs = policeCameraVideoConfigService.list(new QueryWrapper<>());
Map<String, List<PoliceCameraItem>> projectSnMap2ItemsMap = policeCameraItemService.list(new LambdaQueryWrapper<PoliceCameraItem>()).stream().collect(Collectors.groupingBy(PoliceCameraItem::getProjectSn));
Map<String, Map<String, JSONObject>> projectSn2IndexCodeMap = new HashMap<>();
for (PoliceCameraVideoConfig videoConfig : configs) {
// 收集需要更新的视频设备
List<PoliceCameraItem> videoItemsToUpdate = new ArrayList<>();
List<PoliceCameraItem> itemDbs = projectSnMap2ItemsMap.get(videoConfig.getProjectSn());
if (CollUtil.isEmpty(itemDbs)) {
continue;
}
Map<String, JSONObject> indexCodeMap = projectSn2IndexCodeMap.computeIfAbsent(StrUtil.format("{},{},{},{}", videoConfig.getIp(),
videoConfig.getPort(), videoConfig.getAppId(),
videoConfig.getAppSecret()), key -> {
if (StrUtil.isBlank(videoConfig.getIp()) || StrUtil.isBlank(videoConfig.getPort()) || StrUtil.isBlank(videoConfig.getAppId()) || StrUtil.isBlank(videoConfig.getAppSecret())) {
return new HashMap<>();
}
JSONArray alls = new JSONArray();
try {
JSONObject resultJo;
int pageNo = 0;
do {
resultJo = HikVideoUtil.callPostApiOnlineStatus(videoConfig.getIp(),
videoConfig.getPort(), videoConfig.getAppId(),
videoConfig.getAppSecret(), ++pageNo);
if (resultJo != null && "0".equals(resultJo.getString("code"))) {
alls.addAll(resultJo.getJSONObject("data").getJSONArray("list"));
} else {
log.error("高频更新执法记录仪的isc监控状态返回错误:项目sn:{}:code:{},msg:{}",
videoConfig.getProjectSn(), resultJo != null ? resultJo.getString("code") : "",
resultJo != null ? resultJo.getString("msg") : "");
break;
}
} while (pageNo * 1000 < resultJo.getJSONObject("data").getInteger("total"));
} catch (Exception e) {
log.error("高频更新执法记录仪的isc监控状态返回异常", e);
}
return alls.stream().collect(Collectors.toMap(j -> ((JSONObject) j).getString("indexCode"), j -> ((JSONObject) j), (o1, o2) -> o1));
});
for (PoliceCameraItem item : itemDbs) {
JSONObject jsonObject = indexCodeMap.get(item.getMonitoringNumber());
Integer newOnlineStatus = jsonObject != null && Objects.equals(jsonObject.getInteger("online"), 1) ? 1 : 2;
// 只有当设备状态发生变化时才更新
if (!newOnlineStatus.equals(item.getDeviceState())) {
item.setDeviceState(newOnlineStatus);
videoItemsToUpdate.add(item);
}
}
// 批量更新
if (CollUtil.isNotEmpty(videoItemsToUpdate)) {
List<Long> onlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 1)).map(PoliceCameraItem::getItemId).collect(Collectors.toList());
if (CollUtil.isNotEmpty(onlineIds)) {
policeCameraItemService.update(null, new LambdaUpdateWrapper<PoliceCameraItem>()
.set(PoliceCameraItem::getDeviceState, 1)
.in(PoliceCameraItem::getItemId, onlineIds)
);
}
List<Long> offlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 2)).map(PoliceCameraItem::getItemId).collect(Collectors.toList());
if (CollUtil.isNotEmpty(offlineIds)) {
policeCameraItemService.update(null, new LambdaUpdateWrapper<PoliceCameraItem>()
.set(PoliceCameraItem::getDeviceState, 2)
.in(PoliceCameraItem::getItemId, offlineIds)
);
}
}
}
} catch (Exception e) {
log.error("高频更新执法记录仪的isc监控状态返回错误", e);
}
}
private void sendVideoData(VideoItem videoItem, ProjectVideoConfig videoConfig) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> video = new HashMap<>(16);