ソースを参照

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

李思淳 5 年 前
コミット
7352c945bb

+ 20 - 9
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseClassRadar.vue

@@ -1,5 +1,5 @@
 <template>
-    <div>
+    <div class="radar-box" id="radarBox">
         <div :id='echartsId' class='myRadar'></div>
     </div>
 </template>
@@ -7,13 +7,15 @@
 <script>
     export default {
         name: 'BaseClassRadar',
-        props: ['echartsId'],
+        props: ['echartsId','boxWidth'],
         data() {
             return {
                 radarData: []
             }
         },
-
+        created() {
+            //this.drawLine()
+        },
         methods: {
             drawLine() {
                 let myRadar = this.$echarts.init(
@@ -25,9 +27,9 @@
                 var option = {
                     title: {
                         text: '75',
-                        subtext: '得分率',
+                        subtext: '成就指数',
                         left: 'center',
-                        top: '46.3%',
+                        top: '45.3%',
                         textStyle: {
                             color: '#F4F8FA',
                             fontWeight: 'bold',
@@ -146,24 +148,33 @@
 
                 // 绘制图表
                 myRadar.setOption(option);
+                myRadar.resize()
+
                 window.addEventListener('resize', function () {
                     myRadar.resize()
                 })
-            },
-
+                //console.log(document.getElementById(this.echartsId).style)
+            }
 
         },
         mounted() {
-            this.drawLine()
+            //this.drawLine()
+            this.$nextTick(function () {
+                document.getElementById(this.echartsId).style.width = this.boxWidth + 'px'
+                this.drawLine();
+            });
         }
     };
 </script>
 
 <!-- Add 'scoped' attribute to limit CSS to this component only -->
 <style scoped>
+    .radar-box {
+        width:100%;
+    }
     .myRadar {
         width: 100%;
-        height: 480px;
+        height: 380px;
         margin: 0 auto;
         display: block;
     }

+ 10 - 5
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseGeniusLine.vue

@@ -23,7 +23,7 @@
 
                 // 指定图表的配置项和数据
                 var option = {
-                    color: ['#2adecf'],
+                    color: ['#00B2C1'],
                     textStyle: {
                         color: 'rgb(222,222,222)'
                     },
@@ -119,8 +119,13 @@
                                 show: false
                             },
                             axisLabel: {
-                                interval: 0,
-                                rotate: 0
+                                show: true, // 是否显示
+                                inside: false, // 是否朝内
+                                rotate: 45, // 旋转角度
+                                margin: 15, // 刻度标签与轴线之间的距离
+                                color: '#989898', // 默认取轴线的颜色,
+                                fontSize: 12,
+                                fontFamily: 'Microsoft YaHei'
                             }
                         }
                     ],
@@ -165,11 +170,11 @@
                                     color: this.$echarts.graphic.LinearGradient(0, 1, 0, 0, [
                                         {
                                             offset: 0,
-                                            color: '#719aff'
+                                            color: '#00B2C1'
                                         },
                                         {
                                             offset: 1,
-                                            color: '#51c3ff'
+                                            color: '#00B2C1'
                                         }
                                     ])
                                 }

+ 71 - 20
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseGradeRadar.vue

@@ -25,7 +25,7 @@
                 var option = {
                     title: {
                         text: '75',
-                        subtext:'得分率',
+                        subtext:'成就指数',
                         left: 'center',
                         top:'46.3%',
                         textStyle: {
@@ -47,6 +47,7 @@
                     },
                     legend: {
                         itemHeight: 14,
+                        selectedMode:false,
                         data: [this.$t('totalAnalysis.echarts_text1'), this.$t('totalAnalysis.echarts_text2'), this.$t('totalAnalysis.echarts_text3')],
                         textStyle: {
                             color: '#fff',
@@ -72,16 +73,16 @@
                                 opacity: 0.2
                             }
                         },
-                        splitArea: {
-                            areaStyle: {
-                                color: 'rgba(255,255,255,.3)',
-                                opacity: 1,
-                                shadowBlur: 45,
-                                shadowColor: 'rgba(0,0,0,.5)',
-                                shadowOffsetX: 0,
-                                shadowOffsetY: 15
-                            }
-                        },
+                        //splitArea: {
+                        //    areaStyle: {
+                        //        color: 'rgba(255,255,255,.3)',
+                        //        opacity: 1,
+                        //        shadowBlur: 45,
+                        //        shadowColor: 'rgba(0,0,0,.5)',
+                        //        shadowOffsetX: 0,
+                        //        shadowOffsetY: 15
+                        //    }
+                        //},
                         indicator: [
                             {
                                 name: '语文',
@@ -113,14 +114,19 @@
                         {
                             name: '高一年级',
                             type: 'radar',
-                            symbolSize: 0,
+                            symbolSize: 5,
                             areaStyle: {
                                 normal: {
                                     shadowBlur: 13,
                                     shadowColor: 'rgba(0,0,0,.2)',
                                     shadowOffsetX: 0,
                                     shadowOffsetY: 10,
-                                    opacity: .8
+                                    opacity: 0
+                                }
+                            },
+                            lineStyle: {
+                                normal: {
+                                    width:4
                                 }
                             },
                             data: [
@@ -134,7 +140,29 @@
                                         89,
                                     ],
                                     name: this.$t('totalAnalysis.echarts_text1')
-                                },
+                                }
+                            ]
+                        },
+                        {
+                            name: '高一年级',
+                            type: 'radar',
+                            symbolSize: 5,
+                            areaStyle: {
+                                normal: {
+                                    shadowBlur: 13,
+                                    shadowColor: 'rgba(0,0,0,.2)',
+                                    shadowOffsetX: 0,
+                                    shadowOffsetY: 10,
+                                    opacity: 0.5
+                                }
+                            },
+                            lineStyle: {
+                                normal: {
+                                    width:4
+                                }
+                            },
+                            data: [
+                                
                                 {
                                     value: [
                                         66,
@@ -145,22 +173,45 @@
                                         48,
                                     ],
                                     name: this.$t('totalAnalysis.echarts_text2')
-                                },
+                                }
+                            ]
+                        },
+                        ,
+                        {
+                            name: '高一年级',
+                            type: 'radar',
+                            symbolSize: 5,
+                            areaStyle: {
+                                normal: {
+                                    shadowBlur: 13,
+                                    shadowColor: 'rgba(0,0,0,.2)',
+                                    shadowOffsetX: 0,
+                                    shadowOffsetY: 10,
+                                    opacity: 0
+                                }
+                            },
+                            lineStyle: {
+                                normal: {
+                                    width:4
+                                }
+                            },
+                            data: [
+                                
                                 {
                                     value: [
+                                        86,
+                                        75,
+                                        76,
                                         78,
-                                        77,
                                         72,
-                                        70,
-                                        69,
-                                        66,
+                                        78,
                                     ],
                                     name: this.$t('totalAnalysis.echarts_text3')
                                 }
                             ]
                         }
                     ],
