import Foundation // 美团 CPS 导购。价格字段是字符串(后端原样透传),展示直接用。 struct FeedRequest: Codable { let longitude: Double let latitude: Double var page: Int = 1 var pageSize: Int = 20 } struct FeedResponse: Codable { let items: [CouponCard] let hasNext: Bool let page: Int } struct CouponCard: Codable, Identifiable, Hashable { var id: String { productViewSign } let productViewSign: String let platform: Int let bizLine: Int? let name: String let headImageUrl: String let brandName: String? let brandLogoUrl: String? let sellPrice: String let originalPrice: String let discountAmount: String let commissionRate: String let commissionAmount: String? let saleVolume: String? let poiName: String? let distanceText: String? let distanceMeters: Double? let availablePoiNum: Int? let couponNum: Int? let validDays: Int? let priceLabel: String? let rankLabel: String? let ratingLabel: String? } struct ReferralLinkRequest: Codable { let productViewSign: String var platform: Int = 1 var bizLine: Int? var linkTypeList: [Int]? } struct ReferralLinkResponse: Codable { let link: String var linkMap: [String: String] = [:] enum CodingKeys: String, CodingKey { case link case linkMap // 全局 convertFromSnakeCase 已把 link_map → linkMap } init(from decoder: Decoder) throws { let c = try decoder.container(keyedBy: CodingKeys.self) link = try c.decode(String.self, forKey: .link) linkMap = (try? c.decode([String: String].self, forKey: .linkMap)) ?? [:] } }