瀏覽代碼

1、修改cosmos删除接口DeleteAll接收参数
2、课纲、知识点、册别方法从contrillers移到service
3、新增自主学习接口。修改编序式
4、grpc课纲、知识点、册别

李思淳 5 年之前
父節點
當前提交
85e4ab365a
共有 34 個文件被更改,包括 3617 次插入434 次删除
  1. 1 7
      TEAMModelGrpc/Models/ListPid.cs
  2. 33 0
      TEAMModelGrpc/Models/Response.cs
  3. 99 0
      TEAMModelGrpc/Models/SyllabusTreeDto.cs
  4. 111 0
      TEAMModelGrpc/Protos/CourseService.proto
  5. 17 9
      TEAMModelGrpc/Protos/KnowledgeService.proto
  6. 121 0
      TEAMModelGrpc/Protos/SyllabusService.proto
  7. 49 0
      TEAMModelGrpc/Services/CourseService.cs
  8. 24 5
      TEAMModelGrpc/Services/KnowledgeService.cs
  9. 117 0
      TEAMModelGrpc/Services/SyllabusService.cs
  10. 67 0
      TEAMModelGrpc/Services/VolumeService.cs
  11. 4 0
      TEAMModelGrpc/TEAMModelGrpc.csproj
  12. 1285 0
      TEAMModelGrpc/TEAMModelOS.GRPC.xml
  13. 5 5
      TEAMModelOS.SDK/Module/AzureCosmosDBV3/AzureCosmosDBV3Repository.cs
  14. 1 1
      TEAMModelOS.SDK/Module/AzureCosmosDBV3/IAzureCosmosDBV3Repository.cs
  15. 11 8
      TEAMModelOS.Service/Models/Core/ClassRoomStudent.cs
  16. 145 0
      TEAMModelOS.Service/Models/Learn/HomeWork.cs
  17. 166 0
      TEAMModelOS.Service/Models/Learn/HomeWorkStudent.cs
  18. 69 65
      TEAMModelOS.Service/Models/Learn/LeanProcess.cs
  19. 149 0
      TEAMModelOS.Service/Models/Learn/LearningAutonomous.cs
  20. 20 3
      TEAMModelOS.Service/Models/Syllabus/SyllabusNode.cs
  21. 2 4
      TEAMModelOS.Service/Models/Syllabus/SyllabusTree.cs
  22. 60 2
      TEAMModelOS.Service/Models/Syllabus/SyllabusVolume.cs
  23. 15 7
      TEAMModelOS.Service/Services/Syllabus/Implement/KnowledgeService.cs
  24. 269 0
      TEAMModelOS.Service/Services/Syllabus/Implement/SyllabusService.cs
  25. 119 0
      TEAMModelOS.Service/Services/Syllabus/Implement/VolumeService.cs
  26. 2 0
      TEAMModelOS.Service/Services/Syllabus/Interface/IKnowledgeService.cs
  27. 34 0
      TEAMModelOS.Service/Services/Syllabus/Interface/ISyllabusService.cs
  28. 16 0
      TEAMModelOS.Service/Services/Syllabus/Interface/IVolumeService.cs
  29. 349 23
      TEAMModelOS.Service/TEAMModelOS.Model.xml
  30. 156 0
      TEAMModelOS/Controllers/Learn/HomeWorkController.cs
  31. 63 2
      TEAMModelOS/Controllers/Learn/LearnController.cs
  32. 1 0
      TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs
  33. 24 202
      TEAMModelOS/Controllers/Syllabus/SyllabusController.cs
  34. 13 91
      TEAMModelOS/Controllers/Syllabus/VolumeController.cs

+ 1 - 7
TEAMModelGrpc/Models/ListPid.cs

@@ -11,15 +11,9 @@ namespace TEAMModelGrpc.Models
     public class ListPid
     {
         /// <summary>
-        /// key 是pk ,value 是id
+        /// list IdPk
         /// </summary>
         [ProtoMember(1)]
-        public List<KeyValuePair<string, string>> ids { set; get; }
-
-        /// <summary>
-        /// 返回 删除结果
-        /// </summary>
-        [ProtoMember(2)]
         public List<IdPk> idPks { set; get; }
     }
 }

+ 33 - 0
TEAMModelGrpc/Models/Response.cs

@@ -0,0 +1,33 @@
+using ProtoBuf;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace TEAMModelGrpc.Models
+{
+    [ProtoContract]
+    public class Response
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        [ProtoMember(1)]
+        public string message { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        [ProtoMember(2)]
+        public int code { get; set; }
+
+        public Response Success()
+        {
+            this.code = 200;
+            this.message = "Success";
+            return this;
+        }
+
+
+    }
+
+}

+ 99 - 0
TEAMModelGrpc/Models/SyllabusTreeDto.cs

@@ -0,0 +1,99 @@
+using ProtoBuf;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.Service.Models.Syllabus;
+
+namespace TEAMModelGrpc.Models
+{
+    [ProtoContract]
+    public class SyllabusTreeDto
+    {
+        public SyllabusTreeDto()
+        {
+            children = new List<SyllabusTreeDto>();
+        }
+
+        [ProtoMember(16)]
+        public List<SyllabusTreeDto> children { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [ProtoMember(1)]
+        public string id { get; set; }
+        /// <summary>
+        /// 标题
+        /// </summary>
+        [ProtoMember(2)]
+        public string title { get; set; }
+        /// <summary>
+        /// 是否展开
+        /// </summary>
+        [ProtoMember(3)]
+        public bool expand { get; set; }
+        /// <summary>
+        /// 是否编辑
+        /// </summary>
+        [ProtoMember(4)]
+        public bool editable { get; set; } = true;
+        /// <summary>
+        /// 版本
+        /// </summary>
+        [ProtoMember(5)]
+        public string version { get; set; }
+        /// <summary>
+        /// 排序
+        /// </summary>
+        [ProtoMember(6)]
+        public int order { get; set; }
+        /// <summary>
+        /// 类型
+        /// </summary>
+        [ProtoMember(7)]
+        public int type { get; set; }
+        /// <summary>
+        /// 备注
+        /// </summary>
+        //public string remark { get; set; }
+        /// <summary>
+        /// 节点Key
+        /// </summary>
+        [ProtoMember(8)]
+        public string nodeKey { get; set; }
+        ///// <summary>
+        /////主键
+        ///// </summary>
+        //[Required(ErrorMessage = "{0} 必须填写")]
+        //public string Id { get; set; }
+        /// <summary>
+        /// 父级
+        /// </summary>
+        [ProtoMember(9)]
+        public string pid { get; set; }
+
+        /// <summary>
+        /// 册别编码
+        /// </summary>
+        [ProtoMember(10)]
+        public string volumeCode { get; set; }
+
+        /// <summary>
+        /// 数据状态
+        /// </summary>
+        [ProtoMember(11)]
+        public int status { get; set; } = 1;
+
+        [ProtoMember(12)]
+        public List<string> resources { get; set; }
+        [ProtoMember(13)]
+        public List<string> knowledges { get; set; }
+
+        [ProtoMember(14)]
+        public bool resource { get; set; }
+        [ProtoMember(15)]
+        public bool knowledge { get; set; }
+    }
+}

+ 111 - 0
TEAMModelGrpc/Protos/CourseService.proto

@@ -1,11 +1,19 @@
 syntax = "proto3";
 option csharp_namespace = "TMDGrpc.CourseService";
+option java_package = "TMDGrpc.CourseService";
 package math;
 
 
 service CourseService {
+   //查询课程
    rpc FindCourseByDict(Dict) returns(stream Course);
 
+   //保存课程
+   rpc SaveCourse(stream Course) returns(stream Course);
+
+   //删除课程
+   rpc DeleteCourse(ListPid) returns(ListPid);
+
 }
 
 
@@ -50,29 +58,132 @@ message LSMap {
    repeated string Value = 2;
 }
 
+//基础信息
 message BaseInfo {
+   //课程编码
    string courseCode = 1;
+   //课程名称
    string courseName = 2;
+   //学段编码
    string periodCode = 3;
+   //年级编码
    string gradeCode = 4;
+   //学科编码
    string subjectCode = 5;
+   //课程公告
    string notice = 6;
 }
 
+//课程
 message Course {
+   //学校编码 如果是教师私人知识点 则为 personal(写死) 否则为学校编码
    string scopeCode = 1;
+   //基础信息
    BaseInfo baseInfo = 2;
+   //协同教师
    repeated string assistTeacher = 3;
+   //上课时间表
    repeated CourseTime courseTime = 4;
+   //课程“教室” Classroom
    repeated string classroom = 5;
+   //关联课纲 SyllabusNode
    repeated string syllabus = 6;
+   //id
    string id = 7;
 }
 
+//上课时间表
 message CourseTime {
+   //上课频率 每日、每周、每月、临时课程
    string frequencyCode = 1;
+   //课程开始时间
    string beginTime = 2;
+   //课程结束时间
    string endTime = 3;
+   //上课班级/教室
    string classroomCode = 4;
+   //临时课程
    string frequencyName = 5;
+}
+
+enum HttpStatusCode {
+   option allow_alias = true;
+   ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything)
+   Continue = 100;
+   SwitchingProtocols = 101;
+   Processing = 102;
+   EarlyHints = 103;
+   OK = 200;
+   Created = 201;
+   Accepted = 202;
+   NonAuthoritativeInformation = 203;
+   NoContent = 204;
+   ResetContent = 205;
+   PartialContent = 206;
+   MultiStatus = 207;
+   AlreadyReported = 208;
+   IMUsed = 226;
+   Ambiguous = 300;
+   MultipleChoices = 300;
+   MovedPermanently = 301;
+   Moved = 301;
+   Found = 302;
+   Redirect = 302;
+   SeeOther = 303;
+   RedirectMethod = 303;
+   NotModified = 304;
+   UseProxy = 305;
+   Unused = 306;
+   TemporaryRedirect = 307;
+   RedirectKeepVerb = 307;
+   PermanentRedirect = 308;
+   BadRequest = 400;
+   Unauthorized = 401;
+   PaymentRequired = 402;
+   Forbidden = 403;
+   NotFound = 404;
+   MethodNotAllowed = 405;
+   NotAcceptable = 406;
+   ProxyAuthenticationRequired = 407;
+   RequestTimeout = 408;
+   Conflict = 409;
+   Gone = 410;
+   LengthRequired = 411;
+   PreconditionFailed = 412;
+   RequestEntityTooLarge = 413;
+   RequestUriTooLong = 414;
+   UnsupportedMediaType = 415;
+   RequestedRangeNotSatisfiable = 416;
+   ExpectationFailed = 417;
+   MisdirectedRequest = 421;
+   UnprocessableEntity = 422;
+   Locked = 423;
+   FailedDependency = 424;
+   UpgradeRequired = 426;
+   PreconditionRequired = 428;
+   TooManyRequests = 429;
+   RequestHeaderFieldsTooLarge = 431;
+   UnavailableForLegalReasons = 451;
+   InternalServerError = 500;
+   NotImplemented = 501;
+   BadGateway = 502;
+   ServiceUnavailable = 503;
+   GatewayTimeout = 504;
+   HttpVersionNotSupported = 505;
+   VariantAlsoNegotiates = 506;
+   InsufficientStorage = 507;
+   LoopDetected = 508;
+   NotExtended = 510;
+   NetworkAuthenticationRequired = 511;
+}
+
+message IdPk {
+   string id = 1;
+   string pk = 2;
+   HttpStatusCode StatusCode = 3;
+}
+
+message ListPid {
+   //list IdPk
+   repeated IdPk idPks = 1;
 }