-                    color: ['#7db41b', '#b1eadb', '#b1aadb'],
+                    color: ['rgba(86,199,60, 1)', 'rgba(0,183,238, 1)', '#b6a2de'],
                 };
 
                 // 绘制图表

+ 3 - 3
TEAMModelOS/ClientApp/src/locale/lang/en-US/totalAnalysis.js

@@ -14,7 +14,7 @@ export default {
     condition3: 'Term',
     condition4: 'Type',
     condition5: 'Range',
-    condition6: 'Feedback',
+    condition6: 'Origin',
     condition7: 'Subject',
 
     // totalIndex.vue
@@ -48,9 +48,9 @@ export default {
     echarts_text11: 'test time',
     echarts_text12: 'number of participants',
     echarts_text13: 'actual number of participants',
-    echarts_text14: 'achievement rate',
+    echarts_text14: 'Participation rate',
     echarts_text15: 'average score',
-    echarts_text16: 'scoring rate',
+    echarts_text16: 'Achievement index',
     echarts_text17: 'eugenics rate',
     echarts_text18: 'number of excellent students',
 

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

@@ -14,7 +14,7 @@ export default {
     condition3: '学年期',
     condition4: '考试类型',
     condition5: '考试范围',
-    condition6: '反馈类型',
+    condition6: '评测来源',
     condition7: '考试学科',
 
     // totalIndex.vue
@@ -29,10 +29,10 @@ export default {
     ti_text4:'年级数',
     ti_text5:'班级数',
     ti_text12:'全部评测',
-    ti_text6:'考',
-    ti_text7:'期初考',
-    ti_text8:'期中考',
-    ti_text9:'期末考',
+    ti_text6:'考',
+    ti_text7:'考',
+    ti_text8:'平常考',
+    ti_text9:'其它',
     ti_text10:'模拟测验',
     ti_text11: '诊断测验',
     echarts_text1:'最高值',
@@ -46,11 +46,11 @@ export default {
     echarts_text9:'当前年级',
     echarts_text10:'筛选',
     echarts_text11:'施测时间',
-    echarts_text12:'参与人数',
+    echarts_text12:'参与人数',
     echarts_text13:'实际参与人数',
-    echarts_text14:'达成率',
+    echarts_text14:'参与率',
     echarts_text15:'平均分',
-    echarts_text16:'得分率',
+    echarts_text16:'成就指数',
     echarts_text17:'优生率',
     echarts_text18:'优生人数',
 

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

@@ -14,7 +14,7 @@ export default {
     condition3: '學年期',
     condition4: '考試類型',
     condition5: '考試範圍',
-    condition6: '反饋類型',
+    condition6: '評測來源',
     condition7: '考試學科',
 
     // totalIndex.vue
@@ -46,11 +46,11 @@ export default {
     echarts_text9: '當前年級',
     echarts_text10: '篩選',
     echarts_text11: '施測時間',
-    echarts_text12: '參與人數',
+    echarts_text12: '參與人數',
     echarts_text13: '實際參與人數',
-    echarts_text14: '達成率',
+    echarts_text14: '參與率',
     echarts_text15: '平均分',
-    echarts_text16: '得分率',
+    echarts_text16: '成就指數',
     echarts_text17: '優生率',
     echarts_text18: '優生人數',
 

+ 8 - 16
TEAMModelOS/ClientApp/src/static/filter.json

@@ -67,28 +67,20 @@
       "key": "all"
     },
     {
-      "name": "考",
+      "name": "考",
       "key": "week"
     },
     {
-      "name": "期初考",
+      "name": "考",
       "key": "start"
     },
     {
-      "name": "期中考",
+      "name": "平常考",
       "key": "middle"
     },
     {
-      "name": "期末考",
+      "name": "其它",
       "key": "end"
-    },
-    {
-      "name": "诊断测验",
-      "key": "diagnosis"
-    },
-    {
-      "name": "模拟测验",
-      "key": "simulation"
     }
   ],
   "feedbackList": [
@@ -97,19 +89,19 @@
       "key": "all"
     },
     {
-      "name": "考试分析",
+      "name": "考试阅卷",
       "key": "1"
     },
     {
-      "name": "课堂反馈",
+      "name": "互动课堂",
       "key": "2"
     },
     {
-      "name": "线上作业",
+      "name": "线上评测",
       "key": "3"
     },
     {
-      "name": "自学课堂",
+      "name": "手动录入",
       "key": "4"
     }
   ],

+ 52 - 11
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.less

@@ -4,7 +4,7 @@
 
     .section {
         width: 100%;
-        padding: 20px;
+        padding: 20px 0;
         margin: 0 auto;
         max-width: 1600px;
         user-select: none;
@@ -57,12 +57,12 @@
             }
 
             .exam-data-item {
-                background-color: #FD5521;
-                background-image: linear-gradient(19deg,#FD5521 0%,#EF6A00 100%);
-                background-image: -webkit-linear-gradient(19deg,#FD5521 0%,#EF6A00 100%);
-                background-image: -moz-linear-gradient(19deg,#FD5521 0%,#EF6A00 100%);
-                background-image: -o-linear-gradient(19deg,#FD5521 0%,#EF6A00 100%);
-                width: 12%;
+                background-color: #00B2C1;
+                background-image: linear-gradient(120deg,#00B2C1 0%,#54ADFF 100%);
+                background-image: -webkit-linear-gradient(120deg,#00B2C1 0%,#54ADFF 100%);
+                background-image: -moz-linear-gradient(120deg,#00B2C1 0%,#54ADFF 100%);
+                background-image: -o-linear-gradient(120deg,#00B2C1 0%,#54ADFF 100%);
+                width: 18%;
                 height: 100px;
                 border-radius: 10px;
                 justify-content: center;
@@ -83,7 +83,8 @@
 
             .radar-data-item {
                 background: rgb(68,68,68);
-                width: 30%;
+                width: 31.33%;
+                margin-top: 2%;
                 height: 500px;
                 border-radius: 10px;
                 cursor: pointer;
@@ -109,6 +110,20 @@
             }
         }
 
+        .radar-title {
+            color: #fff;
+            text-align: center;
+            font-size: 20px;
+            font-weight: bold;
+            margin: 15px 0 -25px 0;
+        }
+
+        .radar-details {
+            color: #fff;
+            text-align: center;
+            font-size: 14px;
+        }
+
         .select-grade {
             position: absolute;
             right: -30px;
@@ -123,14 +138,33 @@
             right: -50px;
         }
 
+        .grade-radar-box {
+            position: relative;
+            flex-wrap: wrap;
+            justify-content: unset;
+        }
+
         .class-radar-box {
+            position: relative;
             flex-wrap: wrap;
             justify-content: unset;
+            padding: 20px;
+            background: #6d6d6d;
+            border-radius: 10px;
 
+            .box-arrow {
+                content: "";
+                position: absolute;
+                top: -34px;
+                left: 15%;
+                border: 20px solid transparent;
+                border-bottom: 23px solid #6d6d6d;
+            }
 
             .radar-data-item {
-                width: 22%;
-                margin-top: 4%;
+                width: 19.2%;
+                margin-top: 1%;
+                height: 400px;
             }
         }
 
@@ -171,6 +205,13 @@
                         vertical-align: super;
                     }
 
+                    .exam-grade {
+                        background: #018b99;
+                        padding: 3px 5px;
+                        border-radius: 5px;
+                        vertical-align: super;
+                    }
+
                     .exam-name {
                         font-size: 24px;
                         font-weight: bold;
@@ -178,7 +219,7 @@
                     }
 
                     .exam-subject {
-                        background: rgb(5, 138, 190);
+                        background: #419901;
                         padding: 2px 5px;
                         border-radius: 5px;
                         margin-left: 10px;

+ 325 - 220
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue

@@ -11,234 +11,257 @@
                         </Select>
                     </div>
                 </div>
-
             </div>
-
-            <!-- 基本数据统计部分 -->
             <div class="section">
-                <div class="section-title">
-                    {{$t('totalAnalysis.ti_title1')}}
-
-                </div>
-                <div class="section-box">
-                    <div class="base-data-item block-item">
-                        <div class="item-icon"><Icon type="md-people" /></div>
-                        <div class="item-content">
-                            <div class="item-num">98</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text1')}}</div>
-                        </div>
-                    </div>
-                    <div class="base-data-item block-item">
-                        <div class="item-icon"><Icon type="md-school" /></div>
-                        <div class="item-content">
-                            <div class="item-num">3655</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text2')}}</div>
-                        </div>
-                    </div>
-                    <div class="base-data-item block-item">
-                        <div class="item-icon"><Icon type="logo-youtube" /></div>
-                        <div class="item-content">
-                            <div class="item-num">3</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text3')}}</div>
-                        </div>
-                    </div>
-                    <div class="base-data-item block-item">
-                        <div class="item-icon"><Icon type="md-podium" /></div>
-                        <div class="item-content">
-                            <div class="item-num">9</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text4')}}</div>
-                        </div>
-                    </div>
-                    <div class="base-data-item block-item">
-                        <div class="item-icon"><Icon type="md-tennisball" /></div>
-                        <div class="item-content">
-                            <div class="item-num">48</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text5')}}</div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <!-- 评测数据统计部分 -->
-            <div class="section">
-                <div class="section-title">
-                    {{$t('totalAnalysis.ti_title2')}}
-                </div>
-                <div class="section-box">
-                    <div class="exam-data-item block-item">
-                        <div class="item-content">
-                            <div class="item-num">16</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text12')}}</div>
-                        </div>
-                    </div>
-                    <div class="exam-data-item block-item">
-                        <div class="item-content">
-                            <div class="item-num">7</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text6')}}</div>
-                        </div>
-                    </div>
-                    <div class="exam-data-item block-item">
-                        <div class="item-content">
-                            <div class="item-num">2</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text7')}}</div>
-                        </div>
-                    </div>
-                    <div class="exam-data-item block-item">
-                        <div class="item-content">
-                            <div class="item-num">1</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text8')}}</div>
+                <Tabs value="tab1">
+                    <TabPane label="统计数据" name="tab1">
+                        <!-- 基本数据统计部分 -->
+                        <div class="section" style="display:none">
+                            <div class="section-title">
+                                {{$t('totalAnalysis.ti_title1')}}
+
+                            </div>
+                            <div class="section-box">
+                                <div class="base-data-item block-item">
+                                    <div class="item-icon"><Icon type="md-people" /></div>
+                                    <div class="item-content">
+                                        <div class="item-num">98</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text1')}}</div>
+                                    </div>
+                                </div>
+                                <div class="base-data-item block-item">
+                                    <div class="item-icon"><Icon type="md-school" /></div>
+                                    <div class="item-content">
+                                        <div class="item-num">3655</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text2')}}</div>
+                                    </div>
+                                </div>
+                                <div class="base-data-item block-item">
+                                    <div class="item-icon"><Icon type="logo-youtube" /></div>
+                                    <div class="item-content">
+                                        <div class="item-num">3</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text3')}}</div>
+                                    </div>
+                                </div>
+                                <div class="base-data-item block-item">
+                                    <div class="item-icon"><Icon type="md-podium" /></div>
+                                    <div class="item-content">
+                                        <div class="item-num">9</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text4')}}</div>
+                                    </div>
+                                </div>
+                                <div class="base-data-item block-item">
+                                    <div class="item-icon"><Icon type="md-tennisball" /></div>
+                                    <div class="item-content">
+                                        <div class="item-num">48</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text5')}}</div>
+                                    </div>
+                                </div>
+                            </div>
                         </div>
-                    </div>
-                    <div class="exam-data-item block-item">
-                        <div class="item-content">
-                            <div class="item-num">1</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text9')}}</div>
+                        <!-- 评测数据统计部分 -->
+                        <div class="section">
+                            <div class="section-title">
+                                {{$t('totalAnalysis.ti_title2')}}
+                            </div>
+                            <div class="section-box">
+                                <div class="exam-data-item block-item">
+                                    <div class="item-content">
+                                        <div class="item-num">16</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text12')}}</div>
+                                    </div>
+                                </div>
+                                <div class="exam-data-item block-item">
+                                    <div class="item-content">
+                                        <div class="item-num">7</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text6')}}</div>
+                                    </div>
+                                </div>
+                                <div class="exam-data-item block-item">
+                                    <div class="item-content">
+                                        <div class="item-num">2</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text7')}}</div>
+                                    </div>
+                                </div>
+                                <div class="exam-data-item block-item">
+                                    <div class="item-content">
+                                        <div class="item-num">1</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text8')}}</div>
+                                    </div>
+                                </div>
+                                <div class="exam-data-item block-item">
+                                    <div class="item-content">
+                                        <div class="item-num">1</div>
+                                        <div class="item-name">{{$t('totalAnalysis.ti_text9')}}</div>
+                                    </div>
+                                </div>
+                            </div>
                         </div>
-                    </div>
-                    <div class="exam-data-item block-item">
-                        <div class="item-content">
-                            <div class="item-num">2</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text10')}}</div>
+                        <!-- 年级优生率统计部分 -->
+                        <div class="section">
+                            <div class="section-title">
+                                {{$t('totalAnalysis.ti_title4')}}
+                            </div>
+                            <div class="section-box">
+                                <div class="genius-data-item block-item">
+                                    <div class="select-grade">
+                                        <Select v-model="selectGrade">
+                                            <Option v-for="(item,index) in gradeList" :value="index" :key="index">{{ item }}</Option>
+                                        </Select>
+                                    </div>
+                                    <BaseGeniusLine echartsId="myLine"></BaseGeniusLine>
+                                </div>
+                            </div>
                         </div>
-                    </div>
-                    <div class="exam-data-item block-item">
-                        <div class="item-content">
-                            <div class="item-num">3</div>
-                            <div class="item-name">{{$t('totalAnalysis.ti_text11')}}</div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <!-- 学科对比统计部分 -->
-            <div class="section">
-                <div class="section-title">
-                    {{$t('totalAnalysis.ti_title3')}}
 
-                </div>
-                <div class="section-box">
-                    <div class="radar-data-item radar-data-item-active block-item" @click="isShowClassRadar = !isShowClassRadar">
-                        <p class="radar-title">高一年级</p>
-                        <BaseGradeRadar echartsId="myRadar"></BaseGradeRadar>
-                    </div>
-                    <div class="radar-data-item block-item">
-                        <p class="radar-title">高二年级</p>
-                        <BaseGradeRadar echartsId="myRadar2"></BaseGradeRadar>
-                    </div>
-                    <div class="radar-data-item block-item">
-                        <p class="radar-title">高三年级</p>
-                        <BaseGradeRadar echartsId="myRadar3"></BaseGradeRadar>
+                        <!-- 学科对比统计部分 -->
+                        <div class="section">
+                            <div class="section-title">
+                                {{$t('totalAnalysis.ti_title3')}}
+
+                            </div>
+                            <!-- 年级雷达图部分 -->
+                            <!--<div class="section-box grade-radar-box">
+                    <div class="radar-data-item radar-data-item-active block-item"
+                         @click="onGradeRadarClick(index)"
+                         v-for="(item,index) in gradeList"
+                         :key="index"
+                         :style="{ marginLeft:(index === 0 || index % 3 === 0 ? '0' : '3%' )}">
+                        <p class="radar-title">{{ item }}年级</p>
+                        <BaseGradeRadar :echartsId="'myRadar' + index"></BaseGradeRadar>
+                         班级雷达图部分
+                        <transition name="fade" v-if="index === activeGradeIndex ">
+                            <div class="section-box class-radar-box" v-if="isShowClassRadar">
+                                <span class="box-arrow" :style="{'left': arrowLeft}"></span>
+                                <div class="radar-data-item block-item"
+                                     v-for="(item,index) in classList"
+                                     :key="index"
+                                     :style="{ marginLeft:(index === 0 || index % 5 === 0 ? '0' : '1%' )}">
+                                    <p class="radar-title">高一 {{index + 1}} 班</p>
+                                    <BaseClassRadar :echartsId="'classRadar'+ index"></BaseClassRadar>
+                                </div>
+                            </div>
+                        </transition>
                     </div>
-                </div>
-                <transition name="fade">
-                    <div class="section-box class-radar-box" v-if="isShowClassRadar">
-                        <div class="radar-data-item block-item"
-                             v-for="(item,index) in classList"
-                             :key="index"
-                             :style="{ marginLeft:(index === 0 || index % 4 === 0 ? '0' : '4%' )}">
-                            <p class="radar-title">高一 {{index + 1}} 班</p>
-                            <BaseClassRadar :echartsId="'classRadar'+ index"></BaseClassRadar>
-                        </div>
+                </div>-->
+                            <Collapse v-model="currentPanel" accordion @on-change="onRadarChange">
+                                <Panel v-for="(grade,index) in gradeList"
+                                       :name="'panel' + index"
+                                       :key="index"
+                                       :style="{ marginLeft:(index === 0 || index % 3 === 0 ? '0' : '2%' )}">
+                                    <p class="radar-title">{{ grade }}年级</p>
+                                    <BaseGradeRadar :echartsId="'gradeRadar' + index"></BaseGradeRadar>
+                                    <p class="radar-details">查看班级</p>
+                                    <div slot="content">
+                                        <div class="section-box class-radar-box" :style="{'margin-left': panelLeft }" v-if="isShowClassRadar">
+                                            <span class="box-arrow" :style="{'left': arrowLeft}"></span>
+                                            <div class="radar-data-item block-item"
+                                                 v-for="(item,index2) in classList"
+                                                 :key="index2"
+                                                 :style="{ marginLeft:(index2 === 0 || index2 % 5 === 0 ? '0' : '1%' )}">
+                                                <p class="radar-title">{{ grade }} {{index2 + 1}} 班</p>
+                                                <BaseClassRadar :echartsId="'grade'+ index + 'c' + index2" :boxWidth="boxWidth"></BaseClassRadar>
+                                            </div>
+
+                                        </div>
+                                    </div>
+                                </Panel>
+                            </Collapse>
 
-                    </div>
-                </transition>
-            </div>
-            <!-- 年级优生率统计部分 -->
-            <div class="section">
-                <div class="section-title">
-                    {{$t('totalAnalysis.ti_title4')}}
-                </div>
-                <div class="section-box">
-                    <div class="genius-data-item block-item">
-                        <div class="select-grade">
-                            <Select v-model="selectGrade">
-                                <Option v-for="(item,index) in gradeList" :value="index" :key="index">{{ item }}</Option>
-                            </Select>
-                        </div>
-                        <BaseGeniusLine echartsId="myLine"></BaseGeniusLine>
-                    </div>
-                </div>
-            </div>
-            <!-- 评测列表数据部分 -->
-            <div class="section exam-list-wrap">
-                <div class="section-title">
-                    {{$t('totalAnalysis.ti_title5')}}
-                    <span class="filter-icon" @click="isShowFilter = !isShowFilter"><Icon type="ios-funnel" />{{$t('totalAnalysis.echarts_text10')}}</span>
-                </div>
-                <transition name="fade">
-                    <div class="el-filter-wrap" v-show="isShowFilter">
-                        <div class="el-filter-item">
-                            <span class="el-filter-title">{{$t('totalAnalysis.condition1')}}:</span>
-                            <RadioGroup v-model="filterPeriod" type="button" @on-change="filterPeriodChange">
-                                <Radio v-for="(item,index) in filterData.periodList" :label="item.name" :key="index">{{item.name}}</Radio>
-                            </RadioGroup>
-                        </div>
-                        <div class="el-filter-item">
-                            <span class="el-filter-title">{{$t('totalAnalysis.condition2')}}:</span>
-                            <RadioGroup v-model="filterGrade" type="button" @on-change="filterGradeChange">
-                                <Radio v-for="(item,index) in filterData.gradeList" :label="item.name" :key="index">{{item.name}}</Radio>
-                            </RadioGroup>
-                        </div>
-                        <div class="el-filter-item">
-                            <span class="el-filter-title">{{$t('totalAnalysis.condition3')}}:</span>
-                            <RadioGroup v-model="filterTerm" type="button" @on-change="filterTermChange">
-                                <Radio v-for="(item,index) in filterData.termList" :label="item.name" :key="index">{{item.name}}</Radio>
-                            </RadioGroup>
                         </div>
-                        <div class="el-filter-item">
-                            <span class="el-filter-title">{{$t('totalAnalysis.condition4')}}:</span>
-                            <RadioGroup v-model="filterType" type="button" @on-change="filterTypeChange">
-                                <Radio v-for="(item,index) in filterData.typeList" :label="item.name" :key="index">{{item.name}}</Radio>
-                            </RadioGroup>
+                    </TabPane>
+                    <TabPane label="评测数据" name="tab2">
+
+                        <!-- 评测列表数据部分 -->
+                        <div class="section exam-list-wrap">
+                            <div class="section-title">
+                                {{$t('totalAnalysis.ti_title5')}}
+                                <span class="filter-icon" @click="isShowFilter = !isShowFilter"><Icon type="ios-funnel" />{{$t('totalAnalysis.echarts_text10')}}</span>
+                            </div>
+                            <transition name="fade">
+                                <div class="el-filter-wrap" v-show="isShowFilter">
+                                    <div class="el-filter-item">
+                                        <span class="el-filter-title">{{$t('totalAnalysis.condition1')}}:</span>
+                                        <RadioGroup v-model="filterPeriod" type="button" @on-change="filterPeriodChange">
+                                            <Radio v-for="(item,index) in filterData.periodList" :label="item.name" :key="index">{{item.name}}</Radio>
+                                        </RadioGroup>
+                                    </div>
+                                    <div class="el-filter-item">
+                                        <span class="el-filter-title">{{$t('totalAnalysis.condition2')}}:</span>
+                                        <RadioGroup v-model="filterGrade" type="button" @on-change="filterGradeChange">
+                                            <Radio v-for="(item,index) in filterData.gradeList" :label="item.name" :key="index">{{item.name}}</Radio>
+                                        </RadioGroup>
+                                    </div>
+                                    <div class="el-filter-item">
+                                        <span class="el-filter-title">{{$t('totalAnalysis.condition3')}}:</span>
+                                        <RadioGroup v-model="filterTerm" type="button" @on-change="filterTermChange">
+                                            <Radio v-for="(item,index) in filterData.termList" :label="item.name" :key="index">{{item.name}}</Radio>
+                                        </RadioGroup>
+                                    </div>
+                                    <div class="el-filter-item">
+                                        <span class="el-filter-title">{{$t('totalAnalysis.condition4')}}:</span>
+                                        <RadioGroup v-model="filterType" type="button" @on-change="filterTypeChange">
+                                            <Radio v-for="(item,index) in filterData.typeList" :label="item.name" :key="index">{{item.name}}</Radio>
+                                        </RadioGroup>
+                                    </div>
+                                    <div class="el-filter-item">
+                                        <span class="el-filter-title">{{$t('totalAnalysis.condition5')}}:</span>
+                                        <RadioGroup v-model="filterArea" type="button" @on-change="filterAreaChange">
+                                            <Radio v-for="(item,index) in filterData.areaList" :label="item.name" :key="index">{{item.name}}</Radio>
+                                        </RadioGroup>
+                                    </div>
+                                    <div class="el-filter-item">
+                                        <span class="el-filter-title">{{$t('totalAnalysis.condition6')}}:</span>
+                                        <RadioGroup v-model="filterFeedback" type="button" @on-change="filterFeedbackChange">
+                                            <Radio v-for="(item,index) in filterData.feedbackList" :label="item.name" :key="index">{{item.name}}</Radio>
+                                        </RadioGroup>
+                                    </div>
+                                    <div class="el-filter-item">
+                                        <span class="el-filter-title">{{$t('totalAnalysis.condition7')}}:</span>
+                                        <RadioGroup v-model="filterSubject" type="button" @on-change="filterSubjectChange">
+                                            <Radio v-for="(item,index) in filterData.subjectList" :label="item.name" :key="index">{{item.name}}</Radio>
+                                        </RadioGroup>
+                                    </div>
+                                </div>
+                            </transition>
+                            <div class="el-bread">
+                                <!--<Icon type="ios-arrow-forward" />-->
+                                <span>{{$t('totalAnalysis.text5')}}:</span>
+                                <span v-if="!hasCondition">{{$t('totalAnalysis.text9')}}</span>
+                                <span v-for="(item,index) in filterList" :key="index" class="filter-item" v-if="item.val">{{item.val}} <Icon type="ios-close" @click="handleRemove(index,item.keyName)" /></span>
+                                <span class="list-length">{{$t('totalAnalysis.text6')}} : {{examList.length}} </span>
+                            </div>
+                            <div class="section-box list-box">
+                                <div class="no-data-text" v-if="!examList.length">暂无数据</div>
+                                <div class="genius-data-item exam-item" v-else v-for="(item,index) in examList" :key="index" @click="handleChooseExam(item,index)">
+                                    <div class="exam-info-top">
+                                        <span class="exam-type">{{item.conditions.range}}</span>
+                                        <span class="exam-name">{{item.name}}</span>
+                                        <span class="exam-grade">{{item.conditions.period + item.conditions.grade}}</span>
+                                        <span class="exam-subjects">
+                                            <span class="exam-subject" v-for="(subject,index) in item.conditions.subject" :key="index">{{ subject }}</span>
+                                        </span>
+                                    </div>
+                                    <div class="exam-info-bottom">
+                                        <span>{{$t('totalAnalysis.echarts_text11')}}: {{item.time}}</span>
+                                        <span>{{$t('totalAnalysis.echarts_text12')}}: {{item.stuCount}}</span>
+                                        <span>{{$t('totalAnalysis.echarts_text13')}}: 1680</span>
+                                        <span>{{$t('totalAnalysis.echarts_text14')}}: 98%</span>
+                                        <span>{{$t('totalAnalysis.echarts_text15')}}: 455</span>
+                                        <span>{{$t('totalAnalysis.echarts_text16')}}: 88%</span>
+                                    </div>
+                                </div>
+                                <Page />
+                            </div>
                         </div>
-                        <div class="el-filter-item">
-                            <span class="el-filter-title">{{$t('totalAnalysis.condition5')}}:</span>
-                            <RadioGroup v-model="filterArea" type="button" @on-change="filterAreaChange">
-                                <Radio v-for="(item,index) in filterData.areaList" :label="item.name" :key="index">{{item.name}}</Radio>
-                            </RadioGroup>
-                        </div>
-                        <div class="el-filter-item">
-                            <span class="el-filter-title">{{$t('totalAnalysis.condition6')}}:</span>
-                            <RadioGroup v-model="filterFeedback" type="button" @on-change="filterFeedbackChange">
-                                <Radio v-for="(item,index) in filterData.feedbackList" :label="item.name" :key="index">{{item.name}}</Radio>
-                            </RadioGroup>
-                        </div>
-                        <div class="el-filter-item">
-                            <span class="el-filter-title">{{$t('totalAnalysis.condition7')}}:</span>
-                            <RadioGroup v-model="filterSubject" type="button" @on-change="filterSubjectChange">
-                                <Radio v-for="(item,index) in filterData.subjectList" :label="item.name" :key="index">{{item.name}}</Radio>
-                            </RadioGroup>
-                        </div>
-                    </div>
-                </transition>
-                <div class="el-bread">
-                    <!--<Icon type="ios-arrow-forward" />-->
-                    <span>{{$t('totalAnalysis.text5')}}:</span>
-                    <span v-if="!hasCondition">{{$t('totalAnalysis.text9')}}</span>
-                    <span v-for="(item,index) in filterList" :key="index" class="filter-item" v-if="item.val">{{item.val}} <Icon type="ios-close" @click="handleRemove(index,item.keyName)" /></span>
-                    <span class="list-length">{{$t('totalAnalysis.text6')}} : {{examList.length}} </span>
-                </div>
-                <div class="section-box list-box">
-                    <div class="no-data-text" v-if="!examList.length">暂无数据</div>
-                    <div class="genius-data-item exam-item" v-else v-for="(item,index) in examList" :key="index" @click="handleChooseExam(item,index)">
-                        <div class="exam-info-top">
-                            <span class="exam-type">{{item.conditions.range}}</span>
-                            <span class="exam-name">{{item.name}}</span>
-                            <span class="exam-subjects">
-                                <span class="exam-subject" v-for="(subject,index) in item.conditions.subject" :key="index">{{ subject }}</span>
-                            </span>
-                        </div>
-                        <div class="exam-info-bottom">
-                            <span>{{$t('totalAnalysis.echarts_text11')}}: {{item.time}}</span>
-                            <span>{{$t('totalAnalysis.echarts_text12')}}: {{item.stuCount}}</span>
-                            <span>{{$t('totalAnalysis.echarts_text13')}}: 1680</span>
-                            <span>{{$t('totalAnalysis.echarts_text14')}}: 98%</span>
-                            <span>{{$t('totalAnalysis.echarts_text15')}}: 455</span>
-                            <span>{{$t('totalAnalysis.echarts_text16')}}: 88%</span>
-                        </div>
-                    </div>
-                    <Page />
-                </div>
+                    </TabPane>
+                </Tabs>
+
             </div>
-            </vuescroll>
+
+
+
+        </vuescroll>
     </div>
 </template>
 
@@ -251,11 +274,16 @@
         components: { BaseGradeRadar, BaseGeniusLine, BaseClassRadar },
         data() {
             return {
-                isShowClassRadar:false,
+                currentPanel: '',
+                panelLeft: 0,
+                boxWidth:292,
+                isShowClassRadar:true,
                 isShowFilter:false,
                 classList: new Array(11).fill("1"),
-                gradeList: ['高一', '高二', '高三'],
+                gradeList: ['高一', '高二', '高三','初一','初二','初三'],
                 semesterList: ['2019上学期', '2019下学期'],
+                activeGradeIndex: null,
+                arrowLeft:0,
                 selectSemester: 0,
                 selectGrade: 0,
                 contentLoading: false,
@@ -295,6 +323,24 @@
                 })
             },
 
+            // 年级雷达图点击
+            onRadarChange(val) {
+                if(!val.length) return
+                let num = Number(val[0].split('panel')[1]) + 1
+                //let num = index + 1
+                this.arrowLeft = num % 3 === 0 ? '83.5%' : ((num + 1) % 3 === 0 ? '49.5%' : '15%')
+                this.panelLeft = num % 3 === 0 ? '-68%' : ((num + 1) % 3 === 0 ? '-34%' : '0')
+
+                //if (index === this.activeGradeIndex) {
+                //    this.isShowClassRadar = !this.isShowClassRadar
+                //} else if (this.isShowClassRadar) {
+                //    this.activeGradeIndex = index
+                //} else {
+                //    this.isShowClassRadar = true
+                //    this.activeGradeIndex = index
+                //}
+            },
+
             handleSearch() {
                 let that = this
                 this.contentLoading = true
@@ -427,13 +473,69 @@
 </style>
 
 <style>
+    .index-container .ivu-tabs-bar {
+        border-bottom:1px solid #464646;
+    }
+
+    .index-container .ivu-tabs-nav .ivu-tabs-tab:active,
+    .index-container .ivu-tabs-nav .ivu-tabs-tab:hover,
+    .index-container .ivu-tabs-nav .ivu-tabs-tab-active,
+    .index-container .ivu-tabs-nav .ivu-tabs-tab{
+        color:#fff;
+        font-weight:bold;
+        font-size:16px;
+    }
+
+    .index-container .ivu-tabs-ink-bar {
+        height:4px;
+        background:#0087af;
+    }
+
+
+    .index-container .ivu-collapse{
+        display: flex;
+        flex-wrap: wrap;
+        margin-top: 50px;
+        background: none !important;
+        border: none !important;
+    }
+    .index-container .ivu-collapse-header{
+        height: auto !important;
+        line-height: auto !important;
+        background: #444444;
+        border:none !important;
+        border-radius:10px;
+        padding-top:10px;
+        padding-bottom:8px;
+    }
+
+     .index-container .ivu-collapse-item{
+        width: 32% !important;
+        border:none !important;
+        margin-top:2%;
+     }
+
+    .index-container .ivu-collapse-content{
+        background: none !important;
+        border: none !important;
+        padding: 0 !important;
+        width:1600px;
+
+    }
+
+    .index-container .ivu-icon-ios-arrow-forward {
+        display:none;
+    }
+
+
+
     .index-container .ivu-select {
         width: auto;
     }
 
     .index-container .ivu-select-selection {
         width: 150px;
-        background: none;
+        background: #777777;
         margin-left: 100px;
         border: 2px solid #737373;
     }
@@ -451,6 +553,9 @@
         width: 150px;
         min-width: 150px !important;
     }
+    .index-container .ivu-select-arrow {
+        color:#fff;
+    }
 
     .index-container .ivu-radio-group {
         padding-bottom: 4px;

+ 7 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.css

@@ -137,6 +137,13 @@ body, html, .total-container {
     font-size:14px;
 }
 
+    .total-content .basic-info .info-date-person .info-item {
+        margin-left: 20px;
+    }
+    .total-content .basic-info .info-date-person .info-item:first-child {
+        margin-left: 0;
+    }
+
 .total-content .basic-info .info-date {
     margin-left:50px;
 }

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

@@ -28,8 +28,14 @@
                             <span class="info-subject" v-for="(subject,index) in currentExamItem.conditions.subject" :key="index">{{subject.substr(0,1)}}</span>
                         </p>
                         <p class="info-date-person">
-                            <span class="info-person">{{$t('totalAnalysis.text7')}}:<span style="color:#fff">{{currentExamItem.stuCount}}人</span></span>
-                            <span class="info-date">{{$t('totalAnalysis.text8')}}:<span style="color:#fff">{{currentExamItem.time}}</span></span>
+                            <!--<span class="info-person">{{$t('totalAnalysis.text7')}}:<span style="color:#fff">{{currentExamItem.stuCount}}人</span></span>-->
+                            <!--<span class="info-date">{{$t('totalAnalysis.text8')}}:<span style="color:#fff">{{currentExamItem.time}}</span></span>-->
+                            <span class="info-item">{{$t('totalAnalysis.echarts_text11')}}: <span style="color:#fff;font-weight:bold">{{currentExamItem.time}}</span></span>
+                            <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">1680</span></span>
+                            <span class="info-item">{{$t('totalAnalysis.echarts_text14')}}: <span style="color:#fff;font-weight:bold">98%</span></span>
+                            <span class="info-item">{{$t('totalAnalysis.echarts_text15')}}: <span style="color:#fff;font-weight:bold">455</span></span>
+                            <span class="info-item">{{$t('totalAnalysis.echarts_text16')}}: <span style="color:#fff;font-weight:bold">88%</span></span>
                         </p>
                         <div class="basic-tools">
                             <span class="basic-tool-export" @click="handleExportTables"> {{$t('totalAnalysis.exportTable')}} <Icon type="md-archive" /></span>

+ 52 - 14
TEAMModelOS/Controllers/Analysis/AchievementController.cs

@@ -1246,9 +1246,10 @@ namespace TEAMModelOS.Controllers.Analysis
             List<ExamInfo> exams = await azureCosmosDBRepository.FindByDict<ExamInfo>(request.@params);
             HashSet<string> classList = new HashSet<string>();
             List<List<List<string>>> AllPoint = new List<List<List<string>>>();
+            List<List<List<string>>> AllPointAverage = new List<List<List<string>>>();
             List<double> CoreAverage = new List<double>();
             double weightSum = 0;
-            exams.ForEach( async e => {
+            foreach(ExamInfo e in exams) { 
                 Dictionary<string, object> sub = new Dictionary<string, object>
                 {
                     { "ExamCode",  e.id}
@@ -1257,6 +1258,7 @@ namespace TEAMModelOS.Controllers.Analysis
                 weightSum += weight;
                 List<string> subjects = new List<string>();
                 List<List<string>> SubjectClassAverage = new List<List<string>>();
+                List<List<string>> SubjectAverage = new List<List<string>>();
                 //List<List<string>> SubjectClassAverage = new List<List<string>>();
                 List<SimpleExam> simples = await azureCosmosDBRepository.FindByDict<SimpleExam>(sub);
                 // 学生总分
@@ -1273,6 +1275,7 @@ namespace TEAMModelOS.Controllers.Analysis
                     int sum = s.Point.Sum();  
                     //int stuSum = 0;
                     List<string> ClassAverage = new List<string>();
+                    List<string> Average = new List<string>();
                     List<string> passList = new List<string>();
                     s.Classes.ForEach(c =>
                     {
@@ -1282,8 +1285,10 @@ namespace TEAMModelOS.Controllers.Analysis
                         int classPoint = 0;
                         //初始化班级缺考人数
                         int classCount = 0;
-                        //初始化班级平均分
+                        //初始化班级平均
                         double points = 0;
+                        //初始化班级平均得分率
+                        double AveragePoints = 0;
                         //初始化各班参考人数
                         int counts = 0;
                         //c.Keys遍历key值
@@ -1307,38 +1312,71 @@ namespace TEAMModelOS.Controllers.Analysis
                             counts = value[1] - value[0] - classCount + 1;
                             //stuSum += counts;
                             points = Convert.ToDouble(classPoint) / counts / sum;
-                            ClassAverage.Add(points.ToString("0.00"));                          
+                            //计算每个班级平均得分
+                            AveragePoints = Convert.ToDouble(classPoint) / counts;
+                            ClassAverage.Add(points.ToString("0.000"));
+                            Average.Add(AveragePoints.ToString());
                         }
                     });                  
-                    SubjectClassAverage.Add(ClassAverage);                    
+                    SubjectClassAverage.Add(ClassAverage);
+                    SubjectAverage.Add(Average);
                     //subAverage = subjectPoint / ClassAverage.Count();
                     //subjectAverage.Add(subAverage.ToString("0.00"));
                 });
                 double core = coreSum / stuCount * weight;
                 CoreAverage.Add(core);
                 AllPoint.Add(SubjectClassAverage);
-                            
-            });
-            //成就指标
+                AllPointAverage.Add(SubjectAverage);
+
+
+            } 
+            //年级成就指标
             double index = CoreAverage.Sum() / weightSum;
-            List<List<double>> ww = new List<List<double>>();
-            
+            List<List<double>> AveragePoint = new List<List<double>>();
+            List<List<double>> AverageClassPoint = new List<List<double>>();
+            //List<double> ClassCore = new List<double>();
             int k = AllPoint.Count;
             for (int m = 0; m < AllPoint[0].Count; m++)
             {
-                List<double> qq = new List<double>();
+                List<double> SubjectAverage = new List<double>();
                 for (int n = 0; n < AllPoint[0][m].Count; n++)
                 {
                     double startPoint = 0;
                     for (int f = 0; f < k;f++) {
                         startPoint = double.Parse(AllPoint[f][m][n]) + startPoint;
                     }
-                    qq.Add(startPoint/k);
+                    SubjectAverage.Add(startPoint/k);
+                }
+                AveragePoint.Add(SubjectAverage);
+            }
+            //每个班级成就指标
+            int p = AllPointAverage.Count;
+            for (int m = 0; m < AllPointAverage[0].Count; m++)
+            {
+                List<double> SubjectAverage = new List<double>();
+                for (int n = 0; n < AllPointAverage[0][m].Count; n++)
+                {
+                    double startPoint = 0;
+                    for (int f = 0; f < k; f++)
+                    {
+                        startPoint = double.Parse(AllPointAverage[f][m][n]) + startPoint;
+                    }
+                    SubjectAverage.Add(startPoint / k);
+                }
+                AverageClassPoint.Add(SubjectAverage);
+            }
+            int c = AverageClassPoint.Count;
+            List<double> ClassCore = new List<double>();
+            for (int j = 0; j < AverageClassPoint[0].Count; j++)
+            {
+                double startAverage = 0;
+                for (int f = 0; f < c; f++)
+                {
+                    startAverage = AverageClassPoint[f][j] + startAverage;
                 }
-                ww.Add(qq);
+                ClassCore.Add(startAverage / weightSum);
             }
-            //AllPoint[0][0][0] + AllPoint[1][0][0];
-            builder.Data(ww);
+            builder.Data(ClassCore);
             return builder.build();
         }
     }