CrazyIter_Bin 7 miesięcy temu
rodzic
commit
e9c3947157

+ 147 - 105
HTEX.DataETL/Controllers/LessonRecordController.cs

@@ -4,6 +4,7 @@ using HTEX.Lib.ETL.Lesson;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Azure.Cosmos;
 using Microsoft.OData.UriParser;
+using System.Collections.Generic;
 using System.IO;
 using System.Runtime.InteropServices;
 using System.Text.Json;
@@ -13,6 +14,7 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Helper.Common.FileHelper;
 using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK.Models.Cosmos.BI;
 using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
 
 namespace HTEX.DataETL.Controllers
@@ -27,7 +29,6 @@ namespace HTEX.DataETL.Controllers
         private readonly IConfiguration _configuration;
         private readonly IWebHostEnvironment _webHostEnvironment;
 
-        private readonly List<string> objectiveTypes = new List<string>() { "single", "multiple", "sortmultiple", "judge" };
         public LessonRecordController(ILogger<LessonRecordController> logger, AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage
             , IConfiguration configuration, IWebHostEnvironment environment)
         {
@@ -129,12 +130,12 @@ namespace HTEX.DataETL.Controllers
                 {
                     studentLessonDatas = localStudents.ToJsonString().ToObject<List<StudentLessonData>>();
                     studentLessonDatas = LessonETLService.GetIRSData(lessonBase, timeLineData, irsDatas, studentLessonDatas, examDatas, id);
-                    studentLessonDatas = LessonETLService.GetCoworkData(lessonBase, timeLineData, coworkDatas, studentLessonDatas);
-                    studentLessonDatas = LessonETLService.GetExamData(lessonBase, timeLineData, examDatas, studentLessonDatas, objectiveTypes);
+                    studentLessonDatas = LessonETLService.GetCoworkData(lessonBase, timeLineData, coworkDatas, studentLessonDatas,id);
+                    studentLessonDatas = LessonETLService.GetExamData(lessonBase, timeLineData, examDatas, studentLessonDatas, Constant.objectiveTypes, id);
                     studentLessonDatas = LessonETLService.GetSmartRatingData(lessonBase, timeLineData, smartRatingDatas, studentLessonDatas, id);
-                    studentLessonDatas = LessonETLService.GetTaskData(lessonBase, timeLineData, taskDatas, studentLessonDatas);
+                    studentLessonDatas = LessonETLService.GetTaskData(lessonBase, timeLineData, taskDatas, studentLessonDatas,id);
                     await System.IO.File.WriteAllTextAsync(Path.Combine(path, $"student-analysis.json"), studentLessonDatas.ToJsonString());
-                    string jsons = await System.IO.File.ReadAllTextAsync($"{lessonPath}\\analysis.json");
+                    string jsons = await System.IO.File.ReadAllTextAsync($"{lessonPath}\\analysis\\analysis.json");
                     LessonDataAnalysisCluster lessonDataAnalysis = jsons.ToObject<LessonDataAnalysisCluster>();
                     var lessonItems=  LessonETLService.ProcessStudentData(studentLessonDatas, lessonDataAnalysis);
                     XmlDocument xmlDocument = new XmlDocument();
@@ -268,15 +269,20 @@ namespace HTEX.DataETL.Controllers
                     }
                 }
                 List<TechCount> techCounts = new List<TechCount>();
-                filesLessons = FileHelper.ListAllFiles(pathLessons);
-                await Parallel.ForEachAsync(filesLessons, async (file, _) => {
-                    await GetTeachCount(file, pathLessons, yearMonth, ignore, techCounts, objectiveTypes, _azureStorage);
-                });
+                filesLessons = FileHelper.ListAllFiles(pathLessons, "-local.json");
+                await foreach (var item in  GetTeachCount(lessonRecords, filesLessons, pathLessons, ignore, Constant.objectiveTypes, _azureStorage))
+                {
+                    techCounts.Add(item);
+                }
                 var yearMonthDatas = techCounts.GroupBy(x => x.yearMonth).Select(x => new { key = x.Key, list = x.ToList() });
                // lessonDataAnalysisMonths = new List<LessonDataAnalysisMonth>();
                 LessonDataAnalysisCluster lessonDataAnalysisCluster = new LessonDataAnalysisCluster();
                 foreach (var yearMonthData in yearMonthDatas) 
                 {
+                    if (string.IsNullOrWhiteSpace(yearMonthData.key)) 
+                    {
+                        Console.WriteLine(yearMonthData.list.Select(x => x.lessonId).ToJsonString());
+                    }
                     LessonDataAnalysisMonth lessonDataAnalysisMonth= new LessonDataAnalysisMonth() { updateTime= newest, yearMonth= yearMonthData.key };
                     lessonDataAnalysisMonth.pscore  = yearMonthData.list.SelectMany(x => x.pscore).ToList();
                     lessonDataAnalysisMonth.tscore  = yearMonthData.list.SelectMany(x => x.tscore).ToList();
@@ -324,13 +330,13 @@ namespace HTEX.DataETL.Controllers
 
                 //标准差偏差N倍,视为异常数据
                 int thresholdMultiplier = 2;
-                lessonDataAnalysisCluster.pscore= LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.pscore, thresholdMultiplier);
-                lessonDataAnalysisCluster.gscore= LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.gscore, thresholdMultiplier);
-                lessonDataAnalysisCluster.tscore= LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.tscore, thresholdMultiplier);
-                lessonDataAnalysisCluster.irs = LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.irs, thresholdMultiplier);
-                lessonDataAnalysisCluster.interactNormal=LessonETLService. CleanDataBySDThreshold(lessonDataAnalysisCluster.interactNormal, thresholdMultiplier);
-                lessonDataAnalysisCluster.stuCowork=LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.stuCowork, thresholdMultiplier);
-                lessonDataAnalysisCluster.groupCowork=LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.groupCowork, thresholdMultiplier);
+                lessonDataAnalysisCluster.pscore= LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.pscore.OrderBy(x => x), thresholdMultiplier);
+                lessonDataAnalysisCluster.gscore= LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.gscore.OrderBy(x => x), thresholdMultiplier);
+                lessonDataAnalysisCluster.tscore= LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.tscore.OrderBy(x => x), thresholdMultiplier);
+                lessonDataAnalysisCluster.irs = LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.irs.OrderBy(x => x), thresholdMultiplier);
+                lessonDataAnalysisCluster.interactNormal=LessonETLService. CleanDataBySDThreshold(lessonDataAnalysisCluster.interactNormal.OrderBy(x => x), thresholdMultiplier);
+                lessonDataAnalysisCluster.stuCowork=LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.stuCowork.OrderBy(x=>x), thresholdMultiplier);
+                lessonDataAnalysisCluster.groupCowork=LessonETLService.CleanDataBySDThreshold(lessonDataAnalysisCluster.groupCowork.OrderBy(x => x), thresholdMultiplier);
                 List<KeyValuePair<double, List<int>>> clustersDataInteract = new();
                 var clusterInteract = KMeansService.KMeans(lessonDataAnalysisCluster.interactNormal.Select(x => (int)x).OrderBy(x => x));
                 //foreach (var item in clusterInteract)