+ 17 - 9
TEAMModelGrpc/Protos/KnowledgeService.proto

@@ -1,13 +1,17 @@
 syntax = "proto3";
 option csharp_namespace = "TMDGrpc.KnowledgeService";
+option java_package = "TMDGrpc.KnowledgeService";
 package math;
 
 
 service KnowledgeService {
+   //查询知识点
    rpc FinKnowledge(Dict) returns(stream Knowledge);
 
+   //保存知识点
    rpc SaveKnowledge(stream Knowledge) returns(stream Knowledge);
 
+   //删除知识点
    rpc DeleteKnowledge(ListPid) returns(ListPid);
 
 }
@@ -54,18 +58,29 @@ message LSMap {
    repeated string Value = 2;
 }
 
+//知识点
 message Knowledge {
    string id = 1;
+   //标记为知识块,0=知识块 ,1 知识点
    int32 type = 2;
+   //名称
    string name = 3;
+   //描述
    string alias = 4;
+   //学科
    string subjectCode = 5;
+   //学校编码 如果是教师私人知识点为醍摩豆id 否则为学校编码
    string scopeCode = 6;
    int32 order = 7;
+   //删除状态0 删除 1 有效
    int32 status = 8;
+   //知识点 id
    repeated string points = 9;
+   //来自于标准表 Rowkey
    string knowledgeId = 10;
+   //0 标准,1自建,2.....
    int32 source = 11;
+   //学段 私有的没有学段
    string period = 12;
 }
 
@@ -146,14 +161,7 @@ message IdPk {
    HttpStatusCode StatusCode = 3;
 }
 
-message KeyValuePair_String_String {
-   string Key = 1;
-   string Value = 2;
-}
-
 message ListPid {
-   //key 是pk ,value 是id
-   repeated KeyValuePair_String_String ids = 1;
-   //返回 删除结果
-   repeated IdPk idPks = 2;
+   //list IdPk
+   repeated IdPk idPks = 1;
 }

+ 121 - 0
TEAMModelGrpc/Protos/SyllabusService.proto

@@ -0,0 +1,121 @@
+syntax = "proto3";
+option csharp_namespace = "TMDGrpc.SyllabusService";
+option java_package = "TMDGrpc.SyllabusService";
+package math;
+
+
+service SyllabusService {
+   //查找课纲
+   rpc FindSyllabusTree(Dict) returns(stream SyllabusTreeDto);
+
+   //按节点新增课纲
+   rpc SaveOrUpdateAsNodes(stream SyllabusNode) returns(Response);
+
+   //按树形新增课纲结构
+   rpc SaveOrUpdateAsTree(stream SyllabusTreeDto) returns(stream SyllabusTreeDto);
+
+}
+
+
+
+//请求参数Dict
+message Dict {
+   //数字Dict
+   map<string,double> NMap = 1;
+   //字符串Dict
+   map<string,string> SMap = 2;
+   //布尔Dict
+   map<string,bool> BMap = 3;
+   //字符串ListMap
+   repeated LSMap LSMap = 4;
+   //数字ListMap
+   repeated LNMap LNMap = 5;
+   //Byte ListMap
+   repeated LBMap LBMap = 6;
+}
+
+//Byte[] Map
+message LBMap {
+   //Key
+   string Key = 1;
+   //byte数组
+   bytes Value = 2;
+}
+
+//数字ListMap
+message LNMap {
+   //Key
+   string Key = 1;
+   //数字数组
+   repeated double Value = 2 [packed = false];
+}
+
+//字符串ListMap
+message LSMap {
+   //数字Dict
+   string Key = 1;
+   //字符串数组
+   repeated string Value = 2;
+}
+
+message SyllabusNode {
+   string id = 1;
+   //标题
+   string title = 2;
+   //是否展开
+   bool expand = 3;
+   //是否编辑
+   bool editable = 4;
+   //版本
+   string version = 5;
+   //排序
+   int32 order = 6;
+   //类型
+   int32 type = 7;
+   //节点Key
+   string nodeKey = 8;
+   //父级
+   string pid = 9;
+   //册别编码
+   string volumeCode = 10;
+   //数据状态
+   int32 status = 11;
+   repeated string resources = 12;
+   repeated string knowledges = 13;
+   bool resource = 14;
+   bool knowledge = 15;
+}
+
+message SyllabusTreeDto {
+   string id = 1;
+   //标题
+   string title = 2;
+   //是否展开
+   bool expand = 3;
+   //是否编辑
+   bool editable = 4;
+   //版本
+   string version = 5;
+   //排序
+   int32 order = 6;
+   //类型
+   int32 type = 7;
+   //节点Key
+   string nodeKey = 8;
+   //父级
+   string pid = 9;
+   //册别编码
+   string volumeCode = 10;
+   //数据状态
+   int32 status = 11;
+   repeated string resources = 12;
+   repeated string knowledges = 13;
+   bool resource = 14;
+   bool knowledge = 15;
+   repeated SyllabusTreeDto children = 16;
+}
+
+message Response {
+   string message = 1;
+   int32 code = 2;
+}

+ 49 - 0
TEAMModelGrpc/Services/CourseService.cs

@@ -20,6 +20,14 @@ namespace TEAMModelGrpc.Services
             this._cosmos = cosmosDBV3Repository;
         }
 
+
+        /// <summary>
+        /// 查询课程
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
         [Authorize]
         public async Task FindCourseByDict(Dict request, IServerStreamWriter<Course> responseStream, ServerCallContext context)
         {
@@ -35,5 +43,46 @@ namespace TEAMModelGrpc.Services
 
 
         }
+
+        /// <summary>
+        /// 保存课程
+        /// </summary>
+        /// <param name="requestStream"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        [Authorize]
+        public async Task SaveCourse(IAsyncStreamReader<Course> requestStream, IServerStreamWriter<Course> responseStream, ServerCallContext context)
+        {
+            //Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
+            //keyValuePairs = request.ToDict();
+            List<Course> knowledges = new List<Course>();
+            await foreach (var message in requestStream.ReadAllAsync())
+            {
+                knowledges.Add(message);
+            }
+
+            await _cosmos.SaveOrUpdateAll(knowledges);
+
+            knowledges.ForEach(x =>
+            {
+                responseStream.WriteAsync(x);
+            });
+        }
+
+
+        /// <summary>
+        /// 删除课程
+        /// </summary>
+        /// <param name="listPid"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        [Authorize]
+        public async Task<ListPid> DeleteCourse(ListPid listPid, ServerCallContext context)
+        {
+            List<IdPk> idPks = await _cosmos.DeleteAll<Course>(listPid.idPks);
+            listPid.idPks = idPks;
+            return listPid;
+        }
     }
 }

+ 24 - 5
TEAMModelGrpc/Services/KnowledgeService.cs

@@ -15,9 +15,7 @@ using TEAMModelOS.Service.Services.Syllabus.Interface;
 
 namespace TEAMModelGrpc.Services
 {
-    /// <summary>
-    /// 
-    /// </summary>
+ 
     public class KnowledgeService : IGrpcService
     {
         private IAzureCosmosDBV3Repository cosmosDBV3Repository;
@@ -29,6 +27,14 @@ namespace TEAMModelGrpc.Services
             this.knowledgeService = knowledgeService;
         }
 
+
+        /// <summary>
+        /// 查询知识点
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
         [Authorize]
         public async Task FinKnowledge(Dict request, IServerStreamWriter<Knowledge> responseStream, ServerCallContext context)
         {
@@ -42,6 +48,13 @@ namespace TEAMModelGrpc.Services
         }
 
 
+        /// <summary>
+        /// 保存知识点
+        /// </summary>
+        /// <param name="requestStream"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
         [Authorize]
         public async Task SaveKnowledge(IAsyncStreamReader<Knowledge> requestStream, IServerStreamWriter<Knowledge> responseStream, ServerCallContext context)
         {
@@ -62,10 +75,16 @@ namespace TEAMModelGrpc.Services
         }
 
 
+        /// <summary>
+        /// 删除知识点
+        /// </summary>
+        /// <param name="listPid"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        [Authorize]
         public async Task<ListPid> DeleteKnowledge(ListPid listPid, ServerCallContext context)
         {
-           List<IdPk> idPks = await cosmosDBV3Repository.DeleteAll<Knowledge>(listPid.ids);
-
+            List<IdPk> idPks = await knowledgeService.DeleteKnowledge(listPid.idPks);//await cosmosDBV3Repository.DeleteAll<Knowledge>(listPid.idPks);
             listPid.idPks = idPks;
             return listPid;
         }

+ 117 - 0
TEAMModelGrpc/Services/SyllabusService.cs

@@ -0,0 +1,117 @@
+using Grpc.Core;
+using Grpc.Extension.Abstract;
+using Microsoft.AspNetCore.Authorization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelGrpc.Models;
+using TEAMModelOS.SDK.Helper.Common.JsonHelper;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
+
+namespace TEAMModelGrpc.Services
+{
+    public class SyllabusService : IGrpcService
+    {
+        private ISyllabusService syllabusService;
+        private IAzureCosmosDBV3Repository cosmosDBV3Repository;
+
+        public SyllabusService(ISyllabusService syllabusService, IAzureCosmosDBV3Repository cosmosDBV3Repository)
+        {
+            this.syllabusService = syllabusService;
+            this.cosmosDBV3Repository = cosmosDBV3Repository;
+        }
+
+
+        /// <summary>
+        /// 查找课纲 
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        [Authorize]
+        public async Task FindSyllabusTree(Dict request, IServerStreamWriter<SyllabusTreeDto> responseStream, ServerCallContext context) 
+        {
+            Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
+            keyValuePairs = request.ToDict();
+            List<SyllabusTree> knowledges = await syllabusService.Find(keyValuePairs);
+            List<SyllabusTreeDto> list = knowledges.ToJson().FromJson<List<SyllabusTreeDto>>();
+
+            list.ForEach(x =>
+            {
+                responseStream.WriteAsync(x);
+            });
+        }
+
+        /// <summary>
+        /// 按节点新增课纲
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        public async Task<Response> SaveOrUpdateAsNodes(IAsyncStreamReader<SyllabusNode> requestStream,  ServerCallContext context) 
+        {
+
+            List<SyllabusNode> syllabusNodes = new List<SyllabusNode>();
+            await foreach (SyllabusNode syllabusNode in requestStream.ReadAllAsync()) 
+            {
+                syllabusNodes.Add(syllabusNode);
+            }
+
+            await syllabusService.SaveOrUpdateAsNodes(syllabusNodes);
+            Response response = new Response();
+            return response.Success();
+        }
+
+        /// <summary>
+        /// 按树形新增课纲结构
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        public async Task SaveOrUpdateAsTree(IAsyncStreamReader<SyllabusTreeDto> requestStream, IServerStreamWriter<SyllabusTreeDto> responseStream, ServerCallContext context)
+        {
+
+            List<SyllabusTree> syllabusTrees = new List<SyllabusTree>();
+            List<SyllabusTreeDto> syllabusTreeDtos = new List<SyllabusTreeDto>();
+            await foreach (SyllabusTreeDto syllabusNode in requestStream.ReadAllAsync())
+            {
+                syllabusTreeDtos.Add(syllabusNode);
+                SyllabusTree syllabusTree = syllabusNode.ToJson().FromJson<SyllabusTree>();
+                syllabusTrees.Add(syllabusTree);
+            }
+            await syllabusService.SaveOrUpdateAsTree(syllabusTrees);
+
+            syllabusTreeDtos.ForEach(x => {
+                responseStream.WriteAsync(x);
+            });
+        }
+
+
+        /// <summary>
+        /// 删除课纲
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        [Authorize]
+        public async Task DeleteSyllabus(Dict request, IServerStreamWriter<SyllabusTreeDto> responseStream, ServerCallContext context)
+        {
+            Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
+            keyValuePairs = request.ToDict();
+            List<Syllabuses> syllabuses = await syllabusService.DeleteSyllabus(keyValuePairs);//await cosmosDBV3Repository.DeleteAll<Knowledge>(listPid.idPks);
+            List<SyllabusTreeDto> syllabusTreeDtos = syllabuses.ToJson().FromJson<List<SyllabusTreeDto>>();
+
+            syllabusTreeDtos.ForEach(x => { 
+                responseStream.WriteAsync(x);
+            });
+        }
+
+
+    }
+}

+ 67 - 0
TEAMModelGrpc/Services/VolumeService.cs

@@ -0,0 +1,67 @@
+using Grpc.Core;
+using Grpc.Extension.Abstract;
+using Microsoft.AspNetCore.Authorization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelGrpc.Models;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
+
+namespace TEAMModelGrpc.Services
+{
+    public class VolumeService :IGrpcService
+    {
+        private readonly IAzureCosmosDBV3Repository azureCosmosDBRepository;
+        private IVolumeService volumeService;
+
+        public VolumeService(IAzureCosmosDBV3Repository azureCosmosDBRepository, IVolumeService volumeService)
+        {
+            this.azureCosmosDBRepository = azureCosmosDBRepository;
+            this.volumeService = volumeService;
+        }
+
+        /// <summary>
+        /// 保存册别
+        /// </summary>
+        /// <param name="requestStream"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        [Authorize]
+        public async Task SaveOrUpdateVolume(IAsyncStreamReader<SyllabusVolume> requestStream, IServerStreamWriter<SyllabusVolume> responseStream, ServerCallContext context) {
+
+            List<SyllabusVolume> volumes = new List<SyllabusVolume>();
+            await foreach (SyllabusVolume syllabusNode in requestStream.ReadAllAsync())
+            {
+                List<SyllabusVolume> volume = await volumeService.SaveOrUpdateVolume(syllabusNode);
+                volumes.AddRange(volume);
+            }
+            volumes.ForEach(x => {
+                responseStream.WriteAsync(x);
+            });
+        }
+
+        /// <summary>
+        /// 查询册别
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        [Authorize]
+        public async Task FindVolume(Dict request, IServerStreamWriter<SyllabusVolume> responseStream, ServerCallContext context) {
+
+            Dictionary<string, object> dict = request.ToDict();
+
+            List<SyllabusVolume> syllabusVolumes = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(dict);
+
+            syllabusVolumes.ForEach(x => { 
+                responseStream.WriteAsync(x);
+            });
+        }
+
+    }
+}

+ 4 - 0
TEAMModelGrpc/TEAMModelGrpc.csproj

@@ -8,10 +8,14 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
     <DocumentationFile>TEAMModelOS.GRPC.xml</DocumentationFile>
   </PropertyGroup>
+  <ItemGroup>
+    <None Remove="Protos\SyllabusService.proto" />
+  </ItemGroup>
   <ItemGroup>
     <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
     <Protobuf Include="Protos\CourseService.proto" GrpcServices="Server" />
     <Protobuf Include="Protos\KnowledgeService.proto" GrpcServices="Server" />
+    <Protobuf Include="Protos\SyllabusService.proto" GrpcServices="Server" />
   </ItemGroup>
 
   <ItemGroup>

文件差異過大導致無法顯示
+ 1285 - 0
TEAMModelGrpc/TEAMModelOS.GRPC.xml


+ 5 - 5
TEAMModelOS.SDK/Module/AzureCosmosDBV3/AzureCosmosDBV3Repository.cs

@@ -254,7 +254,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
         }
 
 
