浏览代码

新增、修改、启用、禁用考生

Michael Wang 4 年之前
父节点
当前提交
4e0b7a50c8

+ 74 - 0
src/api/examwork-examstudent.js

@@ -0,0 +1,74 @@
+import { httpApp } from "@/plugins/axiosIndex";
+import { pickBy } from "lodash-es";
+import { object2QueryString } from "@/utils/utils";
+
+export function searchExamStudents({
+  examId = "",
+  activityId = "",
+  roomCode = "",
+  courseCode = "",
+  name = "",
+  identity = "",
+  grade = "",
+  classNo = "",
+  pageNumber = 1,
+  pageSize = 10,
+}) {
+  const data = pickBy(
+    {
+      examId,
+      activityId,
+      roomCode,
+      name,
+      courseCode,
+      identity,
+      grade,
+      classNo,
+      pageNumber,
+      pageSize,
+    },
+    (v) => v !== ""
+  );
+  return httpApp.post(
+    "/api/admin/examStudent/query?" + object2QueryString(data)
+  );
+}
+
+export function saveExamStudent({
+  id = "",
+  examId = "",
+  activityId = "",
+  roomCode = "",
+  courseCode = "",
+  name = "",
+  identity = "",
+  grade = "",
+  classNo = "",
+  enable = 1,
+}) {
+  const data = pickBy(
+    {
+      id,
+      examId,
+      activityId,
+      roomCode,
+      name,
+      courseCode,
+      identity,
+      grade,
+      classNo,
+      enable,
+    },
+    (v) => v !== ""
+  );
+
+  return httpApp.post("/api/admin/examStudent/save", [data]);
+}
+
+export function toggleEnableExamStudent({ id, enable }) {
+  return httpApp.post("/api/admin/examStudent/save", [{ id, enable }]);
+}
+
+export function toggleEnableExamStudentArray(ary = []) {
+  return httpApp.post("/api/admin/examStudent/save", ary);
+}

+ 68 - 0
src/components/ActivitySelect.vue

@@ -0,0 +1,68 @@
+<template>
+  <el-select
+    v-model="selected"
+    class="size-select"
+    placeholder="请选择"
+    @change="select"
+    style="width: 100px;"
+    filterable
+    remote
+    :remote-method="search"
+    clearable
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :label="item.code"
+      :value="item.id"
+    >
+      <span>{{ item.code }}</span>
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+import { searchActivities } from "@/api/examwork-activity";
+
+export default {
+  name: "ActivitySelect",
+  props: {
+    value: String,
+    examId: String,
+  },
+  data() {
+    return {
+      optionList: [],
+      selected: "",
+    };
+  },
+  async created() {
+    this.search();
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = val;
+      },
+    },
+  },
+  methods: {
+    async search(query) {
+      const res = await searchActivities({
+        examId: this.examId,
+        code: query,
+        pageNumber: 1,
+        pageSize: 30,
+      });
+      this.optionList = res?.data.data.records.records;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit("change", this.selected);
+    },
+  },
+};
+</script>
+
+<style></style>

+ 4 - 4
src/components/CourseSelect.vue

@@ -12,11 +12,11 @@
   >
     <el-option
       v-for="item in optionList"
-      :key="item.code"
-      :label="item.name"
-      :value="item.code"
+      :key="item.courseCode"
+      :label="item.courseName"
+      :value="item.courseCode"
     >
-      <span>{{ item.name }}</span>
+      <span>{{ item.courseName }}</span>
     </el-option>
   </el-select>
 </template>

+ 70 - 45
src/features/examwork/ExamStudentManagement/ExamStudentManagement.vue

@@ -1,54 +1,60 @@
 <template>
   <div>
-    <el-form :model="form" inline>
-      <el-form-item label="批次名称">
-        <el-input v-model.trim="form.code"></el-input>
+    <el-form ref="form" :model="form" :rules="rules" inline>
+      <el-form-item label="批次名称" prop="examId">
+        <ExamSelect v-model="form.examId" />
       </el-form-item>
       <el-form-item label="场次代码">
