JAELYS 4 роки тому
батько
коміт
f2b911ab77
25 змінених файлів з 1227 додано та 2806 видалено
  1. 1 1
      TEAMModelOS.SDK/DI/AzureCosmos/AzureCosmosFactory.cs
  2. 4 4
      TEAMModelOS/ClientApp/src/api/knowledge.js
  3. 39 55
      TEAMModelOS/ClientApp/src/api/learnActivity.js
  4. 5 21
      TEAMModelOS/ClientApp/src/api/newEvaluation.js
  5. 3 3
      TEAMModelOS/ClientApp/src/api/studentWeb.js
  6. 9 19
      TEAMModelOS/ClientApp/src/api/syllabus.js
  7. 1 2
      TEAMModelOS/Controllers/Common/ExamController.cs
  8. 417 0
      TEAMModelOS/Controllers/Common/HomeworkController.cs
  9. 514 0
      TEAMModelOS/Controllers/Common/LearnController.cs
  10. 21 19
      TEAMModelOS/Controllers/Common/SurveyController.cs
  11. 61 53
      TEAMModelOS/Controllers/Common/VoteController.cs
  12. 0 333
      TEAMModelOS/Controllers/Exam/ImportExerciseController.cs
  13. 3 3
      TEAMModelOS/Controllers/Syllabus/ItemInfoController.cs
  14. 1 1
      TEAMModelOS/Controllers/Exam/PaperController.cs
  15. 2 1
      TEAMModelOS/Controllers/School/CourseController.cs
  16. 0 235
      TEAMModelOS/Controllers/Syllabus/ResourceController.cs
  17. 52 322
      TEAMModelOS/Controllers/Syllabus/SyllabusController.cs
  18. 0 664
      TEAMModelOS/Controllers/Syllabus/VolumeController.cs
  19. 0 415
      TEAMModelOS/Controllers/Task/HomeworkController.cs
  20. 0 512
      TEAMModelOS/Controllers/Task/LearnController.cs
  21. 38 38
      TEAMModelOS/Controllers/Teacher/CommentController.cs
  22. 53 101
      TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs
  23. 1 1
      TEAMModelOS/Startup.cs
  24. 1 0
      TEAMModelOS/TEAMModelOS.csproj
  25. 1 3
      TEAMModelOS/appsettings.json

+ 1 - 1
TEAMModelOS.SDK/DI/AzureCosmos/AzureCosmosFactory.cs

@@ -57,7 +57,7 @@ namespace TEAMModelOS.SDK.DI
         {
             try
             {
-                var cm = CosmosClients.GetOrAdd(name, x => new CosmosClient(_optionsMonitor.Get(name).CosmosConnectionString, new CosmosClientOptions() { ApplicationRegion = region, SerializerOptions = new CosmosSerializationOptions() { PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase } }));
+                var cm = CosmosClients.GetOrAdd(name, x => new CosmosClient(_optionsMonitor.Get(name).CosmosConnectionString, new CosmosClientOptions() {  ApplicationRegion = region, SerializerOptions = new CosmosSerializationOptions() { PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase } }));
                 return cm;
             }
             catch (Exception e)

+ 4 - 4
TEAMModelOS/ClientApp/src/api/knowledge.js

@@ -2,17 +2,17 @@ import { post } from '@/api/http'
 export default {
     // 获取知识块知识点
     GetSchoolPoints: function(data) {
-        return post('/common/knowledge/find', data)
+        return post('/knowledge/find', data)
     },
     // 批量更新保存知识点知识块
     SaveOrUpdateKnowledge: function(data) {
-        return post('/common/knowledge/upsert-all', data)
+        return post('/knowledge/upsert-all', data)
     },
     SaveOrUpdateSchoolPoint: function(data) {
-        return post('/common/knowledge/SaveOrUpdateAllSchoolPoint', data)
+        return post('/knowledge/SaveOrUpdateAllSchoolPoint', data)
     },
     // 删除知识点知识块
     DeleteSchoolPoint: function(data) {
-        return post('/ /knowledge/delete', data)
+        return post('/knowledge/delete', data)
     },
 }

+ 39 - 55
TEAMModelOS/ClientApp/src/api/learnActivity.js

@@ -4,130 +4,119 @@ export default {
      *保存试卷
      */
     SaveExamPaper: function (data) {
-        return post('/school/Paper/upsert', data)
+        return post('/paper/upsert', data)
     },
     /*
      *查询试卷
      */
     FindExamPaper: function (data) {
-        return post('/school/Paper/find', data)
+        return post('/paper/find', data)
     },
     /*
      *删除试卷
      */
     DeleteExamPaper: function (data) {
-        return post('/school/Paper/delete', data)
+        return post('/paper/delete', data)
     },
     /*
      *删除评测信息
      */
     DeleteExamInfo: function (data) {
-        return post('/school/exam/delete', data)
+        return post('/common/exam/delete', data)
     },
     /*
      *保存评测
      */
     SaveExamInfo: function (data) {
-        return post('/school/exam/save', data)
+        return post('/common/exam/save', data)
     },
     /*
      *查询评测
      */
     FindExamInfo: function (data) {
-        return post('/school/exam/find', data)
+        return post('/common/exam/find', data)
     },
     /*
      *查询单个评测
      */
     FindExamInfos: function (data) {
-        return post('/school/exam/find-summary', data)
+        return post('/common/exam/find-summary', data)
     },
     /*
      *自动组题
      */
     Automatic: function (data) {
-        return post('/common/item/Automatic', data)
+        return post('/item/Automatic', data)
     },
     /*
      *保存最小单元
      */
     SaveUnit: function (data) {
-        return post('/teacher/learn/upsert-unit', data)
+        return post('/common/learn/upsert-unit', data)
     },
     /*
      *查询最小单元
      */
     FindUnit: function (data) {
-        return post('/teacher/learn/find-unit', data)
+        return post('/common/learn/find-unit', data)
     },
     /*
      *删除最小单元
      */
     DeleteUnit: function (data) {
-        return post('/teacher/learn/delete-unit', data)
-    },
-    /*
-    *根据id数组查询资源文件
-    */
-    FindSyllabusResourceById: function (data) {
-        return post('/api/Resource/findById', data)
-    },
-    /*
-    *根据id数组查询资源文件
-    */
-    FindQuestionById: function (data) {
-        return post('/api/ItemInfo/findByIds', data)
-    },
+        return post('/common/learn/delete-unit', data)
+    },   
+    
     /*
     *保存编序式学习活动
     */
     SaveOrderLearn: function (data) {
-        return post('/api/Learn/upsertProcess', data)
+        return post('/common/Learn/upsertProcess', data)
     },
     /*
     *查询编序式学习活动
     */
     FindOrderLearn: function (data) {
-        return post('/api/Learn/FindProcess', data)
+        return post('/common/Learn/FindProcess', data)
     },
 
     /*
     *保存或新增作答记录(学生作答数据)
     */
     upsertRecord: function (data) {
-        return post('/api/Learn/upsertRecord', data)
+        return post('/common/Learn/upsertRecord', data)
     },
 
     /*
     *查询编序作答记录
     */
     findRecord: function (data) {
-        return post('/api/Learn/findRecord', data)
+        return post('/common/Learn/findRecord', data)
     },
 
     /*
     *查询作业活动
     */
     SaveorUpdataHomeWork: function (data) {
-        return post('/teacher/homework/upsert', data)
+        return post('/common/homework/upsert', data)
     },
     /*
     *新增或者编辑作业活动
     */
     FindHomeWork: function (data) {
-        return post('/teacher/homework/find', data)
+        return post('/common/homework/find', data)
     },
     /*
     * 撤销发布作业
     */
     RevokeHomeWork: function (data) {
-        return post('/teacher/homework/cancel', data)
+        return post('/common/homework/cancel', data)
     },
     /*
     * 删除作业
     */
     DeleteHomeWork: function (data) {
-        return post('/teacher/homework/delete', data)
+        return post('/common/homework/delete', data)
     },
     /*
     * 查询老师课程下的所有班级
@@ -139,14 +128,14 @@ export default {
     * 查询作业下的所有学生数据
     */
     FindRecordByHwId: function (data) {
-        return post('/teacher/homework/find-record', data)
+        return post('/common/homework/find-record', data)
     },
 
 	/*
 	* 保存作业学生作答数据
 	*/
     SaveHwRecords: function (data) {
-        return post('/teacher/homework/upsert-record', data)
+        return post('/common/homework/upsert-record', data)
     },
 
     /*
@@ -172,13 +161,13 @@ export default {
     * 老师评分
     */
     TeacherScoring: function (data) {
-        return post('/teacher/homework/tch-score', data)
+        return post('/common/homework/tch-score', data)
     },
     /*
     * 打评语
     */
     SetComment: function (data) {
-        return post('/teacher/homework/tch-score', data)
+        return post('/common/homework/tch-score', data)
     },
     /*
     *新增或者编辑自主学子活动
@@ -190,86 +179,81 @@ export default {
     *查询自主学子活动
     */
     FindSelfLearn: function (data) {
-        return post('/api/Learn/FindLearningAutonomous', data)
+        return post('/common/Learn/FindLearningAutonomous', data)
     },
     /*
     *删除编序式活动
     */
     DeleteLeanProcess: function (data) {
-        return post('/api/Learn/DeleteProcess', data)
+        return post('/common/Learn/DeleteProcess', data)
     },
     /*
     * 新增或者修改投票活动
     */
     SaveorUpdataVote: function (data) {
-        return post('/school/vote/upsert', data)
+        return post('/common/vote/upsert', data)
     },
     /*
     * 查询投票活动
     */
     FindVote: function (data) {
-        return post('/school/vote/find', data)
+        return post('/common/vote/find', data)
     },
 
 	/*
 	* 保存作业学生作答数据
 	*/
     SaveVoteRecords: function (data) {
-        return post('/school/vote/upsert-record', data)
+        return post('/common/vote/upsert-record', data)
     },
     /*
     * 删除投票活动
     */
     DeleteVote: function (data) {
-        return post('/school/vote/delete', data)
+        return post('/common/vote/delete', data)
     },
     /*
     * 查询学生投票活动数据
     */
     FindRecordByVoteId: function (data) {
-        return post('/school/vote/find-record', data)
+        return post('/common/vote/find-record', data)
     },
 
 	/*
 	* 保存评测学生作答数据(分数)
 	*/
     UpsertAllRecord: function (data) {
-        return post('/school/exam/upsert-record-by-teacher', data)
+        return post('/common/exam/upsert-record-by-teacher', data)
     },
     /*
 	* 发布自主学习活动
 	*/
     UpsertTask: function (data) {
-        return post('/teacher/learn/upsert-task', data)
+        return post('/common/learn/upsert-task', data)
     },
     /*
 	* 查询学习活动
 	*/
     findTask: function (data) {
-        return post('/teacher/learn/find-task', data)
+        return post('/common/learn/find-task', data)
     },
     /*
 	* 删除/撤销学习任务
 	*/
     deleteTask: function (data) {
-        return post('/api/Learn/deleteTask', data)
+        return post('/common/Learn/deleteTask', data)
     },
     /*
      * 查询学生评测记录
      */
     FindSummaryRecord: function (data) {
-        return post('/api/Exam/findSummaryRecord', data)
-    },
-    /*
-     * 查询学生信息
-     */
-    FindStudent: function (data) {
-        return post('/api/Student/find', data)
+        return post('/common/Exam/findSummaryRecord', data)
     },
+    
     /*
      * 查询单个学生作答信息
      */
     FindAllStudent: function (data) {
-        return post('/school/exam/find-summary-record', data)
+        return post('/common/exam/find-summary-record', data)
     }
 }

+ 5 - 21
TEAMModelOS/ClientApp/src/api/newEvaluation.js

@@ -8,14 +8,14 @@ export default {
      * @param {any} data
      */
     SaveSingleExercise: function(data) {
-        return post('/common/item/upsert', data)
+        return post('/item/upsert', data)
     },
     /**
      * 批量更新保存试题
      * @param {any} data
      */
     SaveAllExercise: function(data) {
-        return post('/common/item/upsertAll', data)
+        return post('/item/upsertAll', data)
     },
 
     /**
@@ -23,31 +23,15 @@ export default {
      * @param {any} data
      */
     FindExerciseList: function(data) {
-        return post('/common/item/find', data)
-    },
-
-    /**
-     * 查找总数
-     * @param {any} data
-     */
-    FindCount: function(data) {
-        return post('/api/Common/FindCount', data)
-    },
-
-    /**
-     * 根据试题id集合获取题目
-     * @param {any} data
-     */
-    FindExerciseById: function(data) {
-        return post('/common/item/findByIds', data)
-    },
+        return post('/item/find', data)
+    },    
 
     /**
      * 删除试题
      * @param {any} data
      */
     DeleteExamItem: function(data) {
-        return post('/common/item/delete', data)
+        return post('/item/delete', data)
     }
 
 }

+ 3 - 3
TEAMModelOS/ClientApp/src/api/studentWeb.js

@@ -144,15 +144,15 @@ export default {
 
     //查询学生参与评量数据
     FindExamPaper: function (data) {
-        return post('/school/exam/find-all-by-student', data)
+        return post('/common/exam/find-all-by-student', data)
     },
     //查询学生的评量数据
     FindStudentPaper: function (data) {
-        return post('/school/exam/find-summary-by-student', data)
+        return post('/common/exam/find-summary-by-student', data)
     },
     //保存学生评量数据
     SaveStuExamPaper: function (data) {
-        return post('/school/exam/upsert-record', data)
+        return post('/common/exam/upsert-record', data)
     },
 
 }

+ 9 - 19
TEAMModelOS/ClientApp/src/api/syllabus.js

@@ -2,38 +2,28 @@ import { post } from '@/api/http'
 export default {
     // 更新册别
     SaveOrUpdateVolume: function(data) {
-        return post('/common/volume/upsert', data)
+        return post('/syllabus/upsert', data)
     },
     // 查找册别
     GetVolumes: function(data) {
-        return post('/common/volume/find', data)
+        return post('/syllabus/find', data)
     },
     // 删除册别
     DeleteVolume: function(data) {
-        return post('/common/volume/delete', data)
-    },
-    // 根据册别查找树形课纲
-    GetTreeByVolume: function(data) {
-        return post('/common/syllabus/find', data)
+        return post('/syllabus/delete', data)
     },
+    
     // 更新课纲树形结构
     SaveOrUpdateAsTree: function(data) {
-        return post('/common/syllabus/upsert-tree', data)
+        return post('/syllabus/upsert-tree', data)
     },
     // 更新节点
     SaveOrUpdateAsNodes: function(data) {
-        return post('/common/syllabus/upsert-nodes', data)
-    },
-    // 查找集合
-    FindCollection: function(data) {
-        return post('/api/Common/FindCollection', data)
-    },
-    // 查找册别数量
-    FindSyllabusCount: function(data) {
-        return post('/common/volume/count', data)
-    },
+        return post('/syllabus/upsert-nodes', data)
+    },    
+    
     // 查找知识块数量
     FindBlockCount: function (data) {
-        return post('/common/knowledge/count', data)
+        return post('/knowledge/count', data)
     },
 }

+ 1 - 2
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -599,8 +599,7 @@ namespace TEAMModelOS.Controllers
         //[AuthToken(Roles = "Teacher")]
         [HttpPost("find-summary-record")]
         public async Task<IActionResult> findSummaryRecord(JsonElement requert)