@@ -347,113 +353,149 @@ namespace HTEX.DataETL.Controllers
             return Ok(new { yearMonth });
         }
 
-        private static async Task GetTeachCount(string item, string pathLessons, HashSet<string> yearMonth, List<string> ignore, List<TechCount> techCounts,List<string> objectiveTypes,AzureStorageFactory azureStorage)
+        private static async IAsyncEnumerable<TechCount> GetTeachCount(List<LessonRecord> lessonRecords,List<string> filesLessons, string pathLessons,  List<string> ignore, List<string> objectiveTypes,AzureStorageFactory azureStorage)
         {
-            if (item.EndsWith("-local.json"))
+            foreach (var item in filesLessons) 
             {
-                string localjson = await System.IO.File.ReadAllTextAsync(item);
-                var lessonLocal = localjson.ToObject<LessonLocal>();
-                TechCount count = new TechCount();
-                count.lessonId=item.Split("\\").Last().Replace("-local.json", "");
-                count.examCount= lessonLocal.examDatas.Count;
-                count.taskCount= lessonLocal.taskDatas.Count;
-                count.irsCount= lessonLocal.irsDatas.Count;
-                count.interactNormalCount=count.irsCount;
-                count.coworkCount= lessonLocal.coworkDatas.Count;
-                count.smartRatingCount= lessonLocal.smartRatingDatas.Count;
-                count.timeCount=lessonLocal.sokratesDatas.Where(x => !ignore.Contains(x.Event)  &&  !x.Event.Contains("End", StringComparison.OrdinalIgnoreCase)).GroupBy(x => x.Event).Select(x => new CodeLong() { code=x.Key, value= x.ToList().Count }).ToList();
-                if (lessonLocal.lessonRecord!=null)
+                if (item.EndsWith("-local.json"))
                 {
-                    count.yearMonth=DateTimeOffset.FromUnixTimeMilliseconds(lessonLocal.lessonRecord.startTime).ToString("yyyyMM");
-                    yearMonth.Add(count.yearMonth);
-                    if (lessonLocal?.lessonBase?.summary!=null)
-                    {
-                        count.smartRatingCountBase=lessonLocal.lessonBase.summary.smartRatingCount;
-                        count.irsCountBase=lessonLocal.lessonBase.summary.interactionCount;
-                        count.taskCountBase=lessonLocal.lessonBase.summary.collateTaskCount;
-                        count.coworkCountBase=lessonLocal.lessonBase.summary.coworkTaskCount;
-                        count.examCountBase=lessonLocal.lessonBase.summary.examCount;
-                        count.interactNormalCountBase= count.interactNormalCount;
-                    }
-                    if (lessonLocal?.lessonBase?.report?.clientSummaryList!=null)
+                    TechCount count = null;
+
+                    string lessonId = item.Split("\\").Last().Replace("-local.json", "");
+                    string countFile = item.Replace("-local.json", "-count.json");
+                    if (System.IO.File.Exists(countFile))
                     {
-                        count.pscore= lessonLocal.lessonBase.report.clientSummaryList.Where(x => x.score>0).Select(x => x.score);
-                        count.gscore= lessonLocal.lessonBase.report.clientSummaryList.Where(x => x.groupScore>0).Select(x => x.groupScore);
-                        count.tscore= lessonLocal.lessonBase.report.clientSummaryList.Where(x => x.interactScore>0).Select(x => x.interactScore);
+                        if (System.IO.File.Exists(countFile))
+                        {
+                            string contjson = await System.IO.File.ReadAllTextAsync(countFile);
+                            count = contjson.ToObject<TechCount>();
+                        }
                     }
-                    ///处理学生数据
+                    if (string.IsNullOrWhiteSpace(count?.yearMonth))
                     {
-                        List<StudentLessonData> studentLessonDatas = lessonLocal.studentLessonDatas.ToJsonString().ToObject<List<StudentLessonData>>();
-                        studentLessonDatas = LessonETLService.GetIRSData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.irsDatas, studentLessonDatas, lessonLocal.examDatas, item);
-                        studentLessonDatas =  LessonETLService.GetCoworkData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.coworkDatas, studentLessonDatas);
-                        studentLessonDatas =  LessonETLService.GetExamData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.examDatas, studentLessonDatas, objectiveTypes);
-                        studentLessonDatas = LessonETLService.GetSmartRatingData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.smartRatingDatas, studentLessonDatas, item);
-                        studentLessonDatas = LessonETLService.GetTaskData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.taskDatas, studentLessonDatas);
-                     //  var techCount = techCounts.Find(x => !string.IsNullOrWhiteSpace(x.lessonId)  &&  !string.IsNullOrWhiteSpace(lessonLocal?.lessonRecord?.id) &&  x.lessonId.Equals(lessonLocal.lessonRecord.id));
-                        int sumUpload = 0;
-                        int taskCount = 0;
-                        int maxUpload = 0;
-                        //HashSet<string> pickUp = new HashSet<string>();
-                        foreach (var stu in studentLessonDatas)
+                        string localjson = await System.IO.File.ReadAllTextAsync(item);
+                        var lessonLocal = localjson.ToObject<LessonLocal>();
+                        count = new TechCount();
+                        count.lessonId=item.Split("\\").Last().Replace("-local.json", "");
+                        count.examCount= lessonLocal.examDatas.Count;
+                        count.taskCount= lessonLocal.taskDatas.Count;
+                        count.irsCount= lessonLocal.irsDatas.Count;
+                        count.interactNormalCount=count.irsCount;
+                        count.coworkCount= lessonLocal.coworkDatas.Count;
+                        count.smartRatingCount= lessonLocal.smartRatingDatas.Count;
+                        count.timeCount=lessonLocal.sokratesDatas.Where(x => !ignore.Contains(x.Event)  &&  !x.Event.Contains("End", StringComparison.OrdinalIgnoreCase)).GroupBy(x => x.Event).Select(x => new CodeLong() { code=x.Key, value= x.ToList().Count }).ToList();
+                        
+                        if (string.IsNullOrWhiteSpace("636725021468921856"))
+                        {
+                            int d = 1;
+                        }
+                        if (lessonLocal.lessonRecord!=null)
                         {
-                            var countS = stu.taskRecord.itemRecords.Where(x => x.optCount>0);
-                            if (countS.Count()>0)
-                            {
-                                int stuUploadmax = stu.taskRecord.itemRecords.Where(x => x.optCount>0).Max(x => x.optCount);
-                                if (stuUploadmax> maxUpload)
-                                {
-                                    maxUpload=stuUploadmax;
-                                }
-                            }
-                            int stuUpload = stu.taskRecord.itemRecords.Where(x => x.optCount>0).Sum(x => x.optCount);
 
-                            sumUpload+=stuUpload;
-                            if (stu.taskRecord.itemRecords.Count()> taskCount)
+                            count.yearMonth=DateTimeOffset.FromUnixTimeMilliseconds(lessonLocal.lessonRecord.startTime).ToString("yyyyMM");
+                           
+                            if (lessonLocal?.lessonBase?.summary!=null)
                             {
-                                taskCount=stu.taskRecord.itemRecords.Count();
+                                count.smartRatingCountBase=lessonLocal.lessonBase.summary.smartRatingCount;
+                                count.irsCountBase=lessonLocal.lessonBase.summary.interactionCount;
+                                count.taskCountBase=lessonLocal.lessonBase.summary.collateTaskCount;
+                                count.coworkCountBase=lessonLocal.lessonBase.summary.coworkTaskCount;
+                                count.examCountBase=lessonLocal.lessonBase.summary.examCount;
+                                count.interactNormalCountBase= count.interactNormalCount;
                             }
-                            var stu_scores = stu.coworkRecord.itemRecords.Where(x => x.itemScore>0).Select(x => x.itemScore);
-                            if (stu_scores!=null  && stu_scores.Count()>0)
+                            if (lessonLocal?.lessonBase?.report?.clientSummaryList!=null)
                             {
-                                count.stuCowork.AddRange(stu_scores);
+                                count.pscore= lessonLocal.lessonBase.report.clientSummaryList.Where(x => x.score>0).Select(x => x.score);
+                                count.gscore= lessonLocal.lessonBase.report.clientSummaryList.Where(x => x.groupScore>0).Select(x => x.groupScore);
+                                count.tscore= lessonLocal.lessonBase.report.clientSummaryList.Where(x => x.interactScore>0).Select(x => x.interactScore);
                             }
-                            var grp_scores = stu.group_coworkScore.Where(x => x>0);
-                            if (grp_scores!=null  && grp_scores.Count()>0)
+                            ///处理学生数据
                             {
-                                count.groupCowork.AddRange(grp_scores);
+                                List<StudentLessonData> studentLessonDatas = lessonLocal.studentLessonDatas.ToJsonString().ToObject<List<StudentLessonData>>();
+                                studentLessonDatas = LessonETLService.GetIRSData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.irsDatas, studentLessonDatas, lessonLocal.examDatas, lessonLocal.lessonRecord.id);
+                                studentLessonDatas =  LessonETLService.GetCoworkData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.coworkDatas, studentLessonDatas, lessonLocal.lessonRecord.id);
+                                studentLessonDatas =  LessonETLService.GetExamData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.examDatas, studentLessonDatas, objectiveTypes, lessonLocal.lessonRecord.id);
+                                studentLessonDatas = LessonETLService.GetSmartRatingData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.smartRatingDatas, studentLessonDatas, lessonLocal.lessonRecord.id);
+                                studentLessonDatas = LessonETLService.GetTaskData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.taskDatas, studentLessonDatas, lessonLocal.lessonRecord.id);
+                                //  var techCount = techCounts.Find(x => !string.IsNullOrWhiteSpace(x.lessonId)  &&  !string.IsNullOrWhiteSpace(lessonLocal?.lessonRecord?.id) &&  x.lessonId.Equals(lessonLocal.lessonRecord.id));
+                                int sumUpload = 0;
+                                int taskCount = 0;
+                                int maxUpload = 0;
+                                //HashSet<string> pickUp = new HashSet<string>();
+                                foreach (var stu in studentLessonDatas)
+                                {
+                                    var countS = stu.taskRecord.itemRecords.Where(x => x.optCount>0);
+                                    if (countS.Count()>0)
+                                    {
+                                        int stuUploadmax = stu.taskRecord.itemRecords.Where(x => x.optCount>0).Max(x => x.optCount);
+                                        if (stuUploadmax> maxUpload)
+                                        {
+                                            maxUpload=stuUploadmax;
+                                        }
+                                    }
+                                    int stuUpload = stu.taskRecord.itemRecords.Where(x => x.optCount>0).Sum(x => x.optCount);
+
+                                    sumUpload+=stuUpload;
+                                    if (stu.taskRecord.itemRecords.Count()> taskCount)
+                                    {
+                                        taskCount=stu.taskRecord.itemRecords.Count();
+                                    }
+                                    var stu_scores = stu.coworkRecord.itemRecords.Where(x => x.itemScore>0).Select(x => x.itemScore);
+                                    if (stu_scores!=null  && stu_scores.Count()>0)
+                                    {
+                                        count.stuCowork.AddRange(stu_scores);
+                                    }
+                                    var grp_scores = stu.group_coworkScore.Where(x => x>0);
+                                    if (grp_scores!=null  && grp_scores.Count()>0)
+                                    {
+                                        count.groupCowork.AddRange(grp_scores);
+                                    }
+                                    //if (stu.pickups.IsNotEmpty())
+                                    //{
+                                    //    foreach (var pickup in stu.pickups)
+                                    //    {
+                                    //        pickUp.Add(pickup);
+                                    //    }
+                                    //}
+                                }
+                                if (studentLessonDatas.Count>0&& taskCount>0  && maxUpload>0)
+                                {
+                                    var avgUpload = sumUpload*1.0/(studentLessonDatas.Count *taskCount);
+                                    count.upload.Add(new List<double>() { avgUpload, maxUpload });
+                                }
+                                //if (pickUp.Count>0)
+                                //{
+                                //    count.pickup.Add(pickUp.ToList());
+                                //}
+                                string owner = lessonLocal.lessonRecord.scope.Equals("school") ? lessonLocal.lessonRecord.school : lessonLocal.lessonRecord.tmdid;
+                                // if (!azureStorage.GetBlobContainerClient(owner).GetBlobClient($"records/{lessonLocal.lessonRecord.id}/student-analysis.json").Exists())
+                                {
+
+
+                                }
+                                // if (!System.IO.File.Exists($"{pathLessons}\\MM{count.yearMonth}\\{lessonLocal.lessonRecord.id}-stu.json"))
+                                {
+
+                                }
+                                if (lessonRecords.FindAll(x => x.id.Equals(lessonLocal.lessonRecord.id)).IsNotEmpty())
+                                {
+                                    await System.IO.File.WriteAllTextAsync($"{pathLessons}\\MM{count.yearMonth}\\{lessonLocal.lessonRecord.id}-stu.json", studentLessonDatas.ToJsonString());
+                                    await azureStorage.GetBlobContainerClient(owner).UploadFileByContainer(studentLessonDatas.ToJsonString(), "records", $"{lessonLocal.lessonRecord.id}/student-analysis.json");
+                                    await System.IO.File.WriteAllTextAsync($"{pathLessons}\\MM{count.yearMonth}\\{lessonLocal.lessonRecord.id}-count.json", count.ToJsonString());
+                                }
                             }
