Browse Source

Merge branch 'develop5.0-tmd' of http://106.12.23.251:10000/TEAMMODEL/TEAMModelOS into develop5.0-tmd

XW 3 years ago
parent
commit
6b9dca624f

+ 1 - 1
TEAMModelFunction/MonitorCosmosDB.cs

@@ -109,7 +109,7 @@ namespace TEAMModelFunction
                                 case "Study":
                                     TriggerStudy.Trigger(_serviceBus, _azureStorage, _dingDing, client, input, data, _azureRedis);
                                     break;
-                                case "TeacherWork":
+                                case "Homework":
                                     TriggerWork.Trigger(_serviceBus, _azureStorage, _dingDing, client, input, data, _azureRedis);
                                     break;
 

+ 2 - 2
TEAMModelFunction/TriggerWork.cs

@@ -36,7 +36,7 @@ namespace TEAMModelFunction
                     blobcntr = tdata.creatorId;
                 }
                 await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}研修作业活动【{tdata.name}-{tdata.id}-ttl={tdata.ttl}】正在操作", GroupNames.成都开发測試群組);
-                TeacherWork work = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<TeacherWork>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
+                Homework work = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Homework>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
                 //List<ChangeRecord> voteRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", vote.progress } });
                 if (work != null)
                 {
@@ -52,7 +52,7 @@ namespace TEAMModelFunction
                                 pk = "Activity",
                                 id = work.id,
                                 code = $"Activity-{x.id}",
-                                type = "TeacherWork",
+                                type = "Homework",
                                 name = work.name,
                                 startTime = work.startTime,
                                 endTime = work.endTime,

+ 76 - 47
TEAMModelOS.SDK/Models/Cosmos/Common/Homework.cs

@@ -2,80 +2,109 @@ using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Text;
-
+using System.Text.Json;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 
 
 namespace TEAMModelOS.SDK.Models
 {
     /// <summary>
-    /// 作业
+    /// 教师作业活动
     /// </summary>    
-    public class Homework:CosmosEntity
-    {        
-        public Homework()
-        {
-           
-
-            resource = new List<ProcessRes>();
-        }   
+    public class Homework : CosmosEntity
+    {
+        public Homework() {
+            pk = "Homework";//
+            classes = new List<string>();
+            stuLists = new List<string>();
+            tchLists = new List<string>();
+        }
+        /// <summary> 
+        ///发布层级 类型 school  teacher
+        /// </summary>
 
+        /// <summary>
+        /// 学校编码或教室tmdid
+        /// </summary>
+        [Required(ErrorMessage = "owner 必须设置")]
+        public string owner { get; set; }
+      
+        public string school { get; set; }
         /// <summary>
         /// 作业名称
         /// </summary>
+        [Required(ErrorMessage = "name 必须设置")]
         public string name { get; set; }
-
-       
-
         /// <summary>
-        /// 发布模式 0 立即发布 1 定时
+        ///  作业内容
         /// </summary>
-        public string publishModel { get; set; }
-
+        public string description { get; set; }
         /// <summary>
-        /// 开始时间
+        /// 创建者的id 
         /// </summary>
-        public long startTime { get; set; }
-
+        [Required(ErrorMessage = "creatorId 必须设置")]
+        public string creatorId { get; set; }
+        // public int year { get; set; }
         /// <summary>
-        /// 结束时间
+        /// pending 待发布|going 已发布|finish 已结束
         /// </summary>
-        public long endTime { get; set; }
-        //记录ServiceBus每条消息的编号
-
-        public long sequenceNumber { get; set; }
-
-
-
-
+        //[Required(ErrorMessage = "progress 必须设置")]
+        public string progress { get; set; }
+        public string scope { get; set; }
 
+        //public List<string> tmdids { get; set; } = new List<string>();
         /// <summary>
-        /// 作业描述
+        ///  行政班  
         /// </summary>
-        public string description { get; set; }
-
-  
+        public List<string> classes { get; set; } = new List<string>();
         /// <summary>
-        /// 作业附件
+        /// 学生名单(包含自定义个人学生名单,学校教学班)
         /// </summary>
-        public List<ProcessRes> resource { get; set; }
-
-
+        public List<string> stuLists { get; set; } = new List<string>();
         /// <summary>
-        /// 状态 (100:待发布 200:已发布 300:已结束)
+        /// 教研组名单
         /// </summary>
-        public int status { get; set; }
-
-        //public Subdto subdto { get; set; }
-
+        public List<string> tchLists { get; set; } = new List<string>();
         /// <summary>
-        /// 学生 是否互评 是否可见 
+        /// student 学生名单类型    research 教研组名单
         /// </summary>
-        public List<string> other { get; set; }
-        //创建时间 
-        public long createTime { get; set; }
-        
-
+        public string targetType { get; set; }
+        /// <summary>
+        /// 发布对象全部信息。由前端操作,用于前端回显发布对象的格式。
+        /// </summary>
+        public List<JsonElement> targets { get; set; } = new List<JsonElement>();
+        /// <summary>
+        ///class行政班/teach教学班
+        /// </summary>
+        //public string classType { get; set; }
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public long startTime { get; set; }
 
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public long endTime { get; set; }
+        public long createTime { get; set; } // 作业发布时间
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        public long updateTime { get; set; }
+        public string  blob { get; set; }
+        /// <summary>
+        /// TTL删除改变状态使用
+        /// </summary>
+        public int? status { get; set; } = 0;
+        public long? size { get; set; } = 0;
+        public string areaId { get; set; }
+        public List<Submits> teachers { get; set; } = new List<Submits>();
+    }
+    public class Submits {
+        public string id { get; set; }
+        //public string name { get; set; }
+        //记录作业上传内容
+        public string hw { get; set; }
+        public long hwTime { get; set; }
     }
 }

+ 0 - 110
TEAMModelOS.SDK/Models/Cosmos/Teacher/TeacherWork.cs

@@ -1,110 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Text;
-using System.Text.Json;
-using TEAMModelOS.SDK.Context.Attributes.Azure;
-
-
-namespace TEAMModelOS.SDK.Models
-{
-    /// <summary>
-    /// 教师作业活动
-    /// </summary>    
-    public class TeacherWork : CosmosEntity
-    {
-        public TeacherWork() {
-            pk = "TeacherWork";
-            classes = new List<string>();
-            stuLists = new List<string>();
-            tchLists = new List<string>();
-        }
-        /// <summary> 
-        ///发布层级 类型 school  teacher
-        /// </summary>
-
-        /// <summary>
-        /// 学校编码或教室tmdid
-        /// </summary>
-        [Required(ErrorMessage = "owner 必须设置")]
-        public string owner { get; set; }
-      
-        public string school { get; set; }
-        /// <summary>
-        /// 作业名称
-        /// </summary>
-        [Required(ErrorMessage = "name 必须设置")]
-        public string name { get; set; }
-        /// <summary>
-        ///  作业内容
-        /// </summary>
-        public string description { get; set; }
-        /// <summary>
-        /// 创建者的id 
-        /// </summary>
-        [Required(ErrorMessage = "creatorId 必须设置")]
-        public string creatorId { get; set; }
-        // public int year { get; set; }
-        /// <summary>
-        /// pending 待发布|going 已发布|finish 已结束
-        /// </summary>
-        //[Required(ErrorMessage = "progress 必须设置")]
-        public string progress { get; set; }
-        public string scope { get; set; }
-
-        //public List<string> tmdids { get; set; } = new List<string>();
-        /// <summary>
-        ///  行政班  
-        /// </summary>
-        public List<string> classes { get; set; } = new List<string>();
-        /// <summary>
-        /// 学生名单(包含自定义个人学生名单,学校教学班)
-        /// </summary>
-        public List<string> stuLists { get; set; } = new List<string>();
-        /// <summary>
-        /// 教研组名单
-        /// </summary>
-        public List<string> tchLists { get; set; } = new List<string>();
-        /// <summary>
-        /// student 学生名单类型    research 教研组名单
-        /// </summary>
-        public string targetType { get; set; }
-        /// <summary>
-        /// 发布对象全部信息。由前端操作,用于前端回显发布对象的格式。
-        /// </summary>
-        public List<JsonElement> targets { get; set; } = new List<JsonElement>();
-        /// <summary>
-        ///class行政班/teach教学班
-        /// </summary>
-        //public string classType { get; set; }
-        /// <summary>
-        /// 开始时间
-        /// </summary>
-        public long startTime { get; set; }
-
-        /// <summary>
-        /// 结束时间
-        /// </summary>
-        public long endTime { get; set; }
-        public long createTime { get; set; } // 作业发布时间
-        /// <summary>
-        /// 更新时间
-        /// </summary>
-        public long updateTime { get; set; }
-        public string  blob { get; set; }
-        /// <summary>
-        /// TTL删除改变状态使用
-        /// </summary>
-        public int? status { get; set; } = 0;
-        public long? size { get; set; } = 0;
-        public string areaId { get; set; }
-        public List<Submits> teachers { get; set; } = new List<Submits>();
-    }
-    public class Submits {
-        public string id { get; set; }
-        //public string name { get; set; }
-        //记录作业上传内容
-        public string hw { get; set; }
-        public long hwTime { get; set; }
-    }
-}

+ 5 - 5
TEAMModelOS.SDK/Models/Service/TeacherWorkService.cs

@@ -1,4 +1,4 @@
-using Azure.Cosmos;
+using Azure.Cosmos;
 using System;
 using System.Collections.Generic;
 using System.Text;
@@ -7,14 +7,14 @@ using TEAMModelOS.SDK.DI;
 
 namespace TEAMModelOS.SDK.Models.Service
 {
-	public static class TeacherWorkService
+	public static class HomeworkService
 	{
-        public static async Task<string> saveMoreAsync(CosmosClient client, DingDing _dingDing, TeacherWork work)
+        public static async Task<string> saveMoreAsync(CosmosClient client, DingDing _dingDing, Homework work)
         {
             try
             {
                 work.ttl = -1;
-                work.code = "TeacherWork-" + work.school;
+                work.code = "Homework-" + work.school;
                 long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                 work.createTime = now;
 
@@ -31,7 +31,7 @@ namespace TEAMModelOS.SDK.Models.Service
             }
             catch (Exception e)
             {
-                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-TeacherWorkService-saveMore\n{e.Message}{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-HomeworkService-saveMore\n{e.Message}{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
                 return "";
 
             }

+ 14 - 8
TEAMModelOS/ClientApp/src/common/BaseSelectArea.vue

@@ -47,7 +47,8 @@
 				"utf-8")) : undefined;
 			this.user.schools = user.schools
 			let joinSchools = user.schools && user.schools.length ? user.schools.filter(i => i.status === 'join') : null
-			let defaultSchoolCode = user.defaultschool
+			// 优先读取本地存储(F5刷新影响) 如果是登录进入 则是读取默认学校
+			let defaultSchoolCode = localStorage.getItem('login_schoolCode') || user.defaultschool
 			console.log(joinSchools);
 			/* 如果没有加入的学校或者加入的学校都没有归属区 */
 			if(!joinSchools || joinSchools.every(i => !i.area)){
@@ -72,7 +73,7 @@
 					this.areaList.push(this.otherSch)
 				}
 				let defaultAreaIndex = defaultSchoolCode ? this.areaList.indexOf(joinSchools.find(i => i.schoolId === defaultSchoolCode).area.name) : 0
-				this.onAreaSelect(defaultAreaIndex)
+				this.onAreaSelect(defaultAreaIndex,defaultSchoolCode)
 			} else if (joinSchools && joinSchools.length) {
 				// 拿到用户管理的schools 必须是已加入的学校
 				this.curSchool = user.defaultschool ? joinSchools.filter(i => i.schoolId === user.defaultschool)[0] :
@@ -84,19 +85,24 @@
 					this.areaList.push(this.otherSch)
 				}
 				let defaultAreaIndex = defaultSchoolCode ? this.areaList.indexOf(joinSchools.find(i => i.schoolId === defaultSchoolCode).area.name) : 0
-				this.onAreaSelect(defaultAreaIndex)
+				this.onAreaSelect(defaultAreaIndex,defaultSchoolCode)
 			} else {
 				// this.$Message.warning(this.$t('utils.noShoolTip'))
 			}
 		},
 		methods: {
-			onAreaSelect(val){
+			/* 区级切换时,如果时因为切换学校导致切换区域,则需要把切换的学校编码带进来 否则默认第一个学校 */
+			onAreaSelect(val,defaultSchoolCode){
 				this.curAreaIndex = val
 				let areaSchs = this.joinSchools.filter(i => i.area.name === this.areaList[this.curAreaIndex])
-				this.onSchoolSelect(areaSchs[0])
-				this.$EventBus.$emit('onChangeArea', this.areaList[this.curAreaIndex])
-				sessionStorage.setItem('areaId',areaSchs[0].areaId)
-				sessionStorage.setItem('areaName',areaSchs[0].area.name)
+				let curSchIndex = defaultSchoolCode ? areaSchs.map(i => i.schoolId).indexOf(defaultSchoolCode) : 0
+				this.onSchoolSelect(areaSchs[curSchIndex])
+				this.$EventBus.$emit('onChangeArea', {
+					areaName:this.areaList[this.curAreaIndex],
+					schoolCode:defaultSchoolCode
+				})
+				sessionStorage.setItem('areaId',areaSchs[curSchIndex].areaId)
+				sessionStorage.setItem('areaName',areaSchs[curSchIndex].area.name)
 			},
 			async onSchoolSelect(val) {
 				console.log(val)

+ 22 - 2
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -79,6 +79,8 @@
 			} else {
 				this.$Message.warning(this.$t('utils.noShoolTip'))
 			}
+			console.log(this.areaSchs)
+			console.log(this.curSchool)
 		},
 		methods: {
 			async onSchoolSelect(val) {
@@ -159,8 +161,26 @@
 				console.log('区域切换',params);
 				console.log('区域切换',this.joinSchools);
 				if(this.joinSchools.length){
-					this.areaSchs = this.joinSchools.filter(i => i.area.name === params)
-					this.curSchool = this.joinSchools.filter(i => i.area.name === params)[0]
+					this.areaSchs = this.joinSchools.filter(i => i.area.name === params.areaName)
+					this.curSchool = params.schoolCode ? this.areaSchs.find(i => i.schoolId === params.schoolCode) : this.areaSchs[0]
+					// sessionStorage.setItem('areaName',params)
+					// this.onSchoolSelect(0)
+					let schoolCode = this.curSchool.schoolId
+					console.error(schoolCode)
+					this.$EventBus.$emit('onChangeSchool', {
+						schoolCode: schoolCode
+					})
+					// 更新当前school_code
+					this.$store.dispatch('user/setSchoolCode', schoolCode)
+					// 更新当前school_profile以及access
+					this.$store.dispatch('user/checkSchoolProfile').then(res => {
+						if (res) {
+							this.$User.freshLogin()
+						}
+					});
+					this.$router.push({
+						name: 'home'
+					})
 				}
 				console.error(this.curSchool)
 				

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js

@@ -34,7 +34,7 @@ export default {
     addErr:'Failed to add!',
     editOk:'Modified successfully!',
     editErr:'Failure to modify!',
-    formTips:'Please check the course information!',
+    formTips:'Please complete the information first, then save!',
     noSchool:'Not yet joined any schools, no school data available',
     sltCusTips:'Please enter course',
 

+ 1 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/home.js

@@ -45,7 +45,7 @@ export default{
     noNotice:'No announcement yet',
     noInfo:'No message yet',
     schoolLabel:'School',
-    privateLabel:'Private',
+    privateLabel:'Personal',
     mon:'Mon',
     tues:'Tues',
     wed:'Wed',
@@ -53,5 +53,4 @@ export default{
     fri:'Fri',
     sat:'Sat',
     sun:'Sun'
-
 }

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/learnActivity.js

@@ -22,7 +22,7 @@ export default {
         autoTips2: 'This function is only used to show the scenario and quickly simulate teacher grading data. Teacher grading are randomly generated for reference only!',
         autoScore: 'One Click Grading',
         autoAnswer: 'One Click Answering',
-        evSubject: 'Subject:',
+        evSubject: 'Assessing Subject:',
         returnTop: 'Back to the top',
         mockOk: 'Simulate successfully',
         mockErr: 'Failed to simulate',
@@ -97,7 +97,7 @@ export default {
         delPdContent: 'Are you sure to delete?',
         delOk: 'Delete successfully',
         pdTips: 'Please select the school system!',
-        defaultPaper: '(Please pick exam files)',
+        defaultPaper: '(Please pick or import exam files)',
     },
     // ManualPaper.vue
     manual: {

+ 0 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/stuAccount.js

@@ -102,7 +102,6 @@ export default {
   idRepErr:'Account already exists, will overwrite the original account',
   stuYearErr:"Student's academic year Data is incorrect",
   classYearErr:"Class's grade level is incorrect",
- 
   importOk: '導入成功',
 
   // Authorization.vue

+ 0 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/home.js

@@ -53,5 +53,4 @@ export default {
     fri:'五',
     sat:'六',
     sun:'日'
-    
 }

+ 3 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/learnActivity.js

@@ -22,7 +22,7 @@ export default {
         autoTips2: '此功能僅用於展示情境快速模擬教師評分數據,且分數為隨機生成,僅供參考!',
         autoScore: '一鍵評分',
         autoAnswer: '一鍵作答',
-        evSubject: '學科:',
+        evSubject: '測試學科:',
         returnTop: '跳回頂端',
         mockOk: '模擬成功',
         mockErr: '模擬失敗',
@@ -97,7 +97,7 @@ export default {
         delPdContent: '是否確認刪除',
         delOk: '刪除成功',
         pdTips: '請先選擇施測學制!',
-        defaultPaper: '(請先挑選試卷)',
+        defaultPaper: '(請先挑選或匯入試卷)',
     },
     //ManualPaper.vue
     manual: {
@@ -191,7 +191,7 @@ export default {
         nextQu: '下一題',
         view: '查看',
         requesting: '數據請求中,請稍後……',
-        dataError: '數據請求常,請刷新頁面再試',
+        dataError: '數據請求常,請刷新頁面再試',
         byStuMark:'按人批閱',
         byQuMark:'按題批閱',
         noStuAnswer:'學生暫未作答',

+ 1 - 0
TEAMModelOS/ClientApp/src/view/learnactivity/MgtSchoolEva.less

@@ -4,6 +4,7 @@
 @second-textColor: var(--second-text-color); //文本副级颜色
 @primary-fontSize: 14px;
 @second-fontSize: 16px;
+@borderColor: #424242; 
 
 .manage-evaluation-container {
     width: 100%;

+ 7 - 4
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -859,15 +859,18 @@ export default {
                         this.$api.courseMgmt.upsertStulist(params).then(
                             res => {
                                 this.$Message.success(this.$t('cusMgt.delOk'))
+                                console.log(schedule)
                                 if (schedule) {
-                                    for (let i = 0; i < schedule.students.length; i++) {
-                                        if (delIds.indexOf(schedule.students[i].id) > -1) {
-                                            schedule.students.splice(i, 1)
+                                    for (let i = 0; i < schedule.allStu.length; i++) {
+                                        if (delIds.includes(schedule.allStu[i].id)) {
+                                            schedule.allStu.splice(i, 1)
                                             i--
                                         }
                                     }
+                                    // let s = this._.cloneDeep(schedule.students)
+                                    // schedule.students = []
+                                    // schedule.students = s
                                 }
-                                // this.getCusInfo()
                             },
                             err => {
                                 this.$Message.error(this.$t('cusMgt.delErr'))

+ 15 - 15
TEAMModelOS/Controllers/Common/AreaController.cs

@@ -305,16 +305,16 @@ namespace TEAMModelOS.Controllers
                         if (setting.Equals("hw"))
                         {
                             if (!request.TryGetProperty("work", out JsonElement work)) return BadRequest();
-                            TeacherWork teacherWork = work.ToObject<TeacherWork>();
-                            teacherWork.owner = "area";
-                            teacherWork.school = pa.sId;
-                            teacherWork.areaId = id.GetString();
-                            teacherWork.tchLists = pa.gId;
-                            teacherWork.scope = "school";
-                            teacherWork.targetType = "research";
-                            //teacherWork.blob = $"/{teacherWork.areaId}/survey/{study.pId}/index.json";
-                            await getMoreWork(pa, teacherWork);
-                            string workId = await TeacherWorkService.saveMoreAsync(client, _dingDing, teacherWork);
+                            Homework homework = work.ToObject<Homework>();
+                            homework.owner = "area";
+                            homework.school = pa.sId;
+                            homework.areaId = id.GetString();
+                            homework.tchLists = pa.gId;
+                            homework.scope = "school";
+                            homework.targetType = "research";
+                            //homework.blob = $"/{homework.areaId}/survey/{study.pId}/index.json";
+                            await getMoreWork(pa, homework);
+                            string workId = await HomeworkService.saveMoreAsync(client, _dingDing, homework);
                             if (string.IsNullOrEmpty(workId))
                             {
                                 return Ok(new { code = (int)HttpStatusCode.BadRequest, msg = "作业活动异常" });
@@ -420,7 +420,7 @@ namespace TEAMModelOS.Controllers
                 List<(List<TmdInfo> teac, Survey sur)> trSurveys = new List<(List<TmdInfo> teac, Survey sur)>();
                 List<(List<TmdInfo> teac, ExamLite examLite)> trExams = new List<(List<TmdInfo> teac, ExamLite examLite)>();
                 List<(List<TmdInfo> teac, Study stu)> moreInfo = new List<(List<TmdInfo> teac, Study stu)>();
-                List<(List<TmdInfo> teac, TeacherWork tw)> works = new List<(List<TmdInfo> teac, TeacherWork tw)>();
+                List<(List<TmdInfo> teac, Homework tw)> works = new List<(List<TmdInfo> teac, Homework tw)>();
                 foreach (Study study in studies)
                 {
                     (List<TmdInfo> tchList, _) = await TriggerStuActivity.GetTchList(client, _dingDing, study.tchLists, study.school);
@@ -447,11 +447,11 @@ namespace TEAMModelOS.Controllers
                     }
                     if (!string.IsNullOrEmpty(study.workId))
                     {
-                        var sresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(study.workId, new PartitionKey($"TeacherWork-{study.school}"));
+                        var sresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(study.workId, new PartitionKey($"Homework-{study.school}"));
                         if (sresponse.Status == 200)
                         {
                             using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
-                            TeacherWork work = json.ToObject<TeacherWork>();
+                            Homework work = json.ToObject<Homework>();
                             works.Add((tchList, work));
                         }
                     }
@@ -929,7 +929,7 @@ namespace TEAMModelOS.Controllers
                                 }
                                 if (!string.IsNullOrEmpty(study.workId))
                                 {
-                                    await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(study.workId, new PartitionKey($"TeacherWork-{study.school}"));
+                                    await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(study.workId, new PartitionKey($"Homework-{study.school}"));
                                 }
                             }
                         }
@@ -1217,7 +1217,7 @@ namespace TEAMModelOS.Controllers
             }
             return Task.FromResult(trSurvey);
         }
-        private Task<TeacherWork> getMoreWork(parameter pa, TeacherWork work)
+        private Task<Homework> getMoreWork(parameter pa, Homework work)
         {
             if (pa.gName.Count == 0)
             {

+ 1 - 1
TEAMModelOS/Controllers/Common/StudyController.cs

@@ -253,7 +253,7 @@ namespace TEAMModelOS.Controllers.Common
                     }
                     if (!string.IsNullOrEmpty(study.workId))
                     {
-                        await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(study.workId, new PartitionKey($"TeacherWork-{code}"));
+                        await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(study.workId, new PartitionKey($"Homework-{code}"));
                     }
                 }
                 var response = await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Study-{code}"));

+ 17 - 17
TEAMModelOS/Controllers/Common/WorkController.cs

@@ -56,12 +56,12 @@ namespace TEAMModelOS.Controllers.Common
             try
             {
                 var client = _azureCosmos.GetCosmosClient();
-                TeacherWork work = request.ToObject<TeacherWork>();
+                Homework work = request.ToObject<Homework>();
                 work.owner = "school";
                 try
                 {
                     work.ttl = -1;
-                    work.code = "TeacherWork-" + work.school;
+                    work.code = "Homework-" + work.school;
                     long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                     work.createTime = now;
 
@@ -84,7 +84,7 @@ namespace TEAMModelOS.Controllers.Common
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},TeacherWork/save()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},Homework/save()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 
@@ -110,11 +110,11 @@ namespace TEAMModelOS.Controllers.Common
                 var client = _azureCosmos.GetCosmosClient();
                 //List<List<string>> answer = ans.ToObject<List<List<string>>>();
                 long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(id.ToString(), new PartitionKey($"TeacherWork-{code}"));
+                var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(id.ToString(), new PartitionKey($"Homework-{code}"));
                 if (response.Status == (int)HttpStatusCode.OK)
                 {
                     var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    TeacherWork work = json.ToObject<TeacherWork>();
+                    Homework work = json.ToObject<Homework>();
                     //List<List<string>> standard = work.items.answers;                  
                     bool flag = work.teachers.Exists(s => s.id.Equals(tId.GetString()));
                     List<string> ids = work.teachers.Select(e => e.id).ToList();
@@ -148,7 +148,7 @@ namespace TEAMModelOS.Controllers.Common
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},TeacherWork/record-in()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},Homework/record-in()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 
@@ -164,7 +164,7 @@ namespace TEAMModelOS.Controllers.Common
                 if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
                 if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
                 var client = _azureCosmos.GetCosmosClient();
-                var response = await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"TeacherWork-{code}"));
+                var response = await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Homework-{code}"));
                 return Ok(new { id, code = response.Status });
 
 
@@ -172,7 +172,7 @@ namespace TEAMModelOS.Controllers.Common
             }
             catch (Exception e)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},TeacherWork/delete()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},Homework/delete()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
         }
@@ -209,7 +209,7 @@ namespace TEAMModelOS.Controllers.Common
                 }
 
                 List<object> works = new();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query, continuationToken: token, requestOptions: new QueryRequestOptions() { MaxItemCount = topcout, PartitionKey = new PartitionKey($"TeacherWork-{code}") }))
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query, continuationToken: token, requestOptions: new QueryRequestOptions() { MaxItemCount = topcout, PartitionKey = new PartitionKey($"Homework-{code}") }))
                 {
 
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -231,7 +231,7 @@ namespace TEAMModelOS.Controllers.Common
             }
             catch (Exception e)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},TeacherWork/find()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},Homework/find()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 
@@ -247,8 +247,8 @@ namespace TEAMModelOS.Controllers.Common
                 if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
                 if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
                 var client = _azureCosmos.GetCosmosClient();
-                List<TeacherWork> works = new();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<TeacherWork>(queryText: $"select value(c) from c where c.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"TeacherWork-{code}") }))
+                List<Homework> works = new();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<Homework>(queryText: $"select value(c) from c where c.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Homework-{code}") }))
                 {
                     works.Add(item);
                 }
