ActivityService.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using Azure.Cosmos;
  2. using Azure.Storage.Blobs.Models;
  3. using Azure.Storage.Sas;
  4. using HTEXLib.COMM.Helpers;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.SDK.DI;
  12. using TEAMModelOS.SDK.Extension;
  13. using TEAMModelOS.SDK.Models;
  14. using TEAMModelOS.Services;
  15. namespace TEAMModelOS.SDK
  16. {
  17. public static class ActivityService
  18. {
  19. public static async Task<List<TeacherActivityDto>> TeacherActivityList(AzureCosmosFactory _azureCosmos,AzureStorageFactory _azureStorage, JsonElement request, string tmdid)
  20. {
  21. List<TeacherActivityDto> activities = new List<TeacherActivityDto>();
  22. HashSet<string> inviteActivityIds = new HashSet<string>();
  23. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  24. if (request.TryGetProperty("year", out JsonElement _year))
  25. {
  26. yearSql = $" and c.year={_year}";
  27. }
  28. //先获取邀请制的
  29. string sqlInvite = $"select value c from c join t in c.inviteTeachers where t.id='{tmdid}'";
  30. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityTeacher>(sqlInvite, "ActivityTeacher");
  31. inviteActivityIds= result.list.Select(z => z.id).ToHashSet();
  32. if (inviteActivityIds.Count>0)
  33. {
  34. string sqlActivity = $"select value c from c where c.id in ({string.Join(",", inviteActivityIds.Select(z => $"'{z}'"))}) {yearSql} ";
  35. var resultActivity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlInvite, "Activity");
  36. if (resultActivity.list.IsNotEmpty())
  37. {
  38. activities.AddRange(resultActivity.list);
  39. }
  40. }
  41. Teacher teacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>(tmdid, new PartitionKey("Base"));
  42. string schoolOwnerIn = string.Empty;
  43. string schoolIdIn = string.Empty;
  44. if (teacher.schools.IsNotEmpty())
  45. {
  46. schoolIdIn = $"and i.id in ({string.Join(",", teacher.schools.Select(z => $"'{z.schoolId}'"))})";
  47. schoolOwnerIn= $"and c.owner in ({string.Join(",", teacher.schools.Select(z => $"'{z.schoolId}'"))})";
  48. }
  49. //获取开放的
  50. {
  51. //完全开放 所有的学校
  52. string sqlOpen = $"select value c from c where c.scope='public' and (c.publish=1 or c.publish=2 ) and( ARRAY_LENGTH(c.invitedSchools)=0 or IS_DEFINED(c.invitedSchools) = false ) {yearSql} ";
  53. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlOpen, "Activity");
  54. activities.AddRange(resultOpen.list);
  55. if (!string.IsNullOrWhiteSpace(schoolIdIn))
  56. { //部分学校
  57. string sqlSchool = $"select value c from c join i in c.confirmedSchools where c.scope='public' and c.joinMode='enroll' and (c.publish=1 or c.publish=2 ) and i.status=1 {yearSql} {schoolIdIn} ";
  58. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlSchool, "Activity");
  59. activities.AddRange(resultSchool.list);
  60. }
  61. }
  62. string areaOwnerIn = string.Empty;
  63. var hasAreaSchools = teacher.schools.FindAll(z => !string.IsNullOrWhiteSpace(z.areaId));
  64. if (hasAreaSchools.IsNotEmpty())
  65. {
  66. areaOwnerIn = $"and c.owner in ({string.Join(",", hasAreaSchools.Select(z => $"'{z.areaId}'"))})";
  67. schoolIdIn = $"and i.id in ({string.Join(",", hasAreaSchools.Select(z => $"'{z.schoolId}'"))})";
  68. }
  69. //获取所有区级的
  70. if (!string.IsNullOrWhiteSpace(areaOwnerIn) && !string.IsNullOrEmpty(schoolIdIn))
  71. {
  72. string sqlOpen = $"select value c from c join i in c.confirmedSchools where c.scope='area' and c.joinMode='enroll' and (c.publish=1 or c.publish=2 ) and i.status=1 {yearSql} {areaOwnerIn} {schoolIdIn} ";
  73. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlOpen, "Activity");
  74. activities.AddRange(resultOpen.list);
  75. }
  76. //获取所有学校的
  77. if (!string.IsNullOrWhiteSpace(schoolOwnerIn))
  78. {
  79. string sqlSchool = $"select value c from c where c.scope='school' and c.joinMode='enroll' and (c.publish=1 or c.publish=2 ) {yearSql} {schoolOwnerIn} ";
  80. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlSchool, "Activity");
  81. activities.AddRange(resultSchool.list);
  82. }
  83. activities.ForEach(z =>
  84. {
  85. var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
  86. z.sas=blob_sas;
  87. });
  88. if (activities.IsNotEmpty())
  89. {
  90. string sql = $"select value c from c where c.pk='ActivityEnroll' and contains(c.code,'ActivityEnroll-') and c.id='{tmdid}' and c.activityId in ({string.Join(",", activities.Select(z => $"'{z.id}'"))})";
  91. var resultEnroll = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(sql);
  92. foreach (var enroll in resultEnroll.list)
  93. {
  94. var activityDto = activities.Find(z => z.id.Equals(enroll.activityId));
  95. if (activityDto!=null)
  96. {
  97. if (enroll.contest!=null && !string.IsNullOrWhiteSpace(enroll.contest.type))
  98. {
  99. activityDto.contestSign=1;
  100. activityDto.signTime=enroll.contest.enrollTime;
  101. activityDto.contestType=enroll.contest.type;
  102. }
  103. if (enroll.upload!=null && (enroll.upload.files.IsNotEmpty() || enroll.upload.sokrates.IsNotEmpty()))
  104. {
  105. activityDto.contestUpload=1;
  106. activityDto.uploadTime=enroll.upload.uploadTime;
  107. activityDto.uploadType=enroll.upload.type;
  108. }
  109. }
  110. }
  111. }
  112. return activities;
  113. }
  114. public static async Task<ReviewRule> UpsertReviewRule(ReviewRuleTree reviewRuleTree,Activity activity,AzureCosmosFactory _azureCosmos)
  115. {
  116. var nodes = new List<RuleConfig>();
  117. nodes= TreeToList(reviewRuleTree.trees, nodes);
  118. ReviewRule reviewRule = new ReviewRule() {
  119. id= activity.id,
  120. code="ReviewRule-disposable",
  121. pk="ReviewRule",
  122. name=reviewRuleTree.name,
  123. desc=reviewRuleTree.desc,
  124. owner=activity.owner,
  125. type="disposable",
  126. configs=nodes,
  127. sourceName=activity.name
  128. };
  129. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS,Constant.Normal).UpsertItemAsync(reviewRule,new Azure.Cosmos.PartitionKey(reviewRule.code));
  130. if (reviewRuleTree.upsertAsTemplate==1) {
  131. reviewRule.code="ReviewRule-template";
  132. reviewRule.type="template";
  133. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(reviewRule,new Azure.Cosmos.PartitionKey(reviewRule.code));
  134. }
  135. return reviewRule;
  136. }
  137. public static List<RuleConfig> TreeToList(List<RuleConfigTree> trees, List<RuleConfig> nodes) {
  138. trees = trees.OrderBy(x => x.order).ToList();
  139. List<RuleConfig> list = new List<RuleConfig>();
  140. trees.ForEach(x => {
  141. List<string> cids = new List<string>();
  142. if (x.children.IsNotEmpty())
  143. {
  144. x.children.ForEach(y => cids.Add(y.id));
  145. }
  146. var node = new RuleConfig
  147. {
  148. id = x.id,
  149. pid = x.pid,
  150. cids= cids,
  151. label = x.label,
  152. desc = x.desc,
  153. score = x.score,
  154. order = x.order,
  155. };
  156. list.Add(node);
  157. });
  158. nodes.AddRange(list);
  159. foreach (RuleConfigTree tree in trees)
  160. {
  161. if (null != tree.children && tree.children.Count > 0)
  162. {
  163. TreeToList(tree.children, nodes);
  164. }
  165. }
  166. return nodes;
  167. }
  168. public static List<RuleConfigTree> ListToTree(List<RuleConfig> noes)
  169. {
  170. List<RuleConfigTree> list = noes.ToJsonString().ToObject<List<RuleConfigTree>>();
  171. var res = from r in list group r by r.id into g select g;
  172. Dictionary<string, RuleConfigTree> blockDict = new Dictionary<string, RuleConfigTree>();
  173. foreach (var s in res)
  174. {
  175. blockDict.TryAdd(s.First().id, s.First());
  176. }
  177. return GetChild(list, blockDict);
  178. }
  179. private static List<RuleConfigTree> GetChild(List<RuleConfigTree> list, Dictionary<string, RuleConfigTree> dict)
  180. {
  181. List<RuleConfigTree> trees = new List<RuleConfigTree>();
  182. trees = trees.OrderBy(x => x.order).ToList();
  183. foreach (RuleConfigTree node in list)
  184. {
  185. bool flag = dict.TryGetValue(node.pid, out RuleConfigTree syllabus);
  186. if (flag && syllabus != null)
  187. {
  188. syllabus.children.Add(node);
  189. }
  190. else
  191. {
  192. trees.Add(node);
  193. }
  194. }
  195. return trees;
  196. }
  197. }
  198. }