123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- import { Component, OnInit, signal } from '@angular/core';
- import { CommonModule } from '@angular/common';
- import { RouterModule, Router } from '@angular/router';
- import { AuthService } from '../../../services/auth.service';
- import { WorkHourService } from '../../../services/work-hour.service';
- import { WorkHourDashboardData, MonthlyWorkHourStats, PerformanceLevel } from '../../../models/work-hour.model';
- @Component({
- selector: 'app-dashboard',
- imports: [CommonModule, RouterModule],
- templateUrl: './dashboard.html',
- styleUrl: './dashboard.scss'
- })
- export class Dashboard implements OnInit {
- // 添加today属性用于模板中的日期显示
- today = new Date();
-
- // 待办任务数据
- todoTasks = signal([
- { id: 1, title: '临时收款待核定', priority: 'high', source: 'reconciliation', dueTime: '10:30' },
- { id: 2, title: '报价待审核', priority: 'medium', source: 'project-records', dueTime: '14:00' },
- { id: 3, title: '素材成本待录入', priority: 'low', source: 'reconciliation', dueTime: '16:30' },
- { id: 4, title: '临时收款待核定', priority: 'high', source: 'reconciliation', dueTime: '11:00' },
- { id: 5, title: '销售监管提醒', priority: 'high', source: 'project-records', dueTime: '09:30' }
- ]);
- // 数据概览数据
- dashboardStats = signal({
- todayOrders: 12,
- pendingPayment: 156800,
- quotedProjects: 28,
- materialCostSaved: 8900
- });
- // 用户角色
- userRole = signal('teamLead'); // teamLead 或 juniorMember
- // 工时统计数据
- workHourDashboard = signal<WorkHourDashboardData | null>(null);
- monthlyStats = signal<MonthlyWorkHourStats[]>([]);
- showWorkHourModule = signal(false);
- constructor(private authService: AuthService, private workHourService: WorkHourService, private router: Router) {}
- ngOnInit(): void {
- // 初始化用户角色
- this.initializeUserRole();
-
- // 加载工时统计数据
- this.loadWorkHourData();
- }
-
- // 初始化用户角色
- initializeUserRole(): void {
- // 从AuthService获取用户角色
- const roles = this.authService.getUserRoles();
- // 默认使用teamLead角色
- let userRole = 'teamLead';
-
- // 如果用户有admin角色,也视为teamLead
- if (roles.includes('admin')) {
- userRole = 'teamLead';
- } else if (roles.length > 0) {
- // 否则使用第一个角色
- userRole = roles[0];
- }
-
- this.userRole.set(userRole);
-
- // 根据用户角色过滤待办任务
- this.filterTasksByRole();
- }
-
- // 根据用户角色过滤待办任务
- filterTasksByRole(): void {
- if (this.userRole() !== 'teamLead') {
- // 初级组员只显示非财务审批类任务
- const filteredTasks = this.todoTasks().filter(task =>
- task.title !== '临时收款待核定' && task.title !== '报价待审核'
- );
- this.todoTasks.set(filteredTasks);
- }
- }
-
- // 检查用户角色
- checkUserRole(requiredRole: string): boolean {
- return this.authService.hasRole(requiredRole);
- }
- // 处理待办任务点击
- handleTaskClick(task: any) {
- // 检查财务相关任务的权限
- if ((task.title === '临时收款待核定' || task.title === '报价待审核') && !this.checkUserRole('teamLead')) {
- console.warn('权限不足:只有组长可以处理此任务');
- return;
- }
-
- // 根据任务来源跳转到对应页面
- switch(task.source) {
- case 'reconciliation':
- window.location.href = '/finance/reconciliation';
- break;
- case 'project-records':
- window.location.href = '/finance/project-records';
- break;
- }
- }
- // 处理快捷操作点击
- handleQuickAction(action: string) {
- // 检查权限
- if ((action === 'recordPayment' || action === 'generateReport') && !this.checkUserRole('teamLead')) {
- console.warn('权限不足:只有组长可以执行此操作');
- return;
- }
-
- switch(action) {
- case 'newQuote':
- window.location.href = '/finance/project-records';
- break;
- case 'recordPayment':
- window.location.href = '/finance/reconciliation';
- break;
- case 'generateReport':
- window.location.href = '/finance/reports';
- break;
- case 'quotationApproval':
- this.router.navigate(['/finance/quotation-approval']);
- break;
- }
- }
- // 格式化金额显示
- formatAmount(amount: number): string {
- return new Intl.NumberFormat('zh-CN', { style: 'currency', currency: 'CNY' }).format(amount);
- }
- // 加载工时统计数据
- loadWorkHourData(): void {
- this.workHourService.getDashboardData().subscribe(data => {
- this.workHourDashboard.set(data);
- });
- this.workHourService.getMonthlyStats().subscribe(stats => {
- this.monthlyStats.set(stats);
- });
- }
- // 切换工时模块显示
- toggleWorkHourModule(): void {
- this.showWorkHourModule.set(!this.showWorkHourModule());
- }
- // 获取绩效等级颜色
- getPerformanceLevelColor(level: string): string {
- const colors: Record<string, string> = {
- 'S': '#ff6b6b',
- 'A': '#4ecdc4',
- 'B': '#45b7d1',
- 'C': '#96ceb4'
- };
- return colors[level] || '#ccc';
- }
- // 获取绩效等级人数
- getPerformanceLevelCount(level: string): number {
- const dashboard = this.workHourDashboard();
- if (!dashboard) return 0;
-
- const distribution = dashboard.performanceDistribution as Record<string, number>;
- return distribution[level] || 0;
- }
- // 获取绩效等级描述
- getPerformanceLevelDescription(level: string): string {
- const descriptions: Record<string, string> = {
- 'S': '卓越表现',
- 'A': '优秀表现',
- 'B': '良好表现',
- 'C': '待提升'
- };
- return descriptions[level] || '未知';
- }
- // 格式化工时显示
- formatWorkHours(hours: number): string {
- const days = Math.floor(hours / 8);
- const remainingHours = hours % 8;
-
- if (days > 0 && remainingHours > 0) {
- return `${days}天${remainingHours}小时`;
- } else if (days > 0) {
- return `${days}天`;
- } else {
- return `${remainingHours}小时`;
- }
- }
- }
|