Przeglądaj źródła

Merge branch 'develop6.0-tmd' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop6.0-tmd

Li 3 lat temu
rodzic
commit
7a1ca21a5c
26 zmienionych plików z 155 dodań i 71 usunięć
  1. 4 3
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs
  2. 8 7
      TEAMModelOS/ClientApp/src/boot-app.js
  3. 1 1
      TEAMModelOS/ClientApp/src/common/BasePreviewFile.vue
  4. 52 31
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue
  5. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue
  6. 3 3
      TEAMModelOS/ClientApp/src/components/student-web/SettingView/Setting.vue
  7. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js
  8. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/survey.js
  9. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  10. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/survey.js
  11. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js
  12. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/survey.js
  13. 41 2
      TEAMModelOS/ClientApp/src/utils/directive.js
  14. 6 5
      TEAMModelOS/ClientApp/src/view/ability/Review.vue
  15. 10 0
      TEAMModelOS/ClientApp/src/view/classrecord/ClassRecord.vue
  16. 1 1
      TEAMModelOS/ClientApp/src/view/classrecord/eventchart/PopQues.vue
  17. 3 1
      TEAMModelOS/ClientApp/src/view/evaluation/bank/PaperDownload.vue
  18. 1 0
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  19. 1 1
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue
  20. 2 0
      TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.less
  21. 7 5
      TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.vue
  22. 1 1
      TEAMModelOS/ClientApp/src/view/student-account/class/ClassMgt.vue
  23. 1 1
      TEAMModelOS/ClientApp/src/view/student-account/stulist/MgtStuList.vue
  24. 1 1
      TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.vue
  25. 1 1
      TEAMModelOS/Controllers/Analysis/AnalysisController.cs
  26. 4 3
      TEAMModelOS/Controllers/Common/ExamController.cs

