Michael Wang 4 жил өмнө
parent
commit
d25db0b2c7

+ 15 - 0
src/api/examwork-student.js

@@ -48,3 +48,18 @@ export function resetStudentPassword({ id, password }) {
     password: AESString(password),
     password: AESString(password),
   });
   });
 }
 }
+
+export function searchStudentExamRecord({
+  studentId = "",
+  examId = "",
+  pageNumber = 1,
+  pageSize = 10,
+}) {
+  const data = pickBy(
+    { studentId, examId, pageNumber, pageSize },
+    (v) => v !== ""
+  );
+  return httpApp.post(
+    "/api/admin/student/exam_record/query?" + object2QueryString(data)
+  );
+}

+ 3 - 0
src/components/ActivitySelect.vue

@@ -46,6 +46,9 @@ export default {
         this.selected = val;
         this.selected = val;
       },
       },
     },
     },
+    examId() {
+      this.search();
+    },
   },
   },
   methods: {
   methods: {
     async search(query) {
     async search(query) {

+ 3 - 0
src/components/CourseSelect.vue

@@ -46,6 +46,9 @@ export default {
         this.selected = val;
         this.selected = val;
       },
       },
     },
     },
+    examId() {
+      this.search();
+    },
   },
   },
   methods: {
   methods: {
     async search(query) {
     async search(query) {

+ 11 - 17
src/features/examwork/CourseManagement/CourseManagement.vue

@@ -7,7 +7,7 @@
       <el-form-item label="科目名称">
       <el-form-item label="科目名称">
         <CourseSelect :examId="form.examId" v-model="form.code" />
         <CourseSelect :examId="form.examId" v-model="form.code" />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="科目名称">
+      <el-form-item label="状态">
         <StateSelect
         <StateSelect
           :options="[
           :options="[
             { code: 0, name: '未绑卷' },
             { code: 0, name: '未绑卷' },
@@ -25,24 +25,26 @@
       <el-table-column width="100" label="ID">
       <el-table-column width="100" label="ID">
         <span slot-scope="scope">{{ scope.row.id }}</span>
         <span slot-scope="scope">{{ scope.row.id }}</span>
       </el-table-column>
       </el-table-column>
-      <el-table-column width="200" label="场次代码">
-        <span slot-scope="scope">{{ scope.row.code }}</span>
+      <el-table-column width="200" label="科目代码">
+        <span slot-scope="scope">{{ scope.row.courseCode }}</span>
       </el-table-column>
       </el-table-column>
-      <el-table-column label="候考时间">
-        <span slot-scope="scope">{{ scope.row.prepareSeconds / 60 }}</span>
+      <el-table-column label="科目名称">
+        <span slot-scope="scope">{{ scope.row.courseName }}</span>
       </el-table-column>
       </el-table-column>
       <el-table-column width="120" label="状态">
       <el-table-column width="120" label="状态">
         <span slot-scope="scope">{{
         <span slot-scope="scope">{{
           scope.row.enable | zeroOneEnableDisableFilter
           scope.row.enable | zeroOneEnableDisableFilter
         }}</span>
         }}</span>
       </el-table-column>
       </el-table-column>
-      <el-table-column width="100" label="开始时间">
+      <el-table-column width="100" label="音频题">
         <span slot-scope="scope">{{
         <span slot-scope="scope">{{
-          scope.row.startTime | datetimeFilter
+          scope.row.hasPaper === 1 ? "已绑卷" : "未绑卷"
         }}</span>
         }}</span>
       </el-table-column>
       </el-table-column>
-      <el-table-column width="100" label="结束时间">
-        <span slot-scope="scope">{{ scope.row.endTime | datetimeFilter }}</span>
+      <el-table-column width="100" label="提交答案">
+        <span slot-scope="scope">{{
+          scope.row.hasAnswer | zeroOneEnableDisableFilter
+        }}</span>
       </el-table-column>
       </el-table-column>
       <el-table-column width="120" label="更新人">
       <el-table-column width="120" label="更新人">
         <span slot-scope="scope">{{ scope.row.updateName }}</span>
         <span slot-scope="scope">{{ scope.row.updateName }}</span>
@@ -57,14 +59,6 @@
           <el-button size="mini" type="primary" plain @click="edit(scope.row)">
           <el-button size="mini" type="primary" plain @click="edit(scope.row)">
             编辑
             编辑
           </el-button>
           </el-button>
-          <el-button
-            size="mini"
-            type="primary"
-            plain
-            @click="toggleEnableActivity(scope.row)"
-          >
-            {{ scope.row.enable ? "禁用" : "启用" }}
-          </el-button>
         </div>
         </div>
       </el-table-column>
       </el-table-column>
     </el-table>
     </el-table>

+ 8 - 23
src/features/examwork/InvigilateManagement/InvigilateManagement.vue

@@ -4,17 +4,11 @@
       <!-- <el-form-item v-if="$store.state.user.orgId === null" label="机构">
       <!-- <el-form-item v-if="$store.state.user.orgId === null" label="机构">
         <OrgSelect v-model="form.orgId"></OrgSelect>
         <OrgSelect v-model="form.orgId"></OrgSelect>
       </el-form-item> -->
       </el-form-item> -->
-      <el-form-item label="角色">
-        <RoleSelect v-model="form.roleCode"></RoleSelect>
+      <el-form-item label="考场">
+        <RoleSelect v-model="form.roomCode"></RoleSelect>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="登录名">
-        <el-input v-model.trim="form.loginName"></el-input>
-      </el-form-item>
-      <el-form-item label="姓名">
-        <el-input v-model.trim="form.name"></el-input>
-      </el-form-item>
-      <el-form-item label="状态">
-        <StateSelect v-model="form.enableState"></StateSelect>
+      <el-form-item label="监考老师">
+        <el-input v-model.trim="form.userId"></el-input>
       </el-form-item>
       </el-form-item>
       <el-button @click="searchForm">查询</el-button>
       <el-button @click="searchForm">查询</el-button>
       <el-button @click="add">新增</el-button>
       <el-button @click="add">新增</el-button>
@@ -65,7 +59,6 @@
 
 
 <script>
 <script>
 import RoleSelect from "@/components/RoleSelect.vue";
 import RoleSelect from "@/components/RoleSelect.vue";
-import StateSelect from "@/components/StateSelect";
 import InvigilateManagementDialog from "./InvigilateManagementDialog";
 import InvigilateManagementDialog from "./InvigilateManagementDialog";
 import { searchInvigilators } from "@/api/examwork-invigilate";
 import { searchInvigilators } from "@/api/examwork-invigilate";
 
 
@@ -73,18 +66,13 @@ export default {
   name: "InvigilateManagement",
   name: "InvigilateManagement",
   components: {
   components: {
     RoleSelect,
     RoleSelect,
-    StateSelect,
-    // OrgSelect,
     InvigilateManagementDialog,
     InvigilateManagementDialog,
   },
   },
   data() {
   data() {
     return {
     return {
       form: {
       form: {
-        orgId: "",
-        roleCode: "",
-        loginName: "",
-        name: "",
-        enableState: null,
+        roomCode: "",
+        userId: "",
       },
       },
       tableData: [],
       tableData: [],
       currentPage: 1,
       currentPage: 1,
@@ -97,11 +85,8 @@ export default {
   methods: {
   methods: {
     async searchForm() {
     async searchForm() {
       const res = await searchInvigilators({
       const res = await searchInvigilators({
-        orgId: this.form.orgId,
-        role: this.form.roleCode,
-        enable: this.form.enableState,
-        loginName: this.form.loginName,
-        name: this.form.name,
+        userId: this.form.userId,
+        roomCode: this.form.roomCode,
         pageNumber: this.currentPage,
         pageNumber: this.currentPage,
         pageSize: this.pageSize,
         pageSize: this.pageSize,
       });
       });

+ 8 - 70
src/features/examwork/InvigilateManagement/InvigilateManagementDialog.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <el-dialog
   <el-dialog
     ref="dialog"
     ref="dialog"
-    :title="(isEdit ? '编辑' : '新增') + '用户'"
+    title="考场管理"
     width="450px"
     width="450px"
     :visible.sync="visible"
     :visible.sync="visible"
     @close="closeDialog"
     @close="closeDialog"
@@ -14,59 +14,22 @@
       label-width="120px"
       label-width="120px"
     >
     >
       <el-row>
       <el-row>
-        <el-form-item v-if="$store.state.user.orgId === null" label="机构">
-          <OrgSelect v-model="form.orgId"></OrgSelect>
-        </el-form-item>
-      </el-row>
-      <el-row>
-        <el-form-item label="登录名" prop="loginName">
+        <el-form-item label="考场编码">
           <el-input
           <el-input
             class="pull_length"
             class="pull_length"
-            v-model="form.loginName"
-            placeholder="登录名"
+            v-model="form.roomCode"
+            placeholder="考场编码"
           />
           />
         </el-form-item>
         </el-form-item>
-      </el-row>
-      <el-row>
-        <el-form-item label="姓名" prop="name">
+        <el-form-item label="考场名称">
           <el-input
           <el-input
             class="pull_length"
             class="pull_length"
-            v-model="form.name"
-            placeholder="姓名"
+            v-model="form.roomName"
+            placeholder="考场名称"
           />
           />
         </el-form-item>
         </el-form-item>
       </el-row>
       </el-row>
-      <el-row>
-        <el-form-item label="密码" prop="password">
-          <el-input
-            class="pull_length"
-            v-model="form.password"
-            placeholder="密码"
-          />
-        </el-form-item>
-      </el-row>
-      <el-row>
-        <el-form-item label="角色" prop="roleCode">
-          <RoleSelect v-model="form.roleCode" multiple />
-        </el-form-item>
-      </el-row>
-      <el-row>
-        <el-form-item label="手机号" prop="mobileNumber">
-          <el-input
-            class="pull_length"
-            v-model="form.mobileNumber"
-            placeholder="联系方式"
-          />
-        </el-form-item>
-      </el-row>
-      <el-row>
-        <el-form-item label="状态" prop="enable">
-          <el-radio-group class="pull_right_sm" v-model="form.enable">
-            <el-radio :label="1">启用</el-radio>
-            <el-radio :label="0">禁用</el-radio>
-          </el-radio-group>
-        </el-form-item>
-      </el-row>
+
       <el-row class="d-flex justify-content-center">
       <el-row class="d-flex justify-content-center">
         <el-button type="primary" @click="submitForm">保 存</el-button>
         <el-button type="primary" @click="submitForm">保 存</el-button>
         <el-button @click="closeDialog">取 消</el-button>
         <el-button @click="closeDialog">取 消</el-button>
@@ -76,20 +39,12 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import RoleSelect from "@/components/RoleSelect";
 import { saveUser } from "@/api/system-user";
 import { saveUser } from "@/api/system-user";
-import OrgSelect from "@/components/OrgSelect";
 export default {
 export default {
   name: "InvigilateManagementDialog",
   name: "InvigilateManagementDialog",
-  components: { RoleSelect, OrgSelect },
   props: {
   props: {
     user: Object,
     user: Object,
   },
   },
-  computed: {
-    isEdit() {
-      return this.user.id;
-    },
-  },
   data() {
   data() {
     return {
     return {
       visible: false,
       visible: false,
@@ -97,23 +52,6 @@ export default {
       rules: {},
       rules: {},
     };
     };
   },
   },
-  watch: {
-    user(val) {
-      let tmp = { ...val };
-      if (!tmp.id) {
-        tmp = {
-          orgId: this.$store.state.user.orgId,
-          name: "",
-          loginName: "",
-          password: "",
-          mobileNumber: "",
-          roleCode: [],
-          enable: 1,
-        };
-      }
-      this.form = tmp;
-    },
-  },
   methods: {
   methods: {
     openDialog() {
     openDialog() {
       this.visible = true;
       this.visible = true;

+ 43 - 8
src/features/examwork/StudentManagement/StudentManagement.vue

@@ -33,7 +33,18 @@
         }}</span>
         }}</span>
       </el-table-column>
       </el-table-column>
       <el-table-column width="120" label="照片">
       <el-table-column width="120" label="照片">
-        <span slot-scope="scope">{{ scope.row.basePhotoPath }}</span>
+        <span slot-scope="scope">
+          <el-button
+            size="mini"
+            type="primary"
+            plain
+            @click="openBasePhotoDialog(scope.row.basePhotoPath)"
+            v-if="scope.row.basePhotoPath"
+          >
+            查看底照
+          </el-button>
+          <span v-else>无底照</span>
+        </span>
       </el-table-column>
       </el-table-column>
       <el-table-column width="120" label="更新人">
       <el-table-column width="120" label="更新人">
         <span slot-scope="scope">{{ scope.row.updateName }}</span>
         <span slot-scope="scope">{{ scope.row.updateName }}</span>
@@ -45,7 +56,12 @@
       </el-table-column>
       </el-table-column>
       <el-table-column :context="_self" label="操作" width="260">
       <el-table-column :context="_self" label="操作" width="260">
         <div slot-scope="scope">
         <div slot-scope="scope">
-          <el-button size="mini" type="primary" plain @click="edit(scope.row)">
+          <el-button
+            size="mini"
+            type="primary"
+            plain
+            @click="openExamRecord(scope.row)"
+          >
             考试记录
             考试记录
           </el-button>
           </el-button>
           <el-button
           <el-button
@@ -78,6 +94,16 @@
         :total="total"
         :total="total"
       />
       />
     </div>
     </div>
+
+    <el-dialog
+      title="底照"
+      :visible.sync="basePhotoDialogVisible"
+      destroy-on-close
+    >
+      <img :src="selectedBasePhoto" style="width: 400px;" />
+    </el-dialog>
+
+    <StudentManagementDialog ref="theDialog" :student="selectedStudent" />
   </div>
   </div>
 </template>
 </template>
 
 
@@ -87,6 +113,7 @@ import {
   toggleEnableStudent,
   toggleEnableStudent,
   resetStudentPassword,
   resetStudentPassword,
 } from "@/api/examwork-student";
 } from "@/api/examwork-student";
+import StudentManagementDialog from "./StudentManagementDialog";
 
 
 export default {
 export default {
   name: "StudentManagement",
   name: "StudentManagement",
@@ -101,9 +128,12 @@ export default {
       currentPage: 1,
       currentPage: 1,
       pageSize: 10,
       pageSize: 10,
       total: 10,
       total: 10,
-      selectedUser: {},
+      basePhotoDialogVisible: false,
+      selectedBasePhoto: null,
+      selectedStudent: {},
     };
     };
   },
   },
+  components: { StudentManagementDialog },
   async created() {},
   async created() {},
   methods: {
   methods: {
     async searchForm() {
     async searchForm() {
@@ -114,6 +144,11 @@ export default {
         pageSize: this.pageSize,
         pageSize: this.pageSize,
       });
       });
       this.tableData = res.data.data.records.records;
       this.tableData = res.data.data.records.records;
+      // this.tableData.forEach(
+      //   (v) =>
+      //     (v.basePhotoPath =
+      //       "https://ecs-test-static.qmth.com.cn/org_logo/0/1597046412749.png")
+      // );
       this.total = res.data.data.records.total;
       this.total = res.data.data.records.total;
     },
     },
     handleCurrentChange(val) {
     handleCurrentChange(val) {
@@ -125,12 +160,12 @@ export default {
       this.currentPage = 1;
       this.currentPage = 1;
       this.searchForm();
       this.searchForm();
     },
     },
-    add() {
-      this.selectedUser = {};
-      this.$refs.theDialog.openDialog();
+    openBasePhotoDialog(url) {
+      this.selectedBasePhoto = url;
+      this.basePhotoDialogVisible = true;
     },
     },
-    edit(user) {
-      this.selectedUser = user;
+    openExamRecord(user) {
+      this.selectedStudent = user;
       this.$refs.theDialog.openDialog();
       this.$refs.theDialog.openDialog();
     },
     },
     async toggleEnableStudent(user) {
     async toggleEnableStudent(user) {

+ 108 - 0
src/features/examwork/StudentManagement/StudentManagementDialog.vue

@@ -0,0 +1,108 @@
+<template>
+  <el-dialog
+    ref="dialog"
+    title="考试记录"
+    width="450px"
+    :visible.sync="visible"
+    @close="closeDialog"
+  >
+    <el-form
+      :model="form"
+      ref="form"
+      :rules="rules"
+      label-position="right"
+      label-width="120px"
+      inline
+    >
+      <el-form-item label="批次名称" prop="examId">
+        <ExamSelect v-model="form.examId" />
+      </el-form-item>
+      <el-button type="primary" @click="searchForm">查询</el-button>
+    </el-form>
+
+    <el-table :data="tableData" stripe style="width: 100%;">
+      <el-table-column width="100" label="姓名">
+        <span slot-scope="scope">{{ scope.row.name }}</span>
+      </el-table-column>
+      <el-table-column width="100" label="证件号">
+        <span slot-scope="scope">{{ scope.row.identity }}</span>
+      </el-table-column>
+      <el-table-column width="100" label="批次名称">
+        <span slot-scope="scope">{{ scope.row.examName }}</span>
+      </el-table-column>
+      <el-table-column width="100" label="课程">
+        <span slot-scope="scope">{{ scope.row.courseName }}</span>
+      </el-table-column>
+      <el-table-column width="100" label="状态">
+        <span slot-scope="scope">{{ scope.row.state }}</span>
+      </el-table-column>
+    </el-table>
+    <div class="page float-right">
+      <el-pagination
+        @current-change="handleCurrentChange"
+        :current-page="currentPage"
+        :page-size="pageSize"
+        :page-sizes="[10, 20, 50, 100, 200, 300]"
+        @size-change="handleSizeChange"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      />
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { searchStudentExamRecord } from "@/api/examwork-student";
+export default {
+  name: "StudentManagementDialog",
+  props: {
+    student: Object,
+  },
+  data() {
+    return {
+      visible: false,
+      form: {
+        examId: "",
+      },
+      rules: {
+        examId: [{ required: true, message: "批次必选" }],
+      },
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+    };
+  },
+  methods: {
+    openDialog() {
+      this.visible = true;
+    },
+    closeDialog() {
+      this.visible = false;
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    handleSizeChange(val) {
+      this.pageSize = val;
+      this.currentPage = 1;
+      this.searchForm();
+    },
+    async searchForm() {
+      const valid = await this.$refs.form.validate();
+      if (!valid) return;
+      const res = await searchStudentExamRecord({
+        examId: this.form.examId,
+        studentId: this.student.id,
+        pageNumber: this.currentPage,
+        pageSize: this.pageSize,
+      });
+      this.tableData = res.data.data.records.records;
+      this.total = res.data.data.records.total;
+    },
+  },
+};
+</script>
+
+<style></style>