فهرست منبع

update 中间件 节制时间 新增作答标识

zhouj1203@hotmail.com 2 سال پیش
والد
کامیت
15272b5773

+ 5 - 2
TEAMModelOS.FunctionV4/CosmosDB/CommonTrigger.cs

@@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
+using System.Net.Http;
 using System.Text;
 using System.Text;
 using System.Text.Json;
 using System.Text.Json;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
@@ -22,10 +23,11 @@ namespace TEAMModelOS.FunctionV4
         private readonly AzureStorageFactory _azureStorage;
         private readonly AzureStorageFactory _azureStorage;
         private readonly DingDing _dingDing;
         private readonly DingDing _dingDing;
         private readonly AzureRedisFactory _azureRedis;
         private readonly AzureRedisFactory _azureRedis;
+        private readonly IHttpClientFactory _httpClient;
         private IConfiguration _configuration { get; set; }
         private IConfiguration _configuration { get; set; }
         private readonly CoreAPIHttpService _coreAPIHttpService;
         private readonly CoreAPIHttpService _coreAPIHttpService;
         public CommonTrigger(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, AzureServiceBusFactory azureServiceBus, AzureStorageFactory azureStorage, DingDing dingDing, AzureRedisFactory azureRedis
         public CommonTrigger(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, AzureServiceBusFactory azureServiceBus, AzureStorageFactory azureStorage, DingDing dingDing, AzureRedisFactory azureRedis
-          , IConfiguration configuration
+          , IConfiguration configuration, IHttpClientFactory httpClient
           )
           )
         {
         {
             _azureCosmos = azureCosmos;
             _azureCosmos = azureCosmos;
@@ -35,6 +37,7 @@ namespace TEAMModelOS.FunctionV4
             _azureRedis = azureRedis;
             _azureRedis = azureRedis;
             _configuration = configuration;
             _configuration = configuration;
             _coreAPIHttpService=coreAPIHttpService;
             _coreAPIHttpService=coreAPIHttpService;
+            _httpClient = httpClient;
         }
         }
         [Function("Common")]
         [Function("Common")]
         public async Task Common([CosmosDBTriggerAttribute(
         public async Task Common([CosmosDBTriggerAttribute(
@@ -80,7 +83,7 @@ namespace TEAMModelOS.FunctionV4
                                 switch (data.pk)
                                 switch (data.pk)
                                 {
                                 {
                                     case "Exam":
                                     case "Exam":
-                                        await TriggerExam.Trigger(_coreAPIHttpService, _azureCosmos, _serviceBus, _azureStorage, _dingDing, client, element, data);
+                                        await TriggerExam.Trigger(_coreAPIHttpService, _azureCosmos, _serviceBus, _azureStorage, _dingDing, client, element, data, _httpClient, _configuration);
                                         break;
                                         break;
                                     case "Vote":
                                     case "Vote":
                                         await TriggerVote.Trigger(_coreAPIHttpService, _serviceBus, _azureStorage, _dingDing, client, element, data, _azureRedis, _configuration);
                                         await TriggerVote.Trigger(_coreAPIHttpService, _serviceBus, _azureStorage, _dingDing, client, element, data, _azureRedis, _configuration);

+ 45 - 22
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -26,13 +26,18 @@ using TEAMModelOS.SDK.Models.Cosmos.Common;
 using DocumentFormat.OpenXml.Office2010.Excel;
 using DocumentFormat.OpenXml.Office2010.Excel;
 using DocumentFormat.OpenXml.Drawing.Charts;
 using DocumentFormat.OpenXml.Drawing.Charts;
 using DocumentFormat.OpenXml.Vml;
 using DocumentFormat.OpenXml.Vml;
+using System.Net.Http;
+using Newtonsoft.Json;
+using System.Net;
+using System.Security.Policy;
+using Microsoft.Extensions.Configuration;
 
 
 namespace TEAMModelOS.FunctionV4
 namespace TEAMModelOS.FunctionV4
 {
 {
     public class TriggerExam
     public class TriggerExam
     {
     {
         public static async Task Trigger(CoreAPIHttpService _coreAPIHttpService, AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
         public static async Task Trigger(CoreAPIHttpService _coreAPIHttpService, AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
-            CosmosClient client, JsonElement input, TriggerData data)
+            CosmosClient client, JsonElement input, TriggerData data, IHttpClientFactory _httpClient, IConfiguration _configuration)
         {
         {
 
 
             List<ExamClassResult> examClassResults = new();
             List<ExamClassResult> examClassResults = new();
@@ -339,7 +344,7 @@ namespace TEAMModelOS.FunctionV4
                                     {
                                     {
                                         if (subject.classCount == classes.Count)
                                         if (subject.classCount == classes.Count)
                                         {
                                         {
-                                            await createClassResultAsync(info, examClassResults, subject, gno, _azureCosmos, _dingDing, _azureStorage);
+                                            await createClassResultAsync(info, examClassResults, subject, gno, _azureCosmos, _dingDing, _azureStorage,_httpClient,_configuration);
                                         }
                                         }
                                         gno++;
                                         gno++;
                                     }
                                     }
@@ -418,7 +423,7 @@ namespace TEAMModelOS.FunctionV4
                                 await Activity(_coreAPIHttpService, info, classes, client, _dingDing, sub, examClassResults);
                                 await Activity(_coreAPIHttpService, info, classes, client, _dingDing, sub, examClassResults);
                                 foreach (ExamSubject subject in info.subjects)
                                 foreach (ExamSubject subject in info.subjects)
                                 {
                                 {
-                                    await createClassResultAsync(info, examClassResults, subject, fno, _azureCosmos, _dingDing, _azureStorage);
+                                    await createClassResultAsync(info, examClassResults, subject, fno, _azureCosmos, _dingDing, _azureStorage,_httpClient, _configuration);
                                     fno++;
                                     fno++;
                                 }
                                 }
                                 //判断均分是否发生变化,便于实时的更新评测基本信息
                                 //判断均分是否发生变化,便于实时的更新评测基本信息
@@ -1059,8 +1064,10 @@ namespace TEAMModelOS.FunctionV4
                         double allScore = 0;
                         double allScore = 0;
                         int count = 0;
                         int count = 0;
                         int m = 0;
                         int m = 0;
-                        foreach (List<string> str in info.papers[no].knowledge) {
-                            if (str.Contains(k)) {
+                        foreach (List<string> str in info.papers[no].knowledge)
+                        {
+                            if (str.Contains(k))
+                            {
                                 var itemPersent = str.Count > 0 ? 1 / Convert.ToDouble(str.Count) : 0;
                                 var itemPersent = str.Count > 0 ? 1 / Convert.ToDouble(str.Count) : 0;
                                 allScore += info.papers[no].point.Count > 0 ? info.papers[no].point[m] * itemPersent : 0;
                                 allScore += info.papers[no].point.Count > 0 ? info.papers[no].point[m] * itemPersent : 0;
                             }
                             }
@@ -1075,7 +1082,7 @@ namespace TEAMModelOS.FunctionV4
                                 {
                                 {
                                     if (str.Contains(k))
                                     if (str.Contains(k))
                                     {
                                     {
-                                        var itemPersent = str.Count > 0 ? 1 / Convert.ToDouble(str.Count) : 0;                                       
+                                        var itemPersent = str.Count > 0 ? 1 / Convert.ToDouble(str.Count) : 0;
                                         if (result.studentScores.Count > 0)
                                         if (result.studentScores.Count > 0)
                                         {
                                         {
                                             foreach (List<double> sc in result.studentScores)
                                             foreach (List<double> sc in result.studentScores)
@@ -1206,7 +1213,8 @@ namespace TEAMModelOS.FunctionV4
                     int m = 0;
                     int m = 0;
                     foreach (int str in info.papers[no].field)
                     foreach (int str in info.papers[no].field)
                     {
                     {
-                        if (str == knowledgeName[i]) {
+                        if (str == knowledgeName[i])
+                        {
                             var itemPersent = 1;
                             var itemPersent = 1;
                             allScore += info.papers[no].point.Count > 0 ? info.papers[no].point[m] * itemPersent : 0;
                             allScore += info.papers[no].point.Count > 0 ? info.papers[no].point[m] * itemPersent : 0;
                         }
                         }
@@ -1291,7 +1299,7 @@ namespace TEAMModelOS.FunctionV4
                 return recorde;
                 return recorde;
             }
             }
         }
         }
-        public static async Task createClassResultAsync(ExamInfo info, List<ExamClassResult> examClassResults, ExamSubject subject, int no, AzureCosmosFactory _azureCosmos, DingDing _dingDing, AzureStorageFactory _azureStorage)
+        public static async Task createClassResultAsync(ExamInfo info, List<ExamClassResult> examClassResults, ExamSubject subject, int no, AzureCosmosFactory _azureCosmos, DingDing _dingDing, AzureStorageFactory _azureStorage, IHttpClientFactory _httpClient, IConfiguration _configuration)
         {
         {
             //保证试卷信息与科目信息同步
             //保证试卷信息与科目信息同步
             ExamResult result = new ExamResult();
             ExamResult result = new ExamResult();
@@ -1410,10 +1418,11 @@ namespace TEAMModelOS.FunctionV4
             result.average = result.studentIds.Count - result.lostStus.Count > 0 ? Math.Round(score * 1.0 / (result.studentIds.Count - result.lostStus.Count), 2) : 0;
             result.average = result.studentIds.Count - result.lostStus.Count > 0 ? Math.Round(score * 1.0 / (result.studentIds.Count - result.lostStus.Count), 2) : 0;
             double powSum = 0;
             double powSum = 0;
             //int sco = 0;
             //int sco = 0;
-            result.studentIds.ForEach(x => {
-                double sc =  result.studentScores[result.studentIds.IndexOf(x)].Sum();
+            result.studentIds.ForEach(x =>
+            {
+                double sc = result.studentScores[result.studentIds.IndexOf(x)].Sum();
                 powSum += Math.Pow(sc - result.average, 2);
                 powSum += Math.Pow(sc - result.average, 2);
-            });                            
+            });
             result.standard = Math.Round((result.studentIds.Count - result.lostStus.Count) > 0 ? Math.Pow(powSum / (result.studentIds.Count - result.lostStus.Count), 0.5) : 0, 2);
             result.standard = Math.Round((result.studentIds.Count - result.lostStus.Count) > 0 ? Math.Pow(powSum / (result.studentIds.Count - result.lostStus.Count), 0.5) : 0, 2);
             result.csRate = csRate;
             result.csRate = csRate;
 
 
@@ -1433,19 +1442,21 @@ namespace TEAMModelOS.FunctionV4
             await examRecordCount(info, subject, _dingDing, no, result, examClassResults, _azureCosmos);
             await examRecordCount(info, subject, _dingDing, no, result, examClassResults, _azureCosmos);
             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").UpsertItemAsync(result, new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}"));
             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").UpsertItemAsync(result, new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}"));
             List<ErrorItems> errorItems = new();
             List<ErrorItems> errorItems = new();
-            string sqlqueryText =  $"select value(c) from c where c.activityId = '{info.id}'and c.subjectId = '{info.subjects[no].id}' and c.stuId in ({string.Join(",", result.studentIds.Select(x => $"'{x}'"))})";
-            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Student").GetItemQueryIterator<ErrorItems>(queryText: sqlqueryText, requestOptions: new QueryRequestOptions() {PartitionKey = new PartitionKey("ErrorItems") }))
+            string sqlqueryText = $"select value(c) from c where c.activityId = '{info.id}'and c.subjectId = '{info.subjects[no].id}' and c.stuId in ({string.Join(",", result.studentIds.Select(x => $"'{x}'"))})";
+            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Student").GetItemQueryIterator<ErrorItems>(queryText: sqlqueryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ErrorItems") }))
             {
             {
                 errorItems.Add(item);
                 errorItems.Add(item);
             }
             }
-            if (errorItems.Count == 0) {
+            if (errorItems.Count == 0)
+            {
                 // 新增逻辑 收集错题内容
                 // 新增逻辑 收集错题内容
                 BlobDownloadResult index_json;
                 BlobDownloadResult index_json;
                 if (info.scope.Equals("school"))
                 if (info.scope.Equals("school"))
                 {
                 {
                     index_json = await _azureStorage.GetBlobContainerClient($"{info.school}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
                     index_json = await _azureStorage.GetBlobContainerClient($"{info.school}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
                 }
                 }
-                else {
+                else
+                {
                     index_json = await _azureStorage.GetBlobContainerClient($"{info.creatorId}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
                     index_json = await _azureStorage.GetBlobContainerClient($"{info.creatorId}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
                 }
                 }
                 //BlobDownloadResult index_json = await _azureStorage.GetBlobContainerClient($"{info.school}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
                 //BlobDownloadResult index_json = await _azureStorage.GetBlobContainerClient($"{info.school}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
@@ -1454,9 +1465,10 @@ namespace TEAMModelOS.FunctionV4
                 List<string> urls = new();
                 List<string> urls = new();
                 foreach (var ne in array)
                 foreach (var ne in array)
                 {
                 {
-                    if (!ne["type"].ToString().Equals("compose")) {
+                    if (!ne["type"].ToString().Equals("compose"))
+                    {
                         urls.Add(ne["url"].ToString());
                         urls.Add(ne["url"].ToString());
-                    }                   
+                    }
                 }
                 }
                 string code = string.Empty;
                 string code = string.Empty;
                 string pk = string.Empty;
                 string pk = string.Empty;
@@ -1464,7 +1476,7 @@ namespace TEAMModelOS.FunctionV4
                 if (info.scope.Equals("school"))
                 if (info.scope.Equals("school"))
                 {
                 {
                     code = $"ErrorItems-{info.school}";
                     code = $"ErrorItems-{info.school}";
-                    pk = $"Item-{info.school}";                    
+                    pk = $"Item-{info.school}";
                 }
                 }
                 else
                 else
                 {
                 {
@@ -1522,7 +1534,7 @@ namespace TEAMModelOS.FunctionV4
                 var ss = cdm.StriveTopic;
                 var ss = cdm.StriveTopic;
                 int n = 0;
                 int n = 0;
                 List<Task<ItemResponse<ErrorItems>>> task_error = new();
                 List<Task<ItemResponse<ErrorItems>>> task_error = new();
-                
+                List<ErrorItems> errors = new();
                 foreach (var sIds in result.studentIds)
                 foreach (var sIds in result.studentIds)
                 {
                 {
                     ErrorItems error = new()
                     ErrorItems error = new()
@@ -1535,7 +1547,7 @@ namespace TEAMModelOS.FunctionV4
                         activityId = info.id,
                         activityId = info.id,
                         subjectId = result.subjectId,
                         subjectId = result.subjectId,
                         time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                         time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
-                };
+                    };
                     //顺序学生错题的索引
                     //顺序学生错题的索引
                     int[] item_index = ss[n];
                     int[] item_index = ss[n];
                     foreach (var item in item_index)
                     foreach (var item in item_index)
@@ -1544,7 +1556,7 @@ namespace TEAMModelOS.FunctionV4
                         {
                         {
                             id = urls[item - 1].Replace(".json", ""),
                             id = urls[item - 1].Replace(".json", ""),
                             blob = info.papers[no].blob
                             blob = info.papers[no].blob
-                           
+
                         };
                         };
                         items.level = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().level;
                         items.level = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().level;
                         items.type = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().type;
                         items.type = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().type;
@@ -1552,11 +1564,22 @@ namespace TEAMModelOS.FunctionV4
                         items.knowledge = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().knows;
                         items.knowledge = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().knows;
                         error.its.Add(items);
                         error.its.Add(items);
                     }
                     }
+                    errors.Add(error);
                     n++;
                     n++;
                     task_error.Add(_azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(error, new PartitionKey($"{error.code}")));
                     task_error.Add(_azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(error, new PartitionKey($"{error.code}")));
                 }
                 }
+                string connect = _configuration.GetValue<string>("HaBookAuth:Crtmabank") + "/api/crtmabank";
+                var htc = _httpClient.CreateClient();
+                if (htc.DefaultRequestHeaders.Contains("x-functions-key"))
+                {
+                    htc.DefaultRequestHeaders.Remove("x-functions-key");
+                }
+                htc.DefaultRequestHeaders.Add("x-functions-key", "QUzQqbqbnLsTDTeaJy4Br6wUuqPoAlKpzRK2S6PGImRHAzFuySGAeA==");
+                string paramJson = JsonConvert.SerializeObject(errors);
+                var content = new StringContent(paramJson, Encoding.UTF8, "application/json");
+                await htc.PostAsync(connect, content);
                 await task_error.TaskPage(10);
                 await task_error.TaskPage(10);
-            }            
+            }
         }
         }
 
 
         public class Settlement
         public class Settlement

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Student/StudentArtResult.cs

@@ -31,6 +31,8 @@ namespace TEAMModelOS.SDK.Models
         /// 艺术评测 音乐 从智音传过来的分数结果信息
         /// 艺术评测 音乐 从智音传过来的分数结果信息
         /// </summary>
         /// </summary>
         public OAnswer zyanswer { get; set; } = new OAnswer();
         public OAnswer zyanswer { get; set; } = new OAnswer();
+        //0未作答 1已作答
+        public int isAnswer { get; set; } = 0;
 
 
     }
     }
     public class ArtSubjectScore {
     public class ArtSubjectScore {

+ 8 - 8
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -438,8 +438,8 @@ namespace TEAMModelOS.Controllers.Analysis
                         }
                         }
                         //班级全科的pr
                         //班级全科的pr
                         int index = stuTotals.IndexOf(x.total);
                         int index = stuTotals.IndexOf(x.total);
-                        double CPR = stuCount - lostClassCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostClassCount)) : 0;
-                        //double CPR = 100 - (100 * (index + 1) - 50) / stuCount;
+                        //double CPR = stuCount - lostClassCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostClassCount)) : 0;
+                        double CPR = 100 - (100 * (index + 1) - 50) / stuCount;
                         x.cpr = CPR;
                         x.cpr = CPR;
                         x.csort = index + 1;
                         x.csort = index + 1;
                         //班级单科的pr
                         //班级单科的pr
@@ -450,8 +450,8 @@ namespace TEAMModelOS.Controllers.Analysis
                             var subjectT = classStudents.SelectMany(s => s.subjects).Where(sub => sub.id == y.id).Select(scr => scr.score).ToList();
                             var subjectT = classStudents.SelectMany(s => s.subjects).Where(sub => sub.id == y.id).Select(scr => scr.score).ToList();
                             subjectT.Sort((s1, s2) => { return s2.CompareTo(s1); });
                             subjectT.Sort((s1, s2) => { return s2.CompareTo(s1); });
                             int index = subjectT.IndexOf(y.score);
                             int index = subjectT.IndexOf(y.score);
-                            double CPR = stuCount - lostClassCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostClassCount)) : 0;
-                            //double CPR = 100 - (100 * (index + 1) - 50) / stuCount;
+                            //double CPR = stuCount - lostClassCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostClassCount)) : 0;
+                            double CPR = 100 - (100 * (index + 1) - 50) / stuCount;
                             y.cpr = CPR;
                             y.cpr = CPR;
                             y.csort = index + 1;
                             y.csort = index + 1;
                             //按科目获取一个班的分数
                             //按科目获取一个班的分数
@@ -604,8 +604,8 @@ namespace TEAMModelOS.Controllers.Analysis
                             {
                             {
                                 //年级全科的pr
                                 //年级全科的pr
                                 int index = stuGradeTotal.IndexOf(x.total);                              
                                 int index = stuGradeTotal.IndexOf(x.total);                              
-                                double GPR = stuCount - lostGrade > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostGrade)) : 0;
-                                //double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
+                                //double GPR = stuCount - lostGrade > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostGrade)) : 0;
+                                double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
                                 x.gpr = GPR;
                                 x.gpr = GPR;
                                 x.gsort = index + 1;
                                 x.gsort = index + 1;
                                 //年级单科的pr
                                 //年级单科的pr
@@ -614,8 +614,8 @@ namespace TEAMModelOS.Controllers.Analysis
                                     var subjectT = studentAys.SelectMany(s => s.subjects).Where(sub => sub.id == y.id).Select(scr => scr.score).ToList();
                                     var subjectT = studentAys.SelectMany(s => s.subjects).Where(sub => sub.id == y.id).Select(scr => scr.score).ToList();
                                     subjectT.Sort((s1, s2) => { return s2.CompareTo(s1); });
                                     subjectT.Sort((s1, s2) => { return s2.CompareTo(s1); });
                                     int index = subjectT.IndexOf(y.score);
                                     int index = subjectT.IndexOf(y.score);
-                                    double GPR = stuCount- lostGrade > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostGrade)) : 0;
-                                    //double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
+                                    //double GPR = stuCount- lostGrade > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / (stuCount - lostGrade)) : 0;
+                                    double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
                                     y.gpr = GPR;
                                     y.gpr = GPR;
                                     y.gsort = index + 1;
                                     y.gsort = index + 1;
                                 });
                                 });

+ 106 - 88
TEAMModelOS/Controllers/Common/ArtController.cs

@@ -7,6 +7,9 @@ using DocumentFormat.OpenXml.Office2013.Excel;
 using DocumentFormat.OpenXml.Office2016.Excel;
 using DocumentFormat.OpenXml.Office2016.Excel;
 using DocumentFormat.OpenXml.Spreadsheet;
 using DocumentFormat.OpenXml.Spreadsheet;
 using DocumentFormat.OpenXml.Wordprocessing;
 using DocumentFormat.OpenXml.Wordprocessing;
+using HTEXLib.COMM.Helpers;
+using HTEXLib.Helpers.ShapeHelpers;
+using MathNet.Numerics.Distributions;
 using MathNet.Numerics.RootFinding;
 using MathNet.Numerics.RootFinding;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
@@ -20,16 +23,19 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Net;
 using System.Net;
 using System.Reflection;
 using System.Reflection;
+using System.Security.Policy;
 using System.Text;
 using System.Text;
 using System.Text.Json;
 using System.Text.Json;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using System.Xml.Linq;
 using System.Xml.Linq;
+using TEAMModelOS.Controllers.Analysis;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Models;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using Survey = TEAMModelOS.SDK.Models.Survey;
 using Survey = TEAMModelOS.SDK.Models.Survey;
 
 
@@ -142,30 +148,28 @@ namespace TEAMModelOS.Controllers.Common
         [AuthToken(Roles = "teacher,admin,student")]
         [AuthToken(Roles = "teacher,admin,student")]
         [HttpPost("update-state")]
         [HttpPost("update-state")]
         [Authorize(Roles = "IES")]
         [Authorize(Roles = "IES")]
-        public async Task<IActionResult> UpdateState(ArtRecord request)
+        public async Task<IActionResult> UpdateState(JsonElement request)
         {
         {
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
             try
             try
             {
             {
+                if (!request.TryGetProperty("id", out JsonElement stuId)) return BadRequest();
+                if (!request.TryGetProperty("artId", out JsonElement artId)) return BadRequest();
+                if (!request.TryGetProperty("isAnsewer", out JsonElement isAnsewer)) return BadRequest();
                 var (userid, name, picture, school) = HttpContext.GetAuthTokenInfo();
                 var (userid, name, picture, school) = HttpContext.GetAuthTokenInfo();
                 HttpContext.Items.TryGetValue("Scope", out object scope);
                 HttpContext.Items.TryGetValue("Scope", out object scope);
                 int userType = $"{scope}".Equals(Constant.ScopeStudent) ? 2 : 1;
                 int userType = $"{scope}".Equals(Constant.ScopeStudent) ? 2 : 1;
-                request.school = school;
-                request.stuId = userid;
-                request.code = "ArtRecord";
-                long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                request.createTime = now;
-                ArtRecord record;
-                if (string.IsNullOrEmpty(request.id))
+                StudentArtResult artResult = null;
+                //long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                var res = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(stuId.ToString(), new PartitionKey($"ArtResult-{artId}"));
+                if (res.Status == 200)
                 {
                 {
-                    request.id = Guid.NewGuid().ToString();
-                    record = await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(request, new PartitionKey($"{request.code}"));
-                }
-                else
-                {
-                    record = await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
-                }
-                return Ok(record);
+                    using var cJson = await JsonDocument.ParseAsync(res.ContentStream);
+                    artResult = cJson.ToObject<StudentArtResult>();
+                    artResult.isAnswer = isAnsewer.GetInt32();
+                    await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(artResult, artResult.id, new PartitionKey($"{artResult.code}"));
+                }             
+                return Ok(artResult);
             }
             }
             catch (Exception e)
             catch (Exception e)
             {
             {
@@ -199,15 +203,15 @@ namespace TEAMModelOS.Controllers.Common
                 {
                 {
                     classIds.Add(grp.id);
                     classIds.Add(grp.id);
                 }
                 }
-                if (string.IsNullOrEmpty(request.id))
-                {
-                    request.id = Guid.NewGuid().ToString();
-                    record = await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(request, new PartitionKey($"{request.code}"));
-                }
-                else
-                {
-                    record = await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
-                }
+                /* if (string.IsNullOrEmpty(request.id))
+                 {
+                     request.id = Guid.NewGuid().ToString();
+                     record = await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(request, new PartitionKey($"{request.code}"));
+                 }
+                 else
+                 {
+                     record = await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
+                 }*/
                 string rId = string.Format("{0}{1}{2}", request.school, "-", userid);
                 string rId = string.Format("{0}{1}{2}", request.school, "-", userid);
                 //首先根据大ID获取整个活动得内容
                 //首先根据大ID获取整个活动得内容
                 var aresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(request.artId, new PartitionKey($"Art-{school}"));
                 var aresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(request.artId, new PartitionKey($"Art-{school}"));
@@ -274,7 +278,7 @@ namespace TEAMModelOS.Controllers.Common
                         await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(artResult, new PartitionKey($"{artResult.code}"));
                         await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(artResult, new PartitionKey($"{artResult.code}"));
                     }
                     }
                 }
                 }
-                return Ok(new { record, code = 200 });
+                return Ok(new { code = 200 });
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -331,25 +335,25 @@ namespace TEAMModelOS.Controllers.Common
 
 
         private async IAsyncEnumerable<(int code, string value)> stuTask(List<stuFiles> stuFiles, CosmosClient client, string school, string artId, string classId, string quotaId, string acId, string subject)
         private async IAsyncEnumerable<(int code, string value)> stuTask(List<stuFiles> stuFiles, CosmosClient client, string school, string artId, string classId, string quotaId, string acId, string subject)
         {
         {
-            string queryScore = $" select c.id from c where c.artId ='{artId}' and c.quotaId = '{quotaId}' and c.acId = '{acId}' and c.subject = '{subject}' and c.classId = '{classId}'";
-            List<string> ids = new();
-            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetItemQueryStreamIterator
-                (queryText: queryScore, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("ArtRecord") }))
-            {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                {
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        if (obj.TryGetProperty("id", out JsonElement subScore))
-                        {
-                            //string sId = obj.GetProperty("id").GetString();
-                            ids.Add(subScore.GetString());
-                        }
-                    }
-                }
-            }
-            await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemsAsync<ArtRecord>(ids, "ArtRecord");
+            /* string queryScore = $" select c.id from c where c.artId ='{artId}' and c.quotaId = '{quotaId}' and c.acId = '{acId}' and c.subject = '{subject}' and c.classId = '{classId}'";
+             List<string> ids = new();
+             await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetItemQueryStreamIterator
+                 (queryText: queryScore, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("ArtRecord") }))
+             {
+                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                 {
+                     foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                     {
+                         if (obj.TryGetProperty("id", out JsonElement subScore))
+                         {
+                             //string sId = obj.GetProperty("id").GetString();
+                             ids.Add(subScore.GetString());
+                         }
+                     }
+                 }
+             }
+             await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemsAsync<ArtRecord>(ids, "ArtRecord");*/
             // await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, school, new List<string> { $"art/{artId}" });
             // await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, school, new List<string> { $"art/{artId}" });
             foreach (var request in stuFiles)
             foreach (var request in stuFiles)
             {
             {
@@ -379,7 +383,7 @@ namespace TEAMModelOS.Controllers.Common
                     {
                     {
                         classIds.Add(grp.id);
                         classIds.Add(grp.id);
                     }
                     }
-                    if (string.IsNullOrEmpty(record.id))
+                    /*if (string.IsNullOrEmpty(record.id))
                     {
                     {
                         record.id = Guid.NewGuid().ToString();
                         record.id = Guid.NewGuid().ToString();
                         record = await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(record, new PartitionKey($"{record.code}"));
                         record = await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(record, new PartitionKey($"{record.code}"));
@@ -387,7 +391,7 @@ namespace TEAMModelOS.Controllers.Common
                     else
                     else
                     {
                     {
                         record = await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(record, record.id, new PartitionKey($"{record.code}"));
                         record = await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(record, record.id, new PartitionKey($"{record.code}"));
-                    }
+                    }*/
                     string rId = string.Format("{0}{1}{2}", record.school, "-", record.stuId);
                     string rId = string.Format("{0}{1}{2}", record.school, "-", record.stuId);
                     //首先根据大ID获取整个活动得内容
                     //首先根据大ID获取整个活动得内容
                     var aresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(artId, new PartitionKey($"Art-{school}"));
                     var aresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(artId, new PartitionKey($"Art-{school}"));
@@ -561,7 +565,8 @@ namespace TEAMModelOS.Controllers.Common
                                     }
                                     }
                                 }
                                 }
                             }
                             }
