zhangjie 1 неделя назад
Родитель
Сommit
2bdc6dc4c7

+ 38 - 4
src/api/mark.ts

@@ -9,6 +9,7 @@ import {
   MarkArbitrationListPageParam,
   MarkTaskListPageRes,
   MarkTaskListPageParam,
+  MarkTaskListFilter,
   MarkTrialListPageRes,
   MarkTrialListPageParam,
   MarkMarkerListPageParam,
@@ -100,14 +101,47 @@ export function exportArbitrationList(
 export function getMarkTaskList(
   params: MarkTaskListPageParam
 ): Promise<MarkTaskListPageRes> {
-  return axios.post('/api/mark/task/list', {}, { params });
+  return axios.post('/api/admin/exam/library/list', {}, { params });
+}
+
+// 获取待复核任务数
+export function getMarkInspectedTaskCount(
+  params: MarkTaskListFilter
+): Promise<number> {
+  return axios.post('/api/admin/exam/library/inspected/count', {}, { params });
+}
+
+// 评卷员任务指定
+export function markTaskAssign({
+  libraryId,
+  marker,
+}: {
+  libraryId: number;
+  marker: string;
+}): Promise<boolean> {
+  return axios.post(
+    '/api/admin/exam/library/assigned',
+    {},
+    { params: { libraryId, marker } }
+  );
+}
+
+// 任务导出
+export function exportMarkTaskList(
+  params: MarkTaskListFilter
+): Promise<AxiosResponse<Blob>> {
+  return axios.post(
+    '/api/admin/exam/library/export',
+    {},
+    { params, responseType: 'blob' }
+  );
 }
 
-// 任务打回
-export function markTaskReject(
+// 任务打回or重置
+export function markTaskRejectOrReset(
   params: MarkRejectResetTaskParam
 ): Promise<boolean> {
-  return axios.post('/api/mark/task/reject', {}, { params });
+  return axios.post('/api/admin/exam/library/reject', {}, { params });
 }
 
 // 试评管理

+ 3 - 0
src/utils/download-export.ts

@@ -36,6 +36,7 @@ import {
   exportQualityMonitorList,
   exportGroupArbitrateStatList,
   exportArbitrationList,
+  exportMarkTaskList,
 } from '@/api/mark';
 
 import useLoading from '@/hooks/loading';
@@ -112,6 +113,8 @@ const downloadConfig = {
   exportQualityMonitorList,
   // 导出仲裁列表
   exportArbitrationList,
+  // 导出任务列表
+  exportMarkTaskList,
 };
 type DownloadType = keyof typeof downloadConfig;
 

+ 2 - 2
src/views/analysis/BigQuestionAnalysis.vue

@@ -7,7 +7,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -85,7 +85,7 @@
       false
     );
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportBigQuestionAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/analysis/ClassAnalysis.vue

@@ -15,7 +15,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -82,7 +82,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<ClassAnalysisItem>(getClassAnalysisList, searchModel, false);
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportClassAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/analysis/CollegeAnalysis.vue

@@ -15,7 +15,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -85,7 +85,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<CollegeAnalysisItem>(getCollegeAnalysisList, searchModel, false);
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportCollegeAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/analysis/ObjectiveQuestionAnalysis.vue

@@ -19,7 +19,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -93,7 +93,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<QuestionAnalysisItem>(getQuestionAnalysisList, searchModel, false);
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportQuestionAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/analysis/SegmentAnalysis.vue

@@ -24,7 +24,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -93,7 +93,7 @@
     return '#67c23a';
   }
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportSegmentAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/analysis/SubjectiveQuestionAnalysis.vue

@@ -7,7 +7,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -80,7 +80,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<QuestionAnalysisItem>(getQuestionAnalysisList, searchModel, false);
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportQuestionAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/analysis/TeacherAnalysis.vue

@@ -15,7 +15,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -94,7 +94,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<TeacherAnalysisItem>(getTeacherAnalysisList, searchModel, false);
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportTeacherAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/analysis/TotalAnalysis.vue

@@ -7,7 +7,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -79,7 +79,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<TotalAnalysisItem>(getTotalAnalysisList, searchModel, false);
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportTotalAnalysisList', searchModel);
   }
 </script>

