diff --git a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java index 6a0239620..ad499db69 100644 --- a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java @@ -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.execption.OpenPromptException; import com.zhgd.redis.lock.RedisRepository; +import com.zhgd.xmgl.async.AsyncAiAnalyse; import com.zhgd.xmgl.base.*; import com.zhgd.xmgl.call.entity.ChargeDeletionParam; 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.ProjectVideoConfig; 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.IAiAnalyseHardWareRecordService; import com.zhgd.xmgl.modules.worker.entity.*; @@ -76,6 +81,12 @@ public class HikvisionCall { @Lazy @Autowired HikvisionCall hikvisionCall; + @Lazy + @Autowired + private AiAnalyseHardWareAlarmRecordMapper aiAnalyseHardWareAlarmRecordMapper; + @Lazy + @Autowired + private AsyncAiAnalyse asyncAiAnalyse; @Value("${upload.image.url.prefix:}") private String imageUrlPrefix; @Value("${basePath:}") @@ -127,15 +138,19 @@ public class HikvisionCall { @Autowired private IAiAnalyseHardWareRecordService aiAnalyseHardWareRecordService; - @Autowired - private IAiAnalyseHardWareAlarmRecordService aiAnalyseHardWareAlarmRecordService; - @Autowired private IFrontierProtectionDevAlarmService frontierProtectionDevAlarmService; @Autowired 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++) { JSONObject jo1 = eventsJa.getJSONObject(i); JSONObject dataJo = jo1.getJSONObject("data"); - String happenTime = jo1.getString("happenTime"); - String srcIndex = jo1.getString("srcIndex"); String extEventPersonNo = dataJo.getString("ExtEventPersonNo"); - String extEventCardNo = dataJo.getString("ExtEventCardNo"); WorkerInfo workerInfo = workerInfoMapper.selectById(extEventPersonNo); if (workerInfo == null) { log.info("未找到该人员信息,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().eq(Project::getProjectSn, workerInfo.getProjectSn())); String idCard = workerInfo.getIdCard(); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { @@ -198,10 +213,7 @@ public class HikvisionCall { log.error("请先上传对应设备信息,idCard:{},devSN:{}", idCard, srcIndex); return Result.error("请先上传对应设备信息,idCard:" + idCard + ",extEventCardNo:" + extEventCardNo); } - HashMap map = new HashMap<>(); String time = DateUtil.formatDateTime(DateUtil.parse(happenTime)); - map.put("passTime", time); - map.put("idCard", idCard); Integer count = workerAttendanceMapper.selectCount(new LambdaQueryWrapper() .eq(WorkerAttendance::getPersonSn, workerInfo.getPersonSn()) .eq(WorkerAttendance::getCreateTime, time) @@ -209,23 +221,8 @@ public class HikvisionCall { if (count != 0) { continue; } - map.put("attendanceNumber", workerInfo.getAttendanceNumber()); int passType = workerAttendanceServiceImpl.getPassType(ufaceDev, time); - 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); + hikvisionCall.saveEventCallbackAttendanceAsync(dataJo, workerInfo, srcIndex, project, idCard, time, passType); } } } else if (Objects.equals(ability, "event_pms")) { @@ -269,55 +266,7 @@ public class HikvisionCall { //carPassRecordMapper.updateById(carPassRecord); } else if (eventType == 771760130 || eventType == 771760133) { //压线事件 - 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 carInfos = carInfoMapper.selectList(new LambdaQueryWrapper() - .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 queryWrapper = new LambdaQueryWrapper() - .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)); - } + hikvisionCall.saveEventCallbackCarPassRecordAsync(dataJo, srcIndex, plateNo, carCamera, project, time); } } } @@ -336,40 +285,127 @@ public class HikvisionCall { // frontierProtectionDevAlarmService.saveBatch(frontierProtectionDevAlarmList); } else if (Objects.equals(ability, "")) { - JSONArray eventsArray = paramsJo.getJSONArray("events"); - if (eventsArray.size()>0 ){ - JSONObject dataEvent = (JSONObject) eventsArray.get(0); - JSONArray eventDetails = dataEvent.getJSONArray("eventDetails"); - JSONObject eventDetail = (JSONObject) eventDetails.get(0); + log.info("AI识别告警=======" + paramsJo); + JSONArray eventsArray = paramsJo.getJSONArray("events"); + if (eventsArray.size() > 0) { + JSONObject dataEvent = eventsArray.getJSONObject(0); + JSONArray eventDetails = dataEvent.getJSONArray("eventDetails"); + JSONObject eventDetail = eventDetails.getJSONObject(0); ability = eventDetail.getString("ability"); - if (Objects.equals(ability, "event_vss")){ + if (Objects.equals(ability, "event_vss")) { log.info("AI识别告警=======" + paramsJo); - String srcName = eventDetail.getString("srcName");//摄像机名称 - String eventType = eventDetail.getString("eventType");//422000003 - JSONObject data = eventDetail.getJSONObject("data"); - String imageUrl = data.getString("url"); //海康AI图片地址 + String srcName = eventDetail.getString("srcName");//摄像机名称 + String eventType = eventDetail.getString("eventType");//422000003 + JSONObject data = eventDetail.getJSONObject("data"); + String imageUrl = data.getString("url"); //海康AI图片地址 + String deviceID = data.getString("deviceID"); //海康AI图片地址 + AiAnalyseHardWareRecord dev = aiAnalyseHardWareRecordMapper.selectOne(new LambdaQueryWrapper() + .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 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.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(); } + @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 carInfos = carInfoMapper.selectList(new LambdaQueryWrapper() + .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 queryWrapper = new LambdaQueryWrapper() + .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 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") @PostMapping(value = "/subscribeEvent") public Result subscribeEvent(@ApiIgnore @RequestBody SubscribeEventQo qo) throws Exception { @@ -405,6 +441,12 @@ public class HikvisionCall { if (CollUtil.isEmpty(projects)) { 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 projects) { CompletableFuture.runAsync(() -> { for (Project project : projects) { List ufaceDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper() @@ -490,7 +532,6 @@ public class HikvisionCall { } log.info("服务挂了主动获取门禁点事件的人员通行记录执行完成,startTime:{},endTime:{}", startTime, endTime); }); - return Result.ok("已在后台同步人员数据,请耐心等待!"); } @ApiOperation(value = "服务挂了主动获取查询过车记录", notes = "服务挂了主动获取查询过车记录", httpMethod = "POST") @@ -518,98 +559,101 @@ public class HikvisionCall { if (CollUtil.isEmpty(projects)) { return Result.error("项目未配置海康同步功能"); } - CompletableFuture.runAsync(() -> { - for (Project project : projects) { - param.put("pageNo", 1); - String projectParkCode = null; + hikvisionCall.getCrossRecordsAsync(startTime, endTime, param, projects); + return Result.ok("已在后台同步车辆通行数据,请耐心等待!"); + } + + @Async("getCrossRecords") + public void getCrossRecordsAsync(String startTime, String endTime, JSONObject param, List 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 { - projectParkCode = getProjectParkCode(project); + rs = getCrossRecordsForHttp(project, param); } 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 { - rs = getCrossRecordsForHttp(project, param); - } catch (Exception e) { - log.error("err:", e); - return; - } - JSONObject joData = HikvisionUtil.getJSONObjectData(rs); - if (joData != null) { - total = joData.getInteger("total"); - if (!Objects.equals(total, 0)) { - listJa = joData.getJSONArray("list"); - for (int i = 0; i < listJa.size(); i++) { - JSONObject listJo = listJa.getJSONObject(i); - String plateNo = listJo.getString("plateNo"); - String roadwaySyscode = listJo.getString("roadwaySyscode"); - String aswSyscode = listJo.getString("aswSyscode"); - String crossTime = listJo.getString("crossTime"); - String time = DateUtil.formatDateTime(DateUtil.parse(crossTime)); - String plateNoPicUri = listJo.getString("plateNoPicUri"); - String vehiclePicUri = listJo.getString("vehiclePicUri"); - CarCamera carCamera = carCameraMapper.selectOne(new LambdaQueryWrapper() - .eq(CarCamera::getCameraId, roadwaySyscode)); - if (carCamera == null) { - log.info("海康车辆相机设备不存在:CameraId:{}", roadwaySyscode); - continue; - } - CarPassRecord entity = new CarPassRecord(); - entity.setCarNumber(plateNo); - entity.setType(getPassType(carCamera.getPassType())); - entity.setPassTime(time); - - try { - //车牌 - entity.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, plateNoPicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); - entity.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, vehiclePicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); - } catch (Exception e) { - log.error("error:", e); - } - - entity.setCarColor(getCarColor(listJo.getInteger("plateColor"))); - entity.setLocation(carCamera.getCameraName()); - entity.setProjectSn(carCamera.getProjectSn()); - entity.setColor(getColor(listJo.getInteger("vehicleColor"))); - entity.setCameraId(roadwaySyscode); - List carInfos = carInfoMapper.selectList(new LambdaQueryWrapper() - .eq(CarInfo::getProjectSn, carCamera.getProjectSn()) - .eq(CarInfo::getCarNumber, plateNo) - .eq(CarInfo::getIsBlack, 0) - ); - if (CollUtil.isNotEmpty(carInfos)) { - entity.setIsOpen(1); - } else { - entity.setIsOpen(0); - } - Integer count1 = carPassRecordMapper.selectCount(new LambdaQueryWrapper() - .eq(CarPassRecord::getCarNumber, plateNo) - .eq(CarPassRecord::getPassTime, time) - ); - if (count1 != 0) { - carPassRecordMapper.update(entity, new LambdaQueryWrapper() - .eq(CarPassRecord::getCarNumber, plateNo) - .eq(CarPassRecord::getPassTime, time)); - } else { - carPassRecordMapper.insert(entity); - } + JSONObject joData = HikvisionUtil.getJSONObjectData(rs); + if (joData != null) { + total = joData.getInteger("total"); + if (!Objects.equals(total, 0)) { + listJa = joData.getJSONArray("list"); + for (int i = 0; i < listJa.size(); i++) { + JSONObject listJo = listJa.getJSONObject(i); + String plateNo = listJo.getString("plateNo"); + String roadwaySyscode = listJo.getString("roadwaySyscode"); + String aswSyscode = listJo.getString("aswSyscode"); + String crossTime = listJo.getString("crossTime"); + String time = DateUtil.formatDateTime(DateUtil.parse(crossTime)); + String plateNoPicUri = listJo.getString("plateNoPicUri"); + String vehiclePicUri = listJo.getString("vehiclePicUri"); + CarCamera carCamera = carCameraMapper.selectOne(new LambdaQueryWrapper() + .eq(CarCamera::getCameraId, roadwaySyscode)); + if (carCamera == null) { + log.info("海康车辆相机设备不存在:CameraId:{}", roadwaySyscode); + continue; + } + CarPassRecord entity = new CarPassRecord(); + entity.setCarNumber(plateNo); + entity.setType(getPassType(carCamera.getPassType())); + entity.setPassTime(time); + + try { + //车牌 + entity.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, plateNoPicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); + entity.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, vehiclePicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); + } catch (Exception e) { + log.error("error:", e); + } + + entity.setCarColor(getCarColor(listJo.getInteger("plateColor"))); + entity.setLocation(carCamera.getCameraName()); + entity.setProjectSn(carCamera.getProjectSn()); + entity.setColor(getColor(listJo.getInteger("vehicleColor"))); + entity.setCameraId(roadwaySyscode); + List carInfos = carInfoMapper.selectList(new LambdaQueryWrapper() + .eq(CarInfo::getProjectSn, carCamera.getProjectSn()) + .eq(CarInfo::getCarNumber, plateNo) + .eq(CarInfo::getIsBlack, 0) + ); + if (CollUtil.isNotEmpty(carInfos)) { + entity.setIsOpen(1); + } else { + entity.setIsOpen(0); + } + Integer count1 = carPassRecordMapper.selectCount(new LambdaQueryWrapper() + .eq(CarPassRecord::getCarNumber, plateNo) + .eq(CarPassRecord::getPassTime, time) + ); + if (count1 != 0) { + carPassRecordMapper.update(entity, new LambdaQueryWrapper() + .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); - } - log.info("服务挂了主动获取车辆事件的车辆通行记录执行完成,startTime:{},endTime:{}", startTime, endTime); - }); - return Result.ok("已在后台同步车辆通行数据,请耐心等待!"); + } + } while (total > 0 && listJa.size() > 0); + } + log.info("服务挂了主动获取车辆事件的车辆通行记录执行完成,startTime:{},endTime:{}", startTime, endTime); } /** @@ -2088,25 +2132,15 @@ public class HikvisionCall { return null; } String fileName = IdUtil.simpleUUID() + ".png"; - CompletableFuture.runAsync(() -> { - try { - downLoadImg(url, fileName); - } catch (Exception e) { - log.error("下载图片失败,url:{}。>>>", url, e); - try { - downLoadImg(url, fileName); - } catch (Exception ex) { - log.error("重试下载图片失败,url:{}。>>>", url, ex); - } - } - }); + try { + X509TrustManagerUtil.downLoadFromUrl(url, fileName, basePath); + } catch (Exception e) { + log.error("下载海康图片出现异常:" + e); + return null; + } return fileName; } - private void downLoadImg(String url, String fileName) throws Exception { - X509TrustManagerUtil.downLoadFromUrlHttps(url, fileName, basePath); - } - /** * 保存车辆群组绑定关系 * diff --git a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java index 1036576dc..91d9199ac 100644 --- a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java +++ b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java @@ -372,5 +372,100 @@ public class AsyncConfig { 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; + } + } diff --git a/src/main/java/com/zhgd/xmgl/config/SafetyHatWSClient.java b/src/main/java/com/zhgd/xmgl/config/SafetyHatWSClient.java index 064bc0b4e..e7de362f4 100644 --- a/src/main/java/com/zhgd/xmgl/config/SafetyHatWSClient.java +++ b/src/main/java/com/zhgd/xmgl/config/SafetyHatWSClient.java @@ -119,6 +119,7 @@ public class SafetyHatWSClient { List devList = SpringContextUtils.getBean(SafetyHatDevMapper.class).selectList(new LambdaQueryWrapper() .eq(SafetyHatDev::getProjectSn, project.getProjectSn()) .notIn(SafetyHatDev::getDevSn, devsns) + .eq(SafetyHatDev::getOnline, 1) ); if (CollUtil.isNotEmpty(devList)) { for (SafetyHatDev dev : devList) { diff --git a/src/main/java/com/zhgd/xmgl/modules/car/service/impl/CarInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/car/service/impl/CarInfoServiceImpl.java index c984d7ea6..05185252f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/car/service/impl/CarInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/car/service/impl/CarInfoServiceImpl.java @@ -96,12 +96,15 @@ public class CarInfoServiceImpl extends ServiceImpl impl @Override public void addCarInfo(CarInfo carInfo) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn()) - .eq(CarInfo::getCarNumber, carInfo.getCarNumber()); - int count = carInfoMapper.selectCount(queryWrapper); - if (count > 0) { - throw new OpenAlertException(MessageUtil.get("carNumberExistErr")); + if (Objects.equals(carInfo.getCarModuleType(), 1)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn()) + .eq(CarInfo::getCarNumber, carInfo.getCarNumber()) + .eq(CarInfo::getCarModuleType, 1); + int count = carInfoMapper.selectCount(queryWrapper); + if (count > 0) { + throw new OpenAlertException(MessageUtil.get("carNumberExistErr")); + } } carInfoMapper.insert(carInfo); @@ -111,13 +114,16 @@ public class CarInfoServiceImpl extends ServiceImpl impl @Override public void editCarInfo(CarInfo carInfo) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn()) - .eq(CarInfo::getCarNumber, carInfo.getCarNumber()) - .ne(CarInfo::getId, carInfo.getId()); - int count = carInfoMapper.selectCount(queryWrapper); - if (count > 0) { - throw new OpenAlertException(MessageUtil.get("carNumberExistErr")); + if (Objects.equals(carInfo.getCarModuleType(), 1)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(CarInfo::getProjectSn, carInfo.getProjectSn()) + .eq(CarInfo::getCarNumber, carInfo.getCarNumber()) + .ne(CarInfo::getId, carInfo.getId()) + .eq(CarInfo::getCarModuleType, 1); + int count = carInfoMapper.selectCount(queryWrapper); + if (count > 0) { + throw new OpenAlertException(MessageUtil.get("carNumberExistErr")); + } } CarInfo old = carInfoMapper.selectById(carInfo.getId()); carInfoMapper.updateById(carInfo); diff --git a/src/main/java/com/zhgd/xmgl/util/X509TrustManagerUtil.java b/src/main/java/com/zhgd/xmgl/util/X509TrustManagerUtil.java index 693bef478..2cc5eb336 100644 --- a/src/main/java/com/zhgd/xmgl/util/X509TrustManagerUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/X509TrustManagerUtil.java @@ -10,10 +10,23 @@ import java.security.cert.CertificateException; import java.security.cert.X509Certificate; /** - * 处理https的图片 + * 处理https/http的图片 */ @Slf4j 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图片保存在本地 * @@ -52,24 +65,29 @@ public class X509TrustManagerUtil implements X509TrustManager { conn.setSSLSocketFactory(ssf); conn.connect(); - // 得到输入流 - InputStream inputStream = conn.getInputStream(); - byte[] getData = readInputStream(inputStream); - // 文件保存位置 - File saveDir = new File(savePath); - if (!saveDir.exists()) { - saveDir.mkdirs(); - } - //输出流 - File file = new File(saveDir + File.separator + fileName); - FileOutputStream fos = new FileOutputStream(file); - fos.write(getData); - if (fos != null) { - fos.close(); - } - if (inputStream != null) { - inputStream.close(); + FileOutputStream fos = null; + InputStream inputStream = null; + try { + inputStream = conn.getInputStream(); + byte[] getData = readInputStream(inputStream); + // 文件保存位置 + File saveDir = new File(savePath); + if (!saveDir.exists()) { + saveDir.mkdirs(); + } + //输出流 + File file = new File(saveDir + File.separator + fileName); + fos = new FileOutputStream(file); + fos.write(getData); + + } finally { + if (fos != null) { + fos.close(); + } + if (inputStream != null) { + inputStream.close(); + } } } @@ -133,21 +151,16 @@ public class X509TrustManagerUtil implements X509TrustManager { return bos.toByteArray(); } - - /*** - * 校验https网址是否安全 - * - * @author solexit06 - * - */ - public class TrustAnyHostnameVerifier implements HostnameVerifier { - public boolean verify(String hostname, SSLSession session) { - // 直接返回true:默认所有https请求都是安全的 - return true; + public static void main(String[] args) { + String name = "C:/Users/solexit06/Desktop/test/"; + 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 { + downLoadFromUrlHttps(urls, "1.png", name); + } catch (Exception e) { + log.error("error:", e); } } - /* * 里面的方法都是空的,当方法为空是默认为所有的链接都为安全,也就是所有的链接都能够访问到 当然这样有一定的安全风险,可以根据实际需要写入内容 */ @@ -165,13 +178,16 @@ public class X509TrustManagerUtil implements X509TrustManager { return null; } - public static void main(String[] args) { - String name = "C:/Users/solexit06/Desktop/test/"; - 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 { - downLoadFromUrlHttps(urls, "1.png", name); - } catch (Exception e) { - log.error("error:", e); + /*** + * 校验https网址是否安全 + * + * @author solexit06 + * + */ + public class TrustAnyHostnameVerifier implements HostnameVerifier { + public boolean verify(String hostname, SSLSession session) { + // 直接返回true:默认所有https请求都是安全的 + return true; } } }