-                            //if (stu.pickups.IsNotEmpty())
-                            //{
-                            //    foreach (var pickup in stu.pickups)
-                            //    {
-                            //        pickUp.Add(pickup);
-                            //    }
-                            //}
-                        }
-                        if (studentLessonDatas.Count>0&& taskCount>0  && maxUpload>0)
-                        {
-                            var avgUpload = sumUpload*1.0/(studentLessonDatas.Count *taskCount);
-                            count.upload.Add(new List<double>() { avgUpload, maxUpload });
-                        }
-                        //if (pickUp.Count>0)
-                        //{
-                        //    count.pickup.Add(pickUp.ToList());
-                        //}
-                        string owner = lessonLocal.lessonRecord.scope.Equals("school") ? lessonLocal.lessonRecord.school : lessonLocal.lessonRecord.tmdid;
-                        if (!azureStorage.GetBlobContainerClient(owner).GetBlobClient($"records/{lessonLocal.lessonRecord.id}/student-analysis.json").Exists())
-                        {
-                            await azureStorage.GetBlobContainerClient(owner).UploadFileByContainer(studentLessonDatas.ToJsonString(), "records", $"{lessonLocal.lessonRecord.id}/student-analysis.json");
-                            
-                        }
-                        if (!System.IO.File.Exists($"{pathLessons}\\MM{count.yearMonth}\\{lessonLocal.lessonRecord.id}-stu.json"))
-                        {
-                            await System.IO.File.WriteAllTextAsync($"{pathLessons}\\MM{count.yearMonth}\\{lessonLocal.lessonRecord.id}-stu.json", studentLessonDatas.ToJsonString());
                         }
                     }