-        public async Task<List<IdPk>> DeleteAll<T>(List<KeyValuePair<string, string>> ids) where T : ID
+        public async Task<List<IdPk>> DeleteAll<T>(List<IdPk> ids) where T : ID
         {
             CosmosModelInfo container = await InitializeCollection<T>();
             //string partitionKey = GetPartitionKey<T>();
@@ -268,16 +268,16 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
             Stopwatch stopwatch = Stopwatch.StartNew();
             for (int i = 0; i < pages; i++)
             {
-                List<KeyValuePair<string, string>> lists = ids.Skip((i) * pageSize).Take(pageSize).ToList();
+                List<IdPk> lists = ids.Skip((i) * pageSize).Take(pageSize).ToList();
                 List<Task> tasks = new List<Task>(lists.Count);
                 lists.ForEach(item =>
                 {
-                    tasks.Add(container.container.DeleteItemStreamAsync(item.Value, new PartitionKey(item.Key))
+                    tasks.Add(container.container.DeleteItemStreamAsync(item.id, new PartitionKey(item.pk))
                         .ContinueWith((Task<ResponseMessage> task) =>
                         {
                              using (ResponseMessage response = task.Result)
                            {
-                                idPks.Add(new IdPk { id = item.Value, pk = item.Key.ToString(), StatusCode = response.StatusCode });
+                                idPks.Add(new IdPk { id = item.id, pk = item.pk.ToString(), StatusCode = response.StatusCode });
                                 //    if (!response.IsSuccessStatusCode)
                                 //    {
                                 //    }
@@ -289,7 +289,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
                 if (container.cache && RedisHelper.Instance != null)
                 {
                     lists.ForEach(async x => {
-                        await RedisHelper.HDelAsync(CacheCosmosPrefix + container.container.Id,x.Value );
+                        await RedisHelper.HDelAsync(CacheCosmosPrefix + container.container.Id,x.id );
                     });
                 }
             }

+ 1 - 1
TEAMModelOS.SDK/Module/AzureCosmosDBV3/IAzureCosmosDBV3Repository.cs

@@ -31,7 +31,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
         Task<IdPk> DeleteAsync<T>(string id, string pk) where T : ID;
         Task<IdPk> DeleteAsync<T>(IdPk idPk) where T : ID;
         Task<List<IdPk>> DeleteAll<T>(List<T> entities) where T : ID;
-        Task<List<IdPk>> DeleteAll<T>(List<KeyValuePair<string, string>> ids) where T : ID;
+        Task<List<IdPk>> DeleteAll<T>(List<IdPk> ids) where T : ID;
         Task<List<IdPk>> DeleteAll<T>(Dictionary<string, object> dict) where T : ID;
         Task<T> Update<T>(T entity) where T : ID;
         Task<List<T>> UpdateAll<T>(List<T> entities) where T : ID;

+ 11 - 8
TEAMModelOS.Service/Models/Core/ClassRoomStudent.cs

@@ -10,6 +10,9 @@ namespace TEAMModelOS.Service.Models.Core
     [CosmosDB(RU = 400, Name = "CoreClassroomStudent",Cache = true)]
     public class ClassroomStudent:ID
     {
+        /// <summary>
+        /// classroomCode
+        /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
         public string id { get; set; } //classroomCode
 
@@ -19,16 +22,16 @@ namespace TEAMModelOS.Service.Models.Core
 
         public HashSet<string> studentId { get; set; }
 
-        public class Stu
-        {
-            public string studentId { get; set; }
+        //public class Stu
+        //{
+        //    public string studentId { get; set; }
 
-            /// <summary>
-            /// 座位
-            /// </summary>
-            public int seatNo { get; set; }
+        //    /// <summary>
+        //    /// 座位
+        //    /// </summary>
+        //    public int seatNo { get; set; }
 
-        }
+        //}
 
     }
 }

+ 145 - 0
TEAMModelOS.Service/Models/Learn/HomeWork.cs

@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Exam.Models;
+
+namespace TEAMModelOS.Service.Models.Learn
+{
+    /// <summary>
+    /// 作业
+    /// </summary>
+    [CosmosDB(RU = 400, Name = "HomeWork")]
+    public class HomeWork:ID
+    {
+        public HomeWork()
+        {
+            target = new List<Target>();
+            resource = new List<ProcessRes>();
+        }
+
+        public string id { get; set; }
+
+        [PartitionKey]
+        public string scopeCode { get; set; }
+
+
+        /// <summary>
+        /// 作业名称
+        /// </summary>
+        public string name { get; set; }
+
+        /// <summary>
+        /// 作业发布对象
+        /// </summary>
+        public List<Target> target { get; set; }
+
+        /// <summary>
+        /// 发布模式 0 立即发布 1 定时
+        /// </summary>
+        public string publishModel { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public long startTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public long endTime { get; set; }
+
+        /// <summary>
+        /// 作业反馈类型
+        /// </summary>
+        //public string feedbackType { get; set; }
+
+        /// <summary>
+        /// 题目
+        /// </summary>
+        //public List<ExamItem> ExamItem { get; set; }
+
+
+
+        /// <summary>
+        /// 作业描述
+        /// </summary>
+        public string description { get; set; }
+
+  
+        /// <summary>
+        /// 作业附件
+        /// </summary>
+        public List<ProcessRes> resource { get; set; }
+
+
+        //public Subdto subdto { get; set; }
+
+        /// <summary>
+        /// 通知方式 0电子纸条 1 学生Email 2 家长Email
+        /// </summary>
+        //public string noticeMode { get; set; }
+
+        //public class Subdto {
+        //    /// <summary>
+        //    /// 提交人数
+        //    /// </summary>
+        //    public int submitted { get; set; }
+            
+        //    /// <summary>
+        //    /// 总人数
+        //    /// </summary>
+        //    public int sum { get; set; }
+
+        //}
+
+
+        /// <summary>
+        /// 发布对象
+        /// </summary>
+        public class Target {
+
+            public string classroomCode { get; set; }
+
+            public string scopeCode { get; set; }
+        }
+
+        /// <summary>
+        /// 作业附件
+        /// </summary>
+        public class ProcessRes
+        {
+            /// <summary>
+            /// 文件名字
+            /// </summary>
+            public string fileName { get; set; }
+            
+            /// <summary>
+            /// 
+            /// </summary>
+            public string blobUrl { get; set; }
+
+            /// <summary>
+            /// 文件大小
+            /// </summary>
+            public long size { get; set; }
+
+            /// <summary>
+            /// 缩略图链接  图片视频有 文件没有
+            /// </summary>
+            public string compressUrl { get; set; }
+
+            /// <summary>
+            /// 文件类型
+            /// </summary>
+            public string type { get; set; }
+
+            public int order { get; set; }
+
+        }
+
+
+    }
+}

+ 166 - 0
TEAMModelOS.Service/Models/Learn/HomeWorkStudent.cs

@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Exam.Models;
+
+namespace TEAMModelOS.Service.Models.Learn
+{
+
+    /// <summary>
+    /// 作业数据
+    /// </summary>
+    [CosmosDB(RU = 400, Name = "HomeWorkStudent")]
+    public class HomeWorkStudent : ID
+    {
+        public HomeWorkStudent(){
+            content = new List<HomeWorkContent>();
+            comments = new List<HomeWorkComment>();
+        }
+        public string id { get; set; }
+
+        [PartitionKey]
+        public string homeWorkId { get; set; }
+
+
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string name { get; set; }
+
+
+        /// <summary>
+        /// 醍摩豆id
+        /// </summary>
+        public string TEAMModelId { get; set; }
+        
+        /// <summary>
+        /// 上课班级
+        /// </summary>
+        public string classroomCode { get; set; }
+
+        /// <summary>
+        /// 原生班级
+        /// </summary>
+        public string nativeroomCode { get; set; }
+
+
+        /// <summary>
+        /// 学号
+        /// </summary>
+        public string studentId { get; set; }
+
+        /// <summary>
+        /// 是否提交
+        /// </summary>
+        public bool submissionBool { get; set; } = false;
+        
+        /// <summary>
+        /// 提交时间
+        /// </summary>
+        public string submissionTime { get; set; }
+        
+        /// <summary>
+        /// 分数
+        /// </summary>
+        public string score { get; set; }
+
+        /// <summary>
+        /// 作业内容
+        /// </summary>
+        public List<HomeWorkContent> content { get; set; }
+
+
+        /// <summary>
+        /// 作业评论
+        /// </summary>
+        public List<HomeWorkComment> comments { get; set; }
+    }
+
+    /// <summary>
+    /// 作业内容
+    /// </summary>
+    public class HomeWorkContent {
+
+        /// <summary>
+        /// 作业反馈类型
+        /// </summary>
+        //public string feedbackType { get; set; }
+
+        /// <summary>
+        /// 在线编辑模式 作答记录
+        /// </summary>
+        //public List<ExamAnswer> examAnswers { get; set; }
+
+        /// <summary>
+        /// 作答记录
+        /// </summary>
+        public string answers { get; set; }
+
+        /// <summary>
+        ///  其他模式url 及name
+        /// </summary>
+        public List<ProcessRes> resource { get; set; }
+
+    }
+
+
+    public class ProcessRes
+    {
+        /// <summary>
+        /// 文件名字
+        /// </summary>
+        public string fileName { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string blobUrl { get; set; }
+
+        /// <summary>
+        /// 文件大小
+        /// </summary>
+        public long size { get; set; }
+
+        /// <summary>
+        /// 缩略图链接  图片视频有 文件没有
+        /// </summary>
+        public string compressUrl { get; set; }
+
+        /// <summary>
+        /// 文件类型
+        /// </summary>
+        public string type { get; set; }
+
+        public int order { get; set; }
+
+    }
+
+    /// <summary>
+    /// 作业评论
+    /// </summary>
+    public class HomeWorkComment {
+        /// <summary>
+        /// 评论者姓名
+        /// </summary>
+        public string name { get; set; }
+
+        /// <summary>
+        /// 醍摩豆id
+        /// </summary>
+        public string TEAMModelId { get; set; }
+
+        /// <summary>
+        /// 评论者身份 教师 学生
+        /// </summary>
+        public string identity { get; set; }
+
+        /// <summary>
+        /// 评语
+        /// </summary>
+        public string comment { get; set; }
+
+    }
+
+}

+ 69 - 65
TEAMModelOS.Service/Models/Learn/LeanProcess.cs

@@ -17,11 +17,11 @@ namespace TEAMModelOS.Service.Models.Learn
     {
 
         public LeanProcess() {
-            target = new List<string>();
-            steps = new List<ProcessStep>();
+            steps = new List<LearnUnit>();
         }
         
         public string id { get; set; }
+
         public string name { get; set; }
 
         [Required(ErrorMessage = "{0} 必须填写")]
@@ -32,92 +32,96 @@ namespace TEAMModelOS.Service.Models.Learn
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
         public string periodCode { get; set; }
+
+
         /// <summary>
         /// 活动介绍
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
         public string Introduce { get; set; }
+
+
         /// <summary>
         /// 学习对象
         /// </summary>
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public List<string> target { get; set; }
+        //public List<Target> target { get; set; }
+
+
         [Required(ErrorMessage = "{0} 必须填写")]
         [PartitionKey]
         public string scopeCode { get; set; }
-        /// <summary>
-        /// 步骤
-        /// </summary>
-        public List<ProcessStep> steps { get; set; }
-        /// <summary>
-        /// 是否闯关模式 0 或 1 vue组件不支持true false
-        /// </summary>
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public string isOrder { get; set; }
 
-        //创建时间 
-        public long createTime { get; set; }
-        //创建者
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public string creator { get; set; }
 
         /// <summary>
-        /// 编序式模板,课前预习,随堂练习,课后作业
+        /// 最小单元
         /// </summary>
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public string type { get; set; }
-        /// <summary>
-        /// 截至时间 时间戳
-        /// </summary>
-        public int expire { get; set; }
-    }
+        public List<LearnUnit> steps { get; set; }
+       
 
+        //创建时间 
+        //public long createTime { get; set; }
 
-    public class ProcessStep
-    {
-        public ProcessStep() {
-            resource = new List<ProcessRes>();
-            item = new List<ExamItem>();
-        }
-        /// <summary>
-        /// 资源内容
-        /// [{"name":"","url":"","order":""}]
-        /// </summary>
-        public List<ProcessRes> resource { get; set; }
-        /// <summary>
-        /// 题目
-        /// </summary>
-        public List<ExamItem> item { get; set; }
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public string name { get; set; }
-        public int order { get; set; }
-    }
-  
-    public class ProcessRes{
 
+        //创建者
         [Required(ErrorMessage = "{0} 必须填写")]
-        public string fileName { get; set; }
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public string blobUrl { get; set; }
-        public int order { get; set; }
-
-        /// <summary>
-        /// 文件大小
-        /// </summary>
-        public long size { get; set; }
+        public string creator { get; set; }
+        
+        public class Target
+        {
+            public string classroomCode { get; set; }
 
-        /// <summary>
-        /// 缩略图链接  图片视频有 文件没有
-        /// </summary>
-        public string compressUrl { get; set; }
+            public string scopeCode { get; set; }
+        }
 
-        /// <summary>
-        /// 文件类型
-        /// </summary>
-        public string type { get; set; }
 
+    }
 
 
-    }
+    //public class ProcessStep
+    //{
+    //    public ProcessStep() {
+    //        resource = new List<ProcessRes>();
+    //        item = new List<ExamItem>();
+    //    }
+    //    /// <summary>
+    //    /// 资源内容
+    //    /// [{"name":"","url":"","order":""}]
+    //    /// </summary>
+    //    public List<ProcessRes> resource { get; set; }
+    //    /// <summary>
+    //    /// 题目
+    //    /// </summary>
+    //    public List<ExamItem> item { get; set; }
+    //    [Required(ErrorMessage = "{0} 必须填写")]
+    //    public string name { get; set; }
+    //    public int order { get; set; }
+    //}
+
+    //public class ProcessRes{
+
+    //    [Required(ErrorMessage = "{0} 必须填写")]
+    //    public string fileName { get; set; }
+    //    [Required(ErrorMessage = "{0} 必须填写")]
+    //    public string blobUrl { get; set; }
+    //    public int order { get; set; }
+
+    //    /// <summary>
+    //    /// 文件大小
+    //    /// </summary>
+    //    public long size { get; set; }
+
+    //    /// <summary>
+    //    /// 缩略图链接  图片视频有 文件没有
+    //    /// </summary>
+    //    public string compressUrl { get; set; }
+
+    //    /// <summary>
+    //    /// 文件类型
+    //    /// </summary>
+    //    public string type { get; set; }
+
+
+
+    //}
 
 }

+ 149 - 0
TEAMModelOS.Service/Models/Learn/LearningAutonomous.cs

@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+using TEAMModelOS.SDK.Context.Attributes.Azure;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Exam.Models;
+
+namespace TEAMModelOS.Service.Models.Learn
+{
+    /// <summary>
+    /// 自主学习
+    /// </summary>
+    [CosmosDB(RU = 400, Name = "LearningAutonomous")]
+    public class LearningAutonomous:ID
+    {
+
+        public LearningAutonomous()
+        {
+            target = new List<Target>();
+            steps = new List<ProcessStep>();
+        }
+
+        public string id { get; set; }
+
+        /// <summary>
+        /// 活动名称
+        /// </summary>
+        public string name { get; set; }
+
+        /// <summary>
+        /// 学科code
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string subjectCode { get; set; }
+
+        /// <summary>
+        /// 学段code
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string periodCode { get; set; }
+        /// <summary>
+        /// 活动介绍
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string Introduce { get; set; }
+        /// <summary>
+        /// 学习对象
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public List<Target> target { get; set; }
+
+        [Required(ErrorMessage = "{0} 必须填写")]
+        [PartitionKey]
+        public string scopeCode { get; set; }
+
+        /// <summary>
+        /// 步骤
+        /// </summary>
+        public List<ProcessStep> steps { get; set; }
+
+        /// <summary>
+        /// 是否闯关模式 0 或 1 vue组件不支持true false
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string isOrder { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long createTime { get; set; }
+        
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string creator { get; set; }
+
+      
+        /// <summary>
+        /// 截至时间 时间戳
+        /// </summary>
+        public int expire { get; set; }
+
+        public class Target
+        {
+            public string classroomCode { get; set; }
+
+            public string scopeCode { get; set; }
+        }
+
+        public class ProcessStep
+        {
+            public ProcessStep()
+            {
+                resource = new List<ProcessRes>();
+                item = new List<ExamItem>();
+            }
+            /// <summary>
+            /// 资源内容
+            /// [{"name":"","url":"","order":""}]
+            /// </summary>
+            public List<ProcessRes> resource { get; set; }
+            /// <summary>
+            /// 题目
+            /// </summary>
+            public List<ExamItem> item { get; set; }
+
+            [Required(ErrorMessage = "{0} 必须填写")]
+            public string name { get; set; }
+        }
+
+        public class ProcessRes
+        {
+            /// <summary>
+            /// 文件名字
+            /// </summary>
+            [Required(ErrorMessage = "{0} 必须填写")]
+            public string fileName { get; set; }
+            
+            /// <summary>
+            /// 
+            /// </summary>
+            [Required(ErrorMessage = "{0} 必须填写")]
+            public string blobUrl { get; set; }
+            
+            
+            public int order { get; set; }
+
+            /// <summary>
+            /// 文件大小
+            /// </summary>
+            public long size { get; set; }
+
+            /// <summary>
+            /// 缩略图链接  图片视频有 文件没有
+            /// </summary>
+            public string compressUrl { get; set; }
+
+            /// <summary>
+            /// 文件类型
+            /// </summary>
+            public string type { get; set; }
+
+
+
+        }
+    }
+}

+ 20 - 3
TEAMModelOS.Service/Models/Syllabus/SyllabusNode.cs

@@ -1,10 +1,12 @@
-using System.Collections.Generic;
+using ProtoBuf;
+using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 
 namespace TEAMModelOS.Service.Models.Syllabus
 {
+    [ProtoContract]
     public class SyllabusNode
     {
 
@@ -16,33 +18,40 @@ namespace TEAMModelOS.Service.Models.Syllabus
         /// 
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(1)]
         public string id { get; set; }
         /// <summary>
         /// 标题
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(2)]
         public string title { get; set; }
         /// <summary>
         /// 是否展开
         /// </summary>
+        [ProtoMember(3)]
         public bool expand { get; set; }
         /// <summary>
         /// 是否编辑
         /// </summary>
+        [ProtoMember(4)]
         public bool editable { get; set; } = true;
         /// <summary>
         /// 版本
         /// </summary>
+        [ProtoMember(5)]
         public string  version { get; set; } 
         /// <summary>
         /// 排序
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(6)]
         public int order { get; set; }
         /// <summary>
         /// 类型
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(7)]
         public int type { get; set; }
         /// <summary>
         /// 备注
@@ -52,6 +61,7 @@ namespace TEAMModelOS.Service.Models.Syllabus
         /// 节点Key
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(8)]
         public string nodeKey { get; set; }
         ///// <summary>
         /////主键
@@ -62,24 +72,31 @@ namespace TEAMModelOS.Service.Models.Syllabus
         /// 父级
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(9)]
         public string pid { get; set; }
 
         /// <summary>
         /// 册别编码
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(10)]
         public string volumeCode { get; set; }
 
         /// <summary>
         /// 数据状态
         /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(11)]
         public int status { get; set; } = 1;
 
-         public List<string> resources { get; set; }
+        [ProtoMember(12)]
+        public List<string> resources { get; set; }
+        [ProtoMember(13)]
         public List<string> knowledges { get; set; }
 
-        public  bool resource { get; set; }
+        [ProtoMember(14)]
+        public bool resource { get; set; }
+        [ProtoMember(15)]
         public bool knowledge { get; set; }
         
     }

+ 2 - 4
TEAMModelOS.Service/Models/Syllabus/SyllabusTree.cs

@@ -1,10 +1,8 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System.Collections.Generic;
 
 namespace TEAMModelOS.Service.Models.Syllabus
 {
-     public class SyllabusTree :SyllabusNode
+    public class SyllabusTree :SyllabusNode
     {
         public SyllabusTree() {
             children = new List<SyllabusTree>();

+ 60 - 2
TEAMModelOS.Service/Models/Syllabus/SyllabusVolume.cs

@@ -6,37 +6,95 @@ using System.Text.Json.Serialization;
 using System.ComponentModel.DataAnnotations;
 using Newtonsoft.Json;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using ProtoBuf;
 
 namespace TEAMModelOS.Service.Models.Syllabus
 {
     [CosmosDB(RU = 400, Name = "SyllabusVolume")]
+    [ProtoContract]
     public class SyllabusVolume :ID
-    { 
+    {
         /// <summary>
         /// id生成规则
         /// </summary>
+        [ProtoMember(1)]
         public string id { get; set; }
         /// <summary>
         /// 0默认教学课纲的册别 1个人或单独的专题课纲册别 2,系统课纲
         /// </summary>
+        [ProtoMember(2)]
         public int type { get; set; }
         /// <summary>
         /// Type 如果为0 则是学校编码  如果为1 则是seminar 专题/研讨/培训
         /// </summary>
         [PartitionKey]
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(3)]
         public string scopeCode { get; set; }
+        
+
+        /// <summary>
+        /// 学段
+        /// </summary>
+        [ProtoMember(4)]
         public string periodCode { get; set; }
+        
+
+        /// <summary>
+        /// 学科
+        /// </summary>
+        [ProtoMember(5)]
         public string subjectCode { get; set; }
+        
+
+        /// <summary>
+        /// 年级
+        /// </summary>
+        [ProtoMember(6)]
         public string gradeCode { get; set; }
+        
+
+        /// <summary>
+        /// 学期code
+        /// </summary>
+        [ProtoMember(7)]
         public string semesterCode { get; set; }
+        
+
+        /// <summary>
+        /// 状态
+        /// </summary>
+        [ProtoMember(8)]
         public int status { get; set; } = 1;
+        
+
+        /// <summary>
+        /// 册别name
+        /// </summary>
         [Required(ErrorMessage = "{0} 必须填写")]
+        [ProtoMember(9)]
         public string volumeName { get; set; }
+        
+
+        /// <summary>
+        /// 册别code
+        /// </summary>
+        [ProtoMember(10)]
         public string volumeCode { get; set; }
+        
+
+        /// <summary>
+        /// 创建者醍摩豆id
+        /// </summary>
         [JsonPropertyName("TEAMModelId")]
         [JsonProperty("TEAMModelId")]
+        [ProtoMember(11)]
         public string TEAMModelId { get; set; }
-        public string[] editors { get; set; }
+        
+        /// <summary>
+        /// 共编使用者 的醍摩豆id
+        /// </summary>
+        [ProtoMember(12)]
+        public List<string> editors { get; set; }
     }
 }

+ 15 - 7
TEAMModelOS.Service/Services/Syllabus/Implement/KnowledgeService.cs

@@ -17,19 +17,27 @@ namespace TEAMModelOS.Service.Services.Syllabus.Implement
             _cosmos = cosmos;
         }
 
+        public async Task<List<IdPk>> DeleteKnowledge(List<IdPk> listPid)
+        {
+            List<IdPk> idPks = await _cosmos.DeleteAll<Knowledge>(listPid);
+            foreach (IdPk Knowledge in idPks)
+            {
+                List<Knowledge> knowledges = await _cosmos.FindSQL<Knowledge>($"select value(c) from c join A0  in c.points where 1=1  and  c.type = 0 and A0 =  '"+ Knowledge.id + "' ");
+                List<SyllabusResource> Resources = await _cosmos.FindSQL<SyllabusResource>($"select value(c) from c join A0  in c.points where 1=1  and  c.type = 0 and A0 =  '" + Knowledge.id + "' ");
+                foreach (Knowledge knowledge in knowledges) knowledge.points.Remove(Knowledge.id);
+                foreach (SyllabusResource Resource in Resources) Resource.points.Remove(Knowledge.id);
+                await _cosmos.SaveOrUpdateAll(Resources);
+                await _cosmos.SaveOrUpdateAll(knowledges);
+            }
+            return idPks;
+        }
+
         public async Task<List<Knowledge>> SaveOrUpdateKnowledge(List<Knowledge> request)
         {
             foreach (Knowledge item in request)
             {
                 if (item.id == null)
                 {
-                    //if (item.scope == "personal")
-                    //{
-                    //    item.id = item.partitionKey + "-" + item.TEAMModelId + "-" + item.knowledgeId.Replace("-", "");
-                    //}
-                    //else {
-                    //    item.id = item.partitionKey + "-" + item.subjectCode + "-" + item.knowledgeId.Replace("-", "");
-                    //}
                     item.id = Guid.NewGuid().ToString();
                 }
                 if (item.type == 1 && item.points.Count > 0)

+ 269 - 0
TEAMModelOS.Service/Services/Syllabus/Implement/SyllabusService.cs

@@ -0,0 +1,269 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Helper.Common.JsonHelper;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
+
+namespace TEAMModelOS.Service.Services.Syllabus.Implement
+{
+    public class SyllabusService: ISyllabusService
+    {
+        private readonly IAzureCosmosDBV3Repository azureCosmosDBRepository;
+
+        public SyllabusService(IAzureCosmosDBV3Repository azureCosmosDBRepository)
+        {
+            this.azureCosmosDBRepository = azureCosmosDBRepository;
+        }
+
+
+        /// <summary>
+        /// 查找课纲 
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        public 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<Syllabuses> data = await azureCosmosDBRepository.FindByDict<Syllabuses>(dict);
+            List<SyllabusTree> treess = new List<SyllabusTree>();
+            if (data.IsNotEmpty())
+            {
+                Dictionary<string, Syllabuses> syllabuses = new Dictionary<string, Syllabuses>();
+                data.ForEach(x => syllabuses.TryAdd(x.id, x));
+                data = new List<Syllabuses>(syllabuses.Values);
+               
+                foreach (Syllabuses 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;
+
+        }
+
+        public static 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;
+        }
+        
+
+        public async Task<List<Syllabuses>> SaveOrUpdateAsNodes(List<SyllabusNode> syllabusNodes)
+        {
+            List<Syllabuses> syllabuses = new List<Syllabuses>();
+
+            List<Syllabuses> data = await azureCosmosDBRepository.FindByDict<Syllabuses>(new Dictionary<string, object> { { "id", syllabusNodes[0].volumeCode } });
+            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].volumeCode == syllabusNodes[j].volumeCode)
+                        {
+                            syllabusNodes1.Remove(data[0].children[i]);
+                            syllabusNodes1.Add(syllabusNodes[j]);
+                            syllabusNodes.Remove(syllabusNodes[j]);
+                        }
+                    }
+                }
+                data[0].children = syllabusNodes1;
+
+                //新增
+                data[0].children.AddRange(syllabusNodes);
+
+
+                syllabuses = await azureCosmosDBRepository.SaveOrUpdateAll<Syllabuses>(data);
+
+            }
+            else
+            {
+                throw new BizException("保存失败", ResponseCode.FAILED);
+                //return builder.Error(false, ResponseCode.FAILED, "保存失败").build();
+            }
+
+            return syllabuses;
+        }
+
+        public async Task<List<SyllabusTree>> SaveOrUpdateAsTree(List<SyllabusTree> request)
+        {
+            List<SyllabusNode> nodes = new List<SyllabusNode>();
+            Syllabuses syllabus = new Syllabuses();
+
+            TreeToList(request, nodes);
+            // List<SyllabusNode> nods = nodes.ToJson().FromJson<List<SyllabusNode>>() ;
+            syllabus.children = nodes;
+            syllabus.id = request[0].volumeCode;
+            syllabus.volumeCode = request[0].volumeCode;
+            await azureCosmosDBRepository.SaveOrUpdate<Syllabuses>(syllabus);
+            List<SyllabusTree> treess = ListToTree(nodes);
+            return treess;
+        }
+
+        public static List<SyllabusNode> TreeToList(List<SyllabusTree> trees, List<SyllabusNode> nodes)
+        {
+            trees = trees.OrderBy(x => x.order).ToList();
+            nodes.AddRange(trees.ToJson().FromJson<List<SyllabusNode>>());
+
+            foreach (SyllabusTree tree in trees)
+            {
+                if (null != tree.children && tree.children.Count > 0)
+                {
+                    TreeToList(tree.children, nodes);
+                }
+            }
+            return nodes;
+        }
+        private static List<SyllabusTree> ListToTree(List<SyllabusNode> noes)
+        {
+            List<SyllabusTree> list = noes.ToJson().FromJson<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);
+        }
+
+        public static List<SyllabusTree> GetChild(List<SyllabusTree> list, Dictionary<string, SyllabusTree> dict)
+        {
+            //  list = list.OrderBy(m => m.Order).ToList();
+            List<SyllabusTree> trees = new List<SyllabusTree>();
+            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;
+        }
+
+        public async Task<List<Syllabuses>> 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<Syllabuses> data = await azureCosmosDBRepository.FindByDict<Syllabuses>(dict);
+            Dictionary<string, Syllabuses> syllabuses = new Dictionary<string, Syllabuses>();
+            List<Syllabuses> data1 = new List<Syllabuses>();
+            if (data.Count > 0)
+            {
+                data.ForEach(x => syllabuses.TryAdd(x.id, x));
+                data = new List<Syllabuses>(syllabuses.Values);
+
+                //是否全删
+                bool flg = false;
+                foreach (Syllabuses 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 azureCosmosDBRepository.DeleteAsync<Syllabuses>(item.id, item.volumeCode);
+                        flg = true;
+                    }
+                }
+                if (!flg)
+                {
+                    data1 = await azureCosmosDBRepository.SaveOrUpdateAll<Syllabuses>(data);
+
+                }
+
+
+                //if (flg)
+                //{
+
+                //    return builder.Data("全部删除成功").build();
+                //}
+                //else
+                //{
+                //    List<Syllabuses> data1 = await azureCosmosDBRepository.SaveOrUpdateAll<Syllabuses>(data);
+                //    return builder.Data(data1).build();
+                //}
+
+
+            }
+            return data1;
+        }
+    }
+}

