jest.mock('@/api/budget/leadDepartment.js', () => ({})) jest.mock('@/views/budget/collection/components/BudgetSubmissionForm.vue', () => ({})) import LeadDepartmentSummaryForm from '@/views/budget/collection/components/LeadDepartmentSummaryForm.vue' function createContext() { const methods = LeadDepartmentSummaryForm.methods const context = { formData: { economicSummary: [], fundApplication: { newProject: {}, oldProject: {} }, implementationScheduleDetail: {} }, $set(target, key, value) { target[key] = value } } context.normalizeFileList = methods.normalizeFileList.bind(context) context.mergeFileLists = methods.mergeFileLists.bind(context) return context } describe('LeadDepartmentSummaryForm automatic aggregation', () => { const submissions = [ { departmentName: '监测一科', economicItems: [{ categoryId: 1, categoryName: '物业管理费', amount: '10.0000', calculationBasis: '10个月 × 1万元', files: [{ id: 101, name: '一科.pdf' }] }], fundApplication: { newProject: { totalAmount: '3.0000', yearCurrent: '2.0000', yearNext: '1.0000' }, oldProject: { contractTotal: '8.0000', previousYearsTotal: '4.0000', previousYearBalance: '1.0000', yearCurrent: '2.0000' } }, implementationScheduleDetail: { currentYearAmount: '4.0000', currentYearMonth1: '1.0000', currentYearMonth2: '3.0000' } }, { departmentName: '监测二科', economicItems: [{ categoryId: 1, categoryName: '物业管理费', amount: '20.0000', calculationBasis: '20个月 × 1万元', files: [{ id: 102, name: '二科.pdf' }] }], fundApplication: { newProject: { totalAmount: '5.0000', yearCurrent: '3.0000', yearNext: '2.0000' }, oldProject: { contractTotal: '12.0000', previousYearsTotal: '6.0000', previousYearBalance: '2.0000', yearCurrent: '4.0000' } }, implementationScheduleDetail: { currentYearAmount: '6.0000', currentYearMonth1: '2.0000', currentYearMonth2: '4.0000' } } ] it('combines economic amounts, department-labelled bases, and every attachment', () => { const context = createContext() LeadDepartmentSummaryForm.methods.generateEconomicSummary.call(context, submissions) expect(context.formData.economicSummary).toEqual([expect.objectContaining({ categoryId: 1, totalAmount: '30.0000', departmentCount: 2, summaryCalculationBasis: '监测一科:10个月 × 1万元\n\n监测二科:20个月 × 1万元', fileList: [ expect.objectContaining({ fileId: 101 }), expect.objectContaining({ fileId: 102 }) ] })]) }) it('adds all seven fund fields and all thirteen schedule amount fields', () => { const context = createContext() LeadDepartmentSummaryForm.methods.aggregateFundApplication.call(context, submissions) LeadDepartmentSummaryForm.methods.aggregateImplementationScheduleAmounts.call(context, submissions) expect(context.formData.fundApplication).toEqual({ newProject: { totalAmount: '8.0000', yearCurrent: '5.0000', yearNext: '3.0000' }, oldProject: { contractTotal: '20.0000', previousYearsTotal: '10.0000', previousYearBalance: '3.0000', yearCurrent: '6.0000' } }) expect(context.formData.implementationScheduleDetail.currentYearAmount).toBe('10.0000') expect(context.formData.implementationScheduleDetail.currentYearMonth1).toBe('3.0000') expect(context.formData.implementationScheduleDetail.currentYearMonth2).toBe('7.0000') expect(context.formData.implementationScheduleDetail.currentYearMonth12).toBe('0.0000') }) it('inherits fixed-asset choices only when there is one department submission', () => { const context = createContext() context.formData.fundApplication = { newProject: { hasFixedAssets: null }, oldProject: { hasFixedAssets: null } } LeadDepartmentSummaryForm.methods.aggregateFundApplication.call(context, submissions) expect(context.formData.fundApplication.newProject.hasFixedAssets).toBeNull() expect(context.formData.fundApplication.oldProject.hasFixedAssets).toBeNull() LeadDepartmentSummaryForm.methods.aggregateFundApplication.call(context, [{ fundApplication: { newProject: { hasFixedAssets: true }, oldProject: { hasFixedAssets: false } } }]) expect(context.formData.fundApplication.newProject.hasFixedAssets).toBe(true) expect(context.formData.fundApplication.oldProject.hasFixedAssets).toBe(false) }) it('restores saved economic summary content instead of recalculating it in edit mode', () => { const context = createContext() context.formData.economicSummary = [{ categoryId: 1, summaryCalculationBasis: '自动生成的依据', fileList: [{ fileId: 101, name: '自动附件.pdf' }] }] LeadDepartmentSummaryForm.methods.mergeSavedEconomicSummary.call(context, [{ categoryId: 1, summaryCalculationBasis: '已保存的汇总依据', files: [{ id: 201, name: '已保存附件.pdf' }] }]) expect(context.formData.economicSummary[0]).toEqual(expect.objectContaining({ summaryCalculationBasis: '已保存的汇总依据', fileList: [expect.objectContaining({ fileId: 201 })] })) }) })