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:
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'])
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user