Browse Source

衝突處理

JAELYS 3 years ago
parent
commit
090c443754
27 changed files with 1409 additions and 1204 deletions
  1. 0 527
      TEAMModelAPI/Controllers/School/ActivityController.cs
  2. 479 18
      TEAMModelAPI/Controllers/School/ExamController.cs
  3. 36 9
      TEAMModelAPI/Controllers/School/SchoolController.cs
  4. 2 150
      TEAMModelBI/Controllers/BIHome/HomeStatisController.cs
  5. 89 52
      TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs
  6. 5 0
      TEAMModelBI/Controllers/BISchool/RoomController.cs
  7. 123 10
      TEAMModelBI/Controllers/BISchool/SchoolController.cs
  8. 0 62
      TEAMModelBI/Controllers/BITeacher/TeacherBIController.cs
  9. 114 0
      TEAMModelBI/Controllers/BITeacher/TeacherController.cs
  10. 6 0
      TEAMModelBI/Models/MonthStartEnd.cs
  11. 30 1
      TEAMModelBI/Tool/CommonFind.cs
  12. 1 1
      TEAMModelOS.SDK/DI/AzureStorage/AzureStorageTableExtensions.cs
  13. 169 139
      TEAMModelOS.SDK/Models/Service/GroupListService.cs
  14. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventBasicInfo.vue
  15. 0 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Homework.vue
  16. 32 29
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue
  17. 0 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  18. 0 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue
  19. 0 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Vote.vue
  20. 21 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue
  21. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue
  22. 1 0
      TEAMModelOS/ClientApp/src/utils/editorLangEn.js
  23. 1 0
      TEAMModelOS/ClientApp/src/utils/editorLangTw.js
  24. 18 14
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue
  25. 1 1
      TEAMModelOS/ClientApp/src/view/settings/OpenMgmt2.vue
  26. 9 6
      TEAMModelOS/Controllers/Common/ExamController.cs
  27. 270 178
      TEAMModelOS/Controllers/XTest/FixDataController.cs

+ 0 - 527
TEAMModelAPI/Controllers/School/ActivityController.cs

@@ -1,527 +0,0 @@
-using Azure.Cosmos;
-using HTEXLib.Translator;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.Options;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Text.Json;
-using System.Threading.Tasks;
-using TEAMModelOS.Filter;
-using TEAMModelOS.Models;
-using TEAMModelOS.Models.Dto;
-using TEAMModelOS.SDK;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Models;
-
-namespace TEAMModelAPI.Controllers
-{
-    [ProducesResponseType(StatusCodes.Status200OK)]
-    [ProducesResponseType(StatusCodes.Status400BadRequest)]
-    [ApiController]
-    [Route("activity")]
-    public class ActivityController:ControllerBase
-    {
-        public AzureCosmosFactory _azureCosmos;
-        private readonly AzureStorageFactory _azureStorage;
-        private readonly AzureRedisFactory _azureRedis;
-        private readonly DingDing _dingDing;
-        private readonly Option _option;
-        private readonly IConfiguration _configuration;
-        public DOXC2HTMLTranslator _DOXC2HTMLTranslator { get; set; }
-        //public PPTX2HTEXTranslator _PPTX2HTEXTranslator { get; set; }
-        public HTML2ITEMV3Translator _HTML2ITEMV3Translator { get; set; }
-        public ActivityController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration)
-        {
-            _azureCosmos = azureCosmos;
-            _azureStorage = azureStorage;
-            _azureRedis = azureRedis;
-            _dingDing = dingDing;
-            _option = option?.Value;
-            _configuration = configuration;
-        }
-
-        [ProducesDefaultResponseType]
-        [HttpGet("import-exam")]
-        [ApiToken(Auth = "91", Name = "汇入评测基础数据", Limit = false)]
-        public async Task<IActionResult> importExam(JsonElement request)
-        {
-            //获取评测的ID
-            if (!request.TryGetProperty("exam", out JsonElement exam)) return BadRequest();
-            if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
-            try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                ExamInfo info = exam.ToObject<ExamInfo>();
-                info.progress = "going";
-                await client.GetContainer(Constant.TEAMModelOS, "Common").UpsertItemAsync(info, new PartitionKey($"Exam-{code}"));
-                return Ok(new { info });
-            }
-            catch (Exception e)
-            {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/import-exam()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest();
-            }
-        }
-        [ProducesDefaultResponseType]
-        [HttpGet("upsert-record")]
-        [ApiToken(Auth = "90", Name = "批量汇入作答数据", Limit = false)]
-        public async Task<IActionResult> upsertRecord(JsonElement request)
-        {
-
-            if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
-            if (!request.TryGetProperty("students", out JsonElement students)) return BadRequest();
-            if (!request.TryGetProperty("subjectId", out JsonElement subjectId)) return BadRequest();
-            //根据不同评测的类型返回对应的编码
-            if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
-            try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                //List<string> ids = students.ToObject<List<string>>();
-                List<students> stus = students.ToObject<List<students>>();
-                ExamInfo info = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(id.GetString(), new PartitionKey($"Exam-{code}"));
-                string classCode = info.scope.Equals("school") ? info.school : info.creatorId;
-                List<ExamClassResult> examClassResults = new();
-                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamClassResult>(
-                           queryText: $"select value(c) from c where c.examId = '{id}' and c.subjectId = '{subjectId}'",
-                           requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamClassResult-{classCode}") }))
-                {
-                    examClassResults.Add(item);
-                }
-                int n = 0;
-                foreach (ExamSubject subject in info.subjects)
-                {
-                    if (!subject.id.Equals(subjectId.GetString()))
-                    {
-                        n++;
-                    }
-                    else
-                    {
-                        break;
-                    }
-                }
-                //获取试卷信息
-                PaperSimple standerAnswers = new PaperSimple();
-                List<List<string>> standard = new List<List<string>>();
-                List<double> points = new List<double>();
-                standerAnswers = info.papers[n];
-                standard = standerAnswers.answers;
-                points = standerAnswers.point;
-                int rule = standerAnswers.multipleRule;
-                List<string> value = new List<string>();
-                await foreach (var s in stuTask(stus, examClassResults, standard, points, rule, info, subjectId.GetString(), client))
-                {
-                    if (s.code == 1)
-                    {
-                        value.Add(s.value);
-                    }
-                }
-                if (value.Count > 0)
-                {
-                    return Ok(new { code = 1, msg = "学生ID异常", value = value });
-                }
-                else
-                {
-                    return Ok(new { code = 0 });
-                }
-
-            }
-            catch (Exception e)
-            {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},activity/upsert-record()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest();
-            }
-
-        }
-        private async IAsyncEnumerable<(int code, string value)> stuTask(List<students> stus, List<ExamClassResult> examClassResults, List<List<string>> standard,
-            List<double> points, int rule, ExamInfo info, string subjectId, CosmosClient client)
-        {
-            foreach (var s in stus)
-            {
-                string value = "";
-                int code = 0;
-                List<List<string>> ans = s.answer;
-                bool isExist = examClassResults.Exists(e => e.studentIds.Contains(s.id));
-                if (!isExist)
-                {
-                    value = s.id;
-                    code = 1;
-                }
-                else
-                {
-                    foreach (ExamClassResult result in examClassResults)
-                    {
-                        if (!result.studentIds.Contains(s.id))
-                        {
-                            continue;
-                        }
-                        else
-                        {
-                            int newIndex = result.studentIds.IndexOf(s.id);
-                            StringBuilder builder = new StringBuilder();
-                            builder.Append(result.examId).Append('/');
-                            builder.Append(result.subjectId).Append('/');
-                            builder.Append(s.id).Append('/');
-                            builder.Append("ans.json");
-                            result.studentAnswers[newIndex].Clear();
-                            result.studentAnswers[newIndex].Add(builder.ToString());
-                            for (int i = 0; i < ans.Count; i++)
-                            {
-                                if (ans[i] == null)
-                                {
-                                    continue;
-                                    //ans[i] = new List<string>();
-                                }
-                                var ac = ans[i].Count;
-                                var sc = standard[i].Count;
-                                //记录次数
-                                int n = 0;
-                                //算分处理
-                                if (sc > 0)
-                                {
-                                    result.ans[newIndex][i] = ans[i];
-                                    if (ac == sc && sc == 1)
-                                    {
-                                        foreach (string right in ans[i])
-                                        {
-                                            if (standard[i].Contains(right))
-                                            {
-                                                result.studentScores[newIndex][i] = points[i];
-                                            }
-                                            else
-                                            {
-                                                result.studentScores[newIndex][i] = 0;
-                                            }
-                                        }
-
-                                    }
-                                    else
-                                    {
-                                        if (rule > 0)
-                                        {
-                                            int falseCount = 0;
-                                            if (ac > 0)
-                                            {
-                                                foreach (string obj in ans[i])
-                                                {
-                                                    if (!standard[i].Contains(obj))
-                                                    {
-                                                        falseCount++;
-                                                    }
-                                                }
-                                                switch (rule)
-                                                {
-                                                    case 1:
-                                                        if (ac == sc)
-                                                        {
-                                                            if (falseCount == 0)
-                                                            {
-                                                                result.studentScores[newIndex][i] = points[i];
-                                                            }
-                                                            else
-                                                            {
-                                                                result.studentScores[newIndex][i] = 0;
-                                                            }
-                                                        }
-                                                        else
-                                                        {
-                                                            result.studentScores[newIndex][i] = 0;
-                                                        }
-                                                        break;
-                                                    case 2:
-                                                        if (falseCount > 0)
-                                                        {
-                                                            result.studentScores[newIndex][i] = 0;
-                                                        }
-                                                        else
-                                                        {
-                                                            if (ac == sc)
-                                                            {
-                                                                result.studentScores[newIndex][i] = points[i];
-                                                            }
-                                                            else
-                                                            {
-                                                                result.studentScores[newIndex][i] = points[i] / 2;
-                                                            }
-
-                                                        }
-                                                        break;
-                                                    case 3:
-                                                        if (falseCount > 0)
-                                                        {
-                                                            result.studentScores[newIndex][i] = 0;
-                                                        }
-                                                        else
-                                                        {
-                                                            if (ac == sc)
-                                                            {
-                                                                result.studentScores[newIndex][i] = points[i];
-                                                            }
-                                                            else
-                                                            {
-                                                                result.studentScores[newIndex][i] = System.Math.Round((double)ac / sc * points[i], 1);
-                                                            }
-
-                                                        }
-                                                        break;
-                                                    case 4:
-                                                        if (ac == sc)
-                                                        {
-                                                            result.studentScores[newIndex][i] = points[i];
-                                                        }
-                                                        else
-                                                        {
-                                                            double persent = (double)(sc - 2 * falseCount) / sc;
-                                                            if (persent <= 0)
-                                                            {
-                                                                result.studentScores[newIndex][i] = 0;
-                                                            }
-                                                            else
-                                                            {
-                                                                result.studentScores[newIndex][i] = System.Math.Round(persent * points[i], 1);
-                                                            }
-                                                        }
-                                                        break;
-                                                }
-                                            }
-                                            else
-                                            {
-                                                result.studentScores[newIndex][i] = 0;
-                                            }
-
-                                        }
-                                    }
-                                }
-                            }
-                            bool flag = true;
-                            foreach (List<double> scores in result.studentScores)
-                            {
-                                foreach (double score in scores)
-                                {
-                                    if (score == -1)
-                                    {
-                                        flag = false;
-                                        break;
-                                    }
-                                }
-                            }
-                            if (flag)
-                            {
-                                result.progress = true;
-                                info.subjects.ForEach(s =>
-                                {
-                                    if (s.id.Equals(subjectId.ToString()))
-                                    {
-                                        s.classCount += 1;
-                                    }
-                                });
-                                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(info, info.id.ToString(), new PartitionKey($"{info.code}"));
-                            }
-                            result.sum[newIndex] = result.studentScores[newIndex].Sum();
-                            await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(result, result.id, new PartitionKey($"{result.code}"));
-                            break;
-                        }
-                    }
-                }
-                yield return (code, value);
-            }
-        }
-        [ProducesDefaultResponseType]
-        [HttpGet("parse-word")]
-        [ApiToken(Auth = "92", Name = "录入试卷数据", Limit = false)]
-        public async Task<IActionResult> ParseWord([FromForm] FileDto fileDto)
-        {
-            if (!FileType.GetExtention(fileDto.file.FileName).ToLower().Equals("docx"))
-            {
-                return BadRequest(new Dictionary<string, object> { { "msg", "type is not docx!" }, { "code", 404} });
-            }
-
-            try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                var response = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(fileDto.examId, new PartitionKey($"Exam-{fileDto.code}"));
-                ExamInfo examInfo;
-                if (response.Status == 200)
-                {
-                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    examInfo = json.ToObject<ExamInfo>();
-
-                }
-                else
-                {
-                    return Ok(new { error = 404, msg = "请先导入评测信息" });
-                }
-                foreach (PaperSimple paper in examInfo.papers)
-                {
-                    if (paper.id.Contains(fileDto.subjectId))
-                    {
-                        return Ok(new { error = 500, msg = "该试卷信息已存在" });
-                    }
-                }
-                PaperSimple simple = new();
-                var doc = _DOXC2HTMLTranslator.Translate(fileDto.file.OpenReadStream());
-                (List<HTEXLib.DOCX.Models.ItemInfo> tests, List<string> error) = _HTML2ITEMV3Translator.Translate(doc);
-                List<Task<string>> tasks = new List<Task<string>>();
-                PaperDto paperDto = new()
-                {
-                    id = Guid.NewGuid().ToString(),
-                    name = fileDto.name,
-                    code = fileDto.code,
-                    scope = "school",
-                    multipleRule = fileDto.multipleRule,
-                    gradeIds = fileDto.gradeIds,
-                    subjectId = fileDto.subjectId,
-                    periodId = fileDto.periodId
-                };
-                foreach (HTEXLib.DOCX.Models.ItemInfo item in tests)
-                {
-                    Slides slides = new();
-                    ItemDto dto = new();
-                    Scoring scoring = new();
-                    dto.id = Guid.NewGuid().ToString();
-                    dto.exercise.answer = item.answer;
-                    dto.exercise.explain = item.explain;
-                    dto.exercise.type = item.type;
-                    dto.exercise.opts = item.option.Count;
-                    dto.exercise.knowledge = item.knowledge;
-                    dto.exercise.field = item.field;
-                    dto.exercise.level = item.level;
-                    dto.exercise.subjectId = fileDto.subjectId;
-                    dto.exercise.periodId = fileDto.periodId;
-                    dto.exercise.gradeIds = fileDto.gradeIds;
-                    slides.url = dto.id + ".json";
-                    slides.type = dto.exercise.type;
-                    scoring.ans = dto.exercise.answer;
-                    scoring.score = dto.exercise.score;
-                    scoring.knowledge = dto.exercise.knowledge;
-                    scoring.field = dto.exercise.field;
-                    slides.scoring = scoring;
-                    //添加试卷信息
-                    paperDto.slides.Add(slides);
-                    if (!slides.type.Equals("compose"))
-                    {
-                        simple.point.Add(dto.exercise.score);
-                        simple.answers.Add(dto.exercise.answer);
-                        simple.knowledge.Add(dto.exercise.knowledge);
-                        simple.type.Add(dto.exercise.type);
-                        simple.field.Add((int)dto.exercise.field);
-                    }
-                    if (item.children.Count > 0)
-                    {
-                        foreach (HTEXLib.DOCX.Models.ItemInfo its in item.children)
-                        {
-                            Slides cslides = new();
-                            Scoring cscoring = new();
-                            ItemDto dtoChildren = new ItemDto();
-                            dtoChildren.id = Guid.NewGuid().ToString();
-                            dtoChildren.pid = dto.id;
-                            dtoChildren.exercise.answer = its.answer;
-                            dtoChildren.exercise.explain = its.explain;
-                            dtoChildren.exercise.type = its.type;
-                            dtoChildren.exercise.opts = its.option.Count;
-                            dtoChildren.exercise.knowledge = its.knowledge;
-                            dtoChildren.exercise.field = its.field;
-                            dtoChildren.exercise.level = its.level;
-                            dtoChildren.exercise.scope = "school";
-                            dtoChildren.exercise.score = its.score;
-                            dtoChildren.exercise.subjectId = fileDto.subjectId;
-                            dtoChildren.exercise.periodId = fileDto.periodId;
-                            dtoChildren.exercise.gradeIds = fileDto.gradeIds;
-                            dtoChildren.exercise.children.Add(dtoChildren.id);
-                            info info1 = new();
-                            info1.uid = dtoChildren.id;
-                            info1.question = its.question;
-                            info1.option = its.option;
-                            dtoChildren.item.Add(info1);
-                            dto.exercise.children.Add(dtoChildren.id);
-                            //处理子题的slides
-                            cslides.url = dtoChildren.id + ".json";
-                            cslides.type = dtoChildren.exercise.type;
-                            cscoring.ans = dtoChildren.exercise.answer;
-                            cscoring.score = dtoChildren.exercise.score;
-                            cscoring.knowledge = dtoChildren.exercise.knowledge;
-                            cscoring.field = dtoChildren.exercise.field;
-                            cslides.scoring = scoring;
-                            paperDto.slides.Add(cslides);
-                            //添加试卷信息
-                            simple.point.Add(dtoChildren.exercise.score);
-                            simple.answers.Add(dto.exercise.answer);
-                            simple.knowledge.Add(dto.exercise.knowledge);
-                            simple.type.Add(dto.exercise.type);
-                            simple.field.Add((int)dto.exercise.field);
-
-                            StringBuilder stringBuilder = new StringBuilder();
-                            stringBuilder.Append(fileDto.examId).Append("/");
-                            stringBuilder.Append("paper").Append("/");
-                            stringBuilder.Append(fileDto.subjectId).Append("/");
-                            stringBuilder.Append(dtoChildren.id + ".json");
-                            tasks.Add(_azureStorage.UploadFileByContainer(fileDto.code, dtoChildren.ToJsonString(), "exam", stringBuilder.ToString(), false));
-                        }
-                    }
-                    info @info = new();
-                    @info.uid = dto.id;
-                    @info.question = item.question;
-                    @info.option = item.option;
-                    dto.item.Add(@info);
-                    dto.exercise.scope = "school";
-                    dto.exercise.score = item.score;
-                    StringBuilder builder = new StringBuilder();
-                    builder.Append(fileDto.examId).Append('/');
-                    builder.Append("paper").Append('/');
-                    builder.Append(fileDto.subjectId).Append('/');
-                    builder.Append(dto.id + ".json");
-                    tasks.Add(_azureStorage.UploadFileByContainer(fileDto.code, dto.ToJsonString(), "exam", builder.ToString(), false));
-
-
-                }
-                StringBuilder paperBuilder = new StringBuilder();
-                paperBuilder.Append(fileDto.examId).Append('/');
-                paperBuilder.Append("paper").Append('/');
-                paperBuilder.Append(fileDto.subjectId).Append('/');
-                paperBuilder.Append("index.json");
-                tasks.Add(_azureStorage.UploadFileByContainer(fileDto.code, paperDto.ToJsonString(), "exam", paperBuilder.ToString(), false));
-
-                //开始给ExamInfo paper赋值
-                simple.id = fileDto.subjectId;
-                simple.code = "Paper-" + fileDto.code;
-                simple.name = fileDto.name;
-                simple.blob = paperBuilder.ToString().Replace("index.json", "");
-                simple.scope = "school";
-                simple.multipleRule = fileDto.multipleRule;
-
-                examInfo.papers.Add(simple);
-                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(examInfo, examInfo.id, new PartitionKey($"{examInfo.code}"));
-                await Task.WhenAll(tasks);
-
-                return Ok(new { code = 200 });
-            }
-            catch (Exception e)
-            {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/word()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest();
-            }
-
-        }
-
-        private class students
-        {
-            public string id { get; set; }
-            public List<List<string>> answer { get; set; }
-        }
-        public class FileDto
-        {
-            public string periodId { get; set; }
-            public string code { get; set; }
-            public string name { get; set; }
-            public int multipleRule { get; set; }
-            public string examId { get; set; }
-            public string subjectId { get; set; }
-            public List<string> gradeIds { get; set; }
-            public IFormFile file { get; set; }
-        }
-    }
-}

