Files
next-tjwater-drainage-frontend/features/workbench/components/agent-task-ticker-utils.ts
T

89 lines
2.5 KiB
TypeScript

import {
getRunningWorkflowDefinition,
getRunningWorkflowState
} from "../data/running-workflows";
import type {
ScheduledConditionRecord
} from "../types";
export type ConditionStepTickerItem = {
id: string;
title: string;
detail: string;
};
export type ConditionStepTickerView = {
title: string;
progressLabel: string;
progressValue: number;
currentStep: ConditionStepTickerItem | null;
};
export type TickerStackCard = {
condition: ScheduledConditionRecord;
view: ConditionStepTickerView;
stackIndex: number;
};
const TICKER_STACK_DEPTH = 3;
export function selectTickerCondition(
runningConditions: ScheduledConditionRecord[],
rotationIndex: number
): ScheduledConditionRecord | null {
if (runningConditions.length === 0) {
return null;
}
return runningConditions[rotationIndex % runningConditions.length] ?? runningConditions[0] ?? null;
}
export function createVisibleTickerCards(
runningConditions: ScheduledConditionRecord[],
rotationIndex: number,
nowMs: number
): TickerStackCard[] {
if (runningConditions.length === 0) {
return [];
}
const visibleCount = Math.min(runningConditions.length, TICKER_STACK_DEPTH);
return Array.from({ length: visibleCount }, (_, stackIndex) => {
const conditionIndex = (rotationIndex + stackIndex) % runningConditions.length;
const condition = runningConditions[conditionIndex] ?? runningConditions[0];
return {
condition,
view: createConditionStepView(condition, nowMs, runningConditions.length),
stackIndex
};
});
}
function createConditionStepView(
condition: ScheduledConditionRecord,
nowMs: number,
runningConditionCount: number
): ConditionStepTickerView {
const workflow = getRunningWorkflowDefinition(condition);
const workflowState = getRunningWorkflowState(condition, workflow, nowMs);
const currentStep = workflow.steps[workflowState.currentStepIndex];
const currentStepItem: ConditionStepTickerItem | null = currentStep
? {
id: currentStep.id,
title: `步骤 ${workflowState.currentStepIndex + 1}/${workflow.steps.length} ${currentStep.title}`,
detail: currentStep.detail
}
: null;
return {
title: runningConditionCount > 1
? `${workflow.title} · ${condition.title} · ${runningConditionCount} 个执行中`
: `${workflow.title} · ${condition.title}`,
progressLabel: `${workflowState.progress}%`,
progressValue: workflowState.progress,
currentStep: currentStepItem
};
}