zhangjie 2 жил өмнө
parent
commit
178688819b

+ 1 - 1
src/assets/styles/mark.less

@@ -687,7 +687,7 @@
     line-height: 24px;
     text-align: left;
 
-    p {
+    p:not(:last-child) {
       margin-bottom: 4px;
     }
 

+ 52 - 16
src/modules/grading/components/GradeAction.vue

@@ -19,13 +19,13 @@
 
     <!-- 试卷信息 -->
     <div class="action-paper-info">
-      <!-- <p v-if="IS_ADMIN">
-        <span>试卷考号:</span><span>{{ curPaperOrTask.examNumber }}</span>
-      </p> -->
       <p>
         <span v-if="IS_MARKER">任务密号:</span>
         <span v-else>试卷密号:</span>
-        <span>NO.{{ curPaperOrTask.sn }}</span>
+        <span v-if="curPaperOrTask.sn && !rights.batchAction">
+          NO.{{ curPaperOrTask.sn }}
+        </span>
+        <span v-else>--</span>
       </p>
     </div>
 
@@ -108,7 +108,7 @@
     <!-- 跳过 -->
     <div
       class="action-grade-pass"
-      v-if="rights.gradeList && IS_MARKER"
+      v-if="rights.gradePass && IS_MARKER"
       @click="toPass"
     >
       跳过
@@ -229,6 +229,7 @@ const initRights = {
   search: false,
   gradeInfo: false,
   gradeList: false,
+  gradePass: false,
   gradeHis: false
 };
 
@@ -253,7 +254,11 @@ export default {
         return {};
       }
     },