+ 479 - 18
TEAMModelAPI/Controllers/School/ExamController.cs

@@ -24,6 +24,9 @@ using Microsoft.Extensions.Configuration;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Filter;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Authorization;
 using HTEXLib.COMM.Helpers;
 using HTEXLib.COMM.Helpers;
+using HTEXLib.Translator;
+using TEAMModelOS.Models.Dto;
+
 namespace TEAMModelAPI.Controllers
 namespace TEAMModelAPI.Controllers
 {
 {
     [ProducesResponseType(StatusCodes.Status200OK)]
     [ProducesResponseType(StatusCodes.Status200OK)]
@@ -38,6 +41,9 @@ namespace TEAMModelAPI.Controllers
         private readonly DingDing _dingDing;
         private readonly DingDing _dingDing;
         private readonly Option _option;
         private readonly Option _option;
         private readonly IConfiguration _configuration;
         private readonly IConfiguration _configuration;
+        public DOXC2HTMLTranslator _DOXC2HTMLTranslator { get; set; }
+        //public PPTX2HTEXTranslator _PPTX2HTEXTranslator { get; set; }
+        public HTML2ITEMV3Translator _HTML2ITEMV3Translator { get; set; }
         public ExamController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration)
         public ExamController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration)
         {
         {
             _azureCosmos = azureCosmos;
             _azureCosmos = azureCosmos;
@@ -48,30 +54,485 @@ namespace TEAMModelAPI.Controllers
             _configuration = configuration;
             _configuration = configuration;
         }
         }
 
 
-        /// <summary>
-        ///  获取试卷和评测的条件信息
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
-        [HttpPost("get-paper-exam-condition")]
-        [ApiToken(Auth = "11", Name = "试卷和评测的条件信息", RW = "R", Limit = false)]
-        public async Task<IActionResult> GetPaperExamCondition(JsonElement json)
+        [HttpGet("import-exam")]
+        [ApiToken(Auth = "201", Name = "汇入评测基础数据", Limit = false)]
+        public async Task<IActionResult> importExam(JsonElement request)
+        {
+            //获取评测的ID
+            if (!request.TryGetProperty("exam", out JsonElement exam)) return BadRequest();
+            if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
+            try
+            {
+                var client = _azureCosmos.GetCosmosClient();
+                ExamInfo info = exam.ToObject<ExamInfo>();
+                info.progress = "going";
+                await client.GetContainer(Constant.TEAMModelOS, "Common").UpsertItemAsync(info, new PartitionKey($"Exam-{code}"));
+                return Ok(new { info });
+            }
+            catch (Exception e)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/import-exam()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
+        [ProducesDefaultResponseType]
+        [HttpGet("upsert-record")]
+        [ApiToken(Auth = "202", Name = "批量汇入作答数据", Limit = false)]
+        public async Task<IActionResult> upsertRecord(JsonElement request)
+        {
+
+            if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
+            if (!request.TryGetProperty("students", out JsonElement students)) return BadRequest();
+            if (!request.TryGetProperty("subjectId", out JsonElement subjectId)) return BadRequest();
+            //根据不同评测的类型返回对应的编码
+            if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
+            try
+            {
+                var client = _azureCosmos.GetCosmosClient();
+                //List<string> ids = students.ToObject<List<string>>();
+                List<students> stus = students.ToObject<List<students>>();
+                ExamInfo info = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(id.GetString(), new PartitionKey($"Exam-{code}"));
+                string classCode = info.scope.Equals("school") ? info.school : info.creatorId;
+                List<ExamClassResult> examClassResults = new();
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamClassResult>(
+                           queryText: $"select value(c) from c where c.examId = '{id}' and c.subjectId = '{subjectId}'",
+                           requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamClassResult-{classCode}") }))
+                {
+                    examClassResults.Add(item);
+                }
+                int n = 0;
+                foreach (ExamSubject subject in info.subjects)
+                {
+                    if (!subject.id.Equals(subjectId.GetString()))
+                    {
+                        n++;
+                    }
+                    else
+                    {
+                        break;
+                    }
+                }
+                //获取试卷信息
+                PaperSimple standerAnswers = new PaperSimple();
+                List<List<string>> standard = new List<List<string>>();
+                List<double> points = new List<double>();
+                standerAnswers = info.papers[n];
+                standard = standerAnswers.answers;
+                points = standerAnswers.point;
+                int rule = standerAnswers.multipleRule;
+                List<string> value = new List<string>();
+                await foreach (var s in stuTask(stus, examClassResults, standard, points, rule, info, subjectId.GetString(), client))
+                {
+                    if (s.code == 1)
+                    {
+                        value.Add(s.value);
+                    }
+                }
+                if (value.Count > 0)
+                {
+                    return Ok(new { code = 1, msg = "学生ID异常", value = value });
+                }
+                else
+                {
+                    return Ok(new { code = 0 });
+                }
+
+            }
+            catch (Exception e)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},activity/upsert-record()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+
+        }
+        private async IAsyncEnumerable<(int code, string value)> stuTask(List<students> stus, List<ExamClassResult> examClassResults, List<List<string>> standard,
+            List<double> points, int rule, ExamInfo info, string subjectId, CosmosClient client)
+        {
+            foreach (var s in stus)
+            {
+                string value = "";
+                int code = 0;
+                List<List<string>> ans = s.answer;
+                bool isExist = examClassResults.Exists(e => e.studentIds.Contains(s.id));
+                if (!isExist)
+                {
+                    value = s.id;
+                    code = 1;
+                }
+                else
+                {
+                    foreach (ExamClassResult result in examClassResults)
+                    {
+                        if (!result.studentIds.Contains(s.id))
+                        {
+                            continue;
+                        }
+                        else
+                        {
+                            int newIndex = result.studentIds.IndexOf(s.id);
+                            StringBuilder builder = new StringBuilder();
+                            builder.Append(result.examId).Append('/');
+                            builder.Append(result.subjectId).Append('/');
+                            builder.Append(s.id).Append('/');
+                            builder.Append("ans.json");
+                            result.studentAnswers[newIndex].Clear();
+                            result.studentAnswers[newIndex].Add(builder.ToString());
+                            for (int i = 0; i < ans.Count; i++)
+                            {
+                                if (ans[i] == null)
+                                {
+                                    continue;
+                                    //ans[i] = new List<string>();
+                                }
+                                var ac = ans[i].Count;
+                                var sc = standard[i].Count;
+                                //记录次数
+                                int n = 0;
+                                //算分处理
+                                if (sc > 0)
+                                {
+                                    result.ans[newIndex][i] = ans[i];
+                                    if (ac == sc && sc == 1)
+                                    {
+                                        foreach (string right in ans[i])
+                                        {
+                                            if (standard[i].Contains(right))
+                                            {
+                                                result.studentScores[newIndex][i] = points[i];
+                                            }
+                                            else
+                                            {
+                                                result.studentScores[newIndex][i] = 0;
+                                            }
+                                        }
+
+                                    }
+                                    else
+                                    {
+                                        if (rule > 0)
+                                        {
+                                            int falseCount = 0;
+                                            if (ac > 0)
+                                            {
+                                                foreach (string obj in ans[i])
+                                                {
+                                                    if (!standard[i].Contains(obj))
+                                                    {
+                                                        falseCount++;
+                                                    }
+                                                }
+                                                switch (rule)
+                                                {
+                                                    case 1:
+                                                        if (ac == sc)
+                                                        {
+                                                            if (falseCount == 0)
+                                                            {
+                                                                result.studentScores[newIndex][i] = points[i];
+                                                            }
+                                                            else
+                                                            {
+                                                                result.studentScores[newIndex][i] = 0;
+                                                            }
+                                                        }
+                                                        else
+                                                        {
+                                                            result.studentScores[newIndex][i] = 0;
+                                                        }
+                                                        break;
+                                                    case 2:
+                                                        if (falseCount > 0)
+                                                        {
+                                                            result.studentScores[newIndex][i] = 0;
+                                                        }
+                                                        else
+                                                        {
+                                                            if (ac == sc)
+                                                            {
+                                                                result.studentScores[newIndex][i] = points[i];
+                                                            }
+                                                            else
+                                                            {
+                                                                result.studentScores[newIndex][i] = points[i] / 2;
+                                                            }
+
+                                                        }
+                                                        break;
+                                                    case 3:
+                                                        if (falseCount > 0)
+                                                        {
+                                                            result.studentScores[newIndex][i] = 0;
+                                                        }
+                                                        else
+                                                        {
+                                                            if (ac == sc)
+                                                            {
+                                                                result.studentScores[newIndex][i] = points[i];
+                                                            }
+                                                            else
+                                                            {
+                                                                result.studentScores[newIndex][i] = System.Math.Round((double)ac / sc * points[i], 1);
+                                                            }
+
+                                                        }
+                                                        break;
+                                                    case 4:
+                                                        if (ac == sc)
+                                                        {
+                                                            result.studentScores[newIndex][i] = points[i];
+                                                        }
+                                                        else
+                                                        {
+                                                            double persent = (double)(sc - 2 * falseCount) / sc;
+                                                            if (persent <= 0)
+                                                            {
+                                                                result.studentScores[newIndex][i] = 0;
+                                                            }
+                                                            else
+                                                            {
+                                                                result.studentScores[newIndex][i] = System.Math.Round(persent * points[i], 1);
+                                                            }
+                                                        }
+                                                        break;
+                                                }
+                                            }
+                                            else
+                                            {
+                                                result.studentScores[newIndex][i] = 0;
+                                            }
+
+                                        }
+                                    }
+                                }
+                            }
+                            bool flag = true;
+                            foreach (List<double> scores in result.studentScores)
+                            {
+                                foreach (double score in scores)
+                                {
+                                    if (score == -1)
+                                    {
+                                        flag = false;
+                                        break;
+                                    }
+                                }
+                            }
+                            if (flag)
+                            {
+                                result.progress = true;
+                                info.subjects.ForEach(s =>
+                                {
+                                    if (s.id.Equals(subjectId.ToString()))
+                                    {
+                                        s.classCount += 1;
+                                    }
+                                });
+                                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(info, info.id.ToString(), new PartitionKey($"{info.code}"));
+                            }
+                            result.sum[newIndex] = result.studentScores[newIndex].Sum();
+                            await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(result, result.id, new PartitionKey($"{result.code}"));
+                            break;
+                        }
+                    }
+                }
+                yield return (code, value);
+            }
+        }
+        [ProducesDefaultResponseType]
+        [HttpGet("parse-word")]
+        [ApiToken(Auth = "203", Name = "录入试卷数据", Limit = false)]
+        public async Task<IActionResult> ParseWord([FromForm] FileDto fileDto)
         {
         {
-            json.TryGetProperty("periodId", out JsonElement _periodId);
-            var (id, school) = HttpContext.GetApiTokenInfo();
-            School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey("Base"));
-            var exmaType = new { type = new List<string> { "regular", "simulation", "normal" } };//regula ,正规考,  simulation 模拟靠考,normal 普通考
-            var exmaMode = new { type = new List<string> { "0", "1", "2" } };//0 线上评测,  1 课中评测 ,2 阅卷评测
-            var period= data.period.Find(x => x.id.Equals($"{_periodId}"));
-            if (period != null)
+            if (!FileType.GetExtention(fileDto.file.FileName).ToLower().Equals("docx"))
             {
             {
-                return Ok(new { period.subjects, period.analysis, period.grades , exmaType, exmaMode });
+                return BadRequest(new Dictionary<string, object> { { "msg", "type is not docx!" }, { "code", 404 } });
+            }
+
+            try
+            {
+                var client = _azureCosmos.GetCosmosClient();
+                var response = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(fileDto.examId, new PartitionKey($"Exam-{fileDto.code}"));
+                ExamInfo examInfo;
+                if (response.Status == 200)
+                {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    examInfo = json.ToObject<ExamInfo>();
+
+                }
+                else
+                {
+                    return Ok(new { error = 404, msg = "请先导入评测信息" });
+                }
+                foreach (PaperSimple paper in examInfo.papers)
+                {
+                    if (paper.id.Contains(fileDto.subjectId))
+                    {
+                        return Ok(new { error = 500, msg = "该试卷信息已存在" });
+                    }
+                }
+                PaperSimple simple = new();
+                var doc = _DOXC2HTMLTranslator.Translate(fileDto.file.OpenReadStream());
+                (List<HTEXLib.DOCX.Models.ItemInfo> tests, List<string> error) = _HTML2ITEMV3Translator.Translate(doc);
+                List<Task<string>> tasks = new List<Task<string>>();
+                PaperDto paperDto = new()
+                {
+                    id = Guid.NewGuid().ToString(),
+                    name = fileDto.name,
+                    code = fileDto.code,
+                    scope = "school",
+                    multipleRule = fileDto.multipleRule,
+                    gradeIds = fileDto.gradeIds,
+                    subjectId = fileDto.subjectId,
+                    periodId = fileDto.periodId
+                };
+                foreach (HTEXLib.DOCX.Models.ItemInfo item in tests)
+                {
+                    Slides slides = new();
+                    ItemDto dto = new();
+                    Scoring scoring = new();
+                    dto.id = Guid.NewGuid().ToString();
+                    dto.exercise.answer = item.answer;
+                    dto.exercise.explain = item.explain;
+                    dto.exercise.type = item.type;
+                    dto.exercise.opts = item.option.Count;
+                    dto.exercise.knowledge = item.knowledge;
+                    dto.exercise.field = item.field;
+                    dto.exercise.level = item.level;
+                    dto.exercise.subjectId = fileDto.subjectId;
+                    dto.exercise.periodId = fileDto.periodId;
+                    dto.exercise.gradeIds = fileDto.gradeIds;
+                    slides.url = dto.id + ".json";
+                    slides.type = dto.exercise.type;
+                    scoring.ans = dto.exercise.answer;
+                    scoring.score = dto.exercise.score;
+                    scoring.knowledge = dto.exercise.knowledge;
+                    scoring.field = dto.exercise.field;
+                    slides.scoring = scoring;
+                    //添加试卷信息
+                    paperDto.slides.Add(slides);
+                    if (!slides.type.Equals("compose"))
+                    {
+                        simple.point.Add(dto.exercise.score);
+                        simple.answers.Add(dto.exercise.answer);
+                        simple.knowledge.Add(dto.exercise.knowledge);
+                        simple.type.Add(dto.exercise.type);
+                        simple.field.Add((int)dto.exercise.field);
+                    }
+                    if (item.children.Count > 0)
+                    {
+                        foreach (HTEXLib.DOCX.Models.ItemInfo its in item.children)
+                        {
+                            Slides cslides = new();
+                            Scoring cscoring = new();
+                            ItemDto dtoChildren = new ItemDto();
+                            dtoChildren.id = Guid.NewGuid().ToString();
+                            dtoChildren.pid = dto.id;
+                            dtoChildren.exercise.answer = its.answer;
+                            dtoChildren.exercise.explain = its.explain;
+                            dtoChildren.exercise.type = its.type;
+                            dtoChildren.exercise.opts = its.option.Count;
+                            dtoChildren.exercise.knowledge = its.knowledge;
+                            dtoChildren.exercise.field = its.field;
+                            dtoChildren.exercise.level = its.level;
+                            dtoChildren.exercise.scope = "school";
+                            dtoChildren.exercise.score = its.score;
+                            dtoChildren.exercise.subjectId = fileDto.subjectId;
+                            dtoChildren.exercise.periodId = fileDto.periodId;
+                            dtoChildren.exercise.gradeIds = fileDto.gradeIds;
+                            dtoChildren.exercise.children.Add(dtoChildren.id);
+                            info info1 = new();
+                            info1.uid = dtoChildren.id;
+                            info1.question = its.question;
+                            info1.option = its.option;
+                            dtoChildren.item.Add(info1);
+                            dto.exercise.children.Add(dtoChildren.id);
+                            //处理子题的slides
+                            cslides.url = dtoChildren.id + ".json";
+                            cslides.type = dtoChildren.exercise.type;
+                            cscoring.ans = dtoChildren.exercise.answer;
+                            cscoring.score = dtoChildren.exercise.score;
+                            cscoring.knowledge = dtoChildren.exercise.knowledge;
+                            cscoring.field = dtoChildren.exercise.field;
+                            cslides.scoring = scoring;
+                            paperDto.slides.Add(cslides);
+                            //添加试卷信息
+                            simple.point.Add(dtoChildren.exercise.score);
+                            simple.answers.Add(dto.exercise.answer);
+                            simple.knowledge.Add(dto.exercise.knowledge);
+                            simple.type.Add(dto.exercise.type);
+                            simple.field.Add((int)dto.exercise.field);
+
+                            StringBuilder stringBuilder = new StringBuilder();
+                            stringBuilder.Append(fileDto.examId).Append("/");
+                            stringBuilder.Append("paper").Append("/");
+                            stringBuilder.Append(fileDto.subjectId).Append("/");
+                            stringBuilder.Append(dtoChildren.id + ".json");
+                            tasks.Add(_azureStorage.UploadFileByContainer(fileDto.code, dtoChildren.ToJsonString(), "exam", stringBuilder.ToString(), false));
+                        }
+                    }
+                    info @info = new();
+                    @info.uid = dto.id;
+                    @info.question = item.question;
+                    @info.option = item.option;
+                    dto.item.Add(@info);
+                    dto.exercise.scope = "school";
+                    dto.exercise.score = item.score;
+                    StringBuilder builder = new StringBuilder();
+                    builder.Append(fileDto.examId).Append('/');
+                    builder.Append("paper").Append('/');
+                    builder.Append(fileDto.subjectId).Append('/');
+                    builder.Append(dto.id + ".json");
+                    tasks.Add(_azureStorage.UploadFileByContainer(fileDto.code, dto.ToJsonString(), "exam", builder.ToString(), false));
+
+
+                }
+                StringBuilder paperBuilder = new StringBuilder();
+                paperBuilder.Append(fileDto.examId).Append('/');
+                paperBuilder.Append("paper").Append('/');
+                paperBuilder.Append(fileDto.subjectId).Append('/');
+                paperBuilder.Append("index.json");
+                tasks.Add(_azureStorage.UploadFileByContainer(fileDto.code, paperDto.ToJsonString(), "exam", paperBuilder.ToString(), false));
+
+                //开始给ExamInfo paper赋值
+                simple.id = fileDto.subjectId;
+                simple.code = "Paper-" + fileDto.code;
+                simple.name = fileDto.name;
+                simple.blob = paperBuilder.ToString().Replace("index.json", "");
+                simple.scope = "school";
+                simple.multipleRule = fileDto.multipleRule;
+
+                examInfo.papers.Add(simple);
+                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(examInfo, examInfo.id, new PartitionKey($"{examInfo.code}"));
+                await Task.WhenAll(tasks);
+
+                return Ok(new { code = 200 });
             }
             }
-            else {
-                return Ok(new { error = 1, msg = "学段不存在!" });
+            catch (Exception e)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/word()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
             }
             }
 
 
         }
         }
