{{ pageTitles[pg]||pg }}
{{ clk }}
{{ auth.role }}
🔒
🚪
{{ todayStr }}
👥
{{ d.TotalEmployees||0 }}
{{ t('dash.totalEmp') }}
+{{ d.NewEmployeesThisMonth||0 }} {{ t('dash.thisMonth') }}
✅
{{ d.PresentToday||0 }}
{{ t('dash.present') }}
{{ d.AbsentToday||0 }} {{ t('dash.absent') }}
⏰
{{ d.LateToday||0 }}
{{ t('dash.late') }}
{{ t('dash.workDays') }}: {{ d.WorkingDaysThisMonth||0 }}
🌿
{{ d.PendingLeave||0 }}
{{ t('dash.pendLeave') }}
💰
{{ fmt(d.ThisMonthPayroll?.TotalNet||0) }}
{{ t('dash.thisPayroll') }}
{{ t('pay.s.'+d.ThisMonthPayroll?.Status?.toLowerCase()) }}
🚀 {{ t('dash.quickAccess') }}
📊 {{ t('dash.attTrend') }}
🏢 {{ t('dash.deptDist') }}
📢 {{ t('nav.announcements') }}
{{ t('common.noData') }}
{{ t('ann.'+a.Priority?.toLowerCase()) }}
{{ a.Category }}
{{ lang==='zh'?a.TitleZh:lang==='en'?a.TitleEn:a.TitleVi }}
{{ fd(a.StartDate) }}{{ a.CreatedBy }}
🌿 {{ t('dash.recentLeave') }}
{{ t('common.noData') }}
| {{ t('emp.name') }} | {{ t('lv.type') }} | {{ t('lv.days') }} | {{ t('common.status') }} |
|---|---|---|---|
| {{ l.EmployeeName }} | {{ ltnById(l.LeaveTypeId) }} | {{ l.Days }} | {{ t('lv.s.'+l.Status?.toLowerCase()) }} |
📋 {{ t('emp.reportMenu') }}
👥
{{ empSt.Total }}
{{ t('emp.total') }}
✅
{{ empSt.Active }}
{{ t('emp.s.active') }}
🔄
{{ empSt.Probation }}
{{ t('emp.s.probation') }}
❌
{{ empSt.Resigned }}
{{ t('emp.s.resigned') }}
🔍
{{ filtEmps.length }} 笔
每页
笔
第 {{ ep }} / {{ epTotal }} 页
| {{ t('emp.workUnit') }} | {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('emp.gender') }} | {{ t('emp.hire') }} | {{ t('emp.pos') }} | {{ t('emp.workType') }} | {{ t('common.status') }} | {{ t('common.actions') }} | |
|---|---|---|---|---|---|---|---|---|---|
👤 {{ t('common.noData') }} | |||||||||
| {{ e.WorkUnit||'—' }} | {{ e.EmployeeNo }} |
{{ (e.Name||'E').charAt(0) }}
{{ e.Name }}{{ e.Name2?' '+e.Name2:'' }} {{ e.Email||e.Phone }} |
{{ e.Gender==='Male'?t('emp.male'):e.Gender==='Female'?t('emp.female'):'—' }} | {{ fd(e.HireDate) }} | {{ e.PositionName||'—' }} | {{ e.WorkType||'—' }} | {{ t('emp.s.'+e.Status?.toLowerCase()) }} |
|
|
{{ t('common.page') }} {{ ep }} / {{ epTotal }}
🔍
| {{ t('dept.name') }} | {{ t('dept.code') }} | {{ t('dept.workUnit') }} | {{ t('dept.activeCount') }} | {{ t('dept.resignedCount') }} | {{ t('dept.notes') }} | {{ t('dept.enabled') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|
🏢 {{ t('common.noData') }} | |||||||
| {{ d.Name }} | {{ d.Code }} | {{ d.WorkUnit||'—' }} | {{ d.ActiveCount||0 }} | {{ d.ResignedCount||0 }} | {{ d.Notes||'—' }} | {{ d.IsActive?t('common.active'):t('common.inactive') }} | |
🔍
| {{ t('pos.code') }} | {{ t('pos.name') }} | {{ t('pos.base') }} | {{ t('pos.notes') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|
💼 {{ t('common.noData') }} | |||||
| {{ p.Code }} | {{ p.Name }} | {{ fmt(p.BaseSalary) }} | {{ p.Notes||'—' }} | {{ p.IsActive?t('common.active'):t('common.inactive') }} | |
🔍
| {{ t('wt.code') }} | {{ t('wt.name') }} | {{ t('wt.bonus') }} | {{ t('wt.notes') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|
🔧 {{ t('common.noData') }} | |||||
| {{ w.Code }} | {{ w.Name }} | {{ fmt(w.Bonus) }} | {{ w.Notes||'—' }} | {{ w.IsActive?t('common.active'):t('common.inactive') }} | |
~
{{ atts.length }} {{ t('common.recs') }} | {{ t('att.page') }}: {{ attPage+1 }}/{{ Math.max(1,Math.ceil(atts.length/attPageSize)) }}
🔍
| {{ t('att.date') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('emp.no') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('emp.name') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.shiftCode') }} | {{ t('emp.dept') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('emp.workUnit') }} | {{ t('emp.pos') }} | {{ t('emp.workType') }} | {{ t('att.p1') }} | {{ t('att.p2') }} | {{ t('att.p3') }} | {{ t('att.p4') }} | {{ t('att.p5') }} | {{ t('att.p6') }} | {{ t('att.abnormal') }} | {{ t('att.hAM') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.hPM') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.hNight') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.hOT') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.hNOT') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.hWork') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.hSun') }} | {{ t('att.hSunOT') }} | {{ t('att.late') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.earlyLeave') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('att.leaveType') }} | {{ t('att.leaveDays') }} {{ attSort.dir==='asc'?'↑':'↓' }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
⏱️ {{ t('common.noData') }} | |||||||||||||||||||||||||||
| {{ fd(a.Date) }} {{ a.DayOfWeek }} | {{ a.EmployeeNo }} | {{ a.EmployeeName }} | {{ a.ShiftCode }}— | {{ a.DepartmentName }} | {{ a.WorkUnit||'—' }} | {{ a.PositionName||'—' }} | {{ a.WorkType||'—' }} | {{ a.Punch1In||'—' }} | {{ a.Punch1Out||'—' }} | {{ a.Punch2In||'—' }} | {{ a.Punch2Out||'—' }} | {{ a.Punch3In||'—' }} | {{ a.Punch3Out||'—' }} | {{ formatAbnormalPunches(a.AbnormalPunches) }} ⚠️— | {{ a.HoursAM||'' }} | {{ a.HoursPM||'' }} | {{ a.HoursNight||'' }} | {{ a.HoursOT }}{{ a.HoursOT||'' }} | {{ a.HoursNightOT }}{{ a.HoursNightOT||'' }} | {{ a.HoursWork||'' }} | {{ a.HoursSunday||'' }} | {{ a.HoursSundayOT||'' }} | {{ a.Late }}— | {{ a.EarlyLeave }}— | {{ ltnByCode(a.LeaveType) }} | {{ a.LeaveDays||'' }} | |
| {{ t('att.summary') }}: | {{ (attSummary.totalAM||0).toFixed(2) }} | {{ (attSummary.totalPM||0).toFixed(2) }} | {{ (attSummary.totalNight||0).toFixed(2) }} | {{ (attSummary.totalOT||0).toFixed(2) }} | {{ (attSummary.totalNightOT||0).toFixed(2) }} | {{ (attSummary.totalWork||0).toFixed(2) }} | {{ (attSummary.totalSunday||0).toFixed(2) }} | {{ (attSummary.totalSundayOT||0).toFixed(2) }} | {{ attSummary.totalLate }} | {{ attSummary.totalEarlyLeave }} |
第 {{ attPage+1 }} / {{ Math.ceil(atts.length/attPageSize) }} 页(每页{{ attPageSize }}条)
🔍
每页
笔
第 {{ swPage }} / {{ swPages }} 页
| {{ t('swipe.time') }} | {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('emp.dept') }} | {{ t('swipe.cardNo') }} | {{ t('swipe.dir') }} | {{ t('swipe.device') }} | {{ t('swipe.verify') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|---|
💳 {{ t('common.noData') }} | ||||||||
| {{ fdt(s.SwipeTime) }} | {{ s.EmployeeNo }} | {{ s.EmployeeName }} | {{ s.DepartmentName||'—' }} | {{ s.CardNo||'—' }} | {{ s.Direction==='In'?t('swipe.in'):t('swipe.out') }} | {{ s.DeviceName||'—' }} | {{ s.VerifyMethod||'—' }} | |
| {{ t('shift.code') }} | {{ t('shift.name') }} | {{ t('shift.detailCount') }} | {{ t('shift.totalHours') }} | {{ t('pos.notes') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|
🕐 {{ t('common.noData') }} | ||||||
| {{ s.Code }} | {{ s.Name }} | {{ (s.Details||[]).length }} {{ t('shift.items') }} | {{ (s.Details||[]).reduce((a,d)=>a+d.Hours,0) }}h | {{ s.Notes||'—' }} | {{ s.IsActive?t('common.active'):t('common.inactive') }} | |
① {{ t('sch.lv1') }}
② {{ t('sch.lv2') }}
③ {{ t('sch.lv3') }}
④ {{ t('sch.lv4') }}
| {{ t('emp.dept') }} | {{ t('emp.workUnit') }} | {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('sch.start') }} | {{ t('sch.end') }} | {{ t('sch.shift') }} | {{ t('pos.notes') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|---|
📆 {{ t('common.noData') }} | ||||||||
| {{ s.DepartmentName||'—' }} | {{ s.WorkUnit||'—' }} | {{ s.EmployeeNo }} | {{ s.EmployeeName }} | {{ fd(s.StartDate) }} | {{ fd(s.EndDate) }} | {{ s.ShiftCode }}-{{ s.ShiftName }} | {{ s.Notes||'—' }} |
{{ t('sch.priority') }}: ④ {{ t('sch.lv4') }} > ③ {{ t('sch.lv3') }} > ② {{ t('sch.lv2') }} > ① {{ t('sch.lv1') }}
| {{ t('hol.zhName') }} | {{ t('hol.enName') }} | {{ t('hol.viName') }} | {{ t('hol.date') }} | {{ t('hol.type') }} | {{ t('hol.recurring') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|
📅 {{ t('common.noData') }} | ||||||
| {{ h.NameZh }} | {{ h.NameEn }} | {{ h.NameVi }} | {{ fd(h.Date) }} | {{ h.Type }} | {{ h.IsRecurring?'✅':'—' }} | |
📋 {{ ot.DocNo }}
{{ fd(ot.Date) }}
{{ ot.Notes }}
| 工作单位 | 员工编号 | 姓名 | 开始时间 | 结束时间 | 加班类别 |
|---|---|---|---|---|---|
| {{ item.WorkUnit }} | {{ item.EmployeeNo }} | {{ item.EmployeeName }} | {{ fdt(item.StartTime) }} | {{ fdt(item.EndTime) }} | {{ item.Type }} |
⏰
暂无加班记录{{ t('lv.orders') }} {{ pendLeave }}
{{ t('lv.balance') }}
| {{ t('lv.reqNo') }} | {{ t('lv.type') }} | {{ t('lv.start') }} | {{ t('lv.end') }} | {{ t('lv.days') }} | {{ t('lv.empCount') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|
🌿 {{ t('common.noData') }} | |||||||
| {{ o.RequestNo }} | {{ ltnById(o.LeaveTypeId) }} | {{ fd(o.StartDate) }} {{ o.StartPeriod==='AM'?t('lv.am'):t('lv.pm') }} | {{ fd(o.EndDate) }} {{ o.EndPeriod==='AM'?t('lv.am'):t('lv.pm') }} | {{ o.Days }} | {{ o.EmpCount }} {{ t('lv.people') }} | {{ t('lv.s.'+o.Status?.toLowerCase()) }} |
|
| {{ t('emp.name') }} | {{ t('emp.no') }} | {{ t('lv.type') }} | {{ t('lv.total') }} | {{ t('lv.used') }} | {{ t('lv.pending') }} | {{ t('lv.remaining') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|
{{ t('common.noData') }} | |||||||
| {{ b.EmployeeName }} | {{ b.EmployeeNo }} | {{ lang==='zh'?b.LeaveTypeNameZh:lang==='en'?b.LeaveTypeNameEn:b.LeaveTypeNameVi }} | {{ b.TotalDays }} | {{ b.UsedDays }} | {{ b.PendingDays }} | {{ b.RemainingDays }} | |
| {{ t('pos.code') }} | {{ t('wt.name') }} | {{ t('lv.maxDays') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|
🏷️ {{ t('common.noData') }} | ||||
| {{ lt.Code }} | {{ ltn(lt) }} | {{ lt.MaxDaysPerYear||'∞' }} | {{ lt.IsActive?t('common.active'):t('common.inactive') }} | |
{{ t('pay.periods') }}
{{ t('pay.records') }}
| {{ t('pay.period') }} | {{ t('pay.emps') }} | {{ t('pay.gross') }} | {{ t('pay.deduct') }} | {{ t('pay.net') }} | {{ t('common.status') }} | {{ t('pay.calcDate') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|
💰 {{ t('common.noData') }} | |||||||
| {{ p.Year }}-{{ String(p.Month).padStart(2,'0') }} | {{ p.TotalEmployees }} | {{ fmt(p.TotalGross) }} | {{ fmt(p.TotalDeduction) }} | {{ fmt(p.TotalNet) }} | {{ t('pay.s.'+p.Status?.toLowerCase()) }} | {{ fdt(p.CalcDate) }} |
|
| {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('emp.dept') }} | {{ t('pay.workDays') }} | {{ t('pay.amtBasic') }} | {{ t('pay.gross') }} | {{ t('pay.deduct') }} | {{ t('pay.net') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|---|---|
{{ t('common.noData') }} | ||||||||
| {{ r.EmployeeNo }} | {{ r.EmployeeName }} | {{ r.DepartmentName }} | {{ r.WorkDays }} | {{ fmt(r.AmtBasic) }} | {{ fmt(r.GrossSalary) }} | {{ fmt(r.TotalDeduction) }} | {{ fmt(r.NetSalary) }} | |
| {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('adv.amount') }} | {{ t('adv.date') }} | {{ t('adv.reason') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|---|
💳 {{ t('common.noData') }} | ||||||
| {{ a.EmployeeNo }} | {{ a.EmployeeName }} | {{ fmt(a.Amount) }} | {{ fd(a.Date) }} | {{ a.Reason }} | {{ t('lv.s.'+a.Status?.toLowerCase()) }} | |
加载中...
共 {{ mxData.Rows.length }} 人
| 单位 | 工号 | 姓名 | 项目1 | 项目2 |
{{dc.Day}} {{'日一二三四五六'[dc.DayOfWeek]}} |
上班 | 加班 | 夜加班 | 夜班 | 星期天 | 星期天加班 |
{{lt.Code}} {{lt.Name}} |
备注 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{row.WorkUnit}} | {{row.EmployeeNo}} | {{row.Name}} | 职务:{{row.PositionName}} | 打卡 | {{t}} {{row.Row1[dc.Day]||''}} | {{row.SumWork||''}} | {{row.SumOT||''}} | {{row.SumNightOT||''}} | {{row.SumNight||''}} | {{row.SumSunday||''}} | {{row.SumSundayOT||''}} | {{row.LvSums[lt.Code]||''}} | |
| 入职:{{row.HireDate}} | 上班 | {{row.Row2[dc.Day]||''}} | |||||||||||
| 离职:{{row.ResignDate||'—'}} | 加班 | {{row.Row3[dc.Day]||''}} | |||||||||||
| 暂无资料 |
请选择月份后查询
💰 {{ t('rpt.payroll') }}
⏱ {{ t('rpt.attendance') }}
🌿 {{ t('rpt.leave') }}
💰 {{ t('rpt.monthlySalary') }}
📋 {{ t('rpt.yearTotal') }}
📊
{{ fmt(rptPay.YearTotal?.Gross||0) }}
{{ t('pay.gross') }}
➖
{{ fmt(rptPay.YearTotal?.Deduction||0) }}
{{ t('pay.deduct') }}
💵
{{ fmt(rptPay.YearTotal?.Net||0) }}
{{ t('pay.net') }}
📅 {{ t('rpt.monthlyDetail') }}
| {{ t('pay.period') }} | {{ t('pay.emps') }} | {{ t('pay.gross') }} | {{ t('pay.deduct') }} | {{ t('pay.net') }} | {{ t('common.status') }} |
|---|---|---|---|---|---|
| {{ m.Label }} | {{ m.TotalEmployees }} | {{ fmt(m.TotalGross) }} | {{ fmt(m.TotalDeduction) }} | {{ fmt(m.TotalNet) }} | {{ t('pay.s.'+(m.Status||'draft').toLowerCase()) }} |
📊 {{ t('rpt.attMonthly') }}
| {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('emp.dept') }} | {{ t('emp.pos') }} | 应出勤 | 实出勤 | 缺勤 | 迟到 | 早退 | {{ t('att.ot') }}(h) | 工时 |
|---|---|---|---|---|---|---|---|---|---|---|
{{ t('common.noData') }} | ||||||||||
| {{ r.EmployeeNo }} | {{ r.Name }} | {{ r.DepartmentName }} | {{ r.PositionName }} | {{ r.WorkingDays }} | {{ r.PresentDays }} | {{ r.AbsentDays }} | {{ r.LateTimes }} | {{ r.EarlyLeaveTimes||0 }} | {{ r.OvertimeHours }} | {{ r.TotalWorkHours }} |
📊 {{ t('rpt.attByDept') }}
📋 部门排名
{{ idx+1 }}. {{ d.DepartmentName }}{{ d.EmployeeCount }}人
工时: {{ d.TotalWorkHours }}h | 加班: {{ d.TotalOTHours }}h
📅 部门详情
| 部门 | 人数 | 总工时 | 总加班 | 迟到次数 | 早退次数 | 缺勤天数 | 人均工时 |
|---|---|---|---|---|---|---|---|
{{ t('common.noData') }} | |||||||
| {{ d.DepartmentName }} | {{ d.EmployeeCount }} | {{ d.TotalWorkHours }} | {{ d.TotalOTHours }} | {{ d.LateTimes }} | {{ d.EarlyLeaveTimes }} | {{ d.AbsentDays }} | {{ d.AvgWorkHours }} |
⏰ {{ t('rpt.otRanking') }}
🏆 TOP 10
{{ ['🥇','🥈','🥉'][idx]||'🏅' }}{{ emp.Name }}
{{ emp.TotalOTHours }}h
{{ emp.DepartmentName }} | {{ emp.PositionName }}
📅 加班详情
| 排名 | {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('emp.dept') }} | {{ t('emp.pos') }} | 总加班 | 日间加班 | 夜班加班 | 加班天数 |
|---|---|---|---|---|---|---|---|---|
{{ t('common.noData') }} | ||||||||
| {{ idx+1 }} | {{ emp.EmployeeNo }} | {{ emp.Name }} | {{ emp.DepartmentName }} | {{ emp.PositionName }} | {{ emp.TotalOTHours }} | {{ emp.NormalOT }} | {{ emp.NightOT }} | {{ emp.OTDays }} |
⚠️ {{ t('rpt.abnormal') }}
⚠️
{{ rptAttAbnormal?.Summary?.TotalAbnormal||0 }}
异常总数
🕐
{{ rptAttAbnormal?.Summary?.TotalLate||0 }}
迟到次数
🕔
{{ rptAttAbnormal?.Summary?.TotalEarlyLeave||0 }}
早退次数
📱
{{ rptAttAbnormal?.Summary?.TotalAbnormalPunch||0 }}
异常打卡
🕐 迟到记录
| 日期 | {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('emp.dept') }} | 迟到(分) | 打卡时间 |
|---|---|---|---|---|---|
无迟到记录 | |||||
| {{ fd(r.Date) }} | {{ r.EmployeeNo }} | {{ r.EmployeeName }} | {{ r.DepartmentName }} | {{ r.Minutes }} | {{ r.Punch1In }} |
🕔 早退记录
| 日期 | {{ t('emp.no') }} | {{ t('emp.name') }} | {{ t('emp.dept') }} | 早退(分) | 打卡时间 |
|---|---|---|---|---|---|
无早退记录 | |||||
| {{ fd(r.Date) }} | {{ r.EmployeeNo }} | {{ r.EmployeeName }} | {{ r.DepartmentName }} | {{ r.Minutes }} | {{ r.Punch }} |
{{ t('rpt.byType') }}
📊 {{ t('rpt.lvSummary') }}
📋
{{ rptLv.TotalRequests }}
{{ t('rpt.total') }}
✅
{{ rptLv.ApprovedTotal }}
{{ t('lv.s.approved') }}
⏳
{{ rptLv.PendingTotal }}
{{ t('lv.s.pending') }}
❌
{{ rptLv.RejectedTotal }}
{{ t('lv.s.rejected') }}
{{ lang==='zh'?bt.NameZh:lang==='en'?bt.NameEn:bt.NameVi }}{{ bt.ApprovedDays }}d
| {{ t('ann.title') }} | {{ t('ann.cat') }} | {{ t('ann.priority') }} | {{ t('ann.start') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|
📢 {{ t('common.noData') }} | |||||
| {{ lang==='zh'?a.TitleZh:lang==='en'?a.TitleEn:a.TitleVi }} | {{ a.Category }} | {{ t('ann.'+a.Priority?.toLowerCase()) }} | {{ fd(a.StartDate) }} | {{ a.IsActive?t('common.active'):t('common.inactive') }} | |
| {{ t('user.username') }} | {{ t('user.role') }} | {{ t('user.fullName') }} | {{ t('user.empId') }} | {{ t('common.status') }} | {{ t('common.actions') }} |
|---|---|---|---|---|---|
{{ t('common.noData') }} | |||||
| {{ u.Username }} | {{ u.Role }} | {{ u.FullName }} | {{ u.EmployeeId||'—' }} | {{ u.IsActive?t('common.active'):t('common.inactive') }} | |
💎 {{ t('nav.salaryConfig') }}
⚙️ {{ t('nav.systemSettings') }}
🕐 打卡显示次数
考勤记录表格显示的打卡列数
💾 {{ t('cfg.backup') }}
📂 {{ t('cfg.restore') }}
{{ t('cfg.restoreHint') }}
📋 操作日志
共 {{ auditTotal }} 笔
| 操作时间 | 操作人 | 操作类型 | 员工编号 | 员工姓名 | 详情 |
|---|---|---|---|---|---|
| 暂无记录 | |||||
| {{ fdt(log.CreatedAt) }} | {{ log.OperatorName }} | {{ log.ActionType==='HardDeleteEmployee'?'🗑 永久删除员工': log.ActionType==='EditEmployee'?'✏️ 修改员工': log.ActionType==='TerminateEmployee'?'🚫 失效员工': log.ActionType==='EditAttendance'?'✏️ 修改考勤': log.ActionType==='DeleteAttendance'?'🗑 删除考勤':log.ActionType==='AttGenDeleteAttendance'?'🤖 合并计算删除':'❓ '+log.ActionType }} | {{ log.TargetNo }} | {{ log.TargetName }} | — |
第 {{ auditPage }} / {{ auditPages }} 页
🔍 操作详情 — {{ auditDetailLog.OperatorName }} @ {{ fdt(auditDetailLog.CreatedAt) }}
{{ auditDetailLog.ActionType }}
{{ auditDetailLog.TargetNo }} {{ auditDetailLog.TargetName }}
修改内容对比
考勤日期:{{ auditDetailData.Date }}
| 栏位 | 修改前 | 修改后 |
|---|---|---|
| 无变更栏位 | ||
| {{ d.Field }} | {{ d.Before||'—' }} | {{ d.After||'—' }} |
删除前完整资料
{{ val||'—' }}
{{ auditDetailLog.Remark }}
🏢 {{ t('dev.companyConfig') }}
🗄️ {{ t('dev.databaseConfig') }}
ℹ️ 提示:修改数据库连接配置后需要重启系统才能生效。请确保在非业务高峰期进行操作。
{{ dbCfg.testResult.success?'✅ 连接成功':'❌ 连接失败' }}
{{ dbCfg.testResult.message }}
{{ dbCfg.testResult.message }}
📊 {{ t('dev.system') }}
YHKQ {{ APP_VERSION }} · {{ APP_DATE }}
SQL Server 2014
ASP.NET Core 8.0
Vue 3
5103
admin / 1231234
root / 2233++
http://localhost:5103/api
🎲 {{ t('dev.testDataMgmt') }}
⚠️ {{ t('dev.warning').split(':')[0] }}:{{ t('dev.warning').split(':')[1] }}
🎲 {{ t('cfg.genTest') }}
生成指定数量的随机测试员工数据
🗑️ {{ t('cfg.clearData') }}
{{ t('cfg.clearHint') }}
🔐 Root密码修改
⚠️ 注意:修改root密码后请牢记新密码,忘记密码只能通过重启系统自动重置为默认密码 2233++
🏢 {{ t('cfg.company') }}
{{ t('tpl.fieldProp') }}
👆
{{ t('tpl.clickHint') }}
📊 {{ currentExcelTpl.name }}
📝 使用说明
在Excel模板中使用占位符,导出时会自动替换为实际数据。
格式:
格式:
{{字段名}}
🔖 可用字段 (点击复制)
{{field.label}}
{{ field.name }}
💡 提示:点击字段即可复制占位符
文件名
{{ currentExcelTpl.fileName }}
文件大小
{{ formatFileSize(currentExcelTpl.fileSize) }}
上传时间
{{ new Date(currentExcelTpl.uploadTime).toLocaleDateString('zh-CN') }}
📊
还没有Excel模板
点击"上传模板"按钮添加第一个模板