Browse Source

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

CrazyIter_Bin 4 years ago
parent
commit
94617763e2

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

@@ -28,4 +28,8 @@ export default {
 	UpsertRecord: function(data) {
 	    return post('/common/survey/upsert-record', data)
 	},
+	// 查询问卷作答记录
+	GetAnswerdRecord: function(data) {
+	    return post('/common/survey/answered', data)
+	},
 }

+ 125 - 0
TEAMModelOS/ClientApp/src/components/questionnaire/BasePie.vue

@@ -0,0 +1,125 @@
+<template>
+	<div :id="barId" class="myBar"></div>
+</template>
+
+<script>
+	export default {
+		name: 'BaseBar',
+		props: ['barId','total', 'noAnswerdCount'],
+		data() {
+			return {
+				barDatas: []
+			}
+		},
+		methods: {
+
+			drawLine(data) {
+				let that = this
+				// 基于准备好的dom,初始化echarts实例
+				let myBar = this.$echarts.init(document.getElementById(this.barId), 'chalk')
+				let option = {
+					title: {
+						text: '参与人数统计',
+						top: 25,
+						left:'center',
+						textStyle: {
+							color: '#f3f3f3',
+							fontSize:12,
+							fontWeight:'bold'
+						}
+					},
+
+					tooltip: {
+						trigger: 'item',
+						formatter: "{b} : {c} ({d}%)"
+					},
+					series: [{
+						type: 'pie',
+						radius: '50%',
+						center: ['50%', '50%'],
+						color: ['#08ffb5', '#879c93'],
+						data: [{
+								value: this.total - this.noAnswerdCount,
+								name: '已完成'
+							},
+							{
+								value: this.noAnswerdCount,
+								name: '未完成'
+							},
+						].sort(function(a, b) {
+							return a.value - b.value
+						}),
+						label: {
+							normal: {
+								formatter: ['{c|{c}人}', '{b|{b}}'].join('\n'),
+								rich: {
+									c: {
+										color: 'rgb(246, 246, 246)',
+										fontSize: 12,
+										fontWeight: 'bold',
+										lineHeight: 2
+									},
+									b: {
+										color: 'rgb(43, 163, 169)',
+										fontSize: 12,
+										height: 40
+									},
+								},
+							}
+						},
+						labelLine: {
+							normal: {
+								lineStyle: {
+									color: 'rgb(98,137,169)',
+								},
+								smooth: 0.2,
+								length: 10,
+								length2: 20,
+
+							}
+						},
+						itemStyle: {
+							normal: {
+								shadowColor: 'rgba(0, 0, 0, 0.8)',
+								shadowBlur: 10,
+							}
+						}
+					}]
+				};
+
+				// 绘制图表
+				myBar.setOption(option)
+
+				window.addEventListener('resize', function() {
+					myBar.resize()
+				})
+			}
+		},
+		mounted() {
+			let arr = []
+			if (!this.total) return
+			this.drawLine()
+
+
+		},
+		watch: {
+			total: {
+				deep: true,
+				handler(val) {
+					this.drawLine()
+				}
+			}
+		}
+
+	}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+	.myBar {
+		width: 50%;
+		height: 280px;
+		margin: 0 auto;
+		display: block;
+	}
+</style>

+ 193 - 0
TEAMModelOS/ClientApp/src/components/questionnaire/BaseProgress.vue

