Просмотр исходного кода

Merge branch 'develop' of http://163.228.141.122:3000/TEAMMODEL/TEAMModelOS into develop

XW 6 месяцев назад
Родитель
Сommit
559ab46ce2

+ 2 - 2
TEAMModelBI/ClientApp/src/language/lang/zh-cn.js

@@ -959,8 +959,8 @@ const zh_cn = {
         VDPGJ6NC: '劳动教育服务',
         VDPGJ6NC: '劳动教育服务',
         YPXSJ6NJ: '五育看板',
         YPXSJ6NJ: '五育看板',
         IPALB6EY: 'IES5个人空间',
         IPALB6EY: 'IES5个人空间',
-        Z6ELB6EZ: 'HiTeach5ID授权',
-        VA67B6EZ: 'HiTeach5县市授权',
+        Z6ELB6EZ: 'HiTeach5 ID授权',
+        VA67B6EZ: 'HiTeach5 县市授权',
         VAA7B6EY: 'IES5个人空间县市授权',
         VAA7B6EY: 'IES5个人空间县市授权',
     },
     },
     aprule: {
     aprule: {

+ 2 - 2
TEAMModelBI/ClientApp/src/language/lang/zh-tw.js

@@ -952,8 +952,8 @@ const zh_tw = {
         VDPGJ6NC: '勞動教育服務',
         VDPGJ6NC: '勞動教育服務',
         YPXSJ6NJ: '五育看板',
         YPXSJ6NJ: '五育看板',
         IPALB6EY: 'IES5個人空間',
         IPALB6EY: 'IES5個人空間',
-        Z6ELB6EZ: 'HiTeach5ID授權',
-        VA67B6EZ: 'HiTeach5縣市授權',
+        Z6ELB6EZ: 'HiTeach5 ID授權',
+        VA67B6EZ: 'HiTeach5 縣市授權',
         VAA7B6EY: 'IES5個人空間縣市授權',
         VAA7B6EY: 'IES5個人空間縣市授權',
     },
     },
     aprule: {
     aprule: {

+ 49 - 8
TEAMModelBI/ClientApp/src/view/userInquire/details.vue

@@ -230,7 +230,7 @@
                                     <div class="prodlist-item" v-for="item in powerList" :key="item">
                                     <div class="prodlist-item" v-for="item in powerList" :key="item">
                                     <div class="rightsbox-item">
                                     <div class="rightsbox-item">
                                         <div class="rightsbox-item-title">
                                         <div class="rightsbox-item-title">
-                                            <!-- <p>[ID授权] {{item.name}}</p> -->
+                                            {{item.name}}
                                         </div>
                                         </div>
                                         <div class="rightsbox-item-time">
                                         <div class="rightsbox-item-time">
                                             <p>
                                             <p>
@@ -243,7 +243,7 @@
                                                 <span class="rightsbox-item-timenums">{{item.aprule.schoolinfo.name}}</span>
                                                 <span class="rightsbox-item-timenums">{{item.aprule.schoolinfo.name}}</span>
                                             </p>
                                             </p>
                                         </div>
                                         </div>
-                                        <div class="rightsbox-item-expansion" v-show="item.prodCode ==='Z6ELB6EZ'">
+                                        <div class="rightsbox-item-expansion" v-show="item.prodCode==='Z6ELB6EZ' || item.prodCode==='VA67B6EZ'">
                                             <p class="expansion-title">{{$t(`userInquire.details.apRule`)}}</p>
                                             <p class="expansion-title">{{$t(`userInquire.details.apRule`)}}</p>
                                             <!--产品扩充-->
                                             <!--产品扩充-->
                                             <div v-for="iteml in item.apruleArr" :key="iteml.key">
                                             <div v-for="iteml in item.apruleArr" :key="iteml.key">
@@ -901,13 +901,29 @@ function initdata() {
     
     
     //权益内容
     //权益内容
     let {prod,benefits}=transmitData
     let {prod,benefits}=transmitData
-    prod.forEach((item)=>{
-        //处理名字
-        item.name = item.prodCode === 'Z6ELB6EZ' ? 'HiTeach 5' : item.prodCode === 'IPALB6EY' ? proxy.$t(`auth.IPALB6EY`) : ''
+    prod.forEach((item) => {
+        //商品名字  IPALB6EY:'IES5個人空間', Z6ELB6EZ: 'HiTeach5ID授權', VA67B6EZ: 'HiTeach5縣市授權', VAA7B6EY: 'IES5個人空間縣市授權',
+        switch (item.prodCode) {
+            case 'IPALB6EY':
+                item.name = proxy.$t(`auth.IPALB6EY`)
+                break;
+            case 'Z6ELB6EZ':
+                item.name = proxy.$t(`auth.Z6ELB6EZ`)
+                break;
+            case 'VA67B6EZ':
+                item.name = proxy.$t(`auth.VA67B6EZ`)
+                break;
+            case 'VAA7B6EY':
+                item.name = proxy.$t(`auth.VAA7B6EY`)
+                break;
+        }
+        //item.name = item.prodCode === 'Z6ELB6EZ' ? proxy.$t(`auth.Z6ELB6EZ`) : item.prodCode === 'IPALB6EY' ? proxy.$t(`auth.IPALB6EY`) : ''
         //处理扩展内容
         //处理扩展内容
         let apruleItem=item.aprule
         let apruleItem=item.aprule
         item.apruleArr=[]
         item.apruleArr=[]
-        if(apruleItem !==null && item.prodCode ==='Z6ELB6EZ'){
+        if (apruleItem !== null && (item.prodCode === 'Z6ELB6EZ' || item.prodCode === 'VA67B6EZ') )
+        {
+            powerExtensionReset()
             apruleItem.hdcam ? powerExtension.value[0].state=true:powerExtension.value[0].state=false //USB錄影支援
             apruleItem.hdcam ? powerExtension.value[0].state=true:powerExtension.value[0].state=false //USB錄影支援
             apruleItem.sokapp ? powerExtension.value[1].state=true:powerExtension.value[1].state=false //蘇格拉底議課APP
             apruleItem.sokapp ? powerExtension.value[1].state=true:powerExtension.value[1].state=false //蘇格拉底議課APP
             apruleItem.sokvdo ? powerExtension.value[2].state=true:powerExtension.value[2].state=false //蘇格拉底影片
             apruleItem.sokvdo ? powerExtension.value[2].state=true:powerExtension.value[2].state=false //蘇格拉底影片
@@ -926,7 +942,7 @@ function initdata() {
             apruleItem.sokvtt ? powerExtension.value[15].state = true : powerExtension.value[15].state = false //蘇格拉底語音轉寫
             apruleItem.sokvtt ? powerExtension.value[15].state = true : powerExtension.value[15].state = false //蘇格拉底語音轉寫
             apruleItem.cowork ? powerExtension.value[16].state = true : powerExtension.value[16].state = false //協作
             apruleItem.cowork ? powerExtension.value[16].state = true : powerExtension.value[16].state = false //協作
             apruleItem.aigpt ? powerExtension.value[17].state = true : powerExtension.value[17].state = false //AI GPT服務
             apruleItem.aigpt ? powerExtension.value[17].state = true : powerExtension.value[17].state = false //AI GPT服務
-            item.apruleArr=powerExtension.value
+            item.apruleArr = JSON.parse(JSON.stringify(powerExtension.value))
         }
         }
         //处理时间
         //处理时间
         let startDates=new Date(item.startDate);let endDates=new Date(item.endDate)
         let startDates=new Date(item.startDate);let endDates=new Date(item.endDate)
@@ -936,7 +952,7 @@ function initdata() {
         console.log(days,'天数')
         console.log(days,'天数')
         item.intervalTime=days
         item.intervalTime=days
         item.startDateText=item.startDate ? proxy.$common.timestampToTime(item.startDate):0
         item.startDateText=item.startDate ? proxy.$common.timestampToTime(item.startDate):0
-        item.endDateText= item.endDate? proxy.$common.timestampToTime(item.endDate):0
+        item.endDateText = item.endDate ? proxy.$common.timestampToTime(item.endDate) : 0
         powerList.value.push(item)  
         powerList.value.push(item)  
     })
     })
     console.log(powerList.value,'权益内容')
     console.log(powerList.value,'权益内容')
@@ -985,6 +1001,31 @@ function initdata() {
     // advancevalue.value.next=detailsData.value[transferNum.value+1]
     // advancevalue.value.next=detailsData.value[transferNum.value+1]
     
     
 }
 }
+//HiTeach擴充項 reset
+function powerExtensionReset() {
+    powerExtension.value[0].state = false //USB錄影支援
+    powerExtension.value[1].state = false //蘇格拉底議課APP
+    powerExtension.value[2].state = false //蘇格拉底影片
+    powerExtension.value[3].state = false //蘇格拉底桌面
+    powerExtension.value[4].state = false //蘇格拉底報告
+    powerExtension.value[5].state = false //蘇格拉底小數據
+    powerExtension.value[6].state = false //AI智能終端
+    powerExtension.value[7].state = false //AI文句分析
+    powerExtension.value[8].state = false //電子學生證
+    powerExtension.value[9].state = false  //雲端診斷分析系統
+    powerExtension.value[10].value = 0 //分組數
+    powerExtension.value[10].state = false //分組數
+    powerExtension.value[11].value = 0 //IRS連線授權數
+    powerExtension.value[11].state = false //IRS連線授權數
+    powerExtension.value[12].value = 0 //議課人數
+    powerExtension.value[12].state = true //議課人數
+    powerExtension.value[13].value = 0 //智慧評分系統
+    powerExtension.value[13].state = false //智慧評分系統
+    powerExtension.value[14].state = true  //IRS硬體遙控器
+    powerExtension.value[15].state = false //蘇格拉底語音轉寫
+    powerExtension.value[16].state = false //協作
+    powerExtension.value[17].state = false //AI GPT服務
+}
 function bytesToGB(bytes) {
 function bytesToGB(bytes) {
   const gb = bytes / (1024 * 1024 * 1024);
   const gb = bytes / (1024 * 1024 * 1024);
   return gb.toFixed(2); // 将结果保留两位小数
   return gb.toFixed(2); // 将结果保留两位小数

+ 25 - 28
TEAMModelOS/ClientApp/src/components/student-analysis/total/htBaseKnowledgeDetail.vue

@@ -220,30 +220,11 @@ export default {
     doRender(data, classIndexs) {
     doRender(data, classIndexs) {
       let classIndex = this.getCurClassIndex
       let classIndex = this.getCurClassIndex
       // 区分全部班级以及单个班级的数据
       // 区分全部班级以及单个班级的数据
-      this.x = data.pointList
-      //this.y = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
-      if(classIndex === -1){
-      // 全部班級的分率統計需要另外計算        
-      const questionCount = this.$store.state.totalAnalysis.analysisJsonJoint.knowPer[0].value.length;
-      const averages = new Array(questionCount).fill(0);
-
-      // 累加各班級每一題的分數
-      this.$store.state.totalAnalysis.analysisJsonJoint.knowAllper.forEach((classItem) => {
-        classItem.value.forEach((score, index) => {
-          averages[index] += score;
-        });
-      });
-
-      // 計算每題的平均得分率
-      let averageScores = averages.map((sum, index) => {
-        const total = this.$store.state.totalAnalysis.analysisJsonJoint.knowPer[0].value[index] * 100;
-        const classCount = this.$store.state.totalAnalysis.analysisJsonJoint.knowAllper.length;
-        return total > 0 ? ((sum / (total * classCount)) * 100).toFixed(2) : 0;
-      });
-
-      this.y = averageScores;   
+      this.x = data.pointList      
+      if(classIndex === -1){         
+        this.y = data.stupercent.grade.map(item => (Number(item)).toFixed(2)) 
       }else{
       }else{
-        this.y = data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2));
+        this.y = data.pointList.map(pointName => data.classpercent[pointName][0].toFixed(2));
       }
       }
       this.drawLine()
       this.drawLine()
     }
     }
@@ -269,12 +250,28 @@ export default {
     // 获取最新散点图数据
     // 获取最新散点图数据
     getKnowledgeData() {
     getKnowledgeData() {
       
       
-      let curclassIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
-      let curJson = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curclassIndex].pointKey
-      
-
-
+      let curClassIndex = this.$store.state.totalAnalysis.curClassIndex
+      //let curJson = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curclassIndex].pointKey
+      let curJson = {}
 
 
+      if(curClassIndex !== -1){// 取指定班級的資料
+        curJson = this.$store.state.totalAnalysis.analysisJsonJoint.classes[curClassIndex].pointLevelKey.pointKey        
+      }else{
+        // 取全部班級的資料 // 初始化平均陣列 都先塞 0
+        let stupercent = { grade: new Array(this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].knowWrong.length).fill(0) }        
+        // 用classes的knowWrong的   每一題的[3]加總之後除以classes.len
+        this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach(classItem => {
+          classItem.knowWrong.forEach((knowWrongItem, index) => {
+            stupercent.grade[index] += parseFloat(knowWrongItem[3])
+          })
+        })
+        // 計算百分比
+        stupercent.grade = stupercent.grade.map(item => (Number((item / this.$store.state.totalAnalysis.analysisJsonJoint.classes.length).toFixed(2)) * 100))                  
+        curJson = {
+          pointList: this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].pointLevelKey.pointKey.pointList,
+          stupercent: stupercent
+        }
+      }           
       return curJson
       return curJson
     },
     },
     getAnalysisJson() {
     getAnalysisJson() {

+ 34 - 5
TEAMModelOS/ClientApp/src/components/student-analysis/total/htBaseLevelDetail.vue

@@ -218,11 +218,16 @@ export default {
     },
     },
 
 
     doRender(data, classIndexs) {
     doRender(data, classIndexs) {
-      let classIndex = this.getCurClassIndex
+      let classIndex = this.getCurClassIndex      
       console.log(classIndex)
       console.log(classIndex)
       // 区分全部班级以及单个班级的数据
       // 区分全部班级以及单个班级的数据
+      
       this.x = data.pointList
       this.x = data.pointList
-      this.y = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
+      if(classIndex === -1){         
+        this.y = data.stupercent.grade.map(item => (Number(item)).toFixed(2)) 
+      }else{
+        this.y = data.pointList.map(pointName => data.classpercent[pointName][0].toFixed(2));
+      }      
       this.drawLine()
       this.drawLine()
     },
     },
 
 
@@ -261,14 +266,38 @@ export default {
   computed: {
   computed: {
     // 获取最新散点图数据
     // 获取最新散点图数据
     getKnowledgeData() {
     getKnowledgeData() {
-      let curclassIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
-      let curJson = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curclassIndex].levelKey
+      let curclassIndex = this.$store.state.totalAnalysis.curClassIndex
+      //let curclassIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
+      let curJson = {}
+      if(curclassIndex !== -1){
+        curJson = this.$store.state.totalAnalysis.analysisJsonJoint.classes[curclassIndex].pointLevelKey.levelKey
+      }else{
+         // 取全部班級的資料 // 初始化平均陣列 都先塞 0
+        let stupercent = { grade: new Array(this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].fieldWrong.length).fill(0) }        
+        // 用classes的fieldWrong的   每一題的[3]加總之後除以classes.len
+        this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach(classItem => {
+          classItem.fieldWrong.forEach((fieldWrongItem, index) => {
+            stupercent.grade[index] += parseFloat(fieldWrongItem[3])
+          })
+        })
+        // 計算百分比
+        stupercent.grade = stupercent.grade.map(item => (Number((item / this.$store.state.totalAnalysis.analysisJsonJoint.classes.length).toFixed(2)) * 100))                  
+        curJson = {
+          pointList: this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].pointLevelKey.levelKey.pointList,
+          stupercent: stupercent
+        }
+
+      }
+      
+      //let curJson = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curclassIndex].levelKey
       let transArr = this.$GLOBAL.EXERCISE_LEVELS()
       let transArr = this.$GLOBAL.EXERCISE_LEVELS()
       curJson.pointList = curJson.pointList.map((i, index) => transArr[index])
       curJson.pointList = curJson.pointList.map((i, index) => transArr[index])
       for (let key in curJson.classpercent) {
       for (let key in curJson.classpercent) {
         if (!isNaN(key)) {
         if (!isNaN(key)) {
           let newKey = transArr[+key - 1]
           let newKey = transArr[+key - 1]
-          curJson.classpercent[newKey] = curJson.classpercent[key]
+          if(curJson.classpercent){
+            curJson.classpercent[newKey] = curJson.classpercent[key]
+          }          
           curJson.stupercent[newKey] = curJson.stupercent[key]
           curJson.stupercent[newKey] = curJson.stupercent[key]
         }
         }
       }
       }

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

@@ -79,9 +79,9 @@
         },
         },
         computed: {
         computed: {
             // 获取最新知识点占比饼图数据
             // 获取最新知识点占比饼图数据
-            getPieData() {
-                let curSubjectIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
-                return this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].pointKey
+            getPieData() {       
+                // 活動版全部的題目跟配分都一樣 所以取第一筆資料即可                                  
+                return this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].pointLevelKey.pointKey
             }
             }
         },
         },
         watch: {
         watch: {

+ 40 - 8
TEAMModelOS/ClientApp/src/components/student-analysis/total/htBaseRadar.vue

@@ -122,10 +122,20 @@ export default {
       })
       })
     },
     },
 
 
