|
@@ -12,7 +12,6 @@ using TEAMModelOS.SDK.Helper.Security.ShaHash;
|
|
|
using TEAMModelOS.SDK.DI;
|
|
|
|
|
|
using TEAMModelOS.Service.Models;
|
|
|
-using TEAMModelOS.Service.Services.Implement;
|
|
|
using System.Text.Json;
|
|
|
using TEAMModelOS.SDK.Helper.Common.StringHelper;
|
|
|
using TEAMModelOS.SDK.Extension;
|
|
@@ -23,17 +22,16 @@ namespace TEAMModelOS.Controllers
|
|
|
[ApiController]
|
|
|
//[Authorize]
|
|
|
public class KnowledgeController : BaseController
|
|
|
- {
|
|
|
- private SnowflakeId SnowflakeId;
|
|
|
- private AzureStorageFactory _table;
|
|
|
- private AzureCosmosFactory _cosmos;
|
|
|
+ {
|
|
|
+ private readonly AzureStorageFactory _azureStorage;
|
|
|
+ private readonly AzureCosmosFactory _azureCosmos;
|
|
|
+ private readonly SnowflakeId _snowflakeId;
|
|
|
|
|
|
- public KnowledgeController(AzureStorageFactory table, AzureCosmosFactory cosmos , SnowflakeId _SnowflakeId)
|
|
|
+ public KnowledgeController(AzureStorageFactory azureStorage, AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId)
|
|
|
{
|
|
|
- SnowflakeId = _SnowflakeId;
|
|
|
- _table = table;
|
|
|
- _cosmos = cosmos;
|
|
|
-
|
|
|
+ _snowflakeId = snowflakeId;
|
|
|
+ _azureStorage = azureStorage;
|
|
|
+ _azureCosmos = azureCosmos;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -50,9 +48,9 @@ namespace TEAMModelOS.Controllers
|
|
|
/// </summary>
|
|
|
/// <typeparam name="T"></typeparam>
|
|
|
/// <param name="schoolBlock"></param>
|
|
|
- /// <param name="_cosmos"></param>
|
|
|
+ /// <param name="_azureCosmos"></param>
|
|
|
/// <returns></returns>
|
|
|
- delegate Task<string> SchoolSaveOrUpdate<T>(dynamic schoolBlock, AzureCosmosFactory _cosmos);
|
|
|
+ delegate Task<string> SchoolSaveOrUpdate<T>(dynamic schoolBlock, AzureCosmosFactory _azureCosmos);
|
|
|
|
|
|
// private delegate dynamic SaveOrUpdate(dynamic t);
|
|
|
|
|
@@ -69,7 +67,7 @@ namespace TEAMModelOS.Controllers
|
|
|
List<KnowledgePoint> data = new List<KnowledgePoint>();
|
|
|
if (request != null && request.PointParams.TryGetValue("SubjectCode", out _))
|
|
|
{
|
|
|
- List<KnowledgePoint> points = await _table.FindListByDict<KnowledgePoint>(request.PointParams);
|
|
|
+ List<KnowledgePoint> points = await _azureStorage.FindListByDict<KnowledgePoint>(request.PointParams);
|
|
|
if (request.Periods.IsNotEmpty())
|
|
|
{
|
|
|
HashSet<KnowledgePoint> knowledges = new HashSet<KnowledgePoint>();
|
|
@@ -109,8 +107,8 @@ namespace TEAMModelOS.Controllers
|
|
|
List<BlockPointDto> data = new List<BlockPointDto>();
|
|
|
if (request != null && request.PointParams.TryGetValue("SubjectCode", out _))
|
|
|
{
|
|
|
- List<KnowledgeBlockPoint> blockPoints = await _table.FindListByDict<KnowledgeBlockPoint>(request.PointParams);
|
|
|
- List<KnowledgeBlock> blocks = await _table.FindListByDict<KnowledgeBlock>(request.PointParams);
|
|
|
+ List<KnowledgeBlockPoint> blockPoints = await _azureStorage.FindListByDict<KnowledgeBlockPoint>(request.PointParams);
|
|
|
+ List<KnowledgeBlock> blocks = await _azureStorage.FindListByDict<KnowledgeBlock>(request.PointParams);
|
|
|
if (request.Periods.IsNotEmpty())
|
|
|
{
|
|
|
HashSet<KnowledgeBlock> knowledges = new HashSet<KnowledgeBlock>();
|
|
@@ -135,90 +133,6 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
|
|
|
}
|
|
|
- private static List<BlockPointDto> ListToTree(List<KnowledgeBlock> blocks, List<KnowledgeBlockPoint> points)
|
|
|
- {
|
|
|
- List<PointDto> pointList = points.ToJsonString().ToObject<List<PointDto>>();
|
|
|
- List<BlockPointDto> blockList = points.ToJsonString().ToObject<List<BlockPointDto>>();
|
|
|
- Dictionary<string, List<PointDto>> pointDict = new Dictionary<string, List<PointDto>>();
|
|
|
- List<string> 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);
|
|
|
-
|
|
|
- var res = from r in blockList group r by r.RowKey into g select g;
|
|
|
- Dictionary<string, BlockPointDto> blockDict = new Dictionary<string, BlockPointDto>();
|
|
|
- foreach (var s in res)
|
|
|
- {
|
|
|
- blockDict.TryAdd(s.First().RowKey, s.First());
|
|
|
- }
|
|
|
- return GetChild(blockList, blockDict, pointDict);
|
|
|
- }
|
|
|
- public static List<BlockPointDto> GetChild(List<BlockPointDto> list, Dictionary<string, BlockPointDto> blockDict, Dictionary<string, List<PointDto>> pointDict)
|
|
|
- {
|
|
|
- List<PointDto> empt = new List<PointDto>();
|
|
|
- list = list.OrderBy(m => m.Order).ToList();
|
|
|
- List<BlockPointDto> trees = new List<BlockPointDto>();
|
|
|
- foreach (BlockPointDto node in list)
|
|
|
- {
|
|
|
- node.Type = 0;
|
|
|
- bool fl = pointDict.TryGetValue(node.RowKey, out List<PointDto> points);
|
|
|
- if (fl && points.IsNotEmpty())
|
|
|
- {
|
|
|
- points.ForEach(m =>
|
|
|
- {
|
|
|
- node.Children.Add(new BlockPointDto
|
|
|
- {
|
|
|
- PartitionKey = m.PartitionKey,
|
|
|
- Pid = m.BlockId,
|
|
|
- RowKey = m.PointId,
|
|
|
- Type = 1,
|
|
|
- Order = m.Order,
|
|
|
- Name = m.Name,
|
|
|
- SubjectCode = m.SubjectCode,
|
|
|
- AdvicePeriodCode = m.AdvicePeriodCode,
|
|
|
- //Timestamp = m.Timestamp
|
|
|
- });
|
|
|
- });
|
|
|
- }
|
|
|
- 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();
|
|
|
- }
|
|
|
- public static List<BlockPointDto> FindTree(List<BlockPointDto> trees, String rowKey, List<BlockPointDto> blockPoints)
|
|
|
- {
|
|
|
- if (!string.IsNullOrEmpty(rowKey))
|
|
|
- {
|
|
|
- foreach (BlockPointDto tree in trees)
|
|
|
- {
|
|
|
- if (tree.RowKey.Equals(rowKey))
|
|
|
- {
|
|
|
- blockPoints.Add(tree);
|
|
|
- }
|
|
|
-
|
|
|
- if (null != tree.Children && tree.Children.Count > 0)
|
|
|
- {
|
|
|
- FindTree(tree.Children, rowKey, blockPoints);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- blockPoints = trees;
|
|
|
- }
|
|
|
- return blockPoints;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取知识
|
|
@@ -233,7 +147,7 @@ namespace TEAMModelOS.Controllers
|
|
|
List<Knowledge> data = new List<Knowledge>();
|
|
|
if (StringHelper.getKeyCount(request) > 0)
|
|
|
{
|
|
|
- data = await _cosmos.FindByDict<Knowledge>(request);
|
|
|
+ data = await _azureCosmos.FindByDict<Knowledge>(request);
|
|
|
data.ForEach(d =>
|
|
|
{
|
|
|
if (d.type == 1) {
|
|
@@ -269,7 +183,7 @@ namespace TEAMModelOS.Controllers
|
|
|
List<Knowledge> data = new List<Knowledge>();
|
|
|
if (request.IsNotEmpty())
|
|
|
{
|
|
|
- data = await _cosmos.FindByIds<Knowledge>(request);
|
|
|
+ data = await _azureCosmos.FindByIds<Knowledge>(request);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -293,7 +207,7 @@ namespace TEAMModelOS.Controllers
|
|
|
ResponseBuilder builder = ResponseBuilder.custom();
|
|
|
if (request.IsNotEmpty())
|
|
|
{
|
|
|
- List<Knowledge> ts = await KnowledgeService.SaveOrUpdateKnowledge(_cosmos,SnowflakeId,request);
|
|
|
+ List<Knowledge> ts = await SaveOrUpdateKnowledge(request);
|
|
|
if (ts.Count > 0) builder.Data(ts).Extend(new Dictionary<string, object> { { "count", ts.Count } });
|
|
|
else {
|
|
|
return builder.Error(ResponseCode.FAILED, "失败!").build();
|
|
@@ -318,57 +232,17 @@ namespace TEAMModelOS.Controllers
|
|
|
List<Knowledge> Knowledges = await deleteDelegate1(request, builder);
|
|
|
foreach (Knowledge Knowledge in Knowledges) {
|
|
|
if (Knowledge.type == 1) {
|
|
|
- List<Knowledge> knowledges = await _cosmos.FindSQL<Knowledge>("SELECT value(c) FROM c join a in c.points where c.pk='Knowledge'and Contains(a, '" + Knowledge.id + "') = true ");
|
|
|
- List<Resource> Resources = await _cosmos.FindSQL<Resource>("SELECT value(c) FROM c join a in c.points where c.pk='Resources' and Contains(a, '" + Knowledge.id + "') = true ");
|
|
|
+ List<Knowledge> knowledges = await _azureCosmos.FindSQL<Knowledge>("SELECT value(c) FROM c join a in c.points where c.pk='Knowledge'and Contains(a, '" + Knowledge.id + "') = true ");
|
|
|
+ List<Resource> Resources = await _azureCosmos.FindSQL<Resource>("SELECT value(c) FROM c join a in c.points where c.pk='Resources' and Contains(a, '" + Knowledge.id + "') = true ");
|
|
|
//select value(c) from c join A0 in c.points where 1=1 and A0 = @points0
|
|
|
foreach (Knowledge knowledge in knowledges) knowledge.points.Remove(Knowledge.id);
|
|
|
foreach (Resource Resource in Resources) Resource.points.Remove(Knowledge.id);
|
|
|
- await _cosmos.SaveOrUpdateAll(Resources);
|
|
|
- await _cosmos.SaveOrUpdateAll(knowledges);
|
|
|
+ await _azureCosmos.SaveOrUpdateAll(Resources);
|
|
|
+ await _azureCosmos.SaveOrUpdateAll(knowledges);
|
|
|
}
|
|
|
}
|
|
|
return builder.build();
|
|
|
- }
|
|
|
-
|
|
|
- private async Task<List<T>> Delete<T>(JsonElement request, ResponseBuilder builder) where T : ID
|
|
|
- {
|
|
|
- List<T> schoolBlocks = null;
|
|
|
- //Dictionary<string, object> dict = new Dictionary<string, object>();
|
|
|
- var emobj = request.EnumerateObject();
|
|
|
- int keys = 0;
|
|
|
- while (emobj.MoveNext())
|
|
|
- {
|
|
|
- keys++;
|
|
|
- //dict[emobj.Current.Name] = emobj.Current.Value;
|
|
|
- }
|
|
|
- if (keys > 0)
|
|
|
- {
|
|
|
- schoolBlocks = await _cosmos.FindByDict<T>(request);
|
|
|
- Type t = typeof(T);
|
|
|
- List<T> list = new List<T>();
|
|
|
- if (schoolBlocks.IsNotEmpty())
|
|
|
- {
|
|
|
- List<IdPk> idPks = await _cosmos.DeleteAll<T>(schoolBlocks);
|
|
|
- if (idPks.IsNotEmpty())
|
|
|
- {
|
|
|
- builder.Data("删除成功");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- builder.Error(ResponseCode.FAILED, "删除失败!");
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- else { builder.Error(ResponseCode.PARAMS_ERROR, "参数未定义!"); }
|
|
|
- return schoolBlocks;
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 统计个数
|
|
@@ -382,14 +256,14 @@ namespace TEAMModelOS.Controllers
|
|
|
//List<List<List<List<int>>>> allCount = new List<List<List<List<int>>>>();
|
|
|
ResponseBuilder builder = ResponseBuilder.custom();
|
|
|
if (StringHelper.getKeyCount(request) > 0) {
|
|
|
- List<School> sc = await _cosmos.FindByDict<School>(request);
|
|
|
+ List<School> sc = await _azureCosmos.FindByDict<School>(request);
|
|
|
//查询校本所有知识块
|
|
|
Dictionary<string, object> scMap = new Dictionary<string, object>
|
|
|
{
|
|
|
{ "type", 0},
|
|
|
{ "status", 1}
|
|
|
};
|
|
|
- List<Knowledge> knowlegeo = await _cosmos.FindByDict<Knowledge>(scMap);
|
|
|
+ List<Knowledge> knowlegeo = await _azureCosmos.FindByDict<Knowledge>(scMap);
|
|
|
|
|
|
for (int i = 0; i < sc.Count; i++)
|
|
|
{
|
|
@@ -429,5 +303,176 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
return builder.Data(sCount).build();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ #region private
|
|
|
+ private List<BlockPointDto> ListToTree(List<KnowledgeBlock> blocks, List<KnowledgeBlockPoint> points)
|
|
|
+ {
|
|
|
+ List<PointDto> pointList = points.ToJsonString().ToObject<List<PointDto>>();
|
|
|
+ List<BlockPointDto> blockList = points.ToJsonString().ToObject<List<BlockPointDto>>();
|
|
|
+ Dictionary<string, List<PointDto>> pointDict = new Dictionary<string, List<PointDto>>();
|
|
|
+ List<string> 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);
|
|
|
+
|
|
|
+ var res = from r in blockList group r by r.RowKey into g select g;
|
|
|
+ Dictionary<string, BlockPointDto> blockDict = new Dictionary<string, BlockPointDto>();
|
|
|
+ foreach (var s in res)
|
|
|
+ {
|
|
|
+ blockDict.TryAdd(s.First().RowKey, s.First());
|
|
|
+ }
|
|
|
+ return GetChild(blockList, blockDict, pointDict);
|
|
|
+ }
|
|
|
+ private List<BlockPointDto> GetChild(List<BlockPointDto> list, Dictionary<string, BlockPointDto> blockDict, Dictionary<string, List<PointDto>> pointDict)
|
|
|
+ {
|
|
|
+ List<PointDto> empt = new List<PointDto>();
|
|
|
+ list = list.OrderBy(m => m.Order).ToList();
|
|
|
+ List<BlockPointDto> trees = new List<BlockPointDto>();
|
|
|
+ foreach (BlockPointDto node in list)
|
|
|
+ {
|
|
|
+ node.Type = 0;
|
|
|
+ bool fl = pointDict.TryGetValue(node.RowKey, out List<PointDto> points);
|
|
|
+ if (fl && points.IsNotEmpty())
|
|
|
+ {
|
|
|
+ points.ForEach(m =>
|
|
|
+ {
|
|
|
+ node.Children.Add(new BlockPointDto
|
|
|
+ {
|
|
|
+ PartitionKey = m.PartitionKey,
|
|
|
+ Pid = m.BlockId,
|
|
|
+ RowKey = m.PointId,
|
|
|
+ Type = 1,
|
|
|
+ Order = m.Order,
|
|
|
+ Name = m.Name,
|
|
|
+ SubjectCode = m.SubjectCode,
|
|
|
+ AdvicePeriodCode = m.AdvicePeriodCode,
|
|
|
+ //Timestamp = m.Timestamp
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+ private List<BlockPointDto> FindTree(List<BlockPointDto> trees, String rowKey, List<BlockPointDto> blockPoints)
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrEmpty(rowKey))
|
|
|
+ {
|
|
|
+ foreach (BlockPointDto tree in trees)
|
|
|
+ {
|
|
|
+ if (tree.RowKey.Equals(rowKey))
|
|
|
+ {
|
|
|
+ blockPoints.Add(tree);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (null != tree.Children && tree.Children.Count > 0)
|
|
|
+ {
|
|
|
+ FindTree(tree.Children, rowKey, blockPoints);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ blockPoints = trees;
|
|
|
+ }
|
|
|
+ return blockPoints;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<List<T>> Delete<T>(JsonElement request, ResponseBuilder builder) where T : ID
|
|
|
+ {
|
|
|
+ List<T> schoolBlocks = null;
|
|
|
+ //Dictionary<string, object> dict = new Dictionary<string, object>();
|
|
|
+ var emobj = request.EnumerateObject();
|
|
|
+ int keys = 0;
|
|
|
+ while (emobj.MoveNext())
|
|
|
+ {
|
|
|
+ keys++;
|
|
|
+ //dict[emobj.Current.Name] = emobj.Current.Value;
|
|
|
+ }
|
|
|
+ if (keys > 0)
|
|
|
+ {
|
|
|
+ schoolBlocks = await _azureCosmos.FindByDict<T>(request);
|
|
|
+ Type t = typeof(T);
|
|
|
+ List<T> list = new List<T>();
|
|
|
+ if (schoolBlocks.IsNotEmpty())
|
|
|
+ {
|
|
|
+ List<IdPk> idPks = await _azureCosmos.DeleteAll<T>(schoolBlocks);
|
|
|
+ if (idPks.IsNotEmpty())
|
|
|
+ {
|
|
|
+ builder.Data("删除成功");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ builder.Error(ResponseCode.FAILED, "删除失败!");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else { builder.Error(ResponseCode.PARAMS_ERROR, "参数未定义!"); }
|
|
|
+ return schoolBlocks;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<List<IdPk>> DeleteKnowledge(List<IdPk> listPid)
|
|
|
+ {
|
|
|
+ List<IdPk> idPks = await _azureCosmos.DeleteAll<Knowledge>(listPid);
|
|
|
+ foreach (IdPk Knowledge in idPks)
|
|
|
+ {
|
|
|
+ List<Knowledge> knowledges = await _azureCosmos.FindSQL<Knowledge>($"select value(c) from c join A0 in c.points where 1=1 and c.pk='Knowledge' and c.type = 0 and A0 = '" + Knowledge.id + "' ");
|
|
|
+ List<Resource> Resources = await _azureCosmos.FindSQL<Resource>($"select value(c) from c join A0 in c.points where 1=1 and c.pk='Resource' and c.type = 0 and A0 = '" + Knowledge.id + "' ");
|
|
|
+ foreach (Knowledge knowledge in knowledges) knowledge.points.Remove(Knowledge.id);
|
|
|
+ foreach (Resource Resource in Resources) Resource.points.Remove(Knowledge.id);
|
|
|
+ await _azureCosmos.SaveOrUpdateAll(Resources);
|
|
|
+ await _azureCosmos.SaveOrUpdateAll(knowledges);
|
|
|
+ }
|
|
|
+ return idPks;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<List<Knowledge>> SaveOrUpdateKnowledge(List<Knowledge> request)
|
|
|
+ {
|
|
|
+ foreach (Knowledge item in request)
|
|
|
+ {
|
|
|
+ if (item.id == null)
|
|
|
+ {
|
|
|
+ item.id = _snowflakeId.NextId() + "";
|
|
|
+ }
|
|
|
+ if (item.type == 1 && item.points.Count > 0)
|
|
|
+ {
|
|
|
+ List<string> vs = item.points;
|
|
|
+ foreach (string s in vs)
|
|
|
+ {
|
|
|
+ List<Knowledge> knowledges = await _azureCosmos.FindByDict<Knowledge>(new Dictionary<string, object>() { { "id", s } });
|
|
|
+ foreach (Knowledge knowledge in knowledges)
|
|
|
+ {
|
|
|
+ knowledge.points.Remove(item.id);
|
|
|
+ knowledge.points.Add(item.id);
|
|
|
+ }
|
|
|
+ await _azureCosmos.SaveOrUpdateAll(knowledges);
|
|
|
+ }
|
|
|
+ item.points.Clear();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<Knowledge> ts = await _azureCosmos.SaveOrUpdateAll(request);
|
|
|
+ return ts;
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
}
|
|
|
}
|