feat(web-admin): add protocol-audit sample-row flatten helpers.

Support Excel-aligned list mode for cell-storage protocol audit.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-09 09:56:42 +08:00
1 parent 4904508d9f
commit 0da75fb855
2 files changed
+233

No files matched your search

@@ -0,0 +1,98 @@
// web-admin/src/utils/protocol-audit-flatten.test.ts
import { describe, it } from 'node:test'
import assert from 'node:assert/strict'
import {
flattenProtocolAuditRows,
extractCollectDate,
uniqueProtocolsFromFlatRows,
firstPayTimeLines
} from './protocol-audit-flatten'
describe('extractCollectDate', () => {
it('takes YYYY-MM-DD from datetime', () => {
assert.equal(extractCollectDate('2025-09-15 08:51:00'), '2025-09-15')
assert.equal(extractCollectDate('2025-09-15T08:51:00'), '2025-09-15')
})
it('empty → empty', () => {
assert.equal(extractCollectDate(''), '')
assert.equal(extractCollectDate(undefined), '')
})
})
describe('flattenProtocolAuditRows', () => {
it('one protocol two samples → two rows, both co-stored', () => {
const rows = flattenProtocolAuditRows([
{
id: 'p1',
protocolNo: 'ZKZX1',
motherName: '郭梦朵',
sampleCollectTime: '2025-09-15 08:51:00',
sampleItems: [
{ sampleTypeName: '脐带血', sampleCode: 'A1', labStorageCode: 'B0000004' },
{ sampleTypeName: '胎盘', sampleCode: 'A2', labStorageCode: 'B0000004A' }
]
}
])
assert.equal(rows.length, 2)
assert.equal(rows[0].isCoStored, true)
assert.equal(rows[1].isCoStored, true)
assert.equal(rows[0].collectDate, '2025-09-15')
assert.equal(rows[0].labStorageCode, 'B0000004')
assert.equal(rows[1].labStorageCode, 'B0000004A')
assert.equal(rows[0].protocolId, 'p1')
})
it('zero samples → one placeholder row, not co-stored', () => {
const rows = flattenProtocolAuditRows([{ id: 'p2', protocolNo: 'ZKZX2', sampleItems: [] }])
assert.equal(rows.length, 1)
assert.equal(rows[0].isCoStored, false)
assert.equal(rows[0].labStorageCode, '')
})
it('one sample → not co-stored', () => {
const rows = flattenProtocolAuditRows([
{
id: 'p3',
sampleItems: [{ sampleTypeName: '脐带血', sampleCode: 'C1', labStorageCode: 'B7' }]
}
])
assert.equal(rows.length, 1)
assert.equal(rows[0].isCoStored, false)
})
})
describe('uniqueProtocolsFromFlatRows', () => {
it('dedupes by protocolId keeping first protocol ref', () => {
const flat = flattenProtocolAuditRows([
{
id: 'p1',
motherName: 'A',
sampleItems: [
{ sampleCode: '1', labStorageCode: 'B1' },
{ sampleCode: '2', labStorageCode: 'B2' }
]
}
])
const uniq = uniqueProtocolsFromFlatRows(flat)
assert.equal(uniq.length, 1)
assert.equal(String(uniq[0].id), 'p1')
})
})
describe('firstPayTimeLines', () => {
it('prefers transferTime then dueDate; stacks multiple', () => {
const lines = firstPayTimeLines({
paymentDetails: [
{ installmentNo: 1, transferTime: '2025-09-15 09:20:00', installmentDueDate: '2025-09-01' },
{ installmentNo: 2, transferTime: '2025-10-15 10:05:00' }
]
})
assert.deepEqual(lines, ['2025-09-15 09:20:00', '2025-10-15 10:05:00'])
})
it('falls back to dueDate when no transferTime', () => {
const lines = firstPayTimeLines({
paymentDetails: [{ installmentNo: 1, installmentDueDate: '2025-09-01' }]
})
assert.deepEqual(lines, ['2025-09-01'])
})
})