迁移合作订单完整能力,并统一 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,159 @@
//
// CooperationOrderAPI.swift
// suixinkan
//
// Created by Codex on 2026/6/29.
//
import Foundation
@MainActor
/// 便
protocol CooperationOrderServing {
///
func cooperativeSalers(storeId: Int?, page: Int, pageSize: Int) async throws -> CooperativeSalerListPayload
///
func saleUserInviteInfo(saleUserId: Int) async throws -> SaleUserInviteInfo
///
func saleUserAcceptBind(saleUserId: Int) async throws
/// 线
func saleUserReferralLeads(page: Int, pageSize: Int) async throws -> ListPayload<ReferralLead>
///
func saleUserAcquisitionOrders(keyword: String?, page: Int, pageSize: Int) async throws -> ListPayload<AcquisitionOrder>
///
func saleUserReferralOrders(saleUserId: Int, page: Int, pageSize: Int) async throws -> ReferralOrderListPayload
///
func saleUserBindReferralOrder(orderNumber: String, referralOrderNo: String) async throws
/// 退 status=3
func saleUserUpdateReferralOrderStatus(id: Int, status: Int) async throws
}
@MainActor
/// API线
final class CooperationOrderAPI: CooperationOrderServing {
private let client: APIClient
/// API
init(client: APIClient) {
self.client = client
}
///
func cooperativeSalers(storeId: Int? = nil, page: Int = 1, pageSize: Int = 10) async throws -> CooperativeSalerListPayload {
var query = [
URLQueryItem(name: "page", value: "\(max(page, 1))"),
URLQueryItem(name: "page_size", value: "\(max(pageSize, 1))")
]
if let storeId, storeId > 0 {
query.append(URLQueryItem(name: "store_id", value: "\(storeId)"))
}
return try await client.send(
APIRequest(
method: .get,
path: "/api/yf-handset-app/photog/cooperative-salers",
queryItems: query
)
)
}
///
func saleUserInviteInfo(saleUserId: Int) async throws -> SaleUserInviteInfo {
try await client.send(
APIRequest(
method: .get,
path: "/api/yf-handset-app/photog/sale-user/invite-info",
queryItems: [URLQueryItem(name: "sale_user_id", value: "\(saleUserId)")]
)
)
}
///
func saleUserAcceptBind(saleUserId: Int) async throws {
let _: EmptyPayload = try await client.send(
APIRequest(
method: .post,
path: "/api/yf-handset-app/photog/sale-user/accept-bind",
queryItems: [URLQueryItem(name: "sale_user_id", value: "\(saleUserId)")]
)
)
}
/// 线
func saleUserReferralLeads(page: Int = 1, pageSize: Int = 10) async throws -> ListPayload<ReferralLead> {
try await client.send(
APIRequest(
method: .get,
path: "/api/yf-handset-app/photog/sale-user/referral-leads",
queryItems: [
URLQueryItem(name: "page", value: "\(max(page, 1))"),
URLQueryItem(name: "page_size", value: "\(max(pageSize, 1))")
]
)
)
}
///
func saleUserAcquisitionOrders(keyword: String? = nil, page: Int = 1, pageSize: Int = 10) async throws -> ListPayload<AcquisitionOrder> {
var query = [
URLQueryItem(name: "page", value: "\(max(page, 1))"),
URLQueryItem(name: "page_size", value: "\(max(pageSize, 1))")
]
if let keyword, !keyword.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
query.append(URLQueryItem(name: "keyword", value: keyword))
}
return try await client.send(
APIRequest(
method: .get,
path: "/api/yf-handset-app/photog/sale-user/acquisition-orders",
queryItems: query
)
)
}
///
func saleUserReferralOrders(saleUserId: Int, page: Int = 1, pageSize: Int = 10) async throws -> ReferralOrderListPayload {
try await client.send(
APIRequest(
method: .get,
path: "/api/yf-handset-app/photog/sale-user/referral-orders",
queryItems: [
URLQueryItem(name: "sale_user_id", value: "\(saleUserId)"),
URLQueryItem(name: "page", value: "\(max(page, 1))"),
URLQueryItem(name: "page_size", value: "\(max(pageSize, 1))")
]
)
)
}
///
func saleUserBindReferralOrder(orderNumber: String, referralOrderNo: String) async throws {
let _: EmptyPayload = try await client.send(
APIRequest(
method: .post,
path: "/api/yf-handset-app/photog/sale-user/bind-referral-order",
queryItems: [
URLQueryItem(name: "order_number", value: orderNumber),
URLQueryItem(name: "referral_order_no", value: referralOrderNo)
]
)
)
}
///
func saleUserUpdateReferralOrderStatus(id: Int, status: Int) async throws {
let _: EmptyPayload = try await client.send(
APIRequest(
method: .post,
path: "/api/yf-handset-app/photog/sale-user/referral-orders/\(id)/status",
body: ReferralOrderStatusUpdateRequest(status: status)
)
)
}
}