Prechádzať zdrojové kódy

feat: 结果导出接口调试

zhangjie 9 mesiacov pred
rodič
commit
5408e5b2ef

+ 16 - 0
pnpm-lock.yaml

@@ -49,6 +49,7 @@ specifiers:
   vite: ^4.4.9
   vue: ^3.4.32
   vue-echarts: ^7.0.0-beta.0
+  vue-request: ^2.0.4
   vue-router: ^4.2.4
   vue-tsc: ^2.1.4
   wait-on: ^7.0.1
@@ -74,6 +75,7 @@ dependencies:
   v3-drag-zoom: 1.1.20_typescript@5.5.4
   vue: 3.5.0_typescript@5.5.4
   vue-echarts: 7.0.3_echarts@5.5.1+vue@3.5.0
+  vue-request: 2.0.4_vue@3.5.0
   vue-router: 4.4.3_vue@3.5.0
 
 devDependencies:
@@ -7976,6 +7978,20 @@ packages:
       - '@vue/composition-api'
     dev: false
 
+  /vue-request/2.0.4_vue@3.5.0:
+    resolution: {integrity: sha512-+Tu5rDy6ItF9UdD21Mmbjiq5Pq6NZSN9juH72hNQTMn1whHh4KZPTKWVLK2YS4nzbuEnPs+82G91AA2Fgd93mg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^2.0.0 || >=3.0.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+    dependencies:
+      vue: 3.5.0_typescript@5.5.4
+      vue-demi: 0.14.10_vue@3.5.0
+    dev: false
+
   /vue-router/4.4.3_vue@3.5.0:
     resolution: {integrity: sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==}
     peerDependencies:

+ 3 - 3
src/render/ap/absentCheck.ts

@@ -38,7 +38,7 @@ export const absentCheckStudentExport = (
     url: "/api/admin/check/exam-status/student/export",
     method: "post",
     data,
-    responseType: "blob",
+    download: true,
   });
 
 // 按考场导出缺考校验
@@ -49,7 +49,7 @@ export const absentCheckRoomExport = (
     url: "/api/admin/check/exam-status/exam-room/export",
     method: "post",
     data,
-    responseType: "blob",
+    download: true,
   });
 
 // 缺考校验导入模版
@@ -58,7 +58,7 @@ export const absentTemplateDownload = (): Promise<AxiosResponse<Blob>> =>
     url: "/api/admin/check/exam-status/template",
     method: "post",
     data,
-    responseType: "blob",
+    download: true,
   });
 
 // 缺考校验导入进度

+ 7 - 5
src/render/ap/base.ts

@@ -2,20 +2,22 @@ import { request } from "@/utils/request";
 import { ExamParams } from "./types/common";
 import {
   SubjectItem,
+  ExamListParams,
+  ExamListResult,
   UploadSheetParams,
   UploadSliceParams,
   UploadFileResult,
 } from "./types/base";
 
-export const subjectList = (data: ExamParams): Promise<SubjectItem[]> =>
+export const getExamList = (data: ExamListParams): Promise<ExamListResult> =>
   request({
-    url: "/api/admin/course/list",
-    method: "post",
+    url: "/api/admin/exam/list",
     data,
   });
-export const examList = (): Promise<Exam[]> =>
+
+export const getSubjectList = (data: ExamParams): Promise<SubjectItem[]> =>
   request({
-    url: "/api/admin/course/list",
+    url: "/api/admin/subject/list",
     method: "post",
     data,
   });

+ 2 - 2
src/render/ap/dataCheck.ts

@@ -28,7 +28,7 @@ export const dataCheckStudentExport = (
     url: "/api/admin/scan/answer/student/export",
     method: "post",
     data,
-    responseType: "blob",
+    download: true,
   });
 
 // 按考场导出答题卡扫描详情
@@ -39,7 +39,7 @@ export const dataCheckRoomExport = (
     url: "/api/admin/scan/answer/exam-room/export",
     method: "post",
     data,
-    responseType: "blob",
+    download: true,
   });
 
 // 按类型修改卷型、识别结果等