-                            foreach (string artId in artIds) {
+                            foreach (string artId in artIds)
+                            {
                                 await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(artId, new PartitionKey("ArtMusic"));
                                 await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(artId, new PartitionKey("ArtMusic"));
                                 await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(artId, new PartitionKey("ArtExam"));
                                 await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(artId, new PartitionKey("ArtExam"));
                             }
                             }
@@ -585,7 +590,8 @@ namespace TEAMModelOS.Controllers.Common
                             }
                             }
                             await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemsAsync<ArtRecord>(ids, "ArtRecord");
                             await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemsAsync<ArtRecord>(ids, "ArtRecord");
                         }
                         }
-                        else {
+                        else
+                        {
                             string queryScore = $" select c.id from c where c.artId  = {art.id})";
                             string queryScore = $" select c.id from c where c.artId  = {art.id})";
                             List<string> ids = new();
                             List<string> ids = new();
                             await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetItemQueryStreamIterator
                             await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Student).GetItemQueryStreamIterator
@@ -606,7 +612,7 @@ namespace TEAMModelOS.Controllers.Common
                             }
                             }
                             await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemsAsync<ArtRecord>(ids, "ArtRecord");
                             await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemsAsync<ArtRecord>(ids, "ArtRecord");
                             await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(art.id, new PartitionKey("ArtMusic"));
                             await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(art.id, new PartitionKey("ArtMusic"));