@@ -0,0 +1,193 @@
+<template>
+	<div :id="barId" class="myBar"></div>
+</template>
+
+<script>
+	export default {
+		name: 'BaseBar',
+		props: ['barId','total', 'noAnswerdCount'],
+		data() {
+			return {
+				barDatas: []
+			}
+		},
+		methods: {
+
+			drawLine(data) {
+				let that = this
+				// 基于准备好的dom,初始化echarts实例
+				let myBar = this.$echarts.init(document.getElementById(this.barId), 'chalk')
+				var color = ['#12a568', '#12a568', '#17d988']
+				let option = {
+					// backgroundColor: 'rgba(255,255,255,0.05)',
+					title: {
+						text: ((this.total - this.noAnswerdCount) / this.total).toFixed(2) * 100 + '%',
+						textStyle: {
+							color: color[2],
+							fontSize: 20
+						},
+						itemGap: 20,
+						left: 'center',
+						top: 'center'
+					},
+					tooltip: {},
+					angleAxis: {
+						max: 100,
+						clockwise: false, // 逆时针
+						// 隐藏刻度线
+						show: false,
+						boundaryGap: ['40%', '40%'],
+						startAngle: 90,
+					},
+					radiusAxis: {
+						type: 'category',
+						show: true,
+						axisLabel: {
+							show: false,
+						},
+						axisLine: {
+							show: false,
+
+						},
+						axisTick: {
+							show: false
+						},
+					},
+					polar: [{
+						center: ['50%', '50%'], //中心点位置
+						radius: '80%' //图形大小
+					}],
+					series: [{
+							name: '小环',
+							type: 'gauge',
+							splitNumber: 0,
+							radius: '32%', //中间装饰环
+							center: ['50%', '50%'],
+							startAngle: 0,
+							endAngle: 359.9999,
+							axisLine: {
+								show: false
+							},
+							axisTick: {
+								show: true,
+								lineStyle: {
+									color: "#0BF4E4",
+									width: 2,
+									shadowBlur: 1,
+									shadowColor: color[1],
+								},
+								length: 20,
+								splitNumber: 2
+							},
+							splitLine: {
+								show: false
+							},
+							axisLabel: {
+								show: false
+							},
+							detail: {
+								show: true,
+								offsetCenter: ['0%', '-230%'],
+								color: '#f3f3f3',
+								formatter: function(params) {
+									return '问卷完成度'
+								},
+								textStyle: {
+									fontSize: 14,
+									fontWeight:'bold'
+								}
+							}
+						}, {
+							type: 'bar',
+							z: 10,
+							data: [((this.total - this.noAnswerdCount) / this.total).toFixed(2) * 100 ],
+							showBackground: false,
+							backgroundStyle: {
+								color: "blue",
+								borderWidth: 5,
+								width: 10
+							},
+							coordinateSystem: 'polar',
+							roundCap: true,
+							barWidth: 18, //大的占比环
+							itemStyle: {
+								normal: {
+									opacity: 1,
+									color: new that.$echarts.graphic.LinearGradient(0, 0, 1, 1, [{
+										offset: 0,
+										color: '#13d67d'
+									}, {
+										offset: 1,
+										color: '#8ddcac'
+									}])
+								}
+							},
+						},
+						{
+							type: 'pie',
+							name: '内层细圆环',
+							radius: ['50%', '30%'],
+							// radius: '50%',
+							startAngle: 90,
+							hoverAnimation: false,
+							clockWise: false,
+							itemStyle: {
+								normal: {
+									color: new that.$echarts.graphic.LinearGradient(0, 0, 1, 1, [{
+										offset: 0,
+										color: 'rgba(151,179,166,0.74)'
+									}, {
+										offset: 1,
+										color: 'rgba(151,179,166,0.74)'
+									}]),
+									shadowBlur: 5,
+									shadowColor: '#66666a',
+								}
+							},
+							tooltip: {
+								show: false,
+							},
+							label: {
+								show: false
+							},
+							data: [100],
+							
+						}
+					]
+				};
+
+				// 绘制图表
+				myBar.setOption(option)
+
+				window.addEventListener('resize', function() {
+					myBar.resize()
+				})
+			}
+		},
+		mounted() {
+			if (!this.total) return
+			this.drawLine()
+
+
+		},
+		watch: {
+			total: {
+				deep: true,
+				handler(val) {
+					this.drawLine()
+				}
+			}
+		}
+
+	}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+	.myBar {
+		width: 50%;
+		height: 280px;
+		margin: 0 auto;
+		display: block;
+	}
+</style>

+ 1 - 1
TEAMModelOS/ClientApp/src/components/questionnaire/BaseQuestionnaire.vue

