package com.stylefeng.guns.modular.system.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.stylefeng.guns.modular.system.model.PatrolTask;
|
import com.stylefeng.guns.modular.system.model.TaskDetail;
|
import com.stylefeng.guns.modular.system.model.TaskDetailVehicles;
|
import com.stylefeng.guns.modular.system.model.TaskDetailVehiclesChannel;
|
import com.stylefeng.guns.modular.system.model.enums.ImageModelEnum;
|
import com.stylefeng.guns.modular.system.model.vo.PatrolTaskVo;
|
import com.stylefeng.guns.modular.system.model.vo.VehicleVo;
|
import com.stylefeng.guns.modular.system.service.ITaskDetailService;
|
import com.stylefeng.guns.modular.system.service.ITaskDetailVehiclesChannelService;
|
import com.stylefeng.guns.modular.system.service.ITaskDetailVehiclesService;
|
import com.stylefeng.guns.modular.system.util.UUIDUtil;
|
import com.stylefeng.guns.modular.system.util.imageModel.ImageModelUtil;
|
import com.stylefeng.guns.modular.system.util.quartz.QuartzUtil;
|
import com.stylefeng.guns.modular.system.util.quartz.jobs.PatrolTaskJob;
|
import com.stylefeng.guns.modular.system.util.quartz.model.QuartzEnum;
|
import com.stylefeng.guns.modular.system.util.videoGateway.VideoGateway;
|
import com.stylefeng.guns.modular.system.util.videoGateway.model.VehicleOnline;
|
import lombok.extern.slf4j.Slf4j;
|
import org.quartz.JobDataMap;
|
import org.quartz.SchedulerException;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.annotation.Lazy;
|
import org.springframework.stereotype.Service;
|
import com.stylefeng.guns.modular.system.dao.PatrolTaskMapper;
|
import com.stylefeng.guns.modular.system.service.IPatrolTaskService;
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
|
import javax.annotation.Resource;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
import java.util.Arrays;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* @author zhibing.pu
|
* @Date 2024/12/17 20:18
|
*/
|
@Slf4j
|
@Service
|
public class PatrolTaskServiceImpl extends ServiceImpl<PatrolTaskMapper, PatrolTask> implements IPatrolTaskService {
|
|
@Autowired
|
private ITaskDetailService taskDetailService;
|
|
@Autowired
|
private ITaskDetailVehiclesService taskDetailVehiclesService;
|
|
@Autowired
|
private ITaskDetailVehiclesChannelService taskDetailVehiclesChannelService;
|
|
@Autowired
|
private QuartzUtil quartzUtil;
|
|
|
|
/**
|
* 添加新的任务数据
|
* @param vo
|
*/
|
@Override
|
public void addPatrolTask(PatrolTaskVo vo, String userId) {
|
if(vo.getType() == 1 && vo.getStartTime().isAfter(vo.getEndTime())){
|
throw new RuntimeException("结束时间不能小于开始时间");
|
}
|
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
|
threadPoolExecutor.execute(new Runnable() {
|
@Override
|
public void run() {
|
//构建主数据
|
PatrolTask patrolTask = new PatrolTask();
|
BeanUtils.copyProperties(vo, patrolTask);
|
patrolTask.setCreateTime(LocalDateTime.now());
|
patrolTask.setCreateUserId(Integer.valueOf(userId));
|
PatrolTaskServiceImpl.this.insert(patrolTask);
|
if(vo.getType() == 2){
|
//实时任务,手动添加后续逻辑中需要的数据
|
LocalDateTime now = LocalDateTime.now();
|
vo.setWeeks("[" + now.getDayOfWeek().getValue() + "]");
|
vo.setStartTime(now);
|
vo.setExecutionTime(now.plusSeconds(5).format(DateTimeFormatter.ofPattern("HH:mm")));
|
vo.setEndTime(now.plusSeconds(10));
|
}
|
String weeks = vo.getWeeks();
|
List<Integer> week = JSON.parseArray(weeks, Integer.class);
|
//构建明细任务
|
LocalDateTime startTime = vo.getStartTime();
|
LocalDateTime endTime = vo.getEndTime();
|
while (true){
|
if(startTime.compareTo(endTime) >= 0){
|
break;
|
}
|
int value = startTime.getDayOfWeek().getValue();
|
if(week.contains(value)){
|
TaskDetail taskDetail = new TaskDetail();
|
taskDetail.setCode(UUIDUtil.getTimeStr());
|
taskDetail.setPatrolTaskId(patrolTask.getId());
|
taskDetail.setStatus(1);
|
String executionTime = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + vo.getExecutionTime();
|
taskDetail.setExecutionTime(LocalDateTime.parse(executionTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")));
|
taskDetail.setDelFlag(0);
|
taskDetailService.insert(taskDetail);
|
|
//添加任务和车船关系数据
|
List<VehicleVo> vehicle = vo.getVehicle();
|
for (VehicleVo vehicleVo : vehicle) {
|
TaskDetailVehicles taskDetailVehicles = new TaskDetailVehicles();
|
taskDetailVehicles.setPatrolTaskId(patrolTask.getId());
|
taskDetailVehicles.setTaskDetailId(taskDetail.getId());
|
taskDetailVehicles.setVehicleId(vehicleVo.getVehicleId());
|
taskDetailVehicles.setVehicleNum(vehicleVo.getVehicleNum());
|
taskDetailVehicles.setVehicleType(vehicleVo.getVehicleType());
|
taskDetailVehicles.setVehicleIdUnique(vehicleVo.getVehicleId() + "_" + vehicleVo.getVehicleType());
|
taskDetailVehicles.setCompanyId(vehicleVo.getCompanyId());
|
taskDetailVehicles.setCompanyName(vehicleVo.getCompanyName());
|
taskDetailVehicles.setInspectPeriodStart(vehicleVo.getInspectPeriodStart());
|
taskDetailVehicles.setInspectPeriodEnd(vehicleVo.getInspectPeriodEnd());
|
taskDetailVehicles.setStatus(1);
|
taskDetailVehiclesService.insert(taskDetailVehicles);
|
|
//添加任务车船视频通道关系数据
|
List<Integer> videoChannel = vo.getVideoChannel();
|
for (Integer s : videoChannel) {
|
TaskDetailVehiclesChannel taskDetailVehiclesChannel = new TaskDetailVehiclesChannel();
|
taskDetailVehiclesChannel.setPatrolTaskId(patrolTask.getId());
|
taskDetailVehiclesChannel.setTaskDetailId(taskDetail.getId());
|
taskDetailVehiclesChannel.setTaskDetailVehiclesId(taskDetailVehicles.getId());
|
taskDetailVehiclesChannel.setVideoChannel(s);
|
taskDetailVehiclesChannel.setSysStatus(1);
|
taskDetailVehiclesChannelService.insert(taskDetailVehiclesChannel);
|
}
|
}
|
|
//添加定时任务
|
JobDataMap jobDataMap = new JobDataMap();
|
jobDataMap.put("id", taskDetail.getId());
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
try {
|
quartzUtil.addSimpleQuartzTask(PatrolTaskJob.class,patrolTask.getName() + "_" + taskDetail.getId(), QuartzEnum.DEFAULT_GROUP.getValue(), jobDataMap
|
, sdf.parse(executionTime), 0, 0);
|
} catch (SchedulerException e) {
|
throw new RuntimeException(e);
|
} catch (ParseException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
//添加一天
|
startTime = startTime.plusDays(1);
|
}
|
}
|
});
|
}
|
|
|
/**
|
* 定时任务执行逻辑
|
* @param id
|
*/
|
@Override
|
public void execute(Integer id){
|
//修改状态为执行中
|
TaskDetail taskDetail = taskDetailService.selectById(id);
|
taskDetail.setStatus(2);
|
taskDetailService.updateById(taskDetail);
|
|
PatrolTask patrolTask = this.selectById(taskDetail.getPatrolTaskId());
|
|
//获取所有在线车船
|
//2018年协议车辆在线
|
List<VehicleOnline> vehicleOnlines2018 = VideoGateway.queryRuntimeInfoByCache(0);
|
//2023年协议车辆在线
|
List<VehicleOnline> vehicleOnlines203 = VideoGateway.locationRealTimeInfoCache(0);
|
|
//获取当前任务中的车船信息
|
List<TaskDetailVehicles> taskDetailVehicles = taskDetailVehiclesService.selectList(new EntityWrapper<TaskDetailVehicles>().eq("task_detail_id", id));
|
int errNum = 0;
|
for (TaskDetailVehicles taskDetailVehicle : taskDetailVehicles) {
|
try {
|
taskDetailVehicle.setStartExecutionTime(LocalDateTime.now());
|
Integer taskDetailVehicleId = taskDetailVehicle.getId();
|
//车船类型:1 车辆设备 2 船舶设备
|
Integer vehicleType = taskDetailVehicle.getVehicleType();
|
//车船id
|
Integer vehicleId = taskDetailVehicle.getVehicleId();
|
VehicleOnline vehicleOnline1 = null;
|
for (VehicleOnline vehicleOnline : vehicleOnlines2018) {
|
if(null != vehicleOnline.getVehicleId() && vehicleOnline.getVehicleId().equals(vehicleId) &&
|
null != vehicleOnline.getVehicleType() && vehicleOnline.getVehicleType().equals(vehicleType)){
|
vehicleOnline1 = vehicleOnline;
|
String vehicleGpsProtocol = vehicleOnline.getVehicleGpsProtocol();
|
vehicleOnline1.setVehicleGpsProtocol("808-guangzhou".equals(vehicleGpsProtocol) ? "1" : "2");
|
break;
|
}
|
}
|
if(null == vehicleOnline1){
|
for (VehicleOnline vehicleOnline : vehicleOnlines203) {
|
if(null != vehicleOnline.getVehicleId() && vehicleOnline.getVehicleId().equals(vehicleId) &&
|
null != vehicleOnline.getVehicleType() && vehicleOnline.getVehicleType().equals(vehicleType)){
|
vehicleOnline1 = vehicleOnline;
|
vehicleOnline1.setVehicleGpsProtocol(vehicleOnline.getVehicleGpsProtocol());
|
break;
|
}
|
}
|
}
|
//不在线
|
if(null == vehicleOnline1){
|
taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
|
taskDetailVehicle.setStatus(4);
|
taskDetailVehiclesService.updateById(taskDetailVehicle);
|
continue;
|
}
|
taskDetailVehicle.setStatus(2);
|
taskDetailVehiclesService.updateById(taskDetailVehicle);
|
//成功
|
List<TaskDetailVehiclesChannel> taskDetailVehiclesChannels = taskDetailVehiclesChannelService.selectList(new EntityWrapper<TaskDetailVehiclesChannel>().eq("task_detail_vehicles_id", taskDetailVehicleId));
|
//开始发送拍照指令,获取照片地址
|
String vehicleGpsProtocol = vehicleOnline1.getVehicleGpsProtocol();
|
String terminalId = vehicleOnline1.getTerminalId();
|
for (TaskDetailVehiclesChannel taskDetailVehiclesChannel : taskDetailVehiclesChannels) {
|
Integer videoChannel = taskDetailVehiclesChannel.getVideoChannel();
|
|
if("1".equals(vehicleGpsProtocol)){
|
//2018 协议
|
String fileId = VideoGateway.cameraShot2018(terminalId, videoChannel, 0);
|
if(null == fileId){
|
log.error("2018年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel);
|
throw new RuntimeException();
|
}else{
|
//等待15秒
|
Thread.sleep(30000);
|
|
String fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0);
|
if(null == fileUrl){
|
log.error("2018年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId);
|
//重新发送拍摄指令,如果还是没有获取到图片,标注失败
|
fileId = VideoGateway.cameraShot2018(terminalId, videoChannel, 0);
|
if(null == fileId){
|
log.error("2018年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel);
|
throw new Exception();
|
}else{
|
//等待15秒
|
Thread.sleep(30000);
|
|
fileUrl = VideoGateway.getCameraShotByFileId2018(terminalId, fileId, 0);
|
if(null == fileUrl){
|
log.error("2018年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId);
|
throw new Exception();
|
}else{
|
taskDetailVehiclesChannel.setImageUrl(fileUrl);
|
taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
|
taskDetailVehiclesChannel.setArtificialStatus(1);
|
//开始调模型接口得出结果
|
Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
|
Boolean b = (Boolean) map.get("b");
|
String r = map.get("r").toString();
|
taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
|
taskDetailVehiclesChannel.setResult(r);
|
taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
|
}
|
}
|
}else{
|
taskDetailVehiclesChannel.setImageUrl(fileUrl);
|
taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
|
taskDetailVehiclesChannel.setArtificialStatus(1);
|
//开始调模型接口得出结果
|
Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
|
Boolean b = (Boolean) map.get("b");
|
String r = map.get("r").toString();
|
taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
|
taskDetailVehiclesChannel.setResult(r);
|
taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
|
}
|
}
|
}else{
|
//2023 协议
|
String fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, videoChannel, 0);
|
if(null == fileId){
|
log.error("2023年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel);
|
throw new Exception();
|
}else{
|
//等待15秒
|
Thread.sleep(30000);
|
|
String fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0);
|
if(null == fileUrl){
|
log.error("2023年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId);
|
//重新发送拍摄指令,如果还是没有获取图片,标注异常
|
fileId = VideoGateway.cameraShot2023(vehicleId, vehicleType, terminalId, videoChannel, 0);
|
if(null == fileId){
|
log.error("2023年协议发送拍摄指令失败:terminalId-->{},videoChannel-->{}", terminalId, videoChannel);
|
throw new Exception();
|
}else{
|
//等待15秒
|
Thread.sleep(30000);
|
|
fileUrl = VideoGateway.getCameraShotByFileId2023(fileId, 0);
|
if(null == fileUrl){
|
log.error("2023年协议车辆获取拍摄图片失败:terminalId-->{},fileId-->{}", terminalId, fileId);
|
throw new Exception();
|
}else{
|
taskDetailVehiclesChannel.setImageUrl(fileUrl);
|
taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
|
taskDetailVehiclesChannel.setArtificialStatus(1);
|
//开始调模型接口得出结果
|
Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
|
Boolean b = (Boolean) map.get("b");
|
String r = map.get("r").toString();
|
taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
|
taskDetailVehiclesChannel.setResult(r);
|
taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
|
}
|
}
|
}else{
|
taskDetailVehiclesChannel.setImageUrl(fileUrl);
|
taskDetailVehiclesChannel.setSysCreateTime(LocalDateTime.now());
|
taskDetailVehiclesChannel.setArtificialStatus(1);
|
//开始调模型接口得出结果
|
Map<String, Object> map = ImageModelUtil.modelCheck(fileUrl, ImageModelEnum.getImageModelEnum(patrolTask.getImageModel()));
|
Boolean b = (Boolean) map.get("b");
|
String r = map.get("r").toString();
|
taskDetailVehiclesChannel.setSysStatus(b ? 2 : 3);
|
taskDetailVehiclesChannel.setResult(r);
|
taskDetailVehiclesChannelService.updateById(taskDetailVehiclesChannel);
|
}
|
}
|
}
|
}
|
taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
|
taskDetailVehicle.setStatus(3);
|
taskDetailVehiclesService.updateById(taskDetailVehicle);
|
}catch (Exception e){
|
e.printStackTrace();
|
//失败
|
taskDetailVehicle.setEndExecutionTime(LocalDateTime.now());
|
taskDetailVehicle.setStatus(5);
|
taskDetailVehiclesService.updateById(taskDetailVehicle);
|
errNum++;
|
}
|
}
|
|
taskDetail.setStatus(0 == errNum ? 3 : 4);
|
taskDetailService.updateById(taskDetail);
|
}
|
|
|
|
|
public static void main(String[] args) {
|
LocalDateTime now = LocalDateTime.now();
|
now = now.plusDays(5);
|
int value = now.getDayOfWeek().getValue();
|
System.err.println(value);
|
}
|
}
|