zhangjie 3 vuotta sitten
vanhempi
commit
73be86161d
46 muutettua tiedostoa jossa 258 lisäystä ja 8077 poistoa
  1. 0 63
      src/components/base/CampusSelect.vue
  2. 0 116
      src/components/base/ClazzSelect.vue
  3. 0 88
      src/components/base/CollegeSelect.vue
  4. 0 84
      src/components/base/CourseSelect.vue
  5. 0 79
      src/components/base/MajorSelect.vue
  6. 0 71
      src/components/base/RoomSelect.vue
  7. 5 8
      src/constants/enumerate.js
  8. 1 1
      src/constants/menus-data.js
  9. 16 274
      src/modules/base/api.js
  10. 0 138
      src/modules/base/components/CardTitleRuleEdit.vue
  11. 0 217
      src/modules/base/components/MergePushDialog.vue
  12. 0 155
      src/modules/base/components/ModifyCampus.vue
  13. 0 262
      src/modules/base/components/ModifyCardInfo.vue
  14. 0 384
      src/modules/base/components/ModifyCardRule.vue
  15. 0 151
      src/modules/base/components/ModifyClazz.vue
  16. 0 149
      src/modules/base/components/ModifyClazzSimple.vue
  17. 0 207
      src/modules/base/components/ModifyClazzSimpleStudent.vue
  18. 0 178
      src/modules/base/components/ModifyCourse.vue
  19. 0 155
      src/modules/base/components/ModifyCourseSimple.vue
  20. 0 185
      src/modules/base/components/ModifyExam.vue
  21. 0 253
      src/modules/base/components/ModifyExamConfig.vue
  22. 0 694
      src/modules/base/components/ModifyExamConfigDetail.vue
  23. 0 100
      src/modules/base/components/ModifyField.vue
  24. 0 152
      src/modules/base/components/ModifyFlow.vue
  25. 0 736
      src/modules/base/components/ModifyFlowDetail.vue
  26. 0 137
      src/modules/base/components/ModifyMajor.vue
  27. 0 154
      src/modules/base/components/ModifyOrgAdmin.vue
  28. 0 154
      src/modules/base/components/ModifyOrganization.vue
  29. 0 149
      src/modules/base/components/ModifyRole.vue
  30. 0 151
      src/modules/base/components/ModifyRoleUser.vue
  31. 0 156
      src/modules/base/components/ModifySemester.vue
  32. 0 247
      src/modules/base/components/ModifyStudent.vue
  33. 0 240
      src/modules/base/components/ModifyStudentSimple.vue
  34. 8 3
      src/modules/base/components/ModifyTask.vue
  35. 0 222
      src/modules/base/components/PrivilegeSet.vue
  36. 0 145
      src/modules/base/components/RegistFlowDialog.vue
  37. 0 164
      src/modules/base/components/RuleExam.vue
  38. 0 158
      src/modules/base/components/SelectClassStudent.vue
  39. 0 157
      src/modules/base/components/SelectOrgs.vue
  40. 0 152
      src/modules/base/components/SelectRoleDialog.vue
  41. 0 420
      src/modules/base/components/SelectUserDialog.vue
  42. 121 0
      src/modules/base/components/SignDownloadData.vue
  43. 32 178
      src/modules/base/views/BusinessDataManage.vue
  44. 73 172
      src/modules/base/views/DownloadManage.vue
  45. 0 18
      src/modules/login/views/ForgetPwd.vue
  46. 2 0
      src/views/Home.vue

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

@@ -1,63 +0,0 @@
-<template>
-  <el-select
-    v-model="selected"
-    class="campus-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.campusName"
-    >
-    </el-option>
-  </el-select>
-</template>
-
-<script>
-import { campusQuery } from "../../modules/base/api";
-
-export default {
-  name: "campus-select",
-  props: {
-    disabled: { type: Boolean, default: false },
-    placeholder: { type: String, default: "请选择" },
-    value: { type: [Number, String], default: "" },
-    clearable: { type: Boolean, default: true }
-  },
-  data() {
-    return {
-      optionList: [],
-      selected: ""
-    };
-  },
-  watch: {
-    value: {
-      immediate: true,
-      handler(val) {
-        this.selected = val;
-      }
-    }
-  },
-  created() {
-    this.search();
-  },
-  methods: {
-    async search() {
-      const res = await campusQuery();
-      this.optionList = res;
-    },
-    select() {
-      this.$emit("input", this.selected);
-      this.$emit(
-        "change",
-        this.optionList.find(item => item.id === this.selected)
-      );
-    }
-  }
-};
-</script>

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

@@ -1,116 +0,0 @@
-<template>
-  <el-select
-    v-model="selected"
-    class="clazz-select"
-    popper-class="popper-filter"
-    :placeholder="placeholder"
-    :clearable="clearable"
-    :disabled="disabled"
-    :multiple="multiple"
-    @change="select"
-  >
-    <div class="el-select-filter">
-      <el-input
-        v-model="filterLabel"
-        placeholder="请输入"
-        clearable
-        @input="labelChange"
-      ></el-input>
-    </div>
-    <el-option
-      v-for="item in filterOptionList"
-      :key="item.id"
-      :value="item.id"
-      :label="item.name"
-    >
-    </el-option>
-  </el-select>
-</template>
-
-<script>
-import { clazzQuery } from "../../modules/base/api";
-
-export default {
-  name: "clazz-select",
-  props: {
-    disabled: { type: Boolean, default: false },
-    placeholder: { type: String, default: "请选择" },
-    value: { type: [Number, String, Array], default: "" },
-    clearable: { type: Boolean, default: true },
-    multiple: { type: Boolean, default: false },
-    campusId: { type: String, default: "" },
-    datas: {
-      type: Array
-    }
-  },
-  data() {
-    return {
-      optionList: [],
-      filterOptionList: [],
-      selected: "",
-      filterLabel: ""
-    };
-  },
-  watch: {
-    value: {
-      immediate: true,
-      handler(val) {
-        this.selected = val;
-      }
-    },
-    datas: {
-      immediate: true,
-      handler(val) {
-        if (!val) return;
-        this.optionList = val.map(item => {
-          return { ...item };
-        });
-        this.labelChange();
-      }
-    },
-    campusId(val, oldval) {
-      if (val !== oldval) {
-        this.search();
-        this.$emit("input", "");
-        this.$emit("change", null);
-      }
-    }
-  },
-  created() {
-    if (!this.datas) this.search();
-  },
-  methods: {
-    async search() {
-      const res = await clazzQuery({
-        campusId: this.campusId
-      });
-      this.optionList = res || [];
-      this.labelChange();
-    },
-    labelChange() {
-      const escapeRegexpString = (value = "") =>
-        String(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
-      const reg = new RegExp(escapeRegexpString(this.filterLabel), "i");
-
-      this.filterOptionList = this.optionList.filter(item =>
-        reg.test(item.name)
-      );
-    },
-    select() {
-      this.$emit("input", this.selected);
-
-      if (this.multiple) {
-        this.$emit(
-          "change",
-          this.optionList.filter(item => this.selected.includes(item.id))
-        );
-      } else {
-        this.$emit(
-          "change",
-          this.optionList.find(item => item.id === this.selected)
-        );
-      }
-    }
-  }
-};
-</script>

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

@@ -1,88 +0,0 @@
-<template>
-  <el-select
-    v-model="selected"
-    class="college-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 {
-  unitQueryByType,
-  organizationFindByTypeList
-} from "../../modules/base/api";
-
-export default {
-  name: "college-select",
-  props: {
-    disabled: { type: Boolean, default: false },
-    placeholder: { type: String, default: "请选择" },
-    value: { type: [Number, String], default: "" },
-    clearable: { type: Boolean, default: true },
-    semesterId: { type: String, default: "" },
-    cascader: { type: Boolean, default: false }
-  },
-  data() {
-    return {
-      optionList: [],
-      selected: ""
-    };
-  },
-  watch: {
-    value: {
-      immediate: true,
-      handler(val) {
-        this.selected = val;
-      }
-    },
-    semesterId(val, oldval) {
-      if (val !== oldval) {
-        this.search("");
-        this.$emit("input", "");
-        this.$emit("change", {});
-      }
-    }
-  },
-  created() {
-    this.search();
-  },
-  methods: {
-    async search() {
-      this.optionList = [];
-      if (this.cascader && !this.semesterId) return;
-
-      if (this.cascader) {
-        const res = await unitQueryByType(
-          {
-            semesterId: this.semesterId
-          },
-          "COLLEGE"
-        );
-        this.optionList = res;
-      } else {
-        const res = await organizationFindByTypeList({ orgType: "COLLEGE" });
-        this.optionList = res;
-      }
-    },
-    select() {
-      this.$emit("input", this.selected);
-      this.$emit(
-        "change",
-        this.optionList.find(item => item.id === this.selected)
-      );
-    }
-  }
-};
-</script>

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

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

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

@@ -1,79 +0,0 @@
-<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 { unitQueryByType } 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, 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 unitQueryByType(
-        {
-          collegeId: this.collegeId
-        },
-        "MAJOR"
-      );
-      this.optionList = res;
-    },
-    select() {
-      this.$emit("input", this.selected);
-      this.$emit(
-        "change",
-        this.optionList.find(item => item.id === this.selected)
-      );
-    }
-  }
-};
-</script>

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

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

+ 5 - 8
src/constants/enumerate.js

@@ -13,14 +13,11 @@ export const BOOLEAN_TYPE = {
   1: "是"
 };
 
-// 审核状态
-export const AUDITING_STATUS = {
-  START: "待审核",
-  AUDITING: "审核中",
-  REJECT: "已驳回",
-  CANCEL: "已撤回",
-  END: "已终止",
-  FINISH: "已结束"
+// 下载用途
+export const USE_TYPE = {
+  PARAM_PRINT: "变量印刷",
+  SCAN: "扫描阅卷",
+  ANALYSE: "教研分析"
 };
 
 // 审核结果

+ 1 - 1
src/constants/menus-data.js

@@ -2,7 +2,7 @@ export default [
   {
     id: "1",
     parentId: "-1",
-    name: "考务数据",
+    name: "数据对接",
     url: "exam",
     type: "MENU"
   },

+ 16 - 274
src/modules/base/api.js

@@ -16,6 +16,12 @@ export const enumsByType = type => {
     type
   });
 };
