Forráskód Böngészése

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

zhouj1203@hotmail.com 4 éve
szülő
commit
d82066d15f
72 módosított fájl, 1914 hozzáadás és 2390 törlés
  1. 7 4
      TEAMModelFunction/TriggerSurvey.cs
  2. 5 2
      TEAMModelFunction/TriggerVote.cs
  3. 2 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Inner/BaseItem.cs
  4. 2 2
      TEAMModelOS.SDK/Models/Cosmos/Common/Survey.cs
  5. 2 2
      TEAMModelOS.SDK/Models/Cosmos/Common/Vote.cs
  6. 2 2
      TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs
  7. 0 293
      TEAMModelOS/ClientApp/src/common/BaseExamList.vue
  8. 5 1
      TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue
  9. 1 2
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseQnForm.vue
  10. 8 4
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseQuestionnaire.vue
  11. 1 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseBar.vue
  12. 1 0
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseEntryBar.vue
  13. 3 3
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue
  14. 1 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelPie.vue
  15. 3 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelRadar.vue
  16. 34 25
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue
  17. 1 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BasePie.vue
  18. 4 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue
  19. 0 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseScatter.vue
  20. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/BillBoardandLightBox.vue
  21. 0 2
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  22. 10 13
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue
  23. 2 2
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/completePaper.vue
  24. 2 2
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue
  25. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue
  26. 1 1
      TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue
  27. 226 193
      TEAMModelOS/ClientApp/src/css/site.css
  28. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js
  29. 15 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  30. 8 7
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  31. 3 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/utils.js
  32. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/index.js
  33. 58 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/knowledge.js
  34. 14 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  35. 9 8
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js
  36. 0 1
      TEAMModelOS/ClientApp/src/router/routes.js
  37. 14 3
      TEAMModelOS/ClientApp/src/utils/evTools.js
  38. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue
  39. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue
  40. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue
  41. 3 3
      TEAMModelOS/ClientApp/src/view/evaluation/types/BaseCompletion.vue
  42. 3 1
      TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue
  43. 3 1
      TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue
  44. 33 30
      TEAMModelOS/ClientApp/src/view/newcourse/ClassTable.vue
  45. 46 13
      TEAMModelOS/ClientApp/src/view/newcourse/CoursePlan.vue
  46. 36 30
      TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue
  47. 0 129
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.css
  48. 108 0
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.less
  49. 6 35
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue
  50. 32 32
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue
  51. 31 20
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue
  52. 16 6
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.less
  53. 155 279
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue
  54. 1 33
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.css
  55. 3 15
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue
  56. 4 5
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue
  57. 1 32
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.css
  58. 2 10
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue
  59. 17 15
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue
  60. 1 8
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.css
  61. 35 24
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue
  62. 1 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.css
  63. 69 62
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue
  64. 1 8
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.css
  65. 341 342
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  66. 37 16
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.less
  67. 443 320
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue
  68. 6 2
      TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue
  69. 0 187
      TEAMModelOS/Controllers/Common/SurveyController.cs
  70. 0 123
      TEAMModelOS/Controllers/Common/VoteController.cs
  71. 16 13
      TEAMModelOS/Controllers/School/CourseController.cs
  72. 11 1
      TEAMModelOS/Services/Common/ActivityStudentService.cs

+ 7 - 4
TEAMModelFunction/TriggerSurvey.cs

@@ -30,12 +30,15 @@ namespace TEAMModelFunction
             }
             }
             var adid = tdata.id;
             var adid = tdata.id;
             var adcode = "";
             var adcode = "";
+            string blobcntr = null;
             if (tdata.scope == "school")
             if (tdata.scope == "school")
             {
             {
                   adcode = $"Activity-{tdata.school}";
                   adcode = $"Activity-{tdata.school}";
+                blobcntr = tdata.school;
             }
             }
             else if (tdata.scope == "private"){
             else if (tdata.scope == "private"){
                 adcode = $"Activity-{tdata.creatorId}";
                 adcode = $"Activity-{tdata.creatorId}";
+                 blobcntr = tdata.creatorId;
             }
             }
             ActivityData data = null;
             ActivityData data = null;
             try
             try
@@ -159,9 +162,9 @@ namespace TEAMModelFunction
                         }
                         }
                         var cods = new { records = recs, userids };
                         var cods = new { records = recs, userids };
                         //问卷整体情况
                         //问卷整体情况
-                        await _azureStorage.UploadFileByContainer(survey.blobcntr, cods.ToJsonString(), "survey", $"{survey.id}/record.json");
+                        await _azureStorage.UploadFileByContainer(blobcntr, cods.ToJsonString(), "survey", $"{survey.id}/record.json");
                         //结算每道题的答题情况
                         //结算每道题的答题情况
-                        var ContainerClient =  _azureStorage.GetBlobContainerClient(survey.blobcntr);
+                        var ContainerClient =  _azureStorage.GetBlobContainerClient(blobcntr);
                         List<Task<string>> tasks = new List<Task<string>>();
                         List<Task<string>> tasks = new List<Task<string>>();
                         //获取
                         //获取
                         try {
                         try {
@@ -169,7 +172,7 @@ namespace TEAMModelFunction
                             List<SurveyRecord> surveyRecords = new List<SurveyRecord>();
                             List<SurveyRecord> surveyRecords = new List<SurveyRecord>();
                             foreach (string item in items)
                             foreach (string item in items)
                             {
                             {
-                                var Download = await _azureStorage.GetBlobContainerClient(survey.blobcntr).GetBlobClient(item).DownloadAsync();
+                                var Download = await _azureStorage.GetBlobContainerClient(blobcntr).GetBlobClient(item).DownloadAsync();
                                 var json = await JsonDocument.ParseAsync(Download.Value.Content);
                                 var json = await JsonDocument.ParseAsync(Download.Value.Content);
                                 var Record = json.RootElement.ToObject<SurveyRecord>();
                                 var Record = json.RootElement.ToObject<SurveyRecord>();
                                 surveyRecords.Add(Record);
                                 surveyRecords.Add(Record);
@@ -213,7 +216,7 @@ namespace TEAMModelFunction
                                         }
                                         }
                                     }
                                     }
                                 }
                                 }
-                                tasks.Add(  _azureStorage.UploadFileByContainer(survey.blobcntr, question.ToJsonString(), "survey", url));
+                                tasks.Add(  _azureStorage.UploadFileByContainer(blobcntr, question.ToJsonString(), "survey", url));
                             }
                             }
                             await Task.WhenAll(tasks);
                             await Task.WhenAll(tasks);
                         } catch (Exception ex) {
                         } catch (Exception ex) {

+ 5 - 2
TEAMModelFunction/TriggerVote.cs

@@ -28,13 +28,16 @@ namespace TEAMModelFunction
             }
             }
             var adid = tdata.id;
             var adid = tdata.id;
             var adcode = "";
             var adcode = "";
+            string blobcntr = null;
             if (tdata.scope == "school")
             if (tdata.scope == "school")
             {
             {
                 adcode = $"Activity-{tdata.school}";
                 adcode = $"Activity-{tdata.school}";
+                blobcntr = tdata.school;
             }
             }
             else if (tdata.scope == "private")
             else if (tdata.scope == "private")
             {
             {
                 adcode = $"Activity-{tdata.creatorId}";
                 adcode = $"Activity-{tdata.creatorId}";
+                blobcntr = tdata.creatorId;
             }
             }
             ActivityData data = null;
             ActivityData data = null;
             try
             try
@@ -168,11 +171,11 @@ namespace TEAMModelFunction
                         var gp = recordsBlob.GroupBy(x => x.userid).Select(x => new { key = x.Key, list = x.ToList() });
                         var gp = recordsBlob.GroupBy(x => x.userid).Select(x => new { key = x.Key, list = x.ToList() });
                         foreach (var g in gp)
                         foreach (var g in gp)
                         {
                         {
-                            tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, g.list.ToJsonString(), "vote", $"{vote.id}/urecord/{g.key}.json"));
+                            tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, g.list.ToJsonString(), "vote", $"{vote.id}/urecord/{g.key}.json"));
                         }
                         }
                         //处理活动方的记录, 
                         //处理活动方的记录, 
                         string url = $"/vote/{vote.id}/record.json";
                         string url = $"/vote/{vote.id}/record.json";
-                        tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, new { options = countcds, records = recordsBlob }.ToJsonString(), "vote", $"{vote.id}/record.json"));
+                        tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, new { options = countcds, records = recordsBlob }.ToJsonString(), "vote", $"{vote.id}/record.json"));
                         //处理投票者的记录
                         //处理投票者的记录
 
 
                         if (string.IsNullOrEmpty(vote.recordUrl))
                         if (string.IsNullOrEmpty(vote.recordUrl))

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Inner/BaseItem.cs

@@ -7,6 +7,8 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common.Inner
 {
 {
     public class BaseItem  : CosmosEntity
     public class BaseItem  : CosmosEntity
     {
     {
+        // 填空数量  
+        public int blankCount { get; set; }
         public bool objective { get; set; }
         public bool objective { get; set; }
         public string shaCode { get; set; }
         public string shaCode { get; set; }
         // 选项 单选 多选 判断
         // 选项 单选 多选 判断

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/Common/Survey.cs

@@ -20,9 +20,9 @@ namespace TEAMModelOS.SDK.Models
             tmdids = new List<string>();
             tmdids = new List<string>();
         }
         }
         /// <summary>
         /// <summary>
-        /// blob容器名
+        ///发布层级 类型 school  teacher
         /// </summary>
         /// </summary>
-        public string blobcntr { get; set; }
+        public string owner { get; set; }
         /// <summary>
         /// <summary>
         /// 学校编码或教室tmdid
         /// 学校编码或教室tmdid
         /// </summary>
         /// </summary>

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/Common/Vote.cs

@@ -21,9 +21,9 @@ namespace TEAMModelOS.SDK.Models
 
 
         }
         }
         /// <summary>
         /// <summary>
-        /// blob容器名
+        /// 发布层级 类型 school  teacher
         /// </summary>
         /// </summary>
-        public string blobcntr { get; set; }
+        public string owner { get; set; }
         /// <summary>
         /// <summary>
         /// 学校编码或教师tmdid
         /// 学校编码或教师tmdid
         /// </summary>
         /// </summary>

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs

@@ -23,9 +23,9 @@ namespace TEAMModelOS.SDK.Models
             classes = new List<string>();
             classes = new List<string>();
         }
         }
         /// <summary>
         /// <summary>
-        /// blob容器名
+        ///发布层级 类型 school  teacher
         /// </summary>
         /// </summary>
-        public string blobcntr { get; set; }
+        public string owner { get; set; }
         public string name { get; set; }
         public string name { get; set; }
         public string school { get; set; }
         public string school { get; set; }
         public string creatorId { get; set; }
         public string creatorId { get; set; }

+ 0 - 293
TEAMModelOS/ClientApp/src/common/BaseExamList.vue

@@ -1,293 +0,0 @@
-<template>
-    <div class="ex-list-container">
-        <div class="btn-more" @click="goEvaluationList">
-            <span style="font-size:14px"><Icon type="md-list-box" color="#a2a2a2" size="20" style="margin-right:5px;margin-bottom:5px;" />{{$t('totalAnalysis.newest')}}</span>
-            <span style="margin-top:2px">{{$t('totalAnalysis.more')}} <Icon type="ios-arrow-dropright" /></span>
-        </div>
-        <!-- 测验列表展示区域 -->
-        <div class="ex-list-wrap scrollstyle">
-            <vuescroll>
-                <div class="no-data-text" v-if="!examList.length">暂无数据</div>
-                <div v-else v-for="(item,index) in examList" :class="['list-item',examIndex == index ? 'list-item-active' : '']" :key="index" @click="handleExamClick(index,item)">
-                    <p class="list-item-type"><span class="type1" :style="{color:colorTransfer[item.conditions.range],borderColor:colorTransfer[item.conditions.range]}">{{item.conditions.range}}</span></p>
-                    <span class="list-item-name">{{item.name}}</span>
-                    <span class="list-item-info">{{item.stuCount}}人 | {{item.time || '2019-02-11'}}</span>
-                </div>
-            </vuescroll>
-        </div>
-    </div>
-</template>
-
-<script>
-    export default {
-        name: 'headers',
-        props: ['getExamIndex'],
-        data() {
-            return {
-                searchValue: '',
-                selectPeriod: 0,
-                selectGrade: 0,
-                selectTerm: 0,
-                selectExamType: 0,
-                periodList: ['所有学段', '高中', '初中'],
-                gradeList: [],
-                termList: [],
-                examTypeList: ['所有测验类型', '区域测验', '校内测验', '全国测验'],
-                examList: [],
-                examIndex: 0,
-                typesTransfer: {
-                    'A': '区域测验',
-                    'B': '校内测验',
-                    'C': '全国测验'
-                },
-                colorTransfer: {
-                    '校级测验': '#fbd103',
-                    '诊断测验': '#baecff',
-                    '全国测验': '#00ff8a'
-                }
-
-            }
-        },
-        created() {
-			if(this.getVuexExamList && this.getVuexExamList.length){
-				this.examList = this.getVuexExamList
-			}else{
-				this.getExamList()
-			}
-        },
-        methods: {
-            // 获取评测列表
-            getExamList() {
-                this.$api.totalAnalysis.getExamList({ code: this.$store.state.totalAnalysis.campusCode }).then(res => { // api请求
-                    if(res.result.data.length){
-						this.examList = res.result.data
-						this.handleExamClick(0,res.result.data[0])
-					}else{
-						this.examList = []
-						this.$Message.warning('暂无评测数据')
-					}
-					
-                }).catch(err => {
-                    console.log(err)
-                })
-            },
-            handleExamClick(index, item) {
-                let that = this
-                this.examIndex = index
-                this.$emit('chooseExam', item)
-                that.$router.push({ path: '/total', query: { index: index } })
-            },
-
-            // 查看更多评测列表
-            goEvaluationList() {
-				this.$router.push({
-					name: 'totalIndex',
-					params: {
-						tabName: 'tab2'
-					}
-				})
-            }
-        },
-        mounted() {
-            // this.$emit('chooseExam', this.examList[0]);
-        },
-		computed: {
-			getVuexExamList() {
-			    return this.$store.state.totalAnalysis.examList
-			},
-		},
-		watch:{
-			getVuexExamList(val) {
-				console.log(val)
-			    if(val.length){
-					this.examList = val
-				}
-			}
-		}
-    }
-</script>
-
-<style scoped>
-    .ex-list-container {
-        width: 300px;
-        height: 100%;
-        background: #191919;
-        display: flex;
-        flex-direction: column;
-    }
-
-    .ex-select-wrap {
-        padding: 10px 30px;
-        border-bottom: 1px solid rgba(128,128,128,.3);
-    }
-
-    .ex-list-container .no-data-text {
-        width: 100%;
-        font-size: 20px;
-        font-weight: bold;
-        color: #777777;
-        text-align: center;
-        padding-top: 30px;
-    }
-
-    .ex-list-wrap {
-        width: 100%;
-        overflow-y: auto;
-    }
-
-        .ex-list-wrap .list-item {
-            width: 100%;
-            padding: 20px 30px;
-            display: flex;
-            flex-direction: column;
-            justify-content: center;
-            border-bottom: 1px solid rgba(50,50,50,.35);
-            cursor: pointer;
-        }
-
-            .ex-list-wrap .list-item:hover {
-                background: #272727;
-            }
-
-        .ex-list-wrap .list-item-active {
-            background: #282828;
-        }
-
-        .ex-list-wrap .list-item .list-item-type .type1 {
-            padding: 2px 10px;
-            color: #fbd103;
-            border-radius: 10px;
-            border: 1px solid #fbd103;
-            font-size: 12px;
-        }
-
-        .ex-list-wrap .list-item .list-item-name {
-            font-size: 16px;
-            font-weight: 300;
-            color: #d0d0d0;
-            margin: 10px 0;
-        }
-
-        .ex-list-wrap .list-item .list-item-info {
-            font-size: 14px;
-            color: #a2a2a2;
-        }
-
-    .ex-list-container .btn-more {
-        width: 100%;
-        padding: 14px 10px 10px 10px;
-        color: #a2a2a2;
-        display: flex;
-        flex-direction: row;
-        justify-content: space-between;
-        cursor: pointer;
-        box-shadow: 0px 1px 3px 0px #5a5a5a;
-    }
-
-        .ex-list-container .btn-more .ivu-icon {
-            font-size: 16px;
-            margin-left: 2px;
-            margin-bottom: 4px;
-            vertical-align: middle;
-        }
-
-    /*滚动条样式重写*/
-    .scrollstyle::-webkit-scrollbar {
-        width: 5px;
-        display: none;
-    }
-
-    .scrollstyle:hover .scrollstyle::-webkit-scrollbar {
-        display: unset;
-    }
-
-    .scrollstyle::-webkit-scrollbar-track {
-        margin: 6px;
-        background: transparent;
-        display: none;
-    }
-
-    .scrollstyle::-webkit-scrollbar-thumb {
-        border-radius: 10px;
-        background: #94998a;
-    }
-
-        .scrollstyle::-webkit-scrollbar-thumb:hover {
-            /*background: #555;*/
-        }
-
-    .scrollstyle::-webkit-scrollbar-button {
-        display: none;
-    }
-
-    .fl-center {
-        display: flex;
-        align-items: center;
-        justify-content: center;
-    }
-
-    .fl-around {
-        display: flex;
-        align-items: center;
-        justify-content: space-around;
-    }
-</style>
-
-<style>
-
-    .ex-list-container .ivu-input {
-        border: none;
-        background: transparent;
-        border-bottom: 1px solid #595959;
-        height: 60px;
-        padding-left: 30px;
-        font-size: 16px;
-        font-weight: bold;
-        color: #a2a2a2;
-        box-shadow: none;
-        border-radius: 0;
-    }
-
-        .ex-list-container .ivu-input::-webkit-input-placeholder {
-            color: #616161;
-        }
-
-    .ex-select-wrap .ivu-select {
-        margin: 5px 0;
-        height: 40px;
-        color: #c5c8ce;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-selection {
-        height: 40px;
-        background: transparent;
-        border: none;
-        box-shadow: none;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-dropdown {
-        background: #3e3e3e;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-item {
-        color: #fff;
-    }
-
-        .ex-select-wrap .ivu-select-single .ivu-select-item:hover {
-            background: #5f5f5f;
-        }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-selected-value {
-        font-size: 16px;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-item-focus {
-        background: transparent;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-placeholder {
-        height: 40px;
-        line-height: 40px;
-        font-size: 16px;
-    }
-</style>

+ 5 - 1
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue

@@ -35,7 +35,7 @@
 						<div v-if="item.type !== 'compose'">
 						<div v-if="item.type !== 'compose'">
 							<!-- 答案展示部分 -->
 							<!-- 答案展示部分 -->
 							<div class="item-explain">
 							<div class="item-explain">
-								<span class="explain-title">【答ㅤ案】</span>
+								<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
 								<div class="item-explain-details">
 								<div class="item-explain-details">
 									<!-- 问答题答案 -->
 									<!-- 问答题答案 -->
 									<div v-if="item.type === 'subjective' || item.type === 'complete' || item.type === 'connector' || item.type === 'correct'">
 									<div v-if="item.type === 'subjective' || item.type === 'complete' || item.type === 'connector' || item.type === 'correct'">
@@ -214,6 +214,10 @@
 					);
 					);
 					if (exerciseItemDom.length) {
 					if (exerciseItemDom.length) {
 						this.$emit("pageScroll", exerciseItemDom[0].offsetTop);
 						this.$emit("pageScroll", exerciseItemDom[0].offsetTop);
+						exerciseItemDom[0].style.border = '3px solid #2db7f5'
+						setTimeout(() => {
+							exerciseItemDom[0].style.border = 'none'
+						},2000)
 					}
 					}
 				}
 				}
 
 

+ 1 - 2
TEAMModelOS/ClientApp/src/components/questionnaire/BaseQnForm.vue

@@ -171,10 +171,9 @@
 							params.endTime = this.qnForm.endTime
 							params.endTime = this.qnForm.endTime
 							params.description = this.qnForm.description
 							params.description = this.qnForm.description
 							// 新增参数
 							// 新增参数
+							params.owner = this.$route.name === 'personalSurvey' ? 'teacher' : 'school'
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
-							params.blobcntr = params.scope === 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
-							
 							
 							
 							// 如果是编辑状态 则直接复制ID 如果是新增 则直接赋值新ID
 							// 如果是编辑状态 则直接复制ID 如果是新增 则直接赋值新ID
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {

+ 8 - 4
TEAMModelOS/ClientApp/src/components/questionnaire/BaseQuestionnaire.vue

@@ -290,7 +290,6 @@
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						resolve(itemJson)
 						resolve(itemJson)
 					}catch(e){
 					}catch(e){
-						this.$Message.error(this.$t('survey.getFileFailTip'))
 						reject(e)
 						reject(e)
 					}
 					}
 				})
 				})
