Procházet zdrojové kódy

update个人课例大于30删除多余的,并计算失效相关逻辑,并通知。

CrazyIter_Bin před 3 roky
rodič
revize
a78f1a078f

+ 3 - 1
TEAMModelAPI/ApiTokenAttribute.cs

@@ -108,7 +108,7 @@ namespace TEAMModelOS.Filter
                         id = jwt.Payload.Sub;//主题,又是应用APP
                         school = jwt.Payload.Azp;//学校编码
                         jti = jwt.Payload.Jti;//jwt唯一标识
-#if DEBUG
+#if !DEBUG
                         var permissions = jwt.Claims.Where(c => c.Type.Equals("auth"));
                         ///当前请求的api的设置的permission值是否包含在 从jwt的获取["1","2","3","4","5"]值中
                         if (!string.IsNullOrWhiteSpace(_auth) && permissions.Count() > 0)
@@ -118,6 +118,8 @@ namespace TEAMModelOS.Filter
                                 pass = true;
                             }
                         }
+#else
+                            pass=true;
 #endif
 
                         if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(school) && !string.IsNullOrEmpty(jti))

+ 9 - 3
TEAMModelAPI/Controllers/School/TeacherController.cs

@@ -59,7 +59,7 @@ namespace TEAMModelAPI.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
-        [HttpGet("get-teacher-list")]
+        [HttpPost("get-teacher-list")]
         [ApiToken(Auth = "1501", Name = "学校教师列表", RW = "R", Limit = false)]
         public async Task<IActionResult> GetTeacherList(JsonElement json)
         {
@@ -101,10 +101,16 @@ namespace TEAMModelAPI.Controllers
             }
             var teacherIds=   coreUsers.Select(x => x.id).Except(teachers.Select(x => x.id));
             List<CoreUser> unjoined = coreUsers.FindAll(x => teacherIds.Contains(x.id));
-            
+            List<dynamic> tchs= new List<dynamic>(); 
+            teachers.Select(x => new { x.id, x.name, x.picture, x.job, x.subjectIds, x.roles }).ToList().ForEach(x => {
+                var  coreUser= coreUsers.Find(c=>c.id.Equals(x.id));
+                if (coreUser != null) {
+                    tchs.Add(new {x.id,x.name,x.picture,x.job,x.subjectIds,x.roles,coreUser.searchKey });
+                }
+            });
             return Ok(new
             {
-                teachers = teachers.Select(x => new {x.id,x.name,x.picture,x.job,x.subjectIds,x.roles }),
+                teachers = tchs,
                 unjoined= unjoined.Select(x => new {x.id,x.name,x.picture,x.searchKey}),
                 unexist= unexist
             }); 

+ 2 - 0
TEAMModelOS.FunctionV4/Program.cs

@@ -8,6 +8,7 @@ using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using TEAMModelOS.Models;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Models.Service;
@@ -32,6 +33,7 @@ namespace TEAMModelOS.FunctionV4
            })
            .ConfigureServices((context, services) =>
            {
+               //services.Configure<Option>(options => context. Configuration.GetSection("Option").Bind(options));
                services.AddHttpClient();
                services.AddHttpClient<DingDing>();
                services.AddHttpClient<ThirdApisService>();

+ 210 - 2
TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs

@@ -788,14 +788,14 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                         from = $"BI:{_option.Location}:private",
                         to = bIBatchCopyFile.tmdIds,
                         label = $"{bIBatchCopyFile.codeKey}_finish",
-                        body = new { location = _option.Location, biz = $"{bIBatchCopyFile.codeKey}", tmdid = $"{bIBatchCopyFile.tmdid}", tmdname = $"{bIBatchCopyFile.tmdName}", status = 1, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }.ToJsonString(),
+                        body = new { location = $"{Environment.GetEnvironmentVariable("Option:Location")}", biz = $"{bIBatchCopyFile.codeKey}", tmdid = $"{bIBatchCopyFile.tmdid}", tmdname = $"{bIBatchCopyFile.tmdName}", status = 1, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }.ToJsonString(),
                         expires = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
                     };
 
                     var url = _configuration.GetValue<string>("HaBookAuth:CoreService:sendnotification");
                     var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
                     var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
-                    var location = _option.Location;
+                    var location = $"{Environment.GetEnvironmentVariable("Option:Location")}";
                     await _notificationService.SendNotification(clientID, clientSecret, location, url, notification); //站内发送消息
                 }
             }
