using Microsoft.EntityFrameworkCore; using YD_WeChatApplet.Api.Entitys; using YD_WeChatApplet.Api.SmartSportsEntitys; using YD_WeChatApplet.Commons.Dto.HomeWork; using YD_WeChatApplet.Commons.Dto.Resource; using YD_WeChatApplet.Commons.Dto.School; using YD_WeChatApplet.Commons.Enum; using YD_WeChatApplet.Context; using YD_WeChatApplet.Services; namespace YD_WeChatApplet.Api.Services.Impl { public class ResourceService : IResourceService { public UserContext _userContext; public SmartSportsContext _sportsContext; public ResourceService(UserContext userContext, SmartSportsContext sportsContext) { _userContext = userContext; _sportsContext = sportsContext; } /// /// 获取资源类型列表 /// /// public async Task> ResourceTypes() { var res = await _userContext.ResourceType.Where(x => x.ParentId == 0).Select(x => new ComboBoxDto() { Id = x.Id, Name = x.TypeName }).ToListAsync(); return res; } /// /// 获取资源详情列表 /// /// /// public async Task> ResourceDetails(int id) { // 获取所有资源类型 var allResourceTypes = await _userContext.ResourceType.ToListAsync(); // 获取所有资源详情并按类型分组 var allDetails = await _userContext.ResourceDetails .Select(x => new ResourceDetailsDto { Id = x.Id, ResourceTypeId = x.ResourceTypeId, ResourceName = x.ResourceName, ImageUrl = x.ImageUrl, ResourceUrl = x.ResourceUrl }) .ToListAsync(); var detailsLookup = allDetails.ToLookup(x => x.ResourceTypeId); // 查找当前 id 对应的资源类型 var currentType = allResourceTypes.FirstOrDefault(t => t.Id == id); // 构建树形结构 var rootTypes = allResourceTypes .Where(t => t.ParentId == id) .ToList(); // 如果没有子节点(rootTypes.Count == 0),直接返回当前类型的资源详情 if (rootTypes.Count == 0) { return new List { new ResourceTypeTreeDto { Id = currentType.Id, TypeName = currentType.TypeName, ParentId = currentType.ParentId, IsLeaf = true, // 标记为叶子节点 ResourceDetails = detailsLookup[currentType.Id].ToList() } }; } var result = new List(); foreach (var type in rootTypes) { result.Add(BuildTreeWithLeafDetails(type, allResourceTypes, detailsLookup)); } return result; } private ResourceTypeTreeDto BuildTreeWithLeafDetails(WCA_ResourceType type, List allTypes, ILookup detailsLookup) { // 检查是否是叶子节点(没有子节点) var childrenTypes = allTypes.Where(t => t.ParentId == type.Id).ToList(); var isLeaf = childrenTypes.Count == 0; var node = new ResourceTypeTreeDto { Id = type.Id, TypeName = type.TypeName, ParentId = type.ParentId, IsLeaf = isLeaf, // 只有叶子节点才包含详情 ResourceDetails = isLeaf ? detailsLookup[type.Id].ToList() : new List() }; // 递归构建子节点 foreach (var childType in childrenTypes) { node.Children.Add(BuildTreeWithLeafDetails(childType, allTypes, detailsLookup)); } return node; } /// /// 获取教学资源 /// /// public async Task> SpecialLevelList() { var specials = await _sportsContext.Ai_Special.ToListAsync(); var levels = await _sportsContext.Ai_SpecialLevel .Where(s => specials.Select(x => x.Id).Contains(s.SpecialId)) .Include(s => s.SpecialActionList) .ToListAsync(); var levelDict = levels.GroupBy(s => s.SpecialId) .ToDictionary(g => g.Key, g => g.ToList()); return specials.Select(sp => new SpecialDto { Name = sp.SpecialName, LevelList = new List>> { new() { { "基本技能", levelDict.TryGetValue(sp.Id, out var levelsList) ? levelsList.Select(level => new SpecialLevelDto { Name = level.LevelName, ActionList = level.SpecialActionList .Where(a => a.ActionType == SpecialActionType.BasicSkill) .Select(a => new SpecialActionDto { Id = a.Id, ActionName = a.ActionName, ActionType = a.ActionType, ActionVideoPath = a.ActionVideoPath, ExerciseVideoPath = a.ExerciseVideoPath, ExplainVideoPath = a.ExplainVideoPath, StandardVideoPath = a.StandardVideoPath }).ToList() }).ToList() : new List() }, { "专项技能", levelDict.TryGetValue(sp.Id, out levelsList) ? levelsList.Select(level => new SpecialLevelDto { Name = level.LevelName, ActionList = level.SpecialActionList .Where(a => a.ActionType == SpecialActionType.SpecialStamina) .Select(a => new SpecialActionDto { Id = a.Id, ActionName = a.ActionName, ActionType = a.ActionType, ActionVideoPath = a.ActionVideoPath, ExerciseVideoPath = a.ExerciseVideoPath, ExplainVideoPath = a.ExplainVideoPath, StandardVideoPath = a.StandardVideoPath }).ToList() }).ToList() : new List() } } } }).ToList(); } } }