zhangjie 1 рік тому
батько
коміт
b9bbbc0c34

+ 19 - 11
src/modules/exam/components/createExamAndPrintTask/InfoPrintTask.vue

@@ -247,6 +247,7 @@
       :filter-params="{
         courseCode: infoExamTask.courseCode,
         examId: infoExamTask.examId,
+        teachingRoomId: infoExamTask.teachingRoomId,
       }"
       :show-student="showStudent"
       :selected-ids="IS_MODEL2 ? model2ClassIds : null"
@@ -255,7 +256,9 @@
     <!-- PreviewTaskStudent -->
     <preview-task-student
       ref="PreviewTaskStudent"
-      :student-list="examStudentList"
+      :student-list="curRow.examTaskStudentObjectParamList"
+      :show-student="showStudent"
+      @close="previewStudentClosed"
     ></preview-task-student>
   </div>
 </template>
@@ -265,7 +268,7 @@ import { calcSum, getTimeDatestamp } from "@/plugins/utils";
 import { examRuleDetail } from "../../../base/api";
 import { listTaskPrintHouse } from "../../api";
 import ModifyExamTaskStudent from "./ModifyExamTaskStudent.vue";
-import PreviewTaskStudent from "./PreviewTaskStudent";
+import PreviewTaskStudent from "./PreviewTaskStudent.vue";
 import { mapState, mapMutations } from "vuex";
 import UploadButton from "@/components/UploadButton";
 import templateDownload from "@/mixins/templateDownload";