@@ -1144,6 +1144,128 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                                     }
                                     lessonRecord.grade= grades.ToList();
                                 }
+                                //个人课例保存规则
+                                try {
+                                    if (scope.Equals("private"))
+                                    {
+                                        Teacher teacher = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>(tmdid, new PartitionKey("Base"));
+                                        if (teacher.lessonLimit != -1)
+                                        {
+
+                                            HashSet<string> ids = new HashSet<string>();
+                                            //未定义的 以及过期时间小于等于0 的 课例
+                                            string private_count_sql = "select value(c.id) from  c where ( c.expire<=0 or IS_DEFINED(c.expire) = false  )  ";
+                                            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryIterator<string>(
+                                                queryText: private_count_sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(code) }))
+                                            {
+
+                                                ids.Add(item);
+                                            }
+                                            //包含收藏的本人的个人课例
+                                            string favorite_count_sql = $"select value(c.id) from  c where c.fromCode='LessonRecord-{tmdid}' and c.scope='private' ";
+                                            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryIterator<string>(
+                                                queryText: favorite_count_sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Favorite-{tmdid}") }))
+                                            {
+                                                ids.Add(item);
+                                            }
+                                            //教师个人预设的,可以通过设置的方式增加
+                                            int limit = teacher.lessonLimit;
+                                            if (teacher.lessonLimit == 0)
+                                            {
+                                                //未设置的的采用系统设置的默认值30
+                                                limit = Constant.private_lesson_limit;
+                                            }
+                                            if (ids.Count >= limit)
+                                            {
+                                                // 1-时间戳,7-时间戳
+                                                Dictionary<int, long> result = new Dictionary<int, long>();
+                                                //暂定7天 
+                                                var now = DateTimeOffset.UtcNow;
+                                                //剩余3天的通知
+                                                //var day3= now.AddDays(Constant.private_lesson_expire - 3).ToUnixTimeMilliseconds();
+                                                //result.Add(3, day3);
+                                                //剩余1天的通知
+                                                var day1 = now.AddDays(Constant.private_lesson_expire -6).ToUnixTimeMilliseconds();
+                                                result.Add(1, day1);
+                                                //到期通知
+                                                lessonRecord.expire = now.AddDays(Constant.private_lesson_expire).ToUnixTimeMilliseconds();
+                                                result.Add(Constant.private_lesson_expire, lessonRecord.expire);
+                                                string biz = "expire";
+                                                Notification notification = new Notification
+                                                {
+                                                    hubName = "hita",
+                                                    type = "msg",
+                                                    from = $"ies5:{ Environment.GetEnvironmentVariable("Option:Location")}:private",
+                                                    to = new List<string> { tmdid },
+                                                    label = $"{biz}_lessonRecord",
+                                                    body = new {
+                                                        location = $"{Environment.GetEnvironmentVariable("Option:Location")}",
+                                                        biz = biz,
+                                                        tmdid = teacher.id,
+                                                        tmdname = teacher.name,
+                                                        sid = lessonRecord.id,
+                                                        sname = lessonRecord.name,
+                                                        stime = lessonRecord.startTime,
+                                                        expire = lessonRecord.expire,
+                                                        status = 1,
+                                                        day = Constant.private_lesson_expire,
+                                                        time = now
+                                                    }.ToJsonString(),
+                                                    expires = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
+                                                };
+                                                var url = _configuration.GetValue<string>("HaBookAuth:CoreService:sendnotification");
+                                                var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
+                                                var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
+                                                var location = $"{Environment.GetEnvironmentVariable("Option:Location")}";
+                                                await _notificationService.SendNotification(clientID, clientSecret, location, url, notification); //站内发送消息
+                                               
+                                                var table = _azureStorage.GetCloudTableClient().GetTableReference("ChangeRecord");
+                                                List<ChangeRecord> records = await table.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", lessonRecord.id } });
+                                                if (records.Count <= 0)
+                                                {
+                                                    foreach (var item in result)
+                                                    {
+                                                        string PartitionKey = string.Format("{0}{1}{2}", lessonRecord.code, "-", $"expire-{item.Key}");
+                                                        //课堂的id ,
+                                                        //课堂的通知时间类型progress, 默认就会发送一条,到期前一天发送一条,最后已到期发送一条。
+                                                        var message = new ServiceBusMessage(new
+                                                        {
+                                                            id = lessonRecord.id,
+                                                            progress = item.Key,
+                                                            code = lessonRecord.code,
+                                                            scope = lessonRecord.scope,
+                                                            school = lessonRecord.school,
+                                                            opt = "delete",
+                                                            expire = lessonRecord.expire,
+                                                            tmdid = tmdid,
+                                                            tmdname = teacher.name,
+                                                            name = lessonRecord.name,
+                                                            startTime = lessonRecord.startTime
+                                                        }.ToJsonString());
+                                                        message.ApplicationProperties.Add("name", "LessonRecordExpire");
+                                                        long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), message, DateTimeOffset.FromUnixTimeMilliseconds(item.Value));
+                                                        ChangeRecord changeRecord = new ChangeRecord
+                                                        {
+                                                            RowKey = lessonRecord.id,
+                                                            PartitionKey = PartitionKey,
+                                                            sequenceNumber = start,
+                                                            msgId = message.MessageId
+                                                        };
+                                                        await table.Save<ChangeRecord>(changeRecord);
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        else
+                                        {
+                                            //=-1 则表示不限制上传数量
+                                        }
+                                    }
+                                } catch (Exception e) {
+                                    await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-处理课堂记录的-CosmosDB异常{e.Message}\n{e.StackTrace}\n{lessonRecord.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
+                                }
+                                    
+                                
                                 msgs.Add(update);
                                 break;
                             default:
@@ -1168,7 +1290,93 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                 await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-更新课堂记录出错\n{ex.Message}\n{ex.StackTrace}\n{data}\n{code}\n{updates}\n", GroupNames.醍摩豆服務運維群組);
             }
         }
