拆分宣传页视图并扩充 Mock 数据,合作订单支持获客员备注名并修复线索图片网格尺寸。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -13,6 +13,11 @@ extension String {
|
||||
let trimmed = trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
return trimmed.isEmpty ? fallback : trimmed
|
||||
}
|
||||
|
||||
/// 获客员展示名:优先备注名,其次主名称,最后回退名称。
|
||||
func saleUserDisplayName(primaryName: String, fallbackName: String = "") -> String {
|
||||
cooperationNonEmptyOrDefault(primaryName.cooperationNonEmptyOrDefault(fallbackName))
|
||||
}
|
||||
}
|
||||
|
||||
/// 带客单状态更新请求体。
|
||||
@ -20,6 +25,17 @@ struct ReferralOrderStatusUpdateRequest: Encodable {
|
||||
let status: Int
|
||||
}
|
||||
|
||||
/// 合作获客员备注名更新请求体。
|
||||
struct SaleUserUpdateRemarkRequest: Encodable {
|
||||
let saleUserId: Int
|
||||
let photogRemarkName: String
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case saleUserId = "sale_user_id"
|
||||
case photogRemarkName = "photog_remark_name"
|
||||
}
|
||||
}
|
||||
|
||||
/// 合作获客员列表响应。
|
||||
struct CooperativeSalerListPayload: Decodable {
|
||||
let total: Int
|
||||
@ -49,6 +65,7 @@ struct CooperativeSaler: Decodable, Identifiable {
|
||||
let bindingId: Int
|
||||
let name: String
|
||||
let salerName: String
|
||||
let photogRemarkName: String
|
||||
let phone: String
|
||||
let phoneMasked: String
|
||||
let salerPhone: String
|
||||
@ -62,7 +79,7 @@ struct CooperativeSaler: Decodable, Identifiable {
|
||||
var displayId: Int { saleUserId }
|
||||
|
||||
var displayName: String {
|
||||
name.cooperationNonEmptyOrDefault(salerName)
|
||||
photogRemarkName.saleUserDisplayName(primaryName: name, fallbackName: salerName)
|
||||
}
|
||||
|
||||
var displayPhone: String {
|
||||
@ -78,6 +95,7 @@ struct CooperativeSaler: Decodable, Identifiable {
|
||||
case bindingId = "binding_id"
|
||||
case name
|
||||
case salerName = "saler_name"
|
||||
case photogRemarkName = "photog_remark_name"
|
||||
case phone
|
||||
case phoneMasked = "phone_masked"
|
||||
case salerPhone = "saler_phone"
|
||||
@ -93,6 +111,7 @@ struct CooperativeSaler: Decodable, Identifiable {
|
||||
bindingId = try container.decodeLossyInt(forKey: .bindingId) ?? 0
|
||||
name = try container.decodeLossyString(forKey: .name)
|
||||
salerName = try container.decodeLossyString(forKey: .salerName)
|
||||
photogRemarkName = try container.decodeLossyString(forKey: .photogRemarkName)
|
||||
phone = try container.decodeLossyString(forKey: .phone)
|
||||
phoneMasked = try container.decodeLossyString(forKey: .phoneMasked)
|
||||
salerPhone = try container.decodeLossyString(forKey: .salerPhone)
|
||||
@ -101,6 +120,52 @@ struct CooperativeSaler: Decodable, Identifiable {
|
||||
bindTime = try container.decodeLossyString(forKey: .bindTime)
|
||||
boundAt = try container.decodeLossyString(forKey: .boundAt)
|
||||
}
|
||||
|
||||
/// 返回更新了备注名的副本,用于本地列表即时刷新。
|
||||
func withPhotogRemarkName(_ remark: String) -> CooperativeSaler {
|
||||
CooperativeSaler(
|
||||
saleUserId: saleUserId,
|
||||
bindingId: bindingId,
|
||||
name: name,
|
||||
salerName: salerName,
|
||||
photogRemarkName: remark,
|
||||
phone: phone,
|
||||
phoneMasked: phoneMasked,
|
||||
salerPhone: salerPhone,
|
||||
shareCode: shareCode,
|
||||
storeId: storeId,
|
||||
bindTime: bindTime,
|
||||
boundAt: boundAt
|
||||
)
|
||||
}
|
||||
|
||||
init(
|
||||
saleUserId: Int,
|
||||
bindingId: Int,
|
||||
name: String,
|
||||
salerName: String,
|
||||
photogRemarkName: String,
|
||||
phone: String,
|
||||
phoneMasked: String,
|
||||
salerPhone: String,
|
||||
shareCode: String,
|
||||
storeId: Int,
|
||||
bindTime: String,
|
||||
boundAt: String
|
||||
) {
|
||||
self.saleUserId = saleUserId
|
||||
self.bindingId = bindingId
|
||||
self.name = name
|
||||
self.salerName = salerName
|
||||
self.photogRemarkName = photogRemarkName
|
||||
self.phone = phone
|
||||
self.phoneMasked = phoneMasked
|
||||
self.salerPhone = salerPhone
|
||||
self.shareCode = shareCode
|
||||
self.storeId = storeId
|
||||
self.bindTime = bindTime
|
||||
self.boundAt = boundAt
|
||||
}
|
||||
}
|
||||
|
||||
/// 获客员邀请信息,用于绑定确认页展示。
|
||||
@ -231,6 +296,7 @@ struct AcquisitionOrder: Decodable, Identifiable {
|
||||
let orderStatusName: String
|
||||
let status: String
|
||||
let saleUserName: String
|
||||
let photogRemarkName: String
|
||||
let partnerName: String
|
||||
let partnerRole: String
|
||||
let remark: String
|
||||
@ -249,7 +315,8 @@ struct AcquisitionOrder: Decodable, Identifiable {
|
||||
}
|
||||
|
||||
var displayPartner: String {
|
||||
if !saleUserName.isEmpty { return saleUserName }
|
||||
let salerDisplayName = photogRemarkName.saleUserDisplayName(primaryName: saleUserName)
|
||||
if !salerDisplayName.isEmpty { return salerDisplayName }
|
||||
if !partnerName.isEmpty { return partnerName }
|
||||
return ""
|
||||
}
|
||||
@ -270,6 +337,7 @@ struct AcquisitionOrder: Decodable, Identifiable {
|
||||
case orderStatusName = "order_status_name"
|
||||
case status
|
||||
case saleUserName = "sale_user_name"
|
||||
case photogRemarkName = "photog_remark_name"
|
||||
case partnerName = "partner_name"
|
||||
case partnerRole = "partner_role"
|
||||
case remark
|
||||
@ -293,6 +361,7 @@ struct AcquisitionOrder: Decodable, Identifiable {
|
||||
orderStatusName = try container.decodeLossyString(forKey: .orderStatusName)
|
||||
status = try container.decodeLossyString(forKey: .status)
|
||||
saleUserName = try container.decodeLossyString(forKey: .saleUserName)
|
||||
photogRemarkName = try container.decodeLossyString(forKey: .photogRemarkName)
|
||||
partnerName = try container.decodeLossyString(forKey: .partnerName)
|
||||
partnerRole = try container.decodeLossyString(forKey: .partnerRole)
|
||||
remark = try container.decodeLossyString(forKey: .remark)
|
||||
@ -304,11 +373,17 @@ struct AcquisitionOrder: Decodable, Identifiable {
|
||||
struct ReferralOrderSaler: Decodable {
|
||||
let saleUserId: Int
|
||||
let salerName: String
|
||||
let photogRemarkName: String
|
||||
let salerPhone: String
|
||||
|
||||
var displayName: String {
|
||||
photogRemarkName.saleUserDisplayName(primaryName: salerName)
|
||||
}
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case saleUserId = "sale_user_id"
|
||||
case salerName = "saler_name"
|
||||
case photogRemarkName = "photog_remark_name"
|
||||
case salerPhone = "saler_phone"
|
||||
}
|
||||
|
||||
@ -316,6 +391,7 @@ struct ReferralOrderSaler: Decodable {
|
||||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||
saleUserId = try container.decodeLossyInt(forKey: .saleUserId) ?? 0
|
||||
salerName = try container.decodeLossyString(forKey: .salerName)
|
||||
photogRemarkName = try container.decodeLossyString(forKey: .photogRemarkName)
|
||||
salerPhone = try container.decodeLossyString(forKey: .salerPhone)
|
||||
}
|
||||
}
|
||||
@ -394,6 +470,7 @@ struct BoundReferralOrder: Decodable, Equatable, Hashable {
|
||||
let orderNo: String
|
||||
let saleUserId: Int
|
||||
let salerName: String
|
||||
let photogRemarkName: String
|
||||
let salerPhone: String
|
||||
let displayText: String
|
||||
let userMobile: String
|
||||
@ -405,11 +482,16 @@ struct BoundReferralOrder: Decodable, Equatable, Hashable {
|
||||
let statusLabel: String
|
||||
let createdAt: String
|
||||
|
||||
var displaySalerName: String {
|
||||
photogRemarkName.saleUserDisplayName(primaryName: salerName)
|
||||
}
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case id
|
||||
case orderNo = "order_no"
|
||||
case saleUserId = "sale_user_id"
|
||||
case salerName = "saler_name"
|
||||
case photogRemarkName = "photog_remark_name"
|
||||
case salerPhone = "saler_phone"
|
||||
case displayText = "display_text"
|
||||
case userMobile = "user_mobile"
|
||||
@ -428,6 +510,7 @@ struct BoundReferralOrder: Decodable, Equatable, Hashable {
|
||||
orderNo = try container.decodeLossyString(forKey: .orderNo)
|
||||
saleUserId = try container.decodeLossyInt(forKey: .saleUserId) ?? 0
|
||||
salerName = try container.decodeLossyString(forKey: .salerName)
|
||||
photogRemarkName = try container.decodeLossyString(forKey: .photogRemarkName)
|
||||
salerPhone = try container.decodeLossyString(forKey: .salerPhone)
|
||||
displayText = try container.decodeLossyString(forKey: .displayText)
|
||||
userMobile = try container.decodeLossyString(forKey: .userMobile)
|
||||
|
||||
Reference in New Issue
Block a user