+
+        private class students
+        {
+            public string id { get; set; }
+            public List<List<string>> answer { get; set; }
+        }
+        public class FileDto
+        {
+            public string periodId { get; set; }
+            public string code { get; set; }
+            public string name { get; set; }
+            public int multipleRule { get; set; }
+            public string examId { get; set; }
+            public string subjectId { get; set; }
+            public List<string> gradeIds { get; set; }
+            public IFormFile file { get; set; }
+        }
+
+
     }
     }
 }
 }

+ 36 - 9
TEAMModelAPI/Controllers/School/SchoolController.cs

@@ -59,7 +59,7 @@ namespace TEAMModelAPI.Controllers
         /// <returns></returns>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpGet("get-school-info")]
         [HttpGet("get-school-info")]
-        [ApiToken(Auth = "2",Name = "学校基础信息", RW = "R", Limit =false)]
+        [ApiToken(Auth = "101",Name = "学校基础信息", RW = "R", Limit =false)]
         public async Task<IActionResult> GetSchoolInfo()
         public async Task<IActionResult> GetSchoolInfo()
         {
         {
             var (id, school) = HttpContext.GetApiTokenInfo();
             var (id, school) = HttpContext.GetApiTokenInfo();
@@ -81,7 +81,7 @@ namespace TEAMModelAPI.Controllers
         /// <returns></returns>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpGet("get-teacher-list")]
         [HttpGet("get-teacher-list")]
-        [ApiToken(Auth = "3", Name = "学校教师列表", RW = "R", Limit = false)]
+        [ApiToken(Auth = "102", Name = "学校教师列表", RW = "R", Limit = false)]
         public async Task<IActionResult> GetTeacherList()
         public async Task<IActionResult> GetTeacherList()
         {
         {
             var (id, school) = HttpContext.GetApiTokenInfo();
             var (id, school) = HttpContext.GetApiTokenInfo();
@@ -102,7 +102,7 @@ namespace TEAMModelAPI.Controllers
         /// <returns></returns>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("get-teacher-info")]
         [HttpPost("get-teacher-info")]
-        [ApiToken(Auth = "4", Name = "学校教师信息", RW = "R", Limit = false)]
+        [ApiToken(Auth = "103", Name = "学校教师信息", RW = "R", Limit = false)]
         public async Task<IActionResult> GetTeacherInfo(JsonElement json )
         public async Task<IActionResult> GetTeacherInfo(JsonElement json )
         {
         {
             json.TryGetProperty("tmdid", out JsonElement _tmdid);
             json.TryGetProperty("tmdid", out JsonElement _tmdid);
@@ -148,7 +148,7 @@ namespace TEAMModelAPI.Controllers
         /// <returns></returns>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("get-group-list")]
         [HttpPost("get-group-list")]
-        [ApiToken(Auth = "5", Name = "学校教师列表", RW = "R", Limit = false)]
+        [ApiToken(Auth = "104", Name = "学校教师列表", RW = "R", Limit = false)]
         public async Task<IActionResult> GetGroupList(JsonElement json)
         public async Task<IActionResult> GetGroupList(JsonElement json)
         {
         {
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
@@ -245,7 +245,7 @@ namespace TEAMModelAPI.Controllers
 
 
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("get-group-members")]
         [HttpPost("get-group-members")]
-        [ApiToken(Auth = "6", Name = "获取名单详细信息和成员信息", RW = "R", Limit = false)]
+        [ApiToken(Auth = "105", Name = "获取名单详细信息和成员信息", RW = "R", Limit = false)]
         public async Task<IActionResult> GetGroupMembers(JsonElement json)
         public async Task<IActionResult> GetGroupMembers(JsonElement json)
         {
         {
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
@@ -258,7 +258,7 @@ namespace TEAMModelAPI.Controllers
        
        
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("get-course-list")]
         [HttpPost("get-course-list")]
-        [ApiToken(Auth = "7", Name = "获取课程列表信息",RW ="R", Limit = false)]
+        [ApiToken(Auth = "106", Name = "获取课程列表信息",RW ="R", Limit = false)]
         public async Task<IActionResult> GetCourseList(JsonElement json) {
         public async Task<IActionResult> GetCourseList(JsonElement json) {
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
             var (id, school) = HttpContext.GetApiTokenInfo();
             var (id, school) = HttpContext.GetApiTokenInfo();
@@ -283,7 +283,7 @@ namespace TEAMModelAPI.Controllers
        
        
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("get-course-info")]
         [HttpPost("get-course-info")]
-        [ApiToken(Auth = "8", Name = "课程详细信息", RW = "R", Limit = false)]
+        [ApiToken(Auth = "107", Name = "课程详细信息", RW = "R", Limit = false)]
         public async Task<IActionResult> GetCourseInfo(JsonElement json)
         public async Task<IActionResult> GetCourseInfo(JsonElement json)
         {
         {
             var (id, school) = HttpContext.GetApiTokenInfo();
             var (id, school) = HttpContext.GetApiTokenInfo();
@@ -307,7 +307,7 @@ namespace TEAMModelAPI.Controllers
         /// <returns></returns>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("get-room-list")]
         [HttpPost("get-room-list")]
-        [ApiToken(Auth = "9", Name = "获取物理教室列表", RW = "R", Limit = false)]
+        [ApiToken(Auth = "108", Name = "获取物理教室列表", RW = "R", Limit = false)]
         public async Task<IActionResult> GetRoomList(JsonElement json)
         public async Task<IActionResult> GetRoomList(JsonElement json)
         {
         {
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
@@ -334,7 +334,7 @@ namespace TEAMModelAPI.Controllers
         /// <returns></returns>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
         [HttpPost("get-room-info")]
         [HttpPost("get-room-info")]
-        [ApiToken(Auth = "10", Name = "获取物理教室详细信息", RW = "R", Limit = false)]
+        [ApiToken(Auth = "109", Name = "获取物理教室详细信息", RW = "R", Limit = false)]
         public async Task<IActionResult> GetRoomInfo(JsonElement json)
         public async Task<IActionResult> GetRoomInfo(JsonElement json)
         {
         {
             var (id, school) = HttpContext.GetApiTokenInfo();
             var (id, school) = HttpContext.GetApiTokenInfo();
@@ -352,5 +352,32 @@ namespace TEAMModelAPI.Controllers
                 return Ok(new { error = 1, msg = "教室不存在!" });
                 return Ok(new { error = 1, msg = "教室不存在!" });
             }
             }
         }
         }
+
+        /// <summary>
+        ///  获取试卷和评测的条件信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("get-paper-exam-condition")]
+        [ApiToken(Auth = "110", Name = "试卷和评测的条件信息", RW = "R", Limit = false)]
+        public async Task<IActionResult> GetPaperExamCondition(JsonElement json)
+        {
+            json.TryGetProperty("periodId", out JsonElement _periodId);
+            var (id, school) = HttpContext.GetApiTokenInfo();
+            School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey("Base"));
+            var exmaType = new { type = new List<string> { "regular", "simulation", "normal" } };//regula ,正规考,  simulation 模拟靠考,normal 普通考
+            var exmaMode = new { type = new List<string> { "0", "1", "2" } };//0 线上评测,  1 课中评测 ,2 阅卷评测
+            var period = data.period.Find(x => x.id.Equals($"{_periodId}"));
+            if (period != null)
+            {
+                return Ok(new { period.subjects, period.analysis, period.grades, exmaType, exmaMode });
+            }
+            else
+            {
+                return Ok(new { error = 1, msg = "学段不存在!" });
+            }
+
+        }
     }
     }
 }
 }

+ 2 - 150
TEAMModelBI/Controllers/BIHome/HomeStatisController.cs

@@ -59,71 +59,6 @@ namespace TEAMModelBI.Controllers.BIHome
                 long schoolSize = await CommonFind.FindTotals(client, "select sum(c.size) as totals from c where c.code='Base'", new List<string>() { "School" });
                 long schoolSize = await CommonFind.FindTotals(client, "select sum(c.size) as totals from c where c.code='Base'", new List<string>() { "School" });
 
 
                 return Ok(new { state = 200, teacherCount, studentCount,  schoolCount, schoolSize });
                 return Ok(new { state = 200, teacherCount, studentCount,  schoolCount, schoolSize });
-
-                ////依据学校查询教师人数
-                //List<string> teacherCount_list = new();
-                ////依据学校查询学生信息
-                //List<string> studentCount_List = new();
-                ////学校数
-                //List<string> schoolCount_List = new();
-                ////学校空间大小
-                //long schoolsize = 0
-                ////查询全部教师人数
-                //await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
-                //{
-                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                //    {
-                //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                //        while (accounts.MoveNext())
-                //        {
-                //            JsonElement account = accounts.Current;
-                //            teacherCount_list.Add(account.GetProperty("id").GetString());
-                //        }
-                //    }
-                //}
-
-                ////查询全部学生人数
-                //await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.pk='Base'"))
-                //{
-                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                //    {
-                //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                //        while (accounts.MoveNext())
-                //        {
-                //            JsonElement account = accounts.Current;
-                //            studentCount_List.Add(account.GetProperty("id").GetString());
-                //        }
-                //    }
-                //}
-
-                ////查询已创建多少学校
-                //await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id,c.size from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
-                //{
-                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                //    {
-                //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                //        while (accounts.MoveNext())
-                //        {
-                //            JsonElement account = accounts.Current;
-                //            schoolCount_List.Add(account.GetProperty("id").GetString());
-                //            schoolsize += account.GetProperty("size").GetInt64();
-                //        }
-                //    }
-                //}
-
-                ////查询教师的大小和教师集合信息
-                //await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"select sum(c.size) as size from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
-                //{
-                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                //    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                //    {
-                //        schoolsize += obj.GetProperty("size").GetInt64();
-                //    }
-                //}
-                //return Ok(new { state = 200, teacherCount = teacherCount_list.Count, studentCount = studentCount_List.Count, schoolCount = schoolCount_List.Count, schoolSize = schoolsize });
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -581,6 +516,8 @@ namespace TEAMModelBI.Controllers.BIHome
                         {
                         {
                             //查询学校教师人数
                             //查询学校教师人数
                             string sqlT = $"select count(c.id) as totals from c join a1 in c.schools where a1.schoolId='{itemSchool}'";
                             string sqlT = $"select count(c.id) as totals from c join a1 in c.schools where a1.schoolId='{itemSchool}'";
+                            //string sqlT = $"select count(c.id) as totals from c  where c.code='Teacher-{itemSchool}' and contains(c.roles,'teacher')";
+
                             districtStics.teacherCount += await CommonFind.FindTotals(cosmosClient, sqlT, "Teacher", "Base");
                             districtStics.teacherCount += await CommonFind.FindTotals(cosmosClient, sqlT, "Teacher", "Base");
 
 
                             //查询学校学生人数
                             //查询学校学生人数
@@ -638,22 +575,6 @@ namespace TEAMModelBI.Controllers.BIHome
                         List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.standard='{itemStandrd.standard}'", "Base");
                         List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.standard='{itemStandrd.standard}'", "Base");
                         tempCode.schoolCount += schoolIds.Count;
                         tempCode.schoolCount += schoolIds.Count;
 
 
-                        //List<string> schoolIds = new List<string>();
-                        //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.standard='{itemStandrd.standard}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
-                        //{
-                        //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                        //    {
-                        //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                        //        while (accounts.MoveNext())
-                        //        {
-                        //            JsonElement account = accounts.Current;
-                        //            schoolIds.Add(account.GetProperty("id").GetString());
-                        //            tempCode.schoolCount += 1;
-                        //        }
-                        //    }
-                        //}
-
                         var tempModel = sticsCitys.Where(x => x.cityCode == tempCode.cityCode).FirstOrDefault();
                         var tempModel = sticsCitys.Where(x => x.cityCode == tempCode.cityCode).FirstOrDefault();
                         if (tempModel != null)
                         if (tempModel != null)
                         {
                         {
@@ -672,36 +593,9 @@ namespace TEAMModelBI.Controllers.BIHome
                                 //查询学校教师人数
                                 //查询学校教师人数
                                 districtStics.teacherCount += await CommonFind.FindTotals(cosmosClient, $"select count(c.id) totals from c join a1 in c.schools where a1.schoolId='{itemSchool}'", "Teacher", "Base");
                                 districtStics.teacherCount += await CommonFind.FindTotals(cosmosClient, $"select count(c.id) totals from c join a1 in c.schools where a1.schoolId='{itemSchool}'", "Teacher", "Base");
 
 
-                                //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c join a1 in c.schools where a1.schoolId='{itemSchool}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
-                                //{
-                                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                //    {
-                                //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                                //        while (accounts.MoveNext())
-                                //        {
-                                //            JsonElement account = accounts.Current;
-                                //            districtStics.teacherCount += 1;
-                                //        }
-                                //    }
-                                //}
-
                                 //查询学校学生人数
                                 //查询学校学生人数
                                 districtStics.studentCount += await CommonFind.FindTotals(cosmosClient, "select count(c.id) totals from c", "Student", $"Base-{itemSchool}");
                                 districtStics.studentCount += await CommonFind.FindTotals(cosmosClient, "select count(c.id) totals from c", "Student", $"Base-{itemSchool}");
 
 
-                                //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{itemSchool}") }))
-                                //{
-                                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                //    {
-                                //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                                //        while (accounts.MoveNext())
-                                //        {
-                                //            JsonElement account = accounts.Current;
-                                //            districtStics.studentCount += 1;
-                                //        }
-                                //    }
-                                //}
                             }
                             }
                         }
                         }
 
 
@@ -719,22 +613,6 @@ namespace TEAMModelBI.Controllers.BIHome
                         List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.standard='{itemStandrd.standard}'","Base");
                         List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.standard='{itemStandrd.standard}'","Base");
                         citySchool.schoolCount += schoolIds.Count;
                         citySchool.schoolCount += schoolIds.Count;
 
 
-                        //List<string> schoolIds = new List<string>();
-                        //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.standard='{itemStandrd.standard}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
-                        //{
-                        //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                        //    {
-                        //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                        //        while (accounts.MoveNext())
-                        //        {
-                        //            JsonElement account = accounts.Current;
-                        //            schoolIds.Add(account.GetProperty("id").GetString());
-                        //            citySchool.schoolCount += 1;
-                        //        }
-                        //    }
-                        //}
-
                         List<DistrictStics> tempDistrictStics = new List<DistrictStics>();
                         List<DistrictStics> tempDistrictStics = new List<DistrictStics>();
                         if (schoolIds.Count > 0)
                         if (schoolIds.Count > 0)
                         {
                         {
@@ -747,36 +625,10 @@ namespace TEAMModelBI.Controllers.BIHome
                                 //查询学校教师人数
                                 //查询学校教师人数
                                 districtStics.teacherCount += await CommonFind.FindTotals(cosmosClient, $"select count(c.id) as totals from c join a1 in c.schools where a1.schoolId='{itemSchool}'", "Teacher", "Base");
                                 districtStics.teacherCount += await CommonFind.FindTotals(cosmosClient, $"select count(c.id) as totals from c join a1 in c.schools where a1.schoolId='{itemSchool}'", "Teacher", "Base");
 
 
-                                //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c join a1 in c.schools where a1.schoolId='{itemSchool}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
-                                //{
-                                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                //    {
-                                //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                                //        while (accounts.MoveNext())
-                                //        {
-                                //            JsonElement account = accounts.Current;
-                                //            districtStics.teacherCount += 1;
-                                //        }
-                                //    }
-                                //}
 
 
                                 //查询学校学生人数
                                 //查询学校学生人数
                                 districtStics.studentCount += await CommonFind.FindTotals(cosmosClient, $"select count(c.id) as totals from c", "Student","Base");
                                 districtStics.studentCount += await CommonFind.FindTotals(cosmosClient, $"select count(c.id) as totals from c", "Student","Base");
 
 
-                                //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{itemSchool}") }))
-                                //{
-                                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                //    {
-                                //        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                                //        while (accounts.MoveNext())
-                                //        {
-                                //            JsonElement account = accounts.Current;
-                                //            districtStics.studentCount += 1;
-                                //        }
-                                //    }
-                                //}
                             }
                             }
                             tempDistrictStics.Add(districtStics);
                             tempDistrictStics.Add(districtStics);
                         }
                         }

+ 89 - 52
TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs

@@ -24,6 +24,8 @@ using System.Net.Http.Json;
 using System.Net;
 using System.Net;
 using TEAMModelBI.Filter;
 using TEAMModelBI.Filter;
 using TEAMModelBI.Tool.Extension;
 using TEAMModelBI.Tool.Extension;
+using TEAMModelBI.Tool;
+using TEAMModelBI.Models;
 
 
 namespace TEAMModelBI.Controllers.BISchool
 namespace TEAMModelBI.Controllers.BISchool
 {
 {
@@ -389,7 +391,8 @@ namespace TEAMModelBI.Controllers.BISchool
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 List<School> schools = new List<School>();
                 List<School> schools = new List<School>();
                 List<SchoolAssist> schoolAssists = new List<SchoolAssist>();
                 List<SchoolAssist> schoolAssists = new List<SchoolAssist>();
-                StringBuilder stringBuilder = new StringBuilder("select value(c) from c");
+                //StringBuilder stringBuilder = new StringBuilder("select value(c) from c");
+                StringBuilder stringBuilder = new StringBuilder("select c.id,c.code,c.schoolCode,c.name,c.region,c.province,c.city,c.dist,c.size,c.address,c.picture,c.type,c.scale,c.areaId,c.standard from c");
 
 
                 if (!string.IsNullOrEmpty($"{_schoolCode}"))
                 if (!string.IsNullOrEmpty($"{_schoolCode}"))
                 {
                 {
@@ -421,44 +424,75 @@ namespace TEAMModelBI.Controllers.BISchool
                     if (response.Status == 200)
                     if (response.Status == 200)
                     {
                     {
                         using var json = await JsonDocument.ParseAsync(response.ContentStream);
                         using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                        json.RootElement.TryGetProperty("serial", out JsonElement _serial);
-                        json.RootElement.TryGetProperty("service", out JsonElement _service);
-                        json.RootElement.TryGetProperty("hard", out JsonElement _hard);
-                        schoolAssist.serial = _serial.GetArrayLength();
-                        schoolAssist.service = _service.GetArrayLength();
-                        schoolAssist.hard = _hard.GetArrayLength();
-
-                        //using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                        //SchoolProductSum productSum = json.ToObject<SchoolProductSum>();
-                        //SchoolProductSum productSum = JsonDocument.Parse(response.ContentStream).RootElement.ToObject<SchoolProductSum>();
-                        //schoolAssist.serial = productSum.serial.Count;
-                        //schoolAssist.service = productSum.service.Count;
-                        //schoolAssist.hard = productSum.hard.Count;
+                        schoolAssist.serial = json.RootElement.GetProperty("serial").GetArrayLength();
+                        schoolAssist.service = json.RootElement.GetProperty("service").GetArrayLength();
+                        schoolAssist.hard = json.RootElement.GetProperty("hard").GetArrayLength();
+
+                        //json.RootElement.TryGetProperty("serial", out JsonElement _serial);
+                        //json.RootElement.TryGetProperty("service", out JsonElement _service);
+                        //json.RootElement.TryGetProperty("hard", out JsonElement _hard);
+                        //schoolAssist.serial = _serial.GetArrayLength();
+                        //schoolAssist.service = _service.GetArrayLength();
+                        //schoolAssist.hard = _hard.GetArrayLength();
                     }
                     }
 
 
-                    List<Assist> assists = new List<Assist>();
-                    //查询学校的顾问
-                    string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'assist', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{itemSchool.id}'";
-                    var cosmosClent = _azureCosmos.GetCosmosClient();
-                    await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                        {
-                            Assist assist = new Assist
-                            {
-                                tmdId = obj.GetProperty("id").GetString(),
-                                tmdName = obj.GetProperty("name").GetString()
-                            };
+                    schoolAssist.assists = await CommonFind.FindSchoolRoles(cosmosClient, itemSchool.id, "assist");
 
 
-                            assists.Add(assist);
-                        }
-                    }
-                    schoolAssist.assists = assists;
                     schoolAssists.Add(schoolAssist);
                     schoolAssists.Add(schoolAssist);
                 }
                 }
-
                 return Ok(new { state = 200, schoolAssists });
                 return Ok(new { state = 200, schoolAssists });
+
+                //await foreach (var itemSchool in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: stringBuilder.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+                //{
+                //    using var jsonSchool = await JsonDocument.ParseAsync(itemSchool.ContentStream);
+                //    foreach (var objSchool in jsonSchool.RootElement.GetProperty("Documents").EnumerateArray())
+                //    {
+                //        var schoolId = objSchool.GetProperty("id").GetString();
+                //        SchoolAssist schoolAssist = new SchoolAssist
+                //        {
+                //            id = schoolId,
+                //            code = objSchool.GetProperty("code").GetString(),
+                //            schoolCode = objSchool.GetProperty("schoolCode").GetString(),
+                //            name = objSchool.GetProperty("name").GetString(),
+                //            region = objSchool.GetProperty("region").GetString(),
+                //            province = objSchool.GetProperty("province").GetString(),
+                //            city = objSchool.GetProperty("city").GetString(),
+                //            dist = objSchool.GetProperty("dist").GetString(),
+                //            size = objSchool.GetProperty("size").GetInt32(),
+                //            address = objSchool.GetProperty("address").GetString(),
+                //            picture = objSchool.GetProperty("picture").GetString(),
+                //            type = objSchool.GetProperty("type").GetInt32(),
+                //            //scale = objSchool.GetProperty("scale").GetInt32(),
+                //            areaId = objSchool.GetProperty("areaId").GetString(),
+                //            standard = objSchool.GetProperty("standard").GetString(),
+                //        };
+
+                //        try { schoolAssist.scale = objSchool.GetProperty("scale").GetInt32(); }
+                //        catch { schoolAssist.scale = 0; }
+
+                //        var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("ProductSum"));
+                //        if (response.Status == 200)
+                //        {
+                //            using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                //            schoolAssist.serial = json.RootElement.GetProperty("serial").GetArrayLength();
+                //            schoolAssist.service = json.RootElement.GetProperty("service").GetArrayLength();
+                //            schoolAssist.hard = json.RootElement.GetProperty("hard").GetArrayLength();
+
+                //            //json.RootElement.TryGetProperty("serial", out JsonElement _serial);
+                //            //json.RootElement.TryGetProperty("service", out JsonElement _service);
+                //            //json.RootElement.TryGetProperty("hard", out JsonElement _hard);
+                //            //schoolAssist.serial = _serial.GetArrayLength();
+                //            //schoolAssist.service = _service.GetArrayLength();
+                //            //schoolAssist.hard = _hard.GetArrayLength();
+                //        }
+
+                //        schoolAssist.assists = await CommonFind.FindSchoolRoles(cosmosClient, schoolId, "assist");
+
+                //        schoolAssists.Add(schoolAssist);
+                //    }
+                //}
+                //return Ok(new { state = 200, schoolAssists });
+
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -822,25 +856,28 @@ namespace TEAMModelBI.Controllers.BISchool
                     standard = itemSchool.standard
                     standard = itemSchool.standard
                 };
                 };
 
 
-                List<Assist> assists = new List<Assist>();
-                //查询学校的顾问
-                string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'assist', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{itemSchool.id}'";
-                var cosmosClent = _azureCosmos.GetCosmosClient();
-                await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        Assist assist = new Assist
-                        {
-                            tmdId = obj.GetProperty("id").GetString(),
-                            tmdName = obj.GetProperty("name").GetString()
-                        };
+                schoolAssist.assists = await CommonFind.FindSchoolRoles(cosmosClient, itemSchool.id, "assist");
+
+                //List<Assist> assists = new List<Assist>();
+                ////查询学校的顾问
+                //string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'assist', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{itemSchool.id}'";
+                //var cosmosClent = _azureCosmos.GetCosmosClient();
+                //await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
+                //{
+                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                //    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                //    {
+                //        Assist assist = new Assist
+                //        {
+                //            tmdId = obj.GetProperty("id").GetString(),
+                //            tmdName = obj.GetProperty("name").GetString()
+                //        };
+
+                //        assists.Add(assist);
+                //    }
+                //}
+                //schoolAssist.assists = assists;
 
 
-                        assists.Add(assist);
-                    }
-                }
-                schoolAssist.assists = assists;
                 schoolAssists.Add(schoolAssist);
                 schoolAssists.Add(schoolAssist);
             }
             }
 
 
