zhangjie vor 3 Jahren
Ursprung
Commit
ea499e1a58
38 geänderte Dateien mit 1079 neuen und 144 gelöschten Zeilen
  1. 0 2
      src/components/base/CampusSelect.vue
  2. 0 2
      src/components/base/CardRuleSelect.vue
  3. 76 0
      src/components/base/ClassSelect.vue
  4. 0 2
      src/components/base/ClazzSelect.vue
  5. 0 2
      src/components/base/CollegeSelect.vue
  6. 0 2
      src/components/base/CourseSelect.vue
  7. 0 2
      src/components/base/FacultySelect.vue
  8. 76 0
      src/components/base/MajorSelect.vue
  9. 0 2
      src/components/base/PaperNumberSelect.vue
  10. 0 2
      src/components/base/PlaceSelect.vue
  11. 0 2
      src/components/base/PrintPlanSelect.vue
  12. 0 2
      src/components/base/PrintRoomSelect.vue
  13. 0 2
      src/components/base/QuestionTeacherSelect.vue
  14. 0 2
      src/components/base/QuestionTeacherUserSelect.vue
  15. 0 2
      src/components/base/RoomSelect.vue
  16. 0 2
      src/components/base/SchoolSelect.vue
  17. 0 2
      src/components/base/TeachingRoomSelect.vue
  18. 0 2
      src/components/base/TypeOrgSelect.vue
  19. 5 1
      src/constants/enumerate.js
  20. 3 4
      src/modules/admin/views/SchoolMenuManage.vue
  21. 25 2
      src/modules/base/api.js
  22. 16 1
      src/modules/base/components/ModifyClazz.vue
  23. 136 0
      src/modules/base/components/ModifyMajor.vue
  24. 151 0
      src/modules/base/components/ModifySemester.vue
  25. 56 30
      src/modules/base/components/ModifyStudent.vue
  26. 1 0
      src/modules/base/views/ClazzManage.vue
  27. 146 0
      src/modules/base/views/MajorManage.vue
  28. 109 3
      src/modules/base/views/SemesterManage.vue
  29. 2 0
      src/modules/base/views/StudentManage.vue
  30. 0 15
      src/modules/base/views/SubjectManage.vue
  31. 1 1
      src/modules/base/views/UserManage.vue
  32. 7 0
      src/modules/stmms/api.js
  33. 2 16
      src/modules/stmms/components/UploadPaperAnswerDialog.vue
  34. 2 31
      src/modules/stmms/views/MarkTaskManage.vue
  35. 116 3
      src/modules/stmms/views/PaperAnswerUpload.vue
  36. 139 3
      src/modules/stmms/views/SyncManage.vue
  37. 5 1
      src/plugins/filters.js
  38. 5 1
      src/plugins/globalVuePlugins.js

+ 0 - 2
src/components/base/CampusSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="campus-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true }
   },
   data() {

+ 0 - 2
src/components/base/CardRuleSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="card-rule-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -30,7 +29,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true }
   },
   data() {

+ 76 - 0
src/components/base/ClassSelect.vue

@@ -0,0 +1,76 @@
+<template>
+  <el-select
+    v-model="selected"
+    class="class-select"
+    :placeholder="placeholder"
+    filterable
+    :clearable="clearable"
+    :disabled="disabled"
+    @change="select"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.name"
+    >
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+import { clazzQuery } from "../../modules/base/api";
+
+export default {
+  name: "class-select",
+  props: {
+    disabled: { type: Boolean, default: false },
+    placeholder: { type: String, default: "请选择" },
+    value: { type: [Number, String], default: "" },
+    clearable: { type: Boolean, default: true },
+    majorId: { type: [String, Array], default: "" },
+    cascader: { type: Boolean, default: false }
+  },
+  data() {
+    return {
+      optionList: [],
+      selected: ""
+    };
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = val;
+      }
+    },
+    majorId(val, oldval) {
+      if (val !== oldval) {
+        this.search("");
+        this.$emit("input", "");
+        this.$emit("change", {});
+      }
+    }
+  },
+  async created() {
+    this.search();
+  },
+  methods: {
+    async search() {
+      this.optionList = [];
+      if (this.cascader && !this.majorId) return;
+      const res = await clazzQuery({
+        majorId: this.majorId
+      });
+      this.optionList = res;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit(
+        "change",
+        this.optionList.find(item => item.id === this.selected)
+      );
+    }
+  }
+};
+</script>

+ 0 - 2
src/components/base/ClazzSelect.vue

