You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Drone_project/Src/pages/taskdata.cpp

253 lines
6.2 KiB

#include "taskdata.h"
#include <QDebug>
/**
* 任务数据模型实现
* 负责管理单个任务的所有状态信息和操作
*/
TaskData::TaskData(const QString& id, const QString& droneId, TaskType type, QObject* parent)
: QObject(parent)
, id_(id)
, droneId_(droneId)
, type_(type)
, status_(TaskStatus::Pending)
, createdTime_(QDateTime::currentDateTime())
{
}
void TaskData::setStatus(TaskStatus status) {
if (status_ != status) {
status_ = status;
emit statusChanged(status_);
}
}
void TaskData::setDescription(const QString& description) {
description_ = description;
}
void TaskData::setStartPosition(const QVector3D& pos) {
startPosition_ = pos;
}
void TaskData::setEndPosition(const QVector3D& pos) {
endPosition_ = pos;
}
void TaskData::addWaypoint(const QVector3D& waypoint) {
waypoints_.append(waypoint);
}
void TaskData::setWaypoints(const QVector<QVector3D>& waypoints) {
waypoints_ = waypoints;
}
void TaskData::startTask() {
if (status_ == TaskStatus::Pending) {
setStatus(TaskStatus::InProgress);
startTime_ = QDateTime::currentDateTime();
emit taskStarted();
}
}
void TaskData::completeTask() {
if (status_ == TaskStatus::InProgress) {
setStatus(TaskStatus::Completed);
endTime_ = QDateTime::currentDateTime();
emit taskCompleted();
}
}
void TaskData::cancelTask() {
if (status_ == TaskStatus::Pending || status_ == TaskStatus::InProgress) {
setStatus(TaskStatus::Cancelled);
endTime_ = QDateTime::currentDateTime();
emit taskCancelled();
}
}
void TaskData::failTask(const QString& reason) {
if (status_ == TaskStatus::InProgress) {
failureReason_ = reason;
setStatus(TaskStatus::Failed);
endTime_ = QDateTime::currentDateTime();
emit taskFailed(reason);
}
}
void TaskData::recallTask() {
if (status_ == TaskStatus::InProgress) {
setStatus(TaskStatus::Recalled);
endTime_ = QDateTime::currentDateTime();
emit taskRecalled();
}
}
int TaskData::getDuration() const {
if (startTime_.isValid() && endTime_.isValid()) {
return startTime_.secsTo(endTime_);
} else if (startTime_.isValid()) {
return startTime_.secsTo(QDateTime::currentDateTime());
}
return 0;
}
QString TaskData::getStatusString() const {
switch (status_) {
case TaskStatus::Pending: return "待执行";
case TaskStatus::InProgress: return "执行中";
case TaskStatus::Completed: return "执行成功";
case TaskStatus::Cancelled: return "任务取消";
case TaskStatus::Failed: return "执行失败";
case TaskStatus::Recalled: return "已召回";
default: return "未知状态";
}
}
QString TaskData::getTypeString() const {
switch (type_) {
case TaskType::Patrol: return "巡逻任务";
case TaskType::Inspection: return "巡检任务";
case TaskType::Delivery: return "配送任务";
case TaskType::Search: return "搜索任务";
case TaskType::Emergency: return "紧急任务";
default: return "未知类型";
}
}
/**
* 任务管理器实现
* 负责管理多个任务的生命周期和状态
*/
TaskManager::TaskManager(QObject* parent)
: QObject(parent)
{
}
TaskManager::~TaskManager() {
qDeleteAll(tasks_);
}
TaskData* TaskManager::createTask(const QString& droneId, TaskType type, const QString& description) {
QString taskId = QString("TASK_%1_%2").arg(droneId).arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));
auto* task = new TaskData(taskId, droneId, type, this);
task->setDescription(description);
tasks_.append(task);
// 连接信号
connect(task, &TaskData::statusChanged, this, [this, taskId](TaskStatus status) {
emit taskStatusChanged(taskId, status);
});
emit taskCreated(taskId);
return task;
}
void TaskManager::removeTask(const QString& taskId) {
for (int i = 0; i < tasks_.size(); ++i) {
if (tasks_[i]->getId() == taskId) {
tasks_[i]->deleteLater();
tasks_.removeAt(i);
emit taskRemoved(taskId);
break;
}
}
}
TaskData* TaskManager::getTask(const QString& taskId) const {
for (auto* task : tasks_) {
if (task->getId() == taskId) {
return task;
}
}
return nullptr;
}
QVector<TaskData*> TaskManager::getAllTasks() const {
return tasks_;
}
QVector<TaskData*> TaskManager::getTasksByDrone(const QString& droneId) const {
QVector<TaskData*> result;
for (auto* task : tasks_) {
if (task->getDroneId() == droneId) {
result.append(task);
}
}
return result;
}
QVector<TaskData*> TaskManager::getTasksByStatus(TaskStatus status) const {
QVector<TaskData*> result;
for (auto* task : tasks_) {
if (task->getStatus() == status) {
result.append(task);
}
}
return result;
}
int TaskManager::getTaskCount() const {
return tasks_.size();
}
int TaskManager::getTaskCountByStatus(TaskStatus status) const {
int count = 0;
for (auto* task : tasks_) {
if (task->getStatus() == status) {
count++;
}
}
return count;
}
int TaskManager::getTaskCountByDrone(const QString& droneId) const {
int count = 0;
for (auto* task : tasks_) {
if (task->getDroneId() == droneId) {
count++;
}
}
return count;
}
void TaskManager::startTask(const QString& taskId) {
auto* task = getTask(taskId);
if (task) {
task->startTask();
}
}
void TaskManager::completeTask(const QString& taskId) {
auto* task = getTask(taskId);
if (task) {
task->completeTask();
}
}
void TaskManager::cancelTask(const QString& taskId) {
auto* task = getTask(taskId);
if (task) {
task->cancelTask();
}
}
void TaskManager::failTask(const QString& taskId, const QString& reason) {
auto* task = getTask(taskId);
if (task) {
task->failTask(reason);
}
}
void TaskManager::recallTask(const QString& taskId) {
auto* task = getTask(taskId);
if (task) {
task->recallTask();
}
}