Files
suixinkan_uikit/suixinkan/Features/Home/API/HomeAPI.swift
T
lujiuyinandCursor efb3925257 完善首页权限申请流程与队列播报体验。
对齐 Android 无权限强制弹窗、角色下拉与申请页交互,补充 UIButton configuration 适配,并增强景区排队 TTS 与相关单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 13:46:45 +08:00

140 lines
4.5 KiB
Swift

//
// HomeAPI.swift
// suixinkan
//
import Foundation
@MainActor
/// 首页 API,封装权限、门店与位置上报相关接口。
final class HomeAPI {
private let client: APIClient
init(client: APIClient) {
self.client = client
}
/// 拉取当前账号全部角色权限配置。
func rolePermissions() async throws -> [RolePermissionResponse] {
try await client.send(
APIRequest(method: .get, path: "/api/yf-handset-app/role-permission")
)
}
/// 拉取全部门店列表。
func storeList() async throws -> StoreListResponse {
try await client.send(
APIRequest(method: .get, path: "/api/app/store/all")
)
}
/// 拉取摄影师位置上报详情。
func locationDetail(staffId: String) async throws -> LocationDetailResponse {
try await client.send(
APIRequest(
method: .get,
path: "/api/yf-handset-app/photog/loacation/detail",
queryItems: [URLQueryItem(name: "staff_id", value: staffId)]
)
)
}
/// 上报摄影师位置。
func reportLocation(
staffId: String,
latitude: Double,
longitude: Double,
address: String,
type: Int,
scenicId: String
) async throws -> LocationReportResponse {
try await client.send(
APIRequest(
method: .post,
path: "/api/yf-handset-app/photog/loacation/report",
queryItems: [
URLQueryItem(name: "staff_id", value: staffId),
URLQueryItem(name: "latitude", value: String(latitude)),
URLQueryItem(name: "longitude", value: String(longitude)),
URLQueryItem(name: "address", value: address),
URLQueryItem(name: "type", value: String(type)),
URLQueryItem(name: "scenic_id", value: scenicId),
]
)
)
}
/// 拉取位置上报历史列表。
func locationReportList(
staffId: String,
page: Int,
pageSize: Int,
type: Int,
startDate: String?,
endDate: String?
) async throws -> LocationReportHistoryListResponse {
var queryItems = [
URLQueryItem(name: "staff_id", value: staffId),
URLQueryItem(name: "page", value: String(page)),
URLQueryItem(name: "page_size", value: String(pageSize)),
URLQueryItem(name: "type", value: String(type)),
]
if let startDate, !startDate.isEmpty {
queryItems.append(URLQueryItem(name: "start_date", value: startDate))
}
if let endDate, !endDate.isEmpty {
queryItems.append(URLQueryItem(name: "end_date", value: endDate))
}
return try await client.send(
APIRequest(
method: .get,
path: "/api/yf-handset-app/photog/loacation/list",
queryItems: queryItems
)
)
}
/// 拉取待审核权限申请列表。
func roleApplyPending() async throws -> [RoleApplyPendingResponse] {
try await client.send(
APIRequest(method: .get, path: "/api/yf-handset-app/photog/role-apply/all")
)
}
/// 拉取全部可选景区。
func scenicListAll() async throws -> ScenicListAllResponse {
try await client.send(
APIRequest(method: .get, path: "/api/yf-handset-app/photog/scenic/list-all")
)
}
/// 提交角色权限申请。
func submitRoleApply(scenicIds: [Int], roleId: Int) async throws {
let _: EmptyPayload = try await client.send(
APIRequest(
method: .post,
path: "/api/yf-handset-app/photog/role-apply/submit",
body: RoleApplySubmitRequest(scenicId: scenicIds, roleId: roleId)
)
)
}
/// 拉取景区申请待审核列表。
func scenicApplicationPending() async throws -> ScenicApplicationPendingsResponse {
try await client.send(
APIRequest(method: .get, path: "/api/yf-handset-app/photog/scenic-apply/all")
)
}
/// 提交景区申请。
func submitScenicApplication(_ request: ScenicApplicationSubmitRequest) async throws {
let _: EmptyPayload = try await client.send(
APIRequest(
method: .post,
path: "/api/yf-handset-app/photog/scenic-apply/submit",
body: request
)
)
}
}