Add instant payment collection flow aligned with Android.
Implement收款详情与收款记录 pages with pay-code API, QR generation, amount setting, and record grouping so merchants can collect payments from the home quick action. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -0,0 +1,61 @@
|
||||
//
|
||||
// PaymentCollectionRecordViewModel.swift
|
||||
// suixinkan
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
/// 收款记录 ViewModel,拉取近 7 天记录并按日分组展示。
|
||||
final class PaymentCollectionRecordViewModel {
|
||||
|
||||
private(set) var loading = false
|
||||
private(set) var groups: [RepaymentCollectionRecordGroup] = []
|
||||
|
||||
var onStateChange: (() -> Void)?
|
||||
|
||||
private let appStore: AppStore
|
||||
|
||||
init(appStore: AppStore = .shared) {
|
||||
self.appStore = appStore
|
||||
}
|
||||
|
||||
func loadRecord(api: PaymentAPI) async {
|
||||
guard !loading else { return }
|
||||
loading = true
|
||||
notifyStateChange()
|
||||
defer {
|
||||
loading = false
|
||||
notifyStateChange()
|
||||
}
|
||||
|
||||
let scenicId = appStore.currentScenicId
|
||||
guard scenicId > 0 else {
|
||||
groups = []
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
let response = try await api.collectionRecord(scenicId: scenicId)
|
||||
groups = PaymentRecordGrouper.group(response: response)
|
||||
} catch {
|
||||
groups = []
|
||||
}
|
||||
}
|
||||
|
||||
private func notifyStateChange() {
|
||||
onStateChange?()
|
||||
}
|
||||
}
|
||||
|
||||
/// 收款记录分组逻辑,对齐 Android `PaymentCollectionRecordViewModel.getRecord`。
|
||||
enum PaymentRecordGrouper {
|
||||
static func group(response: RepaymentCollectionRecordResponse) -> [RepaymentCollectionRecordGroup] {
|
||||
let mapByDate = Dictionary(grouping: response.list, by: \.createDate)
|
||||
return response.analyse.map { analyseItem in
|
||||
RepaymentCollectionRecordGroup(
|
||||
analyse: analyseItem,
|
||||
items: mapByDate[analyseItem.date] ?? []
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user