zhangjie %!s(int64=3) %!d(string=hai) anos
pai
achega
da1adc4e77

+ 3 - 0
src/assets/styles/icons.scss

@@ -30,6 +30,9 @@
   &-workspace {
     background-image: url(../images/icon-workspace.png);
   }
+  &-book {
+    background-image: url(../images/icon-book.png);
+  }
 
   &-account {
     background-image: url(../images/icon-account.png);

+ 2 - 2
src/assets/styles/pages.scss

@@ -361,8 +361,8 @@
   }
 }
 
-// paper-preview-dialog
-.paper-preview-dialog {
+// paper-track-preview-dialog
+.paper-track-preview-dialog {
   .paper-preview {
     overflow: auto;
     canvas {

+ 7 - 1
src/components/SimpleImagePreview.vue

@@ -16,12 +16,14 @@
 
     <div :class="[`${prefixCls}-body`]" ref="ReviewBody">
       <div
+        v-if="!simple"
         :class="[`${prefixCls}-guide`, `${prefixCls}-guide-prev`]"
         @click.stop="showPrev"
       >
         <i class="el-icon-arrow-left"></i>
       </div>
       <div
+        v-if="!simple"
         :class="[`${prefixCls}-guide`, `${prefixCls}-guide-next`]"
         @click.stop="showNext"
       >
@@ -53,7 +55,7 @@
       </div>
     </div>
 
-    <div :class="[`${prefixCls}-footer`]">
+    <div v-if="!simple" :class="[`${prefixCls}-footer`]">
       <ul>
         <li title="旋转" @click.stop="toRotate">
           <i class="el-icon-refresh-right"></i>
@@ -74,6 +76,10 @@ export default {
       default() {
         return {};
       }
+    },
+    simple: {
+      type: Boolean,
+      default: false
     }
   },
   data() {

+ 8 - 5
src/components/base/ClassSelect.vue

@@ -19,7 +19,7 @@
 </template>
 
 <script>
-import { classQuery } from "../../modules/base/api";
+import { unitQueryByType } from "../../modules/base/api";
 
 export default {
   name: "class-select",
@@ -28,7 +28,7 @@ export default {
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
     clearable: { type: Boolean, default: true },
-    majorId: { type: [String, Array], default: "" },
+    majorId: { type: String, default: "" },
     cascader: { type: Boolean, default: false }
   },
   data() {
@@ -59,9 +59,12 @@ export default {
     async search() {
       this.optionList = [];
       if (this.cascader && !this.majorId) return;
-      const res = await classQuery({
-        majorId: this.majorId
-      });
+      const res = await unitQueryByType(
+        {
+          majorId: this.majorId
+        },
+        "CLAZZ"
+      );
       this.optionList = res;
     },
     select() {

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

@@ -19,7 +19,10 @@
 </template>
 
 <script>
-import { organizationFindByTypeList } from "../../modules/base/api";
+import {
+  unitQueryByType,
+  organizationFindByTypeList
+} from "../../modules/base/api";
 
 export default {
   name: "college-select",
@@ -27,7 +30,9 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
-    clearable: { type: Boolean, default: true }
+    clearable: { type: Boolean, default: true },
+    semesterId: { type: String, default: "" },
+    cascader: { type: Boolean, default: false }
   },
   data() {
     return {
@@ -41,6 +46,13 @@ export default {
       handler(val) {
         this.selected = val;
       }
+    },
+    semesterId(val, oldval) {
+      if (val !== oldval) {
+        this.search("");
+        this.$emit("input", "");
+        this.$emit("change", {});
+      }
     }
   },
   created() {
@@ -48,8 +60,21 @@ export default {
   },
   methods: {
     async search() {
-      const res = await organizationFindByTypeList({ orgType: "COLLEGE" });
-      this.optionList = res;
+      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);

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

@@ -19,7 +19,7 @@
 </template>
 
 <script>
-import { majorQuery } from "../../modules/base/api";
+import { unitQueryByType } from "../../modules/base/api";
 
 export default {
   name: "major-select",
@@ -28,7 +28,7 @@ export default {
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
     clearable: { type: Boolean, default: true },
-    collegeId: { type: [String, Array], default: "" },
+    collegeId: { type: String, default: "" },
     cascader: { type: Boolean, default: false }
   },
   data() {
@@ -59,9 +59,12 @@ export default {
     async search() {
       this.optionList = [];
       if (this.cascader && !this.collegeId) return;
-      const res = await majorQuery({
-        collegeId: this.collegeId
-      });
+      const res = await unitQueryByType(
+        {
+          collegeId: this.collegeId
+        },
+        "MAJOR"
+      );
       this.optionList = res;
     },
     select() {

+ 65 - 0
src/components/base/SemesterSelect.vue

@@ -0,0 +1,65 @@
+<template>
+  <el-select
+    v-model="selected"
+    class="semester-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: "semester-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() {
+      this.optionList = [];
+
+      const res = await unitQueryByType({}, "SEMESTER");
+      this.optionList = res;
+    },
+    select() {
+      this.$emit("input", this.selected);
+      this.$emit(
+        "change",
+        this.optionList.find(item => item.id === this.selected)
+      );
+    }
+  }
+};
+</script>

+ 9 - 0
src/constants/enumerate.js

@@ -77,6 +77,15 @@ export const CONFIRM_PRINT_TYPE = {
   AUTO: "自动"
 };
 
+// 印刷计划推送状态
+export const SYNC_PRINT_STATUS = {
+  INIT: "未开始",
+  START_SYNC: "同步中", // 开始同步
+  EXAM_FINISH: "同步中", // 考试同步成功
+  STUDENT_FINISH: "同步中", // 考生同步成功
+  FINISH: "已结束"
+};
+
 // 命题 -------------->
 // 待办任务警告时间
 export const TASK_WARNING_TIME = 3 * 24 * 60 * 60 * 1000;

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

@@ -3,6 +3,13 @@ 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
+  });
+};
 // user --------------------------------->
 // user-manage
 export const userListPage = datas => {
@@ -190,12 +197,6 @@ export const updateClazz = datas => {
 export const clazzQuery = datas => {
   return $postParam("/api/admin/basic/clazz/datasource", datas);
 };
-export const classQuery = datas => {
-  return $postParam("/api/admin/common/get_dictionary", {
-    ...datas,
-    dictionaryEnum: "CLAZZ"
-  });
-};
 
 // semester-manage
 export const semesterListQuery = datas => {
@@ -211,12 +212,6 @@ export const updateSemester = datas => {
 export const majorListQuery = datas => {
   return $postParam("/api/admin/basic/major/query", datas);
 };
-export const majorQuery = datas => {
-  return $postParam("/api/admin/common/get_dictionary", {
-    ...datas,
-    dictionaryEnum: "MAJOR"
-  });
-};
 export const deleteMajor = id => {
   return $postParam("/api/admin/basic/major/delete", { id });
 };

+ 1 - 5
src/modules/base/views/PrintPlanPushManage.vue

@@ -79,11 +79,7 @@
         </el-table-column>
         <el-table-column prop="syncStatus" label="同步状态">
           <span slot-scope="scope">{{
-            scope.row.syncStatus === null
-              ? "--"
-              : scope.row.syncStatus
-              ? "成功"
-              : "失败"
+            scope.row.syncStatus | syncPrintStatusFilter
           }}</span>
         </el-table-column>
         <el-table-column class-name="action-column" label="操作" width="120px">

+ 4 - 4
src/modules/exam/api.js

@@ -38,11 +38,11 @@ export const waitTaskReviewCount = () => {
   return $postParam("/api/admin/work/exam/task/submit_count", {});
 };
 // 阅卷代办
-export const markerTaskListPage = datas => {
-  return $postParam("/api/admin/work/marker/task/ready", datas);
+export const stmmsTaskListPage = datas => {
+  return $postParam("/api/admin/work/structure/task/ready", datas);
 };
-export const markerTaskCount = () => {
-  return $postParam("/api/admin/work/marker/task/ready_count", {});
+export const stmmsTaskCount = () => {
+  return $postParam("/api/admin/work/structure/task/ready_count", {});
 };
 
 // exam-task-manage

+ 4 - 2
src/modules/exam/components/WaitTaskFlow.vue

@@ -25,7 +25,7 @@
             scope.row.createTime | timestampFilter
           }}</span>
         </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="100px">
+        <el-table-column class-name="action-column" label="操作" width="100">
           <template slot-scope="scope">
             <el-button class="btn-primary" type="text" @click="toDo(scope.row)"
               >立即处理</el-button
@@ -56,7 +56,7 @@
 </template>
 
 <script>
-import { mapActions } from "vuex";
+import { mapMutations, mapActions } from "vuex";
 import { waitExamTaskListPage } from "../api";
 import ModifyTaskApply from "./ModifyTaskApply";
 
@@ -76,6 +76,7 @@ export default {
     this.initData();
   },
   methods: {
+    ...mapMutations("exam", ["updateWaitTask"]),
     ...mapActions("exam", ["updateWaitTaskCount"]),
     async initData() {
       const cachePageInfo = this.$ls.get("cachePageInfo");
@@ -103,6 +104,7 @@ export default {
       const data = await waitExamTaskListPage(datas);
       this.dataList = data.records;
       this.total = data.total;
+      this.updateWaitTask({ flow: this.total });
     },
     toPage(page) {
       this.current = page;

+ 17 - 5
src/modules/exam/components/WaitTaskStmms.vue

@@ -2,7 +2,17 @@
   <div class="wait-task-stmms">
     <div class="part-box part-box-pad">
       <el-table ref="TableList" :data="dataList">
-        <el-table-column prop="examId" label="考试ID"></el-table-column>
+        <el-table-column
+          type="index"
+          label="序号"
+          width="50"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="thirdRelateId" label="考试ID"></el-table-column>
+        <el-table-column
+          prop="thirdRelateName"
+          label="考试名称"
+        ></el-table-column>
         <el-table-column prop="paperNumber" label="试卷ID"></el-table-column>
         <el-table-column prop="paperType" label="试卷类型"></el-table-column>
         <el-table-column prop="status" label="状态" width="100">
@@ -10,7 +20,7 @@
             {{ scope.row.status | markTaskSyncStatusFilter }}
           </template>
         </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="220px">
+        <el-table-column class-name="action-column" label="操作" width="100">
           <template slot-scope="scope">
             <el-button class="btn-primary" type="text" @click="toDo(scope.row)"
               >立即处理</el-button
@@ -41,8 +51,8 @@
 </template>
 
 <script>
-import { mapActions } from "vuex";
-import { markerTaskListPage } from "../api";
+import { mapActions, mapMutations } from "vuex";
+import { stmmsTaskListPage } from "../api";
 import UploadPaperAnswerDialog from "../../stmms/components/UploadPaperAnswerDialog";
 
 export default {
@@ -61,15 +71,17 @@ export default {
     this.getList();
   },
   methods: {
+    ...mapMutations("exam", ["updateWaitTask"]),
     ...mapActions("exam", ["updateWaitTaskCount"]),
     async getList() {
       const datas = {
         pageNumber: this.current,
         pageSize: this.size
       };
-      const data = await markerTaskListPage(datas);
+      const data = await stmmsTaskListPage(datas);
       this.dataList = data.records;
       this.total = data.total;
+      this.updateWaitTask({ stmms: this.total });
     },
     toPage(page) {
       this.current = page;

+ 36 - 5
src/modules/exam/store.js

@@ -1,23 +1,54 @@
-import { waitExamTaskCount, markerTaskCount } from "./api";
+import { waitExamTaskCount, stmmsTaskCount } from "./api";
 import { calcSum } from "@/plugins/utils";
 
 const state = {
-  waitTaskCount: 0
+  waitTaskCount: 0,
+  waitTask: {
+    flow: 0,
+    stmms: 0
+  }
 };
 
 const mutations = {
-  setNotDoneTaskCount(state, waitTaskCount) {
+  setWaitTaskCount(state, waitTaskCount) {
     state.waitTaskCount = waitTaskCount;
+  },
+  setWaitTask(state, waitTask) {
+    state.waitTask = waitTask;
+  },
+  updateWaitTask(state, data) {
+    const waitTask = Object.assign({}, state.waitTask, data);
+    state.waitTask = waitTask;
+    const count = calcSum(Object.values(state.waitTask));
+    state.waitTaskCount = count;
   }
 };
 
 const actions = {
   async updateWaitTaskCount({ commit }) {
-    let countAll = [waitExamTaskCount(), markerTaskCount()];
+    const task = [
+      {
+        type: "flow",
+        func: waitExamTaskCount
+      },
+      {
+        type: "stmms",
+        func: stmmsTaskCount
+      }
+    ];
+    let countAll = task.map(item => item.func());
     const counts = await Promise.all(countAll).catch(() => {});
 
+    if (!counts) return;
+
+    let waitTask = {};
+    counts.forEach((count, index) => {
+      waitTask[task[index].type] = count;
+    });
+    commit("setWaitTask", waitTask);
+
     const count = calcSum(counts || [0]);
-    commit("setNotDoneTaskCount", count || 0);
+    commit("setWaitTaskCount", count || 0);
   }
 };
 

+ 6 - 3
src/modules/exam/views/WaitTask.vue

@@ -7,8 +7,9 @@
         size="medium"
         :type="curTab == tab.val ? 'primary' : 'default'"
         @click="selectMenu(tab.val)"
-        >{{ tab.name }}</el-button
-      >
+        >{{ tab.name }}
+        <span v-if="waitTask[tab.val]">({{ waitTask[tab.val] }})</span>
+      </el-button>
     </div>
 
     <component :is="compName"></component>
@@ -18,6 +19,7 @@
 <script>
 import WaitTaskFlow from "../components/WaitTaskFlow";
 import WaitTaskStmms from "../components/WaitTaskStmms";
+import { mapState } from "vuex";
 
 export default {
   name: "wait-task",
@@ -31,13 +33,14 @@ export default {
           val: "flow"
         },
         {
-          name: "任务待办",
+          name: "阅卷待办",
           val: "stmms"
         }
       ]
     };
   },
   computed: {
+    ...mapState("exam", ["waitTask"]),
     compName() {
       return `wait-task-${this.curTab}`;
     }

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

@@ -20,7 +20,13 @@ export const scoreSync = datas => {
   return $postParam("/api/admin/sync/score/sync", datas);
 };
 export const scoreDownload = studentCode => {
-  return $postParam("/api/admin/sync/score/download", { studentCode });
+  return $postParam(
+    "/api/admin/sync/score/download",
+    { studentCode },
+    {
+      responseType: "blob"
+    }
+  );
 };
 export const scoreBatchDownload = datas => {
   return $postParam("/api/admin/sync/score/batch_download", datas);

+ 2 - 2
src/modules/stmms/components/PaperPreviewDialog.vue → src/modules/stmms/components/PaperTrackPreviewDialog.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    class="paper-preview-dialog"
+    class="paper-track-preview-dialog"
     :visible.sync="modalIsShow"
     :title="title"
     :close-on-click-modal="false"
@@ -42,7 +42,7 @@ import { buildCanvas, downloadPaper } from "./downloadPaper";
 import papers from "./paper";
 
 export default {
-  name: "modify-user",
+  name: "paper-track-preview-dialog",
   props: {
     instance: {
       type: Object,

+ 1 - 1
src/modules/stmms/components/UploadPaperAnswerDialog.vue

@@ -12,7 +12,7 @@
   >
     <el-form ref="modalFormComp" :model="infos" label-width="130px">
       <div v-for="paperType in paperTypes" :key="paperType" class="part-box">
-        <h3 class="part-box-title">卷型{{ paperType }}</h3>
+        <h3 class="mb-2">卷型{{ paperType }}</h3>
         <el-form-item
           v-for="(val, key) in fileTypes"
           :key="key"

+ 45 - 45
src/modules/stmms/views/ScoreArchive.vue

@@ -4,30 +4,23 @@
       <el-form ref="FilterForm" label-position="left" inline>
         <template v-if="checkPrivilege('condition', 'condition')">
           <el-form-item label="考试时间:">
-            <el-select
-              v-model="filter.semester"
+            <semester-select
+              v-model="filter.semesterId"
               placeholder="考试时间"
-              filterable
-              clearable
-            >
-              <el-option
-                v-for="item in semesters"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              ></el-option>
-            </el-select>
+            ></semester-select>
           </el-form-item>
           <el-form-item label="学院:">
             <college-select
-              v-model="filter.collegeId"
+              v-model="filter.orgId"
+              :semester-id="filter.semesterId"
+              cascader
               placeholder="学院"
             ></college-select>
           </el-form-item>
           <el-form-item label="专业:">
             <major-select
               v-model="filter.majorId"
-              :college-id="filter.collegeId"
+              :college-id="filter.orgId"
               cascader
               placeholder="专业"
             ></major-select>
@@ -41,25 +34,19 @@
             ></class-select>
           </el-form-item>
           <el-form-item label="课程:">
-            <el-select
+            <course-select
               v-model="filter.courseCode"
               placeholder="课程"
               filterable
               clearable
-            >
-              <el-option
-                v-for="item in courses"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              ></el-option>
-            </el-select>
+            ></course-select>
           </el-form-item>
         </template>
         <el-form-item label-width="0px">
           <el-button
             v-if="checkPrivilege('button', 'select')"
             type="primary"
+            :disabled="!filter.semesterId || !filter.orgId"
             @click="toPage(1)"
             >查询</el-button
           >
@@ -67,7 +54,7 @@
       </el-form>
       <div class="part-box-action">
         <el-button
-          type="primary"
+          type="success"
           icon="el-icon-refresh"
           :loading="loading"
           @click="toSync"
@@ -100,18 +87,18 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="examTime" label="考试时间"></el-table-column>
-        <el-table-column
-          prop="examStudentName"
-          label="姓名"
-          width="120"
-        ></el-table-column>
+        <el-table-column prop="semesterName" label="考试时间"></el-table-column>
+        <el-table-column prop="name" label="姓名" width="120"></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="orgName" 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 prop="courseName" label="课程名"></el-table-column>
-        <el-table-column prop="totalScore" label="成绩"></el-table-column>
+        <el-table-column
+          prop="totalScore"
+          label="成绩"
+          width="80"
+        ></el-table-column>
         <el-table-column class-name="action-column" label="操作" width="160px">
           <template slot-scope="scope">
             <el-button
@@ -123,7 +110,7 @@
             >
             <el-button
               v-if="checkPrivilege('link', 'download')"
-              class="btn-danger"
+              class="btn-primary"
               type="text"
               :loading="downloading"
               @click="toDownload(scope.row)"
@@ -144,6 +131,13 @@
         </el-pagination>
       </div>
     </div>
+
+    <!-- image-preview -->
+    <simple-image-preview
+      :cur-image="curImage"
+      simple
+      ref="SimpleImagePreview"
+    ></simple-image-preview>
   </div>
 </template>
 
@@ -156,15 +150,17 @@ import {
   scoreSync
 } from "../api";
 // import { downloadPaper } from "../components/downloadPaper";
-import { downloadByUrl } from "@/plugins/download";
+import { downloadByApi } from "@/plugins/download";
+import SimpleImagePreview from "@/components/SimpleImagePreview";
 
 export default {
   name: "score-archive",
+  components: { SimpleImagePreview },
   data() {
     return {
       filter: {
-        semester: "",
-        collegeId: "",
+        semesterId: "",
+        orgId: "",
         majorId: "",
         clazzId: "",
         courseCode: ""
@@ -173,8 +169,7 @@ export default {
       size: this.GLOBAL.pageSize,
       total: 0,
       dataList: [],
-      semesters: [],
-      courses: [],
+      curImage: {},
       curRow: {},
       curPapers: [],
       downloading: false,
@@ -182,7 +177,7 @@ export default {
     };
   },
   mounted() {
-    this.getList();
+    // this.getList();
   },
   methods: {
     async getList() {
@@ -225,23 +220,28 @@ export default {
       this.$message.success("导出任务已经提交");
     },
     toViewPaper(row) {
-      if (!row.sheetUrl) {
+      if (!row.sheetUrls) {
         this.$message.error("原卷缺失!");
         return;
       }
-      // window.open(row.sheetUrl);
-      downloadByUrl(row.sheetUrl);
+      this.curImage = { url: row.sheetUrls };
+      this.$refs.SimpleImagePreview.open();
     },
     async toDownload(row) {
-      if (!this.downloading) return;
+      if (this.downloading) return;
       this.downloading = true;
-      const res = await scoreDownload(row.studentCode).catch(() => {});
+
+      const res = await downloadByApi(() => {
+        return scoreDownload(row.studentCode);
+      }, `${row.name}-原卷.jpg`).catch(e => {
+        console.log(e);
+      });
       this.downloading = false;
+
       if (!res) {
         this.$message.error("下载失败,请重新尝试!");
         return;
       }
-      downloadByUrl(res.trajectoryUrls);
 
       this.$message.success("下载成功!");
     }

+ 4 - 3
src/plugins/download.js

@@ -27,8 +27,8 @@ export function downloadByApi(fetchFunc, fileName) {
       downloadByBlob(new Blob([res.data]), filename);
       return true;
     })
-    .catch(() => {
-      return Promise.reject();
+    .catch(e => {
+      return Promise.reject(e);
     });
 }
 
@@ -70,7 +70,8 @@ export function downloadByUrl(url, filename) {
 export function downloadByImgUrl(url, filename) {
   return new Promise((resolve, reject) => {
     const img = new Image();
-    img.crossOrigin = "";
+    // 跨域支持,需要服务端辅助配置
+    // img.crossOrigin = "";
     img.onload = function() {
       const canvas = document.createElement("canvas");
       const ctx = canvas.getContext("2d");

+ 5 - 1
src/plugins/filters.js

@@ -12,7 +12,8 @@ import {
   ORG_TYPE,
   CARD_SOURCE_TYPE,
   MARK_TASK_SYNC_STATUS,
-  STMMS_SYNC_TYPE
+  STMMS_SYNC_TYPE,
+  SYNC_PRINT_STATUS
 } from "../constants/enumerate";
 import { formatDate } from "../plugins/utils";
 
@@ -80,3 +81,6 @@ Vue.filter("markTaskSyncStatusFilter", function(val) {
 Vue.filter("stmmsSyncTypeFilter", function(val) {
   return STMMS_SYNC_TYPE[val] || DEFAULT_FIELD;
 });
+Vue.filter("syncPrintStatusFilter", function(val) {
+  return SYNC_PRINT_STATUS[val] || DEFAULT_FIELD;
+});

+ 2 - 0
src/plugins/globalVuePlugins.js

@@ -18,6 +18,7 @@ import CampusSelect from "../components/base/CampusSelect.vue";
 import PrintRoomSelect from "../components/base/PrintRoomSelect.vue";
 import TeachingRoomSelect from "../components/base/TeachingRoomSelect.vue";
 import FacultySelect from "../components/base/FacultySelect.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";
@@ -39,6 +40,7 @@ const components = {
   PrintRoomSelect,
   TeachingRoomSelect,
   FacultySelect,
+  SemesterSelect,
   CollegeSelect,
   ClazzSelect,
   MajorSelect,

+ 86 - 36
src/views/Home.vue

@@ -131,7 +131,8 @@ import { SYS_ADMIN_NAME } from "@/constants/enumerate";
 const MENU_ICONS = {
   base: "base",
   exam: "exam",
-  customer: "customer"
+  customer: "customer",
+  stmms: "book"
 };
 
 export default {
@@ -165,7 +166,7 @@ export default {
   watch: {
     $route(val) {
       if (val.name === "Home") return;
-      this.actCurNav();
+      this.routerChange();
     }
   },
   computed: {
@@ -178,15 +179,12 @@ export default {
     ...mapActions("exam", ["updateWaitTaskCount"]),
     initData1() {
       // 开发阶段专用
-      this.privileges = localMenus;
+      this.initPrivilegeMap(localMenus);
+      this.privileges = this.transformMenu(localMenus);
       this.menus = this.getMenu();
-      this.initPrivilegeMap(this.privileges);
 
       if (this.$route.name === "Home") {
-        const firstRouteName = this.getFirstRouter();
-        this.$router.replace({
-          name: firstRouteName
-        });
+        this.toMenu(this.menus[0]);
         return;
       }
 
@@ -197,19 +195,26 @@ export default {
         return;
       }
 
-      this.actCurNav();
+      this.updateBreadcrumbs();
+      const curMenu = this.menus.find(
+        menu => menu.url === this.breadcrumbs[0].url
+      );
+      this.menuChange(curMenu);
+      if (
+        this.validRoutes.includes("WaitTask") &&
+        this.curMenu.url === "exam"
+      ) {
+        this.updateWaitTaskCount();
+      }
     },
     async initData() {
       const data = await sysMenu();
-      this.privileges = data.privileges;
-      this.menus = this.getMenu();
       this.initPrivilegeMap(data.privileges);
+      this.privileges = this.transformMenu(data.privileges);
+      this.menus = this.getMenu();
 
       if (this.$route.name === "Home") {
-        const firstRouteName = this.getFirstRouter();
-        this.$router.replace({
-          name: firstRouteName
-        });
+        this.toMenu(this.menus[0]);
         return;
       }
 
@@ -220,16 +225,44 @@ export default {
         return;
       }
 
-      this.actCurNav();
+      this.updateBreadcrumbs();
+      const curMenu = this.menus.find(
+        menu => menu.url === this.breadcrumbs[0].url
+      );
+      this.menuChange(curMenu);
+
+      if (
+        this.validRoutes.includes("WaitTask") &&
+        this.curMenu.url === "exam"
+      ) {
+        this.updateWaitTaskCount();
+      }
+    },
+    transformMenu(list) {
+      return list.map(item => {
+        return {
+          id: item.id,
+          parentId: item.parentId,
+          name: item.name,
+          type: item.type,
+          url: item.url
+        };
+      });
     },
     getMenu() {
-      let menus = this.privileges.filter(item => item.parentId === "-1");
+      const getChildren = id => {
+        return this.privileges
+          .filter(item => item.parentId === id)
+          .map(item => {
+            return { ...item };
+          });
+      };
+
+      let menus = getChildren("-1");
       let validRoutes = [];
       const toTree = menus => {
         menus.forEach(menu => {
-          const children = this.privileges.filter(
-            item => item.parentId === menu.id
-          );
+          const children = getChildren(menu.id);
           if (children.length) {
             menu.children = children;
             toTree(menu.children);
@@ -244,14 +277,12 @@ export default {
       // console.log(JSON.stringify(menus));
       return menus;
     },
-    getFirstRouter() {
-      let childNavs = this.privileges;
+    getCurMenuFirstRouter() {
       let firstRouteName = "";
-      while (childNavs.length) {
-        firstRouteName = childNavs[0].url;
-        childNavs = this.privileges.filter(
-          item => item.parentId === childNavs[0].id
-        );
+      let menu = this.curMenu;
+      while (menu) {
+        firstRouteName = menu.url;
+        menu = menu.children && menu.children[0];
       }
 
       return firstRouteName;
@@ -278,19 +309,21 @@ export default {
       this.$store.commit("setPrivilegeMap", privilegeMap);
       this.$ls.set("privilegeMap", privilegeMap);
     },
-    getSubMenus(menu) {
-      return this.privileges.filter(
-        m => m.parentId === menu.id && m.type === "MENU"
-      );
-    },
-    toMenu(menu) {
-      if (this.curMenu.url === menu.url) return;
+    menuChange(menu) {
       this.curMenu = menu;
 
       this.curSubMenuNames = this.privileges
         .filter(item => item.parentId === menu.id)
         .map(item => item.url);
     },
+    toMenu(menu) {
+      if (this.curMenu.url === menu.url) return;
+      this.menuChange(menu);
+      const firstRouteName = this.getCurMenuFirstRouter();
+      this.$router.replace({
+        name: firstRouteName
+      });
+    },
     updateBreadcrumbs() {
       this.curRouteName = this.$route.name;
       let breadcrumbs = [];
@@ -308,9 +341,8 @@ export default {
 
       this.breadcrumbs = breadcrumbs;
     },
-    actCurNav() {
+    routerChange() {
       this.updateBreadcrumbs();
-      this.toMenu(this.breadcrumbs[0]);
 
       if (
         this.validRoutes.includes("WaitTask") &&
@@ -342,6 +374,24 @@ export default {
     },
     resetPwdModified() {
       this.logoutAction();
+    },
+    // other
+    getSubMenus(menu) {
+      return this.privileges.filter(
+        m => m.parentId === menu.id && m.type === "MENU"
+      );
+    },
+    getFirstRouter() {
+      let childNavs = this.privileges;
+      let firstRouteName = "";
+      while (childNavs.length) {
+        firstRouteName = childNavs[0].url;
+        childNavs = this.privileges.filter(
+          item => item.parentId === childNavs[0].id
+        );
+      }
+
+      return firstRouteName;
     }
   }
 };