using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TEAMModelOS.Model.Syllabus.Dtos; using TEAMModelOS.Model.Syllabus.Models; using TEAMModelOS.SDK.Helper.Common.CollectionHelper; using TEAMModelOS.SDK.Helper.Common.JsonHelper; using TEAMModelOS.Service.Core.Implements; using TEAMModelOS.Service.Syllabus.Interfaces; namespace TEAMModelOS.Service.Syllabus.Implements { public class KnowledgeService : BaseService, IKnowledgeService { public async Task> FindKnowledgePointByDict(KnowledgeDto knowledgePoint) { List points = await FindListByDict(knowledgePoint.PointParams); if (knowledgePoint.Periods.IsNotEmpty()) { HashSet knowledges = new HashSet(); foreach (string period in knowledgePoint.Periods) { if (!string.IsNullOrEmpty(period)) { knowledges.UnionWith(points.Where(x => x.AdvicePeriodCode.Contains(period)).ToHashSet()); } } return knowledges.OrderBy(x=>x.Order).ToList(); } return points.OrderBy(x => x.Order).ToList(); } public async Task> FindKnowledgeBlockAndPointByDict(KnowledgeDto knowledgePoint) { List blocks = await FindListByDict(knowledgePoint.PointParams); List blockPoints = await FindListByDict(knowledgePoint.PointParams); if (knowledgePoint.Periods.IsNotEmpty()) { HashSet knowledges = new HashSet(); HashSet knowledgeBlocks = new HashSet(); foreach (string period in knowledgePoint.Periods) { if (!string.IsNullOrEmpty(period)) { knowledges.UnionWith(blocks.Where(x => x.AdvicePeriodCode.Contains(period)).ToHashSet()); knowledgeBlocks.UnionWith(blockPoints.Where(x => x.AdvicePeriodCode.Contains(period)).ToHashSet()); } } blocks= knowledges.OrderBy(x => x.Order).ToList(); blockPoints= knowledgeBlocks.OrderBy(x => x.Order).ToList(); } return ListToTree(blocks, blockPoints); } private List ListToTree(List blocks ,List points) { List pointList = MessagePackHelper.JsonToObject>(MessagePackHelper.ObjectToJson(points)); List blockList = MessagePackHelper.JsonToObject>(MessagePackHelper.ObjectToJson(blocks)); Dictionary> pointDict = new Dictionary>(); List keys = (pointList.GroupBy(c => c.BlockId).Select(group => group.Key)).ToList(); foreach (string key in keys) { pointDict.Add(key, pointList.Where(x => x.BlockId.Equals(key)).ToList()); } var blockDict = blockList.ToDictionary(n => n.RowKey, n => n); return GetChild(blockList, blockDict , pointDict); } public List GetChild(List list, Dictionary blockDict, Dictionary> pointDict) { List empt = new List(); list = list.OrderBy(m => m.Order).ToList(); List trees = new List(); foreach (BlockPointDto node in list) { bool fl= pointDict.TryGetValue(node.RowKey,out List points); if (fl && points.IsNotEmpty()) { node.Points = points; } else { node.Points = empt; } bool flag = blockDict.TryGetValue(node.Pid, out BlockPointDto syllabus); if (flag && syllabus != null) { syllabus.Children.Add(node); } else { trees.Add(node); } } return trees.OrderBy(x=>x.Order).ToList(); } } }