123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- using Microsoft.Azure.Cosmos;
- using Microsoft.Extensions.Configuration;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Services;
- namespace TEAMModelOS.SDK
- {
- public static class HomeworkService
- {
- public static async Task<List<HomeworkUser>> AnswerRecordAll(CosmosClient client, CoreAPIHttpService _coreAPIHttpService,DingDing _dingDing, Homework homework, string userid, string tbname,List<string> listIds , string _targetType= "student")
- {
- List<TypeUser> typeUsers = new List<TypeUser>();
- (List<RMember> tmdinfos, List<RGroupList> classInfo) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, listIds, homework.school, null, -1, homework.startTime);
- var addStudentsCls = tmdinfos.FindAll(x => x.type == 2);
- var addTmdidsCls = tmdinfos.FindAll(x => x.type == 1);
- if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase) || $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
- {
- if (tmdinfos.IsNotEmpty())
- {
- tmdinfos.ForEach(x => {
- var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
- typeUsers.Add(new TypeUser() { irs=x.irs, no=x.no, nickname =x.nickname, userid = x.id, userType = "tmdid", username = x.name, classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
- });
- }
- }
- else
- {
- if (addTmdidsCls.IsNotEmpty())
- {
- addTmdidsCls.ForEach(x => {
- var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
- typeUsers.Add(new TypeUser() { irs = x.irs, no = x.no, nickname = x.nickname, userid = x.id, userType = "tmdid", username = x.name, classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
- });
- }
- if (addStudentsCls.IsNotEmpty())
- {
- addStudentsCls.ForEach(x => {
- var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
- typeUsers.Add(new TypeUser() { irs = x.irs, no = x.no, nickname = x.nickname, userid = x.id, userType = "student", username = x.name, userSchool = x.code.Replace("Base-", ""), classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
- });
- }
- }
- List<dynamic> rscs = new List<dynamic>();
- string debateCode = "";
- string debateTbname = "";
- if (homework.scope.Equals("school"))
- {
- debateTbname = "School";
- debateCode = $"Debate-{homework.school}";
- }
- else
- {
- debateTbname = "Teacher";
- debateCode = $"Debate-{homework.creatorId}";
- }
- List<Debate> debates = new List<Debate>();
- string sql = $"select value(c) from c where c.comid='{homework.id}'";
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, debateTbname).GetItemQueryIteratorSql<Debate>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(debateCode) }))
- {
- debates.Add(item);
- }
- List<HomeworkUser> users = new List<HomeworkUser>();
- foreach (var typeuser in typeUsers)
- {
- var us = users.Find(x => x.userid.Equals(typeuser.userid));
- if (us != null) { continue; }
- HomeworkUser user = new HomeworkUser() { irs = typeuser.irs, no = typeuser.no, nickname = typeuser.nickname, userid = typeuser.userid, userSchool = typeuser.userSchool, userType = typeuser.userType, username = typeuser.username, classes = typeuser.classes };
- string partition = $"HomeworkRecord-{typeuser.userid}";
- if (typeuser.userType.Equals("student"))
- {
- partition = $"HomeworkRecord-{typeuser.userSchool}-{typeuser.userid}";
- }
- else
- {
- partition = $"HomeworkRecord-{typeuser.userid}";
- }
- HomeworkRecord record = null;
- try
- {
- record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{homework.id}", new PartitionKey(partition));
- double star = -1;
- List<double> stars = record.comments.FindAll(s => s.identity.Equals("student")).Select(x => x.star).ToList();
- if (stars.IsNotEmpty())
- {
- star = stars.Sum() / stars.Count;
- }
- user.submit = true;
- user.studentStar = star;
- user.score = record.score;
- user.submitTime = record.time;
- user.content = record.content;
- // user.username = typeuser.username;
- var teacherComment = record.comments.Where(x => x.identity.Equals("teacher") && record.teacher.Equals(userid)).FirstOrDefault();
- if (teacherComment != null)
- {
- user.teacherStar = teacherComment.star;
- List<string> replies = new List<string>();
- teacherComment.replyIds.ForEach(x => {
- var reply = debates.SelectMany(x => x.replies).ToList().Find(r => r.id.Equals(x));
- if (reply != null)
- {
- replies.Add(reply.comment);
- }
- });
- user.replies = replies;
- }
- }
- catch (CosmosException ex)
- {
- user.submit = false;
- record = null;
- }
- users.Add(user);
- }
- return users;
- }
- public static async Task<string> saveMoreAsync(CosmosClient client, DingDing _dingDing, Homework work, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, IConfiguration _configuration, AzureRedisFactory _azureRedis)
- {
- try
- {
- work.ttl = -1;
- work.code = "Homework-" + work.school;
- long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- work.createTime = now;
-
- string blobcntr = null;
- blobcntr = work.school;
- work.size = await _azureStorage.GetBlobContainerClient(work.school).GetBlobsSize($"homework/{work.id}");
- await BlobService.RefreshBlobRoot(new BlobRefreshMessage { progress = "insert", root = $"homework", name = $"{blobcntr}" }, _serviceBus, _configuration, _azureRedis);
- work.recordUrl = $"/homework/{work.id}/record.json";
- var cods = new { records = new List<string>(), userids = new List<string>(), question = new List<QuestionRecord>() };
- await _azureStorage.GetBlobContainerClient(blobcntr).UploadFileByContainer(cods.ToJsonString(), "homework", $"{work.id}/record.json");
- work.id = Guid.NewGuid().ToString();
- if (string.IsNullOrEmpty(work.id))
- {
- if (work.publish == 1)
- {
- work.progress = "pending";
- }
- else {
- if (work.startTime > now)
- {
- work.progress = "pending";
- }
- else
- {
- work.progress = "going";
- }
- }
-
- await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(work, new PartitionKey($"{work.code}"));
- }
- else
- {
- await client.GetContainer("TEAMModelOS", "Common").UpsertItemAsync(work, new PartitionKey($"{work.code}"));
- }
- return work.id;
- }
- catch (Exception e)
- {
- await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-HomeworkService-saveMore\n{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return "";
- }
- }
- }
- public class TypeUser
- {
- public string irs { get; set; }
- public string no { get; set; }
- public string nickname { get; set; }
- public string userid { get; set; }
- public string userType { get; set; }
- public string userSchool { get; set; }
- public string username { get; set; }
- public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
- }
- public class TypeUserClass
- {
- public string id { get; set; }
- public string name { get; set; }
- }
- public class HomeworkUser
- {
- public string irs { get; set; }
- public string no { get; set; }
- public string nickname { get; set; }
- public string userid { get; set; }
- public string userType { get; set; }
- public string userSchool { get; set; }
- public long submitTime { get; set; }
- public double score { get; set; } = -1;
- public double studentStar { get; set; } = -1;
- public double teacherStar { get; set; } = -1;
- public bool submit { get; set; }
- public string username { get; set; }
- public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
- public List<string> replies { get; set; } = new List<string>();
- public List<Attachment> content { get; set; } = new List<Attachment>();
- }
- }
|