import { overseasHttp } from '@/shared/api/overseasHttp' import { unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http' import type { MasterDataStatus, MonthlyExchangeRate, OverseasWarehouseQuote, OverseasWarehouseQuoteDetail, PartnerWarehouseOption, VehicleDetail, VehicleOwnership, VehicleRegion, VehicleStatus, } from '../types' export interface PageResult { records: T[]; page: number; size: number; total: number; pages: number } type PagePayload = Omit, 'page' | 'size' | 'total' | 'pages'> & { page: number | string; size: number | string; total: number | string; pages: number | string } const base = '/platform/v1/last-leg/master-data' function page(value: PagePayload): PageResult { return { ...value, page: Number(value.page), size: Number(value.size), total: Number(value.total), pages: Number(value.pages) } } async function getPage(path: string, params: object) { return page(unwrapApiResponse(await overseasHttp.get>, ApiEnvelope>>(path, { params }))) } async function download(path: string, params: object) { return overseasHttp.get(path, { params, responseType: 'blob' }) } export interface QuoteQuery { page: number; size: number; keyword?: string; warehouseId?: string; providerName?: string; currency?: string; status?: MasterDataStatus } export type QuoteSave = Pick & { warehouseId?: string; versionCode?: string; recordVersion?: number } export const listQuotes = (query: QuoteQuery) => getPage(`${base}/overseas-quotes`, query) export async function getQuote(id: string) { return unwrapApiResponse(await overseasHttp.get, ApiEnvelope>(`${base}/overseas-quotes/${encodeURIComponent(id)}`)) } export async function listQuoteWarehouseOptions() { return unwrapApiResponse(await overseasHttp.get, ApiEnvelope>(`${base}/overseas-quotes/warehouse-options`)) } export async function createQuote(payload: QuoteSave) { return unwrapApiResponse(await overseasHttp.post, ApiEnvelope>(`${base}/overseas-quotes`, payload)) } export async function updateQuote(id: string, payload: QuoteSave) { return unwrapApiResponse(await overseasHttp.put, ApiEnvelope>(`${base}/overseas-quotes/${encodeURIComponent(id)}`, payload)) } export async function changeQuoteStatus(id: string, status: MasterDataStatus, recordVersion: number) { return unwrapApiResponse(await overseasHttp.patch, ApiEnvelope>(`${base}/overseas-quotes/${encodeURIComponent(id)}/status`, { status, recordVersion })) } export const exportQuotes = (query: Omit) => download(`${base}/overseas-quotes/export`, query) export interface ExchangeRateQuery { page: number; size: number; monthFrom?: string; monthTo?: string; status?: MasterDataStatus } export const listExchangeRates = (query: ExchangeRateQuery) => getPage(`${base}/exchange-rates`, query) export async function getExchangeRate(month: string) { return unwrapApiResponse(await overseasHttp.get, ApiEnvelope>(`${base}/exchange-rates/${encodeURIComponent(month)}`)) } export async function getExchangeRateSummary() { return unwrapApiResponse(await overseasHttp.get, ApiEnvelope<{ latestMonth: string | null; latestUsdToCnyAverage: number | null; updatedBy: string | null; updatedAt: string | null }>>(`${base}/exchange-rates/summary`)) } export async function createExchangeRate(payload: { month: string; usdToCnyAverage: number; remark: string | null }) { return unwrapApiResponse(await overseasHttp.post, ApiEnvelope>(`${base}/exchange-rates`, payload)) } export async function updateExchangeRate(month: string, payload: { recordVersion: number; usdToCnyAverage: number; remark: string | null }) { return unwrapApiResponse(await overseasHttp.put, ApiEnvelope>(`${base}/exchange-rates/${encodeURIComponent(month)}`, payload)) } export async function changeExchangeRateStatus(month: string, status: MasterDataStatus, recordVersion: number, remark: string | null) { return unwrapApiResponse(await overseasHttp.patch, ApiEnvelope>(`${base}/exchange-rates/${encodeURIComponent(month)}/status`, { status, recordVersion, remark })) } export const exportExchangeRates = (query: Omit) => download(`${base}/exchange-rates/export`, query) export interface VehicleQuery { page: number; size: number; keyword?: string; ownership?: VehicleOwnership; region?: VehicleRegion; status?: VehicleStatus } export type VehicleSave = Omit & { status?: VehicleStatus; recordVersion?: number } export const listVehicles = (query: VehicleQuery) => getPage(`${base}/vehicles`, query) export async function getVehicle(id: string) { return unwrapApiResponse(await overseasHttp.get, ApiEnvelope>(`${base}/vehicles/${encodeURIComponent(id)}`)) } export async function createVehicle(payload: VehicleSave) { return unwrapApiResponse(await overseasHttp.post, ApiEnvelope>(`${base}/vehicles`, payload)) } export async function updateVehicle(id: string, payload: VehicleSave) { return unwrapApiResponse(await overseasHttp.put, ApiEnvelope>(`${base}/vehicles/${encodeURIComponent(id)}`, payload)) } export async function changeVehicleStatus(id: string, status: VehicleStatus, recordVersion: number) { return unwrapApiResponse(await overseasHttp.patch, ApiEnvelope>(`${base}/vehicles/${encodeURIComponent(id)}/status`, { status, recordVersion })) } export const exportVehicles = (query: Omit) => download(`${base}/vehicles/export`, query)