Browse Source

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

CrazyIter_Bin 2 năm trước cách đây
mục cha
commit
a68a84ee4c

+ 2 - 0
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -568,6 +568,7 @@ const LANG_EN_US = {
         authType: 'Authorization Method:',
         authType1: 'New Contracts',
         authType2: 'Renewal',
+        authType3: '变更',
         authNumber: 'Purchase No.:',
         text1: 'Device Name:',
         text2: 'Device:',
@@ -3023,6 +3024,7 @@ const LANG_EN_US = {
         edit: 'Edit Record',
         editTitle: 'Edit Lesson',
         addTitle: 'Add Lesson',
+        today: 'Today',
         week: 'Week',
         month: 'Month',
         semester: 'Semester',

+ 5 - 3
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -568,6 +568,7 @@ const LANG_ZH_CN = {
         authType: '授权方式:',
         authType1: '新约',
         authType2: '续约',
+        authType3: '变更',
         authNumber: '购买数量:',
         text1: '设备名称:',
         text2: '硬件:',
@@ -3016,13 +3017,14 @@ const LANG_ZH_CN = {
         setting: '课堂记录设置',
         all: '不限',
         cate: '类别',
-        range: '范围',
+        range: '时间',
         rangeTip: '选择起止时间',
         more: '更多',
         close: '收起',
         edit: '编辑记录',
         editTitle: '编辑课例',
         addTitle: '新增课例',
+        today: '今日',
         week: '本周',
         month: '本月',
         semester: '本学期',
@@ -3048,7 +3050,7 @@ const LANG_ZH_CN = {
         lessonName: '课堂名称',
         lessonNamePlace: '请输入课例名称...',
         grade: '年级',
-        subject: '科',
+        subject: '科',
         search: '查询',
         reset: '重置',
         resultTip1: '共查询到',
@@ -3071,7 +3073,7 @@ const LANG_ZH_CN = {
         score: '总互动分',
         interactionCount: '互动题数',
         clientInteractionCount: '互动教学',
-        examQuizCount: '精准教学',
+        examQuizCount: '测验教学',
         examPointRate: '测验得分率',
         action: '操作',
         allTable: '课例数据汇总表',

+ 19 - 17
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -568,6 +568,7 @@ const LANG_ZH_TW = {
         authType: '授權方式:',
         authType1: '新約',
         authType2: '續約',
+        authType3: '变更',
         authNumber: '購買數量:',
         text1: '設備名稱:',
         text2: '設備:',
@@ -3025,6 +3026,7 @@ const LANG_ZH_TW = {
         edit: '編輯記錄',
         editTitle: '編輯記錄',
         addTitle: '新增記錄',
+        today: '今日',
         week: '本週',
         month: '本月',
         semester: '本學期',
@@ -3568,23 +3570,23 @@ const LANG_ZH_TW = {
         addSubjectType2: '選擇已有學科',
         addSubjectType3: '已有學科',
         addSubjectType4: '請選擇需要新增的學科',
-        pdtyp1:'學前',
-        pdtyp2:'小學',
-        pdtyp3:'國中',
-        pdtyp4:'高中',
-        pdtyp5:'高職',
-        pdtyp6:'專科',
-        pdtyp7:'大學',
-        pdtyp8:'特殊教育',
-        pdtyp9:'教育局',
-        pdtyp10:'資教部門',
-        pdtyp11:'社區專科',
-        pdtyp12:'社區大學',
-        pdtyp13:'碩士研究生',
-        pdtyp14:'博士研究生',
-        pdtyp15:'企業',
-        pdtyp16:'設置學段類型',
-        pdtyp17:'學段類型',
+        pdtyp1: '學前',
+        pdtyp2: '小學',
+        pdtyp3: '國中',
+        pdtyp4: '高中',
+        pdtyp5: '高職',
+        pdtyp6: '專科',
+        pdtyp7: '大學',
+        pdtyp8: '特殊教育',
+        pdtyp9: '教育局',
+        pdtyp10: '資教部門',
+        pdtyp11: '社區專科',
+        pdtyp12: '社區大學',
+        pdtyp13: '碩士研究生',
+        pdtyp14: '博士研究生',
+        pdtyp15: '企業',
+        pdtyp16: '設置學段類型',
+        pdtyp17: '學段類型',
 
         // ClassroomSetting.vue
         classroomList: '教室清單',

+ 25 - 22
TEAMModelOS/ClientApp/src/api/lessonRecord.js

@@ -1,51 +1,54 @@
 import { post } from '@/api/http'
 export default {
-	/* 获取课例统计数量 */
+    /* 获取课例统计数量 */
     getLessonCount: function (data) {
         return post('/common/lesson-record/get-lesson-record-count', data)
     },
     // 查询课堂记录列表
-	getLessonList: function (data) {
+    getLessonList: function (data) {
         return post('/common/lesson-record/get-lesson-record', data)
     },
     // 查询课堂记录列表(不分个人还是校本课程)
-	getLessonListAll: function (data) {
+    getLessonListAll: function (data) {
         return post('/common/lesson-record/get-lesson-record-schorpvt', data)
     },
-	getDashboardData: function (data) {
+    getStaticData: function (data) {
+        return post('/class/analysis/analysis-record-count', data)
+    },
+    getDashboardData: function (data) {
         return post('/class/analysis/analysis-recod', data)
     },
-	getAnalysisCount: function (data) {
+    getAnalysisCount: function (data) {
         return post('/class/analysis/settle-recod', data)
     },
     getTeacherRecordData: function (data) {
         return post('/class/analysis/analysis-recod-teacher', data)
     },
-	// 课堂记录tag维护接口
-	optSetting: function (data) {
+    // 课堂记录tag维护接口
+    optSetting: function (data) {
         return post('/school/setting/opt-setting', data)
     },
     //删除课堂记录
     delRcd: function (data) {
         return post('/common/lesson-record/delete-lesson-record', data)
-    }, 
-	// 查询学校设置的课例类别
-	findLessonSettings: function (data) {
+    },
+    // 查询学校设置的课例类别
+    findLessonSettings: function (data) {
         return post('/school/setting/find-id', data)
-    }, 
-	// 设置学校的课例类别
-	setLessonTags: function (data) {
+    },
+    // 设置学校的课例类别
+    setLessonTags: function (data) {
         return post('/school/setting/opt-setting', data)
-    }, 
-	/* 更新课例 */
-	updateLesson: function (data) {
+    },
+    /* 更新课例 */
+    updateLesson: function (data) {
         return post('/common/lesson-record/update-lesson-baseinfo', data)
-    }, 
-	/* 获取推荐课例 */
-	getIntroLessons: function (data) {
-	    return post('/common/lesson-record/get-other-lesson-record', data)
-	}, 
-	// 根据id 查询课堂记录
+    },
+    /* 获取推荐课例 */
+    getIntroLessons: function (data) {
+        return post('/common/lesson-record/get-other-lesson-record', data)
+    },
+    // 根据id 查询课堂记录
     getLessonInfo: function (data) {
         return post("/common/lesson-record/get-lesson-record-id", data)
     },

+ 18 - 4
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -263,6 +263,9 @@ export default {
     IES5Menu() {
       return !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain()
     },
+    hasDashAuth() {
+      return window.location.host.includes('test.teammodel') || ['habook', 'ydzt', 'cdydzt', 'hbcn'].includes(this.$store.state.userInfo.schoolCode)
+    },
     jinniuMenu() {
       return this.$jsFn.checkJinNiu()
     },
@@ -274,14 +277,25 @@ export default {
         //数据看板
         {
           icon: 'iconfont icon-data-count',
-          name: this.$t('system.menu.researchBoard'),
-          router: '/home/Dashboard',
+          name: '学生看板',
+          router: '/fiveEdu',
           tag: '',
           role: 'admin',
           permission: 'dashboard-read',
-          menuName: 'Dashboard',
+          menuName: 'StuDashboard',
           child: [],
-          isShow: this.IES5Menu
+          isShow: this.IES5Menu && this.hasDashAuth
+        },
+        {
+          icon: 'iconfont icon-data-count',
+          name: '教学看板',
+          router: '/researchDashboard',
+          tag: '',
+          role: 'admin',
+          permission: 'dashboard-read',
+          menuName: 'TeacherDashboard',
+          child: [],
+          isShow: this.IES5Menu && this.hasDashAuth
         },
         // 学校管理
         {

+ 1 - 1
TEAMModelOS/ClientApp/src/components/research-dashboard/BaseTechBar.vue

@@ -13,7 +13,7 @@ export default {
       let myChart = this.$echarts.init(document.getElementById('baseTechBar'))
       var echartsData = {
         title: 'title',
-        city: ['互动教学', '合作学习', '差异教学', '精准教学'],
+        city: ['互动教学', '合作学习', '差异教学', '测验教学'],
         legend: data.legend,
         data: data.data,
         total: data.total,

+ 14 - 24
TEAMModelOS/ClientApp/src/components/research-dashboard/LeftTop.vue

@@ -6,8 +6,8 @@
 		</p> -->
     <div class="up">
       <div class="bg-color-black item" v-for="item in titleItem" :key="item.title">
-        <p class="ml-3 colorBlue fw-b fs-xl">{{ item.title }}</p>
         <countTo :startVal='0' :endVal='item.number' :duration='2000' class="count-num"></countTo>
+        <p class="ml-3 colorBlue fw-b fs-xl">{{ item.title }}</p>
       </div>
     </div>
   </div>
@@ -45,25 +45,17 @@ export default {
           number: 0
         },
         {
-          title: vm.$t('lessonRecord.echarts.count6'),
+          title: `年级数`,
+          number: 0
+        },
+        {
+          title: `学科数`,
           number: 0
         },
-        // {
-        // 	title: vm.$t('lessonRecord.echarts.count7'),
-        // 	number: 0
-        // },
-        // {
-        // 	title: vm.$t('lessonRecord.echarts.count8'),
-        // 	number: 0
-        // },
-        // {
-        // 	title: vm.$t('lessonRecord.echarts.count9'),
-        // 	number: 0
-        // },
-        // {
-        // 	title: vm.$t('lessonRecord.echarts.count10'),
-        // 	number: 0
-        // }
+        {
+          title: `教研组数`,
+          number: 0
+        }
       ],
     }
   },
@@ -77,11 +69,9 @@ export default {
       totalJson.forEach(i => {
         this.titleItem.find(j => j.key === i.name).number = i.value
       })
-      this.titleItem[5].number = allJson.teachCount
-      // this.titleItem[6].number = allJson.taskCount
-      // this.titleItem[7].number = allJson.workCount
-      // this.titleItem[8].number = allJson.examQuizCount
-      // this.titleItem[9].number = allJson.interactCount
+      this.titleItem[5].number = allJson.classify_grade.length
+      this.titleItem[6].number = allJson.classify_sub.length
+      this.titleItem[7].number = allJson.classify_group.length
     }
   }
 }
@@ -102,7 +92,7 @@ export default {
     flex-wrap: wrap;
 
     .item {
-      width: 14.8%;
+      width: 23.2%;
       border-radius: 6px;
       padding: 8px;
       margin: 0.3% 0.9% 1.3% 0.9%;

+ 2 - 2
TEAMModelOS/ClientApp/src/router/routes.js

@@ -1091,7 +1091,7 @@ export const routes = [{
         path: '/researchDashboard',
         component: () => import('@/view/dashboard/Research.vue'),
         meta: {
-            activeName: 'Dashboard',
+            activeName: 'TeacherDashboard',
             middleware: ['login', 'ability:admin,dashboard-read'],
         }
     },
@@ -1128,7 +1128,7 @@ export const routes = [{
         // component: () => import('@/view/dashboard/StudentAll.vue'),
         component: () => import('@/view/dashboard/fiveEdu/FiveEdu.vue'),
         meta: {
-            activeName: 'Dashboard',
+            activeName: 'StuDashboard',
             middleware: ['login', 'ability:admin,dashboard-read'],
         }
     },

+ 286 - 286
TEAMModelOS/ClientApp/src/view/auth/ProdRecord.vue

@@ -1,325 +1,325 @@
 <template>
-    <div class="prod-record-container">
-        <vuescroll>
-            <div class="prod-record-box">
-                <h1 class="record-title">
-                    {{$t('auth.recordTitle')}}
-                </h1>
-                <p class="back-page" @click="backPage">
-                    <Icon type="md-arrow-round-back" style="margin-right:5px" />
-                    {{$t('auth.backPage')}}
-                </p>
-                <Timeline style="margin-top:30px">
-                    <TimelineItem v-for="order in orderList" :key="order.id">
-                        <p class="order-time">
-                            {{$jsFn.dateFormat(order.date)}}
-                        </p>
-                        <div class="content">
-                            <!-- 序列号 -->
-                            <p v-if="order.serial && order.serial.length" class="order-type-title">
-                                {{$t('auth.text4')}}</p>
-                            <template v-if="order.serial && order.serial.length">
-                                <div v-for="(serial) in order.serial" :key="serial.prodCode" class="serial-wrap-item">
-                                    <div class="serial-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.serialLabel')}}
-                                        </p>
-                                        <ul style="margin-left:15px;font-weight: 900;color: black;">
-                                            <li v-for="sCode in serial.sn" :key="sCode">
-                                                {{sCode}}
-                                            </li>
-                                        </ul>
-                                    </div>
-                                    <div class="serial-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.authDate')}}
-                                        </p>
-                                        <p>
-                                            <span v-if="serial.sdate">
-                                                {{$jsFn.dateFormat(serial.sdate)}}-
-                                            </span>
-                                            {{$jsFn.dateFormat(serial.edate)}}
-                                        </p>
-                                    </div>
-                                    <div class="serial-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.fuAuth')}}</p>
-                                        <div>
-                                            <template v-for="(aitem) in serialAuthList">
-                                                <Tag :key="aitem.code" class="serial-auth-tag" v-show="serial.authKey.includes(aitem.code)" :color="aitem.color">
-                                                    <span class="serial-auth-name">
-                                                        {{aitem.name}}
-                                                    </span>
-                                                    <span v-show="aitem.type == 'number'" class="serial-auth-number">
-                                                        {{aitem.type == 'number' && serial.aprule ? serial.aprule[aitem.code] : ''}}
-                                                    </span>
-                                                </Tag>
-                                            </template>
-                                        </div>
-                                    </div>
-                                    <div class="serial-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.IRSnumber')}}</p>
-                                        <p>
-                                            {{serial.cqty}}
-                                        </p>
-                                    </div>
-                                    <div class="serial-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.bandDeviceNO')}}</p>
-                                        <p>
-                                            {{serial.device}}
-                                        </p>
-                                    </div>
-                                </div>
-                            </template>
-                            <!-- 服务类授权 -->
-                            <p v-if="order.service && order.service.length" class="order-type-title">
-                                {{$t('auth.text3')}}</p>
-                            <template v-if="order.service && order.service.length">
-                                <div v-for="service in order.service" :key="service.prodCode + service.sdate" class="serial-wrap-item">
-                                    <div class="service-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.svcName')}}
-                                        </p>
-                                        <p style="font-weight: 900;color: black;">
-                                            {{getProductName(service.prodCode)}}
-                                        </p>
-                                    </div>
-                                    <div class="service-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.authType')}}
-                                        </p>
-                                        <p>
-                                            {{service.type == 'N' ? $t('auth.authType1') : $t('auth.authType2')}}
-                                        </p>
-                                    </div>
-                                    <div class="service-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.authDate')}}
-                                        </p>
-                                        <p>
-                                            {{$jsFn.dateFormat(service.sdate)}}
-                                            -
-                                            {{$jsFn.dateFormat(service.edate)}}
-                                        </p>
-                                    </div>
-                                    <div class="service-info-item" v-show="service.number">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.authNumber')}}
-                                        </p>
-                                        <p>
-                                            {{ service.number }}
-                                            <span v-if="service.unit">
-                                                ({{service.unit}})
-                                            </span>
-                                        </p>
-                                    </div>
-                                </div>
-                            </template>
-                            <!-- 硬件类 -->
-                            <p v-if="order.hard && order.hard.length" class="order-type-title">
-                                {{$t('auth.text2')}}
-                            </p>
-                            <template v-if="order.hard && order.hard.length">
-                                <div v-for="(hard,index) in order.hard" :key="hard.prodCode + index" class="serial-wrap-item">
-                                    <div class="service-info-item">
-                                        <p class="serial-attr-label">
-                                            {{$t('auth.text1')}}
-                                        </p>
-                                        <p>
-                                            {{getProductName(hard.prodCode)}}
-                                        </p>
-                                    </div>
-                                </div>
-                            </template>
-                        </div>
-                    </TimelineItem>
-                </Timeline>
-                <EmptyData v-show="!orderList.length" :textContent="$t('auth.noRecord')" :top="200"></EmptyData>
+  <div class="prod-record-container">
+    <vuescroll>
+      <div class="prod-record-box">
+        <h1 class="record-title">
+          {{$t('auth.recordTitle')}}
+        </h1>
+        <p class="back-page" @click="backPage">
+          <Icon type="md-arrow-round-back" style="margin-right:5px" />
+          {{$t('auth.backPage')}}
+        </p>
+        <Timeline style="margin-top:30px">
+          <TimelineItem v-for="order in orderList" :key="order.id">
+            <p class="order-time">
+              {{$jsFn.dateFormat(order.date)}}
+            </p>
+            <div class="content">
+              <!-- 序列号 -->
+              <p v-if="order.serial && order.serial.length" class="order-type-title">
+                {{$t('auth.text4')}}</p>
+              <template v-if="order.serial && order.serial.length">
+                <div v-for="(serial) in order.serial" :key="serial.prodCode" class="serial-wrap-item">
+                  <div class="serial-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.serialLabel')}}
+                    </p>
+                    <ul style="margin-left:15px;font-weight: 900;color: black;">
+                      <li v-for="sCode in serial.sn" :key="sCode">
+                        {{sCode}}
+                      </li>
+                    </ul>
+                  </div>
+                  <div class="serial-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.authDate')}}
+                    </p>
+                    <p>
+                      <span v-if="serial.sdate">
+                        {{$jsFn.dateFormat(serial.sdate)}}-
+                      </span>
+                      {{$jsFn.dateFormat(serial.edate)}}
+                    </p>
+                  </div>
+                  <div class="serial-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.fuAuth')}}</p>
+                    <div>
+                      <template v-for="(aitem) in serialAuthList">
+                        <Tag :key="aitem.code" class="serial-auth-tag" v-show="serial.authKey.includes(aitem.code)" :color="aitem.color">
+                          <span class="serial-auth-name">
+                            {{aitem.name}}
+                          </span>
+                          <span v-show="aitem.type == 'number'" class="serial-auth-number">
+                            {{aitem.type == 'number' && serial.aprule ? serial.aprule[aitem.code] : ''}}
+                          </span>
+                        </Tag>
+                      </template>
+                    </div>
+                  </div>
+                  <div class="serial-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.IRSnumber')}}</p>
+                    <p>
+                      {{serial.cqty}}
+                    </p>
+                  </div>
+                  <div class="serial-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.bandDeviceNO')}}</p>
+                    <p>
+                      {{serial.device}}
+                    </p>
+                  </div>
+                </div>
+              </template>
+              <!-- 服务类授权 -->
+              <p v-if="order.service && order.service.length" class="order-type-title">
+                {{$t('auth.text3')}}</p>
+              <template v-if="order.service && order.service.length">
+                <div v-for="service in order.service" :key="service.prodCode + service.sdate" class="serial-wrap-item">
+                  <div class="service-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.svcName')}}
+                    </p>
+                    <p style="font-weight: 900;color: black;">
+                      {{getProductName(service.prodCode)}}
+                    </p>
+                  </div>
+                  <div class="service-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.authType')}}
+                    </p>
+                    <p>
+                      {{service.type == 'N' ? $t('auth.authType1') : service.type == 'G' ? '变更' : service.type == 'C' ? $t('auth.authType2') : ''}}
+                    </p>
+                  </div>
+                  <div class="service-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.authDate')}}
+                    </p>
+                    <p>
+                      {{$jsFn.dateFormat(service.sdate)}}
+                      -
+                      {{$jsFn.dateFormat(service.edate)}}
+                    </p>
+                  </div>
+                  <div class="service-info-item" v-show="service.number">
+                    <p class="serial-attr-label">
+                      {{$t('auth.authNumber')}}
+                    </p>
+                    <p>
+                      {{ service.number }}
+                      <span v-if="service.unit">
+                        ({{service.unit}})
+                      </span>
+                    </p>
+                  </div>
+                </div>
+              </template>
+              <!-- 硬件类 -->
+              <p v-if="order.hard && order.hard.length" class="order-type-title">
+                {{$t('auth.text2')}}
+              </p>
+              <template v-if="order.hard && order.hard.length">
+                <div v-for="(hard,index) in order.hard" :key="hard.prodCode + index" class="serial-wrap-item">
+                  <div class="service-info-item">
+                    <p class="serial-attr-label">
+                      {{$t('auth.text1')}}
+                    </p>
+                    <p>
+                      {{getProductName(hard.prodCode)}}
+                    </p>
+                  </div>
+                </div>
+              </template>
             </div>
-        </vuescroll>
-    </div>
+          </TimelineItem>
+        </Timeline>
+        <EmptyData v-show="!orderList.length" :textContent="$t('auth.noRecord')" :top="200"></EmptyData>
+      </div>
+    </vuescroll>
+  </div>
 </template>
 <script>
 export default {
-    props: {
-        order: {
-            type: Array,
-            default: () => {
-                return []
-            }
-        }
-    },
-    data() {
-        return {
-            serialAuthList: [
-                {
-                    code: 'sokapp',
-                    name: this.$t('auth.attr1'),
-                    type: 'tag',
-                    color: 'geekblue'
-                },
-                {
-                    code: 'sokvdo',
-                    name: this.$t('auth.attr2'),
-                    type: 'tag',
-                    color: 'orange'
-                },
-                {
-                    code: 'sokrpt',
-                    name: this.$t('auth.attr3'),
-                    type: 'tag',
-                    color: 'yellow'
-                },
-                {
-                    code: 'sokdesk',
-                    name: this.$t('auth.attr4'),
-                    type: 'tag',
-                    color: 'green'
-                },
-                {
-                    code: 'ezs',
-                    name: this.$t('auth.attr5'),
-                    type: 'tag',
-                    color: 'cyan'
-                },
-                {
-                    code: 'remotcls',
-                    name: this.$t('auth.attr6'),
-                    type: 'tag',
-                    color: 'blue'
-                },
-                {
-                    code: 'irs',
-                    name: this.$t('auth.attr7'),
-                    type: 'tag',
-                    color: 'purple'
-                },
-                {
-                    code: 'hdcam',
-                    name: this.$t('auth.attr8'),
-                    type: 'tag',
-                    color: 'red'
-                },
-                {
-                    code: 'wordanls',
-                    name: this.$t('auth.attr9'),
-                    type: 'tag',
-                    color: 'volcano'
-                },
-                {
-                    code: 'soknumber',
-                    name: this.$t('auth.attr10'),
-                    type: 'number',
-                    color: 'magenta'
-                },
-                {
-                    code: 'cligroup',
-                    name: this.$t('auth.attr11'),
-                    type: 'number',
-                    color: 'red'
-                }
-            ],
-            orderList: [],
-            productList: []
-        }
-    },
-
-    methods: {
-        backPage() {
-            this.$emit('on-back')
+  props: {
+    order: {
+      type: Array,
+      default: () => {
+        return []
+      }
+    }
+  },
+  data() {
+    return {
+      serialAuthList: [
+        {
+          code: 'sokapp',
+          name: this.$t('auth.attr1'),
+          type: 'tag',
+          color: 'geekblue'
+        },
+        {
+          code: 'sokvdo',
+          name: this.$t('auth.attr2'),
+          type: 'tag',
+          color: 'orange'
+        },
+        {
+          code: 'sokrpt',
+          name: this.$t('auth.attr3'),
+          type: 'tag',
+          color: 'yellow'
+        },
+        {
+          code: 'sokdesk',
+          name: this.$t('auth.attr4'),
+          type: 'tag',
+          color: 'green'
         },
-        formatList() {
-            this.orderList = this.order
-            this.orderList.forEach(order => {
-                order.serial?.forEach(s => {
-                    s.authKey = Object.keys(s.aprule || {})
-                })
-            })
-            this.orderList.sort((a, b) => {
-                return b.date - a.date
-            })
+        {
+          code: 'ezs',
+          name: this.$t('auth.attr5'),
+          type: 'tag',
+          color: 'cyan'
         },
-        getProductName(code) {
-            let p = this.productList.find(item => item.code == code)
-            return p && p.name ? p.name : ''
+        {
+          code: 'remotcls',
+          name: this.$t('auth.attr6'),
+          type: 'tag',
+          color: 'blue'
         },
+        {
+          code: 'irs',
+          name: this.$t('auth.attr7'),
+          type: 'tag',
+          color: 'purple'
+        },
+        {
+          code: 'hdcam',
+          name: this.$t('auth.attr8'),
+          type: 'tag',
+          color: 'red'
+        },
+        {
+          code: 'wordanls',
+          name: this.$t('auth.attr9'),
+          type: 'tag',
+          color: 'volcano'
+        },
+        {
+          code: 'soknumber',
+          name: this.$t('auth.attr10'),
+          type: 'number',
+          color: 'magenta'
+        },
+        {
+          code: 'cligroup',
+          name: this.$t('auth.attr11'),
+          type: 'number',
+          color: 'red'
+        }
+      ],
+      orderList: [],
+      productList: []
+    }
+  },
+
+  methods: {
+    backPage() {
+      this.$emit('on-back')
     },
-    created() {
-        this.productList = this.$GLOBAL.PROD_CODE()
+    formatList() {
+      this.orderList = this.order
+      this.orderList.forEach(order => {
+        order.serial?.forEach(s => {
+          s.authKey = Object.keys(s.aprule || {})
+        })
+      })
+      this.orderList.sort((a, b) => {
+        return b.date - a.date
+      })
     },
-    watch: {
-        order: {
-            deep: true,
-            immediate: true,
-            handler(n, o) {
-                if (n) this.formatList()
-            }
-        }
+    getProductName(code) {
+      let p = this.productList.find(item => item.code == code)
+      return p && p.name ? p.name : ''
+    },
+  },
+  created() {
+    this.productList = this.$GLOBAL.PROD_CODE()
+  },
+  watch: {
+    order: {
+      deep: true,
+      immediate: true,
+      handler(n, o) {
+        if (n) this.formatList()
+      }
     }
+  }
 }
 </script>
 <style scoped lang="less">
 .service-info-item {
-    margin-top: 10px;
-    display: flex;
+  margin-top: 10px;
+  display: flex;
 }
 .service-wrap-item {
-    margin-top: 15px;
-    padding: 10px;
+  margin-top: 15px;
+  padding: 10px;
 }
 .serial-wrap-item {
-    padding: 10px;
+  padding: 10px;
 }
 .serial-wrap-item:hover {
-    background: #f0f0f0;
+  background: #f0f0f0;
 }
 .order-time {
-    color: #17233d;
-    font-size: 16px;
-    font-weight: 800;
+  color: #17233d;
+  font-size: 16px;
+  font-weight: 800;
 }
 .serial-info-item {
-    margin-top: 10px;
-    display: flex;
+  margin-top: 10px;
+  display: flex;
 }
 .serial-attr-label {
-    color: #808695;
-    min-width: 120px;
+  color: #808695;
+  min-width: 120px;
 }
 .prod-record-container {
-    width: 100%;
-    height: 100%;
-    padding: 20px;
-    background: #f3f3f3;
+  width: 100%;
+  height: 100%;
+  padding: 20px;
+  background: #f3f3f3;
 }
 .prod-record-box {
-    border-radius: 5px;
-    background: white;
-    width: 1200px;
-    min-height: 700px;
-    margin: auto;
-    padding: 20px 30px;
-    box-shadow: -2px 0px 5px #e9e9e9;
+  border-radius: 5px;
+  background: white;
+  width: 1200px;
+  min-height: 700px;
+  margin: auto;
+  padding: 20px 30px;
+  box-shadow: -2px 0px 5px #e9e9e9;
 }
 .back-page {
-    color: #2db7f5;
-    cursor: pointer;
-    user-select: none;
-    margin-top: -30px;
-    font-size: 16px;
-    float: right;
+  color: #2db7f5;
+  cursor: pointer;
+  user-select: none;
+  margin-top: -30px;
+  font-size: 16px;
+  float: right;
 }
 .record-title {
-    text-align: center;
-    font-size: 20px;
+  text-align: center;
+  font-size: 20px;
 }
 .order-type-title {
-    font-size: 14px;
-    font-weight: 800;
-    color: #17233d;
-    margin-top: 20px;
-    padding-left: 10px;
+  font-size: 14px;
+  font-weight: 800;
+  color: #17233d;
+  margin-top: 20px;
+  padding-left: 10px;
 }
 </style>

+ 2 - 2
TEAMModelOS/ClientApp/src/view/dashboard/Research.less

@@ -192,12 +192,12 @@
 
         &-top {
           width: 100%;
-          height: 12%;
+          height: 22%;
         }
 
         &-bottom {
           width: 100%;
-          height: 83%;
+          height: 73%;
         }
       }
 

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/Research.vue

@@ -124,7 +124,7 @@ export default {
     },
     goBack() {
       this.$tools.exitFullscreen()
-      this.$router.push('/home/Dashboard')
+      this.$router.push('/home/homePage')
     },
     timeFn() {
       this.timing = setInterval(() => {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/Student.vue

@@ -245,7 +245,7 @@ export default {
   methods: {
     goQuit() {
       this.$tools.exitFullscreen()
-      this.$router.push('/home/Dashboard')
+      this.$router.push('/home/homePage')
     },
     goBack() {
       this.$parent.isAll = true

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/StudentAll.vue

@@ -346,7 +346,7 @@ export default {
     },
     goBack() {
       this.$tools.exitFullscreen()
-      this.$router.push('/home/Dashboard')
+      this.$router.push('/home/homePage')
     },
     timeFn() {
       this.timing = setInterval(() => {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/fiveEdu/FiveEdu.less

@@ -154,7 +154,7 @@
             width: 100%;
             display: flex;
             padding: 10px;
-            font-size: 18px;
+            font-size: 16px;
             font-weight: bold;
             align-items: center;
 

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/fiveEdu/FiveEdu.vue

@@ -401,7 +401,7 @@ export default {
     },
     goBack() {
       this.$tools.exitFullscreen()
-      this.$router.push('/home/Dashboard')
+      this.$router.push('/home/homePage')
     },
     timeFn() {
       this.timing = setInterval(() => {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/style.less

@@ -18,7 +18,7 @@
   padding: 0px 5px 0 5px;
   border-radius: 10px 10px 0 0;
   height: 50px;
-  font-size: 18px;
+  font-size: 16px;
   font-weight: 700;
 
   .ivu-icon {

+ 56 - 4
TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.less

@@ -3,13 +3,45 @@
 	// padding: 5px 25px;
 	background-color: #f6f7f7;
 
+	.static-box {
+		display: flex;
+		background-color: #ffffff;
+		align-items: center;
+		padding: 20px 25px;
+
+		.split-line {
+			width: 2px;
+			height: 30px;
+			margin: 0 20px;
+			background-color: rgb(238, 238, 238)
+		}
+
+		.static-item {
+			position: relative;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			padding: 0 20px;
+
+			&:first-child {
+				padding-left: 10px;
+			}
 
 
+			.static-value {
+				font-size: 26px;
+				font-weight: bold;
+				color: #00b4eb;
+			}
+		}
+	}
+
 	.filter-box {
+		position: relative;
 		padding: 5px 25px 10px 25px;
 		background-color: #ffffff;
 		border-bottom: 1px dashed #ccc;
-		position: relative;
 
 		.search-result {
 			position: absolute;
@@ -68,6 +100,7 @@
 
 		.advanced-wrap {
 			padding: 0 15px;
+
 			.clean-item {
 				margin: 15px 0;
 				display: flex;
@@ -81,14 +114,14 @@
 			}
 		}
 
-		
+
 
 		.ad-filter {
 			display: flex;
 			padding: 10px 0;
 
 			.ad-filter-item {
-				margin-right: 20px;
+				margin-right: 10px;
 
 				.filter-item-title {
 					margin-right: 10px;
@@ -111,7 +144,7 @@
 				}
 
 				/deep/ .ivu-icon-ios-close {
-					color:rgb(85, 85, 85) !important;
+					color: rgb(85, 85, 85) !important;
 				}
 			}
 		}
@@ -136,6 +169,25 @@
 	.table-box {
 		overflow: auto;
 
+		/deep/ .ivu-table-header thead tr th {
+			padding: 12px 0;
+			border-top: 1px solid rgb(235, 231, 231);
+		}
+
+		/deep/ .ivu-scroll-container {
+			.ivu-scroll-loader:first-child {
+				display: none;
+			}
+		}
+
+		.level-light {
+			display: inline-block;
+			width: 25px;
+			height: 25px;
+			border-radius: 50px;
+			margin: 10px 0;
+		}
+
 		.action-icon {
 			margin-right: 10px;
 			font-size: 18px;

+ 129 - 108
TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.vue

@@ -1,7 +1,43 @@
 <template>
   <div class="research-mgmt-container">
+    <div class="static-box">
+      <div class="static-item">
+        <span class="static-value">{{ analysisCount[0].value }}</span>
+        <span class="static-label">总课例数</span>
+      </div>
+      <div class="split-line"></div>
+      <div class="static-item">
+        <span class="static-value">{{ analysisCount[1].value }}</span>
+        <span class="static-label">今日课例</span>
+      </div>
+      <div class="split-line"></div>
+      <div class="static-item">
+        <span class="static-value">{{ analysisCount[2].value }}</span>
+        <span class="static-label">本周课例</span>
+      </div>
+      <div class="split-line"></div>
+      <div class="static-item">
+        <span class="static-value">{{ analysisCount[3].value }}</span>
+        <span class="static-label">本月课例</span>
+      </div>
+      <div class="split-line"></div>
+      <div class="static-item">
+        <span class="static-value">{{ analysisCount[4].value }}</span>
+        <span class="static-label">本学期课例</span>
+      </div>
+      <div class="split-line"></div>
+      <div class="static-item">
+        <span class="static-value">{{ curPeriod.subjects.length }}</span>
+        <span class="static-label">学科数</span>
+      </div>
+      <div class="split-line"></div>
+      <div class="static-item">
+        <span class="static-value">{{ curPeriod.grades.length }}</span>
+        <span class="static-label">年级数</span>
+      </div>
+    </div>
     <!-- 筛选区域 -->
-    <div class="filter-box">
+    <div class="filter-box" v-show="isShowFilter">
       <div class="filter-section">
         <span class="filter-title">{{ $t('lessonRecord.subject') }}</span>
         <div class="filter-items">
@@ -17,16 +53,15 @@
         </div>
       </div>
       <div class="filter-section">
-        <span class="filter-title">{{ $t('lessonRecord.cate') }}</span>
+        <span class="filter-title">{{ $t('lessonRecord.range') }}</span>
         <div class="filter-items">
-          <span :class="['filter-item',!tagIndexArr.length ? 'filter-item-active' : '']" @click="onFilterChange('tag',-1)">{{ $t('lessonRecord.all') }}</span>
-          <span :class="['filter-item',tagIndexArr.includes(index) ? 'filter-item-active' : '']" v-for="(item,index) in tagList" :key="index" @click="onFilterChange('tag',index)">{{ item }}</span>
+          <span :class="['filter-item',curRangeIndex === index ? 'filter-item-active' : '']" v-for="(item,index) in rangeArr" :key="index" @click="onFilterChange('range',index)">{{ item }}</span>
         </div>
       </div>
       <div class="filter-section">
-        <span class="filter-title">{{ $t('lessonRecord.range') }}</span>
+        <span class="filter-title">类型</span>
         <div class="filter-items">
-          <span :class="['filter-item',curRangeIndex === index ? 'filter-item-active' : '']" v-for="(item,index) in rangeArr" :key="index" @click="onFilterChange('range',index)">{{ item }}</span>
+          <span :class="['filter-item',curTypeIndex === index ? 'filter-item-active' : '']" v-for="(item,index) in typeArr" :key="index" @click="onFilterChange('type',index)">{{ item }}</span>
         </div>
       </div>
       <div class="filter-section">
@@ -36,15 +71,26 @@
         </div>
       </div>
       <div class="ad-filter">
-        <div class="ad-filter-item" v-show="!hideAdFilter && !showRangePicker">
-          <!-- <span class="filter-item-title">{{ $t('lessonRecord.tchName') }}</span> -->
+        <div class="ad-filter-item">
+          <Select v-model="tagIndexArr" style="width:150px;" placeholder="课例类别" multiple @on-change="onCateChange">
+            <Option v-for="(item,index) in tagList" :value="index">{{ item }}</Option>
+          </Select>
+        </div>
+        <div class="ad-filter-item">
+          <Select v-model="filterClassIds" style="width:150px;" placeholder="选择班级">
+            <Option v-for="(item,index) in classArr" :value="item.id">{{ item.name }}</Option>
+          </Select>
+        </div>
+        <div class="ad-filter-item">
           <BaseSelectTch @onTchSelect="onTchSelect" ref="tchSelect"></BaseSelectTch>
         </div>
-        <div class="ad-filter-item" v-show="!hideAdFilter && !showRangePicker">
-          <!-- <span class="filter-item-title">{{ $t('lessonRecord.lessonName') }}</span> -->
+        <div class="ad-filter-item">
           <Input v-model="filterJson.vName" :placeholder="$t('lessonRecord.lessonNamePlace')" clearable />
         </div>
-        <div class="ad-filter-item" v-show="!hideAdFilter && !showRangePicker">
+        <div class="ad-filter-item">
+          <DatePicker :value="filterJson.timeRange" :editable="false" :options="timeOptions" format="yyyy/MM/dd" type="daterange" placement="bottom-end" :placeholder="$t('lessonRecord.rangeTip')" @on-change="onTimeRangeChange"></DatePicker>
+        </div>
+        <div class="ad-filter-item">
           <div class="cond-items" style="display: inline-block;vertical-align: sub;margin-right:10px;">
             <span v-for="(cond,condIndex) in conds">
               <Tag v-if="cond.val > 0" color="purple" size="medium" closable @on-close="removeAdvanceFilter(condIndex)">{{ cond.name }}{{ cond.type }}{{ cond.val }}</Tag>
@@ -68,10 +114,7 @@
             </div>
           </Dropdown>
         </div>
-        <div class="ad-filter-item" v-show="showRangePicker">
-          <DatePicker :value="filterJson.timeRange" :editable="false" :options="timeOptions" format="yyyy/MM/dd" type="daterange" placement="bottom-end" :placeholder="$t('lessonRecord.rangeTip')" @on-change="onTimeRangeChange"></DatePicker>
-        </div>
-        <div class="ad-filter-item" v-show="!hideAdFilter || showRangePicker">
+        <div class="ad-filter-item">
           <Button type="primary" shape="circle" @click="doSearch">{{ $t('lessonRecord.search') }}</Button>
           <Button type="info" shape="circle" @click="doReset">{{ $t('lessonRecord.reset') }}</Button>
         </div>
@@ -79,9 +122,9 @@
       </div>
       <!-- 查询结果 -->
       <div class="search-result">
-        <span style="cursor: pointer;margin-right: 10px;color: #04abc8;" @click="onClickAdFilter">
+        <!-- <span style="cursor: pointer;margin-right: 10px;color: #04abc8;" @click="onClickAdFilter">
           <Icon type="ios-funnel" color="#04abc8" style="margin-right: 5px;" />{{ hideAdFilter ? $t('lessonRecord.more') : $t('lessonRecord.close') }}
-        </span>
+        </span> -->
         <span style="cursor: pointer;margin-right: 10px;color: #04abc8;" @click="exportTable">
           <Icon type="md-download" color="#04abc8" style="margin:5px;" />{{ $t('assessment.export') }}
         </span>
@@ -89,17 +132,12 @@
           </span>{{ $t('lessonRecord.resultTip2') }}</span>
       </div>
     </div>
-
     <!-- 工具栏 -->
     <div class="tools-bar">
-      <!-- <div class="tool-item" @click="onAddVideo">
-				<Icon type="md-add" />
-				<span>添加课例</span>
-			</div> -->
-      <!-- <div class="tool-item">
-				<Icon type="md-download" @click="exportTable()"/>
-				<span>{{ $t('lessonRecord.export') }}</span>
-			</div> -->
+      <div class="tool-item" @click="isShowFilter = !isShowFilter">
+        <Icon type="md-funnel" />
+        <span>{{ isShowFilter ? '收起筛选' : '展开筛选'}}</span>
+      </div>
       <div class="tool-item" @click="onTagMgClick">
         <Icon type="logo-buffer" />
         <span>{{ $t('lessonRecord.tagMg') }}</span>
@@ -108,10 +146,6 @@
         <Icon type="md-settings" />
         <span>{{ $t('lessonRecord.setting') }}</span>
       </div>
-      <!-- <div class="tool-item">
-				<Icon type="ios-paper-plane" />
-				<span>分享至公开课</span>
-			</div> -->
     </div>
     <!-- 表格区域 -->
     <div class="table-box">
@@ -138,21 +172,14 @@
               </div>
             </div>
           </template>
-          <!-- <template slot-scope="{ row }" slot="category">
-            <span>{{ row.category.length ? row.category.join(',') : '-' }}</span>
+          <!-- 科技手段分数 -->
+          <template slot-scope="{ row,index }" slot="tLevel">
+            <span :style="{ backgroundColor: getLevelColor(row.tLevel),boxShadow:'0 0 6px ' + getLevelColor(row.tLevel) }" class="level-light"></span>
           </template>
-          <template slot-scope="{ row }" slot="subject">
-            <span>{{ curPeriod.subjects.find(j => j.id === row.subjectId).name  }}</span>
+          <!-- 教法应用分数 -->
+          <template slot-scope="{ row,index }" slot="pLevel">
+            <span :style="{ backgroundColor: getLevelColor(row.pLevel),boxShadow:'0 0 6px rgba(0, 0, 0, 0.5)' }" class="level-light"></span>
           </template>
-          <template slot-scope="{ row }" slot="grade">
-            <span>{{ row.grade.map(i => curPeriod.grades[+i]).join(',') }}</span>
-          </template>
-          <template slot-scope="{ row }" slot="className">
-            <span>{{ row.groupIds.join(',') }}</span>
-          </template>
-          <template slot-scope="{ row }" slot="startTime">
-            <span>{{ $tools.formatTime(row.startTime,'yyyy-MM-dd') }}</span>
-          </template> -->
           <template slot-scope="{ row }" slot="action">
             <div v-if="row.status !== 404">
               <Icon type="md-download" class="action-icon" color="#34cf97" @click="downloadTable(row)" :title="$t('lessonRecord.action1')" />
@@ -227,10 +254,15 @@ export default {
   },
   data(vm) {
     return {
-      rangeArr: [vm.$t('lessonRecord.all'), vm.$t('lessonRecord.week'), vm.$t('lessonRecord.month'), vm.$t('lessonRecord.semester'), vm.$t('lessonRecord.custom')],
+      filterClassIds: [],
+      classArr: [],
+      rangeArr: [vm.$t('lessonRecord.all'), vm.$t('lessonRecord.today'), vm.$t('lessonRecord.week'), vm.$t('lessonRecord.month'), vm.$t('lessonRecord.semester'), vm.$t('lessonRecord.custom')],
       statusArr: [vm.$t('lessonRecord.normalStatus'), vm.$t('lessonRecord.expireStatus'), vm.$t('lessonRecord.deleteStatus')],
+      typeArr: [vm.$t('lessonRecord.all'), '双绿灯课例', '双红灯课例'],
       curRangeIndex: 0,
       curStatusIndex: 0,
+      curTypeIndex: 0,
+      isShowFilter: false,
       hideAdFilter: true,
       cleanModal: false,
       showRangePicker: false,
@@ -241,7 +273,7 @@ export default {
       apiTags: [],
       oldNewTags: [],
       analysisArr: [vm.$t('lessonRecord.count1'), vm.$t('lessonRecord.count2'), vm.$t('lessonRecord.count3'), vm.$t('lessonRecord.count4'), vm.$t('lessonRecord.count5'), vm.$t('lessonRecord.count6'), vm.$t('lessonRecord.count7')],
-      analysisCount: [],
+      analysisCount: [0, 0, 0, 0, 0, 0],
       isEdit: false,
       editLoading: false,
       tagLoading: false,
@@ -416,77 +448,39 @@ export default {
           key: 'clientInteractionCount',
           sortable: true,
           ellipsis: true,
+          align: 'center'
         },
         {
           title: vm.$t('lessonRecord.collateTaskCount'),
           key: 'collateTaskCount',
           sortable: true,
           ellipsis: true,
+          align: 'center'
         },
         {
           title: vm.$t('lessonRecord.pushCount'),
           key: 'pushCount',
           sortable: true,
           ellipsis: true,
+          align: 'center'
         },
         {
           title: vm.$t('lessonRecord.examQuizCount'),
           key: 'examCount',
           sortable: true,
           ellipsis: true,
+          align: 'center'
+        },
+        {
+          title: `科技互动(T分)`,
+          slot: 'tLevel',
+          align: 'center'
+        },
+        {
+          title: `教法应用(P分)`,
+          slot: 'pLevel',
+          align: 'center'
         },
-        // {
-        //   title: vm.$t('lessonRecord.attendCount'),
-        //   key: 'attendRate',
-        //   sortable: true,
-        //   ellipsis: true,
-        //   render: function (h, params) {
-        //     return h('span', (Number(params.row.attendRate)).toFixed(2) + '%')
-        //   },
-        // },
-        // {
-        //   title: vm.$t('lessonRecord.groupCount'),
-        //   key: 'groupCount',
-        //   sortable: true,
-        //   ellipsis: true,
-        // },
-        // {
-        //   title: vm.$t('lessonRecord.totalPoint'),
-        //   key: 'totalPoint',
-        //   sortable: true,
-        //   ellipsis: true,
-        // },
-
-        // {
-        //   title: vm.$t('lessonRecord.collateCount'),
-        //   key: 'collateCount',
-        //   sortable: true,
-        //   ellipsis: true,
-        // },
-
-        // {
-        //   title: vm.$t('lessonRecord.score'),
-        //   key: 'totalInteractPoint',
-        //   sortable: true,
-        //   ellipsis: true,
-        // },
-        // {
-        //   title: vm.$t('lessonRecord.interactionCount'),
-        //   key: 'interactionCount',
-        //   sortable: true,
-        //   ellipsis: true,
-        // },
-
-
-        // {
-        //   title: vm.$t('lessonRecord.examPointRate'),
-        //   key: 'examPointRate',
-        //   sortable: true,
-        //   ellipsis: true,
-        //   render: function (h, params) {
-        //     return h('span', (Number(params.row.examPointRate)).toFixed(2) + '%')
-        //   },
-        // },
         {
           title: vm.$t('lessonRecord.action'),
           slot: 'action',
@@ -632,14 +626,14 @@ export default {
     /* 获取课例统计数据 */
     getAnalysisCount() {
       let semesterRange = this.$tools.getSemesterTimeRange()
-      this.$api.lessonRecord.getAnalysisCount({
+      this.$api.lessonRecord.getStaticData({
         "stime": semesterRange.st,
         "etime": semesterRange.et,
         "code": this.$store.state.userInfo.schoolCode,
         "periodId": this.$store.state.user.curPeriod.id
       }).then(res => {
         console.log(res)
-        this.analysisCount = Object.values(res)
+        this.analysisCount = res.total
       })
     },
     /* 保存课例保留时间设置 */
@@ -728,6 +722,11 @@ export default {
         subjectId: '',
         timeRange: []
       }
+      this.curStatusIndex = 0
+      this.curTypeIndex = 0
+      this.curRangeIndex = 0
+      this.subjectIndexArr = []
+      this.gradeIndexArr = []
       this.conds.forEach(i => {
         i.val = 0
         i.type = '>='
@@ -754,6 +753,9 @@ export default {
       }
       this.doFilter()
     },
+    onCateChange(val) {
+      this.onFilterChange('tag', val)
+    },
     /* 筛选操作 */
     onFilterChange(type, index) {
       if (type === 'grade') {
@@ -775,36 +777,38 @@ export default {
         }
         this.filterParams.subjectId = index === -1 ? [] : this.subjectIndexArr.map(j => this.curPeriod.subjects[j].id)
       } else if (type === 'tag') {
-        if (index === -1) {
+        if (index.length == 0) {
           this.tagIndexArr = []
-        } else if (this.tagIndexArr.includes(index)) {
-          this.tagIndexArr.splice(this.tagIndexArr.indexOf(index), 1)
-        } else {
-          this.tagIndexArr.push(index)
         }
         this.filterParams.category = this.tagIndexArr.map(i => this.tagList[i])
       } else if (type === 'range') {
         this.curRangeIndex = index
         if (index === 1) {
+          const nowTime = new Date();
+          const todayStart = new Date(nowTime.toDateString()).getTime();
+          const todayEnd = new Date(nowTime.toDateString()).getTime() + 3600 * 1000 * 24 - 1;
+          this.filterParams.stime = todayStart
+          this.filterParams.etime = todayEnd
+        } else if (index === 2) {
           const end = new Date();
           const nowWeekDay = end.getDay() //本周的第几天
           const start = new Date();
           this.filterParams.stime = new Date(start.toLocaleDateString()).getTime() - 3600 * 1000 * 24 * (nowWeekDay - 1)
           this.filterParams.etime = end.getTime()
-        } else if (index === 2) {
+        } else if (index === 3) {
           const end = new Date();
           let curYear = end.getFullYear()
           let curMonth = end.getMonth() + 1
           const start = new Date(`${curYear}/${curMonth}/01`);
           this.filterParams.stime = start.getTime()
           this.filterParams.etime = end.getTime()
-        } else if (index === 3) {
+        } else if (index === 4) {
           let semesterRange = this.$tools.getSemesterTimeRange()
           this.filterJson.sTime = semesterRange.st
           this.filterJson.eTime = semesterRange.et
           this.filterParams.stime = semesterRange.st
           this.filterParams.etime = semesterRange.et
-        } else if (index === 4) {
+        } else if (index === 5) {
           this.showRangePicker = true
           return
         } else {
@@ -831,6 +835,18 @@ export default {
           this.filterParams.expire = false
           this.filterParams.isOk = true
         }
+      } else if (type === 'type') {
+        this.curTypeIndex = index
+        if (index === 0) {
+          this.filterParams.doubleGreen = false
+          this.filterParams.doubleRed = false
+        } else if (index === 1) {
+          this.filterParams.doubleGreen = true
+          this.filterParams.doubleRed = false
+        } else if (index === 2) {
+          this.filterParams.doubleGreen = false
+          this.filterParams.doubleRed = true
+        }
       }
       this.doFilter()
     },
@@ -1050,6 +1066,11 @@ export default {
     curPeriod() {
       return this.$store.state.user.curPeriod
     },
+    getLevelColor() {
+      return level => {
+        return ['#ff2d2d', '#ffc018', '#00b214'][level]
+      }
+    }
   },
   watch: {
     '$store.state.user.curPeriod': {
@@ -1059,7 +1080,7 @@ export default {
         if (n) {
           this.initFilter()
           this.initTags()
-          // this.getAnalysisCount()
+          this.getAnalysisCount()
         }
       }
     }

+ 2 - 2
TEAMModelOS/Controllers/Analysis/ArtAnalysisController.cs

@@ -72,8 +72,8 @@ namespace TEAMModelOS.Controllers.Analysis
 
         [ProducesDefaultResponseType]
         [HttpPost("statistics")]
-        //[Authorize(Roles = "IES")]
-        //[AuthToken(Roles = "teacher,admin")]
+        [Authorize(Roles = "IES")]
+        [AuthToken(Roles = "teacher,admin")]
         public async Task<IActionResult> getAnalysis(JsonElement request)
         {
             var client = _azureCosmos.GetCosmosClient();

+ 2 - 2
TEAMModelOS/Controllers/Common/AreaController.cs

@@ -657,8 +657,8 @@ namespace TEAMModelOS.Controllers
 
 
         [ProducesDefaultResponseType]
-        //[Authorize(Roles = "IES")]
-        //[AuthToken(Roles = "teacher,admin")]
+        [Authorize(Roles = "IES")]
+        [AuthToken(Roles = "teacher,admin")]
         [HttpPost("analysis-area-art")]
         public async Task<IActionResult> FindAreaArt(JsonElement request)
         {