using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using MilitaryTrainingManagement.Data; using MilitaryTrainingManagement.Models.Enums; namespace MilitaryTrainingManagement.Controllers; /// /// 统计数据控制器 /// [Authorize] public class StatsController : BaseApiController { private readonly ApplicationDbContext _context; public StatsController(ApplicationDbContext context) { _context = context; } /// /// 获取首页统计数据 /// [HttpGet("dashboard")] public async Task GetDashboardStats() { var unitId = GetCurrentUnitId(); var unitLevel = GetCurrentUnitLevel(); if (unitId == null || unitLevel == null) return Unauthorized(new { message = "无法获取用户组织信息" }); // 获取当前单位及下级单位ID列表 var unitIds = await GetUnitAndSubordinateIds(unitId.Value); // 统计配额数 var allocationsCount = await _context.MaterialAllocations .Where(a => a.CreatedByUnitId == unitId.Value || unitIds.Contains(a.CreatedByUnitId)) .CountAsync(); // 统计完成率 var distributions = await _context.AllocationDistributions .Where(d => unitIds.Contains(d.TargetUnitId)) .ToListAsync(); decimal completionRate = 0; if (distributions.Any()) { var totalQuota = distributions.Sum(d => d.UnitQuota); var totalCompletion = distributions.Sum(d => d.ActualCompletion ?? 0); if (totalQuota > 0) { completionRate = Math.Round((totalCompletion / totalQuota) * 100, 1); } } // 统计人员数 var personnelCount = await _context.Personnel .Where(p => unitIds.Contains(p.SubmittedByUnitId) && p.Status == PersonnelStatus.Approved) .CountAsync(); // 统计待审批数(仅师团级别显示) var pendingApprovals = 0; if (unitLevel == OrganizationalLevel.Division) { pendingApprovals = await _context.ApprovalRequests .Where(r => r.Status == ApprovalStatus.Pending) .CountAsync(); // 加上待审批的人员 pendingApprovals += await _context.Personnel .Where(p => p.Status == PersonnelStatus.Pending) .CountAsync(); } return Ok(new { allocations = allocationsCount, completionRate = completionRate, personnel = personnelCount, pendingApprovals = pendingApprovals }); } private async Task> GetUnitAndSubordinateIds(int unitId) { var result = new List { unitId }; var children = await _context.OrganizationalUnits .Where(u => u.ParentId == unitId) .Select(u => u.Id) .ToListAsync(); foreach (var childId in children) { var subIds = await GetUnitAndSubordinateIds(childId); result.AddRange(subIds); } return result; } }