浏览代码

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

zhouj1203@hotmail.com 4 年之前
父节点
当前提交
2d0cb75d35

+ 3 - 5
TEAMModelOS.SDK/Models/Cosmos/Common/Inner/SyllabusNode.cs

@@ -14,9 +14,7 @@ namespace TEAMModelOS.SDK.Models
             //resources = new List<string>();
             //knowledges = new List<string>();
         }
-        /// <summary>
-        /// 
-        /// </summary>
+      
         [Required(ErrorMessage = "{0} 必须填写")]
 
         public string id { get; set; }
@@ -78,11 +76,11 @@ namespace TEAMModelOS.SDK.Models
 
         public int status { get; set; } = 1;
 
-       // public List<CodeValue> resources { get; set; }
+        // public List<CodeValue> resources { get; set; }
         /// <summary>
         /// 关联知识点
         /// </summary>
-        public List<string> points { get; set; } = new List<string>();
+        ///public List<string> points { get; set; } = new List<string>();
 
         public List<SyllabusContent> items { get; set; }
 

+ 49 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Snode.cs

@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.Common
+{
+    /// <summary>
+    /// 课纲节点父类
+    /// </summary>
+    public  class Snode
+    {  
+        /// <summary>
+        /// 试题 ,试卷,内容资源,外部链接(只有link,和name),
+        /// </summary>
+        public string type { get; set; }
+        public string title { get; set; }
+
+    }
+    /// <summary>
+    /// 分支节点
+    /// </summary>
+    public class Tnode : Snode
+    {
+        [Required(ErrorMessage = "{0} 必须填写")]
+
+        public string id { get; set; } /// <summary>
+                                       /// 父级
+                                       /// </summary>
+        [Required(ErrorMessage = "{0} 必须填写")]
+
+        public string pid { get; set; }
+
+        public List<Tnode> tnodes { get; set; }
+        public List<string> points { get; set; } = new List<string> { "" };
+        public List<Rnode> rnodes { get; set; }
+
+    }
+    /// <summary>
+    /// 资源节点
+    /// </summary>
+    public class Rnode : Snode
+    {
+        public string id { get; set; }
+        public string name { get; set; }
+        public string code { get; set; }
+        public List<string> link { get; set; }
+    }
+}

+ 1 - 14
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue

