فهرست منبع

课纲的数据结构调整。

CrazyIter_Bin 4 سال پیش
والد
کامیت
9fa012eccd

+ 10 - 7
TEAMModelOS.SDK/Models/Cosmos/Common/Inner/SyllabusTree.cs

@@ -10,17 +10,20 @@ namespace TEAMModelOS.SDK.Models
         }
         public List<SyllabusTree> children { get; set; }
     }
-    public class SyllabusTreeNode{
+    public class SyllabusTreeNode {
+
+        public SyllabusTreeNode(){
+            trees = new List<SyllabusTree>();
+        }
+        public string  id { get; set; }
         /// <summary>
         /// 册别的id
         /// </summary>
-        public string id { get; set; }
+        public string volumeId { get; set; }
        // public string code { get; set; }
         public string scope { get; set; }
-        public SyllabusTreeNode() {
-            trees = new List<SyllabusTree>();
-        }
-        public List<SyllabusTree> trees { get; set; }
-    }
+        public  List<SyllabusTree>  trees  { get; set; }
 
+        public List<SyllabusAuth> auth { get; set; } = new List<SyllabusAuth>();
+    }
 }

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

@@ -21,6 +21,7 @@ namespace TEAMModelOS.SDK.Models
         public List<Tnode> children { get; set; }
         public string volumeId { get; set; }
         public List<SyllabusAuth> auth { get; set; }
+        public string scope { get; set; }
 }
 
     /// <summary>

+ 103 - 267
TEAMModelOS/Controllers/Syllabus/SyllabusController.cs

@@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Http;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using Azure.Cosmos;
 using TEAMModelOS.Services.Common;