@@ -973,7 +1010,7 @@ namespace TEAMModelBI.Controllers.BISchool
             public int scale { get; set; }
             public int scale { get; set; }
             public string standard { get; set; }
             public string standard { get; set; }
             public string areaId { get; set; }
             public string areaId { get; set; }
-            public List<Assist> assists { get; set; }
+            public List<SchoolTeacherRoles> assists { get; set; }
             public int serial { get; set; } //软体
             public int serial { get; set; } //软体
             public int service { get; set; } //服务
             public int service { get; set; } //服务
             public int hard { get; set; } //硬体
             public int hard { get; set; } //硬体

+ 5 - 0
TEAMModelBI/Controllers/BISchool/RoomController.cs

@@ -36,6 +36,11 @@ namespace TEAMModelBI.Controllers.BISchool
             _configuration= configuration;
             _configuration= configuration;
         }
         }
 
 
+        /// <summary>
+        /// 产品序号和教室进行绑定 
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
         [HttpPost("set-bind")]
         [HttpPost("set-bind")]
         public async Task<IActionResult> SetBindProduct(JsonElement jsonElement) 
         public async Task<IActionResult> SetBindProduct(JsonElement jsonElement) 
         {
         {

+ 123 - 10
TEAMModelBI/Controllers/BISchool/SchoolController.cs

@@ -150,18 +150,21 @@ namespace TEAMModelBI.Controllers.BISchool
             try
             try
             {
             {
                 if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
                 if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
-                List<string> schoolIds = new List<string>();
+              
                 List<object> schools = new List<object>();
                 List<object> schools = new List<object>();
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 var cosmosClient = _azureCosmos.GetCosmosClient();
-                string sqlTxt = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId FROM c WHERE c.pk = 'Teacher' AND c.status = 'join' AND ARRAY_CONTAINS(c.roles, 'assist', true) AND c.id='{tmdId}' ";
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                    }
-                }
+                //List<string> schoolIds = new List<string>();
+                //string sqlTxt = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId FROM c WHERE c.pk = 'Teacher' AND c.status = 'join' AND ARRAY_CONTAINS(c.roles, 'assist', true) AND c.id='{tmdId}' ";
+                //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
+                //{
+                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                //    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                //    {
+                //        schoolIds.Add(obj.GetProperty("schoolId").GetString());
+                //    }
+                //}
+
+                List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
 
                 foreach (var item in schoolIds)
                 foreach (var item in schoolIds)
                 {
                 {
@@ -465,6 +468,116 @@ namespace TEAMModelBI.Controllers.BISchool
             else { return Ok(new { status = 201, msg = $"{_tmdName}【{_tmdId}】账号不是顾问" }); }
             else { return Ok(new { status = 201, msg = $"{_tmdName}【{_tmdId}】账号不是顾问" }); }
         }
         }
 
 
+        /// <summary>
+        /// 依据学校ID查学校管理员信息
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-schoolmanage")]
+        public async Task<IActionResult> GetSchoolManage(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("schoolCode", out JsonElement schoolCode)) return BadRequest();
+            if (!jsonElement.TryGetProperty("isAdmin", out JsonElement isAdmin)) return BadRequest();
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            List<SchoolTeacher> schoolTeachers = new List<SchoolTeacher>();
+            //string sqlTxt = "select value(c) from c where array_contains(c.roles,'admin')";
+            string sqlTxt = "select value(c) from c";
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{schoolCode}") }))
+            {
+                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt16() > 0)
+                {
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    {
+                        SchoolTeacher schoolTeacher = obj.ToObject<SchoolTeacher>();
+                        //schoolTeachers.Add(schoolTeacher);
+                        if (bool.Parse($"{isAdmin}") == true)
+                        {
+                            if (schoolTeacher.roles.Contains("admin"))
+                            {
+                                schoolTeachers.Add(schoolTeacher);
+                            }
+                        }
+                        else
+                        {
+                            if (!schoolTeacher.roles.Contains("admin"))
+                            {
+                                schoolTeachers.Add(schoolTeacher);
+                            }
+                        }
+                    }
+                }
+            }
+
+            return Ok(new { state = 200, schoolTeachers });
+        }
+
+
+        /// <summary>
+        /// 设置学校管理员
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("set-schoolme")]
+        public async Task<IActionResult> SetSchoolManage(JsonElement jsonElement)
+        {
+            try
+            {
+                var (_tmdId, _tmdName, _, _, _, _) = HttpJwtAnalysis.JwtXAuthBI(HttpContext.GetXAuth("AuthToken"), _option);
+
+                if (!jsonElement.TryGetProperty("manageId", out JsonElement _adminTmdId)) return BadRequest();
+                if (!jsonElement.TryGetProperty("manageName", out JsonElement _adminTmdName)) return BadRequest();
+                if (!jsonElement.TryGetProperty("schoolId", out JsonElement _schoolId)) return BadRequest();
+                var cosmosClient = _azureCosmos.GetCosmosClient();
+
+                var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync($"{_adminTmdId}", new PartitionKey($"Teacher-{_schoolId}"));
+                if (response.Status == 200)
+                {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    SchoolTeacher schoolTeacher = json.ToObject<SchoolTeacher>();
+                    if (!schoolTeacher.roles.Contains("admin"))
+                    {
+                        schoolTeacher.roles.Add("admin");
+                        SchoolTeacher st = await cosmosClient.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<SchoolTeacher>(schoolTeacher, schoolTeacher.id, new PartitionKey(schoolTeacher.code));
+
+                        //保存操作记录
+                        await _azureStorage.SaveLog("area-add", $"{_tmdName}【{_tmdId}】顾问把{_adminTmdName}【{_adminTmdId}】设置学校id为{_schoolId}管理员。", _dingDing, httpContext: HttpContext);
+                        return Ok(new { state = 200, schoolTeacher = st });
+                    }
+                    else
+                        return Ok(new { state = 201, schoolTeacher = "已经是管理人员" });
+                }
+                else
+                {
+                    SchoolTeacher schoolTeacher = new SchoolTeacher
+                    {
+                        id = $"{_adminTmdId}",
+                        code = $"Teacher-{_schoolId}",
+                        roles = new List<string> { "admin" },
+                        job = "管理员",
+                        name = $"{_adminTmdName}",
+                        picture = "",
+                        status = "join",
+                        createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
+                        pk = "Teacher",
+                        ttl = -1
+                    };
+
+                    schoolTeacher = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(schoolTeacher, new PartitionKey(schoolTeacher.code));
+                    //保存操作记录
+                    await _azureStorage.SaveLog("area-add", $"{_tmdName}【{_tmdId}】顾问把{_adminTmdName}【{_adminTmdId}】设置学校id为{_schoolId}管理员。", _dingDing, httpContext: HttpContext);
+                    return Ok(new { status = 200, schoolTeacher });
+                }
+            }
+            catch (Exception ex)
+            {
+
+                await _dingDing.SendBotMsg($"BI,{_option.Location}  /batchschool/set-schoolme \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
+                return BadRequest();
+            }
+            
+        }
+
         /// <summary>
         /// <summary>
         /// 通过学校Id查询详情   数据管理工具——查询工具
         /// 通过学校Id查询详情   数据管理工具——查询工具
         /// </summary>
         /// </summary>

+ 0 - 62
TEAMModelBI/Controllers/BITeacher/TeacherBIController.cs

@@ -1,62 +0,0 @@
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Options;
-using Azure.Cosmos;
-using System.Text.Json;
-using System.Threading.Tasks;
-using System.Collections.Generic;
-using TEAMModelOS.Models;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Extension;
-
-namespace TEAMModelBI.Controllers.BITeacher
-{
-    [Route("teacherbi")]
-    [ApiController]
-    public class TeacherBIController : ControllerBase
-    {
-        private readonly AzureCosmosFactory _azureCosmos;
-        private readonly AzureStorageFactory _azureStorage;
-        private readonly DingDing _dingDing;
-        private readonly Option _option;
-
-        public TeacherBIController(AzureCosmosFactory azureCosmos,AzureStorageFactory azureStorage,DingDing dingDing, IOptionsSnapshot<Option> option) 
-        {
-            _azureCosmos = azureCosmos;
-            _azureStorage = azureStorage;
-            _dingDing = dingDing;
-            _option = option?.Value;
-        }
-
-        /// <summary>
-        /// 通过教师Id查询详情  数据管理工具——查询工具
-        /// </summary>
-        /// <param name="jsonElement"></param>
-        /// <returns></returns>
-        [HttpPost("get-info")]
-        public async Task<IActionResult> GetInfo(JsonElement jsonElement) 
-        {
-            if (!jsonElement.TryGetProperty("teacherId", out JsonElement teacherId)) return BadRequest();
-            jsonElement.TryGetProperty("code", out JsonElement code);
-            var cosmosClient = _azureCosmos.GetCosmosClient();
-
-            List<object> objs = new List<object>();
-
-            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.id='{teacherId}'", requestOptions: string.IsNullOrEmpty($"{code}") ? new QueryRequestOptions() { } : new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
-            {
-                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()) 
-                    {
-                        objs.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { state = 200, teachers = objs });
-        }
-
-
-    }
-}

+ 114 - 0
TEAMModelBI/Controllers/BITeacher/TeacherController.cs

@@ -0,0 +1,114 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using Azure.Cosmos;
+using System.Text.Json;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+using TEAMModelOS.Models;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Models;
+
+namespace TEAMModelBI.Controllers.BITeacher
+{
+    [Route("teacher")]
+    [ApiController]
+    public class TeacherController : ControllerBase
+    {
+        private readonly AzureCosmosFactory _azureCosmos;
+        private readonly AzureStorageFactory _azureStorage;
+        private readonly DingDing _dingDing;
+        private readonly Option _option;
+
+        public TeacherController(AzureCosmosFactory azureCosmos,AzureStorageFactory azureStorage,DingDing dingDing, IOptionsSnapshot<Option> option) 
+        {
+            _azureCosmos = azureCosmos;
+            _azureStorage = azureStorage;
+            _dingDing = dingDing;
+            _option = option?.Value;
+        }
+
+        /// <summary>
+        /// 查询学校教师列表
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-teachers")]
+        public async Task<IActionResult> GetTeachers(JsonElement jsonElement) 
+        {
+            jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
+            jsonElement.TryGetProperty("schoolCode", out JsonElement schoolCode);
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            List<SchoolTeacher> teachers = new List<SchoolTeacher>();
+            string sqlTxt = "";
+            if (!string.IsNullOrEmpty($"{tmdId}")) 
+            {
+                sqlTxt = $"select c.id,c.name,c.code,c.picture from c where c.id='{tmdId}'";
+            }
+            if (!string.IsNullOrEmpty($"{schoolCode}")) 
+            {
+                sqlTxt = $"select c.id,c.name,c.code,c.picture from c join a1 in c.schools where a1.schoolId='{schoolCode}'";
+            }
+
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions:new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+            {
+                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt16() > 0) 
+                {
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    {
+                        SchoolTeacher schoolTeacher = new();
+                        schoolTeacher.id = obj.GetProperty("id").GetString();
+                        schoolTeacher.code = obj.GetProperty("code").GetString();
+                        schoolTeacher.name = obj.GetProperty("name").GetString();
+                        schoolTeacher.picture = obj.GetProperty("picture").GetString();
+                        teachers.Add(schoolTeacher);
+                    }
+                }
+            }
+
+            return Ok(new { state = 200, teachers });
+        }
+
+        /// <summary>
+        /// 通过教师Id查询详情  数据管理工具——查询工具
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-info")]
+        public async Task<IActionResult> GetInfo(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("teacherId", out JsonElement teacherId)) return BadRequest();
+            jsonElement.TryGetProperty("code", out JsonElement code);
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+
+            List<object> objs = new List<object>();
+
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.id='{teacherId}'", requestOptions: string.IsNullOrEmpty($"{code}") ? new QueryRequestOptions() { } : new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
+            {
+                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()) 
+                    {
+                        objs.Add(obj.ToObject<object>());
+                    }
+                }
+            }
+
+            return Ok(new { state = 200, teachers = objs });
+        }
+
+        public record SchoolTeacher 
+        {
+            public string id { get; set; }
+
+            public string code { get; set; }
+
+            public string picture { get; set; }
+
+            public string name { get; set; }
+        }
+    }
+}