+        [Function("LessonRecordExpire")]
+        public async Task LessonRecordExpireFunc([ServiceBusTrigger("%Azure:ServiceBus:ActiveTask%", "lesson-record-expire", Connection = "Azure:ServiceBus:ConnectionString")] string msg)
+        {
+            
+            try
+            {
+                var jsonMsg = JsonDocument.Parse(msg).RootElement;
+                jsonMsg.TryGetProperty("id", out JsonElement id);
+                jsonMsg.TryGetProperty("progress", out JsonElement progress);
+                jsonMsg.TryGetProperty("code", out JsonElement _code);
+                jsonMsg.TryGetProperty("tmdid", out JsonElement tmdid);
+                jsonMsg.TryGetProperty("tmdname", out JsonElement tmdname);
+                jsonMsg.TryGetProperty("name", out JsonElement name);
+                jsonMsg.TryGetProperty("startTime", out JsonElement startTime);
+                jsonMsg.TryGetProperty("expire", out JsonElement expire);
+                jsonMsg.TryGetProperty("scope", out JsonElement scope);
+                jsonMsg.TryGetProperty("school", out JsonElement _school);
+                var client = _azureCosmos.GetCosmosClient();
+                //处理到期删除
+                if ($"{progress}".Equals($"{Constant.private_lesson_expire}")) {
+                    string lessonId = $"{id}";
+                    string tbname;
+                    string school=$"{_school}";
+                    string code = "";
+                    if ($"{scope}".Equals("school") && !string.IsNullOrEmpty($"{school}"))
+                    {
+                        code = $"LessonRecord-{school}";
+                        tbname = "School";
+                    }
+                    else if ($"{scope}".Equals("private"))
+                    {
+                        code = $"LessonRecord-{tmdid}";
+                        tbname = "Teacher";
+                    }
+                    else
+                    {
+                        return;
+                    }
+                    Azure.Response response = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(lessonId, new PartitionKey(code));
+                    if (response.Status == 200)
+                    {
+                        LessonRecord lessonRecord;
+                        var doc = JsonDocument.Parse(response.ContentStream);
+                        lessonRecord = doc.RootElement.ToObject<LessonRecord>();
+                        lessonRecord.status = 404;
+                        await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync(lessonRecord, lessonRecord.id, new PartitionKey(lessonRecord.code));
+                        var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
+                        var messageChange = new ServiceBusMessage(new   { delete_id =lessonId, tmdid =tmdid,scope=scope,opt="delete",school=school}.ToJsonString());
+                        messageChange.ApplicationProperties.Add("name", "LessonRecordEvent");
+                        await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
+                    }
+                }
+                string biz = "expire";
+                Notification notification = new Notification
+                {
+                    hubName = "hita",
+                    type = "msg",
+                    from = $"ies5:{_option.Location}:private",
+                    to = new List<string> { $"{tmdid}" },
+                    label = $"{biz}_lessonRecord",
+                    body = new {
+                        location = $"{Environment.GetEnvironmentVariable("Option:Location")}",
+                        biz = biz,
+                        tmdid = $"{tmdid}",
+                        tmdname = tmdname,
+                        sid =$"{id}",
+                        sname = $"{name}",
+                        stime = long.Parse($"{startTime}"),
+                        expire = long.Parse($"{expire}"),
+                        status = 1,
+                        day = Constant.private_lesson_expire,
+                        time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
+                    }.ToJsonString(),
+                    expires = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
+                };
+                var url = _configuration.GetValue<string>("HaBookAuth:CoreService:sendnotification");
+                var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
+                var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
+                var location =$"{Environment.GetEnvironmentVariable("Option:Location")}";
+                await _notificationService.SendNotification(clientID, clientSecret, location, url, notification); //站内发送消息
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-ServiceBus,Study()\n{ex.Message}\n{ex.StackTrace}\n{msg}", GroupNames.醍摩豆服務運維群組);
+            }
 
+        }
 
         /// <summary>
         /// 完善课程变更

