Browse Source

Merge remote-tracking branch 'origin/release_v4.1.4'

# Conflicts:
#	src/modules/oe/views/scoreStatistics.vue
deason 2 years ago
parent
commit
79ae071e96

BIN
public/img/no-photo-blank.png


BIN
public/img/no-photo.jpg


+ 1 - 0
src/main.js

@@ -5,6 +5,7 @@ import store from "./store";
 // import "./registerServiceWorker";
 import "./components/registerComponents";
 import "./modules/basic/components/registerComponents";
+import "./modules/oe/component/registerComponents";
 import "./plugins/element.js";
 import "./plugins/axios";
 import "./plugins/vueAwesome";

+ 192 - 73
src/modules/basic/view/school_config.vue

@@ -24,6 +24,7 @@
             />
           </el-select>
         </el-form-item>
+
         <el-form-item
           label="使用第三方登录"
           prop="STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY"
@@ -34,6 +35,7 @@
             off-text="否"
           ></el-switch>
         </el-form-item>
+
         <el-form-item
           label="第三方登录页地址"
           prop="STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL"
@@ -45,6 +47,7 @@
             class="input-width"
           ></el-input>
         </el-form-item>
+
         <el-form-item label="展示我司logo" prop="SHOW_QMTH_LOGO">
           <el-switch
             v-model="ruleForm.SHOW_QMTH_LOGO"
@@ -52,6 +55,7 @@
             off-text="否"
           ></el-switch>
         </el-form-item>
+
         <el-form-item label="证件号隐私模式" prop="ID_NUMBER_PRIVATE_MODE">
           <el-switch
             v-model="ruleForm.ID_NUMBER_PRIVATE_MODE"
@@ -59,6 +63,7 @@
             off-text="否"
           ></el-switch>
         </el-form-item>
+
         <el-form-item
           label="展示APP下载二维码"
           prop="SHOW_STUDENT_CLIENT_APP_QRCODE"
@@ -69,6 +74,7 @@
             off-text="否"
           ></el-switch>
         </el-form-item>
+
         <el-form-item label="开放APP" prop="APP_ENABLED">
           <el-switch
             v-model="ruleForm.APP_ENABLED"
@@ -76,6 +82,7 @@
             off-text="否"
           ></el-switch>
         </el-form-item>
+
         <el-form-item label="开放微信小程序作答" prop="WEIXIN_ANSWER_ENABLED">
           <el-switch
             v-model="ruleForm.WEIXIN_ANSWER_ENABLED"
@@ -83,6 +90,16 @@
             off-text="否"
           ></el-switch>
         </el-form-item>
+
+        <el-form-item label="启用C端考生端" prop="PC_CLIENT_ENABLED">
+          <el-switch
+            v-model="ruleForm.PC_CLIENT_ENABLED"
+            on-text="是"
+            off-text="否"
+            :disabled="false"
+          ></el-switch>
+        </el-form-item>
+
         <el-form-item
           label="活体检测方案"
           prop="IDENTIFICATION_OF_LIVING_BODY_SCHEME"
@@ -92,9 +109,9 @@
             class="input"
           >
             <el-radio label="S1" :disabled="ruleForm.PC_CLIENT_ENABLED"
-              >FaceID</el-radio
+              >标准活体</el-radio
             >
-            <el-radio label="S2" :disabled="ruleForm.PC_CLIENT_ENABLED"
+            <el-radio label="S2" hidden :disabled="ruleForm.PC_CLIENT_ENABLED"
               >自研活体</el-radio
             >
             <el-radio label="S3" :disabled="!ruleForm.PC_CLIENT_ENABLED"
@@ -103,16 +120,46 @@
           </el-radio-group>
         </el-form-item>
 
-        <el-form-item label="启用C端考生端" prop="PC_CLIENT_ENABLED">
-          <el-switch
-            v-model="ruleForm.PC_CLIENT_ENABLED"
-            on-text="是"
-            off-text="否"
-            :disabled="false"
-          ></el-switch>
-        </el-form-item>
+        <div v-show="ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME !== 'S3'">
+          <el-form-item
+            label="开考时人脸识别API"
+            prop="FACE_VERIFY_API_PROVIDER"
+          >
+            <el-radio-group
+              v-model="ruleForm.FACE_VERIFY_API_PROVIDER"
+              class="input"
+            >
+              <el-radio label="FACEPP">旷视</el-radio>
+              <el-radio label="BAIDU">百度</el-radio>
+            </el-radio-group>
+          </el-form-item>
 
-        <div v-if="ruleForm.PC_CLIENT_ENABLED">
+          <el-form-item
+            label="抓拍时人脸比对API"
+            prop="FACE_COMPARE_API_PROVIDER"
+          >
+            <el-radio-group
+              v-model="ruleForm.FACE_COMPARE_API_PROVIDER"
+              class="input"
+            >
+              <el-radio label="FACEPP">旷视</el-radio>
+              <el-radio label="BAIDU">百度</el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-form-item
+            label="百度人脸比对通过阈值"
+            prop="BAIDU_EXPECT_FACE_COMPARE_SCORE"
+          >
+            <el-input
+              v-model="ruleForm.BAIDU_EXPECT_FACE_COMPARE_SCORE"
+              style="width: 180px"
+            ></el-input>
+            <span style="font-size: 14px; line-height: 44px"></span>
+          </el-form-item>
+        </div>
+
+        <div v-show="ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME === 'S3'">
           <el-form-item label="指定动作检测提醒" prop="ACTION_ALERT">
             <el-input
               v-model="ruleForm.ACTION_ALERT"
@@ -158,6 +205,13 @@
             ></el-input>
             <span style="font-size: 14px; line-height: 44px"> 秒</span>
           </el-form-item>
+          <el-form-item label="活体总时长限制" prop="ALL_ACTION_DURATION">
+            <el-input
+              v-model="ruleForm.ALL_ACTION_DURATION"
+              style="width: 180px"
+            ></el-input>
+            <span style="font-size: 14px; line-height: 44px"> 秒</span>
+          </el-form-item>
         </div>
 
         <el-form-item>
