zhangjie преди 9 месеца
родител
ревизия
1ee4a40250

+ 3 - 1
src/render/ap/recognizeCheck.ts

@@ -32,7 +32,6 @@ export const recognizeConditionsList = (): Promise<RecognizeConditionItem[]> =>
   request({
     url: "/api/admin/check/omr/conditions",
     method: "post",
-    data,
   });
 // 创建/修改识别对照任务组
 export const recognizeCheckTaskSave = (
@@ -42,6 +41,9 @@ export const recognizeCheckTaskSave = (
     url: "/api/admin/check/omr/group/save",
     method: "post",
     data,
+    headers: {
+      "Content-Type": "application/json;charset=UTF-8",
+    },
   });
 
 // 修改识别对照任务组阶段

+ 1 - 1
src/render/ap/types/recognizeCheck.ts

@@ -137,5 +137,5 @@ export interface RecognizeArbitrateTaskDetail extends RecognizeArea {
   result2: string;
   pageIndex: number;
   groupId: number;
-  arbitrate: boolean;
+  uri: string;
 }

+ 39 - 20
src/render/views/RecognizeCheck/ModifyRecognizeCheckTask.vue

@@ -1,7 +1,7 @@
 <template>
   <a-modal
     v-model:open="visible"
-    :width="450"
+    :width="470"
     style="top: 10vh"
     :confirm-loading="loading"
     @ok="confirm"
@@ -12,18 +12,21 @@
       ref="formRef"
       :model="formData"
       :rules="rules"
-      :label-col="{ style: { width: '120px' } }"
+      :label-col="{ style: { width: '80px' } }"
     >
       <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-space
         v-for="(condition, index) in formData.conditions"
         :key="condition.code"
-        align="baseline"
+        :size="8"
       >
         <a-form-item
-          :label="index === 0 ? '任务条件' : ''"
+          :label="index === 0 ? '任务条件' : ' '"
           :name="['conditions', index, 'code']"
           :rules="{
             required: true,
@@ -34,11 +37,15 @@
           <a-select
             v-model:value="condition.code"
             :options="conditionList"
+            :field-names="fieldNames"
+            style="width: 200px"
             @change="(val) => conditionChange(val, index)"
           ></a-select>
         </a-form-item>
+
         <a-form-item
           v-if="formData.conditions[index].needValue"
+          :span="5"
           :name="['conditions', index, 'value']"
           :rules="{
             required: true,
@@ -49,18 +56,24 @@
           <a-input-number
             v-model:value="condition.value"
             placeholder="数值"
-            style="width: 60px; margin-right: 10px"
+            :min="1"
+            :max="999"
+            :precision="0"
+            :controls="false"
+            style="width: 60px"
           />
         </a-form-item>
-
-        <a-space-compact>
+        <a-form-item>
           <a-button @click="onAddCondition(index)">
             <template #icon><PlusOutlined /></template>
           </a-button>
-          <a-button @click="onDeleteCondition(index)">
+          <a-button
+            :disabled="deleteDisabled"
+            @click="onDeleteCondition(index)"
+          >
             <template #icon><MinusOutlined /></template>
           </a-button>
-        </a-space-compact>
+        </a-form-item>
       </a-space>
     </a-form>
   </a-modal>
@@ -97,7 +110,7 @@ defineExpose({ open, close });
 const userStore = useUserStore();
 
 const defaultFormData = {
-  id: 0,
+  id: undefined,
   examId: 0,
   subjectCode: "",
   conditions: [] as RecognizeCheckTaskSetConditionItem[],
@@ -108,7 +121,7 @@ const props = defineProps<{
 }>();
 const emit = defineEmits(["modified"]);
 
-const isEdit = computed(() => !!props.rowData.id);
+const isEdit = computed(() => !!props.rowData);
 const title = computed(() => `${isEdit.value ? "编辑" : "新增"}任务`);
 
 const formRef = ref();
@@ -125,21 +138,27 @@ const rules: FormRules<keyof RecognizeCheckTaskSaveParams> = {
   ],
 };
 
+const deleteDisabled = computed(() => formData.conditions.length <= 1);
+
 // condition action
-const conditionList = ref([]);
+const conditionList = ref<RecognizeConditionItem[]>([]);
+const fieldNames = { label: "name", value: "code" };
 async function getConditionList() {
   const res = await recognizeConditionsList();
 
   conditionList.value = res || [];
 }
 
