CrazyIter_Bin 1 year ago
parent
commit
dcba2e56be

+ 40 - 5
TEAMModelOS.SDK/Models/Cosmos/School/Knowledge.cs

@@ -17,7 +17,10 @@ namespace TEAMModelOS.SDK.Models
         }
         [Required(ErrorMessage = "owner 必须设置")]
         public string owner { get; set; }
-
+        /// <summary>
+        /// 个人知识点体系的名称,学校的知识点体系名称:科目名称
+        /// </summary>
+        public string name { get; set; }
         public string scope { get; set; }
         /// <summary>
         /// 学段id
@@ -44,6 +47,7 @@ namespace TEAMModelOS.SDK.Models
         public string id { get; set; }
         public string name { get; set; }
         public string pid { get; set; }
+        public List<string> cids {  get; set; }
         /// <summary>
         /// 使用次数
         /// </summary>
@@ -56,25 +60,56 @@ namespace TEAMModelOS.SDK.Models
 
     public  class KnowledgeTreeDto
     {
-        
+        public string id { get; set; }
+        [Required(ErrorMessage = "owner 必须设置")]
+        public string owner { get; set; }
+        [Required(ErrorMessage = "scope 必须设置")]
+        public string scope { get; set; }
+        /// <summary>
+        /// 学段id
+        /// </summary>
+        public string periodId { get; set; }
+        /// <summary>
+        /// 学科id
+        /// </summary>
+        public string subjectId { get; set; }
+
+        public string name { get; set; } 
+        /// <summary>
+        /// 知识点属性结构的节点
+        /// </summary>
+        public List<PointTree> tree { get; set; } = new List<PointTree>();
     }
