ソースを参照

Merge branch 'release_1.0.0' of http://git.qmth.com.cn/scan-central/client-admin into release_1.0.0

zhangjie 7 ヶ月 前
コミット
32a61af1cc

+ 1 - 0
src/render/ap/types/absentCheck.ts

@@ -9,6 +9,7 @@ export interface AbsentCheckListFilter {
   subjectCode: string;
   examStatus: string;
   status: string;
+  packageCode?: string;
 }
 
 export type AbsentCheckListParams = PageParams<AbsentCheckListFilter>;

+ 3 - 0
src/render/utils/request.ts

@@ -111,6 +111,9 @@ function createService() {
           case 404:
             err(`服务器资源不存在`);
             break;
+          case 502:
+            err(`网络错误,请退出重试`);
+            break;
           case 500:
             err(`服务器内部错误`);
             break;

+ 59 - 33
src/render/views/AbsentCheck/CheckAction.vue

@@ -12,7 +12,6 @@
             <select-course
               v-model:value="searchModel.subjectCode"
               :exam-id="userStore.curExam.id"
-              style="width: 150px"
               allow-clear
             ></select-course>
           </a-form-item>
@@ -24,42 +23,53 @@
               allow-clear
             ></a-select>
           </a-form-item>
-          <a-form-item label="考号">
-            <div class="exam-number">
-              <a-textarea
-                v-model:value="searchModel.examNumber"
-                placeholder="请输入"
-                :auto-size="{ minRows: 1, maxRows: 1 }"
-              ></a-textarea>
-              <div class="number-suffix">{{ examNumberCountCont }}</div>
-            </div>
-            <a-button
-              class="ant-simple m-l-8px"
-              type="link"
-              @click="onEditExamNumber"
-              >查看全部</a-button
-            >
-          </a-form-item>
-
-          <a-row>
-            <a-col :span="15">
-              <a-form-item label="姓名">
+          <template v-if="searchModel.examStatus === 'CUSTOM'">
+            <a-form-item label="卷袋号">
+              <div class="exam-number">
+                <a-input
+                  v-model:value="searchModel.packageCode"
+                  placeholder="请输入"
+                ></a-input>
+              </div>
+            </a-form-item>
+            <a-form-item label="考号">
+              <div class="exam-number">
+                <a-textarea
+                  v-model:value="searchModel.examNumber"
+                  placeholder="请输入"
+                  :auto-size="{ minRows: 1, maxRows: 1 }"
+                ></a-textarea>
+                <div class="number-suffix">{{ examNumberCountCont }}</div>
+              </div>
+              <a-button
+                class="ant-simple m-l-8px"
+                type="link"
+                @click="onEditExamNumber"
+                >查看全部</a-button
+              >
+            </a-form-item>
+
+            <!-- <a-row> -->
+            <!-- <a-col :span="15"> -->
+            <a-form-item label="姓名">
+              <div class="exam-number">
                 <a-input
                   v-model:value="searchModel.name"
                   placeholder="请输入"
-                  style="width: 140px"
                 ></a-input>
-              </a-form-item>
-            </a-col>
-            <a-col :span="9">
-              <a-form-item style="text-align: right">
-                <a-button class="m-r-8px" type="primary" @click="onSearch"
-                  >查询</a-button
-                >
-                <a-button @click="onExport">导出</a-button>
-              </a-form-item>
-            </a-col>
-          </a-row>
+              </div>
+            </a-form-item>
+          </template>
+          <!-- </a-col> -->
+          <!-- <a-col :span="9"> -->
+          <a-form-item style="text-align: right">
+            <a-button class="m-r-8px" type="primary" @click="onSearch"
+              >查询</a-button
+            >
+            <a-button @click="onExport">导出</a-button>
+          </a-form-item>
+          <!-- </a-col> -->
+          <!-- </a-row> -->
         </a-form>
       </a-collapse-panel>
       <a-collapse-panel key="2">
@@ -189,6 +199,10 @@ async function getAbsentCheckOptions() {
       label: `交叉对比缺考不一致(待确认)`,
       value: "UNCHECK3",
     },
+    {
+      label: "自定义",
+      value: "CUSTOM",
+    },
   ];
 }
 getAbsentCheckOptions();