+ 119 - 0
TEAMModelOS.Service/Services/Syllabus/Implement/VolumeService.cs

@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Extension.SnowFlake;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Syllabus;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
+
+namespace TEAMModelOS.Service.Services.Syllabus.Implement
+{
+    public class VolumeService : IVolumeService
+    {
+
+        private readonly IAzureCosmosDBV3Repository azureCosmosDBRepository;
+
+        public VolumeService(IAzureCosmosDBV3Repository azureCosmosDBRepository)
+        {
+            this.azureCosmosDBRepository = azureCosmosDBRepository;
+        }
+
+        public async Task<List<SyllabusVolume>> SaveOrUpdateVolume(SyllabusVolume request)
+        {
+            if (request.editors != null && request.editors.Count > 5)
+            {
+                throw new BizException("共编人数大于5人!");
+            }
+            if (string.IsNullOrEmpty(request.id))
+            {
+                if (request.type == 0)
+                {
+                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
+                        { "scopeCode",request.scopeCode},{ "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.scopeCode + IdWorker.getInstance().NextId();
+                    request.id = key;
+                    request.volumeCode = key;
+                }
+                else if (request.type == 1)
+                {
+                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
+                        { "schoolCode",request.scopeCode},{ "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("#", "") + IdWorker.getInstance().NextId();
+                    request.id = key;
+                    request.volumeCode = key;
+                }
+                else if (request.type == 2)
+                {
+                    ///系统课纲
+                    string key = "system" + IdWorker.getInstance().NextId();
+                    request.scopeCode = "system";
+                    request.id = key;
+                    request.volumeCode = key;
+                }
+            }
+            else
+            {
+                if (request.type == 0)
+                {
+                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
+                    { "schoolCode",request.scopeCode},{ "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<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
+                        { "schoolCode",request.scopeCode},{ "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<SyllabusVolume> volumes = new List<SyllabusVolume>
+            {
+                request
+            };
+            List<SyllabusVolume> volume = await azureCosmosDBRepository.SaveOrUpdateAll<SyllabusVolume>(volumes);
+            return volume;
+        }
+    }
+}

+ 2 - 0
TEAMModelOS.Service/Services/Syllabus/Interface/IKnowledgeService.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.Service.Models.Syllabus;
 
 namespace TEAMModelOS.Service.Services.Syllabus.Interface
@@ -11,5 +12,6 @@ namespace TEAMModelOS.Service.Services.Syllabus.Interface
     {
         public Task<List<Knowledge>> SaveOrUpdateKnowledge(List<Knowledge> request);
 
+        public Task<List<IdPk>> DeleteKnowledge(List<IdPk> listPid);
     }
 }

+ 34 - 0
TEAMModelOS.Service/Services/Syllabus/Interface/ISyllabusService.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Syllabus;
+
+namespace TEAMModelOS.Service.Services.Syllabus.Interface
+{
+    public interface ISyllabusService : IBusinessService
+    {
+
+        /// <summary>
+        /// 查找课纲 
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        public Task<List<SyllabusTree>> Find(Dictionary<string, object> request);
+
+        /// <summary>
+        /// 保存或者修改课纲
+        /// </summary>
+        /// <param name="syllabusNodes"></param>
+        /// <returns></returns>
+        public Task<List<Syllabuses>> SaveOrUpdateAsNodes(List<SyllabusNode> syllabusNodes);
+
+        public Task<List<SyllabusTree>> SaveOrUpdateAsTree(List<SyllabusTree> request);
+
+        public Task<List<Syllabuses>> DeleteSyllabus(Dictionary<string, object> request);
+
+
+    }
+}

+ 16 - 0
TEAMModelOS.Service/Services/Syllabus/Interface/IVolumeService.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Configuration;
+using TEAMModelOS.Service.Models.Syllabus;
+
+namespace TEAMModelOS.Service.Services.Syllabus.Interface
+{
+    public interface IVolumeService : IBusinessService
+    {
+
+        public  Task<List<SyllabusVolume>> SaveOrUpdateVolume(SyllabusVolume request);
+
+    }
+}

+ 349 - 23
TEAMModelOS.Service/TEAMModelOS.Model.xml

@@ -4,9 +4,9 @@
         <name>TEAMModelOS.Service</name>
     </assembly>
     <members>
-        <member name="P:TEAMModelOS.Service.Models.Core.ClassroomStudent.Stu.seatNo">
+        <member name="P:TEAMModelOS.Service.Models.Core.ClassroomStudent.id">
             <summary>
-            座位
+            classroomCode
             </summary>
         </member>
         <member name="T:TEAMModelOS.Service.Models.Core.LoginInfo">
@@ -274,55 +274,174 @@
             考试成绩信息
             </summary>
         </member>
-        <member name="T:TEAMModelOS.Service.Models.Learn.LeanProcess">
+        <member name="T:TEAMModelOS.Service.Models.Learn.HomeWork">
             <summary>
-            编序学习
+            作业
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.periodCode">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.name">
             <summary>
-            学段code
+            作业名称
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.Introduce">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.target">
             <summary>
-            活动介绍
+            作业发布对象
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.target">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.publishModel">
             <summary>
-            学习对象
+            发布模式 0 立即发布 1 定时
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.steps">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.startTime">
             <summary>
-            步骤
+            开始时间
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.isOrder">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.endTime">
             <summary>
-            是否闯关模式 0 或 1 vue组件不支持true false
+            结束时间
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.type">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.description">
             <summary>
-            编序式模板,课前预习,随堂练习,课后作业
+            作业描述
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.expire">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.resource">
             <summary>
-            截至时间 时间戳
+            作业附件
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.ProcessStep.resource">
+        <member name="T:TEAMModelOS.Service.Models.Learn.HomeWork.Subdto">
             <summary>
-            资源内容
-            [{"name":"","url":"","order":""}]
+            通知方式 0电子纸条 1 学生Email 2 家长Email
             </summary>
         </member>
-        <member name="P:TEAMModelOS.Service.Models.Learn.ProcessStep.item">
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.Subdto.submitted">
             <summary>
-            题目
+            提交人数
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.Subdto.sum">
+            <summary>
+            总人数
+            </summary>
+        </member>
+        <member name="T:TEAMModelOS.Service.Models.Learn.HomeWork.Target">
+            <summary>
+            发布对象
+            </summary>
+        </member>
+        <member name="T:TEAMModelOS.Service.Models.Learn.HomeWork.ProcessRes">
+            <summary>
+            作业附件
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.ProcessRes.fileName">
+            <summary>
+            文件名字
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.ProcessRes.blobUrl">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.ProcessRes.size">
+            <summary>
+            文件大小
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.ProcessRes.compressUrl">
+            <summary>
+            缩略图链接  图片视频有 文件没有
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWork.ProcessRes.type">
+            <summary>
+            文件类型
+            </summary>
+        </member>
+        <member name="T:TEAMModelOS.Service.Models.Learn.HomeWorkStudent">
+            <summary>
+            作业数据
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.name">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.TEAMModelId">
+            <summary>
+            醍摩豆id
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.classroomCode">
+            <summary>
+            上课班级
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.nativeroomCode">
+            <summary>
+            原生班级
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.studentId">
+            <summary>
+            学号
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.submissionBool">
+            <summary>
+            是否提交
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.submissionTime">
+            <summary>
+            提交时间
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.score">
+            <summary>
+            分数
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.content">
+            <summary>
+            作业内容
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkStudent.comments">
+            <summary>
+            作业评论
+            </summary>
+        </member>
+        <member name="T:TEAMModelOS.Service.Models.Learn.HomeWorkContent">
+            <summary>
+            作业内容
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkContent.answers">
+            <summary>
+            作答记录
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkContent.resource">
+            <summary>
+             其他模式url 及name
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.ProcessRes.fileName">
+            <summary>
+            文件名字
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.ProcessRes.blobUrl">
+            <summary>
+            
             </summary>
         </member>
         <member name="P:TEAMModelOS.Service.Models.Learn.ProcessRes.size">
@@ -340,6 +459,56 @@
             文件类型
             </summary>
         </member>
+        <member name="T:TEAMModelOS.Service.Models.Learn.HomeWorkComment">
+            <summary>
+            作业评论
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkComment.name">
+            <summary>
+            评论者姓名
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkComment.TEAMModelId">
+            <summary>
+            醍摩豆id
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkComment.identity">
+            <summary>
+            评论者身份 教师 学生
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.HomeWorkComment.comment">
+            <summary>
+            评语
+            </summary>
+        </member>
+        <member name="T:TEAMModelOS.Service.Models.Learn.LeanProcess">
+            <summary>
+            编序学习
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.periodCode">
+            <summary>
+            学段code
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.Introduce">
+            <summary>
+            活动介绍
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.scopeCode">
+            <summary>
+            学习对象
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LeanProcess.steps">
+            <summary>
+            最小单元
+            </summary>
+        </member>
         <member name="T:TEAMModelOS.Service.Models.Learn.LeanRecord">
             <summary>
             作答记录
@@ -365,6 +534,97 @@
             作答时长
             </summary>
         </member>
+        <member name="T:TEAMModelOS.Service.Models.Learn.LearningAutonomous">
+            <summary>
+            自主学习
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.name">
+            <summary>
+            活动名称
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.subjectCode">
+            <summary>
+            学科code
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.periodCode">
+            <summary>
+            学段code
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.Introduce">
+            <summary>
+            活动介绍
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.target">
+            <summary>
+            学习对象
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.steps">
+            <summary>
+            步骤
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.isOrder">
+            <summary>
+            是否闯关模式 0 或 1 vue组件不支持true false
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.createTime">
+            <summary>
+            创建时间
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.creator">
+            <summary>
+            创建者
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.expire">
+            <summary>
+            截至时间 时间戳
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.ProcessStep.resource">
+            <summary>
+            资源内容
+            [{"name":"","url":"","order":""}]
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.ProcessStep.item">
+            <summary>
+            题目
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.ProcessRes.fileName">
+            <summary>
+            文件名字
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.ProcessRes.blobUrl">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.ProcessRes.size">
+            <summary>
+            文件大小
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.ProcessRes.compressUrl">
+            <summary>
+            缩略图链接  图片视频有 文件没有
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Learn.LearningAutonomous.ProcessRes.type">
+            <summary>
+            文件类型
+            </summary>
+        </member>
         <member name="T:TEAMModelOS.Service.Models.Learn.LearnUnit">
             <summary>
             考试基础信息
@@ -662,6 +922,51 @@
             Type 如果为0 则是学校编码  如果为1 则是seminar 专题/研讨/培训
             </summary>
         </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.periodCode">
+            <summary>
+            学段
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.subjectCode">
+            <summary>
+            学科
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.gradeCode">
+            <summary>
+            年级
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.semesterCode">
+            <summary>
+            学期code
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.status">
+            <summary>
+            状态
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.volumeName">
+            <summary>
+            册别name
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.volumeCode">
+            <summary>
+            册别code
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.TEAMModelId">
+            <summary>
+            创建者醍摩豆id
+            </summary>
+        </member>
+        <member name="P:TEAMModelOS.Service.Models.Syllabus.SyllabusVolume.editors">
+            <summary>
+            共编使用者 的醍摩豆id
+            </summary>
+        </member>
         <member name="T:TEAMModelOS.Service.Model.Exam.Models.SimpleExam">
             <summary>
             考试成绩信息
@@ -2726,5 +3031,26 @@
             <param name="border"></param>
             <returns></returns>
         </member>
+        <member name="M:TEAMModelOS.Service.Services.Syllabus.Implement.SyllabusService.Find(System.Collections.Generic.Dictionary{System.String,System.Object})">
+            <summary>
+            查找课纲 
+            </summary>
+            <param name="request"></param>
+            <returns></returns>
+        </member>
+        <member name="M:TEAMModelOS.Service.Services.Syllabus.Interface.ISyllabusService.Find(System.Collections.Generic.Dictionary{System.String,System.Object})">
+            <summary>
+            查找课纲 
+            </summary>
+            <param name="request"></param>
+            <returns></returns>
+        </member>
+        <member name="M:TEAMModelOS.Service.Services.Syllabus.Interface.ISyllabusService.SaveOrUpdateAsNodes(System.Collections.Generic.List{TEAMModelOS.Service.Models.Syllabus.SyllabusNode})">
+            <summary>
+            保存或者修改课纲
+            </summary>
+            <param name="syllabusNodes"></param>
+            <returns></returns>
+        </member>
     </members>
 </doc>

+ 156 - 0
TEAMModelOS/Controllers/Learn/HomeWorkController.cs

@@ -0,0 +1,156 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using OpenXmlPowerTools;
+using TEAMModelOS.SDK.Context.Exception;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Models.Core;
+using TEAMModelOS.Service.Models.Learn;
+using static TEAMModelOS.Service.Models.Learn.HomeWork;
+
+namespace TEAMModelOS.Controllers.Learn
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class HomeWorkController : ControllerBase
+    {
+        private readonly IAzureCosmosDBV3Repository _cosmos;
+
+        public HomeWorkController(IAzureCosmosDBV3Repository cosmos)
+        {
+            _cosmos = cosmos;
+        }
+
+
+        /// <summary>
+        /// 新增或修改 作业活动 同时创建关联关系表
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("SaveorUpdataHomeWork")]
+        public async Task<BaseJosnRPCResponse> SaveorUpdataHomeWork(JosnRPCRequest<HomeWork> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+
+            if (request.@params.publishModel.Equals("0"))
+            {
+                request.@params.startTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
+
+            }
+            bool flg = false; 
+
+            if (string.IsNullOrEmpty(request.@params.id)) {
+
+                request.@params.id = Guid.NewGuid().ToString();
+
+                flg = true;
+            }
+
+
+            HomeWork homeWork = await _cosmos.SaveOrUpdate<HomeWork>(request.@params);
+
+            if (flg) {
+                //根据作业发布对象查找到每一个具体学生生成关联关系表 HomeWorkStudent
+                List<Target> targets = request.@params.target;
+                List<ClassroomStudent> Classrooms = new List<ClassroomStudent>();
+                List<HomeWorkStudent> homeWorkStudents = new List<HomeWorkStudent>();
+                foreach (Target target in targets)
+                {
+                    List<ClassroomStudent> classroom = await _cosmos.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", target.classroomCode }, { "scopeCode", target.scopeCode } });
+                    foreach (string studentid in classroom[0].studentId)
+                    {
+                        HomeWorkStudent homeWorkStudent = new HomeWorkStudent();
+                        homeWorkStudent.id = Guid.NewGuid().ToString();
+                        homeWorkStudent.homeWorkId = request.@params.id;
+                        homeWorkStudent.studentId = studentid;
+                        homeWorkStudent.classroomCode = target.classroomCode;
+                        homeWorkStudents.Add(homeWorkStudent);
+                    }
+                }
+                foreach (HomeWorkStudent homeWorkStudents1 in homeWorkStudents)
+                {
+                    Student student = await _cosmos.FindById<Student>(homeWorkStudents1.studentId);//FindByDict<Student>(new Dictionary<string, object> { { "id", homeWorkStudents1.studentId } });
+                    if (student != null)
+                    {
+                        homeWorkStudents1.name = student.name;
+                        homeWorkStudents1.TEAMModelId = student.TEAMModelId;
+                        homeWorkStudents1.nativeroomCode = student.classroomCode;
+                    }
+                }
+
+                await _cosmos.SaveOrUpdateAll<HomeWorkStudent>(homeWorkStudents);
+
+            }
+           
+
+            return builder.Data(homeWork).build();
+        }
+
+        [HttpPost("addWorkStudent")]
+        public async Task<BaseJosnRPCResponse> addWorkStudent(JosnRPCRequest<List<HomeWorkStudent>> request) 
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            await _cosmos.SaveOrUpdateAll<HomeWorkStudent>(request.@params);
+            return builder.Data(request.@params).build();
+        }
+
+
+        [HttpPost("FindHomeWork")]
+        public async Task<BaseJosnRPCResponse> FindHomeWork(JosnRPCRequest<Dictionary<string,object>> request) {
+
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            List<HomeWork> data = new List<HomeWork>();
+            if (request.@params.IsNotEmpty())
+            {
+                data = await _cosmos.FindByDict<HomeWork>(request.@params);
+
+                //foreach (HomeWork homeWork in data) {
+                //    Dictionary<string, object> dict = new Dictionary<string, object> { { "homeWorkId", homeWork.id } };
+                //    List<string> propertys = new List<string>();
+                //    propertys.Add("submissionBool");
+                //    List<HomeWorkStudent> homeWorkStudents  = await _cosmos.FindByDict<HomeWorkStudent>(propertys : propertys,dict: dict);
+                //    homeWork.subdto.sum = homeWorkStudents.Count;
+                //    foreach (IGrouping<bool, HomeWorkStudent > homeWorkStudent in homeWorkStudents.GroupBy(x => x.submissionBool).ToList()) {
+                //        if (homeWorkStudent.Key) 
+                //        {
+                //            homeWork.subdto.submitted += 1;
+                //        }
+                //    };
+                //}
+
+
+            }
+            else
+            {
+                throw new BizException("参数异常", ResponseCode.PARAMS_ERROR);
+                //builder.Error(false,ResponseCode.PARAMS_ERROR,"参数异常");
+            }
+            return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
+        }
+
+        [HttpPost("FindWorkStudent")]
+        public async Task<BaseJosnRPCResponse> FindWorkStudent(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            List<HomeWorkStudent> data = new List<HomeWorkStudent>();
+            if (request.@params.IsNotEmpty())
+            {
+                data = await _cosmos.FindByDict<HomeWorkStudent>(request.@params);
+            }
+            else
+            {
+                throw new BizException("参数异常", ResponseCode.PARAMS_ERROR);
+                //builder.Error(false,ResponseCode.PARAMS_ERROR,"参数异常");
+            }
+            return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
+        }
+
+    }
+}

+ 63 - 2
TEAMModelOS/Controllers/Learn/LearnController.cs

@@ -24,7 +24,7 @@ namespace TEAMModelOS.Controllers.Learn
         }
 
         /// <summary>
-        /// 保存考试信息
+        /// 保存最小单元
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
@@ -84,7 +84,6 @@ namespace TEAMModelOS.Controllers.Learn
                     if (string.IsNullOrEmpty(request.@params.id))
                     {
                         request.@params.id = Guid.NewGuid().ToString();
-                        request.@params.createTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
                     }
                 LeanProcess leanProcesses =  await cosmosDBV3Repository.SaveOrUpdate<LeanProcess>(request.@params);
                 builder.Data(leanProcesses);
@@ -183,5 +182,67 @@ namespace TEAMModelOS.Controllers.Learn
             }
             return builder.build();
         }
