zhangjie 9 tháng trước cách đây
mục cha
commit
2de3f3cba6

+ 21 - 3
src/render/ap/base.ts

@@ -21,7 +21,7 @@ export const examList = (): Promise<Exam[]> =>
   });
 
 // 原图上传
-export const uploadSheet = (
+export const updateSheet = (
   data: UploadSheetParams
 ): Promise<UploadFileResult> => {
   const formData = new FormData();
@@ -32,12 +32,30 @@ export const uploadSheet = (
     }
   }
   return request({
-    url: "/api/scan/batch/sheet/upload",
+    url: "/api/admin/scan/answer/sheet/update",
     method: "post",
     data: formData,
   });
 };
 // 裁切图上传
+export const updateSlice = (
+  data: UploadSliceParams
+): Promise<UploadFileResult> => {
+  const formData = new FormData();
+  for (const key in data) {
+    if (Object.prototype.hasOwnProperty.call(data, key)) {
+      const val = data[key];
+      formData.append(key, val);
+    }
+  }
+  return request({
+    url: "/api/admin/scan/answer/slice/update",
+    method: "post",
+    data: formData,
+  });
+};
+
+// 裁切图修改
 export const uploadSlice = (
   data: UploadSliceParams
 ): Promise<UploadFileResult> => {
@@ -49,7 +67,7 @@ export const uploadSlice = (
     }
   }
   return request({
-    url: "/api/scan/batch/slice/upload",
+    url: "/api/admin/scan/answer/slice/upload",
     method: "post",
     data: formData,
   });

+ 1 - 3
src/render/ap/types/base.ts

@@ -11,9 +11,7 @@ export interface SubjectItem {
 // }
 
 export interface UploadSheetParams {
-  batchId: number;
-  examNumber: string;
-  paperNumber: number;
+  paperId: number;
   pageIndex: number;
   file: File;
   md5: string;

+ 2 - 1
src/render/components/SliceImage/CutImageDialog.vue

@@ -182,8 +182,9 @@ async function confirm() {
     console.error(e);
   });
   if (!file) return;
-
   console.log(file);
+  emit("confirm", file);
+  close();
 }
 
 function getSliceImage(

+ 32 - 11
src/render/components/SliceImage/index.vue

@@ -1,10 +1,6 @@
 <template>
   <div class="slice-image">
-    <div
-      v-for="item in studentSlice.papers"
-      :key="item.number"
-      class="image-paper"
-    >
+    <div v-for="item in studentSlice.papers" :key="item.id" class="image-paper">
       <div
         v-for="(page, pindex) in item.pages"
         :key="pindex"
@@ -25,7 +21,7 @@
             </a-button>
             <a-button
               class="image-slice"
-              @click="onEditSlice(item.number, pindex, sindex)"
+              @click="onEditSlice(item.id, pindex, sindex)"
             >
               <template #icon><NumberOutlined /></template>
             </a-button>
@@ -40,13 +36,16 @@
     ref="cutImageDialogRef"
     :sheet-url="sheetUrl"
     :slice-selection="curSliceSelection"
+    @confirm="cutImageModified"
   />
 </template>
 
 <script setup lang="ts">
+import { ref } from "vue";
 import { NumberOutlined, PictureFilled } from "@ant-design/icons-vue";
 import CutImageDialog from "./CutImageDialog.vue";
-import { ref } from "vue";
+import { uploadSlice } from "@/ap/base";
+import { getFileMD5 } from "@/utils/crypto";
 
 defineOptions({
   name: "SliceImage",
@@ -54,20 +53,42 @@ defineOptions({
 
 const props = defineProps<{
   sheetUrl: string;
-  studentSlice: StudentSliceImgs;
+  sliceData: StudentSliceData;
 }>();
 
 const curSliceSelection = ref<AreaSize>();
+const curSliceInfo = ref({
+  paperIndex: 0,
+  paperId: 0,
+  pageIndex: 0,
+  index: 0,
+});
 
 function getPageTitle(paperNumber, pageIndex) {
   return `卡${paperNumber}${pageIndex === 0 ? "正面" : "反面"}`;
 }
 
 const cutImageDialogRef = ref();
-function onEditSlice(paperNumber: number, pageIndex: number, index: number) {
-  // TODO:get slice selection
+function onEditSlice(paperId: number, pageIndex: number, index: number) {
+  const paperIndex = props.sliceData.papers.findIndex((p) => p.id === paperId);
+  curSliceInfo.value = { paperIndex, pageIndex, paperId, index };
   curSliceSelection.value = undefined;
-
   cutImageDialogRef.value?.open();
 }
+async function cutImageModified(file: File) {
+  const md5 = await getFileMD5(file);
+
+  const { paperId, pageIndex, index, paperIndex } = curSliceInfo.value;
+  const datas = {
+    paperId,
+    pageIndex,
+    index,
+    file,
+    md5,
+  };
+  const res = await uploadSlice(datas).catch(() => {});
+  if (!res) return;
+
+  props.sliceData.papers[paperIndex].pages[pageIndex].sliceUri[index] = res.uri;
+}
 </script>

+ 9 - 3
src/render/views/DataCheck/index.vue

@@ -30,8 +30,11 @@
         @next="onNextPage"
         @recog-block-modified="onRecogEditConfirm"
       />
-      <!-- TODO: slice image show -->
-      <div v-if="dataCheckStore.curPage && !isOriginImage"></div>
+      <SliceImage
+        v-if="dataCheckStore.curPage && !isOriginImage"
+        :sheet-url="dataCheckStore.curPage.sheetUri"
+        :slice-data="curStudentSlice"
+      />
     </div>
 
     <CheckAction @search="onSearch" />
@@ -48,6 +51,7 @@ import { dataCheckList } from "@/ap/dataCheck";
 
 import SimplePagination from "@/components/SimplePagination/index.vue";
 import ScanImage from "@/components/ScanImage/index.vue";
+import SliceImage from "@/components/SliceImage/index.vue";
 import CheckAction from "./CheckAction.vue";
 import { ImageType } from "@/constants/enumerate";
 import { StudentPage } from "./types";
@@ -158,7 +162,9 @@ function selectPage(index: number) {
 
   if (!dataCheckStore.curPage) return;
 
-  const curStudent = studentList.value[dataCheckStore.curPage.studentIndex];
+  const curStudent = studentList.value[
+    dataCheckStore.curPage.studentIndex
+  ] as DataCheckListItem;
   dataCheckStore.setInfo({ curStudent });
   updateRecogList();
 }

+ 2 - 1
types/app.d.ts

@@ -12,9 +12,10 @@ interface PageBaseParams {
   pageSize: number;
 }
 // SliceImage
-interface StudentSliceImgs {
+interface StudentSliceData {
   id: number;
   papers: Array<{
+    id: number;
     number: number;
     pages: Array<{
       sliceUri: string[];