import { useRef, useState, type Ref } from "react"; import { Button } from "@/shared/ui/button"; import { Checkbox } from "@/shared/ui/checkbox"; import { Radio } from "@/shared/ui/radio"; import { Textarea } from "@/shared/ui/textarea"; import { createOperationalRequestId, type AnswerTaskQuestion, type OperationalTask, type TaskQuestionAnswer, type TaskQuestionRequest } from "../api/operational-task-client"; export function InvestigationQuestions({ task, onAnswer, sectionRef }: { task: OperationalTask; onAnswer?: AnswerTaskQuestion; sectionRef?: Ref; }) { const questions = task.questions ?? []; if (!questions.length) return null; return

补充回答

在本报告中选择或填写答案,提交后继续当前调查。

{questions.map((request) => )}
; } function TaskQuestionCard({ request, onAnswer, canAnswer }: { request: TaskQuestionRequest; onAnswer?: AnswerTaskQuestion; canAnswer: boolean; }) { const [answers, setAnswers] = useState(() => request.questions.map((q) => ({ question_id: q.question_id, selected_option_ids: [], custom_text: "" }))); const [busy, setBusy] = useState(false); const [submitted, setSubmitted] = useState(false); const [error, setError] = useState(null); const attempt = useRef<{ body: string; id: string } | null>(null); const pending = request.status === "pending" && !submitted; const disabled = !canAnswer || !onAnswer || busy || !pending; const valid = request.questions.every((q, index) => !q.required || answers[index].selected_option_ids.length || (q.allow_custom && answers[index].custom_text.trim())); const update = (index: number, patch: Partial) => setAnswers((current) => current.map((answer, i) => i === index ? { ...answer, ...patch } : answer)); const submit = async () => { if (disabled || !valid) return; const body = JSON.stringify(answers); if (attempt.current?.body !== body) attempt.current = { body, id: createOperationalRequestId() }; setBusy(true); setError(null); try { await onAnswer!(request.question_request_id, request.version, answers, attempt.current.id); setSubmitted(true); } catch (cause) { setError(cause instanceof Error ? cause.message : "提交失败,请重试"); } finally { setBusy(false); } }; return

第 {request.execution_generation} 轮调查 · {submitted || request.status === "answered" ? "回答已保存" : request.status === "cancelled" ? "提问已失效" : "等待回答"}

{request.questions.map((question, index) => { const answer = answers[index]; const saved = request.answers.find((item) => item.question_id === question.question_id); return
{question.title}{question.required && pending ? "(必填)" : ""}

{question.body}

{pending ? <> {question.options.map((option) => )} {question.allow_custom ?