zhangjie %!s(int64=2) %!d(string=hai) anos
pai
achega
ccbb9c36ce

+ 1 - 1
src/features/examwork/ExamManagement/ExamEdit.vue

@@ -512,7 +512,7 @@
               ></div>
             </div>
           </div>
-          <el-row v-if="isOpenMonitorVideo">
+          <el-row v-if="form.monitorProxy && isOpenMonitorVideo">
             <el-form-item label="是否允许考生发起语音通话">
               <el-radio v-model="form.examStudentCallEnable" :label="1">

+ 17 - 3
src/features/examwork/ExamManagement/ExamManagement.vue

@@ -86,6 +86,21 @@
           scope.row.updateTime | datetimeFilter
         }}</span>
       </el-table-column>
+      <el-table-column width="100" label="是否允许考生发起语音通话">
+        <span slot-scope="scope">{{
+          scope.row.examStudentCallEnable | zeroOneYesNoFilter
+        }}</span>
+      </el-table-column>
+      <el-table-column width="100" label="是否推送客观分">
+        <span slot-scope="scope">{{
+          scope.row.objectiveScorePush | zeroOneYesNoFilter
+        }}</span>
+      </el-table-column>
+      <el-table-column width="100" label="是否推送违纪考生">
+        <span slot-scope="scope">{{
+          scope.row.examStudentBreachPush | zeroOneYesNoFilter
+        }}</span>
+      </el-table-column>
       <el-table-column :context="_self" label="操作" width="220" fixed="right">
         <div slot-scope="scope">
           <el-button
@@ -150,7 +165,7 @@
       />
     </div>
     <CopyExamDialog ref="theDialog" :exam="selected" @reload="searchForm" />
-    <PushSetDialog ref="PushSetDialog" :exam-id="curExamId" />
+    <PushSetDialog ref="PushSetDialog" :exam="selected" />
   </div>
 </template>
 
@@ -183,7 +198,6 @@ export default {
       pageSize: 10,
       total: 10,
       selected: null,
-      curExamId: null,
     };
   },
   created() {
@@ -282,7 +296,7 @@ export default {
         .catch(() => {});
     },
     pushExam(exam) {
-      this.curExamId = exam.id;
+      this.selected = exam;
       this.$refs.PushSetDialog.open();
     },
   },

+ 12 - 6
src/features/examwork/ExamManagement/PushSetDialog.vue