-                    await System.IO.File.WriteAllTextAsync($"{pathLessons}\\MM{count.yearMonth}\\{lessonLocal.lessonRecord.id}-count.json", count.ToJsonString());
-                    techCounts.Add(count);
+
+                    
+                
+                    if (count!=null) 
+                    {
+                        yield return count;
+                    }
                 }
             }
+           
         }
     }
 }

+ 3 - 3
TEAMModelBI/TEAMModelBI.csproj

@@ -65,9 +65,9 @@
 		<SpaRoot>ClientApp\</SpaRoot>
 		<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
 		<UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-		<Version>5.2410.16</Version>
-		<AssemblyVersion>5.2410.16.1</AssemblyVersion>
-		<FileVersion>5.2410.16.1</FileVersion>
+		<Version>5.2410.23</Version>
+		<AssemblyVersion>5.2410.23.1</AssemblyVersion>
+		<FileVersion>5.2410.23.1</FileVersion>
 		<Description>TEAMModelBI(BI)</Description>
 		<PackageReleaseNotes>BI版本说明版本切换标记2022000908</PackageReleaseNotes>
 		<PackageId>TEAMModelBI</PackageId>

+ 31 - 11
TEAMModelOS.Extension/HTEX.Lib/ETL/Lesson/LessonETLService.cs