-        {
-            //ResponseBuilder builder = ResponseBuilder.custom();
+        {            
             //var (id, school) = HttpContext.GetAuthTokenInfo();
             try
             {

+ 417 - 0
TEAMModelOS/Controllers/Common/HomeworkController.cs

@@ -0,0 +1,417 @@
+
+using Azure.Cosmos;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.Models.Dto;
+using TEAMModelOS.SDK.Models;
+
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Helper.Common.StringHelper;
+
+namespace TEAMModelOS.Controllers.Learn
+{
+    // TODO 代码优化
+
+    /// <summary>
+    /// 作业活动
+    /// </summary>
+    /// 
+    [ProducesResponseType(StatusCodes.Status200OK)]
+    [ProducesResponseType(StatusCodes.Status400BadRequest)]
+    [Route("common/homework")]
+    [ApiController]
+    public class HomeworkController : ControllerBase
+    {
+        private readonly SnowflakeId _snowflakeId;
+        private readonly AzureCosmosFactory _azureCosmos;       
+        private readonly AzureServiceBusFactory _serviceBus;
+        public HomeworkController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus , SnowflakeId snowflakeId)
+        {
+            _azureCosmos = azureCosmos;            
+            _snowflakeId = snowflakeId;
+            _serviceBus = serviceBus;
+        }
+
+
+    //    /// <summary>
+    //    /// 撤消作业
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("cancel")]
+    //    public async Task<IActionResult> Cancel(JsonElement requert)
+    //    {
+    //        /* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+    //         //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+    //         var jwt = new JwtSecurityToken(id_token.GetString());
+    //         if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+    //         var id = jwt.Payload.Sub;
+    //         //var id = "03245d02-71ba-4e44-97dd-1e66c91bff6c";
+    //         //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
+    //         var client = _azureCosmos.GetCosmosClient();
+    //         //權限token
+    //        *//* jwt.Payload.TryGetValue("name", out object name);
+    //         jwt.Payload.TryGetValue("picture", out object picture);*//*
+    //         var response = await client.GetContainer("TEAMModelOSTemp", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"Homework-{id_token}"));
+    //         if (response.Status == 200)
+    //         {
+    //             using var json = await JsonDocument.ParseAsync(response.ContentStream);
+    //             int status = json.RootElement.GetProperty("status").GetInt32();
+    //         }
+    //         return Ok();*/
+    //        ResponseBuilder builder = ResponseBuilder.custom();
+    //        requert.TryGetProperty("id", out JsonElement homeWorkId);
+    //        List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
+
+    //        foreach (Homework homeWork in homeWorks)
+    //        {
+    //            homeWork.status = 100;
+    //        }
+    //        List<Homework> homeWorks1 = await _azureCosmos.UpdateAll<Homework>(homeWorks);
+
+    //        //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
+    //        List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
+    //        if (homeWorkStudents.IsNotEmpty())
+    //        {
+
+    //            //TODO 删除上传的文件
+    //            await _azureCosmos.DeleteAll(homeWorkStudents);
+    //        }
+    //        //return builder.Data(homeWorks1).build();
+    //        return Ok(homeWorks1);
+    //    }
+
+    //    /// <summary>
+    //    /// 删除作业
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("delete")]
+    //    public async Task<IActionResult> Delete(IdPk request)
+    //    {
+    //        //ResponseBuilder builder = ResponseBuilder.custom();
+    //        //IdPk idPk = await _azureCosmos.DeleteAsync<Homework>(request);
+    //        ////按作业id删除提交记录
+    //        //List<HomeworkRecord> homeWorkStudents =  await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", idPk.id } });
+    //        ////TODO 删除上传的文件
+    //        //await _azureCosmos.DeleteAll<HomeworkRecord>(homeWorkStudents);
+    //        ////return builder.Data(idPk).build();
+    //        //return Ok(idPk);
+    //    }
+
+
+    //    /// <summary>
+    //    /// 新增或修改 作业活动 同时创建关联关系表
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("upsert")]
+    //    public async Task<IActionResult> Upsert(HomeworkDto request)
+    //    {
+    //        ResponseBuilder builder = ResponseBuilder.custom();
+    //        //新增
+    //        var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
+    //        if (string.IsNullOrEmpty(request.homeWork.id))
+
+    //        {
+    //            request.homeWork.code = "Homework-" + id;
+    //            request.homeWork.id = _snowflakeId.NextId()+"";
+    //            request.homeWork.status = 100;
+    //            request.reset = true;
+    //            request.homeWork.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+    //        }
+
+            
+    //        /*if (request.homeWork.publishModel.Equals("0"))
+    //        {
+    //            request.homeWork.startTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+    //            request.homeWork.status = 200;
+    //        }
+    //        else if (request.homeWork.publishModel.Equals("1"))
+    //        {
+    //            //TimerWork<HomeWork>(request.@params.homeWork.startTime,new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
+    //            //设定开始时间
+    //            string msgId = _snowflakeId.NextId() + "";
+    //            long SequenceNumber =  await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, request.homeWork.id, request.homeWork.code, request.homeWork.startTime,"going", msgId);
+    //            request.homeWork.sequenceNumber = SequenceNumber;
+
+    //            //serviceBusReviceService.ReciveMessageAsync();
+    //            //await _serviceBus.ReciveMessageAsync<Homework>(Constants.SubName);
+    //            //_timerWorkService.TimerWork<Homework>(request.@params.homeWork.startTime,200, new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
+    //        }*/
+
+    //        if (request.homeWork.status == 0) {
+
+    //            if (request.homeWork.startTime < DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()) request.homeWork.status = 200;
+    //            else  request.homeWork.status = 100;
+    //        }
+
+    //        Homework homeWork = await _azureCosmos.SaveOrUpdate<Homework>(request.homeWork);
+
+    //        //设定结束时间
+    //        /*string msgEndId = _snowflakeId.NextId() + "";
+    //        await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, request.homeWork.id, request.homeWork.code, request.homeWork.endTime);*/
+    //        //_timerWorkService.TimerWork<Homework>(request.@params.homeWork.endTime, 300, new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
+    //        //清除作业
+    //        if (request.reset)
+    //        {
+    //            //根据作业发布对象查找到每一个具体学生生成关联关系表 HomeWorkStudent
+    //          //  List<Target> targets = request.@params.homeWork.target;
+    //            //List<HomeworkRecord> homeWorkStudents = new List<HomeworkRecord>();
+    //           // foreach (Target target in targets)
+    //           // {
+    //                //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
+    //                List<HomeworkRecord> homeWorks = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", request.homeWork.id } });
+    //                if (homeWorks.IsNotEmpty())
+    //                {
+    //                    await _azureCosmos.DeleteAll(homeWorks);
+    //                }
+    //                //List<ClassStudent> classroom = await _cosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", target.classroomCode }});
+    //                //if (classroom.IsNotEmpty())
+    //                //{
+                        
+    //                //    foreach (ClassStudent student in classroom)
+    //                //    {
+    //                //        HomeworkRecord homeWorkStudent = new HomeworkRecord();
+    //                //        homeWorkStudent.code = student.code;
+    //                //        homeWorkStudent.id = request.@params.homeWork.id;
+    //                //        homeWorkStudent.classroom.code = target.classroomCode;
+    //                //        homeWorkStudent.classroom.name = target.classroomName;
+    //                //        homeWorkStudents.Add(homeWorkStudent);
+    //                //    }
+                        
+    //                //}
+    //            //}
+    //            //if (homeWorkStudents.IsNotEmpty())
+    //            //{
+    //            //    foreach (HomeworkRecord homeWorkStudents1 in homeWorkStudents)
+    //            //    {
+    //            //        List<Student> student = await _cosmos.FindById<Student>(homeWorkStudents1.code);//FindByDict<Student>(new Dictionary<string, object> { { "id", homeWorkStudents1.studentId } });
+    //            //        if (student.IsNotEmpty())
+    //            //        {
+                          
+    //            //            homeWorkStudents1.code = student[0].studentId;
+    //            //          //  homeWorkStudents1.nativeroom.code = student[0].classroomCode;
+    //            //        }
+    //            //    }
+    //            //    await _cosmos.SaveOrUpdateAll<HomeworkRecord>(homeWorkStudents);
+    //            //}
+    //        }
+    //        //return builder.Data(homeWork).build();
+    //        return Ok(homeWork);
+    //    }
+
+    //    /// <summary>
+    //    /// 新增或修改学生作业关联表
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("upsert-record")]
+    //    public async Task<IActionResult> UpsertRecord(List<HomeworkRecord> request)
+    //    {
+    //        //ResponseBuilder builder = ResponseBuilder.custom();
+    //        await _azureCosmos.SaveOrUpdateAll<HomeworkRecord>(request);
+    //        //return builder.Data(request).build();
+    //        return Ok(request);
+    //    }
+
+    //    /// <summary>
+    //    /// 查询作业活动
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("find")]
+    //    public async Task<IActionResult> Find(JsonElement request)
+    //    {
+
+    //        ResponseBuilder builder = ResponseBuilder.custom();
+    //        List<Homework> data = new List<Homework>();
+    //        List<HomeworkFindDto> homeWorkFindDtos = new List<HomeworkFindDto>();
+    //        if (StringHelper.getKeyCount(request) > 0)
+    //        {
+    //            data = await _azureCosmos.FindByDict<Homework>(request);
+    //            //判断作业提交信息
+    //            if (data.IsNotEmpty())
+    //            {
+    //                foreach (Homework homeWork in data)
+    //                {
+    //                    //HomeworkFindDto homeWorkFindDto = new HomeworkFindDto();
+    //                    List<string> pro = new List<string>();
+    //                    pro.Add("submit");
+    //                    List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(dict: new Dictionary<string, object> { { "id", homeWork.id } }, propertys: pro);
+    //                    int sub = 0;
+    //                    Dictionary<string, object> dict = new Dictionary<string, object>();
+    //                    dict.Add("Sum", homeWorkStudents.Count);
+    //                    dict.Add("Finish", sub);
+    //                    HomeworkFindDto homeWorkFindDto = homeWork.ToJsonString().ToObject<HomeworkFindDto>();
+    //                    homeWorkFindDto.statistics = dict;
+    //                    homeWorkFindDtos.Add(homeWorkFindDto);
+    //                }
+    //            }
+    //        }
+    //        else
+    //        {
+    //            ///return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
+    //            return Ok("参数异常!");
+    //        }
+    //        //return builder.Data(homeWorkFindDtos).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
+    //        return Ok(new { homeWorkFindDtos, data.Count });
+    //    }
+
+    //    /// <summary>
+    //    /// 查询作业学生关联
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("find-record")]
+    //    public async Task<IActionResult> FindRecord(JsonElement requert)
+    //    {
+    //        var client = _azureCosmos.GetCosmosClient();
+    //        //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+    //        //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
+    //        if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+    //        var jwt = new JwtSecurityToken(id_token.GetString());
+    //        if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+    //        var id = jwt.Payload.Sub;
+
+    //        List<object> records = new List<object>();
+    //        var query = $"select c.id,c.classroom,c.submit, c.submitTime,c.score,c.content,c.stuCmt,c.tchCmt from c where id = {id}";
+    //        await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"HomeworkRecord-{id}") }))
+    //        {
+    //            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())
+    //                {
+    //                    records.Add(obj.ToObject<object>());
+    //                }
+    //            }
+    //        }
+
+    //        return Ok(new { records });
+    //        /*ResponseBuilder builder = ResponseBuilder.custom();
+    //        List<HomeworkRecord> data = new List<HomeworkRecord>();
+
+    //        if (StringHelper.getKeyCount(request) > 0)
+    //        {
+    //            data = await _azureCosmos.FindByDict<HomeworkRecord>(request);
+    //        }
+    //        else
+    //        {
+    //            return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
+    //        }
+    //        return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
+    //    }
+
+
+
+
+    //    /// <summary>
+    //    /// 教师作业打分评论
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("tch-score")]
+    //    public async Task<IActionResult> TchScore(HomeworkScoringDto request)
+    //    {
+    //        ResponseBuilder builder = ResponseBuilder.custom();
+    //        List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", request.studentId }, { "id", request.homeWorkId } });
+    //        HomeworkRecord data = new HomeworkRecord();
+    //        if (homeWorkStudents.IsNotEmpty())
+    //        {
+
+    //            homeWorkStudents[0].score = request.score ?? homeWorkStudents[0].score;
+    //            HomeWorkComment homeWorkComment = new HomeWorkComment
+    //            {
+    //                comment = request.comments,
+    //                createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+    //                TEAMModelId = request.TEAMModelId
+    //            };
+
+    //            homeWorkStudents[0].tchCmt = homeWorkComment;
+    //            data = await _azureCosmos.SaveOrUpdate(homeWorkStudents[0]);
+    //        }
+    //        //return builder.Data(data).build();
+    //        return Ok(data);
+    //    }
+
+
+
+    //    /// <summary>
+    //    /// 学生作业打分评论
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <returns></returns>
+    //    [ProducesDefaultResponseType]
+    //    [HttpPost("stu-score")]
+    //    public async Task<IActionResult> StuScore(HomeworkCommentDto request)
+    //    {
+    //        ResponseBuilder builder = ResponseBuilder.custom();
+    //        List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", request.studentId }, { "id", request.homeWorkId } });
+    //        List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", request.homeWorkId } });
+    //        HomeworkRecord data = new HomeworkRecord();
+    //        if (homeWorks.IsNotEmpty() && homeWorks[0].other.Contains("comment"))
+    //        {
+    //            if (homeWorkStudents.IsNotEmpty())
+    //            {
+    //                if (string.IsNullOrEmpty(request.commentid))
+    //                {
+    //                    //评论
+    //                    StudentComment homeWorkComment = new StudentComment
+    //                    {
+    //                        commentid = _snowflakeId.NextId() + "",
+    //                        comment = request.comment,
+    //                        createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+    //                        fromId = request.fromId,
+    //                        score = request.score
+    //                    };
+
+
+    //                    homeWorkStudents[0].stuCmt.Add(homeWorkComment);
+    //                }
+    //                else
+    //                {
+    //                    //回复评论
+    //                    foreach (StudentComment comment in homeWorkStudents[0].stuCmt)
+    //                    {
+    //                        if (comment.commentid == request.commentid)
+    //                        {
+    //                            Reply reply = new Reply();
+    //                            reply.fromId = request.fromId;
+    //                            reply.toId = request.toId;
+    //                            reply.identity = request.identity;
+    //                            reply.comment = request.comment;
+    //                            reply.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+    //                            comment.reply.Add(reply);
+    //                        }
+    //                    }
+    //                }
+    //                data = await _azureCosmos.Update(homeWorkStudents[0]);
+    //            }
+    //            //return builder.Data(data).build();
+    //            return Ok(data);
+    //        }
+    //        else {
+    //            //return builder.Error(ResponseCode.FAILED, "未开放互评!").build();
+    //            return Ok("未开放互评!");
+    //        } 
+    //    }
+    }
+}

+ 514 - 0
TEAMModelOS/Controllers/Common/LearnController.cs