-    // 是否处于
+    isBatchAction: {
+      type: Boolean,
+      default: false
+    },
+    // 是否处于粗分档
     isCoarseLevel: {
       type: Boolean,
       default: false
@@ -265,6 +270,7 @@ export default {
       rights: {
         ...initRights
       },
+      cacheRights: null,
       roleRight: {
         ADMIN: {
           done: ["search", "gradeHis", "gradeInfo"],
@@ -272,15 +278,17 @@ export default {
           arbitrate: ["search", "gradeHis"]
         },
         MARK_LEADER: {
-          undo: ["gradeList", "gradeInfo"],
-          done: ["gradeList", "gradeHis", "gradeInfo"],
-          reject: ["gradeList", "gradeInfo", "gradeHis"],
-          arbitrate: ["gradeList", "gradeHis"]
+          undo: ["gradeList", "gradePass", "gradeInfo"],
+          done: ["gradeList", "gradePass", "gradeHis", "gradeInfo"],
+          reject: ["gradeList", "gradePass", "gradeInfo", "gradeHis"],
+          arbitrate: ["gradeList", "gradePass", "gradeHis"],
+          batch: ["gradeList"]
         },
         MARKER: {
-          done: ["gradeList", "gradeInfo"],
-          undo: ["gradeList"],
-          reject: ["gradeList", "gradeInfo"]
+          done: ["gradeList", "gradePass", "gradeInfo"],
+          undo: ["gradeList", "gradePass"],
+          reject: ["gradeList", "gradePass", "gradeInfo"],
+          batch: ["gradeList"]
         },
         STANDARD: ["gradeInfo"]
       },
@@ -294,7 +302,8 @@ export default {
         done: "已评",
         reject: "打回",
         arbitrate: "待仲裁",
-        sample: "标准卷"
+        sample: "标准卷",
+        batch: "批量操作"
       },
       stepType: "",
       stepLabel: "",
@@ -320,13 +329,27 @@ export default {
     }
   },
   watch: {
-    curPaperOrTask(val) {
+    curPaperOrTask() {
       this.rebuildRight();
     },
+    isBatchAction(val) {
+      if (val) {
+        this.stepType = "batch";
+        this.stepLabel = this.stepDict[this.stepType];
+        const roleRights =
+          this.roleRight[this.curUserRoleType][this.stepType] || [];
+        this.rights = { ...initRights };
+        roleRights.map(key => {
+          this.rights[key] = true;
+        });
+      } else {
+        this.rebuildRight();
+      }
+      this.keyInput = null;
+    },
     "ribbonSet.keyboardMark": {
       immediate: true,
       handler(val) {
-        console.log(val);
         if (val) {
           document.addEventListener("keydown", this.keyEvent);
         } else {
@@ -363,6 +386,8 @@ export default {
       return;
     },
     rebuildRight() {
+      if (this.setT) clearTimeout(this.setT);
+
       let roleRights = [];
       this.stepType = this.getStepType();
       this.stepLabel = this.stepDict[this.stepType];
@@ -380,6 +405,7 @@ export default {
         this.getMarkHistory();
       }
       this.btnClicked = false;
+      this.keyInput = null;
     },
     getCurLevel() {
       const levelName = this.curPaperOrTask.rejected
@@ -409,6 +435,16 @@ export default {
       });
     },
     selectLevel(level) {
+      if (this.isBatchAction) {
+        if (this.btnClicked) return;
+        this.btnClicked = true;
+        this.setT = setTimeout(() => {
+          this.btnClicked = false;
+        }, 500);
+        this.$emit("on-batch-level", level);
+        return;
+      }
+
       if (this.IS_MARKER && this.curPaperOrTask.level === level.name) return;
       if (this.btnClicked) return;
       this.btnClicked = true;

+ 16 - 35
src/modules/grading/leader/LeaderGrading.vue

@@ -21,52 +21,20 @@
         'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
-      v-show="!multipleGradingList.length"
     >
       <grade-action
         :cur-paper-or-task="curPaper"
         :levels="levels"
         :params-set="paramsSet"
         :key="curPaper.key"
+        :is-batch-action="!!multipleGradingList.length"
         @on-leader-level="leaderSelectLevel"
+        @on-batch-level="multipleSelectLevel"
         ref="GradeAction"
         v-if="curPaper.id"
       ></grade-action>
       <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
-    <!-- multiple grading action -->
-    <div class="marker-action" v-show="multipleGradingList.length">
-      <div class="grade-action">
-        <div class="action-paper-state">
-          <p class="paper-state-cont">批量操作</p>
-        </div>
-        <div class="action-paper-info">
-          <p><span>试卷密号:</span><span>--</span></p>
-        </div>
-        <h3 class="action-grade-info-title" v-if="markLeaderOnlyRight">
-          当前操作:{{ markLeaderOnlyRight.name }}
-        </h3>
-        <div class="action-grade-list">
-          <div
-            class="action-grade-item"
-            v-for="(level, index) in levels"
-            :key="index"
-          >
-            <div
-              :class="[
-                'action-grade-item-content',
-                { 'action-item-content-disabled': multiplebtnClicked }
-              ]"
-              @click="multipleSelectLevel(level)"
-            >
-              <p>{{ level.name }}</p>
-              <p>{{ level.minScore }}~{{ level.maxScore }}</p>
-            </div>
-          </div>
-        </div>
-      </div>
-      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
-    </div>
 
     <div class="marker-body">
       <div :class="markerImageListClasses" v-if="papers.length">
@@ -442,10 +410,20 @@ export default {
       curPaper.selected = paper.selected;
       this.multipleGradingList = this.papers.filter(paper => paper.selected);
     },
+    checkPapersIsSelectLevel(levelName, papers) {
+      const firstLevel = papers[0].level;
+      const hasOtherLevel = this.papers.some(item => item.level !== firstLevel);
+      return hasOtherLevel ? false : firstLevel === levelName;
+    },
     async multipleSelectLevel(level) {
       if (!this.multipleGradingList.length) return;
-      if (this.multiplebtnClicked) return;
 
+      if (this.checkPapersIsSelectLevel(level.name, this.multipleGradingList)) {
+        this.$Message.error("已选试卷档位和设置档位一样!");
+        return;
+      }
+
+      if (this.multiplebtnClicked) return;
       this.multiplebtnClicked = true;
 
       const data = await markHistoryList(
@@ -477,6 +455,9 @@ export default {
     toReview(index) {
       this.isFullscreenMarking = true;
       this.multipleGradingList = [];
+      this.papers.forEach(paper => {
+        paper.selected = false;
+      });
       this.selectPaper(index);
       this.$refs.SimpleImagePreview.open();
     },

+ 16 - 31
src/modules/grading/marker/MarkerGrading.vue

@@ -15,50 +15,21 @@
         'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
-      v-show="!multipleGradingList.length"
     >
       <grade-action
         :cur-paper-or-task="curPaper"
         :levels="levels"
         :params-set="paramsSet"
         :key="curPaper.key"
+        :is-batch-action="!!multipleGradingList.length"
         @on-select-level="gradeCurPaper"
         @on-pass="passCurPaper"
+        @on-batch-level="multipleSelectLevel"
         ref="GradeAction"
         v-if="curPaper.id"
       ></grade-action>
       <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
-    <!-- multiple grading action -->
-    <div class="marker-action" v-show="multipleGradingList.length">
-      <div class="grade-action">
-        <div class="action-paper-state">
-          <p class="paper-state-cont">批量分档</p>
-        </div>
-        <div class="action-paper-info">
-          <p><span>任务密号:</span><span>--</span></p>
-        </div>
-        <div class="action-grade-list">
-          <div
-            class="action-grade-item"
-            v-for="(level, index) in levels"
-            :key="index"
-          >
-            <div
-              :class="[
-                'action-grade-item-content',
-                { 'action-item-content-disabled': multiplebtnClicked }
-              ]"
-              @click="multipleSelectLevel(level)"
-            >
-              <p>{{ level.name }}</p>
-              <p>{{ level.minScore }}~{{ level.maxScore }}</p>
-            </div>
-          </div>
-        </div>
-      </div>
-      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
-    </div>
 
     <div class="marker-body">
       <div :class="markerImageListClasses" v-if="papers.length">
@@ -386,8 +357,19 @@ export default {
       this.multipleGradingList = this.papers.filter(paper => paper.selected);
       console.log(this.multipleGradingList);
     },
+    checkPapersIsSelectLevel(levelName, papers) {
+      const firstLevel = papers[0].level;
+      const hasOtherLevel = this.papers.some(item => item.level !== firstLevel);
+      return hasOtherLevel ? false : firstLevel === levelName;
+    },
     async multipleSelectLevel(level) {
       if (!this.multipleGradingList.length) return;
+
+      if (this.checkPapersIsSelectLevel(level.name, this.multipleGradingList)) {
+        this.$Message.error("已选试卷档位和设置档位一样!");
+        return;
+      }
+
       if (this.multiplebtnClicked) return;
       this.multiplebtnClicked = true;
       const multipleGradingListCount = this.multipleGradingList.length;
@@ -424,6 +406,9 @@ export default {
     toReview(index) {
       this.isFullscreenMarking = true;
       this.multipleGradingList = [];
+      this.papers.forEach(paper => {
+        paper.selected = false;
+      });
       this.selectPaper(index);
       this.$refs.SimpleImagePreview.open();
     },

+ 11 - 1
src/modules/grading/marker/MarkerImageView.vue

@@ -75,7 +75,14 @@ export default {
     }
   },
   created() {
-    this.image = this.$objAssign(this.initImage, this.data);
+    this.initData();
+  },
+  watch: {
+    "data.selected": {
+      handler() {
+        this.initData();
+      }
+    }
   },
   data() {
     return {
@@ -95,6 +102,9 @@ export default {
     };
   },
   methods: {
+    initData() {
+      this.image = this.$objAssign(this.initImage, this.data);
+    },
     toReview() {
       this.$emit("to-review", this.data);
     },

+ 1 - 1
src/modules/mark/components/MarkAction.vue

@@ -337,7 +337,6 @@ export default {
     "ribbonSet.keyboardMark": {
       immediate: true,
       handler(val) {
-        console.log(val);
         if (val) {
           document.addEventListener("keydown", this.keyEvent);
         } else {
@@ -402,6 +401,7 @@ export default {
         this.getMarkHistory();
       }
       this.btnClicked = false;
+      this.keyInput = null;
     },
     updateScoreList() {
       let scores = [];