using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TEAMModelOS.SDK.Context.Exception; using TEAMModelOS.SDK.Helper.Common.CollectionHelper; using TEAMModelOS.SDK.Helper.Common.JsonHelper; using TEAMModelOS.SDK.Module.AzureCosmosDBV3; using TEAMModelOS.Service.Models.Syllabus; using TEAMModelOS.Service.Services.Syllabus.Interface; namespace TEAMModelOS.Service.Services.Syllabus.Implement { public class SyllabusService: ISyllabusService { private readonly IAzureCosmosDBV3Repository azureCosmosDBRepository; public SyllabusService(IAzureCosmosDBV3Repository azureCosmosDBRepository) { this.azureCosmosDBRepository = azureCosmosDBRepository; } /// /// 查找课纲 /// /// /// public async Task> Find(Dictionary request) { Dictionary dict = new Dictionary(); foreach (KeyValuePair keyValuePair in request) { dict.Add("children[*]." + keyValuePair.Key, keyValuePair.Value); } List data = await azureCosmosDBRepository.FindByDict(dict); List treess = new List(); if (data.IsNotEmpty()) { Dictionary syllabuses = new Dictionary(); data.ForEach(x => syllabuses.TryAdd(x.id, x)); data = new List(syllabuses.Values); foreach (Syllabuses item in data) { List nodedata = item.children; if (request.TryGetValue("id", out object id)) { foreach (SyllabusNode syllabus in nodedata) { if (syllabus.id == id.ToString()) { List nodes = new List(); nodes.Add(syllabus); await FindByPid(syllabus, nodes, nodedata); nodedata = nodes; break; } } } List treess1 = ListToTree(nodedata); treess.AddRange(treess1); //treess.AddRange(treess1); } // return builder.Data(treess).build(); } // else return builder.Data(data).build(); return treess; } public static async Task> FindByPid(SyllabusNode data, List nodes, List nodedata) { foreach (SyllabusNode syllabus in nodedata) { if (syllabus.pid == data.id) { nodes.Add(syllabus); await FindByPid(syllabus, nodes, nodedata); } } return nodes; } public async Task> SaveOrUpdateAsNodes(List syllabusNodes) { List syllabuses = new List(); List data = await azureCosmosDBRepository.FindByDict(new Dictionary { { "id", syllabusNodes[0].volumeCode } }); List syllabusNodes1 = new List(); if (data.IsNotEmpty()) { syllabusNodes1.AddRange(data[0].children); //replace for (int i = 0; i < data[0].children.Count; i++) { for (int j = 0; j < syllabusNodes.Count; j++) { if (data[0].children[i].id == syllabusNodes[j].id && data[0].children[i].volumeCode == syllabusNodes[j].volumeCode) { syllabusNodes1.Remove(data[0].children[i]); syllabusNodes1.Add(syllabusNodes[j]); syllabusNodes.Remove(syllabusNodes[j]); } } } data[0].children = syllabusNodes1; //新增 data[0].children.AddRange(syllabusNodes); syllabuses = await azureCosmosDBRepository.SaveOrUpdateAll(data); } else { throw new BizException("保存失败", ResponseCode.FAILED); //return builder.Error(false, ResponseCode.FAILED, "保存失败").build(); } return syllabuses; } public async Task> SaveOrUpdateAsTree(List request) { List nodes = new List(); Syllabuses syllabus = new Syllabuses(); TreeToList(request, nodes); // List nods = nodes.ToJson().FromJson>() ; syllabus.children = nodes; syllabus.id = request[0].volumeCode; syllabus.volumeCode = request[0].volumeCode; await azureCosmosDBRepository.SaveOrUpdate(syllabus); List treess = ListToTree(nodes); return treess; } public static List TreeToList(List trees, List nodes) { trees = trees.OrderBy(x => x.order).ToList(); nodes.AddRange(trees.ToJson().FromJson>()); foreach (SyllabusTree tree in trees) { if (null != tree.children && tree.children.Count > 0) { TreeToList(tree.children, nodes); } } return nodes; } private static List ListToTree(List noes) { List list = noes.ToJson().FromJson>(); //var lookup = list.ToDictionary(n => n.RowKey, n => n); var res = from r in list group r by r.id into g select g; Dictionary blockDict = new Dictionary(); foreach (var s in res) { blockDict.TryAdd(s.First().id, s.First()); } return GetChild(list, blockDict); } public static List GetChild(List list, Dictionary dict) { // list = list.OrderBy(m => m.Order).ToList(); List trees = new List(); foreach (SyllabusTree node in list) { bool flag = dict.TryGetValue(node.pid, out SyllabusTree syllabus); if (flag && syllabus != null) { syllabus.children.Add(node); } else { trees.Add(node); } } return trees; } public async Task> DeleteSyllabus(Dictionary request) { Dictionary dict = new Dictionary(); foreach (KeyValuePair keyValuePair in request) { dict.Add("children[*]." + keyValuePair.Key, keyValuePair.Value); } List data = await azureCosmosDBRepository.FindByDict(dict); Dictionary syllabuses = new Dictionary(); List data1 = new List(); if (data.Count > 0) { data.ForEach(x => syllabuses.TryAdd(x.id, x)); data = new List(syllabuses.Values); //是否全删 bool flg = false; foreach (Syllabuses item in data) { List nodedata = item.children; if (request.TryGetValue("id", out object id)) { foreach (SyllabusNode syllabus in nodedata) { if (syllabus.id == id.ToString()) { List nodes = new List(); nodes.Add(syllabus); await FindByPid(syllabus, nodes, nodedata); nodedata = nodes; break; } } } List syllabusNodes = new List(); syllabusNodes.AddRange(item.children); for (int i = 0; i < item.children.Count; i++) { for (int j = 0; j < nodedata.Count; j++) { if (item.children[i].id == nodedata[j].id) { syllabusNodes.Remove(item.children[i]); } } } item.children = syllabusNodes; if (item.children.Count == 0) { await azureCosmosDBRepository.DeleteAsync(item.id, item.volumeCode); flg = true; } } if (!flg) { data1 = await azureCosmosDBRepository.SaveOrUpdateAll(data); } //if (flg) //{ // return builder.Data("全部删除成功").build(); //} //else //{ // List data1 = await azureCosmosDBRepository.SaveOrUpdateAll(data); // return builder.Data(data1).build(); //} } return data1; } } }