@@ -38,16 +38,18 @@ import { pushCloudMarkExam } from "@/api/examwork-exam";
 
 const initModalForm = {
   examId: null,
-  objectiveScorePush: true,
-  examStudentBreachPush: true,
+  objectiveScorePush: false,
+  examStudentBreachPush: false,
 };
 
 export default {
   name: "PushSetDialog",
   props: {
-    examId: {
-      type: [String, Number],
-      default: "",
+    exam: {
+      type: Object,
+      default() {
+        return;
+      },
     },
   },
   data() {
@@ -59,7 +61,11 @@ export default {
   },
   methods: {
     visibleChange() {
-      this.modalForm = { ...initModalForm, examId: this.examId };
+      this.modalForm = {
+        examId: this.exam.id,
+        objectiveScorePush: !!this.exam.objectiveScorePush,
+        examStudentBreachPush: !!this.exam.examStudentBreachPush,
+      };
     },
     cancel() {
       this.modalIsShow = false;

+ 42 - 0
src/features/invigilation/InvigilationDetail/InvigilationDetail.vue

@@ -175,6 +175,15 @@
             >
           </el-form-item>
         </el-form>
+        <div v-if="IS_ADMIN" class="part-filter-form-action">
+          <el-button
+            :type="curExamIsOver ? 'success' : 'danger'"
+            icon="icon icon-over"
+            :disabled="!filter.examId"
+            @click="finishInvigilationExam"
+            >{{ curExamIsOver ? "恢复监考" : "结束监考" }}</el-button
+          >
+        </div>
       </div>
 
       <div class="part-filter-info">
@@ -248,6 +257,7 @@ import {
   examActivityRoomList,
   invigilationHistoryList,
   exportInvigilationHistory,
+  invigilateExamFinish,
 } from "@/api/invigilation";
 import { downloadBlob } from "@/utils/utils";
 import {
@@ -278,6 +288,7 @@ export default {
         maxWarningCount: undefined,
         minWarningCount: undefined,
       },
+      curExamBatch: {},
       STUDENT_FINISH_EXAM_TYPE,
       STUDENT_ONLINE_STATUS,
       STUDENT_BEHAVIOR_STATUS,
@@ -291,6 +302,7 @@ export default {
       examCourses: [],
       dataList: [],
       isDownload: false,
+      IS_ADMIN: this.$store.state.user.roleCodes.includes("ADMIN"),
     };
   },
   computed: {
@@ -301,6 +313,9 @@ export default {
     IS_INVIGILATE() {
       return this.user.roleCodes.includes("INVIGILATE");
     },
+    curExamIsOver() {
+      return this.curExamBatch && this.curExamBatch.monitorStatus === "END";
+    },
   },
   mounted() {
     this.initData();
@@ -317,6 +332,10 @@ export default {
       });
       this.filter.examId = this.selectedExamId;
       // this.filter.examId = this.examBatchs[0] && this.examBatchs[0].id;
+      const curExamBatch = this.examBatchs.find(
+        (item) => item.id === this.filter.examId
+      );
+      this.curExamBatch = curExamBatch || {};
       this.toSearch();
       this.getExamActivityRoomList();
     },
@@ -378,6 +397,11 @@ export default {
       this.examCourses = res.data.data.examCourses;
     },
     examChange() {
+      const curExamBatch = this.examBatchs.find(
+        (item) => item.id === this.filter.examId
+      );
+      this.curExamBatch = curExamBatch || {};
+
       this.filter.examActivityId = null;
       this.filter.roomCode = null;
       this.filter.courseCode = null;
@@ -403,6 +427,24 @@ export default {
         params: { examRecordId: row.examRecordId },
       });
     },
+    async finishInvigilationExam() {
+      const actionName = this.curExamIsOver ? "恢复监考" : "结束监考";
+      const result = await this.$confirm(`确定要${actionName}吗?`, "确认提醒", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        iconClass: "el-icon-warning",
+        customClass: "el-message-box__error",
+      }).catch(() => {});
+
+      if (!result) return;
+
+      await invigilateExamFinish(this.filter.examId);
+      this.$refs.ExamBatchDialog.getExamList();
+      this.$message({
+        type: "success",
+        message: "操作成功!",
+      });
+    },
   },
 };
 </script>

+ 0 - 31
src/features/invigilation/RealtimeMonitoring/RealtimeMonitoring.vue

@@ -125,14 +125,6 @@
             @click="finishInvigilation"
             >手动收卷</el-button
           > -->
-          <el-button
-            v-if="IS_ADMIN"
-            :type="curExamIsOver ? 'success' : 'danger'"
-            icon="icon icon-over"
-            :disabled="!filter.examId"
-            @click="finishInvigilationExam"
-            >{{ curExamIsOver ? "恢复监考" : "结束监考" }}</el-button
-          >
         </div>
       </div>
 
@@ -335,7 +327,6 @@
 import {
   invigilateVideoList,
   examActivityRoomList,
-  invigilateExamFinish,
   monitorCallCount,
   invigilationWarningMessage,
 } from "@/api/invigilation";
@@ -417,7 +408,6 @@ export default {
       },
       viewingAngles: [],
       videoIsLargeView: false,
-      IS_ADMIN: this.$store.state.user.roleCodes.includes("ADMIN"),
     };
   },
   created() {
@@ -430,9 +420,6 @@ export default {
     isFullScreen() {
       return this.$store.state.isFullScreen;
     },
-    curExamIsOver() {
-      return this.curExamBatch && this.curExamBatch.monitorStatus === "END";
-    },
   },
   watch: {
     isFullScreen: {
@@ -666,24 +653,6 @@ export default {
       this.multipleSelection = [];
       this.getList();
     },
-    async finishInvigilationExam() {
-      const actionName = this.curExamIsOver ? "恢复监考" : "结束监考";
-      const result = await this.$confirm(`确定要${actionName}吗?`, "确认提醒", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        iconClass: "el-icon-warning",
-        customClass: "el-message-box__error",
-      }).catch(() => {});
-
-      if (!result) return;
-
-      await invigilateExamFinish(this.filter.examId);
-      this.$refs.ExamBatchDialog.getExamList();
-      this.$message({
-        type: "success",
-        message: "操作成功!",
-      });
-    },
     toCommunication() {
       this.$router.push({
         name: "VideoCommunication",

+ 0 - 30
src/features/invigilation/RealtimeMonitoring/RealtimeMonitoringFull.vue

@@ -14,15 +14,6 @@
         <div class="monitor-view-content-right">
           <div class="card-box monitor-view-content-right-header">
             <SummaryLineFull data-type="trouble" :examId="filter.examId" />
-            <el-button
-              v-if="IS_ADMIN"
-              class="finish-invigilation"
-              :type="curExamIsOver ? 'success' : 'danger'"
-              icon="icon icon-over"
-              :disabled="!filter.examId"
-              @click="finishInvigilationExam"
-              >{{ curExamIsOver ? "恢复监考" : "结束监考" }}</el-button
-            >
           </div>
           <div class="monitor-view-content-video-table">
             <div
@@ -87,7 +78,6 @@
 <script>
 import {
   invigilateVideoList,
-  invigilateExamFinish,
   invigilationWarningMessage,
   communicationList,
   communicationCalling,
@@ -160,7 +150,6 @@ export default {
         transform: "scale(1) translate(-50%)",
       },
       videoIsLargeView: false,
-      IS_ADMIN: this.$store.state.user.roleCodes.includes("ADMIN"),
     };
   },
   mounted() {
@@ -174,9 +163,6 @@ export default {
     isMobile() {
       return this.filter.monitorVideoSource.indexOf("MOBILE") === 0;
     },
-    curExamIsOver() {
-      return this.curExamMonitorStatus === "END";
-    },
   },
   watch: {
     isFullScreen: {
@@ -243,22 +229,6 @@ export default {
       }
     },
 
-    /** 结束监考 */
-    async finishInvigilationExam() {
-      const actionName = this.curExamIsOver ? "恢复监考" : "结束监考";
-      const result = await this.$confirm(`确定要${actionName}吗?`, "确认提醒", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        iconClass: "el-icon-warning",
-        customClass: "el-message-box__error",
-      }).catch(() => {});
-
-      if (!result) return;
-
-      await invigilateExamFinish(this.filter.examId);
-      this.onBack();
-    },
-
     onOperation({ type, data }) {
       const newData = { ...data, examStudentName: data.name };
       if (["video"].includes(type)) {

+ 1 - 1
src/features/invigilation/RealtimeMonitoring/StudentBreachDialog.vue

@@ -157,8 +157,8 @@ export default {
       if (!result) return;
 
       this.$message.success("操作成功!");
-      this.cancel();
       this.$emit("modified");
+      this.cancel();
     },
   },
 };

+ 2 - 0
src/features/system/SystemConfig/ModifyConfigItem.vue

@@ -17,7 +17,9 @@
       label-width="120px"
     >
       <el-form-item prop="configKey" label="参数名称:">
+        <span v-if="isEdit">{{ modalForm.configKey }}</span>
         <el-input
+          v-else
           v-model.trim="modalForm.configKey"
           placeholder="请输入参数名称"
           clearable