diff --git a/tasks/generic/task.py b/tasks/generic/task.py index fada0e5..959b62f 100644 --- a/tasks/generic/task.py +++ b/tasks/generic/task.py @@ -88,7 +88,7 @@ class GenericStepsWorker(BaseWorker): """按 steps 顺序执行。loop 步骤递归执行其 children。""" self._start_timer() self.set_action("开始执行步骤链") - self.set_progress(done=0, total=len(self.steps), unit="步骤", + self.set_progress(done=0, total=0, unit="操作", action_counts=dict(self._action_counts)) try: @@ -131,8 +131,9 @@ class GenericStepsWorker(BaseWorker): _log.warning(f"[{self.serial}] 未知步骤类型: {stype}") self._action_counts[label] = self._action_counts.get(label, 0) + 1 elapsed = self.elapsed() + # done=累计执行的操作次数(无固定总数),前端显示"已执行 N 次操作" self.set_progress(done=sum(self._action_counts.values()), - total=len(self.steps), unit="步骤", + total=0, unit="操作", action_counts=dict(self._action_counts), elapsed=elapsed) # ================== 步骤执行器 ================== diff --git a/templates/admin/monitor.html b/templates/admin/monitor.html index 7368402..8561516 100644 --- a/templates/admin/monitor.html +++ b/templates/admin/monitor.html @@ -953,10 +953,17 @@ function fmtProgress(progress, workerStatus){ const m=Math.floor(elapsed/60), s=elapsed%60; timeHtml=' '+m+'m'+s+'s'; } - // 操作计数徽章(仅显示 >0 的) - const countParts=Object.entries(counts).filter(([_,v])=>v>0).map(([k,v])=> - ''+(ACTION_LABELS[k]||esc(k))+' '+v+''); - const countsHtml=countParts.length?'
'+countParts.join('')+'
':''; + // 操作计数徽章(按数量降序,最多显示6个,超出的折叠为 +N) + const countEntries=Object.entries(counts).filter(([_,v])=>v>0).sort((a,b)=>b[1]-a[1]); + const MAX_COUNTS=6; + const shown=countEntries.slice(0,MAX_COUNTS); + const more=countEntries.length-MAX_COUNTS; + let countsHtml=''; + if(shown.length){ + countsHtml='
'+shown.map(([k,v])=> + ''+(ACTION_LABELS[k]||esc(k))+' '+v+'' + ).join('')+(more>0?' +'+more+'':'')+'
'; + } // 空闲/完成但无进度数据 → 灰显 if(done===0&&total===0&&elapsed===0&&!countParts.length){ return '-';