将定金订单、历史拍摄与多行程上传接入 Orders,并以真实页面替换首页排队管理、消息中心、景区结算与提现审核占位入口。 Co-authored-by: Cursor <cursoragent@cursor.com>
77 lines
2.2 KiB
Swift
77 lines
2.2 KiB
Swift
//
|
||
// OrderDetailViewModel.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/6/22.
|
||
//
|
||
|
||
import Foundation
|
||
import Observation
|
||
|
||
@MainActor
|
||
@Observable
|
||
/// 订单详情 ViewModel,负责加载门店订单详情并保留列表摘要兜底展示。
|
||
final class OrderDetailViewModel {
|
||
private(set) var detail: StoreOrderDetailResponse?
|
||
private(set) var loading = false
|
||
private(set) var errorMessage: String?
|
||
private(set) var contextMessage: String?
|
||
|
||
/// 当前页面用于展示的订单信息,详情接口成功时优先使用详情数据。
|
||
var display: StoreOrderDetailDisplay {
|
||
if let detail {
|
||
return StoreOrderDetailDisplay(detail: detail)
|
||
}
|
||
return StoreOrderDetailDisplay(item: item)
|
||
}
|
||
|
||
/// 详情中的项目配置。
|
||
var projectInfo: StoreOrderProjectInfo? {
|
||
detail?.multiTravel?.projectInfo
|
||
}
|
||
|
||
/// 详情中的拍摄点列表。
|
||
var shootingList: [StoreOrderShootingListItem] {
|
||
detail?.multiTravel?.shootingList ?? []
|
||
}
|
||
|
||
private let item: OrderEntity
|
||
|
||
/// 初始化详情 ViewModel,并注入列表订单作为兜底数据。
|
||
init(item: OrderEntity) {
|
||
self.item = item
|
||
}
|
||
|
||
/// 加载门店订单详情,缺少门店 ID 时只保留列表摘要展示。
|
||
func load(api: OrderServing, fallbackStoreId: Int?, forceReload: Bool = false) async {
|
||
guard !loading else { return }
|
||
if forceReload {
|
||
detail = nil
|
||
} else {
|
||
guard detail == nil else { return }
|
||
}
|
||
|
||
guard let storeId = item.storeId ?? fallbackStoreId, storeId > 0 else {
|
||
contextMessage = "缺少门店上下文,当前展示订单摘要。"
|
||
return
|
||
}
|
||
|
||
loading = true
|
||
errorMessage = nil
|
||
contextMessage = nil
|
||
defer { loading = false }
|
||
|
||
do {
|
||
detail = try await api.storeOrderDetail(storeId: storeId, orderNumber: item.orderNumber)
|
||
} catch {
|
||
errorMessage = error.localizedDescription
|
||
contextMessage = "详情加载失败,当前展示订单摘要。"
|
||
}
|
||
}
|
||
|
||
/// 清理当前错误提示。
|
||
func clearError() {
|
||
errorMessage = nil
|
||
}
|
||
}
|