Kaynağa Gözat

fix(admin): simplify overdue schedule status

彭峰 2 ay önce
ebeveyn
işleme
d858577f4a

+ 1 - 2
src/app/admin/pages/operations-schedule.component.html

@@ -39,8 +39,7 @@
       <span class="status-coach-ended"><i></i>陪练已结束</span>
       <span class="status-confirmed"><i></i>学员已确认</span>
       <span class="status-completed"><i></i>已完课</span>
-      <span class="status-overdue"><i></i>逾期未上课</span>
-      <span class="status-overdue-incomplete"><i></i>逾期未完课</span>
+      <span class="status-overdue"><i></i>逾期未完成</span>
       <span class="status-cancelled"><i></i>已取消</span>
     </div>
   </header>

+ 0 - 9
src/app/admin/pages/operations-schedule.component.scss

@@ -240,12 +240,6 @@ textarea:focus-visible {
   --status-border: #fecdd3;
 }
 
-.status-overdue-incomplete {
-  --status-color: #b45309;
-  --status-bg: #fffbeb;
-  --status-border: #fcd34d;
-}
-
 .status-cancelled {
   --status-color: #c2410c;
   --status-bg: #fff7ed;
@@ -264,7 +258,6 @@ textarea:focus-visible {
 .appointment.status-confirmed,
 .appointment.status-completed,
 .appointment.status-overdue,
-.appointment.status-overdue-incomplete,
 .appointment.status-cancelled,
 .appointment.status-neutral {
   border-color: var(--status-border);
@@ -274,8 +267,6 @@ textarea:focus-visible {
 
 .appointment.status-overdue strong,
 .appointment.status-overdue small,
-.appointment.status-overdue-incomplete strong,
-.appointment.status-overdue-incomplete small,
 .appointment.status-cancelled strong,
 .appointment.status-cancelled small {
   color: var(--status-color);

+ 5 - 5
src/app/admin/pages/operations-schedule.component.spec.ts

@@ -20,16 +20,16 @@ describe('排课搜索匹配', () => {
 describe('排课状态视觉分类', () => {
   const now = Date.parse('2026-08-20T10:00:00+08:00');
 
-  it('将已经结束但仍待开始的预约识别为逾期未上课', () => {
+  it('将已经结束但仍待开始的预约统一识别为逾期未完成', () => {
     const item = { cancelled: false, statusCode: 0, statusLabel: '待开始', endsAt: '2026-08-20T01:00:00.000Z' };
     expect(scheduleStatusTone(item, now)).toBe('status-overdue');
-    expect(scheduleStatusLabel(item, now)).toBe('逾期未上课');
+    expect(scheduleStatusLabel(item, now)).toBe('逾期未完成');
   });
 
-  it('已经超过结束时间的上课中记录不再显示为正在上课', () => {
+  it('已开始但超过结束时间的记录使用同一个逾期状态', () => {
     const item = { cancelled: false, statusCode: 10, statusLabel: '上课中', endsAt: '2026-08-20T01:00:00.000Z' };
-    expect(scheduleStatusTone(item, now)).toBe('status-overdue-incomplete');
-    expect(scheduleStatusLabel(item, now)).toBe('逾期未完课');
+    expect(scheduleStatusTone(item, now)).toBe('status-overdue');
+    expect(scheduleStatusLabel(item, now)).toBe('逾期未完成');
   });
 
   it('按原系统状态链区分陪练结束、学员确认和最终完课', () => {

+ 3 - 5
src/app/admin/pages/operations-schedule.component.ts

@@ -8,14 +8,13 @@ import { OperationsService } from '../operations.service';
 const localDateKey=(value:Date):string=>`${value.getFullYear()}-${String(value.getMonth()+1).padStart(2,'0')}-${String(value.getDate()).padStart(2,'0')}`;
 
 type SearchField='member'|'course'|'coach';
-export type ScheduleStatusTone='status-upcoming'|'status-live'|'status-coach-ended'|'status-confirmed'|'status-completed'|'status-overdue'|'status-overdue-incomplete'|'status-cancelled'|'status-neutral';
+export type ScheduleStatusTone='status-upcoming'|'status-live'|'status-coach-ended'|'status-confirmed'|'status-completed'|'status-overdue'|'status-cancelled'|'status-neutral';
 const scheduleStatusLabels:Partial<Record<number,string>>={0:'待开始',10:'上课中',11:'陪练已结束',20:'学员已确认',30:'已完课'};
 
 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&&Number.isFinite(endTime)&&endTime<now)return 'status-overdue';
-  if(item.statusCode===10&&Number.isFinite(endTime)&&endTime<now)return 'status-overdue-incomplete';
+  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';
@@ -27,8 +26,7 @@ export function scheduleStatusTone(item:Pick<ScheduleAppointment,'cancelled'|'st
 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 '逾期未上课';
-  if(tone==='status-overdue-incomplete')return '逾期未完课';
+  if(tone==='status-overdue')return '逾期未完成';
   return scheduleStatusLabels[item.statusCode]||item.statusLabel||`状态 ${item.statusCode}`;
 }