-                        }                                             
+                        }
                     }
                     }
 
 
                 }
                 }
@@ -717,7 +723,8 @@ namespace TEAMModelOS.Controllers.Common
                 {
                 {
 
 
                 }
                 }
-                else {
+                else
+                {
                     List<(string eId, string sId)> ids = new();
                     List<(string eId, string sId)> ids = new();
                     var examId = art.settings.SelectMany(x => x.task).Where(c => c.type == 1).Select(z => new { z.acId, z.subject }).ToList();
                     var examId = art.settings.SelectMany(x => x.task).Where(c => c.type == 1).Select(z => new { z.acId, z.subject }).ToList();
                     examId.ForEach(x =>
                     examId.ForEach(x =>
@@ -860,11 +867,11 @@ namespace TEAMModelOS.Controllers.Common
                     }
                     }
                     if (!string.IsNullOrWhiteSpace(ae.id))
                     if (!string.IsNullOrWhiteSpace(ae.id))
                     {
                     {
-                        return Ok(new { art, classes, ae, music,count = rmembers.Count, code = 200 });
+                        return Ok(new { art, classes, ae, music, count = rmembers.Count, code = 200 });
                     }
                     }
                     else
                     else
                     {
                     {
-                        return Ok(new { art, classes, music,count = rmembers.Count, code = 200 });
+                        return Ok(new { art, classes, music, count = rmembers.Count, code = 200 });
                     }
                     }
 
 
 
 
@@ -931,7 +938,7 @@ namespace TEAMModelOS.Controllers.Common
                 {
                 {
                     List<StuActivity> stus = new();
                     List<StuActivity> stus = new();
                     List<string> wIds = new();
                     List<string> wIds = new();
-                    List<ArtRecord> works = new();
+                    List<StudentArtResult> works = new();
 
 
                     if (!string.IsNullOrWhiteSpace(art.pId))
                     if (!string.IsNullOrWhiteSpace(art.pId))
                     {
                     {
@@ -952,7 +959,7 @@ namespace TEAMModelOS.Controllers.Common
                         }
                         }
                     }
                     }
                     var taskType1 = art.settings.SelectMany(z => z.task).Where(t => t.type == 1);
                     var taskType1 = art.settings.SelectMany(z => z.task).Where(t => t.type == 1);
-                    wIds = art.settings.SelectMany(z => z.task).Where(t => t.type == 2).Select(a => a.acId).ToList();
+                    //wIds = art.settings.SelectMany(z => z.task).Where(t => t.type == 2).Select(a => a.acId).ToList();
                     if (taskType1 != null && taskType1.Any())
                     if (taskType1 != null && taskType1.Any())
                     {
                     {
                         string sql = $"select value c from  c where c.id in ({string.Join(",", taskType1.Select(z => $"'{z.acId}'"))})";
                         string sql = $"select value c from  c where c.id in ({string.Join(",", taskType1.Select(z => $"'{z.acId}'"))})";
@@ -961,35 +968,12 @@ namespace TEAMModelOS.Controllers.Common
                         {
                         {
                             stus.Add(item);
                             stus.Add(item);
                         }
                         }
-                    }
-                    //foreach (var tt in art.settings)
-                    //{
-                    //    foreach (var acs in tt.task)
-                    //    {
-                    //        if (acs.type == 1)
-                    //        {
-                    //            var response = await client.GetContainer("TEAMModelOS", "Student").ReadItemStreamAsync(acs.acId, new PartitionKey($"Activity-{school}-{userid}"));
-                    //            if (response.Status == 200)
-                    //            {
-                    //                using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    //                StuActivity info = json.ToObject<StuActivity>();
-                    //                stus.Add(info);
-                    //            }
-                    //        }
-                    //        if (acs.type == 2)
-                    //        {
-                    //            wIds.Add(acs.acId);
-                    //        }
-                    //    }
-                    //}
-                    if (wIds.Count > 0)
+                    }                   
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<StudentArtResult>(
+                    queryText: $"select value(c) from c where c.id = '{code}-{userid}'",
+                    requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ArtResult-{id}") }))
                     {
                     {
-                        await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<ArtRecord>(
-                        queryText: $"select value(c) from c where c.stuId = '{userid}' and c.acId in ({string.Join(",", wIds.Select(o => $"'{o}'"))})",
-                        requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ArtRecord") }))
-                        {
-                            works.Add(item);
-                        }
+                        works.Add(item);
                     }
                     }
                     return Ok(new { art, stus, works, music, code = 200 });
                     return Ok(new { art, stus, works, music, code = 200 });
                 }
                 }
@@ -1020,23 +1004,57 @@ namespace TEAMModelOS.Controllers.Common
             {
             {
                 if (!request.TryGetProperty("classId", out JsonElement classId)) return BadRequest();
                 if (!request.TryGetProperty("classId", out JsonElement classId)) return BadRequest();
                 if (!request.TryGetProperty("subject", out JsonElement subject)) return BadRequest();
                 if (!request.TryGetProperty("subject", out JsonElement subject)) return BadRequest();
+                //艺术评测ID
                 if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
                 if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                string token = HttpContext.GetToken();
                 var client = _azureCosmos.GetCosmosClient();
                 var client = _azureCosmos.GetCosmosClient();
-                var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
-                List<object> works = new();
+                //var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
+                List<StudentArtResult> artResults = new();
+                string sql = $"select value(c) from c where c.artId = '{id}' and array_contains(c.classIds,'{classId}')  ";
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(
-                queryText: $"select c.stuId,c.attachments,c.isAnswer,c.createTime,c.url from c where c.classId = '{classId}' and c.acId = '{id}' and c.subject = '{subject}'",
-                requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ArtRecord") }))
+                queryText: sql,
+                requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ArtResult-{id}") }))
                 {
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
                     {
                         foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                         foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                         {
                         {
-                            works.Add(obj.ToObject<object>());
+                            artResults.Add(obj.ToObject<StudentArtResult>());
                         }
                         }
                     }
                     }
                 }
                 }
+
+                artResults.ForEach(x => x.results.RemoveAll(z => !string.IsNullOrWhiteSpace(z.subjectId) && !subject.GetString().Equals(z.subjectId)));
+                artResults.ForEach(x => x.subjectScores.RemoveAll(z => !string.IsNullOrWhiteSpace(z.subjectId) && !subject.GetString().Equals(z.subjectId)));
+
+                List<(string stuId, string url)> zyUrl = new();
+                foreach (StudentArtResult artResult in artResults)
+                {
+                    if (!string.IsNullOrWhiteSpace(artResult.zyanswer.thirdAnswerId))
+                    {
+                        byte[] inputBytes = Encoding.UTF8.GetBytes(artResult.zyanswer.thirdAnswerId);
+                        string base64Str = Convert.ToBase64String(inputBytes);
+                        //var date = Convert.FromBase64String(base64Str);
+                        StringBuilder url = new StringBuilder("https://amesopen.aimusic.art?appid=8a68f563f3384662acbc268336b98ae2");
+                        url.Append($"&data={base64Str}");
+                        url.Append($"&thirdToken={token}");
+                        zyUrl.Add((artResult.studentId, url.ToString()));
+                    }
+                    else
+                    {
+                        zyUrl.Add((artResult.studentId, string.Empty));
+                    }
+                }
+                var works = artResults.Select(x => new
+                {
+                    x.studentId,
+                    x.studentName,
+                    x.classIds,
+                    x.artId,
+                    x.results,
+                    zyUrl.Where(c => c.stuId.Equals(x.studentId)).FirstOrDefault().url
+                });
                 return Ok(new { works, code = 200 });
                 return Ok(new { works, code = 200 });
 
 
             }
             }

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 53 - 6
TEAMModelOS/Controllers/XTest/FixDataController.cs