Selaa lähdekoodia

Merge branch 'develop3.0-tmd' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop3.0-tmd

CrazyIter_Bin 4 vuotta sitten
vanhempi
commit
8ebf8c7d35

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

@@ -38,9 +38,9 @@ export default {
         return post('/api/Course/deleteTime', data)
     },
     //获取教室关联的学生(移动到班级api管理)
-    //getClassroomStudent: function (data) {
-    //    return post('/student/class/find', data)
-    //},
+    getClassroomStudent: function (data) {
+       return post('/student/class/find', data)
+    },
     //虚拟教室添加学生
     addClassroom: function (data) {
         return post('/api/ClassStudent/upsert', data)

+ 7 - 0
TEAMModelOS/ClientApp/src/api/learnActivity.js

@@ -205,6 +205,13 @@ export default {
     FindVoteById: function (data) {
         return post('/common/vote/find-id', data)
     },
+	
+	/*
+    * 查询投票结果
+    */
+    FindVoteRecord: function (data) {
+        return post('/common/vote/record', data)
+    },
 
 	/*
 	* 保存作业学生作答数据

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 497 - 474
TEAMModelOS/ClientApp/src/common/BaseLayout.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 462 - 423
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue


+ 1 - 1
TEAMModelOS/ClientApp/src/components/vote/BaseVoteSsTable.vue

@@ -36,7 +36,7 @@
                     {
                         title: '班级',
                         render: (h, params) => {
-                            return h('span', params.row.classroom.name)
+                            return h('span', params.row.className)
                         },
                     },
                     {

+ 7 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/vote.js

@@ -34,8 +34,15 @@ export default {
 		optionSetting: '選項設定',
 		addOption: '添加選項',
 		selectNum: '可投票數',
+		times: '投票週期',
+		once: '單次',
+		day: '每日',
+		week: '每週',
+		month: '每月',
+		year: '每年',
 		other: '其他',
 		openSecret: '開啟匿名投票',
+		openRepeat: '允許重複投票',
 		save: '保存',
 		cancel: '取消',
 		editSuc: '修改成功',

+ 16 - 4
TEAMModelOS/ClientApp/src/view/learnactivity/SimpleAnalysis.vue

@@ -1,6 +1,7 @@
 <template>
     <div>
         <div class="overview-box" v-if="examInfo.progress == 'finish'">
+            <!-- 总人数 -->
             <div class="count-box">
                 <span class="count-subject-num">{{examInfo.stuCount}}</span>
                 <span class="count-subject-text">
@@ -8,6 +9,7 @@
                     {{$t('learnActivity.simple.total')}}
                 </span>
             </div>
+            <!-- 缺考数 -->
             <div class="count-box">
                 <span class="count-subject-num">--</span>
                 <span class="count-subject-text">
@@ -15,6 +17,7 @@
                     {{$t('learnActivity.simple.missExam')}}
                 </span>
             </div>
+            <!-- 班级数 -->
             <div class="count-box">
                 <span class="count-subject-num">{{examInfo.targetClassIds.length}}</span>
                 <span class="count-subject-text">
@@ -22,6 +25,7 @@
                     {{$t('learnActivity.simple.classLabel')}}
                 </span>
             </div>
+            <!-- 学科数 -->
             <div class="count-box">
                 <span class="count-subject-num">{{examInfo.subjects.length}}</span>
                 <span class="count-subject-text">
@@ -29,10 +33,11 @@
                     {{$t('learnActivity.simple.sjLabel')}}
                 </span>
             </div>
+            <!-- 平均分 -->
             <div class="count-box">
                 <span class="count-subject-num">{{avgScore}}</span>
                 <span class="count-subject-text">
-                    <Icon type="md-analytics"  class="count-icon" size="14"/>
+                    <Icon type="md-analytics" class="count-icon" size="14" />
                     {{$t('learnActivity.simple.avgScore')}}
                 </span>
             </div>
@@ -42,6 +47,7 @@
             <AvgCompare :pieData="simpleData.averageMap"></AvgCompare>
         </div>
         <div class="overview-box" v-if="examInfo.progress == 'going'" style="margin-bottom:30px;">
+            <!-- 班级人数 -->
             <div class="count-box">
                 <span class="count-subject-num">{{overviewInfo.total}}</span>
                 <span class="count-subject-text">
@@ -49,6 +55,7 @@
                     {{$t('learnActivity.simple.classStuCount')}}
                 </span>
             </div>
+            <!-- 已作答人数 -->
             <div class="count-box" style="color:#2db7f5">
                 <span class="count-subject-num">{{overviewInfo.answered}}</span>
                 <span class="count-subject-text">
@@ -56,6 +63,7 @@
                     {{$t('learnActivity.simple.answered')}}
                 </span>
             </div>
+            <!-- 未作答人数 -->
             <div class="count-box" style="color:#ed4014">
                 <span class="count-subject-num">{{overviewInfo.noAnswer}}</span>
                 <span class="count-subject-text">
@@ -63,6 +71,7 @@
                     {{$t('learnActivity.simple.unanswer')}}
                 </span>
             </div>
+            <!-- 已评分人数 -->
             <div class="count-box" style="color:#19be6b">
                 <span class="count-subject-num">{{overviewInfo.scored}}</span>
                 <span class="count-subject-text">
@@ -70,6 +79,7 @@
                     {{$t('learnActivity.simple.scored')}}
                 </span>
             </div>
+            <!-- 未评分人数 -->
             <div class="count-box" style="color:#ff9900">
                 <span class="count-subject-num">{{overviewInfo.noScore}}</span>
                 <span class="count-subject-text">
@@ -261,7 +271,9 @@ export default {
         width: 16%;
         height: fit-content;
         text-align: center;
-        background: rgba(53, 53, 53, 0.5);
+        background-color: #00b2c1;
+        background-image: linear-gradient(120deg, #00b2c1 0%, #54adff 100%);
+        border-radius: 5px;
         padding: 15px 0px;
         color: white !important;
         .count-icon {
@@ -285,8 +297,8 @@ export default {
         margin-bottom: 10px;
     }
 }
-.pending-text{
-    color: #EEE;    
+.pending-text {
+    color: #eee;
     font-size: 16px;
     padding-top: 15px;
     width: 100%;

+ 9 - 7
TEAMModelOS/ClientApp/src/view/learnactivity/echarts/AvgCompare.vue

@@ -71,12 +71,13 @@ export default {
                     trigger: 'axis'
                 },
                 grid: {
-                    left: '0%',
-                    right: '40px',
-                    bottom: '0%',
-                    containLabel: true
+                    left: '30px',
+                    right: '00px',
+                    bottom: '3px',
+                    containLabel: false
                 },
                 xAxis: {
+                    show:true,
                     type: 'category',
                     data: [],
                     axisLine: {
@@ -147,7 +148,7 @@ export default {
                     //处理
                     this.pieData.forEach(item => {
                         this.newOption.legend.data.push({
-                            name: item.subjectId,
+                            name: item.subjectId, //不显示班级名称
                             textStyle: {
                                 color: '#FFF'
                             }
@@ -155,7 +156,8 @@ export default {
                     })
                     if (this.pieData.length) {
                         this.newOption.xAxis.data = this.pieData[0].className.map(item => {
-                            return item.name
+                            return item.name //不显示班级名称
+                            // return ''
                         })
                     }
 
@@ -198,7 +200,7 @@ export default {
 <style scoped lang="less">
 #ev-avg-compare {
     width: 400px;
-    height: 350px;
+    height: 260px;
 }
 </style>
 <style>

+ 2 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/echarts/ScoreMatrix.vue

@@ -48,7 +48,7 @@ export default {
                         hoverOffset: 5,
                         type: 'pie',
                         radius: '50%',
-                        center: ['45%', '50%'],
+                        center: ['50%', '50%'],
                         selectedMode: 'single',
                         label: {
                             show: true,
@@ -112,7 +112,7 @@ export default {
 <style scoped lang="less">
 #ev-score-matrix {
     width: 400px;
-    height: 400px;
+    height: 300px;
 }
 </style>
 <style>

+ 66 - 43
TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue

@@ -38,7 +38,7 @@
 				</div>
 				<div slot="right" class="demo-split-pane">
 					<Split v-model="split2">
-						<div slot="left" class="demo-split-pane">
+						<div slot="left" class="demo-split-pane"  ref="voteFormBox">
 							<!-- 投票基础信息展示 -->
 							<div class="hw-col hw-info-box">
 								<div class="hw-box-header">
@@ -48,7 +48,7 @@
 											<Icon type="md-create" size="18" :title="$t('vote.edit')" @click="onEditVote" v-if="($access.can('admin.*|schoolAc-upd') || isPrivate)" /></span>
 									</div>
 								</div>
-								<vuescroll>
+								<vuescroll ref="voteFormScroll">
 									<div v-show="voteList.length === 0">
 										<EmptyData :top="50"></EmptyData>
 									</div>
@@ -166,6 +166,10 @@
 					this.hasNewAdd = true
 					this.$refs.voteForm.voteFormEdit = true
 				}
+				
+				this.$nextTick(() => {
+					this.$refs.voteFormBox.scrollIntoView();
+				})
 			},
 
 
@@ -204,13 +208,22 @@
 			 * @param index
 			 */
 			async onVoteClick(item, index) {
-				this.currentVote = item.id ? await this.getVoteDetails(item) : item
+				console.log(item)
+				let fullItem = item.id ? await this.getVoteDetails(item) : item
+				this.currentVote = fullItem
 				this.activeVoteIndex = index
-				// if (item.id) this.getVoteStudents(item.id,item.target)
+				if (item.id) this.getVoteStudents(fullItem,fullItem.classes)
 				this.$refs.voteForm.voteFormEdit = false
+				this.$refs.voteFormScroll.scrollTo({
+						y: 0,
+					},
+					200,
+					"easeInQuad"
+				);
 				this.hasNewAdd = false
 			},
 			
+			/* 获取投票活动的详细数据 */
 			getVoteDetails(voteItem){
 				return new Promise((r,j) => {
 					this.$api.learnActivity.FindVoteById({
@@ -225,6 +238,28 @@
 					})
 				})
 			},
+			
+			/* 获取正在进行中的投票活动的投票数据 */
+			getVoteRecord(voteItem){
+				return new Promise((r,j) => {
+					this.$api.learnActivity.FindVoteRecord({
+						id: voteItem.id,
+						code: voteItem.code,
+					}).then(res => {
+						if(!res.error){
+							r(res)
+						}
+					}).catch(err => {
+						j(err)
+					})
+				})
+			},
+			
+			/* 根据已结束的RecordUrl来获取投票结果数据 */
+			getRecordUrlData(){
+				
+			},
+			
 
 			/* 取消编辑投票(无ID状态) */
 			onCancelVote() {
@@ -252,13 +287,16 @@
 								scope: this.getCurScope
 							}).then(res => {
 								if (!res.error && res.flag) {
+									setTimeout(() => {
+										this.isLoading = false
+										this.$Message.success(this.$t('vote.deleteSuc'))
+										this.handleTabClick(this.$route.name === 'manageVote' ? 0 : 1)
+									},1000)
+									
+									// this.voteList.splice(this.voteList.indexOf(this.currentVote), 1)
 									// this.isLoading = false
 									// this.$Message.success(this.$t('vote.deleteSuc'))
-									// this.handleTabClick(this.$route.name === 'manageVote' ? 0 : 1)
-									this.voteList.splice(this.voteList.indexOf(this.currentVote), 1)
-									this.isLoading = false
-									this.$Message.success(this.$t('vote.deleteSuc'))
-									if (this.voteList.length) this.onVoteClick(this.voteList[0], 0)
+									// if (this.voteList.length) this.onVoteClick(this.voteList[0], 0)
 								} else {
 									this.isLoading = false
 									this.$Message.error(this.$t('vote.deleteFail'))
@@ -282,15 +320,17 @@
 			 * 获取投票关联的学生清单
 			 * @param voteId 投票ID
 			 */
-			async getVoteStudents(voteId, target) {
+			async getVoteStudents(voteItem) {
 				this.isLoading = true
-				let records = await this.getVoteRecord(voteId)
+				let records = await this.getVoteRecord(voteItem)
 				//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
-				this.$api.courseMgmt.getClassroomStudent({
-					classroomCode: target.map(i => i.classroomCode),
-					school_code: this.$store.state.userInfo.schoolCode
+				console.log(voteItem)
+				this.$api.schoolSetting.getClassroomStudent({
+					school_code: this.$store.state.userInfo.schoolCode,
+					ids: voteItem.classes,
+					scope:voteItem.owner === this.$store.state.userInfo.schoolCode ? 'school' : 'private'
 				}).then(res => {
-					if (!res.error && res.classrooms) {
+					if (!res.error && res.classrooms.length) {
 						let list = []
 						res.classrooms.forEach(classroom => {
 							classroom.students.forEach(i => {
@@ -302,29 +342,26 @@
 								})
 							})
 						})
-						console.log(list)
-						// let infoList = res.result.extend.students
-						// list.forEach(i => {
-						// 	i.name = infoList.filter(j => j.studentId === i.code)[0].name
-						// 	i.classroomName = target.filter(k => k.classroomCode === i.id)[0].classroomName
-						// })
+						console.log(records)
+						
 						// 要根据作答情况 结合两张表 处理表格显示的数据 
-						if (records.length) {
+						if (records.options.length) {
 							let arr = []
-							this.studentsTable = []
-							records.forEach((item, index) => {
+							this.studentsTable = records.records
+							records.options.forEach((item, index) => {
 								arr.push({
 									// option: this.getSimpleText(item.optionValue),
-									option: item.optionKey ? this.$t('vote.option') + (index + 1) : this.$t('vote.noVote'),
-									key: item.optionKey || '',
-									result: item.students
+									option: item.code ? this.$t('vote.option') + (index + 1) : this.$t('vote.noVote'),
+									key: item.code || '',
+									result: new Array(item.count).fill('1')
 								})
-								this.studentsTable = this.studentsTable.concat(item.students)
 							})
 							console.log(this.studentsTable)
 							this.studentsTable.forEach(i => {
-								let matchList = list.filter(j => j.id === i.code)
+								let matchList = list.filter(j => j.id === i.userid)
 								i.name = matchList.length ? matchList[0].name : this.$t('vote.noData')
+								i.classroomName = matchList.length ? matchList[0].classroomName : this.$t('vote.noData')
+								i.option = i.opt.join(',')
 							})
 							console.log(arr)
 							this.tableData = arr
@@ -342,20 +379,6 @@
 				})
 			},
 
-			/* 获取投票结果数据 */
-			getVoteRecord(voteId) {
-				return new Promise((r, j) => {
-					this.$api.learnActivity.FindRecordByVoteId({
-						id: voteId
-					}).then(res => {
-						if (!res.error && res.options) {
-							r(res.options)
-						} else {
-							j(500)
-						}
-					})
-				})
-			},
 
 			// 提取富文本内容中的文本
 			getSimpleText(html) {

+ 30 - 20
TEAMModelOS/Controllers/School/ClassRoomController.cs

@@ -372,31 +372,40 @@ namespace TEAMModelOS.Controllers
             //ResponseBuilder builder = ResponseBuilder.custom();
             if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
             if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
+            if (!requert.TryGetProperty("ids", out JsonElement ids)) return BadRequest();
             try
             {
                 var client = _azureCosmos.GetCosmosClient();
                 List<object> classrooms = new List<object>();
-                StringBuilder sql = new StringBuilder();
-                Dictionary<string, object> dict = new Dictionary<string, object>();
-                var emobj = requert.EnumerateObject();
-                while (emobj.MoveNext())
-                {
-                    dict[emobj.Current.Name] = emobj.Current.Value;
-                }
-                //处理code
-                if (dict.TryGetValue("school_code", out object _))
-                {
-                    dict.Remove("school_code");
-                }
-                if (scope.ToString().Equals("teacher", StringComparison.OrdinalIgnoreCase))
+                /* StringBuilder sql = new StringBuilder();
+                 Dictionary<string, object> dict = new Dictionary<string, object>();
+                 var emobj = requert.EnumerateObject();
+                 while (emobj.MoveNext())
+                 {
+                     dict[emobj.Current.Name] = emobj.Current.Value;
+                 }
+                 //处理code
+                 if (dict.TryGetValue("school_code", out object _))
+                 {
+                     dict.Remove("school_code");
+                 }
+                 if (scope.ToString().Equals("teacher", StringComparison.OrdinalIgnoreCase))
+                 {
+                     dict.Remove("scope");
+                 }*/
+                //sql.Append("select c.name,c.id,c.students,c.code from c ");
+
+                string info = "";
+                for (int i = 0; i < ids.GetArrayLength(); i++)
                 {
-                    dict.Remove("scope");
-                }
-                sql.Append("select c.name,c.id,c.students,c.code from c ");
-                AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
+                    //ids.Add(id[i].ToJsonString());
+                    info += ids[i].ToJsonString() + ",";
+                }                              
+                //AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
                 if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
                 {
-                    await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(
+                    queryText: $"select c.name,c.id,c.students,c.code from c where c.id in ({info[0..^1]})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                     {
                         using var json = await JsonDocument.ParseAsync(item.ContentStream);
                         if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -410,7 +419,8 @@ namespace TEAMModelOS.Controllers
                 }
                 else
                 {
-                    await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(
+                    queryText: $"select c.name,c.id,c.students,c.code from c where c.id in ({info[0..^1]})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                     {
                         using var json = await JsonDocument.ParseAsync(item.ContentStream);
                         if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -420,7 +430,7 @@ namespace TEAMModelOS.Controllers
                                 classrooms.Add(obj.ToObject<object>());
                             }
                         }
-                    }
+                    }                   
                 }
                 return Ok(new { classrooms });
                 /*List<Classroom> sc = await _azureCosmos.FindByDict<Classroom>(request);