新增门店订单与核销管理列表,对齐 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

@ -29,6 +29,29 @@ enum OrderFilters {
.init(id: -1, title: "需要精修"),
.init(id: -2, title: "无需精修")
]
/// Tab
static let storeAdminStatusFilters: [OrderStatusFilter] = [
.init(id: 0, title: "全部"),
.init(id: 18, title: "已付定金"),
.init(id: 30, title: "已完成"),
.init(id: 50, title: "已退款")
]
/// Tab
static let writeOffStatusFilters: [OrderStatusFilter] = [
.init(id: 0, title: "全部"),
.init(id: 18, title: "已支付"),
.init(id: 30, title: "已完成"),
.init(id: 1, title: "已核销"),
.init(id: 2, title: "未核销")
]
}
/// Android StoreOrderItem
enum StoreOrderType {
static let offlineProduct = 4
static let multiTravelShoot = 19
}
///
@ -59,8 +82,9 @@ struct OrderEntity: Decodable, Identifiable, Equatable, Hashable {
let depositPayTime: String
let createdAt: String
let photoTravel: OrderPhotoTravel?
let multiTravel: OrderListMultiTravel?
let isNeedEdit: Bool
let isRefined: Int
var isRefined: Int
let canBindReferral: Int
let showOrderSource: Int
let referralOrderNo: String
@ -92,6 +116,7 @@ struct OrderEntity: Decodable, Identifiable, Equatable, Hashable {
case depositPayTime = "deposit_pay_time"
case createdAt = "created_at"
case photoTravel = "photo_travel"
case multiTravel = "multi_travel"
case isNeedEdit
case isRefined = "is_refined"
case canBindReferral = "can_bind_referral"
@ -128,6 +153,7 @@ struct OrderEntity: Decodable, Identifiable, Equatable, Hashable {
depositPayTime = try container.decodeLossyString(forKey: .depositPayTime)
createdAt = try container.decodeLossyString(forKey: .createdAt)
photoTravel = try container.decodeIfPresent(OrderPhotoTravel.self, forKey: .photoTravel)
multiTravel = try container.decodeIfPresent(OrderListMultiTravel.self, forKey: .multiTravel)
isNeedEdit = try container.decodeLossyBool(forKey: .isNeedEdit) ?? true
isRefined = try container.decodeLossyInt(forKey: .isRefined) ?? 0
canBindReferral = try container.decodeLossyInt(forKey: .canBindReferral) ?? 0
@ -145,6 +171,10 @@ struct OrderPhotoTravel: Decodable, Equatable, Hashable {
let checkInTime: String
let retouchGiftPhotoNum: Int
let retouchGiftVideoNum: Int
let canCancelOrder: Bool
let needCheckIn: Bool
let canGiftRetouch: Bool
let retouchGiftTime: String
enum CodingKeys: String, CodingKey {
case orderPhotoNum = "order_photo_num"
@ -152,6 +182,10 @@ struct OrderPhotoTravel: Decodable, Equatable, Hashable {
case checkInTime = "check_in_time"
case retouchGiftPhotoNum = "retouch_gift_photo_num"
case retouchGiftVideoNum = "retouch_gift_video_num"
case canCancelOrder = "can_cancel_order"
case needCheckIn = "need_check_in"
case canGiftRetouch = "can_gift_retouch"
case retouchGiftTime = "retouch_gift_time"
}
///
@ -162,6 +196,87 @@ struct OrderPhotoTravel: Decodable, Equatable, Hashable {
checkInTime = try container.decodeLossyString(forKey: .checkInTime)
retouchGiftPhotoNum = try container.decodeLossyInt(forKey: .retouchGiftPhotoNum) ?? 0
retouchGiftVideoNum = try container.decodeLossyInt(forKey: .retouchGiftVideoNum) ?? 0
canCancelOrder = try container.decodeLossyBool(forKey: .canCancelOrder) ?? false
needCheckIn = try container.decodeLossyBool(forKey: .needCheckIn) ?? false
canGiftRetouch = try container.decodeLossyBool(forKey: .canGiftRetouch) ?? false
retouchGiftTime = try container.decodeLossyString(forKey: .retouchGiftTime)
}
}
///
struct OrderListMultiTravel: Decodable, Equatable, Hashable {
let materialList: [OrderMediaFile]
enum CodingKeys: String, CodingKey {
case materialList = "material_list"
}
///
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
materialList = try container.decodeIfPresent([OrderMediaFile].self, forKey: .materialList) ?? []
}
}
/// Tab Android StoreOrderItem
struct StoreOrderListItem: Decodable, Identifiable, Equatable, Hashable {
var id: String { orderNumber }
let orderNumber: String
let orderType: Int
let orderTypeLabel: String
let createdAt: String
let orderStatus: Int
let orderStatusName: String
let actualPayAmount: String
let actualRefundAmount: String
let payTypeName: String
let payTime: String
let completeTime: String
let userId: Int
let phone: String
let projectId: Int
let projectName: String
let remark: String
enum CodingKeys: String, CodingKey {
case orderNumber = "order_number"
case orderType = "order_type"
case orderTypeLabel = "order_type_label"
case createdAt = "created_at"
case orderStatus = "order_status"
case orderStatusName = "order_status_name"
case actualPayAmount = "actual_pay_amount"
case actualRefundAmount = "actual_refund_amount"
case payTypeName = "pay_type_name"
case payTime = "pay_time"
case completeTime = "complete_time"
case userId = "user_id"
case phone
case projectId = "project_id"
case projectName = "project_name"
case remark
}
///
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
orderNumber = try container.decodeLossyString(forKey: .orderNumber)
orderType = try container.decodeLossyInt(forKey: .orderType) ?? 0
orderTypeLabel = try container.decodeLossyString(forKey: .orderTypeLabel)
createdAt = try container.decodeLossyString(forKey: .createdAt)
orderStatus = try container.decodeLossyInt(forKey: .orderStatus) ?? 0
orderStatusName = try container.decodeLossyString(forKey: .orderStatusName)
actualPayAmount = try container.decodeLossyString(forKey: .actualPayAmount)
actualRefundAmount = try container.decodeLossyString(forKey: .actualRefundAmount)
payTypeName = try container.decodeLossyString(forKey: .payTypeName)
payTime = try container.decodeLossyString(forKey: .payTime)
completeTime = try container.decodeLossyString(forKey: .completeTime)
userId = try container.decodeLossyInt(forKey: .userId) ?? 0
phone = try container.decodeLossyString(forKey: .phone)
projectId = try container.decodeLossyInt(forKey: .projectId) ?? 0
projectName = try container.decodeLossyString(forKey: .projectName)
remark = try container.decodeLossyString(forKey: .remark)
}
}
@ -283,6 +398,56 @@ enum OrderRefundMode: Int, CaseIterable, Identifiable, Hashable {
}
}
///
struct CancelOrderRequest: Encodable, Equatable {
let orderNumber: String
enum CodingKeys: String, CodingKey {
case orderNumber = "order_number"
}
}
/// /
struct SendGiftRequest: Encodable, Equatable {
let orderNumber: String
let photoNum: Int
let videoNum: Int
enum CodingKeys: String, CodingKey {
case orderNumber = "order_number"
case photoNum = "photo_num"
case videoNum = "video_num "
}
}
///
struct UpdateRefinedRequest: Encodable, Equatable {
let orderNumber: String
let isRefined: Int
enum CodingKeys: String, CodingKey {
case orderNumber = "order_number"
case isRefined = "is_refined"
}
}
/// 退
struct StoreOrderRefundRequest: Encodable, Equatable {
let storeId: Int
let orderNumber: String
let refundType: Int
let refundAmount: String
let refundReason: String
enum CodingKeys: String, CodingKey {
case storeId = "store_id"
case orderNumber = "order_number"
case refundType = "refund_type"
case refundAmount = "refund_amount"
case refundReason = "refund_reason"
}
}
/// 退
struct OrderRefundRequest: Encodable, Equatable {
let orderNumber: String
@ -305,6 +470,7 @@ enum OrdersRoute: Hashable {
case historicalShooting(orderNumber: String)
case multiTravelTaskUpload(orderNumber: String)
case orderTrailer(orderNumber: String, title: String)
case writeOffList
}
///