新增门店订单与核销管理列表,对齐 Android 订单能力并完善账号级缓存。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-29 14:46:10 +08:00
parent c4de3d17d0
commit 08492df6ce
51 changed files with 3668 additions and 102 deletions

View File

@ -36,8 +36,21 @@ final class OrdersViewModel: ObservableObject {
@Published var orderSourceSelections: [String: OrderSourceSelection] = [:]
@Published var loadingOrderSourceLeadsFor: String?
@Published var refundingOrder: OrderEntity?
@Published var sendGiftContext: SendGiftContext?
private var loadingOrderSourcePeople = false
/// /
struct SendGiftContext: Equatable, Identifiable {
var id: String { orderNumber }
let orderNumber: String
let nowPhotoNum: Int
let nowVideoNum: Int
var sendPhotoNum: Int
var sendVideoNum: Int
}
static let orderTypePhotographerFollow = 11
static let orderTypePhotographerFollowOfflineScan = 14
@ -125,7 +138,17 @@ final class OrdersViewModel: ObservableObject {
if showLoading { loading = true }
defer { if showLoading { loading = false } }
let result = try await api.writeOffList(scenicId: scenicId, storeId: storeId, page: 1, pageSize: pageSize)
let result = try await api.writeOffList(
scenicId: scenicId,
storeId: storeId,
page: 1,
pageSize: pageSize,
orderStatus: nil,
orderVerifyStatus: nil,
startTime: nil,
endTime: nil,
userPhone: nil
)
writeOffOrders = result.list
writeOffTotal = result.total
writeOffPage = 1
@ -139,7 +162,17 @@ final class OrdersViewModel: ObservableObject {
defer { loadingMore = false }
let nextPage = writeOffPage + 1
let result = try await api.writeOffList(scenicId: scenicId, storeId: storeId, page: nextPage, pageSize: pageSize)
let result = try await api.writeOffList(
scenicId: scenicId,
storeId: storeId,
page: nextPage,
pageSize: pageSize,
orderStatus: nil,
orderVerifyStatus: nil,
startTime: nil,
endTime: nil,
userPhone: nil
)
writeOffOrders.append(contentsOf: result.list)
writeOffTotal = result.total
writeOffPage = nextPage
@ -158,13 +191,82 @@ final class OrdersViewModel: ObservableObject {
}
try await api.writeOff(orderNumber: orderNumber)
let refreshed = try await api.writeOffList(scenicId: scenicId, storeId: storeId, page: 1, pageSize: pageSize)
let refreshed = try await api.writeOffList(
scenicId: scenicId,
storeId: storeId,
page: 1,
pageSize: pageSize,
orderStatus: nil,
orderVerifyStatus: nil,
startTime: nil,
endTime: nil,
userPhone: nil
)
writeOffOrders = refreshed.list
writeOffTotal = refreshed.total
writeOffPage = 1
writeOffHasMore = writeOffOrders.count < refreshed.total && !refreshed.list.isEmpty
}
/// 退
func shouldShowRefundButton(order: OrderEntity, appRole: AppRoleCode?) -> Bool {
guard !Self.isScenicAdminReadOnly(appRole: appRole) else { return false }
return (order.orderStatus == 18 || order.orderStatus == 30) && order.orderType != 19
}
///
func shouldShowVerifyButton(order: OrderEntity, appRole: AppRoleCode?) -> Bool {
guard !Self.isScenicAdminReadOnly(appRole: appRole) else { return false }
if order.orderType == 19 { return true }
guard let photoTravel = order.photoTravel else { return false }
return photoTravel.needCheckIn && order.orderStatus != 30
}
///
func updateRefinedChoice(api: OrderServing, orderNumber: String, isRefined: Int) async throws {
try await api.updateRefinedChoice(orderNumber: orderNumber, isRefined: isRefined)
if let index = storeOrders.firstIndex(where: { $0.orderNumber == orderNumber }) {
storeOrders[index].isRefined = isRefined
}
}
///
func cancelOrder(api: OrderServing, scenicId: Int?, appRole: AppRoleCode?, orderNumber: String) async throws {
try await api.cancelOrder(orderNumber: orderNumber)
try await reloadStoreOrders(api: api, scenicId: scenicId, appRole: appRole, showLoading: false)
}
/// /
func prepareSendGift(for order: OrderEntity) {
let photoTravel = order.photoTravel
sendGiftContext = SendGiftContext(
orderNumber: order.orderNumber,
nowPhotoNum: photoTravel?.orderPhotoNum ?? 0,
nowVideoNum: photoTravel?.orderVideoNum ?? 0,
sendPhotoNum: photoTravel?.retouchGiftPhotoNum ?? 0,
sendVideoNum: photoTravel?.retouchGiftVideoNum ?? 0
)
}
/// /
func submitSendGift(
api: OrderServing,
scenicId: Int?,
appRole: AppRoleCode?,
photoNum: Int,
videoNum: Int
) async throws {
guard let context = sendGiftContext else { return }
try await api.sendGift(orderNumber: context.orderNumber, photoNum: photoNum, videoNum: videoNum)
sendGiftContext = nil
try await reloadStoreOrders(api: api, scenicId: scenicId, appRole: appRole, showLoading: false)
}
///
var currentFilterTitle: String {
OrderFilters.statusFilters.first(where: { $0.id == selectedStatus })?.title ?? "全部"
}
///
func shouldShowOrderSource(order: OrderEntity, appRole: AppRoleCode?) -> Bool {
guard !Self.isScenicAdminReadOnly(appRole: appRole) else { return false }