zhangjie пре 2 година
родитељ
комит
1bc2cb2fda

Разлика између датотеке није приказан због своје велике величине
+ 140 - 287
pnpm-lock.yaml


BIN
public/temps/scanTaskTemplate.xlsx


BIN
public/temps/studentTemplate.xlsx


+ 9 - 15
src/components/base/ClassSelect.vue

@@ -19,7 +19,7 @@
 </template>
 
 <script>
-import { unitQueryByType } from "../../modules/base/api";
+import { studentCascadeQuery } from "../../modules/base/api";
 
 export default {
   name: "class-select",
@@ -28,12 +28,8 @@ export default {
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
     clearable: { type: Boolean, default: true },
-    majorId: { type: String, default: "" },
-    cascader: { type: Boolean, default: false },
-    type: {
-      type: String,
-      default: "CLAZZ"
-    }
+    majorName: { type: String, default: "" },
+    cascader: { type: Boolean, default: false }
   },
   data() {
     return {
@@ -48,7 +44,7 @@ export default {
         this.selected = val;
       }
     },
-    majorId(val, oldval) {
+    majorName(val, oldval) {
       if (val !== oldval) {
         this.search("");
         this.$emit("input", "");
@@ -62,13 +58,11 @@ export default {
   methods: {
     async search() {
       this.optionList = [];
-      if (this.cascader && !this.majorId) return;
-      const res = await unitQueryByType(
-        {
-          majorId: this.majorId
-        },
-        this.type
-      );
+      if (this.cascader && !this.majorName) return;
+      const res = await studentCascadeQuery({
+        majorName: this.majorName,
+        dictionaryEnum: "CLAZZ"
+      });
       this.optionList = res;
     },
     select() {

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

@@ -1,106 +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 },
-    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();
-      }
-    }
-  },
-  created() {
-    if (!this.datas) this.search();
-  },
-  methods: {
-    async search() {
-      const res = await clazzQuery({});
-      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>

+ 6 - 29
src/components/base/CollegeSelect.vue

@@ -19,10 +19,7 @@
 </template>
 
 <script>
-import {
-  unitQueryByType
-  // organizationFindByTypeList
-} from "../../modules/base/api";
+import { studentCascadeQuery } from "../../modules/base/api";
 
 export default {
   name: "college-select",
@@ -30,9 +27,7 @@ export default {
     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 }
+    clearable: { type: Boolean, default: true }
   },
   data() {
     return {
@@ -46,13 +41,6 @@ export default {
       handler(val) {
         this.selected = val;
       }
-    },
-    semesterId(val, oldval) {
-      if (val !== oldval) {
-        this.search("");
-        this.$emit("input", "");
-        this.$emit("change", {});
-      }
     }
   },
   created() {
@@ -61,21 +49,10 @@ export default {
   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" });
-        const res = await unitQueryByType({}, "COLLEGE");
-        this.optionList = res;
-      }
+      const res = await studentCascadeQuery({
+        dictionaryEnum: "COLLEGE"
+      });
+      this.optionList = res;
     },
     select() {
       this.$emit("input", this.selected);

+ 15 - 17
src/components/base/CourseSelect.vue

@@ -20,7 +20,7 @@
 </template>
 
 <script>
-import { courseQuery } from "../../modules/base/api";
+import { commonCourseQuery } from "../../modules/base/api";
 
 export default {
   name: "course-select",
@@ -29,8 +29,15 @@ export default {
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
     clearable: { type: Boolean, default: true },
-    printPlanId: { type: [String, Array], default: "" },
-    teachingRoomId: { type: [String, Array], default: "" }
+    filterData: {
+      type: Object,
+      default() {
+        return {
+          paperArchivesId: "",
+          semesterId: ""
+        };
+      }
+    }
   },
   data() {
     return {
@@ -45,16 +52,9 @@ export default {
         this.selected = val;
       }
     },
-    printPlanId(val, oldval) {
-      if (val !== oldval) {
-        this.search("");
-        this.$emit("input", "");
-        this.$emit("change", {});
-      }
-    },
-    teachingRoomId(val, oldval) {
+    filterData(val, oldval) {
       if (val !== oldval) {
-        this.search("");
+        this.search();
         this.$emit("input", "");
         this.$emit("change", {});
       }
@@ -64,11 +64,9 @@ export default {
     this.search();
   },
   methods: {
-    async search(query) {
-      const res = await courseQuery({
-        param: query,
-        printPlanId: this.printPlanId,
-        teachingRoomId: this.teachingRoomId
+    async search() {
+      const res = await commonCourseQuery({
+        ...this.filterData
       });
       this.optionList = res;
     },

+ 5 - 7
src/components/base/MajorSelect.vue

@@ -19,7 +19,7 @@
 </template>
 
 <script>
-import { unitQueryByType } from "../../modules/base/api";
+import { studentCascadeQuery } from "../../modules/base/api";
 
 export default {
   name: "major-select",
@@ -59,12 +59,10 @@ export default {
     async search() {
       this.optionList = [];
       if (this.cascader && !this.collegeId) return;
-      const res = await unitQueryByType(
-        {
-          collegeId: this.collegeId
-        },
-        "MAJOR"
-      );
+      const res = await studentCascadeQuery({
+        collegeId: this.collegeId,
+        dictionaryEnum: "MAJOR"
+      });
       this.optionList = res;
     },
     select() {

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

@@ -1,71 +0,0 @@
-<template>
-  <el-select
-    v-model="selected"
-    class="place-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 { placeQuery } from "../../modules/print/api";
-
-export default {
-  name: "place-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 placeQuery({
-        param: query,
-        printPlanId: this.printPlanId
-      });
-      this.optionList = res;
-    },
-    select() {
-      this.$emit("input", this.selected);
-      this.$emit("change", this.selected);
-    }
-  }
-};
-</script>

+ 2 - 2
src/components/base/SemesterSelect.vue

@@ -19,7 +19,7 @@
 </template>
 
 <script>
-import { unitQueryByType } from "../../modules/base/api";
+import { commonSemesterQuery } from "../../modules/base/api";
 
 export default {
   name: "semester-select",
@@ -51,7 +51,7 @@ export default {
     async search() {
       this.optionList = [];
 
-      const res = await unitQueryByType({}, "SEMESTER");
+      const res = await commonSemesterQuery({}, "SEMESTER");
       this.optionList = res;
 
       if (this.defaultSelectInUsed) this.selectDefault();

+ 81 - 75
src/components/base/ExamSelect.vue → src/components/base/TeachClazzSelect.vue

@@ -1,75 +1,81 @@
-<template>
-  <el-select
-    v-model="selected"
-    class="exam-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 { examQuery } from "../../modules/base/api";
-
-export default {
-  name: "exam-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: "" }
-  },
-  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 = [];
-
-      const res = await examQuery({
-        semesterId: this.semesterId
-      });
-      this.optionList = res;
-    },
-    select() {
-      this.$emit("input", this.selected);
-      this.$emit(
-        "change",
-        this.optionList.find(item => item.id === this.selected)
-      );
-    }
-  }
-};
-</script>
+<template>
+  <el-select
+    v-model="selected"
+    class="teach-class-select"
+    :placeholder="placeholder"
+    filterable
+    :clearable="clearable"
+    :disabled="disabled"
+    @change="select"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.name"
+    >
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+import { commonTeachClazzQuery } from "../../modules/base/api";
+
+export default {
+  name: "teach-class-select",
+  props: {
+    disabled: { type: Boolean, default: false },
+    placeholder: { type: String, default: "请选择" },
+    value: { type: [Number, String], default: "" },
+    clearable: { type: Boolean, default: true },
+    filterData: {
+      type: Object,
+      default() {
+        return {
+          paperArchivesId: "",
+          semesterId: ""
+        };
+      }
+    }
+  },
+  data() {
+    return {
+      optionList: [],
+      selected: ""
+    };
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = val;
+      }
+    },
+    filterData(val, oldval) {
+      if (val !== oldval) {
+        this.search();
+        this.$emit("input", "");
+        this.$emit("change", {});
+      }
+    }
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    async search() {
+      const res = await commonTeachClazzQuery({
+        ...this.filterData
+      });
+      this.optionList = res;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit(
+        "change",
+        this.optionList.find(item => item.id === this.selected)
+      );
+    }
+  }
+};
+</script>

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

@@ -1,66 +0,0 @@
-<template>
-  <el-select
-    v-model="selected"
-    class="teaching-room-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 { organizationFindByTypeList } from "../../modules/base/api";
-
-export default {
-  name: "teaching-room-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 organizationFindByTypeList({
-        orgType: "TEACHING_ROOM",
-        auth: true
-      });
-      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/TypeOrgSelect.vue

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

+ 40 - 12
src/modules/base/api.js

@@ -1,21 +1,46 @@
 import { $postParam, $post } from "@/plugins/axios";
 
-export const questionTeatherUserQuery = ({ courseCode, param }) => {
-  return $postParam("/api/admin/sys/user/user_list", { courseCode, param });
-};
-export const unitQueryByType = (datas, dictionaryEnum) => {
-  // dictionaryEnum: SEMESTER("学期"),COLLEGE("学院"),MAJOR("专业"),CLAZZ("班级"),STUDENT("学生")
-  return $postParam("/api/admin/common/get_dictionary", {
-    ...datas,
-    dictionaryEnum
+// 课程
+export const commonCourseQuery = ({
+  paperArchivesId = "",
+  semesterId = ""
+}) => {
+  return $postParam("/api/admin/common/course/query", {
+    paperArchivesId,
+    semesterId
   });
 };
-export const enumsByType = type => {
-  // type: PUSH_TYPE_ENUM("同步类型"),
-  return $postParam("/api/admin/common/get_enums", {
-    type
+// 教学班
+export const commonTeachClazzQuery = ({
+  paperArchivesId = "",
+  courseName = ""
+}) => {
+  return $postParam("/api/admin/common/teach_clazz/query", {
+    paperArchivesId,
+    courseName
   });
 };
+// 档案
+export const commonRecordQuery = (semesterId = "") => {
+  return $postParam("/api/admin/common/archives/query", {
+    semesterId
+  });
+};
+// 档案类型
+export const commonRecordTypeQuery = () => {
+  return $postParam("/api/admin/common/archives_type/query", {});
+};
+// 档案部门
+export const commonRecordOrgQuery = (semesterId = "") => {
+  return $postParam("/api/admin/common/manager_org/query", {
+    semesterId
+  });
+};
+// 学期
+export const commonSemesterQuery = () => {
+  return $postParam("/api/admin/common/semester/query", {});
+};
+
 // user --------------------------------->
 // user-manage
 export const userListPage = datas => {
@@ -159,6 +184,9 @@ export const updateStudentSimple = datas => {
 export const batchAddStudentSimple = datas => {
   return $post("/api/admin/teach/student/create_batch", datas);
 };
+export const studentCascadeQuery = datas => {
+  return $postParam("/api/admin/common/basic_student/condition", datas);
+};
 
 // clazz-manage
 export const clazzListQuery = datas => {

+ 16 - 40
src/modules/base/components/ModifyStudent.vue

@@ -3,7 +3,7 @@
     class="modify-student"
     :visible.sync="modalIsShow"
     :title="title"
-    top="10px"
+    top="10vh"
     width="448px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
@@ -46,9 +46,9 @@
           style="width: 100%;"
         ></college-select>
       </el-form-item>
-      <el-form-item prop="majorId" label="专业:">
+      <el-form-item prop="majorName" label="专业:">
         <major-select
-          v-model="modalForm.majorId"
+          v-model="modalForm.majorName"
           :college-id="modalForm.collegeId"
           cascader
           placeholder="请选择专业"
@@ -56,21 +56,13 @@
           @change="updateClazz"
         ></major-select>
       </el-form-item>
-      <el-form-item prop="clazzId" label="班级:">
-        <el-select
-          v-model="modalForm.clazzId"
-          placeholder="请选择班级"
-          style="width: 100%;"
-          filterable
-        >
-          <el-option
-            v-for="item in clazzList"
-            :key="item.id"
-            :value="item.id"
-            :label="item.name"
-          >
-          </el-option>
-        </el-select>
+      <el-form-item prop="clazzName" label="班级:">
+        <class-select
+          v-model="modalForm.clazzName"
+          :major-name="modalForm.majorName"
+          cascader
+          placeholder="班级"
+        ></class-select>
       </el-form-item>
     </el-form>
     <div slot="footer">
@@ -83,7 +75,7 @@
 </template>
 
 <script>
-import { updateStudent, unitQueryByType } from "../api";
+import { updateStudent } from "../api";
 
 const initModalForm = {
   id: null,
@@ -91,8 +83,8 @@ const initModalForm = {
   studentCode: "",
   phoneNumber: "",
   collegeId: "",
-  majorId: "",
-  clazzId: ""
+  majorName: "",
+  clazzName: ""
 };
 
 export default {
@@ -158,22 +150,21 @@ export default {
             trigger: "change"
           }
         ],
-        majorId: [
+        majorName: [
           {
             required: false,
             message: "请选择专业",
             trigger: "change"
           }
         ],
-        clazzId: [
+        clazzName: [
           {
             required: false,
             message: "请选择班级",
             trigger: "change"
           }
         ]
-      },
-      clazzList: []
+      }
     };
   },
   methods: {
@@ -194,21 +185,6 @@ export default {
     open() {
       this.modalIsShow = true;
     },
-    updateClazz() {
-      this.modalForm.clazzId = "";
-      this.getClazz();
-    },
-    async getClazz() {
-      this.clazzList = [];
-      if (!this.modalForm.majorId) return;
-      const res = await unitQueryByType(
-        {
-          majorId: this.modalForm.majorId
-        },
-        "CLAZZ"
-      );
-      this.clazzList = res;
-    },
     async submit() {
       const valid = await this.$refs.modalFormComp.validate().catch(() => {});
       if (!valid) return;

+ 6 - 6
src/modules/base/views/StudentManage.vue

@@ -10,7 +10,7 @@
         </el-form-item>
         <el-form-item label="专业:">
           <major-select
-            v-model="filter.majorId"
+            v-model="filter.majorName"
             :college-id="filter.collegeId"
             cascader
             placeholder="专业"
@@ -18,8 +18,8 @@
         </el-form-item>
         <el-form-item label="班级:">
           <class-select
-            v-model="filter.clazzId"
-            :major-id="filter.majorId"
+            v-model="filter.clazzName"
+            :major-name="filter.majorName"
             cascader
             placeholder="班级"
           ></class-select>
@@ -78,7 +78,7 @@
         <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="clazz" label="班级"></el-table-column>
+        <el-table-column prop="clazzName" label="班级"></el-table-column>
         <el-table-column prop="createTime" label="创建时间" width="170">
           <span slot-scope="scope">{{
             scope.row.createTime | timestampFilter
@@ -154,8 +154,8 @@ export default {
       filter: {
         queryParams: "",
         collegeId: "",
-        majorId: "",
-        clazzId: ""
+        majorName: "",
+        clazzName: ""
       },
       queriedFilter: {},
       current: 1,

+ 29 - 15
src/modules/record/api.js

@@ -2,31 +2,37 @@ import { $postParam, $post } from "@/plugins/axios";
 
 // scan-task-manage
 export const scanTaskListPage = datas => {
-  return $postParam("/api/admin/sys/role/list", datas);
+  return $postParam("/api/admin/paper/scan_task/query", datas);
 };
 export const scanTaskDetailPage = datas => {
-  return $postParam("/api/admin/sys/role/list", datas);
+  return $postParam("/api/admin/paper/scan_task/task_detail_page", datas);
 };
 export const updateScanTask = datas => {
-  return $post("/api/admin/sys/user/save", datas);
+  return $post("/api/admin/", datas);
 };
-export const ableScanTask = ({ id, enable }) => {
-  return $post("/api/admin/sys/role/enable", { id, enable });
+export const deleteScanTask = idList => {
+  return $postParam("/api/admin/paper/scan_task/delete_batch", { idList });
 };
-export const deleteScanTask = ids => {
-  return $postParam("/api/admin/sys/role/remove", { ids });
+export const clearScanTaskData = paperScanTaskId => {
+  return $postParam("/api/admin/paper/scan_task/clear_scan_data", {
+    paperScanTaskId
+  });
 };
-export const clearScanTaskData = ids => {
-  return $postParam("/api/admin/sys/role/remove", { ids });
+export const unbindScanTaskUser = paperScanTaskId => {
+  return $postParam("/api/admin/paper/scan_task/unbind_scanner", {
+    paperScanTaskId
+  });
 };
 export const scanTaskBindUser = datas => {
-  return $postParam("/api/admin/sys/role/bind_range", datas);
+  return $postParam("/api/admin/", datas);
 };
-export const dataCheckStateDetail = datas => {
-  return $postParam("/api/admin/sys/role/bind_range", datas);
+export const dataCheckStateDetail = paperScanTaskId => {
+  return $postParam("/api/admin/paper/scan_task/bind_progress_detail", {
+    paperScanTaskId
+  });
 };
 export const releaseUserDataCheckTask = datas => {
-  return $postParam("/api/admin/sys/role/bind_range", datas);
+  return $postParam("/api/admin/paper/scan_task/release_binding_task", datas);
 };
 
 // record-manage
@@ -41,10 +47,18 @@ export const deleteRecord = ids => {
 };
 // data-check-manage
 export const dataCheckUndoListPage = datas => {
-  return $postParam("/api/admin/sys/role/list", datas);
+  return $postParam("/api/admin/paper/library/page_unbind", datas);
 };
 export const dataCheckDoneListPage = datas => {
-  return $postParam("/api/admin/sys/role/list", datas);
+  return $postParam("/api/admin/paper/library/page_bind", datas);
+};
+export const studentPictureList = paperScanTaskDetailId => {
+  return $postParam("/api/admin/paper/library/list_student_picture", {
+    paperScanTaskDetailId
+  });
+};
+export const studentUnbindTaskListPage = datas => {
+  return $postParam("/api/admin/paper/library/get_bind_data", datas);
 };
 export const paperBindUser = datas => {
   return $post("/api/admin/sys/user/save", datas);

+ 32 - 29
src/modules/record/components/DataCheckDialog.vue

@@ -82,19 +82,19 @@
       <div class="data-check-content part-box">
         <div class="data-check-content-page">
           <el-button
-            :type="curPaperIndex === 0 ? 'primary' : 'default'"
+            :type="curPagePaperIndex === 0 ? 'primary' : 'default'"
             @click="switchCurPage(0)"
             >正面</el-button
           >
           <el-button
-            :type="curPaperIndex === 1 ? 'primary' : 'default'"
+            :type="curPagePaperIndex === 1 ? 'primary' : 'default'"
             @click="switchCurPage(1)"
             >反面</el-button
           >
         </div>
         <image-contain
           ref="ImageContain"
-          :image="curPage"
+          :image="curPagePaper"
           :show-guide="false"
         ></image-contain>
       </div>
@@ -105,13 +105,14 @@
 <script>
 import timeMixin from "../../../mixins/timeMixin";
 import { studentListQuery } from "../../../modules/base/api";
-import { paperBindUser, dataCheckUndoListPage } from "../api";
+import { paperBindUser, studentUnbindTaskListPage } from "../api";
 import ImageContain from "../../../components/ImageContain.vue";
 
 const initModalForm = {
+  paperLibraryId: "",
+  paperScanTaskDetailId: "",
   semesterId: "",
-  courseCode: "",
-  studentId: ""
+  courseCode: ""
 };
 
 export default {
@@ -153,7 +154,7 @@ export default {
             trigger: "change"
           }
         ],
-        studentId: [
+        paperScanTaskDetailId: [
           {
             required: true,
             message: "请选择学生",
@@ -167,12 +168,10 @@ export default {
       loading: false,
       donePageList: [],
       undoPageList: [],
-      curPaperIndex: 0,
-      curPages: [
-        "https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg",
-        "https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg"
-      ],
-      curPage: { url: "" }
+      curPage: null,
+      curPagePapers: [],
+      curPagePaperIndex: 0,
+      curPagePaper: { url: "" }
     };
   },
   computed: {
@@ -193,7 +192,13 @@ export default {
         this.undoPageList = this.student.pages;
       }
 
-      this.curPages = this.undoPageList.shift();
+      if (!this.undoPageList.length) {
+        this.$message.error("当前无任务需要处理!");
+        return;
+      }
+
+      this.curPage = this.undoPageList.shift();
+      this.curPagePapers = this.curPage.fileUrls;
       this.switchCurPage(0);
     },
     cancel() {
@@ -218,19 +223,15 @@ export default {
       const data = await studentListQuery(datas);
       this.studentList = data.records;
     },
-    switchCurPage(curPaperIndex) {
-      this.curPaperIndex = curPaperIndex;
-      this.curPage = {
-        url: this.curPages[this.curPaperIndex]
+    switchCurPage(curPagePaperIndex) {
+      this.curPagePaperIndex = curPagePaperIndex;
+      this.curPagePaper = {
+        url: this.curPagePapers[this.curPagePaperIndex]
       };
     },
     async getUndoPageList() {
-      const datas = {
-        pageNumber: 1,
-        pageSize: 10
-      };
-      const data = await dataCheckUndoListPage(datas);
-      this.undoPageList.push(...data.records);
+      const data = await studentUnbindTaskListPage({});
+      this.undoPageList.push(...data);
     },
     toNextPaper() {
       if (!this.undoPageList.length) {
@@ -241,12 +242,13 @@ export default {
       if (this.undoPageList.length <= 3 && this.IS_UNDO_MODEL)
         this.getUndoPageList();
 
-      this.donePageList.push({ ...this.curPages });
-      this.curPages = this.undoPageList.shift();
+      if (this.curPage) this.donePageList.push({ ...this.curPage });
+      this.curPage = this.undoPageList.shift();
+      this.curPagePapers = this.curPage.fileUrls;
       this.switchCurPage(0);
     },
     toBind(row) {
-      this.modalForm.studentId = row.id;
+      this.modalForm.paperScanTaskDetailId = row.paperScanTaskDetailId;
       this.confirm();
     },
     async confirm() {
@@ -255,8 +257,9 @@ export default {
 
       if (this.loading) return;
       this.loading = true;
-
-      const res = await paperBindUser(this.modalForm).catch(() => {});
+      let datas = { ...this.modalForm };
+      datas.paperLibraryId = this.curPage.id;
+      const res = await paperBindUser(datas).catch(() => {});
       this.loading = false;
 
       if (!res) return;

+ 10 - 10
src/modules/record/components/DataCheckStateDialog.vue

@@ -12,14 +12,14 @@
   >
     <el-table ref="TableList" :data="dataList">
       <el-table-column type="index" label="序号" width="70"></el-table-column>
-      <el-table-column prop="chckerName" label="绑定员"></el-table-column>
+      <el-table-column prop="bindUserName" label="绑定员"></el-table-column>
       <el-table-column
-        prop="chckerName"
+        prop="boundCount"
         label="已绑量"
         width="120"
       ></el-table-column>
       <el-table-column
-        prop="chckerName"
+        prop="bindingCount"
         label="绑定中"
         width="120"
       ></el-table-column>
@@ -63,15 +63,12 @@ export default {
       this.modalIsShow = true;
     },
     async getList() {
-      const datas = {
-        taskId: this.taskId
-      };
-      const data = await dataCheckStateDetail(datas);
+      const data = await dataCheckStateDetail(this.task.paperScanTaskId);
       this.dataList = data || [];
     },
-    async toRelease() {
+    async toRelease(row) {
       const res = await this.$confirm(
-        `确定要释放绑定员【${row.realName}】的绑定任务吗??`,
+        `确定要释放绑定员【${row.bindUserName}】的绑定任务吗??`,
         "提示",
         {
           type: "warning"
@@ -79,7 +76,10 @@ export default {
       ).catch(() => {});
       if (res !== "confirm") return;
 
-      await releaseUserDataCheckTask({ id: row.id });
+      await releaseUserDataCheckTask({
+        paperScanTaskId: this.task.id,
+        bindUserId: row.bindUserId
+      });
       this.$message.success("操作成功!");
       this.getList();
     }

+ 11 - 10
src/modules/record/components/ScanTaskDetailDialog.vue

@@ -17,18 +17,18 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="chckerName" label="姓名"></el-table-column>
-        <el-table-column prop="chckerName" label="学号"></el-table-column>
-        <el-table-column prop="chckerName" label="课程"></el-table-column>
-        <el-table-column prop="chckerName" label="任课老师"></el-table-column>
-        <el-table-column prop="chckerName" label="教学班"></el-table-column>
+        <el-table-column prop="studentNmae" label="姓名"></el-table-column>
+        <el-table-column prop="studentCode" label="学号"></el-table-column>
+        <el-table-column prop="courseName" label="课程"></el-table-column>
+        <el-table-column prop="teacherName" label="任课老师"></el-table-column>
+        <el-table-column prop="teachClazzName" label="教学班"></el-table-column>
         <el-table-column
-          prop="chckerName"
+          prop="scanCount"
           label="扫描张数"
           width="120"
         ></el-table-column>
         <el-table-column
-          prop="chckerName"
+          prop="checkName"
           label="数据检查员"
           width="120"
         ></el-table-column>
@@ -72,7 +72,7 @@ export default {
   },
   computed: {
     title() {
-      return `${this.task.name}-${this.task.courseName}-详情`;
+      return `${this.task.scanTaskName}-${this.task.courseName}-详情`;
     }
   },
   methods: {
@@ -88,12 +88,13 @@ export default {
     },
     async getList() {
       const datas = {
-        taskId: this.taskId,
+        paperScanTaskId: this.task.paperScanTaskId,
         pageNumber: this.current,
         pageSize: this.size
       };
       const data = await scanTaskDetailPage(datas);
-      this.dataList = data || [];
+      this.dataList = data.records;
+      this.total = data.total;
     },
     toPage(page) {
       this.current = page;

+ 23 - 8
src/modules/record/views/DataCheckManage.vue

@@ -4,7 +4,11 @@
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <template v-if="checkPrivilege('condition', 'condition')">
           <el-form-item label="任务:">
-            <el-select v-model="filter.taskId" placeholder="任务" filterable>
+            <el-select
+              v-model="filter.paperScanTaskId"
+              placeholder="任务"
+              filterable
+            >
               <el-option
                 v-for="item in taskList"
                 :key="item.id"
@@ -86,7 +90,13 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="taskName" label="任务(ID)"></el-table-column>
+        <el-table-column prop="paperScanTaskId" label="任务(ID)">
+          <span slot-scope="scope">
+            {{ scope.row.paperScanTaskName }} ({{
+              scope.row.paperScanTaskId
+            }})
+          </span>
+        </el-table-column>
         <el-table-column
           prop="studentName"
           label="姓名"
@@ -115,7 +125,7 @@
               type="text"
               @click="toDetail(scope.row)"
             >
-              <span class="cont-link">{{ scope.row.boundImageCount }}</span>
+              <span class="cont-link">{{ scope.row.bindCount }}</span>
             </el-button>
           </template>
         </el-table-column>
@@ -144,7 +154,11 @@
 </template>
 
 <script>
-import { dataCheckUndoListPage, dataCheckDoneListPage } from "../api";
+import {
+  dataCheckUndoListPage,
+  dataCheckDoneListPage,
+  studentPictureList
+} from "../api";
 import ImageListPreviewDialog from "../../../components/ImageListPreviewDialog.vue";
 import DataCheckDialog from "../components/DataCheckDialog.vue";
 
@@ -154,7 +168,7 @@ export default {
   data() {
     return {
       filter: {
-        taskId: ""
+        paperScanTaskId: ""
       },
       doneTypes: [
         {
@@ -186,10 +200,11 @@ export default {
     selectMenu(type) {
       this.curDoneType = type;
     },
-    toDetail(row) {
-      if (!row.imageList.length) return;
+    async toDetail(row) {
+      if (!row.bindCount) return;
 
-      this.curImageList = row.imageList;
+      const data = await studentPictureList(row.id);
+      this.curImageList = data || [];
       this.$refs.ImageListPreviewDialog.open();
     },
     search() {

+ 51 - 45
src/modules/record/views/ScanTaskManage.vue

@@ -4,31 +4,20 @@
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <template v-if="checkPrivilege('condition', 'condition')">
           <el-form-item label="课程:">
-            <el-select
-              v-model="filter.courseCode"
-              placeholder="请选择课程"
-              filterable
-            >
-              <el-option
-                v-for="item in courses"
-                :key="item.code"
-                :value="item.code"
-                :label="item.name"
-              >
-              </el-option>
-            </el-select>
+            <course-select v-model="filter.courseCode" placeholder="请选择课程">
+            </course-select>
           </el-form-item>
           <el-form-item label="任课老师:">
             <el-input
               style="width: 180px;"
-              v-model.trim="filter.userInfo"
+              v-model.trim="filter.teacherName"
               placeholder="任课老师"
               clearable
             ></el-input>
           </el-form-item>
           <el-form-item label="绑定进度范围:">
             <el-input-number
-              v-model="filter.startProgress"
+              v-model="filter.smallerProgress"
               style="width: 84px"
               :min="0"
               :max="100"
@@ -39,7 +28,7 @@
             ></el-input-number>
             <span>~</span>
             <el-input-number
-              v-model="filter.endProgress"
+              v-model="filter.largerProgress"
               style="width: 84px"
               :min="0"
               :max="100"
@@ -97,26 +86,30 @@
           width="55"
           align="center"
         ></el-table-column>
-        <el-table-column prop="name" label="任务名称"></el-table-column>
-        <el-table-column prop="id" label="任务ID" width="180"></el-table-column>
+        <el-table-column prop="scanTaskName" label="任务名称"></el-table-column>
+        <el-table-column
+          prop="paperScanTaskId"
+          label="任务ID"
+          width="180"
+        ></el-table-column>
         <el-table-column
-          prop="recordType"
+          prop="archivesName"
           label="档案名称"
           width="120"
         ></el-table-column>
         <el-table-column
-          prop="recordNumber"
+          prop="archivesCode"
           label="档案编号"
           width="180"
         ></el-table-column>
         <el-table-column prop="courseName" label="课程"> </el-table-column>
         <el-table-column prop="teacherName" label="任课老师" width="120">
         </el-table-column>
-        <el-table-column prop="teachingRoomName" label="教学班">
+        <el-table-column prop="teachClazzName" label="教学班">
         </el-table-column>
         <el-table-column prop="scanCount" label="扫描量(份)" width="110">
         </el-table-column>
-        <el-table-column prop="scanUser" label="扫描员" width="120">
+        <el-table-column prop="scanUserName" label="扫描员" width="120">
         </el-table-column>
         <el-table-column
           class-name="action-column"
@@ -129,7 +122,7 @@
               class="btn-primary"
               type="text"
               @click="toShowProgress(scope.row)"
-              >{{ scope.row.progress || 0 }}%</el-button
+              >{{ scope.row.bindProgress || 0 }}%</el-button
             >
           </template>
         </el-table-column>
@@ -161,6 +154,13 @@
               @click="toClear(scope.row)"
               >清除数据</el-button
             >
+            <el-button
+              v-if="checkPrivilege('link', 'delete')"
+              class="btn-danger"
+              type="text"
+              @click="toUnbind(scope.row)"
+              >解除扫描员</el-button
+            >
           </template>
         </el-table-column>
       </el-table>
@@ -237,7 +237,12 @@
 </template>
 
 <script>
-import { scanTaskListPage, deleteScanTask, clearScanTaskData } from "../api";
+import {
+  scanTaskListPage,
+  deleteScanTask,
+  clearScanTaskData,
+  unbindScanTaskUser
+} from "../api";
 import ImportFile from "../../../components/ImportFile.vue";
 import ModifyScanTask from "../components/ModifyScanTask.vue";
 import DataCheckStateDialog from "../components/DataCheckStateDialog.vue";
@@ -256,8 +261,8 @@ export default {
       filter: {
         courseCode: "",
         teacherName: "",
-        startProgress: undefined,
-        endProgress: undefined
+        smallerProgress: undefined,
+        largerProgress: undefined
       },
       current: 1,
       size: this.GLOBAL.pageSize,
@@ -267,7 +272,6 @@ export default {
       curRow: {},
       loading: false,
       userId: this.$ls.get("user", { id: "" }).id,
-      courses: [],
       records: [],
       // import-task
       modalForm: { recordId: "" },
@@ -281,13 +285,9 @@ export default {
         ]
       },
       uploadData: {},
-      uploadUrl: "/api/admin/sys/user/import",
-      downloadUrl: "/temps/userTemplate.xlsx",
-      dfilename: "扫描任务导入模板.xlsx",
-      // bind-scan-user
-      bindUrl: "/api/admin/sys/user/import",
-      bindTemplateUrl: "/temps/userTemplate.xlsx",
-      bindTemplateFilename: "绑定扫描员导入模板.xlsx"
+      uploadUrl: "/api/admin/paper/scan_task/scan_task_import",
+      downloadUrl: "/temps/scanTaskTemplate.xlsx",
+      dfilename: "扫描任务导入模板.xlsx"
     };
   },
   mounted() {
@@ -310,7 +310,7 @@ export default {
       this.getList();
     },
     handleSelectionChange(val) {
-      this.multipleSelection = val.map(item => item.id);
+      this.multipleSelection = val.map(item => item.paperScanTaskId);
     },
     toDetail(row) {
       this.curRow = row;
@@ -344,7 +344,7 @@ export default {
     },
     async toDelete(row) {
       const res = await this.$confirm(
-        `确定要删除任务【${row.name}】吗??`,
+        `确定要删除任务【${row.scanTaskName}】吗??`,
         "提示",
         {
           type: "warning"
@@ -352,21 +352,27 @@ export default {
       ).catch(() => {});
       if (res !== "confirm") return;
 
-      await deleteScanTask([row.id]);
+      await deleteScanTask([row.paperScanTaskId]);
       this.$message.success("操作成功!");
       this.deletePageLastItem();
     },
     async toClear(row) {
-      const res = await this.$confirm(
-        `请确认是否清除当前任务已扫描数据?`,
-        "提示",
-        {
-          type: "warning"
-        }
-      ).catch(() => {});
+      const res = await this.$confirm(`确认要清除当前任务已扫描数据?`, "提示", {
+        type: "warning"
+      }).catch(() => {});
+      if (res !== "confirm") return;
+
+      await clearScanTaskData(row.paperScanTaskId);
+      this.$message.success("操作成功!");
+      this.getList();
+    },
+    async toUnbind(row) {
+      const res = await this.$confirm(`确定要解绑当前任务的扫描员吗?`, "提示", {
+        type: "warning"
+      }).catch(() => {});
       if (res !== "confirm") return;
 
-      await clearScanTaskData([row.id]);
+      await unbindScanTaskUser(row.paperScanTaskId);
       this.$message.success("操作成功!");
       this.getList();
     },

+ 3 - 5
src/plugins/globalVuePlugins.js

@@ -9,11 +9,10 @@ import CourseSelect from "../components/base/CourseSelect.vue";
 import SchoolSelect from "../components/base/SchoolSelect.vue";
 import SemesterSelect from "../components/base/SemesterSelect.vue";
 import CollegeSelect from "../components/base/CollegeSelect.vue";
-import ClazzSelect from "../components/base/ClazzSelect.vue";
 import MajorSelect from "../components/base/MajorSelect.vue";
 import ClassSelect from "../components/base/ClassSelect.vue";
-import ExamSelect from "../components/base/ExamSelect.vue";
 import OrgSelect from "../components/base/OrgSelect.vue";
+import TeachClazzSelect from "../components/base/TeachClazzSelect.vue";
 
 const components = {
   ViewFooter,
@@ -22,11 +21,10 @@ const components = {
   SchoolSelect,
   SemesterSelect,
   CollegeSelect,
-  ClazzSelect,
   MajorSelect,
   ClassSelect,
-  ExamSelect,
-  OrgSelect
+  OrgSelect,
+  TeachClazzSelect
 };
 
 export default {

+ 2 - 2
src/views/Home.vue

@@ -157,8 +157,8 @@ export default {
   },
   computed: {},
   created() {
-    this.initData1();
-    // this.initData();
+    // this.initData1();
+    this.initData();
   },
   methods: {
     initData1() {

Неке датотеке нису приказане због велике количине промена