-        <el-input v-model.trim="form.code"></el-input>
+        <ActivitySelect :examId="form.examId" v-model="form.activityId" />
       </el-form-item>
       <el-form-item label="考场名称">
-        <el-input v-model.trim="form.code"></el-input>
+        <el-input v-model.trim="form.roomCode"></el-input>
       </el-form-item>
       <el-form-item label="科目">
-        <el-input v-model.trim="form.code"></el-input>
+        <CourseSelect :examId="form.examId" v-model="form.courseCode" />
       </el-form-item>
       <el-form-item label="姓名">
-        <el-input v-model.trim="form.code"></el-input>
+        <el-input v-model.trim="form.name"></el-input>
       </el-form-item>
       <el-form-item label="证件号">
-        <el-input v-model.trim="form.code"></el-input>
+        <el-input v-model.trim="form.identity"></el-input>
       </el-form-item>
       <el-form-item label="年级">
-        <el-input v-model.trim="form.code"></el-input>
+        <el-input v-model.trim="form.grade"></el-input>
       </el-form-item>
       <el-form-item label="教学班级">
-        <el-input v-model.trim="form.code"></el-input>
+        <el-input v-model.trim="form.classNo"></el-input>
       </el-form-item>
       <el-button @click="searchForm">查询</el-button>
       <el-button @click="add">新增</el-button>
+      <el-button @click="toggleEnableExamStudentArray({ enable: 1 })"
+        >启用</el-button
+      >
+      <el-button @click="toggleEnableExamStudentArray({ enable: 0 })"
+        >禁用</el-button
+      >
       <!-- <el-button>导入</el-button> -->
     </el-form>
 
-    <el-table :data="tableData" stripe style="width: 100%;">
+    <el-table ref="table" :data="tableData" stripe style="width: 100%;">
       <el-table-column type="selection" width="42" />
       <el-table-column width="100" label="ID">
         <span slot-scope="scope">{{ scope.row.id }}</span>
       </el-table-column>
       <el-table-column width="200" label="场次代码">
-        <span slot-scope="scope">{{ scope.row.code }}</span>
+        <span slot-scope="scope">{{ scope.row.activityCode }}</span>
       </el-table-column>
       <el-table-column label="姓名">
-        <span slot-scope="scope">{{ scope.row.prepareSeconds / 60 }}</span>
+        <span slot-scope="scope">{{ scope.row.name }}</span>
       </el-table-column>
       <el-table-column width="200" label="证件号">
-        <span slot-scope="scope">{{ scope.row.code }}</span>
+        <span slot-scope="scope">{{ scope.row.identity }}</span>
       </el-table-column>
       <el-table-column width="200" label="科目名称">
-        <span slot-scope="scope">{{ scope.row.code }}</span>
+        <span slot-scope="scope">{{ scope.row.courseName }}</span>
       </el-table-column>
       <el-table-column width="200" label="科目代码">
-        <span slot-scope="scope">{{ scope.row.code }}</span>
+        <span slot-scope="scope">{{ scope.row.courseCode }}</span>
       </el-table-column>
       <el-table-column width="120" label="状态">
         <span slot-scope="scope">{{
@@ -56,20 +62,16 @@
         }}</span>
       </el-table-column>
       <el-table-column width="100" label="考场代码">
-        <span slot-scope="scope">{{
-          scope.row.startTime | datetimeFilter
-        }}</span>
+        <span slot-scope="scope">{{ scope.row.roomCode }}</span>
       </el-table-column>
       <el-table-column width="100" label="考场名称">
-        <span slot-scope="scope">{{ scope.row.endTime | datetimeFilter }}</span>
+        <span slot-scope="scope">{{ scope.row.roomName }}</span>
       </el-table-column>
       <el-table-column width="120" label="年级">
-        <span slot-scope="scope">{{ scope.row.updateName }}</span>
+        <span slot-scope="scope">{{ scope.row.grade }}</span>
       </el-table-column>