+ 3 - 3
TEAMModelOS.FunctionV4/TEAMModelOS.FunctionV4.csproj

@@ -5,9 +5,9 @@
 		<OutputType>Exe</OutputType>
 		<_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
 		<SignAssembly>true</SignAssembly>
-		<AssemblyVersion>5.2204.1.1</AssemblyVersion>
-		<FileVersion>5.2204.1.1</FileVersion>
-		<Version>5.2204.1</Version>
+		<AssemblyVersion>5.2204.2.1</AssemblyVersion>
+		<FileVersion>5.2204.2.1</FileVersion>
+		<Version>5.2204.2</Version>
 		<PackageId>TEAMModelOS.FunctionV4</PackageId>
 		<Authors>teammodel</Authors>
 		<Company>醍摩豆(成都)信息技术有限公司</Company>

+ 2 - 0
TEAMModelOS.SDK/Context/Constant/Constant.cs

@@ -19,5 +19,7 @@ namespace TEAMModelOS.SDK.DI
         public static readonly string Common = "Common";
         public static readonly string Teacher = "Teacher";
         public static readonly string Student = "Student";
+        public static readonly int private_lesson_limit =30;
+        public static readonly int private_lesson_expire = 7;
     }
 }

+ 4 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/LessonRecord.cs

@@ -173,6 +173,10 @@ namespace TEAMModelOS.SDK.Models
 
         public int examCount { get; set; }
         public double totalInteractPoint { get; set; } = 0;
+        /// <summary>
+        /// 过期时间,-1永不过期, 1577808000000 2020-01-01
+        /// </summary>
+        public long expire { get; set; } = -1;
 
     }
     public class LessonTC

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/Teacher/Teacher.cs

@@ -14,7 +14,7 @@ namespace TEAMModelOS.SDK.Models
         public List<TeacherSchool> schools { get; set; } = new List<TeacherSchool>();
         public List<TeacherArea> areas { get; set; } = new List<TeacherArea>();
         public List<ThirdBind> binds { get; set; } = new List<ThirdBind>();