+ 13 - 7
src/render/ap/resultExport.ts

@@ -19,7 +19,7 @@ import {
 // 违纪导入
 export const breachList = (data: ExamParams): Promise<BreachListItem[]> =>
   request({
-    url: "/api/admin/subject/breach/page",
+    url: "/api/admin/subject/breach/list",
     method: "post",
     data,
   });
@@ -29,7 +29,7 @@ export const breachTemplateDownload = (): Promise<AxiosResponse<Blob>> =>
     url: "/api/admin/student/breach/template",
     method: "post",
     data: {},
-    responseType: "blob",
+    download: true,
   });
 
 // 考生状态
@@ -47,7 +47,7 @@ export const statusTemplateDownload = (): Promise<AxiosResponse<Blob>> =>
     url: "/api/admin/student/cust-status/template",
     method: "post",
     data: {},
-    responseType: "blob",
+    download: true,
   });
 
 // 评卷点
@@ -55,7 +55,7 @@ export const markSiteListPage = (
   data: ExamPageParams
 ): Promise<MarkSiteListPageResult> =>
   request({
-    url: "/api/admin/subject/cust-status/list",
+    url: "/api/admin/mark-site/page",
     method: "post",
     data,
   });
@@ -86,9 +86,7 @@ export const markSiteCodeSet = (
     data,
   });
 
-export const markSiteCodeInfo = (
-  data: ExamParams
-): Promise<{ scanSite: string }> =>
+export const markSiteCodeInfo = (data: ExamParams): Promise<string> =>
   request({
     url: "/api/admin/exam/scan-site",
     method: "post",
@@ -123,3 +121,11 @@ export const dbfExportProgress = (
     method: "post",
     data: { taskId },
   });
+
+export const dbfExportTaskDownload = (taskId: string): Promise<blob> =>
+  request({
+    url: "/api/admin/subject/data/down",
+    method: "post",
+    data: { taskId },
+    download: true,
+  });

+ 1 - 1
src/render/ap/review.ts

@@ -72,5 +72,5 @@ export const reviewWarningTaskExport = (
     url: "/api/admin/check/assigned/export",
     method: "post",
     data,
-    responseType: "blob",
+    download: true,
   });

+ 13 - 7
src/render/ap/types/base.ts

@@ -1,14 +1,20 @@
+import { PageParams, PageResult } from "./common";
+
 export interface SubjectItem {
+  code: string;
+  name: string;
+}
+
+export interface ExamItem {
   id: number;
-  subjectCode: string;
-  subjectName: string;
+  name: string;
+  mode: string;
+  enable: boolean;
+  updateTime: number;
 }
 