-    doRender(data, classIndexs) {
-      let classIndex = this.getCurClassIndex
-      let indicator = []
-      let rateArr = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
+    doRender(data, classIndex) {            
+      let indicator = [] 
+      let rateArr = []
+      if(classIndex === -1){
+        // 全部班級
+        if(data.stupercent.grade){
+          rateArr = data.stupercent.grade.map(item => (Number(item)).toFixed(2))
+          }        
+      }else{
+        // 指定班級
+        if(data.classpercent){
+          rateArr = data.pointList.map(pointName => data.classpercent[pointName][0].toFixed(2))
+          }        
+      }         
       console.log(data)
       console.log(data)
       // 获取最大值 +5 设置到雷达边界最大值
       // 获取最大值 +5 设置到雷达边界最大值
       let maxNum = Math.max(...rateArr.map(i => Number(i))) + 5
       let maxNum = Math.max(...rateArr.map(i => Number(i))) + 5
@@ -147,10 +157,32 @@ export default {
 
 
   computed: {
   computed: {
     // 获取最新雷达图数据
     // 获取最新雷达图数据
-    getKnowledgeData() {
-      let curSubjectIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
-      let curJson = this.echartsId === 'knowRadar' ? this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].pointKey :
-        this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].levelKey
+    getKnowledgeData() {            
+      let curClassIndex = this.$store.state.totalAnalysis.curClassIndex
+      let curJson = {}
+      if(curClassIndex !== -1){// 取指定班級的資料
+        curJson = this.echartsId === 'knowRadar' ? this.$store.state.totalAnalysis.analysisJsonJoint.classes[curClassIndex].pointLevelKey.pointKey :
+        this.$store.state.totalAnalysis.analysisJsonJoint.classes[curClassIndex].pointLevelKey.levelKey
+      }else{
+        // 取全部班級的資料
+        let stupercent = { grade: new Array(this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].knowWrong.length).fill(0) }        
+        // 用classes的knowWrong的   每一題的[3]加總之後除以classes.len
+        this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach(classItem => {
+          classItem.knowWrong.forEach((knowWrongItem, index) => {
+            stupercent.grade[index] += parseFloat(knowWrongItem[3])
+          })
+        })
+        // 計算百分比
+        stupercent.grade = stupercent.grade.map(item => (Number((item / this.$store.state.totalAnalysis.analysisJsonJoint.classes.length).toFixed(2)) * 100))                  
+        curJson = {
+          pointList: this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].pointLevelKey.pointKey.pointList,
+          stupercent: stupercent
+        }
+      }    
+      // data.classpercent
+                // data.pointList
+                // data.stupercent.grade    
+
       if (this.echartsId !== 'knowRadar') {
       if (this.echartsId !== 'knowRadar') {
         let transArr = this.$GLOBAL.EXERCISE_LEVELS()
         let transArr = this.$GLOBAL.EXERCISE_LEVELS()
         curJson.pointList = curJson.pointList.map((i, index) => transArr[index])
         curJson.pointList = curJson.pointList.map((i, index) => transArr[index])

+ 40 - 0
TEAMModelOS/ClientApp/src/store/module/totalAnalysis.js

@@ -128,6 +128,46 @@ export default {
                 }				
                 }				
 			})
 			})
 			val.pointLevelKey = pointLevelKey
 			val.pointLevelKey = pointLevelKey