-
+        public int lessonLimit { get; set; } = 0;
         public class TeacherSchool
         {
             public string schoolId { get; set; }

+ 5 - 0
TEAMModelOS.SDK/Models/Service/StatisticsService.cs

@@ -925,10 +925,12 @@ namespace TEAMModelOS.SDK
                             var yx = hprecord.Where(x => x.score == 2) != null ? hprecord.Where(x => x.score == 2).Count() : 0;
                             if (no == hg && hg == yx && no == 0)
                             {
+                                //未评分 合格,优秀都是0 则未评分
                                 teacherAbility.hpscore = -1;
                             }
                             else if (no == hg && hg == yx && no != 0)
                             {
+                                //未评分,合格,优秀不为0 且一样,按优秀算
                                 teacherAbility.hpscore = 2;
                             }
                             else
@@ -936,16 +938,19 @@ namespace TEAMModelOS.SDK
                                 bool ok = false;
                                 List<int> arr = new List<int>() { yx, hg, no };
                                 int max = arr.Max();
+                                //有优秀按优秀算
                                 if (max == yx && !ok)
                                 {
                                     teacherAbility.hpscore = 2;
                                     ok = true;
                                 }
+                                //最高评分是合格,按合格算
                                 if (max == hg && !ok)
                                 {
                                     teacherAbility.hpscore = 1;
                                     ok = true;
                                 }
+                                //最高评分是未评分则按未评分算
                                 if (max == no && !ok)
                                 {
                                     teacherAbility.hpscore = 0;

+ 15 - 20
TEAMModelOS/Controllers/Common/StudyController.cs

@@ -341,36 +341,31 @@ namespace TEAMModelOS.Controllers.Common
                         study.status = 404;
                         if (!string.IsNullOrEmpty(study.examId))
                         {
-                            try { 
-                            ExamLite lite = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamLite>(study.examId, new PartitionKey($"ExamLite-{code}"));
-                            lite.status = 404;
-                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(lite, lite.id, new PartitionKey($"ExamLite-{code}"));
-                            }
-                            catch (CosmosException ex)
-                            {
+                            Azure.Response response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(study.examId, new PartitionKey($"ExamLite-{code}"));
+                            if (response.Status == 200) {
+                                ExamLite data= JsonDocument.Parse(response.Content).RootElement.Deserialize<ExamLite>();
+                                data.status = 404;
+                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(data, data.id, new PartitionKey($"ExamLite-{code}"));
                             }
                         }
                         if (!string.IsNullOrEmpty(study.surveyId))
                         {
-                            try { 
-                            Survey survey = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>(study.surveyId, new PartitionKey($"Survey-{code}"));
-                            survey.status = 404;
-                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(survey, survey.id, new PartitionKey($"Survey-{code}"));
-                            }
-                            catch (CosmosException ex)
+                            Azure.Response response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(study.surveyId, new PartitionKey($"Survey-{code}"));
+                            if (response.Status == 200)
                             {
+                                Survey data = JsonDocument.Parse(response.Content).RootElement.Deserialize<Survey>();
+                                data.status = 404;
+                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(data, data.id, new PartitionKey($"Survey-{code}"));
                             }
                         }
                         if (!string.IsNullOrEmpty(study.workId))
                         {
-                            try
-                            {
-                                Homework homework = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Homework>(study.workId, new PartitionKey($"Homework-{code}"));
-                                homework.status = 404;
-                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(homework, homework.id, new PartitionKey($"Homework-{code}"));
-                            }
-                            catch (CosmosException ex)
+                            Azure.Response response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(study.workId, new PartitionKey($"Homework-{code}"));
+                            if (response.Status == 200)
                             {
+                                Homework data = JsonDocument.Parse(response.Content).RootElement.Deserialize<Homework>();
+                                data.status = 404;
+                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(data, data.id, new PartitionKey($"Homework-{code}"));
                             }
                         }
                         await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(study, study.id, new PartitionKey($"{study.code}"));

+ 3 - 3
TEAMModelOS/TEAMModelOS.csproj

@@ -32,9 +32,9 @@
     <SpaRoot>ClientApp\</SpaRoot>
     <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
     <UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-    <Version>5.2204.1</Version>
-    <AssemblyVersion>5.2204.1.1</AssemblyVersion>
-    <FileVersion>5.2204.1.1</FileVersion>
+    <Version>5.2204.2</Version>
+    <AssemblyVersion>5.2204.2.1</AssemblyVersion>
+    <FileVersion>5.2204.2.1</FileVersion>
     <Description>TEAMModelOS(IES5)</Description>
     <PackageReleaseNotes>6.0版本说明</PackageReleaseNotes>
     <PackageId>TEAMModelOS</PackageId>