@@ -0,0 +1,514 @@
+using Azure.Cosmos;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.IO;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Models;
+
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK.Context.Constant.Common;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Helper.Common.StringHelper;
+using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
+
+namespace TEAMModelOS.Controllers.Learn
+{
+    // TODO 代码优化
+
+    /// <summary>
+    /// 学习活动
+    /// </summary>
+    [ProducesResponseType(StatusCodes.Status200OK)]
+    [ProducesResponseType(StatusCodes.Status400BadRequest)]
+    [Route("common/learn")]
+    [ApiController]
+    public class LearnController: ControllerBase
+    {
+        private readonly SnowflakeId _snowflakeId;
+        private readonly AzureCosmosFactory _azureCosmos;
+        private readonly AzureServiceBusFactory _serviceBus;
+        public LearnController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId)
+        {
+            _snowflakeId = snowflakeId;
+            _serviceBus = serviceBus;
+            _azureCosmos = azureCosmos;
+        }
+
+//        /// <summary>
+//        /// 保存或更新学习任务
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("upsert-task")]
+//        public async Task<IActionResult> UpsertTask(LearnTask request)
+//        {
+//            /*//if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+//            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
+//            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+//           *//* var jwt = new JwtSecurityToken(id_token.GetString());
+//            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+//            var id = jwt.Payload.Sub;*//*
+
+//            var client = _azureCosmos.GetCosmosClient();
+//            var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(id.ToString(), new PartitionKey($"LearnTask-{id}"));
+//            if (response.Status == 200)
+//            {
+//                using var json = await JsonDocument.ParseAsync(response.ContentStream);
+              
+//            }
+//            else
+//            {
+//                //如果沒有,則初始化LearnTask
+//                requert.TryGetProperty("endTime", out JsonElement endTime);
+//                requert.TryGetProperty("status", out JsonElement status);
+//                requert.TryGetProperty("type", out JsonElement type);
+//                requert.TryGetInt64(out long createTime);
+//                requert.TryGetProperty("stage", out JsonElement stage);
+//                requert.TryGetProperty("passScore", out JsonElement passScore);
+
+//                if (createTime <= 0)
+//                {
+//                    createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//                }
+
+//                if (endTime.GetInt64() > 0)
+//                {
+//                    //设定结束时间
+//                    string msgEndId = _snowflakeId.NextId() + "";
+//                    await _serviceBus.GetServiceBusClient().SendLeamMessage<LearnTask>(Constants.TopicName, id, $"LearnTask-{id}", endTime.GetInt64(), 300, msgEndId);
+//                }
+
+//                using var stream = new MemoryStream();
+//                using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
+//                writer.WriteStartObject();
+//                writer.WriteString("code", $"LearnTask-{id}");
+//                writer.WriteString("id", id.ToString());
+//                writer.WriteNumber("endTime", endTime.GetInt64());
+//                writer.WriteNumber("status", status.GetInt32());
+//                writer.WriteNumber("type", type.GetInt32());
+//                writer.WriteNumber("stage", stage.GetInt32());
+//                writer.WriteNumber("createTime", createTime);
+//                writer.WriteNumber("passScore", passScore.GetInt32());
+//                writer.WriteEndObject();
+//                writer.Flush();
+//                //Debug
+//                //string teacher = Encoding.UTF8.GetString(stream.ToArray());
+//                response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemStreamAsync(stream, new PartitionKey($"LearnTask-{id}"));
+//            }*/
+//            var client = _azureCosmos.GetCosmosClient();
+//            LearnTask learnTask;            
+//            request.pk = typeof(LearnTask).Name;
+//            if (string.IsNullOrEmpty(request.id))
+//            {
+//                request.id = _snowflakeId.NextId() + "";
+//                request.code = typeof(LearnTask).Name + "-" + request.code;
+//                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//                learnTask = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"{request.code}"));
+//                //await _azureCosmos.Save(request);
+//            }
+//            else
+//            {
+//                learnTask = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
+//                //await _azureCosmos.Update(request);
+//            }
+
+//            return Ok(new { learnTask });
+
+//            /* ResponseBuilder builder = ResponseBuilder.custom();
+//             if (request.createTime <= 0) {
+//                 request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//             }
+
+//             if (request.endTime > 0) {
+//                 //设定结束时间
+//                 string msgEndId = _snowflakeId.NextId()+"";
+//                 await _serviceBus.GetServiceBusClient().SendLeamMessage<LearnTask>(Constants.TopicName, request.id, request.code, request.endTime, 300, msgEndId);
+//             }
+//             await _azureCosmos.Save(request);
+//             return builder.Data(request).build();*/
+//        }
+
+//        /// <summary>
+//        /// 查询学习任务
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("find-task")]
+//        public async Task<IActionResult> FindTask(JsonElement requert)
+//        {
+
+//            var client = _azureCosmos.GetCosmosClient();
+//            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
+//            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
+///*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+//            var jwt = new JwtSecurityToken(id_token.GetString());
+//            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+//            var id = jwt.Payload.Sub;*/
+
+//            List<object> tasks = new List<object>();
+//            var query = $"select c.id,c.endTime,c.status, c.type,c.createTime,c.stage,c.passScore from c";
+//            await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnTask-{id}") }))
+//            {
+//                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())
+//                    {
+//                        tasks.Add(obj.ToObject<object>());
+//                    }
+//                }
+//            }
+
+//            return Ok(new { tasks });
+//            /*ResponseBuilder builder = ResponseBuilder.custom();
+//            if (request.TryGetProperty("id",out _) || request.TryGetProperty("code",out _))
+//            {
+//                List<LearnTask> tasks = await _azureCosmos.FindByDict<LearnTask>(request);
+//                return builder.Data(tasks).build();
+//            }
+//            else {
+//                return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build(); 
+//            }*/
+
+//        }
+//        /// <summary>
+//        /// 删除学习任务
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("delete-task")]
+//        public async Task<IActionResult> DeleteTask(IdPk request)
+//        {
+//            ResponseBuilder builder = ResponseBuilder.custom();
+//            return Ok(await _azureCosmos.DeleteAsync<LearnTask>(request));
+//        }
+
+//        /// <summary>
+//        /// 保存或更新学习单元单元
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("upsert-unit")]
+//        public async Task<IActionResult> UpsertUnit(LearnUnit request)
+//        {
+
+//            var client = _azureCosmos.GetCosmosClient();
+//            LearnUnit learnUnit;            
+//            request.pk = typeof(LearnUnit).Name;
+//            if (string.IsNullOrEmpty(request.id))
+//            {
+//                request.id = _snowflakeId.NextId() + "";               
+//                request.code = typeof(LearnUnit).Name + "-" + request.code;
+//                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//                learnUnit = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"{request.code}"));
+//                //await _azureCosmos.Save(request);
+//            }
+//            else
+//            {
+//                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//                learnUnit = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
+//                //await _azureCosmos.Update(request);
+//            }
+
+//            return Ok(new { learnUnit });
+//            /*if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+//            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+//            var jwt = new JwtSecurityToken(id_token.GetString());
+//            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+//            var id = jwt.Payload.Sub;
+
+//            var client = _azureCosmos.GetCosmosClient();
+//            var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"LearnUnit-{id}"));
+//            if (response.Status == 200)
+//            {
+//                using var json = await JsonDocument.ParseAsync(response.ContentStream);
+
+//            }
+//            else
+//            {
+//                //如果沒有,則初始化LearnTask
+//                requert.TryGetProperty("endTime", out JsonElement endTime);
+//                requert.TryGetProperty("status", out JsonElement status);
+//                requert.TryGetProperty("type", out JsonElement type);
+//                //requert.TryGetInt64(out long createTime);
+//                requert.TryGetProperty("stage", out JsonElement stage);
+//                requert.TryGetProperty("passScore", out JsonElement passScore);
+//                long createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//                using var stream = new MemoryStream();
+//                using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
+//                writer.WriteStartObject();
+//                writer.WriteString("code", $"LearnUnit-{id}");
+//                writer.WriteString("id", id);
+//                writer.WriteNumber("endTime", endTime.GetInt64());
+//                writer.WriteNumber("status", status.GetInt32());
+//                writer.WriteNumber("type", type.GetInt32());
+//                writer.WriteNumber("stage", stage.GetInt32());
+//                writer.WriteNumber("createTime", createTime);
+//                writer.WriteNumber("passScore", passScore.GetInt32());
+//                writer.WriteEndObject();
+//                writer.Flush();
+//                //Debug
+//                //string teacher = Encoding.UTF8.GetString(stream.ToArray());
+//                response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemStreamAsync(stream, new PartitionKey($"LearnUnit-{id}"));
+//            }
+
+//            return Ok();*/
+//            /*ResponseBuilder builder = ResponseBuilder.custom();
+//            if (string.IsNullOrEmpty(request.id))
+//            {
+//                request.id = _snowflakeId.NextId() + "";
+//                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//                await _azureCosmos.Save(request);
+//            }
+//            else
+//            {
+//                await _azureCosmos.Update(request);
+//            }
+//            return builder.Data(request).build();*/
+//        }
+
+
+
+//        /// <summary>
+//        /// 查询学习单元
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("find-unit")]
+//        public async Task<IActionResult> FindUnit(JsonElement requert)
+//        {
+
+//            var client = _azureCosmos.GetCosmosClient();
+//            if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
+//            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
+///*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+//            var jwt = new JwtSecurityToken(id_token.GetString());
+//            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+//            var id = jwt.Payload.Sub;*/
+
+//            List<object> units = new List<object>();
+//            var query = $"select c.id,c.resource,c.item, c.name,c.createTime from c";
+//            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnUnit-{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())
+//                    {
+//                        units.Add(obj.ToObject<object>());
+//                    }
+//                }
+//            }
+
+//            return Ok(new { units });
+
+//            /*ResponseBuilder builder = ResponseBuilder.custom();
+
+//            if (StringHelper.getKeyCount(request) > 0)
+//            {
+//                return builder.Data(await _azureCosmos.FindByDict<LearnUnit>(request)).build();
+//            }
+//            else {
+//                return builder.build();
+//            }*/
+
+//        }
+//        /// <summary>
+//        /// 删除学习单元
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("delete-unit")]
+//        public async Task<IActionResult> DeleteUnit(IdPk request)
+//        {
+//            ResponseBuilder builder = ResponseBuilder.custom();
+//            return Ok(await _azureCosmos.DeleteAsync<LearnUnit>(request));
+//        }
+
+//        /// <summary>
+//        /// 保存或新增编序学习活动
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("upsert-process")]
+//        public async Task<IActionResult> UpsertProcess(LearnProcess request) {
+//            //ResponseBuilder builder = ResponseBuilder.custom();
+//            var client = _azureCosmos.GetCosmosClient();
+//            LearnProcess learnProcess;            
+//            request.pk = typeof(LearnProcess).Name;
+//            if (string.IsNullOrEmpty(request.id))
+//            {
+//                request.id = _snowflakeId.NextId() + "";
+//                request.code = typeof(LearnProcess).Name + "-" + request.code;
+//                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+//                learnProcess = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"LearnProcess-{request.code}"));
+//               // await _azureCosmos.Save<LearnProcess>(request);
+//            }
+//            else {
+//                learnProcess = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id,new PartitionKey($"{request.code}"));
+//                //await _azureCosmos.Update<LearnProcess>(request);
+//            }
+           
+//            return Ok(new { learnProcess });
+//        }
+
+//        /// <summary>
+//        /// 查询编序学习活动
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("find-process")]
+//        public async Task<IActionResult> FindProcess(JsonElement requert)
+//        {
+
+//            var client = _azureCosmos.GetCosmosClient();
+//            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
+//            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
+///*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+//            var jwt = new JwtSecurityToken(id_token.GetString());
+//            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+//            var id = jwt.Payload.Sub;*/
+
+//            List<object> process = new List<object>();
+//            var query = $"select c.id,c.name,c.subjectCode, c.periodCode,c.Introduce from c where id = {id}";
+//            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnProcess-{id}") }))
+//            {
+//                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())
+//                    {
+//                        process.Add(obj.ToObject<object>());
+//                    }
+//                }
+//            }
+
+//            return Ok(new { process });
+//            /* ResponseBuilder builder = ResponseBuilder.custom();
+
+//            if (StringHelper.getKeyCount(request) > 0) {
+
+//                builder.Data(await _azureCosmos.FindByDict<LearnProcess>(request));
+//            }
+
+//            return builder.build();*/
+//        }
+
+//        /// <summary>
+//        /// 删除编序学习活动
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("delete-process")]
+//        public async Task<IActionResult> DeleteProcess(IdPk request)
+//        {
+//            //ResponseBuilder builder = ResponseBuilder.custom();
+//            if (request != null)
+//            {
+//                await _azureCosmos.DeleteAsync<LearnProcess>(request);
+//            }
+//            return Ok(request);
+//        }
+
+//        /// <summary>
+//        /// 保存或新增作答记录
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("upsert-record")]
+//        public async Task<IActionResult> UpsertRecord(List<LearnRecord> request)
+//        {
+//            //ResponseBuilder builder = ResponseBuilder.custom();
+//            List<LearnRecord> leanProcesses = null;
+//            if (ValidateHelper.IsValid(request))
+//            {
+//                request.ForEach(c => {
+//                    if (string.IsNullOrEmpty(c.id)) {
+//                        c.code = typeof(LearnRecord).Name + "-" + c.code;
+//                    }
+//                });
+//                leanProcesses = await _azureCosmos.SaveOrUpdateAll<LearnRecord>(request);
+//                //builder.Data(leanProcesses);
+//            }
+//            return Ok(leanProcesses);
+//        }
+
+//        /// <summary>
+//        /// 查询编序作答记录
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("find-record")]
+//        public async Task<IActionResult> FindRecord(JsonElement requert)
+//        {
+
+//            var client = _azureCosmos.GetCosmosClient();
+//            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
+//            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
+///*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+//            var jwt = new JwtSecurityToken(id_token.GetString());
+//            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+//            var id = jwt.Payload.Sub;*/
+
+//            List<object> records = new List<object>();
+//            var query = $"select c.id,c.steps from c where id = {id}";
+//            await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnRecord-{id}") }))
+//            {
+//                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())
+//                    {
+//                        records.Add(obj.ToObject<object>());
+//                    }
+//                }
+//            }
+
+//            return Ok(new { records });
+//           /* ResponseBuilder builder = ResponseBuilder.custom();
+//            if (StringHelper.getKeyCount(request) > 0)
+//            {
+//                builder.Data(await _azureCosmos.FindByDict<LearnRecord>(request));
+//            }
+//            return builder.build();*/
+//        }
+
+
+//        /// <summary>
+//        /// 删除作答记录
+//        /// </summary>
+//        /// <param name="request"></param>
+//        /// <returns></returns>
+//        [ProducesDefaultResponseType]
+//        [HttpPost("delete-record")]
+//        public async Task<IActionResult> DeleteRecord(IdPk request)
+//        {
+//            //ResponseBuilder builder = ResponseBuilder.custom();
+//            if (request != null)
+//            {
+//               await _azureCosmos.DeleteAsync<LearnRecord>(request);
+//            }
+//            return Ok(request);
+//        }
+    }
+}

+ 21 - 19
TEAMModelOS/Controllers/Common/SurveyController.cs

@@ -410,8 +410,10 @@ namespace TEAMModelOS.Controllers
             //return builder.build();
         }
 
+        // TODO 代码优化
+
         /// <summary>
-        /// 撤消投票
+        /// 撤消问卷
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
@@ -419,24 +421,24 @@ namespace TEAMModelOS.Controllers
         [HttpPost("cancel")]
         public async Task<IActionResult> Cancel(JsonElement request)
         {
-            request.TryGetProperty("id", out JsonElement surveyId);
-            ResponseBuilder builder = ResponseBuilder.custom();
-            List<Survey> surveys = await _azureCosmos.FindByDict<Survey>(new Dictionary<string, object> { { "id", surveyId } });
-
-            foreach (Survey survey in surveys)
-            {
-                survey.status = 100;
-                survey.progress = "pending";
-            }
-            List<Survey> survey1 = await _azureCosmos.UpdateAll<Survey>(surveys);
-
-            //查询之前是否有 关联关系表  有则删除
-            List<SurveyRecord> surveyStudents = await _azureCosmos.FindByDict<SurveyRecord>(new Dictionary<string, object> { { "id", surveyId } });
-            if (surveyStudents.IsNotEmpty())
-            {
-                await _azureCosmos.DeleteAll(surveyStudents);
-            }
-            return Ok(survey1);
+            //request.TryGetProperty("id", out JsonElement surveyId);
+            //ResponseBuilder builder = ResponseBuilder.custom();
+            //List<Survey> surveys = await _azureCosmos.FindByDict<Survey>(new Dictionary<string, object> { { "id", surveyId } });
+
+            //foreach (Survey survey in surveys)
+            //{
+            //    survey.status = 100;
+            //    survey.progress = "pending";
+            //}
+            //List<Survey> survey1 = await _azureCosmos.UpdateAll<Survey>(surveys);
+
+            ////查询之前是否有 关联关系表  有则删除
+            //List<SurveyRecord> surveyStudents = await _azureCosmos.FindByDict<SurveyRecord>(new Dictionary<string, object> { { "id", surveyId } });
+            //if (surveyStudents.IsNotEmpty())
+            //{
+            //    await _azureCosmos.DeleteAll(surveyStudents);
+            //}
+            return Ok();
         }
 
         /// <summary>

+ 61 - 53
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -26,7 +26,7 @@ namespace TEAMModelOS.Controllers.Learn
     [ProducesResponseType(StatusCodes.Status200OK)]
     [ProducesResponseType(StatusCodes.Status400BadRequest)]
     //[Authorize(Roles = "IES5")]
-    [Route("school/vote")]
+    [Route("common/vote")]
     [ApiController]
     public class VoteController : ControllerBase
     {
@@ -332,6 +332,8 @@ namespace TEAMModelOS.Controllers.Learn
             //return builder.build();
         }
 
+        // TODO 优化代码
+
         /// <summary>
         /// 撤消投票
         /// </summary>
@@ -341,27 +343,30 @@ namespace TEAMModelOS.Controllers.Learn
         [HttpPost("cancel")]
         public async Task<IActionResult> Cancel(JsonElement request)
         {
-            request.TryGetProperty("id", out JsonElement voteId);
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            List<Vote> votes = await _azureCosmos.FindByDict<Vote>(new Dictionary<string, object> { { "id", voteId } });
-
-            foreach (Vote vote in votes)
-            {
-                vote.status = 100;
-                vote.progress = "pending";
-            }
-            List<Vote> vote1 = await _azureCosmos.UpdateAll<Vote>(votes);
-
-            //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
-            List<VoteRecord> voteStudents = await _azureCosmos.FindByDict<VoteRecord>(new Dictionary<string, object> { { "id", voteId } });
-            if (voteStudents.IsNotEmpty())
-            {
-                await _azureCosmos.DeleteAll(voteStudents);
-            }
-            //return builder.Data(vote1).build();
-            return Ok(vote1);
+            //request.TryGetProperty("id", out JsonElement voteId);
+            ////ResponseBuilder builder = ResponseBuilder.custom();
+            //List<Vote> votes = await _azureCosmos.FindByDict<Vote>(new Dictionary<string, object> { { "id", voteId } });
+
+            //foreach (Vote vote in votes)
+            //{
+            //    vote.status = 100;
+            //    vote.progress = "pending";
+            //}
+            //List<Vote> vote1 = await _azureCosmos.UpdateAll<Vote>(votes);
+
+            ////查询之前是否有 关联关系表 HomeWorkStudent 有则删除
+            //List<VoteRecord> voteStudents = await _azureCosmos.FindByDict<VoteRecord>(new Dictionary<string, object> { { "id", voteId } });
+            //if (voteStudents.IsNotEmpty())
+            //{
+            //    await _azureCosmos.DeleteAll(voteStudents);
+            //}
+            ////return builder.Data(vote1).build();
+            //return Ok(vote1);
+            return Ok();
         }
 
+        // TODO 代码优化
+
         /// <summary>
         /// 查询 投票 学生关联
         /// </summary>
@@ -371,39 +376,42 @@ namespace TEAMModelOS.Controllers.Learn
         [HttpPost("find-record")]
         public async Task<IActionResult> FindRecord(JsonElement request)
         {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            List<VoteRecord> data = new List<VoteRecord>();
-            List<Options> options = new List<Options>();
-
-            if (StringHelper.getKeyCount(request) > 0)
-            {
-                data = await _azureCosmos.FindByDict<VoteRecord>(request);
-                if (data.IsNotEmpty()) {
-                    List< Vote > votes = await _azureCosmos.FindByDict<Vote>(new Dictionary<string, object> { { "id", data[0].id } });
-                    List<OptionsVote> options2 = votes[0].options;
-                    foreach (IGrouping<string, VoteRecord> voteStudents in data.GroupBy(x => x.option))
-                    {
-                        Options options1 = new Options();
-                        options1.optionKey = voteStudents.Key;
-                        options2.ForEach(x => { if (x.code == voteStudents.Key) options1.optionValue = x.value; });
-                        if(options1.optionValue == null) options1.optionValue = "Null";
-                        foreach (VoteRecord voteStudent in voteStudents)
-                        {
-                            options1.students.Add(voteStudent);
-                        }
-                        options.Add(options1);
-                    }
-                }
-            }
-            else
-            {
-                //return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
-                return Ok("参数异常!");
-            }
-            //return builder.Data(options).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
-            return Ok(new { options, data.Count });
+            //ResponseBuilder builder = ResponseBuilder.custom();
+            //List<VoteRecord> data = new List<VoteRecord>();
+            //List<Options> options = new List<Options>();
+
+            //if (StringHelper.getKeyCount(request) > 0)
+            //{
+            //    data = await _azureCosmos.FindByDict<VoteRecord>(request);
+            //    if (data.IsNotEmpty()) {
+            //        List< Vote > votes = await _azureCosmos.FindByDict<Vote>(new Dictionary<string, object> { { "id", data[0].id } });
+            //        List<OptionsVote> options2 = votes[0].options;
+            //        foreach (IGrouping<string, VoteRecord> voteStudents in data.GroupBy(x => x.option))
+            //        {
+            //            Options options1 = new Options();
+            //            options1.optionKey = voteStudents.Key;
+            //            options2.ForEach(x => { if (x.code == voteStudents.Key) options1.optionValue = x.value; });
+            //            if(options1.optionValue == null) options1.optionValue = "Null";
+            //            foreach (VoteRecord voteStudent in voteStudents)
+            //            {
+            //                options1.students.Add(voteStudent);
+            //            }
+            //            options.Add(options1);
+            //        }
+            //    }
+            //}
+            //else
+            //{
+            //    //return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
+            //    return Ok("参数异常!");
+            //}
+            ////return builder.Data(options).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
+            //return Ok(new { options, data.Count });
+            return Ok();
         }
 
+        // TODO 代码优化
+
         /// <summary>
         /// 学生投票
         /// </summary>
@@ -413,8 +421,8 @@ namespace TEAMModelOS.Controllers.Learn
         [HttpPost("upsert-record")]
         public async Task<IActionResult> UpsertRecord(List<VoteRecord> request)
         {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            await _azureCosmos.SaveOrUpdateAll<VoteRecord>(request);
+            //ResponseBuilder builder = ResponseBuilder.custom();
+            //await _azureCosmos.SaveOrUpdateAll<VoteRecord>(request);
             return Ok(request);
             //return builder.Data(request).build();
         }

+ 0 - 333
TEAMModelOS/Controllers/Exam/ImportExerciseController.cs