+            //===================以班級為單位 start===================            
+            val.classes.forEach((classItem) => {
+
+                // 活動版fieldName fieldPerItem都一樣取第一個即可
+                let fieldNameItem = val.fieldName[0].value
+                let fieldPerItem = val.fieldPer[0].value
+                let fieldwrongItem = classItem.fieldWrong
+                let knowNameItem = classItem.knowName
+                let knowPerItem = classItem.knowPer
+                let wrongItem = classItem.knowWrong
+                if(fieldNameItem && fieldPerItem && fieldwrongItem && knowNameItem && knowPerItem && wrongItem){
+                    //classItem.pointLevelKey = {}
+                    classItem.pointLevelKey = {
+                        classId:classItem.classId,
+                        levelKey:{
+                            level:fieldNameItem,
+                            pointList:fieldNameItem,
+                            per:fieldPerItem,
+                            wrong:{
+                                datas:fieldwrongItem,
+                                keys:val.wrongKey
+                            },
+                            stupercent:tools.getLevelPercentJointClass(val,classItem).stuResult,
+                            classpercent:tools.getLevelPercentJointClass(val,classItem).classResult
+                        },
+                        pointKey:{
+                            level:knowNameItem,
+                            pointList:knowNameItem,
+                            per:knowPerItem,
+                            wrong:{
+                                datas:wrongItem,
+                                keys:val.wrongKey
+                            },
+                            stupercent:tools.getKnowPercentJointClass(val,classItem).stuResult,
+                            classpercent:tools.getKnowPercentJointClass(val,classItem).classResult
+                        }
+                    }
+                }				
+			})
+            //===================以班級為單位 end=====================
 			state.currentSubject = null
 			state.currentSubject = null
 			state.indexSubject = null
 			state.indexSubject = null
 			state.curClassIndex = -1
 			state.curClassIndex = -1

+ 124 - 1
TEAMModelOS/ClientApp/src/utils/public.js

@@ -1932,7 +1932,130 @@ export default {
 		})
 		})
 		return result
 		return result
 	},
 	},
-	/* 学情知识点年级班级得分率数据转换 活動版*/
+	//--------------------------------------------
+	/* 学情认知层次年级班级得分率数据转换 活動Class版 */
+	getLevelPercentJointClass(val, classItem) {
+		let stuResult = {}
+		let classResult = {}
+		//認知層次都是固定項目 [1, 2, 3, 4, 5, 6]
+		let fieldNameItem = val.fieldName[0]
+		// let fieldAllPerItem = val.fieldAllPer.find(i => i.key === subject.id)
+		// let fieldwrongItem = val.fieldwrong.find(i => i.key === subject.id)
+		fieldNameItem.value.forEach((item, index) => {
+			stuResult[item] = this.getLevelStuPercentJointClass(val, classItem, index)
+			classResult[item] = this.getLevelClassPercentJointClass(val, classItem, index)
+		})
+		// stuResult.grade = fieldAllPerItem.value.map((score, index) => (fieldwrongItem.value[
+		// 	index][1] == 0 ? 0 : Number(score / fieldwrongItem.value[index][1]).toFixed(2)) * 100)
+		stuResult.keys = val.knowKey
+		classResult.keys = val.knowkey
+		classResult.className = val.classes.map(i => i.className)
+		let obj = {
+			stuResult: stuResult,
+			classResult: classResult
+		}
+		return obj
+	},
+	/* 学情认知层次模块数据转换 活動Class版 */
+	getLevelStuPercentJointClass(val, classItem, index) {
+		let fScoreItem = classItem.fScore
+		let result = []
+		val.students.forEach(stu => {
+			// if(stu.name==="沈仕程"){
+			// 	console.log("沈仕程 : "+JSON.stringify(stu));
+			// }
+			// 如果該學生的課程/科目存在  而且 id 相同才加入
+			//let fScoresItem = val.fScores.find(i => i.key === subject.id)			
+			let fieldStuPer = classItem.fieldStuPer.find(i => i.key === stu.id)					
+			if(fieldStuPer && stu.classId === classItem.classId){
+				let fScoreItemValue = 0
+				if(fieldStuPer.value[index]!==0 || fScoreItem[index] !== 0){
+					fScoreItemValue = (fieldStuPer.value[index] / fScoreItem[index]).toFixed(2)
+				}
+				result.push([
+					stu.name,
+					stu.className,
+					stu.no || '-',
+					fScoreItem[index],
+					fieldStuPer.value[index],
+					fScoreItemValue
+				])
+			}			
+		})
+		return result
+	},
+	/* 学情认知层次年级班级得分率数据转换 活動Class版 */
+	getLevelClassPercentJointClass(val, classItem, index) {
+		let result = []
+		let classfieldPer = classItem.fieldWrong.find(i => i[0] === val.fieldName[0].value[index].toString())
+		result.push(parseFloat(classfieldPer[3]) * 100)
+
+
+		// val.classes.forEach(classItem => {
+		// 	// 如果該班級的課程/科目存在  而且 id 相同才加入
+		// 	let classSubjectItem = classItem.subjects.find(i => i.id === subject.id)
+		// 	let fieldwrongItem = val.fieldwrong.find(i => i.key === subject.id)
+		// 	if(classSubjectItem){			
+		// 	   result.push(classSubjectItem.field.map((score, index) => 
+		// 		fieldwrongItem.value[index][1] == 0 ? 0 : Number(score / fieldwrongItem.value[index][1]) * 100)[index])
+		// 	}
+		// })
+		return result
+	},
+	//--------------------------------------------	
+	/* 学情知识点年级班级得分率数据转换 活動class版*/
+	getKnowPercentJointClass(val, classItem) {
+		let stuResult = {}
+		let classResult = {}
+		let knowNameItem = classItem.knowName
+		//let knowAllperItem = val.knowAllper.find(i => i.key === subject.id)
+		//let wrongItem = val.wrong.find(i => i.key === subject.id)
+		knowNameItem.forEach((item, index) => {
+			stuResult[item] = this.getKnowStuPercentJointClass(val, classItem, index)
+			classResult[item] = this.getKnowClassPercentJointClass(val, classItem, index)
+		})
+		// 取当前年级在每个知识点的得分 除以知识点的总分 得到年级在该知识点的得分率
+		//stuResult.grade = knowAllperItem.value.map((score, index) => wrongItem.value[index][1] == 0 ? 0 : Number(score / wrongItem.value[index][1]) * 100)
+		stuResult.keys = val.knowKey
+		classResult.keys = val.knowkey
+		classResult.className = val.classes.map(i => i.className)
+		let obj = {
+			stuResult: stuResult,
+			classResult: classResult
+		}
+		return obj
+	},   
+	/* 学情知识点模块数据转换 活動class版 */
+	getKnowStuPercentJointClass(val, classItem, index) {		
+		let kScoresItem = classItem.kScore
+		let result = []
+		val.students.forEach(stu => {
+			// 如果該學生的課程/科目存在  而且 id 相同才加入			
+			let knowStuPer = classItem.knowStuPer.find(i => i.key === stu.id)			
+			if (stu.classId === classItem.classId) {
+			    result.push([
+			    	stu.name,
+			    	stu.className,
+			    	stu.no || '-',
+			    	kScoresItem[index],			    	
+			    	knowStuPer.value[index],
+			    	kScoresItem[index] == 0 ? 0 :  (knowStuPer.value[index] / kScoresItem[index]).toFixed(2)
+			    ])
+			}
+		})
+		return result
+	},
+	/* 学情知识点班级得分率数据转换 活動class版 */
+	getKnowClassPercentJointClass(val, classItem, index) {
+		let result = []		
+		// 取得目標知識點得分率
+		let classKnowPer = classItem.knowWrong.find(i => i[0] === classItem.knowName[index])
+		result.push(parseFloat(classKnowPer[3]) * 100)
+		
+		return result
+	},
+	
+	/* 学情知识点年级班级得分率数据转换 活動subject版*/
 	getKnowPercentJoint(val, subject) {
 	getKnowPercentJoint(val, subject) {
 		let stuResult = {}
 		let stuResult = {}
 		let classResult = {}
 		let classResult = {}

+ 1 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/htCloudDAS.vue

@@ -35,7 +35,7 @@
           </div>
           </div>
         </div>
         </div>
         <div class="class-tab" v-if="!(activeBar === 2 || isShowQuestionList)">
         <div class="class-tab" v-if="!(activeBar === 2 || isShowQuestionList)">
-          <span v-for="(item,index) in classList" :value="index" :key="item" @click="onClassChange(item,index)" :class="['class-tab-item',activeClassIndex == index ? 'data-select-active' : '']">{{ item }}</span>
+          <span v-for="(item,index) in classList" :value="index" :key="item + index" @click="onClassChange(item,index)" :class="['class-tab-item',activeClassIndex == index ? 'data-select-active' : '']">{{ item }}</span>
         </div>
         </div>
         <AchievementAnalysis v-if="activeBar == 0 && activeClassIndex == 0"></AchievementAnalysis>
         <AchievementAnalysis v-if="activeBar == 0 && activeClassIndex == 0"></AchievementAnalysis>
         <SingleClassView v-else-if="activeBar == 0 && activeClassIndex > 0"></SingleClassView>
         <SingleClassView v-else-if="activeBar == 0 && activeClassIndex > 0"></SingleClassView>

+ 23 - 16
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/htKnowledgeAnalysis.vue

@@ -106,14 +106,14 @@
                 for (let i = 0; i < pointList.length; i++) {
                 for (let i = 0; i < pointList.length; i++) {
                     let o = {}
                     let o = {}
                     o.name = pointList[i]
                     o.name = pointList[i]
-                    o.gradeRate = data.stupercent.grade[i]
+                    //o.gradeRate = data.stupercent.grade[i]
                     for (let j = 0; j < origin.className.length; j++) {
                     for (let j = 0; j < origin.className.length; j++) {
                         o[origin.className[j]] = origin[pointList[i]][j]
                         o[origin.className[j]] = origin[pointList[i]][j]
                     }
                     }
                     arr.push(o)
                     arr.push(o)
                 }
                 }
                 this.renderClassColumns(this.getAnalysisJson,origin)
                 this.renderClassColumns(this.getAnalysisJson,origin)
-				console.log(arr)
+				console.log(arr)                
                 this.knowledgeData = arr
                 this.knowledgeData = arr
             }
             }
 
 
