Browse Source

考生管理接口调试

zhangjie 1 năm trước cách đây
mục cha
commit
3324c952ea

+ 3 - 1
src/constants/enumerate.js

@@ -237,8 +237,10 @@ export const IMPORT_TEMPLATE_TYPE = {
   examTaskStudent: "TEMPLATE_EXAM_TASK_STUDENT",
   // 命题计划导入模板
   examStatistics: "TEMPLATE_EXAM_STATISTICS",
+  // 考生
+  examStudent: "TEMPLATE_BASIC_EXAM_STUDENT",
   // 课程知识点
-  courseProperty: "COURSE_PROPERTY",
+  courseProperty: "TEMPLATE_COURSE_DIMENSION",
 };
 // 印刷 -------------->
 // 印刷计划状态

+ 198 - 34
src/modules/base/components/ModifyExamStudent.vue

@@ -4,7 +4,7 @@
     :visible.sync="modalIsShow"
     :title="title"
     top="10px"
-    width="500px"
+    width="540px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     append-to-body
@@ -16,7 +16,7 @@
       :model="modalForm"
       :rules="rules"
       :key="modalForm.id"
-      label-width="80px"
+      label-width="120px"
     >
       <el-form-item prop="semesterId" label="学期:">
         <semester-select
@@ -54,21 +54,21 @@
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item label="学院:">
+      <el-form-item prop="college" label="学院:">
         <el-input
           v-model.trim="modalForm.college"
           placeholder="学院"
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item label="专业:">
+      <el-form-item prop="major" label="专业:">
         <el-input
           v-model.trim="modalForm.major"
           placeholder="专业"
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item label="教学班:">
+      <el-form-item prop="teachClazz" label="教学班:">
         <el-input
           v-model.trim="modalForm.teachClazz"
           placeholder="教学班"
@@ -82,6 +82,59 @@
           clearable
         ></el-input>
       </el-form-item>
+      <el-form-item prop="teacherCode" label="任课老师工号:">
+        <el-input
+          v-model.trim="modalForm.teacherCode"
+          placeholder="任课老师工号"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="paperNumber" label="试卷编号:">
+        <el-input
+          v-model.trim="modalForm.paperNumber"
+          placeholder="任课老师"
+          clearable
+          @change="updateRules"
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="examStartTime" label="考试时间:">
+        <el-date-picker
+          v-model="createDate"
+          type="date"
+          value-format="timestamp"
+          placeholder="考试日期"
+          style="width: 150px; margin-bottom: 5px"
+          :editable="false"
+          @change="timeChange"
+        >
+        </el-date-picker>
+        <el-time-picker
+          is-range
+          v-model="createTime"
+          range-separator="至"
+          start-placeholder="考试开始时间"
+          end-placeholder="考试结束时间"
+          placeholder="选择时间范围"
+          value-format="timestamp"
+          :editable="false"
+          @change="timeChange"
+        >
+        </el-time-picker>
+      </el-form-item>
+      <el-form-item prop="examPlace" label="考点(校区):">
+        <el-input
+          v-model.trim="modalForm.examPlace"
+          placeholder="考点(校区)"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="examRoom" label="考场(考试教室):">
+        <el-input
+          v-model.trim="modalForm.examRoom"
+          placeholder="考场(考试教室)"
+          clearable
+        ></el-input>
+      </el-form-item>
     </el-form>
     <div slot="footer">
       <el-button type="primary" :disabled="isSubmit" @click="submit"
@@ -94,6 +147,7 @@
 
 <script>
 import { updateExamStudent } from "../api";
