车辆和ai预警的海康回调的代码修改

This commit is contained in:
guoshengxiong 2024-05-17 16:23:22 +08:00
parent 060f40e73b
commit 67634867d1
5 changed files with 402 additions and 250 deletions

View File

@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.api.vo.Result;
import com.zhgd.jeecg.common.execption.OpenPromptException; import com.zhgd.jeecg.common.execption.OpenPromptException;
import com.zhgd.redis.lock.RedisRepository; import com.zhgd.redis.lock.RedisRepository;
import com.zhgd.xmgl.async.AsyncAiAnalyse;
import com.zhgd.xmgl.base.*; import com.zhgd.xmgl.base.*;
import com.zhgd.xmgl.call.entity.ChargeDeletionParam; import com.zhgd.xmgl.call.entity.ChargeDeletionParam;
import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl; import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl;
@ -29,6 +30,10 @@ import com.zhgd.xmgl.modules.frontier.service.IFrontierProtectionDevAlarmService
import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig; import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig;
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareAlarmRecord;
import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareRecord;
import com.zhgd.xmgl.modules.video.mapper.AiAnalyseHardWareAlarmRecordMapper;
import com.zhgd.xmgl.modules.video.mapper.AiAnalyseHardWareRecordMapper;
import com.zhgd.xmgl.modules.video.service.IAiAnalyseHardWareAlarmRecordService; import com.zhgd.xmgl.modules.video.service.IAiAnalyseHardWareAlarmRecordService;
import com.zhgd.xmgl.modules.video.service.IAiAnalyseHardWareRecordService; import com.zhgd.xmgl.modules.video.service.IAiAnalyseHardWareRecordService;
import com.zhgd.xmgl.modules.worker.entity.*; import com.zhgd.xmgl.modules.worker.entity.*;
@ -76,6 +81,12 @@ public class HikvisionCall {
@Lazy @Lazy
@Autowired @Autowired
HikvisionCall hikvisionCall; HikvisionCall hikvisionCall;
@Lazy
@Autowired
private AiAnalyseHardWareAlarmRecordMapper aiAnalyseHardWareAlarmRecordMapper;
@Lazy
@Autowired
private AsyncAiAnalyse asyncAiAnalyse;
@Value("${upload.image.url.prefix:}") @Value("${upload.image.url.prefix:}")
private String imageUrlPrefix; private String imageUrlPrefix;
@Value("${basePath:}") @Value("${basePath:}")
@ -127,15 +138,19 @@ public class HikvisionCall {
@Autowired @Autowired
private IAiAnalyseHardWareRecordService aiAnalyseHardWareRecordService; private IAiAnalyseHardWareRecordService aiAnalyseHardWareRecordService;
@Autowired
private IAiAnalyseHardWareAlarmRecordService aiAnalyseHardWareAlarmRecordService;
@Autowired @Autowired
private IFrontierProtectionDevAlarmService frontierProtectionDevAlarmService; private IFrontierProtectionDevAlarmService frontierProtectionDevAlarmService;
@Autowired @Autowired
private FrontierProtectionDevService frontierProtectionDevService; private FrontierProtectionDevService frontierProtectionDevService;
@Lazy
@Autowired
private IAiAnalyseHardWareAlarmRecordService aiAnalyseHardWareAlarmRecordService;
@Lazy
@Autowired
private AiAnalyseHardWareRecordMapper aiAnalyseHardWareRecordMapper;
/** /**
* 获取图片 * 获取图片
* *
@ -176,15 +191,15 @@ public class HikvisionCall {
for (int i = 0; i < eventsJa.size(); i++) { for (int i = 0; i < eventsJa.size(); i++) {
JSONObject jo1 = eventsJa.getJSONObject(i); JSONObject jo1 = eventsJa.getJSONObject(i);
JSONObject dataJo = jo1.getJSONObject("data"); JSONObject dataJo = jo1.getJSONObject("data");
String happenTime = jo1.getString("happenTime");
String srcIndex = jo1.getString("srcIndex");
String extEventPersonNo = dataJo.getString("ExtEventPersonNo"); String extEventPersonNo = dataJo.getString("ExtEventPersonNo");
String extEventCardNo = dataJo.getString("ExtEventCardNo");
WorkerInfo workerInfo = workerInfoMapper.selectById(extEventPersonNo); WorkerInfo workerInfo = workerInfoMapper.selectById(extEventPersonNo);
if (workerInfo == null) { if (workerInfo == null) {
log.info("未找到该人员信息,extEventPersonNo:{}", extEventPersonNo); log.info("未找到该人员信息,extEventPersonNo:{}", extEventPersonNo);
return Result.error("未找到该人员信息,extEventPersonNo:" + extEventPersonNo); return Result.error("未找到该人员信息,extEventPersonNo:" + extEventPersonNo);
} }
String happenTime = jo1.getString("happenTime");
String extEventCardNo = dataJo.getString("ExtEventCardNo");
String srcIndex = jo1.getString("srcIndex");
Project project = projectMapper.selectOne(new LambdaQueryWrapper<Project>().eq(Project::getProjectSn, workerInfo.getProjectSn())); Project project = projectMapper.selectOne(new LambdaQueryWrapper<Project>().eq(Project::getProjectSn, workerInfo.getProjectSn()));
String idCard = workerInfo.getIdCard(); String idCard = workerInfo.getIdCard();
if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) {
@ -198,10 +213,7 @@ public class HikvisionCall {
log.error("请先上传对应设备信息idCard:{},devSN:{}", idCard, srcIndex); log.error("请先上传对应设备信息idCard:{},devSN:{}", idCard, srcIndex);
return Result.error("请先上传对应设备信息idCard:" + idCard + ",extEventCardNo:" + extEventCardNo); return Result.error("请先上传对应设备信息idCard:" + idCard + ",extEventCardNo:" + extEventCardNo);
} }
HashMap<String, Object> map = new HashMap<>();
String time = DateUtil.formatDateTime(DateUtil.parse(happenTime)); String time = DateUtil.formatDateTime(DateUtil.parse(happenTime));
map.put("passTime", time);
map.put("idCard", idCard);
Integer count = workerAttendanceMapper.selectCount(new LambdaQueryWrapper<WorkerAttendance>() Integer count = workerAttendanceMapper.selectCount(new LambdaQueryWrapper<WorkerAttendance>()
.eq(WorkerAttendance::getPersonSn, workerInfo.getPersonSn()) .eq(WorkerAttendance::getPersonSn, workerInfo.getPersonSn())
.eq(WorkerAttendance::getCreateTime, time) .eq(WorkerAttendance::getCreateTime, time)
@ -209,23 +221,8 @@ public class HikvisionCall {
if (count != 0) { if (count != 0) {
continue; continue;
} }
map.put("attendanceNumber", workerInfo.getAttendanceNumber());
int passType = workerAttendanceServiceImpl.getPassType(ufaceDev, time); int passType = workerAttendanceServiceImpl.getPassType(ufaceDev, time);
map.put("direction", passType); hikvisionCall.saveEventCallbackAttendanceAsync(dataJo, workerInfo, srcIndex, project, idCard, time, passType);
map.put("passType", 2);
map.put("projectCode", workerInfo.getProjectSn());
map.put("devCode", srcIndex);
try {
String extEventPictureURL = dataJo.getString("ExtEventPictureURL");
String svrIndexCode = dataJo.getString("svrIndexCode");
HikvisionEventsPictureRq rq = new HikvisionEventsPictureRq();
rq.setPicUri(extEventPictureURL);
rq.setSvrIndexCode(svrIndexCode);
map.put("faceUrl", saveToLocal(getHikvisionEventsPicture(rq, project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
} catch (Exception e) {
log.error("error", e);
}
workerAttendanceService.saveExternalPassRecord(map);
} }
} }
} else if (Objects.equals(ability, "event_pms")) { } else if (Objects.equals(ability, "event_pms")) {
@ -269,55 +266,7 @@ public class HikvisionCall {
//carPassRecordMapper.updateById(carPassRecord); //carPassRecordMapper.updateById(carPassRecord);
} else if (eventType == 771760130 || eventType == 771760133) { } else if (eventType == 771760130 || eventType == 771760133) {
//压线事件 //压线事件
CarPassRecord carPassRecord = new CarPassRecord(); hikvisionCall.saveEventCallbackCarPassRecordAsync(dataJo, srcIndex, plateNo, carCamera, project, time);
carPassRecord.setCarNumber(plateNo);
carPassRecord.setType(getPassType(carCamera.getPassType()));
carPassRecord.setPassTime(time);
try {
//车牌
JSONObject picUrlJo = dataJo.getJSONObject("picUrl");
String svrIndex = dataJo.getString("svrIndex");
String vehiclePicUrl = picUrlJo.getString("vehiclePicUrl");
String platePicUrl = picUrlJo.getString("platePicUrl");
if (StringUtils.isNotBlank(platePicUrl)) {
carPassRecord.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, platePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
}
if (StringUtils.isNotBlank(vehiclePicUrl)) {
carPassRecord.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, vehiclePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
}
} catch (Exception e) {
log.error("error", e);
}
carPassRecord.setCarColor(getCarColor(dataJo.getInteger("plateColor")));
carPassRecord.setLocation(carCamera.getCameraName());
carPassRecord.setProjectSn(carCamera.getProjectSn());
carPassRecord.setColor(getColor(dataJo.getInteger("vehicleColor")));
carPassRecord.setCameraId(srcIndex);
List<CarInfo> carInfos = carInfoMapper.selectList(new LambdaQueryWrapper<CarInfo>()
.eq(CarInfo::getProjectSn, carCamera.getProjectSn())
.eq(CarInfo::getCarNumber, plateNo)
.eq(CarInfo::getIsBlack, 0)
);
if (CollUtil.isNotEmpty(carInfos)) {
carPassRecord.setIsOpen(1);
} else {
carPassRecord.setIsOpen(0);
}
LambdaQueryWrapper<CarPassRecord> queryWrapper = new LambdaQueryWrapper<CarPassRecord>()
.eq(CarPassRecord::getCarNumber, plateNo)
.eq(CarPassRecord::getPassTime, time);
Integer count = carPassRecordMapper.selectCount(queryWrapper);
if (count != 0) {
carPassRecordMapper.update(carPassRecord, queryWrapper);
} else {
carPassRecordMapper.insert(carPassRecord);
}
//车进场后意味着绑定的司机走过了人脸机统计为在场人员车辆出场后在场人员随之减少
if (carInfos.size() != 0 && carInfos.get(0) != null && StringUtils.isNotEmpty(carInfos.get(0).getDriverWorkerId())) {
log.info("保存车辆绑定的司机的通行数据,车牌号:{}", carInfos.get(0).getCarNumber());
carPassRecordService.saveDriverPassData(carPassRecord, carInfos.get(0));
}
} }
} }
} }
@ -336,40 +285,127 @@ public class HikvisionCall {
// frontierProtectionDevAlarmService.saveBatch(frontierProtectionDevAlarmList); // frontierProtectionDevAlarmService.saveBatch(frontierProtectionDevAlarmList);
} else if (Objects.equals(ability, "")) { } else if (Objects.equals(ability, "")) {
JSONArray eventsArray = paramsJo.getJSONArray("events"); log.info("AI识别告警=======" + paramsJo);
if (eventsArray.size()>0 ){ JSONArray eventsArray = paramsJo.getJSONArray("events");
JSONObject dataEvent = (JSONObject) eventsArray.get(0); if (eventsArray.size() > 0) {
JSONArray eventDetails = dataEvent.getJSONArray("eventDetails"); JSONObject dataEvent = eventsArray.getJSONObject(0);
JSONObject eventDetail = (JSONObject) eventDetails.get(0); JSONArray eventDetails = dataEvent.getJSONArray("eventDetails");
JSONObject eventDetail = eventDetails.getJSONObject(0);
ability = eventDetail.getString("ability"); ability = eventDetail.getString("ability");
if (Objects.equals(ability, "event_vss")){ if (Objects.equals(ability, "event_vss")) {
log.info("AI识别告警=======" + paramsJo); log.info("AI识别告警=======" + paramsJo);
String srcName = eventDetail.getString("srcName");//摄像机名称 String srcName = eventDetail.getString("srcName");//摄像机名称
String eventType = eventDetail.getString("eventType");//422000003 String eventType = eventDetail.getString("eventType");//422000003
JSONObject data = eventDetail.getJSONObject("data"); JSONObject data = eventDetail.getJSONObject("data");
String imageUrl = data.getString("url"); //海康AI图片地址 String imageUrl = data.getString("url"); //海康AI图片地址
String deviceID = data.getString("deviceID"); //海康AI图片地址
AiAnalyseHardWareRecord dev = aiAnalyseHardWareRecordMapper.selectOne(new LambdaQueryWrapper<AiAnalyseHardWareRecord>()
.eq(AiAnalyseHardWareRecord::getHardwareId, deviceID));
if (dev == null) {
log.info("未查到AI识别告警设备设备id{}", deviceID);
return null;
}
hikvisionCall.saveEventCallbackAiAsync(dataEvent, srcName, eventType, imageUrl, deviceID, dev);
} }
} }
// JSONArray eventsJa = paramsJo.getJSONArray("events");
// List<AiAnalyseHardWareAlarmRecord> aiAnalyseHardWareAlarmRecords = new ArrayList<>();
// for (int i = 0; i < eventsJa.size(); i++) {
// JSONObject obj = eventsJa.getJSONObject(i);
// String devCode = obj.getString("srcIndex");
// AiAnalyseHardWareRecord aiAnalyseHardWareRecord = aiAnalyseHardWareRecordService.getOne(Wrappers.<AiAnalyseHardWareRecord>lambdaQuery().eq(AiAnalyseHardWareRecord::getHardwareId, devCode));
// AiAnalyseHardWareAlarmRecord aiAnalyseHardWareAlarmRecord = new AiAnalyseHardWareAlarmRecord();
// aiAnalyseHardWareAlarmRecord.setHardwareId(aiAnalyseHardWareRecord.getHardwareId());
// aiAnalyseHardWareAlarmRecord.setStatus(1);
// aiAnalyseHardWareAlarmRecord.setProjectSn(aiAnalyseHardWareRecord.getProjectSn());
// aiAnalyseHardWareAlarmRecords.add(aiAnalyseHardWareAlarmRecord);
// }
// aiAnalyseHardWareAlarmRecordService.saveBatch(aiAnalyseHardWareAlarmRecords);
} }
} }
return Result.ok(); return Result.ok();
} }
@Async("saveEventCallbackAiAsync")
public void saveEventCallbackAiAsync(JSONObject dataEvent, String srcName, String eventType, String imageUrl, String deviceID, AiAnalyseHardWareRecord dev) {
String happenTime = dataEvent.getString("happenTime");
AiAnalyseHardWareAlarmRecord aiAnalyseHardWareAlarmRecord = new AiAnalyseHardWareAlarmRecord();
aiAnalyseHardWareAlarmRecord.setCreateTime(DateUtil.formatDateTime(DateUtil.parse(happenTime)));
aiAnalyseHardWareAlarmRecord.setAlarmType(Integer.valueOf(eventType));
aiAnalyseHardWareAlarmRecord.setHardwareId(deviceID);
aiAnalyseHardWareAlarmRecord.setHardwareName(dev.getHardwareName());
aiAnalyseHardWareAlarmRecord.setLocation(srcName);
aiAnalyseHardWareAlarmRecord.setProjectSn(dev.getProjectSn());
aiAnalyseHardWareAlarmRecord.setStatus(1);
aiAnalyseHardWareAlarmRecord.setImageUrl(saveToLocal(imageUrl));
aiAnalyseHardWareAlarmRecordMapper.insert(aiAnalyseHardWareAlarmRecord);
//将数据通过MQTT转发到前台
asyncAiAnalyse.sendAiAnalyse(aiAnalyseHardWareAlarmRecord);
}
@Async("saveEventCallbackCarPassRecord")
public void saveEventCallbackCarPassRecordAsync(JSONObject dataJo, String srcIndex, String plateNo, CarCamera carCamera, Project project, String time) {
CarPassRecord carPassRecord = new CarPassRecord();
carPassRecord.setCarNumber(plateNo);
carPassRecord.setType(getPassType(carCamera.getPassType()));
carPassRecord.setPassTime(time);
try {
//车牌
JSONObject picUrlJo = dataJo.getJSONObject("picUrl");
String svrIndex = dataJo.getString("svrIndex");
String vehiclePicUrl = picUrlJo.getString("vehiclePicUrl");
String platePicUrl = picUrlJo.getString("platePicUrl");
if (StringUtils.isNotBlank(platePicUrl)) {
carPassRecord.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, platePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
}
if (StringUtils.isNotBlank(vehiclePicUrl)) {
carPassRecord.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, vehiclePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
}
} catch (Exception e) {
log.error("error", e);
}
carPassRecord.setCarColor(getCarColor(dataJo.getInteger("plateColor")));
carPassRecord.setLocation(carCamera.getCameraName());
carPassRecord.setProjectSn(carCamera.getProjectSn());
carPassRecord.setColor(getColor(dataJo.getInteger("vehicleColor")));
carPassRecord.setCameraId(srcIndex);
List<CarInfo> carInfos = carInfoMapper.selectList(new LambdaQueryWrapper<CarInfo>()
.eq(CarInfo::getProjectSn, carCamera.getProjectSn())
.eq(CarInfo::getCarNumber, plateNo)
.eq(CarInfo::getIsBlack, 0)
);
if (CollUtil.isNotEmpty(carInfos)) {
carPassRecord.setIsOpen(1);
} else {
carPassRecord.setIsOpen(0);
}
LambdaQueryWrapper<CarPassRecord> queryWrapper = new LambdaQueryWrapper<CarPassRecord>()
.eq(CarPassRecord::getCarNumber, plateNo)
.eq(CarPassRecord::getPassTime, time);
Integer count = carPassRecordMapper.selectCount(queryWrapper);
if (count != 0) {
carPassRecordMapper.update(carPassRecord, queryWrapper);
} else {
carPassRecordMapper.insert(carPassRecord);
}
//车进场后意味着绑定的司机走过了人脸机统计为在场人员车辆出场后在场人员随之减少
if (carInfos.size() != 0 && carInfos.get(0) != null && StringUtils.isNotEmpty(carInfos.get(0).getDriverWorkerId())) {
log.info("保存车辆绑定的司机的通行数据,车牌号:{}", carInfos.get(0).getCarNumber());
carPassRecordService.saveDriverPassData(carPassRecord, carInfos.get(0));
}
}
@Async("saveEventCallbackAttendance")
public void saveEventCallbackAttendanceAsync(JSONObject dataJo, WorkerInfo workerInfo, String srcIndex, Project project, String idCard, String time, int passType) {
HashMap<String, Object> map = new HashMap<>();
map.put("passTime", time);
map.put("idCard", idCard);
map.put("attendanceNumber", workerInfo.getAttendanceNumber());
map.put("direction", passType);
map.put("passType", 2);
map.put("projectCode", workerInfo.getProjectSn());
map.put("devCode", srcIndex);
try {
String extEventPictureURL = dataJo.getString("ExtEventPictureURL");
String svrIndexCode = dataJo.getString("svrIndexCode");
HikvisionEventsPictureRq rq = new HikvisionEventsPictureRq();
rq.setPicUri(extEventPictureURL);
rq.setSvrIndexCode(svrIndexCode);
map.put("faceUrl", saveToLocal(getHikvisionEventsPicture(rq, project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
} catch (Exception e) {
log.error("error", e);
}
workerAttendanceService.saveExternalPassRecord(map);
}
@ApiOperation(value = "按事件类型订阅事件", notes = "按事件类型订阅事件", httpMethod = "POST") @ApiOperation(value = "按事件类型订阅事件", notes = "按事件类型订阅事件", httpMethod = "POST")
@PostMapping(value = "/subscribeEvent") @PostMapping(value = "/subscribeEvent")
public Result subscribeEvent(@ApiIgnore @RequestBody SubscribeEventQo qo) throws Exception { public Result subscribeEvent(@ApiIgnore @RequestBody SubscribeEventQo qo) throws Exception {
@ -405,6 +441,12 @@ public class HikvisionCall {
if (CollUtil.isEmpty(projects)) { if (CollUtil.isEmpty(projects)) {
return Result.error("项目未配置海康同步功能"); return Result.error("项目未配置海康同步功能");
} }
getDoorEventsAsync(startTime, endTime, param, projectSn, projects);
return Result.ok("已在后台同步人员数据,请耐心等待!");
}
@Async("getDoorEvents")
public void getDoorEventsAsync(String startTime, String endTime, JSONObject param, String projectSn, List<Project> projects) {
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
for (Project project : projects) { for (Project project : projects) {
List<UfaceDev> ufaceDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper<UfaceDev>() List<UfaceDev> ufaceDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper<UfaceDev>()
@ -490,7 +532,6 @@ public class HikvisionCall {
} }
log.info("服务挂了主动获取门禁点事件的人员通行记录执行完成startTime{}endTime{}", startTime, endTime); log.info("服务挂了主动获取门禁点事件的人员通行记录执行完成startTime{}endTime{}", startTime, endTime);
}); });
return Result.ok("已在后台同步人员数据,请耐心等待!");
} }
@ApiOperation(value = "服务挂了主动获取查询过车记录", notes = "服务挂了主动获取查询过车记录", httpMethod = "POST") @ApiOperation(value = "服务挂了主动获取查询过车记录", notes = "服务挂了主动获取查询过车记录", httpMethod = "POST")
@ -518,98 +559,101 @@ public class HikvisionCall {
if (CollUtil.isEmpty(projects)) { if (CollUtil.isEmpty(projects)) {
return Result.error("项目未配置海康同步功能"); return Result.error("项目未配置海康同步功能");
} }
CompletableFuture.runAsync(() -> { hikvisionCall.getCrossRecordsAsync(startTime, endTime, param, projects);
for (Project project : projects) { return Result.ok("已在后台同步车辆通行数据,请耐心等待!");
param.put("pageNo", 1); }
String projectParkCode = null;
@Async("getCrossRecords")
public void getCrossRecordsAsync(String startTime, String endTime, JSONObject param, List<Project> projects) {
for (Project project : projects) {
param.put("pageNo", 1);
String projectParkCode = null;
try {
projectParkCode = getProjectParkCode(project);
} catch (Exception e) {
log.error("err:", e);
return;
}
if (StringUtils.isBlank(projectParkCode)) {
continue;
}
param.put("parkSyscode", projectParkCode);
Integer total = 0;
JSONArray listJa = new JSONArray();
do {
String rs = null;
try { try {
projectParkCode = getProjectParkCode(project); rs = getCrossRecordsForHttp(project, param);
} catch (Exception e) { } catch (Exception e) {
log.error("err:", e); log.error("err:", e);
return; return;
} }
if (StringUtils.isBlank(projectParkCode)) { JSONObject joData = HikvisionUtil.getJSONObjectData(rs);
continue; if (joData != null) {
} total = joData.getInteger("total");
param.put("parkSyscode", projectParkCode); if (!Objects.equals(total, 0)) {
Integer total = 0; listJa = joData.getJSONArray("list");
JSONArray listJa = new JSONArray(); for (int i = 0; i < listJa.size(); i++) {
do { JSONObject listJo = listJa.getJSONObject(i);
String rs = null; String plateNo = listJo.getString("plateNo");
try { String roadwaySyscode = listJo.getString("roadwaySyscode");
rs = getCrossRecordsForHttp(project, param); String aswSyscode = listJo.getString("aswSyscode");
} catch (Exception e) { String crossTime = listJo.getString("crossTime");
log.error("err:", e); String time = DateUtil.formatDateTime(DateUtil.parse(crossTime));
return; String plateNoPicUri = listJo.getString("plateNoPicUri");
} String vehiclePicUri = listJo.getString("vehiclePicUri");
JSONObject joData = HikvisionUtil.getJSONObjectData(rs); CarCamera carCamera = carCameraMapper.selectOne(new LambdaQueryWrapper<CarCamera>()
if (joData != null) { .eq(CarCamera::getCameraId, roadwaySyscode));
total = joData.getInteger("total"); if (carCamera == null) {
if (!Objects.equals(total, 0)) { log.info("海康车辆相机设备不存在CameraId:{}", roadwaySyscode);
listJa = joData.getJSONArray("list"); continue;
for (int i = 0; i < listJa.size(); i++) { }
JSONObject listJo = listJa.getJSONObject(i); CarPassRecord entity = new CarPassRecord();
String plateNo = listJo.getString("plateNo"); entity.setCarNumber(plateNo);
String roadwaySyscode = listJo.getString("roadwaySyscode"); entity.setType(getPassType(carCamera.getPassType()));
String aswSyscode = listJo.getString("aswSyscode"); entity.setPassTime(time);
String crossTime = listJo.getString("crossTime");
String time = DateUtil.formatDateTime(DateUtil.parse(crossTime)); try {
String plateNoPicUri = listJo.getString("plateNoPicUri"); //车牌
String vehiclePicUri = listJo.getString("vehiclePicUri"); entity.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, plateNoPicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
CarCamera carCamera = carCameraMapper.selectOne(new LambdaQueryWrapper<CarCamera>() entity.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, vehiclePicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())));
.eq(CarCamera::getCameraId, roadwaySyscode)); } catch (Exception e) {
if (carCamera == null) { log.error("error", e);
log.info("海康车辆相机设备不存在CameraId:{}", roadwaySyscode); }
continue;
} entity.setCarColor(getCarColor(listJo.getInteger("plateColor")));
CarPassRecord entity = new CarPassRecord(); entity.setLocation(carCamera.getCameraName());
entity.setCarNumber(plateNo); entity.setProjectSn(carCamera.getProjectSn());
entity.setType(getPassType(carCamera.getPassType())); entity.setColor(getColor(listJo.getInteger("vehicleColor")));
entity.setPassTime(time); entity.setCameraId(roadwaySyscode);
List<CarInfo> carInfos = carInfoMapper.selectList(new LambdaQueryWrapper<CarInfo>()
try { .eq(CarInfo::getProjectSn, carCamera.getProjectSn())
//车牌 .eq(CarInfo::getCarNumber, plateNo)
entity.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, plateNoPicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); .eq(CarInfo::getIsBlack, 0)
entity.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, vehiclePicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); );
} catch (Exception e) { if (CollUtil.isNotEmpty(carInfos)) {
log.error("error", e); entity.setIsOpen(1);
} } else {
entity.setIsOpen(0);
entity.setCarColor(getCarColor(listJo.getInteger("plateColor"))); }
entity.setLocation(carCamera.getCameraName()); Integer count1 = carPassRecordMapper.selectCount(new LambdaQueryWrapper<CarPassRecord>()
entity.setProjectSn(carCamera.getProjectSn()); .eq(CarPassRecord::getCarNumber, plateNo)
entity.setColor(getColor(listJo.getInteger("vehicleColor"))); .eq(CarPassRecord::getPassTime, time)
entity.setCameraId(roadwaySyscode); );
List<CarInfo> carInfos = carInfoMapper.selectList(new LambdaQueryWrapper<CarInfo>() if (count1 != 0) {
.eq(CarInfo::getProjectSn, carCamera.getProjectSn()) carPassRecordMapper.update(entity, new LambdaQueryWrapper<CarPassRecord>()
.eq(CarInfo::getCarNumber, plateNo) .eq(CarPassRecord::getCarNumber, plateNo)
.eq(CarInfo::getIsBlack, 0) .eq(CarPassRecord::getPassTime, time));
); } else {
if (CollUtil.isNotEmpty(carInfos)) { carPassRecordMapper.insert(entity);
entity.setIsOpen(1);
} else {
entity.setIsOpen(0);
}
Integer count1 = carPassRecordMapper.selectCount(new LambdaQueryWrapper<CarPassRecord>()
.eq(CarPassRecord::getCarNumber, plateNo)
.eq(CarPassRecord::getPassTime, time)
);
if (count1 != 0) {
carPassRecordMapper.update(entity, new LambdaQueryWrapper<CarPassRecord>()
.eq(CarPassRecord::getCarNumber, plateNo)
.eq(CarPassRecord::getPassTime, time));
} else {
carPassRecordMapper.insert(entity);
}
} }
param.put("pageNo", param.getIntValue("pageNo") + 1);
} }
param.put("pageNo", param.getIntValue("pageNo") + 1);
} }
} while (total > 0 && listJa.size() > 0); }
} } while (total > 0 && listJa.size() > 0);
log.info("服务挂了主动获取车辆事件的车辆通行记录执行完成startTime{}endTime{}", startTime, endTime); }
}); log.info("服务挂了主动获取车辆事件的车辆通行记录执行完成startTime{}endTime{}", startTime, endTime);
return Result.ok("已在后台同步车辆通行数据,请耐心等待!");
} }
/** /**
@ -2088,25 +2132,15 @@ public class HikvisionCall {
return null; return null;
} }
String fileName = IdUtil.simpleUUID() + ".png"; String fileName = IdUtil.simpleUUID() + ".png";
CompletableFuture.runAsync(() -> { try {
try { X509TrustManagerUtil.downLoadFromUrl(url, fileName, basePath);
downLoadImg(url, fileName); } catch (Exception e) {
} catch (Exception e) { log.error("下载海康图片出现异常:" + e);
log.error("下载图片失败,url:{}。>>>", url, e); return null;
try { }
downLoadImg(url, fileName);
} catch (Exception ex) {
log.error("重试下载图片失败,url:{}。>>>", url, ex);
}
}
});
return fileName; return fileName;
} }
private void downLoadImg(String url, String fileName) throws Exception {
X509TrustManagerUtil.downLoadFromUrlHttps(url, fileName, basePath);
}
/** /**
* 保存车辆群组绑定关系 * 保存车辆群组绑定关系
* *

View File

@ -372,5 +372,100 @@ public class AsyncConfig {
return executor; return executor;
} }
@Bean("getCrossRecords")
public ThreadPoolTaskExecutor getCrossRecords() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/** 核心线程数(默认线程数) */
executor.setCorePoolSize(maxPoolSize);
/** 最大线程数 */
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(100000);
/** 允许线程空闲时间(单位:默认为秒) */
executor.setKeepAliveSeconds(60);
/** 线程池名前缀 */
executor.setThreadNamePrefix("getCrossRecords-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
@Bean("getDoorEvents")
public ThreadPoolTaskExecutor getDoorEvents() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/** 核心线程数(默认线程数) */
executor.setCorePoolSize(maxPoolSize);
/** 最大线程数 */
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(100000);
/** 允许线程空闲时间(单位:默认为秒) */
executor.setKeepAliveSeconds(60);
/** 线程池名前缀 */
executor.setThreadNamePrefix("getDoorEvents-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
@Bean("saveEventCallbackAttendance")
public ThreadPoolTaskExecutor saveEventCallbackAttendance() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/** 核心线程数(默认线程数) */
executor.setCorePoolSize(maxPoolSize);
/** 最大线程数 */
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(100000);
/** 允许线程空闲时间(单位:默认为秒) */
executor.setKeepAliveSeconds(60);
/** 线程池名前缀 */
executor.setThreadNamePrefix("saveEventCallbackAttendance-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
@Bean("saveEventCallbackCarPassRecord")
public ThreadPoolTaskExecutor saveEventCallbackCarPassRecord() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/** 核心线程数(默认线程数) */
executor.setCorePoolSize(maxPoolSize);
/** 最大线程数 */
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(100000);
/** 允许线程空闲时间(单位:默认为秒) */
executor.setKeepAliveSeconds(60);
/** 线程池名前缀 */
executor.setThreadNamePrefix("saveEventCallbackCarPassRecord-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
@Bean("saveEventCallbackAiAsync")
public ThreadPoolTaskExecutor saveEventCallbackAiAsync() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/** 核心线程数(默认线程数) */
executor.setCorePoolSize(maxPoolSize);
/** 最大线程数 */
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(100000);
/** 允许线程空闲时间(单位:默认为秒) */
executor.setKeepAliveSeconds(60);
/** 线程池名前缀 */
executor.setThreadNamePrefix("saveEventCallbackAiAsync-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
} }

View File

@ -119,6 +119,7 @@ public class SafetyHatWSClient {
List<SafetyHatDev> devList = SpringContextUtils.getBean(SafetyHatDevMapper.class).selectList(new LambdaQueryWrapper<SafetyHatDev>() List<SafetyHatDev> devList = SpringContextUtils.getBean(SafetyHatDevMapper.class).selectList(new LambdaQueryWrapper<SafetyHatDev>()
.eq(SafetyHatDev::getProjectSn, project.getProjectSn()) .eq(SafetyHatDev::getProjectSn, project.getProjectSn())
.notIn(SafetyHatDev::getDevSn, devsns) .notIn(SafetyHatDev::getDevSn, devsns)
.eq(SafetyHatDev::getOnline, 1)
); );
if (CollUtil.isNotEmpty(devList)) { if (CollUtil.isNotEmpty(devList)) {
for (SafetyHatDev dev : devList) { for (SafetyHatDev dev : devList) {

View File

@ -96,12 +96,15 @@ public class CarInfoServiceImpl extends ServiceImpl<CarInfoMapper, CarInfo> impl
@Override @Override
public void addCarInfo(CarInfo carInfo) { public void addCarInfo(CarInfo carInfo) {
QueryWrapper<CarInfo> queryWrapper = new QueryWrapper<>(); if (Objects.equals(carInfo.getCarModuleType(), 1)) {
queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn()) QueryWrapper<CarInfo> queryWrapper = new QueryWrapper<>();
.eq(CarInfo::getCarNumber, carInfo.getCarNumber()); queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn())
int count = carInfoMapper.selectCount(queryWrapper); .eq(CarInfo::getCarNumber, carInfo.getCarNumber())
if (count > 0) { .eq(CarInfo::getCarModuleType, 1);
throw new OpenAlertException(MessageUtil.get("carNumberExistErr")); int count = carInfoMapper.selectCount(queryWrapper);
if (count > 0) {
throw new OpenAlertException(MessageUtil.get("carNumberExistErr"));
}
} }
carInfoMapper.insert(carInfo); carInfoMapper.insert(carInfo);
@ -111,13 +114,16 @@ public class CarInfoServiceImpl extends ServiceImpl<CarInfoMapper, CarInfo> impl
@Override @Override
public void editCarInfo(CarInfo carInfo) { public void editCarInfo(CarInfo carInfo) {
QueryWrapper<CarInfo> queryWrapper = new QueryWrapper<>(); if (Objects.equals(carInfo.getCarModuleType(), 1)) {
queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn()) QueryWrapper<CarInfo> queryWrapper = new QueryWrapper<>();
.eq(CarInfo::getCarNumber, carInfo.getCarNumber()) queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn())
.ne(CarInfo::getId, carInfo.getId()); .eq(CarInfo::getCarNumber, carInfo.getCarNumber())
int count = carInfoMapper.selectCount(queryWrapper); .ne(CarInfo::getId, carInfo.getId())
if (count > 0) { .eq(CarInfo::getCarModuleType, 1);
throw new OpenAlertException(MessageUtil.get("carNumberExistErr")); int count = carInfoMapper.selectCount(queryWrapper);
if (count > 0) {
throw new OpenAlertException(MessageUtil.get("carNumberExistErr"));
}
} }
CarInfo old = carInfoMapper.selectById(carInfo.getId()); CarInfo old = carInfoMapper.selectById(carInfo.getId());
carInfoMapper.updateById(carInfo); carInfoMapper.updateById(carInfo);

View File

@ -10,10 +10,23 @@ import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
/** /**
* 处理https的图片 * 处理https/http的图片
*/ */
@Slf4j @Slf4j
public class X509TrustManagerUtil implements X509TrustManager { public class X509TrustManagerUtil implements X509TrustManager {
/**
* 从网络的url图片保存在本地包含http和https的图片下载
*/
public static void downLoadFromUrl(String urlStr, String fileName,
String savePath) throws Exception {
URL url = new URL(urlStr);
if (url.openConnection() instanceof HttpsURLConnection) {
downLoadFromUrlHttps(urlStr, fileName, savePath);
} else {
downLoadFromUrlHttp(urlStr, fileName, savePath);
}
}
/** /**
* 从网络的url图片保存在本地 * 从网络的url图片保存在本地
* *
@ -52,24 +65,29 @@ public class X509TrustManagerUtil implements X509TrustManager {
conn.setSSLSocketFactory(ssf); conn.setSSLSocketFactory(ssf);
conn.connect(); conn.connect();
// 得到输入流 // 得到输入流
InputStream inputStream = conn.getInputStream(); FileOutputStream fos = null;
byte[] getData = readInputStream(inputStream); InputStream inputStream = null;
// 文件保存位置 try {
File saveDir = new File(savePath); inputStream = conn.getInputStream();
if (!saveDir.exists()) { byte[] getData = readInputStream(inputStream);
saveDir.mkdirs(); // 文件保存位置
} File saveDir = new File(savePath);
//输出流 if (!saveDir.exists()) {
File file = new File(saveDir + File.separator + fileName); saveDir.mkdirs();
FileOutputStream fos = new FileOutputStream(file); }
fos.write(getData); //输出流
if (fos != null) { File file = new File(saveDir + File.separator + fileName);
fos.close(); fos = new FileOutputStream(file);
} fos.write(getData);
if (inputStream != null) {
inputStream.close(); } finally {
if (fos != null) {
fos.close();
}
if (inputStream != null) {
inputStream.close();
}
} }
} }
@ -133,21 +151,16 @@ public class X509TrustManagerUtil implements X509TrustManager {
return bos.toByteArray(); return bos.toByteArray();
} }
public static void main(String[] args) {
/*** String name = "C:/Users/solexit06/Desktop/test/";
* 校验https网址是否安全 String urls = "https://116.205.128.251:6113/pic?7db681653a5do-5el*31-25976b8-98c2cabbf**b11===sp**812=9t0470280244=7l0*4010=6ob*521e-7pi114o=2dcb2=15a&AccessKeyId=FOZAuZC0Dc84QjvL&Expires=1709893202&Signature=lJnNS138ZVoPwOar6T4QROyg590=";
* try {
* @author solexit06 downLoadFromUrlHttps(urls, "1.png", name);
* } catch (Exception e) {
*/ log.error("error", e);
public class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
// 直接返回true:默认所有https请求都是安全的
return true;
} }
} }
/* /*
* 里面的方法都是空的当方法为空是默认为所有的链接都为安全也就是所有的链接都能够访问到 当然这样有一定的安全风险可以根据实际需要写入内容 * 里面的方法都是空的当方法为空是默认为所有的链接都为安全也就是所有的链接都能够访问到 当然这样有一定的安全风险可以根据实际需要写入内容
*/ */
@ -165,13 +178,16 @@ public class X509TrustManagerUtil implements X509TrustManager {
return null; return null;
} }
public static void main(String[] args) { /***
String name = "C:/Users/solexit06/Desktop/test/"; * 校验https网址是否安全
String urls = "https://116.205.128.251:6113/pic?7db681653a5do-5el*31-25976b8-98c2cabbf**b11===sp**812=9t0470280244=7l0*4010=6ob*521e-7pi114o=2dcb2=15a&AccessKeyId=FOZAuZC0Dc84QjvL&Expires=1709893202&Signature=lJnNS138ZVoPwOar6T4QROyg590="; *
try { * @author solexit06
downLoadFromUrlHttps(urls, "1.png", name); *
} catch (Exception e) { */
log.error("error", e); public class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
// 直接返回true:默认所有https请求都是安全的
return true;
} }
} }
} }