浏览代码

模式1,2需求

zhangjie 2 年之前
父节点
当前提交
49d1a9a39e

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "teachcloud-platform-web",
-  "version": "3.2.5",
+  "version": "3.2.6",
   "scripts": {
     "start": "npm run serve",
     "serve": "vue-cli-service serve",
@@ -50,4 +50,4 @@
       "git add"
     ]
   }
-}
+}

+ 69 - 8
src/modules/exam/components/createExamAndPrintTask/InfoPrintTask.vue

@@ -31,28 +31,38 @@
         >
         </el-time-picker>
       </el-form-item>
-      <el-form-item label="考试对象:" required></el-form-item>
+      <el-form-item
+        label="考试对象:"
+        required
+        style="margin-bottom: 0"
+      ></el-form-item>
     </el-form>
     <div v-if="IS_MODEL2" class="part-box">
+      <div class="box-justify mb-1">
+        <div></div>
+        <el-button type="primary" @click="toSelectClass">选择班级</el-button>
+      </div>
       <table class="table">
         <colgroup>
-          <col width="50" />
-          <col width="50" />
-          <col width="50" />
-          <col width="100" />
+          <col width="90" />
+          <col width="120" />
+          <col width="120" />
+          <col width="200" />
+          <col width="300" />
         </colgroup>
         <tr>
           <th>卷袋序号</th>
           <th>印刷份数</th>
           <th>备份数量</th>
           <th>印刷室</th>
+          <th>班级</th>
         </tr>
         <tr>
           <td>1</td>
           <td>
             <el-input-number
               v-model="modalForm.totalSubjects"
-              style="width: 80px"
+              class="width-full"
               :min="1"
               :max="999999"
               :step="1"
@@ -63,7 +73,7 @@
           <td>
             <el-input-number
               v-model="modalForm.backupCount"
-              style="width: 80px"
+              class="width-full"
               :min="infoExamPrintPlan.backupCount"
               :max="999999"
               :step="1"
@@ -75,6 +85,7 @@
             <el-select
               v-model="modalForm.printHouseId"
               placeholder="请选择"
+              class="width-full"
               filterable
             >
               <el-option
@@ -85,6 +96,9 @@
               ></el-option>
             </el-select>
           </td>
+          <td>
+            {{ model2ClassList.map((item) => item.clazzName).join(",") }}
+          </td>
         </tr>
       </table>
     </div>
@@ -232,6 +246,9 @@
       ref="ModifyExamStudent"
       :disabled-ids="disabledStudentIds"
       :course-code="infoExamTask.courseCode"
+      :show-student="showStudent"
+      :object-types="objectTypes"
+      :selected-ids="IS_MODEL2 ? model2ClassIds : null"
       @modified="examStudentModified"
     ></modify-exam-student>
     <!-- PreviewTaskStudent -->
@@ -267,6 +284,8 @@ export default {
         backupCount: null,
       },
       tableData: [],
+      model2ClassList: [],
+      model2ClassIds: [],
       curRow: {},
       printHouses: [],
       extendFields: [],
