修改部分循环引用
This commit is contained in:
parent
dd67784d85
commit
ed6b18574f
@ -1,15 +1,8 @@
|
||||
package com.zhangy.skyeye.jm.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.zhangy.skyeye.jm.consts.JmJobModeEnum;
|
||||
import com.zhangy.skyeye.jm.dto.JmJobDTO;
|
||||
import com.zhangy.skyeye.jm.dto.JmJobKtyDTO;
|
||||
import com.zhangy.skyeye.jm.dto.JmJobPageDTO;
|
||||
import com.zhangy.skyeye.jm.dto.JmJobQueryDTO;
|
||||
import com.zhangy.skyeye.jm.entity.JmJob;
|
||||
import com.zhangy.skyeye.jm.entity.JmJobExec;
|
||||
import com.zhangy.skyeye.jm.entity.JmJobPayload;
|
||||
import com.zhangy.skyeye.jm.entity.JmJobUav;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package com.zhangy.skyeye.jm.service;
|
||||
|
||||
import com.zhangy.skyeye.jm.entity.JmJobPayload;
|
||||
import com.zhangy.skyeye.jm.entity.JmJobUav;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -2,13 +2,10 @@ package com.zhangy.skyeye.jm.service.impl;
|
||||
|
||||
import com.zhangy.skyeye.common.extend.exception.ServiceException;
|
||||
import com.zhangy.skyeye.common.extend.util.ObjectUtil;
|
||||
import com.zhangy.skyeye.jm.dto.JmJobDTO;
|
||||
import com.zhangy.skyeye.jm.entity.JmAirline;
|
||||
import com.zhangy.skyeye.jm.entity.JmAirlineExec;
|
||||
import com.zhangy.skyeye.jm.mapper.JmAirlineExecMapper;
|
||||
import com.zhangy.skyeye.jm.mapper.JmAirlineMapper;
|
||||
import com.zhangy.skyeye.jm.service.JmAirlineExecService;
|
||||
import com.zhangy.skyeye.jm.service.JmAirlineService;
|
||||
import com.zhangy.skyeye.publics.consts.ExecStatusEnum;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -22,8 +19,6 @@ public class JmAirlineExecServiceImpl implements JmAirlineExecService {
|
||||
|
||||
@Autowired
|
||||
private JmAirlineExecMapper airlineExecMapper;
|
||||
@Autowired
|
||||
private JmAirlineMapper jmAirlineMapper;
|
||||
|
||||
@Override
|
||||
public List<JmAirline> selectByJobExec(Long... jobId) {
|
||||
|
||||
@ -13,6 +13,7 @@ import com.zhangy.skyeye.jm.entity.JmImage;
|
||||
import com.zhangy.skyeye.jm.entity.JmImageItem;
|
||||
import com.zhangy.skyeye.jm.entity.JmJobPayload;
|
||||
import com.zhangy.skyeye.jm.mapper.JmImageMapper;
|
||||
import com.zhangy.skyeye.jm.mapper.JmJobPayloadMapper;
|
||||
import com.zhangy.skyeye.jm.service.*;
|
||||
import com.zhangy.skyeye.publics.consts.FileStoreTypeEnum;
|
||||
import com.zhangy.skyeye.publics.consts.FileTypeEnum;
|
||||
@ -49,7 +50,7 @@ public class JmImageServiceImpl implements JmImageService {
|
||||
private IPyImageService detectService;
|
||||
|
||||
@Autowired
|
||||
private JmJobPayloadService jobPayloadService;
|
||||
private JmJobPayloadMapper jobPayloadMapper;
|
||||
|
||||
@Autowired
|
||||
private ISysFileService fileService;
|
||||
@ -223,7 +224,7 @@ public class JmImageServiceImpl implements JmImageService {
|
||||
jobExecId = jobExecDTO.getExecId();
|
||||
fileType = FileTypeEnum.SAR_IMAGE_HIGH;
|
||||
srcFileType = FileTypeEnum.SAR_IMAGE_HIGH_SRC;
|
||||
JmJobPayload sar = jobPayloadService.selectSar(jobId, uavId);
|
||||
JmJobPayload sar = jobPayloadMapper.selectSar(jobId, uavId);
|
||||
if (sar == null) {
|
||||
throw ServiceException.noLog("找不到该任务的SAR载荷");
|
||||
}
|
||||
|
||||
@ -2,9 +2,7 @@ package com.zhangy.skyeye.jm.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.zhangy.skyeye.common.extend.exception.ServiceException;
|
||||
import com.zhangy.skyeye.common.extend.util.FileUtil;
|
||||
import com.zhangy.skyeye.common.extend.util.ObjectUtil;
|
||||
import com.zhangy.skyeye.device.service.IPayloadService;
|
||||
import com.zhangy.skyeye.jm.dto.JmJobDTO;
|
||||
import com.zhangy.skyeye.jm.dto.JmJobQueryDTO;
|
||||
import com.zhangy.skyeye.jm.entity.JmAirlineExec;
|
||||
@ -13,10 +11,11 @@ import com.zhangy.skyeye.jm.entity.JmJobPoint;
|
||||
import com.zhangy.skyeye.jm.entity.JmJobUav;
|
||||
import com.zhangy.skyeye.jm.event.JmJobStatusInitEvent;
|
||||
import com.zhangy.skyeye.jm.mapper.JmJobExecMapper;
|
||||
import com.zhangy.skyeye.jm.service.*;
|
||||
import com.zhangy.skyeye.jm.service.JmAirlineExecService;
|
||||
import com.zhangy.skyeye.jm.service.JmJobExecService;
|
||||
import com.zhangy.skyeye.jm.service.JmJobPointService;
|
||||
import com.zhangy.skyeye.jm.service.JmJobUavService;
|
||||
import com.zhangy.skyeye.publics.consts.ExecStatusEnum;
|
||||
import com.zhangy.skyeye.publics.consts.FileTypeEnum;
|
||||
import com.zhangy.skyeye.publics.service.SysFileTypeService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
@ -32,8 +31,6 @@ import java.util.stream.Collectors;
|
||||
@Service
|
||||
public class JmJobExecServiceImpl implements JmJobExecService {
|
||||
|
||||
@Autowired
|
||||
private JmJobStatusService jobStatusService;
|
||||
@Autowired
|
||||
private JmJobExecMapper jobExecMapper;
|
||||
@Autowired
|
||||
@ -42,16 +39,9 @@ public class JmJobExecServiceImpl implements JmJobExecService {
|
||||
private JmJobPointService jobPointService;
|
||||
@Autowired
|
||||
private JmJobUavService jobUavService;
|
||||
|
||||
@Autowired
|
||||
private IPayloadService payloadService;
|
||||
|
||||
@Autowired
|
||||
private ApplicationEventPublisher eventPublisher;
|
||||
|
||||
@Autowired
|
||||
private SysFileTypeService fileTypeService;
|
||||
|
||||
@Override
|
||||
public void initExecutingJobs() {
|
||||
List<JmJobDTO> executingJobs = this.selectWorking();
|
||||
@ -183,7 +173,6 @@ public class JmJobExecServiceImpl implements JmJobExecService {
|
||||
@Transactional
|
||||
@Override
|
||||
public void deleteByJobConf(Long... jobConfId) {
|
||||
Long[] jobExecIds = jobExecMapper.selectByConf(jobConfId).stream().map(e -> e.getId()).toArray(Long[]::new);
|
||||
jmAirlineExecService.deleteByJob(jobConfId);
|
||||
jobExecMapper.deleteByConf(jobConfId);
|
||||
}
|
||||
|
||||
@ -38,9 +38,9 @@ public class JmJobPayloadServiceImpl implements JmJobPayloadService {
|
||||
if (ObjectUtil.isEmpty(jobExecList)) {
|
||||
return list;
|
||||
}
|
||||
Long[] jobExecIds = jobExecList.stream().map(j -> j.getExecId()).distinct().toArray(Long[]::new);
|
||||
Long[] jobExecIds = jobExecList.stream().map(JmJobDTO::getExecId).distinct().toArray(Long[]::new);
|
||||
// jobExecList 按照时间倒序排列,若有一个任务配置对应多个任务执行时,取第一个元素为最新的执行数据
|
||||
Map<Long, Long> jobConfExecIdMap = jobExecList.stream().collect(Collectors.toMap(j -> j.getConfId(), j -> j.getExecId(), (a, b) -> a));
|
||||
Map<Long, Long> jobConfExecIdMap = jobExecList.stream().collect(Collectors.toMap(JmJobDTO::getConfId, JmJobDTO::getExecId, (a, b) -> a));
|
||||
// 图片jobId不应该用confId
|
||||
Map<Long, Map<Long, List<JmImage>>> imageGroup = sarImageService.selectByJob(FileTypeEnum.SAR_IMAGE_LOW, jobExecIds)
|
||||
.stream()
|
||||
@ -86,15 +86,16 @@ public class JmJobPayloadServiceImpl implements JmJobPayloadService {
|
||||
|
||||
@Override
|
||||
public List<JmJobPayload> selectByUav(Long jobId, Long uavId) {
|
||||
Map<Long, List<JmImage>> imageGroup = sarImageService.selectByUav(FileTypeEnum.SAR_IMAGE_LOW, jobId, uavId)
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(JmImage::getPayloadId));
|
||||
List<JmJobPayload> list = jobPayloadMapper.selectByUav(jobId, uavId);
|
||||
list.forEach(e -> {
|
||||
Long payloadId = e.getPayloadId();
|
||||
e.setImageList(imageGroup.containsKey(payloadId) ? imageGroup.get(payloadId) : Collections.EMPTY_LIST);
|
||||
});
|
||||
return list;
|
||||
// 没用到
|
||||
// Map<Long, List<JmImage>> imageGroup = sarImageService.selectByUav(FileTypeEnum.SAR_IMAGE_LOW, jobId, uavId)
|
||||
// .stream()
|
||||
// .collect(Collectors.groupingBy(JmImage::getPayloadId));
|
||||
// List<JmJobPayload> list = jobPayloadMapper.selectByUav(jobId, uavId);
|
||||
// list.forEach(e -> {
|
||||
// Long payloadId = e.getPayloadId();
|
||||
// e.setImageList(imageGroup.containsKey(payloadId) ? imageGroup.get(payloadId) : Collections.EMPTY_LIST);
|
||||
// });
|
||||
return jobPayloadMapper.selectByUav(jobId, uavId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
package com.zhangy.skyeye.sar.context;
|
||||
|
||||
import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO;
|
||||
import com.zhangy.skyeye.jm.dto.JmUavStatusDTO;
|
||||
|
||||
/**
|
||||
* @PROJECT_NAME: skyeyesystem
|
||||
* @DESCRIPTION: SAR 回传相关任务上下文提供者 用于打破 SarBackWsServiceImpl 对 JmJobStatusService 的直接依赖
|
||||
* @AUTHOR: GuanCheng Long
|
||||
* @DATE: 2026/1/21 1:10
|
||||
*/
|
||||
public interface SarTaskContextProvider {
|
||||
|
||||
/**
|
||||
* 根据载荷 IP 获取当前无人机状态
|
||||
*/
|
||||
JmUavStatusDTO getCurrentUav(String payloadIp);
|
||||
|
||||
/**
|
||||
* 根据载荷 IP 获取当前航线状态
|
||||
*/
|
||||
JmAirlineStatusDTO getCurrentAirline(String payloadIp);
|
||||
|
||||
/**
|
||||
* 获取当前任务执行 ID
|
||||
*/
|
||||
Long getCurrentJobExecId(String payloadIp);
|
||||
|
||||
/**
|
||||
* 获取当前任务配置 ID
|
||||
*/
|
||||
Long getCurrentJobId(String payloadIp);
|
||||
}
|
||||
|
||||
@ -0,0 +1,104 @@
|
||||
package com.zhangy.skyeye.sar.context;
|
||||
|
||||
import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO;
|
||||
import com.zhangy.skyeye.jm.dto.JmUavStatusDTO;
|
||||
import com.zhangy.skyeye.redis.utils.RedisUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @PROJECT_NAME: skyeyesystem
|
||||
* @DESCRIPTION: SAR 任务上下文提供者实现(基于 Redis 缓存,避免循环依赖)
|
||||
* - JmJobStatusServiceImpl 在更新状态时,主动把 JmUavStatusDTO 推送到 Redis
|
||||
* - 此类只从 Redis 读取,不注入 JmJobStatusService
|
||||
* @AUTHOR: GuanCheng Long
|
||||
* @DATE: 2026/1/21 1:10
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class SarTaskContextProviderImpl implements SarTaskContextProvider {
|
||||
|
||||
@Autowired
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
// Redis 键前缀
|
||||
private static final String UAV_STATUS_KEY_PREFIX = "sar:context:uav:";
|
||||
|
||||
// 缓存过期时间(秒)
|
||||
private static final long CACHE_EXPIRE_SECONDS = 600; // 10 分钟
|
||||
|
||||
@Override
|
||||
public JmUavStatusDTO getCurrentUav(String payloadIp) {
|
||||
if (payloadIp == null || payloadIp.trim().isEmpty()) {
|
||||
log.warn("获取 uav 状态失败:payloadIp 为空");
|
||||
return null;
|
||||
}
|
||||
|
||||
String key = UAV_STATUS_KEY_PREFIX + payloadIp;
|
||||
Object obj = redisUtil.get(key);
|
||||
|
||||
if (obj instanceof JmUavStatusDTO) {
|
||||
return (JmUavStatusDTO) obj;
|
||||
}
|
||||
|
||||
log.debug("Redis 中未找到 IP={} 的 uav 状态", payloadIp);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JmAirlineStatusDTO getCurrentAirline(String payloadIp) {
|
||||
JmUavStatusDTO uav = getCurrentUav(payloadIp);
|
||||
if (uav == null) {
|
||||
return null;
|
||||
}
|
||||
return uav.getCurrAirline();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getCurrentJobExecId(String payloadIp) {
|
||||
JmUavStatusDTO uav = getCurrentUav(payloadIp);
|
||||
return uav != null ? uav.getJobExecId() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getCurrentJobId(String payloadIp) {
|
||||
JmAirlineStatusDTO airline = getCurrentAirline(payloadIp);
|
||||
return airline != null ? airline.getJobId() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新/刷新缓存(供 JmJobStatusServiceImpl 调用)
|
||||
* 在状态更新成功后调用此方法
|
||||
*/
|
||||
public void updateUavStatus(String payloadIp, JmUavStatusDTO uavStatus) {
|
||||
if (payloadIp == null || uavStatus == null) {
|
||||
log.warn("更新 uav 状态失败:参数为空,ip={}, status={}", payloadIp, uavStatus);
|
||||
return;
|
||||
}
|
||||
|
||||
String key = UAV_STATUS_KEY_PREFIX + payloadIp;
|
||||
try {
|
||||
// 设置值 + 过期时间
|
||||
redisUtil.set(key, uavStatus, CACHE_EXPIRE_SECONDS);
|
||||
log.debug("已更新 Redis 缓存:key={}, jobExecId={}", key, uavStatus.getJobExecId());
|
||||
} catch (Exception e) {
|
||||
log.error("更新 SAR uav 状态缓存失败,ip={}", payloadIp, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理某个 IP 的缓存(任务结束或异常时调用)
|
||||
*/
|
||||
public void clearUavStatus(String payloadIp) {
|
||||
if (payloadIp == null) {
|
||||
return;
|
||||
}
|
||||
String key = UAV_STATUS_KEY_PREFIX + payloadIp;
|
||||
redisUtil.del(key);
|
||||
log.debug("SAR uav 缓存已标记清理(或自然过期):{}", key);
|
||||
}
|
||||
}
|
||||
@ -3,13 +3,11 @@ package com.zhangy.skyeye.sar.service.impl;
|
||||
import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO;
|
||||
import com.zhangy.skyeye.jm.dto.JmUavStatusDTO;
|
||||
import com.zhangy.skyeye.jm.entity.JmImage;
|
||||
import com.zhangy.skyeye.jm.service.JmJobStatusService;
|
||||
import com.zhangy.skyeye.publics.consts.WebSocketKey;
|
||||
import com.zhangy.skyeye.publics.service.SysFileTypeService;
|
||||
import com.zhangy.skyeye.sar.context.SarTaskContextProvider;
|
||||
import com.zhangy.skyeye.sar.dto.JmSarWaveWsDTO;
|
||||
import com.zhangy.skyeye.sar.dto.SarBackWaveFrameDTO;
|
||||
import com.zhangy.skyeye.sar.service.ISarBackWsService;
|
||||
import com.zhangy.skyeye.sar.service.SarWsAsyncService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.messaging.simp.SimpMessagingTemplate;
|
||||
@ -33,13 +31,7 @@ public class SarBackWsServiceImpl implements ISarBackWsService {
|
||||
private SimpMessagingTemplate simpMessageingTemplate;
|
||||
|
||||
@Autowired
|
||||
private SysFileTypeService sysFileTypeService;
|
||||
|
||||
@Autowired
|
||||
private JmJobStatusService jobStatusService;
|
||||
|
||||
@Autowired
|
||||
private SarWsAsyncService sarWsAsyncService;
|
||||
private SarTaskContextProvider taskContextProvider;
|
||||
|
||||
@Override
|
||||
public void sendWave(String payloadIp, SarBackWaveFrameDTO frame, byte[] frameData) {
|
||||
@ -63,12 +55,14 @@ public class SarBackWsServiceImpl implements ISarBackWsService {
|
||||
* @return
|
||||
*/
|
||||
private JmSarWaveWsDTO loadJobDetail(String payloadIp, JmSarWaveWsDTO ws, byte[] frameData) {
|
||||
JmUavStatusDTO uav = jobStatusService.getCurrUav(payloadIp);
|
||||
JmUavStatusDTO uav = taskContextProvider.getCurrentUav(payloadIp);
|
||||
if (uav == null) { // 如果没有执行中的任务则忽略
|
||||
log.debug("IP={} 无正在执行的任务,忽略波形推送", payloadIp);
|
||||
return null;
|
||||
}
|
||||
JmAirlineStatusDTO airlineStatusVo = uav.getCurrAirline();
|
||||
if (airlineStatusVo == null) {
|
||||
log.debug("IP={} 无当前航线,忽略波形推送", payloadIp);
|
||||
return null;
|
||||
}
|
||||
long jobConfId = airlineStatusVo.getJobId();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user