@@ -202,6 +216,7 @@ const initSearchModel = {
   subjectCode: "",
   examStatus: "",
   status: "SCANNED",
+  packageCode: "",
 };
 const searchModel = reactive<AbsentCheckListFilter>({ ...initSearchModel });
 const imageType = ref(dataCheckStore.imageType);
@@ -353,4 +368,15 @@ watch(
     }
   }
 );
+
+watch(
+  () => searchModel.examStatus,
+  (val: string) => {
+    if (val !== "CUSTOM") {
+      searchModel.packageCode = "";
+      searchModel.examNumber = "";
+      searchModel.name = "";
+    }
+  }
+);
 </script>

+ 3 - 0
src/render/views/AbsentCheck/index.vue

@@ -76,6 +76,9 @@ async function getList() {
     pageNumber: pageNumber.value,
     pageSize: pageSize.value,
   };
+  if (datas.examStatus === "CUSTOM") {
+    datas.examStatus = "";
+  }
   const res = await absentCheckList(datas).catch(() => null);
   loading.value = false;
   if (!res) return;

+ 20 - 11
src/render/views/DataCheck/CheckAction.vue

@@ -43,6 +43,25 @@
         <template #header><FilterFilled />搜索条件 (自定义)</template>
 
         <a-form :label-col="{ style: { width: '83px' } }">
+          <a-form-item label="科目">
+            <a-select
+              v-model:value="customSearchModel.subjectCode"
+              placeholder="请选择"
+              :options="courses"
+              :field-names="fieldNames"
+              filter-option
+              allow-clear
+              style="width: 150px"
+            ></a-select>
+          </a-form-item>
+          <a-form-item label="卷袋号">
+            <a-input
+              v-model:value="customSearchModel.packageCode"
+              placeholder="请输入"
+              allow-clear
+              style="width: 150px"
+            ></a-input>
+          </a-form-item>
           <a-form-item label="考号">
             <div class="exam-number">
               <a-textarea
@@ -66,17 +85,7 @@
               style="width: 150px"
             ></a-input>
           </a-form-item>
-          <a-form-item label="科目">
-            <a-select
-              v-model:value="customSearchModel.subjectCode"
-              placeholder="请选择"
-              :options="courses"
-              :field-names="fieldNames"
-              filter-option
-              allow-clear
-              style="width: 150px"
-            ></a-select>
-          </a-form-item>
+
           <a-row>
             <a-col :span="12">
               <a-form-item label="客观题作答">

+ 9 - 5
src/render/views/ScanManage/ImageView.vue

@@ -195,7 +195,7 @@ function parseStudentPage(student: any) {
   });
 }
 const loading = ref(false);