-// export interface ExamItem {
-//   id: number;
-//   name: string;
-//   mode: string;
-// }
+export type ExamListParams = PageParams<{ enable: boolean }>;
+export type ExamListResult = PageResult<ExamItem>;
 
 export interface UploadSheetParams {
   paperId: number;

+ 2 - 1
src/render/ap/types/resultExport.ts

@@ -47,5 +47,6 @@ export interface dbfExportParams {
 
 export interface dbfExportProgressResult {
   progress: number;
-  url: string | null;
+  success: boolean;
+  errMsg: string;
 }

+ 1 - 1
src/render/components/MyQuote/index.vue

@@ -23,7 +23,7 @@ const props = withDefaults(
   defineProps<{
     message: string;
     type: "primary" | "error" | "warning" | "default";
-    showIcon: boolean;
+    showIcon?: boolean;
   }>(),
   {
     type: "default",

+ 4 - 4
src/render/components/SelectCourse/index.vue

@@ -15,7 +15,7 @@
 
 <script setup lang="ts">
 import { ref, useAttrs, watch } from "vue";
-import { subjectList } from "@/ap/base";
+import { getSubjectList } from "@/ap/base";
 import { SubjectItem } from "@/ap/types/base";
 
 defineOptions({
@@ -35,16 +35,16 @@ const props = withDefaults(
 const emit = defineEmits(["update:value", "change"]);
 const attrs = useAttrs();
 
-const fieldNames = { label: "subjectName", value: "subjectCode" };
+const fieldNames = { label: "name", value: "code" };
 
 const selected = ref("");
 const optionList = ref<SubjectItem[]>([]);
 const search = async () => {
   optionList.value = [];
-  const resData = await subjectList({ examId: props.examId });
+  const resData = await getSubjectList({ examId: props.examId });
   optionList.value = resData || [];
 };
-// search();
+search();
 
 const onChange = () => {
   const selectedData = optionList.value.filter(

+ 15 - 0
src/render/styles/antui-reset.less

@@ -136,3 +136,18 @@
     opacity: 0.8;
   }
 }
+
+// ant-tag
+.ant-tag {
+  &-big {
+    height: 32px;
+    border-radius: 6px;
+    line-height: 30px;
+    padding-left: 12px;
+    padding-right: 12px;
+  }
+  &-blue {
+    background: #e8f3ff;
+    border: 1px solid #bedaff;
+  }
+}

+ 19 - 0
src/render/styles/base.less

@@ -42,3 +42,22 @@ body {
 .qm-low-form .ant-form-item {
   margin-bottom: 24px !important;
 }
+
+.tips-info {
+  font-size: 14px;
+  line-height: 20px;
+  color: @text-color3;
+
+  > i {
+    margin-right: 2px;
+  }
+}
+.tips-dark {
+  color: @text-color1;
+}
+.tips-success {
+  color: @success-color;
+}
+.tips-error {
+  color: @error-color;
+}

+ 1 - 2
src/render/views/AbsentCheck/CheckAction.vue

@@ -122,7 +122,6 @@ import {
 } from "@/ap/absentCheck";
 import useDictOption from "@/hooks/dictOption";
 import useLoading from "@/hooks/useLoading";
-import { downloadByApi } from "@/utils/download";
 
 import ExportTypeDialog from "../Review/ExportTypeDialog.vue";
 import ResetDialog from "./ResetDialog.vue";
@@ -234,7 +233,7 @@ async function onExportConfirm(type: "student" | "room") {
   const func =
     type === "student" ? absentCheckStudentExport : absentCheckRoomExport;
 
-  const res = await downloadByApi(() => func(searchModel)).catch((e: Error) => {
+  const res = await func(searchModel).catch((e: Error) => {
     message.error(e.message || "下载失败,请重新尝试!");
   });
   setLoading(false);

+ 3 - 6
src/render/views/AbsentCheck/ImportTypeDialog.vue

@@ -59,7 +59,6 @@ import useModal from "@/hooks/useModal";
 import { ImportType } from "@/ap/types/absentCheck";
 import { absentImportStatus } from "@/ap/absentCheck";
 import { absentTemplateDownload } from "@/ap/absentCheck";
-import { downloadByApi } from "@/utils/download";
 import useLoading from "@/hooks/useLoading";
 import useLoop from "@/hooks/useLoop";
 
@@ -129,11 +128,9 @@ async function onDownloadTemp() {
   if (loading.value) return;
 
   setLoading(true);
-  const res = await downloadByApi(() => absentTemplateDownload()).catch(
-    (e: Error) => {
-      message.error(e.message || "下载失败,请重新尝试!");
-    }
-  );
+  const res = await absentTemplateDownload().catch((e: Error) => {
+    message.error(e.message || "下载失败,请重新尝试!");
+  });
   setLoading(false);
   if (!res) return;
   message.success("下载成功!");

+ 12 - 24
src/render/views/Audit/Main/SelectExamDialog.vue

@@ -23,7 +23,9 @@
 <script setup lang="ts">
 import { ref, watch } from "vue";
 import { message } from "ant-design-vue";
-import { examList } from "@/ap/base";
+import { getExamList } from "@/ap/base";
+import { ExamItem } from "@/ap/types/base";
+
 import useModal from "@/hooks/useModal";
 import { useUserStore } from "@/store";
 
@@ -37,33 +39,19 @@ defineExpose({ open, close });
 
 const userStore = useUserStore();
 
-const dataList = ref<Exam[]>([]);
+const dataList = ref<ExamItem[]>([]);
 const choosedExamId = ref(0);
-async function getExamList() {
-  const res = await examList();
-  dataList.value = res || [];
-}
-
-// TODO: 测试数据
-dataList.value = "#"
-  .repeat(16)
-  .split("")
-  .map((item, index) => {
-    return {
-      enable: true,
-      id: index,
-      mode: "common",
-      name: `考试${index + 1}`,
-      schoolName: "string",
-      updateTime: 123456789,
-    };
+async function getExams() {
+  const res = await getExamList({
+    enable: true,
+    pageNumber: 1,
+    pageSize: 1000,
   });
-
-// getExamList();
+  dataList.value = res.result || [];
+}
+getExams();
 
 function confirm() {
-  console.log(choosedExamId.value);
-
   if (!choosedExamId.value) {
     message.error("请选择考试");
     return;

+ 1 - 2
src/render/views/DataCheck/CheckAction.vue

@@ -185,7 +185,6 @@ import { examStatusSave } from "@/ap/absentCheck";
 import useDictOption from "@/hooks/dictOption";
 import useLoading from "@/hooks/useLoading";
 import { ImageType, booleanOptionList } from "@/constants/enumerate";
-import { downloadByApi } from "@/utils/download";
 
 import ExportTypeDialog from "../Review/ExportTypeDialog.vue";
 import QuestionPanel from "./QuestionPanel.vue";
@@ -337,7 +336,7 @@ async function onExportConfirm(type: "student" | "room") {
   const params =
     actionType.value === "common" ? getSearchModel() : getCustomSearchModel();
 
-  const res = await downloadByApi(() => func(params)).catch((e: Error) => {
+  const res = await func(params).catch((e: Error) => {
     message.error(e.message || "下载失败,请重新尝试!");
   });
   setLoading(false);

+ 0 - 1
src/render/views/ImageCheck/ImageFailed.vue

@@ -39,7 +39,6 @@ import { SwapLeftOutlined, ExportOutlined } from "@ant-design/icons-vue";
 import useTable from "@/hooks/useTable";
 import { ImageCheckFailedListItem } from "@/ap/types/imageCheck";
 import { imageCheckFailedList, imageCheckFailedExport } from "@/ap/imageCheck";
-// import { downloadByApi } from "@/utils/download";
 import useLoading from "@/hooks/useLoading";
 
 defineOptions({

+ 5 - 10
src/render/views/ResultExport/BreachImport.vue

@@ -25,6 +25,7 @@
   <ImportDialog
     ref="importDialogRef"
     title="违纪导入"
+    :format="['txt']"
     upload-url="/api/admin/student/breach/import"
     :upload-data="uploadData"
     download-btn-title="违纪导入模版"
@@ -40,7 +41,6 @@ import { message } from "ant-design-vue";
 
 import { BreachListItem } from "@/ap/types/resultExport";
 import { breachList, breachTemplateDownload } from "@/ap/resultExport";
-import { downloadByApi } from "@/utils/download";
 import { useUserStore } from "@/store";
 
 import ImportDialog from "@/components/ImportDialog/index.vue";
@@ -96,19 +96,14 @@ async function onImport(index: number) {
 }
 
 async function downloadHandle() {
-  const res = await downloadByApi(() => breachTemplateDownload()).catch(
-    (e: Error) => {
-      message.error(e.message || "下载失败,请重新尝试!");
-    }
-  );
+  const res = await breachTemplateDownload().catch((e: Error) => {
+    message.error(e.message || "下载失败,请重新尝试!");
+  });
   if (!res) return;
   message.success("下载成功!");
 }
 
 onMounted(() => {
-  dataList.value = [
-    { subjectCode: "8956145235", subjectName: "语法基础", breachCount: 12 },
-  ];
-  // getData()
+  getData();
 });
 </script>

+ 18 - 15
src/render/views/ResultExport/DbfExport.vue

@@ -1,9 +1,12 @@
 <template>
   <div class="m-b-16px">
-    <qm-button type="primary" :icon="h(SettingOutlined)" @click="onSetSiteCode"
-      >设置扫描点代码</qm-button
-    >
-    <a-tag v-if="siteCodeData.scanSite" class="m-l-12px" color="blue"
+    <a-button type="primary" @click="onSetSiteCode">
+      <template #icon><SettingOutlined /></template>设置扫描点代码
+    </a-button>
+    <a-tag
+      v-if="siteCodeData.scanSite"
+      class="m-l-12px ant-tag-big"
+      color="blue"
       >扫描点代码:{{ siteCodeData.scanSite }}</a-tag
     >
   </div>
@@ -41,11 +44,11 @@
 </template>
 
 <script setup lang="ts">
-import { ref, h, onMounted } from "vue";
+import { ref, onMounted } from "vue";
 import { SettingOutlined } from "@ant-design/icons-vue";
 import type { TableProps } from "ant-design-vue";
 import { SubjectItem } from "@/ap/types/base";
-import { subjectList } from "@/ap/base";
+import { getSubjectList } from "@/ap/base";
 import {
   markSiteCodeInfo,
   dbfAnswerExport,
@@ -70,11 +73,11 @@ const curExportTask = ref({ id: "", name: "" });
 const columns: TableProps["columns"] = [
   {
     title: "科目代码",
-    dataIndex: "subjectCode",
+    dataIndex: "code",
   },
   {
     title: "科目名称",
-    dataIndex: "subjectName",
+    dataIndex: "name",
   },
   {
     title: "操作",
@@ -91,7 +94,7 @@ const columns: TableProps["columns"] = [
 const siteCodeData = ref({} as markSiteSetParams);
 async function getScanSiteCode() {
   const res = await markSiteCodeInfo({ examId: userStore.curExam.id });
-  siteCodeData.value = { scanSite: res.scanSite, examId: userStore.curExam.id };
+  siteCodeData.value = { scanSite: res, examId: userStore.curExam.id };
 }
 
 const modifySiteCodeRef = ref();
@@ -103,15 +106,16 @@ function siteCodeModified(data: markSiteSetParams) {
 }
 
 async function getData() {
-  const res = await subjectList({ examId: userStore.curExam.id });
+  const res = await getSubjectList({ examId: userStore.curExam.id });
   dataList.value = res || [];
 }
 
+const exportTaskProgressDialogRef = ref();
 async function onExportAnswer(index: number) {
   const record = dataList.value[index];
   const res = await dbfAnswerExport({
     examId: userStore.curExam.id,
-    subjectCode: record.subjectCode,
+    subjectCode: record.code,
   });
   curExportTask.value = { id: res.taskId, name: "扫描答案DBF" };
   exportTaskProgressDialogRef.value?.open();
@@ -121,15 +125,14 @@ async function onExportPackage(index: number) {
   const record = dataList.value[index];
   const res = await dbfPackageExport({
     examId: userStore.curExam.id,
-    subjectCode: record.subjectCode,
+    subjectCode: record.code,
   });
   curExportTask.value = { id: res.taskId, name: "打包DBF" };
   exportTaskProgressDialogRef.value?.open();
 }
 
 onMounted(() => {
-  dataList.value = [{ subjectCode: "8956145235", subjectName: "语法基础" }];
-  // getScanSiteCode()
-  // getData()
+  getScanSiteCode();
+  getData();
 });
 </script>

+ 17 - 16
src/render/views/ResultExport/ExportTaskProgressDialog.vue

@@ -17,7 +17,7 @@
 <script setup lang="ts">
 import { ref, watch, computed } from "vue";
 import { message } from "ant-design-vue";
-import { dbfExportProgress } from "@/ap/resultExport";
+import { dbfExportProgress, dbfExportTaskDownload } from "@/ap/resultExport";
 
 import useLoading from "@/hooks/useLoading";
 import useModal from "@/hooks/useModal";
@@ -40,20 +40,26 @@ const props = defineProps<{
 }>();
 
 const curProgress = ref(0);
-const taskFileUrl = ref("");
 
 const tips = computed(() => {
-  return curProgress.value >= 100
+  return curProgress.value < 100
     ? `${props.task.name}导出中……`
     : `文件生成完毕,正在下载……`;
 });
 
 const { start, stop } = useLoop(getProgress, 1000);
 async function getProgress() {
-  const result = await dbfExportProgress(props.task.id).catch(() => undefined);
-  if (!result) return;
+  const result = await dbfExportProgress(props.task.id).catch(() => {});
+  if (!result) {
+    stop();
+    return;
+  }
+  if (!result.success) {
+    message.error(result.errMsg);
+    stop();
+    return;
+  }
   curProgress.value = result.progress;
-  taskFileUrl.value = result.url;
 
   // 文件生成成功,开始下载
   if (result.progress >= 100) {
@@ -62,18 +68,14 @@ async function getProgress() {
   }
 }
 
-function downloadTaskFile() {
-  if (!taskFileUrl.value) {
-    message.error("下载链接丢失!");
-    return;
-  }
-
-  downloadByUrl(taskFileUrl.value);
-  message.success("文件开始下载!");
+async function downloadTaskFile() {
+  const res = await dbfExportTaskDownload(props.task.id).catch(() => false);
+  if (!res) return;
+  message.success("文件下载成功!");
 
   setTimeout(() => {
     close();
-  }, 200);
+  }, 500);
 }
 
 watch(
@@ -93,7 +95,6 @@ watch(
 /* init modal */
 function modalOpenHandle() {
   curProgress.value = 0;
-  taskFileUrl.value = "";
 
   if (!props.task.id) {
     message.error("任务丢失!");

+ 4 - 4
src/render/views/ResultExport/MarkSite.vue

@@ -15,8 +15,8 @@
   >
     <template #bodyCell="{ column, index }">
       <template v-if="column.dataIndex === 'operation'">
-        <qm-button type="text" @click="onEdit(index)">编辑</qm-button>
-        <qm-button type="text" @click="onDelete(index)">删除</qm-button>
+        <qm-button type="link" @click="onEdit(index)">编辑</qm-button>
+        <qm-button type="link" @click="onDelete(index)">删除</qm-button>
       </template>
     </template>
   </a-table>
@@ -74,7 +74,7 @@ const columns: TableProps["columns"] = [
   {
     title: "操作",
     dataIndex: "operation",
-    width: "140px",
+    width: "110px",
     customCell: () => {
       return {
         class: "operation-cell",
@@ -88,7 +88,7 @@ const { dataList, pagination, loading, getList, toPage, deletePageLastItem } =
   useTable<MarkSiteListItem>(
     markSiteListPage,
     { examId: userStore.curExam.id },
-    false
+    true
   );
 
 const modifyMarkSiteRef = ref();

+ 14 - 8
src/render/views/ResultExport/ModifyMarkSite.vue

@@ -15,7 +15,10 @@
       :label-col="{ style: { width: '160px' } }"
     >
       <a-form-item name="subjectCode" label="科目代码">
-        <select-course v-model:value="formData.subjectCode"></select-course>
+        <select-course
+          v-model:value="formData.subjectCode"
+          :exam-id="userStore.curExam.id"
+        ></select-course>
       </a-form-item>
       <a-form-item name="paperType" label="条码值">
         <a-input
@@ -55,6 +58,7 @@ import useLoading from "@/hooks/useLoading";
 import useModal from "@/hooks/useModal";
 import { objAssign, objModifyAssign } from "@/utils/tool";
 import { MarkSiteListItem, MarkSiteSaveParams } from "@/ap/types/resultExport";
+import { useUserStore } from "@/store";
 
 defineOptions({
   name: "ModifyMarkSite",
@@ -64,20 +68,22 @@ defineOptions({
 const { visible, open, close } = useModal();
 defineExpose({ open, close });
 
+const props = defineProps<{
+  rowData: MarkSiteListItem;
+}>();
+const emit = defineEmits(["modified"]);
+
+const userStore = useUserStore();
+
 const defaultFormData = {
-  id: 0,
-  examId: 0,
+  id: undefined,
+  examId: userStore.curExam.id as number,
   subjectCode: "",
   paperType: "",
   oddNumber: 0,
   evenNumber: 0,
 };
 
-const props = defineProps<{
-  rowData: MarkSiteListItem;
-}>();
-const emit = defineEmits(["modified"]);
-
 const isEdit = computed(() => !!props.rowData.id);
 const title = computed(() => `${isEdit.value ? "编辑" : "新增"}评卷点信息`);
 

+ 1 - 1
src/render/views/ResultExport/ModifySiteCode.vue

@@ -102,6 +102,6 @@ watch(
 
 /* init modal */
 function modalOpenHandle() {
-  objModifyAssign(formData, defaultFormData);
+  objModifyAssign(formData, props.rowData);
 }
 </script>

+ 4 - 11
src/render/views/ResultExport/StudentStatus.vue

@@ -47,7 +47,6 @@ import { message } from "ant-design-vue";
 
 import { StudentStatusListItem } from "@/ap/types/resultExport";
 import { studentStatusList, statusTemplateDownload } from "@/ap/resultExport";
-import { downloadByApi } from "@/utils/download";
 import { useUserStore } from "@/store";
 
 import ImportDialog from "@/components/ImportDialog/index.vue";
@@ -107,20 +106,14 @@ async function onImport(index: number) {
 }
 
 async function downloadHandle() {
-  const res = await downloadByApi(() => statusTemplateDownload()).catch(
-    (e: Error) => {
-      message.error(e.message || "下载失败,请重新尝试!");
-    }
-  );
+  const res = await statusTemplateDownload().catch((e: Error) => {
+    message.error(e.message || "下载失败,请重新尝试!");
+  });
   if (!res) return;
   message.success("下载成功!");
 }
 
 onMounted(() => {
-  dataList.value = [
-    { subjectCode: "123456789", subjectName: "数学理论", custStatusCount: 89 },
-  ];
-
-  // getData()
+  getData();
 });
 </script>

+ 1 - 1
src/render/views/ResultExport/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="result-export h-full">
-    <a-tabs v-model:activeKey="activeKey">
+    <a-tabs v-model:activeKey="activeKey" destroyInactiveTabPane>
       <a-tab-pane key="1" tab="违纪导入">
         <BreachImport />
       </a-tab-pane>

+ 5 - 8
src/render/views/Review/ReviewAction.vue

@@ -155,7 +155,6 @@ import { reviewWarningTaskExport, reviewTaskHistory } from "@/ap/review";
 import { ReviewTaskListItem } from "@/ap/types/review";
 import { SubjectItem } from "@/ap/types/base";
 
-import { downloadByApi } from "@/utils/download";
 import useTable from "@/hooks/useTable";
 import useLoading from "@/hooks/useLoading";
 import { useUserStore, useReviewStore } from "@/store";
@@ -247,13 +246,11 @@ async function onExportConfirm(type: "student" | "room") {
   if (downloading.value) return;
 
   setLoading(true);
-  const res = await downloadByApi(() =>
-    reviewWarningTaskExport({
-      examId: userStore.curExam.id,
-      subjectCode: exportCourseCode.value,
-      type,
-    })
-  ).catch((e: Error) => {
+  const res = await reviewWarningTaskExport({
+    examId: userStore.curExam.id,
+    subjectCode: exportCourseCode.value,
+    type,
+  }).catch((e: Error) => {
     message.error(e.message || "下载失败,请重新尝试!");
   });
   setLoading(false);