同步已迁移的 iOS 模块

This commit is contained in:
2026-06-22 15:35:12 +08:00
parent 0a0d4fbd79
commit 08465fffde
48 changed files with 4455 additions and 15 deletions

View File

@ -0,0 +1,100 @@
//
// StatisticsViewModel.swift
// suixinkan
//
// Created by Codex on 2026/6/22.
//
import Foundation
import Observation
@MainActor
@Observable
/// ViewModel
final class StatisticsViewModel {
var selectedPeriod: StatisticsPeriod = .today
private(set) var loading = false
private(set) var loadingMore = false
private(set) var summary = StatisticsSummaryResponse()
private(set) var dailyItems: [StatisticsDailyItem] = []
private(set) var totalDailyCount = 0
private(set) var lastRefreshAt: Date?
private var page = 1
private let pageSize = 15
///
var hasMore: Bool {
dailyItems.count < totalDailyCount
}
///
func selectPeriod(_ period: StatisticsPeriod, api: StatisticsServing, scenicId: Int?, roleId: Int?) async throws {
selectedPeriod = period
try await reload(api: api, scenicId: scenicId, roleId: roleId)
}
///
func reload(api: StatisticsServing, scenicId: Int?, roleId: Int?, showLoading: Bool = true) async throws {
guard let scenicId else {
reset()
return
}
if showLoading { loading = true }
defer { if showLoading { loading = false } }
let isScenicAdmin = roleId == 53
async let summaryResult = api.summary(
scenicId: scenicId,
range: selectedPeriod.apiRange,
isScenicAdmin: isScenicAdmin
)
async let dailyResult = api.dailyList(
scenicId: scenicId,
startTime: selectedPeriod.apiStartTime,
endTime: selectedPeriod.apiEndTime,
page: 1,
pageSize: pageSize,
isScenicAdmin: isScenicAdmin
)
let (summaryData, dailyData) = try await (summaryResult, dailyResult)
summary = summaryData
dailyItems = dailyData.data
totalDailyCount = dailyData.total
page = 1
lastRefreshAt = Date()
}
///
func loadMore(api: StatisticsServing, scenicId: Int?, roleId: Int?) async throws {
guard !loadingMore, hasMore, let scenicId else { return }
loadingMore = true
defer { loadingMore = false }
let nextPage = page + 1
let result = try await api.dailyList(
scenicId: scenicId,
startTime: selectedPeriod.apiStartTime,
endTime: selectedPeriod.apiEndTime,
page: nextPage,
pageSize: pageSize,
isScenicAdmin: roleId == 53
)
dailyItems.append(contentsOf: result.data)
totalDailyCount = result.total
page = nextPage
}
///
private func reset() {
summary = StatisticsSummaryResponse()
dailyItems = []
totalDailyCount = 0
page = 1
lastRefreshAt = nil
loading = false
loadingMore = false
}
}