@@ -256,7 +256,7 @@ namespace TEAMModelOS.Controllers.Common
             }
             catch (Exception e)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},TeacherWork/FindSummary()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},Homework/FindSummary()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 
@@ -277,7 +277,7 @@ namespace TEAMModelOS.Controllers.Common
                 var client = _azureCosmos.GetCosmosClient();
                 var query = $"select c.id,c.name,c.createTime,A0.time from c join A0 in c.teachers where A0.id = '{tId}'";
                 List<object> works = new();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"TeacherWork-{code}") }))
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Homework-{code}") }))
                 {
 
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -293,7 +293,7 @@ namespace TEAMModelOS.Controllers.Common
             }
             catch (Exception e)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},TeacherWork/find-by-teacher()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},Homework/find-by-teacher()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 
@@ -311,7 +311,7 @@ namespace TEAMModelOS.Controllers.Common
                 if (!requert.TryGetProperty("tId", out JsonElement tId)) return BadRequest();
                 var client = _azureCosmos.GetCosmosClient();
                 List<object> works = new();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c join A0 in c.teachers where A0.id = '{tId}' and c.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"TeacherWork-{code}") }))
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c join A0 in c.teachers where A0.id = '{tId}' and c.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Homework-{code}") }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -326,7 +326,7 @@ namespace TEAMModelOS.Controllers.Common
             }
             catch (Exception e)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},TeacherWork/find-summary-by-teacher()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},Homework/find-summary-by-teacher()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 

