|
|
@@ -8,7 +8,7 @@
|
|
|
@if(data();as detail){<div class="coach-header-meta"><span>ID {{detail.coach.userId}}</span><span><lucide-icon [img]="icons.Building2" [size]="13"/>{{detail.profile.storeName||'未绑定门店'}}</span><strong>{{detail.profile.statusLabel}}</strong></div>}
|
|
|
</div>
|
|
|
</div>
|
|
|
- @if(data();as detail){<a class="ui-button secondary" routerLink="/admin/payroll" [queryParams]="{tab:'rewards',coachId:detail.coach.userId}">抗遗忘工资明细</a>}
|
|
|
+ @if(data();as detail){<a class="ui-button secondary" routerLink="/admin/payroll" [queryParams]="{tab:'rewards',coachId:detail.coach.userId}">抗遗忘费用明细</a>}
|
|
|
<button class="ui-button secondary refresh-action" type="button" (click)="load(true)" [disabled]="loading()"><lucide-icon [img]="icons.RefreshCw" [size]="17" [class.spin]="loading()"/>{{loading()?'正在刷新':'刷新实时数据'}}</button>
|
|
|
</header>
|
|
|
|
|
|
@@ -16,7 +16,7 @@
|
|
|
@if(error()){<p class="notice error" role="alert">{{error()}}</p>}
|
|
|
|
|
|
@if(loading()&&!data()){
|
|
|
- <div class="state">正在读取老师实时排课、上课记录和工资数据…</div>
|
|
|
+ <div class="state">正在读取老师实时排课、训练记录和费用数据…</div>
|
|
|
}
|
|
|
|
|
|
@if(data();as detail){
|
|
|
@@ -32,15 +32,15 @@
|
|
|
<section class="source-strip" [class.cache]="detail.payrollSourceStatus.mode==='cache'" role="status">
|
|
|
<span></span>
|
|
|
<strong>{{detail.payrollMonth}} 收益数据</strong>
|
|
|
- <em>{{detail.payrollSourceStatus.mode==='live'?'旧系统实时上课记录':'迁移库缓存记录'}}</em>
|
|
|
+ <em>{{detail.payrollSourceStatus.mode==='live'?'旧系统实时训练记录':'迁移库缓存记录'}}</em>
|
|
|
<small>更新于 {{detail.refreshedAt|date:'MM-dd HH:mm:ss'}}</small>
|
|
|
</section>
|
|
|
|
|
|
<section class="summary-grid coach-summary">
|
|
|
- <article class="summary-card"><span>今日排课</span><strong>{{detail.coach.todayAppointments}}</strong><small>未来待完成 {{upcomingCount()}} 节</small></article>
|
|
|
+ <article class="summary-card"><span>今天训练</span><strong>{{detail.coach.todayAppointments}}</strong><small>未来待完成 {{upcomingCount()}} 节</small></article>
|
|
|
<article class="summary-card"><span>{{detail.payrollMonth}} 有效课次</span><strong>{{detail.currentPayroll.lessonCount}}</strong><small>30分钟 {{detail.currentPayroll.type30Count}} · 60分钟 {{detail.currentPayroll.type60Count}}</small></article>
|
|
|
- <article class="summary-card"><span>{{detail.payrollMonth}} 工时</span><strong>{{detail.currentPayroll.totalHours|number:'1.1-1'}}h</strong><small>体验课 {{detail.currentPayroll.trialCount}} 节</small></article>
|
|
|
- <article class="summary-card payroll-card"><span>{{detail.payrollMonth}} 预估工资</span><strong>¥{{detail.currentPayroll.payableAmount|number:'1.2-2'}}</strong><small>含抗遗忘工资 ¥{{detail.currentPayroll.reviewAmount||0|number:'1.2-2'}}</small></article>
|
|
|
+ <article class="summary-card"><span>{{detail.payrollMonth}} 工时</span><strong>{{detail.currentPayroll.totalHours|number:'1.1-1'}}h</strong><small>体验训练 {{detail.currentPayroll.trialCount}} 节</small></article>
|
|
|
+ <article class="summary-card payroll-card"><span>{{detail.payrollMonth}} 预估费用</span><strong>¥{{detail.currentPayroll.payableAmount|number:'1.2-2'}}</strong><small>含抗遗忘费用 ¥{{detail.currentPayroll.reviewAmount||0|number:'1.2-2'}}</small></article>
|
|
|
<article class="summary-card"><span>平均评分</span><strong>{{detail.currentPayroll.averageScore?(detail.currentPayroll.averageScore|number:'1.1-1'):'—'}}</strong><small>{{detail.reviews.length}} 条有效评价</small></article>
|
|
|
<article class="summary-card"><span>21天复习任务</span><strong>{{detail.reviewTaskCount}}</strong><small>原系统默认不计薪</small></article>
|
|
|
</section>
|
|
|
@@ -48,26 +48,26 @@
|
|
|
<section class="content-card coach-detail-content">
|
|
|
<nav class="tabs coach-tabs" aria-label="陪练老师详情">
|
|
|
<button type="button" [class.active]="tab()==='schedule'" (click)="tab.set('schedule')"><lucide-icon [img]="icons.CalendarDays" [size]="16"/>排课记录 <span class="tab-month">{{scheduleMonth()}}</span><em>{{detail.appointments.length}}</em></button>
|
|
|
- <button type="button" [class.active]="tab()==='lessons'" (click)="tab.set('lessons')"><lucide-icon [img]="icons.GraduationCap" [size]="16"/>上课明细 <span class="tab-month">{{lessonsMonth()}}</span><em>{{detail.lessons.length}}</em></button>
|
|
|
+ <button type="button" [class.active]="tab()==='lessons'" (click)="tab.set('lessons')"><lucide-icon [img]="icons.GraduationCap" [size]="16"/>训练明细 <span class="tab-month">{{lessonsMonth()}}</span><em>{{detail.lessons.length}}</em></button>
|
|
|
<button type="button" [class.active]="tab()==='reviews'" (click)="tab.set('reviews')"><lucide-icon [img]="icons.Star" [size]="16"/>学员评价 <em>{{detail.reviews.length}}</em></button>
|
|
|
<button type="button" [class.active]="tab()==='availability'" (click)="tab.set('availability')"><lucide-icon [img]="icons.Clock3" [size]="16"/>可用时间</button>
|
|
|
- <button type="button" [class.active]="tab()==='payroll'" (click)="tab.set('payroll')"><lucide-icon [img]="icons.WalletCards" [size]="16"/>工资记录 <span class="tab-month">{{payrollMonth()}}</span></button>
|
|
|
+ <button type="button" [class.active]="tab()==='payroll'" (click)="tab.set('payroll')"><lucide-icon [img]="icons.WalletCards" [size]="16"/>费用记录 <span class="tab-month">{{payrollMonth()}}</span></button>
|
|
|
</nav>
|
|
|
|
|
|
@if(tab()==='schedule'){
|
|
|
- <div class="section-heading"><div><strong>{{scheduleMonth()}} 老师排课记录</strong><span>只筛选排课记录,不影响上课明细和工资记录</span></div><div class="section-month-filter"><span>排课月份</span><button class="month-picker-trigger" data-testid="schedule-month" type="button" aria-label="选择排课月份" aria-haspopup="dialog" [attr.aria-expanded]="activeMonthPicker()==='schedule'" [class.active]="activeMonthPicker()==='schedule'" (click)="toggleMonthPicker('schedule',$event)" [disabled]="loading()||isSectionLoading('schedule')"><lucide-icon [img]="icons.CalendarDays" [size]="16"/><strong>{{monthLabel(scheduleMonth())}}</strong><lucide-icon class="picker-chevron" [img]="icons.ChevronDown" [size]="15"/></button><small>{{isSectionLoading('schedule')?'正在读取…':(detail.appointments.length+' 条排课')}}</small>@if(activeMonthPicker()==='schedule'){<div class="month-calendar-popover" role="dialog" aria-label="选择排课月份" (click)="$event.stopPropagation()"><header><button type="button" aria-label="上一年" (click)="shiftMonthPickerYear(-1,$event)"><lucide-icon [img]="icons.ChevronLeft" [size]="17"/></button><strong>{{monthPickerYear()}}年</strong><button type="button" aria-label="下一年" (click)="shiftMonthPickerYear(1,$event)"><lucide-icon [img]="icons.ChevronRight" [size]="17"/></button></header><div class="month-grid">@for(name of monthNames;track $index){<button type="button" [class.selected]="scheduleMonth()===monthOptionValue($index)" [attr.aria-pressed]="scheduleMonth()===monthOptionValue($index)" (click)="selectSectionMonth('schedule',$index)">{{name}}</button>}</div><footer><button type="button" (click)="selectCurrentMonth('schedule')">回到本月</button></footer></div>}</div></div>
|
|
|
- <div class="table-scroll"><table class="data-table detail-table"><thead><tr><th>上课时间</th><th>学员</th><th>课程</th><th>课型</th><th>状态</th><th>数据来源</th></tr></thead><tbody>
|
|
|
+ <div class="section-heading"><div><strong>{{scheduleMonth()}} 老师排课记录</strong><span>只筛选排课记录,不影响训练明细和费用记录</span></div><div class="section-month-filter"><span>排课月份</span><button class="month-picker-trigger" data-testid="schedule-month" type="button" aria-label="选择排课月份" aria-haspopup="dialog" [attr.aria-expanded]="activeMonthPicker()==='schedule'" [class.active]="activeMonthPicker()==='schedule'" (click)="toggleMonthPicker('schedule',$event)" [disabled]="loading()||isSectionLoading('schedule')"><lucide-icon [img]="icons.CalendarDays" [size]="16"/><strong>{{monthLabel(scheduleMonth())}}</strong><lucide-icon class="picker-chevron" [img]="icons.ChevronDown" [size]="15"/></button><small>{{isSectionLoading('schedule')?'正在读取…':(detail.appointments.length+' 条排课')}}</small>@if(activeMonthPicker()==='schedule'){<div class="month-calendar-popover" role="dialog" aria-label="选择排课月份" (click)="$event.stopPropagation()"><header><button type="button" aria-label="上一年" (click)="shiftMonthPickerYear(-1,$event)"><lucide-icon [img]="icons.ChevronLeft" [size]="17"/></button><strong>{{monthPickerYear()}}年</strong><button type="button" aria-label="下一年" (click)="shiftMonthPickerYear(1,$event)"><lucide-icon [img]="icons.ChevronRight" [size]="17"/></button></header><div class="month-grid">@for(name of monthNames;track $index){<button type="button" [class.selected]="scheduleMonth()===monthOptionValue($index)" [attr.aria-pressed]="scheduleMonth()===monthOptionValue($index)" (click)="selectSectionMonth('schedule',$index)">{{name}}</button>}</div><footer><button type="button" (click)="selectCurrentMonth('schedule')">回到本月</button></footer></div>}</div></div>
|
|
|
+ <div class="table-scroll"><table class="data-table detail-table"><thead><tr><th>训练时间</th><th>学员</th><th>课程</th><th>课型</th><th>状态</th><th>数据来源</th></tr></thead><tbody>
|
|
|
@for(row of detail.appointments;track row.targetId){<tr><td><strong>{{row.startsAt|date:'yyyy-MM-dd HH:mm'}}</strong><small>{{row.endsAt|date:'HH:mm'}} 结束</small></td><td>{{row.studentName}}</td><td>{{row.courseName}}</td><td>{{row.classTypeLabel}}</td><td><span [class]="'appointment-status '+statusTone(row)">{{statusDisplayLabel(row)}}</span></td><td><small class="source-pill">{{row.sourceLabel}}</small></td></tr>}
|
|
|
@empty{<tr><td colspan="6"><div class="empty">{{isSectionLoading('schedule')?'正在读取排课记录…':'该月没有可展示的排课记录'}}</div></td></tr>}
|
|
|
</tbody></table></div>
|
|
|
}@else if(tab()==='lessons'){
|
|
|
- <div class="section-heading"><div><strong>{{lessonsMonth()}} 上课与计薪明细</strong><span>只筛选上课明细,不影响排课和工资记录,最多展示最近 300 条</span></div><div class="section-tools"><span class="total-chip">合计 ¥{{(lessonsPayroll()?.payableAmount||0)|number:'1.2-2'}}</span><div class="section-month-filter"><span>上课月份</span><button class="month-picker-trigger" data-testid="lessons-month" type="button" aria-label="选择上课月份" aria-haspopup="dialog" [attr.aria-expanded]="activeMonthPicker()==='lessons'" [class.active]="activeMonthPicker()==='lessons'" (click)="toggleMonthPicker('lessons',$event)" [disabled]="loading()||isSectionLoading('lessons')"><lucide-icon [img]="icons.CalendarDays" [size]="16"/><strong>{{monthLabel(lessonsMonth())}}</strong><lucide-icon class="picker-chevron" [img]="icons.ChevronDown" [size]="15"/></button><small>{{isSectionLoading('lessons')?'正在读取…':(detail.lessons.length+' 条明细')}}</small>@if(activeMonthPicker()==='lessons'){<div class="month-calendar-popover" role="dialog" aria-label="选择上课月份" (click)="$event.stopPropagation()"><header><button type="button" aria-label="上一年" (click)="shiftMonthPickerYear(-1,$event)"><lucide-icon [img]="icons.ChevronLeft" [size]="17"/></button><strong>{{monthPickerYear()}}年</strong><button type="button" aria-label="下一年" (click)="shiftMonthPickerYear(1,$event)"><lucide-icon [img]="icons.ChevronRight" [size]="17"/></button></header><div class="month-grid">@for(name of monthNames;track $index){<button type="button" [class.selected]="lessonsMonth()===monthOptionValue($index)" [attr.aria-pressed]="lessonsMonth()===monthOptionValue($index)" (click)="selectSectionMonth('lessons',$index)">{{name}}</button>}</div><footer><button type="button" (click)="selectCurrentMonth('lessons')">回到本月</button></footer></div>}</div></div></div>
|
|
|
- <div class="table-scroll"><table class="data-table detail-table"><thead><tr><th>上课时间</th><th>学员</th><th>课程</th><th>课型</th><th>工时</th><th>单价</th><th>金额</th><th>来源ID</th></tr></thead><tbody>
|
|
|
+ <div class="section-heading"><div><strong>{{lessonsMonth()}} 训练与计薪明细</strong><span>只筛选训练明细,不影响排课和费用记录,最多展示最近 300 条</span></div><div class="section-tools"><span class="total-chip">合计 ¥{{(lessonsPayroll()?.payableAmount||0)|number:'1.2-2'}}</span><div class="section-month-filter"><span>训练月份</span><button class="month-picker-trigger" data-testid="lessons-month" type="button" aria-label="选择训练月份" aria-haspopup="dialog" [attr.aria-expanded]="activeMonthPicker()==='lessons'" [class.active]="activeMonthPicker()==='lessons'" (click)="toggleMonthPicker('lessons',$event)" [disabled]="loading()||isSectionLoading('lessons')"><lucide-icon [img]="icons.CalendarDays" [size]="16"/><strong>{{monthLabel(lessonsMonth())}}</strong><lucide-icon class="picker-chevron" [img]="icons.ChevronDown" [size]="15"/></button><small>{{isSectionLoading('lessons')?'正在读取…':(detail.lessons.length+' 条明细')}}</small>@if(activeMonthPicker()==='lessons'){<div class="month-calendar-popover" role="dialog" aria-label="选择训练月份" (click)="$event.stopPropagation()"><header><button type="button" aria-label="上一年" (click)="shiftMonthPickerYear(-1,$event)"><lucide-icon [img]="icons.ChevronLeft" [size]="17"/></button><strong>{{monthPickerYear()}}年</strong><button type="button" aria-label="下一年" (click)="shiftMonthPickerYear(1,$event)"><lucide-icon [img]="icons.ChevronRight" [size]="17"/></button></header><div class="month-grid">@for(name of monthNames;track $index){<button type="button" [class.selected]="lessonsMonth()===monthOptionValue($index)" [attr.aria-pressed]="lessonsMonth()===monthOptionValue($index)" (click)="selectSectionMonth('lessons',$index)">{{name}}</button>}</div><footer><button type="button" (click)="selectCurrentMonth('lessons')">回到本月</button></footer></div>}</div></div></div>
|
|
|
+ <div class="table-scroll"><table class="data-table detail-table"><thead><tr><th>训练时间</th><th>学员</th><th>课程</th><th>课型</th><th>工时</th><th>单价</th><th>金额</th><th>来源ID</th></tr></thead><tbody>
|
|
|
@for(line of detail.lessons;track line.objectId){<tr><td>{{line.lessonAt|date:'yyyy-MM-dd HH:mm'}}</td><td>{{line.studentName}}</td><td>{{line.courseName}}</td><td>{{line.classTypeLabel}}</td><td>{{line.durationHours|number:'1.1-1'}}h</td><td>¥{{line.rateAmount|number:'1.2-2'}}</td><td class="money">¥{{line.amount|number:'1.2-2'}}</td><td>{{line.legacyGeneralId||'—'}}</td></tr>}
|
|
|
- @empty{<tr><td colspan="8"><div class="empty">{{isSectionLoading('lessons')?'正在读取上课明细…':'该月没有有效上课记录'}}</div></td></tr>}
|
|
|
+ @empty{<tr><td colspan="8"><div class="empty">{{isSectionLoading('lessons')?'正在读取训练明细…':'该月没有有效训练记录'}}</div></td></tr>}
|
|
|
</tbody></table></div>
|
|
|
}@else if(tab()==='reviews'){
|
|
|
- <div class="section-heading"><div><strong>{{lessonsMonth()}} 学员评价</strong><span>评价跟随“上课明细月份”,来自旧系统上课记录</span></div></div>
|
|
|
+ <div class="section-heading"><div><strong>{{lessonsMonth()}} 学员评价</strong><span>评价跟随“训练明细月份”,来自旧系统训练记录</span></div></div>
|
|
|
<div class="review-list">
|
|
|
@for(line of detail.reviews;track line.objectId){<article><header><div><strong>{{line.studentName}}</strong><span>{{line.courseName}} · {{line.lessonAt|date:'MM-dd HH:mm'}}</span></div><div class="score"><lucide-icon [img]="icons.Star" [size]="16"/>{{line.score||'未评分'}}</div></header><p>{{line.comment||'学员已评分,未填写文字评价'}}</p></article>}
|
|
|
@empty{<div class="empty">本月暂时没有评分或文字评价</div>}
|
|
|
@@ -77,10 +77,10 @@
|
|
|
<div class="availability-form form-grid"><label><span>规则类型</span><select [ngModel]="ruleType()" (ngModelChange)="ruleType.set($event)"><option value="weekly">每周规则</option><option value="date">指定日期</option></select></label>@if(ruleType()==='weekly'){<label><span>星期</span><select [ngModel]="weekday()" (ngModelChange)="weekday.set(+$event)">@for(day of ['日','一','二','三','四','五','六'];track $index){<option [ngValue]="$index">星期{{day}}</option>}</select></label>}@else{<label><span>日期</span><input type="date" [ngModel]="ruleDate()" (ngModelChange)="ruleDate.set($event)"/></label>}<label><span>开始时间</span><input type="time" [ngModel]="startTime()" (ngModelChange)="startTime.set($event)"/></label><label><span>结束时间</span><input type="time" [ngModel]="endTime()" (ngModelChange)="endTime.set($event)"/></label><label><span>状态</span><select [ngModel]="available()" (ngModelChange)="available.set($event)"><option [ngValue]="true">可排课</option><option [ngValue]="false">休息/请假</option></select></label><label><span>原因</span><input [ngModel]="ruleReason()" (ngModelChange)="ruleReason.set($event)"/></label><button class="ui-button primary" type="button" (click)="saveAvailability()" [disabled]="saving()"><lucide-icon [img]="icons.Plus" [size]="16"/>添加规则</button></div>
|
|
|
<div class="table-scroll"><table class="data-table detail-table"><thead><tr><th>规则</th><th>日期/星期</th><th>时段</th><th>状态</th><th>原因</th><th>操作</th></tr></thead><tbody>@for(rule of detail.availability;track rule.objectId){<tr><td>{{rule.ruleType==='weekly'?'每周':'指定日期'}}</td><td>{{rule.ruleType==='weekly'?('星期'+['日','一','二','三','四','五','六'][rule.weekday]):rule.date}}</td><td>{{rule.startTime}}–{{rule.endTime}}</td><td><span class="badge">{{rule.available?'可排课':'休息/请假'}}</span></td><td>{{rule.reason}}</td><td><button class="icon-action danger" type="button" aria-label="删除可用时间规则" (click)="removeAvailability(rule.objectId,rule.updatedAt)"><lucide-icon [img]="icons.Trash2" [size]="16"/></button></td></tr>}@empty{<tr><td colspan="6"><div class="empty">尚未配置;排课时允许选择,但会提示未配置可用时间</div></td></tr>}</tbody></table></div>
|
|
|
}@else{
|
|
|
- <div class="section-heading"><div><strong>{{payrollMonth()}} 老师工资记录</strong><span>只筛选工资预估和已生成工资批次,不影响排课和上课明细</span></div><div class="section-month-filter"><span>工资月份</span><button class="month-picker-trigger" data-testid="payroll-month" type="button" aria-label="选择工资月份" aria-haspopup="dialog" [attr.aria-expanded]="activeMonthPicker()==='payroll'" [class.active]="activeMonthPicker()==='payroll'" (click)="toggleMonthPicker('payroll',$event)" [disabled]="loading()||isSectionLoading('payroll')"><lucide-icon [img]="icons.CalendarDays" [size]="16"/><strong>{{monthLabel(payrollMonth())}}</strong><lucide-icon class="picker-chevron" [img]="icons.ChevronDown" [size]="15"/></button><small>{{isSectionLoading('payroll')?'正在读取…':(detail.payrolls.length+' 条工资记录')}}</small>@if(activeMonthPicker()==='payroll'){<div class="month-calendar-popover" role="dialog" aria-label="选择工资月份" (click)="$event.stopPropagation()"><header><button type="button" aria-label="上一年" (click)="shiftMonthPickerYear(-1,$event)"><lucide-icon [img]="icons.ChevronLeft" [size]="17"/></button><strong>{{monthPickerYear()}}年</strong><button type="button" aria-label="下一年" (click)="shiftMonthPickerYear(1,$event)"><lucide-icon [img]="icons.ChevronRight" [size]="17"/></button></header><div class="month-grid">@for(name of monthNames;track $index){<button type="button" [class.selected]="payrollMonth()===monthOptionValue($index)" [attr.aria-pressed]="payrollMonth()===monthOptionValue($index)" (click)="selectSectionMonth('payroll',$index)">{{name}}</button>}</div><footer><button type="button" (click)="selectCurrentMonth('payroll')">回到本月</button></footer></div>}</div></div>
|
|
|
- <div class="table-scroll"><table class="data-table detail-table"><thead><tr><th>月份</th><th>状态</th><th>有效课次</th><th>工时</th><th>基础工资</th><th>抗遗忘工资</th><th>调整</th><th>应发金额</th></tr></thead><tbody>
|
|
|
+ <div class="section-heading"><div><strong>{{payrollMonth()}} 老师费用记录</strong><span>只筛选费用预估和已生成费用批次,不影响排课和训练明细</span></div><div class="section-month-filter"><span>费用月份</span><button class="month-picker-trigger" data-testid="payroll-month" type="button" aria-label="选择费用月份" aria-haspopup="dialog" [attr.aria-expanded]="activeMonthPicker()==='payroll'" [class.active]="activeMonthPicker()==='payroll'" (click)="toggleMonthPicker('payroll',$event)" [disabled]="loading()||isSectionLoading('payroll')"><lucide-icon [img]="icons.CalendarDays" [size]="16"/><strong>{{monthLabel(payrollMonth())}}</strong><lucide-icon class="picker-chevron" [img]="icons.ChevronDown" [size]="15"/></button><small>{{isSectionLoading('payroll')?'正在读取…':(detail.payrolls.length+' 条费用记录')}}</small>@if(activeMonthPicker()==='payroll'){<div class="month-calendar-popover" role="dialog" aria-label="选择费用月份" (click)="$event.stopPropagation()"><header><button type="button" aria-label="上一年" (click)="shiftMonthPickerYear(-1,$event)"><lucide-icon [img]="icons.ChevronLeft" [size]="17"/></button><strong>{{monthPickerYear()}}年</strong><button type="button" aria-label="下一年" (click)="shiftMonthPickerYear(1,$event)"><lucide-icon [img]="icons.ChevronRight" [size]="17"/></button></header><div class="month-grid">@for(name of monthNames;track $index){<button type="button" [class.selected]="payrollMonth()===monthOptionValue($index)" [attr.aria-pressed]="payrollMonth()===monthOptionValue($index)" (click)="selectSectionMonth('payroll',$index)">{{name}}</button>}</div><footer><button type="button" (click)="selectCurrentMonth('payroll')">回到本月</button></footer></div>}</div></div>
|
|
|
+ <div class="table-scroll"><table class="data-table detail-table"><thead><tr><th>月份</th><th>状态</th><th>有效课次</th><th>工时</th><th>基础费用</th><th>抗遗忘费用</th><th>调整</th><th>应发金额</th></tr></thead><tbody>
|
|
|
@for(row of detail.payrolls;track row.objectId){<tr><td><strong>{{row.month}}</strong></td><td><span class="badge" [class.warn]="row.objectId.startsWith('preview:')">{{row.statusLabel}}</span></td><td>{{row.lessonCount}}</td><td>{{row.totalHours|number:'1.1-1'}}h</td><td>¥{{row.baseAmount|number:'1.2-2'}}</td><td>¥{{row.reviewAmount||0|number:'1.2-2'}}</td><td>¥{{row.adjustmentAmount|number:'1.2-2'}}</td><td class="money">¥{{row.payableAmount|number:'1.2-2'}}</td></tr>}
|
|
|
- @empty{<tr><td colspan="8"><div class="empty">{{isSectionLoading('payroll')?'正在读取工资记录…':'该月暂无工资记录'}}</div></td></tr>}
|
|
|
+ @empty{<tr><td colspan="8"><div class="empty">{{isSectionLoading('payroll')?'正在读取费用记录…':'该月暂无费用记录'}}</div></td></tr>}
|
|
|
</tbody></table></div>
|
|
|
}
|
|
|
</section>
|