+
+// exam-manage
+export const examQuery = datas => {
+  return $postParam("/api/admin/basic/exam/query", datas);
+};
+
 // user --------------------------------->
 // user-manage
 export const userListPage = datas => {
@@ -108,285 +114,21 @@ export const ableTimeTask = ({ id, enable }) => {
   return $post("/api/admin/sys/org/enable", { id, enable });
 };
 
-// common-card-template / common-print-template / param-print-template
-export const templateListPage = datas => {
-  return $postParam("/api/admin/basic/template/list", datas);
-};
-export const updateTemplate = datas => {
-  return $post("/api/admin/basic/template/save", datas);
-};
-export const ableTemplate = ({ id, enable }) => {
-  return $post("/api/admin/basic/template/enable", { id, enable });
-};
-export const templateCategoryList = type => {
-  return $postParam("/api/admin/basic/template/list", type);
-};
-export const templateContentView = attachmentId => {
-  return $postParam("/api/admin/basic/template/read_content", { attachmentId });
-};
-// card-manage
-export const cardListPage = datas => {
-  return $postParam("/api/admin/exam/card/page", datas);
-};
-export const updateCard = datas => {
-  return $post("/api/admin/exam/card/save_generic", datas);
-};
-export const deleteCard = id => {
-  return $postParam("/api/admin/exam/card/delete_generic", { id });
-};
-// course-manage
-export const courseListPage = datas => {
-  return $postParam("/api/admin/basic/course/list", datas);
-};
-export const courseQuery = datas => {
-  return $postParam("/api/admin/basic/course/query", datas);
-};
-export const deleteCourse = idList => {
-  return $postParam("/api/admin/basic/course/delete_batch", { idList });
-};
-export const updateCourse = datas => {
-  return $post("/api/admin/basic/course/save", datas);
-};
-export const ableCourse = ({ idList, enable }) => {
-  return $postParam("/api/admin/basic/course/enable", { idList, enable });
-};
-export const batchEnableCourse = datas => {
-  return $postParam("/api/admin/basic/course/enable_by_query", datas);
-};
-// course-simple-manage
-export const courseSimpleListPage = datas => {
-  return $postParam("/api/admin/teach/course/page", datas);
-};
-export const courseSimpleQuery = datas => {
-  return $postParam("/api/admin/teach/course/find_basic_course", datas);
-};
-export const deleteCourseSimple = idList => {
-  return $postParam("/api/admin/teach/course/delete", { idList });
-};
-export const updateCourseSimple = datas => {
-  return $post("/api/admin/teach/course/create", datas);
-};
-// flow-manage
-export const flowListPage = datas => {
-  return $postParam("/api/admin/custom/flow/list", datas);
-};
-export const flowEnd = flowId => {
-  return $post("/api/admin/custom/flow/end", { flowId });
-};
-export const flowDelete = ({ id, enable }) => {
-  return $post("/api/admin/custom/flow/enable", { id, enable });
-};
-export const updateFlowName = datas => {
-  return $post("/api/admin/custom/flow/rename", datas);
-};
-export const updateFlowDetail = datas => {
-  return $post("/api/admin/custom/flow/save", datas);
-};
-export const flowDetail = id => {
-  return $postParam("/api/admin/custom/flow/edit", { id });
-};
-export const flowDetailByType = (type = "ELECTRON_FLOW") => {
-  return $postParam("/api/admin/custom/flow/get_flow_info_by_type", {
-    type
-  });
-};
-export const flowDetailByFlowId = flowId => {
-  return $postParam("/api/admin/custom/flow/get_flow_info_by_type", {
-    flowId
-  });
-};
-export const taskFlowDetail = flowId => {
-  return $postParam("/api/admin/custom/flow/view", { flowId });
-};
-export const taskFlowNodeInfo = taskId => {
-  return $postParam("/api/admin/custom/flow/task/info", { taskId });
-};
-export const taskFlowApproverExchange = ({ taskId, userId }) => {
-  return $postParam("/api/admin/custom/flow/task/approver/exchange", {
-    taskId,
-    userId
-  });
-};
-export const taskFlowApprover = datas => {
-  return $post("/api/admin/custom/flow/task/approve", datas);
-};
-// approve-record
-export const approveRecordListPage = datas => {
-  return $postParam("/api/admin/custom/flow/approve/list", datas);
-};
-export const deleteApproveRecord = datas => {
-  return $post("/api/admin/custom/flow/approve/enable", datas);
-};
-
-// dict --------------------------------->
-// campus-manage
-export const campusQuery = () => {
-  return $postParam("/api/admin/basic/campus/query", {});
-};
-export const deleteCampus = id => {
-  return $postParam("/api/admin/basic/campus/delete", { id });
-};
-export const updateCampus = datas => {
-  return $post("/api/admin/basic/campus/save", datas);
-};
-
-// student-manage
-export const studentListQuery = datas => {
-  return $postParam("/api/admin/basic/student/query", datas);
-};
-export const deleteStudent = idList => {
-  return $postParam("/api/admin/basic/student/delete_batch", { idList });
-};
-export const deleteFilterStudent = datas => {
-  return $postParam("/api/admin/basic/student/delete_by_condition", datas);
-};
-export const updateStudent = datas => {
-  return $post("/api/admin/basic/student/save", datas);
-};
-export const studentSimpleListQuery = datas => {
-  return $postParam("/api/admin/teach/student/page", datas);
-};
-export const deleteStudentSimple = idList => {
-  return $postParam("/api/admin/teach/student/delete", { idList });
-};
-export const updateStudentSimple = datas => {
-  return $post("/api/admin/teach/student/create", datas);
-};
-export const batchAddStudentSimple = datas => {
-  return $post("/api/admin/teach/student/create_batch", datas);
-};
-
-// clazz-manage
-export const clazzListQuery = datas => {
-  return $postParam("/api/admin/basic/clazz/query", datas);
-};
-export const deleteClazz = idList => {
-  return $postParam("/api/admin/basic/clazz/delete_batch", { idList });
-};
-export const updateClazz = datas => {
-  return $post("/api/admin/basic/clazz/save", datas);
-};
-export const clazzQuery = datas => {
-  return $postParam("/api/admin/basic/clazz/datasource", datas);
-};
-
-// clazz-simple-manage
-export const clazzSimpleListPage = datas => {
-  return $postParam("/api/admin/teach/clazz/page", datas);
-};
-export const clazzTeachCourseQuery = datas => {
-  return $postParam("/api/admin/teach/clazz/find_teach_course", datas);
-};
-export const deleteClazzSimple = idList => {
-  return $postParam("/api/admin/teach/clazz/delete", { idList });
-};
-export const updateClazzSimple = datas => {
-  return $post("/api/admin/teach/clazz/edit", datas);
-};
-
-// semester-manage
-export const semesterListQuery = datas => {
-  return $postParam("/api/admin/basic/semester/query", datas);
-};
-export const examSemesterList = datas => {
-  return $postParam("/api/admin/basic/semester/list", datas);
-};
-export const deleteSemester = id => {
-  return $postParam("/api/admin/basic/semester/delete", { id });
-};
-export const updateSemester = datas => {
-  return $post("/api/admin/basic/semester/save", datas);
-};
-export const semesterSetInUsed = id => {
-  return $postParam("/api/admin/basic/semester/set_in_used", { id });
-};
-// major-manage
-export const majorListQuery = datas => {
-  return $postParam("/api/admin/basic/major/query", datas);
-};
-export const deleteMajor = idList => {
-  return $postParam("/api/admin/basic/major/delete", { 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);
-};
-export const printPlanBatchPush = list => {
-  return $post("/api/admin/exam/print_sync/sync_data_cloud_batch", {
-    list
-  });
-};
-export const printPlanPush = ({ printPlanId, thirdRelateId }) => {
-  return $postParam("/api/admin/exam/print_sync/sync_data_cloud", {
-    printPlanId,
-    thirdRelateId
-  });
-};
-export const printPlanMergePush = datas => {
-  return $post("/api/admin/exam/print_sync/sync_data_merge", datas);
-};
-export const printPlanSyncExamList = () => {
-  return $post("/api/admin/exam/print_sync/list_relate_ids", {});
-};
-
-// sms-manage
-export const smsListQuery = datas => {
-  return $postParam("/api/admin/basic/message/list", datas);
-};
-export const smsTypes = () => {
-  return $postParam("/api/admin/basic/message/list_message_types", {});
-};
-export const resendSms = id => {
-  return $postParam("/api/admin/basic/message/resend", { id });
-};
-
-// exam-manage
-export const examQuery = datas => {
-  return $postParam("/api/admin/basic/exam/query", datas);
-};
-export const examListQuery = datas => {
-  return $postParam("/api/admin/basic/exam/page", datas);
+// business-data
+export const businessDataList = datas => {
+  return $postParam("/api/admin/sys/org/list", datas);
 };
-export const deleteExam = id => {
-  return $postParam("/api/admin/basic/exam/delete", { id });
+export const downloadBusinessData = datas => {
+  return $postParam("/api/admin/sys/org/list", datas);
 };
-export const updateExam = datas => {
-  return $post("/api/admin/basic/exam/save", datas);
+// download-manage
+export const downloadList = datas => {
+  return $postParam("/api/admin/sys/org/list", datas);
 };
-export const ableExam = ({ id, enable }) => {
-  return $postParam("/api/admin/basic/exam/enable", { id, enable });
+export const signPurpose = datas => {
+  return $postParam("/api/admin/sys/org/list", datas);
 };
 
-// exam-config
-export const examConfigQuery = datas => {
-  return $postParam("/api/admin/basic/print_config/page", datas);
-};
-export const deleteExamConfig = id => {
-  return $postParam("/api/admin/basic/print_config/delete", { id });
-};
-export const updateExamConfig = datas => {
-  return $post("/api/admin/basic/print_config/save", datas);
-};
-export const ableExamConfig = ({ id, enable }) => {
-  return $postParam("/api/admin/basic/print_config/enable", { id, enable });
-};
-export const examConfigByExamIdOrgId = datas => {
-  return $postParam(
-    "/api/admin/basic/print_config/get_by_exam_id_and_org_id",
-    datas
-  );
-};
-export const listOrgsByExamId = ({ id, examId }) => {
-  return $postParam("/api/admin/basic/print_config/list_org_id_by_exam_id", {
-    id,
-    examId
-  });
-};
 // common
 export const uploadFile = datas => {
   return $post("/api/admin/common/file/upload", datas);

+ 0 - 138
src/modules/base/components/CardTitleRuleEdit.vue

@@ -1,138 +0,0 @@
-<template>
-  <div class="card-title-rule-edit">
-    <div class="field-list">
-      <div
-        v-for="field in fields"
-        :key="field.code"
-        :class="[
-          'field-item',
-          { 'field-item-act': field.selected, 'field-item-disabled': disabled }
-        ]"
-        @mousedown="event => selectField(field, event)"
-      >
-        {{ field.name }}({{ field.code }})
-      </div>
-    </div>
-    <el-input
-      ref="FieldTextarea"
-      v-model="content"
-      type="textarea"
-      resize="none"
-      :rows="2"
-      placeholder="请输入内容"
-      :disabled="disabled"
-      @input="contentChange"
-    >
-    </el-input>
-  </div>
-</template>
-
-<script>
-export default {
-  name: "card-title-rule-edit",
-  props: {
-    value: {
-      type: String,
-      default: ""
-    },
-    fieldSourses: {
-      type: Array,
-      default() {
-        return [];
-      }
-    },
-    disabled: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data() {
-    return {
-      fields: [],
-      fieldNameToCode: {},
-      fieldCodeToName: {},
-      frameWin: null,
-      content: ""
-    };
-  },
-  watch: {
-    fieldSourses: {
-      immediate: true,
-      handler(val) {
-        this.rebuildTextarea();
-        this.setFields(val);
-        this.updateFieldStatus();
-      }
-    },
-    value: {
-      immediate: true,
-      handler(val) {
-        // if (!val) return;
-        this.content = val;
-        this.updateFieldStatus();
-      }
-    }
-  },
-  methods: {
-    setFields(data) {
-      const selectedCodes = this.fields
-        .filter(item => item.selected)
-        .map(item => item.code);
-      this.fields = data.map(item => {
-        item.selected = selectedCodes.includes(item.code);
-        return item;
-      });
-      this.fields.forEach(field => {
-        this.fieldNameToCode[field.name] = field.code;
-        this.fieldCodeToName[field.code] = field.name;
-      });
-    },
-    updateFieldStatus() {
-      const rexp = new RegExp(/\$\{.+?\}/, "g");
-      const variates = this.content.match(rexp);
-
-      const selectedCodes = variates
-        ? variates.map(item => item.replace("${", "").replace("}", ""))
-        : [];
-      this.fields = this.fields.map(field => {
-        field.selected = selectedCodes.includes(field.code);
-        return field;
-      });
-    },
-    rebuildTextarea() {
-      const soursesCodes = this.fieldSourses.map(item => item.code);
-      const deletedCodes = this.fields.filter(
-        item => item.selected && !soursesCodes.includes(item.code)
-      );
-      console.log(deletedCodes);
-      deletedCodes.forEach(field => {
-        this.content = this.content.replace(`\${${field.code}}`, "");
-      });
-    },
-    selectField(field, event) {
-      if (this.disabled) return;
-      event.preventDefault();
-      field.selected = !field.selected;
-      if (field.selected) {
-        // 选中
-        const variateStr = `\${${field.code}}`;
-        const textareaDom = this.$refs.FieldTextarea.$el.children[0];
-        const { selectionStart, selectionEnd } = textareaDom;
-
-        this.content =
-          this.content.slice(0, selectionStart) +
-          variateStr +
-          this.content.slice(selectionEnd);
-      } else {
-        // 取消
-        this.content = this.content.replace(`\${${field.code}}`, "");
-      }
-      this.contentChange();
-    },
-    contentChange() {
-      this.$emit("input", this.content);
-      this.$emit("change", this.content);
-    }
-  }
-};
-</script>

+ 0 - 217
src/modules/base/components/MergePushDialog.vue

@@ -1,217 +0,0 @@
-<template>
-  <el-dialog
-    class="merge-push-dialog"
-    :visible.sync="modalIsShow"
-    title="批量合并印刷任务"
-    top="10vh"
-    width="448px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <div class="mb-4">
-      <p class="tips-info">
-        1、此操作会将多个印刷计划合并,合并操作不可还原,是否继续合并操作?
-      </p>
-      <p class="tips-info">
-        2、如果确定需要合并,请填写合并后考试名称及对应考试ID,然后点击确定按钮。
-      </p>
-    </div>
-    <div class="mb-4 tab-btns">
-      <el-button
-        v-for="(val, key) in EXAM_TYPE"
-        :key="key"
-        :type="examType == key ? 'primary' : 'default'"
-        @click="selectMenu(key)"
-        >{{ val }}</el-button
-      >
-    </div>
-    <el-form
-      v-if="examType === '0'"
-      ref="modalFormComp"
-      :model="modalForm"
-      :rules="rules"
-      label-position="top"
-    >
-      <el-form-item label="考试ID:">
-        <el-input
-          v-model.trim="modalForm.thirdRelateId"
-          placeholder="请输入考试ID"
-          clearable
-          @input="thirdRelateIdChange"
-        ></el-input>
-      </el-form-item>
-      <el-form-item label="考试名称:">
-        <el-input
-          v-model.trim="modalForm.thirdRelateName"
-          placeholder="请输入考试名称"
-          clearable
-          :disabled="!canEditThirdRelateName"
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="thirdRelate"></el-form-item>
-    </el-form>
-    <el-form
-      v-else
-      ref="modalFormComp"
-      :model="modalForm"
-      :rules="rules1"
-      label-position="top"
-    >
-      <el-form-item prop="thirdRelateId" label="考试ID:">
-        <el-select
-          v-model="modalForm.thirdRelateId"
-          placeholder="请选择"
-          filterable
-          style="width:100%"
-        >
-          <el-option
-            v-for="(item, index) in exams"
-            :key="index"
-            :value="item.thirdRelateId"
-            :label="item.thirdRelateName"
-          >
-          </el-option>
-        </el-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 { printPlanMergePush, printPlanSyncExamList } from "../api";
-
-const initModalForm = {
-  thirdRelateId: "",
-  thirdRelateName: ""
-};
-
-export default {
-  name: "merge-push-dialog",
-  props: {
-    ids: {
-      type: Array,
-      default() {
-        return [];
-      }
-    }
-  },
-  data() {
-    const thirdRelateValidator = (rule, value, callback) => {
-      if (!this.modalForm.thirdRelateId && !this.modalForm.thirdRelateName) {
-        return callback(new Error(`考试ID和名称至少填一项。`));
-      }
-
-      if (
-        this.modalForm.thirdRelateId &&
-        this.modalForm.thirdRelateId.length > 50
-      ) {
-        return callback(new Error("考试ID长度不能超过50"));
-      }
-      if (
-        this.modalForm.thirdRelateName &&
-        this.modalForm.thirdRelateName.length > 50
-      ) {
-        return callback(new Error("考试名称长度不能超过50"));
-      }
-
-      return callback();
-    };
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      exams: [],
-      canEditThirdRelateName: true,
-      modalForm: { ...initModalForm },
-      rules: {
-        thirdRelate: [
-          {
-            required: true,
-            validator: thirdRelateValidator,
-            trigger: "change"
-          }
-        ]
-      },
-      rules1: {
-        thirdRelateId: [
-          {
-            required: true,
-            message: "请选择考试ID",
-            trigger: "change"
-          }
-        ]
-      },
-      examType: "0",
-      EXAM_TYPE: {
-        0: "未同步考试",
-        1: "已同步考试"
-      }
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = { ...initModalForm };
-      this.$nextTick(() => {
-        this.$refs.modalFormComp.clearValidate();
-      });
-    },
-    visibleChange() {
-      this.initData(this.instance);
-      this.getExamList();
-    },
-    async getExamList() {
-      const data = await printPlanSyncExamList();
-      this.exams = data || [];
-    },
-    thirdRelateIdChange() {
-      const exam = this.exams.find(
-        exam => this.modalForm.thirdRelateId === exam.thirdRelateId
-      );
-      if (!exam) {
-        this.modalForm.thirdRelateName = "";
-        this.canEditThirdRelateName = true;
-        return;
-      }
-      this.modalForm.thirdRelateName = exam.thirdRelateName;
-      this.canEditThirdRelateName = false;
-    },
-    selectMenu(val) {
-      this.examType = val;
-      this.modalForm = { ...initModalForm };
-    },
-    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 printPlanMergePush({
-        ...this.modalForm,
-        list: this.ids
-      }).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success("提交成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 155
src/modules/base/components/ModifyCampus.vue

@@ -1,155 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-campus"
-    :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="campusName" label="校区名称:">
-        <el-input
-          v-model.trim="modalForm.campusName"
-          placeholder="请输入校区名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="campusCode" label="校区编码:">
-        <el-input
-          v-model.trim="modalForm.campusCode"
-          placeholder="请输入校区编码"
-          disabled
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="printHouseId" label="印刷室">
-        <print-room-select
-          v-model.trim="modalForm.printHouseId"
-          style="width:100%;"
-          clearable
-        ></print-room-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 { updateCampus, getCode } from "../api";
-
-const initModalForm = {
-  id: null,
-  campusName: "",
-  campusCode: "",
-  printHouseId: ""
-};
-
-export default {
-  name: "modify-campus",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "校区";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      rules: {
-        campusName: [
-          {
-            required: true,
-            // pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,20}$/,
-            // message: "校区名称只能输入汉字、数字和字母,长度不能超过20",
-            message: "校区名称不能超过30个字",
-            max: 30,
-            trigger: "change"
-          }
-        ],
-        campusCode: [
-          {
-            required: true,
-            // pattern: /^[0-9a-zA-Z_-]{3,30}$/,
-            // message: "校区编码只能由数字字母短横线组成,长度在3-30之间",
-            message: "校区名称不能超过30个字",
-            max: 30,
-            trigger: "change"
-          }
-        ],
-        printHouseId: [
-          {
-            required: true,
-            message: "请选择要关联的印刷室",
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  methods: {
-    initData(val) {
-      if (val.id) {
-        this.modalForm = this.$objAssign(initModalForm, val);
-      } else {
-        this.modalForm = { ...initModalForm };
-        this.createCode();
-      }
-    },
-    async createCode() {
-      this.modalForm.campusCode = await getCode("CAMPUS_CODE");
-    },
-    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 updateCampus(this.modalForm).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 262
src/modules/base/components/ModifyCardInfo.vue

@@ -1,262 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-card-info"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10px"
-    width="600px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      label-position="top"
-      :rules="rules"
-      :model="modalForm"
-    >
-      <el-form-item prop="title" label="题卡名称:">
-        <el-input
-          v-model.trim="modalForm.title"
-          placeholder="建议不超过30个字,题卡名称不允许重复"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="remark" label="备注:">
-        <el-input
-          v-model="modalForm.remark"
-          type="textarea"
-          resize="none"
-          :rows="2"
-          :maxlength="50"
-          clearable
-          show-word-limit
-          placeholder="建议不超过50个字"
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="createMethod" label="题卡创建方式:">
-        <el-radio-group v-model="modalForm.createMethod" :disabled="isEdit">
-          <el-radio-button
-            v-for="(val, key) in CARD_CREATE_METHOD_TYPE"
-            :key="key"
-            :label="key"
-            >{{ val }}</el-radio-button
-          >
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item v-if="IS_UPLOAD" prop="attachmentId" label="上传模板文件:">
-        <upload-file-view
-          :upload-data="uploadData"
-          :upload-url="uploadUrl"
-          :format="format"
-          @valid-error="validError"
-          @upload-success="uploadSuccess"
-          ref="UploadFileView"
-        ></upload-file-view>
-      </el-form-item>
-      <el-form-item v-if="IS_STANDARD" prop="cardRuleId" label="题卡规则:">
-        <card-rule-select
-          ref="CardRuleSelect"
-          v-model.trim="modalForm.cardRuleId"
-          placeholder="请选择题卡规则"
-          clearable
-          class="width-full"
-          :disabled="isEdit"
-          :show-common-card="false"
-        ></card-rule-select>
-      </el-form-item>
-      <el-form-item prop="orgIds" label="适用学院范围:">
-        <select-orgs v-model="modalForm.orgIds" ref="SelectOrgs"></select-orgs>
-      </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 { updateCard } from "../api";
-import { attachmentDetail } from "../../login/api";
-import { CARD_CREATE_METHOD_TYPE } from "../../../constants/enumerate";
-import UploadFileView from "@/components/UploadFileView";
-import SelectOrgs from "./SelectOrgs";
-
-const initModalForm = {
-  id: null,
-  title: "",
-  type: "GENERIC",
-  createMethod: "UPLOAD",
-  remark: "",
-  cardRuleId: "",
-  attachmentId: "",
-  status: "STAGE",
-  orgIds: []
-};
-
-export default {
-  name: "modify-card-info",
-  components: { UploadFileView, SelectOrgs },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.modalForm.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "题卡";
-    },
-    IS_GENGRIC() {
-      return this.modalForm.type === "GENERIC";
-    },
-    IS_UPLOAD() {
-      return this.modalForm.createMethod === "UPLOAD";
-    },
-    IS_STANDARD() {
-      return this.modalForm.createMethod === "STANDARD";
-    },
-    IS_FREE() {
-      return this.modalForm.createMethod === "FREE";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: {},
-      attachment: {},
-      format: ["html"],
-      CARD_CREATE_METHOD_TYPE,
-      rules: {
-        title: [
-          {
-            required: true,
-            message: "题卡名称不能超过30个字",
-            max: 30,
-            trigger: "change"
-          }
-        ],
-        createMethod: [
-          {
-            required: true,
-            message: "请选择题卡创建方式",
-            trigger: "change"
-          }
-        ],
-        attachmentId: [
-          {
-            required: true,
-            message: "请上传模板文件",
-            trigger: "change"
-          }
-        ],
-        cardRuleId: [
-          {
-            required: true,
-            message: "请选择题卡规则",
-            trigger: "change"
-          }
-        ],
-        orgIds: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (value.length) {
-                callback();
-              } else {
-                callback(new Error("请选择适用学院"));
-              }
-            },
-            trigger: "change"
-          }
-        ]
-      },
-      // upload
-      uploadUrl: "/api/admin/common/file/upload",
-      uploadData: {
-        type: "UPLOAD"
-      }
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
-      if (val.id) {
-        this.modalForm.orgIds = val.orgs.map(item => item.id);
-        if (this.modalForm.createMethod !== "UPLOAD") return;
-        this.getAttachment();
-      } else {
-        this.modalForm.orgIds = [];
-        if (this.modalForm.createMethod !== "UPLOAD") return;
-        this.$nextTick(() => {
-          this.$refs.UploadFileView.setAttachmentName("");
-        });
-      }
-    },
-    async getAttachment() {
-      const data = await attachmentDetail(this.instance.attachmentId);
-      this.attachment = data;
-
-      this.$nextTick(() => {
-        this.$refs.UploadFileView.setAttachmentName(`${data.name}${data.type}`);
-      });
-    },
-    visibleChange() {
-      this.initData(this.instance);
-
-      this.$nextTick(() => {
-        this.$refs.modalFormComp.clearValidate();
-      });
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (!this.IS_UPLOAD && !this.isEdit) {
-        this.$emit("new-card", this.modalForm);
-        this.cancel();
-        return;
-      }
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      let datas = {
-        ...this.modalForm
-      };
-      const data = await updateCard(datas).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
-
-      this.$message.success("保存成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-    validError(errorData) {
-      this.$message.error(errorData.message);
-    },
-    uploadSuccess(data) {
-      this.$message.success("上传成功!");
-
-      this.modalForm.attachmentId = data.id;
-      this.$refs.modalFormComp.validateField("attachmentId");
-    }
-  }
-};
-</script>

+ 0 - 384
src/modules/base/components/ModifyCardRule.vue

@@ -1,384 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-card-rule"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10px"
-    width="950px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      label-width="130px"
-      :rules="rules"
-      :model="modalForm"
-    >
-      <el-form-item prop="name" label="题卡规则名称:">
-        <el-input
-          v-model.trim="modalForm.name"
-          placeholder="建议不超过30个字,规则名称不允许重复"
-          style="width: 100%"
-          clearable
-          :disabled="!editable"
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="remark" label="备注:">
-        <el-input
-          v-model="modalForm.remark"
-          type="textarea"
-          resize="none"
-          :rows="2"
-          :maxlength="50"
-          :disabled="!editable"
-          clearable
-          show-word-limit
-          placeholder="建议不超过50个字"
-        ></el-input>
-      </el-form-item>
-      <el-form-item
-        prop="examNumberStyle"
-        label="考号版式:"
-        class="inline-block"
-      >
-        <el-select
-          v-model="modalForm.examNumberStyle"
-          style="width: 142px;"
-          @change="numStyleChange"
-          placeholder="请选择"
-          :disabled="!editable"
-        >
-          <el-option
-            v-for="(val, key) in EXAM_NUMBER_STYLE"
-            :key="key"
-            :value="key"
-            :label="val"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="paperType" label="AB卷版式:" class="inline-block">
-        <el-select
-          v-model="modalForm.paperType"
-          style="width: 142px;"
-          placeholder="请选择"
-          :disabled="!editable"
-        >
-          <el-option
-            v-for="(val, key) in PAPER_TYPE"
-            :key="key"
-            :value="key"
-            :label="val"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-checkbox v-model="modalForm.examAbsent" :disabled="!editable"
-          >启用“缺考填涂”</el-checkbox
-        >
-        <el-checkbox v-model="modalForm.discipline" :disabled="!editable"
-          >启用“违纪填涂”</el-checkbox
-        >
-        <el-checkbox
-          v-model="modalForm.writeSign"
-          :disabled="modalForm.examNumberStyle === 'FILL' || !editable"
-          >启用“手写签名”</el-checkbox
-        >
-      </el-form-item>
-      <div class="part-box part-box-pad part-box-border">
-        <h4 class="part-box-tips">题卡版头变量印刷字段配置:</h4>
-        <el-form-item label="必选字段:" label-width="115px" required>
-          <el-checkbox
-            v-for="column in modalForm.requiredFields"
-            :key="column.code"
-            v-model="column.enable"
-            disabled
-            >{{ column.name }}</el-checkbox
-          >
-        </el-form-item>
-        <el-form-item label="扩展字段:" label-width="115px">
-          <el-checkbox
-            v-for="column in modalForm.extendFields"
-            :key="column.code"
-            v-model="column.enable"
-            :disabled="!editable"
-            >{{ column.name }}</el-checkbox
-          >
-        </el-form-item>
-      </div>
-      <el-form-item prop="titleRule" label="题卡标题规则:">
-        <!-- <el-input
-            v-model="modalForm.titleRule"
-            :disabled="!editable"
-          ></el-input> -->
-        <card-title-rule-edit
-          v-model="modalForm.titleRule"
-          :disabled="!editable"
-          :field-sourses="fieldSourses"
-          v-if="fieldSourses.length"
-          ref="CardTitleRuleEdit"
-        ></card-title-rule-edit>
-      </el-form-item>
-      <el-form-item prop="attention" label="注意事项:">
-        <el-input
-          type="textarea"
-          :rows="4"
-          v-model="modalForm.attention"
-          :disabled="!editable"
-        ></el-input>
-        <p class="tips-info">
-          提示:换行之后,题卡注意事项会展示为多条内容,内容序号会被自动添加。
-        </p>
-      </el-form-item>
-      <el-form-item prop="objectiveAttention" label="客观题注意事项:">
-        <el-input
-          v-model="modalForm.objectiveAttention"
-          :disabled="!editable"
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="subjectiveAttention" label="主观题注意事项:">
-        <el-input
-          v-model="modalForm.subjectiveAttention"
-          :disabled="!editable"
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="orgIds" label="适用学院范围:">
-        <select-orgs
-          v-model="modalForm.orgIds"
-          ref="SelectOrgs"
-          :disabled="!editable"
-        ></select-orgs>
-      </el-form-item>
-    </el-form>
-
-    <div slot="footer">
-      <el-button
-        v-if="editable"
-        type="primary"
-        :disabled="isSubmit"
-        @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { EXAM_NUMBER_STYLE, PAPER_TYPE } from "@/constants/enumerate";
-import { saveCardRule } from "../api";
-import SelectOrgs from "./SelectOrgs";
-import CardTitleRuleEdit from "./CardTitleRuleEdit";
-
-const initModalForm = {
-  id: null,
-  name: "",
-  remark: "",
-  examNumberStyle: "",
-  paperType: "PRINT",
-  examAbsent: true,
-  discipline: true,
-  writeSign: true,
-  requiredFields: [],
-  extendFields: [],
-  titleRule: "",
-  attention: "",
-  objectiveAttention: "",
-  subjectiveAttention: "",
-  orgIds: []
-};
-
-export default {
-  name: "modify-card-rule",
-  components: { SelectOrgs, CardTitleRuleEdit },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    },
-    editType: {
-      type: String,
-      default: "ADD",
-      validator: val => ["ADD", "PREVIEW", "EDIT"].includes(val)
-    }
-  },
-  computed: {
-    title() {
-      const names = {
-        ADD: "新增题卡规则",
-        PREVIEW: "题卡规则详情",
-        EDIT: "编辑题卡规则"
-      };
-      return names[this.editType];
-    },
-    editable() {
-      return this.editType !== "PREVIEW";
-    }
-    // fieldSourses() {
-    //   return [
-    //     ...this.modalForm.requiredFields,
-    //     ...this.modalForm.extendFields
-    //   ].filter(item => item.enable);
-    // }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      EXAM_NUMBER_STYLE,
-      PAPER_TYPE,
-      dataReady: false,
-      rules: {
-        name: [
-          {
-            required: true,
-            message: "题卡规则名称不能超过30个字",
-            max: 30,
-            trigger: "change"
-          }
-        ],
-        examNumberStyle: [
-          {
-            required: true,
-            message: "请选择考号版式",
-            trigger: "change"
-          }
-        ],
-        paperType: [
-          {
-            required: true,
-            message: "请选择AB卷版式",
-            trigger: "change"
-          }
-        ],
-        titleRule: [
-          {
-            required: true,
-            message: "请输入题卡标题规则",
-            trigger: "change"
-          }
-        ],
-        attention: [
-          {
-            required: true,
-            message: "请输入注意事项",
-            trigger: "change"
-          },
-          {
-            validator: (rule, value, callback) => {
-              const val = value.replace(/\n/g, "");
-              if (val.length > 200) {
-                callback(new Error("注意事项最多只能输入200个字符"));
-              } else {
-                callback();
-              }
-            },
-            trigger: "change"
-          }
-        ],
-        objectiveAttention: [
-          {
-            required: true,
-            message: "请输入客观题注意事项",
-            trigger: "change"
-          },
-          {
-            max: 26,
-            message: "客观题注意事项最多只能输入26个汉字",
-            trigger: "change"
-          }
-        ],
-        subjectiveAttention: [
-          {
-            required: true,
-            message: "请输入主观题注意事项",
-            trigger: "change"
-          },
-          {
-            max: 26,
-            message: "主观题注意事项最多只能输入26个汉字",
-            trigger: "change"
-          }
-        ],
-        orgIds: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (value.length) {
-                callback();
-              } else {
-                callback(new Error("请选择适用学院"));
-              }
-            },
-            trigger: "change"
-          }
-        ]
-      },
-      fieldSourses: [
-        {
-          code: "courseName",
-          enable: true,
-          name: "课程名称"
-        },
-        {
-          code: "schoolName",
-          enable: true,
-          name: "学校名称"
-        }
-      ]
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
-
-      if (val.id) {
-        this.modalForm.requiredFields = JSON.parse(val.requiredFields);
-        this.modalForm.extendFields = JSON.parse(val.extendFields);
-        this.modalForm.orgIds = val.orgs.map(item => item.id);
-      } else {
-        this.modalForm.orgIds = [];
-      }
-    },
-    visibleChange() {
-      this.initData(this.instance);
-
-      this.$nextTick(() => {
-        this.$refs.modalFormComp.clearValidate();
-      });
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    numStyleChange() {
-      this.modalForm.writeSign = this.modalForm.examNumberStyle !== "FILL";
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      let modals = {
-        ...this.modalForm
-      };
-      modals.requiredFields = JSON.stringify(modals.requiredFields);
-      modals.extendFields = JSON.stringify(modals.extendFields);
-      const data = await saveCardRule(modals).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
-
-      this.$message.success("保存成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

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

@@ -1,151 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-clazz"
-    :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="clazzName" label="班级名称:">
-        <el-input
-          v-model.trim="modalForm.clazzName"
-          placeholder="请输入班级名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="campusId" label="所属校区:">
-        <campus-select
-          v-model.trim="modalForm.campusId"
-          style="width:100%;"
-          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"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { updateClazz } from "../api";
-
-const initModalForm = {
-  id: null,
-  clazzName: "",
-  campusId: "",
-  majorId: ""
-};
-
-export default {
-  name: "modify-clazz",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "班级";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      rules: {
-        clazzName: [
-          {
-            required: true,
-            message: "请输入班级名称",
-            trigger: "change"
-          },
-          {
-            max: 30,
-            message: "班级名称不能超过30个字",
-            trigger: "change"
-          }
-        ],
-        campusId: [
-          {
-            required: true,
-            message: "请选择所属校区",
-            trigger: "change"
-          }
-        ],
-        majorId: [
-          {
-            required: true,
-            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;
-      let datas = { ...this.modalForm };
-      const data = await updateClazz(datas).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 149
src/modules/base/components/ModifyClazzSimple.vue

@@ -1,149 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-clazz"
-    :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="teachClazzName" label="班级名称:">
-        <el-input
-          v-model.trim="modalForm.teachClazzName"
-          placeholder="请输入班级名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="teachCourseId" label="课程:">
-        <el-select
-          v-model="modalForm.teachCourseId"
-          placeholder="课程"
-          clearable
-          :disabled="isEdit"
-          class="width-full"
-        >
-          <el-option
-            v-for="item in courses"
-            :key="item.id"
-            :value="item.id"
-            :label="item.name"
-          >
-            <span>{{ `${item.name}(${item.code})` }}</span>
-          </el-option>
-        </el-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 { updateClazzSimple } from "../api";
-
-const initModalForm = {
-  id: null,
-  teachClazzName: "",
-  teachCourseId: ""
-};
-
-export default {
-  name: "modify-clazz-simple",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    },
-    courses: {
-      type: Array,
-      default() {
-        return [];
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "班级";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      rules: {
-        teachClazzName: [
-          {
-            required: true,
-            message: "请输入班级名称",
-            trigger: "change"
-          },
-          {
-            max: 30,
-            message: "班级名称不能超过30个字",
-            trigger: "change"
-          }
-        ],
-        teachCourseId: [
-          {
-            required: true,
-            message: "请选择课程",
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
-    },
-    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;
-      let datas = { ...this.modalForm };
-      const data = await updateClazzSimple(datas).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 207
src/modules/base/components/ModifyClazzSimpleStudent.vue

@@ -1,207 +0,0 @@
-<template>
-  <div>
-    <el-dialog
-      class="modify-clazz-simple-student page-dialog"
-      :visible.sync="modalIsShow"
-      :title="title"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-      fullscreen
-      destroy-on-close
-      @open="visibleChange"
-      @close="closed"
-    >
-      <div class="part-box part-box-filter part-box-flex">
-        <el-form
-          ref="FilterForm"
-          label-position="left"
-          label-width="85px"
-          inline
-        >
-          <el-form-item label="学生:">
-            <el-input
-              v-model="filter.studentInfo"
-              placeholder="请输入姓名或者学号"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="toPage(1)">查询</el-button>
-          </el-form-item>
-        </el-form>
-        <div class="part-box-action">
-          <el-button
-            type="danger"
-            icon="el-icon-circle-plus-outline"
-            @click="toBatchDelete"
-            >批量删除</el-button
-          >
-          <el-button
-            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="studentList"
-          @selection-change="handleSelectionChange"
-        >
-          <el-table-column
-            type="selection"
-            width="55"
-            align="center"
-          ></el-table-column>
-          <el-table-column
-            type="index"
-            label="序号"
-            width="70"
-            :index="indexMethod"
-          ></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="belongOrgName" label="院系"> </el-table-column>
-          <el-table-column prop="majorName" label="专业"> </el-table-column>
-          <el-table-column prop="clazzName" label="班级"> </el-table-column>
-          <el-table-column class-name="action-column" label="操作" width="80">
-            <template slot-scope="scope">
-              <el-button
-                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>
-    </el-dialog>
-
-    <!-- ModifyStudentSimple -->
-    <modify-student-simple
-      ref="ModifyStudentSimple"
-      :instance="curStudent"
-      @modified="getList"
-    ></modify-student-simple>
-  </div>
-</template>
-
-<script>
-import { studentSimpleListQuery, deleteStudentSimple } from "../api";
-import ModifyStudentSimple from "./ModifyStudentSimple";
-
-export default {
-  name: "modify-clazz-simple-student",
-  components: { ModifyStudentSimple },
-  props: {
-    clazz: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      filter: {
-        teachClazzId: "",
-        studentInfo: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      multipleSelection: [],
-      studentList: [],
-      curStudent: {}
-    };
-  },
-  computed: {
-    title() {
-      return `学生管理-${this.clazz.teachClazzName}`;
-    }
-  },
-  methods: {
-    visibleChange() {
-      this.filter.teachClazzId = this.clazz.id;
-
-      this.toPage(1);
-    },
-    closed() {
-      this.$emit("modified");
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async getList() {
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      const data = await studentSimpleListQuery(datas);
-      this.studentList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.multipleSelection = [];
-      this.current = page;
-      this.getList();
-    },
-    handleSelectionChange(val) {
-      this.multipleSelection = val.map(item => item.id);
-    },
-    toAdd() {
-      this.curStudent = { teachClazzId: this.clazz.id };
-      this.$refs.ModifyStudentSimple.open();
-    },
-    toDelete(row) {
-      this.$confirm(`确定要移除学生【${row.studentName}】吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          await deleteStudentSimple([row.id]);
-          this.$message.success("操作成功!");
-          this.deletePageLastItem();
-        })
-        .catch(() => {});
-    },
-    toBatchDelete() {
-      if (!this.multipleSelection.length) {
-        this.$message.error("请选择要删除的学生");
-        return;
-      }
-
-      this.$confirm(`确定要删除选中的这些学生吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          await deleteStudentSimple(this.multipleSelection);
-          this.$message.success("操作成功!");
-          this.deletePageLastItem(this.multipleSelection.length);
-          this.multipleSelection = [];
-        })
-        .catch(() => {});
-    }
-  }
-};
-</script>

+ 0 - 178
src/modules/base/components/ModifyCourse.vue

@@ -1,178 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-course"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="550px"
-    :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="courseName" label="课程名称:">
-        <el-input
-          v-model.trim="modalForm.courseName"
-          placeholder="请输入课程名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="courseCode" label="课程编码:">
-        <el-input
-          v-model.trim="modalForm.courseCode"
-          placeholder="请输入课程编码"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="teachingRoomId" label="所属教研室:">
-        <teaching-room-select
-          v-model.trim="modalForm.teachingRoomId"
-          style="width:100%;"
-          clearable
-        ></teaching-room-select>
-      </el-form-item>
-      <el-form-item label="授课班级:">
-        <clazz-select
-          v-model="modalForm.clazzIdSet"
-          placeholder="请选择授课班级"
-          multiple
-          clearable
-          style="width:100%;"
-        ></clazz-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 { updateCourse, getCode } from "../api";
-
-const initModalForm = {
-  id: null,
-  courseName: "",
-  courseCode: "",
-  teachingRoomId: "",
-  clazzIdSet: ""
-};
-
-export default {
-  name: "modify-course",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "课程";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      rules: {
-        courseName: [
-          {
-            required: true,
-            // pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,20}$/,
-            // message: "课程名称只能输入汉字、数字和字母,长度不能超过20",
-            message: "课程名称不能超过30个字",
-            max: 30,
-            trigger: "change"
-          }
-        ],
-        courseCode: [
-          {
-            required: true,
-            pattern: /^[0-9a-zA-Z_-]{3,30}$/,
-            message: "课程编码只能由数字字母短横线组成,长度在3-30之间",
-            trigger: "change"
-          }
-        ],
-        teachingRoomId: [
-          {
-            required: true,
-            message: "请选择所属教研室",
-            trigger: "change"
-          }
-        ],
-        clazzIdSet: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (!value || !value.length) {
-                return callback(new Error("请选择授课班级"));
-              }
-
-              callback();
-            },
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  methods: {
-    initData(val) {
-      if (val.id) {
-        this.modalForm = this.$objAssign(initModalForm, val);
-        this.modalForm.clazzIdSet = val.clazzList.map(item => item.id);
-      } else {
-        this.modalForm = { ...initModalForm };
-        this.createCode();
-      }
-    },
-    async createCode() {
-      this.modalForm.courseCode = await getCode("COURSE_CODE");
-    },
-    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;
-      let datas = { ...this.modalForm };
-      const data = await updateCourse(datas).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 155
src/modules/base/components/ModifyCourseSimple.vue

@@ -1,155 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-course"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="550px"
-    :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="basicCourseId" label="课程名称:">
-        <el-select
-          class="width-full"
-          v-model="modalForm.basicCourseId"
-          placeholder="课程"
-          clearable
-          filterable
-          @change="courseChange"
-        >
-          <el-option
-            v-for="item in courses"
-            :key="item.id"
-            :value="item.id"
-            :label="item.name"
-          >
-            <span>{{ `${item.name}(${item.code})` }}</span>
-          </el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="basicCourseCode" label="课程编码:">
-        <el-input
-          v-model.trim="modalForm.basicCourseCode"
-          placeholder="课程编码"
-          readonly
-        ></el-input>
-      </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 { updateCourseSimple, courseSimpleQuery } from "../api";
-
-const initModalForm = {
-  id: null,
-  basicCourseId: "",
-  basicCourseCode: ""
-};
-
-export default {
-  name: "modify-course-simple",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "课程";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      courses: [],
-      rules: {
-        basicCourseId: [
-          {
-            required: true,
-            message: "请选择课程",
-            trigger: "change"
-          }
-        ],
-        basicCourseCode: [
-          {
-            required: true,
-            message: "需要课程编码",
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  mounted() {
-    this.getCourseSimple();
-  },
-  methods: {
-    async getCourseSimple() {
-      const data = await courseSimpleQuery();
-      this.courses = data || [];
-    },
-    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;
-    },
-    courseChange(val) {
-      const course = this.courses.find(item => item.id === val);
-      this.modalForm.basicCourseCode = course.code;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      let datas = { basicCourseId: this.modalForm.basicCourseId };
-      const data = await updateCourseSimple(datas).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 185
src/modules/base/components/ModifyExam.vue

@@ -1,185 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-exam"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="650px"
-    :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-width="100px"
-    >
-      <el-form-item prop="name" label="考试名称:">
-        <el-input
-          v-model.trim="modalForm.name"
-          placeholder="请输入考试名称"
-          clearable
-        ></el-input>
-        <p class="tips-info">示例:期末考试/期中考试/模拟考试</p>
-      </el-form-item>
-      <el-form-item prop="semesterId" label="学年学期:">
-        <semester-select
-          v-model="modalForm.semesterId"
-          placeholder="学年学期"
-          clearable
-          style="width:100%"
-        ></semester-select>
-      </el-form-item>
-      <el-form-item prop="category" label="考试类型:">
-        <el-radio-group v-model="modalForm.category">
-          <el-radio v-for="(val, key) in EXAM_TYPE" :key="key" :label="key">{{
-            val
-          }}</el-radio>
-        </el-radio-group>
-        <div class="tips-info">
-          <p>说明:</p>
-          <p>线下考试指纸笔传统考试,需要印刷试卷/题卡</p>
-          <p>线上考试指无纸化考试,如网考/机考</p>
-        </div>
-      </el-form-item>
-      <el-form-item
-        v-if="modalForm.category === 'OFFLINE'"
-        prop="examModel"
-        label=""
-      >
-        <p class="tips-info mb-2">请选择符合此考试的业务模式</p>
-        <el-radio-group v-model="modalForm.examModel">
-          <el-radio
-            v-for="(val, key) in EXAM_MODE_TYPE"
-            :key="key"
-            :label="key"
-            class="el-radio-v"
-            >{{ val }}</el-radio
-          >
-        </el-radio-group>
-      </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 { updateExam } from "../api";
-import { EXAM_TYPE, EXAM_MODE_TYPE } from "@/constants/enumerate";
-
-const initModalForm = {
-  id: null,
-  name: "",
-  semesterId: "",
-  category: "OFFLINE",
-  examModel: "MODEL1"
-};
-
-export default {
-  name: "modify-exam",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "考试";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      EXAM_TYPE,
-      EXAM_MODE_TYPE,
-      rules: {
-        name: [
-          {
-            required: true,
-            message: "请输入考试名称",
-            trigger: "change"
-          },
-          {
-            message: "考试名称不能超过100个字符",
-            max: 100,
-            trigger: "change"
-          }
-        ],
-        semesterId: [
-          {
-            required: true,
-            message: "请选择学年学期",
-            trigger: "change"
-          }
-        ],
-        category: [
-          {
-            required: true,
-            message: "请选择考试类型",
-            trigger: "change"
-          }
-        ],
-        examModel: [
-          {
-            required: true,
-            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;
-      let datas = { ...this.modalForm };
-      const data = await updateExam(datas).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified", { isEdit: this.isEdit, exam: data });
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 253
src/modules/base/components/ModifyExamConfig.vue

@@ -1,253 +0,0 @@
-<template>
-  <div>
-    <el-dialog
-      class="modify-exam-config page-dialog"
-      :visible.sync="modalIsShow"
-      :title="title"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-      fullscreen
-      destroy-on-close
-      @open="visibleChange"
-    >
-      <div class="part-box part-box-filter part-box-flex">
-        <el-form
-          ref="FilterForm"
-          label-position="left"
-          label-width="85px"
-          inline
-        >
-          <el-form-item label="创建时间:">
-            <el-date-picker
-              v-model="createTime"
-              type="datetimerange"
-              :picker-options="pickerOptions"
-              range-separator="至"
-              start-placeholder="创建开始时间"
-              end-placeholder="创建结束时间"
-              value-format="timestamp"
-              align="right"
-              unlink-panels
-            >
-            </el-date-picker>
-          </el-form-item>
-          <el-form-item label="启用/禁用:" label-width="90px">
-            <el-select
-              v-model="filter.enable"
-              style="width: 120px;"
-              placeholder="启用/禁用"
-              clearable
-            >
-              <el-option
-                v-for="(val, key) in ABLE_TYPE"
-                :key="key"
-                :value="key * 1"
-                :label="val"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="toPage(1)">查询</el-button>
-          </el-form-item>
-        </el-form>
-        <div class="part-box-action">
-          <el-button
-            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="examConfigList">
-          <el-table-column
-            type="index"
-            label="序号"
-            width="70"
-            :index="indexMethod"
-          ></el-table-column>
-          <el-table-column prop="orgs" label="适用学院">
-            <template slot-scope="scope">
-              <more-text :data="scope.row.orgNames" :show-count="3"></more-text>
-            </template>
-          </el-table-column>
-          <el-table-column prop="createTime" label="创建时间">
-            <span slot-scope="scope">{{
-              scope.row.createTime | timestampFilter
-            }}</span>
-          </el-table-column>
-          <el-table-column prop="enable" label="启用/禁用">
-            <template slot-scope="scope">
-              {{ scope.row.enable | enableFilter }}
-            </template>
-          </el-table-column>
-          <el-table-column class-name="action-column" label="操作" width="160">
-            <template slot-scope="scope">
-              <el-button
-                class="btn-primary"
-                type="text"
-                @click="toEdit(scope.row)"
-                >编辑</el-button
-              >
-              <el-button
-                :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
-                type="text"
-                @click="toEnable(scope.row)"
-                >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
-              >
-              <el-button
-                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>
-    </el-dialog>
-
-    <!-- ModifyExamConfigDetail -->
-    <modify-exam-config-detail
-      ref="ModifyExamConfigDetail"
-      :instance="curExamConfig"
-      @modified="examConfigDetailModified"
-    ></modify-exam-config-detail>
-  </div>
-</template>
-
-<script>
-import { ABLE_TYPE } from "@/constants/enumerate";
-import pickerOptions from "@/constants/datePickerOptions";
-import { examConfigQuery, deleteExamConfig, ableExamConfig } from "../api";
-import ModifyExamConfigDetail from "./ModifyExamConfigDetail";
-
-export default {
-  name: "modify-exam-config",
-  components: { ModifyExamConfigDetail },
-  props: {
-    exam: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      filter: {
-        examId: "",
-        createStartTime: "",
-        createEndTime: "",
-        enable: ""
-      },
-      ABLE_TYPE,
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      examConfigList: [],
-      curExamConfig: {},
-      usedOrgIds: [],
-      // date-picker
-      createTime: [],
-      pickerOptions
-    };
-  },
-  computed: {
-    title() {
-      return "配置管理-" + this.exam.name;
-    }
-  },
-  methods: {
-    visibleChange() {
-      this.filter.examId = this.exam.id;
-      this.toPage(1);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    examConfigDetailModified() {
-      this.getList();
-    },
-    async getList() {
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (this.createTime) {
-        datas.createStartTime = this.createTime[0];
-        datas.createEndTime = this.createTime[1];
-      }
-      if (datas.enable !== null && datas.enable !== "")
-        datas.enable = !!datas.enable;
-
-      const data = await examConfigQuery(datas);
-      this.examConfigList = data.records.map(item => {
-        item.orgNames = item.orgs.map(org => org.name);
-        return item;
-      });
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toAdd() {
-      this.curExamConfig = {
-        examId: this.filter.examId
-      };
-      this.$refs.ModifyExamConfigDetail.open();
-    },
-    toEdit(row) {
-      this.curExamConfig = { ...row, examId: this.filter.examId };
-      this.$refs.ModifyExamConfigDetail.open();
-    },
-    toDelete(row) {
-      this.$confirm(`确定要删除该配置吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          await deleteExamConfig(row.id);
-          this.$message.success("删除成功!");
-          this.deletePageLastItem();
-        })
-        .catch(() => {});
-    },
-    toEnable(row) {
-      const action = row.enable ? "禁用" : "启用";
-      this.$confirm(`确定要${action}该配置吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          const enable = !row.enable;
-          await ableExamConfig({
-            id: row.id,
-            enable
-          });
-          row.enable = enable;
-          this.$message.success("操作成功!");
-        })
-        .catch(() => {});
-    }
-  }
-};
-</script>

+ 0 - 694
src/modules/base/components/ModifyExamConfigDetail.vue

@@ -1,694 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-exam-config-detail"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="0"
-    width="800px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @opened="dialogOpened"
-    @close="dialogClose"
-  >
-    <el-form
-      ref="modalFormComp"
-      label-width="130px"
-      :rules="rules"
-      :model="modalForm"
-    >
-      <el-form-item prop="cardRuleId" label="题卡规则:">
-        <card-rule-select
-          ref="CardRuleSelect"
-          v-model.trim="modalForm.cardRuleId"
-          placeholder="请选择"
-          clearable
-        ></card-rule-select>
-        <div class="tips-info">
-          <p>说明:</p>
-          <p>
-            1、若选择全部通卡,则命题老师只能选择通卡,若选择题卡规则,则专卡和通卡均可选择
-          </p>
-          <p>
-            2、若选择题卡规则,命题老师在该考试下自主创建题卡时,版头样式及版头内容为该规则对应样式及版头。
-          </p>
-        </div>
-      </el-form-item>
-
-      <div class="part-box">
-        <h4 class="part-box-tips">
-          试卷&题卡印品:
-          <el-checkbox
-            v-show="infoShow"
-            v-model="allSelected"
-            label="全选"
-            @change="selectAll"
-          ></el-checkbox>
-        </h4>
-        <el-form-item prop="printContent" label="试卷、题卡:">
-          <el-checkbox-group
-            v-model="modalForm.printContent"
-            @change="() => checkSelectAll()"
-          >
-            <el-checkbox
-              v-for="(val, key) in PRINT_CONTENT_TYPE"
-              :key="key"
-              :label="key"
-              >{{ val }}</el-checkbox
-            >
-          </el-checkbox-group>
-        </el-form-item>
-        <el-form-item
-          v-if="modalForm.printContent.length"
-          prop="backupMethod"
-          label="备用数量:"
-        >
-          <el-select
-            v-model="modalForm.backupMethod"
-            class="mr-2"
-            size="small"
-            placeholder="请选择"
-          >
-            <el-option
-              v-for="(val, key) in PAPER_BACKUP_TYPE"
-              :key="key"
-              :value="key"
-              :label="val"
-            ></el-option>
-          </el-select>
-          <el-input-number
-            class="mr-1"
-            v-model="modalForm.backupCount"
-            size="small"
-            :min="0"
-            :max="200"
-            :step="1"
-            step-strictly
-            :controls="false"
-            style="width: 60px"
-          ></el-input-number>
-          <span>份</span>
-        </el-form-item>
-        <el-form-item
-          v-show="infoShow"
-          v-if="contentIncludesPaper"
-          prop="drawRule"
-          label="抽卷规则:"
-        >
-          <el-radio-group v-model="modalForm.drawRule">
-            <el-radio
-              v-for="(val, key) in DRAW_RULE_TYPE"
-              :label="key"
-              :key="key"
-              >{{ val }}</el-radio
-            >
-          </el-radio-group>
-          <div class="tips-info">
-            <p>说明:</p>
-            <p>
-              1.只抽取一次:不同印刷计划下,同一试卷编号下的卷型只能被抽取一次;
-            </p>
-            <p>
-              2.可反复抽取:不同印刷计划下,同一试卷编号下的卷型可重复抽取,系统默认优先抽取未曝光卷型。
-            </p>
-          </div>
-        </el-form-item>
-      </div>
-
-      <div class="part-box" v-show="infoShow">
-        <h4 class="part-box-tips">变量印品:</h4>
-        <el-form-item
-          v-for="(item, index) in modalForm.variableContent"
-          :key="item.type"
-          :label="`${TEMPLATE_CLASSIFY[item.type]}:`"
-          :prop="`variableContent.${index}.templateId`"
-          :rules="{
-            required: false,
-            validator: templateValidator,
-            trigger: 'change'
-          }"
-          :required="!!item.templateId.length"
-        >
-          <el-checkbox-group
-            v-model="item.templateId"
-            @change="vals => tempChange(vals, `variableContent.${index}`)"
-          >
-            <el-checkbox
-              v-for="temp in templateSources[item.type]"
-              :label="temp.id"
-              :key="temp.id"
-              >{{ temp.name }}</el-checkbox
-            >
-          </el-checkbox-group>
-          <div v-if="item.templateId.length">
-            <el-select
-              v-model="item.backupMethod"
-              class="mr-2"
-              size="small"
-              placeholder="请选择"
-            >
-              <el-option
-                v-for="(val, key) in PRINT_BACKUP_TYPE"
-                :key="key"
-                :value="key"
-                :label="val"
-              ></el-option>
-            </el-select>
-            <el-input-number
-              v-model="item.backupCount"
-              class="mr-1"
-              size="small"
-              :min="1"
-              :max="200"
-              :step="1"
-              step-strictly
-              :controls="false"
-              style="width: 60px"
-            ></el-input-number>
-            <span>份</span>
-          </div>
-        </el-form-item>
-      </div>
-
-      <div class="part-box" v-show="infoShow">
-        <h4 class="part-box-tips">普通印品:</h4>
-        <el-form-item
-          v-for="(item, index) in modalForm.ordinaryContent"
-          :key="item.type"
-          :label="`${TEMPLATE_CLASSIFY[item.type]}:`"
-          :prop="`ordinaryContent.${index}.templateId`"
-          :rules="{
-            required: false,
-            validator: templateValidator,
-            trigger: 'change'
-          }"
-          :required="!!item.templateId.length"
-        >
-          <el-checkbox-group
-            v-model="item.templateId"
-            @change="vals => tempChange(vals, `ordinaryContent.${index}`)"
-          >
-            <el-checkbox
-              v-for="temp in templateSources[item.type]"
-              :label="temp.id"
-              :key="temp.id"
-              >{{ temp.name }}</el-checkbox
-            >
-          </el-checkbox-group>
-          <div v-if="item.templateId.length">
-            <el-select
-              v-model="item.backupMethod"
-              class="mr-2"
-              size="small"
-              placeholder="请选择"
-            >
-              <el-option
-                v-for="(val, key) in PRINT_BACKUP_TYPE"
-                :key="key"
-                :value="key"
-                :label="val"
-              ></el-option>
-            </el-select>
-            <el-input-number
-              v-model="item.backupCount"
-              class="mr-1"
-              size="small"
-              :min="1"
-              :max="200"
-              :step="1"
-              step-strictly
-              :controls="false"
-              style="width: 60px"
-            ></el-input-number>
-            <span>份</span>
-          </div>
-        </el-form-item>
-      </div>
-
-      <el-form-item prop="selectedPrint"></el-form-item>
-
-      <el-form-item prop="orgIds" label="适用范围:">
-        <!-- <select-orgs v-model="modalForm.orgIds" ref="SelectOrgs"></select-orgs> -->
-        <div
-          v-if="orgDataReady"
-          class="select-orgs part-box part-box-pad part-box-border"
-        >
-          <el-tree
-            :data="orgs"
-            show-checkbox
-            default-expand-all
-            node-key="id"
-            ref="MenuTree"
-            :props="defaultProps"
-            check-on-click-node
-            :expand-on-click-node="false"
-            @check-change="checkChange"
-          >
-          </el-tree>
-        </div>
-      </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 {
-  PRINT_CONTENT_TYPE,
-  DRAW_RULE_TYPE,
-  PRINT_BACKUP_TYPE,
-  PAPER_BACKUP_TYPE,
-  TEMPLATE_CLASSIFY
-} from "@/constants/enumerate";
-import { deepCopy } from "@/plugins/utils";
-import { updateExamConfig, listOrgsByExamId, organizationList } from "../api";
-import { printPlanTemplateList } from "../../print/api";
-
-const initModalForm = {
-  id: null,
-  examId: null,
-  cardRuleId: "",
-  orgIds: [],
-  printContent: [],
-  backupMethod: "ROOM",
-  backupCount: 1,
-  drawRule: "ONE",
-  variableContent: [
-    {
-      type: "SIGN",
-      templateId: [],
-      oldTemplateId: [],
-      backupMethod: "ROOM",
-      backupCount: 1
-    },
-    {
-      type: "PACKAGE",
-      templateId: [],
-      oldTemplateId: [],
-      backupMethod: "ROOM",
-      backupCount: 1
-    }
-  ],
-  ordinaryContent: [
-    {
-      type: "CHECK_IN",
-      templateId: [],
-      oldTemplateId: [],
-      backupMethod: "ROOM",
-      backupCount: 1
-    }
-  ]
-};
-
-export default {
-  name: "modify-exam-config-detail",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "考试配置";
-    },
-    contentIncludesPaper() {
-      return this.modalForm.printContent.includes("PAPER");
-    }
-  },
-  data() {
-    const printContentValidator = (rule, value, callback) => {
-      if (!this.modalForm.printContent.length) {
-        return callback(new Error("请选择试卷"));
-      }
-
-      callback();
-    };
-    const backupMethodValidator = (rule, value, callback) => {
-      if (!this.modalForm.printContent.length) {
-        return callback();
-      }
-      if (!value) {
-        return callback(new Error("请选择备份方式"));
-      }
-      if (!this.modalForm.backupCount && this.modalForm.backupCount !== 0) {
-        return callback(new Error("请输入备份数量"));
-      }
-
-      callback();
-    };
-    const selectedPrintValidator = (rule, value, callback) => {
-      const printInfo = [
-        ...this.modalForm.variableContent,
-        ...this.modalForm.ordinaryContent
-      ];
-      const hasPrintInfo = printInfo.some(item => item.templateId.length);
-
-      if (hasPrintInfo || this.modalForm.printContent.length) {
-        callback();
-      } else {
-        callback(new Error("必须选择一项印品"));
-      }
-    };
-
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: deepCopy(initModalForm),
-      PRINT_CONTENT_TYPE,
-      DRAW_RULE_TYPE,
-      PRINT_BACKUP_TYPE,
-      PAPER_BACKUP_TYPE,
-      TEMPLATE_CLASSIFY,
-      variableContent: [],
-      ordinaryContent: [],
-      templateSources: {},
-      oldPrintContent: [],
-      usedOrgIds: [],
-      allSelected: false,
-      infoShow: true,
-      rules: {
-        cardRuleId: [
-          {
-            required: true,
-            message: "请选择题卡规则",
-            trigger: "change"
-          }
-        ],
-        printContent: [
-          {
-            required: true,
-            validator: printContentValidator,
-            trigger: "change"
-          }
-        ],
-        backupMethod: [
-          {
-            required: true,
-            validator: backupMethodValidator,
-            trigger: "change"
-          }
-        ],
-        drawRule: [
-          {
-            required: true,
-            message: "请选择抽卷规则",
-            trigger: "change"
-          }
-        ],
-        selectedPrint: [
-          {
-            required: false,
-            validator: selectedPrintValidator,
-            trigger: "change"
-          }
-        ],
-        orgIds: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (value.length) {
-                callback();
-              } else {
-                callback(new Error("请选择适用范围"));
-              }
-            },
-            trigger: "change"
-          }
-        ]
-      },
-      // org select
-      orgDataReady: false,
-      orgs: [],
-      leafOrgIds: [],
-      defaultProps: {
-        label: "name"
-      }
-    };
-  },
-  mounted() {
-    this.getTemplates();
-    this.getOrgs();
-  },
-  methods: {
-    async dialogOpened() {
-      const data = await listOrgsByExamId({
-        examId: this.instance.examId,
-        id: this.instance.id
-      });
-      this.usedOrgIds = data || [];
-      this.setDisabledOrgs(this.usedOrgIds);
-      this.orgDataReady = true;
-
-      this.$nextTick(() => {
-        this.initData(this.instance);
-      });
-    },
-    dialogClose() {
-      this.orgDataReady = false;
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async getTemplates() {
-      const data = await printPlanTemplateList();
-      const templateSources = {};
-      const templates = [...data.variable, ...data.ordinary];
-      templates.forEach(item => {
-        templateSources[item.type] = item.template;
-      });
-      this.templateSources = templateSources;
-    },
-    initData(val) {
-      if (val.id) {
-        this.modalForm = this.$objAssign(deepCopy(initModalForm), val);
-        const transformInfo = item => {
-          const templateIds = item.templateId ? [item.templateId] : [];
-          return {
-            type: item.type,
-            templateId: templateIds,
-            oldTemplateId: templateIds,
-            backupMethod: item.backupMethod,
-            backupCount: item.backupCount
-          };
-        };
-        this.modalForm.variableContent = JSON.parse(val.variableContent).map(
-          transformInfo
-        );
-        this.modalForm.ordinaryContent = JSON.parse(val.ordinaryContent).map(
-          transformInfo
-        );
-        this.modalForm.printContent = JSON.parse(val.printContent);
-        this.modalForm.orgIds = val.orgs.map(item => item.id);
-      } else {
-        let modalForm = this.$objAssign(deepCopy(initModalForm), val);
-        modalForm.variableContent = modalForm.variableContent.filter(
-          item => this.templateSources[item.type]
-        );
-        modalForm.ordinaryContent = modalForm.ordinaryContent.filter(
-          item => this.templateSources[item.type]
-        );
-        this.modalForm = modalForm;
-      }
-
-      this.setCheckedNode(this.modalForm.orgIds);
-
-      if (!this.checkHasSelect()) {
-        this.allSelected = true;
-        this.selectAll(this.allSelected);
-      } else {
-        this.checkSelectAll();
-      }
-    },
-    getData() {
-      let data = deepCopy(this.modalForm);
-      const transformInfo = item => {
-        const templateId = item.templateId.join();
-        const template = this.templateSources[item.type].find(
-          temp => temp.id === templateId
-        );
-        return {
-          type: item.type,
-          templateId,
-          attachmentId: template && template.attachmentId,
-          backupMethod: item.backupMethod,
-          backupCount: item.backupCount
-        };
-      };
-      data.printContent = JSON.stringify(this.modalForm.printContent);
-      data.variableContent = JSON.stringify(
-        this.modalForm.variableContent.map(transformInfo)
-      );
-      data.ordinaryContent = JSON.stringify(
-        this.modalForm.ordinaryContent.map(transformInfo)
-      );
-
-      return data;
-    },
-    selectAll(selected) {
-      if (selected) {
-        this.modalForm.printContent = Object.keys(this.PRINT_CONTENT_TYPE);
-        this.modalForm.variableContent.forEach(item => {
-          if (item.templateId && item.templateId.length) return;
-
-          const source = this.templateSources[item.type][0];
-          item.templateId = source && [source.id];
-          item.oldTemplateId = source && [source.id];
-        });
-        this.modalForm.ordinaryContent.forEach(item => {
-          if (item.templateId && item.templateId.length) return;
-
-          const source = this.templateSources[item.type][0];
-          item.templateId = source && [source.id];
-          item.oldTemplateId = source && [source.id];
-        });
-      } else {
-        this.modalForm.printContent = [];
-        this.modalForm.variableContent.forEach(item => {
-          item.templateId = [];
-          item.oldTemplateId = [];
-        });
-        this.modalForm.ordinaryContent.forEach(item => {
-          item.templateId = [];
-          item.oldTemplateId = [];
-        });
-      }
-    },
-    checkSelectAll() {
-      const vNotSelected = this.modalForm.variableContent.some(
-        item => !item.templateId.length
-      );
-      const oNotSelected = this.modalForm.ordinaryContent.some(
-        item => !item.templateId.length
-      );
-      const pNotSelected =
-        this.modalForm.printContent.length <
-        Object.keys(this.PRINT_CONTENT_TYPE).length;
-
-      const selecteds = [vNotSelected, oNotSelected, pNotSelected];
-
-      this.allSelected = !selecteds.some(item => item);
-    },
-    checkHasSelect() {
-      const vSelected = this.modalForm.variableContent.some(
-        item => item.templateId.length
-      );
-      const oSelected = this.modalForm.ordinaryContent.some(
-        item => item.templateId.length
-      );
-      const pSelected = !!this.modalForm.printContent.length;
-
-      const selecteds = [vSelected, oSelected, pSelected];
-
-      return selecteds.some(item => item);
-    },
-    templateValidator(rule, value, callback) {
-      const [field, index] = rule.field.split(".");
-      const val = this.modalForm[field][index];
-      if (val.templateId.length) {
-        if (!val.backupMethod) {
-          return callback(new Error("请选择备份方式"));
-        }
-        if (!val.backupCount) {
-          return callback(new Error("请输入备份数量"));
-        }
-        callback();
-      } else {
-        callback();
-      }
-    },
-    tempChange(vals, name) {
-      const [field, index] = name.split(".");
-      const info = this.modalForm[field][index];
-      const newVals = vals.filter(item => !info.oldTemplateId.includes(item));
-      info.templateId = newVals;
-      info.oldTemplateId = newVals;
-
-      this.checkSelectAll();
-      this.$refs.modalFormComp.validateField("selectedPrint");
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-      console.log(valid);
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      let datas = this.getData();
-      const data = await updateExamConfig(datas).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-    // org select
-    async getOrgs() {
-      const orgs = await organizationList();
-      this.orgs = orgs || [];
-
-      if (this.orgs.length) {
-        this.orgs[0].children.sort((a, b) => {
-          if (a.type === "PRINTING_HOUSE") return 1;
-          if (b.type === "PRINTING_HOUSE") return -1;
-
-          return 0;
-        });
-      }
-
-      let leafOrgIds = [];
-      const getLeafOrg = orgs => {
-        orgs.forEach(org => {
-          org.disabled = false;
-          if (org["children"] && org["children"].length) {
-            getLeafOrg(org.children);
-          } else {
-            leafOrgIds.push(org.id);
-          }
-        });
-      };
-      getLeafOrg(this.orgs);
-      this.leafOrgIds = leafOrgIds;
-    },
-    setDisabledOrgs(disabledOrgIds) {
-      const updateInfo = orgs => {
-        orgs.forEach(org => {
-          org.disabled = disabledOrgIds.includes(org.id);
-          if (org["children"] && org["children"].length) {
-            updateInfo(org.children);
-          }
-        });
-      };
-      updateInfo(this.orgs);
-    },
-    setCheckedNode(selectedIds) {
-      const leafSelectedIds = selectedIds.filter(id =>
-        this.leafOrgIds.includes(id)
-      );
-      this.$refs.MenuTree.setCheckedKeys(leafSelectedIds);
-    },
-    checkChange() {
-      this.modalForm.orgIds = this.$refs.MenuTree.getCheckedKeys();
-      this.$refs.modalFormComp.validateField("orgIds");
-    }
-  }
-};
-</script>

+ 0 - 100
src/modules/base/components/ModifyField.vue

@@ -1,100 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-field"
-    :visible.sync="modalIsShow"
-    title="新增扩展字段"
-    top="10vh"
-    width="448px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @opened="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>
-      </el-form-item>
-      <el-form-item prop="code" label="字段变量名:">
-        <el-input
-          v-model.trim="modalForm.code"
-          placeholder="请输入字段变量名"
-          clearable
-        ></el-input>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" @click="submit">确认</el-button>
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-const initModalForm = {
-  name: "",
-  code: "",
-  enable: false
-};
-
-export default {
-  name: "modify-field",
-  data() {
-    return {
-      modalIsShow: false,
-      modalForm: {},
-      rules: {
-        name: [
-          {
-            required: true,
-            message: "请输入字段名称",
-            trigger: "change"
-          },
-          {
-            max: 20,
-            message: "字段名称不能超过20",
-            trigger: "change"
-          }
-        ],
-        code: [
-          {
-            required: true,
-            pattern: /^[a-zA-Z]{3,30}$/,
-            message: "字段变量名只能由字母组成,长度在3-30之间",
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  methods: {
-    visibleChange() {
-      this.modalForm = { ...initModalForm };
-      this.$nextTick(() => {
-        this.$refs.modalFormComp.clearValidate();
-      });
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      this.$emit("confirm", this.modalForm);
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 152
src/modules/base/components/ModifyFlow.vue

@@ -1,152 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-flow"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="500px"
-    :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
-          style="width:100%"
-          v-model.trim="modalForm.name"
-          placeholder="请输入名称"
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="type" label="流程类型:">
-        <el-select
-          v-model="modalForm.type"
-          style="width:100%"
-          placeholder="请选择流程类型"
-          :disabled="isEdit"
-        >
-          <el-option
-            v-for="(val, key) in FLOW_TYPE"
-            :key="key"
-            :value="key"
-            :label="val"
-          ></el-option>
-        </el-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 { FLOW_TYPE, FLOW_MODEL_TYPE } from "../../../constants/enumerate";
-import { updateFlowName } from "../api";
-
-const initModalForm = {
-  id: null,
-  name: "",
-  type: "ELECTRON_FLOW",
-  modelType: "USER_FIXED"
-};
-
-export default {
-  name: "modify-flow",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return this.isEdit ? "重命名流程" : "新增流程";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      FLOW_TYPE,
-      FLOW_MODEL_TYPE,
-      modalForm: {},
-      rules: {
-        name: [
-          {
-            required: true,
-            message: "请输入流程名称",
-            trigger: "change"
-          },
-          {
-            message: "流程名称不能超过100个字符",
-            max: 100,
-            trigger: "change"
-          }
-        ],
-        type: [
-          {
-            required: true,
-            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.isEdit) {
-        this.$emit("modified", { isEdit: this.isEdit, data: this.modalForm });
-        this.cancel();
-        return;
-      }
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const data = await updateFlowName(this.modalForm).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified", { isEdit: this.isEdit, data });
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 736
src/modules/base/components/ModifyFlowDetail.vue

@@ -1,736 +0,0 @@
-<template>
-  <div>
-    <el-dialog
-      class="modify-flow-detail page-dialog"
-      :visible.sync="modalIsShow"
-      title="流程图编辑"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      :show-close="false"
-      append-to-body
-      fullscreen
-      destroy-on-close
-      @open="visibleChange"
-    >
-      <div class="box-justify" slot="title">
-        <h4 class="el-dialog__title">流程图编辑:{{ instance.name }}</h4>
-        <div>
-          <el-button @click="cancel">取消</el-button>
-          <el-button type="primary" :disabled="isSubmit" @click="submit"
-            >发布</el-button
-          >
-        </div>
-      </div>
-
-      <div class="part-box part-box-pad" style="padding-bottom: 5px">
-        <el-form
-          ref="modalFormComp"
-          :model="flowInfo"
-          :rules="rules"
-          label-width="140px"
-        >
-          <el-form-item prop="modelType" label="指定审批人类型:">
-            <el-select
-              v-model="flowInfo.modelType"
-              placeholder="请选择流程指定审批人类型"
-              @change="initFlowNodes"
-            >
-              <el-option
-                v-for="(val, key) in FLOW_MODEL_TYPE"
-                :key="key"
-                :value="key"
-                :label="val"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-        </el-form>
-      </div>
-
-      <div class="flow-box">
-        <div class="flow-content">
-          <div class="flow-main">
-            <!-- nodes -->
-            <div
-              v-for="node in nodes"
-              :key="node.id"
-              :id="`node-${node.id}`"
-              :class="[
-                'flow-node',
-                `node-${node.type.toLowerCase()}`,
-                { 'is-active': curNode.id === node.id }
-              ]"
-              @click="toSelectNode(node)"
-            >
-              <div v-if="node.type === 'PROCESS'" class="flow-node-title">
-                <i
-                  v-if="node.type === 'PROCESS'"
-                  :class="nodeIcons['PROCESS']"
-                ></i
-                >审批人
-              </div>
-              <div v-if="node.type === 'PROCESS'" class="flow-node-content">
-                <template v-if="!IS_APPROVE_SET">
-                  <div v-if="node.property.approveUserType === 'USER'">
-                    <p>
-                      {{
-                        node.property.approveUsers
-                          .map(item => item.name)
-                          .join(",")
-                      }}
-                    </p>
-                    <p v-if="node.property.copyForUsers.length">
-                      抄送:{{
-                        node.property.copyForUsers
-                          .map(item => item.name)
-                          .join(",")
-                      }}
-                    </p>
-                  </div>
-                  <div v-else>
-                    <p>
-                      {{
-                        node.property.approveRoles
-                          .map(item => item.name)
-                          .join(",")
-                      }}
-                    </p>
-                  </div>
-                </template>
-                <template
-                  v-if="IS_APPROVE_SET && node.property.approveUserCountType"
-                >
-                  <p>
-                    方式:{{
-                      APPROVE_USER_COUNT_TYPE[
-                        node.property.approveUserCountType
-                      ]
-                    }}
-                  </p>
-                  <p>
-                    范围:{{
-                      APPROVE_USER_SELECT_RANGE[
-                        node.property.approveUserSelectRange
-                      ]
-                    }}
-                  </p>
-                  <p v-if="node.property.approveUserSelectRange === 'ROLE'">
-                    角色:{{
-                      node.property.approveUserSelectRoles
-                        .map(item => item.name)
-                        .join(",")
-                    }}
-                  </p>
-                </template>
-              </div>
-              <div v-else class="flow-node-content">
-                <span><i :class="nodeIcons[node.type]"></i></span>
-                <span>{{ node.content }}</span>
-              </div>
-              <div v-if="node.type !== 'END'" class="flow-link">
-                <div class="node-add" @click.stop="toAddNode(node.id)">
-                  <i class="el-icon-plus"></i>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="flow-property">
-          <div v-if="curNode.id" class="flow-property-main" :key="curNode.id">
-            <h3 class="flow-property-title">节点属性</h3>
-            <!-- 管理员指定审批人 -->
-            <div v-if="!IS_APPROVE_SET" class="property-part">
-              <h4 class="property-part-title">设置审批人</h4>
-              <div class="flow-radio">
-                <el-radio-group
-                  v-model="curNode.property.approveUserType"
-                  size="small"
-                  @change="curNodeChange"
-                >
-                  <el-radio
-                    v-for="(val, key) in APPROVE_USER_TYPE"
-                    :key="key"
-                    :label="key"
-                    >{{ val }}</el-radio
-                  >
-                </el-radio-group>
-              </div>
-              <!-- 添加成员 -->
-              <div
-                v-if="curNode.property.approveUserType === 'USER'"
-                class="flow-users"
-              >
-                <el-button
-                  size="small"
-                  type="primary"
-                  @click="toAddUser('approveUsers')"
-                  >添加成员</el-button
-                >
-                <span class="tips-info">(最多添加5个)</span>
-                <div class="user-list">
-                  <el-tag
-                    v-for="user in curNode.property.approveUsers"
-                    :key="user.id"
-                    size="small"
-                    closable
-                    :disable-transitions="false"
-                    @close="deleteApproveUser('approveUsers', user)"
-                  >
-                    {{ user.name }}
-                  </el-tag>
-                  <el-button
-                    class="user-clear"
-                    type="danger"
-                    size="mini"
-                    plain
-                    @click="clearApproveUsers('approveUsers')"
-                    >清空</el-button
-                  >
-                </div>
-              </div>
-              <!-- 添加角色 -->
-              <div v-else class="flow-users">
-                <el-button
-                  size="small"
-                  type="primary"
-                  @click="toAddApproveRole('approveRoles')"
-                  >添加角色</el-button
-                >
-                <div class="user-list">
-                  <el-tag
-                    v-for="role in curNode.property.approveRoles"
-                    :key="role.id"
-                    size="small"
-                    closable
-                    :disable-transitions="false"
-                    @close="deleteApproveRole('approveRoles', role)"
-                  >
-                    {{ role.name }}
-                  </el-tag>
-                  <el-button
-                    class="user-clear"
-                    type="danger"
-                    size="mini"
-                    plain
-                    @click="clearApproveRole('approveRoles')"
-                    >清空</el-button
-                  >
-                </div>
-              </div>
-            </div>
-            <!-- 发起人指定审批人 -->
-            <div v-else class="property-part">
-              <h4 class="property-part-title">设置审批人</h4>
-              <el-form label-width="80px">
-                <el-form-item label="选择方式:">
-                  <el-select
-                    v-model="curNode.property.approveUserCountType"
-                    class="width-full"
-                    placeholder="请选择方式"
-                    @change="curNodeChange"
-                  >
-                    <el-option
-                      v-for="(val, key) in APPROVE_USER_COUNT_TYPE"
-                      :key="key"
-                      :value="key"
-                      :label="val"
-                    ></el-option>
-                  </el-select>
-                </el-form-item>
-                <el-form-item label="选择范围:">
-                  <el-select
-                    v-model="curNode.property.approveUserSelectRange"
-                    class="width-full"
-                    placeholder="请选择范围"
-                    @change="curNodeChange"
-                  >
-                    <el-option
-                      v-for="(val, key) in APPROVE_USER_SELECT_RANGE"
-                      :key="key"
-                      :value="key"
-                      :label="val"
-                    ></el-option>
-                  </el-select>
-                </el-form-item>
-                <el-form-item
-                  v-if="curNode.property.approveUserSelectRange === 'ROLE'"
-                  label="指定角色:"
-                >
-                  <el-button
-                    size="small"
-                    type="primary"
-                    @click="toAddApproveRole('approveUserSelectRoles')"
-                    >添加角色</el-button
-                  >
-                  <div class="user-list">
-                    <el-tag
-                      v-for="role in curNode.property.approveUserSelectRoles"
-                      :key="role.id"
-                      size="small"
-                      closable
-                      :disable-transitions="false"
-                      @close="deleteApproveRole('approveUserSelectRoles', role)"
-                    >
-                      {{ role.name }}
-                    </el-tag>
-                    <el-button
-                      class="user-clear"
-                      type="danger"
-                      size="mini"
-                      plain
-                      @click="clearApproveRole('approveUserSelectRoles')"
-                      >清空</el-button
-                    >
-                  </div>
-                </el-form-item>
-              </el-form>
-            </div>
-            <!-- 抄送人 -->
-            <div class="property-part">
-              <h4 class="property-part-title">设置抄送人</h4>
-              <div class="flow-users">
-                <el-button
-                  size="small"
-                  type="primary"
-                  @click="toAddUser('copyForUsers')"
-                  >添加成员</el-button
-                >
-                <span class="tips-info">(最多添加5个)</span>
-                <div class="user-list">
-                  <el-tag
-                    v-for="user in curNode.property.copyForUsers"
-                    :key="user.id"
-                    closable
-                    size="small"
-                    :disable-transitions="false"
-                    @close="deleteApproveUser('copyForUsers', user)"
-                  >
-                    {{ user.name }}
-                  </el-tag>
-                  <el-button
-                    class="user-clear"
-                    type="danger"
-                    size="mini"
-                    plain
-                    @click="clearApproveUsers('copyForUsers')"
-                    >清空</el-button
-                  >
-                </div>
-              </div>
-            </div>
-            <!-- 高级设置 -->
-            <div class="property-part">
-              <h4 class="property-part-title">高级设置</h4>
-              <p class="property-desc">多人审批时采用的审批方式</p>
-              <div class="flow-radio-v">
-                <el-radio-group
-                  v-model="curNode.property.multipleUserApproveType"
-                  size="small"
-                  @change="curNodeChange"
-                >
-                  <el-radio
-                    v-for="(val, key) in MULTIPLE_USER_APPROVE_TYPE"
-                    :key="key"
-                    :label="key"
-                    >{{ val }}</el-radio
-                  >
-                </el-radio-group>
-              </div>
-            </div>
-            <!-- 驳回设置 -->
-            <div class="property-part">
-              <h4 class="property-part-title">驳回设置</h4>
-              <p class="property-desc">允许驳回节点</p>
-              <div class="flow-radio-v">
-                <el-radio-group
-                  v-model="curNode.property.rejectType"
-                  size="small"
-                  @change="curNodeChange"
-                >
-                  <el-radio
-                    v-for="(val, key) in REJECT_TYPE"
-                    :key="key"
-                    :label="key"
-                    >{{ val }}</el-radio
-                  >
-                </el-radio-group>
-              </div>
-              <p class="property-desc">驳回后提交方式</p>
-              <div class="flow-radio-v">
-                <el-radio-group
-                  v-model="curNode.property.rejectResubmitType"
-                  size="small"
-                  @change="curNodeChange"
-                >
-                  <el-radio
-                    v-for="(val, key) in REJECT_RESUBMIT_TYPE"
-                    :key="key"
-                    :label="key"
-                    >{{ val }}</el-radio
-                  >
-                </el-radio-group>
-              </div>
-            </div>
-            <el-button size="mini" type="danger" plain @click="toDeleteNode"
-              >删除节点</el-button
-            >
-          </div>
-        </div>
-      </div>
-    </el-dialog>
-
-    <!-- SelectUserDialog -->
-    <select-user-dialog
-      ref="SelectUserDialog"
-      :users="curAddUsers"
-      @modified="userModified"
-    ></select-user-dialog>
-    <!-- SelectRoleDialog -->
-    <select-role-dialog
-      ref="SelectRoleDialog"
-      :data="curAddRoles"
-      @modified="roleModified"
-    ></select-role-dialog>
-  </div>
-</template>
-
-<script>
-import { deepCopy } from "../../../plugins/utils";
-import { flowDetail, updateFlowDetail } from "../api";
-import SelectUserDialog from "./SelectUserDialog";
-import SelectRoleDialog from "./SelectRoleDialog";
-import { FLOW_MODEL_TYPE } from "../../../constants/enumerate";
-
-const initFlowInfo = {
-  id: null,
-  name: "",
-  type: "ELECTRON_FLOW",
-  modelType: "USER_FIXED"
-};
-
-const DEFAULT_NODE = {
-  id: "",
-  type: "PROCESS", // 节点类型,START:开始节点,PROCESS:过程节点,END:结束节点
-  content: "",
-  w: 150,
-  h: 40,
-  x: 0,
-  y: 0,
-  property: {
-    approveUserType: "USER", // 审批用户类型,USER:成员,ROLE:角色
-    approveUsers: [], // 审批用户列表
-    approveRoles: [], // 审批角色列表
-    copyForUsers: [], // 抄送用户列表
-    multipleUserApproveType: "ORDER", // 审批用户类别,ORDER:依次审批,ALL:会签(所有人必须审批),SOME:或签(一名审批人同意或拒绝即可)
-    rejectType: "PREV", // 驳回类型,PREV:上一节点,START:发起人节点,PREV_ALL:该节点前全部节点
-    rejectResubmitType: "NORMAL", // 驳回再提交类型,NORMAL:按正常流程提交,PREV_STEP:提交到驳回节点
-    approveUserCountType: "ONE", // 选择方式,ONE:一个,MORE:多个
-    approveUserSelectRange: "ALL", // 选择范围,ALL:全单位,ROLE:角色
-    approveUserSelectRoles: [] // 指定角色范围
-  }
-};
-// 详细参数:https://doc.qmth.com.cn/pages/viewpage.action?pageId=40435764
-
-export default {
-  name: "modify-flow-detail",
-  components: { SelectUserDialog, SelectRoleDialog },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      FLOW_MODEL_TYPE,
-      initNodes: [
-        {
-          id: "1",
-          type: "START",
-          content: "开始流程",
-          w: 150,
-          h: 40,
-          x: 0,
-          y: 0,
-          property: null
-        },
-        {
-          id: "2",
-          type: "END",
-          content: "结束流程",
-          w: 150,
-          h: 40,
-          x: 0,
-          y: 0,
-          property: null
-        }
-      ],
-      flowInfo: { ...initFlowInfo },
-      nodes: [],
-      curNode: {},
-      curAddUsers: [],
-      curAddUserType: "",
-      curAddRoles: [],
-      curAddRoleType: "",
-      nodeIcons: {
-        START: "el-icon-video-play",
-        END: "el-icon-switch-button",
-        PROCESS: "el-icon-circle-plus-outline"
-      },
-      APPROVE_USER_TYPE: {
-        USER: "成员",
-        ROLE: "角色"
-      },
-      MULTIPLE_USER_APPROVE_TYPE: {
-        ORDER: "依次审批",
-        ALL: "会签(所有人必须审批)",
-        SOME: "或签(一名审批人同意或拒绝即可)"
-      },
-      REJECT_TYPE: {
-        PREV: "上一节点",
-        START: "发起人节点",
-        PREV_ALL: "该节点前全部节点"
-      },
-      REJECT_RESUBMIT_TYPE: {
-        NORMAL: "按正常流程提交",
-        PREV_STEP: "提交到驳回节点"
-      },
-      APPROVE_USER_COUNT_TYPE: {
-        ONE: "一次选择一个人",
-        MORE: "一次选择多个人"
-      },
-      APPROVE_USER_SELECT_RANGE: {
-        ALL: "全单位",
-        ROLE: "指定角色"
-      },
-      rules: {
-        modelType: [
-          {
-            required: true,
-            message: "请选择流程指定审批人类型",
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  computed: {
-    IS_APPROVE_SET() {
-      return this.flowInfo.modelType === "APPROVE_SET";
-    }
-  },
-  methods: {
-    async initData(val) {
-      if (val.id) {
-        const data = await flowDetail(val.id);
-        this.flowInfo = this.$objAssign(initFlowInfo, data);
-        this.flowInfo.id = data.customFlowId;
-        this.nodes = data.customFlowLists;
-        this.toSelectNode(this.nodes[1]);
-      } else {
-        this.flowInfo = this.$objAssign(initFlowInfo, val);
-        this.initFlowNodes();
-      }
-    },
-    initFlowNodes() {
-      this.nodes = deepCopy(this.initNodes);
-      this.toAddNode(this.nodes[0].id);
-    },
-    visibleChange() {
-      this.initData(this.instance);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    getDefaultNode() {
-      const nodeId = this.nodes.length
-        ? Math.max.apply(
-            null,
-            this.nodes.map(item => item.id)
-          ) + 1
-        : 1;
-      return { ...deepCopy(DEFAULT_NODE), id: nodeId };
-    },
-    toAddNode(curNodeId) {
-      const newNode = this.getDefaultNode();
-      const pos = this.nodes.findIndex(node => node.id === curNodeId);
-      this.nodes.splice(pos + 1, 0, newNode);
-      this.toSelectNode(newNode);
-    },
-    toDeleteNode() {
-      const pos = this.nodes.findIndex(node => node.id === this.curNode.id);
-      this.nodes.splice(pos, 1);
-      if (this.nodes[pos] && this.nodes[pos].type === "PROCESS") {
-        this.toSelectNode(this.nodes[pos]);
-      } else {
-        let prevPos = pos - 1;
-        prevPos = Math.max(prevPos, 0);
-        this.toSelectNode(this.nodes[prevPos]);
-      }
-    },
-    toSelectNode(node) {
-      if (node.type === "START" || node.type === "END") {
-        this.curNode = {};
-        return;
-      }
-      this.curNode = node ? deepCopy(node) : {};
-    },
-    curNodeChange() {
-      const pos = this.nodes.findIndex(node => node.id === this.curNode.id);
-      this.nodes.splice(pos, 1, deepCopy(this.curNode));
-    },
-    // approveUser
-    toAddUser(curAddUserType) {
-      this.curAddUserType = curAddUserType;
-      this.curAddUsers = this.curNode.property[this.curAddUserType];
-      this.$refs.SelectUserDialog.open();
-    },
-    userModified(users) {
-      this.curNode.property[this.curAddUserType] = users;
-      this.curNodeChange();
-    },
-    deleteApproveUser(curAddUserType, user) {
-      console.log(user);
-      const pos = this.curNode.property[curAddUserType].findIndex(
-        item => item.id === user.id
-      );
-      this.curNode.property[curAddUserType].splice(pos, 1);
-      this.curNodeChange();
-    },
-    clearApproveUsers(curAddUserType) {
-      this.curNode.property[curAddUserType] = [];
-      this.curNodeChange();
-    },
-    // approveRole
-    toAddApproveRole(curAddRoleType) {
-      this.curAddRoleType = curAddRoleType;
-      this.curAddRoles = this.curNode.property[this.curAddRoleType];
-      this.$refs.SelectRoleDialog.open();
-    },
-    roleModified(roles) {
-      this.curNode.property[this.curAddRoleType] = roles;
-      this.curNodeChange();
-    },
-    deleteApproveRole(curAddRoleType, role) {
-      const pos = this.curNode.property[curAddRoleType].findIndex(
-        item => item.id === role.id
-      );
-      this.curNode.property[curAddRoleType].splice(pos, 1);
-      this.curNodeChange();
-    },
-    clearApproveRole(curAddRoleType) {
-      this.curNode.property[curAddRoleType] = [];
-      this.curNodeChange();
-    },
-    checkData() {
-      if (!this.nodes.some(node => node.type === "PROCESS")) {
-        this.$message.error("请设置过程节点");
-        return;
-      }
-
-      if (this.IS_APPROVE_SET) {
-        const nodeUserValid = !this.nodes
-          .filter(node => node.type === "PROCESS")
-          .some(node => {
-            if (node.property.approveUserSelectRange === "ROLE") {
-              return !node.property.approveUserSelectRoles.length;
-            } else {
-              return false;
-            }
-          });
-        if (!nodeUserValid) {
-          this.$message.error("请完成节点设置");
-          return;
-        }
-      } else {
-        const nodeUserValid = !this.nodes
-          .filter(node => node.type === "PROCESS")
-          .some(node => {
-            if (node.property.approveUserType === "USER") {
-              return !node.property.approveUsers.length;
-              // return !(
-              //   node.property.approveUsers.length &&
-              //   node.property.copyForUsers.length
-              // );
-            } else {
-              return !node.property.approveRoles.length;
-            }
-          });
-        if (!nodeUserValid) {
-          this.$message.error("请完成节点设置");
-          return;
-        }
-      }
-
-      return true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (!this.checkData()) return;
-
-      if (this.isSubmit) return;
-      const result = await this.$confirm(
-        `确定要发布流程【${this.instance.name}】吗?`,
-        "提示",
-        {
-          type: "warning"
-        }
-      ).catch(() => {});
-      if (result !== "confirm") return;
-
-      this.nodes.forEach(node => {
-        const dom = document.getElementById(`node-${node.id}`);
-        node.w = dom.clientWidth;
-        node.h = dom.clientHeight;
-        node.x = dom.offsetLeft;
-        node.y = dom.offsetTop;
-      });
-
-      const nodes = this.nodes.map((node, index) => {
-        let nnode = deepCopy(node);
-        nnode.id = index + 1;
-        if (node.property) {
-          if (this.IS_APPROVE_SET) {
-            if (node.property.approveUserSelectRange === "ALL") {
-              node.property.approveUserSelectRoles = [];
-            }
-          } else {
-            if (node.property.approveUserType === "USER") {
-              nnode.approveRoles = [];
-            } else {
-              nnode.approveUsers = [];
-            }
-          }
-        }
-
-        return nnode;
-      });
-
-      this.isSubmit = true;
-
-      const res = await updateFlowDetail({
-        customFlowId: this.flowInfo.id,
-        name: this.flowInfo.name,
-        type: this.flowInfo.type,
-        modelType: this.flowInfo.modelType,
-        publish: true,
-        customFlowLists: nodes
-      }).catch(() => {});
-      this.isSubmit = false;
-      if (!res) return;
-
-      this.$message.success("编辑成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

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

@@ -1,137 +0,0 @@
-<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="majorName" label="专业名称:">
-        <el-input
-          v-model.trim="modalForm.majorName"
-          placeholder="请输入专业名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="collegeId" label="所属学院:">
-        <college-select
-          v-model="modalForm.collegeId"
-          placeholder="请选择所属学院"
-          clearable
-          style="width: 100%"
-        ></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,
-  majorName: "",
-  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: {
-        majorName: [
-          {
-            required: true,
-            message: "请输入专业名称",
-            trigger: "change"
-          },
-          {
-            message: "专业名称不能超过50个字",
-            max: 50,
-            trigger: "change"
-          }
-        ],
-        collegeId: [
-          {
-            required: true,
-            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>

+ 0 - 154
src/modules/base/components/ModifyOrgAdmin.vue

@@ -1,154 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-organization"
-    :visible.sync="modalIsShow"
-    title="机构管理人员"
-    top="10px"
-    width="1000px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-  >
-    <div class="part-box part-box-pad part-box-border">
-      <div class="part-title">
-        <h2>部门主管</h2>
-      </div>
-      <el-table>
-        <el-table-column prop="realName" label="姓名"></el-table-column>
-        <el-table-column prop="realName" label="手机号"></el-table-column>
-        <el-table-column prop="realName" label="工号"></el-table-column>
-        <el-table-column prop="realName" label="角色"></el-table-column>
-        <el-table-column prop="realName" label="部门"></el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="120px">
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="setAdmin(scope.row)"
-            >
-              {{ scope.row.isAdmin ? "取消部门主管" : "设为部分主管" }}
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-    <div class="part-box part-box-pad part-box-border">
-      <div class="flex-between">
-        <el-form ref="modalFormComp" :model="filter" label-width="100px">
-          <el-form-item prop="name" label="部分成员:">
-            <el-input
-              style="width:282px;"
-              v-model.trim="filter.name"
-              placeholder="姓名/工号/手机号"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item>
-            <el-button @click="search">查询</el-button>
-          </el-form-item>
-        </el-form>
-        <div>
-          <el-button
-            type="primary"
-            icon="el-icon-circle-plus-outline"
-            @click="toAdd"
-            >添加成员</el-button
-          >
-        </div>
-      </div>
-      <table>
-        <el-table-column prop="realName" label="姓名"></el-table-column>
-        <el-table-column prop="realName" label="手机号"></el-table-column>
-        <el-table-column prop="realName" label="工号"></el-table-column>
-        <el-table-column prop="realName" label="角色"></el-table-column>
-        <el-table-column prop="realName" label="部门"></el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="120px">
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="setAdmin(scope.row)"
-            >
-              {{ scope.row.isAdmin ? "取消部门主管" : "设为部分主管" }}
-            </el-button>
-          </template>
-        </el-table-column>
-      </table>
-    </div>
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import { updateOrganization } from "../api";
-
-export default {
-  name: "modify-organization",
-  props: {
-    orgId: {
-      type: String,
-      default: ""
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      filter: { name: "" },
-      admins: [],
-      users: [],
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0
-    };
-  },
-  watch: {
-    orgId(val, oldval) {
-      if (val !== oldval) this.initData();
-    }
-  },
-  methods: {
-    initData() {
-      this.filter.name = "";
-      this.admins = [];
-      this.users = [];
-      this.getAdmins();
-      this.toPage(1);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async getAdmins() {
-      if (!this.orgId) return;
-      const data = await updateOrganization({ orgId: this.orgId });
-      this.admins = data || [];
-    },
-    async getList() {
-      if (!this.orgId) return;
-      const datas = {
-        ...this.filter,
-        orgId: this.orgId,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-
-      const data = await updateOrganization(datas);
-      this.users = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    search() {
-      this.toPage(1);
-    },
-    setAdmin(user) {
-      console.log(user);
-    },
-    toAdd() {}
-  }
-};
-</script>

+ 0 - 154
src/modules/base/components/ModifyOrganization.vue

@@ -1,154 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-organization"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="448px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @opened="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :rules="rules"
-      label-position="top"
-    >
-      <el-form-item label="上级机构:">
-        <el-input v-model.trim="modalForm.parentName" disabled></el-input>
-      </el-form-item>
-      <el-form-item prop="name" label="机构名称:">
-        <el-input
-          v-model.trim="modalForm.name"
-          placeholder="请输入机构名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="type" label="机构类型:">
-        <el-select
-          v-model="modalForm.type"
-          style="width: 100%;"
-          placeholder="请选择"
-          clearable
-        >
-          <el-option
-            v-for="item in orgTypes"
-            :key="item.type"
-            :value="item.type"
-            :label="item.name"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <!-- <el-form-item label="启用/禁用:">
-          <el-switch
-            v-model="modalForm.enable"
-            
-            inactive-color="#dcdfe6"
-          >
-          </el-switch>
-        </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 { updateOrganization } from "../api";
-
-const initModalForm = {
-  id: null,
-  name: "",
-  type: "",
-  parentId: null,
-  parentName: "",
-  enable: true
-};
-
-export default {
-  name: "modify-organization",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    },
-    orgTypes: {
-      type: Array,
-      default() {
-        return [];
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "机构";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: {},
-      rules: {
-        name: [
-          {
-            required: true,
-            pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,30}$/,
-            message: "机构名称只能输入汉字、数字和字母,长度不能超过30",
-            trigger: "change"
-          }
-        ],
-        type: [
-          {
-            required: true,
-            message: "请选择机构类型",
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
-    },
-    visibleChange() {
-      this.initData(this.instance);
-      this.$nextTick(() => {
-        this.$refs.modalFormComp.clearValidate();
-      });
-    },
-    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 datas = { ...this.modalForm };
-      const data = await updateOrganization(datas).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
-
-      this.$emit("confirm", this.modalForm);
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 149
src/modules/base/components/ModifyRole.vue

@@ -1,149 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-role"
-    :visible.sync="modalIsShow"
-    :title="title"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    fullscreen
-    @opened="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :rules="rules"
-      label-position="top"
-    >
-      <el-form-item prop="name" label="角色名称:">
-        <el-input
-          style="width:282px;"
-          v-model.trim="modalForm.name"
-          placeholder="请输入角色名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item label="角色权限:" required></el-form-item>
-    </el-form>
-    <privilege-set
-      v-if="menus && menus.length"
-      ref="PrivilegeSet"
-      :menus="menus"
-    ></privilege-set>
-    <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 { updateRole, privilegeList, roleBoundPrivileges } from "../api";
-import PrivilegeSet from "./PrivilegeSet";
-// import navs from "./privilege/navs.json";
-
-const initModalForm = {
-  id: null,
-  name: "",
-  privilegeIds: []
-};
-
-export default {
-  name: "modify-role",
-  components: { PrivilegeSet },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "角色";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      menus: [],
-      modalForm: {},
-      rules: {
-        name: [
-          {
-            required: true,
-            pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,20}$/,
-            message: "角色名称只能输入汉字、字母和数字,长度不能超过20",
-            trigger: "change"
-          }
-        ]
-      }
-    };
-  },
-  created() {
-    this.getMenus();
-  },
-  methods: {
-    async getMenus() {
-      const data = await privilegeList();
-      const needHideModules = ["common", "customer"];
-      if (data)
-        this.menus = data
-          .filter(item => !needHideModules.includes(item.url))
-          .map(item => {
-            item.parentId = null;
-            return item;
-          });
-    },
-    async visibleChange() {
-      let privilegeIds = [];
-      if (this.instance.id) {
-        this.modalForm = this.$objAssign(initModalForm, this.instance);
-        privilegeIds = await roleBoundPrivileges(this.instance.id);
-        privilegeIds = privilegeIds || [];
-        this.modalForm.privilegeIds = privilegeIds;
-      } else {
-        this.modalForm = { ...initModalForm };
-      }
-      this.$nextTick(() => {
-        this.$refs.modalFormComp.clearValidate();
-        this.$refs.PrivilegeSet.buildTableData(privilegeIds);
-      });
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      const privilegeIds = this.$refs.PrivilegeSet.getSelectedPrivilegeIds();
-      if (!privilegeIds.length) {
-        this.$emit("请设置角色权限!");
-        return;
-      }
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const datas = { ...this.modalForm };
-      datas.privilegeIds = privilegeIds;
-      const data = await updateRole(datas).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
-
-      this.$emit("modified", this.modalForm);
-      this.cancel();
-    }
-  }
-};
-</script>

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

@@ -1,151 +0,0 @@
-<template>
-  <div>
-    <el-dialog
-      class="modify-role-user page-dialog"
-      :visible.sync="modalIsShow"
-      :title="title"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-      fullscreen
-      destroy-on-close
-      @open="visibleChange"
-    >
-      <div class="part-box part-box-filter part-box-flex">
-        <el-form
-          ref="FilterForm"
-          label-position="left"
-          label-width="85px"
-          inline
-        >
-          <el-form-item label="名称:">
-            <el-input
-              v-model="filter.name"
-              placeholder="人员名称"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="getList">查询</el-button>
-          </el-form-item>
-        </el-form>
-      </div>
-
-      <div class="part-box part-box-pad">
-        <el-table ref="TableList" :data="userList">
-          <el-table-column
-            type="index"
-            label="序号"
-            width="70"
-            :index="indexMethod"
-          ></el-table-column>
-          <el-table-column prop="realName" label="姓名"> </el-table-column>
-          <el-table-column prop="code" label="工号"> </el-table-column>
-          <el-table-column prop="mobileNumber" label="手机号">
-          </el-table-column>
-          <el-table-column class-name="action-column" label="操作" width="80">
-            <template slot-scope="scope">
-              <el-button
-                class="btn-primary"
-                type="text"
-                @click="toManageUser(scope.row)"
-                >管理范围</el-button
-              >
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </el-dialog>
-
-    <!-- SelectUserDialog -->
-    <select-user-dialog
-      ref="SelectUserDialog"
-      :users="curUserMember"
-      :user-limit-count="0"
-      can-select-all
-      @modified="userModified"
-    ></select-user-dialog>
-  </div>
-</template>
-
-<script>
-import { roleGroupList, updateRoleGroup } from "../api";
-import SelectUserDialog from "../components/SelectUserDialog";
-
-export default {
-  name: "modify-role-user",
-  components: { SelectUserDialog },
-  props: {
-    role: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      filter: {
-        name: ""
-      },
-      userList: [],
-      curUser: {},
-      curUserMember: []
-    };
-  },
-  computed: {
-    title() {
-      return `人员管理-${this.role.name}`;
-    }
-  },
-  methods: {
-    visibleChange() {
-      this.filter.name = "";
-      this.getList();
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async getList() {
-      const datas = {
-        ...this.filter,
-        roleId: this.role.id
-      };
-      const data = (await roleGroupList(datas)) || [];
-
-      this.userList = data.map(item => {
-        let nitem = { ...item.user };
-        nitem.memberList = item.memberList;
-        return nitem;
-      });
-    },
-    toManageUser(row) {
-      const memberList = row.memberList || [];
-      this.curUserMember = memberList.map(item => {
-        return {
-          id: item.id,
-          name: item.realName
-        };
-      });
-      this.curUser = row;
-      this.$refs.SelectUserDialog.open();
-    },
-    async userModified(users) {
-      console.log(users);
-      const data = {
-        roleId: this.role.id,
-        userId: this.curUser.id,
-        memberIdList: users.map(item => item.id)
-      };
-      await updateRoleGroup(data);
-
-      this.$message.success("修改成功!");
-      this.getList();
-    }
-  }
-};
-</script>

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

@@ -1,156 +0,0 @@
-<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="semesterName" label="学期名称:">
-        <el-input
-          v-model.trim="modalForm.semesterName"
-          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,
-  semesterName: "",
-  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: {
-        semesterName: [
-          {
-            required: true,
-            message: "请输入学期名称",
-            trigger: "change"
-          },
-          {
-            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 };
-        this.createTime = [];
-      }
-    },
-    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>

+ 0 - 247
src/modules/base/components/ModifyStudent.vue

@@ -1,247 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-student"
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10px"
-    width="448px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    destroy-on-close
-    @open="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :rules="rules"
-      :key="modalForm.id"
-      label-position="top"
-    >
-      <el-form-item prop="studentName" label="姓名:">
-        <el-input
-          v-model.trim="modalForm.studentName"
-          placeholder="请输入姓名"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="studentCode" label="学号:">
-        <el-input
-          v-model.trim="modalForm.studentCode"
-          placeholder="请输入学号"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="phoneNumber" label="手机号:">
-        <el-input
-          v-model.trim="modalForm.phoneNumber"
-          placeholder="请输入手机号"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="campusId" label="所属校区:">
-        <campus-select
-          v-model="modalForm.campusId"
-          placeholder="请选择所属校区"
-          style="width: 100%;"
-          @change="updateClazz"
-        ></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%;"
-          @change="updateClazz"
-        ></major-select>
-      </el-form-item>
-      <el-form-item prop="clazzId" label="班级:">
-        <el-select
-          v-model="modalForm.clazzId"
-          placeholder="请选择班级"
-          style="width: 100%;"
-        >
-          <el-option
-            v-for="item in clazzList"
-            :key="item.id"
-            :value="item.id"
-            :label="item.name"
-          >
-          </el-option>
-        </el-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 { updateStudent, unitQueryByType } from "../api";
-
-const initModalForm = {
-  id: null,
-  studentName: "",
-  studentCode: "",
-  phoneNumber: "",
-  campusId: "",
-  collegeId: "",
-  majorId: "",
-  clazzId: ""
-};
-
-export default {
-  name: "modify-student",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "学生";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      rules: {
-        studentName: [
-          {
-            required: true,
-            message: "请输入姓名",
-            trigger: "change"
-          },
-          {
-            message: "姓名不能超过50个字",
-            max: 50,
-            trigger: "change"
-          }
-        ],
-        studentCode: [
-          {
-            required: true,
-            message: "请输入学号",
-            trigger: "change"
-          },
-          {
-            message: "学号不能超过50个字",
-            max: 50,
-            trigger: "change"
-          }
-        ],
-        phoneNumber: [
-          {
-            required: false,
-            pattern: /^1\d{10}$/,
-            message: "请输入合适的手机号码",
-            trigger: "change"
-          }
-        ],
-        campusId: [
-          {
-            required: false,
-            message: "请选择校区",
-            trigger: "change"
-          }
-        ],
-        collegeId: [
-          {
-            required: false,
-            message: "请选择学院",
-            trigger: "change"
-          }
-        ],
-        majorId: [
-          {
-            required: false,
-            message: "请选择专业",
-            trigger: "change"
-          }
-        ],
-        clazzId: [
-          {
-            required: false,
-            message: "请选择班级",
-            trigger: "change"
-          }
-        ]
-      },
-      clazzList: []
-    };
-  },
-  methods: {
-    initData(val) {
-      if (val.id) {
-        this.modalForm = this.$objAssign(initModalForm, val);
-        this.getClazz();
-      } else {
-        this.modalForm = { ...initModalForm };
-      }
-    },
-    visibleChange() {
-      this.initData(this.instance);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    updateClazz() {
-      this.modalForm.clazzId = "";
-      this.getClazz();
-    },
-    async getClazz() {
-      this.clazzList = [];
-      if (!this.modalForm.campusId || !this.modalForm.majorId) return;
-      const res = await unitQueryByType(
-        {
-          campusId: this.modalForm.campusId,
-          majorId: this.modalForm.majorId
-        },
-        "CLAZZ"
-      );
-      this.clazzList = res;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const data = await updateStudent(this.modalForm).catch(() => {
-        this.isSubmit = false;
-      });
-
-      if (!data) return;
-
-      this.isSubmit = false;
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 240
src/modules/base/components/ModifyStudentSimple.vue

@@ -1,240 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-student-simple"
-    :visible.sync="modalIsShow"
-    title="添加学生"
-    top="10px"
-    width="800px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    destroy-on-close
-    @open="visibleChange"
-  >
-    <div class="mb-4 tab-btns">
-      <el-button
-        v-for="tab in tabs"
-        :key="tab.val"
-        size="medium"
-        :type="curTab == tab.val ? 'primary' : 'default'"
-        @click="selectMenu(tab.val)"
-        >{{ tab.name }}
-      </el-button>
-    </div>
-    <!-- input -->
-    <div v-if="curTab === 'input'" class="tab-body">
-      <el-form
-        ref="modalFormComp"
-        :model="modalForm"
-        :rules="rules"
-        :key="modalForm.id"
-        label-position="top"
-      >
-        <el-form-item prop="studentName" label="姓名:">
-          <el-input
-            v-model.trim="modalForm.studentName"
-            placeholder="请输入姓名"
-            clearable
-          ></el-input>
-        </el-form-item>
-        <el-form-item prop="studentCode" label="学号:">
-          <el-input
-            v-model.trim="modalForm.studentCode"
-            placeholder="请输入学号"
-            clearable
-          ></el-input>
-        </el-form-item>
-      </el-form>
-    </div>
-    <!-- select -->
-    <div v-if="curTab === 'select'" class="tab-body">
-      <select-class-student
-        ref="SelectClassStudent"
-        v-model="selectedStudentIds"
-      ></select-class-student>
-    </div>
-    <!-- import -->
-    <div v-if="curTab === 'import'" class="tab-body">
-      <el-button type="success" icon="el-icon-download"
-        ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
-      >
-      <upload-button
-        btn-icon="el-icon-circle-plus-outline"
-        btn-content="批量导入"
-        btn-type="success"
-        :upload-url="uploadUrl"
-        :upload-data="uploadData"
-        :format="['xls', 'xlsx']"
-        accept=".xls,.xlsx"
-        @valid-error="validError"
-        @upload-success="uploadSuccess"
-      >
-      </upload-button>
-    </div>
-
-    <div v-if="!IS_IMPORT" slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-    <div v-else slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import { updateStudentSimple, batchAddStudentSimple } from "../api";
-import UploadButton from "../../../components/UploadButton";
-import SelectClassStudent from "./SelectClassStudent";
-
-const initModalForm = {
-  id: null,
-  teachClazzId: null,
-  studentName: "",
-  studentCode: ""
-};
-
-export default {
-  name: "modify-student-simple",
-  components: { UploadButton, SelectClassStudent },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  computed: {
-    IS_IMPORT() {
-      return this.curTab === "import";
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      curTab: "select",
-      tabs: [
-        {
-          name: "手动添加",
-          val: "input"
-        },
-        {
-          name: "从课程班级添加",
-          val: "select"
-        },
-        {
-          name: "批量导入",
-          val: "import"
-        }
-      ],
-      modalForm: { ...initModalForm },
-      rules: {
-        studentName: [
-          {
-            required: true,
-            message: "请输入姓名",
-            trigger: "change"
-          },
-          {
-            message: "姓名不能超过50个字",
-            max: 50,
-            trigger: "change"
-          }
-        ],
-        studentCode: [
-          {
-            required: true,
-            message: "请输入学号",
-            trigger: "change"
-          },
-          {
-            message: "学号不能超过50个字",
-            max: 50,
-            trigger: "change"
-          }
-        ]
-      },
-      selectedStudentIds: [],
-      // import
-      uploadData: {},
-      uploadUrl: "/api/admin/teach/student/import",
-      downloadUrl: "/temps/clazzSimpleStudentTemplate.xlsx",
-      dfilename: "教学班级学生导入模板.xlsx"
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
-      this.uploadData = {
-        teachClazzId: val.teachClazzId
-      };
-    },
-    visibleChange() {
-      this.initData(this.instance);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    selectMenu(tab) {
-      this.curTab = tab;
-    },
-    submit() {
-      const submitFunc = {
-        input: this.submitInput,
-        select: this.submitSelect
-      };
-      submitFunc[this.curTab]();
-    },
-    async submitInput() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const data = await updateStudentSimple(this.modalForm).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success("添加成功!");
-      this.$emit("modified");
-      this.modalForm = this.$objAssign(initModalForm, this.instance);
-    },
-    async submitSelect() {
-      if (!this.selectedStudentIds.length) {
-        this.$message.error("请选择学生");
-        return;
-      }
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const data = await batchAddStudentSimple({
-        teachClazzId: this.instance.teachClazzId,
-        basicStudentIdSet: this.selectedStudentIds
-      }).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success("添加成功!");
-      this.$emit("modified");
-      this.selectedStudentIds = [];
-      this.$refs.SelectClassStudent.clearSelection();
-    },
-    // import
-    validError(errorData) {
-      this.$message.error(errorData.message);
-    },
-    uploadSuccess(data) {
-      this.$message.success(data.data || "学生导入成功!");
-      this.$emit("modified");
-      this.cancel();
-    }
-  }
-};
-</script>

+ 8 - 3
src/modules/base/components/ModifyTask.vue

@@ -12,26 +12,31 @@
   >
     <el-form
       ref="modalFormComp"
-      label-position="top"
       :rules="rules"
       :model="modalForm"
+      label-width="110px"
     >
       <el-form-item prop="schoolId" label="学校:">
-        <school-select v-model="modalForm.schoolId"></school-select>
+        <school-select
+          v-model="modalForm.schoolId"
+          class="width-400"
+        ></school-select>
       </el-form-item>
       <el-form-item prop="semesterId" label="学期:">
         <semester-select
           v-model="modalForm.semesterId"
+          class="width-400"
           :school-id="modalForm.schoolId"
         ></semester-select>
       </el-form-item>
       <el-form-item prop="examId" label="考试:">
         <exam-select
           v-model="modalForm.examId"
+          class="width-400"
           :semester-id="modalForm.semesterId"
         ></exam-select>
       </el-form-item>
-      <el-form-item label="定时任务时间:">
+      <el-form-item prop="startTime" label="定时任务时间:">
         <el-date-picker
           v-model="createTime"
           type="datetimerange"

+ 0 - 222
src/modules/base/components/PrivilegeSet.vue

@@ -1,222 +0,0 @@
-<template>
-  <div class="privilege-set">
-    <table class="table">
-      <tr>
-        <th v-for="(item, index) in tableHead" :key="index">{{ item }}</th>
-      </tr>
-      <tr v-for="row in tableData" :key="row.id">
-        <td v-for="(col, cindex) in row.columns" :key="cindex">
-          <div v-if="col && col.type === 'page'">{{ col.name }}</div>
-          <div v-else-if="col && col.type === 'page-checkbox'">
-            <el-checkbox
-              v-model="row.enable"
-              @change="enable => pageSelectChange(row, enable)"
-            ></el-checkbox>
-          </div>
-          <div v-else-if="col && col.type">
-            <div
-              class="cell-check-list"
-              v-for="item in col.datas"
-              :key="item.field"
-            >
-              <el-checkbox
-                v-model="item.enable"
-                @change="enable => typeSelectChange(row, enable)"
-                >{{ item.name }}</el-checkbox
-              >
-            </div>
-          </div>
-          <div v-else></div>
-        </td>
-      </tr>
-    </table>
-  </div>
-</template>
-
-<script>
-export default {
-  name: "privilege-set",
-  props: {
-    menus: {
-      type: Array,
-      default() {
-        return [];
-      }
-    }
-  },
-  data() {
-    return {
-      maxDeep: 0,
-      tableData: [],
-      tableHead: []
-    };
-  },
-  created() {
-    this.initData();
-  },
-  methods: {
-    initData() {
-      this.maxDeep = this.getNavsDeep();
-      this.tableHead = this.buildTableHead();
-      // this.buildTableData();
-    },
-    getNavsDeep() {
-      let maxDeep = 0;
-      const getDeep = (navs, deep) => {
-        ++deep;
-        navs.forEach(nav => {
-          if (maxDeep < deep) maxDeep = deep;
-
-          if (nav.children && nav.children.length) getDeep(nav.children, deep);
-        });
-      };
-      getDeep(this.menus, maxDeep);
-
-      return maxDeep;
-    },
-    buildTableHead() {
-      let headers = [];
-      let codes = ["一", "二", "三", "四", "五", "六", "七", "八"];
-      for (let index = 0; index < this.maxDeep; index++) {
-        headers.push(`${codes[index]}级页面`);
-      }
-      headers = [
-        ...headers,
-        "页面",
-        "查询条件",
-        "功能按钮",
-        "列表展示",
-        "操作列"
-      ];
-      return headers;
-    },
-    buildTableData(privilegeIds = []) {
-      let tableData = [];
-      let tableColumnCount = this.maxDeep + 5;
-      const pageSetTypes = ["conditions", "buttons", "lists", "links"];
-      const buildData = (navs, deep) => {
-        ++deep;
-        navs.forEach(nav => {
-          let columns = new Array(tableColumnCount);
-          columns[deep - 1] = { type: "page", name: nav.name };
-          columns[this.maxDeep] = {
-            type: "page-checkbox"
-          };
-
-          const isPage = pageSetTypes.some(
-            type => nav[type] && nav[type].length
-          );
-          if (isPage) {
-            pageSetTypes.forEach((type, index) => {
-              const datas = !nav[type]
-                ? []
-                : nav[type].map(elem => {
-                    let data = { ...elem };
-                    data.enable = privilegeIds.includes(elem.id);
-                    return data;
-                  });
-              columns[this.maxDeep + index + 1] = { type, datas };
-            });
-          }
-
-          tableData.push({
-            id: nav.id,
-            name: nav.name,
-            enable: privilegeIds.includes(nav.id),
-            type: nav.type,
-            parentId: nav.parentId,
-            isPage,
-            columns
-          });
-
-          if (nav.children && nav.children.length)
-            buildData(nav.children, deep);
-        });
-      };
-      buildData(this.menus, 0);
-
-      this.tableData = tableData;
-    },
-    getSelectedPrivilegeIds() {
-      let privilegeIds = [];
-      this.tableData
-        .filter(row => row.enable)
-        .forEach(row => {
-          privilegeIds.push(row.id);
-          row.columns.forEach(column => {
-            if (column.type === "page" || column.type === "page-checkbox")
-              return;
-
-            column.datas.forEach(item => {
-              if (item.enable) privilegeIds.push(item.id);
-            });
-          });
-        });
-      return privilegeIds;
-    },
-    // set change
-    pageSelectChange(row, enable) {
-      this.changRowColumnEnable(row, enable);
-      this.changeParentNodeSelected(row.parentId, enable);
-      this.changeChildrenNodeSelected(row.id, enable);
-    },
-    typeSelectChange(row, enable) {
-      if (!row.enable && enable) {
-        row.enable = enable;
-        this.changeParentNodeSelected(row.parentId, enable);
-        this.changeChildrenNodeSelected(row.id, enable);
-      }
-    },
-    changRowColumnEnable(row, enable) {
-      if (!row.isPage) return;
-      row.columns.forEach(column => {
-        if (column.type === "page" || column.type === "page-checkbox") return;
-
-        column.datas.forEach(item => {
-          item.enable = enable;
-        });
-      });
-    },
-    changeParentNodeSelected(parentId, enable) {
-      if (!parentId) return;
-      let curParentId = parentId;
-      if (enable) {
-        while (curParentId) {
-          let curParentNode = this.tableData.find(
-            row => row.id === curParentId
-          );
-          curParentNode.enable = enable;
-          curParentId = curParentNode.parentId;
-          this.changRowColumnEnable(curParentNode, enable);
-        }
-      } else {
-        while (curParentId) {
-          let curParentNode = this.tableData.find(
-            row => row.id === curParentId
-          );
-          let childrenHasOneSelected = this.tableData
-            .filter(row => row.parentId === curParentId)
-            .some(row => row.enable);
-          curParentNode.enable = childrenHasOneSelected;
-          curParentId = curParentNode.parentId;
-          this.changRowColumnEnable(curParentNode, enable);
-        }
-      }
-    },
-    changeChildrenNodeSelected(id, enable) {
-      if (!id) return;
-      let curIds = [id];
-      while (curIds.length) {
-        const validNodes = this.tableData.filter(row =>
-          curIds.includes(row.parentId)
-        );
-        validNodes.forEach(row => {
-          row.enable = enable;
-          this.changRowColumnEnable(row, enable);
-        });
-        curIds = validNodes.map(row => row.id);
-      }
-    }
-  }
-};
-</script>

+ 0 - 145
src/modules/base/components/RegistFlowDialog.vue

@@ -1,145 +0,0 @@
-<template>
-  <el-dialog
-    class="regist-flow-dialog"
-    :visible.sync="modalIsShow"
-    title="新增流程"
-    top="10vh"
-    width="500px"
-    :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
-          style="width:100%"
-          v-model.trim="modalForm.name"
-          placeholder="请输入名称"
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="uploadData" label="上传文件:">
-        <upload-fetch-file
-          input-width="320px"
-          :format="format"
-          @valid-change="validChange"
-          @file-change="fileChange"
-          ref="UploadFetchFile"
-        ></upload-fetch-file>
-        <p class="tips-info">
-          上传的文件只支持{{ format.join(",") }},大小不超过2M
-        </p>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="confirm"
-        >确定</el-button
-      >
-      <el-button @click="cancel">返回</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import UploadFetchFile from "@/components/UploadFetchFile";
-import { flowRegister } from "../api";
-
-export default {
-  name: "regist-flow-dialog-view",
-  props: {
-    data: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  components: { UploadFetchFile },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: {
-        name: "",
-        publish: true
-      },
-      rules: {
-        name: [
-          {
-            required: true,
-            message: "请输入名称",
-            trigger: "change"
-          }
-        ],
-        uploadData: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (this.uploadData) {
-                callback();
-              } else {
-                return callback(new Error(`请选择合适的文件`));
-              }
-            },
-            trigger: "change"
-          }
-        ]
-      },
-      // upload
-      format: ["bpmn"],
-      maxSize: 2 * 1024 * 1024,
-      uploadData: null
-    };
-  },
-  methods: {
-    visibleChange() {
-      this.modalForm = { name: "", publish: false };
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    validChange(result) {
-      if (!result.success) {
-        this.uploadData = null;
-        this.$notify.error({ title: "错误提示", message: result.message });
-        this.$refs.modalFormComp.validateField("uploadData");
-      }
-    },
-    fileChange(data) {
-      this.uploadData = data;
-      this.$refs.modalFormComp.validateField("uploadData");
-    },
-    async confirm() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-
-      let formData = new FormData();
-      Object.entries(this.modalForm).forEach(([k, v]) => {
-        formData.append(k, v);
-      });
-      formData.append("file", this.uploadData.file);
-
-      const data = await flowRegister(formData, {
-        md5: this.uploadData.md5
-      }).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
-
-      this.$message.success("添加成功!");
-      this.cancel();
-      this.$emit("modified");
-    }
-  }
-};
-</script>

+ 0 - 164
src/modules/base/components/RuleExam.vue

@@ -1,164 +0,0 @@
-<template>
-  <div class="rule-exam part-box part-box-pad part-box-border">
-    <h4 class="part-box-tips">变量印刷考务字段配置:</h4>
-    <el-form ref="modalFormComp" :model="modalForm" label-width="170px">
-      <el-form-item label="必选字段:" required>
-        <el-checkbox
-          v-for="field in modalForm.requiredFields"
-          :key="field.code"
-          v-model="field.enable"
-          disabled
-          >{{ field.name }}</el-checkbox
-        >
-      </el-form-item>
-      <el-form-item label="扩展字段:">
-        <div class="part-box part-box-pad part-box-border">
-          <div class="label-edit">
-            <div
-              v-for="field in modalForm.extendFields"
-              :key="field.code"
-              class="label-item"
-            >
-              <el-checkbox
-                v-model="field.enable"
-                class="label-item-content"
-                @change="validateExtendFields"
-                >{{ field.name }}</el-checkbox
-              >
-              <i
-                class="label-item-delete el-icon-error"
-                @click="deleteField(field)"
-              ></i>
-            </div>
-            <div class="label-add" @click="toAddField">
-              <i class="el-icon-plus"></i><i>添加</i>
-            </div>
-          </div>
-        </div>
-      </el-form-item>
-      <el-form-item label="是否启用入库审核:" required>
-        <el-switch v-model="modalForm.review" inactive-color="#dcdfe6">
-        </el-switch>
-      </el-form-item>
-      <el-form-item label="入库强制包含试卷:" required>
-        <el-switch v-model="modalForm.includePaper" inactive-color="#dcdfe6">
-        </el-switch>
-        <p class="tips-info">
-          注意:若入库时非强制包含试卷,适用于同时有课程要求打印试卷,有的课程不打印试卷的场景。因此,印刷计划里即使勾选了“试卷”,有试卷则打印,否则不打印。
-        </p>
-      </el-form-item>
-      <el-form-item label="是否启用客服制卡:" required>
-        <el-switch v-model="modalForm.customCard" inactive-color="#dcdfe6">
-        </el-switch>
-      </el-form-item>
-      <el-form-item label="提交印刷方式:" required>
-        <el-radio-group v-model="modalForm.printMethod">
-          <el-radio
-            v-for="(val, key) in CONFIRM_PRINT_TYPE"
-            :key="key"
-            :label="key"
-            >{{ val }}</el-radio
-          >
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item>
-        <el-button
-          type="primary"
-          :disabled="isSubmit"
-          style="width: 140px"
-          @click="submit"
-          >保存</el-button
-        >
-      </el-form-item>
-    </el-form>
-
-    <!-- ModifyField -->
-    <modify-field ref="ModifyField" @confirm="addField"></modify-field>
-  </div>
-</template>
-
-<script>
-import ModifyField from "../components/ModifyField";
-import { CONFIRM_PRINT_TYPE } from "@/constants/enumerate";
-import { examRuleDetail, saveExamRule } from "../api";
-import { getEnums } from "../../login/api";
-
-const initModalForm = {
-  id: null,
-  review: true,
-  includePaper: true,
-  customCard: true,
-  printMethod: "AUTO",
-  requiredFields: "[]",
-  extendFields: "[]"
-};
-
-export default {
-  name: "rule-exam",
-  components: { ModifyField },
-  data() {
-    return {
-      modalForm: { ...initModalForm },
-      isSubmit: false,
-      CONFIRM_PRINT_TYPE
-    };
-  },
-  mounted() {
-    this.init();
-  },
-  methods: {
-    async init() {
-      const requiredFields = await getEnums("REQUIRED_FIELDS");
-      const examRule = await examRuleDetail();
-      this.modalForm = Object.assign(initModalForm, examRule || {});
-      this.modalForm.requiredFields = requiredFields.map(item => {
-        return {
-          code: item.code,
-          name: item.desc,
-          enable: true
-        };
-      });
-      console.log(this.modalForm.extendFields);
-      this.modalForm.extendFields = JSON.parse(this.modalForm.extendFields);
-    },
-    validateRequiredFields() {
-      this.$refs.modalFormComp.validateField("requiredFields");
-    },
-    validateExtendFields() {
-      this.$refs.modalFormComp.validateField("extendFields");
-    },
-    toAddField() {
-      this.$refs.ModifyField.open();
-    },
-    addField(field) {
-      this.modalForm.extendFields.push({ ...field });
-    },
-    deleteField(field) {
-      const index = this.modalForm.extendFields.findIndex(
-        item => item.code === field.code
-      );
-      if (index !== -1) this.modalForm.extendFields.splice(index, 1);
-      this.validateExtendFields();
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      let datas = {
-        ...this.modalForm
-      };
-      datas.requiredFields = JSON.stringify(datas.requiredFields);
-      datas.extendFields = JSON.stringify(datas.extendFields);
-      const data = await saveExamRule(datas).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
-
-      this.modalForm.id = data;
-
-      this.$message.success("保存成功!");
-    }
-  }
-};
-</script>

+ 0 - 158
src/modules/base/components/SelectClassStudent.vue

@@ -1,158 +0,0 @@
-<template>
-  <div class="select-class-student">
-    <el-form ref="FilterForm" label-position="left" inline label-width="0px">
-      <el-form-item>
-        <college-select
-          v-model="filter.collegeId"
-          class="width-200"
-          placeholder="学院"
-          @change="collegeChange"
-        ></college-select>
-      </el-form-item>
-      <el-form-item>
-        <major-select
-          v-model="filter.majorId"
-          class="width-200"
-          :college-id="filter.collegeId"
-          cascader
-          placeholder="专业"
-          @change="majorChange"
-        ></major-select>
-      </el-form-item>
-      <el-form-item>
-        <class-select
-          v-model="filter.clazzId"
-          class="width-200"
-          :major-id="filter.majorId"
-          cascader
-          placeholder="班级"
-          @change="classChange"
-        ></class-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" :disabled="!canSearch" @click="toPage(1)"
-          >查询</el-button
-        >
-      </el-form-item>
-    </el-form>
-    <div class="box-justify mb-2">
-      <p>
-        全部共<span class="mlr-1">{{ dataList.length }}</span
-        >人
-      </p>
-      <p>
-        已选<span class="mlr-1">{{ multipleSelection.length }}</span
-        >人
-      </p>
-    </div>
-    <el-table
-      ref="TableList"
-      :data="dataList"
-      border
-      max-height="440"
-      @selection-change="handleSelectionChange"
-    >
-      <el-table-column
-        type="selection"
-        width="55"
-        align="center"
-      ></el-table-column>
-      <el-table-column
-        type="index"
-        label="序号"
-        width="70"
-        :index="indexMethod"
-      ></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="collegeName" label="学院"></el-table-column>
-      <el-table-column prop="majorName" label="专业"></el-table-column>
-      <el-table-column prop="clazzName" label="班级"></el-table-column>
-    </el-table>
-  </div>
-</template>
-
-<script>
-// import { studentListQuery } from "../api";
-import { unitQueryByType } from "../../base/api";
-
-export default {
-  name: "select-class-student",
-  props: {
-    value: {
-      type: Array,
-      default() {
-        return [];
-      }
-    }
-  },
-  data() {
-    return {
-      filter: {
-        collegeId: "",
-        majorId: "",
-        clazzId: ""
-      },
-      filterNames: {
-        collegeName: "",
-        majorName: "",
-        clazzName: ""
-      },
-      dataList: [],
-      multipleSelection: []
-    };
-  },
-  computed: {
-    canSearch() {
-      return (
-        this.filter.collegeId && this.filter.majorId && this.filter.clazzId
-      );
-    }
-  },
-  methods: {
-    async getList() {
-      const datas = {
-        ...this.filter
-      };
-      const data = await unitQueryByType(datas, "STUDENT");
-      this.dataList = data || [];
-      this.dataList = this.dataList.map(item => {
-        return {
-          id: item.id,
-          studentName: item.name,
-          studentCode: item.code,
-          ...this.filterNames
-        };
-      });
-    },
-    toPage(page) {
-      if (!this.canSearch) return;
-
-      this.current = page;
-      this.getList();
-      this.multipleSelection = [];
-      this.emitChange();
-    },
-    handleSelectionChange(val) {
-      this.multipleSelection = val.map(item => item.id);
-      this.emitChange();
-    },
-    collegeChange(val) {
-      this.filterNames.collegeName = val.name;
-    },
-    majorChange(val) {
-      this.filterNames.majorName = val.name;
-    },
-    classChange(val) {
-      this.filterNames.clazzName = val.name;
-    },
-    emitChange() {
-      this.$emit("input", this.multipleSelection);
-      this.$emit("change", this.multipleSelection);
-    },
-    clearSelection() {
-      this.$refs.TableList.clearSelection();
-    }
-  }
-};
-</script>

+ 0 - 157
src/modules/base/components/SelectOrgs.vue

@@ -1,157 +0,0 @@
-<template>
-  <div
-    :class="[
-      'select-orgs part-box part-box-pad part-box-border',
-      { 'select-orgs-disabled': disabled }
-    ]"
-  >
-    <el-tree
-      :data="orgs"
-      show-checkbox
-      default-expand-all
-      node-key="id"
-      ref="MenuTree"
-      :props="defaultProps"
-      :check-strictly="checkStrictly"
-      check-on-click-node
-      :expand-on-click-node="false"
-      @check="checkClick"
-      @check-change="checkChange"
-    >
-    </el-tree>
-  </div>
-</template>
-
-<script>
-import { organizationList } from "../api";
-
-export default {
-  name: "select-orgs",
-  props: {
-    value: {
-      type: Array,
-      default() {
-        return [];
-      }
-    },
-    multiple: {
-      type: Boolean,
-      default: true
-    },
-    disabled: {
-      type: Boolean,
-      default: false
-    },
-    checkStrictly: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data() {
-    return {
-      selectedOrgs: [],
-      // orgs: [],
-      orgs: [],
-      leafOrgIds: [],
-      defaultProps: {
-        label: "name"
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  watch: {
-    value(val, oldVal) {
-      if (val.join() !== oldVal.join()) this.setCheckedNode(val);
-    }
-  },
-  methods: {
-    async getList() {
-      const orgs = await organizationList();
-      this.orgs = orgs || [];
-
-      if (this.orgs.length) {
-        this.orgs[0].children.sort((a, b) => {
-          if (a.type === "PRINTING_HOUSE") return 1;
-          if (b.type === "PRINTING_HOUSE") return -1;
-
-          return 0;
-        });
-      }
-
-      let leafOrgIds = [];
-      const getLeafOrg = orgs => {
-        orgs.forEach(org => {
-          org.disabled = false;
-          if (org["children"] && org["children"].length) {
-            getLeafOrg(org.children);
-          } else {
-            leafOrgIds.push(org.id);
-          }
-        });
-      };
-      getLeafOrg(this.orgs);
-      this.leafOrgIds = leafOrgIds;
-
-      this.$nextTick(() => {
-        this.setCheckedNode(this.value);
-      });
-    },
-    setDisabledOrgs(disabledOrgIds) {
-      const updateInfo = orgs => {
-        orgs.forEach(org => {
-          org.disabled = disabledOrgIds.includes(org.id);
-          if (org["children"] && org["children"].length) {
-            updateInfo(org.children);
-          }
-        });
-      };
-      updateInfo(this.orgs);
-    },
-    setCheckedNode(selectedIds) {
-      if (this.multiple) {
-        const leafSelectedIds = selectedIds.filter(id =>
-          this.leafOrgIds.includes(id)
-        );
-        this.$refs.MenuTree.setCheckedKeys(leafSelectedIds);
-        return;
-      }
-      const selectedOrgs = this.$refs.MenuTree.getCheckedKeys();
-      if (selectedOrgs.join() === selectedIds.join()) return;
-
-      this.$refs.MenuTree.setCheckedKeys(selectedIds);
-    },
-    getCheckedNode() {
-      return this.$refs.MenuTree.getCheckedKeys();
-    },
-    checkChange() {
-      if (!this.multiple) return;
-
-      const halfCheckedIds = this.$refs.MenuTree.getHalfCheckedKeys();
-      const checkedIds = this.$refs.MenuTree.getCheckedKeys();
-      const checkedOrgs = [...halfCheckedIds, ...checkedIds];
-
-      this.emitChange(checkedOrgs);
-    },
-    checkClick(data) {
-      if (this.multiple) return;
-
-      const checkedIds = this.$refs.MenuTree.getCheckedKeys();
-      // console.log(checkedIds);
-      // console.log(data.id);
-      if (!checkedIds.includes(data.id)) {
-        this.emitChange([]);
-        return;
-      }
-      const selectedOrgs = [data.id];
-      this.$refs.MenuTree.setCheckedKeys([data.id]);
-      this.emitChange(selectedOrgs);
-    },
-    emitChange(vals) {
-      this.$emit("input", vals);
-      this.$emit("change", vals);
-    }
-  }
-};
-</script>

+ 0 - 152
src/modules/base/components/SelectRoleDialog.vue

@@ -1,152 +0,0 @@
-<template>
-  <el-dialog
-    class="select-user-dialog"
-    :visible.sync="modalIsShow"
-    title="选择角色"
-    top="10px"
-    width="600px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @opened="visibleChange"
-  >
-    <el-row type="flex" :gutter="10">
-      <el-col :span="12">
-        <div class="user-part-title">角色</div>
-        <div class="user-search">
-          <el-input
-            v-model="filterLabel"
-            placeholder="请输入角色名称"
-            clearable
-            size="mini"
-            prefix-icon="el-icon-search"
-            @input="labelChange"
-          ></el-input>
-        </div>
-        <div class="user-tree">
-          <el-tree
-            ref="RoleTree"
-            :data="roleTree"
-            show-checkbox
-            check-on-click-node
-            node-key="id"
-            :default-checked-keys="selectedRoleIds"
-            :props="defaultProps"
-            @check="roleChange"
-          >
-          </el-tree>
-        </div>
-      </el-col>
-      <el-col :span="12">
-        <div class="user-part-title">已选范围</div>
-        <div class="user-list">
-          <div v-for="role in selectedRoles" :key="role.id" class="user-item">
-            <p class="user-cont">
-              <span>{{ role.name }}</span
-              ><span>{{ role.phoneNumber }}</span>
-            </p>
-            <el-button
-              class="user-delete"
-              type="text"
-              icon="el-icon-remove"
-              @click="toDeleteRole(role)"
-            ></el-button>
-          </div>
-        </div>
-      </el-col>
-    </el-row>
-
-    <div slot="footer">
-      <el-button type="primary" @click="submit">确认</el-button>
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { userRoleListPage } from "../api";
-
-export default {
-  name: "select-role-dialog",
-  props: {
-    data: {
-      type: Array,
-      default() {
-        return [];
-      }
-    },
-    multiple: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      filterLabel: "",
-      roles: [],
-      roleTree: [],
-      selectedRoles: [],
-      selectedRoleIds: [],
-      defaultProps: {
-        children: "children",
-        label: "name"
-      }
-    };
-  },
-  mounted() {
-    this.getRoles();
-  },
-  methods: {
-    async getRoles() {
-      const data = await userRoleListPage();
-      this.roles = data || [];
-      this.roles = this.roles.filter(item => item.type !== "ADMIN");
-
-      this.labelChange();
-    },
-    labelChange() {
-      const escapeRegexpString = (value = "") =>
-        String(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
-      const reg = new RegExp(escapeRegexpString(this.filterLabel), "i");
-
-      this.roleTree = this.roles.filter(item => reg.test(item.name));
-    },
-    visibleChange() {
-      this.filterLabel = "";
-      this.labelChange();
-      this.selectedRoles = this.data;
-      this.selectedRoleIds = this.data.map(item => item.id);
-      this.$refs.RoleTree.setCheckedKeys(this.selectedRoleIds);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    roleChange(data) {
-      if (!this.multiple) {
-        this.$refs.RoleTree.setCheckedKeys([data.id]);
-      }
-      this.selectedRoles = this.$refs.RoleTree.getCheckedNodes(true);
-      this.selectedRoleIds = this.selectedRoles.map(item => item.id);
-    },
-    toDeleteRole(role) {
-      const pos = this.selectedRoles.findIndex(item => item.id === role.id);
-      this.selectedRoles.splice(pos, 1);
-      this.selectedRoleIds = this.selectedRoles.map(item => item.id);
-      this.$refs.RoleTree.setCheckedKeys(this.selectedRoleIds);
-    },
-    submit() {
-      if (!this.selectedRoles.length) {
-        this.$message.error("请选择角色");
-        return;
-      }
-
-      this.$emit("modified", this.selectedRoles);
-      this.cancel();
-    }
-  }
-};
-</script>

+ 0 - 420
src/modules/base/components/SelectUserDialog.vue

@@ -1,420 +0,0 @@
-<template>
-  <el-dialog
-    class="select-user-dialog"
-    :visible.sync="modalIsShow"
-    title="添加用户"
-    top="10px"
-    width="600px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @opened="visibleChange"
-  >
-    <el-row type="flex" :gutter="10">
-      <el-col :span="12">
-        <div class="user-search">
-          <el-input
-            v-model="filterLabel"
-            placeholder="请输入角色名称"
-            clearable
-            size="mini"
-            prefix-icon="el-icon-search"
-            @input="labelChange"
-          ></el-input>
-        </div>
-        <div class="user-types">
-          <div
-            :class="['user-type', { 'is-active': userType === 'org' }]"
-            @click="switchUserType('org')"
-          >
-            组织架构
-          </div>
-          <div
-            :class="['user-type', { 'is-active': userType === 'role' }]"
-            @click="switchUserType('role')"
-          >
-            角色
-          </div>
-        </div>
-        <div class="user-tree">
-          <el-tree
-            ref="UserTree"
-            :data="userTree"
-            node-key="id"
-            :default-checked-keys="selectedUserIds"
-            :props="defaultProps"
-          >
-            <span class="custom-tree-node" slot-scope="{ node, data }">
-              <el-checkbox
-                v-if="data.isUser"
-                v-model="node.checked"
-                @change="checked => userChange(checked, data)"
-              >
-                {{ node.label }}
-              </el-checkbox>
-              <span v-else>{{ node.label }}</span>
-              <el-checkbox
-                v-if="!data.isUser && canSelectAll && data.children.length"
-                v-model="data.selected"
-                @change="checked => selectNodeAll(checked, data)"
-              ></el-checkbox>
-            </span>
-          </el-tree>
-        </div>
-      </el-col>
-      <el-col :span="12">
-        <div class="user-part-title">已选范围</div>
-        <div class="user-list">
-          <div v-for="user in selectedUsers" :key="user.id" class="user-item">
-            <p class="user-cont">
-              <span>{{ user.label }}</span>
-            </p>
-            <el-button
-              class="user-delete"
-              type="text"
-              icon="el-icon-remove"
-              @click="toDeleteUser(user)"
-            ></el-button>
-          </div>
-        </div>
-      </el-col>
-    </el-row>
-    <p v-show="!selectValid" class="tips-info tips-error">
-      选择用户数不能超过{{ userLimitCount }}
-    </p>
-
-    <div slot="footer">
-      <el-button type="primary" :disabled="!selectValid" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { organizationList } from "../api";
-
-export default {
-  name: "select-user-dialog",
-  props: {
-    users: {
-      type: Array,
-      default() {
-        return [];
-      }
-    },
-    userLimitCount: {
-      type: Number,
-      default: 5
-    },
-    canSelectAll: {
-      type: Boolean,
-      default: false
-    },
-    filterRoles: {
-      type: Array,
-      default() {
-        // id 数组
-        return [];
-      }
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      filterLabel: "",
-      userType: "org",
-      orgData: [],
-      orgUsers: [],
-      roleUsers: [],
-      userTree: [],
-      userList: [],
-      selectedUsers: [],
-      selectedRoleUserIds: [],
-      selectedUserIds: [],
-      selectValid: true,
-      defaultProps: {
-        children: "children",
-        label: "label"
-      }
-    };
-  },
-  methods: {
-    async getOrgData() {
-      const data = await organizationList();
-      this.orgData = data;
-    },
-    parseUserData(data) {
-      let roleUserMap = {};
-      const parseUser = list => {
-        return list.map(item => {
-          // org
-          let nitem = {
-            id: item.id,
-            label: item.name,
-            isUser: false,
-            selected: false,
-            children: []
-          };
-
-          if (item["children"] && item["children"].length) {
-            nitem.children = [...nitem.children, ...parseUser(item.children)];
-          }
-          // user
-          if (item["sysUserList"] && item["sysUserList"].length) {
-            let sysUserList = item.sysUserList;
-            // 过滤符合需求角色的用户
-            if (this.filterRoles.length) {
-              sysUserList = sysUserList.filter(
-                user =>
-                  user.roleResultList &&
-                  user.roleResultList.some(role =>
-                    this.filterRoles.includes(role.roleId)
-                  )
-              );
-            }
-            const users = sysUserList.map(user => {
-              const nuser = {
-                id: user.id,
-                userId: user.id,
-                label: user.realName,
-                name: user.realName,
-                orgName: item.name,
-                selected: false,
-                isUser: true
-              };
-              if (user.roleResultList && user.roleResultList.length) {
-                user.roleResultList.forEach(urole => {
-                  if (!roleUserMap[urole.roleId]) {
-                    roleUserMap[urole.roleId] = {
-                      id: urole.roleId,
-                      label: urole.roleName,
-                      selected: false,
-                      isUser: false,
-                      children: []
-                    };
-                  }
-
-                  let ruser = { ...nuser };
-                  ruser.id = `${ruser.id}_${this.$randomCode()}`;
-                  ruser.label = `${ruser.name}(${ruser.orgName})`;
-                  roleUserMap[urole.roleId].children.push(ruser);
-                });
-              }
-              return nuser;
-            });
-            nitem.children = [...nitem.children, ...users];
-          }
-          return nitem;
-        });
-      };
-      this.orgUsers = parseUser(data);
-      this.roleUsers = Object.values(roleUserMap);
-      this.userTree = this.orgUsers;
-      this.getUserList();
-    },
-    getUserList() {
-      let userList = [];
-      const fetchUser = users => {
-        users.forEach(item => {
-          if (item["children"] && item["children"].length) {
-            fetchUser(item.children);
-          } else {
-            if (item.isUser) {
-              let nitem = { ...item };
-              nitem.label = `${nitem.name}(${nitem.orgName})`;
-              userList.push(nitem);
-            }
-          }
-        });
-      };
-      fetchUser(this.orgUsers);
-
-      this.userList = userList;
-    },
-    labelChange() {
-      if (!this.filterLabel) {
-        this.switchUserType(this.userType);
-      } else {
-        const escapeRegexpString = (value = "") =>
-          String(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
-        const reg = new RegExp(escapeRegexpString(this.filterLabel), "i");
-
-        this.userTree = this.userList.filter(item => reg.test(item.name));
-        this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-      }
-    },
-    checkValid() {
-      this.selectValid =
-        !this.userLimitCount ||
-        this.selectedUsers.length <= this.userLimitCount;
-    },
-    async visibleChange() {
-      if (!this.orgUsers.length) await this.getOrgData();
-      this.parseUserData(this.orgData);
-
-      this.filterLabel = "";
-      this.userType = "org";
-      this.userTree = this.orgUsers;
-      this.selectedUsers = this.users.map(user => {
-        const luser = this.userList.find(item => item.id === user.id);
-        return {
-          id: user.id,
-          name: user.name,
-          label: `${user.name}(${luser.orgName})`
-        };
-      });
-      this.selectedUserIds = this.users.map(item => item.id);
-      this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-      this.checkValid();
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    selectNodeAll(checked, data) {
-      let userIds = [];
-      const getUserIds = list => {
-        list.forEach(item => {
-          item.selected = checked;
-          if (item.children && item.children.length) {
-            getUserIds(item.children);
-          } else {
-            if (item.isUser) userIds.push(item.userId);
-          }
-        });
-      };
-      getUserIds(data.children);
-
-      userIds.forEach(userId => {
-        const userPos = this.selectedUserIds.indexOf(userId);
-        const includeUser = userPos !== -1;
-        if (checked) {
-          if (!includeUser) this.selectedUserIds.push(userId);
-        } else {
-          if (includeUser) {
-            this.selectedUserIds.splice(userPos, 1);
-          }
-        }
-      });
-      if (this.userType === "role") {
-        this.updateSelectRoleUserIds();
-      } else {
-        this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-      }
-      this.updateSelectedUsersFromUserIds();
-    },
-    switchUserType(type) {
-      this.userType = type;
-      this.userTree = type === "org" ? this.orgUsers : this.roleUsers;
-
-      if (type === "role") {
-        this.updateSelectRoleUserIds();
-      }
-    },
-    updateSelectRoleUserIds() {
-      let selectedRoleUserIds = [];
-      this.roleUsers.forEach(role => {
-        role.children.forEach(user => {
-          if (this.selectedUserIds.includes(user.userId))
-            selectedRoleUserIds.push(user.id);
-        });
-      });
-      this.selectedRoleUserIds = selectedRoleUserIds;
-      this.$refs.UserTree.setCheckedKeys(selectedRoleUserIds);
-    },
-    updateSelectedUsersFromUserIds() {
-      this.selectedUsers = this.userList.filter(user =>
-        this.selectedUserIds.includes(user.id)
-      );
-    },
-    userChange(checked, curUser) {
-      if (this.filterLabel) {
-        let prevSelectUserIds = this.selectedUsers.map(item => item.id);
-        const prevUserListSelectUserIds = this.userTree
-          .filter(user => prevSelectUserIds.includes(user.id))
-          .map(user => user.id);
-        const selectedUsers = this.$refs.UserTree.getCheckedNodes(true);
-        const sIds = selectedUsers.map(user => user.id);
-        const prevDeletedUserIds = prevUserListSelectUserIds.filter(
-          uid => !sIds.includes(uid)
-        );
-        this.selectedUsers = this.selectedUsers.filter(
-          user => !prevDeletedUserIds.includes(user.id)
-        );
-        prevSelectUserIds = this.selectedUsers.map(item => item.id);
-
-        selectedUsers.forEach(user => {
-          if (prevSelectUserIds.includes(user.id)) return;
-          const nuser = {
-            id: user.id,
-            name: user.name,
-            label: `${user.name}(${user.orgName})`
-          };
-          this.selectedUsers.push(nuser);
-        });
-        this.selectedUserIds = this.selectedUsers.map(item => item.id);
-        this.checkValid();
-        return;
-      }
-
-      if (this.userType === "org") {
-        const selectedUsers = this.$refs.UserTree.getCheckedNodes(true);
-        this.selectedUsers = selectedUsers.map(user => {
-          const nuser = {
-            id: user.id,
-            name: user.name,
-            label: `${user.name}(${user.orgName})`
-          };
-          return nuser;
-        });
-        this.selectedUserIds = this.selectedUsers.map(item => item.id);
-        this.checkValid();
-        return;
-      }
-
-      if (this.userType === "role") {
-        if (checked) {
-          if (!this.selectedUserIds.includes(curUser.userId))
-            this.selectedUserIds.push(curUser.userId);
-        } else {
-          this.selectedUserIds = this.selectedUserIds.filter(
-            userid => userid !== curUser.userId
-          );
-        }
-        this.updateSelectRoleUserIds();
-        this.updateSelectedUsersFromUserIds();
-        this.checkValid();
-      }
-    },
-    toDeleteUser(user) {
-      const pos = this.selectedUsers.findIndex(item => item.id === user.id);
-      this.selectedUsers.splice(pos, 1);
-      this.selectedUserIds = this.selectedUsers.map(item => item.id);
-      if (this.userType === "role") {
-        this.updateSelectRoleUserIds();
-      } else {
-        this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-      }
-      this.checkValid();
-    },
-    submit() {
-      if (!this.selectValid) return;
-
-      this.$emit(
-        "modified",
-        this.selectedUsers.map(item => {
-          return {
-            id: item.id,
-            name: item.name
-          };
-        })
-      );
-      this.cancel();
-    }
-  }
-};
-</script>

+ 121 - 0
src/modules/base/components/SignDownloadData.vue

@@ -0,0 +1,121 @@
+<template>
+  <el-dialog
+    class="sign-download-data"
+    :visible.sync="modalIsShow"
+    title="标记用途"
+    top="10vh"
+    width="500px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="70px"
+    >
+      <el-form-item prop="used" label="是否使用:">
+        <el-radio-group v-model="modalForm.used">
+          <el-radio
+            v-for="(val, key) in BOOLEAN_TYPE"
+            :key="key"
+            :label="key * 1"
+            >{{ val }}</el-radio
+          >
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="下载用途:">
+        <el-select v-model="modalForm.useType" placeholder="下载用途" clearable>
+          <el-option
+            v-for="(val, key) in USE_TYPE"
+            :key="key"
+            :value="key"
+            :label="val"
+          ></el-option>
+        </el-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 { USE_TYPE, BOOLEAN_TYPE } from "../../../constants/enumerate";
+import { signPurpose } from "../api";
+
+const initModalForm = {
+  used: 1,
+  useType: null
+};
+
+export default {
+  name: "sign-download-data",
+  props: {
+    ids: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      USE_TYPE,
+      BOOLEAN_TYPE,
+      modalForm: {},
+      rules: {
+        used: [
+          {
+            required: true,
+            message: "请选择是否使用",
+            trigger: "change"
+          }
+        ],
+        useType: [
+          {
+            required: true,
+            message: "请选择下载用途",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    visibleChange() {
+      this.modalForm = { ...initModalForm };
+    },
+    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 datas = { ...this.modalForm, ids: this.ids };
+      const data = await signPurpose(datas).catch(() => {});
+      this.isSubmit = false;
+      if (!data) return;
+
+      this.$message.success("操作成功!");
+      this.cancel();
+      this.$emit("modified");
+    }
+  }
+};
+</script>

+ 32 - 178
src/modules/base/views/BusinessDataManage.vue

@@ -2,32 +2,13 @@
   <div class="print-plan-push-manage">
     <div class="part-box part-box-filter part-box-flex">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <el-form-item label="使用学期:">
-          <el-select
-            v-model.trim="filter.semesterId"
-            placeholder="请选择使用学期"
-            clearable
+        <el-form-item label="同步日期:">
+          <el-date-picker
+            v-model="filter.syncTime"
+            type="date"
+            value-format="timestamp"
           >
-            <el-option
-              v-for="item in semesters"
-              :key="item.id"
-              :value="item.id"
-              :label="item.name"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="考试:">
-          <exam-select
-            v-model="filter.examId"
-            :semester-id="filter.semesterId"
-          ></exam-select>
-        </el-form-item>
-        <el-form-item label="印刷计划:">
-          <print-plan-select
-            v-model.trim="filter.printPlanId"
-            placeholder="印刷计划"
-            clearable
-          ></print-plan-select>
+          </el-date-picker>
         </el-form-item>
         <el-form-item label-width="0px">
           <el-button type="primary" @click="search">查询</el-button>
@@ -37,87 +18,36 @@
         <el-button
           icon="el-icon-circle-plus-outline"
           type="primary"
-          :disabled="loading"
-          @click="toBatchPush"
+          @click="toSync"
         >
-          批量推送
-        </el-button>
-        <el-button icon="el-icon-circle-plus-outline" @click="toMergePush">
-          合并推送印刷计划
+          人工同步数据
         </el-button>
       </div>
     </div>
 
     <div class="part-box part-box-pad">
-      <el-table
-        ref="TableList"
-        :data="dataList"
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column
-          type="selection"
-          width="55"
-          align="center"
-          :selectable="row => row.canPush"
-        ></el-table-column>
-        <el-table-column prop="name" label="印刷计划"></el-table-column>
-        <el-table-column prop="examStartTime" label="考试开始时间">
-          <span slot-scope="scope">{{
-            scope.row.examStartTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="examEndTime" label="考试结束时间">
-          <span slot-scope="scope">{{
-            scope.row.examEndTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="status" label="计划状态" width="100">
-          <span slot-scope="scope">
-            {{ scope.row.status | printPlanStatusFilter }}
-          </span>
-        </el-table-column>
-        <el-table-column prop="totalGates" label="总门次" width="80">
-        </el-table-column>
-        <el-table-column prop="totalSubjects" label="总科次" width="80">
-        </el-table-column>
-        <el-table-column prop="totalPackages" label="总卷袋数" width="100">
-        </el-table-column>
-        <el-table-column prop="createTime" label="创建时间">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column prop="syncTime" label="同步日期">
           <span slot-scope="scope">{{
-            scope.row.createTime | timestampFilter
+            scope.row.syncTime | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column prop="createName" label="创建人"></el-table-column>
-        <el-table-column prop="thirdRelateName" label="考试名称">
-          <span slot-scope="scope">{{
-            scope.row.thirdRelateName | defaultFieldFilter
-          }}</span>
+        <el-table-column prop="schoolName" label="学校" width="80">
         </el-table-column>
-        <el-table-column prop="thirdRelateId" label="考试ID">
-          <span slot-scope="scope">{{
-            scope.row.thirdRelateId | defaultFieldFilter
-          }}</span>
+        <el-table-column prop="totalSubjects" label="学期" width="80">
         </el-table-column>
-        <el-table-column prop="syncStatus" label="同步状态">
-          <span slot-scope="scope">{{
-            scope.row.syncStatus | syncPrintStatusFilter
-          }}</span>
+        <el-table-column prop="totalPackages" label="考试类型" width="100">
         </el-table-column>
+        <el-table-column prop="createName" label="学院数量"></el-table-column>
+        <el-table-column prop="createName" label="科目门数"></el-table-column>
+        <el-table-column prop="createName" label="考试科次"></el-table-column>
         <el-table-column class-name="action-column" label="操作" width="120px">
           <template slot-scope="scope">
             <el-button
               class="btn-primary"
               type="text"
-              @click="toPreview(scope.row)"
-              >查看</el-button
-            >
-            <el-button
-              v-if="scope.row.canPush"
-              class="btn-primary"
-              type="text"
-              :disabled="loading"
-              @click="toPush(scope.row)"
-              >推送</el-button
+              @click="toDownload(scope.row)"
+              >下载</el-button
             >
           </template>
         </el-table-column>
@@ -134,135 +64,59 @@
         </el-pagination>
       </div>
     </div>
-
-    <!-- MergePushDialog -->
-    <merge-push-dialog
-      ref="MergePushDialog"
-      :ids="multipleSelection"
-      @modified="mergePushed"
-    ></merge-push-dialog>
   </div>
 </template>
 
 <script>
-import {
-  printPlanPushListQuery,
-  printPlanBatchPush,
-  printPlanPush
-} from "../api";
-import { examSemesterList } from "../../base/api";
-import MergePushDialog from "../components/MergePushDialog";
+import { businessDataList, downloadBusinessData } from "../api";
 
 export default {
-  name: "print-plan-push-manage",
-  components: { MergePushDialog },
+  name: "business-data-manage",
   data() {
     return {
       filter: {
-        semesterId: "",
-        printPlanId: "",
-        examId: ""
+        syncTime: ""
       },
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
       loading: false,
-      semesters: [],
-      dataList: [],
-      curPrintPlan: {},
-      multipleSelection: []
+      dataList: []
     };
   },
   mounted() {
-    this.initData();
+    // this.search();
   },
   methods: {
-    async initData() {
-      await this.getSemesters();
-      await this.getList();
-    },
     async getList() {
       const datas = {
         ...this.filter,
         pageNumber: this.current,
         pageSize: this.size
       };
-      const data = await printPlanPushListQuery(datas);
+      const data = await businessDataList(datas);
       this.dataList = data.records;
       this.total = data.total;
     },
     toPage(page) {
-      this.multipleSelection = [];
       this.current = page;
       this.getList();
     },
     search() {
       this.toPage(1);
     },
-    async getSemesters() {
-      const res = await examSemesterList({});
-      this.semesters = res || [];
-      if (!this.semesters.length) return;
-
-      let curSemester = this.semesters.find(item => item.inUsed);
-      curSemester = curSemester || this.semesters[0];
-      this.filter.semesterId = curSemester.id;
-    },
-    handleSelectionChange(val) {
-      this.multipleSelection = val.map(item => item.id);
-    },
-    async toBatchPush() {
-      if (this.loading) return;
-      if (!this.multipleSelection.length) {
-        this.$message.error("请选择要批量推送的数据");
-        return;
-      }
-      const result = await this.$confirm("确定要推送选中的计划吗?", "提示", {
-        type: "warning"
-      }).catch(() => {});
-      if (result !== "confirm") return;
-
-      this.loading = true;
-      const data = await printPlanBatchPush(
-        this.multipleSelection
-      ).catch(() => {});
-      this.loading = false;
-      if (!data) return;
-
-      this.$message.success("提交成功!");
-      this.toPage(this.current);
-    },
-    toMergePush() {
-      if (!this.multipleSelection.length) {
-        this.$message.error("请选择要合并推送的数据");
-        return;
-      }
-      this.$refs.MergePushDialog.open();
-    },
-    mergePushed() {
-      this.toPage(this.current);
-    },
-    toPreview(row) {
-      this.curPrintPlan = row;
-      this.$refs.ModifyPrintPlan.open();
-    },
-    async toPush(row) {
+    toSync() {},
+    async toDownload(row) {
       if (this.loading) return;
-      const result = await this.$confirm("确定要推送当前计划吗?", "提示", {
-        type: "warning"
-      }).catch(() => {});
-      if (result !== "confirm") return;
-
       this.loading = true;
-      const data = await printPlanPush({
-        printPlanId: row.id,
-        thirdRelateId: row.thirdRelateId
-      }).catch(() => {});
+      const data = await downloadBusinessData(row.id).catch(() => {});
       this.loading = false;
       if (!data) return;
 
-      this.$message.success("提交成功!");
-      this.toPage(this.current);
+      this.$message.success(
+        "已开始下载,下载需要时间,请稍后到【下载列表】模块中查看数据"
+      );
+      this.getList();
     }
   }
 };

+ 73 - 172
src/modules/base/views/DownloadManage.vue

@@ -2,131 +2,74 @@
   <div class="student-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
-            style="width: 142px;"
-            v-model.trim="filter.queryParams"
-            placeholder="姓名/学号"
-            clearable
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="校区:">
-          <campus-select
-            v-model="filter.campusId"
-            placeholder="校区"
-            clearable
-            @change="campusChange"
-          ></campus-select>
-        </el-form-item>
-        <el-form-item label="学院:">
-          <college-select
-            v-model="filter.collegeId"
-            placeholder="学院"
-          ></college-select>
+        <el-form-item label="下载时间:">
+          <el-date-picker
+            v-model="filter.downloadTime"
+            type="date"
+            placeholder="下载时间"
+            value-format="timestamp"
+          >
+          </el-date-picker>
         </el-form-item>
-        <el-form-item label="专业:">
-          <major-select
-            v-model="filter.majorId"
-            :college-id="filter.collegeId"
-            cascader
-            placeholder="专业"
-          ></major-select>
+        <el-form-item label="是否使用:">
+          <el-select v-model="filter.used" placeholder="是否使用" clearable>
+            <el-option
+              v-for="(val, key) in BOOLEAN_TYPE"
+              :key="key"
+              :value="key * 1"
+              :label="val"
+            ></el-option>
+          </el-select>
         </el-form-item>
-        <el-form-item label="班级:">
-          <class-select
-            v-model="filter.clazzId"
-            :major-id="filter.majorId"
-            cascader
-            placeholder="班级"
-          ></class-select>
+        <el-form-item label="下载用途:">
+          <el-select v-model="filter.useType" placeholder="下载用途" clearable>
+            <el-option
+              v-for="(val, key) in USE_TYPE"
+              :key="key"
+              :value="key"
+              :label="val"
+            ></el-option>
+          </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="toPage(1)"
-            >查询</el-button
-          >
+          <el-button type="primary" @click="toPage(1)">查询</el-button>
         </el-form-item>
       </el-form>
       <div class="part-box-action">
-        <el-button
-          v-if="checkPrivilege('button', 'delete')"
-          type="danger"
-          icon="el-icon-delete"
-          :disabled="!filterHasQuery"
-          @click="toBatchDelete"
-          >批量删除</el-button
-        >
-        <el-button
-          type="success"
-          icon="el-icon-download"
-          v-if="checkPrivilege('button', 'import')"
-          ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
-        >
-        <upload-button
-          v-if="checkPrivilege('button', 'import')"
-          btn-icon="el-icon-circle-plus-outline"
-          btn-content="批量导入"
-          btn-type="success"
-          :upload-url="uploadUrl"
-          :format="['xls', 'xlsx']"
-          accept=".xls,.xlsx"
-          @valid-error="validError"
-          @upload-success="uploadSuccess"
-        >
-        </upload-button>
-        <el-button
-          v-if="checkPrivilege('button', 'add')"
-          type="primary"
-          icon="el-icon-circle-plus-outline"
-          @click="toAdd"
-          >新增学生</el-button
+        <el-button type="primary" icon="el-icon-delete" @click="toSign"
+          >标记用途</el-button
         >
       </div>
     </div>
     <div class="part-box part-box-pad">
-      <el-table ref="TableList" :data="dataList">
+      <el-table
+        ref="TableList"
+        :data="dataList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55" align="center">
+        </el-table-column>
         <el-table-column
           type="index"
           label="序号"
           width="70"
           :index="indexMethod"
         ></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="phoneNumber" label="手机号">
-          <span slot-scope="scope">{{
-            scope.row.phoneNumber | defaultFieldFilter
-          }}</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="创建时间">
+        <el-table-column prop="downloadTime" label="下载时间">
           <span slot-scope="scope">{{
-            scope.row.createTime | timestampFilter
+            scope.row.downloadTime | 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-column prop="studentCode" label="下载人员"></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="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="clazz" label="科目门数"></el-table-column>
+        <el-table-column prop="clazz" label="考试科次"></el-table-column>
+        <el-table-column prop="clazz" label="是否使用"></el-table-column>
+        <el-table-column prop="clazz" label="下载使用"></el-table-column>
       </el-table>
       <div class="part-page">
         <el-pagination
@@ -141,111 +84,69 @@
       </div>
     </div>
 
-    <modify-student
-      :instance="curRow"
+    <!-- SignDownloadData -->
+    <sign-download-data
+      ref="SignDownloadData"
+      :ids="multipleSelection"
       @modified="getList"
-      ref="ModifyStudent"
-    ></modify-student>
+    ></sign-download-data>
   </div>
 </template>
 
 <script>
-import { studentListQuery, deleteStudent, deleteFilterStudent } from "../api";
-import ModifyStudent from "../components/ModifyStudent";
-import UploadButton from "../../../components/UploadButton";
+import { USE_TYPE, BOOLEAN_TYPE } from "../../../constants/enumerate";
+import { downloadList } from "../api";
+import SignDownloadData from "../components/SignDownloadData.vue";
 
 export default {
   name: "student-manage",
-  components: { ModifyStudent, UploadButton },
+  components: { SignDownloadData },
   data() {
     return {
       filter: {
-        queryParams: "",
-        campusId: "",
-        collegeId: "",
-        majorId: "",
-        clazzId: ""
+        downloadTime: "",
+        used: null,
+        useType: null
       },
-      queriedFilter: {},
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
       dataList: [],
       curRow: {},
-      // import
-      uploadUrl: "/api/admin/basic/student/data_import",
-      downloadUrl: "/temps/studentTemplate.xlsx",
-      dfilename: "学生导入模板.xlsx"
+      BOOLEAN_TYPE,
+      USE_TYPE,
+      multipleSelection: []
     };
   },
-  computed: {
-    filterHasQuery() {
-      return !Object.keys(this.filter).some(
-        k => this.filter[k] !== this.queriedFilter[k]
-      );
-    }
-  },
   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 studentListQuery(datas);
+      const data = await downloadList(datas);
       this.dataList = data.records;
       this.total = data.total;
       this.queriedFilter = { ...this.filter };
     },
     toPage(page) {
+      this.multipleSelection = [];
       this.current = page;
       this.getList();
     },
-    campusChange() {
-      this.filter.clazzId = "";
-    },
-    toAdd() {
-      this.curRow = {};
-      this.$refs.ModifyStudent.open();
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
     },
-    toEdit(row) {
-      this.curRow = row;
-      this.$refs.ModifyStudent.open();
-    },
-    toBatchDelete() {
-      this.$confirm(`确定要根据设置的筛选条件删除所有数据吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          await deleteFilterStudent(this.filter);
-          this.$message.success("删除成功!");
-          this.toPage(1);
-        })
-        .catch(() => {});
-    },
-    toDelete(row) {
-      this.$confirm(`确定要删除学生【${row.studentName}】吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          await deleteStudent([row.id]);
-          this.$message.success("删除成功!");
-          this.deletePageLastItem();
-        })
-        .catch(() => {});
-    },
-    // import
-    validError(errorData) {
-      this.$message.error(errorData.message);
-    },
-    uploadSuccess() {
-      this.$message.success("文件上传成功,后台正在导入!");
-      this.getList();
+    toSign() {
+      if (!this.multipleSelection.length) {
+        this.$message.error("请先选择数据!");
+        return;
+      }
+      this.$refs.SignDownloadData.open();
     }
   }
 };

+ 0 - 18
src/modules/login/views/ForgetPwd.vue

@@ -10,16 +10,6 @@
           :model="modalForm"
           :rules="forgetPswdRules"
         >
-          <el-form-item prop="username">
-            <el-input
-              v-model.trim="modalForm.username"
-              prefix-icon="el-icon-user"
-              placeholder="请输入姓名"
-              name="username"
-              clearable
-            >
-            </el-input>
-          </el-form-item>
           <el-form-item prop="phone">
             <el-input
               v-model.trim="modalForm.phone"
@@ -109,20 +99,12 @@ export default {
     return {
       nameWaitTime,
       modalForm: {
-        username: "",
         phone: "",
         code: "",
         password: "",
         repassword: ""
       },
       forgetPswdRules: {
-        username: [
-          {
-            required: true,
-            message: "请输入姓名",
-            trigger: "change"
-          }
-        ],
         phone,
         code: smscode,
         password,

+ 2 - 0
src/views/Home.vue

@@ -28,6 +28,7 @@
         active-text-color="#3a5ae5"
         text-color="#434656"
         router
+        :default-active="curRouteName"
       >
         <template v-for="submenu in curMenu.children">
           <el-submenu
@@ -107,6 +108,7 @@ export default {
       curMenu: { url: "", children: [] },
       curRouteName: "",
       curSubMenuNames: [],
+      validRoutes: [],
       breadcrumbs: [],
       username: user.realName,
       userRoles: user.roleList,