+ 6 - 0
TEAMModelBI/Models/MonthStartEnd.cs

@@ -9,4 +9,10 @@
         public long end { get; set; }
         public long end { get; set; }
 
 
     }
     }
+
+    public class SchoolTeacherRoles
+    {
+        public string tmdId { get; set; }
+        public string tmdName { get; set; }
+    }
 }
 }

+ 30 - 1
TEAMModelBI/Tool/CommonFind.cs

@@ -3,6 +3,7 @@ using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Text.Json;
 using System.Text.Json;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using TEAMModelBI.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 
 
 namespace TEAMModelBI.Tool
 namespace TEAMModelBI.Tool
@@ -61,10 +62,38 @@ namespace TEAMModelBI.Tool
                 }
                 }
             }
             }
 
 
-
             return totals;
             return totals;
         }
         }
 
 
+        /// <summary>
+        /// 查询学校教师角色列表
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="schoolId">学校Id</param>
+        /// <param name="roles">查询的角色</param>
+        /// <returns>返回学校角色列表</returns>
+        public static async Task<List<SchoolTeacherRoles>> FindSchoolRoles(CosmosClient cosmosClient,string schoolId,string roles)
+        {
+            List<SchoolTeacherRoles> strs = new List<SchoolTeacherRoles>();
+            string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, '{roles}', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{schoolId}'";
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
+            {
+                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                {
+                    SchoolTeacherRoles str = new SchoolTeacherRoles
+                    {
+                        tmdId = obj.GetProperty("id").GetString(),
+                        tmdName = obj.GetProperty("name").GetString()
+                    };
+
+                    strs.Add(str);
+                }
+            }
+
+            return strs;
+        }
+
         /// <summary>
         /// <summary>
         /// 通过醍摩豆账户查询关联学校ID
         /// 通过醍摩豆账户查询关联学校ID
         /// </summary>
         /// </summary>

+ 1 - 1
TEAMModelOS.SDK/DI/AzureStorage/AzureStorageTableExtensions.cs

@@ -454,7 +454,7 @@ namespace TEAMModelOS.SDK.DI
         private static async Task<List<T>> QueryList<T>(TableQuery<T> exQuery, CloudTable TableName  ) where T : TableEntity, new()
         private static async Task<List<T>> QueryList<T>(TableQuery<T> exQuery, CloudTable TableName  ) where T : TableEntity, new()
         {
         {
             TableContinuationToken continuationToken = null;
             TableContinuationToken continuationToken = null;
-            List<T> entitys = new List<T>();
+            List<T> entitys = new();
             do
             do
             {
             {
                 var result = await TableName.ExecuteQuerySegmentedAsync(exQuery, continuationToken);
                 var result = await TableName.ExecuteQuerySegmentedAsync(exQuery, continuationToken);

+ 169 - 139
TEAMModelOS.SDK/Models/Service/GroupListService.cs

@@ -21,7 +21,7 @@ namespace TEAMModelOS.SDK
 {
 {
     public class GroupListService
     public class GroupListService
     {
     {
-        public static async Task<(int status, GroupList stuList)> CodeJoinList(CosmosClient client, string _stuListNo, string userid,    int type,   string school)
+        public static async Task<(int status, GroupList stuList)> CodeJoinList(CosmosClient client, string _stuListNo, string userid, int type, string school)
         {
         {
             var queryNo = $"SELECT  value(c)  FROM c where  c.no ='{_stuListNo}'";
             var queryNo = $"SELECT  value(c)  FROM c where  c.no ='{_stuListNo}'";
             (int status, GroupList stuList) data = (-1, null);
             (int status, GroupList stuList) data = (-1, null);
@@ -30,7 +30,7 @@ namespace TEAMModelOS.SDK
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryNo,
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryNo,
                 requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
                 requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
                 {
                 {
-                    data = JoinList(item, userid  , type, school);
+                    data = JoinList(item, userid, type, school);
                     break;
                     break;
                 }
                 }
             }
             }
@@ -42,17 +42,19 @@ namespace TEAMModelOS.SDK
             }
             }
             return data;
             return data;
         }
         }
-        public static (int status, GroupList stuList) JoinList(GroupList stuList, string userid,   int type,  string school)
+        public static (int status, GroupList stuList) JoinList(GroupList stuList, string userid, int type, string school)
         {
         {
             int status = -1;
             int status = -1;
-            if (!string.IsNullOrWhiteSpace(stuList.school) && !string.IsNullOrWhiteSpace(school)) {
-                if (!stuList.school.Equals(school)) {
+            if (!string.IsNullOrWhiteSpace(stuList.school) && !string.IsNullOrWhiteSpace(school))
+            {
+                if (!stuList.school.Equals(school))
+                {
                     status = 3;//不允许跨校加入名单
                     status = 3;//不允许跨校加入名单
                     return (status, stuList);
                     return (status, stuList);
                 }
                 }
             }
             }
-            string irs=string.Empty;
-            List<string> irsOrder= stuList.members.Select(x => x.irs)?.Where(y => !string.IsNullOrEmpty(y)&& Regex.IsMatch(y, @"^\d*$")).OrderBy(x => int.Parse(x)).ToList();
+            string irs = string.Empty;
+            List<string> irsOrder = stuList.members.Select(x => x.irs)?.Where(y => !string.IsNullOrEmpty(y) && Regex.IsMatch(y, @"^\d*$")).OrderBy(x => int.Parse(x)).ToList();
             if (!irsOrder.Contains("0"))
             if (!irsOrder.Contains("0"))
             {
             {
                 irsOrder.Insert(0, "0");
                 irsOrder.Insert(0, "0");
@@ -77,7 +79,7 @@ namespace TEAMModelOS.SDK
                     }
                     }
                 }
                 }
             }
             }
-            
+
             if (string.IsNullOrEmpty($"{userid}"))
             if (string.IsNullOrEmpty($"{userid}"))
             {
             {
                 //加入学生或醍摩豆ID为空
                 //加入学生或醍摩豆ID为空
@@ -97,7 +99,7 @@ namespace TEAMModelOS.SDK
                     {
                     {
                         //加入成功
                         //加入成功
                         status = 0;
                         status = 0;
-                        stuList.members.Add(new Member { id = userid,type = type, irs = irs, no = irs });
+                        stuList.members.Add(new Member { id = userid, type = type, irs = irs, no = irs });
                     }
                     }
                 }
                 }
                 else if (type == 2)
                 else if (type == 2)
@@ -111,14 +113,14 @@ namespace TEAMModelOS.SDK
                     else
                     else
                     {
                     {
                         status = 0;
                         status = 0;
-                        stuList.members.Add(new Member { id = userid, code = school,  type = type, irs = irs, no = irs });
+                        stuList.members.Add(new Member { id = userid, code = school, type = type, irs = irs, no = irs });
                     }
                     }
                 }
                 }
             }
             }
             return (status, stuList);
             return (status, stuList);
         }
         }
 
 
-        public static async Task<GroupList> UpsertList(GroupList list, AzureCosmosFactory _azureCosmos,  IConfiguration _configuration, AzureServiceBusFactory _serviceBus)
+        public static async Task<GroupList> UpsertList(GroupList list, AzureCosmosFactory _azureCosmos, IConfiguration _configuration, AzureServiceBusFactory _serviceBus)
         {
         {
             bool isnew = false;
             bool isnew = false;
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
@@ -129,7 +131,7 @@ namespace TEAMModelOS.SDK
             }
             }
             string tbname = list.scope.Equals("private") ? "Teacher" : "School";
             string tbname = list.scope.Equals("private") ? "Teacher" : "School";
             var tmembers = list.members.Where(x => x.type == 1);
             var tmembers = list.members.Where(x => x.type == 1);
-            var smembers= list.members.Where(x => x.type == 2);
+            var smembers = list.members.Where(x => x.type == 2);
             list.scount = smembers.Count();
             list.scount = smembers.Count();
             list.tcount = tmembers.Count();
             list.tcount = tmembers.Count();
             //if (smembers.Count() > 0 && smembers.Select(x => x.code).ToHashSet().Count()>=2) {
             //if (smembers.Count() > 0 && smembers.Select(x => x.code).ToHashSet().Count()>=2) {
@@ -142,17 +144,19 @@ namespace TEAMModelOS.SDK
             //        list.members.RemoveAll(x => codes.Contains(x.code));
             //        list.members.RemoveAll(x => codes.Contains(x.code));
             //    }
             //    }
             //    else {
             //    else {
-            //        list.members.RemoveAll(x => x.code.Equals(list.school));
+            //        list.members.RemoveAll(x => !x.code.Equals(list.school));
             //    }
             //    }
             //}
             //}
-            if (string.IsNullOrWhiteSpace(list.school) && smembers.Count() >= 1) {
+            if (string.IsNullOrWhiteSpace(list.school) && smembers.Count() >= 1)
+            {
                 list.school = smembers.First().code;
                 list.school = smembers.First().code;
             }
             }
-            if (!string.IsNullOrWhiteSpace(list.school) && smembers.Count() == 0 && list.scope.Equals("private")) {
+            if (!string.IsNullOrWhiteSpace(list.school) && smembers.Count() == 0 && list.scope.Equals("private"))
+            {
                 list.school = null;
                 list.school = null;
             }
             }
             //学生名单,教研组会触发活动中间表刷新
             //学生名单,教研组会触发活动中间表刷新