+using Microsoft.Extensions.Options;
 
 namespace TEAMModelOS.Controllers
 {
@@ -28,163 +29,15 @@ namespace TEAMModelOS.Controllers
     public class SyllabusController : ControllerBase
     {
         private readonly AzureCosmosFactory _azureCosmos;
-
-
-        public SyllabusController(AzureCosmosFactory azureCosmos)
+        private readonly Option _option;
+        private readonly DingDing _dingDing;
+        public SyllabusController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option)
         {
             _azureCosmos = azureCosmos;
+            _dingDing = dingDing;
+            _option = option?.Value;
         }
 
-        /*
-        {
-    "id": "0baf00db-0768-4b62-a8f7-280f6bcebf71",
-    "scope": "school",
-    "trees": [
-        {
-            "children": [
-                {
-                    "children": [],
-                    "id": "AC4BA269-541B-4DFC-92A5-D773068A6439",
-                    "pid": "2dfcc62e-8eea-9881-dc79-384b2f0afbec",
-                    "order": 0,
-                    "rnodes": [
-                        {
-                            "type": "doc",
-                            "id": "a2bee388-5584-72cc-1d9a-d8a77d255364",
-                            "code": "hbcn",
-                            "scope": "private",
-                            "cntr": "1595321354",
-                            "link": [
-                                "https://teammodelstorage.blob.core.chinacloudapi.cn/1595321354/doc/2020智慧課堂與智慧教研.pptx"
-                            ],
-                            "title": "2020智慧課堂與智慧教研.pptx"
-                        }
-                    ],
-                    "cids": [],
-                    "creatorId": null,
-                    "updateTime": 0,
-                    "title": "1-1 新冠疫情小贴士"
-                }
-            ],
-            "id": "2dfcc62e-8eea-9881-dc79-384b2f0afbec",
-            "pid": "0baf00db-0768-4b62-a8f7-280f6bcebf71",
-            "order": 0,
-            "rnodes": [
-                {
-                    "type": "doc",
-                    "id": "cf1b4d21-66e1-e6c7-c944-30a03e419fa6",
-                    "code": "hbcn",
-                    "scope": "school",
-                    "cntr": "hbcn",
-                    "link": [
-                        "https://teammodelstorage.blob.core.chinacloudapi.cn/hbcn/syllabus/IES5试卷模板制作说明(终).pdf"
-                    ],
-                    "title": "IES5试卷模板制作说明(终).pdf"
-                },
-                {
-                    "type": "doc",
-                    "id": "f3e82595-7340-a5fe-1004-04538ca09b86",
-                    "code": "hbcn",
-                    "scope": "school",
-                    "cntr": "hbcn",
-                    "link": [
-                        "https://teammodelstorage.blob.core.chinacloudapi.cn/hbcn/syllabus/111.pdf"
-                    ],
-                    "title": "111.pdf"
-                },
-                {
-                    "type": "doc",
-                    "id": "e1b31639-dad9-9efb-020b-159dd045f238",
-                    "code": "hbcn",
-                    "scope": "school",
-                    "cntr": "hbcn",
-                    "link": [
-                        "https://teammodelstorage.blob.core.chinacloudapi.cn/hbcn/doc/6789.pdf"
-                    ],
-                    "title": "6789.pdf"
-                },
-                {
-                    "type": "doc",
-                    "id": "aaeb4b5c-0450-cb4d-a1ac-244f3d115c4a",
-                    "code": "hbcn",
-                    "scope": "private",
-                    "cntr": "1595321354",
-                    "link": [
-                        "https://teammodelstorage.blob.core.chinacloudapi.cn/1595321354/doc/422北京培新活动邀请函.pdf"
-                    ],
-                    "title": "422北京培新活动邀请函.pdf"
-                },
-                {
-                    "type": "doc",
-                    "id": "c5f5838c-5c2f-5e9b-a734-a473cd2cad2e",
-                    "code": "hbcn",
-                    "scope": "school",
-                    "cntr": "hbcn",
-                    "link": [
-                        "https://teammodelstorage.blob.core.chinacloudapi.cn/hbcn/doc/6666.pdf"
-                    ],
-                    "title": "6666.pdf"
-                },
-                {
-                    "type": "doc",
-                    "id": "4a106c8e-6831-5f4b-4ec3-3c18f778cab2",
-                    "code": "hbcn",
-                    "scope": "school",
-                    "cntr": "hbcn",
-                    "link": [
-                        "https://teammodelstorage.blob.core.chinacloudapi.cn/hbcn/doc/6.pdf"
-                    ],
-                    "title": "6.pdf"
-                }
-            ],
-            "cids": [
-                "AC4BA269-541B-4DFC-92A5-D773068A6439"
-            ],
-            "creatorId": null,
-            "updateTime": 0,
-            "title": "第一单元 新冠疫情防控"
-        },
-        {
-            "children": [
-                {
-                    "children": [],
-                    "id": "FC5132E1-9723-4875-B3B5-D3DC98D194FA",
-                    "pid": "4f12752c-852f-6e90-a3df-1f1f710af23d",
-                    "order": 0,
-                    "rnodes": [],
-                    "cids": [],
-                    "creatorId": null,
-                    "updateTime": 0,
-                    "title": "2-1 全球醍摩豆智慧教育研究院"
-                },
-                {
-                    "children": [],
-                    "id": "3CAD52BE-67B6-4EDB-8EFB-9122960D816A",
-                    "pid": "4f12752c-852f-6e90-a3df-1f1f710af23d",
-                    "order": 1,
-                    "rnodes": [],
-                    "cids": [],
-                    "creatorId": null,
-                    "updateTime": 0,
-                    "title": "2-2 醍摩豆研究院课程体系"
-                }
-            ],
-            "id": "4f12752c-852f-6e90-a3df-1f1f710af23d",
-            "pid": "0baf00db-0768-4b62-a8f7-280f6bcebf71",
-            "order": 1,
-            "rnodes": [],
-            "cids": [
-                "FC5132E1-9723-4875-B3B5-D3DC98D194FA",
-                "3CAD52BE-67B6-4EDB-8EFB-9122960D816A"
-            ],
-            "creatorId": null,
-            "updateTime": 0,
-            "title": "第二单元 醍摩豆手册学习"
-        }
-    ]
-}
-              */
-
         /// <summary>
         /// 批量保存或更新课纲
         /// 
@@ -193,38 +46,96 @@ namespace TEAMModelOS.Controllers
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("upsert-tree")]
-        public async Task<IActionResult> SaveOrUpdateAsTree(SyllabusTreeNode request)
+        public async Task<IActionResult> SaveOrUpdateAsTree(List<SyllabusTreeNode> request)
         {
-            List<List<SyllabusTree>> tts = new List<List<SyllabusTree>>();
-            foreach (var tree in request.trees) {
-                Syllabus syllabus = new Syllabus();
+            foreach (SyllabusTreeNode syllabusTree in request) {
                 List<Tnode> nodes = new List<Tnode>();
-                SyllabusService.TreeToList(new List<SyllabusTree> { tree }, nodes);
-                syllabus.children = nodes;
-                syllabus.id = !string.IsNullOrEmpty(tree.id) ? tree.id : Guid.NewGuid().ToString();
-                syllabus.code = $"Syllabus-{request.id}";
-                syllabus.pk = "Syllabus";
-                syllabus.ttl = -1;
-                syllabus.volumeId = request.id;
-                if (request.scope == "school")
+                SyllabusService.TreeToList(syllabusTree.trees, nodes);
+                if (!string.IsNullOrEmpty(syllabusTree.id))
                 {
-                    await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{request.id}"));
+                    Syllabus syllabus = null;
+                    if (syllabusTree.scope == "school")
+                    {
+                        try
+                        {
+                            syllabus = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Syllabus>(syllabusTree.id, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                        }
+                        catch
+                        {
+                        }
+                        if (syllabus == null)
+                        {
+                            syllabus = new Syllabus();
+                            syllabus.id = syllabusTree.id;
+                            syllabus.children = nodes;
+                            syllabus.code = $"Syllabus-{syllabusTree.volumeId}";
+                            syllabus.pk = "Syllabus";
+                            syllabus.ttl = -1;
+                            syllabus.volumeId = syllabusTree.volumeId;
+                            syllabus.scope = syllabusTree.scope;
+                            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                        }
+                        else
+                        {
+                            syllabus.children = nodes;
+                            syllabusTree.auth = syllabus.auth;
+                            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<Syllabus>(syllabus,syllabus.id, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                        }
+
+                    }
+                    else {
+                        try
+                        {
+                            syllabus = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Syllabus>(syllabusTree.id, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                        }
+                        catch
+                        {
+                        }
+                        if (syllabus == null)
+                        {
+                            syllabus = new Syllabus();
+                            syllabus.id = syllabusTree.id;
+                            syllabus.children = nodes;
+                            syllabus.code = $"Syllabus-{syllabusTree.volumeId}";
+                            syllabus.pk = "Syllabus";
+                            syllabus.ttl = -1;
+                            syllabus.volumeId = syllabusTree.volumeId;
+                            syllabus.scope = syllabusTree.scope;
+                            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                        }
+                        else
+                        {
+                            syllabus.children = nodes;
+                            syllabusTree.auth = syllabus.auth;
+                            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                        }
+                    }
                 }
-                else
-                {
-                    await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{request.id}"));
+                else {
+                    string id = Guid.NewGuid().ToString();
+                    syllabusTree.id = id;
+                    Syllabus syllabus = new Syllabus {
+                        id = id,
+                        code = $"Syllabus-{syllabusTree.volumeId}",
+                        pk = "Syllabus",
+                        ttl = -1,
+                        volumeId=syllabusTree.volumeId,
+                        children=nodes,
+                        scope = syllabusTree.scope
+                    };
+                    if (syllabusTree.scope == "school") {
+                        await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                    } else {
+                        await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync<Syllabus>(syllabus, new Azure.Cosmos.PartitionKey($"Syllabus-{syllabusTree.volumeId}"));
+                    }
                 }
-                List<SyllabusTree> trees = SyllabusService.ListToTree(nodes);
-                tts.Add(trees);
             }
-
-            request.trees = new List<SyllabusTree>() ;
-            tts.ForEach(x => request.trees.AddRange(x));
             return Ok(request);
         }
 
- 
-
+        /*
+            {"code":"册别code:0baf00db-0768-4b62-a8f7-280f6bcebf71","scope":"school"}
+         */
         /// <summary>
         /// 查找课纲 
         /// </summary>
@@ -237,39 +148,41 @@ namespace TEAMModelOS.Controllers
             var client = _azureCosmos.GetCosmosClient();
             if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
             if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
-            SyllabusTreeNode tree = null;
-            string vcode = null;
-            List<List<SyllabusTree>> tts = new List<List<SyllabusTree>>();
+           
+            List<SyllabusTreeNode> treeNodes = new List<SyllabusTreeNode>();
             try {
                 if (scope.ToString().Equals("school"))
                 {
                     await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Syllabus>(queryText: $"select value(c) from c ",
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Syllabus-{code}") }))
                     {
-                        vcode = item.volumeId;
                         List<SyllabusTree> trees = SyllabusService.ListToTree(item.children);
-                        tts.Add(trees);
+                        SyllabusTreeNode tree = new SyllabusTreeNode() { id = item.id, scope =item.scope, trees = trees ,volumeId=item.volumeId,auth=item.auth};
+                        treeNodes.Add(tree);
                     }
-                    tree = new SyllabusTreeNode() { id = vcode,  scope = "school", trees= new List<SyllabusTree>() };
-                    tts.ForEach(x => tree.trees.AddRange(x));
+                    
                 }
                 else
                 {
                     await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Syllabus>(queryText: $"select value(c) from c ",
-                    requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Syllabus-{code}") }))
+                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Syllabus-{code}") }))
                     {
-                        vcode = item.volumeId;
                         List<SyllabusTree> trees = SyllabusService.ListToTree(item.children);
-                        tts.Add(trees);
+                        SyllabusTreeNode tree = new SyllabusTreeNode() { id = item.id, scope = item.scope, trees = trees, volumeId = item.volumeId, auth = item.auth };
+                        treeNodes.Add(tree);
                     }
-                    tree = new SyllabusTreeNode() { id = vcode, scope = "private", trees = new List<SyllabusTree>() };
-                    tts.ForEach(x => tree.trees.AddRange(x)); 
                 }
-                return Ok(new { tree });
+                return Ok(new { tree= treeNodes });
             } catch (Exception ex) {
-                return Ok(new { tree});
+                await _dingDing.SendBotMsg($"OS,{_option.Location},common/syllabus/find-id\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
+                return Ok(new { tree= treeNodes });
             }
         }
+
+        /*
+            {"id":"章节id","code":"册别id","scope":"school/private"}
+         */
+
         /// <summary>
         /// 删除章节
         /// </summary>
@@ -294,82 +207,5 @@ namespace TEAMModelOS.Controllers
                 return Ok(new { code = response.Status });
             }
         }
-
-
-     
-
-        private async Task<List<Tnode>> FindByPid(Tnode data, List<Tnode> nodes, List<Tnode> nodedata)
-        {
-            foreach (Tnode syllabus in nodedata)
-            {
-                if (syllabus.pid == data.id)
-                {
-                    nodes.Add(syllabus);
-                    await FindByPid(syllabus, nodes, nodedata);
-                }
-            }
-            return nodes;
-        }
-
-        
-        //private async Task<List<Syllabus>> SaveOrUpdateToNodes(List<Tnode> syllabusNodes)
-        //{
-        //    List<Syllabus> syllabuses;
-
-        //   var  data = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Syllabus>(  syllabusNodes[0].code ,new Azure.Cosmos.PartitionKey(""));
-        //    if (data.IsEmpty())
-        //    {
-        //        var syllabus = new Syllabus { id = syllabusNodes[0].code, code = syllabusNodes[0].code, children = new List<SyllabusNode>() };
-        //        await _azureCosmos.SaveOrUpdate(syllabus);
-        //        data = new List<Syllabus>() { syllabus };
-        //    }
-        //    List<SyllabusNode> syllabusNodes1 = new List<SyllabusNode>();
-        //    if (data.IsNotEmpty())
-        //    {
-        //        syllabusNodes1.AddRange(data[0].children);
-        //        //replace
-        //        for (int i = 0; i < data[0].children.Count; i++)
-        //        {
-        //            for (int j = 0; j < syllabusNodes.Count; j++)
-        //            {
-        //                if (data[0].children[i].id == syllabusNodes[j].id && data[0].children[i].code == syllabusNodes[j].code)
-        //                {
-        //                    syllabusNodes1.Remove(data[0].children[i]);
-        //                    syllabusNodes1.Add(syllabusNodes[j]);
-        //                    syllabusNodes.Remove(syllabusNodes[j]);
-        //                }
-        //            }
-        //        }
-        //        data[0].children = syllabusNodes1;
-
-        //        //新增
-        //        data[0].children.AddRange(syllabusNodes);
-
-        //        if (data[0].children.IsNotEmpty())
-        //        {
-        //            var len = data[0].children.Count;
-        //            for (int i = 0; i < len; i++)
-        //            {
-        //                if (data[0].children[i].items.IsNotEmpty())
-        //                {
-        //                    data[0].children[i].item = true;
-        //                }
-        //                if (data[0].children[i].resources.IsNotEmpty())
-        //                {
-        //                    data[0].children[i].resource = true;
-        //                }
-        //            }
-        //        }
-        //        syllabuses = await _azureCosmos.SaveOrUpdateAll<Syllabus>(data);
-
-        //    }
-        //    else
-        //    {
-        //        throw new BizException("保存失败", ResponseCode.FAILED);
-
-        //    }
-
-        //    return syllabuses;
-        //}
     }
 }