This commit is contained in:
wxs 2026-02-02 11:47:15 +08:00
commit c15252b7e6
10 changed files with 79 additions and 34 deletions

View File

@ -86,6 +86,21 @@ public class JmJobController {
return jobService.save(mode, e); return jobService.save(mode, e);
} }
/**
* 预览
*/
@PostMapping("/preview")
public Object preview(@Valid @RequestBody JmJobDTO e) {
JmJobModeEnum mode = EnumUtil.parseEx(JmJobModeEnum.class, e.getMode());
clearId(e);
// 默认执行一次性任务
if (e.getType() == null) {
e.setType(1);
e.setCronExpression(null);
}
return jobService.preview(mode, e);
}
/** /**
*/ */
@PostMapping("/update") @PostMapping("/update")
@ -121,8 +136,8 @@ public class JmJobController {
JmJobDTO job = jobService.selectDetail(id); JmJobDTO job = jobService.selectDetail(id);
if (job == null) { if (job == null) {
throw ServiceException.noLog("找不到任务id=" + id); throw ServiceException.noLog("找不到任务id=" + id);
} else if (EnumUtil.parseEx(ExecStatusEnum.class, job.getStatus()) != ExecStatusEnum.NOT) { } else if (EnumUtil.parseEx(ExecStatusEnum.class, job.getStatus()) == ExecStatusEnum.PROCESSING) {
throw ServiceException.noLog("任务状态不是未执行,无法起飞"); throw ServiceException.noLog("任务状态为执行中,无法起飞");
} }
jobService.start(job); jobService.start(job);
return "开始执行"; return "开始执行";

View File

@ -44,6 +44,11 @@ public interface JmJobService {
*/ */
JmJob save(JmJobModeEnum mode, JmJobDTO e); JmJob save(JmJobModeEnum mode, JmJobDTO e);
/**
* 预览
*/
JmJobDTO preview(JmJobModeEnum mode, JmJobDTO e);
/** /**
* 修改不为空的字段 * 修改不为空的字段
*/ */

View File

@ -158,6 +158,18 @@ public class JmJobServiceImpl implements JmJobService {
return insert(e); return insert(e);
} }
@Override
public JmJobDTO preview(JmJobModeEnum jobMode, JmJobDTO e) {
log.info("预览任务参数:{}||{}", JSON.toJSONString(jobMode), JSON.toJSONString(e));
SarImageModeEnum imageMode = EnumUtil.parseEx(SarImageModeEnum.class, e.getImageMode());
// 非航线模式需要调算法生成航线需要从缓存取sar坐标
Map<Long, List<JmAirline>> airlineGroup = jmAirlinePlanService.plan(jobMode, imageMode, e.getTargetType(),
e.getUavList(), e.getPointList());
// 校验并加载数据
checkAndSetUav(e.getUavList(), airlineGroup);
return e;
}
@Override @Override
public void updateNotNull(JmJob e) { public void updateNotNull(JmJob e) {
jobMapper.updateNotNull(e); jobMapper.updateNotNull(e);

View File

@ -283,17 +283,23 @@ public class JmJobStatusServiceImpl implements JmJobStatusService {
return; return;
} }
endAirline(jobId, jobVo, uavVo, airlineVo, wsVo, nextAirline == null); endAirline(jobId, jobVo, uavVo, airlineVo, wsVo, nextAirline == null);
} else if (isBoot == 1 && aStatus == ExecStatusEnum.PROCESSING && overButSending) { } else if (isBoot == 1 && aStatus == ExecStatusEnum.PROCESSING) {
// 前一航线的图片没传完就开始了新航线 if (overButSending) {
endAirline(jobId, jobVo, uavVo, airlineVo, wsVo, nextAirline == null); // 前一航线的图片没传完就开始了新航线
if (nextAirline != null) { endAirline(jobId, jobVo, uavVo, airlineVo, wsVo, nextAirline == null);
startAirline(nextAirline, wsVo); if (nextAirline != null) {
startAirline(nextAirline, wsVo);
}
} }
// simpMessageingTemplate.convertAndSend(WebSocketKey.JM_JOB_STATUS, wsVo);
simpMessageingTemplate.convertAndSend(WebSocketKey.JM_JOB_STATUS, curr);
} else { } else {
return; return;
} }
// 4.将更新后的状态推送到前端 // 4.将更新后的状态推送到前端
simpMessageingTemplate.convertAndSend(WebSocketKey.JM_JOB_STATUS, wsVo); // simpMessageingTemplate.convertAndSend(WebSocketKey.JM_JOB_STATUS, wsVo);
} }
// 开启新航线 // 开启新航线

