Files
zkxw/web-admin/src/utils/sample-production-reception-fields.ts
T
2026-06-30 16:48:52 +08:00

152 lines
5.0 KiB
TypeScript

import { formatDateOnly, formatDateTimeDisplay } from '@/utils/datetime-display'
export type SampleReceptionSourceType = 'cell_storage' | 'research_donation'
export const SAMPLE_TYPE_PERINATAL_HSC = '围产期造血干细胞'
export const SAMPLE_TYPE_UC_MSC = '脐带间充质干细胞'
export type ProductionReceptionFieldKey =
| 'originalBloodWeightG'
| 'hesVolumeMl'
| 'bloodType'
| 'infectiousFourTestResult'
| 'enrichedBloodWeightG'
| 'cryopreservationVolumeMl'
| 'inoculationAmount'
| 'cryopreservationTime'
| 'storageTotalTubes'
| 'availableCellCount1e7'
| 'originalBloodVolumeMl'
| 'nucleatedCellCount1e8'
export type ProductionReceptionFieldDef = {
key: ProductionReceptionFieldKey
label: string
kind: 'number' | 'text' | 'datetime' | 'select' | 'integer'
selectOptions?: Array<{ label: string; value: string }>
}
const INFECTIOUS_OPTIONS = [
{ label: '正常', value: 'zc' },
{ label: '不正常', value: 'bzc' }
]
const FIELD_DEFS: Record<ProductionReceptionFieldKey, ProductionReceptionFieldDef> = {
originalBloodWeightG: { key: 'originalBloodWeightG', label: '原血重量/g', kind: 'number' },
hesVolumeMl: { key: 'hesVolumeMl', label: 'HES用量/ml', kind: 'number' },
bloodType: { key: 'bloodType', label: '血型', kind: 'text' },
infectiousFourTestResult: {
key: 'infectiousFourTestResult',
label: '传染四项检测(检测卡)',
kind: 'select',
selectOptions: INFECTIOUS_OPTIONS
},
enrichedBloodWeightG: { key: 'enrichedBloodWeightG', label: '富集后血量/g', kind: 'number' },
cryopreservationVolumeMl: {
key: 'cryopreservationVolumeMl',
label: '冻存液用量/ml',
kind: 'number'
},
inoculationAmount: { key: 'inoculationAmount', label: '接种量', kind: 'number' },
cryopreservationTime: { key: 'cryopreservationTime', label: '冻存时间', kind: 'datetime' },
storageTotalTubes: { key: 'storageTotalTubes', label: '储存总量(管)', kind: 'integer' },
availableCellCount1e7: {
key: 'availableCellCount1e7',
label: '可提供细胞数量/*10E7',
kind: 'number'
},
originalBloodVolumeMl: { key: 'originalBloodVolumeMl', label: '原血体积/ml', kind: 'number' },
nucleatedCellCount1e8: {
key: 'nucleatedCellCount1e8',
label: '有核细胞数/10E8',
kind: 'number'
}
}
const PROFILE_KEYS: Record<string, ProductionReceptionFieldKey[]> = {
'cell_storage|围产期造血干细胞': [
'originalBloodWeightG',
'hesVolumeMl',
'bloodType',
'infectiousFourTestResult',
'enrichedBloodWeightG',
'cryopreservationVolumeMl'
],
'cell_storage|脐带间充质干细胞': [
'inoculationAmount',
'cryopreservationTime',
'storageTotalTubes',
'availableCellCount1e7'
],
'research_donation|脐带间充质干细胞': ['inoculationAmount', 'cryopreservationTime'],
'research_donation|围产期造血干细胞': ['originalBloodVolumeMl', 'nucleatedCellCount1e8']
}
export function resolveProductionReceptionFields(
sourceType: string,
sampleTypeName: string
): ProductionReceptionFieldDef[] {
const key = `${sourceType === 'research_donation' ? 'research_donation' : 'cell_storage'}|${String(sampleTypeName || '').trim()}`
const keys = PROFILE_KEYS[key] || []
return keys.map((k) => FIELD_DEFS[k])
}
export function infectiousFourTestLabel(value: string) {
return INFECTIOUS_OPTIONS.find((o) => o.value === value)?.label || value || '—'
}
/** 生产接收「处理时间」仅展示日期 YYYY-MM-DD(兼容历史带时分秒数据) */
export function formatProcessTimeDate(value: string | null | undefined): string {
return formatDateOnly(value)
}
export type ProductionReceptionRecord = {
id?: string
receptionId?: string
handlerUserId?: string
handlerName?: string
processTime?: string
originalBloodWeightG?: number
hesVolumeMl?: number
bloodType?: string
infectiousFourTestResult?: string
infectiousFourTestResultLabel?: string
enrichedBloodWeightG?: number
cryopreservationVolumeMl?: number
inoculationAmount?: number
cryopreservationTime?: string
storageTotalTubes?: number
availableCellCount1e7?: number
originalBloodVolumeMl?: number
nucleatedCellCount1e8?: number
remark?: string
}
export type QcReceptionRecord = {
receptionTime?: string
handlerName?: string
receiveTemperature?: string
acceptConclusion?: string
acceptConclusionLabel?: string
labStorageCode?: string
checkResults?: Array<{ itemName?: string; checked?: boolean }>
remark?: string
receiveAttachmentFiles?: Array<Record<string, unknown>>
}
export function formatProductionFieldValue(
def: ProductionReceptionFieldDef,
record: ProductionReceptionRecord | null | undefined
) {
if (!record) return '—'
const raw = record[def.key as keyof ProductionReceptionRecord]
if (raw === null || raw === undefined || raw === '') return '—'
if (def.key === 'infectiousFourTestResult') {
return infectiousFourTestLabel(String(raw))
}
if (def.kind === 'datetime') {
return formatDateTimeDisplay(String(raw)) || '—'
}
return String(raw)
}