@@ -1,333 +0,0 @@
-using Azure.Storage.Blobs.Models;
-using Azure.Storage.Sas;
-using HTEXLib;
-using HTEXLib.Builders;
-using HTEXLib.Helpers.ShapeHelpers;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IdentityModel.Tokens.Jwt;
-using System.IO;
-using System.Linq;
-using System.Net.Http;
-using System.Text;
-using System.Text.Json;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.Models;
-using TEAMModelOS.Models.Dto;
-using TEAMModelOS.Models.PowerPoint;
-using TEAMModelOS.SDK;
-using TEAMModelOS.SDK.Context.Constant;
-using TEAMModelOS.SDK.Context.Constant.Common;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
-using TEAMModelOS.SDK.Module.AzureBlob.Container;
-using TEAMModelOS.Services;
-using HTEXLib.Translator;
-using HTEXLib.DOCX.Models;
-
-namespace TEAMModelOS.Controllers
-{
-    [Route("common/import")]
-    [ApiController]
-    public class ImportExerciseController : ControllerBase
-    {
-        public PPTX2HTEXTranslator _PPTX2HTEXTranslator { get; set; }
-        public DOXC2HTMLTranslator _DOXC2HTMLTranslator { get; set; }
-        public HTML2ITEMTranslator _HTML2ITEMTranslator { get; set; }
-        //  private readonly IHtexService htexService;
-        private readonly AzureStorageFactory _azureStorage;
-        private readonly IWebHostEnvironment _webHostEnvironment;
-        private  List<LangConfig> langConfigs { get; set; }
-        private readonly IHttpClientFactory _clientFactory;
-        public ImportExerciseController(   AzureStorageFactory azureStorage, IWebHostEnvironment webHostEnvironment,
-            PPTX2HTEXTranslator PPTX2HTEXTranslator, IHttpClientFactory clientFactory,
-            DOXC2HTMLTranslator DOXC2HTMLTranslator, HTML2ITEMTranslator HTML2ITEMTranslator)
-        {
-            _HTML2ITEMTranslator = HTML2ITEMTranslator;
-            _DOXC2HTMLTranslator = DOXC2HTMLTranslator;
-            _clientFactory = clientFactory;
-            this._PPTX2HTEXTranslator = PPTX2HTEXTranslator;
-            _webHostEnvironment = webHostEnvironment;
-            _azureStorage = azureStorage;
-            string path = _webHostEnvironment.ContentRootPath + "/JsonFile/Core/LangConfig.json";
-            FileStream fs = new FileStream(path, System.IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
-            StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8);
-            String line;
-            StringBuilder builder = new StringBuilder();
-            while ((line = sr.ReadLine()) != null)
-            {
-                builder.Append(line.ToString());
-            }
-
-            sr.Close();
-            string text = builder.ToString();
-            langConfigs = text.ToObject<List<LangConfig>>();
-        }
-       
-
-        /// <summary>
-        /// {"url":"https://***.blob.core.cn/xxx/1.pptx"}
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [HttpPost("parse-doc")]
-        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
-        public async Task<IActionResult> ParsePPTX(JsonElement request)
-        {
-            //string id_token = HttpContext.GetXAuth("IdToken");
-            //if (string.IsNullOrEmpty(id_token)) return BadRequest();
-            //var jwt = new JwtSecurityToken(id_token);
-            //if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
-            //var id = jwt.Payload.Sub;
-
-            request.TryGetProperty("file", out JsonElement code);
-            string azureBlobSAS = System.Web.HttpUtility.UrlDecode(code.ToString(), Encoding.UTF8);
-            (string, string) a = BlobUrlString(azureBlobSAS);
-            string ContainerName = a.Item1;
-            string BlobName = a.Item2;
-            bool flg = IsBlobName(BlobName);
-            var codes = azureBlobSAS.Split("/");
-            var file = codes[codes.Length - 1].Split(".");
-            var FileName = file[0];
-            var ext = file[1];
-            if (flg)
-            {
-                BlobAuth blobAuth = _azureStorage.GetBlobSasUriRead(ContainerName, BlobName);
-                var response = await _clientFactory.CreateClient().GetAsync(new Uri(blobAuth.url));
-                response.EnsureSuccessStatusCode();
-                Stream stream=  await response.Content.ReadAsStreamAsync();
-
-                if (ext.ToLower() == "pptx" || ext.ToLower() == "xml")
-                {
-                    string index = await PPTXTranslator(ContainerName, FileName, stream);
-                    return Ok(new { index = index });
-                }
-                else if (ext.ToLower() == "docx" || ext.ToLower() == "doc")
-                {
-                    return Ok(new { index = "" });
-                }
-                else {
-                    return BadRequest("不支持该文件类型的解析!");
-                }
-            }
-            else { return BadRequest("不是正确的Blob链接!"); }
-        }
-        private static (string, string) BlobUrlString(string sasUrl)
-        {
-            sasUrl = sasUrl.Substring(8);
-            string[] sasUrls = sasUrl.Split("/");
-            string ContainerName;
-            ContainerName = sasUrls[1].Clone().ToString();
-            string item = sasUrls[0] + "/" + sasUrls[1] + "/";
-            string blob = sasUrl.Replace(item, "");
-            return (ContainerName, blob);
-        }
-        public static bool IsBlobName(string BlobName)
-        {
-            return System.Text.RegularExpressions.Regex.IsMatch(BlobName,
-             @"(?!((^(con)$)|^(con)\\..*|(^(prn)$)|^(prn)\\..*|(^(aux)$)|^(aux)\\..*|(^(nul)$)|^(nul)\\..*|(^(com)[1-9]$)|^(com)[1-9]\\..*|(^(lpt)[1-9]$)|^(lpt)[1-9]\\..*)|^\\s+|.*\\s$)(^[^\\\\\\:\\<\\>\\*\\?\\\\\\""\\\\|]{1,255}$)");
-        }
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [HttpPost("upload-pptx")]
-        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
-        public async Task<IActionResult> UploadPPTX([FromForm] IFormFile file)
-        {
-
-            string id_token = HttpContext.GetXAuth("IdToken");
-            if (string.IsNullOrEmpty(id_token)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token);
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
-            var id = jwt.Payload.Sub;
-            if (FileType.GetExtention(file.FileName).ToLower().Equals("pptx") || FileType.GetExtention(file.FileName).ToLower().Equals("xml"))
-            {
-                string FileName = file.FileName.Split(".")[0];
-                Stream streamFile = file.OpenReadStream();
-                string index = await PPTXTranslator(id, FileName, streamFile);
-                return Ok(new { index = index });
-            }
-            else {
-                return BadRequest("type is not pptx or xml !");
-            }
-            
-           
-        }
-
-        /// <summary>
-        /// docUrl
-        /// folder
-        /// shaCode
-        /// 
-        /// UploadWord
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [HttpPost("upload-word")]
-        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
-        public   IActionResult UploadWord([FromForm] IFormFile file)
-        {
-          //  ResponseBuilder responseBuilder = new ResponseBuilder();
-            if (!FileType.GetExtention(file.FileName).ToLower().Equals("docx"))
-            {
-                return BadRequest(new Dictionary<string, object> { {"msg", "type is not docx!" },{ "code",ResponseCode.FAILED} });
-            }
-
-            var doc= _DOXC2HTMLTranslator.Translate(file.OpenReadStream());
-           // Dictionary<string, object> model = await ImportExerciseService.UploadWord(_azureStorage, file);
-            return Ok(doc);
-        }
-
-        /// <summary>
-        /// htmlString AnalyzeHtml
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [HttpPost("parse-html")]
-        public  IActionResult  AnalyzeHtml(JsonElement request)
-        {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            while (emobj.MoveNext())
-            {
-                dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            bool flag = dict.TryGetValue("htmlString", out object htmlString);
-            bool flagLang = dict.TryGetValue("lang", out object lang);
-            if (flag && htmlString != null && !string.IsNullOrEmpty(htmlString.ToString()))
-            {
-                LangConfig langConfig= langConfigs.Where(x => x.Lang == lang.ToString()).FirstOrDefault();
-                var exercises= _HTML2ITEMTranslator.Translate(htmlString.ToString(), langConfig);
-                return Ok(exercises);
-            }
-            else
-            {
-                return BadRequest();
-            }
-        }
-       
-
-        private async Task<string> PPTXTranslator(string id, string FileName, Stream streamFile)
-        {
-            var status = await _azureStorage.GetBlobServiceClient().DelectBlobs(id, $"res/{FileName}");
-            string shaCode = Guid.NewGuid().ToString("N");
-            HTEXLib.Htex htex = _PPTX2HTEXTranslator.Translate(streamFile);
-            htex.name = FileName;
-            var slides = htex.slides;
-            List<Task> tasks = new List<Task>();
-            HTEX hTEX = new HTEX() { name = FileName, size = htex.size, thumbnail = htex.thumbnail, id = shaCode };
-            Dictionary<string, string> texts = new Dictionary<string, string>();
-            List<string> shas = new List<string>();
-            foreach (var slide in slides)
-            {
-                string text = JsonHelper.ToJson(slide, ignoreNullValue: false);
-                string sha = Guid.NewGuid().ToString("N");
-                texts.Add(sha, text);
-                shas.Add(sha);
-            }
-            Dictionary<string, string> bloburls = new Dictionary<string, string>();
-            foreach (var key in texts.Keys)
-            {
-                tasks.Add(_azureStorage.UploadFileByContainer(id, texts[key], "res", FileName + "/" + key + ".json", false)
-                    .ContinueWith((Task<AzureBlobModel> blob) =>
-                    {
-                        bloburls.Add(key, blob.Result.BlobUrl);
-                    })
-                    );
-            }
-            await Task.WhenAll(tasks);
-            List<Sld> slds = new List<Sld>();
-            foreach (string sha in shas)
-            {
-                slds.Add(new Sld { type = "normal", url = System.Web.HttpUtility.UrlDecode(bloburls[sha], Encoding.UTF8), scoring = null }); ;
-            }
-            Dictionary<string, Store> dict = new Dictionary<string, Store>();
-            List<Task> tasksFiles = new List<Task>();
-            foreach (var key in htex.stores.Keys)
-            {
-                if (key.EndsWith(".wdp") || key.EndsWith(".xlsx"))
-                {
-                    htex.stores.Remove(key);
-                    continue;
-                }
-                var store = htex.stores[key];
-                Store str = new Store() { path = key, contentType = store.contentType, isLazy = store.isLazy };
-                if (!store.isLazy && store.contentType != null && ContentTypeDict.extdict.TryGetValue(store.contentType, out string ext) && store.url.Contains(";base64,"))
-                {
-                    string[] strs = store.url.Split(',');
-                    Stream stream = new MemoryStream(Convert.FromBase64String(strs[1]));
-                    var urlstrs = key.Split("/");
-                    var name = urlstrs[urlstrs.Length - 1];
-                    tasksFiles.Add(_azureStorage.UploadFileByContainer(id, stream, "res", FileName + "/" + name, false)
-                        .ContinueWith((Task<AzureBlobModel> blob) =>
-                        {
-                            str.url = System.Web.HttpUtility.UrlDecode(blob.Result.BlobUrl, Encoding.UTF8);
-                        })
-                        );
-                }
-                else
-                {
-                    str.url = System.Web.HttpUtility.UrlDecode(store.url, Encoding.UTF8);
-                }
-                dict.TryAdd(key, str);
-            }
-            await Task.WhenAll(tasksFiles);
-            hTEX.stores = dict;
-            hTEX.slides = slds;
-            var blob=  await _azureStorage.UploadFileByContainer(id, JsonHelper.ToJson(hTEX, ignoreNullValue: false), "res", FileName + "/" + "index.json", false);
-            return System.Web.HttpUtility.UrlDecode(blob.BlobUrl, Encoding.UTF8);
-        }
-    }
-
-    public class HTEX {
-        public string id { get; set; }
-        public string version { get; set; } = "1.0.20201210";
-        public string name { get; set; }
-        public HTEXLib.HtexSize size { get; set; }
-        public List<Sld> slides { get; set; }
-        //缩略图
-        public string thumbnail { get; set; }
-        //  public int page { get; set; }
-        public Dictionary<string, Store> stores { get; set; }
-        public List<string> points { get; set; }
-        public string periodId { get; set; }
-        public List<string> gradeIds { get; set; }
-        public string subjectId { get; set; }
-        public string subjectName { get; set; }
-        public string score { get; set; }
-        public string code { get; set; }
-        public string scope { get; set; }
-        public int? multipleRule { get; set; }
-    }
-    public class Sld {
-        /// <summary>
-        /// normal,普通的hte页面 single 单选题 multiple 多选题 judge 判断题 complete 填空题 subjective 问答题 compose 综合题 
-        /// </summary>
-        public string type { get; set; }
-        /// <summary>
-        /// 单页PPTx htex 的解析链接或一个题目的链接
-        /// </summary>
-        public string url { get; set; }
-        /// <summary>
-        /// 题目的配分,如果为type为normal 及compose ,则 scoring=null
-        /// </summary>
-        public Scoring scoring { get; set; }
-        /// <summary>
-        /// 单页PPTx htex 的缩略图
-        /// </summary>
-        public string thumbnail { get; set; }
-    }
-
-    public class Scoring { 
-        public double score { get; set; }
-        public List<string> ans { get; set; } = new List<string>();
-    }
-}

+ 3 - 3
TEAMModelOS/Controllers/Syllabus/ItemInfoController.cs

@@ -23,16 +23,16 @@ namespace TEAMModelOS.Controllers
     [ProducesResponseType(StatusCodes.Status200OK)]
     [ProducesResponseType(StatusCodes.Status400BadRequest)]
     //[Authorize(Roles = "IES5")]
-    [Route("common/item")]
+    [Route("item")]
     //[Route("api/[controller]")]
     [ApiController]
-    public class ItemInfoController : ControllerBase
+    public class ItemController : ControllerBase
     {
         private readonly SnowflakeId _snowflakeId;
         private readonly AzureCosmosFactory _azureCosmos;
         private readonly DingDing _dingDing;
         private readonly Option _option;
-        public ItemInfoController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option)
+        public ItemController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option)
         {
             _azureCosmos = azureCosmos;
             _snowflakeId = snowflakeId;

+ 1 - 1
TEAMModelOS/Controllers/Exam/PaperController.cs

@@ -21,7 +21,7 @@ namespace TEAMModelOS.Controllers
     [ProducesResponseType(StatusCodes.Status200OK)]
     [ProducesResponseType(StatusCodes.Status400BadRequest)]
     //[Authorize(Roles = "IES5")]
-    [Route("school/paper")]
+    [Route("paper")]
     [ApiController]
     public class PaperController: ControllerBase
     {

+ 2 - 1
TEAMModelOS/Controllers/School/CourseController.cs

@@ -240,7 +240,8 @@ namespace TEAMModelOS.Controllers
                         }
                     }
                 }
-                await _azureCosmos.DeleteAll(courses);
+                // TODO JJ调整批量删除
+                //await _azureCosmos.DeleteAll(courses);
                 //List<IdPk> idPk = await _azureCosmos.DeleteAll<Course>(request);
                 //await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Class-{code}"));
                 StringBuilder sqlM = new StringBuilder();

+ 0 - 235
TEAMModelOS/Controllers/Syllabus/ResourceController.cs

@@ -1,235 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK;
-using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
-using TEAMModelOS.SDK.DI;
-
-using TEAMModelOS.Models;
-using System.Text.Json;
-using TEAMModelOS.SDK.Helper.Common.StringHelper;
-using TEAMModelOS.SDK.Models;
-using Microsoft.AspNetCore.Http;
-using Azure.Cosmos;
-using TEAMModelOS.SDK.Extension;
-
-namespace TEAMModelOS.Controllers
-{
-
-    [ProducesResponseType(StatusCodes.Status200OK)]
-    [ProducesResponseType(StatusCodes.Status400BadRequest)]
-    //[Authorize(Roles = "IES5")]
-    [Route("common/resource")]
-    [ApiController]
-    public class ResourceController : ControllerBase
-    {
-        private readonly AzureStorageFactory _azureStorage;
-        private readonly AzureCosmosFactory _azureCosmos;
-        private readonly SnowflakeId _snowflakeId;
-        public ResourceController(AzureStorageFactory azureStorage, AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId)
-        {
-            _azureStorage = azureStorage;
-            _azureCosmos = azureCosmos;
-            _snowflakeId = snowflakeId;
-        }
-
-        /// <summary>
-        /// 保存或更新SyllabusResource
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("upsertAll")]
-        public async Task<IActionResult> UpsertAll(List<Resource> request)
-        {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            if (request.IsNotEmpty())// != null )
-            {
-                List<Resource> resource = request;
-                foreach (Resource item in resource)
-                {
-                    //item.code = 
-                    if (item.id == null)
-                    {
-                        item.id = _snowflakeId.NextId()+""; //item.sha1Code + "-" + item.extension + "-" + item.size;
-                        
-                    }
-                }
-                await _azureCosmos.SaveOrUpdateAll(resource);
-                //builder.Data("保存或新增成功");
-            }
-            return Ok("保存或新增成功");
-        }
-
-
-        /// <summary>
-        /// 获取SyllabusResource
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("find")]
-        public async Task<IActionResult> Find(JsonElement requert)
-        {
-
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-
-            List<object> Resources = new List<object>();
-            var query = $"select c.id,c.fileName,c.extension, c.contentType,c.type,c.blobUrl,c.createTime,c.range from c order by c.createTime desc";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Resource-{school_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())
-                    {
-                        Resources.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { Resources });
-
-            // request.@params.TryAdd("PartitionKey", request.lang);
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-            if (StringHelper.getKeyCount(request) > 0)
-            {
-                List<Resource> data = new List<Resource>();
-                data = await _azureCosmos.FindByDict<Resource>(request);
-
-                return builder.Data(data.OrderBy(m => m.createTime)).Extend(new Dictionary<string, object> { { "count", data.IsNotEmpty() ? data.Count : 0 } }).build();
-            }
-            else {
-
-                return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
-            }*/
-
-        }
-
-
-        /// <summary>
-        /// 获取SyllabusResource
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("find-by-id")]
-        public async Task<IActionResult> FindSyllabusResourceById(JsonElement requert)
-        {
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            if (!requert.TryGetProperty("ids", out JsonElement id)) return BadRequest();
-            string info = "";
-            for (int i = 0; i < id.GetArrayLength(); i++)
-            {
-                info += id[i].ToJsonString() + ",";
-            }
-            List<object> Resources = new List<object>();
-            var query = $"select c.id,c.fileName,c.extension, c.contentType,c.type,c.blobUrl,c.createTime,c.range from c  where c.id in ({info[0..^1]})";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Resource-{school_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())
-                    {
-                        Resources.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { Resources });
-        }
-
-
-        /// <summary>
-        /// 删除 SyllabusResource
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("delete")]
-        public async Task<IActionResult> DeleteSyllabusResource(JsonElement request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            List<Resource> syllabusResources =  await Delete<Resource>(request, builder);
-            foreach (Resource syllabusResource  in syllabusResources) {
-
-                string blobUrl = syllabusResource.blobUrl;
-                if (!string.IsNullOrEmpty(blobUrl))
-                {
-                  //  await _azureBlobDBRepository.Deleteblob(blobUrl);
-                }
-                string compressUrl = syllabusResource.compressUrl;
-                if (!string.IsNullOrEmpty(compressUrl))
-                {
-                   // await _azureBlobDBRepository.Deleteblob(compressUrl);
-                }
-            }
-
-            return Ok();
-        }
-
-        private async Task<List<T>> Delete<T>(JsonElement request, ResponseBuilder builder)where T:CosmosEntity
-        {
-            //Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            int keys = 0;
-            while (emobj.MoveNext())
-            {
-                keys++;
-               //dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            if (keys > 0)
-            {
-                List<T> schoolBlocks = await _azureCosmos.FindByDict<T>(request);
-                Type t = typeof(T);
-                if (schoolBlocks.IsNotEmpty())
-                {
-                    await _azureCosmos.DeleteAll<T>(schoolBlocks);
-                    builder.Data("删除成功");
-                }
-
-                return schoolBlocks;
-            }
-            else {
-                  builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!");
-                return null;
-            }
-
-        }
-
-        /// <summary>
-        /// 查询 资源被引用次数
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("reference")]
-        public async Task<IActionResult> Reference(JsonElement request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            while (emobj.MoveNext())
-            {
-                dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            List<ResourceReference> data = new List<ResourceReference>();
-            data = await _azureStorage.FindListByDict<ResourceReference>(dict);
-            //return builder.Data(data.OrderBy(m => m.CreateTime)).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
-            return Ok(new { OrderedEnumerables = data.OrderBy(m => m.CreateTime), data.Count });
-        }
-    }
-}

