Ver Fonte

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

zhouj1203@hotmail.com há 3 anos atrás
pai
commit
5882fc0df4
45 ficheiros alterados com 673 adições e 425 exclusões
  1. 0 1
      TEAMModelFunction/TriggerExamLite.cs
  2. 0 1
      TEAMModelFunction/TriggerStudy.cs
  3. 1 1
      TEAMModelOS.SDK/Models/Cosmos/Common/ExamLite.cs
  4. 1 1
      TEAMModelOS.SDK/Models/Cosmos/Common/Study.cs
  5. 1 1
      TEAMModelOS.SDK/Models/Cosmos/School/ClassAnalysis.cs
  6. 1 1
      TEAMModelOS.SDK/Models/Cosmos/School/GradeAnalysis.cs
  7. 0 1
      TEAMModelOS.SDK/Models/Service/ExamService.cs
  8. 1 1
      TEAMModelOS/ClientApp/public/theme/dark-theme.css
  9. 4 0
      TEAMModelOS/ClientApp/src/api/ability.js
  10. 3 3
      TEAMModelOS/ClientApp/src/api/jyzx.js
  11. 8 4
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  12. 23 3
      TEAMModelOS/ClientApp/src/common/BaseSelectArea.vue
  13. 14 0
      TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue
  14. 13 3
      TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue
  15. 21 15
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseQnForm.vue
  16. 47 21
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseQuestionnaire.vue
  17. 19 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/jyzx.js
  18. 19 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/jyzx.js
  19. 19 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/jyzx.js
  20. 3 0
      TEAMModelOS/ClientApp/src/service/User.js
  21. 9 4
      TEAMModelOS/ClientApp/src/view/abilityMgmt/Index.vue
  22. 2 2
      TEAMModelOS/ClientApp/src/view/areaMgmt/SchoolDetail.vue
  23. 28 52
      TEAMModelOS/ClientApp/src/view/areatrain/Create.vue
  24. 106 60
      TEAMModelOS/ClientApp/src/view/areatrain/TrainDetail.vue
  25. 1 0
      TEAMModelOS/ClientApp/src/view/jyzx/DoSurvey.vue
  26. 21 22
      TEAMModelOS/ClientApp/src/view/jyzx/HomePage.vue
  27. 12 3
      TEAMModelOS/ClientApp/src/view/jyzx/Question.vue
  28. 10 5
      TEAMModelOS/ClientApp/src/view/jyzx/Vote.vue
  29. 2 0
      TEAMModelOS/ClientApp/src/view/jyzx/offline.less
  30. 46 22
      TEAMModelOS/ClientApp/src/view/jyzx/offline.vue
  31. 1 0
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue
  32. 109 56
      TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue
  33. 6 3
      TEAMModelOS/ClientApp/src/view/resource/Policy.vue
  34. 1 1
      TEAMModelOS/ClientApp/src/view/student-account/stulist/MgtStuList.vue
  35. 9 47
      TEAMModelOS/ClientApp/src/view/train/Create.vue
  36. 15 8
      TEAMModelOS/ClientApp/src/view/train/SurveyDetail.vue
  37. 28 35
      TEAMModelOS/ClientApp/src/view/train/TrainDetail.vue
  38. 3 3
      TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue
  39. 0 2
      TEAMModelOS/Controllers/Analysis/AnalysisController.cs
  40. 10 13
      TEAMModelOS/Controllers/Common/AreaController.cs
  41. 0 1
      TEAMModelOS/Controllers/Common/ExamLiteController.cs
  42. 0 1
      TEAMModelOS/Controllers/Common/StudyController.cs
  43. 27 27
      TEAMModelOS/Controllers/Research/AbilityStatisticsController.cs
  44. 14 1
      TEAMModelOS/Controllers/Teacher/InitController.cs
  45. 15 0
      TEAMModelOS/MSBuild_Logs/MSBuild_pid-10400_21a57e9d9a3747d1a0a1fffd1d5363ac.failure.txt

+ 0 - 1
TEAMModelFunction/TriggerExamLite.cs