@@ -195,7 +195,6 @@
 
             doRender(data,classIndexs) {
 				let classIndex = this.getCurClassIndex
-				console.log(classIndex)
 				// 区分全部班级以及单个班级的数据
                 this.x = data.pointList
                 this.y = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
@@ -223,19 +222,7 @@
             // 获取最新散点图数据
             getKnowledgeData() {
 				let curclassIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
-                let curJson = this.echartsId === 'knowDetailBar' ? this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curclassIndex].pointKey : 
-				this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curclassIndex].levelKey
-				if(this.echartsId !== 'knowDetailBar'){
-					let transArr = this.$GLOBAL.EXERCISE_LEVELS()
-					curJson.pointList = curJson.pointList.map((i,index) => transArr[index])
-					for(let key in curJson.classpercent){
-						if(!isNaN(key)){
-							let newKey = transArr[+key - 1]
-							curJson.classpercent[newKey] = curJson.classpercent[key]
-							curJson.stupercent[newKey] = curJson.stupercent[key]
-						}
-					}
-				}
+                let curJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curclassIndex].pointKey
 				return curJson
             },
 			getAnalysisJson() {

+ 295 - 0
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelDetail.vue

@@ -0,0 +1,295 @@
+<template>
+    <div :id="echartsId" class="knowledgeBar"></div>
+</template>
+
+<script>
+    export default {
+        name: 'hello',
+        props: ['echartsId','classIndex'],
+        data() {
+            return {
+                knowledgeData: [],
+                x: [],
+                y: [],
+                activeItemIndex: 0,
+				curClassIndex:-1,
+            }
+        },
+
+        created() {
+
+        },
+
+        methods: {
+            drawLine() {
+                let _this = this
+                // 基于准备好的dom,初始化echarts实例
+                let myBar = this.$echarts.init(document.getElementById(this.echartsId))
+                // 指定图表的配置项和数据
+                var option = {
+                    tooltip: {
+                        show: true, // 是否显示提示框,默认为true
+                        trigger: 'axis', // 数据项图形触发
+                        axisPointer: {
+                            // 指示样式
+                            type: 'shadow',
+                            axis: 'auto',
+                            shadowStyle: {
+                                color: 'rgba(128,128,128,0.1)'
+                            }
+                        },
+                        padding: 15,
+                        textStyle: {
+                            // 提示框内容的样式
+                            color: '#fff'
+                        },
+                        formatter: function(value) {
+                            // console.log(value);
+                            return value[0].name + ' : ' + value[0].data + '%'
+                        }
+                    },
+                    grid: {
+                        show: false, // 是否显示直角坐标系网格
+                        top: 80, // 相对位置 top\bottom\left\right
+						left:'center',
+						width:'75%',
+                        height: 440,
+                        containLabel: true // gird 区域是否包含坐标轴的刻度标签
+                    },
+                    dataZoom: [{
+                        'show': true,
+                        'height': 10,
+                        'xAxisIndex': [
+                            0
+                        ],
+                        bottom:36,
+                        'start': 0,
+                        'end': 100,
+                        handleIcon: 'M512 497.821538m-418.264615 0a418.264615 418.264615 0 1 0 836.52923 0 418.264615 418.264615 0 1 0-836.52923 0Z',
+                        handleSize: '160%',
+                        handleStyle: {
+                            color: '#d3dee5'
+
+                        },
+                        textStyle: {
+                            color: '#fff'
+                        },
+                        borderColor: '#90979c'
+                    }, {
+                        'type': 'inside',
+                        'show': true,
+                        'height': 15,
+                        'start': 0,
+                        'end': 100
+                    }],
+                    xAxis: {
+                        show: true, // 是否显示
+                        position: 'bottom', // x轴的位置
+                        offset: 0, // x轴相对于默认位置的偏移
+                        type: 'category', // 轴类型, 默认为 'category'
+                        name: '月份', // 轴名称
+                        nameLocation: 'end', // 轴名称相对位置
+                        nameTextStyle: {
+                            color: 'transparent',
+                            padding: [5, 0, 10, -5]
+                        },
+                        nameGap: 35, // 坐标轴名称与轴线之间的距离
+                        nameRotate: 0, // 坐标轴名字旋转
+                        axisLabel: {
+                            // 坐标轴标签
+                            show: true, // 是否显示
+                            inside: false, // 是否朝内
+                            margin: 15,
+                            rotate: 60,
+                            color: '#989898' // 默认取轴线的颜色,
+                        },
+                        splitLine: {
+                            show: false,
+                            lineStyle: {
+                                color: '#4c504a'
+                            }
+                        },
+                        splitArea: {
+                            show: false // 是否显示,默认为false
+                        },
+                        data: this.x
+                    },
+                    yAxis: {
+                        show: true, // 是否显示
+                        position: 'left', // y轴位置
+                        offset: 0, // y轴相对于默认位置的偏移
+                        type: 'value', // 轴类型,默认为 ‘category’
+                        nameLocation: 'end', // 轴名称相对位置value
+                        nameTextStyle: {
+                            color: '#fff',
+                            padding: [5, 0, 0, 5] // 坐标轴名称相对位置
+                        },
+                        nameGap: 15, // 坐标轴名称与轴线之间的距离
+                        nameRotate: 270, // 坐标轴名字旋转
+                        axisLine: {
+                            show: false, // 是否显示
+                            lineStyle: {
+                                color: '#595959',
+                                width: 1,
+                                type: 'solid'
+                            }
+                        },
+                        axisLabel: {
+                            show: true, // 是否显示
+                            inside: false, // 是否朝内
+                            rotate: 0, // 旋转角度
+                            margin: 8, // 刻度标签与轴线之间的距离
+                            color: '#989898', // 默认轴线的颜色
+                            fontSize: 12,
+                            formatter: '{value} %'
+
+                        },
+                        splitLine: {
+                            show: true,
+                            lineStyle: {
+                                color: '#4c504a',
+                                width: 0.5,
+                                type: 'solid'
+                            }
+                        }
+                    },
+                    series: [
+                        {
+                            type: 'bar',
+                            animation: false,
+                            itemStyle: {
+                                color: function(params) {
+                                    var key = params.dataIndex
+                                    if (key === _this.activeItemIndex) {
+                                        return '#ff9999'
+                                    } else {
+                                        return '#1b9dff'
+                                    }
+                                },
+                            },
+                            emphasis: {
+                                itemStyle: {
+                                    color: '#ff9999'
+                                }
+                            },
+                            data: this.y
+                        }]
+                }
+
+                // 绘制图表
+                myBar.setOption(option)
+                myBar.resize()
+                window.addEventListener('resize', function() {
+                    myBar.resize()
+                })
+
+                let that = this
+                myBar.on('click', function(params) {
+                    that.activeItemIndex = params.dataIndex
+                    that.$emit('handleItemClick', params)
+                    myBar.setOption(option)
+                })
+				
+				
+            },
+
+            doRender(data,classIndexs) {
+				let classIndex = this.getCurClassIndex
+				console.log(classIndex)
+				// 区分全部班级以及单个班级的数据
+                this.x = data.pointList
+                this.y = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
+                this.drawLine()
+            },
+			
+			doSubjectChange(subject){
+				let curclassIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(subject)
+				let curJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curclassIndex].levelKey
+					let transArr = this.$GLOBAL.EXERCISE_LEVELS()
+					curJson.pointList = curJson.pointList.map((i,index) => transArr[index])
+					for(let key in curJson.classpercent){
+						if(!isNaN(key)){
+							let newKey = transArr[+key - 1]
+							curJson.classpercent[newKey] = curJson.classpercent[key]
+							curJson.stupercent[newKey] = curJson.stupercent[key]
+						}
+					}
+				return curJson
+			}
+        },
+
+        mounted() {
+            if (this.getKnowledgeData) {
+				// this.classList = [this.$t('totalAnalysis.allClasses')].concat([...new Set(this.getAnalysisJson.classes.map(item => item.className))]) // 获取班级列表
+                this.doRender(this.getKnowledgeData,this.curClassIndex)
+            }
+			
+			this.$EventBus.$on('onCollapseChange',val => {
+				const myBar = this.$echarts.init(document.getElementById(this.echartsId))
+				myBar.setOption({
+				     grid: {
+						 width: val ? '90%' : '80%'
+					 }
+				})
+			})
+        },
+
+        computed: {
+            // 获取最新散点图数据
+            getKnowledgeData() {
+				let curclassIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
+                let curJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curclassIndex].levelKey
+					let transArr = this.$GLOBAL.EXERCISE_LEVELS()
+					curJson.pointList = curJson.pointList.map((i,index) => transArr[index])
+					for(let key in curJson.classpercent){
+						if(!isNaN(key)){
+							let newKey = transArr[+key - 1]
+							curJson.classpercent[newKey] = curJson.classpercent[key]
+							curJson.stupercent[newKey] = curJson.stupercent[key]
+						}
+					}
+				return curJson
+            },
+			getCurSubject(){
+				return this.$store.state.totalAnalysis.currentSubject
+			},
+			getAnalysisJson() {
+			    return this.$store.state.totalAnalysis.analysisJson
+			},
+			getCurClassIndex(){
+				return this.$store.state.totalAnalysis.curClassIndex
+			}
+        },
+		
+		watch: {
+			getCurSubject(n,o){
+				console.log(n,o)
+				this.doRender(this.doSubjectChange(n),this.curClassIndex)
+			},
+		    // getKnowledgeData: {
+		    //     handler(n,o) {
+		    //         if (n) {
+						// console.log(n,o)
+		    //             this.doRender(n,this.curClassIndex)
+		    //         }
+		    //     }
+		    // },
+			classIndex(n,o){
+				console.log('柱状图变化了', n - 1)
+				this.curClassIndex = n - 1
+				this.doRender(this.getKnowledgeData,n - 1)
+			},
+		}
+    }
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+
+    .knowledgeBar {
+        width:100%;
+        height: 600px;
+        margin: 0 auto;
+        display: block;
+    }
+</style>

