add,计划采集13:

优化逻辑
This commit is contained in:
tangchao0503
2026-06-16 15:31:06 +08:00
parent d9f1ed922b
commit fc3853c3ca
15 changed files with 626 additions and 223 deletions

View File

@ -50,12 +50,16 @@ TreeNode* TreeNode::parentNode()
TaskTreeModel::TaskTreeModel(QObject* parent)
: QAbstractItemModel(parent)
, m_rootNode(new TreeNode())
, m_countdownTimer(new QTimer(this))
{
m_rootNode->nodeType = TreeNodeType::Root;
m_countdownTimer->setInterval(1000);
connect(m_countdownTimer, &QTimer::timeout, this, &TaskTreeModel::onCountdownTimerTimeout);
}
TaskTreeModel::~TaskTreeModel()
{
m_countdownTimer->stop();
delete m_rootNode;
}
@ -123,6 +127,18 @@ QVariant TaskTreeModel::data(const QModelIndex& index, int role) const
return QString::fromLocal8Bit("定时任务 %1").arg(task.id);
case ColScheduledTime:
return task.scheduledTime.toString("yyyy-MM-dd HH:mm:ss");
case ColCountdown: {
if (task.status == TaskStatus::Finished || task.status == TaskStatus::Running)
{
return QString::fromLocal8Bit("0");
}
qint64 seconds = QDateTime::currentDateTime().secsTo(task.scheduledTime);
if (seconds < 0)
{
return QString::fromLocal8Bit("已超时");
}
return formatCountdown(seconds);
}
case ColStartTime:
return task.startTime.isValid() ?
task.startTime.toString("HH:mm:ss") : "-";
@ -131,6 +147,8 @@ QVariant TaskTreeModel::data(const QModelIndex& index, int role) const
task.endTime.toString("HH:mm:ss") : "-";
case ColDuration:
return formatDuration(task.durationMinutes);
case ColEstimatedDuration:
return formatDuration(task.estimatedDurationMinutes);
case ColStatus:
return statusToString(task.status);
case ColProgress: {
@ -151,6 +169,8 @@ QVariant TaskTreeModel::data(const QModelIndex& index, int role) const
return subTaskTypeToString(subTask.type);
case ColScheduledTime:
return "-";
case ColCountdown:
return "-";
case ColStartTime:
return subTask.startTime.isValid() ?
subTask.startTime.toString("HH:mm:ss") : "-";
@ -159,6 +179,8 @@ QVariant TaskTreeModel::data(const QModelIndex& index, int role) const
subTask.endTime.toString("HH:mm:ss") : "-";
case ColDuration:
return formatDuration(subTask.durationMinutes);
case ColEstimatedDuration:
return formatDuration(subTask.estimatedDurationMinutes);
case ColStatus:
return statusToString(subTask.status);
case ColProgress:
@ -265,9 +287,11 @@ QVariant TaskTreeModel::headerData(int section, Qt::Orientation orientation, int
switch (section) {
case ColName: return QString::fromLocal8Bit("名称");
case ColScheduledTime: return QString::fromLocal8Bit("计划时间");
case ColCountdown: return QString::fromLocal8Bit("倒计时");
case ColStartTime: return QString::fromLocal8Bit("开始时间");
case ColEndTime: return QString::fromLocal8Bit("结束时间");
case ColDuration: return QString::fromLocal8Bit("耗时");
case ColEstimatedDuration: return QString::fromLocal8Bit("预测耗时");
case ColStatus: return QString::fromLocal8Bit("状态");
case ColProgress: return QString::fromLocal8Bit("进度");
case ColPath: return QString::fromLocal8Bit("路径");
@ -285,6 +309,8 @@ Qt::ItemFlags TaskTreeModel::flags(const QModelIndex& index) const
void TaskTreeModel::setTasks(const QVector<TimedTask>& tasks)
{
m_countdownTimer->stop();
beginResetModel();
m_tasks = tasks;
@ -292,6 +318,8 @@ void TaskTreeModel::setTasks(const QVector<TimedTask>& tasks)
setupModelData();
endResetModel();
m_countdownTimer->start();
}
void TaskTreeModel::setupModelData()
@ -400,6 +428,19 @@ void TaskTreeModel::updateSubTask(int taskId, int subTaskIndex, const SubTask& s
emit subTaskUpdated(taskId, subTaskIndex);
}
void TaskTreeModel::setTaskAndSubtaskStatus(int taskId, TaskStatus status)
{
int dataIndex = findTaskDataIndex(taskId);
if (dataIndex < 0) return;
updateTaskStatus(taskId, status);
for (size_t i = 0; i < m_tasks[dataIndex].subTaskCount(); i++)
{
updateSubTaskStatus(taskId, i, status);
}
}
void TaskTreeModel::updateTaskStatus(int taskId, TaskStatus status)
{
int dataIndex = findTaskDataIndex(taskId);
@ -407,17 +448,6 @@ void TaskTreeModel::updateTaskStatus(int taskId, TaskStatus status)
m_tasks[dataIndex].status = status;
if (status == TaskStatus::Running) {
m_tasks[dataIndex].startTime = QDateTime::currentDateTime();
}
else if (status == TaskStatus::Finished) {
m_tasks[dataIndex].endTime = QDateTime::currentDateTime();
if (m_tasks[dataIndex].startTime.isValid()) {
m_tasks[dataIndex].durationMinutes =
m_tasks[dataIndex].startTime.secsTo(m_tasks[dataIndex].endTime) / 60.0;
}
}
QModelIndex taskIndex = getTaskIndex(taskId);
if (taskIndex.isValid()) {
QModelIndex topLeft = index(taskIndex.row(), 0, taskIndex.parent());
@ -426,6 +456,12 @@ void TaskTreeModel::updateTaskStatus(int taskId, TaskStatus status)
}
}
void TaskTreeModel::updateSubTaskStatusAndProgress(int taskId, int subTaskIndex, TaskStatus status)
{
updateSubTaskStatus(taskId, subTaskIndex, status);
updateProgress(taskId);
}
void TaskTreeModel::updateSubTaskStatus(int taskId, int subTaskIndex, TaskStatus status)
{
int dataIndex = findTaskDataIndex(taskId);
@ -435,23 +471,16 @@ void TaskTreeModel::updateSubTaskStatus(int taskId, int subTaskIndex, TaskStatus
SubTask& subTask = m_tasks[dataIndex].subTasks[subTaskIndex];
subTask.status = status;
if (status == TaskStatus::Running) {
subTask.startTime = QDateTime::currentDateTime();
}
else if (status == TaskStatus::Finished) {
subTask.endTime = QDateTime::currentDateTime();
if (subTask.startTime.isValid()) {
subTask.durationMinutes = subTask.startTime.secsTo(subTask.endTime) / 60.0;
}
}
QModelIndex subTaskModelIndex = getSubTaskIndex(taskId, subTaskIndex);
if (subTaskModelIndex.isValid()) {
QModelIndex topLeft = index(subTaskModelIndex.row(), 0, subTaskModelIndex.parent());
QModelIndex bottomRight = index(subTaskModelIndex.row(), ColumnCount - 1, subTaskModelIndex.parent());
emit dataChanged(topLeft, bottomRight);
}
}
void TaskTreeModel::updateProgress(int taskId)
{
// 更新父任务进度
QModelIndex taskIndex = getTaskIndex(taskId);
if (taskIndex.isValid()) {
@ -534,12 +563,14 @@ int TaskTreeModel::findTaskDataIndex(int taskId) const
QString TaskTreeModel::statusToString(TaskStatus status) const
{
switch (status) {
case TaskStatus::default: return QString::fromLocal8Bit("未调度");
case TaskStatus::Waiting: return QString::fromLocal8Bit("等待中");
case TaskStatus::Running: return QString::fromLocal8Bit("运行中");
case TaskStatus::Finished: return QString::fromLocal8Bit("已完成");
case TaskStatus::Skiped: return QString::fromLocal8Bit("已跳过");
case TaskStatus::Timeout: return QString::fromLocal8Bit("超时");
}
return "未知";
return "";
}
QString TaskTreeModel::subTaskTypeToString(SubTaskType type) const
@ -582,3 +613,33 @@ QColor TaskTreeModel::statusColor(TaskStatus status) const
}
return QColor(255, 255, 255);
}
QString TaskTreeModel::formatCountdown(qint64 seconds) const
{
if (seconds < 0) {
return QString::fromLocal8Bit("已超时");
}
int hours = static_cast<int>(seconds) / 3600;
int mins = (static_cast<int>(seconds) % 3600) / 60;
int secs = static_cast<int>(seconds) % 60;
return QString("%1:%2:%3")
.arg(hours, 2, 10, QChar('0'))
.arg(mins, 2, 10, QChar('0'))
.arg(secs, 2, 10, QChar('0'));
}
void TaskTreeModel::onCountdownTimerTimeout()
{
for (int i = 0; i < m_tasks.size(); ++i)
{
const TimedTask& task = m_tasks[i];
QModelIndex taskIndex = getTaskIndex(task.id);
if (taskIndex.isValid())
{
QModelIndex countdownIndex = index(taskIndex.row(), ColCountdown, taskIndex.parent());
emit dataChanged(countdownIndex, countdownIndex);
}
}
}