航线任务 今日航线计划 完成 执行中任务

This commit is contained in:
mmc
2026-05-27 11:20:44 +08:00
parent 29a0061595
commit 3f1da68ea6
2 changed files with 70 additions and 11 deletions

View File

@@ -56,7 +56,7 @@ const handleLogoutAndRedirect = () => {
});
// 只提示一次
message.error('登录已过期,请重新登录');
message?.error('登录已过期,请重新登录');
// 只跳转一次
setTimeout(() => {
@@ -84,7 +84,7 @@ api.interceptors.response.use(
// 网络异常
if (!error.response) {
message.error('网络异常,请稍后重试');
message?.error('网络异常,请稍后重试');
return Promise.reject(error);
}

View File

@@ -188,14 +188,55 @@ export default function WayLinePage({ planedevices }) {
}, [listDrone]);
// 顶部统计
const topCards = [
{ title: '今日航线计划', value: '18', unit: '条', trend: '较昨日 +2', trendColor: '#00B42A', icon: <LayoutGrid size={22} />, color: '#165DFF' },
{ title: '执行中任务', value: '6', unit: '个', desc: '进行中', icon: <Plane size={22} />, color: '#165DFF' },
{ title: '待审批任务', value: '4', unit: '个', trend: '较昨日 -1', trendColor: '#F53F3F', icon: <Calendar size={22} />, color: '#FF7D00' },
{ title: '任务完成率', value: '92', unit: '%', trend: '较昨日 +6%', trendColor: '#00B42A', icon: <CheckCircle2 size={22} />, color: '#00B42A' },
{ title: 'AI 优化收益', value: '+7.8', unit: '%', trend: '较昨日 +1.2%', trendColor: '#00B42A', icon: <TrendingUp size={22} />, color: '#722ED1' },
{ title: '覆盖装备', value: '4 类 / 9 台', unit: '', desc: '全部在线', icon: <Satellite size={22} />, color: '#165DFF' },
];
const [todayCount, setTodayCount] = useState(0);
const [yesterdayCount, setYesterdayCount] = useState(0);
const [trend, setTrend] = useState('');
const [trendColor, setTrendColor] = useState('');
// 计算今日/昨日任务数量
const calcTodayTaskCount = () => {
if (!taskList?.length) return;
const todayStart = dayjs().startOf('day').valueOf();
const todayEnd = dayjs().endOf('day').valueOf();
const yesterdayStart = dayjs().subtract(1, 'day').startOf('day').valueOf();
const yesterdayEnd = dayjs().subtract(1, 'day').endOf('day').valueOf();
const todayTotal = taskList.filter(t => {
const time = dayjs(t.begin_at).valueOf();
return time >= todayStart && time <= todayEnd;
}).length;
const yesterdayTotal = taskList.filter(t => {
const time = dayjs(t.begin_at).valueOf();
return time >= yesterdayStart && time <= yesterdayEnd;
}).length;
const diff = todayTotal - yesterdayTotal;
let trendText = '';
let color = '#00B42A';
if (diff > 0) {
trendText = `较昨日 +${diff}`;
color = '#00B42A';
} else if (diff < 0) {
trendText = `较昨日 ${diff}`;
color = '#F53F3F';
} else {
trendText = '较昨日 持平';
color = '#86909C';
}
setTodayCount(todayTotal);
setYesterdayCount(yesterdayTotal);
setTrend(trendText);
setTrendColor(color);
};
useEffect(() => {
calcTodayTaskCount();
}, [taskList]);
// 获取任务列表数据 【时间戳已改为秒级】
const getListTask = async () => {
@@ -351,6 +392,24 @@ export default function WayLinePage({ planedevices }) {
};
const { waitList, runList, finishList } = groupBoardData();
const topCards = [
{
title: '今日航线计划',
value: todayCount,
unit: '条',
trend: trend,
trendColor: trendColor,
icon: <LayoutGrid size={22} />,
color: '#165DFF'
},
{ title: '执行中任务', value: runList.length, unit: '个', desc: '进行中', icon: <Plane size={22} />, color: '#165DFF' },
{ title: '待审批任务', value: '4', unit: '个', trend: '较昨日 -1', trendColor: '#F53F3F', icon: <Calendar size={22} />, color: '#FF7D00' },
{ title: '任务完成率', value: finishList.length ? Math.round((finishList.length / taskList.length) * 100) : 0, unit: '%', trend: '较昨日 +6%', trendColor: '#00B42A', icon: <CheckCircle2 size={22} />, color: '#00B42A' },
{ title: 'AI 优化收益', value: '+7.8', unit: '%', trend: '较昨日 +1.2%', trendColor: '#00B42A', icon: <TrendingUp size={22} />, color: '#722ED1' },
{ title: '覆盖装备', value: '4 类 / 9 台', unit: '', desc: '全部在线', icon: <Satellite size={22} />, color: '#165DFF' },
];
// 指令下发逻辑
const sendFlightCommand = async (command: 'return_home' | 'return_home_cancel' | 'flighttask_pause' | 'flighttask_recovery') => {
if (!listDrone?.device_sn) {
@@ -428,7 +487,7 @@ export default function WayLinePage({ planedevices }) {
{React.cloneElement(item.icon, { size: 18 })}
</div>
<div style={{ flex: 1 }}>
<div style={{ fontSize: 10, color: '#86909C' }}>{item.title}</div>
<div style={{ fontSize: 13, color: '#86909C' }}>{item.title}</div>
<div style={{ display: 'flex', alignItems: 'baseline', gap: 4 }}>
<span style={{ fontSize: 'clamp(16px, 1vw, 20px)', fontWeight: 700, color: '#1D2129' }}>{item.value}</span>
<span style={{ fontSize: 9, color: '#4E5969' }}>{item.unit}</span>