+
+
+        /// <summary>
+        /// 新增或修改自主学习
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("SaveorUpdataLearningAutonomous")]
+        public async Task<BaseJosnRPCResponse> SaveorUpdataLearningAutonomous(JosnRPCRequest<List<LearningAutonomous>> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (ValidateHelper.IsValid(request.@params))
+            {
+                request.@params.ForEach(x =>
+                {
+                    if (string.IsNullOrEmpty(x.id))
+                    {
+                        x.id = new Guid().ToString();
+                        x.createTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
+                    }
+                });
+                List<LearningAutonomous> learningAutonomous = await cosmosDBV3Repository.SaveOrUpdateAll<LearningAutonomous>(request.@params);
+                builder.Data(learningAutonomous);
+            }
+            return builder.build();
+        }
+
+
+
+        /// <summary>
+        /// 查询自主学习
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("FindLearningAutonomous")]
+        public async Task<BaseJosnRPCResponse> FindLearningAutonomous(JosnRPCRequest<Dictionary<string, object>> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (request.@params != null)
+            {
+                builder.Data(await cosmosDBV3Repository.FindByDict<LearningAutonomous>(request.@params));
+            }
+            return builder.build();
+        }
+
+
+        /// <summary>
+        /// 删除自主学习
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("DeleteLearningAutonomous")]
+        public async Task<BaseJosnRPCResponse> DeleteLearningAutonomous(JosnRPCRequest<IdPk> request)
+        {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (request.@params != null)
+            {
+                builder.Data(await cosmosDBV3Repository.DeleteAsync<LearningAutonomous>(request.@params));
+            }
+            return builder.build();
+        }
+
     }
 }

