fix: route payment pushes to orders and prevent refresh crash

This commit is contained in:
2026-09-08 09:59:51 +08:00
parent 10249776ad
commit c4b0e7798b
10 changed files with 333 additions and 47 deletions
@@ -8,6 +8,14 @@ import Foundation
/// 店铺管理员押金单列表 ViewModel,对齐 Android `DepositOrderListViewModel`。
final class DepositOrderListViewModel {
private let appStore: AppStore
/// 注入账号上下文,使订单查询与测试使用各自独立的会话。
init(appStore: AppStore = .shared) {
self.appStore = appStore
}
private(set) var searchText = ""
private(set) var filterLabel = "全部"
private(set) var tabIndex = 0
@@ -22,6 +30,7 @@ final class DepositOrderListViewModel {
var onStateChange: (() -> Void)?
var onShowMessage: ((String) -> Void)?
private var listRequestID = UUID()
private var currentPage = 1
private var totalCount = 0
private var searchDebounceTask: Task<Void, Never>?
@@ -34,6 +43,18 @@ final class DepositOrderListViewModel {
return formatter
}()
/// 清除通知进入前的查询条件,由页面随后发起第一页刷新。
func resetFiltersForOrderNotification() {
searchDebounceTask?.cancel()
searchDebounceTask = nil
searchText = ""
filterLabel = "全部"
tabIndex = 0
startTime = nil
endTime = nil
notifyStateChange()
}
func refreshOrderList(api: OrderAPI) async {
currentPage = 1
isRefreshing = true
@@ -102,7 +123,7 @@ final class DepositOrderListViewModel {
onShowMessage?("核销码内容不完整")
return
}
let storeId = AppStore.shared.session.currentStoreId
let storeId = appStore.session.currentStoreId
guard storeId > 0 else {
onShowMessage?("店铺信息异常,请先选择店铺")
return
@@ -125,7 +146,7 @@ final class DepositOrderListViewModel {
refundReason: String,
api: OrderAPI
) async {
let storeId = AppStore.shared.session.currentStoreId
let storeId = appStore.session.currentStoreId
guard storeId > 0 else {
onShowMessage?("店铺信息异常")
return
@@ -163,10 +184,12 @@ final class DepositOrderListViewModel {
}
private func loadOrderList(refresh: Bool, api: OrderAPI) async {
let requestID = UUID()
listRequestID = requestID
let phone = searchText.trimmingCharacters(in: .whitespacesAndNewlines)
let isPhoneSearch = !phone.isEmpty && Self.isValidPhone(phone)
let storeId = AppStore.shared.session.currentStoreId
let storeId = appStore.session.currentStoreId
if storeId <= 0 {
finishLoading()
orderList = []
@@ -201,6 +224,7 @@ final class DepositOrderListViewModel {
startTime: start,
endTime: end
)
guard listRequestID == requestID else { return }
totalCount = response.total
if refresh || currentPage == 1 {
orderList = response.list
@@ -213,6 +237,7 @@ final class DepositOrderListViewModel {
} catch is CancellationError {
return
} catch {
guard listRequestID == requestID else { return }
onShowMessage?(error.localizedDescription)
}
finishLoading()
@@ -83,6 +83,14 @@ struct OrderSourceSelection: Equatable {
/// 摄影师/景区管理员订单列表 ViewModel,对齐 Android `OrderListViewModel`。
final class OrderListViewModel {
private let appStore: AppStore
/// 注入账号上下文,使订单查询与测试使用各自独立的会话。
init(appStore: AppStore = .shared) {
self.appStore = appStore
}
private(set) var orderList: [OrderEntity] = []
private(set) var searchText = ""
private(set) var filterLabel = "全部"
@@ -110,6 +118,7 @@ final class OrderListViewModel {
var onShowMessage: ((String) -> Void)?
var onNavigateBindAcquirer: ((Int) -> Void)?
private var listRequestID = UUID()
private var currentPage = 1
private var totalCount = 0
@@ -122,7 +131,7 @@ final class OrderListViewModel {
}()
var isScenicAdminReadOnly: Bool {
AppStore.shared.session.currentAppRole == .scenicAdmin
appStore.session.currentAppRole == .scenicAdmin
}
var listAPIPath: String {
@@ -131,6 +140,17 @@ final class OrderListViewModel {
: "/api/yf-handset-app/photog/order/listv2"
}
/// 清除通知进入前的查询条件,由页面随后发起第一页刷新。
func resetFiltersForOrderNotification() {
searchText = ""
filterLabel = "全部"
tabIndex = 0
rTabIndex = 0
startTime = nil
endTime = nil
notifyStateChange()
}
func refreshOrderList(api: OrderAPI) async {
currentPage = 1
isRefreshing = true
@@ -359,7 +379,7 @@ final class OrderListViewModel {
isLoadingOrderSourcePeople = false
notifyStateChange()
}
let storeId = AppStore.shared.session.currentStoreId
let storeId = appStore.session.currentStoreId
let storeIdParam = storeId > 0 ? String(storeId) : nil
do {
let response = try await api.cooperativeSalers(storeId: storeIdParam)
@@ -402,7 +422,9 @@ final class OrderListViewModel {
}
private func loadOrderList(api: OrderAPI, append: Bool) async {
let scenicId = AppStore.shared.session.currentScenicId
let requestID = UUID()
listRequestID = requestID
let scenicId = appStore.session.currentScenicId
guard scenicId > 0 else {
finishLoading()
onShowMessage?("当前景区信息缺失")
@@ -436,6 +458,7 @@ final class OrderListViewModel {
isRefined: rTabIndex
)
}
guard listRequestID == requestID else { return }
totalCount = response.total
if append {
orderList.append(contentsOf: response.list)
@@ -447,6 +470,7 @@ final class OrderListViewModel {
} catch is CancellationError {
return
} catch {
guard listRequestID == requestID else { return }
onShowMessage?(error.localizedDescription)
}
finishLoading()
@@ -479,7 +503,7 @@ final class OrderListViewModel {
var json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else {
return nil
}
json["scenic_id"] = String(AppStore.shared.session.currentScenicId)
json["scenic_id"] = String(appStore.session.currentScenicId)
guard let updated = try? JSONSerialization.data(withJSONObject: json),
let string = String(data: updated, encoding: .utf8) else {
return nil