@@ -133,22 +133,29 @@
 
 
         computed: {
         computed: {
             // 获取最新散点图数据
             // 获取最新散点图数据
-            getKnowledgeData() {       
-                // 因應結構不同 重新統計得分率
-				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
-                let AllpointKey = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].pointKey
-                let pointList = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[6].pointKey.pointList                
-                let pointLevelKey = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey
-                for(let i = 0;i<pointLevelKey.length;i++){
-                    for(let j = 0;j<pointList.length;j++){
-                        if(pointLevelKey[i].pointKey.classpercent[pointList[j]] && pointLevelKey[i].pointKey.classpercent[pointList[j]].length>0){
-                            AllpointKey.classpercent[pointList[j]].push(pointLevelKey[i].pointKey.classpercent[pointList[j]][0]);                       
-                        }                      
-                   }
+            getKnowledgeData() {                  
+                // 初始資料架構
+                let AllpointKey = {
+                    classpercent:{
+                        className:[]
+                        },
+                    pointList:this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].pointLevelKey.pointKey.pointList 
                 }
                 }
+                // 加入每個知識點為一個陣列
+                AllpointKey.pointList.forEach(pointListItem => {                                               
+                        AllpointKey.classpercent[pointListItem] = []
+                        })
 
 
-                //return this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].pointKey
-                return AllpointKey
+                this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach((classItem, index) => {
+                    AllpointKey.classpercent.className.push(classItem.className)
+                    AllpointKey.pointList.forEach(pointListItem => {
+                        // 取得目標知識點得分率
+                        let classKnowPer = classItem.knowWrong.find(i => i[0] === pointListItem)
+                        AllpointKey.classpercent[pointListItem].push(parseFloat(classKnowPer[3]) * 100)
+                    })
+                })
+                
+                return AllpointKey              
             },
             },
 			
 			
 			getAnalysisJson() {
 			getAnalysisJson() {

+ 52 - 11
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/htScoreDetails.vue

@@ -232,8 +232,6 @@ export default {
             //let kScoresItem = classesItem.kScore
             //let kScoresItem = classesItem.kScore
             let knowStuPer = classesItem.knowStuPer.find(i => i.key === stu.id)
             let knowStuPer = classesItem.knowStuPer.find(i => i.key === stu.id)
             if (stu.classId === classesItem.classId) {
             if (stu.classId === classesItem.classId) {
-
-
               result.push([
               result.push([
                 stu.name,
                 stu.name,
                 stu.className,
                 stu.className,
@@ -245,12 +243,8 @@ export default {
               ])
               ])
             }
             }
           })
           })
-
-
           stuResult[item] = result
           stuResult[item] = result
-
         })
         })
-
       }
       }
       
       
       // 取当前年级在每个知识点的得分 除以知识点的总分 得到年级在该知识点的得分率
       // 取当前年级在每个知识点的得分 除以知识点的总分 得到年级在该知识点的得分率
