66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
export type SampleReceptionSourceType = 'cell_storage' | 'research_donation'
|
|
|
|
const SAMPLE_TYPE_PERINATAL_HSC = '围产期造血干细胞'
|
|
const SAMPLE_TYPE_UC_MSC = '脐带间充质干细胞'
|
|
|
|
function normalizeSampleTypeName(name: string): string {
|
|
return String(name || '').trim()
|
|
}
|
|
|
|
function normalizeSourceType(source: string): SampleReceptionSourceType {
|
|
return source === 'research_donation' ? 'research_donation' : 'cell_storage'
|
|
}
|
|
|
|
function formatYm(d: Date): string {
|
|
const pad = (n: number) => String(n).padStart(2, '0')
|
|
return `${d.getFullYear()}${pad(d.getMonth() + 1)}`
|
|
}
|
|
|
|
function formatYear(d: Date): string {
|
|
return String(d.getFullYear())
|
|
}
|
|
|
|
/** 从接收时间字符串解析参考日期;无效时回退为当前时刻 */
|
|
export function parseLabStorageReferenceDate(receptionTime: string): Date {
|
|
const s = String(receptionTime || '').trim()
|
|
const dateStr = s.length >= 10 ? s.slice(0, 10) : ''
|
|
if (!dateStr || dateStr[4] !== '-' || dateStr[7] !== '-') {
|
|
return new Date()
|
|
}
|
|
const [y, m, d] = dateStr.split('-').map((v) => Number(v))
|
|
if (!y || !m || !d) return new Date()
|
|
return new Date(y, m - 1, d)
|
|
}
|
|
|
|
/**
|
|
* 按来源与样本类型预制实验室入库编码;不匹配规则时返回空字符串。
|
|
*/
|
|
export function buildPrefilledLabStorageCode(
|
|
sourceType: string,
|
|
sampleTypeName: string,
|
|
referenceDate: Date = new Date()
|
|
): string {
|
|
const source = normalizeSourceType(sourceType)
|
|
const typeName = normalizeSampleTypeName(sampleTypeName)
|
|
|
|
if (source === 'research_donation') {
|
|
if (typeName === SAMPLE_TYPE_PERINATAL_HSC) {
|
|
return `UBMC${formatYm(referenceDate)}`
|
|
}
|
|
if (typeName === SAMPLE_TYPE_UC_MSC) {
|
|
return `UC${formatYear(referenceDate)}`
|
|
}
|
|
}
|
|
|
|
if (source === 'cell_storage') {
|
|
if (typeName === SAMPLE_TYPE_UC_MSC) {
|
|
return 'BC'
|
|
}
|
|
if (typeName === SAMPLE_TYPE_PERINATAL_HSC) {
|
|
return 'B'
|
|
}
|
|
}
|
|
|
|
return ''
|
|
}
|