瀏覽代碼

feat: 评卷进度调整

zhangjie 2 天之前
父節點
當前提交
0bcaef1eac
共有 4 個文件被更改,包括 91 次插入5 次删除
  1. 5 0
      src/api/mark.ts
  2. 2 0
      src/api/types/mark.ts
  3. 7 0
      src/hooks/table.ts
  4. 77 5
      src/views/mark/MarkProgress.vue

+ 5 - 0
src/api/mark.ts

@@ -181,3 +181,8 @@ export function getMarkStatList(
 ): Promise<MarkStatListPageRes> {
   return axios.post('/api/mark/stat/list', {}, { params });
 }
+
+// 关闭科目
+export function markSubjectClose(subjectIds: number[]): Promise<boolean> {
+  return axios.post('/api/mark/subject/close', {}, { params: { subjectIds } });
+}

+ 2 - 0
src/api/types/mark.ts

@@ -284,6 +284,8 @@ export interface MarkStatInfo {
 
 // 评卷进度统计列表:科目	选做异常	上传人数	主观总分	分组总数	完成进度	待复核量
 export interface MarkStatItem {
+  // 科目ID
+  courseId: number;
   // 科目
   courseName: string;
   // 选做异常

+ 7 - 0
src/hooks/table.ts

@@ -8,6 +8,7 @@ export default function useTable<T extends Record<string, any>>(
 ) {
   const dataList = ref<T[]>([]);
   const loading = ref(false);
+  const selectedRows = ref<T[]>([]);
   const pagination = reactive({
     pageNumber: 1,
     pageSize: 20,
@@ -53,14 +54,20 @@ export default function useTable<T extends Record<string, any>>(
     toPage(page);
   }
 
+  const handleSelectionChange = (selection: T[]) => {
+    selectedRows.value = selection;
+  };
+
   return {
     loading,
     dataList,
     pagination,
+    selectedRows,
     getRowIndex,
     getList,
     toPage,
     pageSizeChange,
     deletePageLastItem,
+    handleSelectionChange,
   };
 }

+ 77 - 5
src/views/mark/MarkProgress.vue

@@ -30,13 +30,40 @@
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-space wrap>
+          <el-button type="primary" @click="toPage(1)">查询</el-button>
+          <el-button
+            type="primary"
+            :loading="closeLoading"
+            @click="onCloseSubject"
+            >关闭</el-button
+          >
+
+          <el-dropdown @command="onExportCommand">
+            <el-button type="primary">
+              导出
+              <el-icon class="el-icon--right"><ArrowDown /> </el-icon>
+            </el-button>
+            <template #dropdown>
+              <el-dropdown-menu>
+                <el-dropdown-item command="fhy">整体评卷进度</el-dropdown-item>
+                <el-dropdown-item command="fhy">评卷员工作量</el-dropdown-item>
+              </el-dropdown-menu>
+            </template>
+          </el-dropdown>
+        </el-space>
       </el-form-item>
     </el-form>
   </div>
 
   <div class="part-box">
-    <el-table class="page-table" :data="dataList" :loading="loading">
+    <el-table
+      class="page-table"
+      :data="dataList"
+      :loading="loading"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" />
       <el-table-column property="courseName" label="科目" min-width="200" />
       <el-table-column label="选做异常" min-width="100">
         <template #default="scope">
@@ -83,13 +110,21 @@
 
 <script setup lang="ts">
   import { reactive, ref, computed, onMounted } from 'vue';
-  import { getMarkStatInfo, getMarkStatList } from '@/api/mark';
+  import { ElMessage } from 'element-plus';
+  import {
+    getMarkStatInfo,
+    getMarkStatList,
+    markSubjectClose,
+  } from '@/api/mark';
   import {
     MarkStatInfo,
     MarkStatItem,
     MarkStatListFilter,
   } from '@/api/types/mark';
   import useTable from '@/hooks/table';
+  import useLoading from '@/hooks/loading';
+  import { modalConfirm } from '@/utils/ui';
+
   import Chart from '@/components/chart/index.vue';
 
   defineOptions({
@@ -101,8 +136,15 @@
     progress: null,
   });
 
-  const { dataList, pagination, loading, toPage, pageSizeChange } =
-    useTable<MarkStatItem>(getMarkStatList, searchModel, false);
+  const {
+    dataList,
+    pagination,
+    loading,
+    selectedRows,
+    toPage,
+    pageSizeChange,
+    handleSelectionChange,
+  } = useTable<MarkStatItem>(getMarkStatList, searchModel, false);
 
   // 统计信息
   const statInfo = ref<MarkStatInfo>({
@@ -192,6 +234,36 @@
     ],
   }));
 
+  // 关闭科目
+  const { loading: closeLoading, setLoading } = useLoading();
+  async function onCloseSubject() {
+    if (!selectedRows.value.length) {
+      ElMessage.warning('请选择科目');
+      return;
+    }
+    const confirm = await modalConfirm('确认关闭所选科目吗?', '提示 ').catch(
+      () => false
+    );
+    if (!confirm) return;
+
+    try {
+      setLoading(true);
+      const ids = selectedRows.value.map((item) => item.courseId);
+      await markSubjectClose(ids);
+      ElMessage.success('关闭成功');
+      toPage(1);
+    } catch (error) {
+      console.error('关闭科目失败:', error);
+    } finally {
+      setLoading(false);
+    }
+  }
+
+  // 导出
+  const onExportCommand = (command: string) => {
+    console.log('导出命令:', command);
+  };
+
   // 获取统计信息
   async function getStatInfo() {
     try {