a-tuoheng-device/src/main/java/com/ruoyi/device/service/impl/FlightServiceImpl.java

212 lines
7.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.ruoyi.device.service.impl;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.device.mapper.FlightLogMapper;
import com.ruoyi.device.mapper.FlightMapper;
import com.ruoyi.device.mapper.PreCheckLogMapper;
import com.ruoyi.device.mapper.entity.FlightEntity;
import com.ruoyi.device.mapper.entity.FlightLogEntity;
import com.ruoyi.device.mapper.entity.PreCheckLogEntity;
import com.ruoyi.device.service.FlightService;
import com.ruoyi.task.api.RemoteTaskService;
import com.ruoyi.task.api.domain.TaskResultVO;
import com.ruoyi.task.api.domain.TaskVO;
import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum;
import com.ruoyi.task.api.enums.TaskCategoryEnum;
import com.ruoyi.task.api.enums.TaskTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 飞行服务实现类
*
* @author ruoyi
* @date 2026-02-25
*/
@Slf4j
@Service
public class FlightServiceImpl implements FlightService
{
@Autowired
private FlightMapper flightMapper;
@Autowired
private PreCheckLogMapper preCheckLogMapper;
@Autowired
private FlightLogMapper flightLogMapper;
@Autowired
private RemoteTaskService remoteTaskService;
public Long currentRunningTask(String sn){
R<TaskVO> taskDTOR = remoteTaskService.getCurrentTaskByUavId(sn,SecurityConstants.INNER);
return taskDTOR.getData().getId();
}
public Long createClickTakeOffTask(String sn, String routeUrl){
TaskVO taskVO = new TaskVO();
taskVO.setTaskName("一键起飞");
taskVO.setActualStartTime(new Date());
taskVO.setStartTime(new Date());
taskVO.setExecuteType(ExecuteTypeEnum.ONCE);
taskVO.setTaskCategory(TaskCategoryEnum.MANUAL);
taskVO.setTaskType(TaskTypeEnum.ONE_CLICK);
taskVO.setRouteId(-1L);
taskVO.setUavId(sn);
taskVO.setStatus(StatusEnum.PENDING);
taskVO.setRouteUrl(routeUrl);
R<Long> taskId = remoteTaskService.createTaskWithoutPlan(taskVO,SecurityConstants.INNER);
return taskId.getData();
}
//// @Override
//// @Transactional(rollbackFor = Exception.class)
// public FlightEntity getOrCreateFlightByMessageId(String deviceSn, String messageId) {
// // 先查询是否存在相同 deviceSn 和 flight_id_extern 的记录
// FlightEntity flight = flightMapper.selectFlightByDeviceSnAndFlightIdExternal(deviceSn, messageId);
//
// if (flight != null) {
// // 如果存在,直接返回
// log.info("找到已存在的飞行记录: deviceSn={}, messageId={}, flightId={}",
// deviceSn, messageId, flight.getFlightId());
// return flight;
// }
//
// // 如果不存在,创建新的飞行记录
// flight = new FlightEntity();
// flight.setDeviceSn(deviceSn);
// flight.setFlightIdExternal(messageId);
// flight.setStatus("CHECKING");
// flightMapper.insertFlight(flight);
//
// log.info("创建新的飞行记录: deviceSn={}, messageId={}, flightId={}, status=CHECKING",
// deviceSn, messageId, flight.getFlightId());
//
// return flight;
// }
// @Override
// public FlightEntity getLatestFlight(String deviceSn) {
// return flightMapper.selectLatestFlightByDeviceSn(deviceSn);
// }
//
// @Override
// public void updateFlightIdExternal(Long flightId, String flightIdExternal) {
// FlightEntity flight = new FlightEntity();
// flight.setFlightId(flightId);
// flight.setFlightIdExternal(flightIdExternal);
// flightMapper.updateFlight(flight);
// log.info("更新飞行ID: flightId={}, flightIdExternal={}", flightId, flightIdExternal);
// }
@Override
public void updateFlightStatus(Long flightId, TaskResultVO status) {
remoteTaskService.updateTaskStatus(flightId,status,SecurityConstants.INNER);
}
@Override
public Map<String, Object> getLatestFlightWithLogs(String deviceSn) {
R<TaskVO> taskVo = remoteTaskService.getCurrentTaskByUavId(deviceSn,SecurityConstants.INNER);
Map<String, Object> result = new HashMap<>();
if(taskVo.getData()!=null){
TaskVO task = taskVo.getData();
result.put("flightId", task.getId());
result.put("deviceSn", deviceSn);
result.put("status", task.getStatus());
result.put("returnTime", task.getActualEndTime());
result.put("createTime", task.getActualStartTime());
List<PreCheckLogEntity> preCheckLogs = preCheckLogMapper.selectPreCheckLogListByFlightId(task.getId());
List<Map<String, Object>> preCheckLogsWithExecTime = new ArrayList<>();
Long execTime = null;
if (!preCheckLogs.isEmpty() && preCheckLogs.size() > 1) {
Date firstTime = preCheckLogs.get(0).getCreateTime();
Date lastTime = preCheckLogs.get(preCheckLogs.size() - 1).getCreateTime();
if (firstTime != null && lastTime != null) {
execTime = lastTime.getTime() - firstTime.getTime();
}
}
for (PreCheckLogEntity log : preCheckLogs) {
Map<String, Object> logMap = new HashMap<>();
logMap.put("logId", log.getLogId());
logMap.put("flightId", log.getFlightId());
logMap.put("logContent", log.getLogContent());
logMap.put("success", log.getSuccess());
logMap.put("createTime", log.getCreateTime());
logMap.put("updateTime", log.getUpdateTime());
preCheckLogsWithExecTime.add(logMap);
}
result.put("execTime", execTime);
result.put("preCheckLogs", preCheckLogsWithExecTime);
List<FlightLogEntity> flightLogs = flightLogMapper.selectFlightLogListByFlightId(task.getId());
result.put("flightLogs", flightLogs);
}
return result;
}
@Override
public void insertPreCheckLog(PreCheckLogEntity logEntity) {
log.info("【FlightServiceImpl】准备插入自检日志: flightId={}, logContent={}, success={}",
logEntity.getFlightId(), logEntity.getLogContent(), logEntity.getSuccess());
int rows = preCheckLogMapper.insertPreCheckLog(logEntity);
if (rows > 0) {
log.info("【FlightServiceImpl】成功插入自检日志: flightId={}, logId={}, rows={}",
logEntity.getFlightId(), logEntity.getLogId(), rows);
} else {
log.error("【FlightServiceImpl】插入自检日志失败影响行数为0: flightId={}, logContent={}",
logEntity.getFlightId(), logEntity.getLogContent());
}
}
@Override
public void insertFlightLog(FlightLogEntity logEntity) {
log.info("【FlightServiceImpl】准备插入飞行日志: flightId={}, logContent={}",
logEntity.getFlightId(), logEntity.getLogContent());
int rows = flightLogMapper.insertFlightLog(logEntity);
if (rows > 0) {
log.info("【FlightServiceImpl】成功插入飞行日志: flightId={}, logId={}, rows={}",
logEntity.getFlightId(), logEntity.getLogId(), rows);
} else {
log.error("【FlightServiceImpl】插入飞行日志失败影响行数为0: flightId={}, logContent={}",
logEntity.getFlightId(), logEntity.getLogContent());
}
}
@Override
public boolean hasFlightLog(Long flightId) {
int count = flightLogMapper.countFlightLogByFlightId(flightId);
return count > 0;
}
}