-            if (list.type.Equals("teach") || list.type.Equals("research") || list.type.Equals("yxtrain")|| list.type.Equals("activity"))
+            if (list.type.Equals("teach") || list.type.Equals("research") || list.type.Equals("yxtrain") || list.type.Equals("activity"))
             {
             {
                 GroupChange change = new GroupChange()
                 GroupChange change = new GroupChange()
                 {
                 {
@@ -231,11 +235,12 @@ namespace TEAMModelOS.SDK
                     else
                     else
                     {
                     {
                         //离开的
                         //离开的
-                        if (oldList != null) {
+                        if (oldList != null)
+                        {
                             var tmdids = oldList.members.FindAll(x => x.type == 1);
                             var tmdids = oldList.members.FindAll(x => x.type == 1);
                             if (tmdids.IsNotEmpty())
                             if (tmdids.IsNotEmpty())
                             {
                             {
-                                if (list.type.Equals("research")|| list.type.Equals("yxtrain"))
+                                if (list.type.Equals("research") || list.type.Equals("yxtrain"))
                                 {
                                 {
                                     change.tchleave.AddRange(tmdids);
                                     change.tchleave.AddRange(tmdids);
                                 }
                                 }
@@ -334,8 +339,9 @@ namespace TEAMModelOS.SDK
             }
             }
             return list;
             return list;
         }
         }
-        public static async Task<List<GroupListDto> > GetGroupListListids(CosmosClient client, DingDing _dingDing, List<string> classes, string school,
-            string SummarySql= " c.id,c.code,c.name,c.no,c.periodId,c.scope,c.school,c.creatorId,c.type,c.year,c.tcount,c.scount,c.leader ") {
+        public static async Task<List<GroupListDto>> GetGroupListListids(CosmosClient client, DingDing _dingDing, List<string> classes, string school,
+            string SummarySql = " c.id,c.code,c.name,c.no,c.periodId,c.scope,c.school,c.creatorId,c.type,c.year,c.tcount,c.scount,c.leader ")
+        {
             List<GroupListDto> groupLists = null;
             List<GroupListDto> groupLists = null;
             if (classes.Count == 1 && classes.First().Equals("TeacherAll") && !string.IsNullOrEmpty(school))
             if (classes.Count == 1 && classes.First().Equals("TeacherAll") && !string.IsNullOrEmpty(school))
             {
             {
@@ -374,7 +380,8 @@ namespace TEAMModelOS.SDK
                     classes = classes.Except(schoolList.Select(y => y.id)).ToList();
                     classes = classes.Except(schoolList.Select(y => y.id)).ToList();
                     if (classes.IsNotEmpty())
                     if (classes.IsNotEmpty())
                     {
                     {
-                        if (!groupLists.IsNotEmpty()) {
+                        if (!groupLists.IsNotEmpty())
+                        {
                             groupLists = new List<GroupListDto>();
                             groupLists = new List<GroupListDto>();
                         }
                         }
                         string insql = string.Join(",", classes.Select(x => $"'{x}'"));
                         string insql = string.Join(",", classes.Select(x => $"'{x}'"));
@@ -393,9 +400,9 @@ namespace TEAMModelOS.SDK
                                 school = school,
                                 school = school,
                                 type = "class",
                                 type = "class",
                                 year = item.year,
                                 year = item.year,
-                                leader= item.leader,
-                                no= item.no,
-                                pk= "GroupList",
+                                leader = item.leader,
+                                no = item.no,
+                                pk = "GroupList",
                             };
                             };
                             groupLists.Add(group);
                             groupLists.Add(group);
                         }
                         }
@@ -410,24 +417,25 @@ namespace TEAMModelOS.SDK
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<GroupListDto>(queryText: $"select {SummarySql} from c where c.id in ({sql})",
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<GroupListDto>(queryText: $"select {SummarySql} from c where c.id in ({sql})",
                            requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
                            requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
                     {
                     {
-                        if (string.IsNullOrWhiteSpace(school))
-                        {
-                            privateList.Add(item);
-                        }
-                        else
-                        {
-                            if (!string.IsNullOrWhiteSpace(item.school))
-                            {
-                                if (item.school.Equals(school))
-                                {
-                                    privateList.Add(item);
-                                }
-                            }
-                            else
-                            {
-                                privateList.Add(item);
-                            }
-                        }
+                        privateList.Add(item);
+                        //if (string.IsNullOrWhiteSpace(school))
+                        //{
+                        //    privateList.Add(item);
+                        //}
+                        //else
+                        //{
+                        //    if (!string.IsNullOrWhiteSpace(item.school))
+                        //    {
+                        //        if (item.school.Equals(school))
+                        //        {
+                        //            privateList.Add(item);
+                        //        }
+                        //    }
+                        //    else
+                        //    {
+                        //        privateList.Add(item);
+                        //    }
+                        //}
                     }
                     }
                     if (privateList.IsNotEmpty())
                     if (privateList.IsNotEmpty())
                     {
                     {
@@ -439,24 +447,27 @@ namespace TEAMModelOS.SDK
                 {
                 {
                     if (groupLists.IsNotEmpty())
                     if (groupLists.IsNotEmpty())
                     {
                     {
-                        groupLists .AddRange(groups.SelectMany(x => x.Value).ToList());
+                        groupLists.AddRange(groups.SelectMany(x => x.Value).ToList());
                     }
                     }
-                    else {
+                    else
+                    {
                         groupLists = groups.SelectMany(x => x.Value).ToList();
                         groupLists = groups.SelectMany(x => x.Value).ToList();
                     }
                     }
                 }
                 }
-                
+
             }
             }
             return groupLists;
             return groupLists;
         }
         }
-        public static async Task<(List<RMember>, List<RGroupList> groups)> GetStutmdidListids(CoreAPIHttpService _coreAPIHttpService,CosmosClient client, DingDing _dingDing, List<string> classes, string school, List<(string, List<string>)> groupids = null)
+        public static async Task<(List<RMember>, List<RGroupList> groups)> GetStutmdidListids(CoreAPIHttpService _coreAPIHttpService, CosmosClient client, DingDing _dingDing, List<string> classes, string school, List<(string, List<string>)> groupids = null)
         {
         {
             List<RMember> members = new List<RMember>();
             List<RMember> members = new List<RMember>();
             List<RGroupList> groupLists = new List<RGroupList>();
             List<RGroupList> groupLists = new List<RGroupList>();
-            if (classes != null) {
+            if (classes != null)
+            {
                 classes.RemoveAll(x => x == null);
                 classes.RemoveAll(x => x == null);
             }
             }
-            if (classes==null || classes.Count<=0) {
+            if (classes == null || classes.Count <= 0)
+            {
                 return (members, groupLists);
                 return (members, groupLists);
             }
             }
             if (classes.Count == 1 && classes.First().Equals("TeacherAll") && !string.IsNullOrEmpty(school))
             if (classes.Count == 1 && classes.First().Equals("TeacherAll") && !string.IsNullOrEmpty(school))
@@ -473,7 +484,7 @@ namespace TEAMModelOS.SDK
                         type = 1,
                         type = 1,
                     };
                     };
                     members.Add(member);
                     members.Add(member);
-                     
+
                 }
                 }
                 RGroupList groupList = new RGroupList
                 RGroupList groupList = new RGroupList
                 {
                 {
@@ -519,7 +530,8 @@ namespace TEAMModelOS.SDK
                         //取差集,减少二次搜寻
                         //取差集,减少二次搜寻
                         classes = classes.Except(students.Select(y => y.classId)).ToList();
                         classes = classes.Except(students.Select(y => y.classId)).ToList();
                     }
                     }
-                    if (classes.IsNotEmpty()) {
+                    if (classes.IsNotEmpty())
+                    {
                         string insql = string.Join(",", classes.Select(x => $"'{x}'"));
                         string insql = string.Join(",", classes.Select(x => $"'{x}'"));
                         //搜寻没有关联学生的行政班
                         //搜寻没有关联学生的行政班
                         await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School")
                         await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School")
@@ -540,16 +552,16 @@ namespace TEAMModelOS.SDK
                                 year = item.year,
                                 year = item.year,
                                 members = smembers,
                                 members = smembers,
                                 scount = smembers.Count,
                                 scount = smembers.Count,
-                                pk= "GroupList",
-                                leader=item.leader,
-                                no=item.no,
+                                pk = "GroupList",
+                                leader = item.leader,
+                                no = item.no,
                             };
                             };
                             groupLists.Add(group);
                             groupLists.Add(group);
                         }
                         }
                         //取差集,减少二次搜寻
                         //取差集,减少二次搜寻
                         classes = classes.Except(groupLists.Select(y => y.id)).ToList();
                         classes = classes.Except(groupLists.Select(y => y.id)).ToList();
                     }
                     }
-                   
+
                 }
                 }
                 if (classes.IsNotEmpty())
                 if (classes.IsNotEmpty())
                 {
                 {
@@ -558,24 +570,25 @@ namespace TEAMModelOS.SDK
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<RGroupList>(queryText: $"select value(c) from c where c.id in ({sql})",
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<RGroupList>(queryText: $"select value(c) from c where c.id in ({sql})",
                            requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
                            requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
                     {
                     {
-                        if (string.IsNullOrWhiteSpace(school))
-                        {
-                            privateList.Add(item);
-                        }
-                        else
-                        {
-                            if (!string.IsNullOrWhiteSpace(item.school))
-                            {
-                                if (item.school.Equals(school))
-                                {
-                                    privateList.Add(item);
-                                }
-                            }
-                            else
-                            {
-                                privateList.Add(item);
-                            }
-                        }
+                        privateList.Add(item);
+                        //if (string.IsNullOrWhiteSpace(school))
+                        //{
+                        //    privateList.Add(item);
+                        //}
+                        //else
+                        //{
+                        //    if (!string.IsNullOrWhiteSpace(item.school))
+                        //    {
+                        //        if (item.school.Equals(school))
+                        //        {
+                        //            privateList.Add(item);
+                        //        }
+                        //    }
+                        //    else
+                        //    {
+                        //        privateList.Add(item);
+                        //    }
+                        //}
                     }
                     }
                     if (privateList.IsNotEmpty())
                     if (privateList.IsNotEmpty())
                     {
                     {
@@ -587,11 +600,11 @@ namespace TEAMModelOS.SDK
                     var list = item.Value.GroupBy(x => x.type).Select(y => new { key = y.Key, list = y.ToList() });
                     var list = item.Value.GroupBy(x => x.type).Select(y => new { key = y.Key, list = y.ToList() });
                     foreach (var group in list)
                     foreach (var group in list)
                     {
                     {
-                        (List<RGroupList> rgroups, List<RMember> rmembers)  =await GetGroupListMemberInfo(_coreAPIHttpService, client, group.key, group.list, item.Key,_dingDing,school);
+                        (List<RGroupList> rgroups, List<RMember> rmembers) = await GetGroupListMemberInfo(_coreAPIHttpService, client, group.key, group.list, item.Key, _dingDing, school);
                         members.AddRange(rmembers);
                         members.AddRange(rmembers);
                     }
                     }
                 }
                 }
-                groupLists .AddRange(groups.SelectMany(x => x.Value).ToList());
+                groupLists.AddRange(groups.SelectMany(x => x.Value).ToList());
                 if (students.IsNotEmpty())
                 if (students.IsNotEmpty())
                 {
                 {
                     List<string> sqlList = students.Select(x => x.classId).ToList();
                     List<string> sqlList = students.Select(x => x.classId).ToList();
@@ -602,21 +615,21 @@ namespace TEAMModelOS.SDK
                     {
                     {
                         ///行政班(学生搜寻classId动态返回)class
                         ///行政班(学生搜寻classId动态返回)class
                         List<RMember> smembers = students.Where(x => x.classId.Equals(item.id))
                         List<RMember> smembers = students.Where(x => x.classId.Equals(item.id))
-                            .Select(y => new RMember 
+                            .Select(y => new RMember
                             {
                             {
                                 id = y.id,
                                 id = y.id,
-                                code = school, 
+                                code = school,
                                 name = y.name,
                                 name = y.name,
-                                type = 2, 
+                                type = 2,
                                 picture = y.picture,
                                 picture = y.picture,
                                 no = y.no,
                                 no = y.no,
-                                classId=y.classId,
+                                classId = y.classId,
                                 //groupId=y.groupId,
                                 //groupId=y.groupId,
-                                groupName=y.groupName ,
-                                irs=y.irs,
+                                groupName = y.groupName,
+                                irs = y.irs,
                             }).ToList();
                             }).ToList();
                         members.AddRange(smembers);
                         members.AddRange(smembers);
-                       
+
                         RGroupList group = new RGroupList
                         RGroupList group = new RGroupList
                         {
                         {
                             id = item.id,
                             id = item.id,
@@ -629,9 +642,9 @@ namespace TEAMModelOS.SDK
                             year = item.year,
                             year = item.year,
                             members = smembers,
                             members = smembers,
                             scount = smembers.Count,
                             scount = smembers.Count,
-                            no=item.no,
-                            leader=item.leader,
-                            pk= "GroupList"
+                            no = item.no,
+                            leader = item.leader,
+                            pk = "GroupList"
                         };
                         };
                         groupLists.Add(group);
                         groupLists.Add(group);
                     }
                     }
@@ -639,29 +652,32 @@ namespace TEAMModelOS.SDK
                     members = members.FindAll(x => x.type == 2).Where((x, i) => members.FindAll(x => x.type == 2).FindIndex(n => n.id.Equals(x.id) && n.code.Equals(x.code)) == i).ToList();
                     members = members.FindAll(x => x.type == 2).Where((x, i) => members.FindAll(x => x.type == 2).FindIndex(n => n.id.Equals(x.id) && n.code.Equals(x.code)) == i).ToList();
                 }
                 }
             }
             }
-            if (groupids.IsNotEmpty()) {
+            if (groupids.IsNotEmpty())
+            {
                 List<RMember> rmembers = new List<RMember>();
                 List<RMember> rmembers = new List<RMember>();
                 groupLists.ForEach(y => {
                 groupLists.ForEach(y => {
                     (string id, List<string> grpids) = groupids.Find(x => x.Item1.Equals(y.id));
                     (string id, List<string> grpids) = groupids.Find(x => x.Item1.Equals(y.id));
                     var gpmember = y.members.FindAll(x => !string.IsNullOrEmpty(x.groupName) && grpids.Contains(x.groupName));
                     var gpmember = y.members.FindAll(x => !string.IsNullOrEmpty(x.groupName) && grpids.Contains(x.groupName));
-                    if (  grpids.Contains("default")) 
+                    if (grpids.Contains("default"))
                     {
                     {
                         var gpmemberdft = y.members.FindAll(x => string.IsNullOrWhiteSpace(x.groupName));
                         var gpmemberdft = y.members.FindAll(x => string.IsNullOrWhiteSpace(x.groupName));
                         if (gpmember.IsNotEmpty())
                         if (gpmember.IsNotEmpty())
                         {
                         {
                             gpmember.AddRange(gpmemberdft);
                             gpmember.AddRange(gpmemberdft);
                         }
                         }
-                        else {
+                        else
+                        {
                             gpmember = gpmemberdft;
                             gpmember = gpmemberdft;
                         }
                         }
                     }
                     }
                     y.members = gpmember;
                     y.members = gpmember;
 
 
                 });
                 });
-                var gpgpmembers =   groupLists.SelectMany(x => x.members).ToList();
+                var gpgpmembers = groupLists.SelectMany(x => x.members).ToList();
                 List<RMember> tmdids = gpgpmembers.FindAll(x => x.type == 1).Where((x, i) => gpgpmembers.FindAll(x => x.type == 1).FindIndex(n => n.id.Equals(x.id)) == i).ToList();
                 List<RMember> tmdids = gpgpmembers.FindAll(x => x.type == 1).Where((x, i) => gpgpmembers.FindAll(x => x.type == 1).FindIndex(n => n.id.Equals(x.id)) == i).ToList();
                 List<RMember> students = gpgpmembers.FindAll(x => x.type == 2).Where((x, i) => gpgpmembers.FindAll(x => x.type == 2).FindIndex(n => n.id.Equals(x.id) && n.code.Equals(x.code)) == i).ToList();
                 List<RMember> students = gpgpmembers.FindAll(x => x.type == 2).Where((x, i) => gpgpmembers.FindAll(x => x.type == 2).FindIndex(n => n.id.Equals(x.id) && n.code.Equals(x.code)) == i).ToList();
-                if (tmdids.IsNotEmpty()) {
+                if (tmdids.IsNotEmpty())
+                {
                     rmembers.AddRange(tmdids);
                     rmembers.AddRange(tmdids);
                 }
                 }
                 if (students.IsNotEmpty())
                 if (students.IsNotEmpty())
@@ -670,20 +686,21 @@ namespace TEAMModelOS.SDK
                 }
                 }
                 return (rmembers, groupLists);
                 return (rmembers, groupLists);
             }
             }
-            else {
+            else
+            {
                 return (members, groupLists);
                 return (members, groupLists);
             }
             }
         }
         }
-        public static async Task< List<RGroupList>  > GetGroupListMemberByType(CoreAPIHttpService _coreAPIHttpService,CosmosClient client,string type, List<string> scopes, string school, DingDing _dingDing)
+        public static async Task<List<RGroupList>> GetGroupListMemberByType(CoreAPIHttpService _coreAPIHttpService, CosmosClient client, string type, List<string> scopes, string school, DingDing _dingDing)
         {
         {
             StringBuilder sql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='{type}'");
             StringBuilder sql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='{type}'");
-            
+
             Dictionary<string, List<RGroupList>> groups = new Dictionary<string, List<RGroupList>>();
             Dictionary<string, List<RGroupList>> groups = new Dictionary<string, List<RGroupList>>();
             if (scopes.Contains("school"))
             if (scopes.Contains("school"))
             {
             {
                 if (!string.IsNullOrEmpty(school))
                 if (!string.IsNullOrEmpty(school))
                 {
                 {
-                    List<RGroupList> groupLists= new List<RGroupList>();
+                    List<RGroupList> groupLists = new List<RGroupList>();
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<RGroupList>(queryText: sql.ToString(),
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<RGroupList>(queryText: sql.ToString(),
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
                     {
                     {
@@ -692,28 +709,30 @@ namespace TEAMModelOS.SDK
                     groups.Add("School", groupLists);
                     groups.Add("School", groupLists);
                 }
                 }
             }
             }
-            else if (scopes.Contains("private")) {
+            else if (scopes.Contains("private"))
+            {
                 List<RGroupList> groupLists = new List<RGroupList>();
                 List<RGroupList> groupLists = new List<RGroupList>();
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<RGroupList>(queryText: sql.ToString(),
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<RGroupList>(queryText: sql.ToString(),
                         requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
                         requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList") }))
                 {
                 {
-                    if (string.IsNullOrWhiteSpace(school))
-                    {
-                        groupLists.Add(item);
-                    }
-                    else
-                    {
-                        if (!string.IsNullOrWhiteSpace(item.school))
-                        {
-                            if (item.school.Equals(school))
-                            {
-                                groupLists.Add(item);
-                            }
-                        }
-                        else {
-                            groupLists.Add(item);
-                        }
-                    }
+                    groupLists.Add(item);
+                    //if (string.IsNullOrWhiteSpace(school))
+                    //{
+                    //    groupLists.Add(item);
+                    //}
+                    //else
+                    //{
+                    //    if (!string.IsNullOrWhiteSpace(item.school))
+                    //    {
+                    //        if (item.school.Equals(school))
+                    //        {
+                    //            groupLists.Add(item);
+                    //        }
+                    //    }
+                    //    else {
+                    //        groupLists.Add(item);
+                    //    }
+                    //}
                 }
                 }
                 groups.Add("Teacher", groupLists);
                 groups.Add("Teacher", groupLists);
             }
             }
@@ -722,16 +741,17 @@ namespace TEAMModelOS.SDK
                 var list = item.Value.GroupBy(x => x.type).Select(y => new { key = y.Key, list = y.ToList() });
                 var list = item.Value.GroupBy(x => x.type).Select(y => new { key = y.Key, list = y.ToList() });
                 foreach (var group in list)
                 foreach (var group in list)
                 {
                 {
-                    (List<RGroupList> rgroups, List<RMember> rmembers) = await GetGroupListMemberInfo(_coreAPIHttpService, client, group.key, group.list, item.Key, _dingDing,school);
+                    (List<RGroupList> rgroups, List<RMember> rmembers) = await GetGroupListMemberInfo(_coreAPIHttpService, client, group.key, group.list, item.Key, _dingDing, school);
                 }
                 }
             }
             }
-            var  lists= groups.SelectMany(x => x.Value).ToList() ;
+            var lists = groups.SelectMany(x => x.Value).ToList();
             return lists;
             return lists;
         }
         }
-        public static async Task<(List<RGroupList> groups, List<RMember> members)> GetGroupListMemberInfo(CoreAPIHttpService _coreAPIHttpService,CosmosClient client, string type, List<RGroupList> groups, string groupTbname, DingDing _dingDing, string school)
+        public static async Task<(List<RGroupList> groups, List<RMember> members)> GetGroupListMemberInfo(CoreAPIHttpService _coreAPIHttpService, CosmosClient client, string type, List<RGroupList> groups, string groupTbname, DingDing _dingDing, string school)
         {
         {
 
 
-            try {
+            try
+            {
                 HashSet<RGroupList> changes = new HashSet<RGroupList>();
                 HashSet<RGroupList> changes = new HashSet<RGroupList>();
                 var members = groups.SelectMany(y => y.members).ToList();
                 var members = groups.SelectMany(y => y.members).ToList();
                 //去重
                 //去重
@@ -768,7 +788,7 @@ namespace TEAMModelOS.SDK
                     });
                     });
 
 
                 }
                 }
-                 
+
                 List<TmdUser> tmdsData = new List<TmdUser>();
                 List<TmdUser> tmdsData = new List<TmdUser>();
                 if (tmdids.IsNotEmpty())
                 if (tmdids.IsNotEmpty())
                 {
                 {
@@ -776,8 +796,9 @@ namespace TEAMModelOS.SDK
                     if ($"{type}".Equals("activity"))
                     if ($"{type}".Equals("activity"))
                     {
                     {
                         var mbers = groups.SelectMany(x => x.members).Where(z => !string.IsNullOrEmpty(z.code));
                         var mbers = groups.SelectMany(x => x.members).Where(z => !string.IsNullOrEmpty(z.code));
-                        var schoolTeachers = mbers.GroupBy(y=>y.code).Select(m=>new {key= m.Key,list = m.ToList() });
-                        foreach (var schoolTeacher in schoolTeachers) {
+                        var schoolTeachers = mbers.GroupBy(y => y.code).Select(m => new { key = m.Key, list = m.ToList() });
+                        foreach (var schoolTeacher in schoolTeachers)
+                        {
                             StringBuilder tmdidSql = new StringBuilder($"SELECT distinct c.name,c.id,c.picture FROM c ");
                             StringBuilder tmdidSql = new StringBuilder($"SELECT distinct c.name,c.id,c.picture FROM c ");
                             string insql = string.Join(",", schoolTeacher.list.Select(x => $"'{x.id}'"));
                             string insql = string.Join(",", schoolTeacher.list.Select(x => $"'{x.id}'"));
                             tmdidSql.Append($" where  c.id in ({insql})");
                             tmdidSql.Append($" where  c.id in ({insql})");
@@ -797,8 +818,9 @@ namespace TEAMModelOS.SDK
                             }
                             }
                         });
                         });
                     }
                     }
