Przeglądaj źródła

feat: 修复类型错误

chenhao 2 lat temu
rodzic
commit
7455adebbc

+ 1 - 1
.env.production

@@ -1 +1 @@
-VITE_APP_API_HOST = '/'
+VITE_APP_API_HOST = 'http://192.168.10.41:7201'

+ 2 - 2
electron-plugin.ts

@@ -5,13 +5,13 @@ const useElectronPlugin: () => PluginOption = () =>
   VitePluginELectron({
     main: {
       entry: 'electron/main/main',
-      build: { outDir: 'dist/electron/main', emptyOutDir: true },
       publicDir: 'electron/main/public',
+      build: { outDir: 'dist/electron/main', emptyOutDir: true },
     },
     preload: {
       entry: 'electron/preload/preload',
-      build: { outDir: 'dist/electron/preload', emptyOutDir: true },
       publicDir: 'electron/preload/public',
+      build: { outDir: 'dist/electron/preload', emptyOutDir: true },
     },
   })
 

+ 5 - 5
electron/main/main.ts

@@ -1,4 +1,4 @@
-import { app, BrowserWindow, clipboard, screen } from 'electron'
+import { app, BrowserWindow, clipboard, dialog, screen } from 'electron'
 import { resolve } from 'path'
 import installDevTool, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
 import path from 'path'
@@ -18,7 +18,7 @@ async function createWindow() {
     transparent: true,
     show: true,
     webPreferences: {
-      preload: path.join(__dirname, '../preload/preload'),
+      // preload: path.join(__dirname, '../preload/preload'),
     },
   })
   loadingView.loadFile(resolve(__dirname, 'loading.html'))
@@ -41,11 +41,11 @@ async function createWindow() {
       devTools: true,
       nodeIntegration: false,
       contextIsolation: true,
-      webSecurity: false,
+      webSecurity: true,
       experimentalFeatures: true,
       navigateOnDragDrop: false,
       disableHtmlFullscreenWindowResize: false,
-      preload: path.join(__dirname, '../preload/preload'),
+      // preload: path.join(__dirname, '../preload/preload'),
     },
   })
 