@@ -11,7 +11,7 @@
 			<!-- 问卷题目单元 -->
 			<draggable class="list-group" tag="div" v-model="items" v-bind="dragOptions" @start="drag = true" @end="onDragEnd" v-else>
 				<transition-group type="transition" :name="!drag ? 'flip-list' : null">
-					<div class="qn-item" v-for="(item,index) in items" :key="index">
+					<div class="qn-item animated fadeInUp" v-for="(item,index) in items" :key="index">
 						<!-- 题干 -->
 						<p class="qn-stem">
 							<span style="color: red;" v-show="item.required">* </span>

+ 76 - 0
TEAMModelOS/ClientApp/src/components/questionnaire/BaseSsTable.less

@@ -0,0 +1,76 @@
+@main-bgColor: rgb(55, 55, 55); //主背景颜色
+@borderColor: #424242;
+@primary-color:#1CC0F3;
+@primary-textColor: #fff; //文本主颜色
+@second-textColor: #CBCBCB; //文本副级颜色
+@primary-fontSize: 14px;
+@second-fontSize: 16px;
+
+.component-vote-table {
+    padding: 20px 0 50px 0;
+
+    .ivu-table th,
+    .ivu-table td {
+        background: @main-bgColor;
+        color: @second-textColor;
+    }
+
+    .ivu-table-border td,
+    .ivu-table-border th {
+        border-color: @borderColor;
+    }
+
+    .ivu-table:before,
+    .ivu-table-border:after,
+    .ivu-table-wrapper-with-border {
+        background: @borderColor;
+        border-color: @borderColor;
+    }
+
+    .ivu-table-stripe .ivu-table-body tr:nth-child(2n) td,
+    .ivu-table-stripe .ivu-table-fixed-body tr:nth-child(2n) td {
+        background: #2e2e2e;
+    }
+
+    .ivu-table-stripe .ivu-table-body tr.ivu-table-row-hover td,
+    .ivu-table-stripe .ivu-table-fixed-body tr.ivu-table-row-hover td {
+        background: #5C5A5A;
+    }
+
+    .ivu-checkbox-inner {
+        border: none;
+        background: #b5b5b5;
+    }
+
+    .ivu-checkbox-checked .ivu-checkbox-inner {
+        background: @primary-color;
+
+        &:after {
+            top: 4px;
+            left: 6px;
+        }
+    }
+
+    .table-tools-icon {
+        .ivu-icon {
+            font-size: 22px;
+            margin-right: 14px;
+            cursor: pointer;
+        }
+    }
+
+    .ivu-progress-inner-text{
+        vertical-align:unset;
+    }
+}
+
+
+
+
+
+
+.fl-row-center{
+    display:flex;
+    justify-content:center;
+    align-items:flex-start;
+}

+ 94 - 0
TEAMModelOS/ClientApp/src/components/questionnaire/BaseSsTable.vue

@@ -0,0 +1,94 @@
+<template>
+    <div class="component-vote-table">
+        <Table border size='small' ref="selection" :columns="columns" :data="tableData" stripe></Table>
+    </div>
+</template>
+<script>
+    export default {
+        props: {
+            tableDatas: {
+                type: Array,
+                default:[]
+            }
+        },
+        data() {
+            return {
+                setScoreModal: false,
+                downloadModal: false,
+                mutualEvaluationModal: false,
+                isSaveComment: false,
+                currentUsedComment: null,
+                userInfo: this.$store.state.userInfo,
+                isScoreLoading: false,
+                currentStudent: null,
+                currentHw: null,
+                currentScore: 100,
+                currentComment: '',
+                currentFileList: [],
+                currentRateValue: 0,
+                downloadList: [],
+                usedCommentList: [],
+                columns: [
+                    {
+                        title: '姓名',
+                        key: 'name'
+                    },
+					{
+					    title: '编号',
+					    key: 'id'
+					},
+                    {
+                        title: '班级',
+                        render: (h, params) => {
+                            return h('span', params.row.classroomName)
+                        },
+                    },
+                    {
+                        title: '状态',
+                        render: (h, params) => {
+                            return h('span', '未完成')
+                        },
+                    },
+                    
+                ],
+                tableData: [],
+                commentList: [],
+                studentsNum:0
+            }
+        },
+        methods: {
+
+            /**
+             * 全选操作
+             * @param status
+             */
+            handleSelectAll(status) {
+                this.$refs.selection.selectAll(status);
+            },
+
+        },
+
+
+        mounted() {
+            
+        },
+        watch: {
+            tableDatas: {
+                handler(newValue) {
+                    /** 编辑回显 */
+                    if (Array.isArray(newValue) && newValue.length) {
+                        this.tableData = newValue
+                    } else {
+                        this.tableData = []
+                    }
+                },
+                deep: true,
+				immediate:true
+            }
+        }
+    }
+</script>
+
+<style lang="less">
+    @import "./BaseSsTable.less";
+</style>

