feat: extend supply workbench demo and map navigation

This commit is contained in:
2026-09-23 13:19:30 +08:00
parent bebcf2a06c
commit 1752b9ef84
45 changed files with 2137 additions and 449 deletions
@@ -80,4 +80,33 @@ describe("scheduled condition backend boundaries", () => {
expect(screen.getByText(/只保存在当前页面/)).toBeVisible();
expect(screen.queryByText("系统工单已提交")).not.toBeInTheDocument();
});
it("renders an event-triggered water-quality task as a workflow before opening chat", () => {
const onContinueConversation = vi.fn();
render(
<ConditionDetailPanel
condition={{
...baseCondition,
id: "peripheral-water-quality-order-1",
taskId: "water-quality-complaint",
dataSource: "mock",
sessionId: "agent-session-water-quality",
title: "水质投诉调查",
status: "running",
riskLevel: "attention",
scheduledAt: new Date().toISOString(),
durationMinutes: 15,
evidence: ["来源工单:order-1", "投诉位置:演示小区"]
}}
dataSource="mock"
onContinueConversation={onContinueConversation}
/>
);
expect(screen.getByText("演示执行流程 · 水质投诉调查流程")).toBeVisible();
expect(screen.getAllByText("校验上游水质监测").at(-1)).toBeVisible();
expect(screen.getAllByText("核查二次供水").at(-1)).toBeVisible();
fireEvent.click(screen.getByRole("button", { name: "与 Agent 协同" }));
expect(onContinueConversation).toHaveBeenCalledOnce();
});
});
@@ -226,7 +226,10 @@ function ConditionRecordDetailPanel({
backendCondition ? (
<PersistedRunningConditionBody condition={condition} />
) : (
<RunningConditionBody condition={condition} />
<RunningConditionBody
condition={condition}
onContinueConversation={onContinueConversation}
/>
)
) : backendCondition ? (
<PersistedConditionBody
@@ -416,8 +419,15 @@ function WorkOrderDetailPanel({
);
}
function RunningConditionBody({ condition }: { condition: ScheduledConditionRecord }) {
function RunningConditionBody({
condition,
onContinueConversation
}: {
condition: ScheduledConditionRecord;
onContinueConversation: () => void;
}) {
const runningEvidence = (condition.evidence ?? []).slice(0, 2);
const conversationAvailable = condition.taskId === "water-quality-complaint";
const [nowMs, setNowMs] = useState(() => Date.now());
useEffect(() => {
@@ -435,11 +445,12 @@ function RunningConditionBody({ condition }: { condition: ScheduledConditionReco
<RunningEvidencePreview items={runningEvidence} />
<DecisionActionStrip
icon={Bot}
title="阶段判断"
title={conversationAvailable ? "Agent 协同" : "阶段判断"}
value={condition.recommendation ?? "等待本轮工况完成后再确认是否生成处置建议。"}
actionLabel="等待完成"
actionDisabled
actionTitle="任务执行中,完成后可继续对话"
actionLabel={conversationAvailable ? "与 Agent 协同" : "等待完成"}
actionDisabled={!conversationAvailable}
actionTitle={conversationAvailable ? "打开这条任务关联的 Agent 会话" : "任务执行中,完成后可继续对话"}
onAction={conversationAvailable ? onContinueConversation : undefined}
/>
</>
);