View File

@ -83,30 +83,30 @@ public class CacheKey {
/** /**
* 运动规划响应1秒 * 运动规划响应1秒
*/ */
public static final String SMP_WAYPOINT_RES = "skyeye:smp:waypoint:"; //public static final String SMP_WAYPOINT_RES = "skyeye:smp:waypoint:";
/** /**
* 飞行控制响应1秒 * 飞行控制响应1秒
*/ */
public static final String SMP_FLIGHT_RES = "skyeye:smp:flight:"; //public static final String SMP_FLIGHT_RES = "skyeye:smp:flight:";
/** /**
* 云台控制响应1秒 * 云台控制响应1秒
*/ */
public static final String SMP_GIMBALMGR_RES = "skyeye:smp:gimbalmgr:"; //public static final String SMP_GIMBALMGR_RES = "skyeye:smp:gimbalmgr:";
/** /**
* 数据订阅响应1秒 * 数据订阅响应1秒
*/ */
public static final String SMP_SUBSCRIPT_RES = "skyeye:smp:subscript:"; //public static final String SMP_SUBSCRIPT_RES = "skyeye:smp:subscript:";
/** /**
* 数据订阅回传数据1秒 * 数据订阅回传数据1秒
*/ */
public static final String SMP_SUBSCRIPT_DATA = "skyeye:smp:subscript:"; //public static final String SMP_SUBSCRIPT_DATA = "skyeye:smp:subscript:";
/** /**
* 相机视频流响应1秒 * 相机视频流响应1秒
*/ */
public static final String SMP_VIDEO_RES = "skyeye:smp:video:"; //public static final String SMP_VIDEO_RES = "skyeye:smp:video:";
} }

View File

@ -17,7 +17,7 @@ public enum ExecStatusEnum implements CodeEnum<Integer> {
OVER(2, "已完成"), OVER(2, "已完成"),
READY(3, "就绪"), //READY(3, "就绪"),
; ;
/** 值 */ /** 值 */

View File

@ -12,8 +12,9 @@ public class SysFileTypeService {
/** 文件根路径 */ /** 文件根路径 */
private String fileRoot; private String fileRoot;
// 去掉末尾的路径分隔符 // 去掉末尾的路径分隔符
@Value("$skyeye.file-root}") @Value("${skyeye.file-root}")
public void setFileRoot(String fileRoot) { public void setFileRoot(String fileRoot) {
this.fileRoot = fileRoot.endsWith("/") || fileRoot.endsWith("\\") ? fileRoot.substring(0, fileRoot.length() - 1) : fileRoot; this.fileRoot = fileRoot.endsWith("/") || fileRoot.endsWith("\\") ? fileRoot.substring(0, fileRoot.length() - 1) : fileRoot;
} }

View File

@ -1,5 +1,6 @@
package com.zhangy.skyeye.sar.listen; package com.zhangy.skyeye.sar.listen;
import com.zhangy.skyeye.common.extend.util.JsonUtil;
import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO; import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO;
import com.zhangy.skyeye.jm.entity.JmImage; import com.zhangy.skyeye.jm.entity.JmImage;
import com.zhangy.skyeye.jm.service.JmJobStatusService; import com.zhangy.skyeye.jm.service.JmJobStatusService;
@ -47,7 +48,7 @@ public class SarImageUdpProcessor extends SarAbstractUdpProcessor<SarImagePacket
JmImage imageInfo = sarImageService.parseImage(group.getSourceIp(), group.getAirlineExecId(), frameData, imageFram); JmImage imageInfo = sarImageService.parseImage(group.getSourceIp(), group.getAirlineExecId(), frameData, imageFram);
// 推送仅当前有任务时jobId uavId 不能为空 // 推送仅当前有任务时jobId uavId 不能为空
if (imageInfo != null) { if (imageInfo != null) {
//log.info("推送图片:" + JsonUtil.toString(imageInfo)); log.info("推送图片:" + JsonUtil.toString(imageInfo));
sarBackWsService.sendImg(imageInfo); sarBackWsService.sendImg(imageInfo);
} }
} }