-function conditionChange(val: RecognizeConditionItem, index: number) {
-  formData.conditions[index].needValue = val.needValue;
-  formData.conditions[index].name = val.name;
+function conditionChange(val: string, index: number) {
+  const curCondition = conditionList.value.find((item) => item.code === val);
+  if (!curCondition) return;
+
+  formData.conditions[index].needValue = curCondition.needValue;
+  formData.conditions[index].name = curCondition.name;
 }
 
 function onAddCondition(index: number) {
-  formData.conditions.splice(index, 0, {
+  formData.conditions.splice(index + 1, 0, {
     code: "",
     name: "",
     needValue: false,
@@ -161,7 +180,7 @@ async function confirm() {
   setLoading(false);
   if (!res) return;
   message.success("保存成功!");
-  emit("modified", datas);
+  emit("modified");
   close();
 }
 
@@ -180,7 +199,7 @@ watch(
 
 function modalOpenHandle() {
   const conditionMap: Record<string, RecognizeConditionItem> = {};
-  conditionList.forEach((item) => {
+  conditionList.value.forEach((item) => {
     conditionMap[item.code] = item;
   });
 
@@ -205,6 +224,6 @@ function modalOpenHandle() {
 }
 
 onMounted(() => {
-  // getConditionList();
+  getConditionList();
 });
 </script>

+ 55 - 65
src/render/views/RecognizeCheck/RecognizeArbitrate.vue

@@ -15,7 +15,10 @@
     </div>
 
     <div class="arbitrate-body">
-      <RecognizeImage />
+      <RecognizeImage
+        v-if="curArbitrateTaskDetail"
+        :img-src="curArbitrateTaskDetail.uri"
+      />
 
       <!-- arbitrate action modal -->
       <div v-if="curArbitrateTaskDetail" class="arbitrate-modal">
@@ -128,12 +131,8 @@ async function updateProgress() {
 
 const curArbitrateTaskDetails = ref([] as RecognizeArbitrateTaskDetail[]);
 const curArbitrateTaskDetailIndex = ref(0);
-const curTaskDetails = ref([] as RecognizeArbitrateTaskDetail[]);
 const curArbitrateTaskDetail = ref<RecognizeArbitrateTaskDetail | null>(null);
 
-// TODO: 缓存所有仲裁结果
-// const cacheArbitrateTaskDetailResults: Record<string, string[]> = {}
-
 const nextArbitrateTaskDetail = computed(() => {
   return curArbitrateTaskDetails.value[curArbitrateTaskDetailIndex.value + 1];
 });
@@ -141,16 +140,6 @@ const nextArbitrateTaskDetail = computed(() => {
 const nextDetailIsAnotherTask = computed(() => {
   return !nextArbitrateTaskDetail.value;
 });
-// 下一个细分任务是否是另一页的
-const nextDetailIsAnotherPage = computed(() => {
-  if (!curArbitrateTaskDetail.value) return false;
-
-  return (
-    !nextArbitrateTaskDetail.value ||
-    nextArbitrateTaskDetail.value.pageIndex !==
-      curArbitrateTaskDetail.value.pageIndex
-  );
-});
 
 const curTaskDetailName = computed(() => {
   if (!curArbitrateTaskDetail.value) return "";
@@ -167,14 +156,16 @@ async function getTask() {
   const res = await recognizeArbitrateTask(groupId).catch(() => false);
   curTask = res || null;
   if (!curTask) {
-    message.error("获取任务失败");
     return;
   }
 
-  curTaskDetails.value = parseDetails(curTask);
-  curArbitrateTaskDetails.value = curTaskDetails.value.filter(
-    (item) => item.arbitrate
-  );
+  curArbitrateTaskDetails.value = parseDetails(curTask);
+}
+
+async function initData() {
+  await getTask();
+  curArbitrateTaskDetailIndex.value = 0;
+  setCurTaskDetail();
 }
 
 // 解析仲裁任务详情
@@ -187,39 +178,45 @@ function parseDetails(
     if (!recogData) return;
 
     // 缺考
-    details.push({
-      ...parseDetailSize(recogData.absent.fill_result[0], "absent", 0, []),
-      result1: page.absent ? page.absent[0] : "",
-      result2: page.absent ? page.absent[1] : "",
-      pageIndex: page.index,
-      groupId: groupId,
-      arbitrate: Boolean(page.absent),
-    });
+    if (page.absent) {
+      details.push({
+        ...parseDetailSize(recogData.absent.fill_result[0], "absent", 0, []),
+        result1: page.absent ? page.absent[0] : "",
+        result2: page.absent ? page.absent[1] : "",
+        pageIndex: page.index,
+        groupId: groupId,
+        uri: page.uri,
+      });
+    }
 
     // 违纪
-    details.push({
-      ...parseDetailSize(recogData.breach.fill_result[0], "breach", 0, []),
-      result1: page.breach ? page.breach[0] : "",
-      result2: page.breach ? page.breach[1] : "",
-      pageIndex: page.index,
-      groupId: groupId,
-      arbitrate: Boolean(page.breach),
-    });
+    if (page.breach) {
+      details.push({
+        ...parseDetailSize(recogData.breach.fill_result[0], "breach", 0, []),
+        result1: page.breach ? page.breach[0] : "",
+        result2: page.breach ? page.breach[1] : "",
+        pageIndex: page.index,
+        groupId: groupId,
+        uri: page.uri,
+      });
+    }
 
     // 试卷类型
-    details.push({
-      ...parseDetailSize(
-        recogData.paperType.fill_result[0],
-        "paperType",
-        0,
-        []
-      ),
-      result1: page.paperType ? page.paperType[0] : "",
-      result2: page.paperType ? page.paperType[1] : "",
-      pageIndex: page.index,
-      groupId: groupId,
-      arbitrate: Boolean(page.paperType),
-    });
+    if (page.paperType) {
+      details.push({
+        ...parseDetailSize(
+          recogData.paperType.fill_result[0],
+          "paperType",
+          0,
+          []
+        ),
+        result1: page.paperType ? page.paperType[0] : "",
+        result2: page.paperType ? page.paperType[1] : "",
+        pageIndex: page.index,
+        groupId: groupId,
+        uri: page.uri,
+      });
+    }
 
     // 试题
     let index = 0;
@@ -228,16 +225,14 @@ function parseDetails(
         qRecog.index = ++index;
         const questionResult = page.question[qRecog.index];
         const arbitrate = questionResult && questionResult.length >= 2;
-        const fillResult = arbitrate ? [] : questionResult;
-
+        if (!arbitrate) return;
         details.push({
-          ...parseDetailSize(qRecog, "question", qRecog.index, fillResult),
-          result,
+          ...parseDetailSize(qRecog, "question", qRecog.index, []),
           result1: questionResult ? questionResult[0] : "",
           result2: questionResult ? questionResult[1] : "",
           pageIndex: page.index,
           groupId: groupId,
-          arbitrate,
+          uri: page.uri,
         });
       });
     });
@@ -292,7 +287,7 @@ async function changePrevTaskDetail() {
   }, 500);
 }
 
-async function getNextTask() {
+async function getPrevTask() {
   let result = true;
   const res = await recognizeArbitrateHistory({
     groupId,
@@ -312,16 +307,12 @@ async function getNextTask() {
   }
 
   curTask = res;
-  curTaskDetails.value = parseDetails(curTask);
-  curArbitrateTaskDetails.value = curTaskDetails.value.filter(
-    (item) => item.arbitrate
-  );
-
+  curArbitrateTaskDetails.value = parseDetails(curTask);
   curArbitrateTaskDetailIndex.value = curArbitrateTaskDetails.value.length - 1;
   setCurTaskDetail();
 }
 
-async function getPrevTask() {
+async function getNextTask() {
   let result = true;
   const res = await recognizeArbitrateHistory({
     groupId,
@@ -341,10 +332,8 @@ async function getPrevTask() {
     return;
   }
 
-  curTaskDetails.value = parseDetails(curTask);
-  curArbitrateTaskDetails.value = curTaskDetails.value.filter(
-    (item) => item.arbitrate
-  );
+  curTask = res;
+  curArbitrateTaskDetails.value = parseDetails(curTask);
 
   curArbitrateTaskDetailIndex.value = 0;
   setCurTaskDetail();
@@ -481,6 +470,7 @@ function goback() {
 }
 
 onMounted(() => {
+  initData();
   registKeyEvent();
 });
 

+ 3 - 9
src/render/views/RecognizeCheck/RecognizeImage.vue

@@ -1,11 +1,9 @@
 <template>
   <div ref="arbitrateImgRef" class="arbitrate-img" @scroll="onImgScroll">
-    <img src="@/assets/imgs/paper.jpg" alt="扫描结果" @load="onImgLoad" />
-    <!-- <img :src="imgSrc" alt="扫描结果" @load="onImgLoad" /> -->
+    <img :src="imgSrc" alt="扫描结果" @load="onImgLoad" />
   </div>
   <div ref="imgThumbRef" class="arbitrate-img-thumb">
-    <img src="@/assets/imgs/paper.jpg" alt="扫描结果" />
-    <!-- <img :src="imgSrc" alt="扫描结果" /> -->
+    <img :src="imgSrc" alt="扫描结果" />
     <div
       class="arbitrate-img-area"
       v-ele-move-directive.prevent.stop="{
@@ -19,11 +17,8 @@
 </template>
 
 <script setup lang="ts">
-import { computed, ref, reactive } from "vue";
-
+import { computed, ref, reactive, onMounted } from "vue";
 import { vEleMoveDirective } from "@/directives/eleMove";
-import { RecognizeArbitrateTaskDetail } from "@/ap/types/recognizeCheck";
-import { onMounted } from "vue";
 
 defineOptions({
   name: "RecognizeImage",
@@ -31,7 +26,6 @@ defineOptions({
 
 const props = defineProps<{
   imgSrc: string;
-  recogData: RecognizeArbitrateTaskDetail[];
 }>();
 
 const arbitrateImgRef = ref();

+ 34 - 32
src/render/views/RecognizeCheck/index.vue

@@ -1,8 +1,13 @@
 <template>
-  <div v-show="route.name === 'RecognizeCheck'" class="page-box">
+  <div v-if="route.name === 'RecognizeCheck'" class="page-box">
     <a-space class="m-b-16px" :size="8">
       <div>
-        <span>科目:</span> <SelectCourse :exam-id="userStore.curExam.id" />
+        <span>科目:</span>
+        <select-course
+          v-model:value="searchModel.subjectCode"
+          :exam-id="userStore.curExam.id"
+          allow-clear
+        ></select-course>
       </div>
       <a-button @click="toPage(1)">查询</a-button>
       <a-divider type="vertical" style="margin: 0" />
@@ -38,19 +43,19 @@
         </template>
       </template>
     </a-table>
+
+    <ModifyRecognizeCheckTask
+      ref="modifyRecognizeCheckTaskRef"
+      :row-data="curRow"
+      @modified="getList"
+    />
   </div>
 
   <router-view />
-
-  <ModifyRecognizeCheckTask
-    ref="modifyRecognizeCheckTaskRef"
-    :row-data="curRow"
-    @modified="getList"
-  />
 </template>
 
 <script setup lang="ts">
-import { ref, h } from "vue";
+import { ref, h, reactive, onMounted } from "vue";
 import { useRoute, useRouter } from "vue-router";
 import { PlusCircleOutlined } from "@ant-design/icons-vue";
 import { message } from "ant-design-vue";
@@ -78,6 +83,10 @@ const userStore = useUserStore();
 
 const router = useRouter();
 const route = useRoute();
+const searchModel = reactive({
+  examId: userStore.curExam.id,
+  subjectCode: "",
+});
 
 const columns: TableProps["columns"] = [
   {
@@ -93,32 +102,32 @@ const columns: TableProps["columns"] = [
   {
     title: "状态",
     dataIndex: "stage",
-    width: "120px",
+    width: "80px",
   },
   {
     title: "任务总数",
     dataIndex: "totalCount",
-    width: "100px",
+    width: "90px",
   },
   {
     title: "完成进度",
     dataIndex: "finishCount",
-    width: "100px",
+    width: "90px",
   },
   {
     title: "已仲裁数量",
     dataIndex: "arbitratedCount",
-    width: "120px",
+    width: "110px",
   },
   {
     title: "待仲裁数量",
     dataIndex: "unarbitrateCount",
-    width: "120px",
+    width: "110px",
   },
   {
     title: "操作",
     dataIndex: "operation",
-    width: "280px",
+    width: "200px",
     customCell: () => {
       return {
         class: "operation-cell",
@@ -129,18 +138,17 @@ const columns: TableProps["columns"] = [
 const curRow = ref(null as RecognizeCheckTaskSaveParams | null);
 
 const { dataList, pagination, loading, getList, toPage, deletePageLastItem } =
-  useTable<RecognizeCheckListItem>(
-    recognizeCheckListPage,
-    { examId: userStore.curExam.id },
-    false
-  );
+  useTable<RecognizeCheckListItem>(recognizeCheckListPage, searchModel, false);
 
 function getConditionContent(index: number): string {
   const record = dataList.value[index];
-  return record.conditions.map((item) => `${item.name}${item.value}`).join(";");
+  return record.conditions
+    .map((item) => `${item.name}${item.value || ""}`)
+    .join(";");
 }
 function getConditionProgress(index: number): string {
   const record = dataList.value[index];
+  if (!record.totalCount) return "0.00%";
   const progress = ((100 * record.finishCount) / record.totalCount).toFixed(2);
   return `${progress}%`;
 }
@@ -211,15 +219,9 @@ async function onDelete(index: number) {
   message.success("操作成功");
 }
 
-// test
-dataList.value = [
-  {
-    id: 1,
-    conditions: [],
-    subjectCode: "11",
-    subjectName: "22",
-    totalCount: 10,
-    finishCount: 8,
-  },
-];
+onMounted(() => {
+  if (route.name !== "RecognizeCheck") return;
+
+  toPage(1);
+});
 </script>