迁移合作订单完整能力,并统一 AppRoleCode 角色权限与首页菜单展示。

新增 CooperationOrder 模块(双 Tab 列表、获客员绑定、主 Tab 扫码)、订单来源/带客单绑定及配套 API 测试;同步引入 roleCode 权限匹配与相关单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-29 13:33:00 +08:00
parent d310d26293
commit 1970572edd
66 changed files with 4247 additions and 201 deletions

View File

@ -0,0 +1,130 @@
//
// CooperationOrderListViewModel.swift
// suixinkan
//
// Created by Codex on 2026/6/29.
//
import Foundation
import Combine
/// ViewModel线 Tab
@MainActor
final class CooperationOrderListViewModel: ObservableObject {
@Published var selectedTab = 0
@Published var searchText = ""
@Published var leads: [ReferralLead] = []
@Published var orders: [AcquisitionOrder] = []
@Published var isLoadingMore = false
@Published var canLoadMore = false
@Published private(set) var hasLoadedLeadsOnce = false
@Published private(set) var hasLoadedOrdersOnce = false
private var leadsPage = 1
private var ordersPage = 1
private var leadsTotal = 0
private var ordersTotal = 0
private var isReloading = false
private let pageSize = 10
/// Tab
func onTabSelected(_ index: Int) {
guard selectedTab != index else { return }
selectedTab = index
}
/// Tab
func refreshCurrentTab(api: CooperationOrderServing) async {
if selectedTab == 0 {
await refreshLeads(api: api)
} else {
await refreshOrders(api: api)
}
}
/// 线
func refreshLeads(api: CooperationOrderServing) async {
guard !isReloading else { return }
isReloading = true
defer { isReloading = false }
leadsPage = 1
isLoadingMore = false
await loadLeads(api: api)
}
///
func refreshOrders(api: CooperationOrderServing) async {
guard !isReloading else { return }
isReloading = true
defer { isReloading = false }
ordersPage = 1
isLoadingMore = false
await loadOrders(api: api)
}
/// Tab
func loadMore(api: CooperationOrderServing) async {
guard !isReloading, !isLoadingMore, canLoadMore else { return }
isLoadingMore = true
if selectedTab == 0 {
leadsPage += 1
await loadLeads(api: api)
} else {
ordersPage += 1
await loadOrders(api: api)
}
}
///
func searchOrders(api: CooperationOrderServing) async {
guard selectedTab == 1 else { return }
await refreshOrders(api: api)
}
private func loadLeads(api: CooperationOrderServing) async {
do {
let data = try await api.saleUserReferralLeads(page: leadsPage, pageSize: pageSize)
leadsTotal = data.total
if leadsPage == 1 {
leads = data.list
} else {
leads.append(contentsOf: data.list)
}
canLoadMore = leads.count < leadsTotal
} catch {
if leadsPage == 1, !hasLoadedLeadsOnce {
leads = []
}
}
if leadsPage == 1 {
hasLoadedLeadsOnce = true
}
isLoadingMore = false
}
private func loadOrders(api: CooperationOrderServing) async {
do {
let keyword = searchText.trimmingCharacters(in: .whitespacesAndNewlines)
let data = try await api.saleUserAcquisitionOrders(
keyword: keyword.isEmpty ? nil : keyword,
page: ordersPage,
pageSize: pageSize
)
ordersTotal = data.total
if ordersPage == 1 {
orders = data.list
} else {
orders.append(contentsOf: data.list)
}
canLoadMore = orders.count < ordersTotal
} catch {
if ordersPage == 1, !hasLoadedOrdersOnce {
orders = []
}
}
if ordersPage == 1 {
hasLoadedOrdersOnce = true
}
isLoadingMore = false
}
}