feat: ai生成病例编辑

This commit is contained in:
王天骄
2026-06-15 17:28:35 +08:00
parent 3c2eb0a517
commit 9deadf2083
11 changed files with 1353 additions and 135 deletions
+45 -6
View File
@@ -49,6 +49,7 @@ export interface CaseExamItemPayload {
item_code: string
item_name?: string
item_type?: string
result_text?: string
}
export interface CreateCaseDraftPayload {
@@ -111,9 +112,17 @@ export interface AiGenerateCaseResult {
raw: unknown
}
export interface ImportCasePdfResult {
parseId: string
caseType: DraftCaseType
data: Record<string, unknown>
raw: unknown
}
export interface ImportCasePdfParams {
token: string
file: File
case_type: DraftCaseType
}
export interface UpdateCaseRelationsPayload {
@@ -133,6 +142,12 @@ export interface CaseActionParams {
id: string | number
}
export interface SubmitCasePayload extends CreateCaseDraftPayload {}
export interface SubmitCaseParams extends CaseActionParams {
payload?: SubmitCasePayload
}
const listKeys = ['results', 'list', 'rows', 'items', 'records', 'cases']
const totalKeys = ['count', 'total', 'total_count', 'totalCount']
@@ -231,6 +246,10 @@ function getStringList(record: Record<string, unknown>, keys: string[]): string[
return []
}
function normalizeDraftCaseType(value: string, fallback: DraftCaseType = 'traditional'): DraftCaseType {
return value === 'teaching' ? 'teaching' : fallback
}
function normalizePublishStatus(value: unknown): CasePublishStatus | null {
if (value === 0 || value === 1 || value === 2) {
return value
@@ -384,6 +403,22 @@ function normalizeAiGenerateResult(data: unknown): AiGenerateCaseResult {
}
}
function normalizeImportCasePdfResult(data: unknown, fallbackCaseType: DraftCaseType): ImportCasePdfResult {
const root = getRecord(data)
const payload = root.parse_id || root.parseId || root.case_type || root.caseType || root.title
? root
: getRecord(root.data)
const nestedData = getRecord(payload.data)
const generatedData = Object.keys(nestedData).length ? nestedData : payload
return {
parseId: getString(payload, ['parse_id', 'parseId']),
caseType: normalizeDraftCaseType(getString(payload, ['case_type', 'caseType']), fallbackCaseType),
data: generatedData,
raw: data
}
}
function createCaseQuery(params: Partial<CaseListParams>) {
const query = new URLSearchParams()
if (params.search?.trim()) {
@@ -489,9 +524,10 @@ export async function generateCaseWithAi(params: AiGenerateCaseParams): Promise<
return normalizeAiGenerateResult(data)
}
export async function importCasePdf(params: ImportCasePdfParams): Promise<unknown> {
export async function importCasePdf(params: ImportCasePdfParams): Promise<ImportCasePdfResult> {
const formData = new FormData()
formData.append('file', params.file)
formData.append('files', params.file)
formData.append('case_type', params.case_type)
const response = await fetch('/server/api/cms/cases/import-pdf/', {
method: 'POST',
@@ -502,7 +538,8 @@ export async function importCasePdf(params: ImportCasePdfParams): Promise<unknow
body: formData
})
return parseMutationResponse(response, '导入 PDF 病例失败')
const data = await parseMutationResponse(response, '导入 PDF 病例失败')
return normalizeImportCasePdfResult(data, params.case_type)
}
export async function updateCaseRelations(params: UpdateCaseRelationsParams): Promise<unknown> {
@@ -519,13 +556,15 @@ export async function updateCaseRelations(params: UpdateCaseRelationsParams): Pr
return parseMutationResponse(response, '编辑病例关联失败')
}
export async function submitCase(params: CaseActionParams): Promise<unknown> {
export async function submitCase(params: SubmitCaseParams): Promise<unknown> {
const response = await fetch(`/server/api/cms/cases/${params.id}/submit/`, {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: createAuthorization(params.token)
}
Authorization: createAuthorization(params.token),
...(params.payload ? { 'Content-Type': 'application/json' } : {})
},
...(params.payload ? { body: JSON.stringify(params.payload) } : {})
})
return parseMutationResponse(response, '提交病例失败')
+1 -1
View File
@@ -394,7 +394,7 @@ export async function resetUserPassword(params: ResetUserPasswordParams): Promis
export async function importUsers(params: ImportUsersParams): Promise<unknown> {
const formData = new FormData()
formData.append('file', params.file)
formData.append('files', params.file)
const response = await fetch('/server/api/cms/users/import/', {
method: 'POST',