+ 7 - 3
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue

@@ -1,8 +1,8 @@
 <template>
     <div class="content">
         <div id="textArea"> </div>
-        <Modal v-model="markStatus" fullscreen title="作答" footer-hide>
-            <BaseMyCanvas v-if="markStatus" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseMyCanvas>
+        <Modal v-model="markStatus" fullscreen title="作答" footer-hide  ref="compose">
+                <BaseMyCanvas v-if="markStatus" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseMyCanvas>
         </Modal>
         <iframe class="frame"id="answerIframe" :srcdoc="itemInfo.question"></iframe>
     </div>
@@ -69,7 +69,6 @@
                     this.editor.txt.html(img.outerHTML)
                     this.markStatus = false
                 }
-                console.log(data)
             },
             initEditor() {
                 this.editorContent = ""
@@ -110,7 +109,9 @@
                 answerIframe.contentWindow.document.body.style.minWidth = '600px'
                 answerIframe.contentWindow.document.body.style.backgroundColor = '#f5f5f5'
                 let iframe = document.getElementById('answerIframe').contentWindow.document.getElementsByTagName('p')
+                console.log(iframe[1].style)
                 iframe[1].style.lineHeight = '50px'
+                iframe[1].style.paddingBottom = '50px'
                 html2canvas(answerIframe.contentWindow.document.body).then(canvas => {
                     this.markStatus = true
                     this.markBg = canvas.toDataURL("image/png");
@@ -157,4 +158,7 @@
         /*margin-left:10px;*/
         /*line-height: 50px;*/
     }
+    .canvas-tools {
+        bottom: -50px;
+    }
 </style>

+ 0 - 3
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue

@@ -282,9 +282,6 @@
 								console.log(error)
 							})
 						}