+ 1 - 1
TEAMModelOS/Controllers/School/SchoolTeacherController.cs

@@ -397,7 +397,7 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
-        [AuthToken(Roles = "admin",Permissions ="")]
+        [AuthToken(Roles = "admin",Permissions = "schoolSetting-upd,auth-upd,schoolAc-upd,teacher-upd")]
         [HttpPost("upd-teacher-status")]
         public async Task<IActionResult> UpdSchoolTeacherStatus(JsonElement request)
         {

+ 1 - 1
TEAMModelOS/Controllers/School/StuListController.cs

@@ -636,7 +636,7 @@ namespace TEAMModelOS.Controllers
                 var client = _azureCosmos.GetCosmosClient();
                 List<object> stuList = new List<object>();
                 //List<int> stuCount = new List<int>();
-                var query = $"select c.id,c.name,c.students,c.tmids,c.periodId,c.no from c";
+                var query = $"select value(c) from c";
                 if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
                 {
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{code}") }))

+ 142 - 111
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -38,7 +38,7 @@ namespace TEAMModelOS.Controllers
         private readonly AzureStorageFactory _azureStorage;
         private readonly DingDing _dingDing;
         private readonly Option _option;
-        private readonly IConfiguration _configuration; 
+        private readonly IConfiguration _configuration;
         private readonly NotificationService _notificationService;
         public InitController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration, NotificationService notificationService)
         {
@@ -59,29 +59,33 @@ namespace TEAMModelOS.Controllers
         [HttpPost("set-teacher-info")]
         [AuthToken(Roles = "admin,teacher,area")]
 
-        public async Task<IActionResult> SetTeacherInfo(JsonElement request) {
+        public async Task<IActionResult> SetTeacherInfo(JsonElement request)
+        {
             var client = _azureCosmos.GetCosmosClient();
-           
+
             if (!request.TryGetProperty("opt", out JsonElement _opt))
             {
                 return BadRequest();
             }
             var (userid, name, _, school) = HttpContext.GetAuthTokenInfo();
-            try { 
+            try
+            {
                 Teacher teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(userid, new PartitionKey("Base"));
-                switch (true) {
+                switch (true)
+                {
                     //修改默认学校
-                    case bool when  $"{_opt}".Equals("UpdateDefaultSchool", StringComparison.OrdinalIgnoreCase) && (request.TryGetProperty("defaultSchool", out JsonElement _defaultSchool)) :
+                    case bool when $"{_opt}".Equals("UpdateDefaultSchool", StringComparison.OrdinalIgnoreCase) && (request.TryGetProperty("defaultSchool", out JsonElement _defaultSchool)):
                         if (teacher.schools.Select(x => x.schoolId).Contains($"{_defaultSchool}") && !string.IsNullOrEmpty($"{_defaultSchool}"))
                         {
                             teacher.defaultSchool = $"{_defaultSchool}";
                             await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, userid, new PartitionKey("Base"));
                             return Ok(new { teacher, status = 1 });
                         }
-                        else {
-                            return BadRequest(new { status=-1,msg="您未加入该学校!"});
+                        else
+                        {
+                            return BadRequest(new { status = -1, msg = "您未加入该学校!" });
                         }
-                    case bool when $"{_opt}".Equals("TransferAdminRole", StringComparison.OrdinalIgnoreCase ) &&  (request.TryGetProperty("targerTecher", out JsonElement _targetTecher)   ):
+                    case bool when $"{_opt}".Equals("TransferAdminRole", StringComparison.OrdinalIgnoreCase) && (request.TryGetProperty("targerTecher", out JsonElement _targetTecher)):
                         if (!string.IsNullOrEmpty(school) && !string.IsNullOrEmpty($"{_targetTecher}"))
                         {
                             SchoolTeacher schoolTeacher = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>(userid, new PartitionKey($"Teacher-{school}"));
@@ -89,19 +93,20 @@ namespace TEAMModelOS.Controllers
                             {
                                 schoolTeacher.roles.Remove("admin");
                                 SchoolTeacher newSchoolTeacher = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>($"{_targetTecher}", new PartitionKey($"Teacher-{school}"));
-                                if (!newSchoolTeacher.roles.Contains("admin")) {
+                                if (!newSchoolTeacher.roles.Contains("admin"))
+                                {
                                     newSchoolTeacher.roles.Add("admin");
                                     newSchoolTeacher = await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(newSchoolTeacher, $"{_targetTecher}", new PartitionKey($"Teacher-{school}"));
                                 }
                                 await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(schoolTeacher, userid, new PartitionKey($"Teacher-{school}"));
                                 string code = "transfer-admin";
-                                School schoolBase= await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>( school, new PartitionKey($"Base"));
+                                School schoolBase = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey($"Base"));
                                 Notification notification = new Notification
                                 {
                                     hubName = "hita",
                                     type = "msg",
                                     from = $"ies5:{_option.Location}:{school}",
-                                    to = new List<string> { $"{_targetTecher}"},
+                                    to = new List<string> { $"{_targetTecher}" },
                                     label = $"{code}_school",
                                     body = new { location = _option.Location, biz = code, tmdid = userid, tmdname = name, schoolcode = $"{school}", schoolname = $"{schoolBase.name}", status = 1, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }.ToJsonString(),
                                     expires = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
@@ -115,27 +120,28 @@ namespace TEAMModelOS.Controllers
                                     var location = _option.Location;
                                     await _notificationService.SendNotification(clientID, clientSecret, location, url, notification);
                                 }
-                                return Ok(new {  status = 1 });
+                                return Ok(new { status = 1 });
                             }
                             else
                             {
                                 return BadRequest(new { status = -1, msg = "当前登录账号没有admin权限" });
                             }
                         }
-                        else {
+                        else
+                        {
                             return BadRequest(new { status = -1, msg = "参数异常!" });
                         }
-                       
+
                 }
             }
-            catch(Exception ex)
+            catch (Exception ex)
             {
                 await _dingDing.SendBotMsg($"IES5,{_option.Location},Teacher/init/set-teacher-info()\n{ex.Message}{ex.StackTrace}{request.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest("teacher not exist");
 
             }
             return BadRequest();
-        
+
         }
         //TODO 此API需處理對應前端返回的相關數據
         [ProducesDefaultResponseType]
@@ -158,7 +164,8 @@ namespace TEAMModelOS.Controllers
                 var client = _azureCosmos.GetCosmosClient();
                 int total = 0;
                 int tsize = 0;
-                try {
+                try
+                {
                     Teacher teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(id, new PartitionKey("Base"));
                     teacher.name = $"{name}";
                     teacher.picture = $"{picture}";
@@ -168,87 +175,97 @@ namespace TEAMModelOS.Controllers
                     total = teacher.size;
                     areas = teacher.areas;
                     //检查是否有加入学校,如果加入学校,则当个人空间size是0G的时候,则免费获得一个G空间,但无论加入多少个学校,只能获取一次 1G的免费空间。没有加入学校则默认0G空间,除非自己购买空间
-                    if (teacher.schools.IsNotEmpty()) {
-                    foreach (var sc in teacher.schools) {
-                        string statusNow = sc.status!=null?sc.status:"";
-                        if (statusNow .Equals("join") || statusNow .Equals("invite") || statusNow.Equals("request")) {
-                            dynamic schoolExtobj = new ExpandoObject();
-                            var schoolJson = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{sc.schoolId}", new PartitionKey("Base"));
-                            var school = await JsonDocument.ParseAsync(schoolJson.ContentStream);
-                            schoolExtobj.schoolId = sc.schoolId;
-                            schoolExtobj.name = school.RootElement.GetProperty("name") ;
-                            schoolExtobj.status =sc.status;
-                            schoolExtobj.time = sc.time;
-                            schoolExtobj.picture = school.RootElement.GetProperty("picture");
-                            school.RootElement.TryGetProperty("areaId",out  JsonElement areaId);
-                            schoolExtobj.areaId = $"{areaId}";
-                            Area area = null;
-                            if (!string.IsNullOrEmpty($"{areaId}"))
+                    if (teacher.schools.IsNotEmpty())
+                    {
+                        foreach (var sc in teacher.schools)
+                        {
+                            string statusNow = sc.status != null ? sc.status : "";
+                            if (statusNow.Equals("join") || statusNow.Equals("invite") || statusNow.Equals("request"))
                             {
-                                    
-                                try
+                                dynamic schoolExtobj = new ExpandoObject();
+                                var schoolJson = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{sc.schoolId}", new PartitionKey("Base"));
+                                var school = await JsonDocument.ParseAsync(schoolJson.ContentStream);
+                                schoolExtobj.schoolId = sc.schoolId;
+                                schoolExtobj.name = school.RootElement.GetProperty("name");
+                                schoolExtobj.status = sc.status;
+                                schoolExtobj.time = sc.time;
+                                schoolExtobj.picture = school.RootElement.GetProperty("picture");
+                                school.RootElement.TryGetProperty("areaId", out JsonElement areaId);
+                                schoolExtobj.areaId = $"{areaId}";
+                                Area area = null;
+                                if (!string.IsNullOrEmpty($"{areaId}"))
+                                {
+
+                                    try
+                                    {
+                                        area = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Area>($"{areaId}", new PartitionKey("Base-Area"));
+                                    }
+                                    catch (CosmosException)
+                                    {
+                                        area = null;
+                                    }
+                                }
+                                schoolExtobj.area = area;
+                                var sctch = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(id, new PartitionKey($"Teacher-{sc.schoolId}"));
+                                if (sctch.Status == 200)
                                 {
-                                    area = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Area>($"{areaId}", new PartitionKey("Base-Area"));
+                                    var jsonDoc = await JsonDocument.ParseAsync(sctch.ContentStream);
+                                    SchoolTeacher schoolTeacher = jsonDoc.RootElement.ToObject<SchoolTeacher>();
+                                    schoolTeacher.name = $"{name}";
+                                    schoolTeacher.picture = $"{picture}";
+                                    await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(schoolTeacher, id, new PartitionKey($"Teacher-{sc.schoolId}"));
+                                    if (jsonDoc.RootElement.TryGetProperty("size", out JsonElement _size) && _size.ValueKind.Equals(JsonValueKind.Number))
+                                    {
+                                        total += _size.GetInt32();
+                                        schoolExtobj.size = _size.GetInt32();
+                                    }
+                                    else { schoolExtobj.size = 0; }
                                 }
-                                catch (CosmosException )
+                                else
                                 {
-                                    area = null;
+                                    schoolExtobj.size = 0;
                                 }
-                            }
-                            schoolExtobj.area = area;
-                            var sctch = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(id, new PartitionKey($"Teacher-{sc.schoolId}"));
-                            if (sctch.Status == 200)
-                            {
-                                var jsonDoc = await JsonDocument.ParseAsync(sctch.ContentStream);
-                                SchoolTeacher schoolTeacher = jsonDoc.RootElement.ToObject<SchoolTeacher>();
-                                schoolTeacher.name = $"{name}";
-                                schoolTeacher.picture = $"{picture}";
-                                await  client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(schoolTeacher, id, new PartitionKey($"Teacher-{sc.schoolId}"));
-                                if (jsonDoc.RootElement.TryGetProperty("size", out JsonElement _size) && _size.ValueKind.Equals(JsonValueKind.Number))
+                                if (statusNow.Equals("join"))
                                 {
-                                    total += _size.GetInt32();
-                                    schoolExtobj.size = _size.GetInt32();
+                                    //初始化
+                                    await TmdUserService.JoinSchool(client, teacher.id, teacher.picture, teacher.name, sc.schoolId, sc.name);
                                 }
-                                else { schoolExtobj.size = 0; }
-                            }
-                            else {
-                                schoolExtobj.size=0;
-                            }
-                            if (statusNow.Equals("join")) {
-                                //初始化
-                                await  TmdUserService.JoinSchool(client, teacher.id, teacher.picture, teacher.name, sc.schoolId, sc.name);
+                                schools.Add(schoolExtobj);
                             }
-                            schools.Add(schoolExtobj);
                         }
-                    }
                         //如果包含任何申请,邀请,加入学校的记录 且个人空间未分配2G  则默认分配个人空间至2G.
-                        if ( teacher.size<2 && teacher.schools.Count > 0)
+                        if (teacher.size < 2 && teacher.schools.Count > 0)
                         {
                             teacher.size = 2;
                         }
                         //如果未包含任何申请,邀请,加入学校的记录 且 个人空间没有分配1G 则默认赠送一个G 
-                        if (teacher.schools.Count == 0 && teacher.size<1) {
+                        if (teacher.schools.Count == 0 && teacher.size < 1)
+                        {
                             teacher.size = 1;
                         }
                     }
-                    if (string.IsNullOrEmpty(teacher.defaultSchool) && teacher.schools.IsNotEmpty()) {
+                    if (string.IsNullOrEmpty(teacher.defaultSchool) && teacher.schools.IsNotEmpty())
+                    {
                         var tech = teacher.schools.FindAll(x => x.status.Equals("join"));
-                        if (tech.IsNotEmpty()) {
+                        if (tech.IsNotEmpty())
+                        {
                             teacher.defaultSchool = teacher.schools[0].schoolId;
                         }
                     }
                     await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, id, new PartitionKey("Base"));
                     //預設學校ID
                     defaultschool = teacher.defaultSchool;
-                } catch(CosmosException ex) 
-                { 
-                    if (ex.Status == 404) {
+                }
+                catch (CosmosException ex)
+                {
+                    if (ex.Status == 404)
+                    {
                         //如果沒有,則初始化Teacher基本資料到Cosmos
                         Teacher teacher = new Teacher
                         {
-                            id = id, 
+                            id = id,
                             pk = "Base",
-                            code = "Base", 
+                            code = "Base",
                             name = name?.ToString(),
                             picture = picture?.ToString(),
                             //创建账号并第一次登录IES5则默认赠送1G
@@ -261,7 +278,7 @@ namespace TEAMModelOS.Controllers
                         teacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync<Teacher>(teacher, new PartitionKey("Base"));
                         total = teacher.size;
                         tsize = teacher.size;
-                    } 
+                    }
                 }
                 //私人課程
                 List<object> courses = new List<object>();
@@ -279,9 +296,10 @@ namespace TEAMModelOS.Controllers
 
                 //老師個人課綱  TODO 暂时不取
                 List<SyllabusRole> syllabus = new List<SyllabusRole>();
-                List<string> roles= new List<string>() { "teacher" };
+                List<string> roles = new List<string>() { "teacher" };
                 Area areaa = null;
-                if (areas.Count > 0) {
+                if (areas.Count > 0)
+                {
                     roles.Add("area");
                     if (!string.IsNullOrEmpty($"{areas[0]}"))
                     {
@@ -297,14 +315,15 @@ namespace TEAMModelOS.Controllers
                     }
                 }
                 //換取AuthToken,提供給前端
-                var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, standard: areaa != null ? areaa.standard : "",roles: roles.ToArray());
+                var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, standard: areaa != null ? areaa.standard : "", roles: roles.ToArray());
                 //取得Teacher Blob 容器位置及SAS 
                 await _azureStorage.GetBlobContainerClient(id).CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
                 var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete);
                 var (osblob_uri, osblob_sas) = roles.Contains("area") ? _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete) : _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
                 return Ok(new { location = _option.Location, auth_token, blob_uri, blob_sas, schools, defaultschool, courses, total, osblob_uri, osblob_sas, tsize, status = 200, areas });
             }
-            catch (CosmosException ex) {
+            catch (CosmosException ex)
+            {
                 await _dingDing.SendBotMsg($"IES5,{_option.Location},Teacher/GetTeacherInfo()\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
@@ -317,7 +336,7 @@ namespace TEAMModelOS.Controllers
 
         //TODO 此API需處理對應前端返回的相關數據
         [ProducesDefaultResponseType]
-        [HttpPost("get-school-info")]        
+        [HttpPost("get-school-info")]
         public async Task<IActionResult> GetSchoolInfo(JsonElement request)
         {
             try
@@ -380,14 +399,17 @@ namespace TEAMModelOS.Controllers
                 //TODO JJ,调整为取得学校基础设置数据,取代下方學校學制、年級
 
                 School school_base = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{school_code}", new PartitionKey("Base"));
-                foreach (var period in school_base.period) {
+                foreach (var period in school_base.period)
+                {
                     try
                     {
                         await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<ItemCond>($"{period.id}", new PartitionKey($"ItemCond-{school_code}"));
                     }
-                    catch (CosmosException ) {
-                        ItemCond itemCond = new ItemCond {
-                            id = period.id, 
+                    catch (CosmosException)
+                    {
+                        ItemCond itemCond = new ItemCond
+                        {
+                            id = period.id,
                             pk = "ItemCond",
                             code = $"ItemCond-{school_code}",
                             ttl = -1,
@@ -500,7 +522,8 @@ namespace TEAMModelOS.Controllers
                 var (osblob_uri, osblob_sas) = roles.Contains("area") ? _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete) : _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
                 return Ok(new { auth_token, blob_uri, blob_sas, school_base, school_courses, school_syllabus, school_classes, school_rooms, size, osblob_uri, osblob_sas, status = 200, areas });
             }
-            catch (CosmosException ex) {
+            catch (CosmosException ex)
+            {
                 await _dingDing.SendBotMsg($"IES5,{_option.Location},Teacher/init/get-school-info()\n{ex.Message}{ex.StackTrace}{request.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
                 return Ok(new { status = ex.Status });
             }
@@ -533,12 +556,12 @@ namespace TEAMModelOS.Controllers
                 Dictionary<string, List<Dictionary<string, string>>> managerSchDic = new Dictionary<string, List<Dictionary<string, string>>>();
                 string managerWhereOption = (!string.IsNullOrWhiteSpace(sqlSchoolId)) ? $" AND c.code = 'Teacher-{sqlSchoolId}'" : string.Empty;
                 string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'admin', true) AND c.pk = 'Teacher' AND c.status = 'join'{managerWhereOption}";
-                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() {} ))
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                     {
-                        string id =  obj.GetProperty("id").GetString(); //管理者ID
+                        string id = obj.GetProperty("id").GetString(); //管理者ID
                         string name = obj.GetProperty("name").GetString(); //管理者姓名
                         string schoolId = obj.GetProperty("schoolId").GetString(); //學校ID
                         Dictionary<string, string> managerDic = new Dictionary<string, string>();
@@ -598,19 +621,19 @@ namespace TEAMModelOS.Controllers
                             }
                             schoolExtobj.hasBaseModule = (baseModuleSchList.Contains(schoolExtobj.id)) ? true : false;
                             //學校輸出結果加入篩選
-                            if( (sqlHasManager && sqlHasMBaseModule) && (schoolExtobj.hasManager && schoolExtobj.hasBaseModule) )
+                            if ((sqlHasManager && sqlHasMBaseModule) && (schoolExtobj.hasManager && schoolExtobj.hasBaseModule))
                             {
                                 schools.Add(schoolExtobj);
                             }
-                            else if(sqlHasManager && schoolExtobj.hasManager)
+                            else if (sqlHasManager && schoolExtobj.hasManager)
                             {
                                 schools.Add(schoolExtobj);
                             }
-                            else if(sqlHasMBaseModule && schoolExtobj.hasBaseModule)
+                            else if (sqlHasMBaseModule && schoolExtobj.hasBaseModule)
                             {
                                 schools.Add(schoolExtobj);
                             }
-                            else if(!sqlHasManager && !sqlHasMBaseModule)
+                            else if (!sqlHasManager && !sqlHasMBaseModule)
                             {
                                 schools.Add(schoolExtobj);
                             }
@@ -664,9 +687,9 @@ namespace TEAMModelOS.Controllers
                 else
                 {
                     long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    teacher.schools.Add(new Teacher.TeacherSchool() { schoolId = school_code.GetString(), name = school_name.GetString(), status = grant_type.GetString() ,time= now });
+                    teacher.schools.Add(new Teacher.TeacherSchool() { schoolId = school_code.GetString(), name = school_name.GetString(), status = grant_type.GetString(), time = now });
                 }
-                if (grant_type.GetString() .Equals("leave") || grant_type.GetString() .Equals("cancel"))
+                if (grant_type.GetString().Equals("leave") || grant_type.GetString().Equals("cancel"))
                 {
                     if (teacher.schools.IsNotEmpty())
                     {
@@ -677,12 +700,12 @@ namespace TEAMModelOS.Controllers
                             inSchools.ForEach(x => teacher.schools.Remove(x));
                         }
                     }
-                    
+
                     if (teacher.schools.Count > 0 && teacher.size <= 1)
                     {
                         teacher.size = 2;
                     }
-                    if (!string.IsNullOrEmpty(teacher.defaultSchool) &&teacher.defaultSchool.Equals($"{school_code}"))
+                    if (!string.IsNullOrEmpty(teacher.defaultSchool) && teacher.defaultSchool.Equals($"{school_code}"))
                     {
                         if (teacher.schools.IsNotEmpty())
                         {
@@ -698,7 +721,8 @@ namespace TEAMModelOS.Controllers
                     //await TmdUserService.LeaveSchool(client, teacher.id, school.schoolId);
                     return Ok(new { stauts = 1 });
                 }
-                else {
+                else
+                {
                     var dft = new List<string>() { "content-read", "exercise-read", "knowledge-read", "syllabus-read" };
                     if (teacher.schools.Count > 0 && teacher.size <= 1)
                     {
@@ -712,21 +736,24 @@ namespace TEAMModelOS.Controllers
                         using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
                         SchoolTeacher steacher = json.ToObject<SchoolTeacher>();
                         steacher.status = grant_type.GetString();
-                        if (grant_type.ToString().Equals("join")) {
+                        if (grant_type.ToString().Equals("join"))
+                        {
                             if (steacher.permissions.IsNotEmpty())
                             {
-                                foreach (var d in dft) {
+                                foreach (var d in dft)
+                                {
                                     if (!steacher.permissions.Contains(d))
                                     {
                                         steacher.permissions.Add(d);
                                     }
                                 }
                             }
-                            else {
+                            else
+                            {
                                 steacher.permissions = dft;
                             }
-                             
-                            
+
+
                         }
                         var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(steacher, id, new PartitionKey($"Teacher-{school_code}"));
                     }
@@ -740,27 +767,30 @@ namespace TEAMModelOS.Controllers
                             id = id,
                             name = name.ToString(),
                             picture = picture?.ToString(),
-                            permissions = grant_type.ToString().Equals("join")? dft : null,
+                            permissions = grant_type.ToString().Equals("join") ? dft : null,
                             roles = new List<string>() { "teacher" },
                             size = 0,
                             status = grant_type.GetString()
                         };
                         var response = await client.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(st, new PartitionKey($"Teacher-{school_code}"));
                     }
-                    if (grant_type.ToString().Equals("join")) {
+                    if (grant_type.ToString().Equals("join"))
+                    {
                         await TmdUserService.JoinSchool(client, teacher.id, teacher.picture, teacher.name, school.schoolId, school.name);
                     }
                     Notification notification = null;
-                    
+
                     List<SchoolTeacher> teachers = new List<SchoolTeacher>();
                     var queryslt = $"SELECT  value(c)  FROM c join A1 in c.roles   where  A1 in ('admin')";
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<SchoolTeacher>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school_code}") }))
                     {
                         teachers.Add(item);
                     }
-                    if (teachers.IsNotEmpty()) {
+                    if (teachers.IsNotEmpty())
+                    {
                         string code = grant_type.GetString();
-                        if (grant_type.GetString() .Equals("join")) {
+                        if (grant_type.GetString().Equals("join"))
+                        {
                             code = "invite-join";
                         }
                         notification = new Notification
@@ -770,17 +800,18 @@ namespace TEAMModelOS.Controllers
                             from = $"ies5:{_option.Location}:private",
                             to = teachers.Select(x => x.id).ToList(),
                             label = $"{code}_school",
-                            body = new { location = _option.Location, biz = code, tmdid= id ,tmdname= name.ToString(), schoolcode=$"{school_code}", schoolname=$"{school_name}", status =1,time= DateTimeOffset.UtcNow .ToUnixTimeMilliseconds()}.ToJsonString(),
-                            expires= DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
+                            body = new { location = _option.Location, biz = code, tmdid = id, tmdname = name.ToString(), schoolcode = $"{school_code}", schoolname = $"{school_name}", status = 1, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }.ToJsonString(),
+                            expires = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
                         };
                     }
-                    
-                    if (notification != null) {
-                        var url= _configuration.GetValue<string>("HaBookAuth:CoreService:sendnotification");
-                        var clientID= _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
+
+                    if (notification != null)
+                    {
+                        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 code = await _notificationService .SendNotification(clientID, clientSecret, location, url, notification);
+                        var code = await _notificationService.SendNotification(clientID, clientSecret, location, url, notification);
                     }
                     return Ok(new { stauts = 1 });
                 }
@@ -800,7 +831,7 @@ namespace TEAMModelOS.Controllers
 
             foreach (var syllabus in syllabuses)
             {
-                if (syllabus.pid .Equals(""))
+                if (syllabus.pid.Equals(""))
                     nodes.Add(new SyllabusNode { id = syllabus.id, name = syllabus.name });
                 else
                 {

+ 0 - 15
TEAMModelOS/MSBuild_Logs/MSBuild_pid-10400_21a57e9d9a3747d1a0a1fffd1d5363ac.failure.txt

@@ -1,15 +0,0 @@
-UNHANDLED EXCEPTIONS FROM PROCESS 10400:
-=====================
-2021/9/10 11:25:43
-System.UnauthorizedAccessException: 对路径“C:\Program Files\Microsoft Visual Studio\2022\Preview\Common7\IDE\MSBuild_Logs”的访问被拒绝。
-   在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
-   在 System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)
-   在 System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)
-   在 Microsoft.Build.Shared.ExceptionHandling.DumpExceptionToFile(Exception ex)
-   在 Microsoft.Build.BackEnd.NodeEndpointOutOfProcBase.RunReadLoop(Stream localReadPipe, Stream localWritePipe, ConcurrentQueue`1 localPacketQueue, AutoResetEvent localPacketAvailable, AutoResetEvent localTerminatePacketPump)
-   在 Microsoft.Build.BackEnd.NodeEndpointOutOfProcBase.PacketPumpProc()
-   在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
-   在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
-   在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
-   在 System.Threading.ThreadHelper.ThreadStart()
-===================

+ 3 - 3
TEAMModelOS/TEAMModelOS.csproj

@@ -37,9 +37,9 @@
     <SpaRoot>ClientApp\</SpaRoot>
     <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
     <UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-    <Version>5.2109.6</Version>
-    <AssemblyVersion>5.2109.6.1</AssemblyVersion>
-    <FileVersion>5.2109.6.1</FileVersion>
+    <Version>5.2109.10</Version>
+    <AssemblyVersion>5.2109.10.1</AssemblyVersion>
+    <FileVersion>5.2109.10.1</FileVersion>
     <Description>TEAMModelOS(IES5)</Description>
     <PackageReleaseNotes>版本说明</PackageReleaseNotes>
   </PropertyGroup>