@@ -271,10 +265,16 @@ export default {
     },
     },
 
 
     doRenderWrong(data) {
     doRenderWrong(data) {
-      let classIndex = this.$store.state.totalAnalysis.curClassIndex
-      let origin = data.wrong
+      // let classIndex = this.$store.state.totalAnalysis.curClassIndex
+      // let origin = data.wrong
+      // let allWrongData = this.$tools.jsonTransform({ datas: origin.datas, keys: origin.keys })
+      
+      // this.numData = classIndex === -1 ? allWrongData : this.getClassWrongData(allWrongData, classIndex)
+      
+      let origin = data
       let allWrongData = this.$tools.jsonTransform({ datas: origin.datas, keys: origin.keys })
       let allWrongData = this.$tools.jsonTransform({ datas: origin.datas, keys: origin.keys })
-      this.numData = classIndex === -1 ? allWrongData : this.getClassWrongData(allWrongData, classIndex)
+      
+      this.numData = allWrongData
     },
     },
 
 
     getClassWrongData(allWrongData) {
     getClassWrongData(allWrongData) {
@@ -308,8 +308,49 @@ export default {
   computed: {
   computed: {
     // 获取最新散点图数据
     // 获取最新散点图数据
     getKnowledgeData() {      
     getKnowledgeData() {      
-      let curSubjectIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
-      return this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].pointKey
+      // 如果class = -1  要重新統計全部班級的knowWrong
+      let classIndex = this.$store.state.totalAnalysis.curClassIndex
+      // 初始物件
+      let knowWrongAll = {
+          datas : [],
+          pointList : this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].knowName,
+          keys: [
+              "name",
+              "point",
+              "itemNO",
+              "persent",
+              "wrong",
+              "rhw",
+              "rlw"
+            ]
+        }
+      if(classIndex === -1){ // 全部班級
+        knowWrongAll.datas = this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].knowWrong
+        //  平均得分率 跟 錯題人次 都先歸零  其他通用
+        knowWrongAll.datas.forEach(item => {
+          item[3] = 0
+          item[4] = 0
+        })
+        // 匯總 平均得分率 跟 錯題人次
+        this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach(classItem => {
+          knowWrongAll.datas.forEach(knowWrongAllItem => {            
+            let knowWrongItem = classItem.knowWrong.find(k => k[0] == knowWrongAllItem[0])
+            knowWrongAllItem[3] = parseFloat(knowWrongAllItem[3]) + parseFloat(knowWrongItem[3])
+            knowWrongAllItem[4] = parseFloat(knowWrongAllItem[4]) + parseFloat(knowWrongItem[4])
+          })         
+        })
+        // 平均得分率總和再平均一次班級
+        knowWrongAll.datas.forEach(knowWrongAllItem => {            
+            knowWrongAllItem[3] = knowWrongAllItem[3] / this.$store.state.totalAnalysis.analysisJsonJoint.classes.length
+            
+          })        
+      }else{
+        knowWrongAll.datas = this.$store.state.totalAnalysis.analysisJsonJoint.classes[classIndex].knowWrong
+      }
+
+      return knowWrongAll    
+      // let curSubjectIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
+      // return this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].pointKey
     },
     },
     getAnalysisJson() {
     getAnalysisJson() {
       return this.$store.state.totalAnalysis.analysisJsonJoint
       return this.$store.state.totalAnalysis.analysisJsonJoint

+ 24 - 14
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/htLevelAnalysis.vue

@@ -98,7 +98,7 @@
                 for (let i = 0; i < pointList.length; i++) {
                 for (let i = 0; i < pointList.length; i++) {
                     let o = {}
                     let o = {}
                     o.name = pointList[i]
                     o.name = pointList[i]
-                    o.gradeRate = data.stupercent.grade[i]
+                    //o.gradeRate = data.stupercent.grade[i]
                     for (let j = 0; j < origin.className.length; j++) {
                     for (let j = 0; j < origin.className.length; j++) {
                         o[origin.className[j]] = origin[pointList[i]][j]
                         o[origin.className[j]] = origin[pointList[i]][j]
                     }
                     }
@@ -125,19 +125,29 @@
 
 
         computed: {
         computed: {
             // 获取最新散点图数据
             // 获取最新散点图数据
-            getLevelData() {
-				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this.$store.state.totalAnalysis.currentSubjectJoint)
-				let levelJson = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].levelKey
-				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
-				levelJson.pointList = levelJson.pointList.map((i,index) => transArr[index])
-				for(let key in levelJson.classpercent){
-					if(!isNaN(key)){
-						let newKey = transArr[+key - 1]
-						levelJson.classpercent[newKey] = levelJson.classpercent[key]
-						levelJson.stupercent[newKey] = levelJson.stupercent[key]
-					}
-				}
-				return levelJson
+            getLevelData() {			
+                 // 初始資料架構
+                let AllpointKey = {
+                    classpercent:{
+                        className:[]
+                        },
+                    pointList:this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].pointLevelKey.levelKey.pointList 
+                }
+                // 加入每個認知層次為一個陣列
+                AllpointKey.pointList.forEach(pointListItem => {                                               
+                        AllpointKey.classpercent[pointListItem] = []
+                        })
+
+                this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach((classItem, index) => {
+                    AllpointKey.classpercent.className.push(classItem.className)
+                    AllpointKey.pointList.forEach(pointListItem => {
+                        // 取得目標認知層次得分率
+                        let classLevelPer = classItem.fieldWrong.find(i => i[0] === pointListItem.toString())
+                        AllpointKey.classpercent[pointListItem].push(parseFloat(classLevelPer[3]) * 100)
+                    })
+                })
+                
+                return AllpointKey              
             },
             },
 			getAnalysisJson() {
 			getAnalysisJson() {
 			    return this.$store.state.totalAnalysis.analysisJsonJoint
 			    return this.$store.state.totalAnalysis.analysisJsonJoint

+ 122 - 66
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/htScoreDetails.vue

@@ -167,73 +167,99 @@ export default {
       this.doRender(this.getLevelData, this.currentPoint, this.curClassIndex)
       this.doRender(this.getLevelData, this.currentPoint, this.curClassIndex)
     },
     },
 
 
+    // doRender(data, point) {
+    //   let classIndex = this.$store.state.totalAnalysis.curClassIndex
+    //   let origin = data.stupercent
+    //   let keys = origin.keys
+    //   let datas = classIndex === -1 ? (origin[point] || []) : origin[point].filter(i => i[1] === this.classList[classIndex + 1])
+    //   this.tableData = this.$tools.jsonTransform({
+    //     datas: datas,
+    //     keys: keys
+    //   })
+    // },
     doRender(data, point) {
     doRender(data, point) {
-      //data = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].pointKey
-     
-      let classIndex = this.$store.state.totalAnalysisJoint.curClassIndex
-      let classesItem = this.$store.state.totalAnalysisJoint.classes[classIndex]
-      //===========================================
-      let val = this.$store.state.totalAnalysis.analysisJsonJoint
-      let stuResult = {}
-      let knowNameItem = classesItem.knowName
-      //let knowAllperItem = classesItem.knowStuPer
-      let wrongItem = classesItem.knowWrong
-      knowNameItem.value.forEach((item, index) => {
-        //stuResult[item] = this.getKnowStuPercentJoint(val, subject, index)
-        let result = []
-        val.students.forEach(stu => {
-          // 如果該學生的課程/科目存在  而且 id 相同才加入
-          //let stuSubjectItem = stu.subjects.find(i => i.id === subject.id)
-          //let kScoresItem = classesItem.kScore
-          let knowStuPer = classesItem.knowStuPer.find(i => i.key === stu.id)
-          if (stu.classId === classesItem.classId) {
+     let stuResult = {}      
+     this.currentPoint = point
+     this.pointName= this.$GLOBAL.EXERCISE_LEVELS()[point-1]
 
 
-            
-            result.push([
-              stu.name,
-              stu.className,
-              stu.no || '-',
-              kScoresItem[index],
-              //stuSubjectItem.point[index],
-              knowStuPer[index],
-              kScoresItem[index] == 0 ? 0 : (knowStuPer[index] / kScoresItem[index]).toFixed(2)
-            ])
-          }
+      let val = this.$store.state.totalAnalysis.analysisJsonJoint
+      let classIndex = this.$store.state.totalAnalysis.curClassIndex
+      if (classIndex === -1) {
+        this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach((classesItem, classesindex) => {         
+          let levelNameItem = classesItem.pointLevelKey.levelKey.level  
+          let fScoresItem = classesItem.fScore
+          levelNameItem.forEach((item, index) => {            
+            let result = []
+            val.students.forEach(stu => {             
+              let fieldStuPer = classesItem.fieldStuPer.find(i => i.key === stu.id)
+              if (stu.classId === classesItem.classId) {
+                result.push([
+                  stu.name,
+                  stu.className,
+                  stu.no || '-',
+                  fScoresItem[index],                  
+                  fieldStuPer.value[index],
+                  fScoresItem[index] == 0 ? 0 : (fieldStuPer.value[index] / fScoresItem[index]).toFixed(2)
+                ])
+              }
+            })
+            if(stuResult[item]){
+              stuResult[item].push(...result)
+            }else{
+              stuResult[item] = result
+            }            
+          })
         })
         })
+      } else {
+        let classesItem = this.$store.state.totalAnalysis.analysisJsonJoint.classes[classIndex]
+        //===========================================
+        let val = this.$store.state.totalAnalysis.analysisJsonJoint
 
 
-
-        stuResult[item] = result
-
-      })
-      // 取当前年级在每个知识点的得分 除以知识点的总分 得到年级在该知识点的得分率
-      //stuResult.grade = knowAllperItem.value.map((score, index) => wrongItem.value[index][1] == 0 ? 0 : Number(score / wrongItem.value[index][1]) * 100)
-      stuResult.keys = val.knowKey
-
-      //===========================================
-      
+        let levelNameItem = classesItem.pointLevelKey.levelKey.level        
+        let fScoresItem = classesItem.fScore
+        levelNameItem.forEach((item, index) => {          
+          let result = []
+          val.students.forEach(stu => {           
+            let fieldStuPer = classesItem.fieldStuPer.find(i => i.key === stu.id)
+            if (stu.classId === classesItem.classId) {
+              result.push([
+                stu.name,
+                stu.className,
+                stu.no || '-',
+                fScoresItem[index],                
+                fieldStuPer.value[index],
+                fScoresItem[index] == 0 ? 0 : (fieldStuPer.value[index] / fScoresItem[index]).toFixed(2)
+              ])
+            }
+          })
+          stuResult[item] = result
+        })
+      }
       
       
-      //let origin = data.stupercent
+      // 取当前年级在每个知识点的得分 除以知识点的总分 得到年级在该知识点的得分率      
+      stuResult.keys = val.knowKey     
       let origin = stuResult
       let origin = stuResult
       let keys = origin.keys
       let keys = origin.keys
-      let datas = classIndex === -1 ? (origin[point] || []) : origin[point].filter(i => i[1] === this.classList[classIndex + 1])
+      let transArr = this.$GLOBAL.EXERCISE_LEVELS()
+      //origin = origin.map((i, index) => transArr[index])
+      //let datas = classIndex === -1 ? (origin[point] || []) : origin[point].filter(i => i[1] === this.classList[classIndex + 1])
+      transArr.forEach((item,index) =>{
+        origin[item] = origin[index + 1]
+      })
       this.tableData = this.$tools.jsonTransform({
       this.tableData = this.$tools.jsonTransform({
-        datas: datas,
+        datas: origin[point],
         keys: keys
         keys: keys
       })
       })
     },
     },
 
 
-    doRenderWrong(data) {
-      let classIndex = this.$store.state.totalAnalysis.curClassIndex
-      let origin = data.wrong
-      let keys = origin.keys
-      let datas = origin.datas
-      console.log(datas)
-      datas.forEach((i, index) => {
-        i[0] = this.transArr[index]
-      })
+    doRenderWrong(data) {     
+      let keys = data.keys
+      let datas = data.datas           
       let allWrongData = this.$tools.jsonTransform({ datas: datas, keys: keys })
       let allWrongData = this.$tools.jsonTransform({ datas: datas, keys: keys })
-      this.numData = classIndex === -1 ? allWrongData : this.getClassWrongData(allWrongData, classIndex)
-
+      allWrongData.forEach((i, index) => {
+        i.name = this.transArr[index]
+      })      
+      this.numData = allWrongData
     },
     },
 
 
     getClassWrongData(allWrongData) {
     getClassWrongData(allWrongData) {
@@ -262,20 +288,50 @@ export default {
   computed: {
   computed: {
     // 获取最新散点图数据
     // 获取最新散点图数据
     getLevelData() {
     getLevelData() {
-      let curSubjectIndex = this.$store.state.totalAnalysis.analysisJsonJoint.subjects.map(i => i.id).indexOf(this
-        .$store.state
-        .totalAnalysis.currentSubjectJoint)
-      let levelJson = this.$store.state.totalAnalysis.analysisJsonJoint.pointLevelKey[curSubjectIndex].levelKey
+      // 如果class = -1  要重新統計全部班級的fieldWrong
+
+      let classIndex = this.$store.state.totalAnalysis.curClassIndex
+      // 初始物件
+      let initPointList = this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].pointLevelKey.levelKey.pointList
       let transArr = this.$GLOBAL.EXERCISE_LEVELS()
       let transArr = this.$GLOBAL.EXERCISE_LEVELS()
-      levelJson.pointList = levelJson.pointList.map((i, index) => transArr[index])
-      for (let key in levelJson.classpercent) {
-        if (!isNaN(key)) {
-          let newKey = transArr[+key - 1]
-          levelJson.classpercent[newKey] = levelJson.classpercent[key]
-          levelJson.stupercent[newKey] = levelJson.stupercent[key]
+      initPointList = initPointList.map((i, index) => transArr[index])
+      let fieldWrongAll = {
+          datas : [],
+          pointList : initPointList,
+          keys: [
+              "name",
+              "point",
+              "itemNO",
+              "persent",
+              "wrong",
+              "rhw",
+              "rlw"
+            ]
         }
         }
+      if(classIndex === -1){ // 全部班級
+        fieldWrongAll.datas = this.$store.state.totalAnalysis.analysisJsonJoint.classes[0].fieldWrong
+        //  平均得分率 跟 錯題人次 都先歸零  其他通用
+        fieldWrongAll.datas.forEach(item => {
+          item[3] = 0
+          item[4] = 0
+        })
+        // 匯總 平均得分率 跟 錯題人次
+        this.$store.state.totalAnalysis.analysisJsonJoint.classes.forEach(classItem => {
+          fieldWrongAll.datas.forEach(fieldWrongAllItem => {            
+            let fieldWrongItem = classItem.fieldWrong.find(k => k[0] == fieldWrongAllItem[0])
+            fieldWrongAllItem[3] = parseFloat(fieldWrongAllItem[3]) + parseFloat(fieldWrongItem[3])
+            fieldWrongAllItem[4] = parseFloat(fieldWrongAllItem[4]) + parseFloat(fieldWrongItem[4])
+          })         
+        })
+        // 平均得分率總和再平均一次班級
+        fieldWrongAll.datas.forEach(fieldWrongItem => {            
+            fieldWrongItem[3] = fieldWrongItem[3] / this.$store.state.totalAnalysis.analysisJsonJoint.classes.length
+            
+          })        
+      }else{
+        fieldWrongAll.datas = this.$store.state.totalAnalysis.analysisJsonJoint.classes[classIndex].fieldWrong
       }
       }
-      return levelJson
+      return fieldWrongAll
     },
     },
     // 获取最新散点图数据
     // 获取最新散点图数据
     getKnowledgeData() {
     getKnowledgeData() {
@@ -299,7 +355,7 @@ export default {
     // },
     // },
     classIndex(n, o) {
     classIndex(n, o) {
       this.curClassIndex = n - 1
       this.curClassIndex = n - 1
-      this.doRender(this.getLevelData, this.getLevelData.pointList[0], n - 1)
+      this.doRender(this.getLevelData, 1, n - 1)
       this.doRenderWrong(this.getLevelData, n - 1)
       this.doRenderWrong(this.getLevelData, n - 1)
     },
     },
     immediate: true
     immediate: true

+ 124 - 97
TEAMModelOS/Controllers/Both/GroupListController.cs

@@ -24,6 +24,7 @@ using TEAMModelOS.Controllers.Both;
 using System.Net.Http;
 using System.Net.Http;
 using System.Security;
 using System.Security;
 using Microsoft.Azure.Cosmos;
 using Microsoft.Azure.Cosmos;
+using TEAMModelOS.SDK.Models.Dtos;
 namespace TEAMModelOS.Controllers
 namespace TEAMModelOS.Controllers
 {
 {
     [ProducesResponseType(StatusCodes.Status200OK)]
     [ProducesResponseType(StatusCodes.Status200OK)]
@@ -54,7 +55,7 @@ namespace TEAMModelOS.Controllers
             _azureStorage = azureStorage;
             _azureStorage = azureStorage;
             _coreAPIHttpService = coreAPIHttpService;
             _coreAPIHttpService = coreAPIHttpService;
             _environment = environment;
             _environment = environment;
-            _azureRedis=azureRedis;
+            _azureRedis = azureRedis;
         }
         }
         //学生获取自己已经加入的名单。
         //学生获取自己已经加入的名单。
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
@@ -82,14 +83,14 @@ namespace TEAMModelOS.Controllers
                 memberType = 1;
                 memberType = 1;
             }
             }
             List<GroupListGrp> groups = null;
             List<GroupListGrp> groups = null;
-            if (json.TryGetProperty("time", out JsonElement _time)  && long.TryParse($"{_time}", out long time)  && time>0)
+            if (json.TryGetProperty("time", out JsonElement _time) && long.TryParse($"{_time}", out long time) && time > 0)
             {
             {
-                groups = await GroupListService.GetMemberInGroupList(_coreAPIHttpService, client, _dingDing, userid, memberType, school, new List<string> { "class", "teach" },time:time);
+                groups = await GroupListService.GetMemberInGroupList(_coreAPIHttpService, client, _dingDing, userid, memberType, school, new List<string> { "class", "teach" }, time: time);
             }
             }
             else {
             else {
-               groups = await GroupListService.GetMemberInGroupList(_coreAPIHttpService, client, _dingDing, userid, memberType, school, new List<string> { "class", "teach" });
+                groups = await GroupListService.GetMemberInGroupList(_coreAPIHttpService, client, _dingDing, userid, memberType, school, new List<string> { "class", "teach" });
             }
             }
-           
+
             return Ok(new { groups = groups });
             return Ok(new { groups = groups });
         }
         }
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
@@ -106,24 +107,24 @@ namespace TEAMModelOS.Controllers
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql<GroupList>(queryText: queryNo,
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIteratorSql<GroupList>(queryText: queryNo,
                 requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
                 requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
                 {
                 {
-                    groupList=item;
+                    groupList = item;
                     break;
                     break;
                 }
                 }
             }
             }
-            if (groupList==null) {
+            if (groupList == null) {
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIteratorSql<GroupList>(queryText: queryNo,
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIteratorSql<GroupList>(queryText: queryNo,
                               requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList") }))
                               requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList") }))
                 {
                 {
-                    groupList=item;
+                    groupList = item;
                     break;
                     break;
                 }
                 }
             }
             }
-            if (groupList!=null)
+            if (groupList != null)
             {
             {
-                return Ok(new {code=200, nos = groupList.members.Select(x => x.irs),optNo= groupList.optNo , limitCount=groupList.limitCount});
+                return Ok(new { code = 200, nos = groupList.members.Select(x => x.irs), optNo = groupList.optNo, limitCount = groupList.limitCount });
             }
             }
             else {
             else {
-                return Ok(new {code=404,  nos =new List<string>() , optNo =0, limitCount =0});
+                return Ok(new { code = 404, nos = new List<string>(), optNo = 0, limitCount = 0 });
             }
             }
         }
         }
 
 
@@ -140,9 +141,9 @@ namespace TEAMModelOS.Controllers
             json.TryGetProperty("school", out JsonElement school);
             json.TryGetProperty("school", out JsonElement school);
             json.TryGetProperty("courseId", out JsonElement _courseId);
             json.TryGetProperty("courseId", out JsonElement _courseId);
             int seatNo = 0;
             int seatNo = 0;
-            if (json.TryGetProperty("seatNo", out JsonElement _seatNo)  ) {
+            if (json.TryGetProperty("seatNo", out JsonElement _seatNo)) {
                 if (int.TryParse($"{_seatNo}", out int __seatNo)) {
                 if (int.TryParse($"{_seatNo}", out int __seatNo)) {
-                    seatNo=__seatNo;
+                    seatNo = __seatNo;
                 }
                 }
             }
             }
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
@@ -172,17 +173,17 @@ namespace TEAMModelOS.Controllers
                         //创建账号并第一次登录IES5则默认赠送1G
                         //创建账号并第一次登录IES5则默认赠送1G
                         defaultSchool = null,
                         defaultSchool = null,
                         schools = new List<TmdUser.School>(),
                         schools = new List<TmdUser.School>(),
-                        lang= lang?.ToString(),
+                        lang = lang?.ToString(),
                     };
                     };
                     await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync<TmdUser>(tmduser, new PartitionKey("Base"));
                     await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync<TmdUser>(tmduser, new PartitionKey("Base"));
                 }
                 }
             }
             }
             int year = DateTimeOffset.UtcNow.Year;
             int year = DateTimeOffset.UtcNow.Year;
-            (int status, GroupList stuList, Member member) data = await GroupListService.CodeJoinList(client, _azureRedis, $"{_stuListNo}", id, type: 1, $"{school}", year, $"{name}", $"{picture}", $"{lang}", seatNo, $"{_courseId}","hita");
+            (int status, GroupList stuList, Member member) data = await GroupListService.CodeJoinList(client, _azureRedis, $"{_stuListNo}", id, type: 1, $"{school}", year, $"{name}", $"{picture}", $"{lang}", seatNo, $"{_courseId}", "hita");
             //没有TmdUser时
             //没有TmdUser时
             if (data.status == 0)
             if (data.status == 0)
             {
             {
-                await GroupListService.UpsertList(data.stuList, _azureCosmos, _configuration, _serviceBus,_client: "hita");
+                await GroupListService.UpsertList(data.stuList, _azureCosmos, _configuration, _serviceBus, _client: "hita");
 
 
                 List<string> ids = new List<string>();
                 List<string> ids = new List<string>();
                 if (data.stuList.scope.Equals("private") && !string.IsNullOrEmpty(data.stuList.creatorId))
                 if (data.stuList.scope.Equals("private") && !string.IsNullOrEmpty(data.stuList.creatorId))
@@ -238,7 +239,7 @@ namespace TEAMModelOS.Controllers
             }
             }
             if (!json.TryGetProperty("stuListNo", out JsonElement _stuListNo)) return BadRequest();
             if (!json.TryGetProperty("stuListNo", out JsonElement _stuListNo)) return BadRequest();
             var (userid, _name, _picture, school) = HttpContext.GetAuthTokenInfo();
             var (userid, _name, _picture, school) = HttpContext.GetAuthTokenInfo();
-          
+
             int type = 0;
             int type = 0;
             string no = null;
             string no = null;
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
@@ -261,8 +262,8 @@ namespace TEAMModelOS.Controllers
             {
             {
                 type = 1;
                 type = 1;
             }
             }
-            int seatNo =0;
-            (int status, GroupList stuList, Member member) data = await GroupListService.CodeJoinList(client, _azureRedis, $"{_stuListNo}", userid, type, school, year, _name, _picture, head_lang,seatNo,_client:"web");
+            int seatNo = 0;
+            (int status, GroupList stuList, Member member) data = await GroupListService.CodeJoinList(client, _azureRedis, $"{_stuListNo}", userid, type, school, year, _name, _picture, head_lang, seatNo, _client: "web");
             if (data.status == 0)
             if (data.status == 0)
             {
             {
 
 
@@ -408,9 +409,9 @@ namespace TEAMModelOS.Controllers
                                 school = $"{schoolId}",
                                 school = $"{schoolId}",
                                 type = "class",
                                 type = "class",
                                 year = item.year,
                                 year = item.year,
-                                expire=0,
+                                expire = 0,
                                 groupName = groupNames,
                                 groupName = groupNames,
-                                scount= scount
+                                scount = scount
                             };
                             };
                             groupLists.Add(group);
                             groupLists.Add(group);
                         }
                         }
@@ -456,7 +457,7 @@ namespace TEAMModelOS.Controllers
                         }
                         }
                     }
                     }
                     return Ok(new { groupLists });
                     return Ok(new { groupLists });
