56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
import dayjs from 'dayjs'
|
|
import { listPlatformTenants } from '@/modules/iam'
|
|
import { listPlatformUnifiedOrders } from '@/modules/unified-orders'
|
|
import { http, type ApiEnvelope, unwrapApiResponse } from '@/shared/api/http'
|
|
|
|
export interface DashboardOperationalMetrics {
|
|
inTransitContainerCount: number
|
|
inTransitTeu: number
|
|
unknownContainerTypeCount: number
|
|
pendingCustomsOrderCount: number
|
|
asOf: string | null
|
|
}
|
|
|
|
interface RawDashboardOperationalMetrics {
|
|
inTransitContainerCount: number | string
|
|
inTransitTeu: number | string
|
|
unknownContainerTypeCount: number | string
|
|
pendingCustomsOrderCount: number | string
|
|
asOf?: string | null
|
|
}
|
|
|
|
function numberValue(value: number | string | null | undefined) {
|
|
const parsed = Number(value)
|
|
return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0
|
|
}
|
|
|
|
export async function getDashboardOperationalMetrics(): Promise<DashboardOperationalMetrics> {
|
|
const response = await http.get<ApiEnvelope<RawDashboardOperationalMetrics>, ApiEnvelope<RawDashboardOperationalMetrics>>(
|
|
'/platform/v1/first-leg/dashboard/operational-metrics',
|
|
)
|
|
const data = unwrapApiResponse(response)
|
|
return {
|
|
inTransitContainerCount: numberValue(data.inTransitContainerCount),
|
|
inTransitTeu: numberValue(data.inTransitTeu),
|
|
unknownContainerTypeCount: numberValue(data.unknownContainerTypeCount),
|
|
pendingCustomsOrderCount: numberValue(data.pendingCustomsOrderCount),
|
|
asOf: data.asOf || null,
|
|
}
|
|
}
|
|
|
|
export async function getTodayNewOrderCount() {
|
|
const today = dayjs()
|
|
const result = await listPlatformUnifiedOrders({
|
|
createdFrom: today.startOf('day').format('YYYY-MM-DDTHH:mm:ss.SSS'),
|
|
createdTo: today.endOf('day').format('YYYY-MM-DDTHH:mm:ss.SSS'),
|
|
page: 1,
|
|
size: 1,
|
|
})
|
|
return result.total
|
|
}
|
|
|
|
export async function getActiveCustomerCount() {
|
|
const result = await listPlatformTenants({ page: 1, size: 1, status: 'ACTIVE' })
|
|
return result.total
|
|
}
|