package com.zhgd.xmgl.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhgd.redis.lock.RedisRepository; import com.zhgd.xmgl.base.HikvisionEventsPictureRq; import com.zhgd.xmgl.call.HikvisionCall; import com.zhgd.xmgl.modules.car.entity.CarInfo; import com.zhgd.xmgl.modules.car.entity.CarInfoApprovalFlow; import com.zhgd.xmgl.modules.car.entity.CarMeasureSpeedData; import com.zhgd.xmgl.modules.car.entity.CarMeasureSpeedDev; import com.zhgd.xmgl.modules.car.enums.CarInfoCarModuleTypeEnum; import com.zhgd.xmgl.modules.car.mapper.CarInfoApprovalFlowMapper; import com.zhgd.xmgl.modules.car.mapper.CarInfoMapper; import com.zhgd.xmgl.modules.car.service.ICarMeasureSpeedDataService; import com.zhgd.xmgl.modules.car.service.ICarMeasureSpeedDevService; import com.zhgd.xmgl.modules.car.service.impl.CarInfoServiceImpl; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.util.HikvisionUtil; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @RequestMapping("/xmgl/task") @RestController public class CarInfoTask { @Lazy @Autowired HikvisionCall hikvisionCall; @Lazy @Autowired private CarInfoServiceImpl carInfoService; @Lazy @Autowired private CarInfoMapper carInfoMapper; @Lazy @Autowired private ProjectMapper projectMapper; @Lazy @Autowired private CarInfoApprovalFlowMapper carInfoApprovalFlowMapper; @Lazy @Autowired private RedisRepository redisRepository; @Lazy @Autowired private ICarMeasureSpeedDevService carMeasureSpeedDevService; @Autowired private ICarMeasureSpeedDataService carMeasureSpeedDataService; /** * 定时删除/更新过期的车辆,并下发新的预约时间的车辆到海康 */ @Scheduled(cron = "*/30 * * * * ?") public void deleteOrUpdateExpiredCar() { //删除过期 carInfoApprovalFlowMapper.delete(new LambdaQueryWrapper() .lt(CarInfoApprovalFlow::getReserveEndTime, DateUtil.now()) .eq(CarInfoApprovalFlow::getIsBlack, 0) ); List projects = projectMapper.selectList(new LambdaQueryWrapper().eq(Project::getSyncHikvision, 1)); for (Project project : projects) { //过期或者未来车 List cars = carInfoMapper.selectList(new LambdaQueryWrapper() .ne(CarInfo::getCarModuleType, CarInfoCarModuleTypeEnum.GD.getValue()) .eq(CarInfo::getIsBlack, 0) .eq(CarInfo::getProjectSn, project.getProjectSn()) .and(w -> w.lt(CarInfo::getReserveEndTime, DateUtil.now()).or().gt(CarInfo::getReserveStartTime, DateUtil.now())) ); if (CollUtil.isEmpty(cars)) { return; } for (CarInfo carInfo : cars) { carInfoService.deleteOrUpdateCar(project, carInfo, false); } } } /** * 定时到海康拉取车辆超速,园区卡口违章事件查询v2 */ @Scheduled(cron = "* */2 * * * ?") @SchedulerLock(name = "getCarMeasureSpeedData", lockAtMostFor = 1000 * 60, lockAtLeastFor = 1000 * 60) @RequestMapping("getCarMeasureSpeedData") public void getCarMeasureSpeedData() { String start; String queryTimeKey = "GET_ISC_CAR_MEASURE_SPEED_DATA_TIME"; Object o = redisRepository.get(queryTimeKey); if (o != null) { start = o.toString(); } else { start = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); } String end = DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); redisRepository.set(queryTimeKey, end); List projects = projectMapper.selectList(new LambdaQueryWrapper() .eq(Project::getSyncHikvision, 1)); List speedDevs = carMeasureSpeedDevService.list(); Map> projectMap = speedDevs.stream().collect(Collectors.groupingBy(CarMeasureSpeedDev::getProjectSn)); for (Map.Entry> entry : projectMap.entrySet()) { List list = entry.getValue(); Map devMap = list.stream().collect(Collectors.toMap(CarMeasureSpeedDev::getDevSn, Function.identity())); String projectSn = entry.getKey(); Optional hasProject = projects.stream().filter(project -> Objects.equals(project.getProjectSn(), projectSn)).findFirst(); if (hasProject.isPresent()) { Project project = hasProject.get(); try { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); param.put("beginTime", start); param.put("endTime", DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")); JSONObject rsJo = HikvisionUtil.getSpeedDataList(project, param); if (HikvisionUtil.isSuccess(rsJo)) { JSONObject dataJo = HikvisionUtil.getJsonObjectData(rsJo); JSONArray listJa = dataJo.getJSONArray("list"); if (CollUtil.isNotEmpty(listJa)) { for (int i = 0; i < listJa.size(); i++) { JSONObject jo = listJa.getJSONObject(i); Integer illegalType = jo.getInteger("illegalType"); if (!Objects.equals(illegalType, 1) && !Objects.equals(illegalType, 7)) { continue; } String monitoringId = jo.getString("monitoringId"); CarMeasureSpeedDev dev = devMap.get(monitoringId); if (dev == null) { continue; } String plateNo = jo.getString("plateNo"); BigDecimal speed = jo.getBigDecimal("speed"); Date time = DateUtil.parse(jo.getString("crossTime")); CarMeasureSpeedData data = new CarMeasureSpeedData(); data.setDevSn(monitoringId); data.setCarNumber(plateNo); data.setIsExceed(NumberUtil.isGreater(speed, dev.getThreshold()) ? 1 : 0); data.setCurrentSpeed(speed); data.setExceedingThreshold(Objects.equals(data.getIsExceed(), 1) ? NumberUtil.sub(speed, dev.getThreshold()) : new BigDecimal("0")); String platePicUrl = jo.getString("carPicUri"); String svrIndex = jo.getString("aswSyscode"); if (StringUtils.isNotBlank(platePicUrl)) { data.setSnapshotImage(hikvisionCall.saveToLocal(HikvisionCall.getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, platePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); } data.setUploadTime(time); data.setProjectSn(dev.getProjectSn()); carMeasureSpeedDataService.add(data); } } } } catch (Exception e) { log.error("定时到海康拉取车辆超速错误:", e); } } } } }