// // OrderDetailViewModel.swift // suixinkan // // Created by Codex on 2026/6/22. // import Foundation import Combine @MainActor /// 订单详情 ViewModel,负责加载门店订单详情并保留列表摘要兜底展示。 final class OrderDetailViewModel: ObservableObject { @Published private(set) var detail: StoreOrderDetailResponse? @Published private(set) var loading = false @Published private(set) var errorMessage: String? @Published 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 } }