@@ -8,7 +8,6 @@ using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
-using TEAMModelOS.SDK.Models.Cosmos.School;
 
 namespace TEAMModelFunction
 {

+ 0 - 1
TEAMModelFunction/TriggerStudy.cs

@@ -8,7 +8,6 @@ using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
-using TEAMModelOS.SDK.Models.Cosmos.School;
 
 namespace TEAMModelFunction
 {

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/Common/ExamLite.cs

@@ -4,7 +4,7 @@ using System.Text;
 using System.Text.Json;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 
-namespace TEAMModelOS.SDK.Models.Cosmos.School
+namespace TEAMModelOS.SDK.Models
 {
     public class ExamLite : CosmosEntity
     {

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/Common/Study.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 using System.Text;
 using System.Text.Json;
 
-namespace TEAMModelOS.SDK.Models.Cosmos.School
+namespace TEAMModelOS.SDK.Models
 {
     public class Study : CosmosEntity
     {

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/School/ClassAnalysis.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Models.Cosmos
+namespace TEAMModelOS.SDK.Models
 {
     public class ClassAnalysis
     {

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/School/GradeAnalysis.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace TEAMModelOS.SDK.Models.Cosmos
+namespace TEAMModelOS.SDK.Models
 {
     public class GradeAnalysis
     {

+ 0 - 1
TEAMModelOS.SDK/Models/Service/ExamService.cs

@@ -4,7 +4,6 @@ using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Models.Cosmos.School;
 
 namespace TEAMModelOS.SDK.Models.Service
 {

+ 1 - 1
TEAMModelOS/ClientApp/public/theme/dark-theme.css

@@ -17,7 +17,7 @@
     --primary-text-color: #303030; /* 文本主颜色 */
     --second-text-color: #757575; /* 文本副颜色 */
 
-    --border-color: #f1f1f1; /*边框颜色*/
+    --border-color: #d5d5d5; /*边框颜色*/
     
     --label-text-color: #a5a5a5; /*标签颜色*/
 

+ 4 - 0
TEAMModelOS/ClientApp/src/api/ability.js

@@ -119,6 +119,10 @@ export default {
 		return post('/school/area/find-vote-id', data)
 	},
 	
+	getAreaSurveyById(data){
+		return post('/school/area/find-survey-id', data)
+	},
+	
 	getAreaVotes(data){
 		return post('/school/area/find-all-vote', data)
 	},

+ 3 - 3
TEAMModelOS/ClientApp/src/api/jyzx.js

@@ -71,10 +71,10 @@ export default {
     getcurrents: function (data) {
         return post('/common/TrSurvey/find-summary-by-teacher', data)
     },
-    //提交问卷
+    /* //提交问卷
     submitquestionnaire: function (data) {
-        return post('/common/TrSurvey/record-in', data)
-    },
+        return post('/common/survey/answer', data)
+    }, */
     //提交评测
     submitExam: function (data) {
         return post('/common/ExamLite/record-in',data)

+ 8 - 4
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -3,8 +3,8 @@
         <!-- 头部菜单栏 -->
         <Header class="header">
             <div class="logo-wrap">
-                <!-- <img src="../assets/login/ies5_logo_2.svg" :class="isCollapsed ? 'collapsed-logo-width unit-logo':'collapsed-logo-width  unit-logo'" v-show="isShowLogo" /> -->
-                <BaseSelectArea></BaseSelectArea>
+                <img style="margin-left: 20px;" src="../assets/login/ies5_logo_2.svg" :class="isCollapsed ? 'collapsed-logo-width unit-logo':'collapsed-logo-width  unit-logo'" v-show="isShowLogo && !isShowAreaSelect" />
+                <BaseSelectArea @noArea="isShowAreaSelect = false" v-show="isShowAreaSelect"></BaseSelectArea>
             </div>
             <div class="school-wrap">
                 <BaseSelectSchool></BaseSelectSchool>
@@ -127,6 +127,7 @@ import jwtDecode from 'jwt-decode'
 export default {
     data() {
         return {
+			isShowAreaSelect:true,
             openNames: [],
             activeName: '',
             tipsOpt: {
@@ -343,7 +344,8 @@ export default {
                     role: 'admin',
                     permission: '',
                     subName: 'scTrain',
-                    isShow: this.srvAdr == 'China',
+                    isShow: true,
+                    // isShow: this.srvAdr == 'China',
                     child: [
                         {
                             icon: 'iconfont icon-policy',
@@ -582,7 +584,9 @@ export default {
                     role: 'teacher|admin',
                     permission: '',
                     subName: 'privTrain',
-                    isShow: process.env.NODE_ENV == 'development',
+                    // isShow: process.env.NODE_ENV == 'development',
+                    // isShow: this.srvAdr == 'China',
+                    isShow: true,
                     child: [
                         {
                             icon: 'iconfont icon-test',

+ 23 - 3
TEAMModelOS/ClientApp/src/common/BaseSelectArea.vue

@@ -31,29 +31,45 @@
 				curSchool: {
 					logo: ''
 				},
-				defaultLogo: '',
 				user: {
 					schools: []
 				},
 				joinSchools: [],
 				areaList:[],
-				curAreaIndex:0
+				curAreaIndex:0,
+				otherSch:'其它学校'
 			}
 		},
 		created() {
-			this.defaultLogo = require('@/assets/icon/default_school.png')
 			// 获取本地存储中的 用户信息
 			let user = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"));
 			let schoolProfile = localStorage.school_profile ? JSON.parse(decodeURIComponent(localStorage.school_profile,
 				"utf-8")) : undefined;
 			this.user.schools = user.schools
 			let joinSchools = user.schools && user.schools.length ? user.schools.filter(i => i.status === 'join') : null
+			console.log(joinSchools);
+			/* 如果没有加入的学校或者加入的学校都没有归属区 */
+			if(!joinSchools || joinSchools.every(i => !i.area)){
+				this.$emit('noArea')
+			}else{
+				joinSchools.forEach(i => {
+					if(!i.area){
+						i.area = {
+							name:this.otherSch
+						}
+					}
+				})
+			}
 			this.joinSchools = joinSchools
 			// 如果本地存储已经有保存学校信息 则刷新后会直接读取之前的学校信息
 			if (schoolProfile && joinSchools.length) {
 				this.curSchool = joinSchools.filter(i => i.schoolId === schoolProfile.school_base.id)[0]
 				this.$store.commit('setSchoolCode', this.curSchool.schoolId)
 				this.areaList = [...new Set(this.joinSchools.map(i => i.area).map(j => j.name))]
+				if(this.areaList.includes(this.otherSch)){
+					this.areaList = this.areaList.filter(i => i !== this.otherSch)
+					this.areaList.push(this.otherSch)
+				}
 				this.onAreaSelect(0)
 			} else if (joinSchools && joinSchools.length) {
 				// 拿到用户管理的schools 必须是已加入的学校
@@ -61,6 +77,10 @@
 					joinSchools[0]
 				this.$store.commit('setSchoolCode', this.curSchool.schoolId)
 				this.areaList = [...new Set(this.joinSchools.map(i => i.area).map(j => j.name))]
+				if(this.areaList.includes(this.otherSch)){
+					this.areaList = this.areaList.filter(i => i !== this.otherSch)
+					this.areaList.push(this.otherSch)
+				}
 				this.onAreaSelect(0)
 			} else {
 				// this.$Message.warning(this.$t('utils.noShoolTip'))

+ 14 - 0
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -48,6 +48,20 @@
 				"utf-8")) : undefined;
 			this.user.schools = user.schools
 			let joinSchools = user.schools && user.schools.length ? user.schools.filter(i => i.status === 'join') : null
+			
+			console.log(joinSchools);
+			/* 如果没有加入的学校或者加入的学校都没有归属区 */
+			if(!joinSchools || joinSchools.every(i => !i.area)){
+				console.log('object');
+			}else{
+				joinSchools.forEach(i => {
+					if(!i.area){
+						i.area = {
+							name:'其它学校'
+						}
+					}
+				})
+			}
 			this.joinSchools = joinSchools
 			// 如果本地存储已经有保存学校信息 则刷新后会直接读取之前的学校信息
 			if (schoolProfile && joinSchools.length) {

+ 13 - 3
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -30,10 +30,17 @@
                         <Icon type="md-power" class="drop-item-icon" />
                         {{$t('utils.logout')}}
                     </DropdownItem>
-                    <DropdownItem divided class="drop-item" disabled style="cursor: text;">
+                    <!-- <DropdownItem divided class="drop-item" disabled style="cursor: text;">
                         <Icon type="ios-information-circle-outline" class="drop-item-icon" />
                         V {{version}}
-                    </DropdownItem>
+                    </DropdownItem> -->
+					<DropdownItem divided class="drop-item" disabled style="cursor: text;">
+						<Icon type="logo-vimeo" class="drop-item-icon"/>
+						V {{version}}
+						<br>
+						<Icon type="ios-information-circle-outline" class="drop-item-icon"/>
+						能力点版本:{{ curStandard ? curStandard.replace('standard','') : '暂无' }}
+					</DropdownItem>
                 </DropdownMenu>
             </Dropdown>
         </div>
@@ -168,7 +175,10 @@ export default {
         },
         hasArea() {
             return this.$store.state.user.userProfile.areas.length > 0
-        }
+        },
+		curStandard(){
+			return this.$store.state.user.schoolProfile.school_base ? this.$store.state.user.schoolProfile.school_base.standard : ''
+		}
     },
 
 }

+ 21 - 15
TEAMModelOS/ClientApp/src/components/questionnaire/BaseQnForm.vue

@@ -232,7 +232,7 @@
 					code: this.$store.state.userInfo.schoolCode,
 					scope: 'school'
 				}).then(res => {
-					this.groupList = res.stuList
+					this.groupList = res.tchLists
 				})
 			},
 
@@ -438,22 +438,28 @@
 			 */
 			async doRender(item) {
 				console.log(item)
-				// if(item.id){
-				// 	this.classNameArr = item.classes.length ? await this.getClassNameByIds(item.classes) : await this.getClassNameByIds(item.stuLists)
-				// }
-				if (item.targetType === 'research') {
-					console.log(this.groupList);
-					let groupNameArr = []
-					item.tchLists.forEach(i => {
-						let findObj = this.groupList.find(j => j.id === i)
-						if (findObj) {
-							groupNameArr.push(findObj)
+				// 如果是区级投票
+				if(this.isAreaSurvey){
+					this.classNameArr = item.targets.map(i => {
+						return {
+							name:i
 						}
 					})
-					this.classNameArr = groupNameArr
-				} else {
-					this.classNameArr = item.classes.length ? await this.getClassNameByIds(item.classes) : item
-						.stuLists.length ? await this.getClassNameByIds(item.stuLists) : []
+				}else{
+					if (item.targetType === 'research') {
+						console.log(this.groupList);
+						let groupNameArr = []
+						item.tchLists.forEach(i => {
+							let findObj = this.groupList.find(j => j.id === i)
+							if (findObj) {
+								groupNameArr.push(findObj)
+							}
+						})
+						this.classNameArr = groupNameArr
+					} else {
+						this.classNameArr = item.classes.length ? await this.getClassNameByIds(item.classes) : item
+							.stuLists.length ? await this.getClassNameByIds(item.stuLists) : []
+					}
 				}
 				console.log(this.classNameArr);
 				this.classTargets = item.targetType === 'research' ? item.tchLists : this.getCurScope === 'school' ?

+ 47 - 21
TEAMModelOS/ClientApp/src/components/questionnaire/BaseQuestionnaire.vue

@@ -251,17 +251,22 @@
 						if (item.type === 'subjective') {
 							let result = []
 							for (let key in curItemRecord.other) {
-								result.push({
-									id: key,
-									name: this.students.filter(i => i.id === key)[0].name,
-									value: curItemRecord.other[key]
-								})
+								let curStudent = this.students.find(i => i.id === key)
+								if(curStudent){
+									result.push({
+										id: key,
+										name: curStudent.name,
+										value: curItemRecord.other[key]
+									})
+								}
 							}
 							item.result.details = result
 						} else {
 							for (let key in curItemRecord.opt) {
-								curItemRecord.opt[key] = curItemRecord.opt[key].map(id => this.students.filter(i => i
-									.id === id)[0].name)
+								let curStudent = this.students.find(i => i.id === key)
+								if(curStudent){
+									curItemRecord.opt[key] = curItemRecord.opt[key].map(id => curStudent.name)
+								}
 							}
 							item.result.details = curItemRecord.opt
 						}
@@ -282,13 +287,19 @@
 					let sasString = qnItem.scope === 'private' ? await this.$tools.getPrivateSas() : await this
 						.$tools.getSchoolSas()
 					let promiseArr = []
-					let indexJson = await this.getBlobJsonFile(qnItem.scope, qnItem.blob)
+					
+					// 如果是区级
+					if(qnItem.owner === 'area'){
+						blobHost = this.$store.state.user.osblob_uri
+						sasString = { sas : '?' + this.$store.state.user.osblob_sas }
+					}
+					
+					let indexJson = JSON.parse(await this.$tools.getFile(blobHost + qnItem.blob + sasString.sas))
 					if (indexJson.slides.length) {
 						for (let item of indexJson.slides) {
 							promiseArr.push(new Promise(async (r, j) => {
 								try {
-									let itemJson = JSON.parse(await this.$tools.getFile(
-										blobHost + item + sasString.sas))
+									let itemJson = JSON.parse(await this.$tools.getFile(blobHost + item + sasString.sas))
 									r(itemJson)
 								} catch (e) {
 									j(e)
@@ -351,20 +362,26 @@
 					let curItemRecord = result.question[index]
 					if (item.type === 'subjective') {
 						let result = []
+						console.log(this.students.map(i => i.id));
 						for (let key in curItemRecord.other) {
-							result.push({
-								id: key,
-								name: this.students.filter(i => i.id === key)[0].name,
-								value: curItemRecord.other[key]
-
-							})
+							let curStudent = this.students.find(i => i.id === key)
+							if(curStudent){
+								result.push({
+									id: key,
+									name: curStudent.name,
+									value: curItemRecord.other[key]
+								})
+							}
+							
 						}
 						item.result.details = result
 					} else {
 						console.log(this.students)
 						for (let key in curItemRecord.opt) {
-							curItemRecord.opt[key] = curItemRecord.opt[key].map(id => this.students.filter(i => i
-								.id === id)[0].name)
+							let curStudent = this.students.find(i => i.id === key)
+							if(curStudent){
+								curItemRecord.opt[key] = curItemRecord.opt[key].map(id => curStudent.name)
+							}
 						}
 						item.result.details = curItemRecord.opt
 					}
@@ -410,6 +427,9 @@
 					disabled: this.currentQn.progress !== 'pending',
 					ghostClass: "ghost"
 				};
+			},
+			isAreaSurvey(){
+				return this.$route.name === 'manageAreaQuestionnaire'
 			}
 		},
 		watch: {
@@ -419,9 +439,15 @@
 					if (newValue && newValue.id) {
 						if (newValue.progress !== 'pending') {
 							try {
-								let records = await this.getQnRecord(newValue)
-								let items = await this.getBlobItems(newValue)
-								this.makeItemResult(records, items)
+								console.log('BaseQuestionnaire',newValue);
+								if(this.isAreaSurvey){
+									let items = await this.getBlobItems(newValue)
+									this.items = items
+								}else{
+									let records = await this.getQnRecord(newValue)
+									let items = await this.getBlobItems(newValue)
+									this.makeItemResult(records, items)
+								}
 							} catch (e) {
 								console.log(e)
 								this.$Message.error(this.$t('survey.getFileFailTip'))

+ 19 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/jyzx.js

@@ -180,4 +180,23 @@ export default{
         message2: "存在未作答的题目!",
         message3: "已作答的问卷无法修改!",
     },
+    homePage: {
+        totalTime: '总学时',
+        online: "线上研修",
+        offline: "线下研修",
+        application: "应用考核",
+        classRecord: "课堂实录",
+        studyPoint: "已学能力点",
+        okPoint: "检测合格能力点",
+        achievements: "成果提交",
+        area: "区级研修",
+        areaQue: "区级问卷",
+        areaVote: "区级投票",
+        school: "校本研修",
+        schoolQue: "校本问卷",
+        schoolVote: "校本投票",
+        time: "学时",
+        remarks1: "总学时:线上研修 + 校本研修 + 应用考核 + 课堂实录",
+        remarks2: "注:各指标达到要求后,多余学时不再计入总学时",
+    }
 }

+ 19 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/jyzx.js

@@ -180,4 +180,23 @@ export default{
         message2: "存在未作答的题目!",
         message3: "已作答的问卷无法修改!",
     },
+    homePage: {
+        totalTime: '总学时',
+        online: "线上研修",
+        offline: "线下研修",
+        application: "应用考核",
+        classRecord: "课堂实录",
+        studyPoint: "已学能力点",
+        okPoint: "检测合格能力点",
+        achievements: "成果提交",
+        area: "区级研修",
+        areaQue: "区级问卷",
+        areaVote: "区级投票",
+        school: "校本研修",
+        schoolQue: "校本问卷",
+        schoolVote: "校本投票",
+        time: "学时",
+        remarks1: "总学时:线上研修 + 校本研修 + 应用考核 + 课堂实录",
+        remarks2: "注:各指标达到要求后,多余学时不再计入总学时",
+    }
 }

+ 19 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/jyzx.js

@@ -180,4 +180,23 @@ export default{
         message2: "存在未作答的題目!",
         message3: "已作答的問卷無法修改!",
     },
+    homePage: {
+        totalTime: '總學時',
+        online: "線上研修",
+        offline: "線下研修",
+        application: "應用考核",
+        classRecord: "課堂實錄",
+        studyPoint: "已學能力點",
+        okPoint: "檢測合格能力點",
+        achievements: "成果提交",
+        area: "區級研修",
+        areaQue: "區級問卷",
+        areaVote: "區級投票",
+        school: "校本研修",
+        schoolQue: "校本問卷",
+        schoolVote: "校本投票",
+        time: "學時",
+        remarks1: "總學時:線上研修 + 校本研修 + 應用考核 + 課堂實錄",
+        remarks2: "注:各指標達到要求後,多餘學時不再計入總學時",
+    }
 }

+ 3 - 0
TEAMModelOS/ClientApp/src/service/User.js

@@ -79,6 +79,9 @@ export class User {
           localStorage.removeItem('filterConditions')
           localStorage.removeItem('cacheSchoolFiles')
           localStorage.removeItem('cachePrivFiles')
+          localStorage.removeItem('platform')
+          sessionStorage.removeItem('areaName')
+          sessionStorage.removeItem('areaId')
           
           // 重置登录状态
           User.$access.reset();

+ 9 - 4
TEAMModelOS/ClientApp/src/view/abilityMgmt/Index.vue

@@ -1604,14 +1604,15 @@
 						this.$Message.warning(this.$t('syllabus.noPreview'))
 						break;
 					case 'doc':
+					    let userProfile2 = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"))
 						let copyLink = JSON.parse(JSON.stringify(item.link))
-						let docSas = '?' + this.$store.state.user.osblob_sas
+						let docSas = '?' + userProfile2.osblob_sas
 						// if (item.code !== this.curTeammodelId) {
 						// 	docSas = await this.$evTools.getBlobPrivateSas(item.code)
 						// } else {
 						// 	docSas = sasObj.sas
 						// }
-						let fullLink = this.$store.state.user.osblob_uri  + item.link + docSas
+						let fullLink = userProfile2.osblob_uri  + item.link + docSas
 						console.log(fullLink)
 						if (this.getSuffix(item.title) === 'pdf') {
 							this.openPdf(fullLink, item.title)
@@ -1622,15 +1623,16 @@
 						}
 						break;
 					default:
+						let userProfile = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"))
 						let fileTmdId = item.code.replace('Item-', '')
-						let sas = '?' + this.$store.state.user.osblob_sas
+						let sas = '?' + userProfile.osblob_sas
 						// if (fileTmdId !== this.curTeammodelId) {
 						// 	sas = '?' + this.$store.state.user.osblob_sas
 						// } else {
 						// 	sas = sasObj.sas
 						// }
 						this.previewFile = JSON.parse(JSON.stringify(item))
-						this.previewFile.link = this.$store.state.user.osblob_uri  + item.link + sas
+						this.previewFile.link = userProfile.osblob_uri  + item.link + sas
 						this.previewStatus = true
 						break;
 				}
@@ -1879,6 +1881,9 @@
 			inSchoolAbility(){
 				return this.$route.name === 'abilityMgmt'
 			},
+			isAreaAbility(){
+				return this.$route.name === 'areaAbilityMgmt'
+			}
 		},
 		watch: {
 			volumeList: {

+ 2 - 2
TEAMModelOS/ClientApp/src/view/areaMgmt/SchoolDetail.vue

@@ -11,10 +11,10 @@
                         <span class="info-label">教师人数:</span>
                         <span class="info-value">{{schoolInfo.count}}人</span>
                     </p>
-                    <p class="school-info-item">
+                    <!-- <p class="school-info-item">
                         <span class="info-label">信息化负责人:</span>
                         <span class="info-value">罗老师</span>
-                    </p>
+                    </p> -->
                 </div>
                 <span class="return-list" @click="returnList">
                     <Icon type="md-arrow-back" size="16" />

+ 28 - 52
TEAMModelOS/ClientApp/src/view/areatrain/Create.vue

@@ -81,9 +81,9 @@
                         <Checkbox label="hw" class="check-item">
                             <span>布置作业</span>
                         </Checkbox>
-                        <Checkbox label="survey" class="check-item">
+                        <!-- <Checkbox label="survey" class="check-item">
                             <span>问卷反馈</span>
-                        </Checkbox>
+                        </Checkbox> -->
                         <Checkbox label="exam" class="check-item">
                             <span>评测反馈</span>
                         </Checkbox>
@@ -452,7 +452,7 @@ export default {
     },
     methods: {
         treeChange(data) {
-            console.log('选择数据', data)
+            this.handleTarget(data)
         },
         getTargets() {
             this.$api.ability.findAreaGroup({
@@ -477,7 +477,7 @@ export default {
                             })
                             if (!i.children.length) {
                                 i.children.push({
-                                    id: 'default-all',
+                                    id: 'default',
                                     name: '所有老师(未分组)'
                                 })
                             }
@@ -558,6 +558,7 @@ export default {
             setTimeout(() => {
                 this.activeQuIndex = 0
             }, 0)
+            this.addQuStatus = false
         },
         toAddQu() {
             this.addQuStatus = true
@@ -577,25 +578,6 @@ export default {
             let d = new Date(date)
             this.hwTime = d.getTime()
         },
-        //转分组模式数据结构
-        handelGroup() {
-            this.teachers.forEach(item => {
-                item.groupName = item.groupName || '默认组别'
-            })
-            let groupRes = this.$jsFn.groupBy(this.teachers, 'groupName')
-            this.groupData.length = 0
-            for (let index in groupRes) {
-                this.groupData.push({
-                    groupName: groupRes[index][0].groupName || '默认组别',
-                    groupId: groupRes[index][0].groupId,
-                    teachers: groupRes[index]
-                })
-            }
-            this.groupData.sort((a, b) => {
-                return parseInt(a.groupId) - parseInt(b.groupId)
-            })
-            console.log('处理分组数据', this.groupData, groupRes)
-        },
         toTrainMgt() {
             this.$router.push({
                 name: 'TrainAreaMgt'
@@ -619,7 +601,7 @@ export default {
                 // hwDesc: this.trainInfo.hwDesc,
                 // hwTime: this.hwTime
             }
-            let examInfo, surveyInfo
+            let examInfo, surveyInfo, workInfo
             if (this.trainInfo.setting.includes('survey')) {
                 surveyInfo = {
                     name: this.trainInfo.quName,
@@ -637,6 +619,16 @@ export default {
                     sType: 'train'
                 }
             }
+
+            if (this.trainInfo.setting.includes('hw')) {
+                workInfo = {
+                    name: this.trainInfo.hwName,
+                    description: this.trainInfo.hwDesc,
+                    creatorId: this.$store.state.userInfo.TEAMModelId,
+                    endTime: this.hwTime,
+                    sType: 'train'
+                }
+            }
             //处理发布对象
             let para = this.handleTarget(this.baseInfo.target)
             let params = {
@@ -644,20 +636,14 @@ export default {
                 para: para,
                 study: studyInfo,
                 exam: examInfo,
-                survey: surveyInfo
+                survey: surveyInfo,
+                work: workInfo
             }
 
-            console.log('数据', this.baseInfo, params)
             this.$api.train.saveAreaTrain(params).then(
                 res => {
                     this.$Message.success('发布成功')
                     this.published = true
-                    // TODO 保存blob
-                    // if (res.ids && res.ids.length) {
-                    //     res.ids.forEach(item => {
-                    //         let schoolInfo = this.csOptions.find(cs => {
-                    //             return cs.id == item.school
-                    //         })
                     let examItems = this.trainInfo.examItems.map(qItem => {
                         return {
                             id: qItem.id,
@@ -675,8 +661,6 @@ export default {
                             option: qItem.optionsContent
                         }
                     })
-
-                    //         if (schoolInfo) {
                     // 现在不用每个学校上传资源,直接传到区级容器
                     console.log('返回数据', res)
                     let uri = this.$store.state.user.osblob_uri
@@ -687,25 +671,13 @@ export default {
                         sas: '?' + sas
                     }
                     if (this.trainInfo.setting.includes('exam')) {
-                        // examInfo.id = item.examId
                         examInfo.id = res.acId
-                        // examInfo.school = item.school
-                        // this.doUploadBlob(examInfo, examItems, schoolInfo)
                         this.doUploadBlob(examInfo, examItems, areaBlob, 'exam')
                     }
                     if (this.trainInfo.setting.includes('survey')) {
-                        // surveyInfo.id = item.surveyId
                         surveyInfo.id = res.acId
-                        // surveyInfo.school = item.school
-                        // this.doUploadBlob(surveyInfo, surveyItems, schoolInfo)
                         this.doUploadBlob(surveyInfo, surveyItems, areaBlob, 'survey')
                     }
-                    //         } else {
-                    //             this.$Message.error('未找到对应学校的授权')
-                    //         }
-                    //     })
-                    // }
-
                 },
                 err => {
                     this.$Message.error('发布失败')
@@ -716,21 +688,25 @@ export default {
         handleTarget(treeData) {
             let d = []
             treeData.forEach(item => {
-                let s = d.find(i => {
-                    return i.sId == item[0]
-                })
+                let s = d.find(i => i.sId == item[0])
                 if (s) {
-                    s.gName.push(item[1])
+                    s.gId.push(item[1])
                 } else {
                     d.push({
                         sId: item[0],
-                        gName: [item[1]]
+                        gId: [item[1]]
                     })
                 }
             })
             d.forEach(item => {
-                if (item.gName.includes('default-all')) {
+                let sInfo = this.csOptions.find(scInfo => scInfo.id == item.sId)
+                if (sInfo) {
+                    item.sName = sInfo.name
                     item.gName = []
+                    item.gId.forEach(gid => {
+                        let groupInfo = sInfo.children.find(gItem => gItem.id == gid)
+                        item.gName.push(groupInfo.name)
+                    })
                 }
             })
             return d

+ 106 - 60
TEAMModelOS/ClientApp/src/view/areatrain/TrainDetail.vue

@@ -8,10 +8,10 @@
                         <span style="margin-left:10px">返回研修总览</span>
                     </div>
                     <div class="train-top-info">
-                        <div class="img-box" :style="{backgroundImage: `url(${trainInfo.detail.img || defImg})`}"></div>
+                        <div class="img-box" :style="{backgroundImage: `url(${trainInfo.img || defImg})`}"></div>
                         <div class="infos">
                             <p class="title">
-                                <span>{{trainInfo.detail.topic}}</span>
+                                <span>{{trainInfo.topic}}</span>
                                 <span class="hour">{{trainInfo.hour}}学时</span>
                             </p>
                             <div class="info-item">
@@ -19,7 +19,7 @@
                                     主讲老师:
                                 </span>
                                 <span>
-                                    {{trainInfo.detail.presenter}}
+                                    {{trainInfo.presenter}}
                                 </span>
                             </div>
                             <div class="info-item">
@@ -27,7 +27,7 @@
                                     培训主题:
                                 </span>
                                 <span>
-                                    {{trainInfo.detail.topic}}
+                                    {{trainInfo.topic}}
                                 </span>
                             </div>
                             <div class="info-item">
@@ -35,7 +35,7 @@
                                     培训地点:
                                 </span>
                                 <span>
-                                    {{trainInfo.detail.address}}
+                                    {{trainInfo.address}}
                                 </span>
                             </div>
                             <div class="info-item">
@@ -43,7 +43,7 @@
                                     培训时间:
                                 </span>
                                 <span>
-                                    <span>{{dateFormat(trainInfo.detail.startTime) + ' 至 ' + dateFormat(trainInfo.detail.endTime)}}</span>
+                                    <span>{{dateFormat(trainInfo.startTime) + ' 至 ' + dateFormat(trainInfo.endTime)}}</span>
                                     <!-- {{trainInfo.time.join(' 至 ')}} -->
                                 </span>
                             </div>
@@ -109,7 +109,7 @@
                                 </Table>
                             </TabPane>
                             <TabPane label="问卷反馈" name="name3" class="tab-pane-wrap" v-if="trainInfo.settings.includes('survey')" style="height:600px">
-                                <Table :columns="surveyColumns" :data="surveyTableData" class="table-box" :height="580">
+                                <Table :columns="surveyColumns" :data="tableData" class="table-box" :height="580">
                                     <template slot-scope="{ row }" slot="surveytTime">
                                         <span>{{dateFormat(row.time)}}</span>
                                     </template>
@@ -121,13 +121,13 @@
                                 </Table>
                             </TabPane>
                             <TabPane label="评测反馈" name="name4" class="tab-pane-wrap" v-if="trainInfo.settings.includes('exam')" style="height:600px">
-                                <Table :columns="examColumns" :data="examTableData" class="table-box" :height="580">
+                                <Table :columns="examColumns" :data="tableData" class="table-box" :height="580">
                                     <template slot-scope="{ row }" slot="examTime">
-                                        <span>{{dateFormat(row.time)}}</span>
+                                        <span>{{dateFormat(row.examTime)}}</span>
                                     </template>
                                     <template slot-scope="{ row,index }" slot="action">
-                                        <Button type="primary" size="small" :disabled="!row.time" @click="toViewExam(index)">
-                                            {{row.time ? '查看详情' : '暂未作答'}}
+                                        <Button type="primary" size="small" :disabled="!row.examTime" @click="toViewExam(index)">
+                                            {{row.examTime ? '查看详情' : '暂未作答'}}
                                         </Button>
                                     </template>
                                 </Table>
@@ -361,7 +361,7 @@
                 <span class="tea-info-label">作业附件:</span>
                 <span>{{getFileName(tableData[viewIndex].hw)}}</span>
             </p>
-            
+
             <div v-if="tableData[viewIndex]">
                 <video v-if="tableData[viewIndex].fileType == 'video'" id="previewVideo" :src="tableData[viewIndex].url" width="870" controls="controls" style="max-height: 800px;">
                     {{$t('teachContent.tips8')}}
@@ -382,10 +382,10 @@
             </div>
         </Modal>
         <Modal v-model="surveyStatus" title="作答详情" width="800">
-            <SurveyDetail v-if="surveyInfo" :survey="surveyInfo" :answer="surveyTableData[surveyIndex].answer" :schoolInfo="schoolInfo"></SurveyDetail>
+            <SurveyDetail v-if="surveyInfo && tableData[surveyIndex]" :survey="surveyInfo" :answer="tableData[surveyIndex].surveyAnswer" :schoolInfo="schoolInfo"></SurveyDetail>
         </Modal>
         <Modal v-model="examStatus" title="作答详情" width="800">
-            <SurveyDetail v-if="examInfo && examTableData[examIndex]" :survey="examInfo" :answer="examTableData[examIndex].answer" :schoolInfo="schoolInfo"></SurveyDetail>
+            <SurveyDetail v-if="examInfo && tableData[examIndex]" :survey="examInfo" :answer="tableData[examIndex].examAnswer || []" :schoolInfo="schoolInfo"></SurveyDetail>
         </Modal>
     </div>
 </template>
@@ -402,7 +402,9 @@ export default {
             curSchool: '',
             schoolList: [],
             trainList: [],
+            allTeacherList: [],
             examAllData: [],
+            workAllData: [],
             surveyAllData: [],
             hwAndSignData: [],
             examStatus: false,
@@ -423,7 +425,6 @@ export default {
             defImg: 'https://www.habook.com.cn/data/editor/images/img/20210429%2001/001.png',
             tabName: 'name',
             trainInfo: {
-                detail: {},
                 settings: []
             },
             columns: [
@@ -546,10 +547,10 @@ export default {
                 unupload: 0,
                 rate: 0
             }
-            if (this.hwAndSignData) {
-                this.hwAndSignData.forEach(item => {
+            if (this.workAllData) {
+                this.workAllData.forEach(item => {
                     data.all += item.count
-                    data.uploaded += item.hwCount
+                    data.uploaded += item.ansCount
                 })
                 data.unupload = data.all - data.uploaded
                 data.rate = (data.uploaded * 100 / data.all).toFixed(1)
@@ -619,7 +620,7 @@ export default {
                 content: '删除区级活动后,相关学校将无法参与此活动,确认删除活动吗?',
                 onOk: () => {
                     let params = {
-                        id: this.trainList[0].acId,
+                        id: this.trainList[0].pId,
                         areaId: this.areaId,
                         pk: 'Study'
                     }
@@ -682,7 +683,7 @@ export default {
             })
             if (tInfo) {
                 let params = {
-                    id: tInfo.detail.surveyId,
+                    id: tInfo.surveyId,
                     code: tInfo.school
                 }
                 this.$api.ability.getSurveySummary(params).then(
@@ -707,7 +708,6 @@ export default {
                             this.tableData = []
                             this.tableData = data
                         }
-
                     },
                     err => {
 
@@ -721,29 +721,70 @@ export default {
             })
             if (tInfo) {
                 let params = {
-                    id: tInfo.detail.examId,
+                    id: tInfo.examId,
                     code: tInfo.school
                 }
                 this.$api.ability.getExamSummary(params).then(
                     res => {
-                        if (res.trExams && res.trExams[0]) {
-                            res.trExams[0].teachers.forEach(item => {
-                                item.answer = item.answer || []
-                            })
-                            this.examInfo = res.trExams[0]
-                            this.examTableData = this.examInfo.teachers
-                            this.tableData.forEach(item => {
-                                let t = this.examTableData.find(s => {
-                                    return item.id == s.id
+                        if (res.examLite) {
+                            // let schoolTeacher = this.allTeacherList.find(item => { item.school == this.curSchool })
+                            if (this.tableData) {
+                                console.log('表格数据', this.tableData)
+                                res.examLite.teachers.forEach(item => {
+                                    let curT = this.tableData.find(t => {
+                                        return t.id == item.id
+                                    })
+                                    console.log('123', curT)
+                                    if (curT) {
+                                        curT.examTime = item.time
+                                        curT.examAnswer = item.answer
+                                    }
                                 })
-                                if (t) {
-                                    item.examTime = t.time
-                                    item.examAnswer = t.answer
-                                }
-                            })
-                            let data = JSON.parse(JSON.stringify(this.tableData))
-                            this.tableData = []
-                            this.tableData = data
+                                this.examInfo = res.examLite
+                                let data = JSON.parse(JSON.stringify(this.tableData))
+                                this.tableData = []
+                                this.tableData = data
+                            }
+                        }
+                    },
+                    err => {
+
+                    }
+                )
+            }
+        },
+        getWorkInfo() {
+            let tInfo = this.trainList.find(item => {
+                return item.school == this.curSchool
+            })
+            if (tInfo) {
+                let params = {
+                    id: tInfo.workId,
+                    code: tInfo.school
+                }
+                this.$api.ability.getWorkSummary(params).then(
+                    async res => {
+                        let sasData = await this.$tools.getSchoolSas()
+                        if (res.works && res.works.length) {
+                            if (this.tableData) {
+                                res.works[0].teachers.forEach(item => {
+                                    let curT = this.tableData.find(t => {
+                                        return t.id == item.id
+                                    })
+                                    if (curT) {
+                                        let info = this.getExAndType(item.hw)
+                                        curT.fileType = info.type
+                                        curT.extension = info.ex
+                                        curT.hwTime = item.hwTime
+                                        curT.hw = item.hw
+                                        curT.url = `${sasData.url}/${sasData.name}${item.hw}${sasData.sas}`
+                                    }
+                                })
+                                this.workInfo = res.works[0]
+                                let data = JSON.parse(JSON.stringify(this.tableData))
+                                this.tableData = []
+                                this.tableData = data
+                            }
                         }
                     },
                     err => {
@@ -784,10 +825,10 @@ export default {
             let link = window.location.origin + '/phonesign'
             let id = this.trainInfo.id
             let school = this.$store.state.userInfo.schoolCode
-            let topic = this.trainInfo.detail.topic
-            let address = this.trainInfo.detail.address
-            let presenter = this.trainInfo.detail.presenter
-            let time = `${this.dateFormat(this.trainInfo.detail.startTime)} 至 ${this.dateFormat(this.trainInfo.detail.endTime)}`
+            let topic = this.trainInfo.topic
+            let address = this.trainInfo.address
+            let presenter = this.trainInfo.presenter
+            let time = `${this.dateFormat(this.trainInfo.startTime)} 至 ${this.dateFormat(this.trainInfo.endTime)}`
             let url = `${link}?isOpen=${this.isOpen}&id=${id}&school=${school}&topic=${topic}&address=${address}&presenter=${presenter}&time=${time}&random=${random}`
             //这里需要根据站点动态拼接域名
             let addr = this.$store.state.config.srvAdr
@@ -873,21 +914,17 @@ export default {
             let tInfo = this.trainList.find(item => {
                 return item.school == this.curSchool
             })
-            console.log('是什么', tInfo)
-            if (tInfo) {
-                console.log('当前学校活动数据', tInfo)
-                this.tableData = []
+            let teacherInfo = this.allTeacherList.find(item => {
+                return item.school == this.curSchool
+            })
+            if (tInfo && teacherInfo) {
+                this.tableData = this._.cloneDeep(teacherInfo.teachers)
                 tInfo.teachers.forEach(item => {
-                    if (item.hw) {
-                        let info = this.getExAndType(item.hw)
-                        item.fileType = info.type
-                        item.extension = info.ex
-                        console.log('学校信息',this.schoolInfo)
-                        if (this.schoolInfo.uri) {
-                            item.url = `${this.schoolInfo.uri}${item.hw}?${this.schoolInfo.sas}`
-                        }
+                    let curTea = this.tableData.find(tea => { return tea.id == item.id })
+                    if (curTea) {
+                        item.name = curTea.name
+                        Object.assign(curTea, item)
                     }
-                    this.tableData.push(item)
                 })
                 if (this.trainInfo.settings.includes('survey')) {
                     this.getSurveyInfo()
@@ -895,6 +932,9 @@ export default {
                 if (this.trainInfo.settings.includes('exam')) {
                     this.getExamInfo()
                 }
+                if (this.trainInfo.settings.includes('hw')) {
+                    this.getWorkInfo()
+                }
             }
 
         },
@@ -907,8 +947,14 @@ export default {
                 this.$api.train.findAreaAllTrain(params).then(
                     res => {
                         if (res && res.studies && res.studies.length) {
-                            this.trainInfo = res.studies[0]
-                            this.trainList = res.studies
+                            this.trainList = res.studies.map(item => { return item.stu })
+                            this.allTeacherList = res.studies.map(item => {
+                                return {
+                                    school: item.stu.school,
+                                    teachers: item.teac
+                                }
+                            })
+                            this.trainInfo = this.trainList[0]
                             if (this.trainInfo.settings.includes('sign')) {
                                 this.columns.push({
                                     title: '签到时间',
@@ -949,11 +995,12 @@ export default {
                                 align: 'center'
                             })
 
-                            let schoolIds = res.studies.map(item => {
+                            let schoolIds = this.trainList.map(item => {
                                 return item.school
                             })
 
                             this.examAllData = res.exam
+                            this.workAllData = res.work
                             this.surveyAllData = res.survey
                             this.hwAndSignData = res.info
                             this.getSchoolList(schoolIds)
@@ -966,7 +1013,6 @@ export default {
             }
         },
         getSchoolList(ids) {
-            console.log(ids)
             this.$api.ability.findAreaGroup({
                 id: this.areaId
             }).then(

+ 1 - 0
TEAMModelOS/ClientApp/src/view/jyzx/DoSurvey.vue

@@ -98,6 +98,7 @@ export default {
         // 获取blob里的试题数据
         getBlobItems(qnItem) {
             return new Promise(async (resolve, reject) => {
+				console.log(qnItem);
                 let blobHost = JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
                 // 根据试卷的Blob地址 去读取JSON文件
                 let sasString = await this.$tools.getSchoolSas()

+ 21 - 22
TEAMModelOS/ClientApp/src/view/jyzx/HomePage.vue

@@ -5,18 +5,17 @@
                 <div class="home-score">
                     <div class="score-total box-border">
                         <p>
-                            <span class="total-font">总学时:</span>
+                            <span class="total-font">{{ $t("jyzx.homePage.totalTime") }}:</span>
                             <b :class="['point-num', totalTime == 50 ? 'ok-time' : 'study-time']">{{ totalTime }}</b>
-                            /50(学时)
+                            /50({{ $t("jyzx.homePage.time") }})
                             <Tooltip max-width="200">
                                 <Icon type="ios-alert" size="15" />
                                 <div slot="content">
                                     <div>
-                                        总学时:线上研修 + 校本研修 +
-                                        应用考核 + 课堂实录
+                                        {{ $t("jyzx.homePage.remarks1") }}
                                     </div>
                                     <div>
-                                        注:各指标达到要求后,多余学时不再计入总学时
+                                        {{ $t("jyzx.homePage.remarks2") }}
                                     </div>
                                 </div>
                             </Tooltip>
@@ -64,10 +63,10 @@
                         <ul>
                             <li>
                                 <p class="act-font">
-                                    线上研修
+                                    {{ $t("jyzx.homePage.online") }}
                                     <b :class="['point-num', onlineTime == 20 ? 'ok-time' : 'study-time']">{{ onlineTime }}</b>
                                     /20
-                                    <span class="timeNum">(学时)</span>
+                                    <span class="timeNum">({{ $t("jyzx.homePage.time") }})</span>
                                 </p>
                                 <i-circle :percent="onlinePer" :stroke-color="onlinePer == 100 ? '#19BE6B' : ['#2D8CF0','#19BE6B']" :stroke-width="10" :size="90">
                                     <span style="font-size: 17px">{{ onlinePer }}%</span>
@@ -75,10 +74,10 @@
                             </li>
                             <li>
                                 <p class="act-font">
-                                    线下研修
+                                    {{ $t("jyzx.homePage.offline") }}
                                     <b :class="['point-num', classTime == 10 ? 'ok-time' : 'study-time']">{{ classTime }}</b>
                                     /10
-                                    <span class="timeNum">(学时)</span>
+                                    <span class="timeNum">({{ $t("jyzx.homePage.time") }})</span>
                                 </p>
                                 <i-circle :percent="classPer" :stroke-color="classPer == 100 ? '#19BE6B' : ['#2D8CF0','#19BE6B']" :stroke-width="10" :size="90">
                                     <span style="font-size: 17px">{{ classPer }}%</span>
@@ -88,10 +87,10 @@
                         <ul>
                             <li>
                                 <p class="act-font">
-                                    应用考核
+                                    {{ $t("jyzx.homePage.application") }}
                                     <b :class="['point-num', applicaTime == 15 ? 'ok-time' : 'study-time']">{{ applicaTime }}</b>
                                     /15
-                                    <span class="timeNum">(学时)</span>
+                                    <span class="timeNum">({{ $t("jyzx.homePage.time") }})</span>
                                 </p>
                                 <i-circle :percent="applicaPer" :stroke-color="applicaPer == 100 ? '#19BE6B' : ['#2D8CF0','#19BE6B']" :stroke-width="10" :size="90">
                                     <span style="font-size: 17px">{{ applicaPer }}%</span>
@@ -99,10 +98,10 @@
                             </li>
                             <li>
                                 <p class="act-font">
-                                    课堂实录
+                                    {{ $t("jyzx.homePage.classRecord") }}
                                     <b :class="['point-num', discussTime == 5 ? 'ok-time' : 'study-time']">{{ discussTime }}</b>
                                     /5
-                                    <span class="timeNum">(学时)</span>
+                                    <span class="timeNum">({{ $t("jyzx.homePage.time") }})</span>
                                 </p>
                                 <i-circle :percent="discussPer" :stroke-color="discussPer == 100 ? '#19BE6B' : ['#2D8CF0','#19BE6B']" :stroke-width="10" :size="90">
                                     <span style="font-size: 17px">{{ discussPer }}%</span>
@@ -116,21 +115,21 @@
                         <li class="act-border ability-style">
                             <img src="@/assets/image/study_point.png" alt="">
                             <div>
-                                <p class="act-font">已学能力点</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.studyPoint") }}</p>
                                 <p><b class="point-num">{{ allAbilityCount }}</b> / 30</p>
                             </div>
                         </li>
                         <li class="act-border ability-style">
                             <img src="@/assets/image/ok_point.png" alt="">
                             <div>
-                                <p class="act-font">检测合格能力点</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.okPoint") }}</p>
                                 <p><b class="point-num">{{ allAbilityOkNum }}</b> / {{ allAbilityOkTotal }}</p>
                             </div>
                         </li>
                         <li class="act-border ability-style">
                             <img src="@/assets/image/jyzx_app.png" alt="">
                             <div>
-                                <p class="act-font">成果提交</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.achievements") }}</p>
                                 <p><b class="point-num">{{ appNum }}</b> / {{ appTotal }}</p>
                             </div>
                         </li>
@@ -139,21 +138,21 @@
                         <li class="act-border ability-style">
                             <img src="@/assets/image/area_study.png" alt="">
                             <div>
-                                <p class="act-font">区级研修</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.area") }}</p>
                                 <p><b class="point-num">{{ areaNum }}</b> / {{ areaTotal }}</p>
                             </div>
                         </li>
                         <li class="act-border ability-style">
                             <img src="@/assets/image/area_survey.png" alt="">
                             <div>
-                                <p class="act-font">区级问卷</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.areaQue") }}</p>
                                 <p><b class="point-num">{{ areaSurveyNum }}</b> / {{ areaSurveyTotal }}</p>
                             </div>
                         </li>
                         <li class="act-border ability-style">
                             <img src="@/assets/image/area_vote.png" alt="">
                             <div>
-                                <p class="act-font">区级投票</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.areaVote") }}</p>
                                 <p><b class="point-num">{{ areaVoteNum }}</b> / {{ areaVoteTotal }}</p>
                             </div>
                         </li>
@@ -169,21 +168,21 @@
                         <li class="act-border ability-style">
                             <img src="@/assets/image/school_study.png" alt="">
                             <div>
-                                <p class="act-font">校本研修</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.school") }}</p>
                                 <p><b class="point-num">{{ schoolNum }}</b> / {{ schoolTotal }}</p>
                             </div>
                         </li>
                         <li class="act-border ability-style">
                             <img src="@/assets/image/school_survey.png" alt="">
                             <div>
-                                <p class="act-font">校本问卷</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.schoolQue") }}</p>
                                 <p><b class="point-num">{{ surveyNum }}</b> / {{ surveyTotal }}</p>
                             </div>
                         </li>
                         <li class="act-border ability-style">
                             <img src="@/assets/image/school_vote.png" alt="">
                             <div>
-                                <p class="act-font">校本投票</p>
+                                <p class="act-font">{{ $t("jyzx.homePage.schoolVote") }}</p>
                                 <p><b class="point-num">{{ voteNum }}</b> / {{ voteTotal }}</p>
                             </div>
                         </li>

+ 12 - 3
TEAMModelOS/ClientApp/src/view/jyzx/Question.vue

@@ -196,13 +196,17 @@ export default {
                 let fullIndexJsonPath = blobHost + '/' + cntr + qnItem.blob + sasString
                 // 根据试卷的Blob地址 去读取JSON文件
                 let promiseArr = []
-                let indexJson = await this.getBlobJsonFile(fullIndexJsonPath)
+				// 如果是区级
+				if(qnItem.owner === 'area'){
+					blobHost = this.$store.state.user.osblob_uri
+					sasString = { sas : '?' + this.$store.state.user.osblob_sas }
+				}
+                let indexJson = JSON.parse(await this.$tools.getFile(blobHost + qnItem.blob + sasString.sas))
                 if(indexJson.slides.length) {
                     for (let item of indexJson.slides) {
                         promiseArr.push(new Promise(async (r, j) => {
                             try {
-                                let itemFullPath = blobHost + '/' +  cntr + item + sasString
-                                let itemJson = JSON.parse(await this.$tools.getFile(itemFullPath))
+                                let itemJson = JSON.parse(await this.$tools.getFile(blobHost + item + sasString.sas))
                                 r(itemJson)
                             } catch (e) {
                                 j(e)
@@ -291,6 +295,11 @@ export default {
                             }
                         })
                         this.listShow.splice(listIndex, 1)
+                        if(listIndex == this.listShow.length) {
+                            listIndex = 0
+                        }
+                        console.log(listIndex);
+                        this.sentSelectedEventTitle(this.listShow[listIndex], listIndex)
                     }
                 }
             })

+ 10 - 5
TEAMModelOS/ClientApp/src/view/jyzx/Vote.vue

@@ -39,12 +39,13 @@
                             </p>
                         </div>
                         <!-- <div class="list-new-type">
-                            <div class="list-new-unDone isAllowRetry" v-show="!item.time">
-                                <span>{{ $t("studentWeb.public.going") }}</span>
-                            </div>
-                            <div class="list-new-unDone" v-show="item.time">
+                            <div class="list-new-unDone" v-if="item.progress == 'finish'">
                                 <span class="isOvertime">{{ $t("studentWeb.public.finish") }}</span>
                             </div>
+                            <div class="list-new-unDone isAllowRetry" v-else>
+                                <span>{{ $t("studentWeb.public.going") }}</span>
+                            </div>
+                            
                         </div> -->
                     </div>
                 </div>
@@ -193,7 +194,7 @@ export default {
                     this.haveVoteNum = this.voteInfo.voteNum
                     if (res.vote.progress == "finish") {
                         // 投票结束,获取Blob来展示投票结果
-                        this.getVoteRes()
+                        // this.getVoteRes()
                         this.isVote = false
                     }
                     this.getVoteRecord()
@@ -387,6 +388,10 @@ export default {
                             }
                         })
                         this.listShow.splice(listIndex, 1)
+                        if(listIndex == this.listShow.length) {
+                            listIndex = 0
+                        }
+                        this.sentSelectedEventTitle(this.listShow[listIndex], listIndex)
                     }
                 }
             }).finally(()=>{

+ 2 - 0
TEAMModelOS/ClientApp/src/view/jyzx/offline.less

@@ -226,6 +226,8 @@
 			padding: 3px 5px;
 			border-radius: 8px;
 			margin-right: 10px;
+			display: inline-block;
+    		margin-bottom: 5px;
 		}
 	}
 

+ 46 - 22
TEAMModelOS/ClientApp/src/view/jyzx/offline.vue

@@ -50,9 +50,9 @@
                                             {{ resource.endTime }}
                                         </span>
                                     </div>
-                                    <div class="site">
+                                    <div class="site" v-if="targets.length">
                                         <span class="info-label">{{ $t('jyzx.offline.target') }}:</span>
-                                        <span v-for="(item, index) in resource.targets" :key="index" style="margin-right: 10px">{{ item }}</span>
+                                        <span v-for="(item, index) in targets" :key="index" style="margin-right: 10px">{{ item }}</span>
                                     </div>
                                 </div>
                                 <div class="img-box" :style="{backgroundImage: `url(${resource.img || defImg})`}"></div>
@@ -216,6 +216,7 @@ export default {
             workInfo: undefined, //作业信息
             allteach:[],//所有老师
             ansShow: false, //是否合格:2:不合格  1:合格
+            targets: [], //学习对象
         }
     },
     created() {
@@ -242,12 +243,12 @@ export default {
         saveSurvey() {
             if(this.myAnswer.length && this.myAnswer.length == this.itemCount && !this.myAnswer.includes(undefined)) {
                 let params = {
-                    id: this.surveyInfo.id,
-                    code: this.$store.state.userInfo.schoolCode,
-                    tId: this.$store.state.userInfo.TEAMModelId,
-                    ans: this.myAnswer.map(i => Array.isArray(i) ? i : [i])
+                    "userid": this.$store.state.userInfo.TEAMModelId,
+                    "code": this.surveyInfo.code,
+                    "id": this.surveyInfo.id,
+                    record: this.myAnswer.map(i => Array.isArray(i) ? i : [i])
                 }
-                this.$api.jyzx.submitquestionnaire(params).then(res => {
+                this.$api.jyzx.answerSurvey(params).then(res => {
                     if(res.code == 200) {
                         this.isSurvey = true
                         this.$Message.success(this.$t("jyzx.offline.success1"))
@@ -340,6 +341,7 @@ export default {
         },
         // 查询活动的信息
         getApiAct() {
+            this.targets.length = 0
             this.resource={}
             this.homeWork = ""
             let req = {
@@ -358,6 +360,8 @@ export default {
                     })
                 } else if(res.status == 200) {
                     if (res.study) {
+                        this.getTarget(res.study.tchLists)
+
                         res.study.startTime = this.dateFormat(
                             res.study.startTime
                         )
@@ -415,6 +419,9 @@ export default {
                     if(res.status == 200) {
                         this.$Message.success(this.$t("studentWeb.vote.delSuccess"))
                         this.activity.splice(this.activeIndex, 1)
+                        if(this.activeIndex == this.activity.length) {
+                            this.activeIndex = 0
+                        }
                         this.getApiAct()
                     }
                 }
@@ -451,29 +458,41 @@ export default {
             detailsDatas.teachers = teachnameArr
             this.resource = detailsDatas
         },
+        getTarget(targets) {
+            let params = {
+                school_code: this.$store.state.userInfo.schoolCode,
+                ids: targets
+            }
+            this.$api.learnActivity.findResearchList(params).then(res => {
+                if(!res.error) {
+                    let list = []
+                    res.list.map(item => {
+                        list.push(item.class.name)
+                    })
+                    this.targets = list
+                }
+            })
+        },
         getSurveyInfo(surveyId) {
             let params = {
                 id: surveyId,
-                code: this.$store.state.userInfo.schoolCode
+                code: 'Survey-' + this.$store.state.userInfo.schoolCode
             }
-           /*  this.$api.ability.getSurveySummary(params).then(
+           /*  this.$api.questionnaire.FindSurveysSummary(params).then(
                 res => {
-                    if (res.trSurveys && res.trSurveys[0]) {
-                        res.trSurveys[0].teachers.forEach(item => {
+                    if (res.survey) { */
+                        /* res.survey.teachers.forEach(item => {
                             item.answer = item.answer || []
-                        })
-                        this.surveyInfo = res.trSurveys[0]
+                        }) */
+                        this.surveyInfo = res.survey
 
-                        let tea = res.trSurveys[0].teachers.find(item => {
+                        /* let tea = res.survey.teachers.find(item => {
                             return item.id == this.$store.state.userInfo.TEAMModelId
                         })
                         if (tea) {
                             this.isSurvey = !!tea.time
-                        }
-                    }
-                },
-                err => {
-
+                        } */
+                    /* }
                 }
             ) */
         },
@@ -497,9 +516,6 @@ export default {
                             this.isExam = !!tea.time
                         }
                     }
-                },
-                err => {
-
                 }
             )
         },
@@ -512,6 +528,14 @@ export default {
                 res => {
                     if (res.works.length) {
                         this.workInfo = res.works[0]
+                        if(res.works[0].teachers.length) {
+                            console.log(111111);
+                            res.works[0].teachers.forEach(item => {
+                                if(item.id == this.$store.state.userInfo.TEAMModelId) {
+                                    this.homeWork = item.hw.substring(item.hw.lastIndexOf("/") + 1)
+                                }
+                            })
+                        }
                     }
                 }
             )

+ 1 - 0
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -991,6 +991,7 @@ export default {
             let stulistInfo = this.stuList.find(item => {
                 return item.id == listId
             })
+            console.log('名单列表',stulistInfo)
             if (stulistInfo) this.stuListNo = stulistInfo.no
 
             // //这里需要根据站点动态拼接域名

+ 109 - 56
TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue

@@ -16,10 +16,10 @@
 							<span>{{ $t('survey.list') }}</span>
 							<div>
 								<Icon type="md-add" class="to-create-icon" @click="goToCreate" style="margin-left: 10px"
-									v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)" />
+									v-if="($access.can('admin.*|schoolAc-upd') || isPrivate) || isAreaSurvey" />
 								<Icon type="md-trash" class="to-create-icon"
 									@click="isAreaSurvey ? delAreaTrain() : onDeleteQn()"
-									v-if="qnList.length && ($access.can('admin.*|schoolAc-upd') || isPrivate)" />
+									v-if="qnList.length && ($access.can('admin.*|schoolAc-upd') || isPrivate) && !canNotDeleteSurvey(currentQn.owner)" />
 							</div>
 						</div>
 						<vuescroll>
@@ -145,6 +145,11 @@
 										<EmptyData :top="50"></EmptyData>
 									</div>
 									<div v-show="qnList.length" ref="baseQnRef">
+										<div v-if="isAreaSurvey && currentQn.progress !== 'pending'">
+											<Select v-model="areaSchIndex" style="width:200px;margin: 10px 20px;" @on-change="getAreaRecord">
+												<Option v-for="(item,index) in areaSchList" :value="index" :key="index">{{ item }}</Option>
+											</Select>
+										</div>
 										<div class="qn-data-wrap" v-if="curTab === 'result'">
 											<BaseQuestionnaire :currentQn="currentQn" :students="allSsList"
 												:isEdit="editable" ref="qnPaper" v-if="!isEmptyData">
@@ -157,7 +162,7 @@
 												<BasePie barId="pie1" :total="allSsList.length"
 													:noAnswerdCount="noFinishStudents.length"></BasePie>
 											</div>
-											<div class="no-table-wrap">
+											<div class="no-table-wrap" v-if="!isAreaSurvey">
 												<BaseSsTable :tableDatas="allSsList"></BaseSsTable>
 											</div>
 										</div>
@@ -213,7 +218,10 @@
 				noFinishStudents: [],
 				allSsList: [],
 				isFromRecord: false,
-				hasModify: false
+				hasModify: false,
+				areaRecord:[],
+				areaSchIndex:0,
+				areaSchList:[],
 			};
 		},
 		created() {
@@ -254,6 +262,7 @@
 						name: this.$t('survey.defaultName'),
 						classes: [],
 						stuLists: [],
+						targets:[],
 						endTime: new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1,
 						startTime: new Date().getTime(),
 						description: "",
@@ -349,18 +358,38 @@
 			async getQnDetails(qnItem) {
 				console.log(qnItem)
 				return new Promise(async (r, j) => {
-					this.$api.questionnaire
-						.FindSurveysSummary({
+					if(this.isAreaSurvey){
+						this.$api.ability.getAreaSurveyById({
 							id: qnItem.id,
-							code: this.isAreaSurvey ? this.areaId : qnItem.code,
-						})
-						.then(async (res) => {
-							if (!res.error && res.survey) {
-								r(res.survey);
-							} else {
-								this.$Message.error(this.$t('survey.getDataFailTip'));
+							areaId: this.areaId
+						}).then(res => {
+							if (!res.error) {
+								if(res.status === 404){
+									this.$Message.error('未查询到当前活动!')
+									r(null)
+								}else{
+									this.areaRecord = res.code
+									r(res.survey)
+								}
 							}
-						});
+						}).catch(err => {
+							j(err)
+						})
+					}else{
+						this.$api.questionnaire
+							.FindSurveysSummary({
+								id: qnItem.id,
+								code: this.isAreaSurvey ? this.areaId : qnItem.code,
+							})
+							.then(async (res) => {
+								if (!res.error && res.survey) {
+									r(res.survey);
+								} else {
+									this.$Message.error(this.$t('survey.getDataFailTip'));
+								}
+							});
+					}
+					
 				});
 			},
 
@@ -384,15 +413,18 @@
 				}
 				this.currentQn = item.id ? await this.getQnDetails(item) : this.currentQn;
 				this.currentQn.progress = item.progress;
-
+				console.log(this.currentQn)
 				if (this.isAreaSurvey && item.id) {
 					this.areaSurveyTeachers = []
-					let schoolTeachers = await this.getAreaSurveyTeachers(item.id)
-					schoolTeachers.forEach(i => {
-						this.areaSurveyTeachers.push(...i.teachers)
-					})
-					console.log('xxxxxxx', this.areaSurveyTeachers)
-					this.currentQn.teachers = this.areaSurveyTeachers
+					this.areaSchIndex = 0
+					this.areaSchList = this.areaRecord.map(i => i.name)
+					this.areaRecord.length && this.getAreaRecord(0)
+					// let schoolTeachers = await this.getAreaSurveyTeachers(item.id)
+					// schoolTeachers.forEach(i => {
+					// 	this.areaSurveyTeachers.push(...i.teachers)
+					// })
+					// console.log('xxxxxxx', this.areaSurveyTeachers)
+					// this.currentQn.teachers = this.areaSurveyTeachers
 				} else {
 					if (item.id) {
 						if (this.currentQn.targetType === 'research') {
@@ -416,6 +448,18 @@
 				this.editable = false;
 				this.hasModify = false
 			},
+			
+			/* 获取区级活动的作答数据 */
+			async getAreaRecord(schoolIndex){
+				let curSchoolInfo = this.areaRecord[schoolIndex]
+				let schoolSas = await this.$evTools.getBlobSchoolSas(curSchoolInfo.code)
+				let fullPath = this.$evTools.getBlobHost() + '/' + curSchoolInfo.code + curSchoolInfo.url + schoolSas
+				let recordJson = JSON.parse(await this.$tools.getFile(fullPath))
+				console.log(curSchoolInfo)
+				console.log(recordJson)
+				this.allSsList = new Array(curSchoolInfo.count).fill('0')
+				this.noFinishStudents =  new Array(curSchoolInfo.count - recordJson.userids.length).fill('0')
+			},
 
 			/* 获取区级活动参与的所有教师 */
 			getAreaSurveyTeachers(surveyId) {
@@ -653,27 +697,28 @@
 						ids: surveyItem.tchLists
 					}
 					//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
-					this.$api.schoolSetting.getStusByClassId(params).then(res => {
+					this.$api.learnActivity.findResearchList(params).then(res => {
 						if (!res.error) {
 							let list = []
 							res.list.forEach(classStus => {
 								classStus.class.stuInfos.forEach(i => {
-									list.push({
-										id: i.id,
-										name: i.name,
-										no: i.no || 0,
-										classroomName: classStus.class.name,
-										finish: answerdList.includes(i.id)
-									})
+										list.push({
+											id: i.id,
+											name: i.name,
+											no: i.no || 0,
+											classroomName: classStus.class.name,
+											finish: answerdList.includes(i.id)
+										})
 								})
 								classStus.class.tmdInfos.forEach(i => {
-									list.push({
-										id: i.id,
-										name: i.name,
-										no: i.no || 0,
-										classroomName: classStus.class.name,
-										finish: answerdList.includes(i.id)
-									})
+										list.push({
+											id: i.id,
+											name: i.name,
+											no: i.no || 0,
+											classroomName: classStus.class.name,
+											finish: answerdList.includes(i.id)
+										})
+
 								})
 							})
 							console.log(list)
@@ -716,22 +761,27 @@
 							let list = []
 							res.list.forEach(classStus => {
 								classStus.class.stuInfos.forEach(i => {
-									list.push({
-										id: i.id,
-										name: i.name,
-										no: i.no || 0,
-										classroomName: classStus.class.name,
-										finish: answerdList.includes(i.id)
-									})
+									if(!list.find(j => j.id === i.id)){
+										list.push({
+											id: i.id,
+											name: i.name,
+											no: i.no || 0,
+											classroomName: classStus.class.name,
+											finish: answerdList.includes(i.id)
+										})
+									}
+									
 								})
 								classStus.class.tmdInfos.forEach(i => {
-									list.push({
-										id: i.id,
-										name: i.name,
-										no: i.no || 0,
-										classroomName: classStus.class.name,
-										finish: answerdList.includes(i.id)
-									})
+									if(!list.find(j => j.id === i.id)){
+										list.push({
+											id: i.id,
+											name: i.name,
+											no: i.no || 0,
+											classroomName: classStus.class.name,
+											finish: answerdList.includes(i.id)
+										})
+									}
 								})
 							})
 							console.log(list)
@@ -956,11 +1006,9 @@
 										this.deleteBlobPrefix(this.currentQn).then(status => {
 											if (status === 200) {
 												this.isLoading = false;
-												// this.qnList.splice(this.qnList.reverse().indexOf(this.currentQn), 1);
+												this.qnList.splice(this.qnList.reverse().indexOf(this.currentQn), 1);
 												this.$Message.success(this.$t('survey.deleteSuc'));
-												this.handleTabClick(
-													this.$route.name === "manageQuestionnaire" ? 0 : 1
-												);
+												this.handleTabClick(0);
 											} else {
 												console.log(err)
 												this.isLoading = false;
@@ -1089,12 +1137,12 @@
 								scope: j.scope,
 								children: j.scope === 'private' ? j.classes : [{
 										id: 'class',
-										name: '行政班',
+										name:this.$t('stuAccount.adminClass'),
 										children: j.classes.filter(k => k.type === 'class')
 									},
 									{
 										id: 'stuList',
-										name: '教学班',
+										name:this.$t('stuAccount.teachClass'),
 										children: j.classes.filter(k => k.type === 'stuList')
 									}
 								]
@@ -1132,6 +1180,11 @@
 			isAreaSurvey() {
 				return this.$route.name === 'manageAreaQuestionnaire'
 			},
+			canNotDeleteSurvey(){
+				return owner => {
+					return this.$route.name !== 'manageAreaQuestionnaire' && owner === 'area'
+				}
+			}
 		},
 		watch: {
 			$route: {

+ 6 - 3
TEAMModelOS/ClientApp/src/view/resource/Policy.vue

@@ -86,6 +86,7 @@
 </template>
 <script>
 const courseData = require('@/static/course.json')
+import jwtDecode from 'jwt-decode'
 export default {
     data() {
         return {
@@ -125,10 +126,12 @@ export default {
         })
         this.course = []
         this.course = this._.cloneDeep(courseData)
-        let sas = this.$store.state.user.schoolProfile.blob_sas
-        let blobUrl = JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
+		let userProfile = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"))
+        let sas = userProfile.osblob_sas
+        let blobUrl = userProfile.osblob_uri
+		let standard = jwtDecode(localStorage.getItem('auth_token')).standard
         this.course.forEach(item => {
-            let url = `${blobUrl}${item.link}?${sas}`
+            let url = `${blobUrl}/yxpt/${standard}${item.link}?${sas}`
             item.link = url
         })
     }

+ 1 - 1
TEAMModelOS/ClientApp/src/view/student-account/stulist/MgtStuList.vue

@@ -1,5 +1,5 @@
 <template>
-    <div class="mgt-stu-list">
+    <div class="mgt-stu-list custom-iview-split">
         <Split v-model="split1">
             <div slot="left" class="stu-list-box">
                 <div class="list-header">

+ 9 - 47
TEAMModelOS/ClientApp/src/view/train/Create.vue

@@ -80,9 +80,9 @@
                         <Checkbox label="hw" class="check-item">
                             <span>布置作业</span>
                         </Checkbox>
-                        <Checkbox label="survey" class="check-item">
+                        <!-- <Checkbox label="survey" class="check-item">
                             <span>问卷反馈</span>
-                        </Checkbox>
+                        </Checkbox> -->
                         <Checkbox label="exam" class="check-item">
                             <span>评测反馈</span>
                         </Checkbox>
@@ -633,16 +633,6 @@ export default {
             )
         },
         beginSaveSurvey(id) {
-            let t = []
-            this.teachers.forEach(item => {
-                if ((this.baseInfo.target.includes('默认分组') && !item.groupName) || this.baseInfo.target.includes(item.groupName)) {
-                    t.push({
-                        id: item.id,
-                        name: item.name,
-                        groupName: item.groupName
-                    })
-                }
-            })
             let bInfo = {
                 id: id,
                 code: this.$store.state.userInfo.schoolCode,
@@ -650,7 +640,7 @@ export default {
                 description: this.trainInfo.quDesc,
                 name: this.trainInfo.quName,
                 targets: this.baseInfo.target,
-                teachers: t,
+                teachers: [],
                 scope: 'school'
             }
 
@@ -676,16 +666,6 @@ export default {
         },
         saveSurvey(id) {
             let blob = `/survey/${id}/index.json`
-            // let t = []
-            // this.teachers.forEach(item => {
-            //     if ((this.baseInfo.target.includes('默认分组') && !item.groupName) || this.baseInfo.target.includes(item.groupName)) {
-            //         t.push({
-            //             id: item.id,
-            //             name: item.name,
-            //             groupName: item.groupName
-            //         })
-            //     }
-            // })
             let params = {
                 id: id,
                 school: this.$store.state.userInfo.schoolCode,
@@ -694,12 +674,14 @@ export default {
                 creatorId: this.$store.state.userInfo.TEAMModelId,
                 targets: this.baseInfo.target,
                 tchLists: this.baseInfo.target,
-                // teachers: t,
                 blob: blob,
+                owner: 'school',
                 code: this.$store.state.userInfo.schoolCode,
-                sType: 'train'
+                sType: 'train',
+                scope: 'school',
+                targetType:"research"
             }
-            this.$api.ability.saveSurvey(params).then(
+            this.$api.questionnaire.UpsertSurvey(params).then(
                 res => {
                     this.$Message.success('问卷保存成功')
                 },
@@ -806,16 +788,6 @@ export default {
         },
         //保存评测数据
         beginSaveExam(id) {
-            let t = []
-            this.teachers.forEach(item => {
-                if ((this.baseInfo.target.includes('默认分组') && !item.groupName) || this.baseInfo.target.includes(item.groupName)) {
-                    t.push({
-                        id: item.id,
-                        name: item.name,
-                        groupName: item.groupName
-                    })
-                }
-            })
             let bInfo = {
                 id: id,
                 code: this.$store.state.userInfo.schoolCode,
@@ -823,7 +795,7 @@ export default {
                 description: this.trainInfo.examDesc,
                 name: this.trainInfo.examName,
                 targets: this.baseInfo.target,
-                teachers: t,
+                teachers: [],
                 scope: 'school'
             }
 
@@ -853,16 +825,6 @@ export default {
         },
         saveExam(id, answers) {
             let blob = `/exam/${id}/index.json`
-            // let t = []
-            // this.teachers.forEach(item => {
-            //     if ((this.baseInfo.target.includes('默认分组') && !item.groupName) || this.baseInfo.target.includes(item.groupName)) {
-            //         t.push({
-            //             id: item.id,
-            //             name: item.name,
-            //             groupName: item.groupName
-            //         })
-            //     }
-            // })
             let params = {
                 id: id,
                 school: this.$store.state.userInfo.schoolCode,

+ 15 - 8
TEAMModelOS/ClientApp/src/view/train/SurveyDetail.vue

@@ -139,16 +139,19 @@ export default {
         getBlobItems(qnItem) {
             return new Promise(async (resolve, reject) => {
                 console.log(qnItem);
-                let blobHost = JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
                 // 根据试卷的Blob地址 去读取JSON文件
+                // let blobHost = JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
                 let sasString = await this.$tools.getSchoolSas()
+                let blobHost = qnItem.owner === 'area' ? this.$store.state.user.osblob_uri : JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
+                console.log('blob地址',blobHost)
+                let sas = qnItem.owner === 'area' ?  ('?' + this.$store.state.user.osblob_sas) : sasString.sas
                 let promiseArr = []
-                let indexJson = await this.getBlobJsonFile(qnItem.scope, qnItem.blob)
+                let indexJson = await this.getBlobJsonFile(qnItem.owner, qnItem.blob)
                 if (indexJson.slides.length) {
                     for (let item of indexJson.slides) {
                         promiseArr.push(new Promise(async (r, j) => {
                             try {
-                                let itemJson = JSON.parse(await this.$tools.getFile(blobHost + item + sasString.sas))
+                                let itemJson = JSON.parse(await this.$tools.getFile(blobHost + item + sas))
                                 r(itemJson)
                             } catch (e) {
                                 j(e)
@@ -168,13 +171,17 @@ export default {
         },
 
         // 获取blob里的试题数据
-        getBlobJsonFile(scope, url) {
+        getBlobJsonFile(owner, url) {
             return new Promise(async (resolve, reject) => {
-                let blobHost = scope === 'private' ? JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8")).blob_uri : JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
-                // 根据试卷的Blob地址 去读取JSON文件
-                let sasString = scope === 'private' ? await this.$tools.getPrivateSas() : await this.$tools.getSchoolSas()
+                // let blobHost = scope === 'private' ? JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8")).blob_uri : JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
+                // // 根据试卷的Blob地址 去读取JSON文件
+                // let sasString = scope === 'private' ? await this.$tools.getPrivateSas() : await this.$tools.getSchoolSas()
+
+                let sasString = await this.$tools.getSchoolSas()
+                let blobHost = owner === 'area' ? this.$store.state.user.osblob_uri : JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
+                let sas = owner === 'area' ?  ('?' + this.$store.state.user.osblob_sas) : sasString.sas
                 try {
-                    let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
+                    let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sas))
                     resolve(itemJson)
                 } catch (e) {
                     reject(e)

+ 28 - 35
TEAMModelOS/ClientApp/src/view/train/TrainDetail.vue

@@ -117,13 +117,13 @@
                                 </Table>
                             </TabPane>
                             <TabPane label="评测反馈" name="name4" class="tab-pane-wrap" v-if="trainInfo.settings.includes('exam')" style="height:600px">
-                                <Table :columns="examColumns" :data="examTableData" class="table-box" :height="580">
+                                <Table :columns="examColumns" :data="tableData" class="table-box" :height="580">
                                     <template slot-scope="{ row }" slot="examTime">
-                                        <span>{{dateFormat(row.time)}}</span>
+                                        <span>{{dateFormat(row.examTime)}}</span>
                                     </template>
                                     <template slot-scope="{ row,index }" slot="action">
-                                        <Button type="primary" size="small" :disabled="!row.time" @click="toViewExam(index)">
-                                            {{row.time ? '查看详情' : '暂未作答'}}
+                                        <Button type="primary" size="small" :disabled="!row.examTime" @click="toViewExam(index)">
+                                            {{row.examTime ? '查看详情' : '暂未作答'}}
                                         </Button>
                                     </template>
                                 </Table>
@@ -377,10 +377,10 @@
             </div>
         </Modal>
         <Modal v-model="surveyStatus" title="作答详情" width="800">
-            <SurveyDetail v-if="surveyInfo" :survey="surveyInfo" :answer="surveyTableData[surveyIndex].answer"></SurveyDetail>
+            <SurveyDetail v-if="surveyInfo" :survey="surveyInfo" :answer="surveyTableData[surveyIndex].answer || []"></SurveyDetail>
         </Modal>
         <Modal v-model="examStatus" title="作答详情" width="800">
-            <SurveyDetail v-if="examInfo && examTableData[examIndex]" :survey="examInfo" :answer="examTableData[examIndex].answer"></SurveyDetail>
+            <SurveyDetail v-if="examInfo && tableData[examIndex]" :survey="examInfo" :answer="tableData[examIndex].examAnswer || []"></SurveyDetail>
         </Modal>
     </div>
 </template>
@@ -570,15 +570,13 @@ export default {
                 uncheck: 0,
                 rate: 0
             }
-            data.uncheck = this.tableData.filter(item => {
-                return item.status == 0
-            }).length
             data.pass = this.tableData.filter(item => {
                 return item.status == 1
             }).length
             data.fail = this.tableData.filter(item => {
                 return item.status == 2
             }).length
+            data.uncheck = data.all - data.pass - data.fail
             data.rate = (data.pass * 100 / data.all).toFixed(1)
             return data
         },
@@ -593,9 +591,7 @@ export default {
                 data.uploaded = this.surveyInfo.teachers.filter(item => {
                     return item.answer.length
                 }).length
-                data.unupload = this.surveyInfo.teachers.filter(item => {
-                    return !item.answer.length
-                }).length
+                data.unupload = data.all - data.uploaded
                 data.rate = (data.uploaded * 100 / data.all).toFixed(1)
             }
 
@@ -612,9 +608,7 @@ export default {
                 data.uploaded = this.examInfo.teachers.filter(item => {
                     return item.answer.length
                 }).length
-                data.unupload = this.examInfo.teachers.filter(item => {
-                    return !item.answer.length
-                }).length
+                data.unupload = data.all - data.uploaded
                 data.rate = (data.uploaded * 100 / data.all).toFixed(1)
             }
             return data
@@ -690,9 +684,10 @@ export default {
         getSurveyInfo() {
             let params = {
                 id: this.trainInfo.surveyId,
-                code: this.$store.state.userInfo.schoolCode
+                // code: this.$store.state.userInfo.schoolCode
+                code: 'Survey-' + this.$store.state.userInfo.schoolCode
             }
-            this.$api.ability.getSurveySummary(params).then(
+            this.$api.questionnaire.FindSurveysSummary(params).then(
                 res => {
                     if (res.trSurveys && res.trSurveys[0]) {
                         res.trSurveys[0].teachers.forEach(item => {
@@ -728,25 +723,23 @@ export default {
             }
             this.$api.ability.getExamSummary(params).then(
                 res => {
-                    if (res.trExams && res.trExams[0]) {
-                        res.trExams[0].teachers.forEach(item => {
-                            item.answer = item.answer || []
-                        })
-                        this.examInfo = res.trExams[0]
-                        
-                        this.examInfo.teachers.forEach(item => {
-                            let t = this.tableData.find(s => {
-                                return item.id == s.id
+                    if (res.examLite) {
+                        if (this.tableData) {
+                            console.log('表格数据', this.tableData)
+                            res.examLite.teachers.forEach(item => {
+                                let curT = this.tableData.find(t => {
+                                    return t.id == item.id
+                                })
+                                if (curT) {
+                                    curT.examTime = item.time
+                                    curT.examAnswer = item.answer
+                                }
                             })
-                            if (t) {
-                                t.examTime = item.time
-                                t.examAnswer = item.answer
-                            }
-                        })
-                        this.examTableData = JSON.parse(JSON.stringify(this.tableData))
-                        let data = JSON.parse(JSON.stringify(this.tableData))
-                        this.tableData = []
-                        this.tableData = data
+                            this.examInfo = res.examLite
+                            let data = JSON.parse(JSON.stringify(this.tableData))
+                            this.tableData = []
+                            this.tableData = data
+                        }
                     }
                 },
                 err => {

+ 3 - 3
TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue

@@ -13,7 +13,7 @@
 									style="margin-left:10px"
 									v-if="voteList.length && ($access.can('admin.*|schoolAc-upd') || isPrivate) && !canNotDeleteVote(currentVote.owner)" />
 								<Icon type="md-add" class="to-create-icon" @click="goToCreate"
-									v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)" />
+									v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)  || isAreaVote" />
 							</span>
 						</div>
 						<vuescroll>
@@ -776,12 +776,12 @@
 								children:j.scope === 'private' ? j.classes : [
 									{
 										id:'class',
-										name:'行政班',
+										name:this.$t('stuAccount.adminClass'),
 										children:j.classes.filter(k => k.type === 'class')
 									},
 									{
 										id:'stuList',
-										name:'教学班',
+										name:this.$t('stuAccount.teachClass'),
 										children:j.classes.filter(k => k.type === 'stuList')
 									}
 								]

+ 0 - 2
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -20,8 +20,6 @@ using Azure.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos.Student;
 using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
 using TEAMModelOS.SDK.Models.Cosmos;
-using static TEAMModelOS.SDK.Models.Cosmos.ClassAnalysis;
-using static TEAMModelOS.SDK.Models.Cosmos.GradeAnalysis;
 using System.Text;
 
 namespace TEAMModelOS.Controllers.Analysis

+ 10 - 13
TEAMModelOS/Controllers/Common/AreaController.cs

@@ -19,7 +19,6 @@ using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
-using TEAMModelOS.SDK.Models.Cosmos.School;
 using TEAMModelOS.SDK.Models.Service;
 
 namespace TEAMModelOS.Controllers
@@ -210,6 +209,7 @@ namespace TEAMModelOS.Controllers
                 Study areaStudy = stu.ToObject<Study>();
                 areaStudy.owner = "area";
                 areaStudy.ttl = -1;
+                areaStudy.scope = "school";
                 areaStudy.code = "Study-" + id.GetString();
                 areaStudy.createTime = now;
                 if (string.IsNullOrEmpty(areaStudy.id))
@@ -302,7 +302,7 @@ namespace TEAMModelOS.Controllers
                                 study.surveyId = surveyId;
                             }
                         }
-                        if (setting.Equals("work"))
+                        if (setting.Equals("hw"))
                         {
                             if (!request.TryGetProperty("work", out JsonElement work)) return BadRequest();
                             TeacherWork teacherWork = work.ToObject<TeacherWork>();
@@ -312,7 +312,7 @@ namespace TEAMModelOS.Controllers
                             teacherWork.tchLists = pa.gId;
                             teacherWork.scope = "school";
                             teacherWork.targetType = "research";
-                            teacherWork.blob = $"/{teacherWork.areaId}/survey/{study.pId}/index.json";
+                            //teacherWork.blob = $"/{teacherWork.areaId}/survey/{study.pId}/index.json";
                             await getMoreWork(pa, teacherWork);
                             string workId = await TeacherWorkService.saveMoreAsync(client, _dingDing, teacherWork);
                             if (string.IsNullOrEmpty(workId))
@@ -447,7 +447,7 @@ namespace TEAMModelOS.Controllers
                     }
                     if (!string.IsNullOrEmpty(study.workId))
                     {
-                        var sresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(study.examId, new PartitionKey($"TeacherWork-{study.school}"));
+                        var sresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(study.workId, new PartitionKey($"TeacherWork-{study.school}"));
                         if (sresponse.Status == 200)
                         {
                             using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
@@ -482,7 +482,7 @@ namespace TEAMModelOS.Controllers
                     lateCount = s.stu.teachers.Where(h => !string.IsNullOrEmpty(h.sign) && h.sign.Equals("1")).ToList().Count,
                     acount = s.stu.teachers.Where(h => h.aTime > 0).ToList().Count
                 });
-                return Ok(new { survey, exam, info, studies = moreInfo.Select(m => new { m.teac, m.stu }) });
+                return Ok(new { survey, work = twork,exam, info, studies = moreInfo.Select(m => new { m.teac, m.stu }) });
             }
             catch (Exception e)
             {
@@ -927,6 +927,10 @@ namespace TEAMModelOS.Controllers
                                 {
                                     await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(study.surveyId, new PartitionKey($"Survey-{study.school}"));
                                 }
+                                if (!string.IsNullOrEmpty(study.workId))
+                                {
+                                    await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(study.workId, new PartitionKey($"TeacherWork-{study.school}"));
+                                }
                             }
                         }
                         await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(s.ToString(), new PartitionKey($"{c}"));
@@ -1029,20 +1033,13 @@ namespace TEAMModelOS.Controllers
                     }
                     await getMoreSurvey(pa, trSurvey);
 
-                    if (string.IsNullOrEmpty(trSurvey.id))
-                    {
                         trSurvey.id = Guid.NewGuid().ToString();
                         trSurvey.recordUrl = $"/survey/{trSurvey.id}/record.json";
                         var cods = new { records = new List<string>(), userids = new List<string>(), question = new List<QuestionRecord>() };
                         await _azureStorage.UploadFileByContainer(code, cods.ToJsonString(), "survey", $"{trSurvey.id}/record.json");
-                        // trSurvey.blob = SurveyService.getBlob(trSurvey.id);
-                        await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(trSurvey, new PartitionKey($"{trSurvey.code}"));
-                    }
-                    else
-                    {
                         // trSurvey.blob = SurveyService.getBlob(trSurvey.id);
                         await client.GetContainer("TEAMModelOS", "Common").UpsertItemAsync(trSurvey, new PartitionKey($"{trSurvey.code}"));
-                    }
+                    
                     surveys.Add(trSurvey);
                 }
                 //areaSurvey.targets = allName;

+ 0 - 1
TEAMModelOS/Controllers/Common/ExamLiteController.cs

@@ -16,7 +16,6 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
-using TEAMModelOS.SDK.Models.Cosmos.School;
 using TEAMModelOS.SDK.Models.Service;
 
 namespace TEAMModelOS.Controllers.Common

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

@@ -15,7 +15,6 @@ using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
-using TEAMModelOS.SDK.Models.Cosmos.School;
 
 namespace TEAMModelOS.Controllers.Common
 {

+ 27 - 27
TEAMModelOS/Controllers/Research/AbilityStatisticsController.cs

@@ -125,34 +125,34 @@ namespace TEAMModelOS.Controllers.Research
             //线下 学校研修活动
 
 
-            //await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Common")
-            //.GetItemQueryIterator<Study>(queryText: $"select c.owner, c.teachers,c.targets  from c  join A0 in c.teachers  where   A0.id='{_tmdid}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Study-{_school}") }))
-            //{
+            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Common")
+            .GetItemQueryIterator<Study>(queryText: $"select c.owner, c.teachers,c.targets  from c  join A0 in c.teachers  where   A0.id='{_tmdid}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Study-{_school}") }))
+            {
 
-            //    if (!string.IsNullOrEmpty(item.owner))
-            //    {
-            //        if (item.owner.Equals("school"))
-            //        {
-            //            offlineSchoolJoinCount += 1;
-            //            var tech = item.teachers.Find(x => x.id.Equals($"{_tmdid}"));
-            //            if (tech != null && tech.signTime > 0)
-            //            {
-            //                offlinelTime += item.hour;
-            //                offlineSchoolDoneCount += 1;
-            //            }
-            //        }
-            //        else if (item.owner.Equals("area"))
-            //        {
-            //            offlineAreaJoinCount += 1;
-            //            var tech = item.teachers.Find(x => x.id.Equals($"{_tmdid}"));
-            //            if (tech != null && tech.signTime > 0)
-            //            {
-            //                offlinelTime += item.hour;
-            //                offlineAreaDoneCount += 1;
-            //            }
-            //        }
-            //    }
-            //}
+                if (!string.IsNullOrEmpty(item.owner))
+                {
+                    if (item.owner.Equals("school"))
+                    {
+                        offlineSchoolJoinCount += 1;
+                        var tech = item.teachers.Find(x => x.id.Equals($"{_tmdid}"));
+                        if (tech != null && tech.signTime > 0)
+                        {
+                            offlinelTime += item.hour;
+                            offlineSchoolDoneCount += 1;
+                        }
+                    }
+                    else if (item.owner.Equals("area"))
+                    {
+                        offlineAreaJoinCount += 1;
+                        var tech = item.teachers.Find(x => x.id.Equals($"{_tmdid}"));
+                        if (tech != null && tech.signTime > 0)
+                        {
+                            offlinelTime += item.hour;
+                            offlineAreaDoneCount += 1;
+                        }
+                    }
+                }
+            }
 
 
 

+ 14 - 1
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -280,11 +280,24 @@ namespace TEAMModelOS.Controllers
                 //老師個人課綱  TODO 暂时不取
                 List<SyllabusRole> syllabus = new List<SyllabusRole>();
                 List<string> roles= new List<string>() { "teacher" };
+                Area areaa = null;
                 if (areas.Count > 0) {
                     roles.Add("area");
+                    if (!string.IsNullOrEmpty($"{areas[0]}"))
+                    {
+
+                        try
+                        {
+                            areaa = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Area>($"{areas[0].areaId}", new PartitionKey("Base-Area"));
+                        }
+                        catch (CosmosException)
+                        {
+                            areaa = null;
+                        }
+                    }
                 }
                 //換取AuthToken,提供給前端
-                var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, 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);

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

@@ -0,0 +1,15 @@
+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()
+===================