+ 52 - 322
TEAMModelOS/Controllers/Syllabus/SyllabusController.cs

@@ -20,7 +20,7 @@ namespace TEAMModelOS.Controllers
     [ProducesResponseType(StatusCodes.Status200OK)]
     [ProducesResponseType(StatusCodes.Status400BadRequest)]
     //[Authorize(Roles = "IES5")]
-    [Route("common/syllabus")]
+    [Route("syllabus")]
     [ApiController]
     //[Authorize]
     public class SyllabusController : ControllerBase
@@ -33,6 +33,7 @@ namespace TEAMModelOS.Controllers
             _azureCosmos = azureCosmos;
         }
 
+        // TODO 代码优化
 
         /// <summary>
         /// 批量保存或更新课纲
@@ -43,12 +44,13 @@ namespace TEAMModelOS.Controllers
         [HttpPost("upsert-tree")]
         public async Task<IActionResult> SaveOrUpdateAsTree(List<SyllabusTree> request)
         {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            List<SyllabusTree> treess = await SaveOrUpdateToTree(request);
-            //return builder.Data(treess).build();
-            return Ok(treess);
+            ////ResponseBuilder builder = ResponseBuilder.custom();
+            //List<SyllabusTree> treess = await SaveOrUpdateToTree(request);
+            ////return builder.Data(treess).build();
+            return Ok();
         }
 
+        // TODO 代码优化
 
         /// <summary>
         /// 按节点新增课纲
@@ -59,12 +61,14 @@ namespace TEAMModelOS.Controllers
         [HttpPost("upsert-nodes")]
         public async Task<IActionResult> SaveOrUpdateAsNodes(List<SyllabusNode> request)
         {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            List<Syllabus> syllabuses = await SaveOrUpdateToNodes(request);
-            if (syllabuses.IsNotEmpty()) return Ok(request);
-            else return Ok(syllabuses);
+            return Ok();
+            //List<Syllabus> syllabuses = await SaveOrUpdateToNodes(request);
+            //if (syllabuses.IsNotEmpty()) return Ok(request);
+            //else return Ok(syllabuses);
         }
 
+        // TODO 代码优化
+
         /// <summary>
         /// 删除课纲
         /// </summary>
@@ -74,36 +78,38 @@ namespace TEAMModelOS.Controllers
         [HttpPost("delete")]
         public async Task<IActionResult> Delete(JsonElement request)
         {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            while (emobj.MoveNext())
-            {
-                dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            if (dict.Keys.Count > 0)
-            {
-                List<Syllabus> syllabuses = await DeleteSyllabus(dict);
-
-                if (syllabuses.IsNotEmpty())
-                {
-                    return Ok(syllabuses);
-                }
-                else
-                {
-                    return Ok("全部删除成功");
-
-                }
-            }
-            else
-            {
-                //return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
-                return Ok(new { ResponseCode.PARAMS_ERROR, V = "参数异常!" });
-            }
+            return Ok();
+            //Dictionary<string, object> dict = new Dictionary<string, object>();
+            //var emobj = request.EnumerateObject();
+            //while (emobj.MoveNext())
+            //{
+            //    dict[emobj.Current.Name] = emobj.Current.Value;
+            //}
+            //if (dict.Keys.Count > 0)
+            //{
+            //    List<Syllabus> syllabuses = await DeleteSyllabus(dict);
+
+            //    if (syllabuses.IsNotEmpty())
+            //    {
+            //        return Ok(syllabuses);
+            //    }
+            //    else
+            //    {
+            //        return Ok("全部删除成功");
+
+            //    }
+            //}
+            //else
+            //{
+            //    //return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
+            //    return Ok(new { ResponseCode.PARAMS_ERROR, V = "参数异常!" });
+            //}
 
 
         }
 
+        // TODO 代码优化
+
         /// <summary>
         /// 查找课纲 
         /// </summary>
@@ -113,293 +119,17 @@ namespace TEAMModelOS.Controllers
         [HttpPost("find")]
         public async Task<IActionResult> Find(JsonElement request)
         {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            while (emobj.MoveNext())
-            {
-                dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            List<SyllabusTree> treess = await Find(dict);
-            //return builder.Data(treess).build();
-            return Ok(treess);
-        }
-
-
-        #region private       
-
-        /// <summary>
-        /// 查找课纲 
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        private async Task<List<SyllabusTree>> Find(Dictionary<string, object> request)
-        {
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            foreach (KeyValuePair<string, object> keyValuePair in request)
-            {
-                dict.Add("children[*]." + keyValuePair.Key, keyValuePair.Value);
-            }
-            List<Syllabus> data = await _azureCosmos.FindByDict<Syllabus>(dict);
-            List<SyllabusTree> treess = new List<SyllabusTree>();
-            if (data.IsNotEmpty())
-            {
-                Dictionary<string, Syllabus> syllabuses = new Dictionary<string, Syllabus>();
-                data.ForEach(x => syllabuses.TryAdd(x.id, x));
-                data = new List<Syllabus>(syllabuses.Values);
-
-                foreach (Syllabus item in data)
-                {
-
-                    List<SyllabusNode> nodedata = item.children;
-                    if (request.TryGetValue("id", out object id))
-                    {
-                        foreach (SyllabusNode syllabus in nodedata)
-                        {
-                            if (syllabus.id == id.ToString())
-                            {
-                                List<SyllabusNode> nodes = new List<SyllabusNode>();
-                                nodes.Add(syllabus);
-                                await FindByPid(syllabus, nodes, nodedata);
-                                nodedata = nodes;
-                                break;
-                            }
-                        }
-                    }
-                    List<SyllabusTree> treess1 = ListToTree(nodedata);
-                    treess.AddRange(treess1);
-
-                    //treess.AddRange(treess1);
-                }
-
-                // return builder.Data(treess).build();
-            }
-            // else return builder.Data(data).build();
-            return treess;
-
-        }
-
-        private async Task<List<SyllabusNode>> FindByPid(SyllabusNode data, List<SyllabusNode> nodes, List<SyllabusNode> nodedata)
-        {
-            foreach (SyllabusNode syllabus in nodedata)
-            {
-                if (syllabus.pid == data.id)
-                {
-                    nodes.Add(syllabus);
-                    await FindByPid(syllabus, nodes, nodedata);
-                }
-            }
-            return nodes;
-        }
-
-
-        private async Task<List<Syllabus>> SaveOrUpdateToNodes(List<SyllabusNode> syllabusNodes)
-        {
-            List<Syllabus> syllabuses;
-
-            List<Syllabus> data = await _azureCosmos.FindByDict<Syllabus>(new Dictionary<string, object> { { "id", syllabusNodes[0].code } });
-            if (data.IsEmpty())
-            {
-                var syllabus = new Syllabus { id = syllabusNodes[0].code, code = syllabusNodes[0].code, children = new List<SyllabusNode>() };
-                await _azureCosmos.SaveOrUpdate(syllabus);
-                data = new List<Syllabus>() { syllabus };
-            }
-            List<SyllabusNode> syllabusNodes1 = new List<SyllabusNode>();
-            if (data.IsNotEmpty())
-            {
-                syllabusNodes1.AddRange(data[0].children);
-                //replace
-                for (int i = 0; i < data[0].children.Count; i++)
-                {
-                    for (int j = 0; j < syllabusNodes.Count; j++)
-                    {
-                        if (data[0].children[i].id == syllabusNodes[j].id && data[0].children[i].code == syllabusNodes[j].code)
-                        {
-                            syllabusNodes1.Remove(data[0].children[i]);
-                            syllabusNodes1.Add(syllabusNodes[j]);
-                            syllabusNodes.Remove(syllabusNodes[j]);
-                        }
-                    }
-                }
-                data[0].children = syllabusNodes1;
-
-                //新增
-                data[0].children.AddRange(syllabusNodes);
-
-                if (data[0].children.IsNotEmpty())
-                {
-                    var len = data[0].children.Count;
-                    for (int i = 0; i < len; i++)
-                    {
-                        if (data[0].children[i].items.IsNotEmpty())
-                        {
-                            data[0].children[i].item = true;
-                        }
-                        if (data[0].children[i].resources.IsNotEmpty())
-                        {
-                            data[0].children[i].resource = true;
-                        }
-                    }
-                }
-                syllabuses = await _azureCosmos.SaveOrUpdateAll<Syllabus>(data);
-
-            }
-            else
-            {
-                throw new BizException("保存失败", ResponseCode.FAILED);
-
-            }
-
-            return syllabuses;
-        }
-
-        private async Task<List<SyllabusTree>> SaveOrUpdateToTree(List<SyllabusTree> request)
-        {
-            List<SyllabusNode> nodes = new List<SyllabusNode>();
-            Syllabus syllabus = new Syllabus();
-
-            TreeToList(request, nodes);
-            // List<SyllabusNode> nods = nodes.ToJson().FromJson<List<SyllabusNode>>() ;
-            syllabus.children = nodes;
-            syllabus.id = request[0].code;
-            syllabus.code = request[0].code;
-            await _azureCosmos.SaveOrUpdate<Syllabus>(syllabus);
-            List<SyllabusTree> treess = ListToTree(nodes);
-            return treess;
-        }
-
-        private List<SyllabusNode> TreeToList(List<SyllabusTree> trees, List<SyllabusNode> nodes)
-        {
-            int index = 0;
-            foreach (SyllabusTree tr in trees)
-            {
-                tr.order = index;
-                index++;
-            }
-            trees = trees.OrderBy(x => x.order).ToList();
-            nodes.AddRange(trees.ToJsonString().ToObject<List<SyllabusNode>>());
-
-            foreach (SyllabusTree tree in trees)
-            {
-                if (null != tree.children && tree.children.Count > 0)
-                {
-                    TreeToList(tree.children, nodes);
-                }
-            }
-            return nodes;
-        }
-        private List<SyllabusTree> ListToTree(List<SyllabusNode> noes)
-        {
-            List<SyllabusTree> list = noes.ToJsonString().ToObject<List<SyllabusTree>>();
-            //var lookup = list.ToDictionary(n => n.RowKey, n => n);
-
-            var res = from r in list group r by r.id into g select g;
-            Dictionary<string, SyllabusTree> blockDict = new Dictionary<string, SyllabusTree>();
-            foreach (var s in res)
-            {
-                blockDict.TryAdd(s.First().id, s.First());
-            }
-            return GetChild(list, blockDict);
-        }
-
-        private List<SyllabusTree> GetChild(List<SyllabusTree> list, Dictionary<string, SyllabusTree> dict)
-        {
-            //  list = list.OrderBy(m => m.Order).ToList();
-            List<SyllabusTree> trees = new List<SyllabusTree>();
-            trees = trees.OrderBy(x => x.order).ToList();
-            foreach (SyllabusTree node in list)
-            {
-                bool flag = dict.TryGetValue(node.pid, out SyllabusTree syllabus);
-                if (flag && syllabus != null)
-                {
-                    syllabus.children.Add(node);
-                }
-                else
-                {
-                    trees.Add(node);
-                }
-            }
-            return trees;
-        }
-
-        private async Task<List<Syllabus>> DeleteSyllabus(Dictionary<string, object> request)
-        {
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            foreach (KeyValuePair<string, object> keyValuePair in request)
-            {
-                dict.Add("children[*]." + keyValuePair.Key, keyValuePair.Value);
-            }
-
-            List<Syllabus> data = await _azureCosmos.FindByDict<Syllabus>(dict);
-            Dictionary<string, Syllabus> syllabuses = new Dictionary<string, Syllabus>();
-            List<Syllabus> data1 = new List<Syllabus>();
-            if (data.Count > 0)
-            {
-                data.ForEach(x => syllabuses.TryAdd(x.id, x));
-                data = new List<Syllabus>(syllabuses.Values);
-
-                //是否全删
-                bool flg = false;
-                foreach (Syllabus item in data)
-                {
-                    List<SyllabusNode> nodedata = item.children;
-                    if (request.TryGetValue("id", out object id))
-                    {
-                        foreach (SyllabusNode syllabus in nodedata)
-                        {
-                            if (syllabus.id == id.ToString())
-                            {
-                                List<SyllabusNode> nodes = new List<SyllabusNode>();
-                                nodes.Add(syllabus);
-                                await FindByPid(syllabus, nodes, nodedata);
-                                nodedata = nodes;
-                                break;
-                            }
-                        }
-                    }
-                    List<SyllabusNode> syllabusNodes = new List<SyllabusNode>();
-                    syllabusNodes.AddRange(item.children);
-                    for (int i = 0; i < item.children.Count; i++)
-                    {
-                        for (int j = 0; j < nodedata.Count; j++)
-                        {
-                            if (item.children[i].id == nodedata[j].id)
-                            {
-                                syllabusNodes.Remove(item.children[i]);
-                            }
-                        }
-                    }
-                    item.children = syllabusNodes;
-                    if (item.children.Count == 0)
-                    {
-                        await _azureCosmos.DeleteAsync<Syllabus>(item.id, item.code);
-                        flg = true;
-                    }
-                }
-                if (!flg)
-                {
-                    data1 = await _azureCosmos.SaveOrUpdateAll<Syllabus>(data);
-
-                }
-
-
-                //if (flg)
-                //{
-
-                //    return builder.Data("全部删除成功").build();
-                //}
-                //else
-                //{
-                //    List<Syllabuses> data1 = await azureCosmosDBRepository.SaveOrUpdateAll<Syllabuses>(data);
-                //    return builder.Data(data1).build();
-                //}
-
-
-            }
-            return data1;
+            return Ok();
+            //ResponseBuilder builder = ResponseBuilder.custom();
+            //Dictionary<string, object> dict = new Dictionary<string, object>();
+            //var emobj = request.EnumerateObject();
+            //while (emobj.MoveNext())
+            //{
+            //    dict[emobj.Current.Name] = emobj.Current.Value;
+            //}
+            //List<SyllabusTree> treess = await Find(dict);
+            ////return builder.Data(treess).build();
+            //return Ok(treess);
         }
-        #endregion
-
-
     }
 }

+ 0 - 664
TEAMModelOS/Controllers/Syllabus/VolumeController.cs