-    public class PointTree 
+    public class PointTree
     {
+        [Required(ErrorMessage = "知识点节点id必须设置")]
         public string id { get; set; }
+        [Required(ErrorMessage = "知识点节点名称必须设置")]
         public string name { get; set; }
         public string pid { get; set; }
         /// <summary>
         /// 知识点属性结构的子节点
         /// </summary>
         public List<PointTree> nodes { get; set; }= new List<PointTree>();
+        public List<string> cids { get; set; } = new List<string>();
+        /// <summary>
+        /// 使用次数
+        /// </summary>
+        public long used { get; set; }
+        /// <summary>
+        /// 关联的资源数量
+        /// </summary>
+        public long link { get; set; }
     }
 
     public class TagOldNew
     {
-        [Required(ErrorMessage = "_old 必须设置")]
         public string _old { get; set; }
-        [Required(ErrorMessage = "_new 必须设置")]
+
         public string _new { get; set; }
+        public string _oldId { get; set; }
+
+        public string _newId { get; set; }
     }
     public class Block { 
         public string name { get; set; }

+ 4 - 0
TEAMModelOS.SDK/Models/Cosmos/Student/Student.cs

@@ -23,6 +23,10 @@ namespace TEAMModelOS.SDK.Models
         /// 教室授課ID,HiTeach(裝置ID),CC(TMID)
         /// </summary>
         public string userid { get; set; }
+        /// <summary>
+        /// 电子学生证类型,chinamobile 手机号类型,tianbo 串号类型
+        /// </summary>
+        public string imeiType { get; set; }
     }
     public class Student : CosmosEntity
     {

+ 77 - 0
TEAMModelOS.SDK/Models/Service/KnowledgeService.cs

@@ -0,0 +1,77 @@
+using HTEXLib.COMM.Helpers;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension;
+
+namespace TEAMModelOS.SDK.Models.Service
+{
+    public  sealed class KnowledgeService
+    {
+        public static List<PointNode> TreeToList(List<PointTree> trees, List<PointNode> nodes, List<Block> blocks,HashSet<string> points)
+        {
+            List<PointNode> list = new List<PointNode>();
+            trees.ForEach(x => {
+                List<string> cids = new List<string>();
+                if (x.nodes.IsNotEmpty())
+                {
+                    x.nodes.ForEach(y => { cids.Add(y.id); points.Add(y.name); y.pid=x.id; });
+                }
+                var node = new PointNode
+                {
+                    name = x.name,
+                    id = x.id,
+                    pid = x.pid,
+                    cids= cids,
+                    used =x.used,
+                    link = x.link,
+                };
+                list.Add(node);
+                blocks.Add(new Block { name= x.name,points=x.nodes.Select(x=>x.name).ToList() });
+                points.Add(x.name);
+            });
+           
+            nodes.AddRange(list);
+
+            foreach (PointTree tree in trees)
+            {
+                if (null != tree.nodes && tree.nodes.Count > 0)
+                {
+                    TreeToList(tree.nodes, nodes, blocks, points);
+                }
+            }
+            return nodes;
+        }
+        public static List<PointTree> ListToTree(List<PointNode> noes)
+        {
+            List<PointTree> list = noes.ToJsonString().ToObject<List<PointTree>>();
+            var res = from r in list group r by r.id into g select g;
+            Dictionary<string, PointTree> blockDict = new Dictionary<string, PointTree>();
+            foreach (var s in res)
+            {
+                blockDict.TryAdd(s.First().id, s.First());
+            }
+            return GetChild(list, blockDict);
+        }
+        private static List<PointTree> GetChild(List<PointTree> list, Dictionary<string, PointTree> dict)
+        {
+            //  list = list.OrderBy(m => m.Order).ToList();
+            List<PointTree> trees = new List<PointTree>();
+            foreach (PointTree node in list)
+            {
+                bool flag = dict.TryGetValue(node.pid, out PointTree syllabus);
+                if (flag && syllabus != null)
+                {
+                    syllabus.nodes.Add(node);
+                }
+                else
+                {
+                    trees.Add(node);
+                }
+            }
+            return trees;
+        }
+    }
+}

+ 113 - 2
TEAMModelOS/Controllers/Both/KnowledgeController.cs

@@ -2,12 +2,21 @@
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
+using System.Collections.Generic;
 using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Models;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
-
+using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK.Extension;
+using System.Text;
+using System;
+using Azure.Cosmos;
+using TEAMModelOS.SDK.Models.Service;
+using System.Linq;
+using HTEXLib.COMM.Helpers;
 namespace TEAMModelOS.Controllers.Both
 {
     [ProducesResponseType(StatusCodes.Status200OK)]
@@ -34,12 +43,114 @@ namespace TEAMModelOS.Controllers.Both
         }
         [ProducesDefaultResponseType]
         [HttpPost("upsert-knowledge")]
+#if !DEBUG
+
         [Authorize(Roles = "IES")]
         [AuthToken(Roles = "admin", Permissions = "knowledge-upd")]
+#endif 
         public async Task<IActionResult> UpsertKnowledge(JsonElement json) 
         {
+            KnowledgeTreeDto knowledge = json.GetProperty("knowledge").ToObject<KnowledgeTreeDto>();
+            List<TagOldNew> old_new = null;
+            if (json.TryGetProperty("old_new", out JsonElement _old_new))
+            {
+                old_new = _old_new.ToObject<List<TagOldNew>>();
+            }
+            ValidResult validResult = knowledge.Valid();
+            if (!validResult.isVaild)
+            {
+                return BadRequest(validResult);
+            }
+            var client = _azureCosmos.GetCosmosClient();
 
-
+            string code = string.Empty;
+            Knowledge old =  null;
+            var blocks = new List<Block>(); 
+            var points = new HashSet<string>();
+            var nodes = new List<PointNode>();
+            KnowledgeService.TreeToList(knowledge.tree, nodes, blocks, points);
+            if (knowledge.scope.Equals("school"))
+            {
+                if (!string.IsNullOrWhiteSpace(knowledge.subjectId)  && !string.IsNullOrWhiteSpace(knowledge.periodId))
+                {
+                    code = $"Knowledge-{knowledge.owner}-{knowledge.subjectId}";
+                    StringBuilder sql = new StringBuilder($"select value c  from c where c.periodId = '{knowledge.periodId}'");
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Knowledge>
+                        (queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(code) }))
+                    {
+                        old = item;
+                        break;
+                    }
+                    if (old!=null)
+                    {
+                        knowledge.id = old.id;
+                        foreach (var p in old.points) { 
+                            points.Add(p);
+                        }
+                        foreach (var b in old.blocks) {
+                            var bks=  blocks.FindAll(x => x.name.Equals(b.name));
+                            if (bks.IsNotEmpty())
+                            {
+                                foreach (var bk in bks)
+                                {
+                                    bk.points.AddRange(b.points);
+                                    bk.points= bk.points.Distinct().ToList();
+                                }
+                            }
+                            else {
+                                blocks.Add(b);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        knowledge.id = Guid.NewGuid().ToString();
+                    }
+                    Knowledge knowledgeDb = new Knowledge
+                    {
+                        id=knowledge.id,
+                        code=code,
+                        name=knowledge.name,
+                        periodId=knowledge.periodId,
+                        subjectId   =knowledge.subjectId,
+                        scope=knowledge.scope,
+                        blocks=blocks,
+                        pk="Knowledge",
+                        points=points.ToList(),
+                        nodes=nodes,
+                        owner=knowledge.owner,
+                    };
+                    return Ok(knowledgeDb);
+                    // await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS,Constant.School).UpsertItemAsync(knowledgeDb,new PartitionKey(code));
+                }
+            }
+            else {
+                code=$"Knowledge-{knowledge.owner}";
+                if (!string.IsNullOrWhiteSpace(knowledge.id)) 
+                {
+                    Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(knowledge.id, new PartitionKey(code));
+                    if (response.Status!=200) 
+                    {
+                        knowledge.id = Guid.NewGuid().ToString();
+                    }
+                }
+                Knowledge knowledgeDb = new Knowledge
+                {
+                    id=knowledge.id,
+                    code=code,
+                    name=knowledge.name,
+                    periodId=knowledge.periodId,
+                    subjectId   =knowledge.subjectId,
+                    scope=knowledge.scope,
+                    blocks=blocks,
+                    pk="Knowledge",
+                    points=points.ToList(),
+                    nodes=nodes,
+                    owner=knowledge.owner,
+                };
+                return Ok(knowledgeDb);
+             //   await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(knowledgeDb, new PartitionKey(code));
+            }
             return Ok();
         }
     }

