Răsfoiți Sursa

1.1.0需求开发

刘洋 1 an în urmă
părinte
comite
f515efd4e2
43 a modificat fișierele cu 1468 adăugiri și 948 ștergeri
  1. 5 5
      electron-plugin.ts
  2. BIN
      electron/build/icons/icon.ico
  3. 115 17
      electron/main/main.ts
  4. BIN
      electron/main/public/icons/icon.ico
  5. 7 0
      electron/preload/preload.ts
  6. 3 2
      package.json
  7. 2 2
      server.config.ts
  8. 2 0
      src/App.vue
  9. 12 0
      src/assets/styles/element/custom.scss
  10. 65 0
      src/components/common/RowNextBottomDialog.vue
  11. 23 2
      src/components/common/customDialog.vue
  12. 2 2
      src/components/element/BaseTable.vue
  13. 5 0
      src/components/shared/ScoringPanel.vue
  14. 12 3
      src/components/shared/ScoringPanelWithConfirm.vue
  15. 1 0
      src/components/shared/SendBackMark.vue
  16. 1 0
      src/constants/storage.ts
  17. 12 0
      src/hooks/useTable.ts
  18. 18 8
      src/hooks/useTableCheck.ts
  19. 6 2
      src/layout/main/index.vue
  20. 1 1
      src/main.ts
  21. 3 0
      src/modules/analysis/personnel-compare/index.vue
  22. 11 1
      src/modules/analysis/personnel-statistics/components/StatisticsGroup.vue
  23. 11 1
      src/modules/analysis/personnel-statistics/components/StatisticsPersonnel.vue
  24. 80 68
      src/modules/analysis/view-marked-detail/index.vue
  25. 67 54
      src/modules/expert/assess/index.vue
  26. 66 53
      src/modules/expert/expert/index.vue
  27. 67 54
      src/modules/expert/sample/index.vue
  28. 50 39
      src/modules/expert/standard/index.vue
  29. 57 44
      src/modules/expert/training/index.vue
  30. 74 61
      src/modules/marking/arbitration/index.vue
  31. 83 71
      src/modules/marking/inquiry-result/index.vue
  32. 13 3
      src/modules/marking/mark/index.vue
  33. 71 58
      src/modules/marking/problem/index.vue
  34. 70 57
      src/modules/marking/repeat/index.vue
  35. 51 38
      src/modules/marking/similar/index.vue
  36. 42 29
      src/modules/marking/training-record/index.vue
  37. 40 26
      src/modules/marking/view-sample/index.vue
  38. 89 75
      src/modules/monitor/system-check/index.vue
  39. 53 40
      src/modules/monitor/training-monitoring-detail/index.vue
  40. 64 51
      src/modules/quality/self-check-detail/index.vue
  41. 93 81
      src/modules/quality/subjective-check/index.vue
  42. 15 0
      src/store/main.ts
  43. 6 0
      src/utils/common.ts

+ 5 - 5
electron-plugin.ts

@@ -8,11 +8,11 @@ const useElectronPlugin: () => PluginOption = () =>
       publicDir: 'electron/main/public',
       build: { outDir: 'dist/electron/main', emptyOutDir: true },
     },
-    // preload: {
-    //   entry: 'electron/preload/preload',
-    //   publicDir: 'electron/preload/public',
-    //   build: { outDir: 'dist/electron/preload', emptyOutDir: true },
-    // },
+    preload: {
+      entry: 'electron/preload/preload',
+      publicDir: 'electron/preload/public',
+      build: { outDir: 'dist/electron/preload', emptyOutDir: true },
+    },
   })
 
 export default useElectronPlugin

BIN
electron/build/icons/icon.ico


+ 115 - 17
electron/main/main.ts

@@ -1,19 +1,84 @@
-import { app, BrowserWindow } from 'electron'
+import { app, BrowserWindow, dialog, ipcMain } from 'electron'
 import { resolve } from 'path'
-import installDevTool, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
+import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-assembler'
 import path from 'path'
+import fs from 'fs'
 
 if (!app.requestSingleInstanceLock()) {
   app.quit()
   process.exit(0)
 }
 