+ 1 - 0
TEAMModelOS/Controllers/Syllabus/KnowledgeController.cs

@@ -302,6 +302,7 @@ namespace TEAMModelOS.Controllers.Syllabus
                 if (Knowledge.type == 1) {
                     List<Knowledge> knowledges = await  _cosmos.FindSQL<Knowledge>("SELECT value(c) FROM c join a in c.points where Contains(a, '"+ Knowledge.id + "') = true ");
                     List<SyllabusResource> Resources = await _cosmos.FindSQL<SyllabusResource>("SELECT value(c) FROM c join a in c.points where 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 (SyllabusResource Resource in Resources) Resource.points.Remove(Knowledge.id);
                     await _cosmos.SaveOrUpdateAll(Resources);

+ 24 - 202
TEAMModelOS/Controllers/Syllabus/SyllabusController.cs

@@ -14,6 +14,7 @@ using System.Linq;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
 
 namespace TEAMModelOS.Controllers.Syllabus
 {
@@ -22,7 +23,9 @@ namespace TEAMModelOS.Controllers.Syllabus
     //[Authorize]
     public class SyllabusController : BaseController
     {
-        private readonly IAzureCosmosDBV3Repository azureCosmosDBRepository;
+        private IAzureCosmosDBV3Repository azureCosmosDBRepository;
+        private ISyllabusService syllabusService;
+
         public SyllabusController(IAzureCosmosDBV3Repository _azureCosmosDBRepository)
         {
             azureCosmosDBRepository = _azureCosmosDBRepository;
@@ -36,35 +39,13 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async Task<BaseJosnRPCResponse> SaveOrUpdateAsTree(JosnRPCRequest<List<SyllabusTree>> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            List<SyllabusNode> nodes = new List<SyllabusNode>();
-            Syllabuses syllabus = new Syllabuses();
-           
-            TreeToList(request.@params, nodes);
-            // List<SyllabusNode> nods = nodes.ToJson().FromJson<List<SyllabusNode>>() ;
-            syllabus.children = nodes;
-            syllabus.id = request.@params[0].volumeCode;
-            syllabus.volumeCode = request.@params[0].volumeCode;
-            await azureCosmosDBRepository.SaveOrUpdate<Syllabuses>(syllabus);
-            List<SyllabusTree> treess = ListToTree(nodes);
+            List<SyllabusTree> treess = await syllabusService.SaveOrUpdateAsTree(request.@params);
             return builder.Data(treess).build();
         }
-        public static List<SyllabusNode> TreeToList(List<SyllabusTree> trees, List<SyllabusNode> nodes)
-        {
-            trees = trees.OrderBy(x => x.order).ToList();
-            nodes.AddRange(trees.ToJson().FromJson<List<SyllabusNode>>());
 
-            foreach (SyllabusTree tree in trees)
-            {
-                if (null != tree.children && tree.children.Count > 0)
-                {
-                    TreeToList(tree.children, nodes);
-                }
-            }
-            return nodes;
-        }
 
         /// <summary>
-        /// 批量保存或更新课纲
+        /// 按节点新增课纲
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
@@ -72,76 +53,11 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async Task<BaseJosnRPCResponse> SaveOrUpdateAsNodes(JosnRPCRequest<List<SyllabusNode>> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            List<SyllabusNode> syllabusNodes = request.@params;
-            List<Syllabuses> data = await azureCosmosDBRepository.FindByDict<Syllabuses>(new Dictionary<string, object> { { "id", syllabusNodes[0].volumeCode } });
-            List<SyllabusNode> syllabusNodes1 = new List<SyllabusNode>();
-            if (data.Count > 0) {
-
-                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].volumeCode == syllabusNodes[j].volumeCode)
-                        {
-                            syllabusNodes1.Remove(data[0].children[i]);
-                            syllabusNodes1.Add(syllabusNodes[j]);
-                            syllabusNodes.Remove(syllabusNodes[j]);
-                        }
-                    }
-                }
-                data[0].children = syllabusNodes1;
-                
-                //新增
-                data[0].children.AddRange(syllabusNodes);
-
-
-                List<Syllabuses> syllabuses = await azureCosmosDBRepository.SaveOrUpdateAll<Syllabuses>(data);
-                if (syllabuses != null) return builder.Data(request.@params).build();
-                else  return builder.Data(syllabuses).build();
-            }
-            else
-            {
-                throw new BizException("保存失败", ResponseCode.FAILED); 
-                //return builder.Error(false, ResponseCode.FAILED, "保存失败").build();
-            }
-           
-        }
-
-        private static List<SyllabusTree> ListToTree(List<SyllabusNode> noes)
-        {
-            List<SyllabusTree> list = noes.ToJson().FromJson<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);
+            List<Syllabuses> syllabuses = await syllabusService.SaveOrUpdateAsNodes(request.@params);
+            if (syllabuses.IsNotEmpty()) return builder.Data(request.@params).build();
+            else return builder.Data(syllabuses).build();
         }
 