+ 2 - 2
src/views/check/ImageCheck.vue

@@ -33,7 +33,7 @@
     <div class="part-action">
       <el-space wrap>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
         <el-button type="success" @click="startCheck">开始检查</el-button>
       </el-space>
     </div>
@@ -89,7 +89,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<ImageCheckDataListItem>(getImageCheckDataList, searchModel, false);
 
-  function exportData() {
+  function onExport() {
     ElMessage.info('导出功能待实现');
   }
 

+ 2 - 2
src/views/issue-paper/IssuePaper.vue

@@ -51,7 +51,7 @@
         <el-button :disabled="selectedRows.length === 0" @click="batchReset">
           批量重置
         </el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
       </el-space>
     </div>
   </div>
@@ -203,7 +203,7 @@
     }
   }
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportIssuePaper', searchModel);
   }
 

+ 2 - 2
src/views/log/LogManage.vue

@@ -37,7 +37,7 @@
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
       </el-form-item>
     </el-form>
   </div>
@@ -94,7 +94,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<LogItem>(getLogList, searchModel, false);
 
-  function exportData() {
+  function onExport() {
     downloadExport('exportLog', searchModel);
   }
 </script>

+ 20 - 29
src/views/mark/TaskManage.vue

@@ -107,9 +107,9 @@
     <el-divider class="form-divider" />
     <div class="part-action">
       <el-space wrap>
-        <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <!--TODO: 待复核数量 -->
-        <el-button @click="onExport">待复核:0</el-button>
+        <el-button type="primary" @click="search">查询</el-button>
+        <el-button @click="onExport">导出</el-button>
+        <el-button @click="onReview">待复核:{{ inspectedCount }}</el-button>
       </el-space>
     </div>
 
@@ -130,12 +130,7 @@
       />
       <el-table-column prop="examNumber" label="准考证号" width="150" />
       <el-table-column prop="secretNumber" label="密号" width="120" />
-      <el-table-column label="状态" width="100" sortable>
-        <template #default="scope">
-          <el-tag :type="getStatusType(scope.row.status)" size="small">
-            {{ getStatusText(scope.row.status) }}
-          </el-tag>
-        </template>
+      <el-table-column prop="statusText" label="状态" width="100" sortable>
       </el-table-column>
       <el-table-column
         prop="rejectReason"
@@ -223,9 +218,10 @@
 <script setup lang="ts">
   import { reactive, ref } from 'vue';
   import { ElMessage } from 'element-plus';
-  import { getMarkTaskList } from '@/api/mark';
+  import { getMarkInspectedTaskCount, getMarkTaskList } from '@/api/mark';
   import { MarkTaskItem, MarkTaskListFilter } from '@/api/types/mark';
   import useTable from '@/hooks/table';
+  import { downloadExport } from '@/utils/download-export';
 
   import RejectTaskDialog from './components/RejectTaskDialog.vue';
 
@@ -259,24 +255,15 @@
     handleSortChange,
   } = useTable<MarkTaskItem>(getMarkTaskList, searchModel, false);
 
