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

1.1.1需求开发

刘洋 1 éve
szülő
commit
7b2943d9e6

+ 13 - 8
src/components/shared/message/MessageList.vue

@@ -379,19 +379,20 @@ onUnmounted(() => {
         clear: both;
       }
       .one-message {
-        border-radius: 4px;
-        padding: 12px;
         max-width: 75%;
-
+        .history-message-info-content {
+          border-radius: 4px;
+          padding: 12px;
+        }
         &.other-person {
-          background-color: #fff;
           float: left;
           :deep(.link-button) {
             background-color: #e6f0ff !important;
           }
           .message-header {
             .user-name {
-              color: #444;
+              // color: #444;
+              color: #888;
               font-size: 12px;
               font-weight: bold;
             }
@@ -402,19 +403,22 @@ onUnmounted(() => {
           }
         }
         &.self-person {
-          background-color: $color--primary;
           float: right;
           .history-message-info-content {
             color: #fff;
+            background-color: $color--primary;
           }
           .message-header {
+            text-align: right;
             .user-name {
-              color: #fff;
+              // color: #fff;
+              color: #888;
               font-size: 12px;
               font-weight: bold;
             }
             .message-time {
-              color: #fff;
+              // color: #fff;
+              color: #888;
               font-size: 12px;
             }
           }
@@ -432,6 +436,7 @@ onUnmounted(() => {
         font-size: 12px;
         font-weight: 400;
         line-height: 18px;
+        background-color: #fff;
       }
     }
     .msg-content-box {

+ 21 - 0
src/hooks/useTable.ts

@@ -163,9 +163,30 @@ const useTable = <
     }
   }
   bus.on('atBottomRowFromUseTableCheck', busFunc2)
+
+  const busFunc3 = () => {
+    if (isLastPage.value) {
+      console.log('当前页已是最后一页: from useTable')
+      ElMessage.warning('当前页已是最后一页')
+    } else {
+      currentPage.value = Number(currentPage.value) + 1
+    }
+  }
+  bus.on('needToNextPageFromUseTableCheck', busFunc3)
+
+  const busFunc4 = () => {
+    if (currentPage.value == 1) {
+      ElMessage.warning('当前页已是第一页')
+    } else if (currentPage.value > 1) {
+      currentPage.value = Number(currentPage.value) - 1
+    }
+  }
+  bus.on('needToPrevPageFromUseTableCheck', busFunc4)
   onUnmounted(() => {
     bus.off('toNextTablePage', busFunc1)
     bus.off('atBottomRowFromUseTableCheck', busFunc2)
+    bus.off('needToNextPageFromUseTableCheck', busFunc3)
+    bus.off('needToPrevPageFromUseTableCheck', busFunc4)
   })
   return {
     tableRef,

+ 56 - 3
src/hooks/useTableCheck.ts

@@ -25,7 +25,12 @@ function isMultipleData(data: any): data is MultipleResultType {
   return isDefine(data?.result) && isDefine(data?.totalCount)
 }
 
-const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = true, queryPosition: any = null) => {
+const useTableCheck = <T extends TableDataType<InputDataType>>(
+  data: T,
+  auto = true,
+  queryPosition: any = null,
+  apiNotByPage = false
+) => {
   const tableRef = ref<InstanceTable>()
 
   const elTableRef = computed(() => {
@@ -137,9 +142,47 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
       toggleClass(rightTableViewDom, 'collapse')
     }
   }
+
+  const nextPageSoon = throttle(() => {
+    console.log('tableData.value.length:', tableData.value.length)
+    console.log('totalCount.value:', totalCount.value)
+    console.log('pageSize.value:', pageSize.value)
+    console.log('pageNumber.value', pageNumber.value)
+    if (totalCount.value !== null && pageSize.value !== null) {
+      if (pageNumber.value * pageSize.value + 1 > totalCount.value) {
+        console.log('当前页已是最后一页: from useTableCheck')
+        ElMessage.warning('当前页已是最后一页')
+      }
+    } else {
+      if (apiNotByPage) {
+        ElMessage.warning('当前页已是最后一页')
+      } else {
+        bus.emit('needToNextPageFromUseTableCheck')
+      }
+    }
+  }, 500)
+  const prevPageSoon = throttle(() => {
+    console.log('tableData.value.length:', tableData.value.length)
+    console.log('totalCount.value:', totalCount.value)
+    console.log('pageSize.value:', pageSize.value)
+    console.log('pageNumber.value', pageNumber.value)
+    if (totalCount.value !== null && pageSize.value !== null) {
+      ElMessage.warning('当前页已是第一页')
+    } else {
+      if (apiNotByPage) {
+        ElMessage.warning('当前页已是第一页')
+      } else {
+        bus.emit('needToPrevPageFromUseTableCheck')
+      }
+    }
+  }, 500)
+
   const nextRow = throttle(() => {
     console.log('current.value?.index:', current.value?.index)
     console.log('tableData.value.length:', tableData.value.length)
+    console.log('totalCount.value:', totalCount.value)
+    console.log('pageSize.value:', pageSize.value)
+    console.log('pageNumber.value', pageNumber.value)
     if (current.value?.index == tableData.value.length - 1) {
       //说明高亮正处于最后一行了,需要提示用户是否需要翻到下一页。
       if (totalCount.value !== null && pageSize.value !== null) {
@@ -155,8 +198,11 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
         }
       } else {
         //在useTable里才能拿到分页相关信息,所以要对useTable进行通信,告诉它到了最后一行了,是否需要弹框诱导到下一页
-
-        bus.emit('atBottomRowFromUseTableCheck')
+        if (apiNotByPage) {
+          ElMessage.warning('当前页已是最后一页')
+        } else {
+          bus.emit('atBottomRowFromUseTableCheck')
+        }
       }
       return
     }
@@ -203,6 +249,7 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
     }
   }, 300)
   const arrowDownToNextRow = (e: any) => {
+    console.log('e.key', e.key)
     // if (e.target.tagName === 'INPUT' || (e.target.className || '').includes('contenteditable-ele')) {
     //   return false
     // }
@@ -217,6 +264,12 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
     } else if (e.key === 'ArrowUp') {
       e.preventDefault()
       prevRow()
+    } else if (e.key === 'PageDown') {
+      e.preventDefault()
+      nextPageSoon()
+    } else if (e.key === 'PageUp') {
+      e.preventDefault()
+      prevPageSoon()
     }
   }
   onMounted(() => {

+ 16 - 2
src/modules/analysis/monitoring/index.vue

@@ -14,7 +14,10 @@
           @click="setActiveCard(card)"
         >
           <div class="flex direction-column radius-base full fill-blank data-card-content">
-            <div class="p-base card-title">{{ card.title }}</div>
+            <div class="p-base card-title flex items-center justify-between">
+              <span>{{ card.title }}</span>
+              <el-button size="small" type="primary" link @click="toMore(card.key)">更多&gt;&gt; </el-button>
+            </div>
             <div class="p-l-extra-base p-r-mini p-b-extra-small flex-1 overflow-hidden">
               <base-table
                 border
@@ -77,7 +80,9 @@ import type { EpTableColumn, EpFormItem, EpTableProps } from 'global-type'
 import type { ExtractApiParams, ExtractApiResponse } from '@/api/api'
 
 const { push } = useRouter()
-
+const toMore = (key: string) => {
+  push({ name: 'AnalysisPersonnelStatistics', query: { sortKey: key } })
+}
 const {
   subjectList,
   mainQuestionList,
@@ -171,6 +176,7 @@ interface Card {
   title: string
   valueLabel: string
   hasAll: boolean
+  key: string
 }
 const needPositionCardFields: any = {
   scoreTopLowList: 'markScore',
@@ -184,48 +190,56 @@ const cards: Card[] = [
     title: '评卷份数',
     valueLabel: '份数',
     hasAll: true,
+    key: 'markingPaperCount',
   },
   {
     dataField: 'xyRelateList',
     title: '相关系数',
     valueLabel: '相关系数',
     hasAll: true,
+    key: 'xyRelate',
   },
   {
     dataField: 'avgList',
     title: '平均分',
     valueLabel: '平均分',
     hasAll: true,
+    key: 'avg',
   },
   {
     dataField: 'stdList',
     title: '标准差',
     valueLabel: '标准差',
     hasAll: true,
+    key: 'std',
   },
   {
     dataField: 'scoreTopLowList',
     title: '近5分钟最高最低分',
     valueLabel: '分数',
     hasAll: false,
+    key: 'scoreTop',
   },
   {
     dataField: 'objSubRateList',
     title: '近5分钟客主比',
     valueLabel: '最高',
     hasAll: false,
+    key: 'objSubRate',
   },
   {
     dataField: 'objSubAvgRateList',
     title: '平均客主比',
     valueLabel: '平均最高',
     hasAll: false,
+    key: 'objSubAvgRate',
   },
   {
     dataField: 'integrationList',
     title: '综合',
     valueLabel: '综合指数',
     hasAll: false,
+    key: 'integration',
   },
 ]
 

+ 25 - 5
src/modules/analysis/personnel-statistics/components/StatisticsPersonnel.vue

@@ -2,6 +2,7 @@
   <div class="p-small radius-base fill-blank statistics-personnel">
     <base-table
       ref="tableRef"
+      :key="tableKey"
       border
       stripe
       size="small"
@@ -10,6 +11,7 @@
       :height="tableHeight"
       :row-class-name="rowClassName"
       highlight-current-row
+      :default-sort="defaultSort"
       @current-change="onCurrentChange"
       @row-dblclick="myDbClick"
       @row-contextmenu="rowContextmenu"
@@ -84,7 +86,7 @@
 <script setup lang="tsx" name="StatisticsPersonnel">
 /** 人员数据统计-按人员展开 */
 import { ref, inject, computed, watch, nextTick, unref } from 'vue'
-import { useRouter } from 'vue-router'
+import { useRouter, useRoute } from 'vue-router'
 import { ElButton, ElPopover, ElMenu, ElMenuItem } from 'element-plus'
 import VueECharts from 'vue-echarts'
 import BaseTable from '@/components/element/BaseTable.vue'
@@ -98,7 +100,9 @@ import type { EChartsOption } from 'echarts'
 import type { ExtractApiResponse, ExtractApiParams } from '@/api/api'
 import type { EpTableColumn } from 'global-type'
 import type { PopoverInstance } from 'element-plus'
+const tableKey = ref(Date.now() + '')
 const mainStore = useMainStore()
+const firstSorted = ref(false)
 const isChief = computed(() => {
   const arr = ['CHIEF', 'SECTION_LEADER', 'EXPERT']
   return arr.indexOf(mainStore.myUserInfo?.role || '') > -1
@@ -125,7 +129,8 @@ const setMessageVisible = inject<(visible: boolean) => void>('setMessageVisible'
 const setReplyUserId = inject<(id: number) => void>('setReplyUserId')
 
 const { push } = useRouter()
-
+const route = useRoute()
+const defaultSort: any = ref(route.query?.sortKey ? { prop: route.query?.sortKey, order: 'descending' } : undefined)
 const columns = computed(() => {
   return [
     {
@@ -321,6 +326,7 @@ const myDbClick = (row: any) => {
 const sortTableData = ref<any[]>([])
 const originalTableData = ref<any[]>([])
 const sortChange = (params: any) => {
+  console.log('params:', params)
   const { column, prop, order } = params
   if (order === 'ascending') {
     sortTableData.value.sort((a: any, b: any) => {
@@ -358,7 +364,7 @@ const sortChange = (params: any) => {
     sortTableData.value = JSON.parse(JSON.stringify(originalTableData.value))
   }
 }
-function initSortTableData() {
+function initSortTableData(sortKey?: any) {
   if (tableData.value) {
     let data: any[] = JSON.parse(JSON.stringify(tableData.value)) || []
     if (data.length && data[data.length - 1].markingGroupNumber === 0) {
@@ -366,13 +372,27 @@ function initSortTableData() {
       data.unshift(last)
     }
     sortTableData.value = JSON.parse(JSON.stringify(data))
+    if (sortKey) {
+      sortTableData.value.sort((a: any, b: any) => {
+        return b[sortKey] - a[sortKey]
+      })
+    }
     originalTableData.value = JSON.parse(JSON.stringify(data))
   }
 }
 initSortTableData()
-watch(tableData, () => {
+watch(tableData, (val) => {
   popovers.value = {}
-  initSortTableData()
+  if (!firstSorted.value && route.query?.sortKey && val?.length) {
+    initSortTableData(route.query?.sortKey || '')
+    firstSorted.value = true
+  } else {
+    initSortTableData()
+    if (firstSorted.value) {
+      defaultSort.value = undefined
+      tableKey.value = Date.now() + ''
+    }
+  }
 })
 
 // watch(currentView, () => {

+ 4 - 2
src/modules/analysis/personnel-statistics/hooks/useStatisticsFilter.ts

@@ -7,6 +7,7 @@ import { getCurDayRange } from '@/utils/common'
 import useFetch from '@/hooks/useFetch'
 import useDayList from '@/hooks/useDayList'
 import { getTodayByDay } from '@/utils/common'
+import { useRoute } from 'vue-router'
 import type { EpFormItem, EpFormRows } from 'global-type'
 import type { ExtractApiParams } from '@/api/api'
 
@@ -21,7 +22,8 @@ type FormMode = Omit<
 }
 
 const useStatisticsFilter = () => {
-  // console.log('dayList:', dayList)
+  const route = useRoute()
+  console.log('route:', route)
   const {
     subjectList,
     mainQuestionList,
@@ -42,7 +44,7 @@ const useStatisticsFilter = () => {
     curDay: getTodayByDay(),
     // hasGroupLeaderScore: ['true'],
     hasGroupLeaderScore: [],
-    expand: [],
+    expand: route.query?.sortKey ? ['按人员展开'] : [],
     markerId: '',
     online: '',
   })

+ 1 - 1
src/modules/monitor/training-monitoring-detail/index.vue

@@ -191,7 +191,7 @@ const {
   visibleHistory,
   onDbClick,
   onCurrentChange,
-} = useTableCheck(monitorDetail)
+} = useTableCheck(monitorDetail, true, null, true)
 
 // watch(current, () => {
 //   if (current.value) {