@@ -382,9 +381,14 @@
 					/** 编辑回显 */
 					/** 编辑回显 */
 					if (newValue && newValue.id) {
 					if (newValue && newValue.id) {
 						if(newValue.progress !== 'pending'){
 						if(newValue.progress !== 'pending'){
-							let records = await this.getQnRecord(newValue)
-							let items = await this.getBlobItems(newValue)
-							this.makeItemResult(records,items)
+							try{
+								let records = await this.getQnRecord(newValue)
+								let items = await this.getBlobItems(newValue)
+								this.makeItemResult(records,items)
+							}catch(e){
+								this.$Message.error(this.$t('survey.getFileFailTip'))
+							}
+							
 						}else{
 						}else{
 							this.items = await this.getBlobItems(newValue)
 							this.items = await this.getBlobItems(newValue)
 						}
 						}

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

@@ -157,6 +157,7 @@
                         containLabel: true,
                         containLabel: true,
                         height: 300,
                         height: 300,
                         width: '75%',
                         width: '75%',
+						right:'18%',
                         tooltip: {
                         tooltip: {
                             show: true,
                             show: true,
                             trigger: 'axis', // 触发类型
                             trigger: 'axis', // 触发类型
@@ -195,7 +196,6 @@
                     xAxis: {
                     xAxis: {
                         show: true, // 是否显示
                         show: true, // 是否显示
                         position: 'bottom', // x轴的位置
                         position: 'bottom', // x轴的位置
-                        offset: 0, // x轴相对于默认位置的偏移
                         type: 'category', // 轴类型, 默认为 'category'
                         type: 'category', // 轴类型, 默认为 'category'
                         name: '月份', // 轴名称
                         name: '月份', // 轴名称
                         nameLocation: 'end', // 轴名称相对位置
                         nameLocation: 'end', // 轴名称相对位置

+ 1 - 0
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseEntryBar.vue

@@ -57,6 +57,7 @@
                         containLabel: true,
                         containLabel: true,
                         height: 300,
                         height: 300,
                         width: '75%',
                         width: '75%',
+						right:'18%',
                         tooltip: {
                         tooltip: {
                             show: true,
                             show: true,
                             trigger: 'axis', // 触发类型
                             trigger: 'axis', // 触发类型

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

@@ -50,9 +50,9 @@
                     grid: {
                     grid: {
                         show: false, // 是否显示直角坐标系网格
                         show: false, // 是否显示直角坐标系网格
                         top: 80, // 相对位置 top\bottom\left\right
                         top: 80, // 相对位置 top\bottom\left\right
-						left:20,
+						left:'center',
 						width:'80%',
 						width:'80%',
-                        height: 480,
+                        height: 420,
                         containLabel: true // gird 区域是否包含坐标轴的刻度标签
                         containLabel: true // gird 区域是否包含坐标轴的刻度标签
                     },
                     },
                     dataZoom: [{
                     dataZoom: [{
@@ -61,7 +61,7 @@
                         'xAxisIndex': [
                         'xAxisIndex': [
                             0
                             0
                         ],
                         ],
-                        bottom: 10,
+                        bottom:60,
                         'start': 0,
                         'start': 0,
                         'end': 100,
                         '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',
                         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',

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

@@ -31,7 +31,7 @@
 						name: that.$t('totalAnalysis.le_title1'),
 						name: that.$t('totalAnalysis.le_title1'),
 						type: 'pie',
 						type: 'pie',
 						radius: [40, 150],
 						radius: [40, 150],
-						center: ['45%', 190],
+						center: ['45%', '60%'],
 						max: 100, // for funnel
 						max: 100, // for funnel
 						sort: 'ascending', // for funnel
 						sort: 'ascending', // for funnel
 						data: data
 						data: data

+ 3 - 1
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelRadar.vue

@@ -116,10 +116,12 @@
 			doRender(data) {
 			doRender(data) {
 				let list = data
 				let list = data
 				let indicator = []
 				let indicator = []
+				// 获取最大值 +5 设置到雷达边界最大值
+				let maxNum = Math.max(...data.per.map(i => Number(i) * 100)) + 5
 				list.pointList.forEach(item => {
 				list.pointList.forEach(item => {
 					indicator.push({
 					indicator.push({
 						name: item,
 						name: item,
-						max: 100
+						max: maxNum
 					})
 					})
 				})
 				})
 				this.drawLine(indicator, list.per.map(item => (Number(item) * 100).toFixed(2)))
 				this.drawLine(indicator, list.per.map(item => (Number(item) * 100).toFixed(2)))

+ 34 - 25
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue

@@ -2,23 +2,22 @@
     <div class="myTable">
     <div class="myTable">
         <!-- 科目选择以及表格备注 -->
         <!-- 科目选择以及表格备注 -->
         <div class="table-subject-select">
         <div class="table-subject-select">
-            <Select v-model="subjectSelectVal" style="width:150px" v-if="showSelect" @on-change="onSelectChange">
+            <!-- <Select v-model="subjectSelectVal" style="width:150px" v-if="showSelect" @on-change="onSelectChange">
                 <Option v-for="(item,index) in subjectList" :value="index" :key="index">{{ item }}</Option>
                 <Option v-for="(item,index) in subjectList" :value="index" :key="index">{{ item }}</Option>
-            </Select>
+            </Select> -->
+			<div class="myTable-title">{{ tableName }}</div>
             <div>
             <div>
                 <span @click="exportData(3)" class="table-export-btn"><Icon type="ios-share-alt" /> {{$t('totalAnalysis.exportTable').slice(0,2)}}</span>
                 <span @click="exportData(3)" class="table-export-btn"><Icon type="ios-share-alt" /> {{$t('totalAnalysis.exportTable').slice(0,2)}}</span>
-
                 <span class="table-tips" v-if="tips">{{tips}}</span>
                 <span class="table-tips" v-if="tips">{{tips}}</span>
                 <span class="table-tips" v-if="!tips"></span>
                 <span class="table-tips" v-if="!tips"></span>
             </div>
             </div>
             
             
         </div>
         </div>
-
         <!-- 表格组件 -->
         <!-- 表格组件 -->
         <Table :border="isShowBorder" ref="table" :data="tableData" :columns="tableColumns" @on-sort-change="onSortChange" @on-filter-change="onFilterChange"></Table>
         <Table :border="isShowBorder" ref="table" :data="tableData" :columns="tableColumns" @on-sort-change="onSortChange" @on-filter-change="onFilterChange"></Table>
 
 
         <!-- 表格分页组件 -->
         <!-- 表格分页组件 -->
-        <div style="margin: 10px;overflow: hidden">
+        <div style="margin: 10px;overflow: hidden" v-if="!noPage">
             <div style="float: right;margin-top: 20px;">
             <div style="float: right;margin-top: 20px;">
                 <Page show-total
                 <Page show-total
                       size="small"
                       size="small"
@@ -55,9 +54,17 @@
                 type: Boolean,
                 type: Boolean,
                 default: false
                 default: false
             },
             },
+			noPage: {
+			    type: Boolean,
+			    default: false
+			},
             tips: {
             tips: {
                 type: String,
                 type: String,
                 default: null
                 default: null
+            },
+			tableTitle: {
+                type: String,
+                default: null
             },
             },
             pageSize: {
             pageSize: {
                 type: Number,
                 type: Number,
@@ -125,6 +132,7 @@
 			
 			
 			// 排序操作
 			// 排序操作
             onSortChange(data) {
             onSortChange(data) {
+				console.log(data)
                 let order = data.order // 当前排序方式 升序、降序、正常
                 let order = data.order // 当前排序方式 升序、降序、正常
                 let key = data.key // 当前排序依据
                 let key = data.key // 当前排序依据
                 switch (order) {
                 switch (order) {
@@ -195,20 +203,6 @@
                 let that = this
                 let that = this
                 let row = params.row
                 let row = params.row
                 return h('span', {
                 return h('span', {
-                    on: {
-                        click: function () {
-                            that.$store.commit('updateExportTable', [{
-                                tableRef: 'earlyWarningTable',
-                                tableName: that.$t('totalAnalysis.myTable.rank')
-                            }])
-                            that.$router.push({ path: '/total/achievement/earlyWarning', query: { name: params.row.classId } })
-                        }
-                    },
-                    style: {
-                        cursor: 'pointer',
-                        color: '#00ffd2',
-                        fontWeight: 'bold'
-                    }
                 }, [
                 }, [
                     h('span', {
                     h('span', {
                         domProps: {
                         domProps: {
@@ -368,13 +362,17 @@
             renderHard(h, params) {
             renderHard(h, params) {
                 let that = this
                 let that = this
                 const list = params.row.hardList ? params.row.hardList.split(',') : params.row.itemNO.split(',')
                 const list = params.row.hardList ? params.row.hardList.split(',') : params.row.itemNO.split(',')
-                return h('span', list.map(function(item, index) {
+                return h('span', { style: {
+                            textAlign:'left'
+                        }},list.map(function(item, index) {
                     return h('span', {
                     return h('span', {
                         style: {
                         style: {
                             fontSize: '16px',
                             fontSize: '16px',
                             fontWeight: '600',
                             fontWeight: '600',
                             color: '#03efdb',
                             color: '#03efdb',
-                            cursor: 'pointer'
+                            cursor: 'pointer',
+							display: 'inline-block',
+							float: 'left'
                         },
                         },
                         on: {
                         on: {
                             'click': function() {
                             'click': function() {
@@ -397,7 +395,9 @@
                             fontSize: '16px',
                             fontSize: '16px',
                             fontWeight: '600',
                             fontWeight: '600',
                             color: '#03efdb',
                             color: '#03efdb',
-                            cursor: 'pointer'
+                            cursor: 'pointer',
+							display: 'inline-block',
+							float: 'left'
                             // textDecoration: "underline"
                             // textDecoration: "underline"
                         },
                         },
                         on: {
                         on: {
@@ -417,7 +417,11 @@
         },
         },
 
 
         mounted() {
         mounted() {
-            
+            if(this.noPage){
+				this.pageSizes = 999999
+				this.pageChange(1)
+				this.currentPage = 1
+			}
         },
         },
 
 
         computed: {
         computed: {
@@ -462,6 +466,7 @@
         /*height: 400px;*/
         /*height: 400px;*/
         /*padding: 20px 0;*/
         /*padding: 20px 0;*/
         padding-right: 20px;
         padding-right: 20px;
+		margin-top: 20px;
         margin: 0 auto;
         margin: 0 auto;
         display: block;
         display: block;
         user-select: none !important;
         user-select: none !important;
@@ -604,7 +609,7 @@
             font-weight: bold;
             font-weight: bold;
             position: absolute;
             position: absolute;
             right: 65px;
             right: 65px;
-            top: 15px;
+            top: 10px;
         }
         }
 
 
         .table-subject-select .ivu-select {
         .table-subject-select .ivu-select {
@@ -636,7 +641,7 @@
             width:50px;
             width:50px;
             position: absolute;
             position: absolute;
             right: 5px;
             right: 5px;
-            top: 15px;
+            top: 10px;
             cursor:pointer;
             cursor:pointer;
         }
         }
 
 
@@ -672,4 +677,8 @@
         line-height: 27px;
         line-height: 27px;
         font-size: 12px;
         font-size: 12px;
     }
     }
+	
+	.myTable .myTable-title{
+		font-size: 16px;
+	}
 </style>
 </style>

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

@@ -31,7 +31,7 @@
                         name: that.$t('totalAnalysis.ka_title1'),
                         name: that.$t('totalAnalysis.ka_title1'),
                         type: 'pie',
                         type: 'pie',
                         radius: [40, 150],
                         radius: [40, 150],
-                        center: ['45%', 190],
+                        center: ['45%', '60%'],
                         max: 100, // for funnel
                         max: 100, // for funnel
                         sort: 'ascending', // for funnel
                         sort: 'ascending', // for funnel
                         data: data
                         data: data

+ 4 - 2
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue

@@ -44,7 +44,7 @@
                                 padding: [13, 15]
                                 padding: [13, 15]
                             }
                             }
                         },
                         },
-                        center: ['50%', '50%'],
+                        center: ['50%', '62%'],
 						radius:'60%',
 						radius:'60%',
                         tooltip: {
                         tooltip: {
                             trigger: 'item'
                             trigger: 'item'
@@ -121,10 +121,12 @@
 
 
             doRender(data) {
             doRender(data) {
                 let indicator = []
                 let indicator = []
+				// 获取最大值 +5 设置到雷达边界最大值
+				let maxNum = Math.max(...data.per.map(i => Number(i) * 100)) + 5
                 data.pointList.forEach(item => {
                 data.pointList.forEach(item => {
                     indicator.push({
                     indicator.push({
                         name: item,
                         name: item,
-                        max: 100
+                        max: maxNum
                     })
                     })
                 })
                 })
                 this.drawLine(indicator, data.stupercent.grade.map(item => (Number(item)).toFixed(2)))
                 this.drawLine(indicator, data.stupercent.grade.map(item => (Number(item)).toFixed(2)))

+ 0 - 2
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseScatter.vue

@@ -42,7 +42,6 @@
 				// 基于准备好的dom,初始化echarts实例
 				// 基于准备好的dom,初始化echarts实例
 				let myScatter = this.$echarts.init(document.getElementById('myScatter'), 'chalk')
 				let myScatter = this.$echarts.init(document.getElementById('myScatter'), 'chalk')
 				let _this = this
 				let _this = this
-				console.log('落点图数据', data)
 				// 指定图表的配置项和数据
 				// 指定图表的配置项和数据
 				var option = {
 				var option = {
 					tooltip: {
 					tooltip: {
@@ -332,7 +331,6 @@
 			scatterData: {
 			scatterData: {
 				deep: true,
 				deep: true,
 				handler(val) {
 				handler(val) {
-					console.log('变化了',val)
 					if (val.length) {
 					if (val.length) {
 						this.drawLine(this.renderData(val)) // 获取最新落点图数据 进行渲染
 						this.drawLine(this.renderData(val)) // 获取最新落点图数据 进行渲染
 					} else {
 					} else {

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/BillBoardandLightBox.vue

@@ -47,7 +47,7 @@
                 targetImg: "",
                 targetImg: "",
                 columns: [
                 columns: [
                     {
                     {
-                        title: '投票时间',
+                        title: this.$t('studentWeb.vote.voteTime'),
                         key: 'time',
                         key: 'time',
                         sortable: true
                         sortable: true
                     },
                     },

+ 0 - 2
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -172,7 +172,6 @@
                 }
                 }
             },
             },
             async getPaper(data) {
             async getPaper(data) {
-                console.log('paper', data)
                 this.isExamDown = false
                 this.isExamDown = false
                 this.isLoad = true
                 this.isLoad = true
                 this.selectData = {}
                 this.selectData = {}
@@ -184,7 +183,6 @@
                         code: key[key.length - 1],
                         code: key[key.length - 1],
                         blob: data.blob
                         blob: data.blob
                     }
                     }
-                    console.log('评测信息',this.$store.getters.getItemTitle)
                     let exam = {}
                     let exam = {}
                     for (let item of this.examData) {
                     for (let item of this.examData) {
                         if (data.paperId == item.id) {
                         if (data.paperId == item.id) {

+ 10 - 13
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue

@@ -144,7 +144,6 @@
 					}
 					}
 				}
 				}
 				this.$forceUpdate()
 				this.$forceUpdate()
-				console.log(this.submitArr)
 			},
 			},
 
 
 			submitMessage() {
 			submitMessage() {
@@ -158,14 +157,14 @@
 				this.$api.studentWeb.answerSurvey(params).then(async res => {
 				this.$api.studentWeb.answerSurvey(params).then(async res => {
 					switch (res.msgid){
 					switch (res.msgid){
 						case 1:
 						case 1:
-							this.$Message.success('提交成功!')
+							this.$Message.success(this.$t('studentWeb.queNaire.submitSuccess'))
 							this.alreadyAnswered = true
 							this.alreadyAnswered = true
 							break;
 							break;
 						case 2:
 						case 2:
-							this.$Message.error('不在作答时间范围内!')
+                            this.$Message.error(this.$t('studentWeb.queNaire.overTime'))
 							break;
 							break;
 						case 3:
 						case 3:
-							this.$Message.error('作答数据有误!')
+                            this.$Message.error(this.$t('studentWeb.queNaire.answerErr'))
 							break;		
 							break;		
 						default:
 						default:
 							break;
 							break;
@@ -251,14 +250,14 @@
 			// 获取blob里的试题数据
 			// 获取blob里的试题数据
 			getBlobItems(qnItem) {
 			getBlobItems(qnItem) {
 				return new Promise(async (resolve, reject) => {
 				return new Promise(async (resolve, reject) => {
-					// let blobHost = qnItem.scope === 'private' ?  JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8")).blob_uri : JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
-					let blobUrl = JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
-					let blobHost = blobUrl.slice(0,blobUrl.lastIndexOf('/')) + '/' +  qnItem.blobcntr
+					let schoolBlobHost = JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
+					let privateBlobHost = schoolBlobHost.slice(0,schoolBlobHost.lastIndexOf('/')) + '/' +  qnItem.creatorId
+					let cntr = qnItem.scope === 'school' ? this.$store.state.userInfo.azp : qnItem.creatorId
+					let blobHost = qnItem.scope === 'school' ?  schoolBlobHost : privateBlobHost
 					// 根据试卷的Blob地址 去读取JSON文件
 					// 根据试卷的Blob地址 去读取JSON文件
-					let sasString = qnItem.scope === 'private' ? await this.$tools.getPrivateSas(qnItem
-						.blobcntr) : await this.$tools.getSchoolSas(qnItem.blobcntr)
+					let sasString = qnItem.scope === 'private' ? await this.$tools.getPrivateSas(cntr) : await this.$tools.getSchoolSas(cntr)
 					let promiseArr = []
 					let promiseArr = []
-					let indexJson = await this.getBlobJsonFile(qnItem.scope,qnItem.blob,qnItem.blobcntr)
+					let indexJson = await this.getBlobJsonFile(qnItem.scope,qnItem.blob,cntr)
 					if(indexJson.slides.length){
 					if(indexJson.slides.length){
 						for (let item of indexJson.slides) {
 						for (let item of indexJson.slides) {
 							promiseArr.push(new Promise(async (r, j) => {
 							promiseArr.push(new Promise(async (r, j) => {
@@ -294,7 +293,7 @@
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						resolve(itemJson)
 						resolve(itemJson)
 					}catch(e){
 					}catch(e){
-						this.$Message.error('文件获取失败!')
+                        this.$Message.error(this.$t('studentWeb.queNaire.fileErr'))
 						reject(e)
 						reject(e)
 					}
 					}
 				})
 				})
@@ -309,14 +308,12 @@
 		},
 		},
 
 
 		mounted() {
 		mounted() {
-			console.log('watch2')
 			this.getSurveyInfo()
 			this.getSurveyInfo()
 		},
 		},
 
 
 		watch: {
 		watch: {
 			$route: {
 			$route: {
 				handler() {
 				handler() {
-					console.log('watch')
 					this.getSurveyInfo()
 					this.getSurveyInfo()
 				},
 				},
 				// 深度观察监听
 				// 深度观察监听

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/completePaper.vue

@@ -1,8 +1,8 @@
 <template>
 <template>
     <div class="content" v-if="num.length > 0">
     <div class="content" v-if="num.length > 0">
         <div class="content-input" v-for="(item,index) of num" :key="index">
         <div class="content-input" v-for="(item,index) of num" :key="index">
-            <span class="complete-index">{{(index+1)}}:</span>
-            <Input @on-change="getInput(index)" v-model="examInfo[index]" placeholder="请输入填空内容" style="width:45%" />
+            <span class="complete-index">{{$t("studentWeb.exam.emput")}}{{(index+1)}}:</span>
+            <Input @on-change="getInput(index)" v-model="examInfo[index]" :placeholder="$t('studentWeb.exam.inputAnswers')" style="width:45%" />
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>

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

@@ -1,7 +1,7 @@
 <template>
 <template>
     <div class="content">
     <div class="content">
         <div id="textArea"> </div>
         <div id="textArea"> </div>
-        <Modal v-model="markStatus" fullscreen title="作答" footer-hide  ref="compose">
+        <Modal v-model="markStatus" fullscreen :title="$t('studentWeb.exam.answer')" footer-hide  ref="compose">
                 <BaseMyCanvas v-if="markStatus" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseMyCanvas>
                 <BaseMyCanvas v-if="markStatus" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseMyCanvas>
         </Modal>
         </Modal>
         <iframe class="frame" id="answerIframe" :srcdoc="itemInfo.question"></iframe>
         <iframe class="frame" id="answerIframe" :srcdoc="itemInfo.question"></iframe>
@@ -83,7 +83,7 @@
                     "image", // 插入图片
                     "image", // 插入图片
                 ]
                 ]
                 this.editor.config.zIndex = 1
                 this.editor.config.zIndex = 1
-                this.editor.config.placeholder = '请输入作答结果'
+                this.editor.config.placeholder = this.$t('studentWeb.exam.inputAnswers')
                 this.editor.config.height = 300
                 this.editor.config.height = 300
                 this.editor.config.showLinkImg = false;
                 this.editor.config.showLinkImg = false;
                 this.editor.config.uploadImgShowBase64 = true; // 使用 base64 保存图片不建议使用这种,我只是图个方便
                 this.editor.config.uploadImgShowBase64 = true; // 使用 base64 保存图片不建议使用这种,我只是图个方便

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue

@@ -249,7 +249,7 @@
 
 
         methods: {
         methods: {
             noData() {
             noData() {
-                this.$Message.warning('此功能暂未开放!')
+                this.$Message.warning(this.$t('studentWeb.public.notice'))
 
 
             },
             },
             getCurrentLang() {
             getCurrentLang() {

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

@@ -271,11 +271,11 @@
 							params.repeat = this.voteForm.repeat.indexOf('repeat') > -1
 							params.repeat = this.voteForm.repeat.indexOf('repeat') > -1
 							params.options = this.voteOptionsContent
 							params.options = this.voteOptionsContent
 							// 新增参数
 							// 新增参数
+							params.owner = this.$route.name === 'personalVote' ? 'teacher' : 'school'
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.voteNum = this.voteForm.selectMax
 							params.voteNum = this.voteForm.selectMax
 							params.times = this.voteForm.times
 							params.times = this.voteForm.times
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
-							params.blobcntr = params.scope === 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
 							
 							
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
 								params.id = this.editInfo.id
 								params.id = this.editInfo.id

+ 226 - 193
TEAMModelOS/ClientApp/src/css/site.css

@@ -1,80 +1,89 @@
-html{ /*黑色主題*/
-    --bg-color: #252525; /*背景顏色*/
+html {
+	/*黑色主題*/
+	--bg-color: #252525;
+	/*背景顏色*/
 }
 }
 
 
-html[white]{ /*白色主題*/
-    --bg-color: #fff; /*背景顏色*/    
+html[white] {
+	/*白色主題*/
+	--bg-color: #fff;
+	/*背景顏色*/
 }
 }
 
 
-.backdrop{
-    background-color: var(--bg-color);
-    width: 100%;
-    height: 100%;
+.backdrop {
+	background-color: var(--bg-color);
+	width: 100%;
+	height: 100%;
 }
 }
 
 
 /*基本亮背景*/
 /*基本亮背景*/
-.backdrop-light{
-    width: 100%;
-    height: 100%;
-    background-image: url('../assets/image/bak_light.jpg');
-    background-repeat: no-repeat;
-    background-attachment: fixed;
-    background-position: center;
-    background-size: cover;
+.backdrop-light {
+	width: 100%;
+	height: 100%;
+	background-image: url('../assets/image/bak_light.jpg');
+	background-repeat: no-repeat;
+	background-attachment: fixed;
+	background-position: center;
+	background-size: cover;
 }
 }
 
 
 /*基本暗背景*/
 /*基本暗背景*/
-.backdrop-dark{
-    width: 100%;
-    height: 100%;
-    background-image: url('../assets/image/bak_dark.jpg'); 
-    background-repeat: no-repeat;
-    background-attachment: fixed;
-    background-position: center;
-    background-size: cover;
+.backdrop-dark {
+	width: 100%;
+	height: 100%;
+	background-image: url('../assets/image/bak_dark.jpg');
+	background-repeat: no-repeat;
+	background-attachment: fixed;
+	background-position: center;
+	background-size: cover;
 }
 }
 
 
 /* 邊角框設計 
 /* 邊角框設計 
     使用時,最外層一定要有position: relative;
     使用時,最外層一定要有position: relative;
 */
 */
 .image-border {
 .image-border {
-    position: absolute;
-    width: 30px;
-    height: 30px;
-}        
+	position: absolute;
+	width: 30px;
+	height: 30px;
+}
+
 .image-border-left-top {
 .image-border-left-top {
-    top: -2px;
-    left: -2px;
-    border-left: 2px solid #B9C1AD;
-    border-top: 2px solid #B9C1AD;
+	top: -2px;
+	left: -2px;
+	border-left: 2px solid #B9C1AD;
+	border-top: 2px solid #B9C1AD;
 }
 }
+
 .image-border-right-top {
 .image-border-right-top {
-    top: -2px;
-    right: -2px;
-    border-right: 2px solid #B9C1AD;
-    border-top: 2px solid #B9C1AD;
-}   
+	top: -2px;
+	right: -2px;
+	border-right: 2px solid #B9C1AD;
+	border-top: 2px solid #B9C1AD;
+}
+
 .image-border-left-bottom {
 .image-border-left-bottom {
-    bottom: -2px;
-    left: -2px;
-    border-bottom: 2px solid #B9C1AD;
-    border-left: 2px solid #B9C1AD;
-}    
+	bottom: -2px;
+	left: -2px;
+	border-bottom: 2px solid #B9C1AD;
+	border-left: 2px solid #B9C1AD;
+}
+
 .image-border-lright-bottom {
 .image-border-lright-bottom {
-    bottom: -2px;
-    right: -2px;
-    border-right: 2px solid #B9C1AD;
-    border-bottom: 2px solid #B9C1AD;
+	bottom: -2px;
+	right: -2px;
+	border-right: 2px solid #B9C1AD;
+	border-bottom: 2px solid #B9C1AD;
 }
 }
 
 
 /* 拉軸隱藏
 /* 拉軸隱藏
 用兩個div將拉軸藏起來
 用兩個div將拉軸藏起來
 */
 */
-.scroll-outer-container{
-    position: relative;
-    overflow: hidden;
+.scroll-outer-container {
+	position: relative;
+	overflow: hidden;
 }
 }
-.scroll-outer-container .scroll-inner-container{
+
+.scroll-outer-container .scroll-inner-container {
 	position: absolute;
 	position: absolute;
 	left: 0;
 	left: 0;
 	top: 0;
 	top: 0;
@@ -86,158 +95,182 @@ html[white]{ /*白色主題*/
 
 
 /* 省略字符*/
 /* 省略字符*/
 .ellipsis {
 .ellipsis {
-    overflow:hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
 }
 }
 
 
 /* 拉軸固定黑色*/
 /* 拉軸固定黑色*/
 .scrollstyle::-webkit-scrollbar {
 .scrollstyle::-webkit-scrollbar {
-    width: 5px;
+	width: 5px;
 }
 }
+
 .scrollstyle::-webkit-scrollbar-track {
 .scrollstyle::-webkit-scrollbar-track {
-  margin: 6px;
-  background: transparent;
+	margin: 6px;
+	background: transparent;
 }
 }
+
 .scrollstyle::-webkit-scrollbar-thumb {
 .scrollstyle::-webkit-scrollbar-thumb {
-  border-radius: 10px;
-  background: #94998a;
+	border-radius: 10px;
+	background: #94998a;
 }
 }
+
 .scrollstyle::-webkit-scrollbar-thumb:hover {
 .scrollstyle::-webkit-scrollbar-thumb:hover {
-  /* background: #555; */
+	/* background: #555; */
 }
 }
+
 .scrollstyle::-webkit-scrollbar-button {
 .scrollstyle::-webkit-scrollbar-button {
-  display: none;
-}
-
-.leftInOut-enter-active, .leftInOut-leave-active {
-    transition: all 0.7s;
-}
-.leftInOut-enter, .leftInOut-leave-to /* .list-leave-active below version 2.1.8 */ {
-    opacity: 0;
-    transform: translateX(-150px);    
-}	
-
-	.richText-audio{
-		position: relative;
-		display: inline-flex;
-		flex-direction: column;
-		cursor: pointer;
-	}
-	
-	audio::-webkit-media-controls-enclosure{
-		border-radius: 0;
-	}
-	
-	audio::-internal-media-controls-overflow-button{
-		display: none;
-	}
-	
-	.w-e-toolbar .w-e-menu{
-		padding: 0 !important;
-		width: 35px !important;
-	}
-	
-	.w-e-menu .w-e-panel-container{
-		margin-left: 0 !important;
-	}
-	
-	.ivu-modal-fullscreen-no-footer .ivu-modal-confirm-footer{
-		display: none;
-	}
-	
-	.richText-audio{
-		vertical-align: middle;
-	}
-	
-	.richText-audio .audio-info{
-		padding: 8px;
-		background-color: #f1f3f4;
-		color: #000;
-		display: flex;
-		align-items: center;
-	}
-	
-	.richText-audio .audio-name{
-		font-size: 14px;
-	}
-
-	.richText-video {
-		position: relative;
-		display: inline-block;
-		cursor: pointer;
-		vertical-align: middle;
-	}
-
-	.richText-video::after {
-		content: '';
-		margin: auto;
-		width: 35px;
-		height: 35px;
-		background: url('../assets/icon/icon_play.png');
-		background-size: 100%;
-		position: absolute;
-		z-index: 999;
-		top: 0;
-		left: 0;
-		right: 0;
-		bottom: 0;
-	}
-	
-	
-	/* 修改iview Modal样式 */
-	
-	.related-modal .ivu-modal-content {
-		background: #3c3c3c;
-		overflow: hidden;
-		color: #fff;
-	}
-	
-	.related-modal .ivu-modal-body {
-		height: 400px;
-		padding: 20px;
-	}
-	
-	.related-modal .ivu-modal-body {
-		height: 700px;
-	}
-	
-	.related-modal .ivu-modal-header {
-		border-bottom: none;
-		font-size: 18px;
-		font-weight: bold;
-		padding: 25px;
-	}
-	
-	.related-modal .modal-content {
-		padding: 0 35px 30px 35px;
-	}
-	
-	.related-modal .modal-btn {
-		margin-left: 2%;
-		width: 96%;
-		height: 40px;
-		background: rgb(11, 151, 117);
-		border: none;
-		color: #fff;
-		margin-top: 30px;
-	}
-	
-	.related-modal .choose-content {
-		height: 85%;
-	}
-	
-	/*横向垂直水平居中*/
-	.flex-row-center {
-	    display: flex;
-	    flex-direction: row;
-	    justify-content: center;
-	    align-items: center;
-	}
-	/*向垂直水平居中*/
-	.flex-col-center {
-	    display: flex;
-	    flex-direction: column;
-	    justify-content: center;
-	    align-items: center;
-	}
+	display: none;
+}
+
+.leftInOut-enter-active,
+.leftInOut-leave-active {
+	transition: all 0.7s;
+}
+
+.leftInOut-enter,
+.leftInOut-leave-to
+
+/* .list-leave-active below version 2.1.8 */
+	{
+	opacity: 0;
+	transform: translateX(-150px);
+}
+
+.richText-audio {
+	position: relative;
+	display: inline-flex;
+	flex-direction: column;
+	cursor: pointer;
+}
+
+audio::-webkit-media-controls-enclosure {
+	border-radius: 0;
+}
+
+audio::-internal-media-controls-overflow-button {
+	display: none;
+}
+
+.w-e-toolbar .w-e-menu {
+	padding: 0 !important;
+	width: 35px !important;
+}
+
+.w-e-menu .w-e-panel-container {
+	margin-left: 0 !important;
+}
+
+.ivu-modal-fullscreen-no-footer .ivu-modal-confirm-footer {
+	display: none;
+}
+
+.richText-audio {
+	vertical-align: middle;
+}
+
+.richText-audio .audio-info {
+	padding: 8px;
+	background-color: #f1f3f4;
+	color: #000;
+	display: flex;
+	align-items: center;
+}
+
+.richText-audio .audio-name {
+	font-size: 14px;
+}
+
+.richText-video {
+	position: relative;
+	display: inline-block;
+	cursor: pointer;
+	vertical-align: middle;
+}
+
+.richText-video::after {
+	content: '';
+	margin: auto;
+	width: 35px;
+	height: 35px;
+	background: url('../assets/icon/icon_play.png');
+	background-size: 100%;
+	position: absolute;
+	z-index: 999;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+
+
+/* 修改iview Modal样式 */
+
+.related-modal .ivu-modal-content {
+	background: #3c3c3c;
+	overflow: hidden;
+	color: #fff;
+}
+
+.related-modal .ivu-modal-body {
+	height: 400px;
+	padding: 20px;
+}
+
+.related-modal .ivu-modal-body {
+	height: 700px;
+}
+
+.related-modal .ivu-modal-header {
+	border-bottom: none;
+	font-size: 18px;
+	font-weight: bold;
+	padding: 25px;
+}
+
+.related-modal .modal-content {
+	padding: 0 35px 30px 35px;
+}
+
+.related-modal .modal-btn {
+	margin-left: 2%;
+	width: 96%;
+	height: 40px;
+	background: rgb(11, 151, 117);
+	border: none;
+	color: #fff;
+	margin-top: 30px;
+}
+
+.related-modal .choose-content {
+	height: 85%;
+}
+
+/*横向垂直水平居中*/
+.flex-row-center {
+	display: flex;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
+
+/*向垂直水平居中*/
+.flex-col-center {
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+}
+
+.base-table-row {
+  padding: 0 100px 0 55px;
+  margin-top: 50px;
+}
+
+.component-title {
+	font-size: 16px;
+	font-weight: 300;
+	color: #fff;
+	margin: 30px 0 0 55px;
+	display: block;
+}

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js

@@ -30,7 +30,7 @@ import survey from './survey'
 import updModal from './updModal'
 import updModal from './updModal'
 import http from './http'
 import http from './http'
 import utils from './utils'
 import utils from './utils'
-
+import knowledge from './knowledge'
 export default {
 export default {
   schoolBaseInfo,
   schoolBaseInfo,
   classMgmt,
   classMgmt,
@@ -64,6 +64,7 @@ export default {
   updModal,
   updModal,
   http,
   http,
   utils,
   utils,
+  knowledge,
   test: '测试',
   test: '测试',
   formConfigP: {
   formConfigP: {
     input: '请输入',
     input: '请输入',

+ 15 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js

@@ -19,7 +19,8 @@ export default {
         privateVote: '个人投票',
         privateVote: '个人投票',
         schoolSurvey: '校级问卷',
         schoolSurvey: '校级问卷',
         privateSurvey: '个人问卷',
         privateSurvey: '个人问卷',
-        search: '请输入查询内容...'
+        search: '请输入查询内容...',
+        notice: '此功能暂未开放!'
     },
     },
     event: {
     event: {
         allStatus: '所有活动状态',
         allStatus: '所有活动状态',
@@ -207,7 +208,8 @@ export default {
         warning: '投票失败,请检查投票信息!',
         warning: '投票失败,请检查投票信息!',
         warning2: '已超出最大投票数!',
         warning2: '已超出最大投票数!',
         voteRes: '投票结果',
         voteRes: '投票结果',
-        voteRecord: '投票记录'
+        voteRecord: '投票记录',
+        voteTime: '投票时间'
     },
     },
     homework: {
     homework: {
         homeworkUpload: '作业上传区',
         homeworkUpload: '作业上传区',
@@ -378,7 +380,17 @@ export default {
         solution: '解答',
         solution: '解答',
         analysis: '解析',
         analysis: '解析',
         correctRate: '答对率',
         correctRate: '答对率',
-        relatedAQues: '关联题目'
+        relatedAQues: '关联题目',
+        answer: '作答',
+        inputAnswers: '请输入作答结果',
+        emput: '空',
+
+    },
+    queNaire: {
+        submitSuccess: '提交成功',
+        overTime: '不在作答时间范围内!',
+        answerErr: '作答数据错误!',
+        fileErr: '问价获取失败!'
     },
     },
     'informview-title': '通知总览',
     'informview-title': '通知总览',
     view: '前往检视',
     view: '前往检视',

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

@@ -80,7 +80,7 @@ export default {
 	goExamList:'查看更多评测',
 	goExamList:'查看更多评测',
 
 
     // AchievementAnalysis.vue
     // AchievementAnalysis.vue
-    ach_title1: '及格率统计',
+    ach_title1: '得分率统计',
     ach_title2: '均分分析',
     ach_title2: '均分分析',
     ach_title3: '进线人数统计',
     ach_title3: '进线人数统计',
     ach_title4: '进线情况统计',
     ach_title4: '进线情况统计',
@@ -94,7 +94,7 @@ export default {
     ach_text4: '班级平均分',
     ach_text4: '班级平均分',
     ach_text5: '校级平均分',
     ach_text5: '校级平均分',
     ach_text6: '区级平均分',
     ach_text6: '区级平均分',
-    ach_text7: '班级总人数',
+    ach_text7: '总人数',
     ach_text8: '进线总人数',
     ach_text8: '进线总人数',
     ach_text9: '进线率',
     ach_text9: '进线率',
     ach_text10: '当前班级',
     ach_text10: '当前班级',
@@ -136,7 +136,7 @@ export default {
     sca_text8: '偶尔粗心,准备不够充分',
     sca_text8: '偶尔粗心,准备不够充分',
     sca_text9: '学习不够充分,需要更加努力',
     sca_text9: '学习不够充分,需要更加努力',
     sca_text10: '学习极不稳定, 对考试没有充分准备',
     sca_text10: '学习极不稳定, 对考试没有充分准备',
-    sca_chart_text1: '通过率',
+    sca_chart_text1: '得分率',
     sca_chart_text2: '稳定度',
     sca_chart_text2: '稳定度',
     sca_table_text1: '答对题数',
     sca_table_text1: '答对题数',
     sca_table_text2: '答错题数',
     sca_table_text2: '答错题数',
@@ -216,9 +216,9 @@ export default {
     ka_table_text6: '得分率',
     ka_table_text6: '得分率',
     ka_table_text7: '涉及题号',
     ka_table_text7: '涉及题号',
     ka_table_text8: '平均得分率',
     ka_table_text8: '平均得分率',
-    ka_table_text9: '错题人',
-    ka_table_text10: 'RH错题人',
-    ka_table_text11: 'RL错题人',
+    ka_table_text9: '错题人',
+    ka_table_text10: 'RH错题人',
+    ka_table_text11: 'RL错题人',
 
 
     ka_tip1: '* RH:高分区段 / RL:低分区段',
     ka_tip1: '* RH:高分区段 / RL:低分区段',
 
 
@@ -260,7 +260,8 @@ export default {
 		option:'选项',
 		option:'选项',
 		answerRate:'选答率',
 		answerRate:'选答率',
 		RHRate:'高分组选答率',
 		RHRate:'高分组选答率',
-		RLRate:'低分组选答率'
+		RLRate:'低分组选答率',
+		tip:'* 绿色代表进线,蓝色代表踩线'
 	}
 	}
 
 
 }
 }

+ 3 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/utils.js

@@ -1,5 +1,7 @@
 export default {
 export default {
     uploadVideoLimit:'最多只能上传一个视频!',
     uploadVideoLimit:'最多只能上传一个视频!',
 	videoFormatError:'视频格式不正确!请重新选择!',
 	videoFormatError:'视频格式不正确!请重新选择!',
-	audioFormatError:'音频格式不正确!请重新选择!'
+	audioFormatError:'音频格式不正确!请重新选择!',
+	fileReadFail:'有试题数据读取失败!',
+	uploadLoading:'上传中...'
 }
 }

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

@@ -30,6 +30,7 @@ import survey from './survey'
 import updModal from './updModal'
 import updModal from './updModal'
 import http from './http'
 import http from './http'
 import utils from './utils'
 import utils from './utils'
+import knowledge from './knowledge'
 export default {
 export default {
   
   
   schoolBaseInfo,
   schoolBaseInfo,
@@ -64,6 +65,7 @@ export default {
   updModal,
   updModal,
   http,
   http,
   utils,
   utils,
+  knowledge,
   test: '測試',
   test: '測試',
   formConfigP: {
   formConfigP: {
     input: '請輸入',
     input: '請輸入',

+ 58 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/knowledge.js

@@ -0,0 +1,58 @@
+export default {
+    subject: '科目',
+    label: '名稱',
+    blockP: '請輸入知識塊名稱',
+    confirm: '確認',
+    blockWarning: '知識塊名稱不能為空!',
+    block: '知識塊',
+    knowledgeP: '請輸入知識點名稱,必填項',
+    knowledgeWarning: '知識點名稱不能為空! ',
+    newBlock: '新增知識塊',
+    addBlock: '添加知識塊',
+    inputBlock: '輸入知識塊名稱',
+    nowBlock: '現有知識塊',
+    nowBlockN: '選擇知識塊 ( *若所選知識塊內已存在添加的知識點則會覆蓋 )',
+    selectPoint: '已選知識點',
+    blockWarning2: '已存在同名知識塊,請修改名稱! ',
+    blockWarning3: '知識塊名稱不能為空',
+    blockWarning4: '無現有知識塊選擇',
+    period: '當前學段',
+    searchSubject: '搜索學科...',
+    blockCount: '知識塊數',
+    point: '知識點',
+    searchPoint: '搜索知識點...',
+    makeBlock: '組成知識塊',
+    edit: '編輯',
+    delete: '刪除',
+    moveBlock: '移出知識塊',
+    searchBlock: '搜索知識塊',
+    buildBlock: '新建知識塊',
+    pointCount: '知識點數:',
+    editBlock: '編輯知識塊',
+    addPoint: '新增知識點',
+    editPoint: '編輯知識點',
+    cancel: '取消',
+    notice: '提示',
+    content0: '確定將',
+    content2: '等',
+    content3: '個知識點移入到知識塊',
+    content1: '中(*已存在的知識點會自動忽略)',
+    notice1: '所選知識點已存在該知識塊中',
+    notice2: '該知識塊已存在當前知識點',
+    content4: '確定將知識點',
+    content5: '移入到知識塊',
+    content6: '中? ',
+    success: '操作成功! ',
+    fail: '操作失敗! ',
+    warn: '知識塊數據獲取失敗',
+    delBlock: '確認刪除該知識塊?',
+    delSuccess: '刪除成功',
+    delFail: '刪除失敗',
+    delPoint: '確認刪除該知識點?',
+    content7: '確定將知識點',
+    content8: '從知識塊',
+    content9: '中移出',
+    moveFail: '移出失敗',
+    saveSuccess: '保存數據成功! ',
+    saveFail: '保存數據失敗! '
+}

+ 14 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js

@@ -19,7 +19,8 @@ export default {
         privateVote: '個人投票',
         privateVote: '個人投票',
         schoolSurvey: '校級問卷',
         schoolSurvey: '校級問卷',
         privateSurvey: '個人問卷',
         privateSurvey: '個人問卷',
-        search: '請輸入查詢內容...'
+        search: '請輸入查詢內容...',
+        noitice: '此功能暫未開放!'
     },
     },
     event: {
     event: {
         allStatus: '所有活動狀態',
         allStatus: '所有活動狀態',
@@ -207,7 +208,8 @@ export default {
         warning: '投票失敗,請檢查投票信息! ',
         warning: '投票失敗,請檢查投票信息! ',
         warning2: '已超出最大投票數! ',
         warning2: '已超出最大投票數! ',
         voteRes: '投票結果',
         voteRes: '投票結果',
-        voteRecord: '投票記錄'
+        voteRecord: '投票記錄',
+        voteTime: '投票時間'
     },
     },
     homework: {
     homework: {
         homeworkUpload: '作業上傳區',
         homeworkUpload: '作業上傳區',
@@ -378,7 +380,16 @@ export default {
         solution: '解答',
         solution: '解答',
         analysis: '解析',
         analysis: '解析',
         correctRate: '答對率',
         correctRate: '答對率',
-        relatedAQues: '關聯題目'
+        relatedAQues: '關聯題目',
+        answer: '作答',
+        inputAnswers: '請輸入作答結果',
+        emput: '空'
+    },
+    queNaire: {
+        submitSuccess: '提交成功',
+        overTime: '不在作答時間範圍內! ',
+        answerErr: '作答數據錯誤! ',
+        fileErr: '問價獲取失敗! '
     },
     },
     'informview-title': '通知總覽',
     'informview-title': '通知總覽',
     view: '前往檢視',
     view: '前往檢視',

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

@@ -80,7 +80,7 @@ export default {
 	goExamList:'查看更多評測',
 	goExamList:'查看更多評測',
 
 
 	// AchievementAnalysis.vue
 	// AchievementAnalysis.vue
-	ach_title1: '及格率統計',
+	ach_title1: '得分率統計',
 	ach_title2: '均分分析',
 	ach_title2: '均分分析',
 	ach_title3: '進線人數統計',
 	ach_title3: '進線人數統計',
 	ach_title4: '進線情况統計',
 	ach_title4: '進線情况統計',
@@ -94,7 +94,7 @@ export default {
 	ach_text4: '班級平均分',
 	ach_text4: '班級平均分',
 	ach_text5: '校級平均分',
 	ach_text5: '校級平均分',
 	ach_text6: '區級平均分',
 	ach_text6: '區級平均分',
-	ach_text7: '班級總人數',
+	ach_text7: '總人數',
 	ach_text8: '進線總人數',
 	ach_text8: '進線總人數',
 	ach_text9: '進線率',
 	ach_text9: '進線率',
 	ach_text10: '當前班級',
 	ach_text10: '當前班級',
@@ -136,7 +136,7 @@ export default {
 	sca_text8: '偶爾粗心準備不够充分',
 	sca_text8: '偶爾粗心準備不够充分',
 	sca_text9: '學習不够充分需要更加努力',
 	sca_text9: '學習不够充分需要更加努力',
 	sca_text10: '學習極不穩定對考試沒有充分準備',
 	sca_text10: '學習極不穩定對考試沒有充分準備',
-	sca_chart_text1: '通過率',
+	sca_chart_text1: '得分率',
 	sca_chart_text2: '穩定度',
 	sca_chart_text2: '穩定度',
 	sca_table_text1: '答對題數',
 	sca_table_text1: '答對題數',
 	sca_table_text2: '答錯題數',
 	sca_table_text2: '答錯題數',
@@ -149,7 +149,7 @@ export default {
 	ta_title1: '試題落點分析',
 	ta_title1: '試題落點分析',
 	ta_title2: '年級單題得分率統計',
 	ta_title2: '年級單題得分率統計',
 	ta_title3: '試題分析總表',
 	ta_title3: '試題分析總表',
-	ta_title4: '試題得分率',
+	ta_title4: '試題得分率',
 
 
 	ta_text1: '區域',
 	ta_text1: '區域',
 	ta_text2: '區域特性',
 	ta_text2: '區域特性',
@@ -216,9 +216,9 @@ export default {
 	ka_table_text6: '得分率',
 	ka_table_text6: '得分率',
 	ka_table_text7: '涉及題號',
 	ka_table_text7: '涉及題號',
 	ka_table_text8: '平均得分率',
 	ka_table_text8: '平均得分率',
-	ka_table_text9: '錯題人',
-	ka_table_text10: 'RH錯題人',
-	ka_table_text11: 'RL錯題人',
+	ka_table_text9: '錯題人',
+	ka_table_text10: 'RH錯題人',
+	ka_table_text11: 'RL錯題人',
 
 
 	ka_tip1: '* RH:高分區段 / RL:低分區段',
 	ka_tip1: '* RH:高分區段 / RL:低分區段',
 
 
@@ -260,7 +260,8 @@ export default {
 		option:'選項',
 		option:'選項',
 		answerRate:'選答率',
 		answerRate:'選答率',
 		RHRate:'高分組選答率',
 		RHRate:'高分組選答率',
-		RLRate:'低分組選答率'
+		RLRate:'低分組選答率',
+		tip:'*綠色代表進線,藍色代表踩線'
 	}
 	}
 
 
 }
 }

+ 0 - 1
TEAMModelOS/ClientApp/src/router/routes.js

@@ -120,7 +120,6 @@ export const routes = [
 							resolve),
 							resolve),
 					},
 					},
 					{
 					{
-						// name: 'earlyWarning',
 						path: '/total/achievement/earlyWarning',
 						path: '/total/achievement/earlyWarning',
 						component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'],
 						component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'],
 							resolve)
 							resolve)

+ 14 - 3
TEAMModelOS/ClientApp/src/utils/evTools.js

@@ -27,6 +27,7 @@ export default {
 					answer:item.answer,
 					answer:item.answer,
 					explain:item.explain,
 					explain:item.explain,
 					type:item.type,
 					type:item.type,
+					objective:this.getItemType(item.type),
 					opts:item.option.length,
 					opts:item.option.length,
 					knowledge:item.knowledge,
 					knowledge:item.knowledge,
 					field:item.field,
 					field:item.field,
@@ -37,8 +38,10 @@ export default {
 					children:item.children || [],
 					children:item.children || [],
 					scope:item.scope,
 					scope:item.scope,
 					score: item.score||0,
 					score: item.score||0,
-					count: item.count||1,
+					blankCount: item.blankCount||1,
 					repair:item.repair,
 					repair:item.repair,
+					createTime:new Date().getTime(),
+					creator:store.state.userInfo.TEAMModelId || 'null'
 				},
 				},
 				item:[{
 				item:[{
 					type:'Html',
 					type:'Html',
@@ -61,6 +64,7 @@ export default {
 				scope:item.scope,
 				scope:item.scope,
 				score:item.score||0,
 				score:item.score||0,
 				type:item.type,
 				type:item.type,
+				objective:this.getItemType(item.type),
 				question:this.getSimpleText(item.question),
 				question:this.getSimpleText(item.question),
 				knowledge:item.knowledge,
 				knowledge:item.knowledge,
 				field:item.field,
 				field:item.field,
@@ -69,8 +73,10 @@ export default {
 				gradeIds:item.gradeIds,
 				gradeIds:item.gradeIds,
 				subjectId:item.subjectId,
 				subjectId:item.subjectId,
 				repair:item.repair,
 				repair:item.repair,
-				count: item.count || 1,
-				blob:item.blob
+				blankCount: item.blankCount || 1,
+				blob:item.blob,
+				createTime:new Date().getTime(),
+				creator:store.state.userInfo.TEAMModelId || 'null'
 			}
 			}
 			r(cosmosItem)
 			r(cosmosItem)
 		})
 		})
@@ -460,6 +466,11 @@ export default {
 		return html.replace(r, "");
 		return html.replace(r, "");
 	},
 	},
 	
 	
+	getItemType(type){
+		const objective = ['single','multiple','judge']
+		return objective.includes(type)
+	},
+	
 	getImgSrc(richtext) {
 	getImgSrc(richtext) {
 	    let imgList = [];
 	    let imgList = [];
 	    richtext.replace(/<video [^>]*src=['"]([^'"]+)[^>]*>/g, (match, capture) => {
 	    richtext.replace(/<video [^>]*src=['"]([^'"]+)[^>]*>/g, (match, capture) => {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue

@@ -248,7 +248,7 @@
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.answer = [this.$refs.complete.answerContent];
 						exerciseItem.answer = [this.$refs.complete.answerContent];
-						exerciseItem.count = this.$refs.complete.count || 1;
+						exerciseItem.blankCount = this.$refs.complete.blankCount || 1;
 						break;
 						break;
 					case "subjective":
 					case "subjective":
 						exerciseItem.question = this.$refs.subjective.stemContent;
 						exerciseItem.question = this.$refs.subjective.stemContent;

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue

@@ -279,7 +279,7 @@
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.answer = [this.$refs.complete.answerContent];
 						exerciseItem.answer = [this.$refs.complete.answerContent];
-						exerciseItem.count = this.$refs.complete.count || 1;
+						exerciseItem.blankCount = this.$refs.complete.blankCount || 1;
 						break;
 						break;
 					case "connector":
 					case "connector":
 						exerciseItem.question = this.$refs.connector.stemContent;
 						exerciseItem.question = this.$refs.connector.stemContent;

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

@@ -288,7 +288,7 @@
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.answer = [this.$refs.complete.answerContent];
 						exerciseItem.answer = [this.$refs.complete.answerContent];
-						exerciseItem.count = this.$refs.complete.count || 1;
+						exerciseItem.blankCount = this.$refs.complete.blankCount || 1;
 						break;
 						break;
 					case "subjective":
 					case "subjective":
 						exerciseItem.question = this.$refs.subjective.stemContent;
 						exerciseItem.question = this.$refs.subjective.stemContent;

+ 3 - 3
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseCompletion.vue

@@ -9,7 +9,7 @@
 		<div class="exersices-option">
 		<div class="exersices-option">
 			<IconText :text="$t('evaluation.completeCount')" :color="'#0e9c50'" :icon="'md-compass'"></IconText>
 			<IconText :text="$t('evaluation.completeCount')" :color="'#0e9c50'" :icon="'md-compass'"></IconText>
 			</br>
 			</br>
-			<InputNumber v-model="count" :min="1" :editable="false" size="large"></InputNumber>
+			<InputNumber v-model="blankCount" :min="1" :editable="false" size="large"></InputNumber>
 		</div>
 		</div>
 		<div class="exersices-option">
 		<div class="exersices-option">
 			<IconText :text="$t('evaluation.newExercise.answerTitle')" :color="'#FF871C'" :icon="'md-reorder'"></IconText>
 			<IconText :text="$t('evaluation.newExercise.answerTitle')" :color="'#FF871C'" :icon="'md-reorder'"></IconText>
@@ -33,12 +33,12 @@
 				stemEditor: null,
 				stemEditor: null,
 				answerContent: '',
 				answerContent: '',
 				answerEditor: null,
 				answerEditor: null,
-				count:1
+				blankCount:1
 			}
 			}
 		},
 		},
 		methods: {
 		methods: {
 			doRender(){
 			doRender(){
-				this.count = this.editInfo.count || 1
+				this.blankCount = this.editInfo.blankCount || this.editInfo.count || 1
 				this.stemContent = this.editInfo.question
 				this.stemContent = this.editInfo.question
 				this.answerContent = this.editInfo.answer
 				this.answerContent = this.editInfo.answer
 				this.stemEditor.txt.html(this.editInfo.question)
 				this.stemEditor.txt.html(this.editInfo.question)

+ 3 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue

@@ -665,7 +665,8 @@ export default {
                 endTime: this.evaluationInfo.endTime,
                 endTime: this.evaluationInfo.endTime,
                 scope: this.evaluationInfo.scope,
                 scope: this.evaluationInfo.scope,
                 createDate: Math.round(new Date()),
                 createDate: Math.round(new Date()),
-                blobcntr: this.evaluationInfo.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId //后面新增字段
+                // blobcntr: this.evaluationInfo.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId //后面新增字段 (废弃)
+                owner:'teacher' //后面新增字段
             }
             }
 
 
             this.$api.learnActivity.SaveExamInfo(requestData).then(
             this.$api.learnActivity.SaveExamInfo(requestData).then(
@@ -783,6 +784,7 @@ export default {
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
+                                paper.type.push(rule[i].slides[k].type) //后面新增字段, 保存每个题目类型
                             }
                             }
                         }
                         }
                         paperDto.push(paper)
                         paperDto.push(paper)

+ 3 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue

@@ -502,7 +502,8 @@ export default {
                 endTime: this.evaluationInfo.endTime,
                 endTime: this.evaluationInfo.endTime,
                 scope: this.mode,
                 scope: this.mode,
                 createDate: Math.round(new Date()),
                 createDate: Math.round(new Date()),
-                blobcntr: this.$store.state.userInfo.schoolCode //后面新增字段
+                // blobcntr: this.$store.state.userInfo.schoolCode //后面新增字段 (废弃)
+                owner:'school' //后面新增字段
             }
             }
 
 
             this.$api.learnActivity.SaveExamInfo(requestData).then(
             this.$api.learnActivity.SaveExamInfo(requestData).then(
@@ -607,6 +608,7 @@ export default {
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
+                                paper.type.push(rule[i].slides[k].type) //后面新增字段, 保存每个题目类型
                             }
                             }
                         }
                         }
                         paperDto.push(paper)
                         paperDto.push(paper)

+ 33 - 30
TEAMModelOS/ClientApp/src/view/newcourse/ClassTable.vue

@@ -111,7 +111,7 @@
                 </FormItem>
                 </FormItem>
                 <FormItem label="教师" prop="setTea">
                 <FormItem label="教师" prop="setTea">
                     <Select v-model="schd.setTea" filterable style="width:90%;" :not-found-text="schd.setCus ? '当前课程未添加授课老师' : '请先选择课程'">
                     <Select v-model="schd.setTea" filterable style="width:90%;" :not-found-text="schd.setCus ? '当前课程未添加授课老师' : '请先选择课程'">
-                        <Option v-for="(item,index) in cusTeaList" :key="index" :value="item.id">{{item.name}}</Option>
+                        <Option v-for="(item,index) in cusTeaList" :key="index" :value="item.id" @click.native="setTeaName(item)">{{item.name}}</Option>
                     </Select>
                     </Select>
                 </FormItem>
                 </FormItem>
             </Form>
             </Form>
@@ -134,7 +134,8 @@ export default {
         },
         },
         classId: {
         classId: {
             type: String,
             type: String,
-            default: ''
+            default: '',
+            required: true
         },
         },
         mode: {
         mode: {
             type: String,
             type: String,
@@ -148,7 +149,8 @@ export default {
             setClass: '',
             setClass: '',
             schd: {
             schd: {
                 setCus: '',
                 setCus: '',
-                setTea: ''
+                setTea: '',
+                teaName: ''
             },
             },
             ruleValidate: {
             ruleValidate: {
                 setCus: [
                 setCus: [
@@ -217,6 +219,10 @@ export default {
         }
         }
     },
     },
     methods: {
     methods: {
+        //设置教师姓名
+        setTeaName(data) {
+            this.schd.teaName = data.name
+        },
         //获取课程完整信息
         //获取课程完整信息
         getCusFullInfo(data) {
         getCusFullInfo(data) {
             let cusIndex = -1
             let cusIndex = -1
@@ -247,6 +253,7 @@ export default {
                 col,
                 col,
                 cusId: this.schd.setCus,
                 cusId: this.schd.setCus,
                 teaId: this.schd.setTea,
                 teaId: this.schd.setTea,
+                teaName: this.schd.teaName,
                 course: this.cusListShow.find(item => {
                 course: this.cusListShow.find(item => {
                     return item.id == this.schd.setCus
                     return item.id == this.schd.setCus
                 })
                 })
@@ -263,6 +270,7 @@ export default {
                     let data = this._.cloneDeep(this.selectInfo)
                     let data = this._.cloneDeep(this.selectInfo)
                     data.cusId = this.schd.setCus //当前设置的课程
                     data.cusId = this.schd.setCus //当前设置的课程
                     data.teaId = this.schd.setTea //当前设置的教师
                     data.teaId = this.schd.setTea //当前设置的教师
+                    data.teaName = this.schd.teaName //当前设置的教师名字
                     data.course = this.cusListShow.find(item => {
                     data.course = this.cusListShow.find(item => {
                         return item.id == this.schd.setCus
                         return item.id == this.schd.setCus
                     })
                     })
@@ -273,17 +281,7 @@ export default {
             })
             })
         },
         },
         cancelCell(row, col) {
         cancelCell(row, col) {
-            // let data = {
-            //     row,
-            //     col,
-            //     cusId: this.schd.setCus,
-            //     teaId: this.schd.setTea,
-            //     course: this.cusListShow.find(item => {
-            //         return item.id == this.schd.setCus
-            //     })
-            // }
-            // this.$emit('cancelCell', { row, col, setClass: row.weeklies[col].classId })
-            console.log(col,row)
+            this.$emit('cancelCell', { row, col })
         },
         },
         modalCancel() {
         modalCancel() {
 
 
@@ -413,25 +411,30 @@ export default {
                     }
                     }
                     // 根据课程数据补充课程表
                     // 根据课程数据补充课程表
                     this.schedData.forEach(cusItem => {
                     this.schedData.forEach(cusItem => {
-                        if (cusItem && cusItem.schedule) {
+                        if (cusItem.schedule) {
                             cusItem.schedule.forEach((schedItem, sIndex) => {
                             cusItem.schedule.forEach((schedItem, sIndex) => {
-                                let classInfo = this.classList.find(classItem => {
-                                    return classItem.id == schedItem.classId
-                                })
-                                if (this.classId) {
-                                    if (this.classId != schedItem.classId) {
-                                        return false
+                                // 只渲染当前班级的schedule
+                                if (schedItem.classId == this.classId) {
+                                    let classInfo = this.classList.find(classItem => {
+                                        return classItem.id == schedItem.classId
+                                    })
+                                    if (this.classId) {
+                                        if (this.classId != schedItem.classId) {
+                                            return false
+                                        }
                                     }
                                     }
+                                    schedItem.time.forEach(timeItem => {
+                                        if (timeItem.id == item.id) {
+                                            item.weeklies[timeItem.week].courseName = cusItem.name
+                                            item.weeklies[timeItem.week].courseId = cusItem.id
+                                            item.weeklies[timeItem.week].classId = schedItem.classId
+                                            item.weeklies[timeItem.week].className = classInfo ? classInfo.name : '--'
+                                            item.weeklies[timeItem.week].teacherName = schedItem.teacherName
+                                            item.weeklies[timeItem.week].teacherId = schedItem.teacherId
+                                        }
+                                    })
                                 }
                                 }
-                                schedItem.time.forEach(timeItem => {
-                                    if (timeItem.id == item.id) {
-                                        item.weeklies[timeItem.week].courseName = cusItem.name
-                                        item.weeklies[timeItem.week].courseId = cusItem.id
-                                        item.weeklies[timeItem.week].classId = schedItem.classId
-                                        item.weeklies[timeItem.week].classroomName = classInfo ? classInfo.name : '--'
-                                        item.weeklies[timeItem.week].teacherName = schedItem.teacherName
-                                    }
-                                })
+
                             })
                             })
 
 
                         }
                         }

+ 46 - 13
TEAMModelOS/ClientApp/src/view/newcourse/CoursePlan.vue

@@ -3,7 +3,6 @@
         <div class="class-list-wrap">
         <div class="class-list-wrap">
             <div class="class-list-header">
             <div class="class-list-header">
                 <div v-if="!isSearch">
                 <div v-if="!isSearch">
-                    <!-- <span>班级列表</span> -->
                     <BasePdSelect @pd-change="filterByPeriod"></BasePdSelect>
                     <BasePdSelect @pd-change="filterByPeriod"></BasePdSelect>
                     <Icon type="md-search" class="action-btn-icon" @click="toggleSearch" />
                     <Icon type="md-search" class="action-btn-icon" @click="toggleSearch" />
                 </div>
                 </div>
@@ -44,7 +43,7 @@
             <div class="cus-table-content dark-iview-table">
             <div class="cus-table-content dark-iview-table">
                 <vuescroll>
                 <vuescroll>
                     <!-- 班级课程表 -->
                     <!-- 班级课程表 -->
-                    <ClassTable v-if="this.classListShow[this.curClassIndex]" :schedData="classCus" :periodId="pdId" @selectCell="selectCell"></ClassTable>
+                    <ClassTable v-if="this.classListShow[this.curClassIndex]" :schedData="classCus" :classId="classListShow[curClassIndex].id" :periodId="pdId" @selectCell="selectCell" @cancelCell="cancelCell"></ClassTable>
                     <Loading v-if="isLoading" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
                     <Loading v-if="isLoading" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
                 </vuescroll>
                 </vuescroll>
             </div>
             </div>
@@ -321,7 +320,6 @@ export default {
         },
         },
         //设置课程事件
         //设置课程事件
         selectCell(data) {
         selectCell(data) {
-            console.log('设置数据', data)
             //data里面包含当前课程完整信息
             //data里面包含当前课程完整信息
             let course = data.course
             let course = data.course
             course.schedule = course.schedule || []
             course.schedule = course.schedule || []
@@ -339,6 +337,7 @@ export default {
                     notice: '',
                     notice: '',
                     stulist: '',
                     stulist: '',
                     teacherId: data.teaId,
                     teacherId: data.teaId,
+                    teacherName: data.teaName,
                     time: []
                     time: []
                 }
                 }
                 schedule.time.push({
                 schedule.time.push({
@@ -347,11 +346,29 @@ export default {
                 })
                 })
                 course.schedule.push(schedule)
                 course.schedule.push(schedule)
             }
             }
-            console.log(course)
-            this.updCusInfo(course)
+            this.updCusInfo(course, 'set')
+        },
+        //取消设置课程
+        cancelCell(data) {
+            let classId = this.classListShow[this.curClassIndex].id
+            let info = data.row.weeklies[data.col]
+            console.log(data)
+            let cus = this.allClassCus[classId].find(item => {
+                return item.id == info.courseId
+            })
+            cus.schedule.forEach(schdItem => {
+                if (schdItem.classId == classId && schdItem.teacherId == info.teacherId) {
+                    schdItem.time.forEach((item, index) => {
+                        if (item.id == data.row.id && item.week == data.col) {
+                            schdItem.time.splice(index, 1)
+                            this.updCusInfo(cus, 'cancel')
+                        }
+                    })
+                }
+            })
         },
         },
         // 更新课程数据
         // 更新课程数据
-        updCusInfo(course) {
+        updCusInfo(course, type) {
             course.code = course.code.replace('Course-', '')
             course.code = course.code.replace('Course-', '')
             this.$api.courseMgmt.saveOrUpdateCourse({
             this.$api.courseMgmt.saveOrUpdateCourse({
                 course: course,
                 course: course,
@@ -360,16 +377,32 @@ export default {
             }).then(
             }).then(
                 res => {
                 res => {
                     this.$Message.success(this.$t('cusMgt.updateOk'))
                     this.$Message.success(this.$t('cusMgt.updateOk'))
-                    //更新成功后,更新本地数据,刷新课程表
                     let classId = this.classListShow[this.curClassIndex].id
                     let classId = this.classListShow[this.curClassIndex].id
-                    this.allClassCus[classId] = this.allClassCus[classId] || []
-                    this.allClassCus[classId].forEach((item, index) => {
-                        if (item.id == course.id) {
-                            this.allClassCus[classId].splice(index, 1, course)
+                    if (type == 'set') {
+                        //更新成功后,更新本地数据,刷新课程表
+                        
+                        this.allClassCus[classId] = this.allClassCus[classId] || []
+                        let isExist = false
+                        this.allClassCus[classId].forEach((item, index) => {
+                            if (item.id == course.id) {
+                                this.allClassCus[classId].splice(index, 1, course)
+                                this.isExist = true
+                            }
+                        })
+                        if (!isExist) {
+                            this.allClassCus[classId].push(course)
                         }
                         }
-                    })
+                    } else {
+                        this.allClassCus[classId].forEach((item, index) => {
+                            if (item.id == course.id) {
+                                this.allClassCus[classId].splice(index, 1, course)
+                            }
+                        })
+                    }
+
                 }
                 }
-            ).catch(() => {
+            ).catch((e) => {
+                console.log('错啦',e)
                 this.$Message.error(this.$t('cusMgt.updateErr'))
                 this.$Message.error(this.$t('cusMgt.updateErr'))
             })
             })
         },
         },

+ 36 - 30
TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue

@@ -408,42 +408,48 @@
 			/* 获取当前问卷活动学生作答数据 */
 			/* 获取当前问卷活动学生作答数据 */
 			async getSurveyStudents(surveyItem) {
 			async getSurveyStudents(surveyItem) {
 				this.isLoading = true
 				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.stus.length) {
-						let list = []
-						res.stus.forEach(classStus => {
-							classStus.forEach(i => {
-								list.push({
-									id: i.id,
-									name: i.name,
-									no: i.no,
-									classroomName: i.className
+				try{
+					let answerdList = await this.getAnswerdRecord(surveyItem)
+					//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
+					this.$api.schoolSetting.getClassroomStudent({
+						school_code: this.$store.state.userInfo.schoolCode,
+						ids: surveyItem.classes,
+						scope:surveyItem.scope
+					}).then(res => {
+						if (!res.error && res.stus.length) {
+							let list = []
+							res.stus.forEach(classStus => {
+								classStus.forEach(i => {
+									list.push({
+										id: i.id,
+										name: i.name,
+										no: i.no,
+										classroomName: i.className
+									})
 								})
 								})
 							})
 							})
-						})
-						this.allSsList = list
-						// 要根据作答情况 结合两张表 处理表格显示的数据 
-						if (answerdList.length) {
-							this.noFinishStudents = this.getNoFinishList(answerdList,list)
+							this.allSsList = list
+							// 要根据作答情况 结合两张表 处理表格显示的数据 
+							if (answerdList.length) {
+								this.noFinishStudents = this.getNoFinishList(answerdList,list)
+							} else {
+								this.noFinishStudents = list
+							}
+							this.isLoading = false
 						} else {
 						} else {
-							this.noFinishStudents = list
+							this.$Message.error(this.$t('vote.getDataFailTip'))
+							this.isLoading = false
 						}
 						}
+					}).catch(err => {
+						console.log(err)
+						this.$Message.error(this.$t('vote.getClassDataFailTip'))
 						this.isLoading = false
 						this.isLoading = false
-					} else {
-						this.$Message.error(this.$t('vote.getDataFailTip'))
-						this.isLoading = false
-					}
-				}).catch(err => {
-					console.log(err)
-					this.$Message.error(this.$t('vote.getClassDataFailTip'))
+					})
+				}catch(e){
+					this.$Message.error(this.$t('vote.getDataFailTip'))
 					this.isLoading = false
 					this.isLoading = false
-				})
+				}
+				
 			},
 			},
 			
 			
 			/* 根据学生ID集合 来换取学生详细数据 */
 			/* 根据学生ID集合 来换取学生详细数据 */

+ 0 - 129
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.css

@@ -1,129 +0,0 @@
-
-.achievement-container {
-    display: flex;
-    flex-direction: column;
-    width: 100%;
-    color: #e4eadb;
-}
-
-    .achievement-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
-    .achievement-container .class-info {
-        position:relative;
-        font-size: 14px;
-        font-weight: bold;
-        color: #f1f1f1;
-        margin: 30px 0 10px 60px;
-        display: block;
-    }
-
-        .achievement-container .class-info .ivu-icon {
-            font-size: 26px;
-            color: #0bdfc4;
-            margin-right: 10px;
-        }
-
-        .achievement-container .class-info-back {
-            position:absolute;
-            right:40px;
-            top:0px;
-            color: #0bdfc4;
-            cursor:pointer;
-        }
-
-    .achievement-container .ivu-btn {
-        background: #447a94;
-        border:none;
-    }
-
-    .achievement-container .ivu-divider-horizontal {
-        background:#595959;
-        margin-top:50px;
-        margin-left:50px;
-    }
-
-    .achievement-container .component-percents {
-        display: flex;
-        flex-direction: row;
-        /*justify-content: space-around;*/
-        flex-wrap:wrap;
-		min-height: 160px;
-    }
-
-    .achievement-container .percent-item {
-        width:16%;
-        margin:20px 0;
-        min-width:250px;
-    }
-
-        .achievement-container .percent-item .percent-name {
-            font-size: 16px;
-            text-align: left;
-        }
-        .achievement-container .percent-item .percent-value {
-            font-size:48px;
-            font-weight:200;
-            padding-left:20px;
-            text-align:left;
-        }
-        .achievement-container .percent-item .percent-line {
-            width:3px;
-            height:30px;
-            display:inline-block;
-            background:#ffd800;
-            margin-right:30px;
-        }
-
-    .achievement-container .award-wrap {
-        margin-left:30px;
-        font-size:14px;
-        margin-bottom:10px;
-    }
-
-
-        .achievement-container .award-wrap .ivu-icon {
-            margin-left:40px;
-            margin-right:10px;
-            font-size:26px;
-        }
-
-        .achievement-container .award-class .ivu-divider-horizontal {
-            width: 90%;
-            min-width:90%;
-            margin-left: 5%;
-            margin-top:10px;
-        }
-
-        .achievement-container .award-item .award-class-list {
-            font-size: 28px;
-            font-weight:bold;
-        }
-
-        .achievement-container .award-item .award-class-type {
-            font-size: 14px;
-            font-weight: bold;
-            align-self:flex-start;
-            margin-top:10px;
-        }
-
-
-
-.base-table-row {
-    padding: 20px 100px 20px 80px;
-}
-
-.achievement-table .myTable {
-    height: 400px !important;
-    padding:0;
-}
-
-.fl-col-center {
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-}

+ 108 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.less

@@ -0,0 +1,108 @@
+.achievement-container {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  color: #e4eadb;
+  
+  .class-info {
+    position: relative;
+    font-size: 14px;
+    font-weight: bold;
+    color: #f1f1f1;
+    margin: 30px 0 10px 60px;
+    display: block;
+    .ivu-icon {
+      font-size: 26px;
+      color: #0bdfc4;
+      margin-right: 10px;
+    }
+  }
+  .class-info-back {
+    position: absolute;
+    right: 40px;
+    top: 0px;
+    color: #0bdfc4;
+    cursor: pointer;
+  }
+  .ivu-btn {
+    background: #447a94;
+    border: none;
+  }
+  .ivu-divider-horizontal {
+    background: #595959;
+    margin-top: 50px;
+    margin-left: 50px;
+  }
+  .component-percents {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+    min-height: 160px;
+  }
+  .percent-item {
+    width: 16%;
+    margin: 40px 0;
+    min-width: 250px;
+	padding-right: 40px;
+    .percent-name {
+      font-size: 16px;
+      text-align: left;
+    }
+    .percent-value {
+      font-size: 40px;
+      font-weight: 200;
+      padding-left: 20px;
+      text-align: left;
+    }
+    .percent-line {
+      width: 3px;
+      height: 30px;
+      display: inline-block;
+      background: #ffd800;
+      margin-right: 30px;
+    }
+  }
+  .award-wrap {
+    margin-left: 30px;
+    font-size: 14px;
+    margin-bottom: 10px;
+    .ivu-icon {
+      margin-left: 40px;
+      margin-right: 10px;
+      font-size: 26px;
+    }
+  }
+  .award-class {
+    .ivu-divider-horizontal {
+      width: 90%;
+      min-width: 90%;
+      margin-left: 5%;
+      margin-top: 10px;
+    }
+  }
+  .award-item {
+    .award-class-list {
+      font-size: 28px;
+      font-weight: bold;
+    }
+    .award-class-type {
+      font-size: 14px;
+      font-weight: bold;
+      align-self: flex-start;
+      margin-top: 10px;
+    }
+  }
+}
+
+.achievement-table {
+  .myTable {
+    height: 400px !important;
+    padding: 0;
+  }
+}
+.fl-col-center {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}

+ 6 - 35
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue

@@ -14,11 +14,7 @@
                 </div>
                 </div>
             </div>
             </div>
         </Row>
         </Row>
-        <Divider />
 		
 		
-		<!-- 均分分析 -->
-        <Row>
-        </Row>
         <Row>
         <Row>
 			<Col span="12">
 			<Col span="12">
 				<span class="component-title">{{$t('totalAnalysis.ach_title2')}}</span>
 				<span class="component-title">{{$t('totalAnalysis.ach_title2')}}</span>
@@ -29,7 +25,6 @@
 				<BaseEntryBar :echartData="classDatas" echartsId="entryNumberBar"></BaseEntryBar>
 				<BaseEntryBar :echartData="classDatas" echartsId="entryNumberBar"></BaseEntryBar>
 			</Col>
 			</Col>
         </Row>
         </Row>
-        <Divider />
 		
 		
 		<!-- 进线人数统计 -->
 		<!-- 进线人数统计 -->
 <!--        <Row>
 <!--        <Row>
@@ -42,17 +37,16 @@
 		
 		
 		<!-- 进线情况统计 -->
 		<!-- 进线情况统计 -->
         <EntryTables ref="entryTable"></EntryTables>
         <EntryTables ref="entryTable"></EntryTables>
-        <Divider />
 		
 		
 		<!-- 进线率统计 -->
 		<!-- 进线率统计 -->
-        <Row>
+<!--        <Row>
             <span class="component-title">{{$t('totalAnalysis.ach_title6')}}</span>
             <span class="component-title">{{$t('totalAnalysis.ach_title6')}}</span>
         </Row>
         </Row>
         <Row type="flex" justify="space-around" class-name="base-table-row">
         <Row type="flex" justify="space-around" class-name="base-table-row">
             <Col span="24" class-name="achievement-table">
             <Col span="24" class-name="achievement-table">
             <BaseTable :columns="tableColumns" :tableDatas="earlyWarningData" ref="achievementTable" :tableName="$t('totalAnalysis.ach_title6')"  tableRef="achievementTable"></BaseTable>
             <BaseTable :columns="tableColumns" :tableDatas="earlyWarningData" ref="achievementTable" :tableName="$t('totalAnalysis.ach_title6')"  tableRef="achievementTable"></BaseTable>
             </Col>
             </Col>
-        </Row>
+        </Row> -->
 
 
     </div>
     </div>
 </template>
 </template>
@@ -79,31 +73,6 @@
                         title: this.$t('totalAnalysis.base_class'),
                         title: this.$t('totalAnalysis.base_class'),
                         key: 'classId',
                         key: 'classId',
                         renderType: 'renderClassName',
                         renderType: 'renderClassName',
-                        // filters: [
-                        //     {
-                        //         label: this.$t('totalAnalysis.ach_table_text14'),
-                        //         value: 3
-                        //     },
-                        //     {
-                        //         label: this.$t('totalAnalysis.ach_table_text15'),
-                        //         value: 4
-                        //     },
-                        //     {
-                        //         label: this.$t('totalAnalysis.ach_table_text16'),
-                        //         value: 5
-                        //     }
-
-                        // ],
-                        // filterMultiple: false,
-                        // filterMethod(value, row) {
-                        //     if (value === 1) {
-                        //         return row.changesStatus === 1 && row.changesVal !== 0
-                        //     } else if (value === 2) {
-                        //         return row.changesStatus === -1 && row.changesVal !== 0
-                        //     } else {
-                        //         return row.changesStatus === 0
-                        //     }
-                        // }
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.ach_text7'),
                         title: this.$t('totalAnalysis.ach_text7'),
@@ -207,10 +176,12 @@
 			
 			
 			
 			
 			
 			
+			
+			
         },
         },
         mounted() {
         mounted() {
             this.$parent.dataSelectIndex = 0
             this.$parent.dataSelectIndex = 0
-            this.$refs.achievementTable.$el.childNodes[1].style.borderRight = '0'
+            // this.$refs.achievementTable.$el.childNodes[1].style.borderRight = '0'
 			
 			
 			
 			
 
 
@@ -277,4 +248,4 @@
     }
     }
 </script>
 </script>
 
 
-<style src="./AchievementAnalysis.css" scoped></style>
+<style src="./AchievementAnalysis.less" lang="less" scoped></style>

+ 32 - 32
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
     <div class="achievement-container">
     <div class="achievement-container">
-        <Row>
+<!--        <Row>
             <span class="class-info">
             <span class="class-info">
                 <Icon type="ios-ribbon" />{{$t('totalAnalysis.ach_text10')}}: <span style="color:#0bdfc4;font-size:16px;margin-right:20px"> {{className}} </span> {{$t('totalAnalysis.ach_text11')}}  <span style="color:#0bdfc4;font-size:20px"> {{ tableData.length }} </span>
                 <Icon type="ios-ribbon" />{{$t('totalAnalysis.ach_text10')}}: <span style="color:#0bdfc4;font-size:16px;margin-right:20px"> {{className}} </span> {{$t('totalAnalysis.ach_text11')}}  <span style="color:#0bdfc4;font-size:20px"> {{ tableData.length }} </span>
                 <span class="class-info-back">
                 <span class="class-info-back">
@@ -9,30 +9,15 @@
                     </Button>
                     </Button>
                 </span>
                 </span>
             </span>
             </span>
-        </Row>
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ach_title7')}}</span>
-        </Row>
-        <Row>
-
-        </Row>
-        <!-- PR排名表格 -->
-        <Row class-name="base-table-row">
-            <BaseTable :columns="earlyPercentColumns"
-                       :tableDatas="tableData"
-                       :tableName="$t('totalAnalysis.ach_title7')"
-                       tableRef="earlyWarningTable"
-                       ref="percentTable"
-                       v-show="warningIndex === 0"
-                       showSelect
-                       @onSelectChange="onSelectChange"></BaseTable>
-        </Row>
+        </Row> -->
+        
+       
         <!-- 班级均分分析 -->
         <!-- 班级均分分析 -->
         <Row class-name="averageBarRow">
         <Row class-name="averageBarRow">
             <span class="component-title">{{$t('totalAnalysis.ach_title8')}}</span>
             <span class="component-title">{{$t('totalAnalysis.ach_title8')}}</span>
             <div class="sort-box">
             <div class="sort-box">
                 <span style="font-size:14px;margin-right:10px;color: #a9a9a9;">{{$t('totalAnalysis.ach_chart_text1')}}:</span>
                 <span style="font-size:14px;margin-right:10px;color: #a9a9a9;">{{$t('totalAnalysis.ach_chart_text1')}}:</span>
-                <Select v-model="sortValue" style="width:160px" @on-change="handleSort">
+                <Select v-model="sortValue" style="width:120px" @on-change="handleSort">
                     <Option v-for="(item,index) in sortArr" :value="index" :label="item" :key="index"></Option>
                     <Option v-for="(item,index) in sortArr" :value="index" :label="item" :key="index"></Option>
                 </Select>
                 </Select>
             </div>
             </div>
@@ -40,6 +25,16 @@
         <Row>
         <Row>
             <div id="stuAverageBar"></div>
             <div id="stuAverageBar"></div>
         </Row>
         </Row>
+		<!-- PR排名表格 -->
+		<Row class-name="base-table-row">
+		    <BaseTable :columns="earlyPercentColumns"
+		               :tableDatas="tableData"
+		               :tableName="$t('totalAnalysis.ach_title7')"
+					   noPage
+		               tableRef="earlyWarningTable"
+		               ref="percentTable"
+		               v-show="warningIndex === 0"></BaseTable>
+		</Row>
     </div>
     </div>
 </template>
 </template>
 
 
@@ -121,6 +116,7 @@
         },
         },
 
 
         created() {
         created() {
+			console.log(this.$route.query)
             this.className = this.$route.query.name
             this.className = this.$route.query.name
         },
         },
 
 
@@ -260,6 +256,7 @@
                         height: 480,
                         height: 480,
                         width: '90%',
                         width: '90%',
                         x2: '5%',
                         x2: '5%',
+						left:'3%',
                         tooltip: {
                         tooltip: {
                             show: true,
                             show: true,
                             trigger: 'axis', // 触发类型
                             trigger: 'axis', // 触发类型
@@ -446,6 +443,19 @@
                 this.subjectList = this.getAnalysisJson.subjects.map(item => item.name)
                 this.subjectList = this.getAnalysisJson.subjects.map(item => item.name)
                 this.drawLine(this.tableData)
                 this.drawLine(this.tableData)
             }
             }
+			
+			this.$EventBus.$off('changeClassName')
+			this.$EventBus.$on('changeClassName',val => {
+				 this.className = val
+				 this.tableData = this.onGetClassTable(0)
+				 this.subjectList = this.getAnalysisJson.subjects.map(item => item.name)
+				 this.drawLine(this.tableData)
+			})
+			
+			this.$EventBus.$off('onEarlySubjectChange')
+			this.$EventBus.$on('onEarlySubjectChange',index => {
+				 this.onSelectChange(index)
+			})
         },
         },
 
 
         computed: {
         computed: {
@@ -459,23 +469,13 @@
 				this.tableData = this.onGetClassTable(0)
 				this.tableData = this.onGetClassTable(0)
 				this.subjectList = val.subjects.map(item => item.name)
 				this.subjectList = val.subjects.map(item => item.name)
 				this.drawLine(this.tableData)
 				this.drawLine(this.tableData)
-                // let totalItem = val.rankPR.splice(val.rankPR.length - 1, 1)
-                // let PRData = val.rankPR.unshift(totalItem)
-                // console.log(PRData)
-
-                // let keys = PRData[0].keys
-                // let datas = PRData[0].datas.filter(item => item.hasOwnProperty(this.className))[0]
-                // this.tableData = this.$tools.jsonTransform({ datas: datas, keys: keys })
-                // this.echartData = this.$tools.jsonTransform({ datas: datas, keys: keys })
-                // this.subjectList = val.average.datas.map(item => item.name)
-                // this.drawLine(this.echartData)
             }
             }
 
 
         }
         }
     }
     }
 </script>
 </script>
 
 
-<style src="./AchievementAnalysis.css" scoped></style>
+<style src="./AchievementAnalysis.less" lang="less" scoped></style>
 <style scoped>
 <style scoped>
     .early-warning-tab {
     .early-warning-tab {
         margin-left: 60px;
         margin-left: 60px;
@@ -505,7 +505,7 @@
 
 
     .sort-box {
     .sort-box {
         position: absolute;
         position: absolute;
-        right: 150px;
+        right: 50px;
         top: 20px;
         top: 20px;
     }
     }
 </style>
 </style>

+ 31 - 20
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue

@@ -1,8 +1,15 @@
 <template>
 <template>
     <div class="achievement-container">
     <div class="achievement-container">
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ach_title4')}}</span>
-        </Row>
+		<!-- 进线率统计 -->
+		<Row class-name="base-table-row">
+		    <BaseTable :columns="entryRateColumns"
+		               :tableName="$t('totalAnalysis.ach_title5')"
+		               :tableDatas="entryBarData"
+		               tableRef="entryRateTable"
+		               :isScroll="false"
+					   :tableTitle="$t('totalAnalysis.ach_title5')"
+		               ref="rateTable"></BaseTable>
+		</Row>
         <!-- 进线情况统计 -->
         <!-- 进线情况统计 -->
         <Row class-name="base-table-row">
         <Row class-name="base-table-row">
             <BaseTable ref="entryTable"
             <BaseTable ref="entryTable"
@@ -11,19 +18,8 @@
                        :tableDatas="entryTableData"
                        :tableDatas="entryTableData"
                        tableRef="entryTable"
                        tableRef="entryTable"
                        :pageSize="10"
                        :pageSize="10"
-                       :tips="'* 绿色代表进线,蓝色代表踩线'"></BaseTable>
-        </Row>
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ach_title5')}}</span>
-        </Row>
-        <!-- 进线率统计 -->
-        <Row class-name="base-table-row">
-            <BaseTable :columns="entryRateColumns"
-                       :tableName="$t('totalAnalysis.ach_title5')"
-                       :tableDatas="entryBarData"
-                       tableRef="entryRateTable"
-                       :isScroll="false"
-                       ref="rateTable"></BaseTable>
+					   :tableTitle="$t('totalAnalysis.ach_title4')"
+                       :tips="$t('totalAnalysis.myTable.tip')"></BaseTable>
         </Row>
         </Row>
     </div>
     </div>
 </template>
 </template>
@@ -107,7 +103,20 @@
                         renderType: function(h, params) {
                         renderType: function(h, params) {
                             return h('span', params.row.overAverageRate + '%')
                             return h('span', params.row.overAverageRate + '%')
                         }
                         }
-                    }
+                    },
+					{
+					    title: this.$t('totalAnalysis.ach_table_text3'),
+					    key:'average',
+					    renderType: function(h, params) {
+					        return h('span', (Number(params.row.average)).toFixed(2))
+					    },
+					    sortable: 'custom'
+					},
+					{
+					    title: this.$t('totalAnalysis.ach_table_text4'),
+					    key: 'standardDeviation',
+					    sortable: 'custom'
+					},
                 ]
                 ]
             }
             }
         },
         },
@@ -172,9 +181,12 @@
 						entryNum:classItem.lineCount,
 						entryNum:classItem.lineCount,
 						totalNum:classItem.stuCount,
 						totalNum:classItem.stuCount,
 						overAverageRate:classItem.stuCount > 0 ? ((classItem.lineCount / classItem.stuCount) * 100).toFixed(2) : 0.00,
 						overAverageRate:classItem.stuCount > 0 ? ((classItem.lineCount / classItem.stuCount) * 100).toFixed(2) : 0.00,
+						average:classItem.totalAverage,
+						standardDeviation:classItem.standardDeviation.toFixed(2),
 					})
 					})
 				})
 				})
-				let rateRanks = result.sort((a, b) => { return Number(a.overAverageRate) - Number(b.overAverageRate) })
+				/* 根据超均率 来对班级进行年级排名 */
+				let rateRanks = result.sort((a, b) => { return Number(b.average) - Number(a.average) })
 				result.forEach(item => {
 				result.forEach(item => {
 					item.gradeRank = rateRanks.map(i => i.name).indexOf(item.name) + 1
 					item.gradeRank = rateRanks.map(i => i.name).indexOf(item.name) + 1
 				})
 				})
@@ -206,5 +218,4 @@
         }
         }
     }
     }
 </script>
 </script>
-
-<style src="./AchievementAnalysis.css" scoped></style>
+<style src="./AchievementAnalysis.less" lang="less" scoped></style>

+ 16 - 6
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.less

@@ -6,11 +6,12 @@
         width: 100%;
         width: 100%;
         padding: 20px;
         padding: 20px;
         margin: 0 auto;
         margin: 0 auto;
+		font-weight: 300;
         /*max-width: 1600px;*/
         /*max-width: 1600px;*/
         user-select: none;
         user-select: none;
 
 
         &-title {
         &-title {
-            font-size: 18px;
+            font-size: 16px;
             font-weight: bold;
             font-weight: bold;
             color: #fff;
             color: #fff;
             position: relative;
             position: relative;
@@ -190,6 +191,8 @@
                 margin: 10px 0;
                 margin: 10px 0;
                 padding: 20px 0;
                 padding: 20px 0;
                 color: #fff;
                 color: #fff;
+				font-size: 12px;
+				font-weight: 300;
                 cursor: pointer;
                 cursor: pointer;
 
 
                 &:hover {
                 &:hover {
@@ -214,7 +217,7 @@
                     }
                     }
 
 
                     .exam-name {
                     .exam-name {
-                        font-size: 22px;
+                        font-size: 18px;
                         margin-right: 10px;
                         margin-right: 10px;
 						vertical-align: text-bottom;
 						vertical-align: text-bottom;
                     }
                     }
@@ -224,6 +227,10 @@
                         padding: 1px 5px;
                         padding: 1px 5px;
                         margin-left: 5px;
                         margin-left: 5px;
                         vertical-align: super;
                         vertical-align: super;
+						
+						&:first-child{
+							margin-left: 0;
+						}
                     }
                     }
                 }
                 }
 
 
@@ -236,7 +243,6 @@
 
 
                     span {
                     span {
                         margin-left: 25px;
                         margin-left: 25px;
-                        font-size: 14px;
                     }
                     }
                 }
                 }
             }
             }
@@ -288,6 +294,7 @@
             margin-top: 20px;
             margin-top: 20px;
             border-radius: 5px;
             border-radius: 5px;
             padding: 20px;
             padding: 20px;
+			font-size: 12px;
             background: #404040;
             background: #404040;
             overflow: hidden;
             overflow: hidden;
 
 
@@ -297,6 +304,10 @@
 
 
             .el-filter-item {
             .el-filter-item {
                 margin-top: 10px;
                 margin-top: 10px;
+				
+				.ivu-radio-wrapper{
+					font-size: 12px !important;
+				}
 
 
                 .el-filter-title {
                 .el-filter-title {
                     font-size: 14px;
                     font-size: 14px;
@@ -337,10 +348,9 @@
         .filter-item {
         .filter-item {
             background: #0087af;
             background: #0087af;
             color: #fff;
             color: #fff;
-            padding: 5px 10px;
+            padding: 2px 5px;
             margin-left: 15px;
             margin-left: 15px;
-            border-radius: 5px;
-            font-size: 12px;
+			font-size: 12px;
         }
         }
 
 
         .filter-item .ivu-icon {
         .filter-item .ivu-icon {

+ 155 - 279
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue

@@ -3,208 +3,170 @@
 		<Loading v-show="isLoadingList"></Loading>
 		<Loading v-show="isLoadingList"></Loading>
 		<vuescroll ref="vs">
 		<vuescroll ref="vs">
 			<!--学校名称部分 -->
 			<!--学校名称部分 -->
-			<div class="section school-info">
+			<!-- 			<div class="section school-info">
 				<div class="school-info-box">
 				<div class="school-info-box">
 					<span class="school-info-name">{{ schoolData.name }}{{ $t('totalAnalysis.totalIndex.title') }}</span>
 					<span class="school-info-name">{{ schoolData.name }}{{ $t('totalAnalysis.totalIndex.title') }}</span>
-					<div class="select-grade select-semester">
-						<!-- <Select v-model="selectSemester">
-							<Option v-for="(item, index) in semesterList" :value="index" :key="index">{{ item }}</Option>
-						</Select> -->
-					</div>
 				</div>
 				</div>
-			</div>
+			</div> -->
 			<div class="section">
 			<div class="section">
-				<Tabs :value="tabName">
-					<TabPane :label="$t('totalAnalysis.totalIndex.tab1')" name="tab1">
-						<!-- 评测数据统计部分 -->
-						<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">{{ originList.length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text12") }}
-										</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">{{ originList.length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text12") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">{{ originList.filter(i => i.type === 'regular').length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text6") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">{{ originList.filter(i => i.type === 'regular').length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text6") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">{{ originList.filter(i => i.type === 'simulation').length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text7") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">{{ originList.filter(i => i.type === 'simulation').length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text7") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">{{ originList.filter(i => i.type === 'normal').length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text8") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">{{ originList.filter(i => i.type === 'normal').length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text8") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">0</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text9") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">0</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text9") }}
 								</div>
 								</div>
 							</div>
 							</div>
 						</div>
 						</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>
 
 
-						<!-- 学科对比统计部分 -->
-						<div class="section">
-							<div class="section-title">
-								{{ $t("totalAnalysis.ti_title3") }}
+					<transition name="indexFade">
+						<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 schoolData.period" :label="item.name" :key="index">{{ item.name }}</Radio>
+								</RadioGroup>
 							</div>
 							</div>
-							<div v-if="gradeList.length === 0" style="margin-top: 60px">
-								<EmptyData></EmptyData>
+							<div class="el-filter-item">
+								<span class="el-filter-title">{{ $t("totalAnalysis.condition2") }}:</span>
+								<RadioGroup v-model="filterGrade" type="button" @on-change="filterGradeChange">
+									<Radio label="全部">全部</Radio>
+									<Radio v-for="(item, index) in filterGradeList" :label="item.name" :key="index">{{ item.name }}</Radio>
+								</RadioGroup>
 							</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 % 4 === 0 ? '0' : '1%', }">
-									<p class="radar-title">{{ grade.Grade }}</p>
-									<BaseGradeRadar :echartsId="'gradeRadar' + index" :echartsData="grade" v-if="grade.subjectName.length > 2"></BaseGradeRadar>
-									<BaseSubjectBar :echartsId="'gradeBar' + index" :echartsData="grade" v-else></BaseSubjectBar>
-									<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 grade.className" :key="index2" :style="{ marginLeft:  index2 === 0 || index2 % 5 === 0 ? '0' : '1%',  }">
-												<p class="radar-title">{{ item }}</p>
-												<BaseClassRadar :echartsId="'grade' + index + 'c' + index2" :boxWidth="boxWidth" :echartsData="grade"
-												 :cIndex="index2" v-if="grade.subjectName.length > 2"></BaseClassRadar>
-												<BaseClassBar :echartsId="'grade' + index + 'c' + index2" :boxWidth="boxWidth" :echartsData="grade" :cIndex="index2"
-												 v-else></BaseClassBar>
-											</div>
-										</div>
-									</div>
-								</Panel>
-							</Collapse> -->
-						</div>
-					</TabPane>
-					<TabPane :label="$t('totalAnalysis.totalIndex.tab2')" 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 class="el-filter-item">
+								<span class="el-filter-title">{{ $t("totalAnalysis.condition7") }}:</span>
+								<RadioGroup v-model="filterSubject" type="button" @on-change="filterSubjectChange">
+									<Radio label="全部">全部</Radio>
+									<Radio v-for="(item, index) in filterSubjectList" :label="item.name" :key="index">{{ item.name }}</Radio>
+								</RadioGroup>
 							</div>
 							</div>
-							<transition name="indexFade">
-								<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 schoolData.period" :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 label="全部">全部</Radio>
-											<Radio v-for="(item, index) in filterGradeList" :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> -->
-											<Radio label="全部">全部</Radio>
-											<Radio v-for="(item, index) in filterSubjectList" :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.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">
+							<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.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.condition5") }}:</span>
                                         <span class="el-filter-title">{{ $t("totalAnalysis.condition5") }}:</span>
                                         <RadioGroup v-model="filterArea" type="button" @on-change="filterAreaChange">
                                         <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>
                                             <Radio v-for="(item, index) in filterData.areaList" :label="item.name" :key="index">{{ item.name }}</Radio>
                                         </RadioGroup>
                                         </RadioGroup>
                                     </div> -->
                                     </div> -->
-									<!-- 评测来源暂未实际有效字段 -->
-									<!-- <div class="el-filter-item">
+							<!-- 评测来源暂未实际有效字段 -->
+							<!-- <div class="el-filter-item">
                                         <span class="el-filter-title">{{ $t("totalAnalysis.condition6") }}:</span>
                                         <span class="el-filter-title">{{ $t("totalAnalysis.condition6") }}:</span>
                                         <RadioGroup v-model="filterFeedback" type="button" @on-change="filterFeedbackChange">
                                         <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>
                                             <Radio v-for="(item, index) in filterData.feedbackList" :label="item.name" :key="index">{{ item.name }}</Radio>
                                         </RadioGroup>
                                         </RadioGroup>
                                     </div> -->
                                     </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 }}
+						</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 v-if="examList.length === 0">
+							<EmptyData></EmptyData>
+						</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">{{ evType[item.type] }}</span>
+								<span class="exam-name">{{ item.name }}</span>
+								<span class="exam-grade">{{ item.period.name}}</span>
+								<span class="exam-grade" v-for="(grade, gradeIndex) in item.grades"
+									:key="gradeIndex">{{ grade.name}}</span>
+								<!-- 评测简要数据API暂未返回学科数据 -->
+								<span class="exam-subjects">
+									<span class="exam-subject" v-for="(subject, index) in item.subjects"
+										:key="index">{{ subject.name }}</span>
 								</span>
 								</span>
 							</div>
 							</div>
-							<div class="section-box list-box">
-								<div v-if="examList.length === 0">
-									<EmptyData></EmptyData>
-								</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">{{ evType[item.type] }}</span>
-										<span class="exam-name">{{ item.name }}</span>
-										<span class="exam-grade">{{ item.period.name}}</span>
-										<span class="exam-grade" v-for="(grade, gradeIndex) in item.grades" :key="gradeIndex">{{ grade.name}}</span>
-										<!-- 评测简要数据API暂未返回学科数据 -->
-										<span class="exam-subjects">
-											<span class="exam-subject" v-for="(subject, index) in item.subjects" :key="index">{{ subject.name }}</span>
-										</span>
-									</div>
-									<div class="exam-info-bottom">
-										<span>{{ $t("totalAnalysis.echarts_text11") }}:
-											{{ $tools.formatTime(item.startTime, "yyyy-MM-dd")  }}</span>
-										<span>{{ $t("totalAnalysis.echarts_text12") }}:
-											{{ item.stuCount }}</span>
-										<span>{{ $t("totalAnalysis.echarts_text13") }}:
-											<!-- 暂无实际参与人数数据 -->
-											{{ item.stuCount }}
-										</span>
-										<span>{{ $t("totalAnalysis.echarts_text14") }}:
-											<!-- 暂无参与率数据 -->
-											{{ getJoinRate(item) }}
-										</span>
-										<!-- <span>{{ $t("totalAnalysis.echarts_text15") }}:
+							<div class="exam-info-bottom">
+								<span>{{ $t("totalAnalysis.echarts_text11") }}:
+									{{ $tools.formatTime(item.startTime, "yyyy-MM-dd")  }}</span>
+								<span>{{ $t("totalAnalysis.echarts_text12") }}:
+									{{ item.stuCount }}</span>
+								<span>{{ $t("totalAnalysis.echarts_text13") }}:
+									<!-- 暂无实际参与人数数据 -->
+									{{ item.stuCount }}
+								</span>
+								<span>{{ $t("totalAnalysis.echarts_text14") }}:
+									<!-- 暂无参与率数据 -->
+									{{ getJoinRate(item) }}
+								</span>
+								<!-- <span>{{ $t("totalAnalysis.echarts_text15") }}:
 										</span> -->
 										</span> -->
-									</div>
-								</div>
-								<Page size="small" />
 							</div>
 							</div>
 						</div>
 						</div>
-					</TabPane>
-				</Tabs>
+						<Page size="small" />
+					</div>
+				</div>
 			</div>
 			</div>
 		</vuescroll>
 		</vuescroll>
 	</div>
 	</div>
@@ -305,8 +267,10 @@
 						if (schoolBaseInfo.period.length) {
 						if (schoolBaseInfo.period.length) {
 							this.filterData.periodList = [this.defaultAll].concat(schoolBaseInfo.period);
 							this.filterData.periodList = [this.defaultAll].concat(schoolBaseInfo.period);
 							this.filterData.gradeList = [this.defaultAll].concat(schoolBaseInfo.period[0].grades);
 							this.filterData.gradeList = [this.defaultAll].concat(schoolBaseInfo.period[0].grades);
-							this.filterData.subjectList = [this.defaultAll].concat(schoolBaseInfo.period[0].subjects);
-							this.filterData.termList = [this.defaultAll].concat(schoolBaseInfo.period[0].semesters);
+							this.filterData.subjectList = [this.defaultAll].concat(schoolBaseInfo.period[0]
+								.subjects);
+							this.filterData.termList = [this.defaultAll].concat(schoolBaseInfo.period[0]
+							.semesters);
 							this.filterData.typeList = filterJson.typeList;
 							this.filterData.typeList = filterJson.typeList;
 							this.filterData.areaList = filterJson.areaList;
 							this.filterData.areaList = filterJson.areaList;
 							this.filterData.feedbackList = filterJson.feedbackList;
 							this.filterData.feedbackList = filterJson.feedbackList;
@@ -343,23 +307,6 @@
 			// 获取评测列表
 			// 获取评测列表
 			getExamList() {
 			getExamList() {
 				this.isLoadingList = true;
 				this.isLoadingList = true;
-				// this.$api.totalAnalysis
-				// 	.getExamList({
-				// 		code: this.$store.state.totalAnalysis.campusCode,
-				// 	})
-				// 	.then((res) => {
-				// 		// api请求
-				// 		this.examList = res.result.data;
-				// 		this.originList = res.result.data;
-				// 		(this.searchList = this.examList.length ?
-				// 			this.examList.map((item) => item.name) : []),
-				// 		this.$store.commit("updateExamList", res.result.data);
-				// 		this.isLoadingList = false;
-				// 	})
-				// 	.catch((err) => {
-				// 		console.log(err);
-				// 		this.isLoadingList = false;
-				// 	});
 				let requestData = {
 				let requestData = {
 					code: this.$store.state.userInfo.schoolCode
 					code: this.$store.state.userInfo.schoolCode
 				}
 				}
@@ -385,44 +332,7 @@
 				)
 				)
 			},
 			},
 
 
-			// 年级雷达图点击
-			onRadarChange(val) {
-				if (!val.length) return;
-				// 根据雷达图位置来决定箭头位置以及展开面板偏移量
-				let num = Number(val[0].split("panel")[1]) + 1;
-				let firstDom = document.getElementsByClassName("ivu-collapse-header")[0];
-				let curItem = document.getElementsByClassName("ivu-collapse-header")[
-					num - 1
-				];
-				this.$nextTick(() => {
-					let domNum = parseInt((num - 1) / 4);
-					let scrollDistance = firstDom.offsetTop + 180 + domNum * 480;
-
-					this.$refs["vs"].scrollTo({
-							y: scrollDistance,
-						},
-						500,
-						"easeInQuad"
-					);
-				});
-
-				this.arrowLeft =
-					num % 4 === 0 ?
-					"87.5%" :
-					(num + 1) % 4 === 0 ?
-					"62.2%" :
-					(num + 2) % 4 === 0 ?
-					"36.5%" :
-					"11.5%";
-				this.panelLeft =
-					num % 4 === 0 ?
-					"-75.8%" :
-					(num + 1) % 4 === 0 ?
-					"-50.5%" :
-					(num + 2) % 4 === 0 ?
-					"-25.2%" :
-					"0";
-			},
+			
 
 
 			handleSearch() {
 			handleSearch() {
 				let that = this;
 				let that = this;
@@ -450,8 +360,8 @@
 				this.filterList.splice(index, 1);
 				this.filterList.splice(index, 1);
 				switch (name) {
 				switch (name) {
 					case "period":
 					case "period":
-						this.filterPeriod = "全部";
-						this.filterConditions.period = null;
+						// this.filterPeriod = "全部";
+						// this.filterConditions.period = null;
 						break;
 						break;
 					case "grade":
 					case "grade":
 						this.filterGrade = "全部";
 						this.filterGrade = "全部";
@@ -487,16 +397,16 @@
 
 
 			filterPeriodChange() {
 			filterPeriodChange() {
 				this.filterConditions.period = this.filterPeriod === "全部" ? null : this.filterPeriod;
 				this.filterConditions.period = this.filterPeriod === "全部" ? null : this.filterPeriod;
-				//切换学科后年级会变化,需要初始化年级状态 默认选中全部
-				// if (this.filterGradeList && this.filterGradeList.length) {
-				//     this.filterGrade = this.filterGradeList[0].name
-				//     this.filterGradeChange()
-				// }
-				//切换学科后学科会变化,需要初始化学科状态 默认选中全部
-				// if (this.filterSubjectList && this.filterSubjectList.length) {
-				//     this.filterSubject = this.filterSubjectList[0].name
-				//     this.filterSubjectChange()
-				// }
+				// 切换学科后年级会变化,需要初始化年级状态 默认选中全部
+				if (this.filterGradeList && this.filterGradeList.length) {
+				    this.filterGrade = "全部"
+				    this.filterGradeChange()
+				}
+				// 切换学科后学科会变化,需要初始化学科状态 默认选中全部
+				if (this.filterSubjectList && this.filterSubjectList.length) {
+				    this.filterSubject = "全部"
+				    this.filterSubjectChange()
+				}
 				this.doFilter();
 				this.doFilter();
 			},
 			},
 			filterGradeChange() {
 			filterGradeChange() {
@@ -513,6 +423,7 @@
 				//评测返回的是key eg:normal,不能直接用中文做过滤条件
 				//评测返回的是key eg:normal,不能直接用中文做过滤条件
 				// this.filterConditions.type =
 				// this.filterConditions.type =
 				//     this.filterType === "全部" ? null : this.filterType;
 				//     this.filterType === "全部" ? null : this.filterType;
+				console.log(this.filterType)
 				if (this.filterType === "全部") {
 				if (this.filterType === "全部") {
 					this.filterConditions.type = null
 					this.filterConditions.type = null
 				} else {
 				} else {
@@ -523,16 +434,7 @@
 				}
 				}
 				this.doFilter();
 				this.doFilter();
 			},
 			},
-			filterAreaChange() {
-				this.filterConditions.area =
-					this.filterArea === "全部" ? null : this.filterArea;
-				this.doFilter();
-			},
-			filterFeedbackChange() {
-				this.filterConditions.feedback =
-					this.filterFeedback === "全部" ? null : this.filterFeedback;
-				this.doFilter();
-			},
+
 			filterSubjectChange() {
 			filterSubjectChange() {
 				this.filterConditions.subject =
 				this.filterConditions.subject =
 					this.filterSubject === "全部" ? null : this.filterSubject;
 					this.filterSubject === "全部" ? null : this.filterSubject;
@@ -542,32 +444,7 @@
 			doFilter() {
 			doFilter() {
 				// 将条件转换成数组便于渲染
 				// 将条件转换成数组便于渲染
 				this.filterList = this.objToArr(this.filterConditions);
 				this.filterList = this.objToArr(this.filterConditions);
-				console.log(this.filterConditions)
-				// 根据条件过滤所有的测验数据
-				// this.examList = this.originList.filter((item) => {
-				//     return (
-				//         item.period.name.indexOf(this.filterConditions.period || "") >
-				//         -1 &&
-				//         item.grades.indexOf(this.filterConditions.grade || "") >
-				//         -1 &&
-				//         item.conditions.semester.indexOf(this.filterConditions.term || "") >
-				//         -1 &&
-				//         item.conditions.type.indexOf(this.filterConditions.type || "") > -1 &&
-				//         item.conditions.range.indexOf(this.filterConditions.area || "") >
-				//         -1 &&
-				//         item.conditions.feedBackType.indexOf(
-				//             this.filterConditions.feedback || ""
-				//         ) > -1 &&
-				//         (this.filterConditions.subject ?
-				//             item.conditions.subject.indexOf(
-				//                 this.filterConditions.subject || ""
-				//             ) > -1 :
-				//             true)
-				//     );
-				// });
-
 				// 根据条件过滤所有的测验数据
 				// 根据条件过滤所有的测验数据
-				console.log('filter', this.filterConditions)
 				this.examList = this.originList.filter((item) => {
 				this.examList = this.originList.filter((item) => {
 					return (
 					return (
 						item.period.name.indexOf(this.filterConditions.period || "") >
 						item.period.name.indexOf(this.filterConditions.period || "") >
@@ -584,10 +461,9 @@
 
 
 			objToArr(obj) {
 			objToArr(obj) {
 				var arr = [];
 				var arr = [];
-				console.log('obj', obj)
 				for (var key in obj) {
 				for (var key in obj) {
 					//处理筛选条件是类型的情况
 					//处理筛选条件是类型的情况
-					if (key == 'type') {
+					if (key == 'type' && obj[key]) {
 						arr.push({
 						arr.push({
 							keyName: key,
 							keyName: key,
 							val: this.filterType,
 							val: this.filterType,
@@ -626,8 +502,8 @@
 			getExamSummary(item) {
 			getExamSummary(item) {
 				return new Promise((r, j) => {
 				return new Promise((r, j) => {
 					this.$api.learnActivity.FindExamInfos({
 					this.$api.learnActivity.FindExamInfos({
-						id:item.id,
-						code:item.code
+						id: item.id,
+						code: item.code
 					}).then(
 					}).then(
 						async res => {
 						async res => {
 								if (!res.error) {
 								if (!res.error) {

+ 1 - 33
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.css

@@ -6,12 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
 
 
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
@@ -20,33 +14,6 @@
     }
     }
 
 
 
 
-.scatter-statistics {
-    margin-top:160px;
-}
-
-.scatter-statistics .ivu-divider-horizontal {
-    margin: 10px 0;
-    width: 80%;
-    margin-left:10%;
-    min-width:unset;
-}
-
-.scatter-statistics .scatter-table-line {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-around;
-    align-items: center;
-    color: #e4eadb;
-    height: 40px;
-    font-size: 14px;
-    /*border-bottom:1px solid #595959;*/
-}
-
-.scatter-statistics .scatter-table-line span {
-    text-align:center;
-    width:100px;
-}
-
 
 
 .pie-to-bar {
 .pie-to-bar {
     position: absolute;
     position: absolute;
@@ -54,6 +21,7 @@
     top: 60px;
     top: 60px;
     color: #d8d8d8;
     color: #d8d8d8;
     cursor:pointer;
     cursor:pointer;
+	z-index: 999;
 }
 }
 
 
 .pie-to-bar .ivu-icon {
 .pie-to-bar .ivu-icon {

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

@@ -15,20 +15,9 @@
 			        <BaseKnowledgeRadar echartsId="knowPie2"></BaseKnowledgeRadar>
 			        <BaseKnowledgeRadar echartsId="knowPie2"></BaseKnowledgeRadar>
 			    </Col>
 			    </Col>
 			</Row>
 			</Row>
-			<Divider />
-			<Row>
-			
-			    <span class="component-title">
-			        {{$t('totalAnalysis.ka_title3')}}
-			        <!-- 当前知识块 : 全部 -->
-			        <!--<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">
-			            {{$t('totalAnalysis.ka_text1')}}:{{currentBlock}}
-			            <Icon type="ios-close-circle-outline" @click="refresh" style="cursor:pointer;" v-show="currentBlock != '全部'" />
-			        </span>-->
-			    </span>
+			<Row class-name="base-table-row">
 			    <!-- 得分率关系表 -->
 			    <!-- 得分率关系表 -->
-			    <div style="padding:20px 50px;position:relative">
-			        <!--<span class="btn-class-score" @click="handleGoDetails">查看班级得分<Icon type="ios-arrow-dropright" /></span>-->
+			    <div>
 			        <BaseMyTable :columns="tableColumns"
 			        <BaseMyTable :columns="tableColumns"
 			                     :tableName="$t('totalAnalysis.ka_title3')"
 			                     :tableName="$t('totalAnalysis.ka_title3')"
 			                      tableRef="pointScoreRateTable"
 			                      tableRef="pointScoreRateTable"
@@ -45,12 +34,11 @@
 <script>
 <script>
     import BasePie from '@/components/student-analysis/total/BasePie.vue'
     import BasePie from '@/components/student-analysis/total/BasePie.vue'
     import BaseKnowledgeRadar from '@/components/student-analysis/total/BaseKnowledgeRadar.vue'
     import BaseKnowledgeRadar from '@/components/student-analysis/total/BaseKnowledgeRadar.vue'
-    import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'
     export default {
     export default {
         components: {
         components: {
-            BasePie, BaseKnowledgeRadar, BaseMyTable, BaseRadar, ScoreDetails
+            BasePie, BaseKnowledgeRadar, BaseMyTable, ScoreDetails
         },
         },
         data() {
         data() {
             return {
             return {

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

@@ -13,8 +13,8 @@
             </Col>
             </Col>
             <Col span="12">
             <Col span="12">
             <!-- 知识点得分详情 -->
             <!-- 知识点得分详情 -->
-                <span class="component-title">{{$t('totalAnalysis.ka_title5')}}<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span>
-                <div style="padding:0 50px;">
+                <!-- <span class="component-title"><span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span> -->
+                <div>
                     <BaseMyTable :columns="detailsColumns"
                     <BaseMyTable :columns="detailsColumns"
                                  :tableName="$t('totalAnalysis.ka_title5')"
                                  :tableName="$t('totalAnalysis.ka_title5')"
                                   tableRef="pointScoreTable"
                                   tableRef="pointScoreTable"
@@ -24,9 +24,8 @@
             </Col>
             </Col>
         </Row>
         </Row>
         <Divider />
         <Divider />
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ka_title6')}}</span>
-            <div style="padding:20px 50px;">
+        <Row class-name="base-table-row">
+            <div>
                 <BaseMyTable :columns="tableColumns"
                 <BaseMyTable :columns="tableColumns"
                              :tableName="$t('totalAnalysis.ka_title6')"
                              :tableName="$t('totalAnalysis.ka_title6')"
                               tableRef="pointWrongTable"
                               tableRef="pointWrongTable"

+ 1 - 32
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.css

@@ -6,12 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
 
 
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
@@ -20,32 +14,6 @@
     }
     }
 
 
 
 
-.scatter-statistics {
-    margin-top:160px;
-}
-
-.scatter-statistics .ivu-divider-horizontal {
-    margin: 10px 0;
-    width: 80%;
-    margin-left:10%;
-    min-width:unset;
-}
-
-.scatter-statistics .scatter-table-line {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-around;
-    align-items: center;
-    color: #e4eadb;
-    height: 40px;
-    font-size: 14px;
-    /*border-bottom:1px solid #595959;*/
-}
-
-.scatter-statistics .scatter-table-line span {
-    text-align:center;
-    width:100px;
-}
 
 
 
 
 .pie-to-bar {
 .pie-to-bar {
@@ -53,6 +21,7 @@
     right: 80px;
     right: 80px;
     top: 60px;
     top: 60px;
     color: #d8d8d8;
     color: #d8d8d8;
+	z-index: 999;
     cursor:pointer;
     cursor:pointer;
 }
 }
 
 

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

@@ -9,18 +9,11 @@
                 <BaseLevelRadar echartsId="levelPie2" v-if="isShowPie"></BaseLevelRadar>
                 <BaseLevelRadar echartsId="levelPie2" v-if="isShowPie"></BaseLevelRadar>
             </Col>
             </Col>
         </Row>
         </Row>
-        <Divider />
-        <Row>
-
-            <span class="component-title">
-                {{$t('totalAnalysis.le_title3')}}
-            </span>
-            <div style="padding:20px 50px;position:relative">
+        <Row class-name="base-table-row">
                 <BaseMyTable :columns="tableColumns"
                 <BaseMyTable :columns="tableColumns"
                              :tableName="$t('totalAnalysis.le_title3')"
                              :tableName="$t('totalAnalysis.le_title3')"
                               tableRef="levelScoreRateTable"
                               tableRef="levelScoreRateTable"
                              :tableDatas="levelData"></BaseMyTable>
                              :tableDatas="levelData"></BaseMyTable>
-            </div>
         </Row>
         </Row>
         <Divider />
         <Divider />
         <ScoreDetails ref="detailsRef"></ScoreDetails>
         <ScoreDetails ref="detailsRef"></ScoreDetails>
@@ -30,12 +23,11 @@
 <script>
 <script>
     import BasePie from '@/components/student-analysis/total/BaseLevelPie.vue'
     import BasePie from '@/components/student-analysis/total/BaseLevelPie.vue'
     import BaseLevelRadar from '@/components/student-analysis/total/BaseLevelRadar.vue'
     import BaseLevelRadar from '@/components/student-analysis/total/BaseLevelRadar.vue'
-    import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'
     export default {
     export default {
         components: {
         components: {
-            BasePie, BaseLevelRadar, BaseMyTable, BaseRadar, ScoreDetails
+            BasePie, BaseLevelRadar, BaseMyTable, ScoreDetails
         },
         },
         data() {
         data() {
             return {
             return {

+ 17 - 15
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue

@@ -4,30 +4,30 @@
 			<Col span="12">
 			<Col span="12">
 			<span class="component-title">{{$t('totalAnalysis.le_title4')}}</span>
 			<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>
+				<Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />
+				{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}
+			</span>
 			<div v-show="!isShowRadar">
 			<div v-show="!isShowRadar">
-				<BaseDetailBar echartsId="levelDetailBar" :echartData="levelData" @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
+				<BaseDetailBar echartsId="levelDetailBar" :echartData="levelData" @handleItemClick="handleItemClick"
+					ref="detailsBar"></BaseDetailBar>
 			</div>
 			</div>
 			<div v-if="isShowRadar">
 			<div v-if="isShowRadar">
 				<BaseRadar echartsId="levelRadar"></BaseRadar>
 				<BaseRadar echartsId="levelRadar"></BaseRadar>
 			</div>
 			</div>
 			</Col>
 			</Col>
 			<Col span="12">
 			<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>
-			<div style="padding:0 50px;">
-				<BaseMyTable :columns="detailsColumns" :tableName="$t('totalAnalysis.le_title5')" tableRef="levelScoreTable"
-				 :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
+			<!-- <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> -->
+			<div style="padding:30px 100px 0 0">
+				<BaseMyTable :columns="detailsColumns" :tableName="$t('totalAnalysis.le_title5')"
+					tableRef="levelScoreTable" :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
 			</div>
 			</div>
 			</Col>
 			</Col>
 		</Row>
 		</Row>
 		<Divider />
 		<Divider />
-		<Row>
-			<span class="component-title">{{$t('totalAnalysis.le_title6')}}</span>
-			<div style="padding:20px 50px;">
-				<BaseMyTable :columns="tableColumns" :tableName="$t('totalAnalysis.le_title6')" tableRef="levelWrongTable"
-				 :tableDatas="numData" ref="numTable" :tips="$t('totalAnalysis.ka_tip1')"></BaseMyTable>
-			</div>
-			<!--<span style="/*font-size:14px;font-weight:bold;margin-left:60px;color:#66cccc*/"></span>-->
+		<Row class-name="base-table-row">
+			<BaseMyTable :columns="tableColumns" :tableName="$t('totalAnalysis.le_title6')" tableRef="levelWrongTable"
+				:tableDatas="numData" ref="numTable" :tips="$t('totalAnalysis.ka_tip1')"></BaseMyTable>
 		</Row>
 		</Row>
 	</div>
 	</div>
 </template>
 </template>
@@ -197,7 +197,8 @@
 		computed: {
 		computed: {
 			// 获取最新散点图数据
 			// 获取最新散点图数据
 			getLevelData() {
 			getLevelData() {
-				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this
+					.$store.state
 					.totalAnalysis.currentSubject)
 					.totalAnalysis.currentSubject)
 				let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
 				let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
 				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
 				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
@@ -213,7 +214,8 @@
 			},
 			},
 			// 获取最新散点图数据
 			// 获取最新散点图数据
 			getKnowledgeData() {
 			getKnowledgeData() {
-				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this
+					.$store.state
 					.totalAnalysis.currentSubject)
 					.totalAnalysis.currentSubject)
 				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
 				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
 			}
 			}

+ 1 - 8
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.css

@@ -6,13 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
-
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
         margin-top: 50px;
         margin-top: 50px;
@@ -21,7 +14,7 @@
 
 
 
 
 .scatter-statistics {
 .scatter-statistics {
-    margin-top:130px;
+    margin-top:100px;
 }
 }
 
 
 .scatter-statistics .ivu-divider-horizontal {
 .scatter-statistics .ivu-divider-horizontal {

+ 35 - 24
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue

@@ -4,9 +4,9 @@
             <Col span="12">
             <Col span="12">
             <div class="component-title">
             <div class="component-title">
                 <span>{{$t('totalAnalysis.sca_title1')}}</span>
                 <span>{{$t('totalAnalysis.sca_title1')}}</span>
-                <Select v-model="currentClass" @on-change="onClassSelect">
+<!--                <Select v-model="currentClass" @on-change="onClassSelect">
                     <Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
                     <Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
-                </Select>
+                </Select> -->
             </div>
             </div>
             <BaseScatter :scatterData="tableData"></BaseScatter>
             <BaseScatter :scatterData="tableData"></BaseScatter>
             </Col>
             </Col>
@@ -14,55 +14,58 @@
             <div class="scatter-statistics">
             <div class="scatter-statistics">
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>{{$t('totalAnalysis.sca_text1')}}</span>
                     <span>{{$t('totalAnalysis.sca_text1')}}</span>
-                    <span>{{$t('totalAnalysis.sca_text2')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text2')}}</span>
                     <span>{{$t('totalAnalysis.sca_text3')}}</span>
                     <span>{{$t('totalAnalysis.sca_text3')}}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>A</span>
                     <span>A</span>
-                    <span>{{$t('totalAnalysis.sca_text5')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text5')}}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'A').length }}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'A').length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
-                    <span>A-</span>
-                    <span>{{$t('totalAnalysis.sca_text6')}}</span>
-                    <span>{{ tableData.filter(item => item.scatter === 'A-').length }}</span>
+                    <span>A'</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text6')}}</span>
+                    <span>{{ tableData.filter(item => item.scatter === "A'").length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>B</span>
                     <span>B</span>
-                    <span>{{$t('totalAnalysis.sca_text7')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text7')}}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'B').length }}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'B').length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
-                    <span>B-</span>
-                    <span>{{$t('totalAnalysis.sca_text8')}}</span>
-                    <span>{{ tableData.filter(item => item.scatter === 'B-').length }}</span>
+                    <span>B'</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text8')}}</span>
+                    <span>{{ tableData.filter(item => item.scatter === "B'").length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>C</span>
                     <span>C</span>
-                    <span>{{$t('totalAnalysis.sca_text9')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text9')}}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'C').length }}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'C').length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
-                    <span>C-</span>
-                    <span>{{$t('totalAnalysis.sca_text10')}}</span>
-                    <span>{{ tableData.filter(item => item.scatter === 'C-').length }}</span>
+                    <span>C'</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text10')}}</span>
+                    <span>{{ tableData.filter(item => item.scatter === "C'").length }}</span>
                 </div>
                 </div>
             </div>
             </div>
             </Col>
             </Col>
         </Row>
         </Row>
-        <Divider />
 
 
         <!-- 学生稳定度统计表 -->
         <!-- 学生稳定度统计表 -->
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.sca_title2')}}</span>
-            <div style="padding:20px 50px;">
-                <BaseTable :columns="tableColumns" :tableDatas="tableData" :tableName="$t('totalAnalysis.sca_title2')" tableRef="scatterTable" ref="scatterTable" ></BaseTable>
+        <Row class-name="base-table-row">
+            <!-- <span class="component-title">{{$t('totalAnalysis.sca_title2')}}</span> -->
+            <div>
+                <BaseTable :columns="tableColumns" 
+				:tableDatas="tableData" 
+				:tableName="$t('totalAnalysis.sca_title2')"
+				 tableRef="scatterTable"
+				  ref="scatterTable" ></BaseTable>
             </div>
             </div>
         </Row>
         </Row>
     </div>
     </div>
@@ -90,6 +93,7 @@
                     {
                     {
                         title: this.$t('totalAnalysis.base_class'),
                         title: this.$t('totalAnalysis.base_class'),
                         key: 'className',
                         key: 'className',
+						sortable:'custom',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
@@ -100,20 +104,20 @@
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.base_score'),
                         title: this.$t('totalAnalysis.base_score'),
-                        sortable: true,
+                        sortable: 'custom',
                         key: 'score',
                         key: 'score',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.sca_table_text1'),
                         title: this.$t('totalAnalysis.sca_table_text1'),
                         key: 'trueNum',
                         key: 'trueNum',
-                        sortable: true,
+                        sortable: 'custom',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.sca_table_text2'),
                         title: this.$t('totalAnalysis.sca_table_text2'),
                         key: 'falseNum',
                         key: 'falseNum',
-                        sortable: true,
+                        sortable: 'custom',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
@@ -130,8 +134,10 @@
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.sca_table_text5'),
                         title: this.$t('totalAnalysis.sca_table_text5'),
-                        key: 'x',
                         sortable: true,
                         sortable: true,
+						renderType: function(h, params) {
+						    return h('span', Number(params.row.x).toFixed(2))
+						},
                         minWidth: 120
                         minWidth: 120
                     },
                     },
                     {
                     {
@@ -208,6 +214,11 @@
 				this.originTableData = JSON.parse(JSON.stringify(this.tableData)) 
 				this.originTableData = JSON.parse(JSON.stringify(this.tableData)) 
 				this.currentClass = 0
 				this.currentClass = 0
 			})
 			})
+			
+			this.$EventBus.$off('changeClassName')
+			this.$EventBus.$on('changeClassName',val => {
+				 this.onClassSelect(this.classList.indexOf(val))
+			})
         },
         },
 
 
         computed: {
         computed: {

+ 1 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.css

@@ -158,8 +158,7 @@
     right:20px;
     right:20px;
     top:232px; */
     top:232px; */
 	position: sticky;
 	position: sticky;
-	top: 0;
-	background: #fff;
+	top: 10px;
 	color: #333;
 	color: #333;
 }
 }
 
 

+ 69 - 62
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue

@@ -12,68 +12,71 @@
 
 
         <!-- 右侧题目列表题型概览 -->
         <!-- 右侧题目列表题型概览 -->
         <div class='ql-right-box' ref="rightBox" :style="{width: isOpen ? '17%' : '18%'}">
         <div class='ql-right-box' ref="rightBox" :style="{width: isOpen ? '17%' : '18%'}">
-            <div class="ql-right-score">
-				<Button type="info" @click="handleBackTo">返回上级</Button>
-				<p style="margin-top: 20px;">试卷科目:{{ $store.state.totalAnalysis.currentSubject }}</p>
-				<p style="margin-top: 10px;">试卷题数:{{ questionList.length }}</p>
-                <p style="margin-top: 10px;">{{$t('totalAnalysis.ql_text1')}} :<span>{{sumArr(questionList.map(item => item.score))}} {{$t('totalAnalysis.ql_text8')}}</span></p> 
-            </div>
-			
-            <div class="ql-right-list">
-                    <div>
-                        <div class="ql-right-part" v-if="SingleList.length">
-                            <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text2')}}({{sumArr(SingleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                            <div class="ql-right-items">
-                                <span class="ql-right-item" v-for="(item,index) in SingleList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-                            </div>
-                        </div>
-                        <div class="ql-right-part" v-if="MultipleList.length">
-                            <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text3')}}({{sumArr(MultipleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                            <div class="ql-right-items">
-                                <span class="ql-right-item" v-for="(item,index) in MultipleList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-                            </div>
-                        </div>
-                        <div class="ql-right-part" v-if="JudgeList.length">
-                            <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text4')}}({{sumArr(JudgeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                            <div class="ql-right-items">
-                                <span class="ql-right-item" v-for="(item,index) in JudgeList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-                            </div>
-                        </div>
-                        <div class="ql-right-part" v-if="CompleteList.length">
-                            <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text5')}}({{sumArr(CompleteList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                            <div class="ql-right-items">
-                                <span class="ql-right-item" v-for="(item,index) in CompleteList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-                            </div>
-                        </div>
-                        <div class="ql-right-part" v-if="SubjectiveList.length">
-                            <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text6')}}({{sumArr(SubjectiveList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                            <div class="ql-right-items">
-                                <span class="ql-right-item" v-for="(item,index) in SubjectiveList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-                            </div>
-                        </div>
-						<div class="ql-right-part" v-if="ConnectorList.length">
-						    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text14')}}({{sumArr(ConnectorList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-						    <div class="ql-right-items">
-						        <span class="ql-right-item" v-for="(item,index) in ConnectorList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-						    </div>
-						</div>
-						<div class="ql-right-part" v-if="CorrectList.length">
-						    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text15')}}({{sumArr(CorrectList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-						    <div class="ql-right-items">
-						        <span class="ql-right-item" v-for="(item,index) in CorrectList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-						    </div>
-						</div>
-                        <div class="ql-right-part" v-if="ComposeList.length">
-                            <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text7')}}({{sumArr(ComposeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-                            <div class="ql-right-items">
-								<!-- 如果是综合题 则需要把小题题序放出来 -->
-								<span v-for="(item,index) in ComposeList" :key="index" style="background-color: none;" class="ql-right-items">
-									<span class="ql-right-item" v-for="(child,childIndex) in item.children" :key="childIndex" @click="handleItemClick(item,$event)" :ref="'indexRef' + (flatList.indexOf(child))"  :data-order="flatList.indexOf(child)">{{getIndexOrder(item)}} - {{ childIndex + 1 }}</span>
-								</span>
-                            </div>
-                        </div>
-                    </div>
-            </div>
+			<Button type="info" @click="handleBackTo" style="width: 100%;height: 50px;margin-bottom: 15px;border-radius: 0;">返回上级</Button>
+			<div style="background-color: #fff;">
+				<div class="ql-right-score">
+					<p style="margin-top: 20px;">试卷科目:{{ $store.state.totalAnalysis.currentSubject }}</p>
+					<p style="margin-top: 10px;">试卷题数:{{ questionList.length }}</p>
+				    <p style="margin-top: 10px;">{{$t('totalAnalysis.ql_text1')}} :<span>{{sumArr(questionList.map(item => item.score))}} {{$t('totalAnalysis.ql_text8')}}</span></p> 
+				</div>
+				
+				<div class="ql-right-list">
+				        <div>
+				            <div class="ql-right-part" v-if="SingleList.length">
+				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text2')}}({{sumArr(SingleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+				                <div class="ql-right-items">
+				                    <span class="ql-right-item" v-for="(item,index) in SingleList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+				                </div>
+				            </div>
+				            <div class="ql-right-part" v-if="MultipleList.length">
+				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text3')}}({{sumArr(MultipleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+				                <div class="ql-right-items">
+				                    <span class="ql-right-item" v-for="(item,index) in MultipleList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+				                </div>
+				            </div>
+				            <div class="ql-right-part" v-if="JudgeList.length">
+				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text4')}}({{sumArr(JudgeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+				                <div class="ql-right-items">
+				                    <span class="ql-right-item" v-for="(item,index) in JudgeList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+				                </div>
+				            </div>
+				            <div class="ql-right-part" v-if="CompleteList.length">
+				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text5')}}({{sumArr(CompleteList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+				                <div class="ql-right-items">
+				                    <span class="ql-right-item" v-for="(item,index) in CompleteList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+				                </div>
+				            </div>
+				            <div class="ql-right-part" v-if="SubjectiveList.length">
+				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text6')}}({{sumArr(SubjectiveList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+				                <div class="ql-right-items">
+				                    <span class="ql-right-item" v-for="(item,index) in SubjectiveList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+				                </div>
+				            </div>
+							<div class="ql-right-part" v-if="ConnectorList.length">
+							    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text14')}}({{sumArr(ConnectorList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							    <div class="ql-right-items">
+							        <span class="ql-right-item" v-for="(item,index) in ConnectorList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+							    </div>
+							</div>
+							<div class="ql-right-part" v-if="CorrectList.length">
+							    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text15')}}({{sumArr(CorrectList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							    <div class="ql-right-items">
+							        <span class="ql-right-item" v-for="(item,index) in CorrectList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+							    </div>
+							</div>
+				            <div class="ql-right-part" v-if="ComposeList.length">
+				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text7')}}({{sumArr(ComposeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+				                <div class="ql-right-items">
+									<!-- 如果是综合题 则需要把小题题序放出来 -->
+									<span v-for="(item,index) in ComposeList" :key="index" style="background-color: none;" class="ql-right-items">
+										<span class="ql-right-item" v-for="(child,childIndex) in item.children" :key="childIndex" @click="handleItemClick(item,$event)" :ref="'indexRef' + (flatList.indexOf(child))"  :data-order="flatList.indexOf(child)">{{getIndexOrder(item)}} - {{ childIndex + 1 }}</span>
+									</span>
+				                </div>
+				            </div>
+				        </div>
+				</div>
+			</div>
+            
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>
@@ -394,6 +397,10 @@
 					let questionList = this.$refs.exList.$el.getElementsByClassName('exercise-item')
 					let questionList = this.$refs.exList.$el.getElementsByClassName('exercise-item')
 					let itemIndex = this.questionList.indexOf(item)
 					let itemIndex = this.questionList.indexOf(item)
 					let questionDom = questionList[itemIndex]
 					let questionDom = questionList[itemIndex]
+					questionDom.style.border = '3px solid #2db7f5'
+					setTimeout(() => {
+						questionDom.style.border = 'none'
+					},2000)
 					this.doScroll(questionDom.offsetTop)
 					this.doScroll(questionDom.offsetTop)
 					// 伪数组处理统一背景颜色
 					// 伪数组处理统一背景颜色
 					Array.prototype.slice.call(allList).forEach(item => {
 					Array.prototype.slice.call(allList).forEach(item => {

+ 1 - 8
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.css

@@ -6,13 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
-
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
         margin-top: 50px;
         margin-top: 50px;
@@ -21,7 +14,7 @@
 
 
 
 
 .scatter-statistics {
 .scatter-statistics {
-    margin-top:100px;
+    margin-top:70px;
 }
 }
 
 
 .scatter-container .index-wrap {
 .scatter-container .index-wrap {

+ 341 - 342
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue

@@ -1,345 +1,341 @@
 <template>
 <template>
-    <div class="scatter-container">
-        <Row>
-            <Col span="12">
-            <span class="component-title">{{$t('totalAnalysis.ta_title1')}}</span>
-            <BaseTestScatter @handleIndexClick="handleIndexClick" :scatterData="scatterData" :currentIndex="currentExerciseIndex"></BaseTestScatter>
-            </Col>
-            <Col span="12">
-            <div class="scatter-statistics">
-                <div class="scatter-table-line">
-                    <span>{{$t('totalAnalysis.ta_text1')}}</span>
-                    <span>{{$t('totalAnalysis.ta_text2')}}</span>
-                    <span>{{$t('totalAnalysis.ta_text3')}}</span>
-                    <span>{{$t('totalAnalysis.ta_text4')}}</span>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>A</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text6')">{{$t('totalAnalysis.ta_text6')}}</span>
-                    <span>{{A1List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in A1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>A-</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text7')">{{$t('totalAnalysis.ta_text7')}}</span>
-                    <span>{{A2List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in A2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>B</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text8')">{{$t('totalAnalysis.ta_text8')}}</span>
-                    <span>{{B1List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in B1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>B-</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text9')">{{$t('totalAnalysis.ta_text9')}}</span>
-                    <span>{{B2List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in B2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-            </div>
-            </Col>
-        </Row>
-        <Divider />
-        <!-- 年级单题得分率表 -->
-        <Row>
-            <span class="component-title">
-                <span>{{$t('totalAnalysis.ta_title2')}}</span> 
+	<div class="scatter-container">
+		<Row>
+			<Col span="12">
+			<span class="component-title">{{$t('totalAnalysis.ta_title1')}}</span>
+			<BaseTestScatter @handleIndexClick="handleIndexClick" :scatterData="scatterData"
+				:currentIndex="currentExerciseIndex"></BaseTestScatter>
+			</Col>
+			<Col span="12">
+			<div class="scatter-statistics">
+				<div class="scatter-table-line">
+					<span>{{$t('totalAnalysis.ta_text1')}}</span>
+					<span>{{$t('totalAnalysis.ta_text2')}}</span>
+					<span>{{$t('totalAnalysis.ta_text3')}}</span>
+					<span>{{$t('totalAnalysis.ta_text4')}}</span>
+				</div>
+				<div class="scatter-table-line">
+					<span>A</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text6')">{{$t('totalAnalysis.ta_text6')}}</span>
+					<span>{{A1List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in A1List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+				<Divider />
+				<div class="scatter-table-line">
+					<span>A-</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text7')">{{$t('totalAnalysis.ta_text7')}}</span>
+					<span>{{A2List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in A2List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+				<Divider />
+				<div class="scatter-table-line">
+					<span>B</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text8')">{{$t('totalAnalysis.ta_text8')}}</span>
+					<span>{{B1List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in B1List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+				<Divider />
+				<div class="scatter-table-line">
+					<span>B-</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text9')">{{$t('totalAnalysis.ta_text9')}}</span>
+					<span>{{B2List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in B2List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+			</div>
+			</Col>
+		</Row>
+		<Divider />
+		<!-- 年级单题得分率表 -->
+		<Row>
+			<span class="component-title">
+				<span>{{$t('totalAnalysis.ta_title2')}}</span>
 				<div class="index-wrap" style="display: unset">
 				<div class="index-wrap" style="display: unset">
-				    <span v-for="(item,index) in exerciseIndexList"
-				          :key="index"
-						  :title="index"
-				          class="exercise-item-index"
-				          @click="onIndexClick(item)"
-				          :style="{background: (+item > 9 ? item : '0' + item) === currentExerciseIndex ? '#d482ab':'#018B99' }">
-				    {{+item > 9 ? item : '0' + item}}
-				    </span>
+					<span v-for="(item,index) in exerciseIndexList" :key="index" :title="index"
+						class="exercise-item-index" @click="onIndexClick(item)"
+						:style="{background: (+item > 9 ? item : '0' + item) === currentExerciseIndex ? '#d482ab':'#018B99' }">
+						{{+item > 9 ? item : '0' + item}}
+					</span>
 				</div>
 				</div>
-                <!-- <Poptip trigger="hover" title="选择题号" placement="right" word-wrap>
-                    <span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ta_text5')}} :{{currentExerciseIndex}}</span>
-                    <div slot="content" class="index-wrap">
-                        <span v-for="(item,index) in exerciseIndexList"
-                              :key="index"
-							  :title="index"
-                              class="exercise-item-index"
-                              @click="onIndexClick(item)"
-                              :style="{background: (+item > 9 ? item : '0' + item) === currentExerciseIndex ? '#d482ab':'#018B99' }">
-                        {{+item > 9 ? item : '0' + item}}
-                        </span>
-                    </div>
-                </Poptip> -->
-            </span>
-            <div>
-                <BaseLineBar :exerciseIndex="currentExerciseIndex" ref="lineBar"></BaseLineBar>
-            </div>
-        </Row>
-        <Divider />
-        <!-- 试题分析总表 -->
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ta_title3')}}</span>
-            <div style="padding:20px 50px;">
-                <BaseTable :columns="tableColumns"
-                           :tableDatas="tableData"
-                           :tableName="$t('totalAnalysis.ta_title3')"
-                           tableRef="exerciseAnalsisTable"
-                           ref="analysisTable"
-                           :tips="$t('totalAnalysis.ta_table_tip2')"></BaseTable>
-            </div>
-        </Row>
-        <Divider />
-        <!-- 试题得分率表 -->
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ta_title4')}}</span>
-            <div style="padding:20px 50px;">
-                <BaseTable :columns="exerciseColumns"
-                           :tableDatas="tableData"
-                           :tableName="$t('totalAnalysis.ta_title4')"
-                           tableRef="exerciseScoreRateTable"
-                           ref="scoreRateTable"
-                           :tips="$t('totalAnalysis.ta_table_tip1')"></BaseTable>
-            </div>
-        </Row>
-    </div>
+			</span>
+			<div>
+				<BaseLineBar :exerciseIndex="currentExerciseIndex" ref="lineBar"></BaseLineBar>
+			</div>
+		</Row>
+		<!-- 试题分析总表 -->
+		<Row class-name="base-table-row">
+			<BaseTable :columns="tableColumns" :tableDatas="tableData" :tableName="$t('totalAnalysis.ta_title3')"
+				tableRef="exerciseAnalsisTable" ref="analysisTable" :tips="$t('totalAnalysis.ta_table_tip2')">
+			</BaseTable>
+		</Row>
+		<!-- 试题得分率表 -->
+		<Row class-name="base-table-row">
+			<BaseTable :columns="exerciseColumns" :tableDatas="tableData" :tableName="$t('totalAnalysis.ta_title4')"
+				tableRef="exerciseScoreRateTable" ref="scoreRateTable" :tips="$t('totalAnalysis.ta_table_tip1')">
+			</BaseTable>
+		</Row>
+	</div>
 </template>
 </template>
 
 
 <script>
 <script>
-    import BaseTestScatter from '@/components/student-analysis/total/BaseTestScatter.vue'
-    import BaseTable from '@/components/student-analysis/total/BaseMyTable.vue'
-    import BaseLineBar from '@/components/student-analysis/total/BaseLineBar.vue'
-    export default {
-        components: {
-            BaseTestScatter, BaseTable, BaseLineBar
-        },
-        data() {
-            return {
-                tableData: [],
-				scatterData:[],
-                exerciseIndexList: [],
-                currentExerciseIndex: 0,
-                A1List: [],
-                A2List: [],
-                B1List: [],
-                B2List: [],
-                tableColumns: [
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text1'),
-                        key: 'id',
-                        width: 100,
-                        renderType: 'renderEventIndex'
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text2'),
-                        key: 'type',
-                        minWidth: 100,
+	import BaseTestScatter from '@/components/student-analysis/total/BaseTestScatter.vue'
+	import BaseTable from '@/components/student-analysis/total/BaseMyTable.vue'
+	import BaseLineBar from '@/components/student-analysis/total/BaseLineBar.vue'
+	export default {
+		components: {
+			BaseTestScatter,
+			BaseTable,
+			BaseLineBar
+		},
+		data() {
+			return {
+				tableData: [],
+				scatterData: [],
+				exerciseIndexList: [],
+				currentExerciseIndex: 0,
+				A1List: [],
+				A2List: [],
+				B1List: [],
+				B2List: [],
+				tableColumns: [{
+						title: this.$t('totalAnalysis.ta_table_text1'),
+						key: 'id',
+						width: 100,
+						renderType: 'renderEventIndex'
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text2'),
+						key: 'type',
+						minWidth: 100,
+						renderType: function(h, params) {
+							return h('span', params.row.type || '暂无')
+						},
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text3'),
+						key: 'knowledge',
+						minWidth: 150,
+						renderType: function(h, params) {
+							return h('span', params.row.knowledge || '暂无')
+						},
+					},
+					{
+						title: this.$t('totalAnalysis.sca_table_text6'),
+						key: 'areaName',
+						minWidth: 100
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text4'),
+						key: 'score',
+						sortable: true,
+						minWidth: 80
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text5'),
+						key: 'diff',
+						sortable: true,
+						minWidth: 100,
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.diff) * 100).toFixed(0) + '%')
+						},
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text6'),
+						key: 'identify',
+						renderType: function(h, params) {
+							return h('span', Number(params.row.identify).toFixed(0))
+						},
+						minWidth: 120
+					},
+					{
+						title: 'R1',
+						key: 'R1',
+						sortable: true,
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R1) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R2',
+						key: 'R2',
+						sortable: true,
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R2) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R3',
+						sortable: true,
+						key: 'R3',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R3) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R4',
+						sortable: true,
+						key: 'R4',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R4) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R5',
+						sortable: true,
+						key: 'R5',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R5) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R6',
+						sortable: true,
+						key: 'R6',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R6) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					}
+				],
+				exerciseColumns: [{
+						title: this.$t('totalAnalysis.ta_table_text1'),
+						key: 'id',
+						fixed: 'left',
+						width: 100,
+						renderType: 'renderEventIndex'
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text10'),
+						key: 'PH',
+						sortable: true,
 						renderType: function(h, params) {
 						renderType: function(h, params) {
-						    return h('span', params.row.type || '暂无')
+							return h('span', (Number(params.row.PH) * 100).toFixed(0) + '%')
 						},
 						},
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text3'),
-                        key: 'knowledge',
-                        minWidth: 150,
+						width: 150
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text11'),
+						key: 'PL',
+						sortable: true,
 						renderType: function(h, params) {
 						renderType: function(h, params) {
-						    return h('span', params.row.knowledge || '暂无')
+							return h('span', (Number(params.row.PL) * 100).toFixed(0) + '%')
 						},
 						},
-                    },
-                    {
-                        title: this.$t('totalAnalysis.sca_table_text6'),
-                        key: 'areaName',
-                        minWidth: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text4'),
-                        key: 'score',
-                        sortable: true,
-                        minWidth: 80
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text5'),
-                        key: 'diff',
-                        sortable: true,
-                        minWidth: 100,
+						width: 150
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text8'),
+						key: 'examScoreRate',
+						sortable: true,
 						renderType: function(h, params) {
 						renderType: function(h, params) {
-						    return h('span', (Number(params.row.diff) * 100).toFixed(0) + '%')
+							return h('span', (Number(params.row.examScoreRate)).toFixed(0) + '%')
 						},
 						},
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text6'),
-                        key: 'identify',
-                        renderType: function(h, params) {
-                            return h('span', Number(params.row.identify).toFixed(0))
-                        },
-                        minWidth: 120
-                    },
-                    {
-                        title: 'R1',
-                        key: 'R1',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R1) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R2',
-                        key: 'R2',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R2) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R3',
-                        sortable: true,
-                        key: 'R3',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R3) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R4',
-                        sortable: true,
-                        key: 'R4',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R4) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R5',
-                        sortable: true,
-                        key: 'R5',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R5) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R6',
-                        sortable: true,
-                        key: 'R6',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R6) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    }
-                ],
-                exerciseColumns: [
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text1'),
-                        key: 'id',
-                        fixed: 'left',
-                        width: 100,
-                        renderType: 'renderEventIndex'
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text10'),
-                        key: 'PH',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.PH) * 100).toFixed(0) + '%')
-                        },
-                        width: 150
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text11'),
-                        key: 'PL',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.PL) * 100).toFixed(0) + '%')
-                        },
-                        width: 150
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text8'),
-                        key: 'examScoreRate',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.examScoreRate)).toFixed(0) + '%')
-                        },
-                        width: 150
-                    },
-                    // {
-                    //     title: this.$t('totalAnalysis.ta_table_text9'),
-                    //     key: 'areaScoreRate',
-                    //     sortable: true,
-                    //     renderType: function(h, params) {
-                    //         return h('span', (Number(params.row.areaScoreRate)).toFixed(0) + '%')
-                    //     },
-                    //     width: 150
-                    // }
-                ]
-            }
-        },
-        created() {
-				this.$parent.$parent.$parent.isShowQuestions = false
-        },
+						width: 150
+					},
+					// {
+					//     title: this.$t('totalAnalysis.ta_table_text9'),
+					//     key: 'areaScoreRate',
+					//     sortable: true,
+					//     renderType: function(h, params) {
+					//         return h('span', (Number(params.row.areaScoreRate)).toFixed(0) + '%')
+					//     },
+					//     width: 150
+					// }
+				]
+			}
+		},
+		created() {
+			this.$parent.$parent.$parent.isShowQuestions = false
+		},
 
 
-        methods: {
-            renderClassColumns(classData) {
+		methods: {
+			renderClassColumns(classData) {
 				let classCloumns = []
 				let classCloumns = []
-                // 渲染进线表格的班级数据
-                classData.classes.forEach(item => {
-                    let classColumn = {
-                        title: item.className,
-                        sortable: 'custom',
-                        key: item.className,
-                        render: (h, params) => {
-                            return h('span', (Number(params.row[item.className])).toFixed(0) + '%')
-                        },
-                        minWidth: 150
-                    }
-                    classCloumns.push(classColumn)
-                })
-				
-				this.exerciseColumns.splice(4,this.exerciseColumns.length - 4,...classCloumns)
-            },
+				// 渲染进线表格的班级数据
+				classData.classes.forEach(item => {
+					let classColumn = {
+						title: item.className,
+						sortable: 'custom',
+						key: item.className,
+						render: (h, params) => {
+							return h('span', (Number(params.row[item.className])).toFixed(0) + '%')
+						},
+						minWidth: 150
+					}
+					classCloumns.push(classColumn)
+				})
+
+				this.exerciseColumns.splice(4, this.exerciseColumns.length - 4, ...classCloumns)
+			},
 
 
-            // 点击落点图某个点事件
-            handleItemClick(item) {
-                let index = item.data[item.data.length - 1]
-                this.currentExerciseIndex = index > 9 ? '' + index : '0' + index
+			// 点击落点图某个点事件
+			handleItemClick(item) {
+				let index = item.data[item.data.length - 1]
+				this.currentExerciseIndex = index > 9 ? '' + index : '0' + index
+
+				// 题目编号联动
+				this.$nextTick(() => {
+					let indexDomList = Array.prototype.slice.call(document.getElementsByClassName(
+						'scatter-exercise-index'))
+					let hignlightIndexDom = indexDomList.filter(item => +item.innerText === +this
+						.currentExerciseIndex)
+					indexDomList.forEach(item => {
+						item.style.background = 'transparent'
+					})
+					if (hignlightIndexDom.length) {
+						hignlightIndexDom[0].style.background = '#018b99'
+						hignlightIndexDom[0].style.borderRadius = '50%'
+					}
+				})
+			},
+
+			onIndexClick(item) {
+				this.handleItemClick({
+					data: [+item]
+				})
+			},
 
 
-                // 题目编号联动
-                this.$nextTick(() => {
-                    let indexDomList = Array.prototype.slice.call(document.getElementsByClassName('scatter-exercise-index'))
-                    let hignlightIndexDom = indexDomList.filter(item => +item.innerText === +this.currentExerciseIndex)
-                    indexDomList.forEach(item => {
-                        item.style.background = 'transparent'
-                    })
-                    if (hignlightIndexDom.length) {
-                        hignlightIndexDom[0].style.background = '#018b99'
-                        hignlightIndexDom[0].style.borderRadius = '50%'
-                    }
-                })
-            },
+			handleIndexClick(index) {
+				this.$router.push({
+					path: '/total/questionList',
+					query: {
+						QIndex: index
+					}
+				})
+			},
 
 
-            onIndexClick(item) {
-                this.handleItemClick({ data: [+item] })
-            },
 
 
-            handleIndexClick(index) {
-                this.$router.push({ path: '/total/questionList', query: { QIndex: index } })
-            },
-			
-			
 			// 调整图表所需数据结构格式
 			// 调整图表所需数据结构格式
 			renderData(data) {
 			renderData(data) {
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
-				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
+				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis
+					.currentSubject)
 				let result = []
 				let result = []
-				analysisJson.paper[curSubjectIndex].Value.forEach((exercise,exerciseIndex) => {
+				analysisJson.paper[curSubjectIndex].Value.forEach((exercise, exerciseIndex) => {
 					let obj = {}
 					let obj = {}
 					analysisJson.paperKey.forEach((key, index) => {
 					analysisJson.paperKey.forEach((key, index) => {
 						obj[key] = exercise[index]
 						obj[key] = exercise[index]
 					})
 					})
-					
+
 					analysisJson.classes.forEach(classItem => {
 					analysisJson.classes.forEach(classItem => {
 						obj[classItem.className] = classItem.subjects[curSubjectIndex].item[exerciseIndex]
 						obj[classItem.className] = classItem.subjects[curSubjectIndex].item[exerciseIndex]
 					})
 					})
@@ -348,8 +344,8 @@
 				console.log(result)
 				console.log(result)
 				return result
 				return result
 			},
 			},
-			
-			doRender(analysisJson){
+
+			doRender(analysisJson) {
 				let exerciseList = this.renderData(analysisJson)
 				let exerciseList = this.renderData(analysisJson)
 				this.renderClassColumns(analysisJson)
 				this.renderClassColumns(analysisJson)
 				this.exerciseIndexList = exerciseList.map(item => item.id)
 				this.exerciseIndexList = exerciseList.map(item => item.id)
@@ -359,12 +355,13 @@
 				this.B2List = exerciseList.filter(item => item.areaName === 'B-')
 				this.B2List = exerciseList.filter(item => item.areaName === 'B-')
 				this.tableData = JSON.parse(JSON.stringify(exerciseList))
 				this.tableData = JSON.parse(JSON.stringify(exerciseList))
 				this.getScatterData()
 				this.getScatterData()
-				console.log('最新试题数据',this.tableData)
+				console.log('最新试题数据', this.tableData)
 			},
 			},
-			
-			getScatterData(){
+
+			getScatterData() {
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
-				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
+				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis
+					.currentSubject)
 				let result = []
 				let result = []
 				analysisJson.paper[curSubjectIndex].Value.forEach((exercise, exerciseIndex) => {
 				analysisJson.paper[curSubjectIndex].Value.forEach((exercise, exerciseIndex) => {
 					let obj = {}
 					let obj = {}
@@ -385,37 +382,39 @@
 				})
 				})
 				this.scatterData = newArr
 				this.scatterData = newArr
 			},
 			},
-			
-			getLineBarData(){
-				
+
+			getLineBarData() {
+
 			}
 			}
-        },
+		},
 
 
-        mounted() {
-            this.$refs.analysisTable.$el.childNodes[1].style.borderRight = '0'
-            this.handleItemClick({ data: [1] })
+		mounted() {
+			this.$refs.analysisTable.$el.childNodes[1].style.borderRight = '0'
+			this.handleItemClick({
+				data: [1]
+			})
 			this.getAnalysisJson && this.doRender(this.getAnalysisJson)
 			this.getAnalysisJson && this.doRender(this.getAnalysisJson)
-			
+
 			this.$EventBus.$off('onSubjectChange')
 			this.$EventBus.$off('onSubjectChange')
-			this.$EventBus.$on('onSubjectChange',val => {
+			this.$EventBus.$on('onSubjectChange', val => {
 				this.doRender(this.getAnalysisJson)
 				this.doRender(this.getAnalysisJson)
 				// this.$nextTick(() => {
 				// this.$nextTick(() => {
 				// 	this.$refs.lineBar.renderData(this.getAnalysisJson)
 				// 	this.$refs.lineBar.renderData(this.getAnalysisJson)
 				// })
 				// })
 			})
 			})
-        },
-        computed: {
-            // 获取最新试题分析模块数据
-            getAnalysisJson() {
-                return this.$store.state.totalAnalysis.analysisJson
-            }
-        }
-    }
+		},
+		computed: {
+			// 获取最新试题分析模块数据
+			getAnalysisJson() {
+				return this.$store.state.totalAnalysis.analysisJson
+			}
+		}
+	}
 </script>
 </script>
 
 
 <style src="./TestAnalysis.css" scoped></style>
 <style src="./TestAnalysis.css" scoped></style>
 <style>
 <style>
-    .scatter-container .ivu-poptip-content {
-        max-width:520px;
-    }
+	.scatter-container .ivu-poptip-content {
+		max-width: 520px;
+	}
 </style>
 </style>

+ 37 - 16
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.less

@@ -99,7 +99,7 @@ body, html, .total-container {
       flex-direction: column;
       flex-direction: column;
       justify-content: center;
       justify-content: center;
       width: 100%;
       width: 100%;
-      height: 130px;
+      height: 110px;
       padding-left: 50px;
       padding-left: 50px;
       margin-left: 30px;
       margin-left: 30px;
       border-bottom: 1px solid #595959;
       border-bottom: 1px solid #595959;
@@ -108,41 +108,40 @@ body, html, .total-container {
 }
 }
 .total-content {
 .total-content {
   .basic-info {
   .basic-info {
+	  font-size: 12px;
     .info-type {
     .info-type {
-      padding: 2px 10px;
+      padding: 1px 5px;
       color: #fbd103;
       color: #fbd103;
       border-radius: 5px;
       border-radius: 5px;
       border: 1px solid #fbd103;
       border: 1px solid #fbd103;
       vertical-align: super;
       vertical-align: super;
     }
     }
     .info-subject {
     .info-subject {
-      padding: 5px 10px;
+      padding: 2px 6px;
       color: #eee;
       color: #eee;
-      border-radius: 5px;
+      border-radius: 3px;
       vertical-align: super;
       vertical-align: super;
       margin-left: 10px;
       margin-left: 10px;
       background: #419901;
       background: #419901;
     }
     }
     .info-grade {
     .info-grade {
-      padding: 5px 10px;
+      padding: 2px 6px;
       color: #eee;
       color: #eee;
-      border-radius: 5px;
+      border-radius: 3px;
       vertical-align: super;
       vertical-align: super;
       margin-left: 10px;
       margin-left: 10px;
       background: #018b99;
       background: #018b99;
     }
     }
     .info-name {
     .info-name {
       color: #fff;
       color: #fff;
-      font-size: 34px;
-      margin-left: 20px;
-      margin-top: 5px;
+      font-size: 22px;
+      margin-left: 10px;
       cursor: pointer;
       cursor: pointer;
     }
     }
     .info-date-person {
     .info-date-person {
       margin-top: 10px;
       margin-top: 10px;
       display: flex;
       display: flex;
       color: #9e9e9e;
       color: #9e9e9e;
-      font-size: 14px;
       .info-item {
       .info-item {
         margin-left: 20px;
         margin-left: 20px;
         &:first-child {
         &:first-child {
@@ -156,10 +155,10 @@ body, html, .total-container {
   }
   }
   .basic-tools {
   .basic-tools {
     position: absolute;
     position: absolute;
-    bottom: 5px;
-    right: 20px;
+    bottom: 8px;
+    right: 40px;
     color: #d1d1d1;
     color: #d1d1d1;
-    font-size: 14px;
+    font-size: 12px;
     .basic-tool-export {
     .basic-tool-export {
       padding: 5px 10px;
       padding: 5px 10px;
       background: none;
       background: none;
@@ -170,7 +169,7 @@ body, html, .total-container {
       margin-bottom: 6px;
       margin-bottom: 6px;
     }
     }
     .ivu-icon {
     .ivu-icon {
-      font-size: 18px;
+      font-size: 14px;
 	  margin-right: 2px;
 	  margin-right: 2px;
       vertical-align: text-bottom;
       vertical-align: text-bottom;
     }
     }
@@ -182,13 +181,13 @@ body, html, .total-container {
     }
     }
   }
   }
   .data-select {
   .data-select {
-    padding: 25px 22px;
+    padding: 25px 0 0 22px;
     color: #9e9e9e;
     color: #9e9e9e;
     font-size: 14px;
     font-size: 14px;
     font-weight: bold;
     font-weight: bold;
     .data-select-active {
     .data-select-active {
       color: #fff;
       color: #fff;
-      border-bottom: 2px solid #fff;
+      border-bottom: 3px solid #42beda;
     }
     }
   }
   }
   .data-select-items {
   .data-select-items {
@@ -210,6 +209,28 @@ body, html, .total-container {
   }
   }
 }
 }
 
 
+.subject-tab{
+	display:inline-block;
+	vertical-align: bottom;
+	margin-bottom: 0;
+	
+	&-item{
+		display: inline-block;
+		margin-right: 20px;
+		padding: 0 8px 2px 8px;
+		cursor: pointer;
+	}
+	&-item-active{
+		border-bottom: 2px solid #fff;
+		color: #fff;
+	}
+}
+
+.class-subject-select{
+	padding: 10px 0 10px 50px;
+	margin-top: 30px;
+}
+
 
 
 .fl-col-center {
 .fl-col-center {
   display: flex;
   display: flex;

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

@@ -1,259 +1,339 @@
 <template>
 <template>
-    <div class="total-container">
-        <div class="total-body">
-            <!-- 评测列表展示组件 -->
-            <!-- 右侧数据展示区域 -->
-            <div class="total-content" ref="dataContainer">
-                <vuescroll ref="vs" @handle-scroll="handleScroll">
-                    <div class="back-to-top fl-col-center" title="返回顶部" v-if="isShowBackToTop" @click="handleBackToTop">
-                        <Icon type="ios-arrow-up" />
-                    </div>
-                    <!--<Spin fix v-show="contentLoading"></Spin>-->
-                    <Loading :top="400" :borderWidth="4" :borderTopWidth="8" v-show="contentLoading" type="2"></Loading>
-					<div class="total-tools-wrap">
+	<div class="total-container">
+		<div class="total-body">
+			<!-- 评测列表展示组件 -->
+			<!-- 右侧数据展示区域 -->
+			<div class="total-content" ref="dataContainer">
+				<vuescroll ref="vs" @handle-scroll="handleScroll">
+					<div class="back-to-top fl-col-center" title="返回顶部" v-if="isShowBackToTop" @click="handleBackToTop">
+						<Icon type="ios-arrow-up" />
+					</div>
+					<!--<Spin fix v-show="contentLoading"></Spin>-->
+					<Loading :top="400" :borderWidth="4" :borderTopWidth="8" v-show="contentLoading" type="2"></Loading>
+
+					<div class="basic-info" v-if="!isShowEvaluations && currentExamItem.name">
+						<p style="display: flex;align-items: center;">
+							<span class="info-type"
+								:style="{color:colorTransfer[currentExamItem.type] || 'red',borderColor:colorTransfer[currentExamItem.type]|| 'red'}">{{nameTransfer[currentExamItem.type]}}</span>
+							<span class="info-name">{{currentExamItem.name}}</span>
+							<span class="info-grade">{{currentExamItem.period.name}}</span>
+							<span class="info-subject" v-for="(subject,index) in currentExamItem.subjects"
+								:key="index">{{subject.name}}</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 || '2019-02-11'}}</span></span>-->
+							<span class="info-item">{{$t('totalAnalysis.echarts_text11')}}: <span
+									style="color:#fff;font-weight:bold">{{ $tools.formatTime(currentExamItem.startTime,'yyyy-MM-dd')}}</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">{{currentExamItem.stuCount || 0}}</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
+									style="color:#fff;font-weight:bold">{{totalAverage}}</span></span>
+						</p>
 						<div class="basic-tools">
 						<div class="basic-tools">
-						    <span class="basic-tool-export" @click="handleExportTables"><Icon type="md-cloud-download" /> {{$t('totalAnalysis.exportTable')}} </span>
-						    <span class="basic-tool-export" @click="goEvaluationList"> <Icon type="md-exit" /> {{$t('totalAnalysis.goExamList')}} </span>
+							<span class="basic-tool-export" @click="handleExportTables">
+								<Icon type="md-cloud-download" /> {{$t('totalAnalysis.exportTable')}}
+							</span>
+							<span class="basic-tool-export" @click="goEvaluationList">
+								<Icon type="md-exit" /> {{$t('totalAnalysis.goExamList')}}
+							</span>
 						</div>
 						</div>
-					</div>
-                    <div class="basic-info" v-if="!isShowEvaluations && currentExamItem.name">
-                        <p>
-                            <span class="info-type" :style="{color:colorTransfer[currentExamItem.type] || 'red',borderColor:colorTransfer[currentExamItem.type]|| 'red'}">{{nameTransfer[currentExamItem.type]}}</span>
-                            <span class="info-name">{{currentExamItem.name}}</span>
-                            <span class="info-grade">{{currentExamItem.period.name}}</span>
-                            <span class="info-subject" v-for="(subject,index) in currentExamItem.subjects" :key="index">{{subject.name}}</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 || '2019-02-11'}}</span></span>-->
-                            <span class="info-item">{{$t('totalAnalysis.echarts_text11')}}: <span style="color:#fff;font-weight:bold">{{ $tools.formatTime(currentExamItem.startTime,'yyyy-MM-dd')}}</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">{{currentExamItem.stuCount || 0}}</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 style="color:#fff;font-weight:bold">{{totalAverage}}</span></span>
-                        </p>
-                        <!-- <div class="basic-tools">
+						<!-- <div class="basic-tools">
                             <span class="basic-tool-export" @click="handleExportTables"> {{$t('totalAnalysis.exportTable')}} <Icon type="md-archive" /></span>
                             <span class="basic-tool-export" @click="handleExportTables"> {{$t('totalAnalysis.exportTable')}} <Icon type="md-archive" /></span>
                             <span class="basic-tool-export" @click="goEvaluationList"> 查看更多评测 <Icon type="md-arrow-round-forward" /></span>
                             <span class="basic-tool-export" @click="goEvaluationList"> 查看更多评测 <Icon type="md-arrow-round-forward" /></span>
                         </div> -->
                         </div> -->
-                    </div>
-                    <div class="data-select" v-if="!isShowQuestions" ref="dataSelect">
-                        <div class="data-select-items" style="display:inline-block">
-                            <span :class="this.$route.path == '/total' || this.$route.path.indexOf('/total/achievement') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('0')">{{$t('totalAnalysis.module1')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/scatter') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('1')">{{$t('totalAnalysis.module2')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/test') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('2')">{{$t('totalAnalysis.module3')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/knowledge') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('3')">{{$t('totalAnalysis.module4')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/cognitionLevel') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('4')">{{$t('totalAnalysis.module5')}}</span>
-                        </div>
-                        <span style="float:right;margin-bottom:4px;" v-if="dataSelectIndex !== '0'">
-                            <span class="select-title">{{$t('totalAnalysis.currentSubject')}}:</span>
-                            <Select v-model="subjectSelectVal" style="width:150px" @on-change="handleSubjectChange">
-                                <Option v-for="(item,index) in getSubjectList" :value="item" :key="index" :label="item"></Option>
-                            </Select>
-                        </span>
-                    </div>
-                    <div class="data-container" style="position:relative" ref="routerView">
-                        <Loading :top="300" v-show="dataLoading"></Loading>
-                        <transition name="fade">
-                            <router-view/>
-                        </transition>
-                    </div>
-                </vuescroll>
-            </div>
-        </div>
-
-        <!-- 导出表格弹窗  -->
-        <Modal v-model="isExportTables" width="660" footer-hide class="export-modal">
-            <ExportTables></ExportTables>
-        </Modal>
-
-    </div>
+					</div>
+					<div class="data-select" v-if="!isShowQuestions" ref="dataSelect">
+						<div class="data-select-items" style="display:inline-block">
+							<span
+								:class="this.$route.path == '/total' || this.$route.path.indexOf('/total/achievement') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('0')">{{$t('totalAnalysis.module1')}}</span>
+							<span :class="this.$route.path.indexOf('/total/scatter') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('1')">{{$t('totalAnalysis.module2')}}</span>
+							<span :class="this.$route.path.indexOf('/total/test') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('2')">{{$t('totalAnalysis.module3')}}</span>
+							<span :class="this.$route.path.indexOf('/total/knowledge') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('3')">{{$t('totalAnalysis.module4')}}</span>
+							<span
+								:class="this.$route.path.indexOf('/total/cognitionLevel') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('4')">{{$t('totalAnalysis.module5')}}</span>
+						</div>
+
+						<div v-if="dataSelectIndex === '0'" class="class-subject-select">
+							<Select v-model="currentClass" @on-change="onClassSelect" class="analysis-select">
+								<Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
+							</Select>
+							<div class="subject-tab" v-if="currentClass !== 0">
+								<span v-for="(subject,subjectIndex) in getSubjectList" :key="subjectIndex" @click="onEarlySubjectChange(subjectIndex)" :class="['subject-tab-item',curWarningSubjectIndex === subjectIndex ? 'subject-tab-item-active' : '']">{{ subject }}</span>
+							</div>
+						</div>
+						
+						<div v-if="dataSelectIndex !== '0'" class="class-subject-select">
+							<Select v-model="currentScatterClass" @on-change="onScatterClassSelect" class="analysis-select" v-if="dataSelectIndex === '1'">
+								<Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
+							</Select>
+							<div class="subject-tab">
+								<span v-for="(subject,subjectIndex) in getSubjectList" :key="subjectIndex" @click="handleSubjectChange(subject)" :class="['subject-tab-item',subjectSelectVal === subject ? 'subject-tab-item-active' : '']">{{ subject }}</span>
+							</div>
+						</div>
+
+						<!-- <span style="float:right;margin-bottom:4px;" v-if="dataSelectIndex !== '0'">
+							<span class="select-title">{{$t('totalAnalysis.currentSubject')}}:</span>
+							<Select v-model="subjectSelectVal" style="width:150px" @on-change="handleSubjectChange">
+								<Option v-for="(item,index) in getSubjectList" :value="item" :key="index" :label="item">
+								</Option>
+							</Select>
+						</span> -->
+					</div>
+					<div class="data-container" style="position:relative" ref="routerView">
+						<Loading :top="300" v-show="dataLoading"></Loading>
+						<transition name="fade">
+							<router-view />
+						</transition>
+					</div>
+				</vuescroll>
+			</div>
+		</div>
+
+		<!-- 导出表格弹窗  -->
+		<Modal v-model="isExportTables" width="660" footer-hide class="export-modal">
+			<ExportTables></ExportTables>
+		</Modal>
+
+	</div>
 </template>
 </template>
 
 
 <script>
 <script>
 	import FileSaver from "file-saver";
 	import FileSaver from "file-saver";
 	import JSZip from "jszip";
 	import JSZip from "jszip";
-    import Loading from '@/common/Loading.vue'
+	import Loading from '@/common/Loading.vue'
 	import excel from '@/utils/excel.js'
 	import excel from '@/utils/excel.js'
-    import '../../../utils/chalk.js'
-    import 'animate.css'
-    import BaseExamList from '@/common/BaseExamList.vue'
-    import ExportTables from '@/components/student-analysis/total/ExportTables.vue'
-    export default {
-        components: {
-            BaseExamList, ExportTables, Loading
-        },
-        data() {
-            return {
-                searchValue: '',
-                contentLoading: false,
-                dataLoading: false,
-                dataSelectIndex: '0',
-                menuIndex: 0,
-                isShowBackToTop: false,
-                isShowQuestions: false,
-                isShowEvaluations: false,
-                isSubMenuShow: false,
-                isExportTables: false,
-                currentExamItem: {},
-                subjectSelectVal: 0,
-                subjectSplitList: [],
-                subjectList: [],
-				examList:[],
-                colorTransfer: {
-                    'regular': '#fbd103',
-                    'simulation': '#baecff',
-                    'normal': '#00ff8a'
-                },
-				nameTransfer:{
+	import '../../../utils/chalk.js'
+	import 'animate.css'
+	import ExportTables from '@/components/student-analysis/total/ExportTables.vue'
+	export default {
+		components: {
+			ExportTables,
+			Loading
+		},
+		data() {
+			return {
+				searchValue: '',
+				contentLoading: false,
+				dataLoading: false,
+				dataSelectIndex: '0',
+				menuIndex: 0,
+				isShowBackToTop: false,
+				isShowQuestions: false,
+				isShowEvaluations: false,
+				isSubMenuShow: false,
+				isExportTables: false,
+				currentExamItem: {},
+				subjectSelectVal: 0,
+				subjectSplitList: [],
+				subjectList: [],
+				examList: [],
+				colorTransfer: {
+					'regular': '#fbd103',
+					'simulation': '#baecff',
+					'normal': '#00ff8a'
+				},
+				nameTransfer: {
 					'regular': '正规考',
 					'regular': '正规考',
 					'simulation': '模拟考',
 					'simulation': '模拟考',
 					'normal': '正常考'
 					'normal': '正常考'
 				},
 				},
-                scrollTopssss: 0,
-				totalAverage:0
-            }
-        },
-        async created() {
-			if(!this.$store.state.totalAnalysis.analysisJson && !localStorage.getItem('curExam')){
-				this.$store.dispatch('getAnalysisJson',{
-					code:this.$route.query.code,
-					id:this.$route.query.id
+				scrollTopssss: 0,
+				totalAverage: 0,
+				currentClass: 0,
+				currentScatterClass:0,
+				curWarningSubjectIndex:0,
+				classList: [],
+			}
+		},
+		async created() {
+			if (!this.$store.state.totalAnalysis.analysisJson && !localStorage.getItem('curExam')) {
+				this.$store.dispatch('getAnalysisJson', {
+					code: this.$route.query.code,
+					id: this.$route.query.id
 				}).then(res => {
 				}).then(res => {
 					console.log('index页面获取JSON')
 					console.log('index页面获取JSON')
 				})
 				})
 			}
 			}
-			
-        },
 
 
-        methods: {
+		},
+
+		methods: {
 			/* 获取当前评测的平均分 */
 			/* 获取当前评测的平均分 */
-			getTotalAverage(data){
+			getTotalAverage(data) {
 				let analysisJson = this.$store.state.totalAnalysis.analysisJson
 				let analysisJson = this.$store.state.totalAnalysis.analysisJson
-				let totalScore = analysisJson.students.reduce(function (total, currentValue, currentIndex, arr) {
-				        return total + currentValue.total;
-				    }, 0);
-					this.totalAverage = (totalScore / analysisJson.students.length).toFixed(2)
+				let totalScore = analysisJson.students.reduce(function(total, currentValue, currentIndex, arr) {
+					return total + currentValue.total;
+				}, 0);
+				this.totalAverage = (totalScore / analysisJson.students.length).toFixed(2)
+			},
+
+			onClassSelect(val) {
+				if (val === 0) {
+					this.$store.commit('updateExportTable', [{
+						tableRef: 'entryTable',
+						tableName: '进线情况统计'
+					}, {
+						tableRef: 'entryRateTable',
+						tableName: '进线率统计'
+					}, {
+						tableRef: 'achievementTable',
+						tableName: '预警统计表格'
+					}])
+					this.$router.push({
+						path: '/total'
+					})
+				} else {
+					this.curWarningSubjectIndex = 0
+					this.$store.commit('updateExportTable', [{
+						tableRef: 'earlyWarningTable',
+						tableName: this.$t('totalAnalysis.myTable.rank')
+					}])
+					if(this.$route.path === '/total/achievement/earlyWarning'){
+						this.$EventBus.$emit('changeClassName',this.classList[val])
+					}else{
+						this.$router.push({
+							path: '/total/achievement/earlyWarning',
+							query: {
+								name: this.classList[val]
+							}
+						})
+					}
+				}
 			},
 			},
 			
 			
-            // 选择查看模块
-            handleDataSelect(index) {
-                let path = ''
-                let that = this
-                this.dataSelectIndex = index + ''
-                this.dataLoading = true
-                switch (Number(index)) {
-                    case 0:
-                        path = '/total'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'entryTable',
-                            tableName:'进线情况统计'
-                        },{
-                            tableRef: 'entryRateTable',
-                            tableName:'进线率统计'
-                        },{
-                            tableRef: 'achievementTable',
-                            tableName:'预警统计表格'
-                        }])
-
-                        break
-                    case 1:
-                        path = '/total/scatter'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'scatterTable',
-                            tableName:'学生稳定度统计表'
-                        }])
-                        break
-                    case 2:
-                        path = '/total/test'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'exerciseAnalsisTable',
-                            tableName:'试题分析总表'
-                        },{
-                            tableRef: 'exerciseScoreRateTable',
-                            tableName:'试题得分率表'
-                        }])
-                        break
-                    case 3:
-                        path = '/total/knowledge'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'pointScoreRateTable',
-                            tableName:'知识点得分率关系表'
-                        },{
-                            tableRef: 'pointScoreTable',
-                            tableName:'知识点得分详情表'
-                        },{
-                            tableRef: 'pointWrongTable',
-                            tableName:'知识点错题率关系表'
-                        }])
-                        break
-                    case 4:
-                        path = '/total/cognitionLevel'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'levelScoreRateTable',
-                            tableName:'认知层次得分率关系表'
-                        },{
-                            tableRef: 'levelScoreTable',
-                            tableName:'认知层次得分详情表'
-                        },{
-                            tableRef: 'levelWrongTable',
-                            tableName:'认知层次错题率关系表'
-                        }])
-                        break
-                    default:
-                        break
-                }
+			onScatterClassSelect(val){
+				this.$EventBus.$emit('changeClassName',this.classList[val])
+			},
+
+			// 选择查看模块
+			handleDataSelect(index) {
+				let path = ''
+				let that = this
+				this.dataSelectIndex = index + ''
+				this.dataLoading = true
+				switch (Number(index)) {
+					case 0:
+						path = '/total'
+						this.currentClass = 0
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'entryTable',
+							tableName: '进线情况统计'
+						}, {
+							tableRef: 'entryRateTable',
+							tableName: '进线率统计'
+						}])
+
+						break
+					case 1:
+						path = '/total/scatter'
+						this.currentScatterClass = 0
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'scatterTable',
+							tableName: '学生稳定度统计表'
+						}])
+						break
+					case 2:
+						path = '/total/test'
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'exerciseAnalsisTable',
+							tableName: '试题分析总表'
+						}, {
+							tableRef: 'exerciseScoreRateTable',
+							tableName: '试题得分率表'
+						}])
+						break
+					case 3:
+						path = '/total/knowledge'
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'pointScoreRateTable',
+							tableName: '知识点得分率关系表'
+						}, {
+							tableRef: 'pointScoreTable',
+							tableName: '知识点得分详情表'
+						}, {
+							tableRef: 'pointWrongTable',
+							tableName: '知识点错题率关系表'
+						}])
+						break
+					case 4:
+						path = '/total/cognitionLevel'
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'levelScoreRateTable',
+							tableName: '认知层次得分率关系表'
+						}, {
+							tableRef: 'levelScoreTable',
+							tableName: '认知层次得分详情表'
+						}, {
+							tableRef: 'levelWrongTable',
+							tableName: '认知层次错题率关系表'
+						}])
+						break
+					default:
+						break
+				}
 				that.dataLoading = false
 				that.dataLoading = false
-                this.$router.push(path)
-            },
-			
+				this.$router.push(path)
+			},
+
 			// 查看更多评测列表
 			// 查看更多评测列表
 			goEvaluationList() {
 			goEvaluationList() {
-				this.$store.commit('clearAnalysis',null)
+				this.$store.commit('clearAnalysis', null)
 				this.$router.push({
 				this.$router.push({
-					name: 'totalIndex',
-					params: {
-						tabName: 'tab2'
-					}
+					name: 'totalIndex'
 				})
 				})
 			},
 			},
 
 
-            // 导出表格操作
-            handleExportTables() {
-                this.isExportTables = true
-            },
-
-            // 返回顶部
-            handleBackToTop() {
-                this.$refs['vs'].scrollTo(
-                    {
-                        y: '0'
-                    },
-                    500
-                )
-            },
-
-            // 切换科目时更换页面图表数据
-            handleSubjectChange(val) {
-                let that = this
-                // this.dataLoading = true
-				console.log('API===========================' + val)
-                this.$store.commit('updateCurSubject', val)
-				this.$EventBus.$emit('onSubjectChange',val)
-                
-            },
-
-            // 判断容器滚动距离
-            handleScroll(vertical, horizontal, nativeEvent) {
-                this.isShowBackToTop = vertical.scrollTop > 400
-                this.scrollTopssss = vertical.scrollTop
-                this.$store.commit('updateScrollTop', vertical.scrollTop)
-            },
+			// 导出表格操作
+			handleExportTables() {
+				this.isExportTables = true
+			},
+
+			// 返回顶部
+			handleBackToTop() {
+				this.$refs['vs'].scrollTo({
+						y: '0'
+					},
+					500
+				)
+			},
 			
 			
+			onEarlySubjectChange(index){
+				this.$EventBus.$emit('onEarlySubjectChange', index)
+				this.curWarningSubjectIndex = index
+			},
+
+			// 切换科目时更换页面图表数据
+			handleSubjectChange(val) {
+				console.log(val)
+				let that = this
+				// this.dataLoading = true
+				console.log('API===========================' + val)
+				this.$store.commit('updateCurSubject', val)
+				this.$EventBus.$emit('onSubjectChange', val)
+
+			},
+
+			// 判断容器滚动距离
+			handleScroll(vertical, horizontal, nativeEvent) {
+				this.isShowBackToTop = vertical.scrollTop > 400
+				this.scrollTopssss = vertical.scrollTop
+				this.$store.commit('updateScrollTop', vertical.scrollTop)
+			},
+
 			// 多选文件下载
 			// 多选文件下载
-			onMultipleDownLoad(val){
+			onMultipleDownLoad(val) {
 				let excelNums = this.$store.state.totalAnalysis.excelNums
 				let excelNums = this.$store.state.totalAnalysis.excelNums
-				if(val.length === excelNums){
+				if (val.length === excelNums) {
 					// 如果下载数据已全部获取到 则执行下载程序
 					// 如果下载数据已全部获取到 则执行下载程序
 					const zip = new JSZip();
 					const zip = new JSZip();
 					let promiseArr = []
 					let promiseArr = []
@@ -264,24 +344,30 @@
 					Promise.all(promiseArr).then(result => {
 					Promise.all(promiseArr).then(result => {
 						console.log(result)
 						console.log(result)
 						result.forEach(file => {
 						result.forEach(file => {
-							zip.file(file.name,file, { binary: true }); // 逐个添加文件
+							zip.file(file.name, file, {
+								binary: true
+							}); // 逐个添加文件
 						})
 						})
-						zip.generateAsync({ type: "blob" }).then(content => {
-						    // 生成二进制流
-						    FileSaver.saveAs(content, `${ result[0].name.split('.xlsx')[0] }等${ result.length} 个表格.zip`); // 利用file-saver保存文件
-						    this.isLoading = false;
+						zip.generateAsync({
+							type: "blob"
+						}).then(content => {
+							// 生成二进制流
+							FileSaver.saveAs(content,
+								`${ result[0].name.split('.xlsx')[0] }等${ result.length} 个表格.zip`
+								); // 利用file-saver保存文件
+							this.isLoading = false;
 						})
 						})
 					})
 					})
-					
+
 				}
 				}
 			},
 			},
 
 
-        },
-        mounted() {
+		},
+		mounted() {
 			let downLoadExcels = []
 			let downLoadExcels = []
-            let examIndex = this.$route.query.index
-			this.$nextTick(()=> {
-				if(this.$route.name !== 'earlyWarning'){
+			let examIndex = this.$route.query.index
+			this.$nextTick(() => {
+				if (this.$route.name !== 'earlyWarning') {
 					// this.getExamData(examIndex)
 					// this.getExamData(examIndex)
 				}
 				}
 			})
 			})
@@ -289,110 +375,147 @@
 			this.handleDataSelect(0)
 			this.handleDataSelect(0)
 			this.currentExamItem = JSON.parse(localStorage.getItem('curExam'))
 			this.currentExamItem = JSON.parse(localStorage.getItem('curExam'))
 			console.log(this.currentExamItem)
 			console.log(this.currentExamItem)
-        },
-        computed: {
-            getSubjectList() {
+
+			if (this.getAnalysisJson) {
+				this.classList = ['全部'].concat([...new Set(this.getAnalysisJson.classes.map(item => item
+					.className))]) // 获取班级列表
+			}
+		},
+		computed: {
+			// 获取最新成绩分析模块数据
+			getAnalysisJson() {
+				return this.$store.state.totalAnalysis.analysisJson
+			},
+			getSubjectList() {
 				this.subjectSelectVal = this.$store.state.totalAnalysis.currentSubject
 				this.subjectSelectVal = this.$store.state.totalAnalysis.currentSubject
-                return this.$store.state.totalAnalysis.subjectList
-            },
+				return this.$store.state.totalAnalysis.subjectList
+			},
 			getVuexExamList() {
 			getVuexExamList() {
-			    return this.$store.state.totalAnalysis.examList
+				return this.$store.state.totalAnalysis.examList
 			},
 			},
 			getVuexExcelData() {
 			getVuexExcelData() {
-			    return this.$store.state.totalAnalysis.exportTableParams
+				return this.$store.state.totalAnalysis.exportTableParams
 			},
 			},
-			getJoinRate(){
+			getJoinRate() {
 				return (this.currentExamItem.stuCount / this.currentExamItem.stuCount).toFixed(2) * 100 + '%'
 				return (this.currentExamItem.stuCount / this.currentExamItem.stuCount).toFixed(2) * 100 + '%'
 			}
 			}
-        },
-        // 监听部分路由变化
-        watch: {
-            '$route'(to, from) {
-                this.handleBackToTop()
-                if (to.path === '/total' && from.path === '/totalindex') {
-                    this.isShowEvaluations = false
-                    this.isShowQuestions = false
-                    this.$refs.examListRef.examIndex = to.query.index
-                }
-            },
-    //         getSubjectList(val) {
-    //             console.log('科目列表变化为' + val)
-    //             console.log(this.subjectList)
-				// console.log(this.$store.state.totalAnalysis.currentExam)
-    //             this.subjectList = val
-    //             this.subjectSelectVal = this.subjectList[0]
-    //             // this.handleSubjectChange(this.subjectSelectVal)
-    //         },
-            getVuexExamList(val) {
+		},
+		// 监听部分路由变化
+		watch: {
+			'$route'(to, from) {
+				this.handleBackToTop()
+				if (to.path === '/total' && from.path === '/totalindex') {
+					this.isShowEvaluations = false
+					this.isShowQuestions = false
+					this.$refs.examListRef.examIndex = to.query.index
+				}
+			},
+			getVuexExamList(val) {
 				console.log(val)
 				console.log(val)
-                if(val.length){
+				if (val.length) {
 					this.examList = val
 					this.examList = val
 				}
 				}
-            },
-			getVuexExcelData(val){
+			},
+			getVuexExcelData(val) {
 				console.log('表格数据变化')
 				console.log('表格数据变化')
 				console.log(val)
 				console.log(val)
 				this.onMultipleDownLoad(val)
 				this.onMultipleDownLoad(val)
 			}
 			}
-        }
-    }
+		}
+	}
 </script>
 </script>
 
 
 <style src="./index.less" lang="less" scoped></style>
 <style src="./index.less" lang="less" scoped></style>
 
 
-<style>
-    .total-content .basic-tools .ivu-input {
-        background: transparent;
-        border: 1px solid #595959;
-        height: 30px;
-        padding-left: 10px;
-        font-size: 14px;
-        font-weight: bold;
-        color: #a2a2a2;
-        box-shadow: none;
-        border-radius: 5px;
-    }
-
-        .total-content .basic-tools .ivu-input::-webkit-input-placeholder {
-            color: #616161;
-        }
-
-    .export-modal .ivu-modal-header {
-        display: none;
-    }
-
-    /*全科单科选择部分*/
-
-    .total-content .basic-tools .ivu-select {
-        margin: 5px 20px 5px 0;
-        height: 30px;
-    }
-
-    .total-content .ivu-select-single .ivu-select-selection {
-        height: 30px;
-        background: transparent;
-        border: 1px solid #595959;
-        box-shadow: none;
-        color: #cecece;
-    }
-
-    .total-content .ivu-select-single .ivu-select-placeholder {
-        height: 30px;
-        line-height: 30px;
-        font-size: 16px;
-    }
-
-    .total-content .ivu-spin-fix {
-        background: rgba(209, 209, 209, 0.51);
-    }
-
-    .total-content .ivu-spin-dot {
-        width: 100px;
-        height: 100px;
-    }
-
-    .export-modal .ivu-modal-content {
-        background: #fff;
-        color: #757575;
-    }
+<style lang="less">
+	.total-content .analysis-select {
+		width: 140px;
+		margin-right: 20px;
+
+		.ivu-select-selection {
+			width: 140px;
+			background-color: #252525e3 !important;
+			border-radius: 0;
+			border-color: #96969640 !important;
+		}
+
+		.ivu-select-dropdown {
+			background-color: #3c3c3c;
+
+			.ivu-select-item {
+				color: #e6e6e6;
+
+				&:hover {
+					background-color: #565656;
+				}
+			}
+
+			.ivu-select-item-focus {
+				background-color: #565656;
+			}
+		}
+	}
+
+	.total-content {
+		.basic-tools {
+			.ivu-input {
+				background: transparent;
+				border: 1px solid #595959;
+				height: 30px;
+				padding-left: 10px;
+				font-size: 14px;
+				font-weight: bold;
+				color: #a2a2a2;
+				box-shadow: none;
+				border-radius: 5px;
+
+				&::-webkit-input-placeholder {
+					color: #616161;
+				}
+			}
+
+			.ivu-select {
+				margin: 5px 20px 5px 0;
+				height: 30px;
+			}
+		}
+
+		.ivu-select-single {
+			.ivu-select-selection {
+				height: 30px;
+				background: transparent;
+				border: 1px solid #595959;
+				box-shadow: none;
+				color: #cecece;
+			}
+
+			.ivu-select-placeholder {
+				height: 30px;
+				line-height: 30px;
+				font-size: 16px;
+			}
+		}
+
+		.ivu-spin-fix {
+			background: rgba(209, 209, 209, 0.51);
+		}
+
+		.ivu-spin-dot {
+			width: 100px;
+			height: 100px;
+		}
+	}
+
+	.export-modal {
+		.ivu-modal-header {
+			display: none;
+		}
+
+		.ivu-modal-content {
+			background: #fff;
+			color: #757575;
+		}
+	}
+
+	/*全科单科选择部分*/
 </style>
 </style>

+ 6 - 2
TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue

@@ -345,13 +345,17 @@
 			 */
 			 */
 			async getVoteStudents(voteItem) {
 			async getVoteStudents(voteItem) {
 				this.isLoading = true
 				this.isLoading = true
-				let records = await this.getVoteRecord(voteItem)
+				try{
+					let records = await this.getVoteRecord(voteItem)
+				}catch(e){
+					this.isLoading = false
+				}
 				//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
 				//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
 				console.log('当前投票的作答数据======',records)
 				console.log('当前投票的作答数据======',records)
 				this.$api.schoolSetting.getClassroomStudent({
 				this.$api.schoolSetting.getClassroomStudent({
 					school_code: this.$store.state.userInfo.schoolCode,
 					school_code: this.$store.state.userInfo.schoolCode,
 					ids: voteItem.classes,
 					ids: voteItem.classes,
-					scope:voteItem.owner === this.$store.state.userInfo.schoolCode ? 'school' : 'private'
+					scope:voteItem.scope
 				}).then(res => {
 				}).then(res => {
 					if (!res.error && res.stus.length) {
 					if (!res.error && res.stus.length) {
 						let list = []
 						let list = []

+ 0 - 187
TEAMModelOS/Controllers/Common/SurveyController.cs

@@ -482,193 +482,6 @@ namespace TEAMModelOS.Controllers
             }
             }
             return Ok(new {records = res});
             return Ok(new {records = res});
         }
         }
-
-
-        /// <summary>
-        /// 问卷记录 当活动没结算且没有BlobUrl时则调用此接口
-        /// </summary>
-        /// <redis>
-        /// {"C":2,"A":2,"other":2}
-        /// </redis>
-        /// <param name="request">
-        /// !"id":"aaaa"
-        /// !"code":"Survey-hbcn"/"code":"Survey-1606285227"
-        /// </param>
-        /// <returns>
-        /// </returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("settlement")]
-        //[AuthToken(Roles = "teacher,student")]
-        public async Task<IActionResult> Settlement(JsonElement request)
-        {
-            try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                //活动id
-                if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
-                //活动分区
-                if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
-                Survey survey = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>(id.GetString(), new PartitionKey($"{code}"));
-                List<ChangeRecord> changeRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", $"{id}" }, { "PartitionKey", survey.progress } });
-                ActivityData data = null;
-                if (survey != null)
-                {
-                    var adid = survey.id;
-                    var adcode = $"Activity-{survey.school}";
-                    try {
-                        if (survey.scope == "school")
-                        {
-                            data = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<ActivityData>(adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                        }
-                        else if (survey.scope == "private")
-                        {
-                            data = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<ActivityData>(adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                        }
-                    } catch {
-                        data = null;
-                    }
-                    if (survey.ttl >= 1)
-                    {
-                        _azureRedis.GetRedisClient(8).KeyDelete($"Survey:Record:{survey.id}");
-                        _azureRedis.GetRedisClient(8).KeyDelete($"Survey:Submit:{survey.id}");
-                        if (data != null)
-                        {
-                            data.ttl = 1;
-                            if (survey.scope == "school")
-                            {
-                                data = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<ActivityData>(data, adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                            }
-                            else if (survey.scope == "private")
-                            {
-                                data = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<ActivityData>(data, adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                            }
-                        }
-                        await _dingDing.SendBotMsg($"问卷调查【{survey.name}-{survey.id}】被删除", GroupNames.醍摩豆服務運維群組);
-                        return Ok();
-                    }
-                    else
-                    {
-                        switch (survey.progress)
-                        {
-
-                            case "finish":
-                                var records = await _azureRedis.GetRedisClient(8).HashGetAllAsync($"Survey:Record:{survey.id}");
-                                List<dynamic> recs = new List<dynamic>();
-                                foreach (var rcd in records)
-                                {
-                                    var value = rcd.Value.ToString().ToObject<JsonElement>();
-                                    recs.Add(new { index = rcd.Name.ToString(), ans = value });
-                                }
-                                var cods = new { records = recs };
-                                //问卷整体情况
-                                await _azureStorage.UploadFileByContainer(survey.blobcntr, cods.ToJsonString(), "survey", $"{survey.id}/record.json");
-                                //结算每道题的答题情况
-
-                                var ContainerClient = _azureStorage.GetBlobContainerClient(survey.blobcntr);
-                                var route = ContainerClient.Uri.ToString();
-
-                                //获取
-
-                                try
-                                {
-                                    List<string> items = await ContainerClient.List($"survey/{survey.id}/urecord");
-                                    List<SurveyRecord> surveyRecords = new List<SurveyRecord>();
-                                    (string uri, string sas) blobAuth = _azureStorage.GetBlobContainerSAS(survey.blobcntr, BlobContainerSasPermissions.Read);
-                                    string sas = blobAuth.sas;
-                                    var rcode = await _clientFactory.CreateClient().GetAsync(new Uri($"{route}/survey/{survey.id}/record.json?{sas}"));
-                                    var jsonc = await JsonDocument.ParseAsync(await rcode.Content.ReadAsStreamAsync());
-                                    var Recordc = jsonc.RootElement.ToObject<JsonElement>();
-                                    HttpClient httpClient = _clientFactory.CreateClient();
-                                    await _dingDing.SendBotMsg($"问卷调查问题结算数据11111--->>{Recordc.ToJsonString()}", GroupNames.成都开发測試群組);
-                                    foreach (string item in items)
-                                    {
-                                        var url = $"{route}/{item}?{sas}";
-                                        var response = await httpClient.GetAsync(new Uri(url));
-                                        var json = await JsonDocument.ParseAsync(await response.Content.ReadAsStreamAsync());
-                                        var Record = json.RootElement.ToObject<SurveyRecord>();
-                                        surveyRecords.Add(Record);
-                                    }
-                                    await _dingDing.SendBotMsg($"问卷调查问题结算数据{surveyRecords.ToJsonString()}", GroupNames.成都开发測試群組);
-                                    for (int index = 0; index < survey.answers.Count; index++)
-                                    {
-                                        string url = $"{survey.id}/qrecord/{index}.json";
-                                        QuestionRecord question = new QuestionRecord() { index = index };
-                                        foreach (SurveyRecord record in surveyRecords)
-                                        {
-                                            if (record.ans.Count == survey.answers.Count)
-                                            {
-                                                foreach (var an in record.ans[index])
-                                                {
-                                                    //
-                                                    if (question.opt.ContainsKey(an))
-                                                    {
-                                                        if (question.opt[an] != null)
-                                                        {
-                                                            question.opt[an].Add(record.userid);
-                                                        }
-                                                        else
-                                                        {
-                                                            question.opt[an] = new HashSet<string>() { record.userid };
-                                                        }
-                                                    }
-                                                    else
-                                                    {
-                                                        if (survey.answers[index].Contains(an))
-                                                        {
-                                                            //如果是客观题code
-                                                            question.opt.Add(an, new HashSet<string> { record.userid });
-                                                        }
-                                                        else
-                                                        {
-                                                            //如果不是客观code
-                                                            question.other[record.userid] = an;
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                        await _azureStorage.UploadFileByContainer(survey.blobcntr, question.ToJsonString(), "survey", url);
-                                    }
-                                }
-                                catch (Exception ex)
-                                {
-                                    await _dingDing.SendBotMsg($"问卷调查问题结算异常{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
-                                }
-                                if (string.IsNullOrEmpty(survey.recordUrl))
-                                {
-                                    survey.recordUrl = $"/survey/{survey.id}/record.json";
-                                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Survey>(survey, survey.id, new Azure.Cosmos.PartitionKey(survey.code));
-                                }
-                                else
-                                {
-                                    //异动,且已经有结算记录则不必再继续。
-                                    //break;
-                                }
-                                // await Task.WhenAll(tasks);
-                                //更新结束状态
-                                data.progress = "finish";
-                                if (survey.scope == "school")
-                                {
-                                    await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                                }
-                                else if (survey.scope == "private")
-                                {
-                                    await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                                }
-                                break;
-                        }
-                    }
-
-                }
-                return Ok();
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},common/survey/find-id()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest(ex.StackTrace);
-            }
-        }
-
     }
     }
     public class QuestionRecord
     public class QuestionRecord
     {
     {

+ 0 - 123
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -482,128 +482,5 @@ namespace TEAMModelOS.Controllers.Learn
             }
             }
             else { return Ok(new { msgid = 0 }); }
             else { return Ok(new { msgid = 0 }); }
         }
         }
-
-        /// <summary>
-        /// 问卷记录 当活动没结算且没有BlobUrl时则调用此接口
-        /// </summary>
-        /// <redis>
-        /// {"C":2,"A":2,"other":2}
-        /// </redis>
-        /// <param name="request">
-        /// !"id":"aaaa"
-        /// !"code":"Survey-hbcn"/"code":"Survey-1606285227"
-        /// </param>
-        /// <returns>
-        /// </returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("settlement")]
-        //[AuthToken(Roles = "teacher,student")]
-        public async Task<IActionResult> Settlement(JsonElement request)
-        {
-            try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                //活动id
-                if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
-                //活动分区
-                if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
-                Vote vote = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Vote>(id.GetString(), new PartitionKey($"{code}"));
-                if (vote != null)
-                {
-                    ActivityData data;
-
-                    if (vote.progress == "finish")
-                    {
-                        //获取投票活动的所有投票记录
-                        var records = await _azureRedis.GetRedisClient(8).HashGetAllAsync($"Vote:Record:{vote.id}");
-                        //获取投票活动的选项及投票数
-                        var counts = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Vote:Count:{vote.id}");
-                        List<dynamic> countcds = new List<dynamic>();
-                        if (counts != null && counts.Length > 0)
-                        {
-                            foreach (var count in counts)
-                            {
-                                countcds.Add(new { code= count.Element.ToString() , count = (int)count.Score });
-                            }
-                        }
-                        List<Task<string>> tasks = new List<Task<string>>();
-                        List<VoteRecord> recordsBlob = new List<VoteRecord>();
-                        foreach (var rcd in records)
-                        {
-                            var value = rcd.Value.ToString().ToObject<VoteRecord>();
-                            recordsBlob.Add(value);
-                        }
-                        //分组每个人的 
-                        var gp = recordsBlob.GroupBy(x => x.userid).Select(x => new { key = x.Key, list = x.ToList() });
-                        foreach (var g in gp)
-                        {
-                            tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, g.list.ToJsonString(), "vote", $"{vote.id}/urecord/{g.key}.json"));
-                        }
-                        //处理活动方的记录, 
-                        string url = $"/vote/{vote.id}/record.json";
-                        vote.recordUrl = url;
-                        tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, new{ options = countcds, records = recordsBlob }   .ToJsonString(), "vote", $"{vote.id}/record.json"));
-                        //处理投票者的记录
-                        await Task.WhenAll(tasks);
-                        //
-                        if (string.IsNullOrEmpty(vote.recordUrl))
-                        {
-                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Vote>(vote, vote.id, new Azure.Cosmos.PartitionKey(vote.code));
-                        }
-                        //更新结束状态
-                        if (vote.scope == "school")
-                        {
-                            data = new ActivityData
-                            {
-                                id = vote.id,
-                                code = $"Activity-{vote.school}",
-                                type = "vote",
-                                name = vote.name,
-                                startTime = vote.startTime,
-                                endTime = vote.endTime,
-                                scode = vote.code,
-                                scope = vote.scope,
-                                progress = "finish",
-                                classes = vote.classes.IsNotEmpty() ? vote.classes : new List<string> { "" },
-                                tmdids = vote.tmdids.IsNotEmpty() ? vote.tmdids : new List<string> { "" },
-                                subjects = new List<string> { "" }
-
-                            };
-                            await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                        }
-                        else if (vote.scope == "private")
-                        {
-                            //更新结束状态
-                            data = new ActivityData
-                            {
-                                id = vote.id,
-                                code = $"Activity-Common",
-                                type = "vote",
-                                name = vote.name,
-                                startTime = vote.startTime,
-                                endTime = vote.endTime,
-                                scode = vote.code,
-                                scope = vote.scope,
-                                progress = "finish",
-                                classes = vote.classes.IsNotEmpty() ? vote.classes : new List<string> { "" },
-                                tmdids = new List<string> { "" },
-                                subjects = new List<string> { "" }
-                            };
-                            await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                        }
-                    }
-                    return Ok(new { vote });
-                }
-                else
-                {
-                    return BadRequest("id,code不存在!");
-                }
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},common/survey/find-id()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest(ex.StackTrace);
-            }
-        }
     }
     }
 }
 }

+ 16 - 13
TEAMModelOS/Controllers/School/CourseController.cs

@@ -852,19 +852,20 @@ namespace TEAMModelOS.Controllers
             if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
             if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
             if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
             if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
-            List<Course> courseList = new List<Course>();
+            HashSet<Course> courseList = new HashSet<Course>();
             List<object> courses = new List<object>();
             List<object> courses = new List<object>();
             //var query = $"select c.code,c.id,c.name from c join A0 in c.schedule where A0.classId = '{id}'";
             //var query = $"select c.code,c.id,c.name from c join A0 in c.schedule where A0.classId = '{id}'";
+            //此处存在不同老师在同一间教室上相同的课程
             if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
             if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
             {
             {
-                var query = $"select value(c) from c join A0 in c.schedule where A0.classId = '{id}'";
+                var query = $"select distinct value(c) from c join A0 in c.schedule where A0.classId = '{id}'";
                 await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
                 await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
                 {
                 {
                     courseList.Add(item);
                     courseList.Add(item);
                 }
                 }
             }
             }
             else {
             else {
-                var query = $"select value(c) from c join A0 in c.schedule where A0.stulist = '{id}'";
+                var query = $"select distinct value(c) from c join A0 in c.schedule where A0.stulist = '{id}'";
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
                 {
                 {
                     courseList.Add(item);
                     courseList.Add(item);
@@ -878,20 +879,22 @@ namespace TEAMModelOS.Controllers
                     }
                     }
             }
             }
             List<(string id, string name)> teachers = new List<(string id, string name)>();
             List<(string id, string name)> teachers = new List<(string id, string name)>();
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(
-                                queryText: $"select c.id,c.name from c where c.id in ({ string.Join(",", teacherIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
-            {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+            if (teacherIds.Count > 0 ) {                
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(
+                                    queryText: $"select c.id,c.name from c where c.id in ({ string.Join(",", teacherIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
                 {
                 {
-                    var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                    while (accounts.MoveNext())
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
                     {
-                        JsonElement account = accounts.Current;
-                        teachers.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));                       
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
+                        {
+                            JsonElement account = accounts.Current;
+                            teachers.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
+                        }
                     }
                     }
                 }
                 }
-            }
+            }            
             foreach (Course course in courseList) {
             foreach (Course course in courseList) {
                 dynamic courseExtobj = new ExpandoObject();
                 dynamic courseExtobj = new ExpandoObject();
                 courseExtobj.id = course.id;
                 courseExtobj.id = course.id;

+ 11 - 1
TEAMModelOS/Services/Common/ActivityStudentService.cs

@@ -547,7 +547,17 @@ namespace TEAMModelOS.Services.Common
                                 //处理other ,这里暂不处理, 结算再处理other 
                                 //处理other ,这里暂不处理, 结算再处理other 
                                 //await Task.WhenAll(tasks);
                                 //await Task.WhenAll(tasks);
                                 //保存当前提交人的记录
                                 //保存当前提交人的记录
-                                await _azureStorage.UploadFileByContainer(survey.blobcntr, new SurveyRecord { ans= recs, userid=userid, time = curr }.ToJsonString(), "survey", $"{survey.id}/urecord/{userid}.json");
+
+                                string blobcntr = null;
+                                if (survey.scope == "school")
+                                {
+                                    blobcntr = survey.school;
+                                }
+                                else if (survey.scope == "private")
+                                {
+                                    blobcntr = survey.creatorId;
+                                }
+                                await _azureStorage.UploadFileByContainer(blobcntr, new SurveyRecord { ans= recs, userid=userid, time = curr }.ToJsonString(), "survey", $"{survey.id}/urecord/{userid}.json");
                                 await azureRedis.GetRedisClient(8).SetAddAsync($"Survey:Submit:{survey.id}", userid);
                                 await azureRedis.GetRedisClient(8).SetAddAsync($"Survey:Submit:{survey.id}", userid);
                                 msgid = 1;
                                 msgid = 1;
                             }
                             }