-						
-						
-
 					} else {
 						this.isBtnLoading = false
 						if (this.voteOptionsContent.length) {

+ 2 - 2
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -511,10 +511,10 @@
 									url: item.id + '.json',
 									type: item.type,
 									scoring: {
-										score: item.score,
+										score: item.score || 0,
 										knowledge: item.knowledge || [],
 										field: item.field || 1,
-										ans: nullType.includes(item.type) ? [] : item.answer
+										ans: nullType.includes(item.type) ? [] : (item.answer || [])
 									}
 								}
 								item.type === 'compose' && delete o.scoring

+ 6 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue

@@ -378,7 +378,8 @@ export default {
                 "studentId": this.studentAnswer.id,
                 "subjectId": this.subjectId,
                 "classId": this.studentAnswer.classId,
-                "code": this.paperInfo.code,
+                // "code": this.paperInfo.code,//这种方式paper code规则调整了,会多Paper-"
+                "code": this.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,//暂时取代上面的方式
             }).then(
                 res => {
                     this.$Message.success(this.$t('learnActivity.score.markOk'))
@@ -490,11 +491,13 @@ export default {
         saveScore() {
             let requestData = {
                 "id": this.examId,
-                "code": this.paperInfo.code,
+                // "code": this.paperInfo.code,//这种方式paper code规则调整了,会多Paper-"
+                "code": this.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,//暂时取代上面的方式
                 "point": this.studentAnswer.scores,
                 "studentId": this.studentAnswer.id,
                 "classId": this.studentAnswer.classId,
-                "school": this.paperInfo.code,
+                // "school": this.paperInfo.code,//这种方式paper code规则调整了,会多Paper-"
+                "school": this.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,//暂时取代上面的方式
                 "subjectId": this.subjectId
             }
             this.$api.learnActivity.UpsertAllRecord(requestData).then(res => {

+ 15 - 0
TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.less

@@ -70,6 +70,15 @@
             span {
                 color: @second-textColor;
             }
+			
+			&-tab{
+				margin-right: 10px;
+				cursor: pointer;
+			}
+			
+			&-tab-active{
+				color: #fff !important;
+			}
 
             .qn-box-header-tools {
 				display: flex;
@@ -185,6 +194,12 @@
             // height: 100%;
             min-height: 1200px;
             padding: 20px;
+			
+			.progress-wrap{
+				width: 100%;
+				display: flex;
+				background-color: #373737;
+			}
         }
     }
 }

+ 112 - 4
TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue

@@ -70,7 +70,11 @@
 							<!-- 问卷提交数据 -->
 							<div class="qn-col qn-data-box">
 								<div class="qn-box-header">
-									<span>{{ $t('survey.surveyResult') }}</span>
+									<div>
+										<span :class="['qn-box-header-tab',curTab === 'progress' ? 'qn-box-header-tab-active' : '']" @click="onChangeResultTab('progress')" v-if="currentQn.progress !== 'pending'">问卷进度</span>
+										<span :class="['qn-box-header-tab',curTab === 'result' ? 'qn-box-header-tab-active' : '']" @click="onChangeResultTab('result')">{{ $t('survey.surveyResult') }}</span>
+									</div>
+									
 									<div class="qn-box-header-tools" v-show="!isEmptyData">
 										<div class="qn-box-header-tools-tool" style="margin-right: 10px" v-show="currentQn.progress !== 'finish' && editable">
 											<Icon type="md-list-box" color="#dcdcdc" />
@@ -107,9 +111,24 @@
 									</div>
 								</div>
 								<vuescroll>
-									<div class="qn-data-wrap">
-										<BaseQuestionnaire :editItem="currentQn" :isEdit="editable" ref="qnPaper" v-if="!isEmptyData"></BaseQuestionnaire>
+									<div v-show="qnList.length === 0">
+										<EmptyData :top="50"></EmptyData>
+									</div>
+									<div v-show="qnList.length">
+										<div class="qn-data-wrap" v-if="curTab === 'result'">
+											<BaseQuestionnaire :editItem="currentQn" :isEdit="editable" ref="qnPaper" v-if="!isEmptyData"></BaseQuestionnaire>
+										</div>
+										<div class="qn-data-wrap qn-progress-wrap" v-else>
+											<div class="progress-wrap">
+												<BaseProgress barId="pro1" :total="allSsList.length" :noAnswerdCount="noFinishStudents.length"></BaseProgress>
+												<BasePie barId="pie1" :total="allSsList.length" :noAnswerdCount="noFinishStudents.length"></BasePie>
+											</div>
+											<div class="no-table-wrap">
+												<BaseSsTable :tableDatas="noFinishStudents"></BaseSsTable>
+											</div>
+										</div>
 									</div>
+									
 								</vuescroll>
 							</div>
 						</div>
@@ -123,10 +142,16 @@
 	import blobTool from "@/utils/blobTool.js";
 	import BaseQuestionnaire from "@/components/questionnaire/BaseQuestionnaire.vue";
 	import BaseQnForm from "@/components/questionnaire/BaseQnForm.vue";
+	import BaseProgress from "@/components/questionnaire/BaseProgress.vue";
+	import BasePie from "@/components/questionnaire/BasePie.vue";
+	import BaseSsTable from "@/components/questionnaire/BaseSsTable.vue";
 	export default {
 		components: {
 			BaseQuestionnaire,
 			BaseQnForm,
+			BaseProgress,
+			BasePie,
+			BaseSsTable
 		},
 		data() {
 			return {
@@ -148,6 +173,9 @@
 				editItem: {},
 				activeQnIndex: null,
 				addQnModal: false,
+				curTab:'progress',
+				noFinishStudents:[],
+				allSsList:[]
 			};
 		},
 		created() {},
@@ -159,6 +187,10 @@
 					this.getQnList(index === 0 ? "school" : "private");
 				}, 500)
 			},
+			
+			onChangeResultTab(tab){
+				this.curTab = tab
+			},
 
 			/** 新增问卷 */
 			goToCreate() {
@@ -185,6 +217,7 @@
 					this.editable = true;
 					this.isEmptyData = false;
 					this.$refs.qnForm.qnFormEdit = true;
+					this.onChangeResultTab('result')
 				}
 			},
 
@@ -254,6 +287,12 @@
 				}
 				this.currentQn = item.id ? await this.getQnDetails(item) : this.currentQn;
 				this.currentQn.progress = item.progress;