@@ -4,7 +4,6 @@
     class="clazz-select"
     popper-class="popper-filter"
     :placeholder="placeholder"
-    :style="styles"
     :clearable="clearable"
     :disabled="disabled"
     :multiple="multiple"
@@ -37,7 +36,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String, Array], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     multiple: { type: Boolean, default: false },
     campusId: { type: String, default: "" },

+ 0 - 2
src/components/base/CollegeSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="college-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true }
   },
   data() {

+ 0 - 2
src/components/base/CourseSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="course-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -29,7 +28,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     printPlanId: { type: [String, Array], default: "" },
     teachingRoomId: { type: [String, Array], default: "" }

+ 0 - 2
src/components/base/FacultySelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="faculty-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true }
   },
   data() {

+ 76 - 0
src/components/base/MajorSelect.vue

@@ -0,0 +1,76 @@
+<template>
+  <el-select
+    v-model="selected"
+    class="major-select"
+    :placeholder="placeholder"
+    filterable
+    :clearable="clearable"
+    :disabled="disabled"
+    @change="select"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.name"
+    >
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+import { majorQuery } from "../../modules/base/api";
+
+export default {
+  name: "major-select",
+  props: {
+    disabled: { type: Boolean, default: false },
+    placeholder: { type: String, default: "请选择" },
+    value: { type: [Number, String], default: "" },
+    clearable: { type: Boolean, default: true },
+    collegeId: { type: [String, Array], default: "" },
+    cascader: { type: Boolean, default: false }
+  },
+  data() {
+    return {
+      optionList: [],
+      selected: ""
+    };
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = val;
+      }
+    },
+    collegeId(val, oldval) {
+      if (val !== oldval) {
+        this.search("");
+        this.$emit("input", "");
+        this.$emit("change", {});
+      }
+    }
+  },
+  async created() {
+    this.search();
+  },
+  methods: {
+    async search() {
+      this.optionList = [];
+      if (this.cascader && !this.collegeId) return;
+      const res = await majorQuery({
+        collegeId: this.collegeId
+      });
+      this.optionList = res;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit(
+        "change",
+        this.optionList.find(item => item.id === this.selected)
+      );
+    }
+  }
+};
+</script>

+ 0 - 2
src/components/base/PaperNumberSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="paper-number-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -24,7 +23,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     printPlanId: { type: [String, Array], default: "" }
   },

+ 0 - 2
src/components/base/PlaceSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="place-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     printPlanId: { type: [String, Array], default: "" }
   },

+ 0 - 2
src/components/base/PrintPlanSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="print-plan-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :multiple="multiple"
     :clearable="clearable"
@@ -29,7 +28,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String, Array], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     multiple: { type: Boolean, default: false }
   },

+ 0 - 2
src/components/base/PrintRoomSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="print-room-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true }
   },
   data() {

+ 0 - 2
src/components/base/QuestionTeacherSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="question-teacher-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -27,7 +26,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     courseCode: { type: String, default: "" },
     schoolId: { type: String, default: "" }

+ 0 - 2
src/components/base/QuestionTeacherUserSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="question-teacher-user-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -27,7 +26,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     courseCode: { type: String, default: "" }
   },

+ 0 - 2
src/components/base/RoomSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="room-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     printPlanId: { type: [String, Array], default: "" }
   },

