234 lines
6.5 KiB
TypeScript
234 lines
6.5 KiB
TypeScript
import { apiDelete, apiGet, apiPost } from '@/lib/http'
|
|
import type {
|
|
CollectLookupResponse,
|
|
UploadedFile,
|
|
WorkOrder,
|
|
WorkOrderEvent,
|
|
WorkOrderShare,
|
|
WorkerFinanceRequest,
|
|
WorkerHallOrdersResponse,
|
|
WorkerLeaderboardResponse,
|
|
WorkerListResponse,
|
|
WorkerLoginResponse,
|
|
WorkerOrderOverviewResponse,
|
|
WorkerProfileResponse,
|
|
WorkerSessionDevice,
|
|
WorkerUser,
|
|
WorkerWalletLedger,
|
|
} from '@/types/worker-platform'
|
|
import { getWorkerDeviceId } from '@/utils/worker-auth'
|
|
|
|
export function sendWorkerSmsCode(payload: { phone: string }) {
|
|
return apiPost<{ sent: boolean; expiresInSeconds: number; provider: string }>(
|
|
'/api/v1/worker/auth/sms-code',
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function registerWorker(payload: {
|
|
phone: string
|
|
code: string
|
|
password: string
|
|
displayName: string
|
|
inviteCode?: string
|
|
}) {
|
|
return apiPost<{ worker: WorkerUser; reviewRequired: boolean }>(
|
|
'/api/v1/worker/auth/register',
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function loginWorker(payload: { username: string; password: string }) {
|
|
const userAgent = navigator.userAgent
|
|
const isMobile = /Android|iPhone|iPad|iPod|Mobile/i.test(userAgent)
|
|
return apiPost<WorkerLoginResponse>('/api/v1/worker/auth/login', {
|
|
...payload,
|
|
deviceId: getWorkerDeviceId(),
|
|
deviceType: isMobile ? 'mobile' : 'pc',
|
|
deviceName: isMobile ? '手机浏览器' : 'PC 浏览器',
|
|
})
|
|
}
|
|
|
|
export function fetchWorkerSessions() {
|
|
return apiGet<{ maxDevices: number; items: WorkerSessionDevice[] }>('/api/v1/worker/auth/devices')
|
|
}
|
|
|
|
export function deleteWorkerSession(sessionId: string) {
|
|
return apiDelete<{ deleted: boolean }>(`/api/v1/worker/auth/devices/${sessionId}`)
|
|
}
|
|
|
|
export function manageWorkerSessions(payload: { username: string; password: string }) {
|
|
return apiPost<{ maxDevices: number; items: WorkerSessionDevice[] }>(
|
|
'/api/v1/worker/auth/devices/manage/list',
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function deleteWorkerSessionWithCredentials(payload: {
|
|
username: string
|
|
password: string
|
|
sessionId: string
|
|
}) {
|
|
return apiPost<{ deleted: boolean }>('/api/v1/worker/auth/devices/manage/delete', payload)
|
|
}
|
|
|
|
export function fetchWorkerSession() {
|
|
return apiGet<{
|
|
authenticated: boolean
|
|
expiresAt: string
|
|
worker: WorkerUser
|
|
}>('/api/v1/worker/auth/session')
|
|
}
|
|
|
|
export function logoutWorker() {
|
|
return apiPost<{ success: boolean }>('/api/v1/worker/auth/logout')
|
|
}
|
|
|
|
export function fetchWorkerProfile() {
|
|
return apiGet<WorkerProfileResponse>('/api/v1/worker/profile')
|
|
}
|
|
|
|
export function fetchWorkerWalletLedgers(params?: Record<string, unknown>) {
|
|
return apiGet<WorkerListResponse<WorkerWalletLedger>>(
|
|
'/api/v1/worker/profile/wallet-ledgers',
|
|
params,
|
|
)
|
|
}
|
|
|
|
export function fetchWorkerFinanceRequests(params?: Record<string, unknown>) {
|
|
return apiGet<WorkerListResponse<WorkerFinanceRequest>>(
|
|
'/api/v1/worker/profile/finance-requests',
|
|
params,
|
|
)
|
|
}
|
|
|
|
export function createWorkerRechargeRequest(payload: {
|
|
amount?: number
|
|
note?: string
|
|
paidAt?: string
|
|
proofFiles?: UploadedFile[]
|
|
}) {
|
|
return apiPost<{ request: WorkerFinanceRequest }>(
|
|
'/api/v1/worker/profile/recharge-requests',
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function createWorkerWithdrawRequest(payload: {
|
|
amount?: number
|
|
accountChannel: string
|
|
note?: string
|
|
}) {
|
|
return apiPost<{ request: WorkerFinanceRequest }>(
|
|
'/api/v1/worker/profile/withdraw-requests',
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function createWorkerWithdrawalAccount(payload: {
|
|
accountChannel: string
|
|
accountName: string
|
|
accountNo?: string
|
|
wechatQrCodeImages?: UploadedFile[]
|
|
}) {
|
|
return apiPost('/api/v1/worker/profile/withdrawal-account', payload)
|
|
}
|
|
|
|
export function changeWorkerPassword(payload: { currentPassword: string; newPassword: string }) {
|
|
return apiPost<{ worker: WorkerUser; reloginRequired: boolean }>(
|
|
'/api/v1/worker/profile/change-password',
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function fetchWorkerHallOrders(params?: Record<string, unknown>) {
|
|
return apiGet<WorkerHallOrdersResponse>('/api/v1/worker/hall/orders', params)
|
|
}
|
|
|
|
export function fetchWorkerHallLeaderboard() {
|
|
return apiGet<WorkerLeaderboardResponse>('/api/v1/worker/hall/leaderboard')
|
|
}
|
|
|
|
export function grabWorkerOrder(workOrderId: number) {
|
|
return apiPost<{ order: WorkOrder }>(`/api/v1/worker/hall/orders/${workOrderId}/grab`)
|
|
}
|
|
|
|
export function joinWorkerSharingOrder(workOrderId: number, payload: { quantity: number }) {
|
|
return apiPost<{ share: WorkOrderShare }>(
|
|
`/api/v1/worker/hall/orders/${workOrderId}/join-sharing`,
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function fetchWorkerMyOrders(params?: Record<string, unknown>) {
|
|
return apiGet<WorkerListResponse<WorkOrder>>('/api/v1/worker/orders', params)
|
|
}
|
|
|
|
export function fetchWorkerMyOrderOverview() {
|
|
return apiGet<WorkerOrderOverviewResponse>('/api/v1/worker/orders/overview')
|
|
}
|
|
|
|
export function fetchWorkerMyOrderEvents(workOrderId: number) {
|
|
return apiGet<{ items: WorkOrderEvent[] }>(`/api/v1/worker/orders/${workOrderId}/events`)
|
|
}
|
|
|
|
export function markWorkerOrderRead(workOrderId: number) {
|
|
return apiPost<{ viewedAt: string; isUnread: false }>(`/api/v1/worker/orders/${workOrderId}/read`)
|
|
}
|
|
|
|
export function saveWorkerOrderNote(workOrderId: number, note: string) {
|
|
return apiPost<{ order: WorkOrder }>(`/api/v1/worker/orders/${workOrderId}/note`, { note })
|
|
}
|
|
|
|
export function submitWorkerAcceptance(
|
|
workOrderId: number,
|
|
payload: { note?: string; imageUrls?: string[]; files?: UploadedFile[] },
|
|
) {
|
|
return apiPost<{ order: WorkOrder }>(
|
|
`/api/v1/worker/orders/${workOrderId}/submit-acceptance`,
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function remindWorkerAcceptance(workOrderId: number) {
|
|
return apiPost<{ reminderCount: number; nextRemindAt: string }>(
|
|
`/api/v1/worker/orders/${workOrderId}/remind-acceptance`,
|
|
)
|
|
}
|
|
|
|
export function saveWorkerAcceptanceDraft(
|
|
workOrderId: number,
|
|
payload: { note?: string; imageUrls?: string[]; files?: UploadedFile[] },
|
|
) {
|
|
return apiPost<{ order: WorkOrder }>(
|
|
`/api/v1/worker/orders/${workOrderId}/acceptance-draft`,
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function supplementWorkerAcceptedOrderEvidence(
|
|
workOrderId: number,
|
|
payload: { files: UploadedFile[] },
|
|
) {
|
|
return apiPost<{ order: WorkOrder }>(
|
|
`/api/v1/worker/orders/${workOrderId}/acceptance-evidence`,
|
|
payload,
|
|
)
|
|
}
|
|
|
|
export function lookupCollectOrder(orderNo: string) {
|
|
return apiPost<CollectLookupResponse>('/api/v1/collect/lookup', { orderNo })
|
|
}
|
|
|
|
export function submitCollectOrder(payload: {
|
|
orderNo: string
|
|
workOrderId?: number
|
|
fields: Record<string, string>
|
|
screenshots?: UploadedFile[]
|
|
}) {
|
|
return apiPost<{ complete: boolean; order: Record<string, unknown> }>(
|
|
'/api/v1/collect/submit',
|
|
payload,
|
|
)
|
|
}
|