+import { getTimeDatestamp } from "@/plugins/utils";
 
 const initModalForm = {
   id: null,
@@ -107,6 +161,7 @@ const initModalForm = {
   teachClazz: "",
   teacherCode: "",
   teacherName: "",
+  paperNumber: "",
   examEndTime: "",
   examStartTime: "",
   examPlace: "",
@@ -136,7 +191,37 @@ export default {
       modalIsShow: false,
       isSubmit: false,
       modalForm: { ...initModalForm },
-      rules: {
+      rules: {},
+      // date-picker
+      curCreateTime: [],
+      createDate: "",
+      createTime: [],
+    };
+  },
+  mounted() {
+    this.updateRules();
+  },
+  methods: {
+    initData(val) {
+      if (val.id) {
+        this.modalForm = this.$objAssign(initModalForm, val);
+        const { examStartTime, examEndTime } = val;
+        if (examStartTime && examEndTime) {
+          this.createTime = [examStartTime, examEndTime];
+          this.createDate = getTimeDatestamp(examStartTime);
+          this.modalForm.examStartTime = this.createTime[0];
+          this.modalForm.examEndTime = this.createTime[1];
+        }
+      } else {
+        this.modalForm = { ...initModalForm };
+        this.initExamTime();
+      }
+    },
+    visibleChange() {
+      this.initData(this.instance);
+    },
+    updateRules() {
+      this.rules = {
         semesterId: [
           {
             required: true,
@@ -177,61 +262,121 @@ export default {
             trigger: "change",
           },
           {
-            pattern: /^[a-zA-Z0-9]{1,50}$/,
-            message: "学号只能由数字、字母组成",
+            pattern: /^[a-zA-Z0-9-_]{1,30}$/,
+            message: "学号只能由数字、字母、短横线和下划线组成",
             trigger: "change",
           },
           {
-            message: "学号不能超过50个字",
-            max: 50,
+            message: "学号不能超过30个字",
+            max: 30,
             trigger: "change",
           },
         ],
         college: [
           {
-            required: false,
-            message: "学院不能超过50个字",
-            max: 50,
+            required: !!this.modalForm.paperNumber,
+            message: "请输入学院",
+            trigger: "change",
+          },
+          {
+            message: "学院不能超过30个字",
+            max: 30,
             trigger: "change",
           },
         ],
         major: [
           {
-            required: false,
-            message: "专业不能超过50个字",
-            max: 50,
+            required: !!this.modalForm.paperNumber,
+            message: "请输入专业",
+            trigger: "change",
+          },
+          {
+            message: "专业不能超过30个字",
+            max: 30,
             trigger: "change",
           },
         ],
         teachClazz: [
           {
-            required: false,
-            message: "教学班不能超过50个字",
-            max: 50,
+            required: !!this.modalForm.paperNumber,
+            message: "请输入教学班",
+            trigger: "change",
+          },
+          {
+            message: "教学班不能超过30个字",
+            max: 30,
             trigger: "change",
           },
         ],
         teacherName: [
+          {
+            required: !!this.modalForm.paperNumber,
+            message: "请输入任课老师名称",
+            trigger: "change",
+          },
+          {
+            message: "任课老师名称不能超过30个字",
+            max: 30,
+            trigger: "change",
+          },
+        ],
+        teacherCode: [
+          {
+            required: !!this.modalForm.paperNumber,
+            message: "请输入任课老师工号",
+            trigger: "change",
+          },
+          {
+            message: "任课老师工号不能超过30个字",
+            max: 30,
+            trigger: "change",
+          },
+        ],
+        paperNumber: [
+          {
+            message: "只能由数字、字母、短横线和下划线组成",
+            pattern: /^[a-zA-Z0-9_].+$/,
+            trigger: "change",
+          },
           {
             required: false,
-            message: "任课老师不能超过50个字",
-            max: 50,
+            message: "试卷编码不能超过30个字",
+            max: 30,
             trigger: "change",
           },
         ],
-      },
-    };
-  },
-  methods: {
-    initData(val) {
-      if (val.id) {
-        this.modalForm = this.$objAssign(initModalForm, val);
-      } else {
-        this.modalForm = { ...initModalForm };
-      }
-    },
-    visibleChange() {
-      this.initData(this.instance);
+        examStartTime: [
+          {
+            required: !!this.modalForm.paperNumber,
+            message: "请输入考试时间",
+            trigger: "change",
+          },
+        ],
+        examPlace: [
+          {
+            required: !!this.modalForm.paperNumber,
+            message: "请输入考点(校区)",
+            trigger: "change",
+          },
+          {
+            message: "考点(校区)不能超过30个字",
+            max: 30,
+            trigger: "change",
+          },
+        ],
+        examRoom: [
+          {
+            required: !!this.modalForm.paperNumber,
+            message: "请输入考场(考试教室)",
+            trigger: "change",
+          },
+          {
+            message: "考场(考试教室)不能超过30个字",
+            max: 30,
+            trigger: "change",
+          },
+        ],
+      };
     },
     cancel() {
       this.modalIsShow = false;
@@ -242,6 +387,25 @@ export default {
     updateClazz() {
       this.modalForm.clazzId = "";
     },
+    initExamTime() {
+      const curDate = getTimeDatestamp(Date.now());
+      const hour = 60 * 60 * 1000;
+      this.curCreateTime = [curDate + 8 * hour, curDate + 10 * hour];
+      this.createTime = [...this.curCreateTime];
+    },
+    timeChange() {
+      if (!this.createDate || !this.createTime) {
+        this.modalForm.examStartTime = null;
+        this.modalForm.examEndTime = null;
+        return;
+      }
+
+      const curDate = getTimeDatestamp(this.createDate);
+      const timeDate = getTimeDatestamp(this.createTime[0]);
+
+      this.modalForm.examStartTime = curDate + this.createTime[0] - timeDate;
+      this.modalForm.examEndTime = curDate + this.createTime[1] - timeDate;
+    },
     async submit() {
       const valid = await this.$refs.modalFormComp.validate().catch(() => {});
       if (!valid) return;

+ 1 - 1
src/modules/base/components/course-simple/ClazzSimpleManage.vue

@@ -20,7 +20,7 @@
       </el-form>
       <div class="part-box-action">
         <el-button type="danger" @click="toBatchDelete">批量删除</el-button>
-        <el-button type="primary" @click="toAdd">新增班级</el-button>
+        <!-- <el-button type="primary" @click="toAdd">新增班级</el-button> -->
       </div>
     </div>
     <div class="part-box part-box-pad">

+ 12 - 0
src/modules/base/components/course-simple/CourseTargetManage.vue

@@ -105,14 +105,26 @@ export default {
       this.curRow = {
         courseCode: this.course.courseCode,
         examId: this.course.examId,
+        disabledDimensionIds: this.getDisabledDimensionIds(),
       };
       this.$refs.ModifyCourseTarget.open();
     },
+    getDisabledDimensionIds(excapeRowId = null) {
+      const ids = [];
+      const list = excapeRowId
+        ? this.dataList.filter((item) => item.id !== excapeRowId)
+        : this.dataList;
+      list.forEach((item) => {
+        ids.push(...item.dimensionList.map((d) => d.id));
+      });
+      return ids;
+    },
     toEdit(row) {
       this.curRow = {
         ...row,
         courseCode: this.course.courseCode,
         examId: this.course.examId,
+        disabledDimensionIds: this.getDisabledDimensionIds(row.id),
       };
       this.$refs.ModifyCourseTarget.open();
     },

+ 2 - 2
src/modules/base/components/course-simple/ModifyCourseSimple.vue

@@ -10,7 +10,7 @@
     append-to-body
     @open="visibleChange"
   >
-    <div class="mb-4 tab-btns">
+    <!-- <div class="mb-4 tab-btns">
       <el-button
         v-for="tab in tabs"
         :key="tab.val"
@@ -19,7 +19,7 @@
         @click="selectMenu(tab.val)"
         >{{ tab.name }}
       </el-button>
-    </div>
+    </div> -->
     <!-- input -->
     <div v-if="curTab === 'input'" class="tab-body">
       <el-form

+ 2 - 1
src/modules/base/components/course-simple/ModifyCourseTarget.vue

@@ -77,6 +77,7 @@
       ref="SelectDimensionDialog"
       :course="{ courseCode: instance.courseCode, examId: instance.examId }"
       :selected-data="modalForm.dimensionIdList"
+      :disabled-data="instance.disabledDimensionIds"
       @confirm="dimensionSelected"
     ></select-dimension-dialog>
   </div>
@@ -102,7 +103,7 @@ export default {
     instance: {
       type: Object,
       default() {
-        return {};
+        return { disabledDimensionIds: [] };
       },
     },
   },

+ 3 - 3
src/modules/base/components/course-simple/ModifyStudentSimple.vue

@@ -4,14 +4,14 @@
     :visible.sync="modalIsShow"
     title="添加学生"
     top="10px"
-    width="800px"
+    width="900px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     append-to-body
     destroy-on-close
     @open="visibleChange"
   >
-    <div class="mb-4 tab-btns">
+    <!-- <div class="mb-4 tab-btns">
       <el-button
         v-for="tab in tabs"
         :key="tab.val"
@@ -20,7 +20,7 @@
         @click="selectMenu(tab.val)"
         >{{ tab.name }}
       </el-button>
-    </div>
+    </div> -->
     <!-- input -->
     <div v-if="curTab === 'input'" class="tab-body">
       <el-form

+ 6 - 6
src/modules/base/components/course-simple/ModifyTeacherSimple.vue

@@ -117,18 +117,18 @@ export default {
       isSubmit: false,
       curTab: "select",
       tabs: [
-        {
-          name: "手动添加",
-          val: "input",
-        },
         {
           name: "教师库添加",
           val: "select",
         },
         {
-          name: "批量导入",
-          val: "import",
+          name: "手动添加",
+          val: "input",
         },
+        // {
+        //   name: "批量导入",
+        //   val: "import",
+        // },
       ],
       modalForm: { ...initModalForm },
       courses: [],

+ 18 - 0
src/modules/base/components/course-simple/SelectDimensionDialog.vue

@@ -15,6 +15,7 @@
       :data="treeData"
       show-checkbox
       check-on-click-node
+      check-strictly
       node-key="id"
       :props="defaultProps"
     >
@@ -39,6 +40,12 @@ export default {
         return [];
       },
     },
+    disabledData: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
     course: {
       type: Object,
       default() {
@@ -75,8 +82,19 @@ export default {
         courseCode: this.course.courseCode,
       });
       this.treeData = data || [];
+      this.updateDisableNode();
+    },
+    updateDisableNode() {
+      const mdTree = (list) => {
+        list.forEach((item) => {
+          item.disabled = this.disabledData.includes(item.id);
+          if (item.children && item.children.length) mdTree(item.children);
+        });
+      };
+      mdTree(this.treeData);
     },
     visibleChange() {
+      this.updateDisableNode();
       this.$refs.treeRef.setCheckedKeys(this.selectedData);
     },
     cancel() {

+ 1 - 1
src/modules/base/components/course-simple/StudentSimpleManage.vue

@@ -106,7 +106,7 @@
 
 <script>
 import { studentSimpleListQuery, deleteStudentSimple } from "../../api";
-import ModifyStudentSimple from "./ModifyStudentSimple";
+import ModifyStudentSimple from "./ModifyStudentSimple.vue";
 
 export default {
   name: "clazz-simple-student-manage",

+ 1 - 1
src/modules/base/router.js

@@ -142,7 +142,7 @@ export default [
   },
   {
     path: "/base/exam-student-manage",
-    name: "ExamStudentManage",
+    name: "BasicExamStudentManage",
     component: ExamStudentManage,
   },
 ];

+ 1 - 1
src/modules/base/views/CourseSimpleManage.vue

@@ -103,7 +103,7 @@
 
 <script>
 import { courseSimpleListPage, deleteCourseSimple } from "../api";
-import ModifyCourseSimple from "../components/course-simple/ModifyCourseSimple";
+import ModifyCourseSimple from "../components/course-simple/ModifyCourseSimple.vue";
 import CourseSimpleDetail from "../components/course-simple/CourseSimpleDetail.vue";
 
 export default {

+ 30 - 12
src/modules/base/views/ExamStudentManage.vue

@@ -54,7 +54,7 @@
       <div class="box-justify">
         <div>
           <el-button
-            v-if="checkPrivilege('button', 'delete')"
+            v-if="checkPrivilege('button', 'DeleteBatch')"
             type="danger"
             icon="el-icon-delete"
             @click="toBatchDelete"
@@ -105,22 +105,42 @@
           width="55"
           align="center"
         ></el-table-column>
-        <el-table-column prop="courseName" label="课程名称"></el-table-column>
-        <el-table-column prop="courseCode" label="课程代码"></el-table-column>
+        <el-table-column
+          prop="courseName"
+          label="课程名称"
+          min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="courseCode"
+          label="课程代码"
+          width="120"
+        ></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="college" label="学院"></el-table-column>
         <el-table-column prop="major" label="专业"></el-table-column>
         <el-table-column prop="teachClazz" label="教学班"></el-table-column>
-        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
+        <el-table-column
+          prop="paperNumber"
+          label="试卷编号"
+          width="120"
+        ></el-table-column>
         <el-table-column prop="teacherName" label="任课老师"></el-table-column>
         <el-table-column
           prop="teacherCode"
           label="任课老师工号"
           width="120"
         ></el-table-column>
-        <el-table-column prop="examDate" label="考试日期"></el-table-column>
-        <el-table-column prop="examTime" label="考试时间"></el-table-column>
+        <el-table-column
+          prop="examDate"
+          label="考试日期"
+          width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="examTime"
+          label="考试时间"
+          width="160"
+        ></el-table-column>
         <el-table-column
           prop="examPlace"
           label="考点(校区)"
@@ -181,6 +201,7 @@
       ref="ImportFile"
       title="导入考生"
       :upload-url="uploadUrl"
+      :upload-data="{ examId: filter.examId, semesterId: filter.semesterId }"
       :format="['xls', 'xlsx']"
       :download-handle="() => downloadTemplate('examStudent')"
       :download-filename="dfilename"
@@ -191,7 +212,7 @@
     <data-task-dialog
       v-if="checkPrivilege('button', 'import')"
       ref="DataTaskDialog"
-      task-type="EXAM_STUDENT_IMPORT"
+      task-type="STUDENT_IMPORT"
     ></data-task-dialog>
   </div>
 </template>
@@ -202,7 +223,7 @@ import {
   deleteExamStudent,
   exportExamStudent,
 } from "../api";
-import ModifyExamStudent from "../components/ModifyExamStudent";
+import ModifyExamStudent from "../components/ModifyExamStudent.vue";
 import ImportFile from "../../../components/ImportFile.vue";
 import { downloadByApi } from "@/plugins/download";
 import templateDownload from "@/mixins/templateDownload";
@@ -243,9 +264,6 @@ export default {
       );
     },
   },
-  mounted() {
-    // this.getList();
-  },
   methods: {
     async getList() {
       if (!this.checkPrivilege("list", "list")) return;
@@ -265,7 +283,7 @@ export default {
       this.getList();
     },
     search() {
-      // this.toPage(1);
+      this.toPage(1);
     },
     handleSelectionChange(val) {
       this.multipleSelection = val.map((item) => item.id);

+ 1 - 1
src/modules/course/components/SetBlueDialog.vue

@@ -105,7 +105,7 @@ export default {
       this.modalIsShow = true;
     },
     checkData() {
-      return this.dataList.some(
+      return !this.dataList.some(
         (item) => !item.targetList || !item.targetList.length
       );
     },

+ 3 - 3
src/modules/course/components/data.js

@@ -244,7 +244,7 @@ export const reportData = {
     director: "评价责任人",
     participant: "评价参与人",
   },
-  courseEvaluationSpread: {
+  courseEvaluationSpreadInfo: {
     questionInfo,
     scoreList: {
       failCount: 1,
@@ -313,12 +313,12 @@ export const reportData = {
       ],
     },
   },
-  courseEvaluationResult: {
+  courseEvaluationResultInfo: {
     target: "课程总目标",
     targetValue: 0.89,
     targetList: courseTargetList,
   },
-  courseEvaluationResultDetail: {
+  courseEvaluationResultDetailInfo: {
     examStudentList,
     courseTargetList: courseTargetList.map((item) => {
       return {

+ 3 - 0
src/modules/exam/views/DataTaskManage.vue

@@ -268,6 +268,9 @@ export default {
       this.filter.type = this.taskType;
       this.typeDisabled = true;
     }
+    if (this.nonePrivilege) {
+      this.toPage(1);
+    }
   },
   methods: {
     checkPriv(type, field) {