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 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 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 getLatestFlightWithLogs(String deviceSn) { R taskVo = remoteTaskService.getCurrentTaskByUavId(deviceSn,SecurityConstants.INNER); Map 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 preCheckLogs = preCheckLogMapper.selectPreCheckLogListByFlightId(task.getId()); List> 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 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 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; } }