-      <el-table-column sortable width="170" label="教学班级">
-        <span slot-scope="scope">{{
-          scope.row.updateTime | datetimeFilter
-        }}</span>
+      <el-table-column width="170" label="教学班级">
+        <span slot-scope="scope">{{ scope.row.classNo }}</span>
       </el-table-column>
       <el-table-column :context="_self" label="操作" width="210">
         <div slot-scope="scope">
@@ -80,7 +82,7 @@
             size="mini"
             type="primary"
             plain
-            @click="toggleEnableActivity(scope.row)"
+            @click="toggleEnableExamStudent(scope.row)"
           >
             {{ scope.row.enable ? "禁用" : "启用" }}
           </el-button>
@@ -102,7 +104,7 @@
     <ExamStudentManagementDialog
       ref="theDialog"
       :examId="examId"
-      :activity="selectedActivity"
+      :examStudent="selected"
       @reload="searchForm"
     />
   </div>
@@ -110,9 +112,10 @@
 
 <script>
 import {
-  searchActivities,
-  toggleEnableActivity,
-} from "@/api/examwork-activity";
+  searchExamStudents,
+  toggleEnableExamStudent,
+  toggleEnableExamStudentArray,
+} from "@/api/examwork-examstudent";
 import ExamStudentManagementDialog from "./ExamStudentManagementDialog";
 
 export default {
@@ -128,25 +131,33 @@ export default {
   data() {
     return {
       form: {
-        orgId: "",
-        roleCode: "",
-        loginName: "",
+        examId: "",
+        activityId: "",
+        roomCode: "",
+        courseCode: "",
         name: "",
-        enableState: null,
+        identity: "",
+        grade: "",
+        classNo: "",
+      },
+      rules: {
+        examId: [{ required: true, message: "批次必选" }],
       },
       tableData: [],
       currentPage: 1,
       pageSize: 10,
       total: 10,
-      selectedActivity: {},
+      selected: {},
     };
   },
   async created() {},
   methods: {
     async searchForm() {
-      const res = await searchActivities({
-        examId: this.examId,
-        code: this.form.code,
+      // console.log(this.form);
+      const valid = await this.$refs.form.validate();
+      if (!valid) return;
+      const res = await searchExamStudents({
+        ...this.form,
         pageNumber: this.currentPage,
         pageSize: this.pageSize,
       });
@@ -163,20 +174,34 @@ export default {
       this.searchForm();
     },
     add() {
-      this.selectedActivity = {};
+      this.selected = {};
       this.$refs.theDialog.openDialog();
     },
-    edit(activity) {
-      this.selectedActivity = activity;
+    edit(examStudent) {
+      this.selected = examStudent;
       this.$refs.theDialog.openDialog();
     },
-    async toggleEnableActivity(activity) {
-      await toggleEnableActivity({
-        id: activity.id,
-        enable: activity.enable === 0 ? 1 : 0,
+    async toggleEnableExamStudent(examStudent) {
+      await toggleEnableExamStudent({
+        id: examStudent.id,
+        enable: examStudent.enable === 0 ? 1 : 0,
       });
       this.searchForm();
     },
+    async toggleEnableExamStudentArray({ enable }) {
+      let rows = this.$refs.table.selection;
+      if (rows.length < 1) {
+        this.$notify({
+          type: "warning",
+          title: "请至少选择一个考生",
+        });
+        return;
+      }
+      await toggleEnableExamStudentArray(
+        rows.map((v) => ({ id: v.id, enable }))
+      );
+      this.searchForm();
+    },
   },
 };
 </script>

+ 48 - 39
src/features/examwork/ExamStudentManagement/ExamStudentManagementDialog.vue

@@ -1,7 +1,7 @@
 <template>
   <el-dialog
     ref="dialog"
-    :title="(isEdit ? '编辑' : '新增') + '场次'"
+    :title="(isEdit ? '编辑' : '新增') + '考生'"
     width="450px"
     :visible.sync="visible"
     @close="closeDialog"
@@ -14,38 +14,43 @@
       label-width="120px"
     >
       <el-row>
-        <el-form-item label="考试时间" prop="startTime">
-          <el-date-picker
-            v-model="form.startTime"
-            type="datetime"
-            placeholder="选择日期时间"
-          >
-          </el-date-picker>
+        <el-form-item label="批次名称" prop="examId">
+          <ExamSelect v-model="form.examId" />
         </el-form-item>
       </el-row>
       <el-row>
-        <el-form-item label="交卷时间" prop="finishTime">
-          <el-date-picker
-            v-model="form.finishTime"
-            type="datetime"
-            placeholder="选择日期时间"
-          >
-          </el-date-picker>
+        <el-form-item label="场次代码">
+          <ActivitySelect :examId="form.examId" v-model="form.activityId" />
         </el-form-item>
       </el-row>
       <el-row>
-        <el-form-item label="考试时长" prop="prepareSeconds">
-          <MinuteInput v-model="form.maxDurationSeconds" />
+        <el-form-item label="考场名称">
+          <el-input v-model.trim="form.roomCode"></el-input>
         </el-form-item>
       </el-row>
       <el-row>
-        <el-form-item label="候考时间" prop="prepareSeconds">
-          <MinuteInput v-model="form.prepareSeconds" />
+        <el-form-item label="科目">
+          <CourseSelect :examId="form.examId" v-model="form.courseCode" />
         </el-form-item>
       </el-row>
       <el-row>
-        <el-form-item label="迟到时长" prop="prepareSeconds">
-          <MinuteInput v-model="form.openingSeconds" />
+        <el-form-item label="姓名">
+          <el-input v-model.trim="form.name"></el-input>
+        </el-form-item>
+      </el-row>
+      <el-row>
+        <el-form-item label="证件号">
+          <el-input v-model.trim="form.identity"></el-input>
+        </el-form-item>
+      </el-row>
+      <el-row>
+        <el-form-item label="年级">
+          <el-input v-model.trim="form.grade"></el-input>
+        </el-form-item>
+      </el-row>
+      <el-row>
+        <el-form-item label="教学班级">
+          <el-input v-model.trim="form.classNo"></el-input>
         </el-form-item>
       </el-row>
       <el-row>
@@ -65,18 +70,16 @@
 </template>
 
 <script>
-import MinuteInput from "@/components/MinuteInput";
-import { saveActivity } from "@/api/examwork-activity";
+import { saveExamStudent } from "@/api/examwork-examstudent";
 export default {
   name: "ExamStudentManagementDialog",
-  components: { MinuteInput },
   props: {
     examId: String,
-    activity: Object,
+    examStudent: Object,
   },
   computed: {
     isEdit() {
-      return this.activity.id;
+      return this.examStudent.id;
     },
   },
   data() {
@@ -84,26 +87,32 @@ export default {
       visible: false,
       form: {
         id: "",
-        startTime: null,
-        finishTime: null,
-        prepareSeconds: 0,
-        openingSeconds: 0,
-        maxDurationSeconds: 0,
+        examId: "",
+        activityId: "",
+        roomCode: "",
+        courseCode: "",
+        name: "",
+        identity: "",
+        grade: "",
+        classNo: "",
       },
       rules: {},
     };
   },
   watch: {
-    user(val) {
+    examStudent(val) {
       let tmp = { ...val };
       if (!tmp.id) {
         tmp = {
           id: "",
-          startTime: null,
-          finishTime: null,
-          prepareSeconds: 0,
-          openingSeconds: 0,
-          maxDurationSeconds: 0,
+          examId: "",
+          activityId: "",
+          roomCode: "",
+          courseCode: "",
+          name: "",
+          identity: "",
+          grade: "",
+          classNo: "",
         };
       }
       this.form = tmp;
@@ -119,9 +128,9 @@ export default {
     async submitForm() {
       let data = this.form;
       if (this.isEdit) {
-        data = { ...data, id: this.activity.id };
+        data = { ...data, id: this.examStudent.id };
       }
-      await saveActivity(data);
+      await saveExamStudent(data);
       this.$emit("reload");
       this.closeDialog();
     },