-                    else {
-                         
+                    else
+                    {
+
                         //处理研修名单,如果是学校老师的,则需要检查SchoolTeacher
                         //处理研修名单,如果是学校老师的,则需要检查SchoolTeacher
                         //处理 学校教研组,学校管理人员,学校任课教师,学校研修名单。
                         //处理 学校教研组,学校管理人员,学校任课教师,学校研修名单。
                         if (!string.IsNullOrEmpty(school) && ($"{type}".Equals("yxtrain") || $"{type}".Equals("research") || $"{type}".Equals("manage") || $"{type}".Equals("subject")))
                         if (!string.IsNullOrEmpty(school) && ($"{type}".Equals("yxtrain") || $"{type}".Equals("research") || $"{type}".Equals("manage") || $"{type}".Equals("subject")))
@@ -859,9 +881,10 @@ namespace TEAMModelOS.SDK
                 }
                 }
 
 
                 ///获取真实的名称 
                 ///获取真实的名称 
-                var content = new StringContent(tmdids.Select(x=>x.id).ToJsonString(), Encoding.UTF8, "application/json");
+                var content = new StringContent(tmdids.Select(x => x.id).ToJsonString(), Encoding.UTF8, "application/json");
                 string json = await _coreAPIHttpService.GetUserInfos(content);
                 string json = await _coreAPIHttpService.GetUserInfos(content);