+// async function createWindow() {
+//   const loadingView = new BrowserWindow({
+//     width: 520,
+//     height: 150,
+//     frame: false,
+//     icon: path.join(__dirname, './icons/icon.png'),
+//     resizable: false,
+//     transparent: true,
+//     show: true,
+//     // webPreferences: {
+//     //   preload: path.join(__dirname, '../preload/preload'),
+//     // },
+//   })
+//   loadingView.loadFile(resolve(__dirname, 'loading.html'))
+//   const mainWin = new BrowserWindow({
+//     show: false,
+//     width: 1680,
+//     height: 900,
+//     frame: false,
+//     center: true,
+//     icon: path.join(__dirname, './icons/icon.png'),
+//     resizable: false,
+//     fullscreen: app.isPackaged ? true : false,
+//     fullscreenable: true,
+//     alwaysOnTop: false,
+//     useContentSize: true,
+//     transparent: true,
+//     webPreferences: {
+//       devTools: true,
+//       nodeIntegration: false,
+//       contextIsolation: true,
+//       webSecurity: false,
+//       experimentalFeatures: true,
+//       navigateOnDragDrop: false,
+//       disableHtmlFullscreenWindowResize: false,
+//       // preload: path.join(__dirname, '../preload/preload'),
+//     },
+//   })
+
+//   mainWin.setMenu(null)
+
+//   if (!app.isPackaged) {
+//     mainWin.webContents.on('before-input-event', (event, input) => {
+//       if (input.key === 'F12') {
+//         mainWin.webContents.openDevTools()
+//       }
+//     })
+//   }
+
+//   mainWin.on('ready-to-show', () => {
+//     loadingView.destroy()
+//     mainWin.show()
+//   })
+
+//   if (app.isPackaged) {
+//     mainWin.loadURL('http://cet-test.markingtool.cn')
+//     // mainWin.loadURL('http://192.168.10.177:81')
+//   } else {
+//     installDevTool(VUEJS_DEVTOOLS)
+//     process.env.WEB_DEV_INDEX_URL && mainWin.loadURL(process.env.WEB_DEV_INDEX_URL)
+//   }
+// }
+
+let mainWin: any = null
 async function createWindow() {
   const loadingView = new BrowserWindow({
     width: 520,
     height: 150,
     frame: false,
-    icon: path.join(__dirname, './icons/icon.png'),
+    icon: path.join(__dirname, './icons/icon.ico'),
     resizable: false,
     transparent: true,
     show: true,
@@ -22,15 +87,22 @@ async function createWindow() {
     // },
   })
   loadingView.loadFile(resolve(__dirname, 'loading.html'))
-  const mainWin = new BrowserWindow({
+  // if (!app.isPackaged) {
+  //   try {
+  //     await installExtension(VUEJS_DEVTOOLS)
+  //   } catch (e) {
+  //     console.error('Vue Devtools failed to install:', e.toString())
+  //   }
+  // }
+  mainWin = new BrowserWindow({
     show: false,
     width: 1680,
     height: 900,
     frame: false,
     center: true,
-    icon: path.join(__dirname, './icons/icon.png'),
+    icon: path.join(__dirname, './icons/icon.ico'),
     resizable: false,
-    fullscreen: app.isPackaged ? true : false,
+    fullscreen: app.isPackaged ? true : true,
     fullscreenable: true,
     alwaysOnTop: false,
     useContentSize: true,
@@ -43,19 +115,19 @@ async function createWindow() {
       experimentalFeatures: true,
       navigateOnDragDrop: false,
       disableHtmlFullscreenWindowResize: false,
-      // preload: path.join(__dirname, '../preload/preload'),
+      preload: path.join(__dirname, '../preload/preload'),
     },
   })
 
   mainWin.setMenu(null)
 
-  if (!app.isPackaged) {
-    mainWin.webContents.on('before-input-event', (event, input) => {
-      if (input.key === 'F12') {
-        mainWin.webContents.openDevTools()
-      }
-    })
-  }
+  // if (!app.isPackaged) {
+  mainWin.webContents.on('before-input-event', (event, input) => {
+    if (input.key === 'F12' && input.control) {
+      mainWin.webContents.openDevTools()
+    }
+  })
+  // }
 
   mainWin.on('ready-to-show', () => {
     loadingView.destroy()
@@ -63,14 +135,40 @@ async function createWindow() {
   })
 
   if (app.isPackaged) {
-    mainWin.loadURL('http://cet-test.markingtool.cn')
-    // mainWin.loadURL('http://192.168.10.177:81')
+    const filePath = path.join(process.env.PORTABLE_EXECUTABLE_DIR as string, 'config.json')
+    if (!fs.existsSync(filePath)) {
+      dialog.showErrorBox('找不到配置文件', 'config.json文件不存在!')
+      app.quit()
+    } else {
+      fs.readFile(filePath, 'utf-8', function (err, data) {
+        if (!err) {
+          let da: any = {}
+          try {
+            da = JSON.parse(data)
+          } catch (error) {
+            dialog.showErrorBox('错误', '您的config.json文件内容格式可能不正确,请检查!')
+            app.quit()
+          }
+          const url = da.url || ''
+          if (!!url) {
+            mainWin.loadURL(url)
+          }
+        } else {
+          dialog.showErrorBox('错误', JSON.stringify(err))
+          app.quit()
+        }
+      })
+    }
   } else {
-    installDevTool(VUEJS_DEVTOOLS)
+    // mainWin.loadURL('http://cet-test.markingtool.cn')
     process.env.WEB_DEV_INDEX_URL && mainWin.loadURL(process.env.WEB_DEV_INDEX_URL)
   }
 }
 
+ipcMain.on('window-min', () => {
+  mainWin.minimize()
+})
+
 app.on('window-all-closed', () => {
   if (process.platform !== 'darwin') app.quit()
 })

BIN
electron/main/public/icons/icon.ico


+ 7 - 0
electron/preload/preload.ts

@@ -0,0 +1,7 @@
+import { contextBridge, ipcRenderer } from 'electron'
+console.log('ipcRenderer:', ipcRenderer)
+contextBridge.exposeInMainWorld('electronAPI', {
+  windowMin: () => {
+    ipcRenderer.send('window-min')
+  },
+})

+ 3 - 2
package.json

@@ -25,6 +25,7 @@
     "crypto-js": "4.1.1",
     "dayjs": "1.11.5",
     "echarts": "5.4.0",
+    "electron-devtools-assembler": "^1.2.0",
     "element-plus": "2.2.17",
     "element-resize-detector": "^1.2.4",
     "lodash-es": "4.17.21",
@@ -47,6 +48,7 @@
     "@typescript-eslint/parser": "^5.38.0",
     "@vitejs/plugin-vue": "^3.1.0",
     "@vitejs/plugin-vue-jsx": "^2.0.1",
+    "@vue/compiler-sfc": "3.2.37",
     "autoprefixer": "^10.4.10",
     "cross-env": "^7.0.3",
     "cssnano": "^5.1.13",
@@ -68,8 +70,7 @@
     "vite-plugin-eslint": "^1.8.1",
     "vite-plugin-svg-icons": "^2.0.1",
     "vite-use-electron": "0.0.3",
-    "vue-tsc": "1.2.0",
-    "@vue/compiler-sfc": "3.2.37"
+    "vue-tsc": "1.2.0"
   },
   "lint-staged": {
     "**/*.{js,jsx,ts,tsx,vue}": [

+ 2 - 2
server.config.ts

@@ -3,11 +3,11 @@ import type { ServerOptions } from 'vite'
 const server: ServerOptions = {
   proxy: {
     '^/?(api|file)/': {
-      target: 'http://192.168.10.41:8200',
+      // target: 'http://192.168.10.41:8200',
       // target: 'http://192.168.10.178:8200',
       // target: 'http://192.168.10.108:8200',
       // target: 'http://cet-test.markingtool.cn',
-      // target: 'http://192.168.10.136:80',
+      target: 'http://192.168.10.136:80',
       // target: 'http://cet-dev.markingtool.cn:8200',
     },
   },

+ 2 - 0
src/App.vue

@@ -5,6 +5,7 @@ import useMainStore from '@/store/main'
 import useMainLayoutStore from '@/store/layout'
 import LockScreen from '@/layout/LockScreen.vue'
 import LoadingFlag from '@/components/common/LoadingFlag.vue'
+import RowNextBottomDialog from '@/components/common/RowNextBottomDialog.vue'
 import { onMounted } from 'vue'
 import { useRoute } from 'vue-router'
 const route = useRoute()
@@ -70,6 +71,7 @@ onMounted(() => {
     </router-view>
     <lock-screen v-if="mainStore.lockScreenStatus"></lock-screen>
     <loading-flag v-if="mainStore.globalLoading"></loading-flag>
+    <row-next-bottom-dialog />
   </el-config-provider>
 </template>
 

+ 12 - 0
src/assets/styles/element/custom.scss

@@ -344,3 +344,15 @@ body {
     font-size: 13px;
   }
 }
+.el-scrollbar__bar{
+  display:block !important;
+  &.is-horizontal{
+    height:9px !important;
+  }
+  &.is-vertical{
+    width:9px !important;
+  }
+}
+.el-scrollbar__thumb{
+  background-color:#555 !important;
+}

+ 65 - 0
src/components/common/RowNextBottomDialog.vue

@@ -0,0 +1,65 @@
+<template>
+  <base-dialog v-model="visible" unless :width="250" center @close="onCancelSubmit">
+    <div class="m-t-base confirm-text">是否继续进入下一页?</div>
+    <template #footer>
+      <div class="flex items-center justify-between">
+        <el-button ref="confirmButtonRef" class="confirm-button" type="primary" @click="onConfirmSubmit">
+          是(Y)
+        </el-button>
+        <el-button ref="cancelButtonRef" class="confirm-button" plain @click="onCancelSubmit">否(N)</el-button>
+      </div>
+    </template>
+  </base-dialog>
+</template>
+<script name="RowNextBottomDialog" setup lang="ts">
+import { ref, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'
+import BaseDialog from '@/components/element/BaseDialog.vue'
+import { ElButton } from 'element-plus'
+import useMainStore from '@/store/main'
+import bus from '@/utils/bus'
+const mainStore = useMainStore()
+const confirmButtonRef = ref()
+const cancelButtonRef = ref()
+const visible = ref(false)
+const onConfirmSubmit = () => {
+  bus.emit('toNextTablePage')
+  mainStore.setRowNextBottomDialogStatus(false)
+}
+const onCancelSubmit = () => {
+  mainStore.setRowNextBottomDialogStatus(false)
+}
+watch(
+  () => mainStore.showRowNextBottomDialog,
+  (val: boolean) => {
+    visible.value = val
+    if (val) {
+      nextTick(() => {
+        ;(confirmButtonRef.value?.ref as unknown as HTMLButtonElement)?.focus()
+      })
+    }
+  }
+)
+const yesOrNo = (e: any) => {
+  if (e.key === 'ArrowLeft') {
+    ;(confirmButtonRef.value?.ref as unknown as HTMLButtonElement)?.focus()
+  }
+  if (e.key === 'ArrowRight') {
+    ;(cancelButtonRef.value?.ref as unknown as HTMLButtonElement)?.focus()
+  }
+}
+onMounted(() => {
+  document.addEventListener('keyup', yesOrNo)
+})
+onBeforeUnmount(() => {
+  document.removeEventListener('keyup', yesOrNo)
+})
+</script>
+<style lang="scss" scoped>
+.confirm-text {
+  font-size: $BaseFont;
+  color: $NormalColor;
+}
+.confirm-button {
+  width: 90px;
+}
+</style>

+ 23 - 2
src/components/common/customDialog.vue

@@ -1,5 +1,5 @@
 <template>
-  <div v-if="visible" v-dragDialog="resizeKey" class="custom-dialog" :class="[resizeKey ? resizeKey : '']">
+  <!-- <div v-if="visible" v-dragDialog="resizeKey" class="custom-dialog" :class="[resizeKey ? resizeKey : '']">
     <div class="d-head">
       <span>{{ $props.title }}</span>
       <div class="head-btn-box flex justify-center items-center" @click="closeDialog">
@@ -9,7 +9,19 @@
     <div class="d-body">
       <slot></slot>
     </div>
-    <!-- <div class="preview-foot"></div> -->
+  </div> -->
+  <div v-if="visible" class="custom-dialog-wrap">
+    <div v-dragDialog="resizeKey" class="custom-dialog" :class="[resizeKey ? resizeKey : '']">
+      <div class="d-head">
+        <span>{{ $props.title }}</span>
+        <div class="head-btn-box flex justify-center items-center" @click="closeDialog">
+          <el-icon><close /></el-icon>
+        </div>
+      </div>
+      <div class="d-body">
+        <slot></slot>
+      </div>
+    </div>
   </div>
 </template>
 
@@ -34,6 +46,15 @@ const closeDialog = () => {
 </script>
 
 <style scoped lang="scss">
+.custom-dialog-wrap {
+  position: fixed;
+  z-index: 2555;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+}
 .custom-dialog {
   display: flex;
   flex-direction: column;

+ 2 - 2
src/components/element/BaseTable.vue

@@ -10,7 +10,7 @@
     <template #append>
       <slot name="append"></slot>
     </template>
-    <template #empty>
+    <!-- <template #empty>
       <slot name="empty">
         <common-empty>
           <template v-if="showRefresh">
@@ -23,7 +23,7 @@
           </template>
         </common-empty>
       </slot>
-    </template>
+    </template> -->
   </el-table>
 </template>
 

+ 5 - 0
src/components/shared/ScoringPanel.vue

@@ -215,6 +215,11 @@ const onToggleClick = () => {
 bus.on('mark-method-toggle', () => {
   onToggleClick()
 })
+bus.on('openScoreDialogByMouseRight', () => {
+  if (!dialogMode.value) {
+    onToggleClick()
+  }
+})
 </script>
 
 <style scoped lang="scss">

+ 12 - 3
src/components/shared/ScoringPanelWithConfirm.vue

@@ -44,7 +44,7 @@ import BaseDialog from '@/components/element/BaseDialog.vue'
 import useVModel from '@/hooks/useVModel'
 import useVW from '@/hooks/useVW'
 import { cloneDeep } from 'lodash'
-
+import bus from '@/utils/bus'
 import type { ExtractApiResponse } from '@/api/api'
 
 const props = defineProps<{
@@ -88,14 +88,23 @@ watch(submitModalVisible, () => {
 })
 const yesOrNo = (e: any) => {
   if (e.key === 'ArrowLeft') {
-    ;(confirmButtonRef.value?.ref as unknown as HTMLButtonElement).focus()
+    ;(confirmButtonRef.value?.ref as unknown as HTMLButtonElement)?.focus()
   }
   if (e.key === 'ArrowRight') {
-    ;(cancelButtonRef.value?.ref as unknown as HTMLButtonElement).focus()
+    ;(cancelButtonRef.value?.ref as unknown as HTMLButtonElement)?.focus()
+  }
+}
+//新增需求:鼠标点击试卷右键,弹出给分板的弹框模式
+const addEventToPaperImg = () => {
+  const dom: any = document.querySelector('.img-wrap .paper-img')
+  dom.oncontextmenu = (e: any) => {
+    e.preventDefault()
+    bus.emit('openScoreDialogByMouseRight')
   }
 }
 onMounted(() => {
   document.addEventListener('keyup', yesOrNo)
+  addEventToPaperImg()
 })
 onBeforeUnmount(() => {
   document.removeEventListener('keyup', yesOrNo)

+ 1 - 0
src/components/shared/SendBackMark.vue

@@ -1,6 +1,7 @@
 <template>
   <base-dialog
     v-model="visible"
+    draggable
     :title="needRejectReason === true ? '打回原因' : '提示'"
     :footer="false"
     destroy-on-close

+ 1 - 0
src/constants/storage.ts

@@ -1,6 +1,7 @@
 export const LOCAL_STORAGE_KEYS = {
   /** 监控页面自动刷新频率 */
   MONITORING_REFRESH_RATE: 'monitoring_refresh_rate',
+  paneSizeConfig: 'paneSizeConfig',
 }
 
 export const SESSION_STORAGE_KEYS = {

+ 12 - 0
src/hooks/useTable.ts

@@ -2,6 +2,8 @@ import { reactive, ref, computed, watch, unref } from 'vue'
 import { typeOf } from '@/utils/common'
 import useFetch from '@/hooks/useFetch'
 import useSection from '@/hooks/useSection'
+import bus from '@/utils/bus'
+import { ElMessage } from 'element-plus'
 import type { Ref } from 'vue'
 import type {
   ApiKeys,
@@ -135,6 +137,16 @@ const useTable = <
       total: total.value,
     })
   })
+  const isLastPage = computed(() => {
+    return currentPage.value * baseParams.pageSize + 1 > total.value
+  })
+  bus.on('toNextTablePage', () => {
+    if (isLastPage.value) {
+      ElMessage.warning('当前页已是最后一页')
+    } else {
+      currentPage.value = Number(currentPage.value) + 1
+    }
+  })
 
   return {
     tableRef,

+ 18 - 8
src/hooks/useTableCheck.ts

@@ -1,10 +1,10 @@
 import { ref, computed, watch, nextTick, unref, onMounted, onBeforeUnmount } from 'vue'
 import { isDefine, toggleClass } from '@/utils/common'
-
 import type { Ref, ShallowRef, UnwrapRef } from 'vue'
 import type { InstanceTable } from 'global-type'
 import type { MultipleResult } from '@/api/api'
-
+import { throttle } from 'lodash-es'
+import useMainStore from '@/store/main'
 type ArrayObjectType = Array<Record<string, any>>
 
 type MultipleResultType<T = Record<string, any>> = MultipleResult<T>
@@ -18,7 +18,7 @@ type ArrayData<T extends InputDataType> = T extends MultipleResultType<infer D>
 type RowType<T extends TableDataType<InputDataType>> = ArrayData<UnwrapRef<T>> & {
   index: number
 }
-
+const mainStore = useMainStore()
 function isMultipleData(data: any): data is MultipleResultType {
   return isDefine(data?.result) && isDefine(data?.totalCount)
 }
@@ -87,7 +87,14 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
       toggleClass(rightTableViewDom, 'collapse')
     }
   }
-  const nextRow = () => {
+  const nextRow = throttle(() => {
+    console.log('current.value?.index:', current.value?.index)
+    console.log('tableData.value.length:', tableData.value.length)
+    if (current.value?.index == tableData.value.length - 1) {
+      //说明高亮正处于最后一行了,需要提示用户是否需要翻到下一页
+      mainStore.setRowNextBottomDialogStatus(true)
+      return
+    }
     const index = (current.value?.index || 0) + 1
     elTableRef?.value?.setCurrentRow(tableData.value[index % tableData.value.length])
     const tBodyDomWrap: any = elTableRef?.value?.$refs.bodyWrapper
@@ -107,8 +114,8 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
       }
     }
     // elTableRef?.value?.scrollTo(0, (current.value?.index || 0) * 36)
-  }
-  const prevRow = () => {
+  }, 500)
+  const prevRow = throttle(() => {
     console.log('current.value?.index:', current.value?.index)
     if (current.value?.index > 0) {
       const index = current.value?.index
@@ -129,9 +136,12 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
         }
       }
     }
-  }
+  }, 500)
   const arrowDownToNextRow = (e: any) => {
-    if (e.target.tagName === 'INPUT' || (e.target.className || '').includes('contenteditable-ele')) {
+    // if (e.target.tagName === 'INPUT' || (e.target.className || '').includes('contenteditable-ele')) {
+    //   return false
+    // }
+    if ((e.target.className || '').includes('contenteditable-ele')) {
       return false
     }
     // e.preventDefault()

+ 6 - 2
src/layout/main/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="flex main-layout">
     <div class="flex direction-column main-layout-left" :class="{ 'is-collapse': mainLayoutStore.collapse }">
-      <div class="drag flex items-center justify-center dou-yu main-layout-left-logo" @dblclick="reloadPage">
+      <div class="drag flex items-center justify-center dou-yu main-layout-left-logo" @click="maximize">
         <span v-if="mainLayoutStore.collapse">CET</span>
         <img v-else src="../../assets/images/logo.png" />
         <!-- <span v-show="!mainLayoutStore.collapse"> 电子阅卷</span> -->
@@ -32,8 +32,12 @@ import useMainLayoutStore from '@/store/layout'
 import useMainStore from '@/store/main'
 import { useRoute } from 'vue-router'
 const route = useRoute()
+const maximize = () => {
+  let electronAPI = (window as any).electronAPI
+  electronAPI && electronAPI.windowMin()
+}
 const reloadPage = () => {
-  window.location.reload()
+  ;(window as any).location.reload()
 }
 const mainLayoutStore = useMainLayoutStore()
 const mainStore = useMainStore()

+ 1 - 1
src/main.ts

@@ -11,7 +11,7 @@ import 'element-plus/theme-chalk/el-loading.css'
 import '@style/app.scss'
 
 import 'element-plus/theme-chalk/src/message.scss'
-
+import 'splitpanes/dist/splitpanes.css'
 const app = createApp(App)
 setupDirectives(app)
 app.use(createPinia()).use(router).use(ElLoading).use(ElTooltip)

+ 3 - 0
src/modules/analysis/personnel-compare/index.vue

@@ -159,6 +159,7 @@ const columns = computed(() => {
       label: dataTypeLabelMap[dataType.value],
       align: 'center',
       minWidth: 80,
+      sortable: true,
       formatter(row: any) {
         return row[dataType.value]
       },
@@ -177,6 +178,7 @@ const columns = computed(() => {
           return aValue - bValue
         },
         minWidth: 100,
+        sortable: true,
       }
     }),
   ]
@@ -202,6 +204,7 @@ const columns2: any = computed(() => {
         label: item.scoreStart,
         align: 'center',
         minWidth: 50,
+        sortable: true,
         formatter(row: any) {
           return row.segmentScores.find((v: any) => v.scoreStart == item.scoreStart).rate
         },

+ 11 - 1
src/modules/analysis/personnel-statistics/components/StatisticsGroup.vue

@@ -53,6 +53,16 @@ const rowClassName = (obj: any) => {
 
 const columns = computed(() => {
   return [
+    {
+      label: '#',
+      type: 'index',
+      width: 50,
+      align: 'center',
+      fixed: 'left',
+      index(index: number) {
+        return index + 1
+      },
+    },
     {
       label: '小组',
       prop: 'markingGroupNumber',
@@ -156,7 +166,7 @@ const columns = computed(() => {
       return col
     })
     .filter((col: any) => {
-      return props.filterColumns ? props.filterColumns.indexOf(col.prop) > -1 : col
+      return props.filterColumns ? props.filterColumns.indexOf(col.prop) > -1 || col.type === 'index' : col
     })
 })
 

+ 11 - 1
src/modules/analysis/personnel-statistics/components/StatisticsPersonnel.vue

@@ -114,6 +114,16 @@ const { push } = useRouter()
 
 const columns = computed(() => {
   return [
+    {
+      label: '#',
+      type: 'index',
+      width: 50,
+      align: 'center',
+      fixed: 'left',
+      index(index: number) {
+        return index + 1
+      },
+    },
     {
       label: '小组',
       prop: 'markingGroupNumber',
@@ -217,7 +227,7 @@ const columns = computed(() => {
       return col
     })
     .filter((col: any) => {
-      return props.filterColumns ? props.filterColumns.indexOf(col.prop) > -1 : col
+      return props.filterColumns ? props.filterColumns.indexOf(col.prop) > -1 || col.type === 'index' : col
     })
 })
 const visable = ref(false)

+ 80 - 68
src/modules/analysis/view-marked-detail/index.vue

@@ -13,20 +13,23 @@
       >
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="current" class="absolute mark-score">{{ current.markScore }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="current" class="absolute mark-score">{{ current.markScore }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <!-- <scoring-panel-with-confirm
           :id="current?.taskId"
           v-model:visible="editScoreVisible"
           v-model:score="modelScore"
@@ -36,56 +39,61 @@
           :toggle-modal="false"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          :id="current?.taskId"
-          v-model:visible="editScoreVisible"
-          v-model:score="modelScore"
-          :main-number="current?.mainNumber"
-          :subject-code="query.subjectCode"
-          modal
-          :auto-visible="false"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <div class="flex items-center p-b-base m-b-base marker-name">
-          <span>评卷员</span>
-          <span>{{ query.markerName }}</span>
-        </div>
-        <div class="flex items-center justify-between detail-info-table-header">
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">总数:</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ pagination.total }}</span>
-          </el-button>
-          <el-pagination
-            v-bind="pagination"
-            v-model:current-page="currentPage"
-            size="small"
-            class="m-t-unset"
-            background
-            right
-            hide-on-single-page
-            :pager-count="3"
-            small
-          ></el-pagination>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            v-bind="pagination"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+          <scoring-panel-with-confirm
+            :id="current?.taskId"
+            v-model:visible="editScoreVisible"
+            v-model:score="modelScore"
+            :main-number="current?.mainNumber"
+            :subject-code="query.subjectCode"
+            modal
+            :auto-visible="false"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <div class="flex items-center p-b-base m-b-base marker-name">
+            <span>评卷员</span>
+            <span>{{ query.markerName }}</span>
+          </div>
+          <div class="flex items-center justify-between detail-info-table-header">
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">总数:</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ pagination.total }}</span>
+            </el-button>
+            <el-pagination
+              v-bind="pagination"
+              v-model:current-page="currentPage"
+              size="small"
+              class="m-t-unset"
+              background
+              right
+              hide-on-single-page
+              :pager-count="3"
+              small
+            ></el-pagination>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              v-bind="pagination"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="current?.filePath"></image-preview>
@@ -126,9 +134,14 @@ import SecNumberStatus from '@/components/common/secNumberStatus.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams, ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
 type RowType = ExtractMultipleApiResponse<'getPersonalMarkDetail'> & { index: number }
-
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 const props = defineProps<{
   markerId: string
 }>()
@@ -232,7 +245,7 @@ const columns: EpTableColumn<RowType>[] = [
 const { pagination, currentPage, data, fetchTable } = useTable('getPersonalMarkDetail', {
   markerId: props.markerId,
   score: (query.score as string) || '',
-  pageSize: 50,
+  pageSize: 100,
   subjectCode: query.subjectCode as string,
   mainNumber: query.questionMainNumber as string,
 })
@@ -313,7 +326,6 @@ onRefresh()
   }
   .table-view {
     // width: 580px;
-    width: 35%;
 
     .marker-name {
       border-bottom: $OnePixelLine;

+ 67 - 54
src/modules/expert/assess/index.vue

@@ -8,21 +8,24 @@
       <!-- <el-button class="m-l-base m-r-auto" size="small" type="primary" @click="onEditScore">修改给分</el-button> -->
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="currentAssessPaper" class="absolute mark-score">{{ currentAssessPaper.score }}</p>
-
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="currentAssessPaper" class="absolute mark-score">{{ currentAssessPaper.score }}</p>
+
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <!-- <scoring-panel-with-confirm
           v-model:visible="editScoreVisible"
           v-model:score="modelScore"
           :main-number="currentAssessPaper?.mainNumber"
@@ -31,43 +34,48 @@
           :auto-visible="false"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          v-model:visible="editScoreVisible"
-          v-model:score="modelScore"
-          :main-number="currentAssessPaper?.mainNumber"
-          :subject-code="formModel.subjectCode"
-          modal
-          :auto-visible="false"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">考核卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData?.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-          ></base-table>
-        </div>
-      </div>
+          <scoring-panel-with-confirm
+            v-model:visible="editScoreVisible"
+            v-model:score="modelScore"
+            :main-number="currentAssessPaper?.mainNumber"
+            :subject-code="formModel.subjectCode"
+            modal
+            :auto-visible="false"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">考核卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData?.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentAssessPaper?.filePath"></image-preview>
@@ -96,7 +104,13 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams, ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getExpertAssessList'> & { index: number }
 
 /** 给分板 */
@@ -301,7 +315,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 66 - 53
src/modules/expert/expert/index.vue

@@ -8,20 +8,23 @@
       <!-- <el-button class="m-l-base m-r-auto" size="small" type="primary" @click="onEditScore">修改给分</el-button> -->
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="currentExpertPaper" class="absolute mark-score">{{ currentExpertPaper.score }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="currentExpertPaper" class="absolute mark-score">{{ currentExpertPaper.score }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <!-- <scoring-panel-with-confirm
           v-model:visible="editScoreVisible"
           v-model:score="modelScore"
           modal
@@ -30,43 +33,48 @@
           :main-number="currentExpertPaper?.mainNumber"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          v-model:visible="editScoreVisible"
-          v-model:score="modelScore"
-          modal
-          :auto-visible="false"
-          :main-number="currentExpertPaper?.mainNumber"
-          :subject-code="formModel.subjectCode"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'72px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">{{ paperType }}: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData?.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-          ></base-table>
-        </div>
-      </div>
+          <scoring-panel-with-confirm
+            v-model:visible="editScoreVisible"
+            v-model:score="modelScore"
+            modal
+            :auto-visible="false"
+            :main-number="currentExpertPaper?.mainNumber"
+            :subject-code="formModel.subjectCode"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'72px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">{{ paperType }}: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData?.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentExpertPaper?.filePath"></image-preview>
@@ -96,7 +104,13 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams, ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getExpertPickList'> & { index: number }
 const ROLE_OPTION = ref<any[]>([])
 useFetch('getAllRoleList')
@@ -378,7 +392,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 67 - 54
src/modules/expert/sample/index.vue

@@ -8,20 +8,23 @@
       <!-- <el-button class="m-l-base m-r-auto" size="small" type="primary" @click="onEditScore">修改给分</el-button> -->
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="currentRfPaper" class="absolute mark-score">{{ currentRfPaper.score }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="currentRfPaper" class="absolute mark-score">{{ currentRfPaper.score }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <!-- <scoring-panel-with-confirm
           v-model:visible="editScoreVisible"
           v-model:score="modelScore"
           modal
@@ -30,44 +33,49 @@
           :main-number="currentRfPaper?.mainNumber"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          v-model:visible="editScoreVisible"
-          v-model:score="modelScore"
-          modal
-          :auto-visible="false"
-          :main-number="currentRfPaper?.mainNumber"
-          :subject-code="formModel.subjectCode"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">RF卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+          <scoring-panel-with-confirm
+            v-model:visible="editScoreVisible"
+            v-model:score="modelScore"
+            modal
+            :auto-visible="false"
+            :main-number="currentRfPaper?.mainNumber"
+            :subject-code="formModel.subjectCode"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">RF卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentRfPaper?.filePath"></image-preview>
@@ -96,7 +104,13 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams, ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getRfSampleList'> & { index: number }
 
 /** 给分板 */
@@ -282,7 +296,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 50 - 39
src/modules/expert/standard/index.vue

@@ -4,44 +4,50 @@
       <el-button class="m-l-base m-r-auto" size="small" type="primary" @click="onTransformToSample">转为样卷</el-button>
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div class="flex flex-1 direction-column radius-base fill-blank mark-content">
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="currentStandardPaper" class="absolute mark-score">{{ currentStandardPaper.score }}</p>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane max-size="80" :size="paneSize" class="flex flex-1 direction-column radius-base fill-blank mark-content">
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="currentStandardPaper" class="absolute mark-score">{{ currentStandardPaper.score }}</p>
 
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank scroll-auto m-l-base table-view">
-        <base-form ref="formRef" size="small" :model="formModel" :items="formItems" :label-width="'52px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">标准卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-          ></base-table>
-        </div>
-      </div>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank scroll-auto m-l-base table-view"
+        >
+          <base-form ref="formRef" size="small" :model="formModel" :items="formItems" :label-width="'52px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">标准卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentStandardPaper?.filePath"></image-preview>
@@ -68,7 +74,13 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn, EpFormRules } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getStandardList'> & { index: number }
 
 /** 图片预览 */
@@ -250,7 +262,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 57 - 44
src/modules/expert/training/index.vue

@@ -6,48 +6,56 @@
       @click="onOperationClick"
     ></mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="current" class="absolute mark-score">{{ current.score }}</p>
-
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">培训卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-          ></base-table>
-        </div>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="current" class="absolute mark-score">{{ current.score }}</p>
+
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">培训卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="current?.filePath"></image-preview>
@@ -74,7 +82,13 @@ import SvgIcon from '@/components/common/SvgIcon.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getSampleList'> & { index: number }
 
 /** 图片预览 */
@@ -237,7 +251,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 74 - 61
src/modules/marking/arbitration/index.vue

@@ -6,58 +6,66 @@
       @click="onOperationClick"
     ></mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-          <p v-if="currentArbitration" class="absolute mark-score">
-            {{ currentArbitration.markScore }}
-          </p>
-        </div>
-        <scoring-panel-with-confirm
-          :id="currentArbitration?.taskId"
-          v-model:visible="scoringPanelVisible"
-          v-model:score="modelScore"
-          :main-number="currentArbitration?.mainNumber"
-          :subject-code="formModel.subjectCode"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'72px'">
-          <template #form-item-search>
-            <el-button :disabled="loading" :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">仲裁卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-y-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+            <p v-if="currentArbitration" class="absolute mark-score">
+              {{ currentArbitration.markScore }}
+            </p>
+          </div>
+          <scoring-panel-with-confirm
+            :id="currentArbitration?.taskId"
+            v-model:visible="scoringPanelVisible"
+            v-model:score="modelScore"
+            :main-number="currentArbitration?.mainNumber"
+            :subject-code="formModel.subjectCode"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'72px'">
+            <template #form-item-search>
+              <el-button :disabled="loading" :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">仲裁卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-y-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentArbitration?.filePath"></image-preview>
@@ -92,7 +100,13 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiParams, ExtractMultipleApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 const {
   rotate,
   scale,
@@ -210,16 +224,16 @@ const formItems = computed<EpFormItem[]>(() => [
 
 const columns: EpTableColumn[] = [
   { label: '密号', prop: 'secretNumber', minWidth: 110, fixed: 'left' },
-  { label: '客观分', prop: 'objectiveScore', minWidth: 60 },
-  { label: '组员给分', prop: 'markerScore', minWidth: 70 },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 80, sortable: true },
+  { label: '组员给分', prop: 'markerScore', minWidth: 95, sortable: true },
   { label: '组员', prop: 'markerName', minWidth: 90 },
-  { label: '组员客主比', prop: 'markerRatio', minWidth: 90 },
-  { label: '小组长给分', prop: 'deputyScore', minWidth: 90 },
+  { label: '组员客主比', prop: 'markerRatio', minWidth: 110, sortable: true },
+  { label: '小组长给分', prop: 'deputyScore', minWidth: 110, sortable: true },
   { label: '小组长', prop: 'deputyName', minWidth: 90 },
-  { label: '小组长客主比', prop: 'deputyRatio', minWidth: 98 },
-  { label: '大组长给分', prop: 'chiefScore', minWidth: 90 },
+  { label: '小组长客主比', prop: 'deputyRatio', minWidth: 125, sortable: true },
+  { label: '大组长给分', prop: 'chiefScore', minWidth: 110, sortable: true },
   { label: '大组长', prop: 'chiefName', minWidth: 90 },
-  { label: '大组长客主比', prop: 'chiefRatio', minWidth: 98 },
+  { label: '大组长客主比', prop: 'chiefRatio', minWidth: 125, sortable: true },
 ]
 
 const { fetch: getArbitrationList, result: arbitrationList, loading } = useFetch('getArbitrationList')
@@ -297,7 +311,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 83 - 71
src/modules/marking/inquiry-result/index.vue

@@ -13,22 +13,25 @@
       >
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-          <p v-if="current" class="absolute mark-score">
-            {{ current.markScore }}
-          </p>
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+            <p v-if="current" class="absolute mark-score">
+              {{ current.markScore }}
+            </p>
+          </div>
+          <!-- <scoring-panel-with-confirm
           v-model:visible="editScoreVisible"
           v-model:score="modelScore"
           :main-number="current?.mainNumber"
@@ -37,51 +40,56 @@
           :auto-visible="false"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          v-model:visible="editScoreVisible"
-          v-model:score="modelScore"
-          :main-number="current?.mainNumber"
-          :subject-code="query.subjectCode"
-          modal
-          :auto-visible="false"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <div class="flex items-center justify-between detail-info-table-header">
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">自定义抽查卷共:</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ pagination.total }}</span>
-          </el-button>
-          <el-pagination
-            v-bind="pagination"
-            v-model:current-page="currentPage"
-            size="small"
-            class="m-t-unset"
-            background
-            right
-            hide-on-single-page
-            :pager-count="3"
-            small
-          ></el-pagination>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            v-bind="pagination"
-            highlight-current-row
-            :data="tableData"
-            :columns="columns"
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+          <scoring-panel-with-confirm
+            v-model:visible="editScoreVisible"
+            v-model:score="modelScore"
+            :main-number="current?.mainNumber"
+            :subject-code="query.subjectCode"
+            modal
+            :auto-visible="false"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <div class="flex items-center justify-between detail-info-table-header">
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">自定义抽查卷共:</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ pagination.total }}</span>
+            </el-button>
+            <el-pagination
+              v-bind="pagination"
+              v-model:current-page="currentPage"
+              size="small"
+              class="m-t-unset"
+              background
+              right
+              hide-on-single-page
+              :pager-count="3"
+              small
+            ></el-pagination>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              v-bind="pagination"
+              highlight-current-row
+              :data="tableData"
+              :columns="columns"
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="current?.filePath"></image-preview>
@@ -134,11 +142,16 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
 import SendBackMark from '@/components/shared/SendBackMark.vue'
 import SecNumberStatus from '@/components/common/secNumberStatus.vue'
-
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn, EpFormItem } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getCustomQueryTasks'> & { index: number }
 
 const { query } = useRoute()
@@ -238,13 +251,13 @@ const columns: EpTableColumn<RowType>[] = [
     },
   },
   { label: '评卷员', prop: 'markerName', minWidth: 90 },
-  { label: '评卷员给分', prop: 'markerScore', minWidth: 88 },
-  { label: '组长给分', prop: 'headerScore', minWidth: 70 },
-  { label: '客观分', prop: 'objectiveScore', minWidth: 70 },
-  { label: '客主比', prop: 'ratio', minWidth: 70 },
-  { label: '成绩', prop: 'markScore', minWidth: 70 },
+  { label: '评卷员给分', prop: 'markerScore', minWidth: 108, sortable: true },
+  { label: '组长给分', prop: 'headerScore', minWidth: 94, sortable: true },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 90, sortable: true },
+  { label: '客主比', prop: 'ratio', minWidth: 90, sortable: true },
+  { label: '成绩', prop: 'markScore', minWidth: 90, sortable: true },
   { label: '评卷时间', prop: 'markTime', minWidth: 130 },
-  { label: '抽查次数', prop: 'customCheckNumber', minWidth: 70 },
+  { label: '抽查次数', prop: 'customCheckNumber', minWidth: 94, sortable: true },
 ]
 
 const transTime = (str: any) => {
@@ -276,7 +289,7 @@ const transformQuery = (query: Record<string, string>) => {
 const { pagination, currentPage, data, fetchTable } = useTable(
   'getCustomQueryTasks',
   transformQuery(query as Record<string, string>),
-  { pageSize: 50 }
+  { pageSize: 100 }
 )
 
 const {
@@ -448,7 +461,6 @@ onRefresh()
   // }
   .table-view {
     // width: 620px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 13 - 3
src/modules/marking/mark/index.vue

@@ -74,7 +74,8 @@
           <el-radio label="DIM">扫描图片不清晰</el-radio>
         </div>
       </el-radio-group>
-      <el-radio v-show="problemClass === 'similar'" model-value="similar" label="similar">提交雷同</el-radio>
+      <!-- <el-radio v-show="problemClass === 'similar'" model-value="similar" label="similar">提交雷同</el-radio> -->
+      <el-radio v-show="problemClass === 'similar'" v-model="similarType" label="similar">提交雷同</el-radio>
     </div>
     <template #footer>
       <div class="flex items-center justify-between">
@@ -283,8 +284,9 @@ const problemVisible = ref<boolean>(false)
 /** 问题卷 | 雷同卷   */
 const problemClass = ref<'problem' | 'similar'>('problem')
 /** 问题卷类型 */
-const problemType = ref<ProblemType>('OVERSTEP')
-
+// const problemType = ref<ProblemType>('OVERSTEP')
+const problemType = ref<any>('')
+const similarType = ref<any>('')
 /** 分数列表 */
 const modelScore = ref<number[]>([])
 
@@ -360,6 +362,14 @@ const onSubmitProblem = async () => {
 
 /** 提交问题卷 & 雷同卷 */
 const onConfirmSubmitProblem = async () => {
+  if (problemClass.value === 'problem' && !problemType.value) {
+    ElMessage.error('请选择问题卷类型')
+    return
+  }
+  if (problemClass.value === 'similar' && !similarType.value) {
+    ElMessage.error('请选择雷同卷类型')
+    return
+  }
   try {
     if (!currentTask.value) {
       return

+ 71 - 58
src/modules/marking/problem/index.vue

@@ -19,58 +19,66 @@
       >
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="currentProblem" class="absolute mark-score">{{ currentProblem.markScore }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <div v-show="showScoreBoard">
-          <scoring-panel-with-confirm
-            :id="currentProblem?.taskId"
-            v-model:visible="scoringPanelVisible"
-            v-model:score="modelScore"
-            :main-number="currentProblem?.mainNumber"
-            :subject-code="formModel.subjectCode"
-            @submit="onSubmit"
-          ></scoring-panel-with-confirm>
-        </div>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'78px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">问题卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="currentProblem" class="absolute mark-score">{{ currentProblem.markScore }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <div v-show="showScoreBoard">
+            <scoring-panel-with-confirm
+              :id="currentProblem?.taskId"
+              v-model:visible="scoringPanelVisible"
+              v-model:score="modelScore"
+              :main-number="currentProblem?.mainNumber"
+              :subject-code="formModel.subjectCode"
+              @submit="onSubmit"
+            ></scoring-panel-with-confirm>
+          </div>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'78px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">问题卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentProblem?.filePath"></image-preview>
@@ -107,7 +115,13 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiParams, ExtractApiResponse, ExtractMultipleApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getProblemHistory'> & { index: number }
 
 const {
@@ -257,10 +271,10 @@ const columns: EpTableColumn[] = [
   { label: '密号', prop: 'secretNumber', minWidth: 110, fixed: 'left' },
   { label: '提交人', prop: 'markerName', minWidth: 75 },
   { label: '问题类型', prop: 'problemTypeName', minWidth: 90 },
-  { label: '客观分', prop: 'objectiveScore', minWidth: 64 },
-  { label: '主观分', prop: 'markScore', minWidth: 64 },
-  { label: '客主比', prop: 'markRatio', minWidth: 64 },
-  { label: '成绩', prop: 'markScore', minWidth: 55 },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 84, sortable: true },
+  { label: '主观分', prop: 'markScore', minWidth: 84, sortable: true },
+  { label: '客主比', prop: 'markRatio', minWidth: 84, sortable: true },
+  { label: '成绩', prop: 'markScore', minWidth: 75, sortable: true },
   { label: '评卷时间', prop: 'markTime', minWidth: 130 },
   { label: '处理人', prop: 'headerName', minWidth: 75 },
   { label: '处理时间', prop: 'solveTime', minWidth: 160 },
@@ -348,7 +362,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 480px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 70 - 57
src/modules/marking/repeat/index.vue

@@ -16,56 +16,64 @@
       </el-button>
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="currentReMarkPaper" class="absolute mark-score">{{ currentReMarkPaper.markScore }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <scoring-panel-with-confirm
-          :id="currentReMarkPaper?.taskId"
-          v-model:visible="scoringPanelVisible"
-          v-model:score="modelScore"
-          :main-number="currentReMarkPaper?.mainNumber"
-          :subject-code="formModel.subjectCode"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'80px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">重评卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="currentReMarkPaper" class="absolute mark-score">{{ currentReMarkPaper.markScore }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <scoring-panel-with-confirm
+            :id="currentReMarkPaper?.taskId"
+            v-model:visible="scoringPanelVisible"
+            v-model:score="modelScore"
+            :main-number="currentReMarkPaper?.mainNumber"
+            :subject-code="formModel.subjectCode"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'80px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">重评卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentReMarkPaper?.filePath"></image-preview>
@@ -100,7 +108,13 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiParams, ExtractMultipleApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getReMarkPaperList'> & { index: number }
 
 const {
@@ -218,14 +232,14 @@ const formItems = computed<EpFormItem[]>(() => [
 const columns: EpTableColumn[] = [
   { label: '密号', prop: 'secretNumber', minWidth: 110, fixed: 'left' },
   { label: '评卷员', prop: 'markerName', minWidth: 80 },
-  { label: '给分', prop: 'markerScore', minWidth: 54 },
+  { label: '给分', prop: 'markerScore', minWidth: 74, sortable: true },
   // { label: '重评时间', prop: 'reMarkTime', width: 160 },
 
   { label: '确认状态', prop: 'confirmName', minWidth: 72 },
-  { label: '确认给分', prop: 'confirmScore', minWidth: 72 },
-  { label: '客观分', prop: 'objectiveScore', minWidth: 72 },
-  { label: '客主比', prop: 'ratio', minWidth: 72 },
-  { label: '成绩', prop: 'markScore', minWidth: 72 },
+  { label: '确认给分', prop: 'confirmScore', minWidth: 96, sortable: true },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 92, sortable: true },
+  { label: '客主比', prop: 'ratio', minWidth: 92, sortable: true },
+  { label: '成绩', prop: 'markScore', minWidth: 92, sortable: true },
   { label: '重评时间', prop: 'reMarkTime', minWidth: 130 },
 ]
 
@@ -319,7 +333,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 480px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 51 - 38
src/modules/marking/similar/index.vue

@@ -6,43 +6,49 @@
       <el-button class="m-l-base m-r-auto" size="small" type="primary" custom-1 @click="onExport"> 导出 </el-button>
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div class="flex flex-1 direction-column mark-content">
-        <right-button class="next-button" @click="checkNext" />
-        <div ref="imgWrap1" class="flex-1 p-base scroll-auto radius-base fill-blank mark-content-paper">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <div ref="imgWrap2" class="flex-1 p-base m-t-base scroll-auto radius-base fill-blank mark-content-paper">
-          <img :src="dataUrlSame" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div>
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">雷同卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane max-size="80" :size="paneSize" class="flex flex-1 direction-column mark-content">
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div ref="imgWrap1" class="flex-1 p-base scroll-auto radius-base fill-blank mark-content-paper">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <div ref="imgWrap2" class="flex-1 p-base m-t-base scroll-auto radius-base fill-blank mark-content-paper">
+            <img :src="dataUrlSame" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div>
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">雷同卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <mark-history-list
@@ -72,6 +78,14 @@ import MarkHeader from '@/components/shared/MarkHeader.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
+
 const imgWrap1 = ref()
 const imgWrap2 = ref()
 type RowType = ExtractMultipleApiResponse<'getSimilarPaperList'> & { index: number }
@@ -252,7 +266,6 @@ const { drawing: drawingSame, dataUrl: dataUrlSame } = useSetImgBg(sameImgOption
   }
   .table-view {
     // width: 580px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 42 - 29
src/modules/marking/training-record/index.vue

@@ -6,32 +6,40 @@
       @click="onOperationClick"
     ></mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-          <p v-if="current" class="absolute mark-score">{{ current?.markScore }}</p>
-        </div>
-      </div>
-      <div class="p-base radius-base fill-blank scroll-auto m-l-base table-view">
-        <base-table
-          ref="tableRef"
-          border
-          stripe
-          size="small"
-          height="100%"
-          :data="tableData"
-          :columns="columns"
-          highlight-current-row
-          :cell-style="{ padding: '6px 0' }"
-          @current-change="onCurrentChange"
-          @row-dblclick="onDbClick"
-        ></base-table>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+            <p v-if="current" class="absolute mark-score">{{ current?.markScore }}</p>
+          </div>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="p-base radius-base fill-blank scroll-auto m-l-base table-view"
+        >
+          <base-table
+            ref="tableRef"
+            border
+            stripe
+            size="small"
+            height="100%"
+            :data="tableData"
+            :columns="columns"
+            highlight-current-row
+            :cell-style="{ padding: '6px 0' }"
+            @current-change="onCurrentChange"
+            @row-dblclick="onDbClick"
+          ></base-table>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <mark-history-list
@@ -57,7 +65,13 @@ import RightButton from '@/components/shared/RightButton.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractArrayValue<ExtractApiResponse<'viewTrainingRecord'>> & { index: number }
 
 const {
@@ -119,7 +133,7 @@ const columns: EpTableColumn<RowType>[] = [
     },
   },
 ]
-
+//该接口貌似是返回全量,不需要pageSize
 const { fetch: viewTrainingRecord, result: trainingRecordList } = useFetch('viewTrainingRecord')
 
 const {
@@ -170,7 +184,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
   }
 }
 </style>

+ 40 - 26
src/modules/marking/view-sample/index.vue

@@ -14,30 +14,38 @@
       </div>
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-          <p v-if="current" class="absolute mark-score">{{ current?.score }}</p>
-        </div>
-      </div>
-      <div class="p-base radius-base fill-blank scroll-auto m-l-base table-view">
-        <base-table
-          ref="tableRef"
-          border
-          stripe
-          size="small"
-          :data="tableData"
-          :columns="columns"
-          highlight-current-row
-          :cell-style="{ padding: '6px 0' }"
-          @current-change="onCurrentChange"
-        ></base-table>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap relative">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+            <p v-if="current" class="absolute mark-score">{{ current?.score }}</p>
+          </div>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="p-base radius-base fill-blank scroll-auto m-l-base table-view"
+        >
+          <base-table
+            ref="tableRef"
+            border
+            stripe
+            size="small"
+            :data="tableData"
+            :columns="columns"
+            highlight-current-row
+            :cell-style="{ padding: '6px 0' }"
+            @current-change="onCurrentChange"
+          ></base-table>
+        </pane>
+      </splitpanes>
     </div>
   </div>
 </template>
@@ -59,7 +67,13 @@ import RightButton from '@/components/shared/RightButton.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractArrayValue<ExtractApiResponse<'viewSamplePaper'>> & { index: number }
 
 const {
@@ -114,6 +128,7 @@ const columns: EpTableColumn<RowType>[] = [
 ]
 const { fetch: viewSamplePaper, result: samplePaperList } = useFetch('viewSamplePaper')
 
+//该接口貌似是返回全量,不需要pageSize
 const { tableRef, tableData, current, next: checkNext, onCurrentChange } = useTableCheck(samplePaperList)
 
 viewSamplePaper()
@@ -153,7 +168,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 580px;
-    width: 35%;
   }
 }
 </style>

+ 89 - 75
src/modules/monitor/system-check/index.vue

@@ -11,22 +11,25 @@
       </template>
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-          <p v-if="currentSystemCheckPaper" class="absolute mark-score">
-            {{ currentSystemCheckPaper.headerScore ?? currentSystemCheckPaper.markerScore }}
-          </p>
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+            <p v-if="currentSystemCheckPaper" class="absolute mark-score">
+              {{ currentSystemCheckPaper.headerScore ?? currentSystemCheckPaper.markerScore }}
+            </p>
+          </div>
+          <!-- <scoring-panel-with-confirm
           :id="currentSystemCheckPaper?.taskId"
           v-model:visible="scoringPanelVisible"
           v-model:score="modelScore"
@@ -36,56 +39,62 @@
           :main-number="currentSystemCheckPaper?.mainNumber"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          :id="currentSystemCheckPaper?.taskId"
-          v-model:visible="scoringPanelVisible"
-          v-model:score="modelScore"
-          modal
-          :auto-visible="false"
-          :main-number="currentSystemCheckPaper?.mainNumber"
-          :subject-code="formModel.subjectCode"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div v-loading="loading" class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
-          <template #form-item-search>
-            <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-          </template>
-        </base-form>
-        <div class="flex items-center justify-between detail-info-table-header">
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">系统抽查卷: 共</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ total }}</span>
-          </el-button>
-          <el-pagination
-            v-bind="pagination"
-            v-model:current-page="currentPage"
-            size="small"
-            class="m-t-unset"
-            background
-            right
-            hide-on-single-page
-            :pager-count="3"
-            small
-          ></el-pagination>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+          <scoring-panel-with-confirm
+            :id="currentSystemCheckPaper?.taskId"
+            v-model:visible="scoringPanelVisible"
+            v-model:score="modelScore"
+            modal
+            :auto-visible="false"
+            :main-number="currentSystemCheckPaper?.mainNumber"
+            :subject-code="formModel.subjectCode"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          v-loading="loading"
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
+            <template #form-item-search>
+              <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+            </template>
+          </base-form>
+          <div class="flex items-center justify-between detail-info-table-header">
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">系统抽查卷: 共</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ total }}</span>
+            </el-button>
+            <el-pagination
+              v-bind="pagination"
+              v-model:current-page="currentPage"
+              size="small"
+              class="m-t-unset"
+              background
+              right
+              hide-on-single-page
+              :pager-count="3"
+              small
+            ></el-pagination>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentSystemCheckPaper?.filePath"></image-preview>
@@ -131,7 +140,13 @@ import SecNumberStatus from '@/components/common/secNumberStatus.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiParams } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 const {
   rotate,
   scale,
@@ -303,13 +318,13 @@ const columns: EpTableColumn[] = [
     },
   },
   { label: '评卷员', prop: 'markerName', minWidth: 80 },
-  { label: '评卷员给分', prop: 'markerScore', minWidth: 88 },
-  { label: '组长给分', prop: 'headerScore', minWidth: 70 },
+  { label: '评卷员给分', prop: 'markerScore', minWidth: 108, sortable: true },
+  { label: '组长给分', prop: 'headerScore', minWidth: 94, sortable: true },
   // { label: '评卷时间', prop: 'markTime', width: 160 },
-  { label: '客观分', prop: 'objectiveScore', minWidth: 70 },
-  { label: '客主比', prop: 'ratio', minWidth: 70 },
-  { label: '成绩', prop: 'markScore', minWidth: 70 },
-  { label: '抽查次数', prop: 'checkCount', minWidth: 70 },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 90, sortable: true },
+  { label: '客主比', prop: 'ratio', minWidth: 90, sortable: true },
+  { label: '成绩', prop: 'markScore', minWidth: 90, sortable: true },
+  { label: '抽查次数', prop: 'checkCount', minWidth: 94, sortable: true },
   { label: '评卷时间', prop: 'markTime', minWidth: 130 },
 ]
 
@@ -318,7 +333,7 @@ const { fetch: getSystemCheckLevel, result: levelOptions } = useFetch('getSystem
 getSystemCheckLevel()
 
 const { pagination, currentPage, data, fetchTable, loading, total } = useTable('getSystemSpotList', formModel, {
-  pageSize: 50,
+  pageSize: 100,
 })
 const {
   tableRef,
@@ -400,7 +415,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 480px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

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

@@ -7,43 +7,51 @@
     >
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="current" class="absolute mark-score">{{ current.markScore }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <div class="flex items-center justify-between detail-info-table-header">
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">{{ PaperType }}共:</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ monitorDetail?.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="current" class="absolute mark-score">{{ current.markScore }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <div class="flex items-center justify-between detail-info-table-header">
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">{{ PaperType }}共:</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ monitorDetail?.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="current?.filePath"></image-preview>
@@ -74,7 +82,13 @@ import SecNumberStatus from '@/components/common/secNumberStatus.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractApiResponse<'getTrainingMonitorDetail'> & { index: number }
 
 const { query } = useRoute()
@@ -152,7 +166,7 @@ const columns: EpTableColumn<RowType>[] = [
   { label: '评卷员', prop: 'markerName', minWidth: 60 },
   { label: '评卷时间', prop: 'markTime', width: 130 },
 ]
-
+//该接口貌似返回的全量,不需要pageSize
 const { fetch: getTrainingMonitorDetail, result: trainingMonitorDetail } = useFetch('getTrainingMonitorDetail')
 const { fetch: getAssessMonitorDetail, result: assessMonitorDetail } = useFetch('getAssessMonitorDetail')
 
@@ -220,7 +234,6 @@ fetchData()
   }
   .table-view {
     // width: 480px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 64 - 51
src/modules/quality/self-check-detail/index.vue

@@ -9,20 +9,23 @@
       <el-button class="m-l-base m-r-auto" size="small" type="primary" @click="onSendBack">打回</el-button>
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="current" class="absolute mark-score">{{ current.markerScore }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="current" class="absolute mark-score">{{ current.markerScore }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <!-- <scoring-panel-with-confirm
           :id="current?.taskId"
           v-model:visible="editScoreVisible"
           v-model:score="modelScore"
@@ -32,40 +35,45 @@
           :auto-visible="false"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          :id="current?.taskId"
-          v-model:visible="editScoreVisible"
-          v-model:score="modelScore"
-          :main-number="current?.mainNumber"
-          :subject-code="query.subjectCode"
-          modal
-          :auto-visible="false"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
-        <div class="flex items-center justify-between detail-info-table-header">
-          <el-button custom-1 size="small" class="detail-info-label">
-            <span class="">自查卷共:</span>
-            <span class="m-l-extra-small detail-info-label-num">{{ selfCheckDataDetail?.length }}</span>
-          </el-button>
-        </div>
-        <div class="flex-1 scroll-auto m-t-mini">
-          <base-table
-            ref="tableRef"
-            border
-            stripe
-            size="small"
-            height="100%"
-            :data="tableData"
-            :columns="columns"
-            highlight-current-row
-            :cell-style="{ padding: '6px 0' }"
-            @current-change="onCurrentChange"
-            @row-dblclick="onDbClick"
-          ></base-table>
-        </div>
-      </div>
+          <scoring-panel-with-confirm
+            :id="current?.taskId"
+            v-model:visible="editScoreVisible"
+            v-model:score="modelScore"
+            :main-number="current?.mainNumber"
+            :subject-code="query.subjectCode"
+            modal
+            :auto-visible="false"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="flex direction-column p-base radius-base fill-blank m-l-base table-view"
+        >
+          <div class="flex items-center justify-between detail-info-table-header">
+            <el-button custom-1 size="small" class="detail-info-label">
+              <span class="">自查卷共:</span>
+              <span class="m-l-extra-small detail-info-label-num">{{ selfCheckDataDetail?.length }}</span>
+            </el-button>
+          </div>
+          <div class="flex-1 scroll-auto m-t-mini">
+            <base-table
+              ref="tableRef"
+              border
+              stripe
+              size="small"
+              height="100%"
+              :data="tableData"
+              :columns="columns"
+              highlight-current-row
+              :cell-style="{ padding: '6px 0' }"
+              @current-change="onCurrentChange"
+              @row-dblclick="onDbClick"
+            ></base-table>
+          </div>
+        </pane>
+      </splitpanes>
     </div>
   </div>
 
@@ -105,7 +113,13 @@ import SendBackMark from '@/components/shared/SendBackMark.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiParams, ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
-
+import { Splitpanes, Pane } from 'splitpanes'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractApiResponse<'getSelfCheckDataDetail'> & { index: number }
 
 const { query } = useRoute()
@@ -190,7 +204,7 @@ const columns: EpTableColumn<RowType>[] = [
   { label: '自查分', prop: 'selfScore' },
   { label: '评卷时间', prop: 'markTime', width: 130 },
 ]
-
+//该接口貌似是返回全量,不需要pageSize
 const {
   tableRef,
   tableData,
@@ -259,7 +273,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
   }
   .table-view {
     // width: 480px;
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 93 - 81
src/modules/quality/subjective-check/index.vue

@@ -9,20 +9,23 @@
       <el-button type="primary" size="small" class="m-l-base m-r-auto" @click="onConfirm">提交确认</el-button>
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
-      <div
-        class="flex flex-1 direction-column radius-base fill-blank mark-content"
-        :class="{ 'text-center': center }"
-        :style="{ 'background-color': backgroundColor }"
-      >
-        <span class="preview" @click="onPreview">
-          <svg-icon name="preview"></svg-icon>
-        </span>
-        <p v-if="currentSubjectiveCheck" class="absolute mark-score">{{ currentSubjectiveCheck.markScore }}</p>
-        <right-button class="next-button" @click="checkNext" />
-        <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
-          <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
-        </div>
-        <!-- <scoring-panel-with-confirm
+      <splitpanes class="default-theme" style="height: 100%" @resize="setPaneSize">
+        <pane
+          max-size="80"
+          :size="paneSize"
+          class="flex flex-1 direction-column radius-base fill-blank mark-content"
+          :class="{ 'text-center': center }"
+          :style="{ 'background-color': backgroundColor }"
+        >
+          <span class="preview" @click="onPreview">
+            <svg-icon name="preview"></svg-icon>
+          </span>
+          <p v-if="currentSubjectiveCheck" class="absolute mark-score">{{ currentSubjectiveCheck.markScore }}</p>
+          <!-- <right-button class="next-button" @click="checkNext" /> -->
+          <div class="flex-1 p-base scroll-auto mark-content-paper img-wrap">
+            <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+          </div>
+          <!-- <scoring-panel-with-confirm
           :id="currentSubjectiveCheck?.taskId"
           v-model:visible="editScoreVisible"
           v-model:score="modelScore"
@@ -32,53 +35,57 @@
           :auto-visible="false"
           @submit="onSubmit"
         ></scoring-panel-with-confirm> -->
-        <scoring-panel-with-confirm
-          :id="currentSubjectiveCheck?.taskId"
-          v-model:visible="editScoreVisible"
-          v-model:score="modelScore"
-          :main-number="currentSubjectiveCheck?.mainNumber"
-          :subject-code="formModel.subjectCode"
-          modal
-          :auto-visible="false"
-          @submit="onSubmit"
-        ></scoring-panel-with-confirm>
-      </div>
-      <div class="p-base radius-base fill-blank scroll-auto m-l-base table-view">
-        <splitpanes class="default-theme" horizontal style="height: 100%">
-          <pane max-size="100" size="70" style="display: flex; flex-direction: column">
-            <base-form
-              size="small"
-              :model="formModel"
-              :items="formItems"
-              :label-width="'80px'"
-              style="margin-top: 20px"
-            >
-              <template #form-item-search>
-                <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
-              </template>
-            </base-form>
-            <div class="m-b-mini">
-              <el-button custom-1 size="small" class="detail-info-label">
-                <span class="">{{ statusText }}: 共</span>
-                <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
-              </el-button>
-            </div>
-            <div class="flex-1 scroll-auto">
-              <base-table
-                ref="tableRef"
-                height="100%"
-                border
-                stripe
+          <scoring-panel-with-confirm
+            :id="currentSubjectiveCheck?.taskId"
+            v-model:visible="editScoreVisible"
+            v-model:score="modelScore"
+            :main-number="currentSubjectiveCheck?.mainNumber"
+            :subject-code="formModel.subjectCode"
+            modal
+            :auto-visible="false"
+            @submit="onSubmit"
+          ></scoring-panel-with-confirm>
+        </pane>
+        <pane
+          max-size="80"
+          :size="100 - paneSize"
+          class="p-base radius-base fill-blank scroll-auto m-l-base table-view"
+        >
+          <splitpanes class="default-theme" horizontal style="height: 100%">
+            <pane max-size="100" size="70" style="display: flex; flex-direction: column">
+              <base-form
                 size="small"
-                :data="tableData"
-                :columns="columns"
-                highlight-current-row
-                @current-change="onCurrentChange"
-              ></base-table>
-            </div>
-          </pane>
-          <pane max-size="100" size="30">
-            <!-- <base-table
+                :model="formModel"
+                :items="formItems"
+                :label-width="'80px'"
+                style="margin-top: 20px"
+              >
+                <template #form-item-search>
+                  <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+                </template>
+              </base-form>
+              <div class="m-b-mini">
+                <el-button custom-1 size="small" class="detail-info-label">
+                  <span class="">{{ statusText }}: 共</span>
+                  <span class="m-l-extra-small detail-info-label-num">{{ tableData.length }}</span>
+                </el-button>
+              </div>
+              <div class="flex-1 scroll-auto">
+                <base-table
+                  ref="tableRef"
+                  height="100%"
+                  border
+                  stripe
+                  size="small"
+                  :data="tableData"
+                  :columns="columns"
+                  highlight-current-row
+                  @current-change="onCurrentChange"
+                ></base-table>
+              </div>
+            </pane>
+            <pane max-size="100" size="30">
+              <!-- <base-table
               v-if="currentSubjectiveCheck"
               border
               stripe
@@ -92,24 +99,25 @@
             >
               <template #empty> 暂无数据 </template>
             </base-table> -->
-            <div v-if="currentSubjectiveCheck" style="height: 100%">
-              <div class="bottom-title">给分记录( {{ currentSubjectiveCheck?.secretNumber }} )</div>
-              <base-table
-                border
-                stripe
-                class="m-t-base"
-                size="small"
-                height="calc(100% - 20px)"
-                :data="currentHistoryData"
-                :columns="currentHistoryColumns"
-                :cell-style="{ padding: '6px 0' }"
-              >
-                <template #empty> 暂无数据 </template>
-              </base-table>
-            </div>
-          </pane>
-        </splitpanes>
-      </div>
+              <div v-if="currentSubjectiveCheck" style="height: 100%">
+                <div class="bottom-title">给分记录( {{ currentSubjectiveCheck?.secretNumber }} )</div>
+                <base-table
+                  border
+                  stripe
+                  class="m-t-base"
+                  size="small"
+                  height="calc(100% - 20px)"
+                  :data="currentHistoryData"
+                  :columns="currentHistoryColumns"
+                  :cell-style="{ padding: '6px 0' }"
+                >
+                  <template #empty> 暂无数据 </template>
+                </base-table>
+              </div>
+            </pane>
+          </splitpanes>
+        </pane>
+      </splitpanes>
     </div>
   </div>
 
@@ -146,8 +154,13 @@ import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
 import { Splitpanes, Pane } from 'splitpanes'
-import 'splitpanes/dist/splitpanes.css'
-
+// import 'splitpanes/dist/splitpanes.css'
+import { setPaneSize } from '@/utils/common'
+import useMainStore from '@/store/main'
+const mainStore = useMainStore()
+const paneSize = computed(() => {
+  return mainStore.paneSizeConfig[location.pathname] || 60
+})
 type RowType = ExtractMultipleApiResponse<'getSubjectiveCheckList'> & { index: number }
 
 const { fetch: getMarkScoreHistoryListWithTask, result: scoreHistoryList } = useFetch('getMarkScoreHistoryListWithTask')
@@ -431,7 +444,6 @@ const { drawing, dataUrl } = useSetImgBg(imgOption, frontColor, setFrontColor)
       color: #000;
       margin-top: 10px;
     }
-    width: 35%;
     .detail-info-label {
       .detail-info-label-num {
         min-width: 32px;

+ 15 - 0
src/store/main.ts

@@ -16,6 +16,8 @@ interface MainStoreState {
   lockScreenStatus: boolean
   keepAliveViews: any[]
   globalLoading: boolean
+  paneSizeConfig: any
+  showRowNextBottomDialog: boolean
 }
 
 interface MainStoreActions {
@@ -28,6 +30,8 @@ interface MainStoreActions {
   setKeepAliveViews: (name: string) => void
   cutKeepAliveViews: (name: string) => void
   setGlobalLoading: (name: boolean) => void
+  setPaneSizeConfig: (path: string, size: number) => void
+  setRowNextBottomDialogStatus: (bool: boolean) => void
 }
 
 const useMainStore = defineStore<'main', MainStoreState, Record<string, any>, MainStoreActions>('main', {
@@ -52,9 +56,20 @@ const useMainStore = defineStore<'main', MainStoreState, Record<string, any>, Ma
       lockScreenStatus: sessionStorage.get('lockScreenStatus') == '1' ? true : false,
       keepAliveViews: ['MainLayout'],
       globalLoading: false,
+      paneSizeConfig: localStorage.getItem('paneSizeConfig')
+        ? JSON.parse(localStorage.getItem('paneSizeConfig') as string)
+        : {},
+      showRowNextBottomDialog: false,
     }
   },
   actions: {
+    setRowNextBottomDialogStatus(bool: boolean) {
+      this.showRowNextBottomDialog = bool
+    },
+    setPaneSizeConfig(path: string, size: number) {
+      this.paneSizeConfig[path] = size
+      localStorage.setItem('paneSizeConfig', JSON.stringify(this.paneSizeConfig))
+    },
     setGlobalLoading(bool) {
       this.globalLoading = bool
     },

+ 6 - 0
src/utils/common.ts

@@ -1,3 +1,4 @@
+import useMainStore from '@/store/main'
 import Big from 'big.js'
 /**
  * @description 是否被定义
@@ -288,3 +289,8 @@ export const myColorList = [
   '#4A766E',
   '#9F5F9F',
 ]
+
+export const setPaneSize = (e: any) => {
+  const mainStore = useMainStore()
+  mainStore.setPaneSizeConfig(location.pathname, e[0].size)
+}