@@ -1,664 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.Context.Exception;
-using TEAMModelOS.SDK;
-
-using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
-using TEAMModelOS.SDK.Helper.Security.ShaHash;
-using TEAMModelOS.SDK.DI; 
-using TEAMModelOS.Models;
-using System.Text.Json;
-using TEAMModelOS.SDK.Helper.Common.StringHelper;
-using TEAMModelOS.SDK.Models;
-using Microsoft.AspNetCore.Http;
-using System.IdentityModel.Tokens.Jwt;
-using Azure.Cosmos;
-using System.IO;
-using TEAMModelOS.SDK.Extension;
-using Microsoft.Extensions.Options;
-
-namespace TEAMModelOS.Controllers
-{
-    [ProducesResponseType(StatusCodes.Status200OK)]
-    [ProducesResponseType(StatusCodes.Status400BadRequest)]
-    //[Authorize(Roles = "IES5")]
-    [Route("common/volume")]
-    [ApiController]
-    public class VolumeController : ControllerBase
-    {
-        private readonly AzureCosmosFactory _azureCosmos;
-        private readonly SnowflakeId _snowflakeId;
-        private readonly DingDing _dingDing;
-        private readonly Option _option;
-
-        public VolumeController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing,IOptionsSnapshot<Option> option)
-        {
-            _azureCosmos = azureCosmos;
-            _snowflakeId = snowflakeId;
-            _dingDing = dingDing;
-            _option = option?.Value; ;
-        }
-
-
-        /// <summary>
-        /// 新增册别
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("upsert")]
-        public async Task<IActionResult> Upsert(Volume request)
-        {
-
-            /*try
-            {
-
-                //if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-                if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-                if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
-                *//* var jwt = new JwtSecurityToken(id_token.GetString());
-                 if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
-                 var id = jwt.Payload.Sub;*//*
-
-                var client = _azureCosmos.GetCosmosClient();
-                var response = await client.GetContainer("TEAMModelOSTemp", "Common").ReadItemStreamAsync(id.ToString(), new PartitionKey($"Volume-{school_code}"));
-
-                if (response.Status == 200)
-                {
-                    //using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    return Ok(new { V = "该册别已经存在!" });
-                }
-                else
-                {
-                    //如果沒有,Course信息存储
-                    requert.TryGetProperty("periodCode", out JsonElement periodCode);
-                    requert.TryGetProperty("subjectCode", out JsonElement subjectCode);
-                    requert.TryGetProperty("gradeCode", out JsonElement gradeCode);
-                    requert.TryGetProperty("semesterCode", out JsonElement semesterCode);
-                    requert.TryGetProperty("volumeName", out JsonElement volumeName);
-                    requert.TryGetProperty("volumeCode", out JsonElement volumeCode);
-                    requert.TryGetProperty("type", out JsonElement type);
-                    //jwt.Payload.TryGetValue("picture", out object picture);
-                    using var stream = new MemoryStream();
-                    using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
-                    writer.WriteStartObject();
-                    if (type.ToJsonString().Equals("1"))
-                    {
-                        writer.WriteString("code", $"Volume-{id}");
-                    }
-                    else {
-                        writer.WriteString("code", $"Volume-{school_code}");
-                    }                   
-                    writer.WriteString("id", id.ToString());
-                    writer.WriteString("periodCode", periodCode.ToString());
-                    writer.WriteString("subjectCode", subjectCode.ToString());
-                    writer.WriteString("gradeCode", gradeCode.ToString());
-                    writer.WriteString("semesterCode", semesterCode.ToString());
-                    writer.WriteString("volumeName", volumeName.ToString());
-                    writer.WriteString("volumeCode", volumeCode.ToString());
-                    writer.WriteString("type", type.ToString());                   
-                    writer.WriteEndObject();
-                    writer.Flush();
-                    response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOSTemp", "Common").CreateItemStreamAsync(stream, new PartitionKey($"Common-{school_code}"));
-                    if (response.Status == 200)
-                    {
-                        return Ok("保存成功!");
-                    }
-                    else
-                    {
-                        return Ok("保存失败!");
-                    }
-
-                }
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest();
-            }*/
-            Volume volume = new Volume();
-            if (request.editors != null && request.editors.Count > 5)
-            {
-                return BadRequest("共编人数大于5人!");
-                // throw new BizException("共编人数大于5人!");
-            }
-            if (string.IsNullOrEmpty(request.id))
-            {                
-                request.pk = typeof(Volume).Name;
-                //request.code = typeof(Volume).Name + "-" + request.code;
-                if (request.type == 0)
-                {
-                    /*                    List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                                            { "periodCode", request.periodCode},
-                                            { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                                            { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName},
-                                            { "status",1} ,{ "type",0} });*/
-                    List<Volume> volumesFind = new List<Volume>();
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.status = 1 and c.periodId = '{request.periodId}' and " +
-                        $"c.subjectId = '{request.subjectId}' and c.gradeId = '{request.gradeId}' and c.volumeName = '{request.volumeName}' " +
-                        $"and c.semesterId = '{request.semesterId}' and c.type = 0", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{request.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())
-                            {
-                                volumesFind.Add(obj.ToObject<Volume>());
-                            }
-                        }
-                    }
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        //return BadRequest("已存在!"); //throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                        return Ok(new { V = "已存在!", error = ResponseCode.DATA_EXIST });
-                    }
-
-                    //校本课纲
-                    string key = request.code + _snowflakeId.NextId();
-                    request.id = key;
-                    request.volumeCode = key;
-                    string code = request.code;
-                    //TODO 優化
-                    request.code = typeof(Volume).Name + "-" + request.code; 
-                    volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(request, new PartitionKey($"Volume-{code}"));
-                }
-                else if (request.type == 1)
-                {
-                    /*List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                        { "periodCode", request.periodCode},
-                        { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                        { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName},
-                        { "TEAMModelId",request.TEAMModelId}, { "status",1} ,{ "type",1} });*/
-                    List<Volume> volumesFind = new List<Volume>();
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.status = 1 and c.periodId = '{request.periodId}' and " +
-                        $"c.subjectId = '{request.subjectId}' and c.gradeId = '{request.gradeId}' and c.volumeName = '{request.volumeName}' " +
-                        $"and c.semesterId = '{request.semesterId}' and c.type = 1", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{request.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())
-                            {
-                                volumesFind.Add(obj.ToObject<Volume>());
-                            }
-                        }
-                    }
-
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        //return BadRequest("已存在!"); //throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                        return Ok(new { V = "已存在!", error = ResponseCode.DATA_EXIST });
-                    }
-                    //个人课纲
-                    string key = "dynamic" + request.TEAMModelId.Replace("#", "") + _snowflakeId.NextId();
-                    request.id = key;
-                    request.volumeCode = key;
-                    string code = request.code;
-                    request.code = typeof(Volume).Name + "-" + request.code;
-                    volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"Volume-{code}"));
-                }
-                else if (request.type == 2)
-                {
-                    //系统课纲
-                    string key = "system" + _snowflakeId.NextId();
-                    request.code = "system";
-                    request.id = key;
-                    request.volumeCode = key;
-                }
-               
-
-            }
-            else
-            {
-                if (request.type == 0)
-                {
-                    /* List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                     { "code",request.code},{ "periodCode", request.periodCode},
-                         { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                         { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName}  ,
-                         { "status",1} ,{ "type",0} });*/
-
-                    List<Volume> volumesFind = new List<Volume>();
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.status = 1 and c.periodId = '{request.periodId}' and " +
-                        $"c.subjectId = '{request.subjectId}' and c.gradeId = '{request.gradeId}' and c.volumeName = '{request.volumeName}' " +
-                        $"and c.semesterId = '{request.semesterId}' and c.type = 0", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{request.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())
-                            {
-                                volumesFind.Add(obj.ToObject<Volume>());
-                            }
-                        }
-                    }
-                    if (volumesFind.IsNotEmpty())
-
-                    {
-                        if (!volumesFind[0].id.Equals(request.id))
-                        {
-                            //return BadRequest("已存在!"); //throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                            return Ok(new { V = "已存在!", error = ResponseCode.DATA_EXIST });
-                        }
-                    }
-                    volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(request, new PartitionKey($"{request.code}"));
-                }
-                else if (request.type == 1)
-                {
-                    /* List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                         { "code",request.code},{ "periodCode", request.periodCode},
-                         { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                         { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName},
-                         { "TEAMModelId",request.TEAMModelId}, { "status",1} ,{ "type",1} });*/
-                    List<Volume> volumesFind = new List<Volume>();
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.status = 1 and c.periodId = '{request.periodId}' and " +
-                        $"c.subjectId = '{request.subjectId}' and c.gradeId = '{request.gradeId}' and c.volumeName = '{request.volumeName}' " +
-                        $"and c.semesterId = '{request.semesterId}' and c.type = 1", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{request.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())
-                            {
-                                volumesFind.Add(obj.ToObject<Volume>());
-                            }
-                        }
-                    }
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        if (!volumesFind[0].id.Equals(request.id))
-                        {
-                            //return BadRequest("已存在!"); //throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                            return Ok(new { V = "已存在!", error = ResponseCode.DATA_EXIST });
-                        }
-
-                    }
-                    else if (request.type == 2)
-                    {
-                    }
-                    volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(request, new PartitionKey($"{request.code}"));
-
-                }
-                //request = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(request, new PartitionKey($"{request.code}"));
-            }
-           /* List<Volume> volumes = new List<Volume>
-                {
-                    request
-                };
-
-            List<Volume> volume = await _azureCosmos.SaveOrUpdateAll<Volume>(volumes);*/
-            return Ok(new { volume });           
-        }
-
-
-        /// <summary>
-        /// 删除册别
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("delete")]
-        public async Task<IActionResult> Delete(JsonElement request)
-        {
-            try
-            {
-                if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
-                if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
-                if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
-                var client = _azureCosmos.GetCosmosClient();
-                if (scope.ToString().Equals("school"))
-                {
-                    var response = await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Volume-{code}"));
-                    return Ok(new { code = response.Status });
-                }
-                else
-                {
-                    var response = await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Volume-{code}"));
-                    return Ok(new { code = response.Status });
-                }
-
-            }
-            catch (Exception e)
-            {
-                return BadRequest();
-            }
-
-
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-            bool flag = false;
-            Volume volume = new Volume();
-            if (!string.IsNullOrEmpty(request.id))
-            {
-                //if (request.@params.type == 0)
-                //{
-                    request.status = 0;
-*//*                    List<Volume> volumes = new List<Volume>
-                    {
-                        request
-                    };*//*
-                    volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(request, new PartitionKey($"{request.code}"));
-                //await _azureCosmos.SaveOrUpdateAll<Volume>(volumes);
-                    flag = true;
-                //}
-                //else
-                //{
-                //    await azureCosmosDBRepository.DeleteAsync<Volume>(request.@params.id, request.@params.schoolCode);
-                //    await azureCosmosDBRepository.DeleteAll<SyllabusNode>(new Dictionary<string, object>() { { "volumeCode", request.@params.id } });
-                //    flag = true;
-                //}
-            }
-            return Ok(flag);*/
-        }
-
-
-        /// <summary>
-        /// 查找册别
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("find")]
-        public async Task<IActionResult> Find(JsonElement request)
-        {
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-            List<Volume> volumes ;*/
-            List<Syllabus> syllabuses = new List<Syllabus>();
-            List<Volume> volumes = new List<Volume>();
-            request.TryGetProperty("periodId", out JsonElement periodCode);
-            request.TryGetProperty("subjectId", out JsonElement subjectCode); 
-            request.TryGetProperty("status", out JsonElement status);
-            if (request.TryGetProperty("code", out JsonElement code))
-            {
-               
-                request.TryGetProperty("type", out JsonElement type);
-                if (type.GetInt32() == 1)
-                {
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{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())
-                            {
-                                syllabuses.Add(obj.ToObject<Syllabus>());
-                            }
-                        }
-                    }
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.status = {status}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{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())
-                            {
-                                volumes.Add(obj.ToObject<Volume>());
-                            }
-                        }
-                    }
-                }
-                else {
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{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())
-                            {
-                                syllabuses.Add(obj.ToObject<Syllabus>());
-                            }
-                        }
-                    }
-                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.status = {status} and c.periodId = '{periodCode}' and c.subjectId = '{subjectCode}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{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())
-                            {
-                                volumes.Add(obj.ToObject<Volume>());
-                            }
-                        }
-                    }
-                }
-                //List<Syllabus> syllabuses = await _azureCosmos.FindByDict<Syllabus>(new Dictionary<string, object> { { "code", "Syllabus-"+code.ToString() } });
-                //课纲               
-                //volumes = await _azureCosmos.FindByDict<Volume>(request);
-                //处理单个册别下面的资源和题目
-                volumes.ForEach(v => {
-                    
-                    HashSet<string> rCount = new HashSet<string>();
-                    HashSet<string> iCount = new HashSet<string>();
-                    
-                    syllabuses.ForEach(s => {
-                        if (v.volumeCode.Equals(s.id)) {
-                            s.children.ForEach(c => {
-                                if (c.resources.IsNotEmpty())
-                                {
-                                    c.resources.ForEach(r => {
-                                        rCount.Add(r);
-                                    });
-                                }
-                                if (c.items.IsNotEmpty())
-                                {
-                                    c.items.ForEach(i => {
-                                        iCount.Add(i);
-                                    });
-                                }
-                            });
-                        }                      
-                    });
-                    v.resourceCount = rCount.Count;
-                    v.itemCount = iCount.Count;
-                });
-            }
-            else
-            {
-                return BadRequest();
-
-            }
-            return Ok(new { volumes });
-        }
-
-        /// <summary>
-        /// 查找册别数量
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "Teacher")]
-        [HttpPost("count")]
-        public async Task<IActionResult> count(JsonElement request)
-        {
-            //List<List<List<List<int>>>> allCount = new List<List<List<List<int>>>>();
-            ResponseBuilder builder = ResponseBuilder.custom();
-
-            List<List<List<int>>> sCount = new List<List<List<int>>>();
-            if (StringHelper.getKeyCount(request) > 0) {
-                request.TryGetProperty("code", out JsonElement code);
-                //List<School> sc = await _azureCosmos.FindByDict<School>(request);
-                List<School> sc = new List<School>();
-                var client = _azureCosmos.GetCosmosClient();
-                //List<object> schools = new List<object>();
-                var query = $"select c.id,c.pk,c.code, c.name,c.region,c.province,c.city,c.timeZone,c.picture,c.size,c.period,c.campuses from c where c.id ='{code}'";
-                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, 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)
-                    {
-                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                        {
-                            sc.Add(obj.ToObject<School>());
-                        }
-                    }
-                }
-                //查询校本所有册别数据
-/*                Dictionary<string, object> scMap = new Dictionary<string, object>
-            {
-                 { "status", 1}
-            };*/
-                //List<Volume> volumeo = await _azureCosmos.FindByDict<Volume>(scMap);
-                List<Volume> volumeo = new List<Volume>();
-                await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.status = 1 ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{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())
-                        {
-                            volumeo.Add(obj.ToObject<Volume>());
-                        }
-                    }
-                }
-
-                for (int i = 0; i < sc.Count; i++)
-                {
-                    for (int j = 0; j < sc[i].period.Count; j++)
-                    {
-                        List<List<int>> pCount = new List<List<int>>();
-                        for (int k = 0; k < sc[i].period[j].subjects.Count; k++)
-                        {
-                            List<int> listCount = new List<int>() { 0, 0 };
-                            //查询校本册别
-                            //计数校本数量
-                            int n = 0;
-                            int s = 0;
-                            for (int m = 0; m < volumeo.Count; m++)
-                            {
-                                if (volumeo[m].type == 0 &&
-                                    sc[i].period[j].id.Equals(volumeo[m].periodId) &&
-                                    sc[i].period[j].subjects[k].id.Equals(volumeo[m].subjectId))
-                                {
-                                    n++;
-                                }
-                                if (volumeo[m].type == 1 &&
-                                    sc[i].period[j].id.Equals(volumeo[m].periodId) &&
-                                    sc[i].period[j].subjects[k].id.Equals(volumeo[m].subjectId) && volumeo[m].TEAMModelId.Equals("habook#0001"))
-                                {
-                                    s++;
-                                }
-                            }
-                            //册别数量
-                            listCount[0] = n;
-                            listCount[1] = s;
-                            pCount.Add(listCount);
-                        }
-                        sCount.Add(pCount);
-                    }
-                }
-            }
-            
-            return Ok(sCount);
-        }
-
-
-
-        #region private
-        /*
-        public async Task<List<Volume>> SaveOrUpdateVolume(Volume request)
-        {
-            if (request.editors != null && request.editors.Count > 5)
-            {
-                throw new BizException("共编人数大于5人!");
-            }
-            if (string.IsNullOrEmpty(request.id))
-            {
-                request.code = typeof(Volume).Name + "-" + request.code;
-                if (request.type == 0)
-                {
-                    List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                        { "periodCode", request.periodCode},
-                        { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                        { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName},
-                        { "status",1} ,{ "type",0} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                    }
-                    //校本课纲
-                    string key = request.code + _snowflakeId.NextId();
-                    request.id = key;
-                    request.volumeCode = key;
-                }
-                else if (request.type == 1)
-                {
-                    List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                        { "periodCode", request.periodCode},
-                        { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                        { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName},
-                        { "TEAMModelId",request.TEAMModelId}, { "status",1} ,{ "type",1} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                    }
-                    //个人课纲
-                    string key = "dynamic" + request.TEAMModelId.Replace("#", "") + _snowflakeId.NextId();
-                    request.id = key;
-                    request.volumeCode = key;
-                }
-                else if (request.type == 2)
-                {
-                    //系统课纲
-                    string key = "system" + _snowflakeId.NextId();
-                    request.code = "system";
-                    request.id = key;
-                    request.volumeCode = key;
-                }
-            }
-            else
-            {
-                if (request.type == 0)
-                {
-                    List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                    { "code",request.code},{ "periodCode", request.periodCode},
-                        { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                        { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName}  ,
-                        { "status",1} ,{ "type",0} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        if (!volumesFind[0].id.Equals(request.id))
-                        {
-                            throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                        }
-                    }
-                }
-                else if (request.type == 1)
-                {
-                    List<Volume> volumesFind = await _azureCosmos.FindByDict<Volume>(new Dictionary<string, object>() {
-                        { "code",request.code},{ "periodCode", request.periodCode},
-                        { "subjectCode", request.subjectCode},{ "gradeCode", request.gradeCode},
-                        { "semesterCode",request.semesterCode},{ "volumeName",request.volumeName},
-                        { "TEAMModelId",request.TEAMModelId}, { "status",1} ,{ "type",1} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        if (!volumesFind[0].id.Equals(request.id))
-                        {
-                            throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                        }
-                    }
-
-                }
-                else if (request.type == 2)
-                {
-                }
-
-            }
-            List<Volume> volumes = new List<Volume>
-            {
-                request
-            };
-            List<Volume> volume = await _azureCosmos.SaveOrUpdateAll<Volume>(volumes);
-            return volume;
-        }
-
-    */
-        #endregion
-    }
-}

+ 0 - 415
TEAMModelOS/Controllers/Task/HomeworkController.cs

