feat: ai生成病例编辑
This commit is contained in:
+45
-6
@@ -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
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user