add,计划采集13:
优化逻辑
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user