import * as React from 'react' import { Save } from 'lucide-react' import { AppField } from '@/components/app/AppField' import { AppPage } from '@/components/app/AppPage' import { AppPageHeader } from '@/components/app/AppPageHeader' import { AppSection } from '@/components/app/AppSection' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSet } from '@/components/ui/field' import { Input } from '@/components/ui/input' import { Switch } from '@/components/ui/switch' import { Textarea } from '@/components/ui/textarea' import { getTicket } from '@/features/tickets/api' import { createSolution, linkSolutionToTicket } from './api' import type { SolutionInput } from './types' const initialForm: SolutionInput = { title: '', problem_signature: '', related_system: '', environment_scope: '', root_cause: '', solution: '', risk_note: '', status: 'draft', allow_auto_resolve: false, requires_human_action: false, requires_external_confirmation: false, requires_production_change: false } function getSourceTicketId() { const route = window.location.hash.replace(/^#/, '') const query = route.includes('?') ? route.slice(route.indexOf('?') + 1) : '' const ticketId = new URLSearchParams(query).get('ticketId') return ticketId ? Number(ticketId) : null } export function SolutionCreatePage() { const [form, setForm] = React.useState(initialForm) const [sourceTicketId] = React.useState(getSourceTicketId) const [error, setError] = React.useState('') const [submitting, setSubmitting] = React.useState(false) React.useEffect(() => { if (!sourceTicketId) return getTicket(sourceTicketId) .then((ticket) => { setForm((current) => ({ ...current, title: ticket.title, problem_signature: ticket.description, related_system: ticket.related_system, environment_scope: ticket.environment })) }) .catch(() => undefined) }, [sourceTicketId]) function updateField(field: Key, value: SolutionInput[Key]) { setForm((current) => ({ ...current, [field]: value })) } async function handleSubmit(event: React.FormEvent) { event.preventDefault() setError('') setSubmitting(true) try { const solution = await createSolution(form) if (sourceTicketId) { await linkSolutionToTicket(solution.id, sourceTicketId, 'referenced') window.location.hash = `/tickets/${sourceTicketId}` return } window.location.hash = '/solutions' } catch (reason) { setError(reason instanceof Error ? reason.message : '保存解决方案失败,请检查必填信息。') } finally { setSubmitting(false) } } return ( } > {error ? ( 保存失败 {error} ) : null}
updateField('title', event.target.value)} /> updateField('related_system', event.target.value)} /> updateField('environment_scope', event.target.value)} />