This commit is contained in:
mmc
2026-05-25 11:48:50 +08:00
parent 94fb3d3d4f
commit a23f7e19aa

View File

@@ -17,7 +17,7 @@ import {
LayoutGrid, Clock, CheckCircle2, AlertCircle, Zap, Waves,
Calendar, User, TrendingUp, Maximize2, Play, Square, X, MapPin, RotateCw
} from 'lucide-react';
import { getsinglePlan, getsinglePlanTrack, updateFlightTaskStatus, postFlightCommmand, getWayLine } from '@/api/device';
import { getsinglePlan, getsinglePlanTrack, updateFlightTaskStatus, postFlightCommmand, getWayLine, createWaylineTask } from '@/api/device';
import dayjs from 'dayjs';
import utils from '@/lib/utils';
import CesiumMap from '../Map';
@@ -59,13 +59,11 @@ export default function WayLinePage({ planedevices }) {
const [createTaskModal, setCreateTaskModal] = useState(false);
const [waylineUuid, setWaylineUuid] = useState('');
const [waylineList, setWaylineList] = useState([]); // 航线列表
const [beginTime, setBeginTime] = useState(null);
const [endTime, setEndTime] = useState(null);
const [taskForm, setTaskForm] = useState({
name: '',
sn: '',
landing_dock_sn: '',
rth_altitude: 0,
rth_altitude: 100,
rth_mode: 'optimal',
wayline_precision_type: 'gps',
resumable_status: 'auto',
@@ -74,12 +72,15 @@ export default function WayLinePage({ planedevices }) {
repeat_type: 'nonrepeating',
repeat_option: { interval: 1 },
time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,
begin_at: null,
end_at: null,
recurring_task_start_time_list: [],
});
const fetchWaylineList = async () => {
try {
const res = await getWayLine();
if (res?.code == 0) {
if (res?.code == 200 || res?.code == 0) {
const _list = res?.data?.list.map(item => {
return {
...item,
@@ -103,7 +104,7 @@ export default function WayLinePage({ planedevices }) {
name: '',
sn: listDrone?.gateway_sn || '',
landing_dock_sn: '',
rth_altitude: 0,
rth_altitude: 100,
rth_mode: 'optimal',
wayline_precision_type: 'gps',
resumable_status: 'auto',
@@ -112,9 +113,10 @@ export default function WayLinePage({ planedevices }) {
repeat_type: 'nonrepeating',
repeat_option: { interval: 1 },
time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,
begin_at: null,
end_at: null,
recurring_task_start_time_list: [],
});
setBeginTime(null);
setEndTime(null);
};
// 创建任务提交
@@ -125,12 +127,25 @@ export default function WayLinePage({ planedevices }) {
}
setLoading(true);
try {
// 这里替换成你的创建任务接口
utils.message.success('创建任务成功');
resetModals();
getListTask(); // 刷新列表
const payload = {
...taskForm,
wayline_uuid: waylineUuid,
// 如果是立即任务,begin_at 为 null 或当前时间戳
begin_at: taskForm.task_type === 'immediate' ? null : (taskForm.begin_at ? dayjs(taskForm.begin_at).unix() : null),
end_at: taskForm.end_at ? dayjs(taskForm.end_at).unix() : null,
recurring_task_start_time_list: taskForm.recurring_task_start_time_list.map(t => dayjs(t).unix()),
};
const res: any = await createWaylineTask(payload);
if (res.code === 200 || res.code === 0) {
utils.message.success('创建任务成功');
resetModals();
getListTask(); // 刷新列表
} else {
utils.message.error(res.msg || '创建失败');
}
} catch (err) {
utils.message.error('创建失败');
utils.message.error('创建异常');
} finally {
setLoading(false);
}
@@ -1001,12 +1016,85 @@ export default function WayLinePage({ planedevices }) {
onChange={(val) => setTaskForm({ ...taskForm, task_type: val })}
options={[
{ label: '立即任务', value: 'immediate' },
{ label: '单次定时任务', value: 'timed' },
{ label: '重复任务', value: 'recurring' },
{ label: '连续任务', value: 'continuous' },
]}
style={{ width: '100%' }}
/>
</div>
</div>
{/* 根据任务类型显示不同字段 */}
{(taskForm.task_type === 'timed' || taskForm.task_type === 'recurring' || taskForm.task_type === 'continuous') && (
<div className="grid grid-cols-2 gap-4">
<div>
<label className="text-sm block mb-1 text-black">开始时间 <span className="text-red-500">*</span></label>
<DatePicker
showTime
placeholder="开始时间"
style={{ width: '100%' }}
value={taskForm.begin_at ? dayjs(taskForm.begin_at) : null}
onChange={(val) => setTaskForm({ ...taskForm, begin_at: val })}
/>
</div>
{(taskForm.task_type === 'recurring' || taskForm.task_type === 'continuous') && (
<div>
<label className="text-sm block mb-1 text-black">结束时间 <span className="text-red-500">*</span></label>
<DatePicker
showTime
placeholder="结束时间"
style={{ width: '100%' }}
value={taskForm.end_at ? dayjs(taskForm.end_at) : null}
onChange={(val) => setTaskForm({ ...taskForm, end_at: val })}
/>
</div>
)}
</div>
)}
{taskForm.task_type === 'recurring' && (
<>
<div className="grid grid-cols-2 gap-4">
<div>
<label className="text-sm block mb-1 text-black">重复模式 <span className="text-red-500">*</span></label>
<Select
value={taskForm.repeat_type}
onChange={(val) => setTaskForm({ ...taskForm, repeat_type: val })}
options={[
{ label: '不重复', value: 'nonrepeating' },
{ label: '每天', value: 'daily' },
{ label: '每周', value: 'weekly' },
{ label: '每月(按日期)', value: 'absolute_monthly' },
{ label: '每月(按星期)', value: 'relative_monthly' },
]}
style={{ width: '100%' }}
/>
</div>
<div>
<label className="text-sm block mb-1 text-black">重复间隔(天/周/月) <span className="text-red-500">*</span></label>
<InputNumber
min={1}
value={taskForm.repeat_option.interval}
onChange={(val) => setTaskForm({ ...taskForm, repeat_option: { ...taskForm.repeat_option, interval: val || 1 } })}
style={{ width: '100%' }}
/>
</div>
</div>
<div>
<label className="text-sm block mb-1 text-black">执行时间点列表</label>
<Select
mode="tags"
placeholder="输入秒级时间戳或选择时间 (多选)"
style={{ width: '100%' }}
value={taskForm.recurring_task_start_time_list}
onChange={(val) => setTaskForm({ ...taskForm, recurring_task_start_time_list: val })}
/>
<Text type="secondary" style={{ fontSize: 11 }}>注:重复任务需指定具体执行的时间点列表。</Text>
</div>
</>
)}
<div className="text-xs text-slate-400 mt-2">
<div>绑定无人机:{listDrone?.drone_callsign || '-'}({listDrone?.gateway_sn || '-'})</div>
</div>