package com.ruoyi.device.service.impl; 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 lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 飞行服务实现类 * * @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; @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, String status) { flightMapper.updateFlightStatus(flightId, status); log.info("更新飞行状态: flightId={}, status={}", flightId, status); if ("HOME".equals(status) ||"ERROR".equals(status)) { flightMapper.updateReturnTime(flightId); log.info("更新返航时间: flightId={}", flightId); } } @Override public void updateReturnTime(Long flightId) { flightMapper.updateReturnTime(flightId); } @Override public Map getLatestFlightWithLogs(String deviceSn) { FlightEntity flight = flightMapper.selectLatestFlightByDeviceSn(deviceSn); if (flight == null) { return null; } Map result = new HashMap<>(); result.put("flightId", flight.getFlightId()); result.put("deviceSn", flight.getDeviceSn()); result.put("flightIdExternal", flight.getFlightIdExternal()); result.put("status", flight.getStatus()); result.put("returnTime", flight.getReturnTime()); result.put("createTime", flight.getCreateTime()); List preCheckLogs = preCheckLogMapper.selectPreCheckLogListByFlightId(flight.getFlightId()); List> preCheckLogsWithExecTime = new ArrayList<>(); Date prevTime = flight.getCreateTime(); 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()); if (log.getCreateTime() != null && prevTime != null) { logMap.put("execTime", log.getCreateTime().getTime() - prevTime.getTime()); prevTime = log.getCreateTime(); } preCheckLogsWithExecTime.add(logMap); } result.put("preCheckLogs", preCheckLogsWithExecTime); List flightLogs = flightLogMapper.selectFlightLogListByFlightId(flight.getFlightId()); 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; } }