@@ -20,7 +20,27 @@ namespace HTEX.Lib.ETL.Lesson
 {
     public class LessonETLService
     {
-
+        /// <summary>
+        /// 生成学生student-analysis.json
+        /// </summary>
+        /// <param name="objectiveTypes"></param>
+        /// <param name="azureStorage"></param>
+        /// <param name="lessonLocal"></param>
+        /// <returns></returns>
+        public static async Task DoStudentLessonData(List<string> objectiveTypes, AzureStorageFactory azureStorage, LessonLocal? lessonLocal)
+        {
+            List<StudentLessonData> studentLessonDatas = lessonLocal.studentLessonDatas.ToJsonString().ToObject<List<StudentLessonData>>();
+            studentLessonDatas = LessonETLService.GetIRSData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.irsDatas, studentLessonDatas, lessonLocal.examDatas,lessonLocal?.lessonRecord?.id);
+            studentLessonDatas =  LessonETLService.GetCoworkData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.coworkDatas, studentLessonDatas, lessonLocal.lessonRecord.id);
+            studentLessonDatas =  LessonETLService.GetExamData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.examDatas, studentLessonDatas, objectiveTypes, lessonLocal.lessonRecord.id);
+            studentLessonDatas = LessonETLService.GetSmartRatingData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.smartRatingDatas, studentLessonDatas, lessonLocal.lessonRecord.id);
+            studentLessonDatas = LessonETLService.GetTaskData(lessonLocal.lessonBase!, lessonLocal.timeLineData!, lessonLocal.taskDatas, studentLessonDatas, lessonLocal.lessonRecord.id);
+            string owner = lessonLocal.lessonRecord.scope.Equals("school") ? lessonLocal.lessonRecord.school : lessonLocal.lessonRecord.tmdid;
+            if (!azureStorage.GetBlobContainerClient(owner).GetBlobClient($"records/{lessonLocal.lessonRecord.id}/student-analysis.json").Exists())
+            {
+                await azureStorage.GetBlobContainerClient(owner).UploadFileByContainer(studentLessonDatas.ToJsonString(), "records", $"{lessonLocal.lessonRecord.id}/student-analysis.json");
+            }
+        }
         public static async IAsyncEnumerable<LessonLocal> GetLessonLocal(List<LessonRecord> lessonRecords, List<string> localIds, AzureStorageFactory _azureStorage,string pathLessons)
         {
             foreach (var lessonRecord in lessonRecords)
@@ -59,7 +79,7 @@ namespace HTEX.Lib.ETL.Lesson
                 {
                     var baseData = GetBaseData(lessonLocal.lessonBase!);
                     lessonLocal.studentLessonDatas= baseData.studentLessonDatas;
-                    List<ExamData> examDatas = await GetExamData(lessonRecord, lessonLocal.timeLineData,_azureStorage,owner );
+                    List<ExamData> examDatas = await GetExamInfo(lessonRecord, lessonLocal.timeLineData,_azureStorage,owner );
                     lessonLocal.examDatas = examDatas;
                     lessonLocal.sokratesDatas= lessonLocal.sokratesDatas.IsNotEmpty() ? lessonLocal.sokratesDatas : lessonLocal.timeLineData!=null ? lessonLocal.timeLineData.events : new List<TimeLineEvent>();
                 }
@@ -173,7 +193,7 @@ namespace HTEX.Lib.ETL.Lesson
         /// <param name="examDatas"></param>
         /// <param name="itemFiles"></param>
         /// <returns></returns>
-        public static List<StudentLessonData> GetIRSData(LessonBase lessonBase, TimeLineData timeLineData, List<IRSData> irsDatas, List<StudentLessonData> studentLessonDatas, List<ExamData> examDatas, string itemFiles)
+        public static List<StudentLessonData> GetIRSData(LessonBase lessonBase, TimeLineData timeLineData, List<IRSData> irsDatas, List<StudentLessonData> studentLessonDatas, List<ExamData> examDatas,string lessonId)
         {
             List<string> interactTypes = new List<string>() { "PopQuesLoad", "ReAtmpAnsStrt", "BuzrAns", "BuzrLoad" };
             //去重页面
@@ -773,7 +793,7 @@ namespace HTEX.Lib.ETL.Lesson
 
             return (1.0 - ((double)d[n, m] / Math.Max(s1.Length, s2.Length)));
         }
-        private static async Task<List<ExamData>> GetExamData(LessonRecord item, TimeLineData? timeLineData, AzureStorageFactory _azureStorage/*,ILogger<LessonETLService> _logger*/,string owner )
+        public static async Task<List<ExamData>> GetExamInfo(LessonRecord item, TimeLineData? timeLineData, AzureStorageFactory _azureStorage/*,ILogger<LessonETLService> _logger*/,string owner )
         {
             //读取ExamData
             List<ExamData> examDatas = new List<ExamData>();
@@ -848,7 +868,7 @@ namespace HTEX.Lib.ETL.Lesson
         /// <param name="studentLessonDatas"></param>
         /// <param name="objectiveTypes"></param>
         /// <returns></returns>
-        public static List<StudentLessonData> GetExamData(LessonBase lessonBase, TimeLineData timeLineData, List<ExamData> examDatas, List<StudentLessonData> studentLessonDatas, List<string> objectiveTypes)
+        public static List<StudentLessonData> GetExamData(LessonBase lessonBase, TimeLineData timeLineData, List<ExamData> examDatas, List<StudentLessonData> studentLessonDatas, List<string> objectiveTypes, string lessonId)
         {
             foreach (var examData in examDatas)
             {
@@ -948,8 +968,9 @@ namespace HTEX.Lib.ETL.Lesson
         /// <param name="timeLineData"></param>
         /// <param name="coworkDatas"></param>
         /// <param name="studentLessonDatas"></param>
+        /// <param name="lessonId"></param>
         /// <returns></returns>
-        public static List<StudentLessonData> GetCoworkData(LessonBase lessonBase, TimeLineData timeLineData, List<CoworkData> coworkDatas, List<StudentLessonData> studentLessonDatas)
+        public static List<StudentLessonData> GetCoworkData(LessonBase lessonBase, TimeLineData timeLineData, List<CoworkData> coworkDatas, List<StudentLessonData> studentLessonDatas,string lessonId)
         {
             int p = 0;
             foreach (var coworkData in coworkDatas)
@@ -1031,7 +1052,7 @@ namespace HTEX.Lib.ETL.Lesson
         /// <param name="taskDatas"></param>
         /// <param name="studentLessonDatas"></param>
         /// <returns></returns>
-        public static List<StudentLessonData> GetTaskData(LessonBase lessonBase, TimeLineData timeLineData, List<TaskData> taskDatas, List<StudentLessonData> studentLessonDatas)
+        public static List<StudentLessonData> GetTaskData(LessonBase lessonBase, TimeLineData timeLineData, List<TaskData> taskDatas, List<StudentLessonData> studentLessonDatas, string lessonId)
         {
             //协作也算任务的一种,'WrkSpaceLoad' 作品收集, "isGroupItem": false,
             int indexTask = 0;
@@ -1112,9 +1133,8 @@ namespace HTEX.Lib.ETL.Lesson
         /// <param name="timeLineData"></param>
         /// <param name="smartRatingDatas"></param>
         /// <param name="studentLessonDatas"></param>
-        /// <param name="itemf"></param>
         /// <returns></returns>
-        public static List<StudentLessonData> GetSmartRatingData(LessonBase lessonBase, TimeLineData timeLineData, List<SmartRatingData> smartRatingDatas, List<StudentLessonData> studentLessonDatas, string itemf)
+        public static List<StudentLessonData> GetSmartRatingData(LessonBase lessonBase, TimeLineData timeLineData, List<SmartRatingData> smartRatingDatas, List<StudentLessonData> studentLessonDatas,string lessonId)
         {
             int index = 0;
             foreach (var smartRatingData in smartRatingDatas)
@@ -1163,8 +1183,8 @@ namespace HTEX.Lib.ETL.Lesson
                         }
                         catch (Exception ex)
                         {
-                            Console.WriteLine(itemf);
-                            // throw new Exception($"{itemf}\n{ex.Message}\n{ex.StackTrace}");
+                           
+                             throw new Exception($"{lessonId}\n{ex.Message}\n{ex.StackTrace}");
                         }
                         var meteor_VoteSummary = smartRatingData.smartRateSummary!.meteor_VoteSummary[key];
                         var order = meteor_VoteSummary.OrderByDescending(x => x.result);

+ 13 - 4
TEAMModelOS.Extension/HTEX.Lib/summary.xml

@@ -8180,6 +8180,15 @@
             小组编号
             </summary>
         </member>
+        <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.DoStudentLessonData(System.Collections.Generic.List{System.String},TEAMModelOS.SDK.DI.AzureStorageFactory,HTEX.Lib.ETL.Lesson.LessonLocal)">
+            <summary>
+            生成学生student-analysis.json
+            </summary>
+            <param name="objectiveTypes"></param>
+            <param name="azureStorage"></param>
+            <param name="lessonLocal"></param>
+            <returns></returns>
+        </member>
         <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.GetBaseData(TEAMModelOS.SDK.Models.LessonBase)">
             <summary>
             处理base.json的数据
@@ -8212,7 +8221,7 @@
             <param name="s2"></param>
             <returns></returns>
         </member>
-        <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.GetExamData(TEAMModelOS.SDK.Models.LessonBase,TEAMModelOS.SDK.Models.TimeLineData,System.Collections.Generic.List{TEAMModelOS.SDK.Models.ExamData},System.Collections.Generic.List{TEAMModelOS.SDK.Models.StudentLessonData},System.Collections.Generic.List{System.String})">
+        <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.GetExamData(TEAMModelOS.SDK.Models.LessonBase,TEAMModelOS.SDK.Models.TimeLineData,System.Collections.Generic.List{TEAMModelOS.SDK.Models.ExamData},System.Collections.Generic.List{TEAMModelOS.SDK.Models.StudentLessonData},System.Collections.Generic.List{System.String},System.String)">
             <summary>
             获取课中评测数据
             </summary>
@@ -8223,7 +8232,7 @@
             <param name="objectiveTypes"></param>
             <returns></returns>
         </member>
-        <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.GetCoworkData(TEAMModelOS.SDK.Models.LessonBase,TEAMModelOS.SDK.Models.TimeLineData,System.Collections.Generic.List{TEAMModelOS.SDK.Models.CoworkData},System.Collections.Generic.List{TEAMModelOS.SDK.Models.StudentLessonData})">
+        <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.GetCoworkData(TEAMModelOS.SDK.Models.LessonBase,TEAMModelOS.SDK.Models.TimeLineData,System.Collections.Generic.List{TEAMModelOS.SDK.Models.CoworkData},System.Collections.Generic.List{TEAMModelOS.SDK.Models.StudentLessonData},System.String)">
             <summary>
             协作参与率 态度计算
             </summary>
@@ -8231,9 +8240,10 @@
             <param name="timeLineData"></param>
             <param name="coworkDatas"></param>
             <param name="studentLessonDatas"></param>
+            <param name="lessonId"></param>
             <returns></returns>
         </member>
-        <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.GetTaskData(TEAMModelOS.SDK.Models.LessonBase,TEAMModelOS.SDK.Models.TimeLineData,System.Collections.Generic.List{TEAMModelOS.SDK.Models.TaskData},System.Collections.Generic.List{TEAMModelOS.SDK.Models.StudentLessonData})">
+        <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.GetTaskData(TEAMModelOS.SDK.Models.LessonBase,TEAMModelOS.SDK.Models.TimeLineData,System.Collections.Generic.List{TEAMModelOS.SDK.Models.TaskData},System.Collections.Generic.List{TEAMModelOS.SDK.Models.StudentLessonData},System.String)">
             <summary>
             处理学生回推数据,并将回推纳入学习态度计算。
             </summary>
@@ -8256,7 +8266,6 @@
              <param name="timeLineData"></param>
              <param name="smartRatingDatas"></param>
              <param name="studentLessonDatas"></param>
-             <param name="itemf"></param>
              <returns></returns>
         </member>
         <member name="M:HTEX.Lib.ETL.Lesson.LessonETLService.MinMaxNormalization(System.Double,System.Double,System.Double,System.Double,System.Double)">

+ 47 - 1
TEAMModelOS.Function/IESServiceBusTrigger.cs

@@ -41,6 +41,7 @@ using System.Security.Policy;
 using System.Net.Http.Headers;
 using Microsoft.AspNetCore.Hosting;
 using Newtonsoft.Json.Linq;
+using HTEX.Lib.ETL.Lesson;
 
 namespace TEAMModelOS.Function
 {
@@ -1563,10 +1564,27 @@ namespace TEAMModelOS.Function
                                             await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IRS.json转换异常,{ex.Message}{ex.StackTrace},{lessonRecord.id}", GroupNames.成都开发測試群組);
                                         }
                                     }
+                                    //苏格拉底文件信息
+                                    //Sokrates/SokratesRecords.json
+                                    List<TimeLineEvent> sokratesDatas = new List<TimeLineEvent>();
+                                    try
+                                    {
+                                        BlobDownloadResult irsBlobDownload = await _azureStorage.GetBlobContainerClient(blobname).GetBlobClient($"/records/{_lessonId}/Sokrates/SokratesRecords.json").DownloadContentAsync();
+                                        sokratesDatas = irsBlobDownload.Content.ToObjectFromJson<List<TimeLineEvent>>();
+
+                                    }
+                                    catch (Exception ex)
+                                    {
+                                        if (!ex.Message.Contains("The specified blob does not exist"))
+                                        {
+                                            await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IRS.json转换异常,{ex.Message}{ex.StackTrace},{lessonRecord.id}", GroupNames.成都开发測試群組);
+                                        }
+                                    }
+
 
                                     //读取base.json信息
                                     //如果有更新 则去读取/{_lessonId}/IES/base.json
-
+                                    List<LocalStudent> studentLessonDatas   = new List<LocalStudent>();
                                     LessonBase lessonBase = null;
                                     try
                                     {
@@ -1587,6 +1605,8 @@ namespace TEAMModelOS.Function
                                         //await  _dingDing.SendBotMsg($"课例记录文件base.json:{lessonBase.ToJsonString()}", GroupNames.成都开发測試群組);
                                         if (lessonBase != null && lessonBase.summary != null)
                                         {
+                                            var baseData =LessonETLService. GetBaseData(lessonBase!);
+                                            studentLessonDatas= baseData.studentLessonDatas;
                                             //lessonRecord.name = lessonBase.summary.activityName;
                                             lessonRecord.attendCount = lessonBase.summary.attendCount;
                                             lessonRecord.clientCount = lessonBase.summary.clientCount;
@@ -1719,6 +1739,32 @@ namespace TEAMModelOS.Function
 
                                         await BlobService.RefreshBlobRoot(new BlobRefreshMessage { progress = "update", root = "records", name = $"{blobname}" }, _serviceBus, _configuration, _azureRedis);
                                         msgs.Add(update);
+                                        List<ExamData> examDatas = new List<ExamData>();
+                                        if (lessonBase!=null  && lessonBase.student!=null)
+                                        {
+                                            string owner = lessonRecord.scope.Equals("school") ? lessonRecord.school : lessonRecord.tmdid;
+                                            examDatas = await LessonETLService.GetExamInfo(lessonRecord, timeLineData, _azureStorage, owner);
+
+                                            sokratesDatas= sokratesDatas.IsNotEmpty() ? sokratesDatas : timeLineData!=null ? timeLineData.events : new List<TimeLineEvent>();
+                                        }
+                                        LessonLocal lessonLocal = new LessonLocal()
+                                        {
+                                            lessonBase=lessonBase,
+                                            timeLineData= timeLineData,
+                                            lessonRecord= lessonRecord,
+                                            taskDatas= taskDatas,
+                                            smartRatingDatas= smartRatingDatas,
+                                            irsDatas= irsDatas,
+                                            coworkDatas= coworkDatas,
+                                            examDatas=examDatas,
+                                            sokratesDatas= sokratesDatas,
+                                            studentLessonDatas=studentLessonDatas
+                                        };
+                                        try {
+                                            await LessonETLService.DoStudentLessonData(Constant.objectiveTypes, _azureStorage, lessonLocal);
+                                        } catch (Exception ex) {
+                                            await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}处理学生课中数据发生异常,{_lessonId}\n{ex.Message}\n{ex.StackTrace}\n\n{lessonRecord.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
+                                        }
                                         DoLessonStudentRecord(_dingDing, _snowflakeId, lessonRecord, scope, client, school, tmdid, teacher, _serviceBus, _azureStorage, _configuration, lessonBase, _azureRedis, PickupMemberIds, taskDatas, irsDatas);
 
                                     }

+ 4 - 3
TEAMModelOS.Function/TEAMModelOS.Function.csproj

@@ -5,9 +5,9 @@
     <OutputType>Exe</OutputType>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	<Version>5.2410.16</Version>
-	<AssemblyVersion>5.2410.16.1</AssemblyVersion>
-	<FileVersion>5.2410.16.1</FileVersion>
+	<Version>5.2410.23</Version>
+	<AssemblyVersion>5.2410.23.1</AssemblyVersion>
+	<FileVersion>5.2410.23.1</FileVersion>
 	<PackageId>TEAMModelOS.FunctionV4</PackageId>
 	<Authors>teammodel</Authors>
 	<Company>醍摩豆(成都)信息技术有限公司</Company>
@@ -51,6 +51,7 @@
     <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" />-->
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\TEAMModelOS.Extension\HTEX.Lib\HTEX.Lib.csproj" />
     <ProjectReference Include="..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
   </ItemGroup>
   <ItemGroup>

+ 1 - 0
TEAMModelOS.SDK/Context/Constant/Constant.cs

@@ -6,6 +6,7 @@ namespace TEAMModelOS.SDK.DI
 {
     public class Constant
     {
+        public static readonly List<string> objectiveTypes = new List<string>() { "single", "multiple", "sortmultiple", "judge" };
         public static readonly List<string> BlobPrefix = new List<string> { "exam", "vote", "survey", "item", "paper", "syllabus", "records", "doc", "image", "res", "video", "audio", "other", "thum", "train", "temp", "jyzx" };
         public static readonly List<string> ContentPrefix = new List<string> { "doc", "image", "res", "video", "audio", "other" };
         public static readonly string TEAMModelOS = "TEAMModelOS";

+ 13 - 2
TEAMModelOS.SDK/Helper/Common/FileHelper/FileHelper.cs

@@ -659,7 +659,7 @@ namespace TEAMModelOS.SDK.Helper.Common.FileHelper
         /// </summary>
         /// <param name="directoryPath"></param>
         /// <returns></returns>
-        public static List<string> ListAllFiles(string directoryPath)
+        public static List<string> ListAllFiles(string directoryPath,string filter = null)
         {
             List<string> filePaths = new List<string>();
             DirectoryInfo dirInfo = new DirectoryInfo(directoryPath);
@@ -669,7 +669,18 @@ namespace TEAMModelOS.SDK.Helper.Common.FileHelper
 
             foreach (FileInfo file in files)
             {
-                filePaths.Add(file.FullName);
+                if (string.IsNullOrWhiteSpace(filter))
+                {
+                    filePaths.Add(file.FullName);
+                    continue;
+                }
+                else {
+                    if (file.FullName.Contains(filter)) 
+                    {
+                        filePaths.Add(file.FullName);
+                    }
+                }
+               
                 // Console.WriteLine(file.FullName);
             }
             return filePaths;

+ 3 - 3
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -1,9 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
 		<TargetFramework>net8.0</TargetFramework>
-		<Version>5.2410.16</Version>
-		<AssemblyVersion>5.2410.16.1</AssemblyVersion>
-		<FileVersion>5.2410.16.1</FileVersion>
+		<Version>5.2410.23</Version>
+		<AssemblyVersion>5.2410.23.1</AssemblyVersion>
+		<FileVersion>5.2410.23.1</FileVersion>
 		<PackageReleaseNotes>发版</PackageReleaseNotes>
 	</PropertyGroup>
 

+ 2 - 2
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -148,12 +148,12 @@ namespace TEAMModelOS.Controllers.Client
             }
             catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
             {
-                await _dingDing.SendBotMsg($"更新课堂记录出错\n{ex.StackTrace}{ex.Message}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"更新课堂记录出错CosmosException{_lessonId}\n{ex.StackTrace}{ex.Message}", GroupNames.成都开发測試群組);
                 return BadRequest("课堂记录不存在");
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"更新课堂记录出错\n{ex.StackTrace}{ex.Message}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"更新课堂记录出错Exception{_lessonId}\n{ex.StackTrace}{ex.Message}", GroupNames.成都开发測試群組);
                 return BadRequest();
             }
         }

+ 4 - 4
TEAMModelOS/TEAMModelOS.csproj

@@ -79,11 +79,11 @@
 		<SpaRoot>ClientApp\</SpaRoot>
 		<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
 		<UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-		<Version>5.2410.16</Version>
-		<AssemblyVersion>5.2410.16.1</AssemblyVersion>
-		<FileVersion>5.2410.16.1</FileVersion>
+		<Version>5.2410.23</Version>
+		<AssemblyVersion>5.2410.23.1</AssemblyVersion>
+		<FileVersion>5.2410.23.1</FileVersion>
 		<Description>TEAMModelOS(IES5)</Description>
-		<PackageReleaseNotes>IES版本说明版本切换标记5.2410.16.1</PackageReleaseNotes>
+		<PackageReleaseNotes>IES版本说明版本切换标记5.2410.23.1</PackageReleaseNotes>
 		<PackageId>TEAMModelOS</PackageId>
 		<Authors>teammodel</Authors>
 		<Company>醍摩豆(成都)信息技术有限公司</Company>

+ 1 - 1
TEAMModelOS/appsettings.Development.json

@@ -18,7 +18,7 @@
     "IdTokenSalt": "8263692E2213497BB55E74792B7900B4",
     "HttpTrigger": "https://teammodelosfunction-test.chinacloudsites.cn/api/",
     //"HttpTrigger": "http://localhost:7071/api/"
-    "Version": "5.2410.16.1"
+    "Version": "5.2410.23.1"
   },
   "Azure": {
     // 测试站数据库

+ 1 - 1
TEAMModelOS/appsettings.json

@@ -18,7 +18,7 @@
     "Exp": 86400,
     "IdTokenSalt": "8263692E2213497BB55E74792B7900B4",
     "HttpTrigger": "https://teammodelosfunction.chinacloudsites.cn/api/",
-    "Version": "5.2410.16.1"
+    "Version": "5.2410.23.1"
   },
   "Azure": {
     "Storage": {