+ 4 - 3
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -945,12 +945,12 @@ namespace TEAMModelOS.FunctionV4
                     {
                         double score = 0;
                         double allScore = 0;
-                        int n = 0;
                         int count = 0;
                         foreach (ExamClassResult result in classResults)
                         {
                             if (result.subjectId.Equals(subject.id))
                             {
+                                int n = 0;
                                 foreach (List<string> str in info.papers[no].knowledge)
                                 {
                                     if (str.Contains(k))
@@ -1082,12 +1082,13 @@ namespace TEAMModelOS.FunctionV4
                 {
                     double score = 0;
                     double allScore = 0;
-                    int n = 0;
+                    
                     int count = 0;
                     foreach (ExamClassResult result in classResults)
                     {
                         if (result.subjectId.Equals(subject.id))
                         {
+                            int n = 0;
                             foreach (int str in info.papers[no].field)
                             {
                                 if (str == knowledgeName[i])
@@ -1106,10 +1107,10 @@ namespace TEAMModelOS.FunctionV4
                                 }
                                 n++;
                             }
-
                             count += result.studentIds.Count;
                         }
                     }
+
                     double per = count > 0 ? Math.Round(score / count, 2) : 0;
                     afp.Add(allScore > 0 ? Math.Round(per / allScore, 2) : 0);
                 }

+ 8 - 7
TEAMModelOS/ClientApp/src/boot-app.js

@@ -11,7 +11,7 @@ import tools from '@/utils/public.js'
 import evTools from '@/utils/evTools.js'
 import editorTools from '@/utils/editorTools.js'
 import jsFn from '@/utils/js-fn.js'
-import specialChar from '@/utils/directive.js'
+import { specialChar, fileName } from '@/utils/directive.js'
 import apiTools from '@/api'
 import loginTools from '@/access/login'
 import mockTools from '@/mock'
@@ -57,11 +57,12 @@ Vue.use(hevueImgPreview)
 Vue.use(dataV)
 // 设置全局自定义指令
 Vue.directive('special-char', specialChar)
+Vue.directive('file-name', fileName)
 // 设置图片懒加载
 Vue.use(VueLazyload, {
- error: require('@/assets/image/img_err.png'),
- loading: require('@/assets/loading/loading.gif'),
- attempt: 1,//尝试加载的次数
+    error: require('@/assets/image/img_err.png'),
+    loading: require('@/assets/loading/loading.gif'),
+    attempt: 1,//尝试加载的次数
 })
 Vue.use(htmlToPdf)
 Vue.use(VueClipBoard)
@@ -85,9 +86,9 @@ Vue.use(VueLogger, {
     showConsoleColors: true
 })
 // 定义vuescroll全局滚动条组件
-Vue.component('vuescroll',vuescroll)
-Vue.component('NewChooseContent',NewChooseContent)
-Vue.prototype.$vuescrollConfig =  tools.vueScrollOpt
+Vue.component('vuescroll', vuescroll)
+Vue.component('NewChooseContent', NewChooseContent)
+Vue.prototype.$vuescrollConfig = tools.vueScrollOpt
 // 定义全局中央数据总线通信
 Vue.prototype.$EventBus = new Vue()
 // 全局API请求

+ 1 - 1
TEAMModelOS/ClientApp/src/common/BasePreviewFile.vue

@@ -11,7 +11,7 @@
 			<iframe v-else-if="previewFile.type == 'doc' && previewFile.extension != 'PDF'"
 				:src="'https://view.officeapps.live.com/op/view.aspx?src=' + encodeURIComponent(previewFile.url)"
 				width="100%" height="100%" frameborder="1" />
-			<div class="preview-fail" v-else>文件暂不支持预览</div>
+			<div class="preview-fail" v-else>{{ $t('jyzx.online.noSee') }}</div>
 		</div>
 	</div>
 </template>

+ 52 - 31
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue

@@ -126,7 +126,7 @@
                                                         <Icon type="ios-search" @click="openViewer(items.img)" />
                                                     </p>
                                                 </div>
-                                                
+
                                                 <!-- <div v-for="(rtItem, rtIndex) in items.pageData" :key="rtIndex + '' + index" class="record-data-item">
                                                     <span class="event-tag">{{ rtItem.Event }}</span>
                                                 </div> -->
@@ -202,7 +202,7 @@ export default {
         Receive,
         DataCount,
     },
-    data () {
+    data() {
         return {
             isLoad: false,
             player: undefined,
@@ -216,10 +216,10 @@ export default {
                 height: "450px",
                 controlBar: {
                     children: [// 写在这里,会在播放条上显示出来,并且是按照写的顺序显示位置。
-                        {name: "playToggle"}, //播放暂停按钮
-                        {name: "currentTimeDisplay"}, //当前播放时间
-                        {name: "progressControl"}, //播放进度条
-                        {name: "durationDisplay"}, //总时间
+                        { name: "playToggle" }, //播放暂停按钮
+                        { name: "currentTimeDisplay" }, //当前播放时间
+                        { name: "progressControl" }, //播放进度条
+                        { name: "durationDisplay" }, //总时间
                         {
                             name: "playbackRateMenuButton",
                             playbackRates: [0.5, 1, 1.5, 2, 2.5]
@@ -228,8 +228,8 @@ export default {
                             name: "volumePanel", //音量控制
                             inline: false, //不使用水平方式
                         },
-                        {name: "FullscreenToggle"}, //全屏
-                        {name: "DashBoardEchart"}
+                        { name: "FullscreenToggle" }, //全屏
+                        { name: "DashBoardEchart" }
                     ],
                 },
                 /* html5: {
@@ -266,13 +266,13 @@ export default {
             courseNow: undefined,
         }
     },
-    created () {
+    created() {
         this.hiTeachEvent = this.$GLOBAL.HI_TEACH_EVENT()
         this.events = Object.keys(this.hiTeachEvent)
         this.fnEvents = this.events.filter(key => this.hiTeachEvent[key].type === 'fn')
         this.recordInfo = this.$route.params.record
         this.courseNow = this.$route.params.courseNow
-        if(!this.recordInfo) {
+        if (!this.recordInfo) {
             this.$router.go(-1)
         } else {
             this.recordInfo.startTime = this.dateFormat(this.recordInfo.startTime)
@@ -284,13 +284,13 @@ export default {
             this.getPageList()
         }
     },
-    mounted () {
+    mounted() {
         // this.getVideo()
     },
     methods: {
         getVideo() {
             var that = this
-            this.player = videojs(document.getElementById("recordVideo"), this.playerOptions, function() {
+            this.player = videojs(document.getElementById("recordVideo"), this.playerOptions, function () {
                 this.on('error', (e) => {
                     that.hasVideo = false
                     that.isShowVd = false
@@ -298,7 +298,7 @@ export default {
             })
             //时间切片
             this.player.markers({
-                    markerStyle: {
+                markerStyle: {
                     width: "16px",
                     height: "16px",
                     top: "-22px",
@@ -333,7 +333,7 @@ export default {
 
                 //标记点击事件
                 onMarkerClick: function (marker) {
-                    
+
                 },
                 //视频播放到标记点触发的时间
                 onMarkerReached: function (marker) {
@@ -353,7 +353,7 @@ export default {
                     that.getCurPage(marker.page)
                 },
             });
-            
+
             this.isLoad = false
         },
         // 根据SokratesRecords.json处理page数据
@@ -395,7 +395,7 @@ export default {
                         let baseUrl = `${sas.url}/${sas.name}/records/${this.recordInfo.id}/IES/base.json?${sas.sas}`
                         this.baseData = JSON.parse(await this.$tools.getFile(baseUrl) || '{}')
                         this.baseData.student.forEach((item, index) => {
-                            if(item.name === this.$store.state.userInfo.name) {
+                            if (item.name === this.$store.state.userInfo.name) {
                                 this.nowStuInfo = item
                                 this.nowStuInfo.index = index
                             }
@@ -405,6 +405,16 @@ export default {
                     }
                     let r = this.sokratesRecords.find(item => item.Event === 'PgidList')
                     let pgids = r ? r.PgIdList : []
+
+                    //这里需要判断录制开始的pageid
+                    let startInfo = this.sokratesRecords.find(item => item.Event === 'EzsStartRecord')
+                    let startId = startInfo ? startInfo.Pgid : ''
+                    let startIndex = 0
+                    if (startId) {
+                        startIndex = pgids.findIndex(item => item === startId)
+                    }
+                    pgids = pgids.slice(startIndex)
+
                     let havePage = 0
                     pgids.forEach((item, index) => {
                         let page = {}
@@ -479,7 +489,7 @@ export default {
             let pageInfo = this.markers.find(item => {
                 return item.page === page
             })
-            if(pageInfo) {
+            if (pageInfo) {
                 this.player.currentTime(pageInfo.time)
             }
         },
@@ -491,7 +501,7 @@ export default {
             let pageInfo = this.markers.find(item => {
                 return item.page === page
             })
-            if(pageInfo) {
+            if (pageInfo) {
                 this.player.currentTime(pageInfo.time)
                 if (!this.openHtexViewer) {
                     this.player.play()
@@ -511,16 +521,29 @@ export default {
             this.player.play()
         },
         //查看电子笔记
-        viewENote() {
+        async viewENote() {
+            let eNote
             if (this.recordInfo.eNote) {
-                window.open('/web/viewer.html?file=' + encodeURIComponent(this.recordInfo.eNote))
+                eNote = this.recordInfo.eNote
             } else {
-                this.$Message.warning(this.$t('cusMgt.rcd.noNote'))
+                // let sasInfo = {}
+                // let blobInfo = this.recordInfo.scope === 'school' ? this.$store.state.user.schoolProfile : this.$store.state.user.userProfile
+                // sasInfo.sas = '?' + blobInfo.blob_sas
+                // sasInfo.name = this.recordInfo.scope ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
+                // sasInfo.url = blobInfo.blob_uri.slice(0, blobInfo.blob_uri.lastIndexOf(sasInfo.name) - 1)
+                let sasInfo = await this.$tools.getBlobSas(this.recordInfo.scope === 'school' ? this.recordInfo.school : this.recordInfo.tmdid)
+                eNote = `${sasInfo.url}/${sasInfo.name}/records/${this.recordInfo.id}/Note.pdf${sasInfo.sas}`
             }
+            window.open('/web/viewer.html?file=' + encodeURIComponent(eNote))
+            // if (this.recordInfo.eNote) {
+            //     window.open('/web/viewer.html?file=' + encodeURIComponent(this.recordInfo.eNote))
+            // } else {
+            //     this.$Message.warning(this.$t('cusMgt.rcd.noNote'))
+            // }
         },
         //下载电子笔记
         async loadNote() {
-            if(this.recordInfo.eNote) {
+            if (this.recordInfo.eNote) {
                 // 已经有授权,在查看文件时不需要再次获取授权
                 let blobData = this.recordInfo.eNote
                 const downloadRes = async () => {
@@ -538,7 +561,7 @@ export default {
                 this.$Message.warning("暂无电子笔记")
             }
         },
-        openViewer(item){
+        openViewer(item) {
             this.$hevueImgPreview(item)
         },
         // 筛选
@@ -568,7 +591,7 @@ export default {
     },
     computed: {
         curImg() {
-            if (this.pageList[this.curPage]) {
+            if (this.pageList[this.curPage - 1]) {
                 return this.pageList[this.curPage - 1].img
             } else {
                 return ""
@@ -583,8 +606,7 @@ export default {
 </style>
 <style lang="less">
 .class-content {
-
-    .video-js .vjs-big-play-button{
+    .video-js .vjs-big-play-button {
         top: 50%;
         left: 50%;
         margin-left: -20px;
@@ -592,20 +614,19 @@ export default {
         display: none;
     }
 
-    .video-js .vjs-control-bar{
+    .video-js .vjs-control-bar {
         display: flex;
     }
 
-    
     .vjs-marker::after {
-        content: '';
+        content: "";
         height: 0px;
         width: 0px;
         border: 3px transparent solid;
         display: block;
         position: absolute;
         bottom: -10px;
-        z-index:-1;
+        z-index: -1;
         border-right: 8px solid transparent;
         border-top: 15px solid orange;
         border-left: 8px solid transparent;
@@ -620,7 +641,7 @@ export default {
         z-index: 101;
     }
 }
-.owner-student-client-icon{
+.owner-student-client-icon {
     font-size: 30px;
     padding: 5px;
     color: #ffffff;

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

@@ -1002,7 +1002,7 @@ export default {
         getRecordList() {
             this.recordList = []
             let param = {
-                tmdid: "",
+                tmdid: this.courseNow.teaId,
                 scope: this.courseNow.scope, //school:传school,private:传tmdid
                 school: "",
                 category: [],

+ 3 - 3
TEAMModelOS/ClientApp/src/components/student-web/SettingView/Setting.vue

@@ -315,7 +315,7 @@ export default {
             let srvAdr = this.config.srvAdr
             let host = srvAdr == 'Global' ? this.config.Global.coreAPIUrl : this.config.China.coreAPIUrl
             let clientId = srvAdr == 'Global' ? this.config.Global.clientID : this.config.China.clientID
-            let idToken = localStorage.getItem('id_token')
+            let idToken = localStorage.getItem('stu_id_token')
             let params = {
                 "grant_type": "get",
                 "nonce": "habook",
@@ -485,7 +485,7 @@ export default {
                 let srvAdr = this.config.srvAdr
                 let host = srvAdr == 'Global' ? this.config.Global.coreAPIUrl : this.config.China.coreAPIUrl
                 let clientId = srvAdr == 'Global' ? this.config.Gloabl.clientID : this.config.China.clientID
-                let idToken = localStorage.getItem('id_token')
+                let idToken = localStorage.getItem('stu_id_token')
 
                 let params = {
                     "nonce": "habook",
@@ -653,7 +653,7 @@ export default {
                     let srvAdr = _this.config.srvAdr
                     let host = srvAdr == 'Global' ? _this.config.Global.coreAPIUrl : _this.config.China.coreAPIUrl
                     let clientId = srvAdr == 'Global' ? _this.config.Gloabl.clientID : _this.config.China.clientID
-                    let idToken = localStorage.getItem('id_token')
+                    let idToken = localStorage.getItem('stu_id_token')
                     let params = {
                         "nonce": "habook", //任意字符串
                         "client_id": clientId,

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js

@@ -115,6 +115,7 @@ export default {
   delTimeContent:'Are you sure you want to delete the current schedule?',
   setStartTitps:'Set as enrollment semester',
   periodCountTips:'The number of school systems is allocated based on school purchases, and schools can only edit school system names, not add or delete school system.',
+  cgCountTips:'學院數量根據學校購買進行分配,學校只能進行編輯學院名稱,不能新增和刪除學院。',
 
   // ClassroomSetting.vue
   classroomList: 'Classroom List',

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/survey.js

@@ -104,6 +104,6 @@ export default {
 	noMatchData:'No matching data',
 	getFileFailTip:'Failed to read data',
 	backToRecord:'Back to Activity Record',
-	noFoundAc:'Specified ID activity not found, please select again!'
+	noFoundAc:'Activity not found, please select again!'
 	
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -115,6 +115,7 @@ export default {
   delTimeContent: '是否确认删除当前时段?',
   setStartTitps:'设置为入学期',
   periodCountTips:'学段数量根据学校购买进行分配,学校只能进行编辑学段名称,不能新增和删除学段。',
+  cgCountTips:'学院数量根据学校购买进行分配,学校只能进行编辑学院名称,不能新增和删除学院。',
 
   // ClassroomSetting.vue
   classroomList: '教室列表',

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

@@ -104,6 +104,6 @@ export default {
 	noMatchData:'未匹配数据',
 	getFileFailTip:'数据读取失败',
 	backToRecord:'返回活动记录',
-	noFoundAc:'未查找到指定ID活动,请重新选择!'
+	noFoundAc:'该活动已被删除或丢失,请返回重新选择!'
 	
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js

@@ -115,6 +115,7 @@ export default {
   delTimeContent:'是否確認刪除當前時段? ',
   setStartTitps:'設置為入學期',
   periodCountTips:'學段數量根據學校購買進行分配,學校只能進行編輯學段名稱,不能新增和刪除學段。',
+  cgCountTips:'學院數量根據學校購買進行分配,學校只能進行編輯學院名稱,不能新增和刪除學院。',
 
   // ClassroomSetting.vue
   classroomList: '教室清單',

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/survey.js

@@ -104,5 +104,5 @@ export default {
 	noMatchData:'未配對到數據',
 	getFileFailTip:'資料讀取失敗',
 	backToRecord:'返回活動記錄',
-	noFoundAc:'未找到指定ID的活動,請重新選擇!'
+	noFoundAc:'該活動已被刪除或丟失,請返回重新選擇!'
 }

+ 41 - 2
TEAMModelOS/ClientApp/src/utils/directive.js

@@ -8,7 +8,7 @@ const trigger = (el, type) => {
     el.dispatchEvent(e)
 }
 
-
+//普通特殊字符过滤
 const specialChar = {
     bind: function (el, binding, vnode) {
         // 正则规则可根据需求自定义
@@ -44,4 +44,43 @@ const specialChar = {
     },
 }
 
-export default specialChar
+//文件名特殊字符过滤
+const fileName = {
+    bind: function (el, binding, vnode) {
+        // 正则规则可根据需求自定义
+        // var regRule = /[`~!@#$%^&*()\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g
+        let regRule = /[`~?$^&*\|\/\\:"<>]/g
+        let isChinese = false
+        let $inp = findEle(el, 'input')
+        el.$inp = $inp
+        if ($inp) {
+            $inp.handle = function () {
+                if (!isChinese) {
+                    let val = $inp.value
+                    $inp.value = val.replace(regRule, '')
+                    trigger($inp, 'input')
+                }
+            }
+            $inp.chineseStart = function () {
+                isChinese = true
+            }
+            $inp.chineseEnd = function () {
+                isChinese = false
+            }
+            $inp.addEventListener('keyup', $inp.handle)
+            $inp.addEventListener('compositionstart', $inp.chineseStart)
+            $inp.addEventListener('compositionend', $inp.chineseEnd)
+        }
+    },
+    unbind: function (el) {
+        el.$inp && el.$inp.removeEventListener('keyup', el.$inp.handle)
+        el.$inp && el.$inp.removeEventListener('compositionend', el.$inp.chineseStart)
+        el.$inp && el.$inp.removeEventListener('compositionstart', el.$inp.chineseStart)
+        // el.$inp && el.$inp.removeEventListener('keydown', el.$inp.handle)
+    },
+}
+
+
+export {
+    specialChar, fileName
+}

+ 6 - 5
TEAMModelOS/ClientApp/src/view/ability/Review.vue

@@ -39,8 +39,8 @@
                 </div>
               </div>
             </div>
-            <p class="appraise-title" v-if="mode !== 'edit'"><span style="font-size: 16px;font-weight: bold;">{{ mode === 'self' ? $t('ability.review.tip1') : $t('ability.review.tip2')}}</span> {{ $t('ability.review.tip3') }}</p>
-            <div class="unit-item-appraise" v-if="mode !== 'edit'">
+            <p class="appraise-title"><span style="font-size: 16px;font-weight: bold;">{{ mode === 'self' ? $t('ability.review.tip1') : $t('ability.review.tip2')}}</span> {{ $t('ability.review.tip3') }}</p>
+            <div class="unit-item-appraise">
               <!-- 优秀 -->
               <div class="appraise-block" v-if="task.titles.length">
                 <p class="title">
@@ -73,7 +73,7 @@
                 </RadioGroup>
               </div>
             </div>
-            <div class="appraise-result" v-if="mode !== 'edit'">
+            <div class="appraise-result">
               <span>{{ isSelfMode ? '自评结果' : $t('ability.result') }}:</span>
               <span class="good" v-if="appraiseResultArr[index] === 'good'">
                 <Icon type="md-happy" size="22" />{{ $t('ability.good') }}
@@ -217,7 +217,7 @@ export default {
       if (this.finalUpload.some(i => i.urls.length === 0)) {
         this.$Message.warning(this.$t('ability.review.tip4'))
         this.isBtnLoading = false
-      } else if (this.mode === 'self' && this.finalResult === 0) {
+      } else if (this.isSelfMode && this.finalResult === 0) {
         this.$Message.warning(this.$t('ability.review.tip5'))
         this.isBtnLoading = false
       } else {
@@ -446,7 +446,8 @@ export default {
       console.log(abilityDetail)
 	  // 如果是编辑状态 则需要把自评的结果回显
       this.appraiseResultArr = this.mode === 'edit' ? this.reviewData.uploads.map(i => ['bad','normal','good'][i.score]) : abilityDetail.stds.map(i => 'bad')
-	  this.finalResult = this.mode === 'edit' ? this.reviewData.self : 0
+	  // this.finalResult = this.mode === 'edit' ? this.reviewData.self : 0
+	  this.finalResult = 0
       this.appraiseList = abilityDetail.stds.map(i => [])
       this.isAllNormalArr = abilityDetail.stds.map(i => false)
       this.stdFileArr = abilityDetail.stds.map(i => [])

+ 10 - 0
TEAMModelOS/ClientApp/src/view/classrecord/ClassRecord.vue

@@ -277,6 +277,16 @@ export default {
                     console.log(this.pushData)
                     let r = this.sokratesRecords.find(item => item.Event === 'PgidList')
                     let pgids = r ? r.PgIdList : []
+
+                    //这里需要判断录制开始的pageid
+                    let startInfo = this.sokratesRecords.find(item => item.Event === 'EzsStartRecord')
+                    let startId = startInfo ? startInfo.Pgid : ''
+                    let startIndex = 0
+                    if (startId) {
+                        startIndex = pgids.findIndex(item => item === startId)
+                    }
+                    pgids = pgids.slice(startIndex)
+
                     pgids.forEach((item, index) => {
                         let page = {}
                         page.id = item

+ 1 - 1
TEAMModelOS/ClientApp/src/view/classrecord/eventchart/PopQues.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="pop-ques-wrap">
         <TeacherClient></TeacherClient>
-        <p class="event-type">{{evtType == 'PopQuesLoad' ? '即问即答' : '二次作答'}}</p>
+        <p class="event-type">{{evtType == 'PopQuesLoad' ? $t('studentWeb.hiteachNote.qA') : $t('studentWeb.hiteachNote.qaAgain')}}</p>
         <OptionCount :optionCount="optionData" :answer="answer"></OptionCount>
         <CorrectRate :correctData="correctData"></CorrectRate>
     </div>

+ 3 - 1
TEAMModelOS/ClientApp/src/view/evaluation/bank/PaperDownload.vue

@@ -383,7 +383,9 @@
 							that.isDownloading = false
 							that.printMode = 'A4'
 						}
-
+					}).catch(e => {
+						this.$Message.warning('试卷数据异常,无法生成!')
+						this.isDownloading = false
 					})
 			},
 			/* 对试卷题目进行题型分组 */

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

@@ -851,6 +851,7 @@
 								await this.saveImportPoints([...new Set(this.importKnowledges)], paperItem)
 							}
 						}
+						this.$Spin.hide()
 						this.$Message.success(this.$t('evaluation.paperList.saveSuc'))
 						this.isLoading = false
 						this.$router.push({

+ 1 - 1
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -358,7 +358,7 @@
                         </RadioGroup>
                     </FormItem>
                     <FormItem :label="$t('cusMgt.name')" v-if="type == 'create'">
-                        <Input v-special-char v-model="listName" :placeholder="$t('cusMgt.nameHolder')" style="width: 300px" />
+                        <Input v-file-name v-model="listName" :placeholder="$t('cusMgt.nameHolder')" style="width: 300px" />
                     </FormItem>
                     <FormItem :label="$t('cusMgt.listLabel')" v-else>
                         <Select v-model="listId" style="width:300px">

+ 2 - 0
TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.less

@@ -171,6 +171,7 @@
 }
 .period-wrap {
     height: 100%;
+    background: white;
     // padding-left: 15px;
 }
 
@@ -307,6 +308,7 @@
         overflow: hidden;
         display: inline-block;
         border: 1px solid var(--border-color);
+        background: white;
         &:hover{
             box-shadow: 0 0px 8px 1px var(--card-shadow);
         }

+ 7 - 5
TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.vue

@@ -58,18 +58,20 @@
             </div>
 
         </div>
-        <!-- 学段管理 -->
+        <!-- 学段/学院管理 -->
         <div class="sm-system-body custom-iview-split disabled-iview-select text-cursor-disabled" v-show="tab == 'period'">
             <Split v-model="split1">
                 <!--学段列表-->
                 <div slot="left" class="period-wrap">
                     <div class="col-title">
-                        <span>{{$t('schoolBaseInfo.periodSettingLabel')}}</span>
+                        <span>
+                            {{schoolSetting.type == 1 ? $t('schoolBaseInfo.periodSettingLabel') : $t('schoolBaseInfo.cgMgt')}}
+                        </span>
                         <Tooltip :max-width="180" transfer>
                             <p slot="content">
-                                {{$t('schoolBaseInfo.periodCountTips')}}
+                                {{schoolSetting.type == 1 ? $t('schoolBaseInfo.periodCountTips') : $t('schoolBaseInfo.cgCountTips')}}
                             </p>
-                            <Icon type="md-information-circle" style="margin-left:5px" />
+                            <Icon type="md-information-circle" style="margin-left:0px" />
                         </Tooltip>
 
                         <div class="action-btx-box">
@@ -168,7 +170,7 @@
                                     <p class="block-title bf-color3">
                                         {{$t('schoolBaseInfo.gradeSetting')}}
                                         <Tooltip :content="$t('schoolBaseInfo.gradeTips')" max-width="200">
-                                            <Icon type="ios-information-circle-outline" color="#1cc0f3" size="16" style="margin-right:5px;cursor:pointer;"/>
+                                            <Icon type="ios-information-circle-outline" color="#1cc0f3" size="16" style="margin-right:5px;cursor:pointer;" />
                                         </Tooltip>
                                         <span class="block-action-box">
                                             <Icon type="md-add" @click.stop="addGrade" class="action-btn-icon" v-if="$access.ability('admin','schoolSetting-upd').validateAll" />

+ 1 - 1
TEAMModelOS/ClientApp/src/view/student-account/class/ClassMgt.vue

@@ -91,7 +91,7 @@
                             <Form v-if="classListShow[curClassIndex]" ref="edClassInfo" :model="classListShow[curClassIndex]" :rules="classValidate" style="padding-top:20px;">
                                 <FormItem prop="name" @click.native.stop class="requird-color">
                                     <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.className')}}</span>
-                                    <Input v-special-char @on-change="watchUpdate" :disabled="editStatus" v-model="classListShow[curClassIndex].name" clearable :placeholder="$t('schoolBaseInfo.classroomNameHolder')" />
+                                    <Input v-file-name @on-change="watchUpdate" :disabled="editStatus" v-model="classListShow[curClassIndex].name" clearable :placeholder="$t('schoolBaseInfo.classroomNameHolder')" />
                                 </FormItem>
 
                                 <FormItem prop="year" @click.native.stop class="requird-color">

+ 1 - 1
TEAMModelOS/ClientApp/src/view/student-account/stulist/MgtStuList.vue

@@ -92,7 +92,7 @@
                     </Select>
                 </FormItem>
                 <FormItem :label="$t('cusMgt.name')" prop="listName">
-                    <Input v-special-char v-model="listInfo.listName" :placeholder="$t('cusMgt.nameHolder')"></Input>
+                    <Input v-file-name v-model="listInfo.listName" :placeholder="$t('cusMgt.nameHolder')"></Input>
                 </FormItem>
             </Form>
         </Modal>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.vue

@@ -118,7 +118,7 @@
 </style>
 <template>
     <div class="userList">
-        <Loading v-if="isloading == true"></Loading>
+        <Loading v-if="isloading"></Loading>
         <!-- 使用者列表 -->
         <div class="userLists" :class="{ isSetting: authMulti || isOpenSpaceAuth == true }">
             <div class="serch-box">

+ 1 - 1
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -1441,7 +1441,7 @@ namespace TEAMModelOS.Controllers.Analysis
                 var client = _azureCosmos.GetCosmosClient();
                 ExamInfo info = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{code}"));
                 List<ExamResult> examResults = new List<ExamResult>();
-                var query = $"select c.id,c.name,c.subjectId,c.studentScores,c.studentIds,c.paper,c.classes from c where c.examId =  '{id}' ";
+                var query = $"select c.id,c.name,c.subjectId,c.studentScores,c.studentIds,c.paper,c.classes,c.afp,c.akp from c where c.examId =  '{id}' ";
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamResult>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamResult-{id}") }))
                 {
                     examResults.Add(item);

+ 4 - 3
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -1731,12 +1731,13 @@ namespace TEAMModelOS.Controllers
                 {
                     double score = 0;
                     double allScore = 0;
-                    int n = 0;
+
                     int count = 0;
                     foreach (ExamClassResult result in answers)
                     {
                         if (result.subjectId.Equals(sub))
                         {
+                            int n = 0;
                             foreach (List<string> str in kones)
                             {
                                 if (str.Contains(k))
@@ -1770,13 +1771,13 @@ namespace TEAMModelOS.Controllers
                 {
                     //初始化认知层次得分
                     double score = 0;
-                    double allScore = 0;
-                    int n = 0;
+                    double allScore = 0;                  
                     int count = 0;
                     foreach (ExamClassResult result in answers)
                     {
                         if (result.subjectId.Equals(sub))
                         {
+                            int n = 0;
                             foreach (int str in fs)
                             {
                                 if (str == k)