Przeglądaj źródła

课纲数据结构保存

CrazyIter_Bin 4 lat temu
rodzic
commit
233bd52254

+ 1 - 1
TEAMModelOS.SDK/DI/DingDing/DingDing.cs

@@ -100,7 +100,7 @@ namespace TEAMModelOS.SDK.DI
         成都开发測試群組,
         [Description("1a316ce4edc2db88231d40d80072b00f2751d7d9e2e5871c5dc061885b01c48d,SECff60201ac9b219943b9f8fc397fda1a617d0cbc140850f5ea9cb4f131479d39a")]
         醍摩豆服務運維群組,
-        [Description("a83ea4ead63bf1b4e087723b3a7ccdf7f4c96708a22493f489bb928999f50d87")]
+        [Description("a83ea4ead63bf1b4e087723b3a7ccdf7f4c96708a22493f489bb928999f50d87,SECf1d22db7d00580dc7c0e597e31112a25ae1025500fc998b5b30961d91e115271")]
         AI智慧學校申請通知群
 
     }

+ 3 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Inner/SyllabusTree.cs

@@ -11,6 +11,9 @@ namespace TEAMModelOS.SDK.Models
         public List<SyllabusTree> children { get; set; }
     }
     public class SyllabusTreeNode{
+        /// <summary>
+        /// 册别的id
+        /// </summary>
         public string id { get; set; }
        // public string code { get; set; }
         public string scope { get; set; }

+ 13 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Syllabus.cs

@@ -20,5 +20,18 @@ namespace TEAMModelOS.SDK.Models
         [Required(ErrorMessage = "{0} 必须填写")]
         public List<Tnode> children { get; set; }
         public string volumeId { get; set; }
+        public List<SyllabusAuth> auth { get; set; }
+}
+
+    /// <summary>
+    /// 只要创建课纲的creatorId 才能编辑课纲的分享,共编权限 25600 74200  27500 2000
+    /// ,共编者 谁创建的节点只能谁删除,而且删除时能删除子节点(包含不是自己创建的)。
+    /// </summary>
+    public class SyllabusAuth
+    {
+        public string tmdid { get; set; }
+        public string tmdname { get; set; }
+        public bool coedit { get; set; }
+        public bool share { get; set; }
     }
 }

+ 12 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/TmdInfo.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models
+{
+    public  class TmdInfo
+    {
+        public string tmdid { get; set; }
+        public string tmdname { get; set; }
+    }
+}

+ 1 - 16
TEAMModelOS.SDK/Models/Cosmos/Common/Volume.cs

@@ -82,22 +82,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         /// </summary>
         [Required(ErrorMessage = "scope 必须设置")]
         public string scope { get; set; }
-        public List<SyllabusAuth> auth { get; set; } = new List<SyllabusAuth>();
+       
     }
 
-    /// <summary>
-    /// 只要创建课纲的creatorId 才能编辑课纲的分享,共编权限 25600 74200  27500 2000
-    /// ,共编者 谁创建的节点只能谁删除,而且删除时能删除子节点(包含不是自己创建的)。
-    /// </summary>
-    public class SyllabusAuth
-    {
-        public string tmdid { get; set; }
-        public string name { get; set; }
-        public bool coedit { get; set; }
-        public bool share { get; set; }
-        /// <summary>
-        ///分享的节点 all  或者節點id
-        /// </summary>
-        public List<string> snodes { get; set; } = new List<string>();
-    }
 }

+ 0 - 111
TEAMModelOS.SDK/Models/Cosmos/Teacher/Favorite.cs

@@ -36,115 +36,4 @@ namespace TEAMModelOS.SDK.Models.Cosmos
         [Required(ErrorMessage = "引用来源课纲code 必须设置")]
         public string fromCode { get; set; }
     }