-const _getStuCardDetail = () => {
+const _getStuCardDetail = (bool?: boolean) => {
   loading.value = true;
   getStuCardDetail({
     batchId: curBatch.value.value,
@@ -204,7 +204,7 @@ const _getStuCardDetail = () => {
     .then((res: any) => {
       curStuCardData.value = res || {};
       parseStudentPage(curStuCardData.value);
-      selectPage(0);
+      selectPage(bool ? dataList.value.length - 1 : 0);
     })
     .finally(() => {
       loading.value = false;
@@ -257,7 +257,7 @@ const curStu = ref({
 const curStuCardData = ref({});
 const dataList = ref<any>([]);
 
-const chooseLeft = (item: any, index: number) => {
+const chooseLeft = (item: any, index: number, bool?: boolean) => {
   if (loading.value) return;
   if (listType.value === "level1") {
     curSubject.value = { value: item.subjectCode, label: item.subjectName };
@@ -276,7 +276,7 @@ const chooseLeft = (item: any, index: number) => {
       studentId: item.studentId,
       studentName: item.studentName,
     };
-    _getStuCardDetail();
+    _getStuCardDetail(bool);
   }
 };
 const toggleListType = (type: string, num: number) => {
@@ -374,7 +374,11 @@ async function onPrevPage() {
       window.$message.error("没有上一张了");
       return;
     } else {
-      chooseLeft(leftList.value[activeIndex.value - 1], activeIndex.value - 1);
+      chooseLeft(
+        leftList.value[activeIndex.value - 1],
+        activeIndex.value - 1,
+        true
+      );
       return;
     }
   }

+ 10 - 0
src/render/views/ScanManage/ScanCheckMiss.vue

@@ -23,6 +23,9 @@
         <template v-if="column.dataIndex === 'subjectName'">
           {{ record.subjectCode + "-" + record.subjectName }}
         </template>
+        <template v-if="column.dataIndex === 'examSite'">
+          {{ getExamSiteName(record.examSite) }}
+        </template>
       </template>
     </a-table>
   </div>
@@ -208,6 +211,13 @@ const exportFile = async () => {
       exportLoading.value = false;
     });
 };
+
+const getExamSiteName = (code: string) => {
+  let find = ((examSiteOptions.value as any) || []).find((item: any) => {
+    return item.code == code;
+  });
+  return find?.name || "";
+};
 </script>
 <style lang="less" scoped>
 .scan-check-miss {

+ 36 - 2
src/render/views/ScanManage/WorkStatistics.vue

@@ -63,6 +63,21 @@ const search = () => {
         return aa.localeCompare(bb);
       }
     });
+    if (sort.value === "ASC") {
+      data.value.sort((a: any, b: any) => {
+        let aa = a.deviceName || "",
+          bb = b.deviceName || "";
+        let reg = /^[a-z]+[0-9]+$/;
+        if (reg.test(aa) && reg.test(bb)) {
+          let num1 = Number(aa.replaceAll(/[^0-9]/g, ""));
+          let num2 = Number(bb.replaceAll(/[^0-9]/g, ""));
+          return num1 - num2;
+        } else {
+          return aa.localeCompare(bb);
+        }
+      });
+    }
+
     createTableData();
   });
 };
@@ -71,9 +86,25 @@ const createTableData = () => {
     new Set(data.value.map((item: any) => item.subjectCode))
   );
   let arr = [];
+  let devices = Array.from(new Set(data.value.map((item: any) => item.device)));
+  let firstRow: any = {};
+  for (let i = 0; i < devices.length; i++) {
+    let device = devices[i];
+    let columnTotal = data.value.reduce((total: number, item: any) => {
+      return total + (item.device == device ? item.answerScanCount : 0);
+    }, 0);
+    firstRow[device] = columnTotal;
+  }
+  firstRow.total = data.value.reduce((total: number, item: any) => {
+    return total + (item.answerScanCount | 0);
+  }, 0);
+  arr.push(firstRow);
   for (let i = 0; i < subjectCodes.length; i++) {
     let code = subjectCodes[i];
     let row: any = {};
+    row.total = data.value.reduce((total: number, item: any) => {
+      return total + (item.subjectCode == code ? item.answerScanCount : 0);
+    }, 0);
     for (let j = 0; j < data.value.length; j++) {
       let item: any = data.value[j];
       if (item.subjectCode == code) {
@@ -91,11 +122,14 @@ const findDeviceName = (deviceCode: string) => {
 };
 const columns = computed(() => {
   let devices = Array.from(new Set(data.value.map((item: any) => item.device)));
-  let columns = devices.map((item) => ({
+  let columns: any = devices.map((item) => ({
     title: findDeviceName(item),
     dataIndex: item,
   }));
-  columns.unshift({ title: "科目", dataIndex: "subjectName" });
+  columns.unshift(
+    { title: "科目", dataIndex: "subjectName", width: 120, fixed: "left" },
+    { title: "总量", dataIndex: "total", width: 60 }
+  );
   return columns;
 });
 onMounted(() => {