Files
vueapp/api/exams.ts
T
2026-06-11 17:48:46 +08:00

83 lines
2.2 KiB
TypeScript

import { FASTAPI_BASE_URL, authHeaders, readError, type ApiEnvelope } from './session'
export type ExamItem = {
item_code: string
item_name: string
item_type: string
}
export type ExamResult = ExamItem & {
result_text: string
result_structured?: Record<string, unknown>
is_key?: boolean
is_abnormal?: boolean
context_written?: boolean
already_ordered?: boolean
}
type ExamListResponse = {
items: ExamItem[]
}
type ExamKind = 'physical-exams' | 'auxiliary-exams'
export function fetchPhysicalExamItems(sessionId: number) {
return fetchExamItems(sessionId, 'physical-exams')
}
export function fetchAuxiliaryExamItems(sessionId: number) {
return fetchExamItems(sessionId, 'auxiliary-exams')
}
export function orderPhysicalExamResult(sessionId: number, itemCode: string) {
return orderExamResult(sessionId, 'physical-exams', itemCode)
}
export function orderAuxiliaryExamResult(sessionId: number, itemCode: string) {
return orderExamResult(sessionId, 'auxiliary-exams', itemCode)
}
function assertSessionId(sessionId: number) {
if (!Number.isInteger(sessionId) || sessionId <= 0) {
throw new Error('未找到当前会话,请先生成模拟场景')
}
}
async function fetchExamItems(sessionId: number, kind: ExamKind) {
assertSessionId(sessionId)
const response = await fetch(`${FASTAPI_BASE_URL}/sessions/${sessionId}/${kind}`, {
method: 'GET',
headers: authHeaders()
})
if (!response.ok) {
throw new Error(await readError(response))
}
const result = (await response.json()) as ApiEnvelope<ExamListResponse>
if (result.code !== 'OK' || !Array.isArray(result.data?.items)) {
throw new Error(result.message || '检查列表加载失败')
}
return result.data.items
}
async function orderExamResult(sessionId: number, kind: ExamKind, itemCode: string) {
assertSessionId(sessionId)
const response = await fetch(`${FASTAPI_BASE_URL}/sessions/${sessionId}/${kind}/${encodeURIComponent(itemCode)}`, {
method: 'POST',
headers: authHeaders()
})
if (!response.ok) {
throw new Error(await readError(response))
}
const result = (await response.json()) as ApiEnvelope<ExamResult>
if (result.code !== 'OK' || !result.data?.item_code) {
throw new Error(result.message || '检查结果获取失败')
}
return result.data
}