+ 0 - 2
src/components/base/SchoolSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="school-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true }
   },
   data() {

+ 0 - 2
src/components/base/TeachingRoomSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="teaching-room-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -28,7 +27,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true }
   },
   data() {

+ 0 - 2
src/components/base/TypeOrgSelect.vue

@@ -3,7 +3,6 @@
     v-model="selected"
     class="type-org-select"
     :placeholder="placeholder"
-    :style="styles"
     filterable
     :clearable="clearable"
     :disabled="disabled"
@@ -29,7 +28,6 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    styles: { type: String, default: "" },
     clearable: { type: Boolean, default: true },
     type: {
       type: String,

+ 5 - 1
src/constants/enumerate.js

@@ -134,7 +134,8 @@ export const DATA_TASK_TYPE = {
   STUDENT_IMPORT: "学生导入",
   COURSE_IMPORT: "课程导入",
   PAPER_AND_CARD_PDF_DOWNLOAD: "卷库查询管理试卷、空白题卡批量下载pdf",
-  STATISTICS_IMPORT: "命题统计导入"
+  STATISTICS_IMPORT: "命题统计导入",
+  SCORE_EXPORT: "成绩导出"
 };
 export const DATA_TASK_RESULT = {
   SUCCESS: "成功",
@@ -176,6 +177,8 @@ export const PRINT_TASK_STATUS = {
   PRINTING: "印刷中",
   FINISH: "已完成"
 };
+
+// stmms
 export const MARK_TASK_SYNC_STATUS = {
   INIT: "未同步",
   UPLOAD_FINISH: "同步中", // 开始同步
@@ -186,3 +189,4 @@ export const MARK_TASK_SYNC_STATUS = {
   SUBJECTIVE_FINISH: "同步中", // 主观题结构同步成功
   FINISH: "已同步"
 };
+export const STMMS_SYNC_TYPE = {};

+ 3 - 4
src/modules/admin/views/SchoolMenuManage.vue

@@ -85,15 +85,14 @@ export default {
       this.$refs.PrivilegeSet.buildTableData(privilegeIds);
     },
     async save() {
-      const privilegeIds = this.$refs.PrivilegeSet.getSelectedPrivilegeIds();
-
-      if (!this.schoolId || !privilegeIds.length) {
-        this.$message.error("学校和权限都必须选择!");
+      if (!this.schoolId) {
+        this.$message.error("学校必须选择!");
         return;
       }
       if (this.loading) return;
 
       this.loading = true;
+      const privilegeIds = this.$refs.PrivilegeSet.getSelectedPrivilegeIds();
       const res = await updateSchoolMenu({
         schoolId: this.schoolId,
         privilegeIds: privilegeIds

+ 25 - 2
src/modules/base/api.js

@@ -191,6 +191,31 @@ export const clazzQuery = datas => {
   return $postParam("/api/admin/basic/clazz/datasource", datas);
 };
 
+// semester-manage
+export const semesterListQuery = datas => {
+  return $postParam("/api/admin/basic/semester/query", datas);
+};
+export const deleteSemester = idList => {
+  return $postParam("/api/admin/basic/semester/delete_batch", { idList });
+};
+export const updateSemester = datas => {
+  return $post("/api/admin/basic/semester/save", datas);
+};
+// major-manage
+export const majorListQuery = datas => {
+  return $postParam("/api/admin/basic/major/query", datas);
+};
+export const majorQuery = datas => {
+  return $postParam("/api/admin/basic/major/query", datas);
+};
+export const deleteMajor = idList => {
+  return $postParam("/api/admin/basic/major/delete_batch", { idList });
+};
+export const updateMajor = datas => {
+  return $post("/api/admin/basic/major/save", datas);
+};
+
+// other --------------------------------->
 // print-plan-push-manage
 export const printPlanPushListQuery = datas => {
   return $postParam("/api/admin/exam/print_sync/list_sync", datas);
@@ -220,5 +245,3 @@ export const uploadFile = datas => {
 export const getCode = type => {
   return $postParam("/api/admin/common/get_code", { type });
 };
-
-// system

+ 16 - 1
src/modules/base/components/ModifyClazz.vue

@@ -31,6 +31,13 @@
           clearable
         ></campus-select>
       </el-form-item>
+      <el-form-item prop="majorId" label="所属专业:">
+        <major-select
+          v-model.trim="modalForm.majorId"
+          style="width:100%;"
+          clearable
+        ></major-select>
+      </el-form-item>
     </el-form>
     <div slot="footer">
       <el-button type="primary" :disabled="isSubmit" @click="submit"
@@ -47,7 +54,8 @@ import { updateClazz } from "../api";
 const initModalForm = {
   id: null,
   clazzName: "",
-  campusId: ""
+  campusId: "",
+  majorId: ""
 };
 
 export default {
@@ -92,6 +100,13 @@ export default {
             message: "请选择所属校区",
             trigger: "change"
           }
+        ],
+        majorId: [
+          {
+            required: true,
+            message: "请选择所属专业",
+            trigger: "change"
+          }
         ]
       }
     };

+ 136 - 0
src/modules/base/components/ModifyMajor.vue

@@ -0,0 +1,136 @@
+<template>
+  <el-dialog
+    class="modify-major"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="448px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      :key="modalForm.id"
+      label-position="top"
+    >
+      <el-form-item prop="name" label="专业名称:">
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="请输入姓名"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-form-item prop="collegeId" label="所属学院:">
+        <college-select
+          v-model="modalForm.collegeId"
+          placeholder="请选择学院"
+          clearable
+        ></college-select>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateMajor } from "../api";
+
+const initModalForm = {
+  id: null,
+  name: "",
+  collegeId: ""
+};
+
+export default {
+  name: "modify-major",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.id;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "专业";
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      classList: [],
+      modalForm: { ...initModalForm },
+      rules: {
+        name: [
+          {
+            required: true,
+            message: "请输入专业名称",
+            trigger: "change"
+          },
+          {
+            message: "专业名称不能超过50个字",
+            max: 50,
+            trigger: "change"
+          }
+        ],
+        collegeId: [
+          {
+            required: false,
+            message: "请选择所属学院",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      if (val.id) {
+        this.modalForm = this.$objAssign(initModalForm, val);
+      } else {
+        this.modalForm = { ...initModalForm };
+      }
+    },
+    visibleChange() {
+      this.initData(this.instance);
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const data = await updateMajor(this.modalForm).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 151 - 0
src/modules/base/components/ModifySemester.vue

@@ -0,0 +1,151 @@
+<template>
+  <el-dialog
+    class="modify-semester"
+    :visible.sync="modalIsShow"
+    :title="title"
+    top="10vh"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-position="top"
+    >
+      <el-form-item prop="name" label="名称:">
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="请输入学期"
+          clearable
+        ></el-input>
+        <p class="tips-info">示例:2021~2022第一学期/上学期</p>
+      </el-form-item>
+      <el-form-item prop="startTime" label="时间:">
+        <el-date-picker
+          v-model="createTime"
+          type="datetimerange"
+          range-separator="至"
+          start-placeholder="学期开始时间"
+          end-placeholder="学期结束时间"
+          value-format="timestamp"
+          align="right"
+          unlink-panels
+          @change="dateChange"
+        >
+        </el-date-picker>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { updateSemester } from "../api";
+
+const initModalForm = {
+  id: null,
+  name: "",
+  startTime: "",
+  endTime: ""
+};
+
+export default {
+  name: "modify-semester",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  computed: {
+    isEdit() {
+      return !!this.instance.id;
+    },
+    title() {
+      return (this.isEdit ? "编辑" : "新增") + "学年学期";
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: { ...initModalForm },
+      createTime: [],
+      rules: {
+        name: [
+          {
+            required: true,
+            message: "学期名称不能超过100个字",
+            max: 100,
+            trigger: "change"
+          }
+        ],
+        startTime: [
+          {
+            required: true,
+            message: "请设置命题时间",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    initData(val) {
+      if (val.id) {
+        this.modalForm = this.$objAssign(initModalForm, val);
+        this.createTime = [this.modalForm.startTime, this.modalForm.endTime];
+      } else {
+        this.modalForm = { ...initModalForm };
+      }
+    },
+    visibleChange() {
+      this.initData(this.instance);
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    dateChange() {
+      if (this.createTime) {
+        this.modalForm.startTime = this.createTime[0];
+        this.modalForm.endTime = this.createTime[1];
+      } else {
+        this.modalForm.startTime = "";
+        this.modalForm.endTime = "";
+      }
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      let datas = { ...this.modalForm };
+      const data = await updateSemester(datas).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success(this.title + "成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

+ 56 - 30
src/modules/base/components/ModifyStudent.vue

@@ -3,7 +3,7 @@
     class="modify-student"
     :visible.sync="modalIsShow"
     :title="title"
-    top="10vh"
+    top="10px"
     width="448px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
@@ -38,22 +38,37 @@
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item prop="clazzId" label="班级信息:">
-        <el-select
+      <el-form-item prop="campusId" label="所属校区:">
+        <campus-select
+          v-model="modalForm.campusId"
+          placeholder="请选择所属校区"
+          style="width: 100%;"
+        ></campus-select>
+      </el-form-item>
+      <el-form-item prop="collegeId" label="学院:">
+        <college-select
+          v-model="modalForm.collegeId"
+          placeholder="请选择学院"
+          style="width: 100%;"
+        ></college-select>
+      </el-form-item>
+      <el-form-item prop="majorId" label="专业:">
+        <major-select
+          v-model="modalForm.majorId"
+          :college-id="modalForm.collegeId"
+          cascader
+          placeholder="请选择专业"
+          style="width: 100%;"
+        ></major-select>
+      </el-form-item>
+      <el-form-item prop="clazzId" label="班级:">
+        <class-select
           v-model="modalForm.clazzId"
-          placeholder="请输入班级信息"
-          filterable
-          clearable
-          style="width:100%;"
-        >
-          <el-option
-            v-for="item in classList"
-            :key="item.id"
-            :value="item.id"
-            :label="item.name"
-          >
-          </el-option>
-        </el-select>
+          :major-id="modalForm.majorId"
+          cascader
+          placeholder="请选择班级"
+          style="width: 100%;"
+        ></class-select>
       </el-form-item>
     </el-form>
     <div slot="footer">
@@ -66,13 +81,16 @@
 </template>
 
 <script>
-import { updateStudent, clazzQuery } from "../api";
+import { updateStudent } from "../api";
 
 const initModalForm = {
   id: null,
   studentName: "",
   studentCode: "",
   phoneNumber: "",
+  campusId: "",
+  collegeId: "",
+  majorId: "",
   clazzId: ""
 };
 
@@ -98,7 +116,6 @@ export default {
     return {
       modalIsShow: false,
       isSubmit: false,
-      classList: [],
       modalForm: { ...initModalForm },
       rules: {
         studentName: [
@@ -133,29 +150,38 @@ export default {
             trigger: "change"
           }
         ],
-        clazzId: [
+        campusId: [
           {
             required: true,
-            message: "请输入班级信息",
+            message: "请选择校区",
             trigger: "change"
-          },
+          }
+        ],
+        collegeId: [
           {
-            max: 50,
-            message: "班级信息不能超过50个字符",
+            required: true,
+            message: "请选择学院",
+            trigger: "change"
+          }
+        ],
+        majorId: [
+          {
+            required: true,
+            message: "请选择专业",
+            trigger: "change"
+          }
+        ],
+        clazzId: [
+          {
+            required: true,
+            message: "请选择班级",
             trigger: "change"
           }
         ]
       }
     };
   },
-  created() {
-    this.getClassList();
-  },
   methods: {
-    async getClassList() {
-      const data = await clazzQuery();
-      this.classList = data || [];
-    },
     initData(val) {
       if (val.id) {
         this.modalForm = this.$objAssign(initModalForm, val);

+ 1 - 0
src/modules/base/views/ClazzManage.vue

@@ -58,6 +58,7 @@
         ></el-table-column>
         <el-table-column prop="clazzName" label="班级名称"></el-table-column>
         <el-table-column prop="campusName" label="所属校区"></el-table-column>
+        <el-table-column prop="majorName" label="所属专业"></el-table-column>
         <el-table-column prop="createTime" label="创建时间">
           <span slot-scope="scope">{{
             scope.row.createTime | timestampFilter

+ 146 - 0
src/modules/base/views/MajorManage.vue

@@ -0,0 +1,146 @@
+<template>
+  <div class="major-manage">
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="90px" inline>
+        <el-form-item label="专业名称:">
+          <el-input
+            v-model.trim="filter.queryParams"
+            placeholder="专业名称"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            v-if="checkPrivilege('button', 'select')"
+            type="primary"
+            @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          v-if="checkPrivilege('button', 'add')"
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增专业</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="name" label="专业名称"></el-table-column>
+        <el-table-column prop="collegeName" label="所属学院"></el-table-column>
+        <el-table-column prop="createTime" label="创建时间">
+          <span slot-scope="scope">{{
+            scope.row.createTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'edit')"
+              class="btn-primary"
+              type="text"
+              @click="toEdit(scope.row)"
+              >编辑</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'delete')"
+              class="btn-danger"
+              type="text"
+              @click="toDelete(scope.row)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <modify-major
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifyMajor"
+    ></modify-major>
+  </div>
+</template>
+
+<script>
+import { majorListQuery, deleteMajor } from "../api";
+import ModifyMajor from "../components/ModifyMajor";
+
+export default {
+  name: "major-manage",
+  components: { ModifyMajor },
+  data() {
+    return {
+      filter: {
+        queryParams: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {}
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await majorListQuery(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toAdd() {
+      this.curRow = {};
+      this.$refs.ModifyMajor.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyMajor.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除专业【${row.name}】吗?`, "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          await deleteMajor([row.id]);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    }
+  }
+};
+</script>

+ 109 - 3
src/modules/base/views/SemesterManage.vue

@@ -1,15 +1,121 @@
 <template>
   <div class="semester-manage">
-    semester-manage
+    <div class="part-box part-box-filter part-box-flex">
+      <div></div>
+      <div class="part-box-action">
+        <el-button
+          v-if="checkPrivilege('button', 'add')"
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增学期</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="campusName" label="学年学期"></el-table-column>
+        <el-table-column prop="startTime" label="开始时间">
+          <span slot-scope="scope">{{
+            scope.row.startTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="endTime" label="结束时间">
+          <span slot-scope="scope">{{
+            scope.row.endTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'edit')"
+              class="btn-primary"
+              type="text"
+              @click="toEdit(scope.row)"
+              >编辑</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'delete')"
+              class="btn-danger"
+              type="text"
+              @click="toDelete(scope.row)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <modify-semester
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifySemester"
+    ></modify-semester>
   </div>
 </template>
 
 <script>
+import { semesterListQuery, deleteSemester } from "../api";
+import ModifySemester from "../components/ModifySemester";
+
 export default {
   name: "semester-manage",
+  components: { ModifySemester },
   data() {
-    return {};
+    return {
+      filter: {},
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {}
+    };
   },
-  methods: {}
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await semesterListQuery(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toAdd() {
+      this.curRow = {};
+      this.$refs.ModifySemester.open();
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifySemester.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除当前学期吗?`, "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          await deleteSemester([row.id]);
+          this.$message.success("删除成功!");
+          this.getList();
+        })
+        .catch(() => {});
+    }
+  }
 };
 </script>

+ 2 - 0
src/modules/base/views/StudentManage.vue

@@ -78,6 +78,8 @@
           }}</span>
         </el-table-column>
         <el-table-column prop="campusName" label="校区"></el-table-column>
+        <el-table-column prop="collegeName" label="学院"></el-table-column>
+        <el-table-column prop="majorName" label="专业"></el-table-column>
         <el-table-column prop="clazz" label="班级"></el-table-column>
         <el-table-column prop="createTime" label="创建时间">
           <span slot-scope="scope">{{

+ 0 - 15
src/modules/base/views/SubjectManage.vue

@@ -1,15 +0,0 @@
-<template>
-  <div class="subject-manage">
-    subject-manage
-  </div>
-</template>
-
-<script>
-export default {
-  name: "subject-manage",
-  data() {
-    return {};
-  },
-  methods: {}
-};
-</script>

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

@@ -63,7 +63,7 @@
       </el-form>
       <div class="part-box-action">
         <el-button
-          v-if="!checkPrivilege('button', 'sync')"
+          v-if="checkPrivilege('button', 'SyncUser')"
           type="primary"
           icon="el-icon-refresh"
           :loading="loading"

+ 7 - 0
src/modules/stmms/api.js

@@ -17,3 +17,10 @@ export const scorePaperDetail = datas => {
 export const yptAuth = datas => {
   return $post("/api/admin/exam/sso/marker_login", datas);
 };
+// sync-result-manage
+export const syncResultListPage = datas => {
+  return $postParam("/api/admin/sys/user/user_list", datas);
+};
+export const downloadSyncLogs = datas => {
+  return $postParam("/api/admin/sys/user/user_list", datas);
+};

+ 2 - 16
src/modules/stmms/components/UploadPaperAnswerDialog.vue

@@ -52,20 +52,6 @@
 import { uploadPaperAndAnswer } from "../api";
 import SelectFile from "./SelectFile.vue";
 
-// const files = {
-//   files: [
-//     {
-//       paperType: "A",
-//       subjectiveQuestionFile: "File",
-//       subjectiveQuestionMd5: "string",
-//       objectiveQuestionFile: "File",
-//       objectiveQuestionMd5: "string",
-//       standardAnswerFile: "File",
-//       standardAnswerMd5: "string"
-//     }
-//   ]
-// };
-
 export default {
   name: "upload-paper-answer-dialog",
   components: { SelectFile },
@@ -167,7 +153,7 @@ export default {
       this.isSubmit = true;
 
       let formData = new FormData();
-      formData.append("id", this.instance.id);
+      formData.append("examPaperStructure", JSON.stringify(this.instance));
       let md5s = [];
       Object.values(this.infos).forEach(vals => {
         this.fileTypeSerial.forEach(typeKey => {
@@ -176,7 +162,7 @@ export default {
         });
       });
       formData.append(`md5`, md5s.join());
-      formData.append(`paperType`, this.instance.paperType);
+
       // Object.entries(this.infos).forEach(([paperType, vals], index) => {
       //   const indexName = `files[${index}]`;
       //   formData.append(`${indexName}.paperType`, paperType);

+ 2 - 31
src/modules/stmms/views/MarkTaskManage.vue

@@ -14,8 +14,7 @@
     <div class="part-box part-box-pad">
       <el-table ref="TableList" :data="taskList">
         <el-table-column prop="examId" label="考试ID"></el-table-column>
-        <el-table-column prop="paperNumber" label="试卷ID"></el-table-column>
-        <el-table-column prop="paperType" label="试卷类型"></el-table-column>
+        <el-table-column prop="courseName" label="课程名称"></el-table-column>
         <el-table-column prop="status" label="状态" width="100">
           <template slot-scope="scope">
             {{ scope.row.status | markTaskSyncStatusFilter }}
@@ -23,13 +22,6 @@
         </el-table-column>
         <el-table-column class-name="action-column" label="操作" width="220px">
           <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'UploadStructure')"
-              class="btn-primary"
-              type="text"
-              @click="toUpload(scope.row)"
-              >上传试卷结构/标答</el-button
-            >
             <el-button
               v-if="checkPrivilege('link', 'markerLogin')"
               class="btn-primary"
@@ -52,38 +44,22 @@
         </el-pagination>
       </div>
     </div>
-
-    <UploadPaperAnswerDialog
-      ref="UploadPaperAnswerDialog"
-      :instance="curTask"
-      @modified="getList"
-    />
   </div>
 </template>
 
 <script>
 import { markTaskListPage, yptAuth } from "../api";
-import UploadPaperAnswerDialog from "../components/UploadPaperAnswerDialog";
 import { autoSubmitForm } from "@/plugins/utils";
 
 export default {
   name: "mark-task-manage",
-  components: { UploadPaperAnswerDialog },
   data() {
     return {
       filter: {},
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
-      taskList: [
-        {
-          id: "111",
-          examId: "111",
-          paperNumber: "232323",
-          paperType: "A,B",
-          enable: false
-        }
-      ],
+      taskList: [],
       curTask: {}
     };
   },
@@ -106,11 +82,6 @@ export default {
       this.current = page;
       this.getList();
     },
-    toUpload(row) {
-      console.log(row);
-      this.curTask = row;
-      this.$refs.UploadPaperAnswerDialog.open();
-    },
     toMark(row) {
       console.log(row);
       this.toAuth();

+ 116 - 3
src/modules/stmms/views/PaperAnswerUpload.vue

@@ -1,15 +1,128 @@
 <template>
   <div class="paper-answer-upload">
-    paper-answer-upload
+    <div class="part-box part-box-filter part-box-flex">
+      <div></div>
+      <div class="part-box-action">
+        <el-button
+          v-if="!checkPrivilege('button', 'select')"
+          type="primary"
+          @click="toPage(1)"
+          >查询</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="taskList">
+        <el-table-column prop="examId" label="考试ID"></el-table-column>
+        <el-table-column prop="paperNumber" label="试卷ID"></el-table-column>
+        <el-table-column prop="paperType" label="试卷类型"></el-table-column>
+        <el-table-column prop="status" label="状态" width="100">
+          <template slot-scope="scope">
+            {{ scope.row.status | markTaskSyncStatusFilter }}
+          </template>
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="220px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'UploadStructure')"
+              class="btn-primary"
+              type="text"
+              @click="toUpload(scope.row)"
+              >上传试卷结构/标答</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'viewPaper')"
+              class="btn-primary"
+              type="text"
+              @click="toViewPaper(scope.row)"
+              >查看试卷结构</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'viewAnswer')"
+              class="btn-primary"
+              type="text"
+              @click="toViewAnswer(scope.row)"
+              >查看标答</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <UploadPaperAnswerDialog
+      ref="UploadPaperAnswerDialog"
+      :instance="curTask"
+      @modified="getList"
+    />
   </div>
 </template>
 
 <script>
+import { markTaskListPage } from "../api";
+import UploadPaperAnswerDialog from "../components/UploadPaperAnswerDialog";
+
 export default {
   name: "paper-answer-upload",
+  components: { UploadPaperAnswerDialog },
   data() {
-    return {};
+    return {
+      filter: {},
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      taskList: [
+        {
+          id: "111",
+          examId: "111",
+          paperNumber: "232323",
+          paperType: "A,B",
+          enable: false
+        }
+      ],
+      curTask: {}
+    };
+  },
+  mounted() {
+    // this.toPage(1);
   },
-  methods: {}
+  methods: {
+    async getList() {
+      // if (!this.checkPrivilege("list", "list")) return;
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await markTaskListPage(datas);
+      this.taskList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toUpload(row) {
+      console.log(row);
+      this.curTask = row;
+      this.$refs.UploadPaperAnswerDialog.open();
+    },
+    toViewPaper(row) {
+      console.log(row);
+    },
+    toViewAnswer(row) {
+      console.log(row);
+    }
+  }
 };
 </script>

+ 139 - 3
src/modules/stmms/views/SyncManage.vue

@@ -1,15 +1,151 @@
 <template>
   <div class="sync-manage">
-    sync-manage
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" inline>
+        <el-form-item label="同步类型:">
+          <el-select v-model="filter.type" placeholder="同步类型" clearable>
+            <el-option
+              v-for="(val, key) in STMMS_SYNC_TYPE"
+              :key="key"
+              :value="key"
+              :label="val"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据结果:">
+          <el-select
+            v-model="filter.result"
+            placeholder="数据结果"
+            clearable
+            style="width: 120px;"
+          >
+            <el-option
+              v-for="(val, key) in DATA_TASK_RESULT"
+              :key="key"
+              :value="key"
+              :label="val"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label-width="0px">
+          <el-button type="primary" @click="toPage(1)">查询</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="name" label="类别"></el-table-column>
+        <el-table-column prop="status" label="状态"> </el-table-column>
+        <el-table-column prop="result" label="结果" width="100">
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="120px">
+          <template slot-scope="scope">
+            <el-button
+              class="btn-primary"
+              type="text"
+              :disabled="loading"
+              @click="toDonwloadLog(scope.row)"
+              >导出日志</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
   </div>
 </template>
 
 <script>
+import { STMMS_SYNC_TYPE, DATA_TASK_RESULT } from "@/constants/enumerate";
+import { syncResultListPage, downloadSyncLogs } from "../api";
+import { downloadFileURL } from "@/plugins/utils";
+
 export default {
   name: "sync-manage",
   data() {
-    return {};
+    return {
+      STMMS_SYNC_TYPE,
+      DATA_TASK_RESULT,
+      filter: {
+        result: "",
+        type: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      loading: false
+    };
+  },
+  created() {
+    this.getList();
   },
-  methods: {}
+  methods: {
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await syncResultListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    async toDonwloadLog(row) {
+      if (this.loading) return;
+
+      this.loading = true;
+      const res = await downloadSyncLogs({
+        id: row.id,
+        type: "REPORT"
+      }).catch(() => {});
+
+      if (!res) {
+        this.loading = false;
+        this.$message.error("文件下载失败,请重新尝试!");
+        return;
+      }
+
+      const url = res.url;
+      if (url.endsWith(".txt")) {
+        this.loading = false;
+        window.open(url);
+        return;
+      }
+      let result = true;
+      await downloadFileURL(url).catch(() => {
+        result = false;
+      });
+      this.loading = false;
+
+      if (result) {
+        this.$message.success("文件下载成功!");
+      } else {
+        this.$message.error("文件下载失败,请重新尝试!");
+      }
+    }
+  }
 };
 </script>

+ 5 - 1
src/plugins/filters.js

@@ -11,7 +11,8 @@ import {
   DATA_TASK_RESULT,
   ORG_TYPE,
   CARD_SOURCE_TYPE,
-  MARK_TASK_SYNC_STATUS
+  MARK_TASK_SYNC_STATUS,
+  STMMS_SYNC_TYPE
 } from "../constants/enumerate";
 import { formatDate } from "../plugins/utils";
 
@@ -76,3 +77,6 @@ Vue.filter("flowTaskNameFilter", function(val) {
 Vue.filter("markTaskSyncStatusFilter", function(val) {
   return MARK_TASK_SYNC_STATUS[val] || DEFAULT_FIELD;
 });
+Vue.filter("stmmsSyncTypeFilter", function(val) {
+  return STMMS_SYNC_TYPE[val] || DEFAULT_FIELD;
+});

+ 5 - 1
src/plugins/globalVuePlugins.js

@@ -20,6 +20,8 @@ import TeachingRoomSelect from "../components/base/TeachingRoomSelect.vue";
 import FacultySelect from "../components/base/FacultySelect.vue";
 import CollegeSelect from "../components/base/CollegeSelect.vue";
 import ClazzSelect from "../components/base/ClazzSelect.vue";
+import MajorSelect from "../components/base/MajorSelect.vue";
+import ClassSelect from "../components/base/ClassSelect.vue";
 
 const components = {
   ViewFooter,
@@ -38,7 +40,9 @@ const components = {
   TeachingRoomSelect,
   FacultySelect,
   CollegeSelect,
-  ClazzSelect
+  ClazzSelect,
+  MajorSelect,
+  ClassSelect
 };
 
 export default {