@@ -204,8 +258,7 @@ export default {
     };
 
     let checkActionOptions = (rule, value, callback) => {
-      let pcClientEnabled = this.ruleForm.PC_CLIENT_ENABLED;
-      if (pcClientEnabled) {
+      if (this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME === "S3") {
         if (this.ruleForm.ACTION_NUM != this.ruleForm.ACTION_OPTIONS.length) {
           return callback(new Error("动作个数与动作选项数量不一致"));
         }
@@ -214,11 +267,23 @@ export default {
     };
 
     let checkDuration = (rule, value, callback) => {
-      let pcClientEnabled = this.ruleForm.PC_CLIENT_ENABLED;
-      if (pcClientEnabled) {
+      if (this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME === "S3") {
+        let reg = /^[1-9][0-9]*$/;
+        if (!new String(value).match(reg) || value < 1 || value > 200) {
+          return callback(new Error("范围1至200之间"));
+        }
+      }
+      callback();
+    };
+
+    let checkFaceScore = (rule, value, callback) => {
+      if (
+        this.ruleForm.FACE_VERIFY_API_PROVIDER === "BAIDU" ||
+        this.ruleForm.FACE_COMPARE_API_PROVIDER === "BAIDU"
+      ) {
         let reg = /^[1-9][0-9]*$/;
-        if (!new String(value).match(reg) || value < 5 || value > 20) {
-          return callback(new Error("范围5至20之间"));
+        if (!new String(value).match(reg) || value < 50 || value > 90) {
+          return callback(new Error("范围50至90之间"));
         }
       }
       callback();
@@ -228,25 +293,29 @@ export default {
       actionOptions: ACTION_OPTION_LIST,
       rootOrgList: [],
       propertyGroupId: "",
-      formDataChanged: false,
+      btnSaveDiabled: false,
       originalRuleForm: {},
       ruleForm: {
         relatedPropertyGroupIdList: [],
         orgId: null,
         STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY: false,
-        SHOW_STUDENT_CLIENT_APP_QRCODE: false,
         STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL: "",
         SHOW_QMTH_LOGO: false,
         ID_NUMBER_PRIVATE_MODE: false,
+        SHOW_STUDENT_CLIENT_APP_QRCODE: false,
         APP_ENABLED: false,
         WEIXIN_ANSWER_ENABLED: false,
-        IDENTIFICATION_OF_LIVING_BODY_SCHEME: "",
         PC_CLIENT_ENABLED: false,
+        IDENTIFICATION_OF_LIVING_BODY_SCHEME: "S1",
+        FACE_VERIFY_API_PROVIDER: "FACEPP",
+        FACE_COMPARE_API_PROVIDER: "FACEPP",
+        BAIDU_EXPECT_FACE_COMPARE_SCORE: 70,
         ACTION_ALERT: "",
         ACTION_NUM: "",
         ACTION_OPTIONS: [],
         ACTION_ORDER: "",
         ACTION_DURATION: "",
+        ALL_ACTION_DURATION: "",
       },
       rules: {
         STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL: [
@@ -281,17 +350,27 @@ export default {
             trigger: "blur",
           },
         ],
+        ALL_ACTION_DURATION: [
+          { required: true, message: " ", trigger: "blur" },
+          {
+            validator: checkDuration,
+            trigger: "blur",
+          },
+        ],
+        BAIDU_EXPECT_FACE_COMPARE_SCORE: [
+          { required: true, message: " ", trigger: "blur" },
+          {
+            validator: checkFaceScore,
+            trigger: "blur",
+          },
+        ],
       },
     };
   },
   computed: {
     ...mapState({ user: (state) => state.user }),
-    btnSaveDiabled() {
-      console.log(this.formDataChanged);
-      return !this.formDataChanged;
-    },
     isSuperAdmin() {
-      return this.user.roleList.some((role) => role.roleCode == "SUPER_ADMIN");
+      return this.user.roleList.some((role) => role.roleCode === "SUPER_ADMIN");
     },
     rootSchoolSelect() {
       let rootSchools = [];
@@ -319,37 +398,14 @@ export default {
         }
       },
     },
-    ruleForm: {
+    /*ruleForm: {
       deep: true,
       handler: function (newForm) {
         if (Object.keys(this.originalRuleForm).length > 0) {
-          this.formDataChanged = !(
-            newForm.STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY ==
-              this.originalRuleForm.STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY &&
-            newForm.STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL ==
-              this.originalRuleForm.STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL &&
-            newForm.SHOW_QMTH_LOGO == this.originalRuleForm.SHOW_QMTH_LOGO &&
-            newForm.ID_NUMBER_PRIVATE_MODE ==
-              this.originalRuleForm.ID_NUMBER_PRIVATE_MODE &&
-            newForm.APP_ENABLED == this.originalRuleForm.APP_ENABLED &&
-            newForm.WEIXIN_ANSWER_ENABLED ==
-              this.originalRuleForm.WEIXIN_ANSWER_ENABLED &&
-            newForm.SHOW_STUDENT_CLIENT_APP_QRCODE ==
-              this.originalRuleForm.SHOW_STUDENT_CLIENT_APP_QRCODE &&
-            newForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME ==
-              this.originalRuleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME &&
-            newForm.PC_CLIENT_ENABLED ==
-              this.originalRuleForm.PC_CLIENT_ENABLED &&
-            newForm.ACTION_ALERT == this.originalRuleForm.ACTION_ALERT &&
-            newForm.ACTION_OPTIONS == this.originalRuleForm.ACTION_OPTIONS &&
-            newForm.ACTION_ORDER == this.originalRuleForm.ACTION_ORDER &&
-            newForm.ACTION_DURATION == this.originalRuleForm.ACTION_DURATION
-          );
-        } else {
-          this.formDataChanged = false;
+
         }
       },
-    },
+    },*/
   },
   created() {
     this.ruleForm.orgId = this.user.rootOrgId;
@@ -367,33 +423,46 @@ export default {
     submitForm(formName) {
       this.$refs[formName].validate((valid) => {
         if (valid) {
+          this.btnSaveDiabled = true;
+
           let params = {
             orgId: null,
             relatedPropertyGroupIdList: [],
             properties: {},
           };
+
           params.orgId = this.ruleForm.orgId;
+
           params.relatedPropertyGroupIdList =
             this.ruleForm.relatedPropertyGroupIdList;
 
           params.properties.STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY =
             this.ruleForm.STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY;
+
           params.properties.STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL =
             this.ruleForm.STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL;
+
           params.properties.SHOW_QMTH_LOGO = this.ruleForm.SHOW_QMTH_LOGO;
+
           params.properties.ID_NUMBER_PRIVATE_MODE =
             this.ruleForm.ID_NUMBER_PRIVATE_MODE;
+
+          params.properties.SHOW_STUDENT_CLIENT_APP_QRCODE =
+            this.ruleForm.SHOW_STUDENT_CLIENT_APP_QRCODE;
+
           params.properties.APP_ENABLED = this.ruleForm.APP_ENABLED;
+
           params.properties.WEIXIN_ANSWER_ENABLED =
             this.ruleForm.WEIXIN_ANSWER_ENABLED;
-          params.properties.SHOW_STUDENT_CLIENT_APP_QRCODE =
-            this.ruleForm.SHOW_STUDENT_CLIENT_APP_QRCODE;
+
+          params.properties.PC_CLIENT_ENABLED = this.ruleForm.PC_CLIENT_ENABLED;
+
           params.properties.IDENTIFICATION_OF_LIVING_BODY_SCHEME =
             this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME;
-          params.properties.PC_CLIENT_ENABLED = this.ruleForm.PC_CLIENT_ENABLED;
 
-          if (params.properties.PC_CLIENT_ENABLED) {
+          if (this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME === "S3") {
             params.properties.ACTION_ALERT = this.ruleForm.ACTION_ALERT;
+
             params.properties.ACTION_NUM = this.ruleForm.ACTION_NUM;
 
             // 固定动作顺序
@@ -407,7 +476,20 @@ export default {
             params.properties.ACTION_OPTIONS = finalActionOptions.join(",");
 
             params.properties.ACTION_ORDER = this.ruleForm.ACTION_ORDER;
+
             params.properties.ACTION_DURATION = this.ruleForm.ACTION_DURATION;
+
+            params.properties.ALL_ACTION_DURATION =
+              this.ruleForm.ALL_ACTION_DURATION;
+          } else {
+            params.properties.FACE_VERIFY_API_PROVIDER =
+              this.ruleForm.FACE_VERIFY_API_PROVIDER;
+
+            params.properties.FACE_COMPARE_API_PROVIDER =
+              this.ruleForm.FACE_COMPARE_API_PROVIDER;
+
+            params.properties.BAIDU_EXPECT_FACE_COMPARE_SCORE =
+              this.ruleForm.BAIDU_EXPECT_FACE_COMPARE_SCORE;
           }
 
           this.$httpWithMsg
@@ -418,10 +500,12 @@ export default {
                   message: "保存成功",
                   type: "success",
                 });
-                this.originalRuleForm = Object.assign({}, this.ruleForm);
-                this.formDataChanged = false;
+                this.btnSaveDiabled = false;
+                // this.originalRuleForm = Object.assign({}, this.ruleForm);
               },
-              () => {}
+              () => {
+                this.btnSaveDiabled = false;
+              }
             );
         } else {
           return false;
@@ -441,35 +525,63 @@ export default {
       this.$httpWithMsg.get(url).then((response) => {
         if (response) {
           this.ruleForm.STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY =
-            response.data.STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY == "true";
+            response.data.STUDENT_CLIENT_ACCESS_FROM_THIRD_PARTY === "true";
 
           this.ruleForm.STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL =
             response.data.STUDENT_CLIENT_THIRD_PARTY_LOGIN_URL;
 
-          this.ruleForm.SHOW_QMTH_LOGO = response.data.SHOW_QMTH_LOGO == "true";
+          this.ruleForm.SHOW_QMTH_LOGO =
+            response.data.SHOW_QMTH_LOGO === "true";
 
           this.ruleForm.ID_NUMBER_PRIVATE_MODE =
-            response.data.ID_NUMBER_PRIVATE_MODE == "true";
-
-          this.ruleForm.APP_ENABLED = response.data.APP_ENABLED == "true";
-
-          this.ruleForm.WEIXIN_ANSWER_ENABLED =
-            response.data.WEIXIN_ANSWER_ENABLED == "true";
+            response.data.ID_NUMBER_PRIVATE_MODE === "true";
 
           this.ruleForm.SHOW_STUDENT_CLIENT_APP_QRCODE =
-            response.data.SHOW_STUDENT_CLIENT_APP_QRCODE == "true";
+            response.data.SHOW_STUDENT_CLIENT_APP_QRCODE === "true";
 
-          this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME =
-            response.data.IDENTIFICATION_OF_LIVING_BODY_SCHEME;
+          this.ruleForm.APP_ENABLED = response.data.APP_ENABLED === "true";
+
+          this.ruleForm.WEIXIN_ANSWER_ENABLED =
+            response.data.WEIXIN_ANSWER_ENABLED === "true";
 
           // 未配置时,赋默认值
           this.ruleForm.PC_CLIENT_ENABLED =
-            "true" == response.data.PC_CLIENT_ENABLED;
+            response.data.PC_CLIENT_ENABLED === "true";
+
+          if (response.data.IDENTIFICATION_OF_LIVING_BODY_SCHEME) {
+            this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME =
+              response.data.IDENTIFICATION_OF_LIVING_BODY_SCHEME;
+          } else {
+            this.ruleForm.IDENTIFICATION_OF_LIVING_BODY_SCHEME = "S1";
+          }
+
+          if (response.data.FACE_VERIFY_API_PROVIDER) {
+            this.ruleForm.FACE_VERIFY_API_PROVIDER =
+              response.data.FACE_VERIFY_API_PROVIDER;
+          } else {
+            // BAIDU、FACEPP
+            this.ruleForm.FACE_VERIFY_API_PROVIDER = "FACEPP";
+          }
+
+          if (response.data.FACE_COMPARE_API_PROVIDER) {
+            this.ruleForm.FACE_COMPARE_API_PROVIDER =
+              response.data.FACE_COMPARE_API_PROVIDER;
+          } else {
+            // BAIDU、FACEPP
+            this.ruleForm.FACE_COMPARE_API_PROVIDER = "FACEPP";
+          }
+
+          if (response.data.BAIDU_EXPECT_FACE_COMPARE_SCORE) {
+            this.ruleForm.BAIDU_EXPECT_FACE_COMPARE_SCORE =
+              response.data.BAIDU_EXPECT_FACE_COMPARE_SCORE;
+          } else {
+            this.ruleForm.BAIDU_EXPECT_FACE_COMPARE_SCORE = 70;
+          }
 
           if (response.data.ACTION_ALERT) {
             this.ruleForm.ACTION_ALERT = response.data.ACTION_ALERT;
           } else {
-            this.ruleForm.ACTION_ALERT = 15;
+            this.ruleForm.ACTION_ALERT = 5;
           }
 
           if (response.data.ACTION_NUM) {
@@ -494,10 +606,17 @@ export default {
           if (response.data.ACTION_DURATION) {
             this.ruleForm.ACTION_DURATION = response.data.ACTION_DURATION;
           } else {
-            this.ruleForm.ACTION_DURATION = 15;
+            this.ruleForm.ACTION_DURATION = 10;
+          }
+
+          if (response.data.ALL_ACTION_DURATION) {
+            this.ruleForm.ALL_ACTION_DURATION =
+              response.data.ALL_ACTION_DURATION;
+          } else {
+            this.ruleForm.ALL_ACTION_DURATION = 120;
           }
 
-          this.originalRuleForm = Object.assign({}, this.ruleForm);
+          // this.originalRuleForm = Object.assign({}, this.ruleForm);
         } else {
           this.$notify({
             message: "学校设置信息暂未初始化,请立即初始化",

+ 27 - 7
src/modules/examwork/view/onlineExam.vue

@@ -692,7 +692,7 @@
                 </el-row>
                 <el-row v-show="form.properties.IS_FACE_ENABLE == 'true'">
                   <el-form-item
-                    label="预警阀值"
+                    label="预警比例"
                     prop="WARN_THRESHOLD"
                     :label-width="style.label_width_tab4"
                   >
@@ -708,7 +708,7 @@
                 </el-row>
                 <el-row v-show="form.properties.IS_FACE_ENABLE == 'true'">
                   <el-form-item
-                    label="真实性预警阀值"
+                    label="真实性预警比例"
                     prop="LIVING_WARN_THRESHOLD"
                     :label-width="style.label_width_tab4"
                   >
@@ -729,12 +729,31 @@
                   "
                 >
                   <el-form-item
-                    label="开启人脸活体检测"
+                    label="开启考前人脸活体检测"
+                    :label-width="style.label_width_tab4"
+                  >
+                    <el-radio-group
+                      v-model="form.properties.IS_FACE_VERIFY_BEFORE"
+                      :disabled="form.properties.IS_FACE_CHECK === 'false'"
+                      class="input"
+                    >
+                      <el-radio label="true">是</el-radio>
+                      <el-radio label="false">否</el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                </el-row>
+                <el-row
+                  v-if="
+                    form.properties.APP_EXAM_ENABLED == false &&
+                    form.properties.IS_FACE_ENABLE == 'true'
+                  "
+                >
+                  <el-form-item
+                    label="开启考中人脸活体检测"
                     :label-width="style.label_width_tab4"
                   >
                     <el-radio-group
                       v-model="form.properties.IS_FACE_VERIFY"
-                      :disabled="is_face_verify_diabled"
                       class="input"
                     >
                       <el-radio label="true">是</el-radio>
@@ -1395,6 +1414,7 @@ export default {
           IP_LIMIT: "false",
           IP_ADDRESSES: null,
           LIVING_WARN_THRESHOLD: 50,
+          IS_FACE_VERIFY_BEFORE: "false",
           IS_FACE_VERIFY: "false",
           VIRTUAL_CAMERA_AUDIT_ENABLED: "false",
           FACE_VERIFY_START_MINUTE: 5,
@@ -1584,6 +1604,7 @@ export default {
       if (this.form.properties.IS_FACE_ENABLE == "false") {
         this.form.properties.IS_STRANGER_ENABLE = "false";
         this.form.properties.IS_FACE_CHECK = "false";
+        this.form.properties.IS_FACE_VERIFY_BEFORE = "false";
         this.form.properties.IS_FACE_VERIFY = "false";
         this.form.properties.ADD_FACE_VERIFY_OUT_FREEZE_TIME = "false";
       }
@@ -1662,6 +1683,7 @@ export default {
           this.form.properties.IS_FACE_ENABLE = "false";
           this.form.properties.IS_STRANGER_ENABLE = "false";
           this.form.properties.IS_FACE_CHECK = "false";
+          this.form.properties.IS_FACE_VERIFY_BEFORE = "false";
           this.form.properties.IS_FACE_VERIFY = "false";
           this.form.properties.ADD_FACE_VERIFY_OUT_FREEZE_TIME = "false";
           this.is_face_enable_disabled = true;
@@ -1669,11 +1691,9 @@ export default {
           this.is_face_enable_disabled = false;
         }
         if (!res.IDENTIFICATION_OF_LIVING_BODY) {
-          this.is_face_verify_diabled = true;
+          this.form.properties.IS_FACE_VERIFY_BEFORE = "false";
           this.form.properties.IS_FACE_VERIFY = "false";
           this.form.properties.ADD_FACE_VERIFY_OUT_FREEZE_TIME = "false";
-        } else {
-          this.is_face_verify_diabled = false;
         }
       });
 

+ 447 - 0
src/modules/oe/component/ExamRecordDetail.vue

@@ -0,0 +1,447 @@
+<template>
+  <el-main
+    v-loading="needLoading"
+    style="overflow: unset; margin-left: 20px"
+    class="el-main-padding"
+  >
+    <el-row>
+      <el-col :span="5">
+        <img :src="studentBasePhotoPath" alt width="180" />
+        <img
+          v-if="showFirstCapturePhoto"
+          :src="syncCapturePhotoPath"
+          alt
+          class="syncPhto"
+        />
+      </el-col>
+
+      <el-col :span="19">
+        <el-row>
+          <el-col :span="8" class="capture-title">
+            <span>考试记录ID:{{ examRecordDataId }}</span>
+          </el-col>
+          <el-col
+            v-if="showAuditButton && needAudit"
+            :span="8"
+            style="text-align: center"
+          >
+            <el-button
+              size="small"
+              type="success"
+              icon="el-icon-check"
+              :disabled="needDisable"
+              round
+              @click="auditExamRecordData(true)"
+              >通过</el-button
+            >
+            <el-button
+              size="small"
+              type="danger"
+              icon="el-icon-close"
+              :disabled="needDisable"
+              round
+              @click="auditExamRecordData(false)"
+              >不通过</el-button
+            >
+          </el-col>
+
+          <el-col
+            :span="showAuditButton && needAudit ? 8 : 16"
+            style="text-align: right"
+          >
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-arrow-left"
+              :disabled="needDisable"
+              round
+              @click="changeExamRecordData(false)"
+              >上一条</el-button
+            >
+            <el-button
+              size="small"
+              type="primary"
+              :disabled="needDisable"
+              round
+              @click="changeExamRecordData(true)"
+              >下一条 <i class="el-icon-arrow-right el-icon--right"></i
+            ></el-button>
+          </el-col>
+        </el-row>
+
+        <el-row class="margin-top-10">
+          <el-col :span="24">
+            <el-table :data="examRecordData" border>
+              <el-table-column
+                label="姓名"
+                prop="studentName"
+                min-width="90px"
+              ></el-table-column>
+              <el-table-column
+                label="身份证号"
+                prop="identityNumber"
+                min-width="90px"
+              ></el-table-column>
+              <el-table-column
+                label="学号"
+                prop="studentCode"
+                min-width="90px"
+              ></el-table-column>
+              <el-table-column
+                label="课程代码"
+                prop="courseCode"
+                min-width="90px"
+              ></el-table-column>
+              <el-table-column
+                label="课程名称"
+                prop="courseName"
+                min-width="90px"
+              ></el-table-column>
+              <el-table-column label="课程层次" width="80">
+                <template slot-scope="scope">
+                  <span v-html="getLevel(scope.row.courseLevel)"></span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="客观题总分"
+                prop="objectiveTotalScore"
+                width="95"
+              ></el-table-column>
+              <el-table-column
+                label="学习中心"
+                prop="orgName"
+                min-width="90px"
+              ></el-table-column>
+              <el-table-column
+                label="年级"
+                width="60"
+                prop="grade"
+              ></el-table-column>
+            </el-table>
+          </el-col>
+        </el-row>
+
+        <el-row class="margin-top-20">
+          <el-col :span="24">
+            <el-table :data="examRecordData" border>
+              <el-table-column
+                label="切屏次数"
+                prop="switchScreenCount"
+                width="80"
+              ></el-table-column>
+              <el-table-column
+                label="校验次数"
+                prop="faceTotalCount"
+                width="80"
+              ></el-table-column>
+              <el-table-column
+                label="成功次数"
+                prop="faceSuccessCount"
+                width="80"
+              ></el-table-column>
+              <el-table-column
+                label="陌生人次数"
+                prop="faceStrangerCount"
+                width="95"
+              ></el-table-column>
+              <el-table-column
+                width="100"
+                label="人脸比对(%)"
+                prop="faceSuccessPercent"
+              ></el-table-column>
+              <el-table-column
+                width="115"
+                label="人脸真实性(%)"
+                prop="baiduFaceLivenessSuccessPercent"
+              ></el-table-column>
+              <el-table-column
+                min-width="90px"
+                label="虚拟设备"
+                prop="virtualCameraNames"
+              ></el-table-column>
+              <el-table-column
+                label="违纪类型"
+                prop="disciplineType"
+                min-width="90px"
+              ></el-table-column>
+              <el-table-column label="违纪说明" min-width="90px">
+                <template slot-scope="scope">
+                  <span
+                    v-html="disciplineTypeFilter(scope.row.disciplineDetail)"
+                  ></span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                width="80"
+                label="审核结果"
+                prop="status"
+              ></el-table-column>
+            </el-table>
+          </el-col>
+        </el-row>
+
+        <el-row class="margin-top-10 photorow">
+          <el-col
+            v-for="item in photoCaptures"
+            :key="item.id"
+            :span="6"
+            class="photocol"
+          >
+            <div v-show="item.pass" class="photo-pass">通过</div>
+            <div v-show="!item.pass" class="photo-nopass">不通过</div>
+            <img class="photo" :src="item.fileUrl" alt width="200" />
+            <div v-show="item.stranger" class="photo-stranger">陌生人</div>
+            <div
+              v-show="!item.isFacelivenessPass"
+              class="photo-facelivenessPass"
+            >
+              <i class="el-icon-warning" title="真实性不通过"></i>
+            </div>
+          </el-col>
+        </el-row>
+
+        <el-row class="margin-top-20">
+          <el-col :span="24">
+            <el-table :data="examProcessRecords" border>
+              <el-table-column
+                label="考试过程"
+                prop="processName"
+                width="180"
+              ></el-table-column>
+              <el-table-column
+                label="记录时间"
+                prop="recordTime"
+                width="180"
+              ></el-table-column>
+              <el-table-column
+                label="客户端IP"
+                prop="sourceIp"
+              ></el-table-column>
+            </el-table>
+          </el-col>
+        </el-row>
+      </el-col>
+    </el-row>
+  </el-main>
+</template>
+
+<script>
+import { mapState } from "vuex";
+export default {
+  name: "ExamRecordDetail",
+  props: {
+    examRecordDataId: {
+      type: Number,
+      default: null,
+    },
+    showAuditButton: {
+      type: Boolean,
+      default: false,
+    },
+    needLoading: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      examRecordData: [],
+      photoCaptures: [],
+      examProcessRecords: [],
+      studentBasePhotoPath: "/admin/img/no-photo.jpg",
+      syncCapturePhotoPath: "",
+      showFirstCapturePhoto: false,
+      needAudit: false,
+      needDisable: false,
+    };
+  },
+  computed: {
+    ...mapState({ user: (state) => state.user }),
+  },
+  watch: {
+    examRecordDataId() {
+      this.initDetail();
+    },
+    needLoading(val) {
+      console.log("needLoading:" + val);
+    },
+  },
+  created() {
+    this.initDetail();
+  },
+  methods: {
+    changeExamRecordData(isNext) {
+      this.needDisable = true;
+      this.$emit("changeExamRecordData", isNext);
+
+      setTimeout(() => {
+        this.needDisable = false;
+      }, 1000);
+    },
+    auditExamRecordData(isPass) {
+      this.needDisable = true;
+      this.$emit("auditExamRecordData", isPass);
+
+      setTimeout(() => {
+        this.needDisable = false;
+      }, 1000);
+    },
+    initDetail() {
+      console.log("initDetail... examRecordDataId:" + this.examRecordDataId);
+      this.examRecordData = [];
+      this.photoCaptures = [];
+      this.examProcessRecords = [];
+      this.studentBasePhotoPath = "/admin/img/no-photo.jpg";
+      this.syncCapturePhotoPath = "";
+      this.showFirstCapturePhoto = false;
+      this.needAudit = false;
+
+      if (this.examRecordDataId) {
+        this.getExamRecordData();
+        this.getPhotoCaptures();
+        this.getExamProcessRecords();
+      }
+    },
+    getExamRecordData() {
+      let param = new URLSearchParams({
+        examRecordDataId: this.examRecordDataId,
+      });
+      this.$http
+        .post("/api/ecs_oe_admin/exam/capture/audit/detail", param)
+        .then((response) => {
+          if (response.data) {
+            let result = response.data;
+            this.examRecordData = new Array(result);
+            if (result.syncCaptureFileUrl) {
+              this.syncCapturePhotoPath = result.syncCaptureFileUrl;
+              this.showFirstCapturePhoto = true;
+            }
+            if (this.showAuditButton) {
+              this.needAudit = result.isWarn && !result.isAudit;
+            }
+            this.getStudentInfo(result.studentId);
+          }
+        });
+    },
+    getStudentInfo(studentId) {
+      this.$http
+        .get("/api/ecs_core/student/getStudentInfo?studentId=" + studentId)
+        .then((response) => {
+          if (response.data.photoPath) {
+            this.studentBasePhotoPath = response.data.photoPath;
+          }
+        });
+    },
+    getPhotoCaptures() {
+      let param = new URLSearchParams({
+        examRecordDataId: this.examRecordDataId,
+      });
+      this.$http
+        .post("/api/ecs_oe_admin/exam/capture/list", param)
+        .then((response) => {
+          this.photoCaptures = response.data;
+        });
+    },
+    getExamProcessRecords() {
+      let url =
+        "/api/ecs_oe_admin/exam/capture/getExamProcessRecords?examRecordDataId=" +
+        this.examRecordDataId;
+      this.$http.get(url).then((response) => {
+        if (response.data) {
+          this.examProcessRecords = response.data;
+        }
+      });
+    },
+    getLevel(level) {
+      if (level === "ZSB") {
+        return "专升本";
+      } else if (level === "GQZ") {
+        return "高起专";
+      } else if (level === "GQB") {
+        return "高起本";
+      } else {
+        return "不限";
+      }
+    },
+    disciplineTypeFilter: function (value) {
+      if (value && value.indexOf("&&") > -1) {
+        let arr = value.split("&&");
+        let detail = "";
+        for (let i = 0; i < arr.length; i++) {
+          detail += arr[i] + "<br>";
+        }
+        return detail;
+      } else {
+        return value;
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+#capture-detail-header {
+  height: 15px !important;
+}
+.capture-title {
+  font-size: 20px;
+  font-weight: bold;
+}
+.photorow {
+  border: 1px solid #ebeef5;
+  text-align: center;
+}
+.photocol {
+  position: relative;
+  margin: 20px 10px 0 10px;
+}
+.photo {
+  display: block;
+  width: 208px;
+  height: 159px;
+  object-fit: contain;
+}
+.photo-pass {
+  position: absolute;
+  top: 2px;
+  width: 208px;
+  text-align: center;
+  color: white;
+  font-size: 12px;
+  background-color: rgba(10, 10, 10, 0.4);
+}
+.photo-nopass {
+  position: absolute;
+  top: 2px;
+  width: 208px;
+  text-align: center;
+  color: red;
+  font-size: 12px;
+  background-color: rgba(10, 10, 10, 0.4);
+}
+.photo-stranger {
+  position: absolute;
+  top: 140px;
+  width: 208px;
+  text-align: center;
+  color: red;
+  font-size: 12px;
+  background-color: rgba(10, 10, 10, 0.4);
+}
+.photo-facelivenessPass {
+  position: absolute;
+  top: 160px;
+  width: 208px;
+  font-size: 14px;
+  text-align: center;
+  color: red;
+}
+.syncPhto {
+  margin-top: 30px;
+  display: block;
+  width: 180px;
+  height: 159px;
+  object-fit: contain;
+}
+</style>
+<style scoped src="../style/common.css"></style>

+ 38 - 0
src/modules/oe/component/registerComponents.js

@@ -0,0 +1,38 @@
+import Vue from "vue";
+// import upperFirst from "lodash/upperFirst";
+// import camelCase from "lodash/camelCase";
+
+const requireComponent = require.context(
+  // The relative path of the components folder
+  "./",
+  // Whether or not to look in subfolders
+  false,
+  // The regular expression used to match base component filenames
+  /[A-Z]\w+\.(vue|js)$/
+);
+
+requireComponent.keys().forEach((fileName) => {
+  // Get component config
+  const componentConfig = requireComponent(fileName);
+
+  // Get PascalCase name of component
+  const componentName =
+    // upperFirst(
+    //   camelCase(
+    // Gets the file name regardless of folder depth
+    fileName
+      .split("/")
+      .pop()
+      .replace(/\.\w+$/, "");
+  //   )
+  // );
+
+  // Register component globally
+  Vue.component(
+    componentName,
+    // Look for the component options on `.default`, which will
+    // exist if the component was exported with `export default`,
+    // otherwise fall back to module's root.
+    componentConfig.default || componentConfig
+  );
+});

+ 12 - 12
src/modules/oe/views/absent.vue

@@ -38,33 +38,33 @@
           >
             <el-table-column
               sortable
-              label="课程"
-              prop="courseName"
+              label="姓名"
+              prop="studentName"
             ></el-table-column>
             <el-table-column
               sortable
-              label="课程层次"
-              prop="courseLevel"
+              label="身份证号"
+              prop="identityNumber"
             ></el-table-column>
             <el-table-column
               sortable
-              label="学习中心"
-              prop="orgName"
+              label="学"
+              prop="studentCode"
             ></el-table-column>
             <el-table-column
               sortable
-              label="姓名"
-              prop="studentName"
+              label="学习中心"
+              prop="orgName"
             ></el-table-column>
             <el-table-column
               sortable
-              label="身份证号"
-              prop="identityNumber"
+              label="课程"
+              prop="courseName"
             ></el-table-column>
             <el-table-column
               sortable
-              label="学号"
-              prop="studentCode"
+              label="课程层次"
+              prop="courseLevel"
             ></el-table-column>
             <el-table-column label="场次" width="120">
               <template slot-scope="scope">

+ 189 - 90
src/modules/oe/views/alreadyAudited.vue

@@ -229,7 +229,7 @@
             @selection-change="handleSelectionChange"
           >
             <el-table-column type="selection" width="40"></el-table-column>
-            <el-table-column label="考试ID">
+            <el-table-column label="考试记录ID" width="95">
               <template slot-scope="scope">
                 <el-button
                   v-show="currentPagePrivileges.SNAPSHOT_DETAILS"
@@ -242,142 +242,122 @@
                 }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="场次" width="120">
-              <template slot-scope="scope">
-                <el-popover trigger="hover" placement="left">
-                  <div style="font-size: 18px; font-family: 新宋体">
-                    <tr>
-                      <td style="color: green">场次序号</td>
-                      <td style="color: purple; padding-left: 20px">
-                        {{ scope.row.examStageOrder }}
-                      </td>
-                    </tr>
-                    <tr>
-                      <td style="color: green">开始时间</td>
-                      <td style="color: purple; padding-left: 20px">
-                        {{ scope.row.startTime }}
-                      </td>
-                    </tr>
-                    <tr>
-                      <td style="color: green">结束时间</td>
-                      <td style="color: purple; padding-left: 20px">
-                        {{ scope.row.endTime }}
-                      </td>
-                    </tr>
-                  </div>
-
-                  <div slot="reference" class="name-wrapper">
-                    <span>{{ scope.row.examStageOrder }}</span>
-                  </div>
-                </el-popover>
-              </template>
-            </el-table-column>
             <el-table-column
-              sortable
+              min-width="100"
               label="姓名"
               prop="studentName"
             ></el-table-column>
             <el-table-column
-              sortable
               label="身份证号"
               prop="identityNumber"
-              width="120"
+              min-width="100"
             ></el-table-column>
             <el-table-column
-              sortable
               label="学号"
               prop="studentCode"
-              width="120"
+              min-width="100"
             ></el-table-column>
             <el-table-column
-              sortable
               label="课程"
               prop="courseName"
-              width="120"
+              min-width="90"
             ></el-table-column>
             <el-table-column
-              sortable
               label="课程层次"
               prop="courseLevel"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="校验次数"
               prop="faceTotalCount"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="成功次数"
               prop="faceSuccessCount"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="陌生人记录"
+              label="陌生人次数"
               prop="faceStrangerCount"
-              width="120"
+              width="95"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="人脸识别成功率(%)"
+              label="人脸比对(%)"
               prop="faceSuccessPercent"
-              width="180"
+              width="100"
+            ></el-table-column>
+            <el-table-column
+              label="切屏次数"
+              prop="switchScreenCount"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="考试次数"
               prop="examOrder"
-              width="120"
+              width="80"
             ></el-table-column>
+            <el-table-column label="场次" min-width="90">
+              <template slot-scope="scope">
+                <el-popover trigger="hover" placement="left">
+                  <div style="font-size: 18px; font-family: 新宋体">
+                    <tr>
+                      <td style="color: green">场次序号</td>
+                      <td style="color: purple; padding-left: 20px">
+                        {{ scope.row.examStageOrder }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">开始时间</td>
+                      <td style="color: purple; padding-left: 20px">
+                        {{ scope.row.startTime }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">结束时间</td>
+                      <td style="color: purple; padding-left: 20px">
+                        {{ scope.row.endTime }}
+                      </td>
+                    </tr>
+                  </div>
+
+                  <div slot="reference" class="name-wrapper">
+                    <span>{{ scope.row.examStageOrder }}</span>
+                  </div>
+                </el-popover>
+              </template>
+            </el-table-column>
             <el-table-column
-              sortable
               label="开考时间"
               prop="paperStartTime"
-              width="120"
+              width="180"
             ></el-table-column>
             <el-table-column
-              sortable
               label="交卷时间"
               prop="paperSubmitTime"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="切屏次数"
-              prop="switchScreenCount"
-              width="120"
+              width="180"
             ></el-table-column>
             <el-table-column
-              sortable
               label="审核说明"
               prop="disciplineType"
-              width="120"
+              width="150"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="审核结果"
-              prop="status"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
               label="审核人"
               prop="auditUserName"
-              width="180"
+              width="120"
             ></el-table-column>
             <el-table-column
-              sortable
               label="审核时间"
               prop="paperAuditTime"
-              width="120"
+              width="180"
             ></el-table-column>
+            <el-table-column label="IP" prop="ip" width="125"></el-table-column>
             <el-table-column
-              sortable
-              label="Ip"
-              prop="ip"
-              width="120"
+              fixed="right"
+              label="审核结果"
+              prop="status"
+              width="80"
             ></el-table-column>
           </el-table>
           <div class="block pull-right">
@@ -394,7 +374,8 @@
         </el-col>
       </el-row>
       <el-dialog
-        title="审核"
+        title="重审"
+        width="400px"
         :visible.sync="dialogAuditFormVisible"
         @closed="auditDialogClosed"
       >
@@ -428,7 +409,7 @@
             <el-input
               v-model="auditForm.disciplineDetail"
               type="textarea"
-              :autosize="{ minRows: 6, maxRows: 10 }"
+              :autosize="{ minRows: 3, maxRows: 5 }"
               placeholder="请输入内容"
             ></el-input>
           </el-form-item>
@@ -440,6 +421,21 @@
           </div>
         </el-form>
       </el-dialog>
+
+      <el-dialog
+        title="考试记录详情"
+        width="1250px"
+        :visible.sync="examRecordDataDialog"
+        @close="examRecordDataDialogClose"
+      >
+        <ExamRecordDetail
+          :exam-record-data-id="curSelectedExamRecordDataId"
+          :show-audit-button="curSelectedShowAuditButton"
+          :need-loading="needLoading"
+          @changeExamRecordData="changeExamRecordData"
+          @auditExamRecordData="auditExamRecordData"
+        ></ExamRecordDetail>
+      </el-dialog>
     </el-main>
   </el-container>
 </template>
@@ -454,6 +450,12 @@ export default {
   mixins: [pagePrivilege],
   data() {
     return {
+      curSelectedExamRecordDataId: null,
+      curSelectedShowAuditButton: false,
+      needLoading: false,
+      examRecordDataDialog: false,
+      toNext: false,
+      curTotalPages: 0,
       auditExplainList: AUDIT_EXPLAIN_LIST,
       total: 0,
       tableLoading: false,
@@ -540,12 +542,12 @@ export default {
         // if (!this.currentPagePrivileges.INVIGILATE_AUDIT_STATUS) {
         //   this.form.status = "UN_PASS";
         // }
-        this.backFill();
+        // this.backFill();
       }
     },
   },
   created() {
-    this.backFill();
+    // this.backFill();
     this.getDisciplineTypeList("");
   },
   methods: {
@@ -705,7 +707,7 @@ export default {
       this.resetForm();
       this.showAllCondition = false;
     },
-    search(type) {
+    async search(type) {
       if (!this.form.examId) {
         this.$notify({
           title: "警告",
@@ -728,20 +730,21 @@ export default {
       //   params.status = "UN_PASS";
       // }
 
-      this.$http
+      await this.$http
         .post("/api/ecs_oe_admin/exam/audit/list", params)
         .then((response) => {
           if (response.data) {
             this.tableData = response.data.content;
             this.total = response.data.totalElements;
             this.form.pageNo = response.data.number + 1;
+            this.curTotalPages = response.data.totalPages;
           } else {
             this.tableData = [];
           }
           this.tableLoading = false;
-          this.$router.push({
-            path: "/oe/alreadyAudited?" + new URLSearchParams(params),
-          });
+          // this.$router.push({
+          //   path: "/oe/alreadyAudited?" + new URLSearchParams(params),
+          // });
         });
     },
     selectable(row) {
@@ -772,10 +775,106 @@ export default {
       this.form.pageNo = val;
       this.search();
     },
+    curSelectedRow(examRecordDataId) {
+      for (let n = 0; n < this.tableData.length; n++) {
+        let row = this.tableData[n];
+        if (examRecordDataId === row.examRecordDataId) {
+          this.$refs["multipleTable"]?.toggleRowSelection(row, true);
+        } else {
+          this.$refs["multipleTable"]?.toggleRowSelection(row, false);
+        }
+      }
+    },
+    examRecordDataDialogClose() {
+      this.examRecordDataDialog = false;
+    },
+    examRecordDataDialogOpen(examRecordDataId, showAuditButton) {
+      this.examRecordDataDialog = true;
+      this.curSelectedShowAuditButton = showAuditButton;
+      this.curSelectedExamRecordDataId = examRecordDataId;
+      this.curSelectedRow(examRecordDataId);
+    },
+    async changeExamRecordData(isNext) {
+      // console.log("isNext:" + isNext);
+      let curId = null;
+      let isFirst = false;
+      let isLast = false;
+      let rowSize = this.tableData.length;
+      for (let n = 0; n < rowSize; n++) {
+        isFirst = n === 0;
+        isLast = n === rowSize - 1;
+        let row = this.tableData[n];
+        if (this.curSelectedExamRecordDataId === row.examRecordDataId) {
+          curId = row.examRecordDataId;
+          if (isNext) {
+            if (!isLast) {
+              curId = this.tableData[n + 1].examRecordDataId;
+            } else {
+              if (this.form.pageNo < this.curTotalPages) {
+                // 跳到下一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo + 1;
+                console.log("+++>toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId = this.tableData[0].examRecordDataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为最后一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          } else {
+            if (!isFirst) {
+              curId = this.tableData[n - 1].examRecordDataId;
+            } else {
+              if (this.form.pageNo > 1) {
+                // 跳到上一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo - 1;
+                console.log("--->toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId =
+                    this.tableData[this.tableData.length - 1].examRecordDataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为第一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          }
+          break;
+        }
+      }
+
+      if (curId) {
+        this.curSelectedExamRecordDataId = curId;
+        this.curSelectedRow(curId);
+      } else {
+        this.examRecordDataDialogClose();
+      }
+    },
+    auditExamRecordData(isPass) {
+      console.log("isPass:" + isPass);
+    },
     gotoCaptureDetail(examRecordDataId) {
-      this.$router.push({
-        path: "/oe/captureDetail/" + examRecordDataId + "/alreadyAudited",
-      });
+      this.examRecordDataDialogOpen(examRecordDataId, false);
+      // this.$router.push({
+      //   path: "/oe/captureDetail/" + examRecordDataId + "/alreadyAudited",
+      // });
     },
     backFill() {
       var formData = this.$route.query;

+ 260 - 84
src/modules/oe/views/awaitingAudit.vue

@@ -217,12 +217,12 @@
               width="55"
               :selectable="selectable"
             ></el-table-column>
-            <el-table-column label="考试ID">
+            <el-table-column label="考试记录ID" width="95">
               <template slot-scope="scope">
                 <el-button
                   v-show="currentPagePrivileges.SNAPSHOT_DETAILS"
                   type="text"
-                  @click="gotoCaptureDetail(scope.row.dataId)"
+                  @click="gotoCaptureDetail(scope.row)"
                   >{{ scope.row.dataId }}</el-button
                 >
                 <span v-show="!currentPagePrivileges.SNAPSHOT_DETAILS">
@@ -231,129 +231,136 @@
               </template>
             </el-table-column>
             <el-table-column
-              sortable
               label="姓名"
               prop="studentName"
+              min-width="100"
             ></el-table-column>
             <el-table-column
-              sortable
               label="身份证号"
               prop="identityNumber"
-              width="120"
+              min-width="100"
             ></el-table-column>
             <el-table-column
-              sortable
               label="学号"
               prop="studentCode"
+              min-width="100"
             ></el-table-column>
             <el-table-column
-              sortable
               label="学习中心"
               prop="orgName"
-              width="120"
+              min-width="90"
             ></el-table-column>
             <el-table-column
-              sortable
               label="课程"
               prop="courseName"
-              width="150"
+              min-width="90"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="客观题总分"
-              prop="objectiveTotalScore"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
               label="课程层次"
               prop="courseLevel"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="虚拟设备"
-              prop="virtualCameraNames"
-              width="120"
+              label="客观题总分"
+              prop="objectiveTotalScore"
+              width="95"
             ></el-table-column>
             <el-table-column
-              sortable
               label="校验次数"
               prop="faceTotalCount"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="成功次数"
               prop="faceSuccessCount"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="陌生人记录"
+              label="陌生人次数"
               prop="faceStrangerCount"
-              width="120"
+              width="95"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="人脸识别成功率(%)"
+              label="人脸比对(%)"
               prop="faceSuccessPercent"
-              width="180"
+              width="100"
+            ></el-table-column>
+            <el-table-column
+              label="人脸真实性(%)"
+              prop="baiduFaceLivenessSuccessPercent"
+              width="115"
             ></el-table-column>
             <el-table-column
-              sortable
               label="开考时间"
               prop="paperStartTime"
-              width="120"
+              width="180"
             ></el-table-column>
             <el-table-column
-              sortable
               label="交卷时间"
               prop="paperSubmitTime"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="人脸真实性比率(%)"
-              prop="baiduFaceLivenessSuccessPercent"
               width="180"
             ></el-table-column>
+            <el-table-column label="IP" prop="ip" width="125"></el-table-column>
             <el-table-column
-              sortable
-              label="Ip"
-              prop="ip"
-              width="180"
+              label="虚拟设备"
+              prop="virtualCameraNames"
+              width="100"
             ></el-table-column>
             <el-table-column
               v-if="currentPagePrivileges.PENDING_OPERATE"
               :context="_self"
               label="操作"
               fixed="right"
-              width="120"
+              width="100"
             >
               <div slot-scope="scope">
-                <el-row class="operateRow">
+                <el-row
+                  v-if="scope.row.examType != 'OFFLINE'"
+                  class="operateRow"
+                >
                   <el-col :span="24">
                     <el-button
-                      v-if="scope.row.isWarn"
                       size="mini"
-                      type="success"
-                      icon="el-icon-success"
-                      @click="auditPass(scope.row.dataId)"
-                      >通&nbsp;&nbsp;&nbsp;&nbsp;过</el-button
+                      type="primary"
+                      icon="el-icon-view"
+                      @click="examPaperDetail(scope.row)"
+                      >调卷</el-button
                     >
                   </el-col>
                 </el-row>
-                <el-row class="operateRow">
+                <el-row v-if="scope.row.isWarn" class="operateRow">
                   <el-col :span="24">
-                    <el-button
-                      v-if="scope.row.isWarn"
-                      size="mini"
-                      type="danger"
-                      icon="el-icon-error"
-                      @click="openAuditDialog(scope.row.dataId)"
-                      >不通过</el-button
-                    >
+                    <el-dropdown>
+                      <el-button
+                        size="mini"
+                        icon="el-icon-arrow-down"
+                        type="primary"
+                        plain
+                        >审核</el-button
+                      >
+                      <el-dropdown-menu slot="dropdown">
+                        <el-dropdown-item>
+                          <el-button
+                            v-if="scope.row.isWarn"
+                            size="mini"
+                            type="success"
+                            icon="el-icon-success"
+                            @click="auditPass(scope.row.dataId, false)"
+                            >通&nbsp;&nbsp;&nbsp;&nbsp;过</el-button
+                          >
+                        </el-dropdown-item>
+                        <el-dropdown-item>
+                          <el-button
+                            v-if="scope.row.isWarn"
+                            size="mini"
+                            type="danger"
+                            icon="el-icon-error"
+                            @click="openAuditDialog(scope.row.dataId, false)"
+                            >不通过</el-button
+                          >
+                        </el-dropdown-item>
+                      </el-dropdown-menu>
+                    </el-dropdown>
                   </el-col>
                 </el-row>
               </div>
@@ -374,6 +381,7 @@
       </el-row>
       <el-dialog
         title="审核"
+        width="400px"
         :visible.sync="dialogFormVisible"
         @closed="auditDialogClosed"
       >
@@ -407,7 +415,7 @@
             <el-input
               v-model="auditForm.disciplineDetail"
               type="textarea"
-              :autosize="{ minRows: 6, maxRows: 10 }"
+              :autosize="{ minRows: 3, maxRows: 5 }"
               placeholder="请输入内容"
             ></el-input>
           </el-form-item>
@@ -418,7 +426,8 @@
         </el-form>
       </el-dialog>
       <el-dialog
-        title="审核"
+        title="批量审核"
+        width="400px"
         :visible.sync="dialogBatchFormVisible"
         @closed="batchAuditDialogClosed"
       >
@@ -452,7 +461,7 @@
             <el-input
               v-model="batchAuditForm.disciplineDetail"
               type="textarea"
-              :autosize="{ minRows: 6, maxRows: 10 }"
+              :autosize="{ minRows: 3, maxRows: 5 }"
               placeholder="请输入内容"
             ></el-input>
           </el-form-item>
@@ -462,6 +471,21 @@
           </div>
         </el-form>
       </el-dialog>
+
+      <el-dialog
+        title="考试记录详情"
+        width="1250px"
+        :visible.sync="examRecordDataDialog"
+        @close="examRecordDataDialogClose"
+      >
+        <ExamRecordDetail
+          :exam-record-data-id="curSelectedExamRecordDataId"
+          :show-audit-button="curSelectedShowAuditButton"
+          :need-loading="needLoading"
+          @changeExamRecordData="changeExamRecordData"
+          @auditExamRecordData="auditExamRecordData"
+        ></ExamRecordDetail>
+      </el-dialog>
     </el-main>
   </el-container>
 </template>
@@ -473,8 +497,36 @@ import _ from "lodash";
 export default {
   components: { commonFormVue },
   mixins: [pagePrivilege],
+  // beforeRouteEnter(to, from, next) {
+  //   next((vm) => {
+  //     if (from.params?.checkedRows) {
+  //       const unwatch = vm.$watch("tableData", (tableData = []) => {
+  //         tableData.forEach((d) => {
+  //           vm.$refs["multipleTable"]?.toggleRowSelection(
+  //             d,
+  //             from.params.checkedRows.includes(d.dataId)
+  //           );
+  //         });
+  //         if (unwatch) {
+  //           unwatch();
+  //         }
+  //       });
+  //     }
+  //   });
+  // },
+  // beforeRouteLeave(to, from, next) {
+  //   to.params.checkedRows = this.routeSelectedIds;
+  //   next();
+  // },
   data() {
     return {
+      curSelectedExamRecordDataId: null,
+      curSelectedShowAuditButton: false,
+      needLoading: false,
+      examRecordDataDialog: false,
+      toNext: false,
+      curTotalPages: 0,
+      routeSelectedIds: [],
       total: 0,
       tableLoading: false,
       exportLoading: false,
@@ -549,7 +601,7 @@ export default {
     },
   },
   created() {
-    this.backFill();
+    // this.backFill();
     this.getDisciplineTypeList("");
   },
   methods: {
@@ -606,7 +658,7 @@ export default {
       this.resetForm();
       this.showAllCondition = false;
     },
-    search(type) {
+    async search(type) {
       if (!this.form.examId) {
         this.$notify({
           title: "警告",
@@ -621,20 +673,21 @@ export default {
       }
       this.tableLoading = true;
       var params = JSON.parse(JSON.stringify(this.form));
-      this.$http
+      await this.$http
         .post("/api/ecs_oe_admin/exam/record/waiting/audit/list", params)
         .then((response) => {
           if (response.data) {
             this.tableData = response.data.content;
             this.total = response.data.totalElements;
             this.form.pageNo = response.data.number + 1;
+            this.curTotalPages = response.data.totalPages;
           } else {
             this.tableData = [];
           }
           this.tableLoading = false;
-          this.$router.push({
-            path: "/oe/awaitingAudit?" + new URLSearchParams(params),
-          });
+          // this.$router.push({
+          //   path: "/oe/awaitingAudit?" + new URLSearchParams(params),
+          // });
         });
     },
     formatVirtualCameraName(row) {
@@ -689,12 +742,13 @@ export default {
                 type: "success",
                 duration: 5000,
               });
-              this.search();
+              // this.search();
             });
         })
         .catch(() => {});
     },
-    openAuditDialog(examRecordDataId) {
+    openAuditDialog(examRecordDataId, toNext) {
+      this.toNext = toNext;
       this.dialogFormVisible = true;
       this.auditForm = {
         examRecordDataId: examRecordDataId,
@@ -703,6 +757,11 @@ export default {
         isPass: false,
       };
     },
+    examPaperDetail(row) {
+      window.open(
+        "/admin/oe/examPaperDetail/" + row.courseId + "/" + row.dataId
+      );
+    },
     openBatchAudit() {
       this.dialogBatchFormVisible = true;
       var examRecordDataIds = [];
@@ -730,7 +789,10 @@ export default {
                 duration: 5000,
               });
               this.dialogFormVisible = false;
-              this.search();
+              // this.search();
+              if (this.toNext) {
+                this.changeExamRecordData(true);
+              }
             });
         } else {
           return false;
@@ -756,7 +818,7 @@ export default {
                   duration: 5000,
                 });
                 this.dialogBatchFormVisible = false;
-                this.search();
+                // this.search();
               });
           });
         } else {
@@ -773,7 +835,7 @@ export default {
     /**
      * 审核通过
      */
-    auditPass(examRecordDataId) {
+    auditPass(examRecordDataId, toNext) {
       var auditParams = {
         examRecordDataId: examRecordDataId,
         isPass: true,
@@ -782,16 +844,119 @@ export default {
       this.$http
         .post("/api/ecs_oe_admin/exam/audit/single/audit", param)
         .then(() => {
-          this.search();
           this.$notify({
             title: "成功",
             message: "操作成功",
             type: "success",
             duration: 5000,
           });
+
+          // this.search();
+          if (toNext) {
+            this.changeExamRecordData(true);
+          }
         });
     },
-    gotoCaptureDetail(examRecordDataId) {
+    curSelectedRow(examRecordDataId) {
+      for (let n = 0; n < this.tableData.length; n++) {
+        let row = this.tableData[n];
+        if (examRecordDataId === row.dataId) {
+          this.$refs["multipleTable"]?.toggleRowSelection(row, true);
+        } else {
+          this.$refs["multipleTable"]?.toggleRowSelection(row, false);
+        }
+      }
+    },
+    examRecordDataDialogClose() {
+      this.examRecordDataDialog = false;
+    },
+    examRecordDataDialogOpen(examRecordDataId, showAuditButton) {
+      this.examRecordDataDialog = true;
+      this.curSelectedShowAuditButton = showAuditButton;
+      this.curSelectedExamRecordDataId = examRecordDataId;
+      this.curSelectedRow(examRecordDataId);
+    },
+    async changeExamRecordData(isNext) {
+      // console.log("isNext:" + isNext);
+      let curId = null;
+      let isFirst = false;
+      let isLast = false;
+      let rowSize = this.tableData.length;
+      for (let n = 0; n < rowSize; n++) {
+        isFirst = n === 0;
+        isLast = n === rowSize - 1;
+        let row = this.tableData[n];
+        if (this.curSelectedExamRecordDataId === row.dataId) {
+          curId = row.dataId;
+          if (isNext) {
+            if (!isLast) {
+              curId = this.tableData[n + 1].dataId;
+            } else {
+              if (this.form.pageNo < this.curTotalPages) {
+                // 跳到下一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo + 1;
+                console.log("+++>toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId = this.tableData[0].dataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为最后一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          } else {
+            if (!isFirst) {
+              curId = this.tableData[n - 1].dataId;
+            } else {
+              if (this.form.pageNo > 1) {
+                // 跳到上一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo - 1;
+                console.log("--->toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId = this.tableData[this.tableData.length - 1].dataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为第一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          }
+          break;
+        }
+      }
+
+      if (curId) {
+        this.curSelectedExamRecordDataId = curId;
+        this.curSelectedRow(curId);
+      } else {
+        this.examRecordDataDialogClose();
+      }
+    },
+    auditExamRecordData(isPass) {
+      console.log("isPass:" + isPass);
+      if (isPass) {
+        this.auditPass(this.curSelectedExamRecordDataId, true);
+      } else {
+        this.openAuditDialog(this.curSelectedExamRecordDataId, true);
+      }
+    },
+    gotoCaptureDetail(row) {
       if (!this.form.examId) {
         this.$notify({
           title: "警告",
@@ -801,13 +966,24 @@ export default {
         });
         return false;
       }
-      let pendingOperate = !this.currentPagePrivileges.PENDING_OPERATE;
-      let searchParam = JSON.stringify(this.form);
-      this.$router.push({
-        path: "/oe/captureDetail/" + examRecordDataId + "/awaitingAudit",
-        // name: "captureDetail",
-        query: { pendingOperate, searchParam },
-      });
+
+      let pendingOperate = this.currentPagePrivileges.PENDING_OPERATE;
+      this.examRecordDataDialogOpen(row.dataId, pendingOperate);
+
+      // this.routeSelectedIds = [];
+      // this.routeSelectedIds.push(row.dataId);
+      // this.$refs["multipleTable"]?.toggleRowSelection(row, true);
+
+      // let searchParam = JSON.stringify(this.form);
+      // this.$nextTick(() => {
+      //   /** checkbox UI选中状态延迟 */
+      //   setTimeout(() => {
+      //     this.$router.push({
+      //       path: "/oe/captureDetail/" + row.dataId + "/awaitingAudit",
+      //       query: { pendingOperate, searchParam },
+      //     });
+      //   }, 200);
+      // });
     },
     backFill() {
       var formData = this.$route.query;

+ 40 - 58
src/modules/oe/views/captureDetail.vue

@@ -12,7 +12,7 @@
         <el-col :span="19">
           <el-row>
             <el-col :span="8" class="capture-title">
-              <span>监考数据ID:{{ examRecordDataId }}</span>
+              <span>考试记录ID:{{ examRecordDataId }}</span>
             </el-col>
             <el-col v-if="showAudit" :span="8" style="text-align: center">
               <el-button
@@ -71,55 +71,49 @@
             <el-col :span="24">
               <el-table :data="examAuditData" border>
                 <el-table-column
-                  sortable
-                  label="学习中心"
-                  prop="orgName"
-                  min-width="110px"
-                ></el-table-column>
-                <el-table-column
-                  sortable
-                  label="年级"
-                  prop="grade"
-                ></el-table-column>
-                <el-table-column
-                  sortable
-                  label="学号"
-                  prop="studentCode"
-                  min-width="110px"
+                  label="姓名"
+                  prop="studentName"
+                  min-width="90px"
                 ></el-table-column>
                 <el-table-column
-                  sortable
                   label="身份证号"
                   prop="identityNumber"
-                  min-width="120px"
+                  min-width="90px"
                 ></el-table-column>
                 <el-table-column
-                  sortable
-                  label="姓名"
-                  prop="studentName"
+                  label="学号"
+                  prop="studentCode"
+                  min-width="90px"
                 ></el-table-column>
                 <el-table-column
-                  sortable
                   label="课程代码"
                   prop="courseCode"
-                  min-width="110px"
+                  min-width="90px"
                 ></el-table-column>
                 <el-table-column
-                  sortable
                   label="课程名称"
                   prop="courseName"
-                  min-width="110px"
+                  min-width="90px"
                 ></el-table-column>
-                <el-table-column sortable label="课程层次" min-width="110px">
+                <el-table-column label="课程层次" width="80">
                   <template slot-scope="scope">
                     <span v-html="getLevel(scope.row.courseLevel)"></span>
                   </template>
                 </el-table-column>
                 <el-table-column
-                  sortable
                   label="客观题总分"
                   prop="objectiveTotalScore"
-                  min-width="150px"
+                  width="95"
+                ></el-table-column>
+                <el-table-column
+                  label="学习中心"
+                  prop="orgName"
+                  min-width="90px"
+                ></el-table-column>
+                <el-table-column
+                  label="年级"
+                  width="60"
+                  prop="grade"
                 ></el-table-column>
               </el-table>
             </el-col>
@@ -128,54 +122,46 @@
             <el-col :span="24">
               <el-table :data="examAuditData" border>
                 <el-table-column
-                  sortable
                   label="切屏次数"
                   prop="switchScreenCount"
-                  width="110"
+                  width="80"
                 ></el-table-column>
                 <el-table-column
-                  sortable
-                  label="校验(次)"
+                  label="校验次数"
                   prop="faceTotalCount"
-                  width="100"
+                  width="80"
                 ></el-table-column>
                 <el-table-column
-                  sortable
-                  label="成功(次)"
+                  label="成功次数"
                   prop="faceSuccessCount"
-                  width="100"
+                  width="80"
                 ></el-table-column>
                 <el-table-column
-                  sortable
-                  label="陌生人(次)"
+                  label="陌生人次数"
                   prop="faceStrangerCount"
-                  width="120"
+                  width="95"
                 ></el-table-column>
                 <el-table-column
-                  width="140"
-                  sortable
+                  width="100"
                   label="人脸比对(%)"
                   prop="faceSuccessPercent"
                 ></el-table-column>
                 <el-table-column
-                  width="140"
-                  sortable
+                  width="115"
                   label="人脸真实性(%)"
                   prop="baiduFaceLivenessSuccessPercent"
                 ></el-table-column>
                 <el-table-column
-                  width="120"
-                  sortable
+                  min-width="90px"
                   label="虚拟设备"
                   prop="virtualCameraNames"
                 ></el-table-column>
                 <el-table-column
-                  sortable
                   label="违纪类型"
                   prop="disciplineType"
-                  width="130"
+                  min-width="90px"
                 ></el-table-column>
-                <el-table-column sortable label="违纪说明" width="260">
+                <el-table-column label="违纪说明" min-width="90px">
                   <template slot-scope="scope">
                     <span
                       v-html="disciplineTypeFilter(scope.row.disciplineDetail)"
@@ -183,8 +169,7 @@
                   </template>
                 </el-table-column>
                 <el-table-column
-                  width="120"
-                  sortable
+                  width="80"
                   label="审核结果"
                   prop="status"
                 ></el-table-column>
@@ -214,20 +199,17 @@
             <el-col :span="24">
               <el-table :data="examProcessRecordData" border>
                 <el-table-column
-                  sortable
                   label="考试过程"
                   prop="processName"
-                  width="200"
+                  width="180"
                 ></el-table-column>
                 <el-table-column
-                  sortable
-                  label="日期"
+                  label="记录时间"
                   prop="recordTime"
-                  width="200"
+                  width="180"
                 ></el-table-column>
                 <el-table-column
-                  sortable
-                  label="客户端ip"
+                  label="客户端IP"
                   prop="sourceIp"
                 ></el-table-column>
               </el-table>
@@ -355,7 +337,7 @@ export default {
         .then((response) => {
           if (response.data) {
             this.showAudit =
-              isPendingAudit == "false" &&
+              isPendingAudit == "true" &&
               response.data.isWarn &&
               !response.data.isAudit;
             // if (response.data.virtualCameraNames === "") {

+ 205 - 111
src/modules/oe/views/examDetail.vue

@@ -194,7 +194,7 @@
             @selection-change="handleSelectionChange"
           >
             <el-table-column type="selection" width="40"></el-table-column>
-            <el-table-column label="考试ID" width="120">
+            <el-table-column label="考试记录ID" width="95">
               <template slot-scope="scope">
                 <el-button
                   v-show="
@@ -216,7 +216,37 @@
                 >
               </template>
             </el-table-column>
-            <el-table-column label="场次" width="120">
+            <el-table-column
+              label="姓名"
+              prop="studentName"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="身份证号"
+              prop="identityNumber"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="学号"
+              prop="studentCode"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="学习中心"
+              prop="orgName"
+              min-width="90"
+            ></el-table-column>
+            <el-table-column
+              label="课程"
+              prop="courseNameAndCode"
+              width="160"
+            ></el-table-column>
+            <el-table-column
+              label="课程层次"
+              prop="courseLevel"
+              width="80"
+            ></el-table-column>
+            <el-table-column label="场次" min-width="90">
               <template slot-scope="scope">
                 <el-popover trigger="hover" placement="left">
                   <div style="font-size: 18px; font-family: 新宋体">
@@ -247,139 +277,88 @@
               </template>
             </el-table-column>
             <el-table-column
-              sortable
-              label="学习中心"
-              prop="orgName"
-              width="120"
+              label="考试次数"
+              prop="examOrder"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="姓名"
-              prop="studentName"
-              width="120"
+              label="续考次数"
+              prop="continuedCount"
+              width="80"
             ></el-table-column>
             <el-table-column
               sortable
-              label="身份证号"
-              prop="identityNumber"
-              width="120"
+              :sort-method="sortByExamTime"
+              label="持续时间"
+              prop="examTime"
+              width="110"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="学号"
-              prop="studentCode"
-              width="120"
+              label="开考时间"
+              prop="paperStartTime"
+              width="160"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="课程"
-              prop="courseNameAndCode"
-              width="120"
+              label="交卷时间"
+              prop="paperSubmitTime"
+              width="160"
             ></el-table-column>
             <el-table-column
               sortable
-              label="课程层次"
-              prop="courseLevel"
-              width="120"
+              :sort-method="sortByPaperTotalScore"
+              label="卷面总分"
+              prop="paperTotalScore"
+              width="110"
             ></el-table-column>
             <el-table-column
-              sortable
               label="年级"
               prop="grade"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="学生电话"
               prop="phone"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="采集人"
               prop="infoCollector"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="考试次数"
-              prop="examOrder"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="开考时间"
-              prop="paperStartTime"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="交卷时间"
-              prop="paperSubmitTime"
-              width="120"
+              width="80"
             ></el-table-column>
+
             <el-table-column
-              sortable
-              :sort-method="sortByExamTime"
-              label="持续时间"
-              prop="examTime"
-              width="120"
+              label="切屏次数"
+              prop="switchScreenCount"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="校验成功率(%)"
+              label="人脸比对(%)"
               prop="faceSuccessPercent"
-              width="150"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="续考次数"
-              prop="continuedCount"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="虚拟设备"
-              prop="virtualCameraNames"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="IP"
-              prop="ip"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              :sort-method="sortByPaperTotalScore"
-              label="卷面总分"
-              prop="paperTotalScore"
-              width="120"
+              width="100"
             ></el-table-column>
+
             <el-table-column
-              sortable
-              label="切屏次数"
-              prop="switchScreenCount"
-              width="120"
+              label="是否交卷"
+              prop="isSubmit"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="是否违纪"
               prop="isIllegality"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="审核人"
               prop="auditUserName"
               width="120"
             ></el-table-column>
+            <el-table-column label="IP" prop="ip" width="125"></el-table-column>
             <el-table-column
-              sortable
-              label="是否提交"
-              prop="isSubmit"
-              width="120"
+              label="虚拟设备"
+              prop="virtualCameraNames"
+              width="100"
             ></el-table-column>
+
             <el-table-column fixed="right" label="详情" width="100">
               <template slot-scope="scope">
                 <el-row
@@ -479,7 +458,8 @@
         </el-col>
       </el-row>
       <el-dialog
-        title="审核"
+        title="重审"
+        width="400px"
         :visible.sync="dialogAuditFormVisible"
         @closed="auditDialogClosed"
       >
@@ -513,7 +493,7 @@
             <el-input
               v-model="auditForm.disciplineDetail"
               type="textarea"
-              :autosize="{ minRows: 6, maxRows: 10 }"
+              :autosize="{ minRows: 3, maxRows: 5 }"
               placeholder="请输入内容"
             ></el-input>
           </el-form-item>
@@ -575,6 +555,20 @@
       <el-dialog :append-to-body="true" :visible.sync="dialogVisible">
         <img width="100%" :src="dialogImageUrl" alt />
       </el-dialog>
+
+      <el-dialog
+        title="考试记录详情"
+        width="1250px"
+        :visible.sync="examRecordDataDialog"
+        @close="examRecordDataDialogClose"
+      >
+        <ExamRecordDetail
+          :exam-record-data-id="curSelectedExamRecordDataId"
+          :show-audit-button="curSelectedShowAuditButton"
+          :need-loading="needLoading"
+          @changeExamRecordData="changeExamRecordData"
+        ></ExamRecordDetail>
+      </el-dialog>
     </el-main>
   </el-container>
 </template>
@@ -609,6 +603,12 @@ export default {
   },
   data() {
     return {
+      curSelectedExamRecordDataId: null,
+      curSelectedShowAuditButton: false,
+      needLoading: false,
+      examRecordDataDialog: false,
+      toNext: false,
+      curTotalPages: 0,
       isOnlineExam: false,
       needShowReAudit: false,
       selectedIds: [],
@@ -696,7 +696,7 @@ export default {
   },
   created() {
     this.form.rootOrgId = this.user.rootOrgId;
-    this.backFill();
+    // this.backFill();
     this.getDisciplineTypeList("");
   },
   methods: {
@@ -793,7 +793,7 @@ export default {
         this.form.endTime = "";
       }
     },
-    search(type) {
+    async search(type) {
       if (!this.form.examId) {
         this.$notify({
           title: "警告",
@@ -813,13 +813,14 @@ export default {
       this.needShowReAudit = false;
 
       var params = JSON.parse(JSON.stringify(this.form));
-      this.$http
+      await this.$http
         .post("/api/ecs_oe_admin/exam/record/detail/list", params)
         .then((response) => {
           if (response.data) {
             this.tableData = response.data.content;
             this.total = response.data.totalElements;
             this.form.pageNo = response.data.number + 1;
+            this.curTotalPages = response.data.totalPages;
 
             this.tableData.forEach((obj) => {
               if (obj.showReAudit) {
@@ -830,9 +831,9 @@ export default {
             this.tableData = [];
           }
           this.tableLoading = false;
-          this.$router.push({
-            path: "/oe/examDetail?" + new URLSearchParams(params),
-          });
+          // this.$router.push({
+          //   path: "/oe/examDetail?" + new URLSearchParams(params),
+          // });
         });
     },
     handleSelectionChange(row) {
@@ -864,18 +865,111 @@ export default {
         "/admin/oe/examPaperDetail/" + courseId + "/" + examRecordDataId
       );
     },
+    curSelectedRow(examRecordDataId) {
+      for (let n = 0; n < this.tableData.length; n++) {
+        let row = this.tableData[n];
+        if (examRecordDataId === row.dataId) {
+          this.$refs["multipleTable"]?.toggleRowSelection(row, true);
+        } else {
+          this.$refs["multipleTable"]?.toggleRowSelection(row, false);
+        }
+      }
+    },
+    examRecordDataDialogClose() {
+      this.examRecordDataDialog = false;
+    },
+    examRecordDataDialogOpen(examRecordDataId, showAuditButton) {
+      this.examRecordDataDialog = true;
+      this.curSelectedShowAuditButton = showAuditButton;
+      this.curSelectedExamRecordDataId = examRecordDataId;
+      this.curSelectedRow(examRecordDataId);
+    },
+    async changeExamRecordData(isNext) {
+      // console.log("isNext:" + isNext);
+      let curId = null;
+      let isFirst = false;
+      let isLast = false;
+      let rowSize = this.tableData.length;
+      for (let n = 0; n < rowSize; n++) {
+        isFirst = n === 0;
+        isLast = n === rowSize - 1;
+        let row = this.tableData[n];
+        if (this.curSelectedExamRecordDataId === row.dataId) {
+          curId = row.dataId;
+          if (isNext) {
+            if (!isLast) {
+              curId = this.tableData[n + 1].dataId;
+            } else {
+              if (this.form.pageNo < this.curTotalPages) {
+                // 跳到下一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo + 1;
+                console.log("+++>toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId = this.tableData[0].dataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为最后一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          } else {
+            if (!isFirst) {
+              curId = this.tableData[n - 1].dataId;
+            } else {
+              if (this.form.pageNo > 1) {
+                // 跳到上一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo - 1;
+                console.log("--->toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId = this.tableData[this.tableData.length - 1].dataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为第一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          }
+          break;
+        }
+      }
+
+      if (curId) {
+        this.curSelectedExamRecordDataId = curId;
+        this.curSelectedRow(curId);
+      } else {
+        this.examRecordDataDialogClose();
+      }
+    },
     gotoCaptureDetail(row) {
-      this.routeSelectedIds = [];
-      this.routeSelectedIds.push(row.dataId);
-      this.$refs["multipleTable"]?.toggleRowSelection(row, true);
-      this.$nextTick(() => {
-        /** checkbox UI选中状态延迟 */
-        setTimeout(() => {
-          this.$router.push({
-            path: "/oe/captureDetail/" + row.dataId + "/examDetail",
-          });
-        }, 200);
-      });
+      this.examRecordDataDialogOpen(row.dataId, false);
+
+      // this.routeSelectedIds = [];
+      // this.routeSelectedIds.push(row.dataId);
+      // this.$refs["multipleTable"]?.toggleRowSelection(row, true);
+      // this.$nextTick(() => {
+      //   /** checkbox UI选中状态延迟 */
+      //   setTimeout(() => {
+      //     this.$router.push({
+      //       path: "/oe/captureDetail/" + row.dataId + "/examDetail",
+      //     });
+      //   }, 200);
+      // });
     },
     exportData() {
       if (!this.form.examId) {

+ 32 - 6
src/modules/oe/views/examPaperDetail.vue

@@ -74,9 +74,10 @@
                   font-weight: bold;
                 "
               >
-                <div>标准答案:</div>
+                <div>标准答案</div>
                 <span v-html="questionUnit.correctAnswer"></span>
               </div>
+
               <div
                 v-if="
                   questionUnit.answerType !== 'SINGLE_AUDIO' ||
@@ -86,7 +87,7 @@
                 "
                 style="color: blue; font-weight: bold"
               >
-                学生答案:
+                学生答案
                 <span v-html="questionUnit.studentAnswer"></span>
                 <i
                   v-show="
@@ -101,6 +102,7 @@
                   class="el-icon-close"
                 ></i>
               </div>
+
               <div
                 v-if="
                   questionUnit.answerType === 'SINGLE_AUDIO' &&
@@ -118,7 +120,7 @@
                     margin-right: 10px;
                   "
                 >
-                  学生答案:
+                  学生答案
                 </div>
                 <audio
                   v-if="
@@ -131,6 +133,18 @@
                   controls
                 ></audio>
               </div>
+
+              <div
+                style="
+                  display: flex;
+                  flex-direction: row;
+                  color: red;
+                  font-style: italic;
+                "
+              >
+                <div>得分:</div>
+                <span>{{ questionUnit.studentScore }}</span>
+              </div>
             </div>
           </div>
         </div>
@@ -189,7 +203,12 @@ export default {
           this.$http
             .get(
               "/api/ecs_oe_admin/examRecordQuestions/getExamRecordQuestions",
-              { params: { examRecordDataId: this.examRecordDataId } }
+              {
+                params: {
+                  examRecordDataId: this.examRecordDataId,
+                  withScore: true,
+                },
+              }
             )
             .then((response) => {
               this.examQuestionList = response.data.examQuestionEntities;
@@ -239,8 +258,15 @@ export default {
     },
     reOrderOptions(question, order) {
       question.order = order; //设置序号
-      var questionScore = this.examQuestionList[order - 1].questionScore;
-      var studentAnswer = this.examQuestionList[order - 1].studentAnswer;
+      var examQuestion = this.examQuestionList[order - 1];
+      var questionScore = examQuestion.questionScore;
+      var studentAnswer = examQuestion.studentAnswer;
+      if (examQuestion.studentScore || examQuestion.studentScore === 0) {
+        question.studentScore = examQuestion.studentScore + "分";
+      } else {
+        question.studentScore = "--分";
+      }
+
       var correctAnswer = question.rightAnswer; //从题中获取正确答案
       var optionList = question.questionOptionList;
       //单选,多选

+ 39 - 54
src/modules/oe/views/examScheduling.vue

@@ -104,11 +104,40 @@
             @selection-change="handleSelectionChange"
           >
             <el-table-column
-              sortable
+              label="姓名"
+              prop="studentName"
+              width="120"
+            ></el-table-column>
+            <el-table-column
+              label="身份证号"
+              prop="identityNumber"
+              width="120"
+            ></el-table-column>
+            <el-table-column
+              label="学号"
+              prop="studentCode"
+              width="120"
+            ></el-table-column>
+            <el-table-column
+              label="已考次数"
+              prop="usedNum"
+              width="90"
+            ></el-table-column>
+            <el-table-column
               label="学习中心"
               prop="orgName"
               width="120"
             ></el-table-column>
+            <el-table-column
+              label="课程"
+              prop="courseName"
+              width="120"
+            ></el-table-column>
+            <el-table-column
+              label="课程层次"
+              prop="courseLevel"
+              width="90"
+            ></el-table-column>
             <el-table-column label="场次" width="120">
               <template slot-scope="scope">
                 <el-popover trigger="hover" placement="left">
@@ -140,76 +169,32 @@
               </template>
             </el-table-column>
             <el-table-column
-              sortable
-              label="姓名"
-              prop="studentName"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="身份证号"
-              prop="identityNumber"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="学号"
-              prop="studentCode"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="课程"
-              prop="courseName"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="课程层次"
-              prop="courseLevel"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
               label="专业"
               prop="specialtyName"
-              width="120"
+              width="90"
             ></el-table-column>
+
             <el-table-column
-              sortable
-              label="已考次数"
-              prop="usedNum"
-              width="120"
+              label="年级"
+              prop="grade"
+              width="90"
             ></el-table-column>
             <el-table-column
-              sortable
               label="学生电话"
               prop="phone"
-              width="120"
+              width="90"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="年级"
-              prop="grade"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
               label="采集人"
               prop="infoCollector"
-              width="120"
+              width="90"
             ></el-table-column>
             <el-table-column
-              sortable
+              fixed="right"
               label="完成状态"
               prop="finishedStatus"
-              width="120"
+              width="90"
             ></el-table-column>
-            <!-- <el-table-column sortable label="完成状态" width="120">
-              <template slot-scope="scope">
-                <span> {{ scope.row.finishedStatus }} </span>
-              </template>
-            </el-table-column>-->
             <el-table-column fixed="right" label="操作" width="120">
               <template slot-scope="scope">
                 <el-row class="operateRow">

+ 160 - 75
src/modules/oe/views/illegalityNameList.vue

@@ -74,7 +74,7 @@
             border
             @selection-change="handleSelectionChange"
           >
-            <el-table-column width="80" label="考试ID">
+            <el-table-column label="考试记录ID" width="95">
               <template slot-scope="scope">
                 <el-button
                   v-show="currentPagePrivileges.SNAPSHOT_DETAILS"
@@ -87,7 +87,42 @@
                 }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="场次" width="120">
+            <el-table-column
+              min-width="90"
+              label="姓名"
+              prop="studentName"
+            ></el-table-column>
+            <el-table-column
+              label="身份证号"
+              prop="identityNumber"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="学号"
+              prop="studentCode"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="学习中心"
+              prop="orgName"
+              width="150"
+            ></el-table-column>
+            <el-table-column
+              label="课程"
+              prop="courseName"
+              min-width="90"
+            ></el-table-column>
+            <el-table-column
+              label="课程层次"
+              prop="courseLevel"
+              width="80"
+            ></el-table-column>
+            <el-table-column
+              label="客观题总分"
+              prop="objectiveScore"
+              width="95"
+            ></el-table-column>
+            <el-table-column label="场次" min-width="90">
               <template slot-scope="scope">
                 <el-popover trigger="hover" placement="left">
                   <div style="font-size: 18px; font-family: 新宋体">
@@ -118,82 +153,30 @@
               </template>
             </el-table-column>
             <el-table-column
-              sortable
-              label="学习中心"
-              prop="orgName"
-              width="150"
-            ></el-table-column>
-            <el-table-column
-              width="120"
-              sortable
-              label="姓名"
-              prop="studentName"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="身份证号"
-              prop="identityNumber"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="学号"
-              prop="studentCode"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="课程"
-              prop="courseName"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="客观题总分"
-              prop="objectiveScore"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="课程层次"
-              prop="courseLevel"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
               label="校验次数"
               prop="faceTotalCount"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
               label="成功次数"
               prop="faceSuccessCount"
-              width="120"
+              width="80"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="陌生人记录"
+              label="陌生人次数"
               prop="faceStrangerCount"
-              width="150"
+              width="95"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="成功率(%)"
+              label="人脸比对(%)"
               prop="faceSuccessPercent"
-              width="150"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="违纪类型"
-              prop="disciplineType"
-              width="120"
+              width="100"
             ></el-table-column>
+            <el-table-column label="IP" prop="ip" width="125"></el-table-column>
             <el-table-column
-              sortable
               label="违纪描述"
               prop="disciplineDetail"
-              width="120"
+              width="150"
             >
               <template slot-scope="scope">
                 <span
@@ -202,10 +185,10 @@
               </template>
             </el-table-column>
             <el-table-column
-              sortable
-              label="Ip"
-              prop="ip"
-              width="120"
+              fixed="right"
+              label="违纪类型"
+              prop="disciplineType"
+              width="150"
             ></el-table-column>
           </el-table>
           <div class="block pull-right">
@@ -221,6 +204,20 @@
           </div>
         </el-col>
       </el-row>
+
+      <el-dialog
+        title="考试记录详情"
+        width="1250px"
+        :visible.sync="examRecordDataDialog"
+        @close="examRecordDataDialogClose"
+      >
+        <ExamRecordDetail
+          :exam-record-data-id="curSelectedExamRecordDataId"
+          :show-audit-button="curSelectedShowAuditButton"
+          :need-loading="needLoading"
+          @changeExamRecordData="changeExamRecordData"
+        ></ExamRecordDetail>
+      </el-dialog>
     </el-main>
   </el-container>
 </template>
@@ -235,6 +232,12 @@ export default {
   mixins: [pagePrivilege],
   data() {
     return {
+      curSelectedExamRecordDataId: null,
+      curSelectedShowAuditButton: false,
+      needLoading: false,
+      examRecordDataDialog: false,
+      toNext: false,
+      curTotalPages: 0,
       disciplineTypeList: [],
       total: 0,
       tableLoading: false,
@@ -284,7 +287,7 @@ export default {
   },
   created() {
     this.form.rootOrgId = this.user.rootOrgId;
-    this.backFill();
+    // this.backFill();
     this.getDisciplineTypeList("");
   },
   methods: {
@@ -330,7 +333,7 @@ export default {
         examStageId: null,
       };
     },
-    search(type) {
+    async search(type) {
       if (!this.form.examId) {
         this.$notify({
           title: "警告",
@@ -348,20 +351,21 @@ export default {
       if (params.examStageId == "") {
         params.examStageId = null;
       }
-      this.$http
+      await this.$http
         .post("/api/ecs_oe_admin/exam/audit/discipline/list", params)
         .then((response) => {
           if (response.data) {
             this.tableData = response.data.content;
             this.total = response.data.totalElements;
             this.form.pageNo = response.data.number + 1;
+            this.curTotalPages = response.data.totalPages;
           } else {
             this.tableData = [];
           }
           this.tableLoading = false;
-          this.$router.push({
-            path: "/oe/illegalityNameList?" + new URLSearchParams(params),
-          });
+          // this.$router.push({
+          //   path: "/oe/illegalityNameList?" + new URLSearchParams(params),
+          // });
         });
     },
     selectable(row) {
@@ -383,10 +387,91 @@ export default {
     handleCurrentChange() {
       this.search();
     },
+    examRecordDataDialogClose() {
+      this.examRecordDataDialog = false;
+    },
+    examRecordDataDialogOpen(examRecordDataId, showAuditButton) {
+      this.examRecordDataDialog = true;
+      this.curSelectedShowAuditButton = showAuditButton;
+      this.curSelectedExamRecordDataId = examRecordDataId;
+    },
+    async changeExamRecordData(isNext) {
+      // console.log("isNext:" + isNext);
+      let curId = null;
+      let isFirst = false;
+      let isLast = false;
+      let rowSize = this.tableData.length;
+      for (let n = 0; n < rowSize; n++) {
+        isFirst = n === 0;
+        isLast = n === rowSize - 1;
+        let row = this.tableData[n];
+        if (this.curSelectedExamRecordDataId === row.examRecordDataId) {
+          curId = row.examRecordDataId;
+          if (isNext) {
+            if (!isLast) {
+              curId = this.tableData[n + 1].examRecordDataId;
+            } else {
+              if (this.form.pageNo < this.curTotalPages) {
+                // 跳到下一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo + 1;
+                console.log("+++>toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId = this.tableData[0].examRecordDataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为最后一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          } else {
+            if (!isFirst) {
+              curId = this.tableData[n - 1].examRecordDataId;
+            } else {
+              if (this.form.pageNo > 1) {
+                // 跳到上一页
+                curId = null;
+                this.form.pageNo = this.form.pageNo - 1;
+                console.log("--->toPage:" + this.form.pageNo);
+                this.needLoading = true;
+                await this.search();
+                this.needLoading = false;
+
+                if (this.tableData.length > 0) {
+                  curId =
+                    this.tableData[this.tableData.length - 1].examRecordDataId;
+                }
+              } else {
+                this.$message({
+                  message: "当前数据为第一条!",
+                  type: "warning",
+                  showClose: true,
+                });
+              }
+            }
+          }
+          break;
+        }
+      }
+
+      if (curId) {
+        this.curSelectedExamRecordDataId = curId;
+      } else {
+        this.examRecordDataDialogClose();
+      }
+    },
     gotoCaptureDetail(examRecordDataId) {
-      this.$router.push({
-        path: "/oe/captureDetail/" + examRecordDataId + "/illegalityNameList",
-      });
+      this.examRecordDataDialogOpen(examRecordDataId, false);
+      // this.$router.push({
+      //   path: "/oe/captureDetail/" + examRecordDataId + "/illegalityNameList",
+      // });
     },
     backFill() {
       var formData = this.$route.query;

+ 5 - 5
src/modules/oe/views/reexamine.vue

@@ -27,11 +27,6 @@
             border
             @selection-change="handleSelectionChange"
           >
-            <el-table-column
-              sortable
-              label="学习中心"
-              prop="orgName"
-            ></el-table-column>
             <el-table-column
               sortable
               label="姓名"
@@ -47,6 +42,11 @@
               label="学号"
               prop="studentCode"
             ></el-table-column>
+            <el-table-column
+              sortable
+              label="学习中心"
+              prop="orgName"
+            ></el-table-column>
             <el-table-column
               sortable
               label="课程"

+ 48 - 63
src/modules/oe/views/scoreStatistics.vue

@@ -65,10 +65,34 @@
             @selection-change="handleSelectionChange"
           >
             <el-table-column
-              sortable
+              label="姓名"
+              prop="studentName"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="身份证号"
+              prop="identityNumber"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="学号"
+              prop="studentCode"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
               label="学习中心"
               prop="orgName"
-              width="120"
+              min-width="100"
+            ></el-table-column>
+            <el-table-column
+              label="课程"
+              prop="courseNameAndCode"
+              min-width="160"
+            ></el-table-column>
+            <el-table-column
+              label="课程层次"
+              prop="courseLevel"
+              width="90"
             ></el-table-column>
             <el-table-column label="场次" width="120">
               <template slot-scope="scope">
@@ -101,102 +125,63 @@
               </template>
             </el-table-column>
             <el-table-column
-              sortable
-              label="姓名"
-              prop="studentName"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="身份证号"
-              prop="identityNumber"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="学号"
-              prop="studentCode"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="课程"
-              prop="courseNameAndCode"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="课程层次"
-              prop="courseLevel"
-              width="120"
+              label="最终成绩"
+              prop="finalExamScore"
+              width="90"
             ></el-table-column>
             <el-table-column
-              sortable
               label="客观分"
               prop="objectiveScore"
-              width="120"
+              width="90"
             ></el-table-column>
             <el-table-column
-              sortable
               label="主观分"
               prop="subjectiveScore"
-              width="120"
+              width="90"
             ></el-table-column>
             <el-table-column
-              sortable
-              label="最终成绩"
-              prop="finalExamScore"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              :sort-method="sortByDisciplineCount"
-              label="违纪次数"
-              prop="disciplineCount"
-              width="120"
+              label="是否缺考"
+              prop="isAbsent"
+              width="90"
             ></el-table-column>
             <el-table-column
               sortable
               :sort-method="sortBySubmitCount"
               label="正常交卷次数"
               prop="submitCount"
-              width="150"
+              width="130"
             ></el-table-column>
             <el-table-column
-              sortable
               label="剩余考试次数"
               prop="leftExamTimes"
-              width="150"
+              width="110"
             ></el-table-column>
             <el-table-column
               sortable
-              label="是否缺考"
-              prop="isAbsent"
-              width="120"
+              :sort-method="sortByDisciplineCount"
+              label="违纪次数"
+              prop="disciplineCount"
+              width="110"
+            ></el-table-column>
+            <el-table-column
+              label="成绩统计时间"
+              prop="startTime"
+              width="160"
             ></el-table-column>
             <el-table-column
-              sortable
               label="年级"
               prop="grade"
-              width="120"
+              width="90"
             ></el-table-column>
             <el-table-column
-              sortable
               label="采集人"
               prop="infoCollector"
-              width="120"
+              width="100"
             ></el-table-column>
             <el-table-column
-              sortable
               label="专业"
               prop="specialtyName"
-              width="120"
-            ></el-table-column>
-            <el-table-column
-              sortable
-              label="成绩统计时间"
-              prop="startTime"
-              width="155"
+              width="100"
             ></el-table-column>
           </el-table>
           <div class="block pull-right">