-        public static List<SyllabusTree> GetChild(List<SyllabusTree> list, Dictionary<string, SyllabusTree> dict)
-        {
-            //  list = list.OrderBy(m => m.Order).ToList();
-            List<SyllabusTree> trees = new List<SyllabusTree>();
-            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;
-        }
         /// <summary>
         /// 删除课纲
         /// </summary>
@@ -151,79 +67,26 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async Task<BaseJosnRPCResponse> Delete(JosnRPCRequest<Dictionary<string, object>> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            foreach (KeyValuePair<string, object> keyValuePair in request.@params)
-            {
-                dict.Add("children[*]." + keyValuePair.Key, keyValuePair.Value);
-            }
+            List<Syllabuses> syllabuses = await syllabusService.DeleteSyllabus(request.@params);
 
-            List<Syllabuses> data = await azureCosmosDBRepository.FindByDict<Syllabuses>(dict);
-            Dictionary<string, Syllabuses> syllabuses = new Dictionary<string, Syllabuses>();
-
-            if (data.Count > 0)
+            if (syllabuses.IsNotEmpty())
             {
-                data.ForEach(x => syllabuses.TryAdd(x.id, x));
-                data = new List<Syllabuses>(syllabuses.Values);
-
-                //是否全删
-                bool flg = false;
-                foreach (Syllabuses item in data)
-                {
-                    List<SyllabusNode> nodedata = item.children;
-                    if (request.@params.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 azureCosmosDBRepository.DeleteAsync<Syllabuses>(item.id, item.volumeCode);
-                        flg = true;
-                    }
-                }
-                if (flg)
-                {
-
-                    return builder.Data("全部删除成功").build();
-                }
-                else
-                {
-                    List<Syllabuses> data1 = await azureCosmosDBRepository.SaveOrUpdateAll<Syllabuses>(data);
-                    return builder.Data(data1).build();
-                }
+                return builder.Data(syllabuses).build();
             }
-            else
-            {
-                return builder.Data(null).build();
-                //throw new BizException("数据不存在", ResponseCode.DATA_EMPTY_NULL);
+            else { 
+                return builder.Data("全部删除成功").build();
+
             }
+            //else
+            //{
+            //    return builder.Data(null).build();
+            //    //throw new BizException("数据不存在", ResponseCode.DATA_EMPTY_NULL);
+            //}
 
             //return builder.Data(flag).Extend(new Dictionary<string, object>() { { "deleteData", nodes } }).build();
         }
 
-
+       
 
         public static async Task<List<SyllabusNode>> FindByPid(SyllabusNode data, List<SyllabusNode> nodes, List<SyllabusNode> nodedata)
         {
@@ -249,50 +112,9 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async Task<BaseJosnRPCResponse> Find(JosnRPCRequest<Dictionary<string, object>> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            foreach (KeyValuePair<string, object> keyValuePair in request.@params)
-            {
-                dict.Add("children[*]." + keyValuePair.Key, keyValuePair.Value);
-            }
-
-            List<Syllabuses> data = await azureCosmosDBRepository.FindByDict<Syllabuses>(dict);
-            if (data.IsNotEmpty())
-            {
-                Dictionary<string, Syllabuses> syllabuses = new Dictionary<string, Syllabuses>();
-                data.ForEach(x => syllabuses.TryAdd(x.id, x));
-                data = new List<Syllabuses>(syllabuses.Values);
-                List <SyllabusTree> treess = new List<SyllabusTree> ();
-                foreach (Syllabuses item in data)
-                {
-
-                    List<SyllabusNode> nodedata = item.children;
-                    if (request.@params.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();
-            //throw new BizException("资源未找到", ResponseCode.NOT_FOUND);
-
-            //return builder.Error(false, ResponseCode.NOT_FOUND, "资源未找到").build();
-            //throw new BizException("sss");
+            List<SyllabusTree> treess = await syllabusService.Find(request.@params);
+            return builder.Data(treess).build();
         }
+
     }
 }

+ 13 - 91
TEAMModelOS/Controllers/Syllabus/VolumeController.cs

@@ -16,6 +16,7 @@ using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.Controllers;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
+using TEAMModelOS.Service.Services.Syllabus.Interface;
 
 namespace TEAMModelOS.Controllers.Syllabus
 {
@@ -23,12 +24,16 @@ namespace TEAMModelOS.Controllers.Syllabus
     [ApiController]
     public class VolumeController : BaseController
     {
-        private readonly IAzureCosmosDBV3Repository azureCosmosDBRepository;
-        public VolumeController(IAzureCosmosDBV3Repository _azureCosmosDBRepository)
+        private IAzureCosmosDBV3Repository azureCosmosDBRepository;
+        private IVolumeService volumeService;
+
+        public VolumeController(IAzureCosmosDBV3Repository azureCosmosDBRepository, IVolumeService volumeService)
         {
-            azureCosmosDBRepository = _azureCosmosDBRepository;
+            this.azureCosmosDBRepository = azureCosmosDBRepository;
+            this.volumeService = volumeService;
         }
 
+
         /// <summary>
         /// 新增册别
         /// </summary>
@@ -38,96 +43,11 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async Task<BaseJosnRPCResponse> SaveOrUpdate(JosnRPCRequest<SyllabusVolume> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            if (request.@params.editors != null && request.@params.editors.Length > 5)
-            {
-                throw new BizException("共编人数大于5人!");
-            }
-            if (string.IsNullOrEmpty(request.@params.id))
-            {
-                if (request.@params.type == 0)
-                {
-                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
-                        { "scopeCode",request.@params.scopeCode},{ "periodCode", request.@params.periodCode},
-                        { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
-                        { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName}  ,
-                        { "status",1} ,{ "type",0} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                    }
-                    ///校本课纲
-                    string key = request.@params.scopeCode + IdWorker.getInstance().NextId();
-                    request.@params.id = key;
-                    request.@params.volumeCode = key;
-                }
-                else if (request.@params.type == 1)
-                {
-                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
-                        { "schoolCode",request.@params.scopeCode},{ "periodCode", request.@params.periodCode},
-                        { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
-                        { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName},
-                        { "TEAMModelId",request.@params.TEAMModelId}, { "status",1} ,{ "type",1} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                    }
-                    ///个人课纲
-                    string key = "dynamic" + request.@params.TEAMModelId.Replace("#", "") + IdWorker.getInstance().NextId();
-                    request.@params.id = key;
-                    request.@params.volumeCode = key;
-                }
-                else if (request.@params.type == 2)
-                {
-                    ///系统课纲
-                    string key = "system" + IdWorker.getInstance().NextId();
-                    request.@params.scopeCode = "system";
-                    request.@params.id = key;
-                    request.@params.volumeCode = key;
-                }
-            }
-            else {
-                if (request.@params.type == 0)
-                {
-                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
-                    { "schoolCode",request.@params.scopeCode},{ "periodCode", request.@params.periodCode},
-                        { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
-                        { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName}  ,
-                        { "status",1} ,{ "type",0} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        if (!volumesFind[0].id.Equals(request.@params.id)) {
-                            throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                        }
-                    }
-                }
-                else if (request.@params.type == 1)
-                {
-                    List<SyllabusVolume> volumesFind = await azureCosmosDBRepository.FindByDict<SyllabusVolume>(new Dictionary<string, object>() {
-                        { "schoolCode",request.@params.scopeCode},{ "periodCode", request.@params.periodCode},
-                        { "subjectCode", request.@params.subjectCode},{ "gradeCode", request.@params.gradeCode},
-                        { "semesterCode",request.@params.semesterCode},{ "volumeName",request.@params.volumeName},
-                        { "TEAMModelId",request.@params.TEAMModelId}, { "status",1} ,{ "type",1} });
-                    if (volumesFind.IsNotEmpty())
-                    {
-                        if (!volumesFind[0].id.Equals(request.@params.id))
-                        {
-                            throw new BizException("已存在!", ResponseCode.DATA_EXIST);
-                        }
-                    }
-                   
-                }
-                else if (request.@params.type == 2)
-                {
-                }
-
-            }
-            List<SyllabusVolume> volumes = new List<SyllabusVolume>
-            {
-                request.@params
-            };
-            List<SyllabusVolume> volume = await azureCosmosDBRepository.SaveOrUpdateAll<SyllabusVolume>(volumes);
+            List<SyllabusVolume> volume = await volumeService.SaveOrUpdateVolume(request.@params);
             return builder.Data(volume.IsEmpty() ? null : volume[0]).build();
         }
+
+       
         /// <summary>
         /// 删除册别
         /// </summary>
@@ -159,6 +79,8 @@ namespace TEAMModelOS.Controllers.Syllabus
             }
             return builder.Data(flag).build();
         }
+
+
         /// <summary>
         /// 查找册别
         /// </summary>