Files
XQKqueue/web/src/types.ts
2026-07-22 10:18:49 +08:00

400 lines
9.3 KiB
TypeScript

export type ProjectStatus = "NOT_OPEN" | "RUNNING" | "PAUSED" | "ENDED" | "CLOSED" | "OPEN" | "FINISHED" | string;
export type TicketStatus =
| "WAITING"
| "CALLED"
| "ARRIVED"
| "SERVING"
| "COMPLETED"
| "MISSED"
| "CANCELED"
| "CANCELLED"
| string;
export type CallMode = "TICKET" | "PEOPLE" | "BOTH";
export interface UserDto {
id: string;
username: string;
display_name?: string;
role: string;
}
export interface AdminUserDto extends UserDto {
active: boolean;
protected?: boolean;
project_ids: string[];
created_at?: string;
}
export interface ProjectDto {
id: string;
code?: string;
name: string;
status: ProjectStatus;
batch_size: number;
call_batch_size?: number;
call_mode?: CallMode;
default_call_ticket_count?: number;
max_call_ticket_count?: number;
default_call_people_count?: number;
max_call_people_count?: number;
min_party_size?: number;
max_party_size?: number;
ticket_prefix?: string;
timezone?: string;
grace_period_minutes?: number;
experienced_people_start?: number;
visitor_notice?: string | null;
eta?: {
interval_per_person_seconds?: number;
};
}
export interface ProjectProfilePayload {
name: string;
code: string;
timezone: string;
ticket_prefix: string;
}
export interface AuthPayload {
user: UserDto;
projects: ProjectDto[];
}
export interface QueueTicketDto {
id: string;
ticket_number: string;
display_number?: string | null;
phone?: string;
phone_masked?: string | null;
phone_last4?: string;
last_name?: string | null;
honorific?: string | null;
status: TicketStatus;
party_size: number;
created_at?: string | null;
estimated_wait?: unknown;
public_token?: string | null;
public_url?: string | null;
}
export interface CallBatchDto {
id: string;
batch_number: string | number;
status: string;
call_mode?: Exclude<CallMode, "BOTH">;
requested_count?: number;
ticket_count?: number;
people_count?: number;
tickets: QueueTicketDto[];
called_at?: string | null;
}
export interface DeviceResultDto {
channel: string;
status: string;
message?: string | null;
}
export interface QueueSnapshotDto {
project: ProjectDto;
revision: string | number;
waiting: QueueTicketDto[];
current_batch?: CallBatchDto | null;
recent_batches?: CallBatchDto[];
metrics: {
waiting_count: number;
waiting_ticket_count: number;
waiting_people_count: number;
called_count?: number;
called_ticket_count?: number;
called_people_count?: number;
estimated_wait?: unknown;
last_ticket_number?: string | null;
next_ticket_number?: string | null;
};
server_time?: string | null;
last_success_at?: string | null;
}
export interface CreateTicketPayload {
phone: string;
party_size: number;
last_name?: string;
honorific?: string;
allow_duplicate?: boolean;
}
export interface CreateTicketResponse {
ticket: QueueTicketDto;
public_token?: string;
public_url?: string;
status_path?: string;
revision: string | number;
}
export interface PublicProjectDto {
id: string;
name: string;
status: ProjectStatus;
visitor_notice?: string | null;
min_party_size: number;
max_party_size: number;
}
export interface CallNextResponse {
batch: CallBatchDto;
revision: string | number;
device_results: DeviceResultDto[];
}
export interface PublicStatusDto {
ticket_number: string;
display_number?: string | null;
phone_last4?: string;
project_name: string;
project?: {
id?: string;
name?: string;
status?: ProjectStatus;
};
status: TicketStatus;
party_size: number;
tickets_ahead?: number | null;
people_ahead?: number | null;
latest_called_number?: string | null;
estimated_wait?: unknown;
called_at?: string | null;
last_updated_at?: string | null;
entrance?: string | null;
message?: string | null;
visitor_notice?: string | null;
experienced_people?: number | null;
}
export interface PublicStatusSearchDto {
tickets: PublicStatusDto[];
}
export interface DisplaySnapshotDto {
project_name: string;
status: ProjectStatus;
current_batch?: CallBatchDto | null;
recent_batches: CallBatchDto[];
waiting_count: number;
waiting_ticket_count: number;
waiting_people_count: number;
experienced_people: number;
estimated_wait?: unknown;
last_updated_at?: string | null;
device_status?: unknown;
}
export interface AdminProjectDto extends Partial<ProjectDto> {
id: string;
name: string;
status: ProjectStatus;
waiting_count?: number;
waiting_ticket_count?: number;
waiting_people_count?: number;
issued_ticket_count?: number;
latest_ticket_number?: string | null;
experienced_people?: number;
current_batch?: string | number | CallBatchDto | null;
estimated_wait?: unknown;
last_updated_at?: string | null;
device_status?: unknown;
}
export interface UpdateProjectSettingsPayload {
status: string;
call_mode: CallMode;
default_call_ticket_count: number;
max_call_ticket_count: number;
default_call_people_count: number;
max_call_people_count: number;
min_party_size: number;
max_party_size: number;
grace_period_minutes: number;
experienced_people_start: number;
eta_interval_seconds: number;
visitor_notice: string;
}
export interface AdminActiveTicketDto {
id: string;
project_id: string;
project_name: string;
ticket_number: string;
phone: string;
last_name?: string | null;
honorific?: string | null;
party_size: number;
status: TicketStatus;
created_at: string;
}
export interface AdminOverviewDto {
summary: {
running_projects: number;
waiting_count: number;
waiting_ticket_count: number;
waiting_people_count: number;
anomaly_projects: number;
offline_devices: number;
};
projects: AdminProjectDto[];
active_tickets: AdminActiveTicketDto[];
}
export interface AdminHistoryQuery {
project_id?: string;
from: string;
to: string;
status?: string;
query?: string;
page?: number;
page_size?: number;
}
export interface AdminHistoryTicketDto {
id: string;
project_id: string;
project_name: string;
project_code?: string;
queue_session_id: string;
business_date: string;
ticket_number: string;
ticket_sequence?: number;
party_size: number;
status: TicketStatus;
joined_at?: string | null;
called_at?: string | null;
arrived_at?: string | null;
completed_at?: string | null;
missed_at?: string | null;
terminal_at?: string | null;
wait_seconds?: number | null;
created_by?: string | null;
phone?: string | null;
phone_last4?: string | null;
phone_masked?: string | null;
last_name?: string | null;
honorific?: string | null;
personal_data_status: "AVAILABLE" | "ANONYMIZED" | string;
personal_data_purged_at?: string | null;
history_anonymized_at?: string | null;
batch_id?: string | null;
batch_sequence?: number | null;
batch_position?: number | null;
}
export interface AdminHistoryBatchDto {
id: string;
project_id: string;
project_name: string;
project_code?: string;
queue_session_id: string;
business_date: string;
batch_sequence: number;
revision?: number;
status: string;
call_mode?: "TICKET" | "PEOPLE" | string;
requested_count: number;
ticket_count: number;
people_count: number;
requested_by?: string | null;
called_at?: string | null;
completed_at?: string | null;
ticket_numbers?: string[];
tickets?: AdminHistoryTicketDto[];
}
export interface AdminHistoryPageDto<T> {
items: T[];
page: number;
page_size: number;
total: number;
from: string;
to: string;
}
export interface AdminHistoryHourlyDto {
hour: number;
issued_tickets: number;
issued_people: number;
called_tickets: number;
called_people: number;
}
export interface AdminHistoryPeakHourDto extends AdminHistoryHourlyDto {
rank: number;
}
export interface AdminHistoryDailyDto {
business_date: string;
total_tickets: number;
total_people: number;
called_tickets: number;
completed_tickets: number;
missed_tickets: number;
canceled_tickets: number;
completion_rate: number;
missed_rate: number;
canceled_rate: number;
average_wait_seconds?: number | null;
max_wait_seconds?: number | null;
}
export interface AdminHistoryProjectDto {
project_id: string;
project_name: string;
project_code?: string;
total_tickets: number;
total_people: number;
called_tickets: number;
completed_tickets: number;
missed_tickets: number;
canceled_tickets: number;
completion_rate: number;
missed_rate: number;
canceled_rate: number;
average_wait_seconds?: number | null;
max_wait_seconds?: number | null;
}
export interface AdminHistoryAlertDto {
severity: number;
type: string;
title: string;
detail: string;
project_id: string;
project_name: string;
total_tickets: number;
}
export interface AdminHistorySummaryDto {
from: string;
to: string;
summary: {
total_tickets: number;
total_people: number;
called_tickets: number;
called_people: number;
completed_tickets: number;
completed_people: number;
missed_tickets: number;
canceled_tickets: number;
completion_rate: number;
missed_rate: number;
canceled_rate: number;
average_wait_seconds?: number | null;
max_wait_seconds?: number | null;
};
hourly: AdminHistoryHourlyDto[];
peak_hours?: AdminHistoryPeakHourDto[];
daily?: AdminHistoryDailyDto[];
projects?: AdminHistoryProjectDto[];
alerts?: AdminHistoryAlertDto[];
}