-                if (!string.IsNullOrWhiteSpace(json)) {
+                if (!string.IsNullOrWhiteSpace(json))
+                {
                     try
                     try
                     {
                     {
                         List<TmdInfo> tmdInfos = json.ToObject<List<TmdInfo>>();
                         List<TmdInfo> tmdInfos = json.ToObject<List<TmdInfo>>();
@@ -875,7 +898,8 @@ namespace TEAMModelOS.SDK
                                     y.name = tmd?.name;
                                     y.name = tmd?.name;
                                     y.picture = tmd?.picture;
                                     y.picture = tmd?.picture;
                                 }
                                 }
-                                else {
+                                else
+                                {
                                     groups.ForEach(x =>
                                     groups.ForEach(x =>
                                     {
                                     {
                                         int item = x.members.RemoveAll(z => z.id.Equals(y.id) && z.type == 1);
                                         int item = x.members.RemoveAll(z => z.id.Equals(y.id) && z.type == 1);
@@ -914,49 +938,55 @@ namespace TEAMModelOS.SDK
                     {
                     {
                         change.tcount = change.members.Where(x => x.type == 1).Count();
                         change.tcount = change.members.Where(x => x.type == 1).Count();
                         change.scount = change.members.Where(x => x.type == 2).Count();
                         change.scount = change.members.Where(x => x.type == 2).Count();
-                        GroupList group= change.ToJsonString().ToObject<GroupList>();
+                        GroupList group = change.ToJsonString().ToObject<GroupList>();
                         await client.GetContainer(Constant.TEAMModelOS, groupTbname).ReplaceItemAsync(group, group.id, new PartitionKey(group.code));
                         await client.GetContainer(Constant.TEAMModelOS, groupTbname).ReplaceItemAsync(group, group.id, new PartitionKey(group.code));
                     }
                     }
                 }
                 }
-                groups.ForEach(x => x.members.ForEach(y=> {
-                    if (y.type == 1) {
-                        var tmd =tmdids.Find(t => t.id.Equals(y.id));
+                groups.ForEach(x => x.members.ForEach(y => {
+                    if (y.type == 1)
+                    {
+                        var tmd = tmdids.Find(t => t.id.Equals(y.id));
                         y.name = tmd?.name;
                         y.name = tmd?.name;
                         y.picture = tmd?.picture;
                         y.picture = tmd?.picture;
                     }
                     }
                     if (y.type == 2)
                     if (y.type == 2)
                     {
                     {
-                        var student = students.Find(t => t.id.Equals(y.id)&& t.code.Equals(y.code));
+                        var student = students.Find(t => t.id.Equals(y.id) && t.code.Equals(y.code));
                         y.name = student?.name;
                         y.name = student?.name;
                         y.picture = student?.picture;
                         y.picture = student?.picture;
                         y.classId = student?.classId;
                         y.classId = student?.classId;
                     }
                     }
                 }));
                 }));
-                
-                HashSet<string > schoolCodes= groups.SelectMany(x=>x.members).Where(y=>!string.IsNullOrEmpty(y.code)).Select(z=>z.code).ToHashSet();
-                if (schoolCodes != null && schoolCodes.Count > 0) {
-                    List<School> schools= new List<School>();
-                    string insql = $"select c.name,c.id from c where c.id in ({string.Join(",",schoolCodes.Select(x=>$"'{x}'"))})";
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: insql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") })) {
+
+                HashSet<string> schoolCodes = groups.SelectMany(x => x.members).Where(y => !string.IsNullOrEmpty(y.code)).Select(z => z.code).ToHashSet();
+                if (schoolCodes != null && schoolCodes.Count > 0)
+                {
+                    List<School> schools = new List<School>();
+                    string insql = $"select c.name,c.id from c where c.id in ({string.Join(",", schoolCodes.Select(x => $"'{x}'"))})";
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: insql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
+                    {
                         schools.Add(item);
                         schools.Add(item);
                     }
                     }
-                    if (schools.IsNotEmpty()) {
+                    if (schools.IsNotEmpty())
+                    {
                         groups.SelectMany(x => x.members).Where(y => !string.IsNullOrEmpty(y.code)).ToList().ForEach(z => {
                         groups.SelectMany(x => x.members).Where(y => !string.IsNullOrEmpty(y.code)).ToList().ForEach(z => {
-                            var school=    schools.Find(j => j.id.Equals(z.code));
+                            var school = schools.Find(j => j.id.Equals(z.code));
                             z.schoolName = school?.name;
                             z.schoolName = school?.name;
                         });
                         });
                     }
                     }
                 }
                 }
                 return (groups, mbs);
                 return (groups, mbs);
-            } catch (Exception ex) {
+            }
+            catch (Exception ex)
+            {
                 await _dingDing.SendBotMsg($"{_coreAPIHttpService.options.Get("Default").location},GetGroupListMemberInfo()\n{ex.Message}{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
                 await _dingDing.SendBotMsg($"{_coreAPIHttpService.options.Get("Default").location},GetGroupListMemberInfo()\n{ex.Message}{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
             }
             }
             return (null, null);
             return (null, null);
         }
         }
 
 
-        
+
     }
     }
-    
+
 
 
     public class CompareIdCode : IEqualityComparer<(string id, string code)>
     public class CompareIdCode : IEqualityComparer<(string id, string code)>
     {
     {

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventBasicInfo.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <div v-if="info" style="margin-bottom: 50px;">
+    <div v-if="info" style="margin-top: 20px; margin-bottom: 50px;">
         <Row :gutter="30">
         <Row :gutter="30">
             <i-col :xs="24" :sm="24" :md="24" :lg="getCurrentLang() == 'tw' ? 12 : 24" class="title-part">
             <i-col :xs="24" :sm="24" :md="24" :lg="getCurrentLang() == 'tw' ? 12 : 24" class="title-part">
                 <h2 class="event-title">
                 <h2 class="event-title">

+ 0 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Homework.vue

@@ -1,6 +1,5 @@
 <template>
 <template>
     <div class="homework">
     <div class="homework">
-        <br />
         <div v-if="openLightBox" class="lightBox">
         <div v-if="openLightBox" class="lightBox">
             <Icon class="ImgCloseIcon" type="md-close" @click="closeImg()" />
             <Icon class="ImgCloseIcon" type="md-close" @click="closeImg()" />
             <div v-for="(item, index) in getItemTitle.imgList"
             <div v-for="(item, index) in getItemTitle.imgList"

+ 32 - 29
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue

@@ -30,22 +30,21 @@
             <Row :gutter="20" v-if="testState === 3 && getItemTitle.progress === 'finish'">
             <Row :gutter="20" v-if="testState === 3 && getItemTitle.progress === 'finish'">
                 <i-col :xs="24" :sm="24" :md="24" :lg="24">
                 <i-col :xs="24" :sm="24" :md="24" :lg="24">
                     <Row :gutter="20">
                     <Row :gutter="20">
-                        <!-- 得分 -->
+                        <!-- 得分题目数 -->
                         <i-col :xs="24" :sm="24" :md="12" :lg="6">
                         <i-col :xs="24" :sm="24" :md="12" :lg="6">
                             <Card class="score-card">
                             <Card class="score-card">
-                                <p class="card-title">{{$t('studentWeb.exam.score')}}</p>
+                                <p class="card-title">{{$t("studentWeb.exam.report.getScore")}}</p>
                                 <div class="card-content">
                                 <div class="card-content">
-                                    <span class="myscore">{{testScore}}</span> / {{ paperInfo.score }}
+                                    <span class="myscore">{{rightAns.right}}</span> / {{rightAns.all}}
                                 </div>
                                 </div>
                             </Card>
                             </Card>
                         </i-col>
                         </i-col>
-                        <!-- 难易度 -->
+                        <!-- 得分 -->
                         <i-col :xs="24" :sm="24" :md="12" :lg="6">
                         <i-col :xs="24" :sm="24" :md="12" :lg="6">
                             <Card class="score-card">
                             <Card class="score-card">
-                                <p class="card-title">{{$t('studentWeb.exam.difficulty')}}</p>
-                                <div class="difficulty-rate">
-                                    <Rate class allow-half disabled v-model="difficultyRate" />
-                                    <span class="difficulty-rate-num">{{difficultyRate }}</span>
+                                <p class="card-title">{{$t('studentWeb.exam.score')}}</p>
+                                <div class="card-content">
+                                    <span class="myscore">{{testScore}}</span> / {{ paperInfo.score }}
                                 </div>
                                 </div>
                             </Card>
                             </Card>
                         </i-col>
                         </i-col>
@@ -60,12 +59,13 @@
                                 </div>
                                 </div>
                             </Card>
                             </Card>
                         </i-col>
                         </i-col>
-                        <!-- 得分题目数 -->
+                        <!-- 难易度 -->
                         <i-col :xs="24" :sm="24" :md="12" :lg="6">
                         <i-col :xs="24" :sm="24" :md="12" :lg="6">
                             <Card class="score-card">
                             <Card class="score-card">
-                                <p class="card-title">{{$t("studentWeb.exam.report.getScore")}}</p>
-                                <div class="card-content">
-                                    <span class="myscore">{{rightAns.right}}</span> / {{rightAns.all}}
+                                <p class="card-title">{{$t('studentWeb.exam.difficulty')}}</p>
+                                <div class="difficulty-rate">
+                                    <Rate class allow-half disabled v-model="difficultyRate" />
+                                    <span class="difficulty-rate-num">{{difficultyRate }}</span>
                                 </div>
                                 </div>
                             </Card>
                             </Card>
                         </i-col>
                         </i-col>
@@ -139,32 +139,35 @@
                                 </span>
                                 </span>
                             </p>
                             </p>
                         </div>
                         </div>
-                        <div style="width: 88%;" @click="closeDetail(index, indexs)">
-                            <div style="display: flex; font-size: 16px; margin-bottom: 10px;">
-                                <p style="max-width:75px;font-weight:600">{{ indexs + 1 }}.</p>
-                                <div class="que-item" v-html="exam.question"></div>
-                            </div>
-                            <div v-for="(option, indexoption) in exam.option" :key="indexoption" style="display:flex;margin-top:5px;">
-                                {{option.code}}. <div style="margin-left:10px" v-html="option.value"></div>
+                        <div style="width: 88%;">
+                            <div @click="closeDetail(index, indexs)">
+                                <div style="display: flex; font-size: 16px; margin-bottom: 10px;">
+                                    <p style="max-width:75px;font-weight:600">{{ indexs + 1 }}.</p>
+                                    <div class="que-item" v-html="exam.question"></div>
+                                </div>
+                                <div v-for="(option, indexoption) in exam.option" :key="indexoption" style="display:flex;margin-top:5px;">
+                                    {{option.code}}. <div style="margin-left:10px" v-html="option.value"></div>
+                                </div>
                             </div>
                             </div>
                             <div style="margin-top: 20px;">
                             <div style="margin-top: 20px;">
                                 <div v-for="(children, indexC) in exam.children" :key="indexC"
                                 <div v-for="(children, indexC) in exam.children" :key="indexC"
                                     style="margin-bottom: 40px; margin-left: 20px; display: flex;"
                                     style="margin-bottom: 40px; margin-left: 20px; display: flex;"
                                     v-show="checkedAnsFilter(index, indexs, indexC)"
                                     v-show="checkedAnsFilter(index, indexs, indexC)"
-                                    @click="closeDetail(index, indexs, indexC)"
                                 >
                                 >
                                     <div style="margin-right: 5px;">
                                     <div style="margin-right: 5px;">
                                         <Icon type="md-close-circle" color="#FF5508" size="25" v-show="children.getScore != children.score" />
                                         <Icon type="md-close-circle" color="#FF5508" size="25" v-show="children.getScore != children.score" />
                                         <Icon type="md-checkmark-circle" color="#00AD6C" size="25" v-show="children.getScore === children.score" />
                                         <Icon type="md-checkmark-circle" color="#00AD6C" size="25" v-show="children.getScore === children.score" />
                                     </div>
                                     </div>
                                     <div style="width: 92%;">
                                     <div style="width: 92%;">
-                                        <div style="display: flex;">
-                                            <p style="max-width: 75px; font-weight: 600;">({{ indexC + 1 }})</p>
-                                            <div class="que-item" v-html="children.question"></div>
-                                        </div>
-                                        <div style="margin-left: 20px;">
-                                            <div v-for="(optionC, indexoptionC) in children.option" :key="indexoptionC" style="display:flex;margin-top:5px;">
-                                                {{optionC.code}}. <div style="margin-left:10px" v-html="optionC.value"></div>
+                                        <div @click="closeDetail(index, indexs, indexC)">
+                                            <div style="display: flex;">
+                                                <p style="max-width: 75px; font-weight: 600;">({{ indexC + 1 }})</p>
+                                                <div class="que-item" v-html="children.question"></div>
+                                            </div>
+                                            <div style="margin-left: 20px;">
+                                                <div v-for="(optionC, indexoptionC) in children.option" :key="indexoptionC" style="display:flex;margin-top:5px;">
+                                                    {{optionC.code}}. <div style="margin-left:10px" v-html="optionC.value"></div>
+                                                </div>
                                             </div>
                                             </div>
                                         </div>
                                         </div>
                                         <div style="margin-left: 20px;">
                                         <div style="margin-left: 20px;">
@@ -180,7 +183,7 @@
                                         </div>
                                         </div>
                                         <div style="margin-left: 20px;" v-show="children.open">
                                         <div style="margin-left: 20px;" v-show="children.open">
                                             <!-- 批注 -->
                                             <!-- 批注 -->
-                                            <div class="item-explain">
+                                            <div class="item-explain" v-if="children.type != 'single' && children.type != 'multiply' && children.type != 'judge'">
                                                 <span class="explain-title">【{{ $t("studentWeb.exam.report.mark") }}】</span>
                                                 <span class="explain-title">【{{ $t("studentWeb.exam.report.mark") }}】</span>
                                                 <div v-if="children.mark.length" class="item-explain-details">
                                                 <div v-if="children.mark.length" class="item-explain-details">
                                                     <img :src="children.mark[0].imgUrl" alt="" v-if="children.mark.length === 1">
                                                     <img :src="children.mark[0].imgUrl" alt="" v-if="children.mark.length === 1">
@@ -312,7 +315,7 @@
                                 </div>
                                 </div>
                             </div>
                             </div>
                             <div v-if="exam.type !== 'compose'" v-show="exam.open">
                             <div v-if="exam.type !== 'compose'" v-show="exam.open">
-                                <div class="item-explain">
+                                <div class="item-explain" v-if="exam.type != 'single' && exam.type != 'multiply' && exam.type != 'judge'">
                                     <span class="explain-title">【{{ $t("studentWeb.exam.report.mark") }}】</span>
                                     <span class="explain-title">【{{ $t("studentWeb.exam.report.mark") }}】</span>
                                     <div v-if="exam.mark.length" class="item-explain-details">
                                     <div v-if="exam.mark.length" class="item-explain-details">
                                         <img :src="exam.mark[0].imgUrl" alt="" v-if="exam.mark.length === 1">
                                         <img :src="exam.mark[0].imgUrl" alt="" v-if="exam.mark.length === 1">

+ 0 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -1,6 +1,5 @@
 <template>
 <template>
     <div class="lesson-test">
     <div class="lesson-test">
-        <br />
         <!-- <PaperTest :papers="selectData" v-if="getisOpenLessonTestPopNow" />  -->
         <!-- <PaperTest :papers="selectData" v-if="getisOpenLessonTestPopNow" />  -->
         <div>
         <div>
             <!-- <div class="load-box">
             <!-- <div class="load-box">

+ 0 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue

@@ -1,6 +1,5 @@
 <template>
 <template>
 	<div class="quesnaire">
 	<div class="quesnaire">
-        <br />
 		<div v-if="WarmMessageisOpen" class="warmMessage">
 		<div v-if="WarmMessageisOpen" class="warmMessage">
 			<div class="messageCard animate__animated animate__fadeInDown">
 			<div class="messageCard animate__animated animate__fadeInDown">
 				<div v-if="showMessageNum == 1">
 				<div v-if="showMessageNum == 1">

+ 0 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Vote.vue

@@ -1,6 +1,5 @@
 <template>
 <template>
     <div class="vote">
     <div class="vote">
-        <br />
         <div v-if="WarmMessageisOpen" class="warmMessage ">
         <div v-if="WarmMessageisOpen" class="warmMessage ">
             <div class="messageCard animate__animated animate__fadeInDown ">
             <div class="messageCard animate__animated animate__fadeInDown ">
                 <h2>{{ $t("studentWeb.vote.voteSuccess") }}</h2>
                 <h2>{{ $t("studentWeb.vote.voteSuccess") }}</h2>

+ 21 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue

@@ -10,7 +10,10 @@
 </template>
 </template>
 <script>
 <script>
     import html2canvas from 'html2canvas';
     import html2canvas from 'html2canvas';
-    import E from 'wangeditor'
+    import E from 'wangeditor';
+    import {editor_tw_config} from '@/utils/editorLangTw.js';
+    import {editor_en_config} from '@/utils/editorLangEn.js';
+    import i18next from 'i18next';
     export default {
     export default {
         components: {
         components: {
 
 
@@ -95,6 +98,23 @@
                 } else {
                 } else {
                     this.$editorTools.addCanvas(this, this.editor)
                     this.$editorTools.addCanvas(this, this.editor)
                 }
                 }
+                let curLang = localStorage.getItem('local') || 'zh-cn'
+                if (curLang === 'zh-tw') {
+                    // 自定义语言
+                    this.editor.config.languages['tw'] = editor_tw_config
+                    // 选择语言
+                    this.editor.config.lang = 'tw'
+                    // 引入 i18next 插件
+                    this.editor.i18next = i18next
+                }
+                if (curLang === 'en-us') {
+                    // 自定义语言
+                    this.editor.config.languages['en'] = editor_en_config
+                    // 选择语言
+                    this.editor.config.lang = 'en'
+                    // 引入 i18next 插件
+                    this.editor.i18next = i18next
+                }
                 this.editor.create();
                 this.editor.create();
                 if (this.close) {
                 if (this.close) {
                     this.editor.disable()
                     this.editor.disable()

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -272,6 +272,7 @@
                                 </p>
                                 </p>
                             </div>
                             </div>
                             <div class="list-new-type">
                             <div class="list-new-type">
+                                <span style="font-size: 12px;">{{ item.tempsub }}</span>
                                 <div class="list-new-unDone isAllowRetry" v-show="timeStatus(item) === 'going'">
                                 <div class="list-new-unDone isAllowRetry" v-show="timeStatus(item) === 'going'">
                                     <span>{{$t("studentWeb.public.going")}}</span>
                                     <span>{{$t("studentWeb.public.going")}}</span>
                                 </div>
                                 </div>
@@ -289,7 +290,6 @@
                                 <!-- <div class="list-new-unDone isWrongPra" v-show="timeStatus(item) == 'finish' && item.eventType == 'Exam'">
                                 <!-- <div class="list-new-unDone isWrongPra" v-show="timeStatus(item) == 'finish' && item.eventType == 'Exam'">
                                     <span class="">{{$t("studentWeb.exam.report.wrongPractice")}}</span>
                                     <span class="">{{$t("studentWeb.exam.report.wrongPractice")}}</span>
                                 </div> -->
                                 </div> -->
-                                <span style="font-size: 12px;">{{ item.tempsub }}</span>
                             </div>
                             </div>
                                 
                                 
                         </div>
                         </div>

+ 1 - 0
TEAMModelOS/ClientApp/src/utils/editorLangEn.js

@@ -55,6 +55,7 @@ let editor_en_config = {
                     靠左: 'left',
                     靠左: 'left',
                     居中: 'center',
                     居中: 'center',
                     靠右: 'right',
                     靠右: 'right',
+					两端: 'ends'
                 },
                 },
                 list: {
                 list: {
                     无序列表: 'Unordered list',
                     无序列表: 'Unordered list',

+ 1 - 0
TEAMModelOS/ClientApp/src/utils/editorLangTw.js

@@ -55,6 +55,7 @@ let editor_tw_config = {
                     靠左: '靠左',
                     靠左: '靠左',
                     居中: '居中',
                     居中: '居中',
                     靠右: '靠右',
                     靠右: '靠右',
+					两端: '两端'
                 },
                 },
                 list: {
                 list: {
                     无序列表: '無序清單',
                     无序列表: '無序清單',

+ 18 - 14
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -68,8 +68,8 @@
                     </div>
                     </div>
                     <div class="course-classroom-info common-save-btn" id="table-height" slot="right">
                     <div class="course-classroom-info common-save-btn" id="table-height" slot="right">
                         <div class="course-classroom-info-header tab-box" style="padding-right:30px;">
                         <div class="course-classroom-info-header tab-box" style="padding-right:30px;">
-                            <span @click="selectTab('activity')" :class="tabName == 'activity' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('cusMgt.acRecord')}}</span>
                             <span @click="selectTab('record')" :class="tabName == 'record' ? 'course-classroom-label pane active':'course-classroom-label pane'" v-show="$store.state.config.srvAdrType != 'product'">{{$t('cusMgt.cusRecord')}}</span>
                             <span @click="selectTab('record')" :class="tabName == 'record' ? 'course-classroom-label pane active':'course-classroom-label pane'" v-show="$store.state.config.srvAdrType != 'product'">{{$t('cusMgt.cusRecord')}}</span>
+                            <span @click="selectTab('activity')" :class="tabName == 'activity' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('cusMgt.acRecord')}}</span>
                             <span @click="selectTab('stus')" :class="tabName == 'stus' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('courseManage.classroom.studentList')}}</span>
                             <span @click="selectTab('stus')" :class="tabName == 'stus' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('courseManage.classroom.studentList')}}</span>
 
 
                             <!-- 个人课程时段设置暂不实做 -->
                             <!-- 个人课程时段设置暂不实做 -->
@@ -148,7 +148,7 @@
                         <div v-show="tabName == 'record'" class="animated fadeIn class-record-wrap">
                         <div v-show="tabName == 'record'" class="animated fadeIn class-record-wrap">
                             <vuescroll>
                             <vuescroll>
                                 <List>
                                 <List>
-                                    <ListItem v-for="(item,index) in recordListShow" :key="index">
+                                    <ListItem v-for="(item,index) in curRecordList" :key="index">
                                         <ListItemMeta @click.native="toClassRecoerd(index)" style="cursor: pointer;">
                                         <ListItemMeta @click.native="toClassRecoerd(index)" style="cursor: pointer;">
                                             <div slot="avatar" class="record-poster-wrap" :style="{backgroundImage:`url(${item.poster})`}">
                                             <div slot="avatar" class="record-poster-wrap" :style="{backgroundImage:`url(${item.poster})`}">
                                             </div>
                                             </div>
@@ -189,7 +189,7 @@
                                         </ListItemMeta>
                                         </ListItemMeta>
                                     </ListItem>
                                     </ListItem>
                                 </List>
                                 </List>
-                                <EmptyData v-show="recordListShow.length == 0" :textContent="$t('cusMgt.noRecord')" :top="150"></EmptyData>
+                                <EmptyData v-show="curRecordList.length == 0" :textContent="$t('cusMgt.noRecord')" :top="150"></EmptyData>
                             </vuescroll>
                             </vuescroll>
                         </div>
                         </div>
                         <!-- 活动记录 -->
                         <!-- 活动记录 -->
@@ -568,7 +568,6 @@ export default {
                 }
                 }
             ],
             ],
             recordList: [],
             recordList: [],
-            recordListShow: [],
             editClassStatus: false,
             editClassStatus: false,
             showQrStatus: false,
             showQrStatus: false,
             listLoading: false,
             listLoading: false,
@@ -760,7 +759,7 @@ export default {
                             const index = this.recordList.findIndex(item => item.id == id)
                             const index = this.recordList.findIndex(item => item.id == id)
                             if (index > -1) {
                             if (index > -1) {
                                 this.recordList.splice(index, 1)
                                 this.recordList.splice(index, 1)
-                                this.filterRecordList(this.curClassIndex)
+                                // this.filterRecordList(this.curClassIndex)
                             }
                             }
                         },
                         },
                         err => {
                         err => {
@@ -938,7 +937,7 @@ export default {
             } else if (this.tabName == 'stus') {
             } else if (this.tabName == 'stus') {
                 this.getStuList()
                 this.getStuList()
             } else if (this.tabName == 'record') {
             } else if (this.tabName == 'record') {
-                this.getRecordList()
+                if (!this.recordList.length) this.getRecordList()
             }
             }
         },
         },
         //课程选项卡点击事件
         //课程选项卡点击事件
@@ -1554,15 +1553,9 @@ export default {
             } else if (this.tabName == 'activity') {
             } else if (this.tabName == 'activity') {
                 this.getActivityList()
                 this.getActivityList()
             } else if (this.tabName == 'record') {
             } else if (this.tabName == 'record') {
-                this.filterRecordList(index)
+                // this.filterRecordList(index)
             }
             }
         },
         },
-        filterRecordList(index) {
-            this.recordListShow = this.recordList.filter(item => {
-                let id = this.teaClassList[index]?.classId || this.teaClassList[index]?.stulist
-                return item.groupIds.includes(id)
-            })
-        },
         //查看课堂记录详情
         //查看课堂记录详情
         toClassRecoerd(index) {
         toClassRecoerd(index) {
             this.$router.push({
             this.$router.push({
@@ -1676,6 +1669,8 @@ export default {
             }
             }
             if (this.tabName == 'record') {
             if (this.tabName == 'record') {
                 this.getRecordList()
                 this.getRecordList()
+            }else{
+                this.recordList = []
             }
             }
         },
         },
         // 新增个人课程
         // 新增个人课程
@@ -1931,7 +1926,7 @@ export default {
                         item.video = `${privateSas.url}/${privateSas.name}/records/${item.id}/Record/CourseRecord.mp4${privateSas.sas}`
                         item.video = `${privateSas.url}/${privateSas.name}/records/${item.id}/Record/CourseRecord.mp4${privateSas.sas}`
                         item.poster = `${privateSas.url}/${privateSas.name}/records/${item.id}/Record/CoverImage.jpg${privateSas.sas}`
                         item.poster = `${privateSas.url}/${privateSas.name}/records/${item.id}/Record/CoverImage.jpg${privateSas.sas}`
                     })
                     })
-                    this.filterRecordList(this.curClassIndex)
+                    // this.filterRecordList(this.curClassIndex)
                 },
                 },
                 err => {
                 err => {
                     this.$Message.error(this.$t('cusMgt.rcdErr'))
                     this.$Message.error(this.$t('cusMgt.rcdErr'))
@@ -1940,6 +1935,7 @@ export default {
         }
         }
     },
     },
     created() {
     created() {
+        this.tabName = this.$store.state.config.srvAdrType != 'product' ? 'record' : 'activity'
         this.getAllStuList()
         this.getAllStuList()
         //直接读取登录成功拿到得学校基础信息
         //直接读取登录成功拿到得学校基础信息
         this.$store.dispatch('user/getSchoolProfile').then(res => {
         this.$store.dispatch('user/getSchoolProfile').then(res => {
@@ -2132,6 +2128,14 @@ export default {
                 return (item.classes && item.classes.includes(id)) || ((item.stuLists && item.stuLists.includes(id)))
                 return (item.classes && item.classes.includes(id)) || ((item.stuLists && item.stuLists.includes(id)))
             })
             })
         },
         },
+        //当前班级课堂记录
+        curRecordList() {
+            let list = this.recordList.filter(item => {
+                let id = this.teaClassList[this.curClassIndex]?.classId || this.teaClassList[this.curClassIndex]?.stulist
+                return item.groupIds.includes(id)
+            })
+            return list
+        },
         cusTypeLabel() {
         cusTypeLabel() {
             let curObj = this.cusType.find(item => {
             let curObj = this.cusType.find(item => {
                 return item.value == this.listType
                 return item.value == this.listType

+ 1 - 1
TEAMModelOS/ClientApp/src/view/settings/OpenMgmt2.vue

@@ -47,7 +47,7 @@
                     </div>
                     </div>
                 </div>
                 </div>
             </div>
             </div>
-            <EmptyData v-if="!Object.keys(openMgInfo).length" :top="-100"></EmptyData>
+            <EmptyData v-if="!Object.keys(openMgInfo).length" :top="270"></EmptyData>
             <div class="open-right-info" v-else>
             <div class="open-right-info" v-else>
                 <div class="open-info">
                 <div class="open-info">
                     <vuescroll>
                     <vuescroll>

+ 9 - 6
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -855,6 +855,9 @@ namespace TEAMModelOS.Controllers
                     //List<(int index ,string content, double count)> acount = new List<(int index,string content, double count)>();
                     //List<(int index ,string content, double count)> acount = new List<(int index,string content, double count)>();
                     for (int i = 0; i < ans.Count; i++)
                     for (int i = 0; i < ans.Count; i++)
                     {
                     {
+                        if (ans[i].Count == 0) {
+                            continue;
+                        }
                         var ac = ans[i].Where(a => a.Trim().Length > 0).ToList().Count;
                         var ac = ans[i].Where(a => a.Trim().Length > 0).ToList().Count;
                         var sc = standard[i].Count;
                         var sc = standard[i].Count;
                         //算分处理
                         //算分处理
@@ -1010,19 +1013,19 @@ namespace TEAMModelOS.Controllers
                         if ($"{scope}".Equals(Constant.ScopeStudent))
                         if ($"{scope}".Equals(Constant.ScopeStudent))
                         {
                         {
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
-                            activity.taskStatus = 1;
+                            activity.taskStatus = 0;
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
                         }
                         }
                         if ($"{scope}".Equals(Constant.ScopeTmdUser))
                         if ($"{scope}".Equals(Constant.ScopeTmdUser))
                         {
                         {
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
-                            activity.taskStatus = 1;
+                            activity.taskStatus = 0;
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                         }
                         }
                         if ($"{scope}".Equals(Constant.ScopeTeacher))
                         if ($"{scope}".Equals(Constant.ScopeTeacher))
                         {
                         {
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
-                            activity.taskStatus = 1;
+                            activity.taskStatus = 0;
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                         }
                         }
                     }
                     }
@@ -1031,19 +1034,19 @@ namespace TEAMModelOS.Controllers
                         if ($"{scope}".Equals(Constant.ScopeStudent))
                         if ($"{scope}".Equals(Constant.ScopeStudent))
                         {
                         {
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
-                            activity.taskStatus = 0;
+                            activity.taskStatus = 1;
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{school}-{userId}"));
                         }
                         }
                         if ($"{scope}".Equals(Constant.ScopeTmdUser))
                         if ($"{scope}".Equals(Constant.ScopeTmdUser))
                         {
                         {
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
-                            activity.taskStatus = 0;
+                            activity.taskStatus = 1;
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                         }
                         }
                         if ($"{scope}".Equals(Constant.ScopeTeacher))
                         if ($"{scope}".Equals(Constant.ScopeTeacher))
                         {
                         {
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
                             StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>(id.ToString(), new PartitionKey($"Activity-{userId}"));
-                            activity.taskStatus = 0;
+                            activity.taskStatus = 1;
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                         }
                         }
                     }
                     }

File diff suppressed because it is too large
+ 270 - 178
TEAMModelOS/Controllers/XTest/FixDataController.cs