import {it,expect} from 'vitest' import {importGroupTree,printPreviewRows,summarizeReceiptGroups} from '../src/shared/receipt-groups' import type {ImportRow} from '../src/shared/types' function row(index:number,school='甲学校',errors:string[]=[]):ImportRow{ return {index,excelRow:index+2,errors,warnings:[],receipt:{date:'2026-10-19',school,grade:'高一',studentName:'学生'+index,customer:school+' 高一 学生'+index,item:'服务费',amountCents:(index+1)*100,cashier:'',reviewer:''}} } it('非连续行合并为同组,分组金额与勾选同步,错误行始终不计入可生成数据',()=>{ const rows=[row(0),row(1,'乙学校'),row(2),row(3,'甲学校',['日期无效'])],before=JSON.stringify(rows) const [schoolA,schoolB]=importGroupTree(rows,new Set([2,3])) expect(schoolA).toMatchObject({label:'甲学校',indices:[0,2],selectedCount:1,totalCents:400,selectedCents:300,invalidCount:1}) expect(schoolA.children[0].children[0]).toMatchObject({label:'服务费',indices:[0,2],selectedCount:1,invalidCount:1}) expect(schoolB).toMatchObject({label:'乙学校',indices:[1],selectedCount:0,totalCents:200,selectedCents:0}) expect(JSON.stringify(rows)).toBe(before) expect(summarizeReceiptGroups(rows.filter(row=>!row.errors.length).map(row=>row.receipt))).toEqual([ {school:'甲学校',grade:'高一',item:'服务费',count:2,totalCents:400}, {school:'乙学校',grade:'高一',item:'服务费',count:1,totalCents:200} ]) }) it('A4 预览只显示所选同组收据,定位到所在页,最后一页不会混入其他学校',()=>{ const rows=[row(0),row(1,'乙学校'),row(2),row(3,'甲学校',['金额无效']),row(4)] expect(printPreviewRows(rows,new Set([0,1,2,3,4]),2,2).map(row=>row.index)).toEqual([0,2]) expect(printPreviewRows(rows,new Set([0,1,2,4]),4,2).map(row=>row.index)).toEqual([4]) expect(printPreviewRows(rows,new Set([1,2,4]),2,2).map(row=>row.index)).toEqual([2,4]) expect(printPreviewRows(rows,new Set([1,2,4]),4,1).map(row=>row.index)).toEqual([4]) expect(printPreviewRows(rows,new Set(),0,2)).toEqual([]) })