将定金订单、历史拍摄与多行程上传接入 Orders,并以真实页面替换首页排队管理、消息中心、景区结算与提现审核占位入口。 Co-authored-by: Cursor <cursoragent@cursor.com>
140 lines
3.8 KiB
Swift
140 lines
3.8 KiB
Swift
//
|
||
// WithdrawalAuditViewModel.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/6/25.
|
||
//
|
||
|
||
import Foundation
|
||
import Observation
|
||
|
||
/// 提现审核筛选项,按提现记录的状态文案聚合审核视角。
|
||
enum WithdrawalAuditFilter: String, CaseIterable, Identifiable {
|
||
case all
|
||
case processing
|
||
case completed
|
||
|
||
var id: String { rawValue }
|
||
|
||
/// 筛选项展示标题。
|
||
var title: String {
|
||
switch self {
|
||
case .all: "全部"
|
||
case .processing: "处理中"
|
||
case .completed: "已完成"
|
||
}
|
||
}
|
||
}
|
||
|
||
@MainActor
|
||
@Observable
|
||
/// 提现审核 ViewModel,负责提现记录分页、状态筛选和失败状态清理。
|
||
final class WithdrawalAuditViewModel {
|
||
var records: [WalletWithdrawRecord] = []
|
||
var selectedFilter: WithdrawalAuditFilter = .all
|
||
var isLoading = false
|
||
var isLoadingMore = false
|
||
var loadFailed = false
|
||
var loadFailureReason: String?
|
||
var errorMessage: String?
|
||
|
||
private let pageSize = 10
|
||
private var page = 1
|
||
private var total = 0
|
||
|
||
/// 当前筛选下的提现记录。
|
||
var filteredRecords: [WalletWithdrawRecord] {
|
||
filteredRecords(for: selectedFilter)
|
||
}
|
||
|
||
/// 是否还有下一页。
|
||
var hasMore: Bool {
|
||
records.count < total
|
||
}
|
||
|
||
/// 记录总数,优先使用服务端 total。
|
||
var totalCount: Int {
|
||
max(total, records.count)
|
||
}
|
||
|
||
/// 处理中数量。
|
||
var processingCount: Int {
|
||
filteredRecords(for: .processing).count
|
||
}
|
||
|
||
/// 已完成数量。
|
||
var completedCount: Int {
|
||
filteredRecords(for: .completed).count
|
||
}
|
||
|
||
/// 按指定筛选返回提现记录。
|
||
func filteredRecords(for filter: WithdrawalAuditFilter) -> [WalletWithdrawRecord] {
|
||
switch filter {
|
||
case .all:
|
||
return records
|
||
case .processing:
|
||
return records.filter { record in
|
||
let status = record.statusLabel
|
||
return status.contains("中") || status.contains("待")
|
||
}
|
||
case .completed:
|
||
return records.filter { record in
|
||
let status = record.statusLabel
|
||
return status.contains("完成") || status.contains("到账") || status.contains("通过")
|
||
}
|
||
}
|
||
}
|
||
|
||
/// 切换筛选项,仅影响本地展示。
|
||
func selectFilter(_ filter: WithdrawalAuditFilter) {
|
||
selectedFilter = filter
|
||
}
|
||
|
||
/// 重新加载第一页提现审核记录。
|
||
func reload(api: WalletServing) async {
|
||
isLoading = true
|
||
loadFailed = false
|
||
loadFailureReason = nil
|
||
errorMessage = nil
|
||
defer { isLoading = false }
|
||
|
||
do {
|
||
let response = try await api.walletWithdrawList(page: 1, pageSize: pageSize)
|
||
records = response.item
|
||
total = response.total
|
||
page = 1
|
||
} catch {
|
||
clearRecords()
|
||
loadFailed = true
|
||
loadFailureReason = error.localizedDescription
|
||
errorMessage = error.localizedDescription
|
||
}
|
||
}
|
||
|
||
/// 加载下一页提现审核记录。
|
||
func loadMore(api: WalletServing) async {
|
||
guard hasMore, !isLoadingMore, !isLoading else { return }
|
||
isLoadingMore = true
|
||
errorMessage = nil
|
||
defer { isLoadingMore = false }
|
||
|
||
let nextPage = page + 1
|
||
do {
|
||
let response = try await api.walletWithdrawList(page: nextPage, pageSize: pageSize)
|
||
records += response.item
|
||
total = response.total
|
||
page = nextPage
|
||
} catch {
|
||
errorMessage = error.localizedDescription
|
||
}
|
||
}
|
||
|
||
/// 清空旧提现审核数据,避免失败后残留上一账号或上一状态记录。
|
||
private func clearRecords() {
|
||
records = []
|
||
page = 1
|
||
total = 0
|
||
isLoadingMore = false
|
||
}
|
||
}
|