using Azure.Cosmos; using Azure.Messaging.ServiceBus; using HTEXLib.COMM.Helpers; using Microsoft.Azure.Documents; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TEAMModelOS.SDK; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK.Models; using TEAMModelOS.SDK.Models.Cosmos.Common; using TEAMModelOS.SDK.Models.Service; namespace TEAMModelFunction { public static class TriggerHomework { public static async void Trigger(AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing, CosmosClient client, Document input, TriggerData tdata, AzureRedisFactory _azureRedis, IConfiguration _configuration) { try { if ((tdata.status != null && tdata.status.Value == 404) || tdata.ttl > 0) { return; } var adid = tdata.id; var adcode = ""; string blobcntr = null; if (tdata.scope.Equals("school")) { adcode = $"Activity-{tdata.school}"; blobcntr = tdata.school; } else { adcode = $"Activity-{tdata.creatorId}"; blobcntr = tdata.creatorId; } await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}作业活动【{tdata.name}-{tdata.id}-ttl={tdata.ttl}】正在操作", GroupNames.成都开发測試群組); Homework work = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}")); if (work != null) { string PartitionKey = string.Format("{0}{1}{2}", work.code, "-", work.progress); List changeRecords = await _azureStorage.FindListByDict(new Dictionary() { { "RowKey", input.Id }, { "PartitionKey", PartitionKey } }); switch (work.progress) { case "pending": var messageWork = new ServiceBusMessage(new { id = input.Id, progress = "going", code = tdata.code }.ToJsonString()); messageWork.ApplicationProperties.Add("name", "Homework"); if (changeRecords.Count > 0) { await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber); long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.stime)); changeRecords[0].sequenceNumber = start; await _azureStorage.SaveOrUpdate(changeRecords[0]); } else { long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.stime)); ChangeRecord changeRecord = new ChangeRecord { RowKey = input.Id, PartitionKey = PartitionKey, sequenceNumber = start, msgId = messageWork.MessageId }; await _azureStorage.Save(changeRecord); } break; case "going": List<(string pId, List gid)> ps = new List<(string pId, List gid)>(); if (work.groupLists.Count > 0) { var group = work.groupLists; foreach (var gp in group) { foreach (KeyValuePair> pp in gp) { ps.Add((pp.Key, pp.Value)); } } } List classes = ExamService.getClasses(work.classes, work.stuLists); (List tmdids, List classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, classes, work.school, ps); var addStudentsCls = tmdids.FindAll(x => x.type == 2); var addTmdidsCls = tmdids.FindAll(x => x.type == 1); List stuActivities = new List(); List tmdActivities = new List(); List tchActivities = new List(); if (addTmdidsCls.IsNotEmpty()) { addTmdidsCls.ForEach(x => { tmdActivities.Add(new StuActivity { pk = "Activity", id = work.id, code = $"Activity-{x.id}", type = "Homework", name = work.name, startTime = work.startTime, endTime = work.endTime, scode = work.code, scope = work.scope, school = work.school, creatorId = work.creatorId, subjects = new List { "" }, blob = work.blob, owner = work.owner, createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), taskStatus = -1, classIds = classes }); }); } if (addStudentsCls.IsNotEmpty()) { addStudentsCls.ForEach(x => { stuActivities.Add(new StuActivity { pk = "Activity", id = work.id, code = $"Activity-{x.code.Replace("Base-", "")}-{x.id}", type = "Homework", name = work.name, startTime = work.startTime, endTime = work.endTime, scode = work.code, scope = work.scope, school = work.school, creatorId = work.creatorId, subjects = new List { "" }, blob = work.blob, owner = work.owner, createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), taskStatus = -1, classIds = classes }); }); } (List tchList, List classInfos) = await GroupListService.GetStutmdidListids(client, _dingDing, work.tchLists, work.school,ps); (string standard, List tmdids, string school, List update, int statistics) list = (null, null, null, new List { StatisticsService.OfflineRecord }, 0); if (tchList.IsNotEmpty()) { list.tmdids = tchList.Select(x => x.id).ToList(); School school = null; if (!string.IsNullOrEmpty(work.school)) { school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync(work.school, new Azure.Cosmos.PartitionKey("Base")); list.school = school.id; list.standard = school.standard; } tchList.ForEach(x => { tchActivities.Add(new StuActivity { pk = "Activity", id = work.id, code = $"Activity-{x.id}", type = "Homework", name = work.name, startTime = work.startTime, endTime = work.endTime, scode = work.code, scope = work.scope, school = work.school, creatorId = work.creatorId, subjects = new List { "" }, blob = work.blob, owner = work.owner, createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), taskStatus = -1, classIds = work.tchLists }); }); } await ActivityService.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities, tchActivities); await StatisticsService.SendServiceBus(list, _configuration, _serviceBus, client); var messageWorkEnd = new ServiceBusMessage(new { id = input.Id, progress = "finish", code = tdata.code }.ToJsonString()); messageWorkEnd.ApplicationProperties.Add("name", "Homework"); if (changeRecords.Count > 0) { long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.etime)); await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber); changeRecords[0].sequenceNumber = end; await _azureStorage.SaveOrUpdate(changeRecords[0]); } else { long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.etime)); ChangeRecord changeRecord = new ChangeRecord { RowKey = input.Id, PartitionKey = PartitionKey, sequenceNumber = end, msgId = messageWorkEnd.MessageId }; await _azureStorage.Save(changeRecord); } //if (bustasks.IsNotEmpty()) //{ // await Task.WhenAll(bustasks); //} break; case "finish": break; } } } catch (Exception ex) { await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}研修作业活动异常{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組); } } } }