-                    //弃用 
+                //弃用 
                 case bool when $"{opt}".Equals("teach", StringComparison.OrdinalIgnoreCase):
                 case bool when $"{opt}".Equals("teach", StringComparison.OrdinalIgnoreCase):
                     //我执教的
                     //我执教的
                     //从学校的课程和个人课程搜寻与我相关的课程对应的名单。
                     //从学校的课程和个人课程搜寻与我相关的课程对应的名单。
@@ -507,7 +508,7 @@ namespace TEAMModelOS.Controllers
                                 scope = "school",
                                 scope = "school",
                                 school = $"{schoolId}",
                                 school = $"{schoolId}",
                                 type = "class",
                                 type = "class",
-                                expire=0,
+                                expire = 0,
                                 year = item.year,
                                 year = item.year,
                                 groupName = groupNames
                                 groupName = groupNames
                             };
                             };
@@ -597,7 +598,7 @@ namespace TEAMModelOS.Controllers
             json.TryGetProperty("periodId", out JsonElement periodId);
             json.TryGetProperty("periodId", out JsonElement periodId);
             long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
             long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
             json.TryGetProperty("time", out JsonElement _time);
             json.TryGetProperty("time", out JsonElement _time);
-           
+
             switch (true)
             switch (true)
             {
             {
                 //我管理的
                 //我管理的
@@ -605,20 +606,20 @@ namespace TEAMModelOS.Controllers
                     {
                     {
                         List<GroupListGrp> groupLists = new List<GroupListGrp>();
                         List<GroupListGrp> groupLists = new List<GroupListGrp>();
                         var authData = HttpContext.GetAuthTokenKey("Roles");
                         var authData = HttpContext.GetAuthTokenKey("Roles");
-                        object _roles = null, _permissions= null;
-                        HttpContext?.Items.TryGetValue("Roles", out   _roles);
+                        object _roles = null, _permissions = null;
+                        HttpContext?.Items.TryGetValue("Roles", out _roles);
                         HttpContext?.Items.TryGetValue("Permissions", out _permissions);
                         HttpContext?.Items.TryGetValue("Permissions", out _permissions);
                         List<string> rolse = new List<string>();
                         List<string> rolse = new List<string>();
-                        if (_roles!= null) {
-                            rolse= (List<string>)_roles;
+                        if (_roles != null) {
+                            rolse = (List<string>)_roles;
                         }
                         }
                         List<string> permissions = new List<string>();
                         List<string> permissions = new List<string>();
-                        if (_permissions!= null)
+                        if (_permissions != null)
                         {
                         {
-                            permissions= (List<string>)_permissions;
+                            permissions = (List<string>)_permissions;
                         }
                         }
 
 
-                        if (rolse.Contains("admin")||permissions.Contains("course-upd")||permissions.Contains("course-read"))
+                        if (rolse.Contains("admin") || permissions.Contains("course-upd") || permissions.Contains("course-read"))
                         {
                         {
                             //包含,学校的行政班,教学班
                             //包含,学校的行政班,教学班
                             json.TryGetProperty("type", out JsonElement _type);
                             json.TryGetProperty("type", out JsonElement _type);
@@ -664,10 +665,10 @@ namespace TEAMModelOS.Controllers
                                         school = $"{school}",
                                         school = $"{school}",
                                         type = "class",
                                         type = "class",
                                         year = item.year,
                                         year = item.year,
-                                        expire=0,
-                                        no=item.no,
+                                        expire = 0,
+                                        no = item.no,
                                         groupName = groupNames,
                                         groupName = groupNames,
-                                        scount= scount
+                                        scount = scount
                                     };
                                     };
                                     groupLists.Add(group);
                                     groupLists.Add(group);
                                 }
                                 }
@@ -713,22 +714,22 @@ namespace TEAMModelOS.Controllers
                                 }
                                 }
                             }
                             }
                         }
                         }
