Browse Source

api -md 02 and author md

zhangjie 5 years ago
parent
commit
337ff7a657

+ 2 - 8
src/api.js

@@ -327,18 +327,12 @@ export const markTaskInfo = (subjectId, questionId) => {
 // inspection -------------------------->
 // inspection-log
 export const inspectionActionLogPageList = datas => {
-  // TODO:
   return $get(`/api/marklog/selectMarkLog`, datas);
 };
 export const inspectionCollectLogPageList = datas => {
-  // TODO:
-  return $get(`/api/marklog/selectCollectMarkLog`, datas);
-};
-export const inspectionCheckGradePageList = datas => {
-  // TODO:
   return $get(`/api/marklog/selectCollectMarkLog`, datas);
 };
 export const inspectionConfirmCheckGrade = datas => {
-  // TODO:
-  return $post(`/api/marklog/selectCollectMarkLog`, datas);
+  // id,auditStatus
+  return $post(`/api/changelevel/changeLevelAudit`, datas);
 };

+ 140 - 3
src/constants/authority.js

@@ -1,3 +1,140 @@
-export default {
-  ADMIN: ["Main", "WorkManage", ""]
-};
+export const main = [
+  {
+    name: "WorkOverview",
+    title: "总览"
+  },
+  {
+    name: "PaperManage",
+    title: "试卷管理"
+  },
+  {
+    name: "ClientMonitor",
+    title: "设备监控"
+  },
+  {
+    name: "StudentManage",
+    title: "考生管理"
+  },
+  {
+    name: "ClientSet",
+    title: "采集设置"
+  },
+  {
+    name: "GradingSet",
+    title: "分档设置"
+  },
+  {
+    name: "MarkSet",
+    title: "打分设置"
+  },
+  {
+    name: "QualityAnalysis",
+    title: "质量分析"
+  },
+  {
+    name: "StudentScore",
+    title: "成绩查询"
+  }
+];
+
+export const clientSet = [
+  {
+    name: "ClientAccountSet",
+    title: "账号设置"
+  },
+  {
+    name: "ClientParamSet",
+    title: "参数设置"
+  },
+  {
+    name: "InspectionAccountSet",
+    title: "纪检账号"
+  }
+];
+
+export const gradingSet = [
+  {
+    name: "GradingLevelSet",
+    title: "档位设置"
+  },
+  {
+    name: "GradingRuleSet",
+    title: "定档规则"
+  },
+  {
+    name: "UploadPaper",
+    title: "上传试题"
+  }
+];
+
+export const markSet = [
+  {
+    name: "MarkRuleSet",
+    title: "打分设置"
+  },
+  {
+    name: "ExportPaper",
+    title: "图片导出"
+  }
+];
+
+export const grading = [
+  {
+    name: "GradingProgress",
+    title: "分档进度"
+  },
+  {
+    name: "GradingDetail",
+    title: "分档详情"
+  },
+  {
+    name: "GradingUserManage",
+    title: "用户管理"
+  },
+  {
+    name: "GradingGroupManage",
+    title: "分档分组"
+  },
+  {
+    name: "ExamPaperView",
+    title: "查看试卷"
+  }
+];
+
+export const mark = [
+  {
+    name: "MarkProgress",
+    title: "打分进度"
+  },
+  {
+    name: "MarkTaskManage",
+    title: "任务发布"
+  },
+  {
+    name: "MarkDetail",
+    title: "打分详情"
+  },
+  {
+    name: "ExamPaperView",
+    title: "查看试卷"
+  }
+];
+
+export const inspection = [
+  {
+    name: "InspectionActionLogs",
+    title: "操作日志"
+  },
+  {
+    name: "InspectionCollectLogs",
+    title: "采集日志"
+  },
+  {
+    name: "InspectionGrading",
+    title: "改档处理"
+  },
+  {
+    name: "InspectionScore",
+    title: "成绩查询"
+  }
+];

+ 2 - 2
src/constants/enumerate.js

@@ -52,8 +52,8 @@ export const SORT_ORDER_TYPE = {
   1: "定序"
 };
 export const SORT_RULE_TYPE = {
-  time: "按时间",
-  examNumber: "按考号"
+  1: "按时间",
+  2: "按考号"
 };
 // cafa-exception
 export const CAFA_EXCEPTION_TYPE = {

+ 2 - 2
src/modules/client-set/ClientSet.vue

@@ -15,7 +15,7 @@
 </template>
 
 <script>
-import { clientSetNavs } from "@/routers/main";
+import { clientSet } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 
 export default {
@@ -23,7 +23,7 @@ export default {
   mixins: [menuMixins],
   data() {
     return {
-      navs: clientSetNavs,
+      navs: clientSet,
       curNav: {}
     };
   },

+ 2 - 2
src/modules/grading-set/GradingSet.vue

@@ -15,7 +15,7 @@
 </template>
 
 <script>
-import { gradingSetNavs } from "@/routers/main";
+import { gradingSet } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 
 export default {
@@ -23,7 +23,7 @@ export default {
   mixins: [menuMixins],
   data() {
     return {
-      navs: gradingSetNavs,
+      navs: gradingSet,
       curNav: {}
     };
   },

+ 13 - 7
src/modules/grading/Grading.vue

@@ -27,7 +27,7 @@
 </template>
 
 <script>
-import { navs } from "@/routers/grading";
+import { grading } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 import { subjectDetail } from "@/api";
 
@@ -50,19 +50,25 @@ export default {
     }
   },
   mounted() {
-    this.buildNavs();
-    this.actSubNav();
-    this.getSubjectDetail();
+    this.initData();
   },
   methods: {
-    async getSubjectDetail() {
+    async initData() {
       this.curSubject = await subjectDetail(this.subjectId);
+      this.buildNavs();
+      this.actSubNav();
     },
     buildNavs() {
       const user = this.$ls.get("user", {});
-      this.navs = navs;
+      this.navs = [...grading];
       if (user.role === "ADMIN") {
-        this.navs = [{ title: "总览", name: "WorkOverview" }, ...navs];
+        this.navs.pop();
+        this.navs.unshift({ title: "总览", name: "WorkOverview" });
+        if (this.curSubject.stage === "LEVEL") {
+          this.navs[this.navs.length - 1].title = "打分分组";
+        }
+      } else {
+        this.navs.splice(2, 2);
       }
     },
     actSubNav() {

+ 1 - 1
src/modules/grading/GradingDetail.vue

@@ -37,7 +37,7 @@
             :levels="levels"
             :question-id="filter.questionId"
             @on-paper-click="toViewCarouselPaper"
-            v-if="levels && filter.questionId"
+            v-if="levels.length && filter.questionId"
           ></grade-standard-paper>
           <grade-history-paper
             :question-id="filter.questionId"

+ 1 - 1
src/modules/grading/GradingGroupManage.vue

@@ -136,7 +136,7 @@ export default {
 
       this.$Modal.confirm({
         title: "删除警告",
-        content: "确定要删除当前账号吗?",
+        content: "确定要删除当前分组吗?",
         onOk: async () => {
           await deleteGradingGroup(this.subjectId, group.id);
           this.removeGroup(gindex);

+ 1 - 1
src/modules/grading/GradingOperation.vue

@@ -46,7 +46,7 @@
                 :levels="levels"
                 :question-id="filter.questionId"
                 @on-paper-click="toViewCarouselPaper"
-                v-if="levels && filter.questionId"
+                v-if="levels.length && filter.questionId"
               ></grade-standard-paper>
               <grade-history-paper
                 :question-id="filter.questionId"

+ 2 - 2
src/modules/inspection/Inspection.vue

@@ -26,14 +26,14 @@
 </template>
 
 <script>
-import { navs } from "@/routers/inspection";
+import { inspection } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 
 export default {
   name: "inspection",
   mixins: [menuMixins],
   data() {
-    return { navs, curNav: {} };
+    return { navs: inspection, curNav: {} };
   },
   watch: {
     $route: {

+ 38 - 18
src/modules/inspection/InspectionActionLogs.vue

@@ -12,6 +12,7 @@
         <FormItem label="工作文件夹:">
           <Select
             v-model="filter.workId"
+            @on-change="workChange"
             placeholder="请选择工作文件夹"
             style="width: 150px"
           >
@@ -25,7 +26,12 @@
         </FormItem>
         <FormItem label="科目:">
           <Select v-model="filter.subject" placeholder="请选择科目">
-            <Option value=""></Option>
+            <Option
+              v-for="subject in subjects"
+              :key="subject.id"
+              :value="subject.subject"
+              :label="subject.name"
+            ></Option>
           </Select>
         </FormItem>
         <FormItem label="考号:">
@@ -61,6 +67,7 @@
           <DatePicker
             v-model="searchTime"
             type="datetimerange"
+            @on-change="searchTimeChange"
             placeholder="请选择查询时间段"
             style="width: 400px"
             transfer
@@ -98,14 +105,15 @@
 <script>
 import { inspectionActionLogPageList, workList } from "@/api";
 import { ACTION_TYPE } from "@/constants/enumerate";
+import { filterObjNull } from "@/plugins/utils";
 
 export default {
   name: "inspection-action-logs",
   data() {
     return {
       filter: {
-        workId: 33,
-        subject: "SC",
+        workId: null,
+        subject: null,
         examNumber: "",
         name: "",
         operType: null,
@@ -117,6 +125,7 @@ export default {
       size: this.GLOBAL.pageSize,
       total: 0,
       works: [],
+      subjects: [],
       searchTime: [],
       dataList: [],
       columns: [
@@ -147,7 +156,10 @@ export default {
         },
         {
           title: "操作类型",
-          key: "operType"
+          key: "operType",
+          render: (h, param) => {
+            return h("div", ACTION_TYPE[param.row.operType]);
+          }
         },
         {
           title: "操作前数据",
@@ -165,29 +177,27 @@ export default {
     };
   },
   mounted() {
-    this.getWorkList();
-    this.getList();
+    this.initData();
   },
   methods: {
+    async initData() {
+      await this.getWorkList();
+      this.filter.workId = this.works[0].id;
+      this.subjects = this.works[0].subjects;
+      this.filter.subject = this.subjects[0].subject;
+      this.getList();
+    },
     async getWorkList() {
-      const data = await workList();
-      this.works = data.map(item => {
-        return {
-          id: item.id,
-          name: item.name
-        };
-      });
+      this.works = await workList();
     },
     async getList() {
-      // const [startTime, endTime] = this.searchTime;
       const datas = {
-        // ...this.filter,
-        // startTime,
-        // endTime,
+        ...this.filter,
         curPage: this.current - 1,
         pageSize: this.size
       };
-      const data = await inspectionActionLogPageList(datas);
+
+      const data = await inspectionActionLogPageList(filterObjNull(datas));
       this.dataList = data.data;
       this.total = data.totalCount;
     },
@@ -195,6 +205,16 @@ export default {
       this.current = page;
       this.getList();
     },
+    workChange() {
+      this.filter.subject = null;
+      const curWork = this.works.find(item => item.id === this.filter.workId);
+      this.subjects = curWork.subjects;
+      this.filter.subject = this.subjects[0].subject;
+    },
+    searchTimeChange(val) {
+      this.filter.startTime = val[0] || null;
+      this.filter.endTime = val[1] || null;
+    },
     exportLogs() {}
   }
 };

+ 33 - 20
src/modules/inspection/InspectionCollectLogs.vue

@@ -26,7 +26,12 @@
         </FormItem>
         <FormItem label="科目:">
           <Select v-model="filter.subject" placeholder="请选择科目">
-            <Option value=""></Option>
+            <Option
+              v-for="subject in subjects"
+              :key="subject.id"
+              :value="subject.subject"
+              :label="subject.name"
+            ></Option>
           </Select>
         </FormItem>
         <FormItem label="考号:">
@@ -64,6 +69,7 @@
             type="datetimerange"
             placeholder="请选择查询时间段"
             style="width: 400px"
+            @on-change="searchTimeChange"
             transfer
           ></DatePicker>
         </FormItem>
@@ -102,14 +108,15 @@ import {
   workList,
   clientUserPageList
 } from "@/api";
+import { filterObjNull } from "@/plugins/utils";
 
 export default {
   name: "inspection-collect-logs",
   data() {
     return {
       filter: {
-        workId: 33,
-        subject: "SC",
+        workId: null,
+        subject: null,
         examNumber: "",
         name: "",
         createUserId: null,
@@ -120,6 +127,7 @@ export default {
       size: this.GLOBAL.pageSize,
       total: 0,
       works: [],
+      subjects: [],
       collectionUsers: [],
       searchTime: [],
       dataList: [],
@@ -162,35 +170,28 @@ export default {
     };
   },
   mounted() {
-    this.getWorkList();
-    this.getList();
+    this.initData();
   },
   methods: {
+    async initData() {
+      await this.getWorkList();
+      this.filter.workId = this.works[0].id;
+      this.workChange();
+      this.getList();
+    },
     async getCollectionUsers(workId) {
       this.collectionUsers = await clientUserPageList({ workId });
     },
     async getWorkList() {
-      const data = await workList();
-      this.works = data.map(item => {
-        return {
-          id: item.id,
-          name: item.name
-        };
-      });
-    },
-    workChange() {
-      this.getCollectionUsers(this.filter.workId);
+      this.works = await workList();
     },
     async getList() {
-      // const [startTime, endTime] = this.searchTime;
       const datas = {
-        // ...this.filter,
-        // startTime,
-        // endTime,
+        ...this.filter,
         curPage: this.current - 1,
         pageSize: this.size
       };
-      const data = await inspectionCollectLogPageList(datas);
+      const data = await inspectionCollectLogPageList(filterObjNull(datas));
       this.dataList = data.data;
       this.total = data.totalCount;
     },
@@ -198,6 +199,18 @@ export default {
       this.current = page;
       this.getList();
     },
+    workChange() {
+      this.filter.subject = null;
+      this.filter.createUserId = null;
+      const curWork = this.works.find(item => item.id === this.filter.workId);
+      this.subjects = curWork.subjects;
+      this.filter.subject = this.subjects[0].subject;
+      this.getCollectionUsers(this.filter.workId);
+    },
+    searchTimeChange(val) {
+      this.filter.startTime = val[0] || null;
+      this.filter.endTime = val[1] || null;
+    },
     exportLogs() {}
   }
 };

+ 91 - 59
src/modules/inspection/InspectionGrading.vue

@@ -4,6 +4,7 @@
       <FormItem>
         <Select
           v-model="filter.workId"
+          @on-change="workChange"
           placeholder="请选择工作文件夹"
           style="width: 150px"
         >
@@ -16,13 +17,27 @@
         </Select>
       </FormItem>
       <FormItem>
-        <Select v-model="filter.areaCode" placeholder="请选择考区">
-          <Option value=""></Option>
+        <Select
+          v-model="filter.subject"
+          @on-change="subjectChange"
+          placeholder="请选择科目"
+        >
+          <Option
+            v-for="subject in subjects"
+            :key="subject.id"
+            :value="subject.subject"
+            :label="subject.name"
+          ></Option>
         </Select>
       </FormItem>
       <FormItem>
-        <Select v-model="filter.subject" placeholder="请选择科目">
-          <Option value=""></Option>
+        <Select v-model="filter.questionId" placeholder="请选择考区">
+          <Option
+            v-for="area in areas"
+            :key="area.id"
+            :value="area.id"
+            :label="area.areaName"
+          ></Option>
         </Select>
       </FormItem>
       <FormItem>
@@ -33,9 +48,9 @@
           style="width: 120px"
         >
           <Option
-            v-for="(val, key) in STATUS_TYPE"
+            v-for="(val, key) in CHANGE_LEVEL_STATUS"
             :key="key"
-            :value="key"
+            :value="key * 1"
             :label="val"
           ></Option>
         </Select>
@@ -60,7 +75,7 @@
           </div>
         </div>
       </div>
-      <div class="part-page">
+      <div class="part-page" v-if="total > size">
         <Page
           :current="current"
           :total="total"
@@ -70,23 +85,19 @@
           @on-change="toPage"
         ></Page>
       </div>
-      <div class="check-grade-action">
-        <div class="paper-info" v-if="curPaper.id">
+      <div class="check-grade-action" v-if="curPaper.id">
+        <div class="paper-info">
           <p>{{ curPaper.examNumber }}</p>
           <p>NO.{{ curPaper.sn }}</p>
-          <p>原档位:{{ curPaper.orgGrade }}</p>
-          <p>申请档位:{{ curPaper.applyGrade }}</p>
+          <p>原档位:{{ curPaper.originLevel }}</p>
+          <p>申请档位:{{ curPaper.redoLevel }}</p>
         </div>
-        <div class="check-grade-result" v-if="curPaper.id">
-          <p>{{ curPaper.status ? "已同意" : "未同意" }}</p>
+        <div class="check-grade-result" v-if="curPaper.auditStatus">
+          <p>{{ curPaper.auditStatus === 1 ? "已同意" : "未同意" }}</p>
         </div>
-        <div class="check-grade-btn" v-if="curPaper.id">
-          <Button type="primary" @click="confirm(1)" :disabled="curPaper.status"
-            >同意改档</Button
-          >
-          <Button type="error" @click="confirm(0)" :disabled="curPaper.status"
-            >不同意改档</Button
-          >
+        <div class="check-grade-btn" v-else>
+          <Button type="primary" @click="confirm(1)">同意改档</Button>
+          <Button type="error" @click="confirm(0)">不同意改档</Button>
         </div>
       </div>
     </div>
@@ -96,8 +107,7 @@
       class="check-grade-image-preview"
       :image-list="papers"
       :init-index="curPaperIndex"
-      @on-prev="paperPrev"
-      @on-next="paperNext"
+      @on-paper-change="selectPaper"
       @on-page-prev="prevPage"
       @on-page-next="nextPage"
       header-hide
@@ -108,14 +118,14 @@
 </template>
 
 <script>
-import { papers } from "@/constants/apiTempData";
-
 import {
-  inspectionCheckGradePageList,
+  changeLevelPaperAllList,
   inspectionConfirmCheckGrade,
-  workList
+  workList,
+  areaList
 } from "@/api";
 import ImagePreview from "@/components/common/ImagePreview";
+import { CHANGE_LEVEL_STATUS } from "@/constants/enumerate";
 
 export default {
   name: "inspection-grading",
@@ -124,15 +134,14 @@ export default {
     return {
       filter: {
         workId: "",
-        areaCode: "",
         subject: "",
-        status: ""
-      },
-      STATUS_TYPE: {
-        0: "未处理",
-        1: "已处理"
+        questionId: "",
+        status: 0
       },
+      CHANGE_LEVEL_STATUS,
       works: [],
+      subjects: [],
+      areas: [],
       current: 1,
       size: 8,
       total: 0,
@@ -146,24 +155,27 @@ export default {
     this.initData();
   },
   methods: {
-    initData() {
-      this.papers = papers.map((item, index) => {
-        return {
-          ...item,
-          orgGrade: "A",
-          applyGrade: "B",
-          status: Math.random() < 0.3
-        };
-      });
-      this.curPaper = { ...this.papers[0] };
-      this.curPaperIndex = 0;
+    async initData() {
+      await this.getWorkList();
+      this.filter.workId = this.works[0].id;
+      this.workChange();
+      await this.getAreaList();
+      this.filter.questionId = this.areas[0].id;
+      this.getList();
     },
     async getWorkList() {
-      const data = await workList();
-      this.works = data.map(item => {
+      this.works = await workList();
+    },
+    async getAreaList() {
+      const data = await areaList({
+        workId: this.filter.workId,
+        subject: this.filter.subject
+      });
+      this.areas = data.map(item => {
         return {
           id: item.id,
-          name: item.name
+          areaName: item.areaName,
+          areaCode: item.areaCode
         };
       });
     },
@@ -173,7 +185,7 @@ export default {
         current: this.current,
         size: this.size
       };
-      const data = await inspectionCheckGradePageList(datas);
+      const data = await changeLevelPaperAllList(datas);
       this.papers = data.data;
       this.total = data.totalCount;
     },
@@ -181,9 +193,20 @@ export default {
       this.current = page;
       this.getList();
     },
+    workChange() {
+      this.filter.subject = null;
+      this.filter.questionId = null;
+      const curWork = this.works.find(item => item.id === this.filter.workId);
+      this.subjects = curWork.subjects;
+      this.filter.subject = this.subjects[0].subject;
+    },
+    subjectChange() {
+      this.filter.questionId = null;
+      this.getAreaList();
+    },
     async confirm(isAgree) {
       if (isAgree) {
-        this.updateCheckGradeState(status);
+        this.updateCheckGradeState(isAgree);
         return;
       }
 
@@ -191,18 +214,23 @@ export default {
         title: "操作警告",
         content: "确定不同意当前改档吗?",
         onOk: () => {
-          this.updateCheckGradeState(status);
+          this.updateCheckGradeState(isAgree);
         }
       });
     },
-    async updateCheckGradeState(status) {
-      // TODO:
-      await inspectionConfirmCheckGrade(this.curPaper.id);
+    async updateCheckGradeState(auditStatus) {
+      await inspectionConfirmCheckGrade({
+        id: this.curPaper.id,
+        auditStatus
+      });
       this.$refs.ImagePreview.showNext();
     },
-    toReview(index) {
-      this.curPaper = { ...this.papers[index] };
+    selectPaper(index) {
       this.curPaperIndex = index;
+      this.curPaper = { ...this.papers[index] };
+    },
+    toReview(index) {
+      this.selectPaper(index);
       this.$refs.ImagePreview.open();
     },
     paperPrev(index) {
@@ -213,21 +241,25 @@ export default {
       this.curPaper = { ...this.papers[index] };
       this.curPaperIndex = index;
     },
-    prevPage() {
+    async prevPage() {
       if (this.current === 1) {
         this.$Message.warning("当前已经是第一条数据了");
         return;
       }
       this.current--;
-      this.getList();
+      await this.getList();
+      this.selectPaper(this.papers.length - 1);
+      this.$refs.ImagePreview.initData();
     },
-    nextPage() {
+    async nextPage() {
       if (this.current === this.totalPage) {
         this.$Message.warning("当前已经是最后一条数据了");
         return;
       }
-      this.current++;
-      this.getList();
+      // 下一页时,继续获取当前页数据。
+      await this.getList();
+      this.selectPaper(0);
+      this.$refs.ImagePreview.initData();
     }
   }
 };

+ 23 - 17
src/modules/login/login.vue

@@ -77,8 +77,11 @@ export default {
         MARK_LEADER_SCORE: {
           router: "Mark"
         },
-        INSPECTOR: {
+        INSPECTION: {
           router: "Inspection"
+        },
+        QC: {
+          router: "Quality"
         }
       },
       isSubmit: false
@@ -114,27 +117,30 @@ export default {
         workId: data.workId,
         subjectId: `${data.workId}-${data.subject}`
       };
-      const curSubject = await subjectDetail(params.subjectId);
-      const stage = curSubject.stage;
-
       // 根据角色跳转不同的路由
       const { role, markRight } = data;
-      if (role === "MARKER") {
-        if (stage === "INIT") {
-          this.$Message.error("当前工作未开启分档!");
-          return;
-        }
-        if (
-          (stage === "LEVEL" && markRight === "ALLOW_SCORING") ||
-          (stage === "SCORE" && markRight === "ALLOW_LEVELING")
-        ) {
-          this.$Message.error("您的权限不够!");
-          return;
+      let routerType = role;
+      if (role.includes("MARK")) {
+        const curSubject = await subjectDetail(params.subjectId);
+        const stage = curSubject.stage;
+        routerType = `${role}_${stage}`;
+
+        if (role === "MARKER") {
+          if (stage === "INIT") {
+            this.$Message.error("当前工作未开启分档!");
+            return;
+          }
+          if (
+            (stage === "LEVEL" && markRight === "ALLOW_SCORING") ||
+            (stage === "SCORE" && markRight === "ALLOW_LEVELING")
+          ) {
+            this.$Message.error("您的权限不够!");
+            return;
+          }
         }
       }
 
-      const type = role.includes("MARK") ? `${role}_${stage}` : role;
-      const routerName = this.rightRoutes[type].router;
+      const routerName = this.rightRoutes[routerType].router;
       this.$router.push({
         name: routerName,
         params

+ 15 - 0
src/modules/main/ExamPaperView.vue

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

+ 2 - 2
src/modules/main/Main.vue

@@ -29,7 +29,7 @@
 </template>
 
 <script>
-import { navs } from "@/routers/main";
+import { main } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 
 export default {
@@ -37,7 +37,7 @@ export default {
   mixins: [menuMixins],
   data() {
     return {
-      navs,
+      navs: main,
       curNav: {}
     };
   },

+ 4 - 0
src/modules/main/PaperManage.vue

@@ -20,6 +20,8 @@
         <FormItem label="开始编号">
           <InputNumber
             v-model="filter.startNumber"
+            :min="1"
+            :precision="0"
             placeholder="请输入数字"
             clearable
           ></InputNumber>
@@ -27,6 +29,8 @@
         <FormItem label="结束编号">
           <InputNumber
             v-model="filter.endNumber"
+            :min="filter.startNumber"
+            :precision="0"
             placeholder="请输入数字"
             clearable
           ></InputNumber>

+ 4 - 0
src/modules/main/StudentManage.vue

@@ -44,13 +44,17 @@
         <FormItem label="起始考号">
           <InputNumber
             v-model="filter.startNumber"
+            :min="1"
+            :precision="0"
             placeholder="请输入数字"
             clearable
           ></InputNumber>
         </FormItem>
         <FormItem label="终止考号">
           <InputNumber
+            :min="filter.startNumber"
             v-model="filter.endNumber"
+            :precision="0"
             placeholder="请输入数字"
             clearable
           ></InputNumber>

+ 57 - 20
src/modules/main/StudentScore.vue

@@ -5,6 +5,7 @@
         <FormItem label="工作文件夹:" v-if="IS_INSPECTION">
           <Select
             v-model="filter.workId"
+            @on-change="workChange"
             placeholder="请选择工作文件夹"
             style="width: 150px"
           >
@@ -16,15 +17,10 @@
             ></Option>
           </Select>
         </FormItem>
-        <FormItem label="考区:" v-if="IS_INSPECTION">
-          <Select v-model="filter.areaCode" placeholder="请选择考区">
-            <Option value=""></Option>
-          </Select>
-        </FormItem>
-
         <FormItem label="科目:">
           <Select
             v-model="filter.subject"
+            @on-change="subjecChange"
             placeholder="请选择科目"
             style="width: 100px;"
             clearable
@@ -37,6 +33,16 @@
             ></Option>
           </Select>
         </FormItem>
+        <FormItem label="考区:" v-if="IS_INSPECTION">
+          <Select v-model="filter.questionId" placeholder="请选择考区">
+            <Option
+              v-for="area in areas"
+              :key="area.id"
+              :value="area.id"
+              :label="area.areaName"
+            ></Option>
+          </Select>
+        </FormItem>
 
         <FormItem label="号码:">
           <Select
@@ -132,7 +138,7 @@
 </template>
 
 <script>
-import { studentScoreList, workList, subjectList } from "@/api";
+import { studentScoreList, workList, subjectList, areaList } from "@/api";
 import { CODE_TYPE } from "@/constants/enumerate";
 import ImageActionList from "./components/ImageActionList";
 
@@ -143,9 +149,9 @@ export default {
     return {
       filter: {
         workId: this.$route.params && this.$route.params.workId,
-        areaCode: "",
         subject: "",
-        type: "",
+        questionId: "",
+        type: "examNumber",
         number: "",
         studentName: ""
       },
@@ -153,6 +159,7 @@ export default {
       IS_INSPECTION: false,
       works: [],
       subjects: [],
+      areas: [],
       current: 1,
       total: 0,
       size: 1,
@@ -161,25 +168,42 @@ export default {
     };
   },
   mounted() {
-    this.IS_INSPECTION =
-      this.$ls.get("user", { role: "" }).role === "INSPECTION";
-    if (this.IS_INSPECTION) this.getWorkList();
-    this.getSubjects();
+    this.initData();
   },
   methods: {
+    async initData() {
+      this.IS_INSPECTION =
+        this.$ls.get("user", { role: "" }).role === "INSPECTION";
+      if (this.IS_INSPECTION) {
+        await this.getWorkList();
+        this.filter.workId = this.works[0].id;
+        this.workChange();
+        this.getAreaList();
+      } else {
+        await this.getSubjects();
+        this.filter.subject = this.subjects[0].subject;
+      }
+    },
     async getWorkList() {
-      const data = await workList();
-      this.works = data.map(item => {
-        return {
-          id: item.id,
-          name: item.name
-        };
-      });
+      this.works = await workList();
     },
     async getSubjects() {
       const data = await subjectList(this.filter.workId);
       this.subjects = data.filter(item => item.enable);
     },
+    async getAreaList() {
+      const data = await areaList({
+        workId: this.filter.workId,
+        subject: this.filter.subject
+      });
+      this.areas = data.map(item => {
+        return {
+          id: item.id,
+          areaName: item.areaName,
+          areaCode: item.areaCode
+        };
+      });
+    },
     async toSearch() {
       if (!this.filter.number && !this.filter.studentName) {
         this.$Message.error("号码和姓名必须填写一个");
@@ -198,6 +222,19 @@ export default {
     toPage(page) {
       this.current = page;
       this.curStudent = this.students[page - 1];
+    },
+    workChange() {
+      this.filter.subject = null;
+      this.filter.questionId = null;
+      const curWork = this.works.find(item => item.id === this.filter.workId);
+      this.subjects = curWork.subjects;
+      this.filter.subject = this.subjects[0].subject;
+    },
+    subjecChange() {
+      if (this.IS_INSPECTION) {
+        this.filter.questionId = null;
+        this.getAreaList();
+      }
     }
   }
 };

+ 4 - 0
src/modules/mark-set/ExportPaper.vue

@@ -48,6 +48,8 @@
         <FormItem label="起始分数:">
           <InputNumber
             v-model="scoreFilter.startNumber"
+            :min="1"
+            :precision="0"
             placeholder="请输入数字"
             clearable
           ></InputNumber>
@@ -55,6 +57,8 @@
         <FormItem label="终止分数:">
           <InputNumber
             v-model="scoreFilter.endNumber"
+            :min="scoreFilter.startNumber"
+            :precision="0"
             placeholder="请输入数字"
             clearable
           ></InputNumber>

+ 2 - 2
src/modules/mark-set/MarkSet.vue

@@ -15,7 +15,7 @@
 </template>
 
 <script>
-import { markSetNavs } from "@/routers/main";
+import { markSet } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 
 export default {
@@ -23,7 +23,7 @@ export default {
   mixins: [menuMixins],
   data() {
     return {
-      navs: markSetNavs,
+      navs: markSet,
       curNav: {}
     };
   },

+ 10 - 7
src/modules/mark/MarkHome.vue

@@ -29,7 +29,7 @@
 </template>
 
 <script>
-import { navs } from "@/routers/mark";
+import { mark } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 import { subjectDetail } from "@/api";
 
@@ -52,19 +52,22 @@ export default {
     }
   },
   mounted() {
-    this.buildNavs();
-    this.actSubNav();
-    this.getSubjectDetail();
+    this.initData();
   },
   methods: {
-    async getSubjectDetail() {
+    async initData() {
       this.curSubject = await subjectDetail(this.subjectId);
+      this.buildNavs();
+      this.actSubNav();
     },
     buildNavs() {
       const user = this.$ls.get("user", {});
-      this.navs = navs;
+      this.navs = [...mark];
       if (user.role === "ADMIN") {
-        this.navs = [{ title: "总览", name: "WorkOverview" }, ...navs];
+        this.navs.pop();
+        this.navs.unshift({ title: "总览", name: "WorkOverview" });
+      } else {
+        this.navs.splice(1, 1);
       }
     },
     actSubNav() {

+ 79 - 18
src/modules/quality/Quality.vue

@@ -10,6 +10,7 @@
           <FormItem label="工作文件夹:">
             <Select
               v-model="filter.workId"
+              @on-change="workChange"
               placeholder="请选择工作文件夹"
               style="width: 150px"
             >
@@ -22,18 +23,34 @@
             </Select>
           </FormItem>
           <FormItem label="科目:">
-            <Select v-model="filter.subject" placeholder="请选择科目">
-              <Option value=""></Option>
+            <Select
+              v-model="filter.subject"
+              @on-change="subjectChange"
+              placeholder="请选择科目"
+            >
+              <Option
+                v-for="subject in subjects"
+                :key="subject.id"
+                :value="subject.subject"
+                :label="subject.name"
+              ></Option>
             </Select>
           </FormItem>
           <FormItem label="考区:">
             <Select v-model="filter.areaCode" placeholder="请选择考区">
-              <Option value=""></Option>
+              <Option
+                v-for="area in areas"
+                :key="area.id"
+                :value="area.areaCode"
+                :label="area.areaName"
+              ></Option>
             </Select>
           </FormItem>
           <FormItem label="起始编号:">
             <InputNumber
               v-model="filter.startNumber"
+              :precision="0"
+              :min="1"
               placeholder="请输入数字"
               clearable
             ></InputNumber>
@@ -41,16 +58,18 @@
           <FormItem label="终止编号:">
             <InputNumber
               v-model="filter.endNumber"
+              :min="filter.startNumber"
+              :precision="0"
               placeholder="请输入数字"
               clearable
             ></InputNumber>
           </FormItem>
           <FormItem label="类型:">
-            <Select v-model="filter.type">
+            <Select v-model="paperType" @on-change="typeChange" clearable>
               <Option
                 v-for="(val, key) in CAFA_EXCEPTION_TYPE"
                 :key="key"
-                :value="key * 1"
+                :value="key"
                 :label="val"
               ></Option>
             </Select>
@@ -85,7 +104,7 @@
           ref="ImageActionList"
         ></image-action-list>
 
-        <div class="part-page">
+        <div class="part-page" v-if="total > size">
           <Page
             :current="current"
             :total="total"
@@ -101,7 +120,7 @@
 </template>
 
 <script>
-import { workList, paperPageList } from "@/api";
+import { workList, areaList, paperPageList } from "@/api";
 import { SORT_RULE_TYPE, CAFA_EXCEPTION_TYPE } from "@/constants/enumerate";
 import ImageActionList from "../main/components/ImageActionList";
 
@@ -111,15 +130,17 @@ export default {
   data() {
     return {
       filter: {
-        workId: 33,
-        subject: "SC",
-        areaCode: "1",
+        workId: null,
+        subject: null,
+        areaCode: null,
         startNumber: null,
         endNumber: null,
-        isAbsent: "",
+        isManual: false,
+        missing: true,
         name: "",
-        sort: "examNumber"
+        sort: "1"
       },
+      paperType: "0",
       SORT_RULE_TYPE,
       CAFA_EXCEPTION_TYPE,
       current: 1,
@@ -127,20 +148,36 @@ export default {
       total: 0,
       papers: [],
       curPaper: {},
-      works: []
+      works: [],
+      subjects: [],
+      areas: []
     };
   },
   mounted() {
-    this.getWorkList();
-    this.getList();
+    this.initData();
   },
   methods: {
+    async initData() {
+      await this.getWorkList();
+      this.filter.workId = this.works[0].id;
+      this.workChange();
+      await this.getAreaList();
+      this.filter.areaCode = this.areas[0].areaCode;
+      this.getList();
+    },
     async getWorkList() {
-      const data = await workList();
-      this.works = data.map(item => {
+      this.works = await workList();
+    },
+    async getAreaList() {
+      const data = await areaList({
+        workId: this.filter.workId,
+        subject: this.filter.subject
+      });
+      this.areas = data.map(item => {
         return {
           id: item.id,
-          name: item.name
+          areaName: item.areaName,
+          areaCode: item.areaCode
         };
       });
     },
@@ -167,7 +204,31 @@ export default {
     },
     toPage(page) {
       this.current = page;
+      this.papers = [];
       this.getList();
+    },
+    workChange() {
+      this.filter.subject = null;
+      this.filter.areaCode = null;
+      const curWork = this.works.find(item => item.id === this.filter.workId);
+      this.subjects = curWork.subjects;
+      this.filter.subject = this.subjects[0].subject;
+    },
+    subjectChange() {
+      this.filter.areaCode = null;
+      this.getAreaList();
+    },
+    typeChange() {
+      if (this.paperType === "1") {
+        this.filter.isManual = true;
+        this.filter.missing = false;
+      } else if (this.paperType === "0") {
+        this.filter.isManual = false;
+        this.filter.missing = true;
+      } else {
+        this.filter.isManual = false;
+        this.filter.missing = false;
+      }
     }
   }
 };

+ 14 - 11
src/plugins/utils.js

@@ -200,15 +200,6 @@ function humpFormat(params) {
     .join("");
 }
 
-function getNavs(routes) {
-  return routes.map(item => {
-    return {
-      name: item.name,
-      title: item.meta.title
-    };
-  });
-}
-
 /**
  * 计算总数
  * @param {Array} dataList 需要统计的数组
@@ -219,6 +210,18 @@ function calcSum(dataList) {
   }, 0);
 }
 
+/**
+ *
+ * @param {Object} obj 对象
+ */
+function filterObjNull(obj) {
+  let newObj = {};
+  Object.keys(obj).map(key => {
+    if (obj[key] !== null) newObj[key] = obj[key];
+  });
+  return newObj;
+}
+
 export {
   objTypeOf,
   deepCopy,
@@ -230,6 +233,6 @@ export {
   formatDate,
   removeHtmlTag,
   humpFormat,
-  getNavs,
-  calcSum
+  calcSum,
+  filterObjNull
 };

+ 11 - 4
src/routers/grading.js

@@ -1,11 +1,11 @@
-import { getNavs } from "@/plugins/utils";
-
 // 管理员(科组长)分档模块
 import Grading from "../modules/grading/Grading";
 import GradingProgress from "../modules/grading/GradingProgress";
 import GradingDetail from "../modules/grading/GradingDetail";
 import GradingUserManage from "../modules/grading/GradingUserManage";
 import GradingGroupManage from "../modules/grading/GradingGroupManage";
+import ExamPaperView from "../modules/main/ExamPaperView";
+
 // 阅卷员分档
 import GradingOperation from "../modules/grading/GradingOperation";
 
@@ -41,12 +41,19 @@ const gradingRoutes = [
     meta: {
       title: "分档分组"
     }
+  },
+  {
+    path: "exam-paper-view",
+    name: "ExamPaperView",
+    component: ExamPaperView,
+    meta: {
+      title: "试卷查看"
+    }
   }
 ];
 
-export const navs = getNavs(gradingRoutes);
-
 // tips: subjectId == `workId-subject`
+// TODO:去掉workId
 export default [
   {
     path: "/grading/:workId(\\d+)/:subjectId",

+ 0 - 4
src/routers/inspection.js

@@ -1,5 +1,3 @@
-import { getNavs } from "@/plugins/utils";
-
 import Inspection from "../modules/inspection/Inspection";
 import InspectionActionLogs from "../modules/inspection/InspectionActionLogs";
 import InspectionCollectLogs from "../modules/inspection/InspectionCollectLogs";
@@ -42,8 +40,6 @@ const inspectionRoutes = [
   }
 ];
 
-export const navs = getNavs(inspectionRoutes);
-
 export default [
   {
     path: "/inspection",

+ 0 - 7
src/routers/main.js

@@ -1,4 +1,3 @@
-import { getNavs } from "@/plugins/utils";
 import Main from "../modules/main/Main.vue";
 import WorkManage from "../modules/main/WorkManage";
 import WorkOverview from "../modules/main/WorkOverview";
@@ -149,7 +148,6 @@ const mainRoutes = [
       title: "分档设置"
     }
   },
-
   {
     path: "mark-set",
     name: "MarkSet",
@@ -178,11 +176,6 @@ const mainRoutes = [
   }
 ];
 
-export const navs = getNavs(mainRoutes);
-export const clientSetNavs = getNavs(clientSetRoutes);
-export const gradingSetNavs = getNavs(gradingSetRoutes);
-export const markSetNavs = getNavs(markSetRoutes);
-
 export default [
   {
     path: "/work-manage",

+ 7 - 9
src/routers/mark.js

@@ -1,11 +1,11 @@
-import { getNavs } from "@/plugins/utils";
-
 // 管理员(科组长)打分模块
 import MarkHome from "../modules/mark/MarkHome";
 import MarkProgress from "../modules/mark/MarkProgress";
 import MarkDetail from "../modules/mark/MarkDetail";
 import MarkTaskManage from "../modules/mark/MarkTaskManage";
-import MarkGroupManage from "../modules/mark/MarkGroupManage";
+// import MarkGroupManage from "../modules/mark/MarkGroupManage";
+import ExamPaperView from "../modules/main/ExamPaperView";
+
 // 阅卷员打分
 import MarkOperation from "../modules/mark/MarkOperation";
 
@@ -35,17 +35,15 @@ const markRoutes = [
     }
   },
   {
-    path: "mark-group-manage",
-    name: "MarkGroupManage",
-    component: MarkGroupManage,
+    path: "exam-paper-view",
+    name: "ExamPaperView",
+    component: ExamPaperView,
     meta: {
-      title: "打分分组"
+      title: "试卷查看"
     }
   }
 ];
 
-export const navs = getNavs(markRoutes);
-
 export default [
   {
     path: "/mark/:workId(\\d+)/:subjectId",