@@ -1,415 +0,0 @@
-
-using Azure.Cosmos;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.IdentityModel.Tokens.Jwt;
-using System.Text.Json;
-using System.Threading.Tasks;
-using TEAMModelOS.Models.Dto;
-using TEAMModelOS.SDK.Models;
-
-using TEAMModelOS.SDK;
-using TEAMModelOS.SDK.Context.Constant.Common;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
-using TEAMModelOS.SDK.Helper.Common.StringHelper;
-
-namespace TEAMModelOS.Controllers.Learn
-{
-    /// <summary>
-    /// 作业活动
-    /// </summary>
-    /// 
-    [ProducesResponseType(StatusCodes.Status200OK)]
-    [ProducesResponseType(StatusCodes.Status400BadRequest)]
-    [Route("teacher/homework")]
-    [ApiController]
-    public class HomeworkController : ControllerBase
-    {
-        private readonly SnowflakeId _snowflakeId;
-        private readonly AzureCosmosFactory _azureCosmos;       
-        private readonly AzureServiceBusFactory _serviceBus;
-        public HomeworkController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus , SnowflakeId snowflakeId)
-        {
-            _azureCosmos = azureCosmos;            
-            _snowflakeId = snowflakeId;
-            _serviceBus = serviceBus;
-        }
-
-
-        /// <summary>
-        /// 撤消作业
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("cancel")]
-        public async Task<IActionResult> Cancel(JsonElement requert)
-        {
-            /* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-             //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-             var jwt = new JwtSecurityToken(id_token.GetString());
-             if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-             var id = jwt.Payload.Sub;
-             //var id = "03245d02-71ba-4e44-97dd-1e66c91bff6c";
-             //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
-             var client = _azureCosmos.GetCosmosClient();
-             //權限token
-            *//* jwt.Payload.TryGetValue("name", out object name);
-             jwt.Payload.TryGetValue("picture", out object picture);*//*
-             var response = await client.GetContainer("TEAMModelOSTemp", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"Homework-{id_token}"));
-             if (response.Status == 200)
-             {
-                 using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                 int status = json.RootElement.GetProperty("status").GetInt32();
-             }
-             return Ok();*/
-            ResponseBuilder builder = ResponseBuilder.custom();
-            requert.TryGetProperty("id", out JsonElement homeWorkId);
-            List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
-
-            foreach (Homework homeWork in homeWorks)
-            {
-                homeWork.status = 100;
-            }
-            List<Homework> homeWorks1 = await _azureCosmos.UpdateAll<Homework>(homeWorks);
-
-            //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
-            List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
-            if (homeWorkStudents.IsNotEmpty())
-            {
-
-                //TODO 删除上传的文件
-                await _azureCosmos.DeleteAll(homeWorkStudents);
-            }
-            //return builder.Data(homeWorks1).build();
-            return Ok(homeWorks1);
-        }
-
-        /// <summary>
-        /// 删除作业
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("delete")]
-        public async Task<IActionResult> Delete(IdPk request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            IdPk idPk = await _azureCosmos.DeleteAsync<Homework>(request);
-            //按作业id删除提交记录
-            List<HomeworkRecord> homeWorkStudents =  await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", idPk.id } });
-            //TODO 删除上传的文件
-            await _azureCosmos.DeleteAll<HomeworkRecord>(homeWorkStudents);
-            //return builder.Data(idPk).build();
-            return Ok(idPk);
-        }
-
-
-        /// <summary>
-        /// 新增或修改 作业活动 同时创建关联关系表
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("upsert")]
-        public async Task<IActionResult> Upsert(HomeworkDto request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            //新增
-            var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
-            if (string.IsNullOrEmpty(request.homeWork.id))
-
-            {
-                request.homeWork.code = "Homework-" + id;
-                request.homeWork.id = _snowflakeId.NextId()+"";
-                request.homeWork.status = 100;
-                request.reset = true;
-                request.homeWork.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-            }
-
-            
-            /*if (request.homeWork.publishModel.Equals("0"))
-            {
-                request.homeWork.startTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                request.homeWork.status = 200;
-            }
-            else if (request.homeWork.publishModel.Equals("1"))
-            {
-                //TimerWork<HomeWork>(request.@params.homeWork.startTime,new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
-                //设定开始时间
-                string msgId = _snowflakeId.NextId() + "";
-                long SequenceNumber =  await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, request.homeWork.id, request.homeWork.code, request.homeWork.startTime,"going", msgId);
-                request.homeWork.sequenceNumber = SequenceNumber;
-
-                //serviceBusReviceService.ReciveMessageAsync();
-                //await _serviceBus.ReciveMessageAsync<Homework>(Constants.SubName);
-                //_timerWorkService.TimerWork<Homework>(request.@params.homeWork.startTime,200, new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
-            }*/
-
-            if (request.homeWork.status == 0) {
-
-                if (request.homeWork.startTime < DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()) request.homeWork.status = 200;
-                else  request.homeWork.status = 100;
-            }
-
-            Homework homeWork = await _azureCosmos.SaveOrUpdate<Homework>(request.homeWork);
-
-            //设定结束时间
-            /*string msgEndId = _snowflakeId.NextId() + "";
-            await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, request.homeWork.id, request.homeWork.code, request.homeWork.endTime);*/
-            //_timerWorkService.TimerWork<Homework>(request.@params.homeWork.endTime, 300, new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
-            //清除作业
-            if (request.reset)
-            {
-                //根据作业发布对象查找到每一个具体学生生成关联关系表 HomeWorkStudent
-              //  List<Target> targets = request.@params.homeWork.target;
-                //List<HomeworkRecord> homeWorkStudents = new List<HomeworkRecord>();
-               // foreach (Target target in targets)
-               // {
-                    //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
-                    List<HomeworkRecord> homeWorks = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", request.homeWork.id } });
-                    if (homeWorks.IsNotEmpty())
-                    {
-                        await _azureCosmos.DeleteAll(homeWorks);
-                    }
-                    //List<ClassStudent> classroom = await _cosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", target.classroomCode }});
-                    //if (classroom.IsNotEmpty())
-                    //{
-                        
-                    //    foreach (ClassStudent student in classroom)
-                    //    {
-                    //        HomeworkRecord homeWorkStudent = new HomeworkRecord();
-                    //        homeWorkStudent.code = student.code;
-                    //        homeWorkStudent.id = request.@params.homeWork.id;
-                    //        homeWorkStudent.classroom.code = target.classroomCode;
-                    //        homeWorkStudent.classroom.name = target.classroomName;
-                    //        homeWorkStudents.Add(homeWorkStudent);
-                    //    }
-                        
-                    //}
-                //}
-                //if (homeWorkStudents.IsNotEmpty())
-                //{
-                //    foreach (HomeworkRecord homeWorkStudents1 in homeWorkStudents)
-                //    {
-                //        List<Student> student = await _cosmos.FindById<Student>(homeWorkStudents1.code);//FindByDict<Student>(new Dictionary<string, object> { { "id", homeWorkStudents1.studentId } });
-                //        if (student.IsNotEmpty())
-                //        {
-                          
-                //            homeWorkStudents1.code = student[0].studentId;
-                //          //  homeWorkStudents1.nativeroom.code = student[0].classroomCode;
-                //        }
-                //    }
-                //    await _cosmos.SaveOrUpdateAll<HomeworkRecord>(homeWorkStudents);
-                //}
-            }
-            //return builder.Data(homeWork).build();
-            return Ok(homeWork);
-        }
-
-        /// <summary>
-        /// 新增或修改学生作业关联表
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("upsert-record")]
-        public async Task<IActionResult> UpsertRecord(List<HomeworkRecord> request)
-        {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            await _azureCosmos.SaveOrUpdateAll<HomeworkRecord>(request);
-            //return builder.Data(request).build();
-            return Ok(request);
-        }
-
-        /// <summary>
-        /// 查询作业活动
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("find")]
-        public async Task<IActionResult> Find(JsonElement request)
-        {
-
-            ResponseBuilder builder = ResponseBuilder.custom();
-            List<Homework> data = new List<Homework>();
-            List<HomeworkFindDto> homeWorkFindDtos = new List<HomeworkFindDto>();
-            if (StringHelper.getKeyCount(request) > 0)
-            {
-                data = await _azureCosmos.FindByDict<Homework>(request);
-                //判断作业提交信息
-                if (data.IsNotEmpty())
-                {
-                    foreach (Homework homeWork in data)
-                    {
-                        //HomeworkFindDto homeWorkFindDto = new HomeworkFindDto();
-                        List<string> pro = new List<string>();
-                        pro.Add("submit");
-                        List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(dict: new Dictionary<string, object> { { "id", homeWork.id } }, propertys: pro);
-                        int sub = 0;
-                        Dictionary<string, object> dict = new Dictionary<string, object>();
-                        dict.Add("Sum", homeWorkStudents.Count);
-                        dict.Add("Finish", sub);
-                        HomeworkFindDto homeWorkFindDto = homeWork.ToJsonString().ToObject<HomeworkFindDto>();
-                        homeWorkFindDto.statistics = dict;
-                        homeWorkFindDtos.Add(homeWorkFindDto);
-                    }
-                }
-            }
-            else
-            {
-                ///return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
-                return Ok("参数异常!");
-            }
-            //return builder.Data(homeWorkFindDtos).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
-            return Ok(new { homeWorkFindDtos, data.Count });
-        }
-
-        /// <summary>
-        /// 查询作业学生关联
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("find-record")]
-        public async Task<IActionResult> FindRecord(JsonElement requert)
-        {
-            var client = _azureCosmos.GetCosmosClient();
-            //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
-            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;
-
-            List<object> records = new List<object>();
-            var query = $"select c.id,c.classroom,c.submit, c.submitTime,c.score,c.content,c.stuCmt,c.tchCmt from c where id = {id}";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"HomeworkRecord-{id}") }))
-            {
-                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())
-                    {
-                        records.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { records });
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-            List<HomeworkRecord> data = new List<HomeworkRecord>();
-
-            if (StringHelper.getKeyCount(request) > 0)
-            {
-                data = await _azureCosmos.FindByDict<HomeworkRecord>(request);
-            }
-            else
-            {
-                return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
-            }
-            return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
-        }
-
-
-
-
-        /// <summary>
-        /// 教师作业打分评论
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("tch-score")]
-        public async Task<IActionResult> TchScore(HomeworkScoringDto request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", request.studentId }, { "id", request.homeWorkId } });
-            HomeworkRecord data = new HomeworkRecord();
-            if (homeWorkStudents.IsNotEmpty())
-            {
-
-                homeWorkStudents[0].score = request.score ?? homeWorkStudents[0].score;
-                HomeWorkComment homeWorkComment = new HomeWorkComment
-                {
-                    comment = request.comments,
-                    createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
-                    TEAMModelId = request.TEAMModelId
-                };
-
-                homeWorkStudents[0].tchCmt = homeWorkComment;
-                data = await _azureCosmos.SaveOrUpdate(homeWorkStudents[0]);
-            }
-            //return builder.Data(data).build();
-            return Ok(data);
-        }
-
-
-
-        /// <summary>
-        /// 学生作业打分评论
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("stu-score")]
-        public async Task<IActionResult> StuScore(HomeworkCommentDto request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", request.studentId }, { "id", request.homeWorkId } });
-            List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", request.homeWorkId } });
-            HomeworkRecord data = new HomeworkRecord();
-            if (homeWorks.IsNotEmpty() && homeWorks[0].other.Contains("comment"))
-            {
-                if (homeWorkStudents.IsNotEmpty())
-                {
-                    if (string.IsNullOrEmpty(request.commentid))
-                    {
-                        //评论
-                        StudentComment homeWorkComment = new StudentComment
-                        {
-                            commentid = _snowflakeId.NextId() + "",
-                            comment = request.comment,
-                            createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
-                            fromId = request.fromId,
-                            score = request.score
-                        };
-
-
-                        homeWorkStudents[0].stuCmt.Add(homeWorkComment);
-                    }
-                    else
-                    {
-                        //回复评论
-                        foreach (StudentComment comment in homeWorkStudents[0].stuCmt)
-                        {
-                            if (comment.commentid == request.commentid)
-                            {
-                                Reply reply = new Reply();
-                                reply.fromId = request.fromId;
-                                reply.toId = request.toId;
-                                reply.identity = request.identity;
-                                reply.comment = request.comment;
-                                reply.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                                comment.reply.Add(reply);
-                            }
-                        }
-                    }
-                    data = await _azureCosmos.Update(homeWorkStudents[0]);
-                }
-                //return builder.Data(data).build();
-                return Ok(data);
-            }
-            else {
-                //return builder.Error(ResponseCode.FAILED, "未开放互评!").build();
-                return Ok("未开放互评!");
-            } 
-        }
-    }
-}

+ 0 - 512
TEAMModelOS/Controllers/Task/LearnController.cs

@@ -1,512 +0,0 @@
-using Azure.Cosmos;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.IdentityModel.Tokens.Jwt;
-using System.IO;
-using System.Text.Json;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.Models;
-
-using TEAMModelOS.SDK;
-using TEAMModelOS.SDK.Context.Constant.Common;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Helper.Common.StringHelper;
-using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
-
-namespace TEAMModelOS.Controllers.Learn
-{
-    /// <summary>
-    /// 学习活动
-    /// </summary>
-    [ProducesResponseType(StatusCodes.Status200OK)]
-    [ProducesResponseType(StatusCodes.Status400BadRequest)]
-    [Route("teacher/learn")]
-    [ApiController]
-    public class LearnController: ControllerBase
-    {
-        private readonly SnowflakeId _snowflakeId;
-        private readonly AzureCosmosFactory _azureCosmos;
-        private readonly AzureServiceBusFactory _serviceBus;
-        public LearnController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId)
-        {
-            _snowflakeId = snowflakeId;
-            _serviceBus = serviceBus;
-            _azureCosmos = azureCosmos;
-        }
-
-        /// <summary>
-        /// 保存或更新学习任务
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("upsert-task")]
-        public async Task<IActionResult> UpsertTask(LearnTask request)
-        {
-            /*//if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-           *//* var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;*//*
-
-            var client = _azureCosmos.GetCosmosClient();
-            var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(id.ToString(), new PartitionKey($"LearnTask-{id}"));
-            if (response.Status == 200)
-            {
-                using var json = await JsonDocument.ParseAsync(response.ContentStream);
-              
-            }
-            else
-            {
-                //如果沒有,則初始化LearnTask
-                requert.TryGetProperty("endTime", out JsonElement endTime);
-                requert.TryGetProperty("status", out JsonElement status);
-                requert.TryGetProperty("type", out JsonElement type);
-                requert.TryGetInt64(out long createTime);
-                requert.TryGetProperty("stage", out JsonElement stage);
-                requert.TryGetProperty("passScore", out JsonElement passScore);
-
-                if (createTime <= 0)
-                {
-                    createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                }
-
-                if (endTime.GetInt64() > 0)
-                {
-                    //设定结束时间
-                    string msgEndId = _snowflakeId.NextId() + "";
-                    await _serviceBus.GetServiceBusClient().SendLeamMessage<LearnTask>(Constants.TopicName, id, $"LearnTask-{id}", endTime.GetInt64(), 300, msgEndId);
-                }
-
-                using var stream = new MemoryStream();
-                using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
-                writer.WriteStartObject();
-                writer.WriteString("code", $"LearnTask-{id}");
-                writer.WriteString("id", id.ToString());
-                writer.WriteNumber("endTime", endTime.GetInt64());
-                writer.WriteNumber("status", status.GetInt32());
-                writer.WriteNumber("type", type.GetInt32());
-                writer.WriteNumber("stage", stage.GetInt32());
-                writer.WriteNumber("createTime", createTime);
-                writer.WriteNumber("passScore", passScore.GetInt32());
-                writer.WriteEndObject();
-                writer.Flush();
-                //Debug
-                //string teacher = Encoding.UTF8.GetString(stream.ToArray());
-                response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemStreamAsync(stream, new PartitionKey($"LearnTask-{id}"));
-            }*/
-            var client = _azureCosmos.GetCosmosClient();
-            LearnTask learnTask;            
-            request.pk = typeof(LearnTask).Name;
-            if (string.IsNullOrEmpty(request.id))
-            {
-                request.id = _snowflakeId.NextId() + "";
-                request.code = typeof(LearnTask).Name + "-" + request.code;
-                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                learnTask = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"{request.code}"));
-                //await _azureCosmos.Save(request);
-            }
-            else
-            {
-                learnTask = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
-                //await _azureCosmos.Update(request);
-            }
-
-            return Ok(new { learnTask });
-
-            /* ResponseBuilder builder = ResponseBuilder.custom();
-             if (request.createTime <= 0) {
-                 request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-             }
-
-             if (request.endTime > 0) {
-                 //设定结束时间
-                 string msgEndId = _snowflakeId.NextId()+"";
-                 await _serviceBus.GetServiceBusClient().SendLeamMessage<LearnTask>(Constants.TopicName, request.id, request.code, request.endTime, 300, msgEndId);
-             }
-             await _azureCosmos.Save(request);
-             return builder.Data(request).build();*/
-        }
-
-        /// <summary>
-        /// 查询学习任务
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("find-task")]
-        public async Task<IActionResult> FindTask(JsonElement requert)
-        {
-
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
-            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
-/*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;*/
-
-            List<object> tasks = new List<object>();
-            var query = $"select c.id,c.endTime,c.status, c.type,c.createTime,c.stage,c.passScore from c";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnTask-{id}") }))
-            {
-                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())
-                    {
-                        tasks.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { tasks });
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-            if (request.TryGetProperty("id",out _) || request.TryGetProperty("code",out _))
-            {
-                List<LearnTask> tasks = await _azureCosmos.FindByDict<LearnTask>(request);
-                return builder.Data(tasks).build();
-            }
-            else {
-                return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build(); 
-            }*/
-
-        }
-        /// <summary>
-        /// 删除学习任务
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("delete-task")]
-        public async Task<IActionResult> DeleteTask(IdPk request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            return Ok(await _azureCosmos.DeleteAsync<LearnTask>(request));
-        }
-
-        /// <summary>
-        /// 保存或更新学习单元单元
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("upsert-unit")]
-        public async Task<IActionResult> UpsertUnit(LearnUnit request)
-        {
-
-            var client = _azureCosmos.GetCosmosClient();
-            LearnUnit learnUnit;            
-            request.pk = typeof(LearnUnit).Name;
-            if (string.IsNullOrEmpty(request.id))
-            {
-                request.id = _snowflakeId.NextId() + "";               
-                request.code = typeof(LearnUnit).Name + "-" + request.code;
-                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                learnUnit = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"{request.code}"));
-                //await _azureCosmos.Save(request);
-            }
-            else
-            {
-                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                learnUnit = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id, new PartitionKey($"{request.code}"));
-                //await _azureCosmos.Update(request);
-            }
-
-            return Ok(new { learnUnit });
-            /*if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;
-
-            var client = _azureCosmos.GetCosmosClient();
-            var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"LearnUnit-{id}"));
-            if (response.Status == 200)
-            {
-                using var json = await JsonDocument.ParseAsync(response.ContentStream);
-
-            }
-            else
-            {
-                //如果沒有,則初始化LearnTask
-                requert.TryGetProperty("endTime", out JsonElement endTime);
-                requert.TryGetProperty("status", out JsonElement status);
-                requert.TryGetProperty("type", out JsonElement type);
-                //requert.TryGetInt64(out long createTime);
-                requert.TryGetProperty("stage", out JsonElement stage);
-                requert.TryGetProperty("passScore", out JsonElement passScore);
-                long createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                using var stream = new MemoryStream();
-                using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
-                writer.WriteStartObject();
-                writer.WriteString("code", $"LearnUnit-{id}");
-                writer.WriteString("id", id);
-                writer.WriteNumber("endTime", endTime.GetInt64());
-                writer.WriteNumber("status", status.GetInt32());
-                writer.WriteNumber("type", type.GetInt32());
-                writer.WriteNumber("stage", stage.GetInt32());
-                writer.WriteNumber("createTime", createTime);
-                writer.WriteNumber("passScore", passScore.GetInt32());
-                writer.WriteEndObject();
-                writer.Flush();
-                //Debug
-                //string teacher = Encoding.UTF8.GetString(stream.ToArray());
-                response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemStreamAsync(stream, new PartitionKey($"LearnUnit-{id}"));
-            }
-
-            return Ok();*/
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-            if (string.IsNullOrEmpty(request.id))
-            {
-                request.id = _snowflakeId.NextId() + "";
-                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                await _azureCosmos.Save(request);
-            }
-            else
-            {
-                await _azureCosmos.Update(request);
-            }
-            return builder.Data(request).build();*/
-        }
-
-
-
-        /// <summary>
-        /// 查询学习单元
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("find-unit")]
-        public async Task<IActionResult> FindUnit(JsonElement requert)
-        {
-
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
-            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
-/*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;*/
-
-            List<object> units = new List<object>();
-            var query = $"select c.id,c.resource,c.item, c.name,c.createTime from c";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnUnit-{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())
-                    {
-                        units.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { units });
-
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-
-            if (StringHelper.getKeyCount(request) > 0)
-            {
-                return builder.Data(await _azureCosmos.FindByDict<LearnUnit>(request)).build();
-            }
-            else {
-                return builder.build();
-            }*/
-
-        }
-        /// <summary>
-        /// 删除学习单元
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("delete-unit")]
-        public async Task<IActionResult> DeleteUnit(IdPk request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            return Ok(await _azureCosmos.DeleteAsync<LearnUnit>(request));
-        }
-
-        /// <summary>
-        /// 保存或新增编序学习活动
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("upsert-process")]
-        public async Task<IActionResult> UpsertProcess(LearnProcess request) {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            var client = _azureCosmos.GetCosmosClient();
-            LearnProcess learnProcess;            
-            request.pk = typeof(LearnProcess).Name;
-            if (string.IsNullOrEmpty(request.id))
-            {
-                request.id = _snowflakeId.NextId() + "";
-                request.code = typeof(LearnProcess).Name + "-" + request.code;
-                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                learnProcess = await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(request, new PartitionKey($"LearnProcess-{request.code}"));
-               // await _azureCosmos.Save<LearnProcess>(request);
-            }
-            else {
-                learnProcess = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(request, request.id,new PartitionKey($"{request.code}"));
-                //await _azureCosmos.Update<LearnProcess>(request);
-            }
-           
-            return Ok(new { learnProcess });
-        }
-
-        /// <summary>
-        /// 查询编序学习活动
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("find-process")]
-        public async Task<IActionResult> FindProcess(JsonElement requert)
-        {
-
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
-            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
-/*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;*/
-
-            List<object> process = new List<object>();
-            var query = $"select c.id,c.name,c.subjectCode, c.periodCode,c.Introduce from c where id = {id}";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnProcess-{id}") }))
-            {
-                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())
-                    {
-                        process.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { process });
-            /* ResponseBuilder builder = ResponseBuilder.custom();
-
-            if (StringHelper.getKeyCount(request) > 0) {
-
-                builder.Data(await _azureCosmos.FindByDict<LearnProcess>(request));
-            }
-
-            return builder.build();*/
-        }
-
-        /// <summary>
-        /// 删除编序学习活动
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("delete-process")]
-        public async Task<IActionResult> DeleteProcess(IdPk request)
-        {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            if (request != null)
-            {
-                await _azureCosmos.DeleteAsync<LearnProcess>(request);
-            }
-            return Ok(request);
-        }
-
-        /// <summary>
-        /// 保存或新增作答记录
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("upsert-record")]
-        public async Task<IActionResult> UpsertRecord(List<LearnRecord> request)
-        {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            List<LearnRecord> leanProcesses = null;
-            if (ValidateHelper.IsValid(request))
-            {
-                request.ForEach(c => {
-                    if (string.IsNullOrEmpty(c.id)) {
-                        c.code = typeof(LearnRecord).Name + "-" + c.code;
-                    }
-                });
-                leanProcesses = await _azureCosmos.SaveOrUpdateAll<LearnRecord>(request);
-                //builder.Data(leanProcesses);
-            }
-            return Ok(leanProcesses);
-        }
-
-        /// <summary>
-        /// 查询编序作答记录
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("find-record")]
-        public async Task<IActionResult> FindRecord(JsonElement requert)
-        {
-
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
-            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
-/*            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;*/
-
-            List<object> records = new List<object>();
-            var query = $"select c.id,c.steps from c where id = {id}";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LearnRecord-{id}") }))
-            {
-                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())
-                    {
-                        records.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-
-            return Ok(new { records });
-           /* ResponseBuilder builder = ResponseBuilder.custom();
-            if (StringHelper.getKeyCount(request) > 0)
-            {
-                builder.Data(await _azureCosmos.FindByDict<LearnRecord>(request));
-            }
-            return builder.build();*/
-        }
-
-
-        /// <summary>
-        /// 删除作答记录
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("delete-record")]
-        public async Task<IActionResult> DeleteRecord(IdPk request)
-        {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            if (request != null)
-            {
-               await _azureCosmos.DeleteAsync<LearnRecord>(request);
-            }
-            return Ok(request);
-        }
-    }
-}