+ 5 - 1
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -3939,6 +3939,7 @@ namespace TEAMModelOS.Controllers.Client
             }
         }
 
+
         /**
          * 根据学年获取年级信息
          * @param year 学年
@@ -4272,8 +4273,11 @@ namespace TEAMModelOS.Controllers.Client
             public QuestionExercise exercise { get; set; }
             public List<QuestionItem> item { get; set; }
         }
-        
+
 
         #endregion
+
+
+        
     }
 }

+ 145 - 0
TEAMModelOS/Controllers/Third/IRS/ThirdIRSController.cs

@@ -0,0 +1,145 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using System.Collections.Generic;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK;
+using System.Net.Http;
+using TEAMModelOS.Models;
+using Microsoft.Extensions.Options;
+using TEAMModelOS.SDK.Models;
+
+namespace TEAMModelOS.Controllers
+{
+
+
+
+    /// <summary>
+    /// 第三方IRS
+    /// </summary>
+    /// 
+    [ProducesResponseType(StatusCodes.Status200OK)]
+    [ProducesResponseType(StatusCodes.Status400BadRequest)]
+
+    [Route("third-irs/api")]
+    [ApiController]
+    public class ThirdIRSController: ControllerBase
+    {
+
+        private const string MZAppID = "5968c64b70b79b3f16c536c7a7569cf0";
+        private const string MZAppKey = "4fc97de75893f29d7cf7f4f0e84edd61";
+
+        public AzureCosmosFactory _azureCosmos;
+        private readonly AzureStorageFactory _azureStorage;
+        private readonly AzureRedisFactory _azureRedis;
+        private readonly AzureSignalRFactory _azureSignalR;
+        private readonly DingDing _dingDing;
+        private readonly Option _option;
+        private readonly IConfiguration _configuration;
+        private readonly CoreAPIHttpService _coreAPIHttpService;
+        private readonly IHttpClientFactory _httpClient;
+
+        public ThirdIRSController(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, AzureSignalRFactory azureSignalR, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration, IHttpClientFactory httpClient)
+        {
+            _azureCosmos = azureCosmos;
+            _azureStorage = azureStorage;
+            _azureRedis = azureRedis;
+            _azureSignalR = azureSignalR;
+            _dingDing = dingDing;
+            _option = option?.Value;
+            _configuration = configuration;
+            _coreAPIHttpService = coreAPIHttpService;
+            _httpClient = httpClient;
+        }
+
+        /// <summary>
+        /// 推送课中互动任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [Authorize(Roles = "HiTeach")]
+        [ProducesDefaultResponseType]
+        [HttpPost("push-lesson-task")]
+        public async Task<IActionResult> PushLessonTask(JsonElement request)
+        {
+            return Ok();
+        }
+
+        /// <summary>
+        /// 接收中国移动电子学生证
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("receive-chinamobile-mz-result")]
+        public async Task<IActionResult> ReceiveChinaMobileMZResult(JsonElement request)
+        {
+            return Ok();
+        }
+    }
+
+    /// <summary>
+    /// 课堂 互动任务
+    /// </summary>
+    public class LessonTask
+    {
+        /// <summary>
+        /// 任务id
+        /// </summary>
+        public string id { get; set; }
+
+        /// <summary>
+        /// 互动任务类型 exam 课中评测,
+        /// </summary>
+        public string type { get; set; }
+        /// <summary>
+        /// 教室编号
+        /// </summary>
+        public string channel { get; set; }
+        /// <summary>
+        /// 电子学生证类型,chinamobile 手机号类型,tianbo 串号类型
+        /// </summary>
+        public string imeiType { get; set; }
+        /// <summary>
+        /// 学校简码
+        /// </summary>
+        public string school { get; set; }
+        /// <summary>
+        ///type=exam 课中评测任务
+        /// </summary>
+
+        public ExamTask examTask { get; set; }
+    }
+
+    public class ExamTask
+    {
+
+        public string title { get; set; }
+        public List<ExamTaskItem> items { get; set; } = new List<ExamTaskItem>();
+    }
+
+    public class ExamTaskItem
+    {
+        /// <summary>
+        /// 题目序号
+        /// </summary>
+        public int id { get; set; }
+        public string type { get; set; }
+        /// <summary>
+        /// 题干
+        /// </summary>
+        public string question { get; set; }
+        /// <summary>
+        /// 选项
+        /// </summary>
+        public List<CodeValue> option { get; set; } = new List<CodeValue>();
+        /// <summary>
+        /// 正确答案
+        /// </summary>
+        public List<string> answer { get; set; } = new List<string>();
+
+    }
+}

+ 1 - 1
TEAMModelOS/Controllers/OpenApi/IRS/TianboController.cs

@@ -33,7 +33,7 @@ namespace TEAMModelOS.Controllers
         private readonly IConfiguration _configuration;
         private readonly CoreAPIHttpService _coreAPIHttpService;
         private readonly IHttpClientFactory _httpClient;
-        public TianboController(CoreAPIHttpService coreAPIHttpService,  AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, AzureSignalRFactory azureSignalR, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration, IHttpClientFactory httpClient)
+        public TianboController(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, AzureSignalRFactory azureSignalR, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration, IHttpClientFactory httpClient)
         {
             _azureCosmos = azureCosmos;
             _azureStorage = azureStorage;