@@ -577,7 +580,9 @@ export default {
       }
       let examTaskStudentObjectParamList = [];
       selectedStudents.forEach((item) => {
-        examTaskStudentObjectParamList.push(...item.children);
+        item.children.forEach((student) => {
+          examTaskStudentObjectParamList.push({ ...student, enable: true });
+        });
       });
       let tableRow = this.$objAssign(this.getInitTableRow(), {
         classId: selectedStudents.map((item) => item.clazzId).join(),
@@ -597,16 +602,19 @@ export default {
     },
     toViewStudent(row) {
       // console.log(row);
-      this.examStudentList = row.examTaskStudentObjectParamList.map((item) => {
-        return {
-          id: item.id,
-          studentName: item.studentName,
-          studentCode: item.studentCode,
-          className: item.basicClazzName,
-        };
-      });
+      this.curRow = row;
       this.$refs.PreviewTaskStudent.open();
     },
+    previewStudentClosed() {
+      const studentCount = this.curRow.examTaskStudentObjectParamList.filter(
+        (item) => item.enable
+      ).length;
+
+      Object.assign(this.curRow, {
+        ...this.getBackupCount(studentCount),
+        studentCount,
+      });
+    },
     // import
     validError(errorData) {
       this.$message.error(errorData.message);

+ 79 - 35
src/modules/exam/components/createExamAndPrintTask/ModifyExamTaskStudent.vue

@@ -4,21 +4,49 @@
     :visible.sync="modalIsShow"
     title="选择考试对象"
     top="10vh"
-    width="600px"
+    width="680px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     append-to-body
     @opened="visibleChange"
   >
     <div class="user-search">
-      <el-input
-        v-model="filterLabel"
-        placeholder="请输入班级名称"
-        clearable
-        size="mini"
-        prefix-icon="el-icon-search"
-        @input="labelChange"
-      ></el-input>
+      <el-form inline>
+        <el-form-item>
+          <el-select
+            v-model="filter.courseCode"
+            placeholder="请选择"
+            filterable
+          >
+            <el-option
+              v-for="item in courses"
+              :key="item.code"
+              :value="item.code"
+              :label="`${item.name}(${item.code})`"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-input
+            v-model="filter.teacher"
+            placeholder="任课老师"
+            clearable
+            style="width: 160px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-input
+            v-model="filter.className"
+            placeholder="班级名称(教学班)"
+            clearable
+            style="width: 160px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="getStudents">查询</el-button>
+        </el-form-item>
+      </el-form>
     </div>
 
     <el-row type="flex" :gutter="10">
@@ -76,6 +104,7 @@
 
 <script>
 import { uploadOrFindExamTaskStudent } from "../../api";
+import { courseQuery } from "../../../base/api";
 
 export default {
   name: "modify-exam-task-student",
@@ -98,6 +127,7 @@ export default {
         return {
           courseCode: "",
           examId: "",
+          teachingRoomId: "",
         };
       },
     },
@@ -109,12 +139,18 @@ export default {
   data() {
     return {
       modalIsShow: false,
-      filterCache: {},
+      filter: {
+        courseCode: "",
+        examId: "",
+        teacher: "",
+        className: "",
+      },
       dataTree: [],
       userTree: [],
       selectedUsers: [],
       filterLabel: "",
       loading: false,
+      courses: [],
       defaultProps: {
         children: "children",
         label: "label",
@@ -123,11 +159,40 @@ export default {
     };
   },
   methods: {
+    async visibleChange() {
+      this.filter = this.$objAssign(this.filter, this.filterParams);
+      await this.getStudents();
+      await this.getCourses();
+
+      this.$refs.UserTree.setCheckedKeys([]);
+      this.selectedUsers = [];
+      this.userTree = this.getUserTree();
+      // this.updateUserTreeDisableInfo(this.disabledIds);
+
+      if (this.selectedIds && this.selectedIds.length) {
+        this.$nextTick(() => {
+          this.$refs.UserTree.setCheckedKeys(this.selectedIds);
+          this.checkChange();
+        });
+      }
+    },
+    async search() {
+      await this.getStudents();
+
+      this.$nextTick(() => {
+        this.setTreeSelectedKeys();
+      });
+    },
+    async getCourses() {
+      this.courses = [];
+      if (!this.filterParams.teachingRoomId) return;
+      const res = await courseQuery({
+        teachingRoomId: this.filterParams.teachingRoomId,
+      });
+      this.courses = res || [];
+    },
     async getStudents() {
-      let datas = {
-        ...this.filterParams,
-      };
-      const data = await uploadOrFindExamTaskStudent(datas);
+      const data = await uploadOrFindExamTaskStudent(this.filter);
       this.dataTree = this.parseStudentData(data);
     },
     parseStudentData(data) {
@@ -230,27 +295,6 @@ export default {
       });
       this.$refs.UserTree.setCheckedKeys(selectedUserIds);
     },
-    async visibleChange() {
-      if (
-        this.filterCache.courseCode !== this.filterParams.courseCode ||
-        this.filterCache.examId !== this.filterParams.examId
-      ) {
-        await this.getStudents();
-      }
-      this.filterCache = { ...this.filterParams };
-
-      this.$refs.UserTree.setCheckedKeys([]);
-      this.selectedUsers = [];
-      this.userTree = this.getUserTree();
-      this.updateUserTreeDisableInfo(this.disabledIds);
-
-      if (this.selectedIds && this.selectedIds.length) {
-        this.$nextTick(() => {
-          this.$refs.UserTree.setCheckedKeys(this.selectedIds);
-          this.checkChange();
-        });
-      }
-    },
     labelChange() {
       if (this.filterLabel) {
         const escapeRegexpString = (value = "") =>

+ 34 - 1
src/modules/exam/components/createExamAndPrintTask/PreviewTaskStudent.vue

@@ -8,12 +8,28 @@
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     append-to-body
+    @close="modalClose"
   >
     <el-table ref="TableList" :data="studentList">
       <el-table-column type="index" label="序号" width="70"></el-table-column>
       <el-table-column prop="studentName" label="姓名"> </el-table-column>
       <el-table-column prop="studentCode" label="学号"> </el-table-column>
-      <el-table-column prop="className" label="班级" min-width="200">
+      <el-table-column prop="basicClazzName" label="班级" min-width="200">
+      </el-table-column>
+      <el-table-column
+        v-if="!showStudent"
+        class-name="action-column"
+        label="操作"
+        width="80px"
+      >
+        <template slot-scope="scope">
+          <el-button
+            :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
+            type="text"
+            @click="toEnable(scope.row)"
+            >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
+          >
+        </template>
       </el-table-column>
     </el-table>
   </el-dialog>
@@ -29,6 +45,10 @@ export default {
         return [];
       },
     },
+    showStudent: {
+      type: Boolean,
+      default: false,
+    },
   },
   data() {
     return {
@@ -42,6 +62,19 @@ export default {
     open() {
       this.modalIsShow = true;
     },
+    toEnable(row) {
+      if (
+        this.studentList.filter((item) => item.enable).length === 1 &&
+        row.enable
+      ) {
+        this.$message.error("只剩最后一名学生了,不能再禁用学生了。");
+        return;
+      }
+      row.enable = !row.enable;
+    },
+    modalClose() {
+      this.$emit("close");
+    },
   },
 };
 </script>