+				if (item.id) this.getSurveyStudents(this.currentQn)
+				if(item.progress === 'pending'){
+					this.onChangeResultTab('result')
+				}else{
+					this.onChangeResultTab('progress')
+				}
 				console.log("获取问卷数据");
 				console.log(this.currentQn);
 				this.activeQnIndex = hasNewQn ? this.qnList.indexOf(item) : index;
@@ -294,7 +333,8 @@
 						this.isBtnLoading = false;
 					});
 			},
-
+			
+			/* 保存问卷题目到Blob */
 			async doUploadBlob(qnBaseInfo, items) {
 				console.log('上传参数', qnBaseInfo)
 				return new Promise(async (resolve, reject) => {
@@ -353,6 +393,74 @@
 					})
 				})
 			},
+			
+			/* 获取当前问卷活动学生作答数据 */
+			async getSurveyStudents(surveyItem) {
+				this.isLoading = true
+				let answerdList = await this.getAnswerdRecord(surveyItem)
+				//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
+				this.$api.schoolSetting.getClassroomStudent({
+					school_code: this.$store.state.userInfo.schoolCode,
+					ids: surveyItem.classes,
+					scope:surveyItem.owner === this.$store.state.userInfo.schoolCode ? 'school' : 'private'
+				}).then(res => {
+					if (!res.error && res.classrooms.length) {
+						let list = []
+						res.classrooms.forEach(classroom => {
+							classroom.students.forEach(i => {
+								list.push({
+									id: i.id,
+									name: i.name,
+									no: i.no,
+									classroomName: classroom.name
+								})
+							})
+						})
+						this.allSsList = list
+						// 要根据作答情况 结合两张表 处理表格显示的数据 
+						if (answerdList.length) {
+							this.noFinishStudents = this.getNoFinishList(answerdList,list)
+						} else {
+							this.noFinishStudents = list
+						}
+						this.isLoading = false
+					} else {
+						this.$Message.error(this.$t('vote.getDataFailTip'))
+						this.isLoading = false
+					}
+				}).catch(err => {
+					this.$Message.error(this.$t('vote.getClassDataFailTip'))
+					this.isLoading = false
+				})
+			},
+			
+			/* 获取未作答学生清单 */
+			getNoFinishList(answerdList,allList){
+				let result = []
+				console.log(allList.map(i => i.id))
+				allList.forEach(i => {
+					if(!answerdList.includes(i.id)){
+						result.push(i)
+					}
+				})
+				return result
+			},
+			
+			/* 获取正在进行中的投票活动的投票数据 */
+			getAnswerdRecord(surveyItem){
+				return new Promise((r,j) => {
+					this.$api.questionnaire.GetAnswerdRecord({
+						id: surveyItem.id,
+						code: surveyItem.code,
+					}).then(res => {
+						if(!res.error){
+							r(res.userids)
+						}
+					}).catch(err => {
+						j(err)
+					})
+				})
+			},
 
 			onShowAllAnalysis() {
 				this.$refs.qnPaper.onShowAllAnalysis();