将扫码页提升到列表层弹出并补齐 AppDelegate.window,避免扫码时 UIKit 取主窗口崩溃;Toast 改用独立 UIWindow 显示在 sheet 之上;合作获客员支持短信验证修改分成比例,同时优化冷启动根视图创建时机并补充相关测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
2.9 KiB
Swift
84 lines
2.9 KiB
Swift
//
|
||
// BindAcquirerViewModel.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/6/29.
|
||
//
|
||
|
||
import Foundation
|
||
import Combine
|
||
|
||
/// 绑定获客员 ViewModel,负责邀请信息加载与接受绑定。
|
||
@MainActor
|
||
final class BindAcquirerViewModel: ObservableObject {
|
||
@Published var inviteInfo: SaleUserInviteInfo?
|
||
@Published var isLoading = false
|
||
@Published var isAlreadyBound = false
|
||
@Published var errorMessage: String?
|
||
@Published var commissionRateDraft = ""
|
||
|
||
private var saleUserId = 0
|
||
|
||
/// 加载获客员邀请信息。
|
||
func load(api: CooperationOrderServing, saleUserId: Int) async {
|
||
guard saleUserId > 0 else {
|
||
errorMessage = "获客员信息无效"
|
||
return
|
||
}
|
||
if self.saleUserId == saleUserId && (inviteInfo != nil || isAlreadyBound) { return }
|
||
self.saleUserId = saleUserId
|
||
isAlreadyBound = false
|
||
commissionRateDraft = ""
|
||
isLoading = true
|
||
errorMessage = nil
|
||
defer { isLoading = false }
|
||
do {
|
||
var info = try await api.saleUserInviteInfo(saleUserId: saleUserId)
|
||
if info.saleUserId <= 0 {
|
||
info = SaleUserInviteInfo(
|
||
saleUserId: saleUserId,
|
||
isBound: info.isBound,
|
||
photographerName: info.photographerName,
|
||
photographerPhone: info.photographerPhone,
|
||
salerName: info.salerName,
|
||
salerPhone: info.salerPhone,
|
||
shareCode: info.shareCode,
|
||
subtitle: info.subtitle,
|
||
title: info.title
|
||
)
|
||
}
|
||
if info.isBound {
|
||
isAlreadyBound = true
|
||
}
|
||
inviteInfo = info
|
||
} catch {
|
||
handleBindError(error.localizedDescription.isEmpty ? "获取邀请信息失败" : error.localizedDescription)
|
||
}
|
||
}
|
||
|
||
/// 更新分账比例输入,只保留数字且最多 3 位。
|
||
func updateCommissionRateDraft(_ text: String) {
|
||
commissionRateDraft = String(text.filter(\.isNumber).prefix(3))
|
||
}
|
||
|
||
/// 提交接受绑定。
|
||
func acceptBind(api: CooperationOrderServing) async throws {
|
||
guard saleUserId > 0, !isAlreadyBound else { return }
|
||
guard let commissionRate = Int(commissionRateDraft.trimmingCharacters(in: .whitespacesAndNewlines)) else {
|
||
throw CooperationOrderCommissionRateValidationError(message: "请输入分账比例")
|
||
}
|
||
guard (0...100).contains(commissionRate) else {
|
||
throw CooperationOrderCommissionRateValidationError(message: "分账比例需在0到100之间")
|
||
}
|
||
try await api.saleUserAcceptBind(saleUserId: saleUserId, commissionRate: commissionRate)
|
||
}
|
||
|
||
/// 处理绑定错误,识别已绑定状态。
|
||
func handleBindError(_ message: String) {
|
||
errorMessage = message
|
||
if message.contains("已绑定") {
|
||
isAlreadyBound = true
|
||
}
|
||
}
|
||
}
|