-                       
+
                         //long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         //long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         return Ok(new { groupLists });
                         return Ok(new { groupLists });
                     }
                     }
                 case bool when $"{opt}".Equals("teach", StringComparison.OrdinalIgnoreCase):
                 case bool when $"{opt}".Equals("teach", StringComparison.OrdinalIgnoreCase):
                     {
                     {
-                        string sql  = $"SELECT distinct value c FROM c  join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or  b.teacherId  ='{tmdid}' )";
-                        List<KeyValuePair<string,CourseTask >> schoolTeacherTask = new List<KeyValuePair<string, CourseTask>>();
-                        List<KeyValuePair<string,CourseTask >> schoolAssistantTask = new  List<KeyValuePair<string,CourseTask >>();
+                        string sql = $"SELECT distinct value c FROM c  join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or  b.teacherId  ='{tmdid}' )";
+                        List<KeyValuePair<string, CourseTask>> schoolTeacherTask = new List<KeyValuePair<string, CourseTask>>();
+                        List<KeyValuePair<string, CourseTask>> schoolAssistantTask = new List<KeyValuePair<string, CourseTask>>();
 
 
-                        List<KeyValuePair<string,CourseTask >> privateTeacherTask = new  List<KeyValuePair<string,CourseTask >>();
-                        List<KeyValuePair<string,CourseTask >> privateAssistantTask = new  List<KeyValuePair<string,CourseTask >>();
+                        List<KeyValuePair<string, CourseTask>> privateTeacherTask = new List<KeyValuePair<string, CourseTask>>();
+                        List<KeyValuePair<string, CourseTask>> privateAssistantTask = new List<KeyValuePair<string, CourseTask>>();
                         List<CourseDto> schoolCourses = new List<CourseDto>();
                         List<CourseDto> schoolCourses = new List<CourseDto>();
                         List<CourseDto> teahcerCourses = new List<CourseDto>();
                         List<CourseDto> teahcerCourses = new List<CourseDto>();
                         List<string> groupIds = new List<string>();
                         List<string> groupIds = new List<string>();
-                        if (!string.IsNullOrWhiteSpace(school)) 
+                        if (!string.IsNullOrWhiteSpace(school))
                         {
                         {
                             School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
                             School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
                             JsonElement _year = default, _semesterId = default, _periodId = default;
                             JsonElement _year = default, _semesterId = default, _periodId = default;
@@ -745,58 +746,58 @@ namespace TEAMModelOS.Controllers
                             //string date = SchoolService.GetOpensByStudyYearAndSemester(period.semesters, int.Parse($"{_year}"), $"{_semesterId}");
                             //string date = SchoolService.GetOpensByStudyYearAndSemester(period.semesters, int.Parse($"{_year}"), $"{_semesterId}");
                             sql = $"{sql} and  c.year={_year} and c.semesterId='{_semesterId}'";
                             sql = $"{sql} and  c.year={_year} and c.semesterId='{_semesterId}'";
                             HashSet<string> courseIds = new HashSet<string>();
                             HashSet<string> courseIds = new HashSet<string>();
-                            var resultSchool= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseTask>(sql, $"CourseTask-{school}");
+                            var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseTask>(sql, $"CourseTask-{school}");
                             if (resultSchool.list.IsNotEmpty()) {
                             if (resultSchool.list.IsNotEmpty()) {
                                 resultSchool.list.ForEach(x => {
                                 resultSchool.list.ForEach(x => {
-                                   var schedulesTeacher =   x.schedules.Where(z =>!string.IsNullOrWhiteSpace(z.teacherId)   && z.teacherId.Equals(tmdid));
-                                    if (schedulesTeacher.Any()) 
+                                    var schedulesTeacher = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.teacherId) && z.teacherId.Equals(tmdid));
+                                    if (schedulesTeacher.Any())
                                     {
                                     {
                                         courseIds.Add(x.courseId);
                                         courseIds.Add(x.courseId);
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
-                                        courseTask.schedules=schedulesTeacher.ToList();
-                                        schoolTeacherTask.Add(new KeyValuePair<string,CourseTask  >(x.courseId, courseTask));
+                                        courseTask.schedules = schedulesTeacher.ToList();
+                                        schoolTeacherTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
                                         groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
                                         groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
                                     }
                                     }
-                                    var schedulesAssistant = x.schedules.Where(z => z.assistants.Contains(tmdid) );
+                                    var schedulesAssistant = x.schedules.Where(z => z.assistants.Contains(tmdid));
                                     if (schedulesAssistant.Any())
                                     if (schedulesAssistant.Any())
                                     {
                                     {
                                         courseIds.Add(x.courseId);
                                         courseIds.Add(x.courseId);
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
-                                        courseTask.schedules=schedulesAssistant.ToList();
+                                        courseTask.schedules = schedulesAssistant.ToList();
                                         schoolAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
                                         schoolAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
                                         groupIds.AddRange(schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
                                         groupIds.AddRange(schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
                                     }
                                     }
                                 });
                                 });
                             }
                             }
                             if (courseIds.Any()) {
                             if (courseIds.Any()) {
-                                string sqlCourse = $"select value c from c where c.id in ({string.Join(",",courseIds.Select(b=>$"'{b}'"))})";
+                                string sqlCourse = $"select value c from c where c.id in ({string.Join(",", courseIds.Select(b => $"'{b}'"))})";
                                 var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlCourse, $"CourseBase-{school}");
                                 var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlCourse, $"CourseBase-{school}");
-                                if (result.list.IsNotEmpty()) 
+                                if (result.list.IsNotEmpty())
                                 {
                                 {
-                                    foreach (var item in result.list) 
+                                    foreach (var item in result.list)
                                     {
                                     {
                                         List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
                                         List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
-                                        var teacher = schoolTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="teacher" });
+                                        var teacher = schoolTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask = z.Value, type = "teacher" });
                                         if (teacher.Any()) {
                                         if (teacher.Any()) {
                                             courseTaskDtos.AddRange(teacher.ToList());
                                             courseTaskDtos.AddRange(teacher.ToList());
                                         }
                                         }
-                                        var assistant= schoolAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto {  courseTask=z.Value, type="assistant" });
+                                        var assistant = schoolAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask = z.Value, type = "assistant" });
                                         if (assistant.Any()) {
                                         if (assistant.Any()) {
                                             courseTaskDtos.AddRange(assistant.ToList());
                                             courseTaskDtos.AddRange(assistant.ToList());
                                         }
                                         }
-                                        schoolCourses.Add(new CourseDto { courseBase=item, courseTasks=courseTaskDtos });
+                                        schoolCourses.Add(new CourseDto { courseBase = item, courseTasks = courseTaskDtos });
                                     }
                                     }
                                 }
                                 }
                             }
                             }
                         }
                         }
-                      
+
                         {
                         {
                             HashSet<string> courseIds = new HashSet<string>();
                             HashSet<string> courseIds = new HashSet<string>();
                             string sqlCoursePrivate = $"select value c.id from c where  c.creatorId='{tmdid}'";
                             string sqlCoursePrivate = $"select value c.id from c where  c.creatorId='{tmdid}'";
                             var resultCourseBasePrivate = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<string>(sqlCoursePrivate, $"CourseBase");
                             var resultCourseBasePrivate = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<string>(sqlCoursePrivate, $"CourseBase");
                             if (resultCourseBasePrivate.list.IsNotEmpty())
                             if (resultCourseBasePrivate.list.IsNotEmpty())
                             {
                             {
-                                courseIds=new HashSet<string>(resultCourseBasePrivate.list);
+                                courseIds = new HashSet<string>(resultCourseBasePrivate.list);
                             }
                             }
                             string sqlprivate = $"SELECT distinct value c FROM c  join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or  b.teacherId  ='{tmdid}' )";
                             string sqlprivate = $"SELECT distinct value c FROM c  join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or  b.teacherId  ='{tmdid}' )";
                             var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseTask>(sqlprivate, $"CourseTask");
                             var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseTask>(sqlprivate, $"CourseTask");
@@ -804,12 +805,12 @@ namespace TEAMModelOS.Controllers
                             {
                             {
 
 
                                 resultTeacher.list.ForEach(x => {
                                 resultTeacher.list.ForEach(x => {
-                                    var schedulesTeacher = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.teacherId)  &&  z.teacherId.Equals(tmdid));
+                                    var schedulesTeacher = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.teacherId) && z.teacherId.Equals(tmdid));
                                     if (schedulesTeacher.Any())
                                     if (schedulesTeacher.Any())
                                     {
                                     {
                                         courseIds.Add(x.courseId);
                                         courseIds.Add(x.courseId);
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
-                                        courseTask.schedules=schedulesTeacher.ToList();
+                                        courseTask.schedules = schedulesTeacher.ToList();
                                         privateTeacherTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
                                         privateTeacherTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
                                         groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
                                         groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
                                     }
                                     }
@@ -818,12 +819,12 @@ namespace TEAMModelOS.Controllers
                                     {
                                     {
                                         courseIds.Add(x.courseId);
                                         courseIds.Add(x.courseId);
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
                                         CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
-                                        courseTask.schedules=schedulesAssistant.ToList();
+                                        courseTask.schedules = schedulesAssistant.ToList();
                                         privateAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
                                         privateAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
-                                        groupIds.AddRange(schedulesAssistant.Where(z=>!string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
+                                        groupIds.AddRange(schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
                                     }
                                     }
                                 });
                                 });
-                               
+
                             }
                             }
                             if (courseIds.Any())
                             if (courseIds.Any())
                             {
                             {
@@ -835,46 +836,46 @@ namespace TEAMModelOS.Controllers
 
 
                                     {
                                     {
                                         List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
                                         List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
-                                        var teacher = privateTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="teacher" });
+                                        var teacher = privateTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask = z.Value, type = "teacher" });
                                         if (teacher.Any())
                                         if (teacher.Any())
                                         {
                                         {
                                             courseTaskDtos.AddRange(teacher.ToList());
                                             courseTaskDtos.AddRange(teacher.ToList());
                                         }
                                         }
-                                        var assistant = privateAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="assistant" });
+                                        var assistant = privateAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask = z.Value, type = "assistant" });
                                         if (assistant.Any())
                                         if (assistant.Any())
                                         {
                                         {
                                             courseTaskDtos.AddRange(assistant.ToList());
                                             courseTaskDtos.AddRange(assistant.ToList());
                                         }
                                         }
-                                        teahcerCourses.Add(new CourseDto { courseBase=item, courseTasks=courseTaskDtos });
+                                        teahcerCourses.Add(new CourseDto { courseBase = item, courseTasks = courseTaskDtos });
                                     }
                                     }
                                 }
                                 }
                             }
                             }
                             List<CourseGroupList> courseGroupLists = new List<CourseGroupList>();
                             List<CourseGroupList> courseGroupLists = new List<CourseGroupList>();
