ActivityService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. /// <summary>
  20. /// 生成组队口令
  21. /// </summary>
  22. /// <param name="client"></param>
  23. /// <param name="_dingDing"></param>
  24. /// <param name="_option"></param>
  25. /// <param name="_activityId"></param>
  26. /// <returns></returns>
  27. /// <exception cref="Exception"></exception>
  28. public static async Task<string> GenCipher(CosmosClient client, DingDing _dingDing, TEAMModelOS.Models.Option _option, string _activityId)
  29. {
  30. string _num09 = "123456789";
  31. string no = $"{Utils.CreatSaltString(7, _num09)}";
  32. for (int i = 0; i < 10; i++)
  33. {
  34. List<SheetConfig> sheets = new List<SheetConfig>();
  35. bool hasCurrFrom = false;
  36. string cipherSQL = $"select value c.id from c where c.contest!=null and c.activityId='{_activityId}' and c.contest.type=1 and c.contest.cipher='{no}' ";
  37. var cipherResult = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<string>(cipherSQL, $"ActivityEnroll-{_activityId}");
  38. if (cipherResult.list.IsNotEmpty() && cipherResult.list.Count>0) {
  39. hasCurrFrom = true;
  40. }
  41. if (hasCurrFrom)
  42. {
  43. if (i == 9)
  44. {
  45. string msg = $"{_option.Location},ActivityService/GenCipher\n 组队口令生成异常,重复生成次数超过10次";
  46. await _dingDing.SendBotMsg($"OS,{_option.Location},{msg}", GroupNames.醍摩豆服務運維群組);
  47. throw new Exception(msg);
  48. }
  49. else
  50. {
  51. no = $"{Utils.CreatSaltString(7, _num09)}";
  52. }
  53. }
  54. else { break; }
  55. }
  56. return no;
  57. }
  58. public static async Task<List<TeacherActivityDto>> TeacherActivityList(AzureCosmosFactory _azureCosmos,AzureStorageFactory _azureStorage, JsonElement request, string tmdid)
  59. {
  60. List<TeacherActivityDto> activities = new List<TeacherActivityDto>();
  61. HashSet<string> inviteActivityIds = new HashSet<string>();
  62. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  63. if (request.TryGetProperty("year", out JsonElement _year) && int.TryParse($"{_year}",out int year ))
  64. {
  65. yearSql = $" and c.year={year}";
  66. }
  67. //先获取邀请制的
  68. string sqlInvite = $"select value c from c join t in c.inviteTeachers where t.id='{tmdid}' and c.pk='ActivityTeacher'";
  69. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityTeacher>(sqlInvite);
  70. inviteActivityIds= result.list.Select(z => z.id).ToHashSet();
  71. if (inviteActivityIds.Count>0)
  72. {
  73. string sqlActivity = $"select value c from c where c.id in ({string.Join(",", inviteActivityIds.Select(z => $"'{z}'"))}) {yearSql} ";
  74. var resultActivity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlInvite, "Activity");
  75. if (resultActivity.list.IsNotEmpty())
  76. {
  77. activities.AddRange(resultActivity.list);
  78. }
  79. }
  80. Teacher teacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>(tmdid, new PartitionKey("Base"));
  81. string schoolOwnerIn = string.Empty;
  82. string schoolIdIn = string.Empty;
  83. if (teacher.schools.IsNotEmpty())
  84. {
  85. schoolIdIn = $"and i.id in ({string.Join(",", teacher.schools.Select(z => $"'{z.schoolId}'"))})";
  86. schoolOwnerIn= $"and c.owner in ({string.Join(",", teacher.schools.Select(z => $"'{z.schoolId}'"))})";
  87. }
  88. //获取开放的
  89. {
  90. //完全开放 所有的学校
  91. 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} ";
  92. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlOpen, "Activity");
  93. activities.AddRange(resultOpen.list);
  94. if (!string.IsNullOrWhiteSpace(schoolIdIn))
  95. { //部分学校
  96. 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} ";
  97. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlSchool, "Activity");
  98. activities.AddRange(resultSchool.list);
  99. }
  100. }
  101. string areaOwnerIn = string.Empty;
  102. var hasAreaSchools = teacher.schools.FindAll(z => !string.IsNullOrWhiteSpace(z.areaId));
  103. if (hasAreaSchools.IsNotEmpty())
  104. {
  105. areaOwnerIn = $"and c.owner in ({string.Join(",", hasAreaSchools.Select(z => $"'{z.areaId}'"))})";
  106. schoolIdIn = $"and i.id in ({string.Join(",", hasAreaSchools.Select(z => $"'{z.schoolId}'"))})";
  107. }
  108. //获取所有区级的
  109. if (!string.IsNullOrWhiteSpace(areaOwnerIn) && !string.IsNullOrEmpty(schoolIdIn))
  110. {
  111. 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} ";
  112. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlOpen, "Activity");
  113. activities.AddRange(resultOpen.list);
  114. }
  115. //获取所有学校的
  116. if (!string.IsNullOrWhiteSpace(schoolOwnerIn))
  117. {
  118. 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} ";
  119. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlSchool, "Activity");
  120. activities.AddRange(resultSchool.list);
  121. }
  122. activities.ForEach(z =>
  123. {
  124. var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read);
  125. z.sas=blob_sas;
  126. });
  127. if (activities.IsNotEmpty())
  128. {
  129. 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}'"))})";
  130. var resultEnroll = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(sql);
  131. foreach (var enroll in resultEnroll.list)
  132. {
  133. var activityDto = activities.Find(z => z.id.Equals(enroll.activityId));
  134. if (activityDto!=null)
  135. {
  136. if (enroll.contest!=null && !string.IsNullOrWhiteSpace(enroll.contest.cipher))
  137. {
  138. activityDto.contestSign=1;
  139. activityDto.signTime=enroll.contest.enrollTime;
  140. activityDto.contestType=enroll.contest.type;
  141. }
  142. if (enroll.upload!=null && (enroll.upload.files.IsNotEmpty() || enroll.upload.sokrates.IsNotEmpty()))
  143. {
  144. activityDto.contestUpload=1;
  145. activityDto.uploadTime=enroll.upload.uploadTime;
  146. activityDto.uploadType=enroll.upload.type;
  147. }
  148. }
  149. }
  150. }
  151. return activities;
  152. }
  153. public static async Task<ReviewRule> UpsertReviewRule(ReviewRuleTree reviewRuleTree,Activity activity,AzureCosmosFactory _azureCosmos)
  154. {
  155. var nodes = new List<RuleConfig>();
  156. nodes= TreeToList(reviewRuleTree.trees, nodes);
  157. ReviewRule reviewRule = new ReviewRule() {
  158. id= activity.id,
  159. code="ReviewRule-disposable",
  160. pk="ReviewRule",
  161. name=reviewRuleTree.name,
  162. desc=reviewRuleTree.desc,
  163. owner=activity.owner,
  164. type="disposable",
  165. configs=nodes,
  166. sourceName=activity.name
  167. };
  168. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS,Constant.Normal).UpsertItemAsync(reviewRule,new Azure.Cosmos.PartitionKey(reviewRule.code));
  169. if (reviewRuleTree.upsertAsTemplate==1) {
  170. reviewRule.code="ReviewRule-template";
  171. reviewRule.type="template";
  172. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(reviewRule,new Azure.Cosmos.PartitionKey(reviewRule.code));
  173. }
  174. return reviewRule;
  175. }
  176. public static List<RuleConfig> TreeToList(List<RuleConfigTree> trees, List<RuleConfig> nodes) {
  177. trees = trees.OrderBy(x => x.order).ToList();
  178. List<RuleConfig> list = new List<RuleConfig>();
  179. trees.ForEach(x => {
  180. List<string> cids = new List<string>();
  181. if (x.children.IsNotEmpty())
  182. {
  183. x.children.ForEach(y => cids.Add(y.id));
  184. }
  185. var node = new RuleConfig
  186. {
  187. id = x.id,
  188. pid = x.pid,
  189. cids= cids,
  190. label = x.label,
  191. desc = x.desc,
  192. score = x.score,
  193. order = x.order,
  194. };
  195. list.Add(node);
  196. });
  197. nodes.AddRange(list);
  198. foreach (RuleConfigTree tree in trees)
  199. {
  200. if (null != tree.children && tree.children.Count > 0)
  201. {
  202. TreeToList(tree.children, nodes);
  203. }
  204. }
  205. return nodes;
  206. }
  207. public static List<RuleConfigTree> ListToTree(List<RuleConfig> noes)
  208. {
  209. List<RuleConfigTree> list = noes.ToJsonString().ToObject<List<RuleConfigTree>>();
  210. var res = from r in list group r by r.id into g select g;
  211. Dictionary<string, RuleConfigTree> blockDict = new Dictionary<string, RuleConfigTree>();
  212. foreach (var s in res)
  213. {
  214. blockDict.TryAdd(s.First().id, s.First());
  215. }
  216. return GetChild(list, blockDict);
  217. }
  218. private static List<RuleConfigTree> GetChild(List<RuleConfigTree> list, Dictionary<string, RuleConfigTree> dict)
  219. {
  220. List<RuleConfigTree> trees = new List<RuleConfigTree>();
  221. trees = trees.OrderBy(x => x.order).ToList();
  222. foreach (RuleConfigTree node in list)
  223. {
  224. bool flag = dict.TryGetValue(node.pid, out RuleConfigTree syllabus);
  225. if (flag && syllabus != null)
  226. {
  227. syllabus.children.Add(node);
  228. }
  229. else
  230. {
  231. trees.Add(node);
  232. }
  233. }
  234. return trees;
  235. }
  236. }
  237. }