-
-    /*
-     {
-        "id":"课纲册别id",
-        "code":"Share-接收者tmdid",
-        "issuer":"分享者tmdid",
-        "createTime":分享时间,
-        "scode":"引用来源课纲册别code",
-        "scope":"school/private",
-        "school":"hbcn",
-        "issuer":"颁发权限的id"
-    }
-     */
-    /// <summary>
-    /// 主动分享给谁, 分享功能只会发生在个人课纲中
-    /// </summary>
-    public class Share : CosmosEntity {
-        public Share(){
-            pk = "Share";
-        }
-
-        public string scode { get; set; }
-        /// <summary>
-        /// 权限颁发者
-        /// </summary>
-        public string issuer { get; set; }
-        public long  createTime { get; set; }
-        /// <summary>
-        /// 学校编码或教师tmdid
-        /// </summary>
-        [Required(ErrorMessage = "school 必须设置")]
-        public string school { get; set; }
-        /// <summary>
-        /// school|private
-        /// </summary>
-        [Required(ErrorMessage = "scope 必须设置")]
-        public string scope { get; set; }
-        /// <summary>
-        /// 共编
-        /// </summary>
-        public bool coedit { get; set; }
-        /// <summary>
-        /// 分享
-        /// </summary>
-        public bool share { get; set; }
-        /// <summary>
-        /// 课纲名称
-        /// </summary>
-        public string sname { get; set; }
-    }
-         
-    /// <summary>
-    /// 主动分享给谁,当接收者接收并完成相关资源复制后则删除本条数据。
-    /// </summary>
-    public class ShareData
-    {
-        /// <summary>
-        /// 学校编码
-        /// </summary>
-        [Required(ErrorMessage = "school 必须设置")]
-        public string school { get; set; }
-        /// <summary>
-        /// school|private
-        /// </summary>
-        [Required(ErrorMessage = "scope 必须设置")]
-        public string scope { get; set; }
-        /// <summary>
-        /// add/edit/del
-        /// </summary>
-        [Required(ErrorMessage = "opt 必须设置")]
-        public string opt { get; set; }
-
-        [Required(ErrorMessage = "tmdid 必须设置")]
-        public string tmdid { get; set; }
-        /// <summary>
-        /// tmdname
-        /// </summary>
-        public string name { get; set; }
-        /// <summary>
-        /// 课纲册别的id
-        /// </summary>
-        [Required(ErrorMessage = "sid 必须设置")]
-        public string sid { get; set; }
-        /// <summary>
-        /// 课纲册别的分区键
-        /// </summary>
-        [Required(ErrorMessage = "socde 必须设置")]
-        public string scode { get; set; }
-        /// <summary>
-        /// 课纲册别的名称
-        /// </summary>
-        [Required(ErrorMessage = "sname 必须设置")]
-        public string sname { get; set; }
-        /// <summary>
-        /// 共编权限
-        /// </summary>
-        public bool coedit { get; set; } = false;
-        /// <summary>
-        /// 分享权限
-        /// </summary>
-        public bool share { get; set; } = false;
-        /// <summary>
-        /// 分享的节点 all  或者節點id
-        /// </summary>
-        public List<string> snodes { get; set; } = new List<string>();
-        /// <summary>
-        /// 共编 分享权限颁发者
-        /// </summary>
-        [Required(ErrorMessage = "issuer 必须设置")]
-        public string issuer { get; set; }
-    }
 }

+ 127 - 0
TEAMModelOS.SDK/Models/Cosmos/Teacher/Share.cs