View File

@ -3,6 +3,7 @@ package com.zhangy.skyeye.sar.service.impl;
import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO; import com.zhangy.skyeye.jm.dto.JmAirlineStatusDTO;
import com.zhangy.skyeye.jm.dto.JmUavStatusDTO; import com.zhangy.skyeye.jm.dto.JmUavStatusDTO;
import com.zhangy.skyeye.jm.entity.JmImage; 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.consts.WebSocketKey;
import com.zhangy.skyeye.sar.context.SarTaskContextProvider; import com.zhangy.skyeye.sar.context.SarTaskContextProvider;
import com.zhangy.skyeye.sar.dto.JmSarWaveWsDTO; import com.zhangy.skyeye.sar.dto.JmSarWaveWsDTO;
@ -33,6 +34,9 @@ public class SarBackWsServiceImpl implements ISarBackWsService {
@Autowired @Autowired
private SarTaskContextProvider taskContextProvider; private SarTaskContextProvider taskContextProvider;
@Autowired
private JmJobStatusService jobStatusService;
@Override @Override
public void sendWave(String payloadIp, SarBackWaveFrameDTO frame, byte[] frameData) { public void sendWave(String payloadIp, SarBackWaveFrameDTO frame, byte[] frameData) {
JmSarWaveWsDTO wsVo = loadJobDetail(payloadIp, frame.getChannel(), frameData); JmSarWaveWsDTO wsVo = loadJobDetail(payloadIp, frame.getChannel(), frameData);
@ -55,7 +59,8 @@ public class SarBackWsServiceImpl implements ISarBackWsService {
* @return * @return
*/ */
private JmSarWaveWsDTO loadJobDetail(String payloadIp, JmSarWaveWsDTO ws, byte[] frameData) { private JmSarWaveWsDTO loadJobDetail(String payloadIp, JmSarWaveWsDTO ws, byte[] frameData) {
JmUavStatusDTO uav = taskContextProvider.getCurrentUav(payloadIp); // JmUavStatusDTO uav = taskContextProvider.getCurrentUav(payloadIp);
JmUavStatusDTO uav = jobStatusService.getCurrUav(payloadIp);
if (uav == null) { // 如果没有执行中的任务则忽略 if (uav == null) { // 如果没有执行中的任务则忽略
log.debug("IP={} 无正在执行的任务,忽略波形推送", payloadIp); log.debug("IP={} 无正在执行的任务,忽略波形推送", payloadIp);
return null; return null;

View File

@ -149,22 +149,6 @@
placeholder="请输入任务名称" placeholder="请输入任务名称"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item prop="mode" label="飞行模式">
<el-select
popper-class="form-light"
size="small"
:disabled="duringDraw || airlineCreateInfo.during"
@change="onModeChange"
v-model="form.mode"
>
<el-option
v-for="item in jobModeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item prop="uav" label="无人机"> <el-form-item prop="uav" label="无人机">
<el-select <el-select
popper-class="form-light" popper-class="form-light"
@ -194,6 +178,22 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="mode" label="飞行模式">
<el-select
popper-class="form-light"
size="small"
:disabled="duringDraw || airlineCreateInfo.during"
@change="onModeChange"
v-model="form.mode"
>
<el-option
v-for="item in jobModeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item <el-form-item
label="任务目标" label="任务目标"
v-if="form.mode === '1'" v-if="form.mode === '1'"