using Microsoft.EntityFrameworkCore; using MilitaryTrainingManagement.Data; using MilitaryTrainingManagement.Models.Entities; using MilitaryTrainingManagement.Models.Enums; using MilitaryTrainingManagement.Services.Interfaces; namespace MilitaryTrainingManagement.Services.Implementations; /// /// 组织管理服务实现 /// public class OrganizationService : IOrganizationService { private readonly ApplicationDbContext _context; public OrganizationService(ApplicationDbContext context) { _context = context; } public async Task GetByIdAsync(int id) { return await _context.OrganizationalUnits .Include(u => u.Parent) .Include(u => u.Children) .FirstOrDefaultAsync(u => u.Id == id); } public async Task> GetAllAsync() { var allUnits = await _context.OrganizationalUnits .OrderBy(u => u.Level) .ThenBy(u => u.CreatedAt) // 按创建时间排序,新的在后面 .ToListAsync(); // 构建树形结构,只返回顶级节点(师团级) var rootUnits = allUnits.Where(u => u.ParentId == null).OrderBy(u => u.CreatedAt).ToList(); // 递归构建子节点 foreach (var root in rootUnits) { BuildChildrenTree(root, allUnits); } return rootUnits; } private void BuildChildrenTree(OrganizationalUnit parent, List allUnits) { var children = allUnits.Where(u => u.ParentId == parent.Id).OrderBy(u => u.CreatedAt).ToList(); parent.Children = children; foreach (var child in children) { child.Parent = parent; BuildChildrenTree(child, allUnits); } } public async Task> GetSubordinatesAsync(int unitId) { var unit = await _context.OrganizationalUnits.FindAsync(unitId); if (unit == null) return Enumerable.Empty(); return await GetAllSubordinatesRecursiveAsync(unitId); } private async Task> GetAllSubordinatesRecursiveAsync(int unitId) { var result = new List(); var directChildren = await _context.OrganizationalUnits .Where(u => u.ParentId == unitId) .ToListAsync(); foreach (var child in directChildren) { result.Add(child); var grandChildren = await GetAllSubordinatesRecursiveAsync(child.Id); result.AddRange(grandChildren); } return result; } public async Task CreateAsync(string name, OrganizationalLevel level, int? parentId) { if (parentId.HasValue) { var parent = await _context.OrganizationalUnits.FindAsync(parentId.Value); if (parent == null) throw new ArgumentException("父级组织单位不存在"); if ((int)level <= (int)parent.Level) throw new ArgumentException("子级组织层级必须低于父级"); } else if (level != OrganizationalLevel.Division) { throw new ArgumentException("非师团级组织必须有父级单位"); } var unit = new OrganizationalUnit { Name = name, Level = level, ParentId = parentId, CreatedAt = DateTime.UtcNow }; _context.OrganizationalUnits.Add(unit); await _context.SaveChangesAsync(); return unit; } public async Task UpdateAsync(int id, string name) { var unit = await _context.OrganizationalUnits.FindAsync(id); if (unit == null) throw new ArgumentException("组织单位不存在"); unit.Name = name; await _context.SaveChangesAsync(); return unit; } public async Task DeleteAsync(int id) { var unit = await _context.OrganizationalUnits .Include(u => u.Children) .FirstOrDefaultAsync(u => u.Id == id); if (unit == null) throw new ArgumentException("组织单位不存在"); if (unit.Children.Any()) throw new InvalidOperationException("无法删除有下级单位的组织"); // 检查是否有关联的用户账户 var hasUsers = await _context.UserAccounts .AnyAsync(u => u.OrganizationalUnitId == id); if (hasUsers) throw new InvalidOperationException("无法删除有关联用户的组织"); _context.OrganizationalUnits.Remove(unit); await _context.SaveChangesAsync(); } public async Task IsSubordinateOfAsync(int unitId, int potentialParentId) { var unit = await _context.OrganizationalUnits.FindAsync(unitId); if (unit == null) return false; var currentParentId = unit.ParentId; while (currentParentId.HasValue) { if (currentParentId.Value == potentialParentId) return true; var parent = await _context.OrganizationalUnits.FindAsync(currentParentId.Value); currentParentId = parent?.ParentId; } return false; } public async Task> GetAllSubordinateIdsAsync(int unitId) { var subordinates = await GetAllSubordinatesRecursiveAsync(unitId); return subordinates.Select(u => u.Id); } public async Task IsUnitOrSubordinateAsync(int userUnitId, int targetUnitId) { // 如果是同一个单位,直接返回true if (userUnitId == targetUnitId) return true; // 检查目标单位是否是用户单位的下级 return await IsSubordinateOfAsync(targetUnitId, userUnitId); } public async Task IsParentUnitAsync(int parentUnitId, int childUnitId) { var childUnit = await _context.OrganizationalUnits.FindAsync(childUnitId); if (childUnit == null) return false; // 检查直接父级关系 if (childUnit.ParentId == parentUnitId) return true; // 检查是否是上级单位(递归向上查找) return await IsSubordinateOfAsync(childUnitId, parentUnitId); } public async Task> GetAllAncestorIdsAsync(int unitId) { var result = new List(); var currentUnit = await _context.OrganizationalUnits.FindAsync(unitId); while (currentUnit?.ParentId != null) { result.Add(currentUnit.ParentId.Value); currentUnit = await _context.OrganizationalUnits.FindAsync(currentUnit.ParentId.Value); } return result; } }