import SwiftUI /// 省钱战绩 = 累计汇总(summary)+ 战绩(battle)+ 省钱订单明细(records 分页)。 @MainActor @Observable final class SavingsViewModel { private(set) var summary: SavingsSummaryDTO? private(set) var battle: SavingsBattleDTO? private(set) var records: [SavingsRecordDTO] = [] private(set) var isLoading = false private(set) var isLoadingMore = false private(set) var hasMore = false private(set) var loaded = false private var cursor: Int? private let service = SavingsService() func loadFirst() async { guard !isLoading else { return } isLoading = true defer { isLoading = false; loaded = true } // 三个接口并发拉,各自容错(某个失败不影响其它) async let summaryTask = service.summary() async let battleTask = service.battle() async let recordsTask = service.records(cursor: nil) summary = try? await summaryTask battle = try? await battleTask if let page = try? await recordsTask { records = page.items cursor = page.nextCursor hasMore = page.nextCursor != nil } else { hasMore = false } } func loadMore() async { guard hasMore, !isLoading, !isLoadingMore, let cursor else { return } isLoadingMore = true defer { isLoadingMore = false } if let page = try? await service.records(cursor: cursor) { records += page.items self.cursor = page.nextCursor hasMore = page.nextCursor != nil } } }