+ 7 - 1
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue

@@ -44,7 +44,7 @@
                                 padding: [13, 15]
                             }
                         },
-                        center: ['50%', '62%'],
+                        center: ['50%', '45%'],
 						radius:'60%',
                         tooltip: {
                             trigger: 'item'
@@ -123,6 +123,7 @@
 				let classIndex = this.getCurClassIndex
                 let indicator = []
 				let rateArr = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
+				console.log(data)
 				// 获取最大值 +5 设置到雷达边界最大值
 				let maxNum = Math.max(...rateArr.map(i => Number(i))) + 5
                 data.pointList.forEach(item => {
@@ -166,6 +167,11 @@
         },
 		
 		watch:{
+			getKnowledgeData:{
+				handler(n,o){
+					this.doRender(this.getKnowledgeData,this.curClassIndex)
+				}
+			},
 			classIndex(n,o){
 				console.log('雷达图变化了', n - 1)
 				this.curClassIndex = n - 1

+ 12 - 9
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseScoreRateBar.vue

@@ -198,16 +198,19 @@
 				let sRateArr = isAll ? list.map(i => i.sRate) : list.map(i => i.subjects[this.subjectIndex].sRate)
 				let splitArr = [...new Array(10).keys()]
 				let result = new Array(10).fill(0)
-				console.log(sRateArr)
 				sRateArr.forEach(rate => {
-					splitArr.forEach((j, index) => {
-						if(rate === 100){
-							result[9]++
-						}else if(rate.toString().slice(0, 1) === j.toString()) {
-							result[index]++
-						}
-						
-					})
+					if(rate === 100){
+						result[9]++
+					}else if(rate < 10){
+						result[0]++
+					}else{
+						splitArr.forEach((j, index) => {
+							if(rate.toString().slice(0, 1) === j.toString()) {
+								result[index]++
+							}
+						})
+					}
+					
 				})
 				this.scoreRateCountArr = result
 				this.drawLine()

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js

@@ -203,6 +203,7 @@ export default {
     ka_title4: '知识点得分率统计',
     ka_title5: '知识点得分详情',
     ka_title6: '错题率关系表',
+    ka_title7: '知识点得分率分布图',
 
     ka_text1: '当前知识块',
     ka_text2: '当前知识点',
@@ -240,6 +241,7 @@ export default {
     le_title4: '认知层次得分率统计',
     le_title5: '认知层次得分详情',
     le_title6: '错题率关系表',
+    le_title7: '认知层次得分率分布图',
 
     // QuestionList.vue
     ql_text1: '试卷总分',

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js

@@ -203,6 +203,7 @@ export default {
 	ka_title4: '知識點得分率統計',
 	ka_title5: '知識點得分詳情',
 	ka_title6: '錯題率關係表',
+	ka_title7: '知識點得分率分佈圖',
 
 	ka_text1: '當前知識塊',
 	ka_text2: '當前知識點',
@@ -240,6 +241,7 @@ export default {
 	le_title4: '認知層次得分率統計',
 	le_title5: '認知層次得分詳情',
 	le_title6: '錯題率關系表',
+	le_title7: '認知層次得分率分佈圖',
 
 	// QuestionList.vue
 	ql_text1: '試卷總分',

+ 6 - 6
TEAMModelOS/ClientApp/src/utils/public.js

@@ -661,7 +661,7 @@ export default {
 				stu.no || '-',
 				val.fScores[subjectIndex].value[index],
 				stu.subjects[subjectIndex].fieldPoint[index],
-				(stu.subjects[subjectIndex].fieldPoint[index] / val.fScores[subjectIndex].value[index])
+				val.fScores[subjectIndex].value[index] == 0 ? 0 : (stu.subjects[subjectIndex].fieldPoint[index] / val.fScores[subjectIndex].value[index])
 				.toFixed(2)
 			])
 		})
@@ -671,7 +671,7 @@ export default {
 	getLevelClassPercent(val, subjectIndex, index) {
 		let result = []
 		val.classes.forEach(classItem => {
-			result.push(classItem.subjects[subjectIndex].field.map((score,index) => Number(score / val.fieldwrong[subjectIndex].value[index][1]) * 100)[index])
+			result.push(classItem.subjects[subjectIndex].field.map((score,index) => val.fieldwrong[subjectIndex].value[index][1] == 0 ? 0 : Number(score / val.fieldwrong[subjectIndex].value[index][1]) * 100)[index])
 		})
 		return result
 	},
@@ -683,7 +683,7 @@ export default {
 			stuResult[item] = this.getLevelStuPercent(val, subjectIndex, index)
 			classResult[item] = this.getLevelClassPercent(val, subjectIndex, index)
 		})
-		stuResult.grade = val.fieldAllPer[subjectIndex].value.map((score,index) => (Number(score / val.fieldwrong[subjectIndex].value[index][1]).toFixed(2)) * 100)
+		stuResult.grade = val.fieldAllPer[subjectIndex].value.map((score,index) => (val.fieldwrong[subjectIndex].value[index][1] == 0 ? 0 : Number(score / val.fieldwrong[subjectIndex].value[index][1]).toFixed(2)) * 100)
 		stuResult.keys = val.knowKey
 		classResult.keys = val.knowkey
 		classResult.className = val.classes.map(i => i.className)
@@ -704,7 +704,7 @@ export default {
 				stu.no || '-',
 				val.kScores[subjectIndex].value[index],
 				stu.subjects[subjectIndex].point[index],
-				(stu.subjects[subjectIndex].point[index] / val.kScores[subjectIndex].value[index])
+				val.kScores[subjectIndex].value[index] == 0 ? 0 : (stu.subjects[subjectIndex].point[index] / val.kScores[subjectIndex].value[index])
 				.toFixed(2)
 			])
 		})
@@ -715,7 +715,7 @@ export default {
 		let result = []
 		val.classes.forEach(classItem => {
 			// 取当前班级在每个知识点的得分 除以知识点的总分 得到每个班在该知识点的得分率 index=>知识点下标
-			result.push(classItem.subjects[subjectIndex].point.map((score,pointIndex) => Number(score / val.wrong[subjectIndex].value[pointIndex][1]) * 100)[index])
+			result.push(classItem.subjects[subjectIndex].point.map((score,pointIndex) => val.wrong[subjectIndex].value[pointIndex][1] == 0 ? 0 : Number(score / val.wrong[subjectIndex].value[pointIndex][1]) * 100)[index])
 		})
 		return result
 	},
@@ -728,7 +728,7 @@ export default {
 			classResult[item] = this.getKnowClassPercent(val, subjectIndex, index)
 		})
 		// 取当前年级在每个知识点的得分 除以知识点的总分 得到年级在该知识点的得分率
-		stuResult.grade = val.knowAllper[subjectIndex].value.map((score,index) => Number(score / val.wrong[subjectIndex].value[index][1]) * 100)
+		stuResult.grade = val.knowAllper[subjectIndex].value.map((score,index) => val.wrong[subjectIndex].value[index][1] == 0 ? 0 : Number(score / val.wrong[subjectIndex].value[index][1]) * 100)
 		stuResult.keys = val.knowKey
 		classResult.keys = val.knowkey
 		classResult.className = val.classes.map(i => i.className)

+ 1 - 0
TEAMModelOS/ClientApp/src/view/evaluation/bank/index.vue

@@ -71,6 +71,7 @@
 			},
 			onTabClick(val) {
 				this.currentTab = val
+				this.onBackToTop()
 			},
 			
 			onShowPaperList(){

+ 8 - 5
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue

@@ -1,16 +1,18 @@
 <template>
     <div class="scatter-container">
-		<div v-if="!hasKnowledge" class="analysis-no-data">
+		<div v-show="!hasKnowledge" class="analysis-no-data">
 			<EmptyData :top="200" textContent="本次考试未收集到知识点数据"></EmptyData>
 		</div>
-		<div v-else>
+		<div v-show='hasKnowledge'>
 			<Row>
 			    <Col span="12">
 			        <span class="component-title">{{$t('totalAnalysis.ka_title1')}}</span>
 			        <BasePie pieId="knowPie"></BasePie>
 			    </Col>
 			    <Col span="12" style="position:relative">
-			        <BaseKnowledgeRadar echartsId="knowPie2"></BaseKnowledgeRadar>
+			        <!-- <BaseKnowledgeRadar echartsId="knowPie2"></BaseKnowledgeRadar> -->
+					<span class="component-title">{{$t('totalAnalysis.ka_title7')}}</span>
+					<BaseRadar echartsId="knowRadar" :classIndex="isAllClasses"></BaseRadar>
 			    </Col>
 			</Row>
 			<Row class-name="base-table-row" v-show="isAllClasses === 0">
@@ -31,12 +33,13 @@
 
 <script>
     import BasePie from '@/components/student-analysis/total/BasePie.vue'
+	import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
     import BaseKnowledgeRadar from '@/components/student-analysis/total/BaseKnowledgeRadar.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'
     export default {
         components: {
-            BasePie, BaseKnowledgeRadar, BaseMyTable, ScoreDetails
+            BasePie, BaseKnowledgeRadar, BaseMyTable, ScoreDetails,BaseRadar
         },
         data() {
             return {
@@ -81,7 +84,7 @@
 				        sortable: 'custom',
 				        key: item.className,
 				        renderType: (h, params) => {
-				            return h('span', ((Number(origin[params.row.name][index]))).toFixed(2) + '%')
+				            return h('span', (( isNaN(origin[params.row.name][index]) ? 0 : Number(origin[params.row.name][index]))).toFixed(2) + '%')
 				        },
 				        minWidth: 150
 				    }

+ 15 - 5
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue

@@ -3,17 +3,17 @@
         <Row>
             <Col span="12">
                 <span class="component-title">{{$t('totalAnalysis.ka_title4')}}</span>
-                <span class="pie-to-bar" @click="changeRadarOrBar"><Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}</span>
-                <div v-if="!isShowRadar">
+                <!-- <span class="pie-to-bar" @click="changeRadarOrBar"><Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}</span> -->
+                <div>
                     <BaseDetailBar echartsId="knowDetailBar" :classIndex="classIndex"  @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
                 </div>
-                <div v-if="isShowRadar">
+               <!-- <div v-if="isShowRadar">
                     <BaseRadar echartsId="knowRadar" :classIndex="classIndex"></BaseRadar>
-                </div>
+                </div> -->
             </Col>
             <Col span="12"  style="padding: 30px 100px 0 0">
             <!-- 知识点得分详情 -->
-                <!-- <span class="component-title"><span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span> -->
+                <span class="component-title-point"><span>{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span>
                 <div>
                     <BaseMyTable :columns="detailsColumns"
                                  :tableName="$t('totalAnalysis.ka_title5')"
@@ -247,3 +247,13 @@
 </script>
 
 <style src="./KnowledgeAnalysis.css" scoped></style>
+<style>
+	.component-title-point{
+		position: absolute;
+		font-size: 14px;
+		font-weight: 600;
+		right: 200px;
+		top: 40px;
+		color: #47dbfc;
+	}
+</style>

+ 6 - 3
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue

@@ -6,7 +6,9 @@
                 <BasePie pieId="levelPie"></BasePie>
             </Col>
             <Col span="12" style="position:relative">
-                <BaseLevelRadar echartsId="levelPie2" v-if="isShowPie"></BaseLevelRadar>
+                <!-- <BaseLevelRadar echartsId="levelPie2" v-if="isShowPie"></BaseLevelRadar> -->
+				<span class="component-title">{{$t('totalAnalysis.le_title7')}}</span>
+				<BaseRadar echartsId="levelRadar" :classIndex="isAllClasses"></BaseRadar>
             </Col>
         </Row>
         <Row class-name="base-table-row"  v-show="isAllClasses === 0">
@@ -21,13 +23,14 @@
 </template>
 
 <script>
+	import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
     import BasePie from '@/components/student-analysis/total/BaseLevelPie.vue'
     import BaseLevelRadar from '@/components/student-analysis/total/BaseLevelRadar.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'
     export default {
         components: {
-            BasePie, BaseLevelRadar, BaseMyTable, ScoreDetails
+            BasePie,BaseRadar, BaseLevelRadar, BaseMyTable, ScoreDetails
         },
         data() {
             return {
@@ -71,7 +74,7 @@
             	        sortable: 'custom',
             	        key: item.className,
             	        renderType: (h, params) => {
-            	            return h('span', ((Number(origin[params.row.name][index]))).toFixed(2) + '%')
+            	            return h('span', (isNaN(origin[params.row.name][index]) ? 0 : (Number(origin[params.row.name][index]))).toFixed(2) + '%')
             	        },
             	        minWidth: 150
             	    }

+ 18 - 9
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue

@@ -3,21 +3,20 @@
 		<Row>
 			<Col span="12">
 			<span class="component-title">{{$t('totalAnalysis.le_title4')}}</span>
-			<span class="pie-to-bar" @click="changeRadarOrBar">
+			<!-- <span class="pie-to-bar" @click="changeRadarOrBar">
 				<Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />
 				{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}
-			</span>
-			<div v-if="!isShowRadar">
+			</span> -->
+			<div>
 				<BaseDetailBar echartsId="levelDetailBar" :classIndex="classIndex" @handleItemClick="handleItemClick"
-					ref="detailsBar"></BaseDetailBar>
+					ref="levelDetailBar"></BaseDetailBar>
 			</div>
-			<div v-if="isShowRadar">
+<!-- 			<div v-if="isShowRadar">
 				<BaseRadar echartsId="levelRadar" :classIndex="classIndex"></BaseRadar>
-			</div>
+			</div> -->
 			</Col>
 			<Col span="12">
-			<!-- <span class="component-title">{{$t('totalAnalysis.le_title5')}}<span
-					style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text3')}}:{{transArr[+currentPoint-1]}}</span></span> -->
+			<span class="component-title-point"><span>{{$t('totalAnalysis.ka_text3')}}:{{transArr[+currentPoint-1]}}</span></span>
 			<div style="padding:30px 100px 0 0">
 				<BaseMyTable :columns="detailsColumns" :tableName="$t('totalAnalysis.le_title5')"
 					tableRef="levelScoreTable" :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
@@ -33,7 +32,7 @@
 </template>
 
 <script>
-	import BaseDetailBar from '@/components/student-analysis/total/BaseKnowledgeDetail.vue'
+	import BaseDetailBar from '@/components/student-analysis/total/BaseLevelDetail.vue'
 	import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
 	import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
 	export default {
@@ -266,3 +265,13 @@
 </script>
 
 <style src="./LevelAnalysis.css" scoped></style>
+<style>
+	.component-title-point{
+		position: absolute;
+		font-size: 14px;
+		font-weight: 600;
+		right: 200px;
+		top: 40px;
+		color: #47dbfc;
+	}
+</style>

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue

@@ -28,7 +28,7 @@
 							<span class="info-item">{{$t('totalAnalysis.echarts_text12')}}: <span
 									style="color:#fff;font-weight:bold">{{currentExamItem.stuCount}}</span></span>
 							<span class="info-item">{{$t('totalAnalysis.echarts_text13')}}: <span
-									style="color:#fff;font-weight:bold">{{currentExamItem.stuCount || 0}}</span></span>
+									style="color:#fff;font-weight:bold">{{currentExamItem.stuCount - currentExamItem.lostStu.length}}</span></span>
 							<span class="info-item">{{$t('totalAnalysis.echarts_text14')}}: <span
 									style="color:#fff;font-weight:bold">{{getJoinRate}}</span></span>
 							<span class="info-item">{{$t('totalAnalysis.echarts_text15')}}: <span
@@ -401,7 +401,7 @@
 				return this.$store.state.totalAnalysis.exportTableParams
 			},
 			getJoinRate() {
-				return (this.currentExamItem.stuCount / this.currentExamItem.stuCount).toFixed(2) * 100 + '%'
+				return ((this.currentExamItem.stuCount - this.currentExamItem.lostStu.length) / this.currentExamItem.stuCount).toFixed(2) * 100 + '%'
 			}
 		},
 		// 监听部分路由变化

+ 1 - 0
TEAMModelOS/Controllers/Syllabus/SyllabusController.cs

@@ -36,6 +36,7 @@ namespace TEAMModelOS.Controllers
 
         /// <summary>
         /// 批量保存或更新课纲
+        /// 
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>