-  // 获取状态类型
-  function getStatusType(status: string) {
-    const statusMap: Record<string, string> = {
-      pending: 'warning',
-      completed: 'success',
-      rejected: 'danger',
-    };
-    return statusMap[status] || 'info';
+  async function search() {
+    await toPage(1);
+    await getInspectedCount();
   }
 
-  // 获取状态文本
-  function getStatusText(status: string) {
-    const statusMap: Record<string, string> = {
-      pending: '待评卷',
-      completed: '已评卷',
-      rejected: '已打回',
-    };
-    return statusMap[status] || status;
+  const inspectedCount = ref(0);
+  async function getInspectedCount() {
+    const count = await getMarkInspectedTaskCount(searchModel);
+    inspectedCount.value = count;
   }
 
   // 查看详情
@@ -291,8 +278,12 @@
     rejectTaskDialogRef.value?.show();
   }
 
-  function onExport() {
-    // TODO: 导出任务
-    ElMessage.info('导出任务');
+  async function onExport() {
+    await downloadExport('exportMarkTaskList', searchModel);
+  }
+
+  function onReview() {
+    // TODO: 待复核任务
+    ElMessage.info('待复核任务');
   }
 </script>

+ 2 - 2
src/views/mark/components/RejectTaskDialog.vue

@@ -58,7 +58,7 @@
   import { ElMessage } from 'element-plus';
   import type { MarkRejectTaskParam } from '@/api/types/mark';
   import type { RejectTypeItem } from '@/api/types/reject';
-  import { markTaskReject } from '@/api/mark';
+  import { markTaskRejectOrReset } from '@/api/mark';
   import { getRejectTypeList } from '@/api/reject';
   import useModal from '@/hooks/modal';
   import useLoading from '@/hooks/loading';
@@ -116,7 +116,7 @@
     setLoading(true);
     const datas = objAssign(formModel, {});
     let res = true;
-    await markTaskReject(datas).catch(() => {
+    await markTaskRejectOrReset(datas).catch(() => {
       res = false;
     });
     setLoading(false);

+ 2 - 2
src/views/mark/quality-monitor/QualityMonitorGroup.vue

@@ -9,7 +9,7 @@
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
       </el-form-item>
     </el-form>
     <el-divider class="form-divider" />
@@ -114,7 +114,7 @@
   );
 
   // 导出功能
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportGroupArbitrateStatList', searchModel);
   }
 </script>

+ 2 - 2
src/views/mark/quality-monitor/QualityMonitorMarker.vue

@@ -28,7 +28,7 @@
           >重新计算</el-button
         >
         <el-button @click="onViewScoreCurve">给分曲线</el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
       </el-space>
     </div>
 
@@ -164,7 +164,7 @@
   }
 
   // 导出功能
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportQualityMonitorList', searchModel);
   }
 </script>

+ 2 - 2
src/views/reject/RejectRecord.vue

@@ -47,7 +47,7 @@
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
       </el-form-item>
     </el-form>
   </div>
@@ -108,7 +108,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<RejectItem>(getRejectRecordList, searchModel, false);
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportRejectRecord', searchModel);
   }
 </script>

+ 2 - 2
src/views/reject/RejectStatistics.vue

@@ -11,7 +11,7 @@
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
       </el-form-item>
     </el-form>
   </div>
@@ -113,7 +113,7 @@
     return `${(rate * 100).toFixed(1)}%`;
   }
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportRejectStat', searchModel);
   }
 </script>

+ 2 - 2
src/views/scan/ScanCourseStats.vue

@@ -15,7 +15,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -106,7 +106,7 @@
     ).toFixed(2)}%`;
   }
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportScanStatByCourse', searchModel);
   }
 </script>

+ 2 - 2
src/views/scan/ScanPointStats.vue

@@ -8,7 +8,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -95,7 +95,7 @@
     ).toFixed(2)}%`;
   }
 
-  async function exportData() {
+  async function onExport() {
     await downloadExport('exportScanStatByPoint', searchModel);
   }
 </script>

+ 2 - 2
src/views/score/ScoreQuery.vue

@@ -132,7 +132,7 @@
       <el-form-item>
         <el-space wrap>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
-          <el-button @click="exportData">导出</el-button>
+          <el-button @click="onExport">导出</el-button>
         </el-space>
       </el-form-item>
     </el-form>
@@ -251,7 +251,7 @@
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<ScoreItem>(getScoreList, searchModel, false);
 
-  function exportData() {
+  function onExport() {
     // TODO: 实现导出功能
     console.log('导出成绩数据');
   }

+ 2 - 2
src/views/student/StudentManage.vue

@@ -177,7 +177,7 @@
             </el-dropdown-menu>
           </template>
         </el-dropdown>
-        <el-button @click="exportData">导出</el-button>
+        <el-button @click="onExport">导出</el-button>
       </el-space>
 
       <table-field v-model="headFields" :fields="tableFields"></table-field>
@@ -555,7 +555,7 @@
   };
 
   // 导出
-  function exportData() {
+  function onExport() {
     downloadExport('exportStudent', searchModel);
   }
 </script>