@@ -0,0 +1,127 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models
+{
+    /*
+     {
+        "id":"课纲册别id",
+        "code":"Share-接收者tmdid",
+        "issuer":"分享者tmdid",
+        "createTime":分享时间,
+        "scode":"引用来源课纲册别code",
+        "scope":"school/private",
+        "school":"hbcn",
+        "issuer":"颁发权限的id"
+    }
+     */
+    /// <summary>
+    /// 主动分享给谁, 分享功能只会发生在个人课纲中
+    /// </summary>
+    public class Share : CosmosEntity
+    {
+        /// <summary>
+        /// id 为章节id, code为Share-tmdid
+        /// </summary>
+        public Share()
+        {
+            pk = "Share";
+        }
+        /// <summary>
+        /// 权限颁发者
+        /// </summary>
+        public string issuer { get; set; }
+        public long createTime { get; set; }
+        /// <summary>
+        /// 学校编码或教师tmdid
+        /// </summary>
+        [Required(ErrorMessage = "school 必须设置")]
+        public string school { get; set; }
+        /// <summary>
+        /// school|private
+        /// </summary>
+        [Required(ErrorMessage = "scope 必须设置")]
+        public string scope { get; set; }
+        /// <summary>
+        /// 共编
+        /// </summary>
+        public bool coedit { get; set; }
+        /// <summary>
+        /// 分享
+        /// </summary>
+        public bool share { get; set; }
+        /// <summary>
+        /// 册别id
+        /// </summary>
+        public string volumeId { get; set; }
+        /// <summary>
+        /// 课纲章节的name
+        /// </summary>
+        [Required(ErrorMessage = "syllabusName 必须设置")]
+        public string syllabusName { get; set; }
+        /// <summary>
+        /// 册别名称
+        /// </summary>
+        public string volumeName { get; set; }
+    }
+    /// <summary>
+    /// 主动分享给谁,当接收者接收并完成相关资源复制后则删除本条数据。
+    /// </summary>
+    public class ShareData
+    {
+        /// <summary>
+        /// 学校编码
+        /// </summary>
+        [Required(ErrorMessage = "school 必须设置")]
+        public string school { get; set; }
+        /// <summary>
+        /// school|private
+        /// </summary>
+        [Required(ErrorMessage = "scope 必须设置")]
+        public string scope { get; set; }
+        /// <summary>
+        /// add/edit/del
+        /// </summary>
+        [Required(ErrorMessage = "opt 必须设置")]
+        public string opt { get; set; }
+
+        [Required(ErrorMessage = "tmdid 必须设置")]
+        public List<TmdInfo> tmdInfo { get; set; } = new List<TmdInfo>();
+        
+        /// <summary>
+        /// 共编权限
+        /// </summary>
+        public bool coedit { get; set; } = false;
+        /// <summary>
+        /// 分享权限
+        /// </summary>
+        public bool share { get; set; } = false;
+        /// <summary>
+        /// 课纲章节的id
+        /// </summary>
+        [Required(ErrorMessage = "syllabusId 必须设置")]
+        public string syllabusId { get; set; }
+        /// <summary>
+        /// 课纲章节的name
+        /// </summary>
+        [Required(ErrorMessage = "syllabusName 必须设置")]
+        public string syllabusName { get; set; }
+        /// <summary>
+        /// 册别名称
+        /// </summary>
+        public string volumeName { get; set; }
+        /// <summary>
+        /// 册别id
+        /// </summary>
+        public string volumeId { get; set; }
+        /// <summary>
+        /// 共编 分享权限颁发者
+        /// </summary>
+        [Required(ErrorMessage = "issuer 必须设置")]
+        public string issuer { get; set; }
+    }
+
+
+}

+ 0 - 2
TEAMModelOS/Controllers/Core/BlobController.cs