+ 38 - 38
TEAMModelOS/Controllers/Teacher/CommentController.cs

@@ -68,30 +68,30 @@ namespace TEAMModelOS.Controllers
         [HttpPost("find-comment")]
         public async Task<IActionResult> findComment(JsonElement requert)
         {
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
-            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
-            if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;
+            //var client = _azureCosmos.GetCosmosClient();
+            //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+            ////var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
+            //if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+            //var jwt = new JwtSecurityToken(id_token.GetString());
+            //if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
+            //var id = jwt.Payload.Sub;
 
-            List<object> comments = new List<object>();
-            var query = $"select c.id,c.comment from c";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Comment-{id}") }))
-            {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+            //List<object> comments = new List<object>();
+            //var query = $"select c.id,c.comment from c";
+            //await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Comment-{id}") }))
+            //{
+            //    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())
-                    {
-                        comments.Add(obj.ToObject<object>());
-                    }
-                }
-            }
+            //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+            //    {
+            //        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+            //        {
+            //            comments.Add(obj.ToObject<object>());
+            //        }
+            //    }
+            //}
 
-            return Ok(new { comments});           
+            return Ok();           
         }
         /// <summary>
         /// 更新保存教师评语罐头,如果评语列表为空则删除
@@ -103,24 +103,24 @@ namespace TEAMModelOS.Controllers
         public async Task<IActionResult> UpsertComment(Comment request)
         {
             // request.TryAdd("PartitionKey", request.lang);
-            ResponseBuilder builder = ResponseBuilder.custom();
-            Comment comment = null;
-            if (request.comment.Count > 0)
-            {
-                if (string.IsNullOrEmpty(request.id)) {
-                    request.id  = "Comment-" + request.code.Replace("#", "");
-                }
-                comment = await _azureCosmos.SaveOrUpdate<Comment>(request);
-            }
-            else {
-                if (!string.IsNullOrEmpty(request.id))
-                {
-                    IdPk idPk = await _azureCosmos.DeleteAsync<Comment>(request.id, request.code);
-                }
+            //ResponseBuilder builder = ResponseBuilder.custom();
+            //Comment comment = null;
+            //if (request.comment.Count > 0)
+            //{
+            //    if (string.IsNullOrEmpty(request.id)) {
+            //        request.id  = "Comment-" + request.code.Replace("#", "");
+            //    }
+            //    comment = await _azureCosmos.SaveOrUpdate<Comment>(request);
+            //}
+            //else {
+            //    if (!string.IsNullOrEmpty(request.id))
+            //    {
+            //        IdPk idPk = await _azureCosmos.DeleteAsync<Comment>(request.id, request.code);
+            //    }
                    
-            }
-            //return builder.Data(comment).build();
-            return Ok(comment);
+            //}
+            ////return builder.Data(comment).build();
+            return Ok();
         }
 
          

+ 53 - 101
TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs

@@ -22,7 +22,7 @@ namespace TEAMModelOS.Controllers
     [ProducesResponseType(StatusCodes.Status200OK)]
     [ProducesResponseType(StatusCodes.Status400BadRequest)]
     //[Authorize(Roles = "IES5")]
-    [Route("common/knowledge")]
+    [Route("knowledge")]
     [ApiController]
     //[Authorize]
     public class KnowledgeController : ControllerBase
@@ -235,9 +235,6 @@ namespace TEAMModelOS.Controllers
         [HttpPost("upsert-all")]
         public async Task<IActionResult> UpsertAll(List<Knowledge> request)
         {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            
-
             try
             {
 
@@ -261,12 +258,13 @@ namespace TEAMModelOS.Controllers
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},knowledge/upsert-all()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"knowledge,{_option.Location},upsert-all()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
         }
 
 
+        // TODO 代码优化
 
         /// <summary>
         /// 删除知识
@@ -277,29 +275,30 @@ namespace TEAMModelOS.Controllers
         [HttpPost("delete")]
         public async Task<IActionResult> Delete(JsonElement request)
         {
+            return Ok();
             //ResponseBuilder builder = ResponseBuilder.custom();
-            DeleteDelegate<Knowledge> deleteDelegate1 = Delete<Knowledge>;
-            List<Knowledge> Knowledges = await deleteDelegate1(request);
-            if(Knowledges.Count >0) {
-                foreach (Knowledge Knowledge in Knowledges)
-                {
-                    if (Knowledge.type == 1)
-                    {
-                        List<Knowledge> knowledges = await _azureCosmos.FindSQL<Knowledge>("SELECT value(c) FROM c join a in c.points where c.pk='Knowledge'and  Contains(a, '" + Knowledge.id + "') = true ");
-                        List<Resource> Resources = await _azureCosmos.FindSQL<Resource>("SELECT value(c) FROM c join a in c.points where c.pk='Resources' and  Contains(a, '" + Knowledge.id + "') = true ");
-                        //select value(c) from c join A0  in c.points where 1=1  and A0 =  @points0
-                        foreach (Knowledge knowledge in knowledges) knowledge.points.Remove(Knowledge.id);
-                        foreach (Resource Resource in Resources) Resource.points.Remove(Knowledge.id);
-                        await _azureCosmos.SaveOrUpdateAll(Resources);
-                        await _azureCosmos.SaveOrUpdateAll(knowledges);
-                    }
-                }
-                return Ok(new { Knowledges });
-            }else
-            {
-                return Ok(new { erro = ResponseCode.FAILED, v = "删除失败!" });
-
-            }
+            //DeleteDelegate<Knowledge> deleteDelegate1 = Delete<Knowledge>;
+            //List<Knowledge> Knowledges = await deleteDelegate1(request);
+            //if(Knowledges.Count >0) {
+            //    foreach (Knowledge Knowledge in Knowledges)
+            //    {
+            //        if (Knowledge.type == 1)
+            //        {
+            //            List<Knowledge> knowledges = await _azureCosmos.FindSQL<Knowledge>("SELECT value(c) FROM c join a in c.points where c.pk='Knowledge'and  Contains(a, '" + Knowledge.id + "') = true ");
+            //            List<Resource> Resources = await _azureCosmos.FindSQL<Resource>("SELECT value(c) FROM c join a in c.points where c.pk='Resources' and  Contains(a, '" + Knowledge.id + "') = true ");
+            //            //select value(c) from c join A0  in c.points where 1=1  and A0 =  @points0
+            //            foreach (Knowledge knowledge in knowledges) knowledge.points.Remove(Knowledge.id);
+            //            foreach (Resource Resource in Resources) Resource.points.Remove(Knowledge.id);
+            //            await _azureCosmos.SaveOrUpdateAll(Resources);
+            //            await _azureCosmos.SaveOrUpdateAll(knowledges);
+            //        }
+            //    }
+            //    return Ok(new { Knowledges });
+            //}else
+            //{
+            //    return Ok(new { erro = ResponseCode.FAILED, v = "删除失败!" });
+
+            //}
             
         }
 
@@ -482,84 +481,37 @@ namespace TEAMModelOS.Controllers
                 blockPoints = trees;
             }
             return blockPoints;
-        }
-
-        private async Task<List<T>> Delete<T>(JsonElement request) where T : CosmosEntity
-        {
-            List<T> schoolBlocks = null;
-            //Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            int keys = 0;
-            while (emobj.MoveNext())
-            {
-                keys++;
-                //dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            if (keys > 0)
-            {
-                schoolBlocks = await _azureCosmos.FindByDict<T>(request);
-                Type t = typeof(T);
-                List<T> list = new List<T>();
-                if (schoolBlocks.IsNotEmpty())
-                {
-                    List<IdPk> idPks = await _azureCosmos.DeleteAll<T>(schoolBlocks);
-                    /*if (idPks.IsNotEmpty())
-                    {
-                        builder.Data("删除成功");
-                    }
-                    else
-                    {
-                        builder.Error(ResponseCode.FAILED, "删除失败!");
-
-                    }*/
-
-                }
-            }
-            else { /*builder.Error(ResponseCode.PARAMS_ERROR, "参数未定义!"); */}
-            return schoolBlocks;
-        }
+        }        
 
-        private async Task<List<IdPk>> DeleteKnowledge(List<IdPk> listPid)
-        {
-            List<IdPk> idPks = await _azureCosmos.DeleteAll<Knowledge>(listPid);
-            foreach (IdPk Knowledge in idPks)
-            {
-                List<Knowledge> knowledges = await _azureCosmos.FindSQL<Knowledge>($"select value(c) from c join A0  in c.points where 1=1 and c.pk='Knowledge'  and  c.type = 0 and A0 =  '" + Knowledge.id + "' ");
-                List<Resource> Resources = await _azureCosmos.FindSQL<Resource>($"select value(c) from c join A0  in c.points where 1=1 and c.pk='Resource' and  c.type = 0 and A0 =  '" + Knowledge.id + "' ");
-                foreach (Knowledge knowledge in knowledges) knowledge.points.Remove(Knowledge.id);
-                foreach (Resource Resource in Resources) Resource.points.Remove(Knowledge.id);
-                await _azureCosmos.SaveOrUpdateAll(Resources);
-                await _azureCosmos.SaveOrUpdateAll(knowledges);
-            }
-            return idPks;
-        }
+        // TODO 代码优化
 
         private async Task<List<Knowledge>> SaveOrUpdateKnowledge(List<Knowledge> request)
         {
-            foreach (Knowledge item in request)
-            {
-                if (item.id == null)
-                {
-                    item.id = _snowflakeId.NextId() + "";
-                }
-                if (item.type == 1 && item.points.Count > 0)
-                {
-                    List<string> vs = item.points;
-                    foreach (string s in vs)
-                    {
-                        List<Knowledge> knowledges = await _azureCosmos.FindByDict<Knowledge>(new Dictionary<string, object>() { { "id", s } });
-                        foreach (Knowledge knowledge in knowledges)
-                        {
-                            knowledge.points.Remove(item.id);
-                            knowledge.points.Add(item.id);
-                        }
-                        await _azureCosmos.SaveOrUpdateAll(knowledges);
-                    }
-                    item.points.Clear();
-                }
-            }
-            List<Knowledge> ts = await _azureCosmos.SaveOrUpdateAll(request);
-            return ts;
+            return new List<Knowledge>();
+            //foreach (Knowledge item in request)
+            //{
+            //    if (item.id == null)
+            //    {
+            //        item.id = _snowflakeId.NextId() + "";
+            //    }
+            //    if (item.type == 1 && item.points.Count > 0)
+            //    {
+            //        List<string> vs = item.points;
+            //        foreach (string s in vs)
+            //        {
+            //            List<Knowledge> knowledges = await _azureCosmos.FindByDict<Knowledge>(new Dictionary<string, object>() { { "id", s } });
+            //            foreach (Knowledge knowledge in knowledges)
+            //            {
+            //                knowledge.points.Remove(item.id);
+            //                knowledge.points.Add(item.id);
+            //            }
+            //            await _azureCosmos.SaveOrUpdateAll(knowledges);
+            //        }
+            //        item.points.Clear();
+            //    }
+            //}
+            //List<Knowledge> ts = await _azureCosmos.SaveOrUpdateAll(request);
+            //return ts;
         }
 
         #endregion

+ 1 - 1
TEAMModelOS/Startup.cs

@@ -93,7 +93,7 @@ namespace TEAMModelOS
             });
             services.AddAzureStorage(Configuration.GetValue<string>("Azure:Starage:ConnectionString"));
             services.AddAzureRedis(Configuration.GetValue<string>("Azure:Redis:ConnectionString"));
-            services.AddAzureCosmos(Configuration.GetSection("Azure:Cosmos").Get<AzureCosmosFactoryOptions>());
+            services.AddAzureCosmos(Configuration.GetValue<string>("Azure:Cosmos:ConnectionString"));
             services.AddAzureServiceBus(Configuration.GetValue<string>("Azure:ServiceBus:ConnectionString"));
             services.AddSnowflakeId(Convert.ToInt64(Configuration.GetValue<string>("Option:LocationNum")), 1);
             services.AddHttpClient();

+ 1 - 0
TEAMModelOS/TEAMModelOS.csproj

@@ -43,6 +43,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <Folder Include="Controllers\Task\" />
     <Folder Include="JwtRsaFile\" />
     <Folder Include="Services\Evaluation\" />
     <Folder Include="wwwroot\" />

+ 1 - 3
TEAMModelOS/appsettings.json

@@ -27,9 +27,7 @@
       "Container": "teammodelos"
     },
     "Cosmos": {
-      "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;",
-      "Database": [ "TEAMModelOS" ],
-      "ScanModel": [ "TEAMModelOS" ]
+      "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;"     
     },
     "Redis": {
       "ConnectionString": "CoreRedisCN.redis.cache.chinacloudapi.cn:6380,password=LyJWP1ORJdv+poXWofAF97lhCEQPg1wXWqvtzXGXQuE=,ssl=True,abortConnect=False,defaultDatabase=8,writeBuffer=10240,poolsize=50,prefix=habook:"