@@ -63,7 +63,7 @@ async function createWindow() {
   })
 
   if (app.isPackaged) {
-    mainWin.loadFile(resolve(__dirname, '../index.html'))
+    mainWin.loadFile(resolve(__dirname, '../../web/index.html'))
   } else {
     installDevTool(VUEJS_DEVTOOLS)
     process.env.WEB_DEV_INDEX_URL && mainWin.loadURL(process.env.WEB_DEV_INDEX_URL)

+ 4 - 1
package.json

@@ -3,7 +3,10 @@
   "private": true,
   "version": "0.0.1",
   "description": "CET阅卷系统",
-  "main": "dist/main/main.js",
+  "author": {
+    "name": "启明泰和"
+  },
+  "main": "dist/electron/main/main.js",
   "scripts": {
     "start": "vite",
     "start:web": "cross-env ONLY_WEB=1 vite",

+ 1 - 1
src/components/shared/MarkHistoryList.vue

@@ -35,7 +35,7 @@ const props = withDefaults(
   }
 )
 
-const visible = useVModel(props)
+const visible = useVModel(props, 'modelValue')
 
 const LessRenderComponent = defineComponent({
   name: 'LessRender',

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

@@ -78,7 +78,7 @@ const onSendBack = async () => {
     }
     const valid = await elFormRef?.value?.validate()
     if (valid) {
-      await ApiMap[props.type]({ description: model.description, reason: model.reason, id: props.id, taskId: props.id })
+      await ApiMap[props.type]({ description: model.description, reason: model.reason, id: props.id })
     }
     visible.value = false
     emits('rejected')

+ 1 - 1
src/hooks/useVModel.ts

@@ -2,7 +2,7 @@ import { getCurrentInstance, ref, watch } from 'vue'
 
 const useVModel = <T extends Record<string, any>, K extends keyof T>(props: T, key: K = 'modelValue' as K) => {
   const instance = getCurrentInstance()
-  const prop = ref(props[key])
+  const prop = ref<T[K]>(props[key])
   const event = `update:${key as string}`
   if (instance) {
     watch(

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

@@ -76,8 +76,8 @@ import BaseTable from '@/components/element/BaseTable.vue'
 import MarkHistoryList from '@/components/shared/MarkHistoryList.vue'
 import RightButton from '@/components/shared/RightButton.vue'
 import SvgIcon from '@/components/common/SvgIcon.vue'
-import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
 import ImagePreview from '@/components/shared/ImagePreview.vue'
+import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
 
 import MockImg from '@/assets/mock/SAMPA-1.jpg'
 

+ 204 - 0
src/modules/marking/inquiry-result/index.vue

@@ -0,0 +1,204 @@
+<template>
+  <div class="flex direction-column full">
+    <mark-header :exclude-operations="['remark', 'problem', 'example', 'delete']" @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 :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
+        </div>
+      </div>
+      <div class="p-base radius-base fill-blank scroll-auto 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="pagination.currentPage"
+            size="small"
+            class="m-t-unset"
+            background
+            right
+            :hide-on-single-page="false"
+          ></el-pagination>
+        </div>
+        <base-table
+          ref="tableRef"
+          size="small"
+          v-bind="pagination"
+          :data="tableData"
+          :columns="columns"
+          @current-change="onCurrentChange"
+          @row-dblclick="onDbClick"
+        ></base-table>
+      </div>
+    </div>
+  </div>
+  <image-preview v-model="previewModalVisible" :url="MockImg"></image-preview>
+  <mark-history-list :id="currentViewHistory?.taskId" v-model="visibleHistory" type="secret"></mark-history-list>
+</template>
+
+<script setup lang="ts" name="MarkingInquiryResult">
+/** 自定义查询结果 */
+import { reactive, ref, computed } from 'vue'
+import { useRoute } from 'vue-router'
+import { ElButton, ElPagination } from 'element-plus'
+import { useSetImgBg } from '@/hooks/useSetImgBg'
+import useFetch from '@/hooks/useFetch'
+import useTable from '@/hooks/useTable'
+import useTableCheck from '@/hooks/useTableCheck'
+import useMarkHeader from '@/hooks/useMarkHeader'
+import MarkHeader from '@/components/shared/MarkHeader.vue'
+import BaseTable from '@/components/element/BaseTable.vue'
+import MarkHistoryList from '@/components/shared/MarkHistoryList.vue'
+import RightButton from '@/components/shared/RightButton.vue'
+import SvgIcon from '@/components/common/SvgIcon.vue'
+import ImagePreview from '@/components/shared/ImagePreview.vue'
+
+import MockImg from '@/assets/mock/SAMPA-1.jpg'
+import type { SetImgBgOption } from '@/hooks/useSetImgBg'
+import type { ExtractMultipleApiResponse, ExtractApiParams, ExtractApiResponse } from 'api-type'
+import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
+
+type RowType = ExtractMultipleApiResponse<'getCustomQueryTasks'> & { index: number }
+
+const { query } = useRoute()
+
+/** 图片预览 */
+const previewModalVisible = ref<boolean>(false)
+
+const mockTask = ref<{ mainNumber: number }>({
+  mainNumber: 1,
+})
+
+const {
+  rotate,
+  scale,
+  center,
+  frontColor,
+  backgroundColor,
+  onBack,
+  onScaleChange,
+  onCenter,
+  onRotate,
+  setBackgroundColor,
+  setFrontColor,
+  onViewStandard,
+} = useMarkHeader()
+
+const imgOption = computed<SetImgBgOption>(() => {
+  return {
+    image: MockImg,
+    immediate: true,
+    rotate: rotate.value,
+    scale: scale.value,
+  }
+})
+
+const { drawing, dataUrl } = useSetImgBg(imgOption)
+
+/** 刷新 */
+const onRefresh = () => {
+  fetchTable()
+}
+
+/** 预览试卷 */
+const onPreview = () => {
+  previewModalVisible.value = true
+}
+
+type OperationClick = MarkHeaderInstance['onClick']
+
+type OperationType = Parameters<Exclude<OperationClick, undefined>>[0]['type']
+
+const operationHandles: Partial<Record<OperationType, (...args: any) => void>> = {
+  back: onBack,
+  'scale-change': onScaleChange,
+  center: onCenter,
+  rotate: onRotate,
+  'front-color': setFrontColor,
+  'background-color': setBackgroundColor,
+  refresh: onRefresh,
+  standard: onViewStandard,
+}
+
+const onOperationClick: OperationClick = ({ type, value }) => {
+  operationHandles[type]?.(value)
+}
+
+const columns: EpTableColumn<RowType>[] = [
+  { label: '评卷员', prop: 'markerName' },
+  { label: '密号', prop: 'secretNumber' },
+  { label: '给分', prop: 'markerScore' },
+  { label: '客观分', prop: 'objectiveScore' },
+  { label: '客主比', prop: 'markerRatio' },
+  { label: '评卷时间', prop: 'markTime' },
+]
+
+const { pagination, data, fetchTable } = useTable('getCustomQueryTasks', {
+  // score: (query.score as string) || '',
+  ...query,
+})
+
+const {
+  tableRef,
+  tableData,
+  current,
+  currentView: currentViewHistory,
+  next: checkNext,
+  visibleHistory,
+  onDbClick,
+  onCurrentChange,
+} = useTableCheck(data)
+
+console.log(query)
+
+const { fetch: getCustomQueryTasks, result: customQueryTasks } = useFetch('getCustomQueryTasks')
+</script>
+
+<style scoped lang="scss">
+.mark-container {
+  .mark-content {
+    position: relative;
+    .preview {
+      position: absolute;
+      cursor: pointer;
+      top: 10px;
+      right: 20px;
+      font-size: 24px;
+    }
+    .next-button {
+      position: absolute;
+      right: -20px;
+      top: 300px;
+    }
+    .mark-content-paper {
+      img {
+        max-width: 100%;
+      }
+    }
+  }
+  .table-view {
+    width: 580px;
+    .detail-info-label {
+      .detail-info-label-num {
+        width: 32px;
+        height: 24px;
+        line-height: 24px;
+        background: #00987b;
+        border-radius: 4px;
+      }
+    }
+  }
+}
+</style>

+ 19 - 7
src/modules/marking/inquiry/index.vue

@@ -27,8 +27,10 @@
 <script setup lang="ts" name="MarkingInquiry">
 /** 阅卷-自定义查询 */
 import { computed, reactive, ref, watch } from 'vue'
+import { useRouter } from 'vue-router'
 import { ElButton, ElInput } from 'element-plus'
 import { omit } from 'lodash-es'
+import { typeOf, isDefine } from '@/utils/common'
 import BaseForm from '@/components/element/BaseForm.vue'
 import BaseDialog from '@/components/element/BaseDialog.vue'
 import BaseSelect from '@/components/element/BaseSelect.vue'
@@ -41,6 +43,8 @@ import useVW from '@/hooks/useVW'
 import type { EpFormItem } from 'global-type'
 import type { ExtractApiParams } from 'api-type'
 
+const { push } = useRouter()
+
 const shortQueryConfig = ref<ExtractApiParams<'setCustomQueryConfig'>['params']>()
 
 const { defineColumn, _ } = useForm()
@@ -75,7 +79,6 @@ watch(dataModel, () => {
 })
 
 const { fetch: getCustomQueryConfigList, result: customQueryConfigList } = useFetch('getCustomQueryConfigList')
-const { fetch: getCustomQueryTasks, result: customQueryTasks } = useFetch('getCustomQueryTasks')
 const { fetch: setCustomQueryConfig, loading: saving } = useFetch('setCustomQueryConfig')
 const { fetch: getMarkerList, result: markerList } = useFetch('getMarkerList')
 
@@ -205,15 +208,24 @@ const items = computed<EpFormItem[]>(() => [
   },
 ])
 
+function getSearchParams(obj: Record<string, string | number | boolean>) {
+  let params: Record<string, string> = {}
+  for (let k in obj) {
+    params[k] = `${obj[k]}`
+  }
+  return params
+}
+
 /** 抽查 */
 const onSearch = async () => {
   try {
-    await getCustomQueryTasks({
-      ...omit(model, 'time'),
-      timeStart: model.time?.[0],
-      timeEnd: model.time?.[1],
-      pageNumber: 1,
-      pageSize: 10,
+    push({
+      name: 'MarkingInquiryResult',
+      query: getSearchParams({
+        ...omit(model, 'time'),
+        timeStart: model.time?.[0],
+        timeEnd: model.time?.[1],
+      }),
     })
   } catch (error) {
     console.error(error)

+ 10 - 0
src/router/marking.ts

@@ -183,6 +183,16 @@ const markingRoutes: RouteRecordRaw[] = [
       menuId: 'marking-system_check',
     },
   },
+  {
+    name: 'MarkingInquiryResult',
+    path: '/inquiry-result',
+    component: () => import('@/modules/marking/inquiry-result/index.vue'),
+    meta: {
+      label: '自定义查询结果页',
+      menu: false,
+      menuId: 'marking-inquiry_result',
+    },
+  },
 ]
 
 export default markingRoutes

+ 9 - 9
src/store/layout.ts

@@ -23,15 +23,15 @@ export function getMenuRotes() {
   const tempRoutes = router.getRoutes()
 
   /** 给后端配置权限的菜单路由 */
-  // console.log(
-  //   tempRoutes
-  //     .filter((route) => !route.path.startsWith('/example') && route.meta.menu)
-  //     .map((_) => ({
-  //       name: _.name,
-  //       path: _.path,
-  //       label: _.meta.label,
-  //     }))
-  // )
+  console.log(
+    tempRoutes
+      .filter((route) => !route.path.startsWith('/example') && route.meta.menu)
+      .map((_) => ({
+        name: _.name,
+        path: _.path,
+        label: _.meta.label,
+      }))
+  )
 
   const routesMap = tempRoutes
     .map((_, i) => _.meta?.menuId + '-' + i)

+ 1 - 1
types/api.d.ts

@@ -1226,7 +1226,7 @@ declare module 'api-type' {
     type MarkSelfCheckData = BaseDefine<{ taskId?: number; scores: number[] }>
 
     /** 质量统计-自查数据打回 */
-    type RejectSelfCheckData = BaseDefine<{ taskId?: number; reason: string; description: string }>
+    type RejectSelfCheckData = BaseDefine<{ id?: number; reason: string; description: string }>
 
     /** 质量分析- 抽查情况统计 */
     interface StatisticCheckInfo {