@@ -280,6 +299,8 @@ export default {
       selectedStudentIds: [],
       disabledStudentIds: [],
       examStudentList: [],
+      showStudent: false,
+      objectTypes: [],
       // date-picker
       curCreateTime: [],
       createDate: "",
@@ -493,7 +514,23 @@ export default {
         return;
       }
 
+      const types = {
+        TEACH_CLAZZ_STUDENT: this.checkPrivilege(
+          "button",
+          "ExamTaskStudentObjectImport"
+        ),
+        BASIC_CLAZZ_STUDENT: this.checkPrivilege(
+          "button",
+          "ExamTaskStudentObjectImport"
+        ),
+      };
+
       this.disabledStudentIds = this.getTabelStudentIds();
+      this.objectTypes = Object.keys(types).filter((k) => types[k]);
+      this.showStudent = this.checkPrivilege(
+        "button",
+        "ExamTaskStudentObjectImport"
+      );
       this.$refs.ModifyExamStudent.open();
     },
     getTabelStudentIds() {
@@ -520,6 +557,7 @@ export default {
         extendFields: "",
         backupCount: 0,
         minBackupCount: 0,
+        isSelectStudent: true,
         examTaskStudentObjectParamList: [],
         ...modalFormData,
       };
@@ -530,7 +568,17 @@ export default {
       data.extends = extendFieldModal;
       return data;
     },
-    examStudentModified(selectedStudents) {
+    examStudentModified({ selectedStudents, isSelectStudent }) {
+      if (this.IS_MODEL2) {
+        this.model2ClassList = selectedStudents.map((item) => {
+          return {
+            clazzId: item.clazzId,
+            clazzName: item.clazzName,
+          };
+        });
+        this.model2ClassIds = this.model2ClassList.map((item) => item.clazzId);
+        return;
+      }
       if (this.studentUploaded) {
         this.tableData = [];
         this.studentUploaded = false;
@@ -544,6 +592,7 @@ export default {
         className: selectedStudents.map((item) => item.clazzName).join(),
         studentCount: examTaskStudentObjectParamList.length,
         examTaskStudentObjectParamList,
+        isSelectStudent,
         ...this.getBackupCount(examTaskStudentObjectParamList.length),
       });
       this.tableData.push(tableRow);
@@ -608,6 +657,18 @@ export default {
       });
       this.updatePackageInfos();
     },
+    // model2 select class
+    toSelectClass() {
+      if (!this.infoExamTask.courseCode) {
+        this.$message.error("请先选择课程");
+        return;
+      }
+
+      this.disabledStudentIds = [];
+      this.objectTypes = ["BASIC_CLAZZ_STUDENT"];
+      this.showStudent = false;
+      this.$refs.ModifyExamStudent.open();
+    },
   },
 };
 </script>

+ 94 - 15
src/modules/exam/components/createExamAndPrintTask/ModifyExamStudent.vue

@@ -12,13 +12,15 @@
   >
     <div class="mb-4 tab-btns">
       <el-button
-        v-for="(val, key) in EXAM_OBJECT_TYPE"
-        :key="key"
+        v-for="item in objectTypeList"
+        :key="item.value"
         size="medium"
-        :type="examObjectType === key ? 'primary' : 'default'"
-        :disabled="selectedExamObjectType && selectedExamObjectType !== key"
-        @click="selectMenu(key)"
-        >{{ val }}
+        :type="examObjectType === item.value ? 'primary' : 'default'"
+        :disabled="
+          selectedExamObjectType && selectedExamObjectType !== item.value
+        "
+        @click="selectMenu(item.value)"
+        >{{ item.name }}
       </el-button>
     </div>
     <div class="user-search">
@@ -34,7 +36,9 @@
 
     <el-row type="flex" :gutter="10">
       <el-col :span="12">
-        <h3 class="user-part-title">班级/学生</h3>
+        <h3 class="user-part-title">
+          {{ showStudent ? "班级/学生" : "班级" }}
+        </h3>
         <div class="user-tree">
           <el-tree
             ref="UserTree"
@@ -98,18 +102,33 @@ export default {
         return [];
       },
     },
+    selectedIds: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
     courseCode: {
       type: String,
       default: "",
     },
+    objectTypes: {
+      type: Array,
+      default() {
+        return ["TEACH_CLAZZ_STUDENT", "BASIC_CLAZZ_STUDENT"];
+      },
+    },
+    showStudent: {
+      type: Boolean,
+      default: false,
+    },
   },
