| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import { ScheduleAppointment } from '../admin.models';
- export type ScheduleStatusTone =
- | 'status-upcoming'
- | 'status-live'
- | 'status-coach-ended'
- | 'status-confirmed'
- | 'status-completed'
- | 'status-archived'
- | 'status-overdue'
- | 'status-cancelled'
- | 'status-neutral';
- export type ScheduleStatusFilter =
- | 'all'
- | 'upcoming'
- | 'live'
- | 'coach-ended'
- | 'confirmed'
- | 'completed'
- | 'archived'
- | 'overdue'
- | 'cancelled'
- | 'unassigned';
- const scheduleStatusLabels: Partial<Record<number, string>> = {
- 0: '待开始',
- 10: '上课中',
- 11: '陪练已结束',
- 20: '学员已确认',
- 30: '已完课',
- 40: '已归档',
- };
- export function scheduleStatusTone(
- item: Pick<ScheduleAppointment, 'cancelled' | 'statusCode' | 'endsAt'>,
- now = Date.now(),
- ): ScheduleStatusTone {
- if (item.cancelled) return 'status-cancelled';
- const endTime = Date.parse(item.endsAt);
- if ((item.statusCode === 0 || item.statusCode === 10) && Number.isFinite(endTime) && endTime < now) return 'status-overdue';
- if (item.statusCode === 0) return 'status-upcoming';
- if (item.statusCode === 10) return 'status-live';
- if (item.statusCode === 11) return 'status-coach-ended';
- if (item.statusCode === 20) return 'status-confirmed';
- if (item.statusCode === 30) return 'status-completed';
- if (item.statusCode === 40) return 'status-archived';
- return 'status-neutral';
- }
- export function scheduleStatusLabel(
- item: Pick<ScheduleAppointment, 'cancelled' | 'statusCode' | 'statusLabel' | 'endsAt'>,
- now = Date.now(),
- ): string {
- const tone = scheduleStatusTone(item, now);
- if (tone === 'status-cancelled') return '已取消';
- if (tone === 'status-overdue') return '逾期未完成';
- return scheduleStatusLabels[item.statusCode] || item.statusLabel || `状态 ${item.statusCode}`;
- }
- export function scheduleMatchesStatus(
- item: Pick<ScheduleAppointment, 'cancelled' | 'statusCode' | 'endsAt' | 'coachId' | 'coachAccountMissing'>,
- filter: ScheduleStatusFilter,
- now = Date.now(),
- ): boolean {
- if (filter === 'all') return true;
- if (filter === 'unassigned') return !item.coachId || item.coachAccountMissing === true;
- return scheduleStatusTone(item, now) === `status-${filter}`;
- }
|