@@ -612,7 +612,6 @@ namespace TEAMModelOS.Controllers.Core
                         {
                             await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Bloblog>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{name}") }))
                             {
-                                item.size = size != null && size.HasValue ? size.Value : 0;
                                 item.time = now;
                                 item.size = size != null && size.HasValue ? size.Value : 0;
                                 item.periodId = periodId.ValueKind.Equals(JsonValueKind.Array) ? periodId.ToObject<List<string>>() : new List<string> { "" };
@@ -625,7 +624,6 @@ namespace TEAMModelOS.Controllers.Core
                         else if (scope.GetString().Equals("teacher")) {
                             await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Bloblog>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{name}") }))
                             {
-                                item.size = size != null && size.HasValue ? size.Value : 0;
                                 item.time = now;
                                 item.size = size != null && size.HasValue ? size.Value : 0;
                                 item.periodId = periodId.ValueKind.Equals(JsonValueKind.Array) ? periodId.ToObject<List<string>>() : new List<string> { "" };

+ 1 - 2
TEAMModelOS/Controllers/Core/CoreController.cs

@@ -34,9 +34,8 @@ namespace TEAMModelOS.Controllers.Core
             _option = option?.Value;
         }
         [HttpPost("apply-school")]
-        [RequestSizeLimit(100_000_000)] //最大100m左右
         public async Task<IActionResult> ApplySchool(ApplySchool request) {
-            await _dingDing.SendBotMsg($"有新学校申请。\n申请站点:{_option.Location}\n申请学校:{request.name}\n所在国家\\地区:{request.area}\n申请人:{request.tmdname}({request.tmdid})\n联系电话:{request.cellphone}\n备注:{request.content}", GroupNames.成都开发測試群組);
+            await _dingDing.SendBotMsg($"有新学校申请。\n申请站点:{_option.Location}\n申请学校:{request.name}\n所在国家\\地区:{request.area}\n申请人:{request.tmdname}({request.tmdid})\n联系电话:{request.cellphone}\n备注:{request.content}", GroupNames.AI智慧學校申請通知群);
             return Ok();
           
         }

+ 238 - 154
TEAMModelOS/Controllers/Syllabus/ShareController.cs

@@ -6,6 +6,7 @@ using Microsoft.Extensions.Options;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.Filter;
@@ -42,15 +43,15 @@ namespace TEAMModelOS.Controllers
          {
             "school": "学校编码",
             "scope":"school|private",
-            "tmdid":"分享给谁,邀请谁的tmdid",
-            "name":"分享给谁,邀请谁的name",
-            "sid":"课纲的id",
-            "scode":"课纲册别的分区键",
-            "sname":"课纲分享节点的名称",
+            "tmdInfo":["tmdid":"id1","tmdname":"name1"],
             "coedit":true,
             "share":true,
             "issuer":"权限颁发者tmdid",
-            "snodes":["分享的节点 all 或者節點id"]
+            "opt":"add/del/edit"
+            "syllabusId":"分享的课纲章节id",
+            "syllabusName":"章节名称",
+            "volumeId":"册别id",
+            "volumeName":"册别name"
         }
          */
 
@@ -70,42 +71,67 @@ namespace TEAMModelOS.Controllers
                 //需要判断id== req.issuer  才能进行授权操作
                 if (request.scope.Equals("school"))
                 {
-                    Volume volume = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Volume>(request.sid, new PartitionKey(request.scode));
+                    Syllabus syllabusD = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Syllabus>(request.syllabusId, new PartitionKey($"Syllabus-{request.volumeId}"));
                     if (request.opt == "del")
                     {
-                        if (volume.auth.IsNotEmpty())
+                        if (syllabusD.auth.IsNotEmpty())
                         {
-                            var del = volume.auth.Where(x => x.tmdid == request.tmdid).FirstOrDefault();
-                            volume.auth.Remove(del);
-                            await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Volume>(volume, request.sid, new PartitionKey(request.scode));
-                            await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<Share>(request.sid, new PartitionKey($"Share-{request.tmdid}"));
+                            List<SyllabusAuth> syllabusAuths = new List<SyllabusAuth>();
+                            syllabusD.auth.ForEach(x=> {
+                                if (request.tmdInfo.Select(tmd=>tmd.tmdid).Contains(x.tmdid)) {
+                                    syllabusAuths.Add(x);
+                                }   
+                            }) ;
+                            syllabusAuths.ForEach(x => {
+                                syllabusD.auth.Remove(x);
+                            });
+                            await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Syllabus>(syllabusD, request.volumeId, new PartitionKey($"Syllabus-{request.volumeId}"));
+                            request.tmdInfo.ForEach(async x => {
+                                await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<Share>(request.syllabusId, new PartitionKey($"Share-{x.tmdid}"));
+                            });
+                            
                         }
                     }
                     else if (request.opt.Equals("add") || request.opt.Equals("edit"))
                     {
-                        (Volume vlm, Share share) = DoAuth(request, volume);
-                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Share>(share, new PartitionKey($"Share-{request.tmdid}"));
-                        await client.GetContainer("TEAMModelOS", "School").UpsertItemAsync<Volume>(volume, new PartitionKey(request.scode));
+                        (Syllabus syllabus, List<Share> shares) = DoAuth(request, syllabusD);
+                        shares.ForEach(async x=> {
+                            await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Share>(x, new PartitionKey($"Share-{x.code}"));
+                        });
+                       
+                        await client.GetContainer("TEAMModelOS", "School").UpsertItemAsync<Syllabus>(syllabus, new PartitionKey($"Syllabus-{request.volumeId}"));
                     }
                 }
                 else if (request.scope.Equals("private"))
                 {
-                    Volume volume = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Volume>(request.sid, new PartitionKey(request.scode));
+                    Syllabus syllabusD = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Syllabus>(request.syllabusId, new PartitionKey($"Syllabus-{request.volumeId}"));
                     if (request.opt == "del")
                     {
-                        if (volume.auth.IsNotEmpty())
+                        if (syllabusD.auth.IsNotEmpty())
                         {
-                            var del = volume.auth.Where(x => x.tmdid == request.tmdid).FirstOrDefault();
-                            volume.auth.Remove(del);
-                            await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Volume>(volume, request.sid, new PartitionKey(request.scode));
-                            await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<Share>(request.sid, new PartitionKey($"Share-{request.tmdid}"));
+                            List<SyllabusAuth> syllabusAuths = new List<SyllabusAuth>();
+                            syllabusD.auth.ForEach(x => {
+                                if (request.tmdInfo.Select(tmd=>x.tmdid).Contains(x.tmdid))
+                                {
+                                    syllabusAuths.Add(x);
+                                }
+                            });
+                            syllabusAuths.ForEach(x => {
+                                syllabusD.auth.Remove(x);
+                            });
+                            await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Syllabus>(syllabusD, request.syllabusId, new PartitionKey($"Syllabus-{request.volumeId}"));
+                            request.tmdInfo.ForEach(async x => {
+                                await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<Share>(request.syllabusId, new PartitionKey($"Share-{x.tmdid}"));
+                            });
                         }
                     }
                     else if (request.opt.Equals("add") || request.opt.Equals("edit"))
                     {
-                        (Volume vlm, Share share) = DoAuth(request, volume);
-                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Share>(share, new PartitionKey($"Share-{request.tmdid}"));
-                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Volume>(volume, new PartitionKey(request.scode));
+                        (Syllabus vlm, List<Share> shares) = DoAuth(request, syllabusD);
+                        shares.ForEach(async x => {
+                            await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Share>(x, new PartitionKey($"Share-{x.code}"));
+                        });
+                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Syllabus>(syllabusD, new PartitionKey($"Syllabus-{request.volumeId}"));
                     }
                 }
                 return Ok(new { code=200});
@@ -116,77 +142,89 @@ namespace TEAMModelOS.Controllers
             return Ok(new { code = 500 });
         }
 
-        private (Volume,Share) DoAuth(ShareData request,Volume volume) {
+        private (Syllabus, List<Share>) DoAuth(ShareData request, Syllabus syllabus)
+        {
             long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-            var share = new Share
-            {
-                id = request.sid,
-                code = $"Share-{request.tmdid}",
-                pk = "Share",
-                ttl = -1,
-                scode = request.scode,
-                issuer = request.issuer,
-                createTime = now,
-                school = request.school,
-                scope = request.scope,
-                coedit=request.coedit,
-                share=request.share,
-                sname=request.sname
-            };
-            if (volume.auth.IsNotEmpty())
-            {
-                bool flag = false;
-                int indx = 0;
-                for (int index = 0; index < volume.auth.Count; index++)
+            List<Share> shares = new List<Share>();
+            request.tmdInfo.ForEach(xmd => {
+                var share = new Share
                 {
-                    if (volume.auth[index].tmdid == request.tmdid)
+                    id = request.syllabusId,
+                    volumeId = request.volumeId,
+                    volumeName = request.volumeName,
+                    syllabusName = request.syllabusName,
+                    code = $"Share-{xmd.tmdid}",
+                    pk = "Share",
+                    ttl = -1,
+                    issuer = request.issuer,
+                    createTime = now,
+                    school = request.school,
+                    scope = request.scope,
+                    coedit = request.coedit,
+                    share = request.share
+                };
+                shares.Add(share);
+            });
+            
+            if (syllabus.auth.IsNotEmpty())
+            {
+                request.tmdInfo.ForEach(xmd => {
+
+                    bool flag = false;
+                    int indx = 0;
+                    for (int index = 0; index < syllabus.auth.Count; index++)
                     {
-                        flag = true;
-                        indx = index;
-                        break;
+                        if (syllabus.auth[index].tmdid == xmd.tmdid)
+                        {
+                            flag = true;
+                            indx = index;
+                            break;
+                        }
                     }
-                }
-                ///更新位置上的授权信息
-                if (flag)
-                {
-                    volume.auth[indx] = new SyllabusAuth
+                    ///更新位置上的授权信息
+                    if (flag)
                     {
-                        tmdid = request.tmdid,
-                        name = request.name,
-                        coedit = request.coedit,
-                        share = request.share,
-                        snodes = request.snodes
-                    };
-                }
-                //新增
-                else
-                {
-                    volume.auth.Add(new SyllabusAuth
+                        syllabus.auth[indx] = new SyllabusAuth
+                        {
+                            tmdid = xmd.tmdid,
+                            tmdname = xmd.tmdname,
+                            coedit = request.coedit,
+                            share = request.share,
+                        };
+                    }
+                    //新增
+                    else
                     {
-                        tmdid = request.tmdid,
-                        name = request.name,
-                        coedit = request.coedit,
-                        share = request.share,
-                        snodes = request.snodes
-                    });
-                }
+                        syllabus.auth.Add(new SyllabusAuth
+                        {
+                            tmdid = xmd.tmdid,
+                            tmdname = xmd.tmdname,
+                            coedit = request.coedit,
+                            share = request.share,
+                        });
+                    }
+                });
             }
             else
             {
-                volume.auth = new List<SyllabusAuth>() {
-                    new SyllabusAuth {
-                        tmdid=request.tmdid,
-                        name=request.name,
-                        coedit=request.coedit,
-                        share=request.share,
-                        snodes=request.snodes
-                    }
-                };
+                request.tmdInfo.ForEach(xmd => {
+                    syllabus.auth = new List<SyllabusAuth>() {
+                        new SyllabusAuth {
+                            tmdid = xmd.tmdid,
+                            tmdname = xmd.tmdname,
+                            coedit=request.coedit,
+                            share=request.share,
+                        }
+                    };
+                });
             }
-            return (volume, share);
+            return (syllabus, shares);
         }
+
+
+
         /// <summary>
-        /// {"code":"教师编码"} 
+        /// {"code":"教师编码","type":"coedit/share"} 
         /// 教师拉取自己收到的分享及共编
         /// </summary>
         /// <param name="request"></param>
@@ -200,14 +238,32 @@ namespace TEAMModelOS.Controllers
             {
                 List<Share> shares = new List<Share>();
                 if (!request.TryGetProperty("code", out JsonElement code)) { return BadRequest(); }
+                if (!request.TryGetProperty("type", out JsonElement type)) { return BadRequest(); }
+                if (!request.TryGetProperty("id", out JsonElement id)) { return BadRequest(); }
                 var client = _azureCosmos.GetCosmosClient();
-
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Share>(queryText: $"select value(c) from c ",
+                StringBuilder queryText = new StringBuilder("select value(c) from c");
+                if (type.ValueKind.Equals(JsonValueKind.String) && type.GetString() == "coedit")
+                {
+                    queryText.Append(" where c.coedit=true");
+                }
+                else if (type.ValueKind.Equals(JsonValueKind.String) && type.GetString() == "share")
+                {
+                    queryText.Append(" where c.share=true");
+                }
+                else {
+                    await _dingDing.SendBotMsg($"OS,{_option.Location},teacher/share/find()\n type== coedit|share 参数必选一个", GroupNames.醍摩豆服務運維群組);
+                    return BadRequest();
+                }
+                if (id.ValueKind.Equals(JsonValueKind.String) && !string.IsNullOrEmpty(id.GetString())) {
+                    queryText.Append($" and c.id='{id}'");
+                }
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Share>(queryText: queryText.ToString(),
                 requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Share-{code}") }))
                 {
                     shares.Add(item);
                 }
-                return Ok(new { shares = shares });
+                var sharesGp  =  shares.GroupBy(x => new {id= x.volumeId ,code=x.scope=="school"?x.school:x.issuer}).Select(y=>new { id=y.Key.id,code=y.Key.code,list=y.ToList()});
+                return Ok(new { shares = sharesGp });
             }
             catch (Exception ex)
             {
@@ -216,14 +272,24 @@ namespace TEAMModelOS.Controllers
             }
 
         }
+
+        public record ShareView
+        {
+            public string scope { get; set; }
+           // public string code { get; set; }
+            public string school { get; set; }
+            public string issuer { get; set; }
+            public string volumeId { get; set; }
+            public List<string> syllabusId { get; set; }
+        }
+
         /*
             {
                 "scope": "school/private",
                 "school": "学校编码",
                 "issuer": "权限颁发者",
-                "id": "分享或共编的id",
-                "code": "分享或共编的分区键",
-                "scode": "分享或共编的scode"
+                "volumeId": "册别id",
+                "syllabusId": ["id1课纲章节节点id","id2课纲章节节点id"],
             }
          */
         /// <summary>
@@ -232,90 +298,107 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
-        [HttpPost("view")]
+        [HttpPost("view-share")]
        // [AuthToken(Roles = "Teacher")]
-        public async Task<IActionResult> View(Share request)
+        public async Task<IActionResult> View(ShareView request)
         {
             try
             {
-                //var (id, _, _, school) = HttpContext.GetAuthTokenInfo();
-                //if (!request.code.Equals($"Share-{id}"))
-                //{
-                //    return BadRequest();
-                //}
-                Syllabus syllabus;
+                List<List<SyllabusTree>> tts = new List<List<SyllabusTree>>();
                 Volume volume;
                 var client = _azureCosmos.GetCosmosClient();
                 string code = null;
+                SyllabusTreeNode tree = null;
+                List<string> sid = new List<string>();
+                request.syllabusId.ForEach(x => { sid.Add($"'{x}'"); });
+                var sidSql= string.Join(",", sid);
                 if (request.scope == "school")
                 {
                     code = request.school;
-                    syllabus = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Syllabus>(request.id, new PartitionKey(request.scode));
-                    volume = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Volume>(request.id, new PartitionKey($"Volume-{code}"));
+                    var queryslt = $"SELECT  value(c) FROM c where c.id in ({sidSql})";
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Syllabus>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{request.volumeId}") }))
+                    {
+                        List<SyllabusTree> trees = SyllabusService.ListToTree(item.children);
+                        tts.Add(trees);
+                    }
+                    volume = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Volume>(request.volumeId, new PartitionKey($"Volume-{code}"));
+                    tree = new SyllabusTreeNode() { id = request.volumeId, scope = "school", trees = new List<SyllabusTree>() };
                 }
                 else if (request.scope == "private")
                 {
                     code = request.issuer;
-                    syllabus = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Syllabus>(request.id, new PartitionKey(request.scode));
-                    volume = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Volume>(request.id, new PartitionKey($"Volume-{code}"));
+                    var queryslt = $"SELECT  value(c) FROM c ";
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Syllabus>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Syllabus-{request.volumeId}") }))
+                    {
+                        List<SyllabusTree> trees = SyllabusService.ListToTree(item.children);
+                        tts.Add(trees);
+                    }
+                    volume = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Volume>(request.volumeId, new PartitionKey($"Volume-{code}"));
+                    tree = new SyllabusTreeNode() { id = request.volumeId, scope = "private", trees = new List<SyllabusTree>() };
                 }
                 else
                 {
                     return BadRequest();
                 }
-                bool coedit = false;
-                bool share = false;
-                SyllabusTreeNode  etree = null;
-                List<string> snodes = null;
-                if (volume.auth.IsNotEmpty()) {
-                    foreach (var x in volume.auth) {
-                        if ($"Share-{x.tmdid }" == request.code)
-                        {
-                            coedit = x.coedit;
-                            share = x.share;
-                            snodes = x.snodes;
-                            break;
-                        }
-                    }
-                }
-                if (coedit)
-                {
-                    var treechd = SyllabusService.ListToTree(syllabus.children);
-                    etree = new SyllabusTreeNode() {
-                        id = syllabus.id,
-                        trees = treechd
-                    };
-                }
-                SyllabusTreeNode stree = new SyllabusTreeNode();
-                if (share && snodes.IsNotEmpty()) {
-                    stree = new SyllabusTreeNode()
-                    {
-                        id = syllabus.id,
-                    };
-                    snodes.ForEach(x => {
-                        SyllabusTree syllabusTree = null;
-                        foreach (var node in syllabus.children) {
-                            if (node.id == x) {
-                                syllabusTree = new SyllabusTree { 
-                                    id=node.id,
-                                    pid=node.pid,
-                                    order=node.order,
-                                    rnodes=node.rnodes,
-                                    cids=node.cids
-                                };
-                                break;
-                            }
-                        }
-                        HashSet<Tnode> newNodes = new HashSet<Tnode>();
-                        SyllabusService.GetNewNode(syllabus.children, x, newNodes);
-                        var trees = SyllabusService.ListToTree(newNodes.ToList());
-                        if (syllabusTree != null) {
-                            syllabusTree.children.AddRange(trees);
-                            stree.trees.Add(syllabusTree);
-                        }
-                    });
-                }
-                return Ok(new { coedit, share, etree,stree });
+                //bool coedit = false;
+                //bool share = false;
+                //SyllabusTreeNode  etree = null;
+                //if (syllabus.auth.IsNotEmpty())
+                //{
+                //    foreach (var x in syllabus.auth)
+                //    {
+                //        if ($"Share-{x.tmdid }" == request.code)
+                //        {
+                //            coedit = x.coedit;
+                //            share = x.share;
+                //            break;
+                //        }
+                //    }
+                //}
+                //if (coedit)
+                //{
+                //    var treechd = SyllabusService.ListToTree(syllabus.children);
+                //    etree = new SyllabusTreeNode() {
+                //        id = syllabus.id,
+                //        trees = treechd
+                //    };
+                //}
+                //SyllabusTreeNode stree = new SyllabusTreeNode();
+                //if (share && snodes.IsNotEmpty())
+                //{
+                //    stree = new SyllabusTreeNode()
+                //    {
+                //        id = syllabus.id,
+                //    };
+                //    snodes.ForEach(x =>
+                //    {
+                //        SyllabusTree syllabusTree = null;
+                //        foreach (var node in syllabus.children)
+                //        {
+                //            if (node.id == x)
+                //            {
+                //                syllabusTree = new SyllabusTree
+                //                {
+                //                    id = node.id,
+                //                    pid = node.pid,
+                //                    order = node.order,
+                //                    rnodes = node.rnodes,
+                //                    cids = node.cids
+                //                };
+                //                break;
+                //            }
+                //        }
+                //        HashSet<Tnode> newNodes = new HashSet<Tnode>();
+                //        SyllabusService.GetNewNode(syllabus.children, x, newNodes);
+                //        var trees = SyllabusService.ListToTree(newNodes.ToList());
+                //        if (syllabusTree != null)
+                //        {
+                //            syllabusTree.children.AddRange(trees);
+                //            stree.trees.Add(syllabusTree);
+                //        }
+                //    });
+                //}
+                return Ok(new { tree });
             }
             catch (Exception ex) {
                 await _dingDing.SendBotMsg($"OS,{_option.Location},teacher/share/view()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
@@ -337,4 +420,5 @@ namespace TEAMModelOS.Controllers
 
         }
     }
+   
 }

+ 1 - 1
TEAMModelOS/Controllers/Syllabus/SyllabusController.cs

@@ -262,7 +262,7 @@ namespace TEAMModelOS.Controllers
                         List<SyllabusTree> trees = SyllabusService.ListToTree(item.children);
                         tts.Add(trees);
                     }
-                    tree = new SyllabusTreeNode() { id = vcode, scope = "school", trees = new List<SyllabusTree>() };
+                    tree = new SyllabusTreeNode() { id = vcode, scope = "private", trees = new List<SyllabusTree>() };
                     tts.ForEach(x => tree.trees.AddRange(x)); 
                 }
                 return Ok(new { tree });

+ 2 - 4
TEAMModelOS/Controllers/Syllabus/VolumeController.cs

@@ -217,15 +217,13 @@ namespace TEAMModelOS.Controllers
                 try {
                     if (request.scope.Equals("school"))
                     {
-                        Volume volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Volume>(request.id, new PartitionKey(request.code));
+                      //  Volume volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Volume>(request.id, new PartitionKey(request.code));
                         //保留授权
-                        request.auth = volume.auth;
                         await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Volume>(request, request.id, new Azure.Cosmos.PartitionKey(request.code));
                     }
                     else if (request.scope.Equals("private")) {
-                        Volume volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Volume>(request.id, new PartitionKey(request.code));
+                       // Volume volume = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Volume>(request.id, new PartitionKey(request.code));
                         //保留授权
-                        request.auth = volume.auth;
                         await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Volume>(request, request.id, new Azure.Cosmos.PartitionKey(request.code));
                     }