-  components: {},
   data() {
     return {
       modalIsShow: false,
       examObjectType: "TEACH_CLAZZ_STUDENT",
       basicCourseCode: null,
-      EXAM_OBJECT_TYPE,
+      objectTypeList: [],
       dataTree: {
         TEACH_CLAZZ_STUDENT: [],
         BASIC_CLAZZ_STUDENT: [],
@@ -171,15 +190,31 @@ export default {
       if (!this.dataTree[val].length) {
         await this.getStudents();
       }
-      this.userTree = this.dataTree[val];
+      this.userTree = this.getUserTree(val);
       this.updateUserTreeDisableInfo(this.disabledIds);
     },
+    getUserTree(examObjectType) {
+      let userTree = this.dataTree[examObjectType];
+      if (this.showStudent) return userTree;
+
+      return userTree.map((item) => {
+        let nitem = { ...item };
+        nitem.children = [];
+        return nitem;
+      });
+    },
     clearTypeData(type = "BASIC_CLAZZ_STUDENT") {
       this.dataTree[type] = [];
     },
     checkChange() {
       // console.log("check click");
       const selectedKeys = this.$refs.UserTree.getCheckedKeys(true);
+      if (!this.showStudent) {
+        this.selectedUsers = this.userTree.filter((item) =>
+          selectedKeys.includes(item.id)
+        );
+        return;
+      }
       const disabledIds = [...selectedKeys, ...this.disabledIds];
       const disabledStdIds = disabledIds.map((item) => item.split("_")[1]);
 
@@ -206,11 +241,26 @@ export default {
     },
     removeSelectStudent(node) {
       // console.log("node remove");
+      if (!this.showStudent) {
+        this.selectedUsers = this.selectedUsers.filter(
+          (item) => item.id !== node.data.id
+        );
+        this.$refs.UserTree.setCheckedKeys(
+          this.selectedUsers.map((item) => item.id)
+        );
+        return;
+      }
+
       this.$refs.UserSelectedTree.remove(node);
       this.setTreeSelectedKeys();
       this.checkChange();
     },
     setTreeSelectedKeys() {
+      if (!this.showStudent) {
+        const selectedUsersIds = this.selectedUsers.map((item) => item.id);
+        this.$refs.UserTree.setCheckedKeys(selectedUsersIds);
+        return;
+      }
       let selectedUserIds = [];
       this.selectedUsers.forEach((item) => {
         item.children.forEach((elem) => {
@@ -220,28 +270,45 @@ export default {
       this.$refs.UserTree.setCheckedKeys(selectedUserIds);
     },
     async visibleChange() {
+      this.objectTypeList = this.objectTypes.map((field) => {
+        return {
+          name: EXAM_OBJECT_TYPE[field],
+          value: field,
+        };
+      });
+      if (!this.objectTypeList.length) return;
+      if (this.objectTypeList.length === 1) {
+        this.examObjectType = this.objectTypeList[0].value;
+      }
+
       if (this.basicCourseCode !== this.courseCode) {
         this.clearSelectedExamObjectType();
         this.basicCourseCode = this.courseCode;
-        await this.getStudents("TEACH_CLAZZ_STUDENT");
+        await this.getStudents(this.examObjectType);
       }
 
-      this.selectMenu(this.examObjectType);
+      await this.selectMenu(this.examObjectType);
+
+      if (this.selectedIds && this.selectedIds.length) {
+        this.$refs.UserTree.setCheckedKeys(this.selectedIds);
+        this.checkChange();
+      }
     },
     labelChange() {
       if (this.filterLabel) {
         const escapeRegexpString = (value = "") =>
           String(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
         const reg = new RegExp(escapeRegexpString(this.filterLabel), "i");
-        this.userTree = this.dataTree[this.examObjectType].filter((item) =>
+        this.userTree = this.getUserTree(this.examObjectType).filter((item) =>
           reg.test(item.label)
         );
       } else {
-        this.userTree = this.dataTree[this.examObjectType];
+        this.userTree = this.getUserTree(this.examObjectType);
       }
       this.setTreeSelectedKeys();
     },
     updateUserTreeDisableInfo(disabledIds) {
+      if (!this.showStudent) return;
       const disabledStdIds = disabledIds.map((item) => item.split("_")[1]);
 
       this.userTree.forEach((item) => {
@@ -260,13 +327,25 @@ export default {
     open() {
       this.modalIsShow = true;
     },
+    getFullSelectedUsers() {
+      let userTree = this.dataTree[this.examObjectType];
+      const selectedUsersIds = this.selectedUsers.map((item) => item.id);
+      return userTree.filter((item) => selectedUsersIds.includes(item.id));
+    },
     submit() {
       if (!this.selectedUsers.length) {
         this.$message.error("请选择考试对象");
         return;
       }
       this.selectedExamObjectType = this.examObjectType;
-      this.$emit("modified", this.selectedUsers);
+      const selectedUsers = this.showStudent
+        ? this.selectedUsers
+        : this.getFullSelectedUsers();
+
+      this.$emit("modified", {
+        selectedStudents: selectedUsers,
+        isSelectStudent: this.showStudent,
+      });
       this.cancel();
     },
   },

+ 3 - 2
src/modules/exam/components/createExamAndPrintTask/PreviewTaskStudent.vue

@@ -4,7 +4,7 @@
     :visible.sync="modalIsShow"
     title="考试对象学生"
     top="10px"
-    width="600px"
+    width="800px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     append-to-body
@@ -13,7 +13,8 @@
       <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="班级"> </el-table-column>
+      <el-table-column prop="className" label="班级" min-width="200">
+      </el-table-column>
     </el-table>
   </el-dialog>
 </template>