-                            _coreAPIHttpService.check=false;
-                            var groupListDatas =  await GroupListService.GetMemberByListids(_coreAPIHttpService, _azureCosmos.GetCosmosClient(), _dingDing, groupIds.ToHashSet().ToList(), school);
+                            _coreAPIHttpService.check = false;
+                            var groupListDatas = await GroupListService.GetMemberByListids(_coreAPIHttpService, _azureCosmos.GetCosmosClient(), _dingDing, groupIds.ToHashSet().ToList(), school);
 
 
                             foreach (var z in teahcerCourses)
                             foreach (var z in teahcerCourses)
                             {
                             {
-                                CourseGroupList courseGroupList=   new CourseGroupList
+                                CourseGroupList courseGroupList = new CourseGroupList
                                 {
                                 {
-                                    scope="private",
-                                    id=z.courseBase.id,
-                                    name=z.courseBase.name,
-                                    periodId=z.courseBase.period?.id,
-                                    period=z.courseBase.period?.name,
-                                    subject=z.courseBase.subject?.name,
-                                    subjectId= z.courseBase.subject?.id
+                                    scope = "private",
+                                    id = z.courseBase.id,
+                                    name = z.courseBase.name,
+                                    periodId = z.courseBase.period?.id,
+                                    period = z.courseBase.period?.name,
+                                    subject = z.courseBase.subject?.name,
+                                    subjectId = z.courseBase.subject?.id
                                 };
                                 };
                                 foreach (var x in z.courseTasks)
                                 foreach (var x in z.courseTasks)
                                 {
                                 {
                                     foreach (var y in x.courseTask.schedules)
                                     foreach (var y in x.courseTask.schedules)
                                     {
                                     {
                                         var data = groupListDatas.groups.Find(m => m.id.Equals(y.groupId));
                                         var data = groupListDatas.groups.Find(m => m.id.Equals(y.groupId));
-                                        if (data!= null)
+                                        if (data != null)
                                         {
                                         {
                                             HashSet<string> groupName = data.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
                                             HashSet<string> groupName = data.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
                                             GroupListGrp groupListGrp = new GroupListGrp(data, groupName);
                                             GroupListGrp groupListGrp = new GroupListGrp(data, groupName);
-                                            groupListGrp.teachType=x.type;
+                                            groupListGrp.teachType = x.type;
                                             courseGroupList.groups.Add(groupListGrp);
                                             courseGroupList.groups.Add(groupListGrp);
                                         }
                                         }
                                     }
                                     }
@@ -885,32 +886,32 @@ namespace TEAMModelOS.Controllers
                             {
                             {
                                 CourseGroupList courseGroupList = new CourseGroupList
                                 CourseGroupList courseGroupList = new CourseGroupList
                                 {
                                 {
-                                    scope="school",
-                                    id=z.courseBase.id,
-                                    name=z.courseBase.name,
-                                    periodId=z.courseBase.period?.id,
-                                    period=z.courseBase.period?.name,
-                                    subject=z.courseBase.subject?.name,
-                                    subjectId= z.courseBase.subject?.id
+                                    scope = "school",
+                                    id = z.courseBase.id,
+                                    name = z.courseBase.name,
+                                    periodId = z.courseBase.period?.id,
+                                    period = z.courseBase.period?.name,
+                                    subject = z.courseBase.subject?.name,
+                                    subjectId = z.courseBase.subject?.id
                                 };
                                 };
                                 foreach (var x in z.courseTasks)
                                 foreach (var x in z.courseTasks)
                                 {
                                 {
                                     foreach (var y in x.courseTask.schedules)
                                     foreach (var y in x.courseTask.schedules)
                                     {
                                     {
                                         var data = groupListDatas.groups.Find(m => m.id.Equals(y.groupId));
                                         var data = groupListDatas.groups.Find(m => m.id.Equals(y.groupId));
-                                        if (data!= null) {
+                                        if (data != null) {
                                             HashSet<string> groupName = data.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
                                             HashSet<string> groupName = data.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
                                             GroupListGrp groupListGrp = new GroupListGrp(data, groupName);
                                             GroupListGrp groupListGrp = new GroupListGrp(data, groupName);
-                                            groupListGrp.teachType=x.type;
+                                            groupListGrp.teachType = x.type;
                                             courseGroupList.groups.Add(groupListGrp);
                                             courseGroupList.groups.Add(groupListGrp);
                                         }
                                         }
                                     }
                                     }
                                 }
                                 }
                                 courseGroupLists.Add(courseGroupList);
                                 courseGroupLists.Add(courseGroupList);
                             }
                             }
-                            long now =  DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                            long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                             foreach (var groups in courseGroupLists) {
                             foreach (var groups in courseGroupLists) {
-                                groups.groups.RemoveAll(z => z.expire>0 && z.expire<now);
+                                groups.groups.RemoveAll(z => z.expire > 0 && z.expire < now);
                             }
                             }
                             return Ok(new { groupLists = courseGroupLists });
                             return Ok(new { groupLists = courseGroupLists });
                         }
                         }
@@ -954,9 +955,9 @@ namespace TEAMModelOS.Controllers
                 }
                 }
             }
             }
             List<string> listids = ids.ToObject<List<string>>();
             List<string> listids = ids.ToObject<List<string>>();
-            if (json.TryGetProperty("time", out JsonElement _time) &&  long.TryParse($"{_time}", out long time)  && time>0)
+            if (json.TryGetProperty("time", out JsonElement _time) && long.TryParse($"{_time}", out long time) && time > 0)
             {
             {
-                (List<RMember> members, List<RGroupList> groups) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, listids, $"{schoolId}", ps,time:time);
+                (List<RMember> members, List<RGroupList> groups) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, listids, $"{schoolId}", ps, time: time);
                 return Ok(new { groups, members });
                 return Ok(new { groups, members });
             }
             }
             else
             else
@@ -964,7 +965,7 @@ namespace TEAMModelOS.Controllers
                 (List<RMember> members, List<RGroupList> groups) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, listids, $"{schoolId}", ps);
                 (List<RMember> members, List<RGroupList> groups) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, listids, $"{schoolId}", ps);
                 return Ok(new { groups, members });
                 return Ok(new { groups, members });
             }
             }
-           
+
         }
         }
         /// <summary>
         /// <summary>
         /// 根据任意名单id获取名单摘要信息。
         /// 根据任意名单id获取名单摘要信息。
@@ -982,9 +983,9 @@ namespace TEAMModelOS.Controllers
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
             if (!json.TryGetProperty("ids", out JsonElement ids)) return BadRequest();
             if (!json.TryGetProperty("ids", out JsonElement ids)) return BadRequest();
             json.TryGetProperty("schoolId", out JsonElement schoolId);
             json.TryGetProperty("schoolId", out JsonElement schoolId);
-            List<string> listids = ids.ToObject<HashSet<string>>().ToList() ;
+            List<string> listids = ids.ToObject<HashSet<string>>().ToList();
             List<GroupListDto> groups = null;
             List<GroupListDto> groups = null;
-            if (json.TryGetProperty("time", out JsonElement _time) &&  long.TryParse($"{_time}", out long time)  && time>0)
+            if (json.TryGetProperty("time", out JsonElement _time) && long.TryParse($"{_time}", out long time) && time > 0)
             {
             {
                 groups = await GroupListService.GetGroupListByListids(client, _dingDing, listids, $"{schoolId}", SummarySql, time: time);
                 groups = await GroupListService.GetGroupListByListids(client, _dingDing, listids, $"{schoolId}", SummarySql, time: time);
             }
             }
@@ -992,7 +993,7 @@ namespace TEAMModelOS.Controllers
             {
             {
                 groups = await GroupListService.GetGroupListByListids(client, _dingDing, listids, $"{schoolId}", SummarySql);
                 groups = await GroupListService.GetGroupListByListids(client, _dingDing, listids, $"{schoolId}", SummarySql);
             }
             }
-              
+
             return Ok(new { groups });
             return Ok(new { groups });
         }
         }
         /// <summary>
         /// <summary>
@@ -1015,18 +1016,18 @@ namespace TEAMModelOS.Controllers
                 if (!json.TryGetProperty("type", out JsonElement type)) return BadRequest();
                 if (!json.TryGetProperty("type", out JsonElement type)) return BadRequest();
                 json.TryGetProperty("periodId", out JsonElement periodId);
                 json.TryGetProperty("periodId", out JsonElement periodId);
                 json.TryGetProperty("no", out JsonElement no);
                 json.TryGetProperty("no", out JsonElement no);
-               
+
                 List<RGroupList> groups = new List<RGroupList>();
                 List<RGroupList> groups = new List<RGroupList>();
 
 
                 string sqlSemester = "";
                 string sqlSemester = "";
-                if (json.TryGetProperty("time", out JsonElement _time) &&  long.TryParse($"{_time}", out long time)  && time>0)
+                if (json.TryGetProperty("time", out JsonElement _time) && long.TryParse($"{_time}", out long time) && time > 0)
                 {
                 {
                     var groupListSemester = await GetGroupListSemester(client, null, $"{_schoolId}", $"{type}", $"{periodId}", $"{no}", time);
                     var groupListSemester = await GetGroupListSemester(client, null, $"{_schoolId}", $"{type}", $"{periodId}", $"{no}", time);
                     if (groupListSemester.groupListDtos.IsNotEmpty())
                     if (groupListSemester.groupListDtos.IsNotEmpty())
                     {
                     {
                         groups.AddRange(groupListSemester.rgroupList);
                         groups.AddRange(groupListSemester.rgroupList);
                         //排除掉已有的数据
                         //排除掉已有的数据
-                        sqlSemester =$" and c.id not in ({string.Join(",", groupListSemester.groupListDtos.Select(z => $"'{z.id}'"))})";
+                        sqlSemester = $" and c.id not in ({string.Join(",", groupListSemester.groupListDtos.Select(z => $"'{z.id}'"))})";
                     }
                     }
                 }
                 }
                 StringBuilder sql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='{type}'");
                 StringBuilder sql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='{type}'");
@@ -1049,12 +1050,31 @@ namespace TEAMModelOS.Controllers
                 {
                 {
                     sql.Append($" and c.creatorId='{_tmdid}'");
                     sql.Append($" and c.creatorId='{_tmdid}'");
                 }
                 }
+                StringBuilder groupIds = new StringBuilder();
+
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tbname).GetItemQueryIteratorSql<RGroupList>(queryText: sql.ToString(),
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tbname).GetItemQueryIteratorSql<RGroupList>(queryText: sql.ToString(),
                  requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(code) }))
                  requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(code) }))
                 {
                 {
                     groups.Add(item);
                     groups.Add(item);
+                    // 取出該老師還有連結課程的名單id
+                    groupIds.Append($"'{item.id}',");
                 }
                 }
-                (List<RGroupList> groupsData, List<RMember> members) = await GroupListService.GetGroupListMemberInfo(_coreAPIHttpService, client, $"{type}", groups, tbname, _dingDing, $"{_schoolId}");
+                List<RGroupList> haveTaskGroups = new List<RGroupList>();
+                if (groupIds.Length > 0)
+                {
+                    groupIds = groupIds.Remove(groupIds.Length - 1, 1);
+                    string courseTasksql = $"SELECT distinct b.groupId from c join b in c.schedules where b.groupId in ( {groupIds} )";
+
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tbname).GetItemQueryIteratorSql<GroupId>(queryText: courseTasksql.ToString(),
+                    requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("CourseTask") }))
+                    {
+                        var groupItem = groups.Find(z => z.id == item.groupId);  
+                        // 篩選出有效的名單
+                        haveTaskGroups.Add(groupItem);
+                    }
+                }
+
+                (List<RGroupList> groupsData, List<RMember> members) = await GroupListService.GetGroupListMemberInfo(_coreAPIHttpService, client, $"{type}", haveTaskGroups, tbname, _dingDing, $"{_schoolId}");
                 return Ok(new { groups = groupsData, members });
                 return Ok(new { groups = groupsData, members });
             }
             }
             catch (CosmosException ex)
             catch (CosmosException ex)
@@ -1067,6 +1087,13 @@ namespace TEAMModelOS.Controllers
             }
             }
             return Ok();
             return Ok();
         }
         }
+        public class GroupId
+        {
+            /// <summary>
+            /// 分组id
+            /// </summary>
+            public string groupId { get; set; }
+        }
         /// <summary>
         /// <summary>
         /// 获取名单列表
         /// 获取名单列表
         /// </summary>
         /// </summary>