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.
253 lines
6.2 KiB
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();
|
|
}
|
|
}
|
|
|