新增门店订单与核销管理列表,对齐 Android 订单能力并完善账号级缓存。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user