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;
}
}
}