拆分宣传页视图并扩充 Mock 数据,合作订单支持获客员备注名并修复线索图片网格尺寸。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-02 17:43:04 +08:00
parent 1b1e93b9ca
commit 328c4321f4
41 changed files with 2529 additions and 1436 deletions

View File

@ -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)