Forráskód Böngészése

改大裆打小档

zhangjie 2 éve
szülő
commit
9353e7cca4

+ 11 - 4
src/assets/styles/mark.less

@@ -734,7 +734,11 @@
     color: @white;
     padding: 8px;
     border-radius: @box-border-radius-small;
+    text-align: left;
 
+    + .action-grade-info {
+      margin-top: -10px;
+    }
     + .action-mark-info {
       margin-top: -10px;
     }
@@ -750,15 +754,19 @@
     .grade-info-name {
       display: inline-block;
       vertical-align: top;
+      width: 60px;
       height: 60px;
       line-height: 60px;
       font-size: 54px;
       text-align: center;
       border-radius: 50%;
+      margin-left: 50px;
       color: #fff;
     }
     .grade-info-none {
       font-size: 34px;
+      width: 100%;
+      margin: 0;
     }
     .grade-info-range {
       display: inline-block;
@@ -777,10 +785,9 @@
       p:last-child {
         font-size: 20px;
         line-height: 30px;
-      }
-
-      > span {
-        margin: 0 2px;
+        > span {
+          margin-right: 2px;
+        }
       }
     }
   }

+ 3 - 1
src/modules/grading/components/GradeAction.vue

@@ -70,7 +70,9 @@
       class="action-grade-info-title"
       v-if="IS_MARKER && stepType === 'reject'"
     >
-      <span>原分档档位:{{ curPaperOrTask.originLevel || "" }}</span>
+      <span
+        >原分档档位:{{ curPaperOrTask.originLevel | levelNameFilter }}</span
+      >
       <span
         v-if="
           paramsSet.levelConfig &&

+ 206 - 95
src/modules/grading/components/GradeActionRough.vue

@@ -30,12 +30,13 @@
     <!-- 改档信息 -->
     <div class="action-grade-change" v-if="rights.gradeChange">
       <p>
-        <span>原始档位:</span><span>{{ curPaperOrTask.originLevel }}</span>
+        <span>原始粗档位:</span
+        ><span>{{ curPaperOrTask.originLevel | levelNameFilter }}</span>
       </p>
       <p>
-        <span v-if="IS_MARKER">建议档位:</span>
-        <span v-else>申请档位:</span>
-        <span>{{ curPaperOrTask.redoLevel }}</span>
+        <span v-if="IS_MARKER">建议档位:</span>
+        <span v-else>申请档位:</span>
+        <span>{{ curPaperOrTask.redoLevel | levelNameFilter }}</span>
       </p>
     </div>
     <div
@@ -50,26 +51,30 @@
 
     <!-- 粗大位信息 -->
     <!-- 已评/待评(已评档位),改大裆打小档(已评档位) -->
-    <div class="action-grade-info" v-if="rights.gradeInfo">
+    <div
+      class="action-grade-info"
+      v-if="rights.roughGradeInfo && curRoughLevel.name"
+    >
       <h3 class="grade-info-name">
-        {{ curPaperLevel }}
+        {{ curRoughLevel.name | levelNameFilter }}
       </h3>
-    </div>
-    <!-- 小档位信息 -->
-    <div class="action-grade-info action-mark-info" v-if="rights.markInfo">
-      <p class="grade-info-name" v-if="curPaperScore">
-        {{ curPaperScore }}
-      </p>
-      <p class="grade-info-name grade-info-none" v-else>未分档</p>
+      <div class="grade-info-range">
+        <p>档位范围</p>
+        <p>
+          <span>{{ curRoughLevel.minScore }}</span>
+          <span>~</span>
+          <span>{{ curRoughLevel.maxScore }}</span>
+        </p>
+      </div>
     </div>
 
-    <!-- 档位信息 -->
+    <!-- 档位信息 -->
     <!-- 已评(已评档位),打回(建议档位) -->
     <h3
       class="action-grade-info-title"
       v-if="IS_MARKER && stepType === 'reject'"
     >
-      <span>原分档档位:{{ curPaperOrTask.originLevel || "" }}</span>
+      <span>原分档档位:{{ curPaperOrTask.originLevel || "" }}</span>
       <span
         v-if="
           paramsSet.levelConfig &&
@@ -91,12 +96,12 @@
       class="action-grade-info-title"
       v-if="curPaperOrTask.rejected && curPaperOrTask.isRejectedByLeader"
     >
-      建议档位:
+      建议细分档位:
     </h3>
     <div class="action-grade-info" v-if="rights.gradeInfo && curLevel.name">
-      <h3 class="grade-info-name">{{ curLevel.name | levelNameFilter }}</h3>
+      <h3 class="grade-info-name">{{ curLevel.name }}</h3>
       <div class="grade-info-range">
-        <p>{{ levelRangeName }}范围</p>
+        <p>分数范围</p>
         <p>
           <span>{{ curLevel.minScore }}</span>
           <span>~</span>
@@ -104,15 +109,16 @@
         </p>
       </div>
     </div>
-
-    <!-- 选择大档位 -->
-    <h3
-      class="action-grade-info-title"
-      v-if="IS_MARK_LEADER && markLeaderOnlyRight && rights.gradeList"
+    <!-- 小档位信息 -->
+    <div
+      class="action-grade-info action-mark-info"
+      v-if="rights.gradeInfo && !curLevel.name"
     >
-      当前操作:{{ markLeaderOnlyRight.name }}
-    </h3>
-    <div class="action-grade-list" v-if="rights.gradeList">
+      <p class="grade-info-name grade-info-none">未分档</p>
+    </div>
+
+    <!-- 选择小档位  -->
+    <div class="action-grade-list" v-if="rights.levelList">
       <div
         class="action-grade-item"
         v-for="(level, index) in levelList"
@@ -128,38 +134,45 @@
           ]"
           @click="selectLevel(level)"
         >
-          <p>{{ level.name | levelNameFilter }}</p>
+          <p>{{ level.name }}</p>
           <p>{{ level.minScore }}~{{ level.maxScore }}</p>
         </div>
       </div>
     </div>
-    <div v-if="ribbonSet.keyboardMark" class="action-grade-keyboard">
-      <div class="keyboard-input">{{ keyInput }}</div>
-      <div class="keyboard-clear" @click="clearKeyInput">
-        <Icon type="md-trash" />
-      </div>
-    </div>
-    <!-- 选择小档位  -->
-    <div class="action-mark-list" v-if="rights.levelList">
+    <!-- 选择大档位 -->
+    <h3
+      class="action-grade-info-title"
+      v-if="IS_MARK_LEADER && markLeaderOnlyRight && rights.roughLevelList"
+    >
+      当前操作:{{ markLeaderOnlyRight.name }}
+    </h3>
+    <div class="action-grade-list" v-if="rights.roughLevelList">
       <div
-        class="action-mark-item"
-        v-for="(score, index) in scores"
+        class="action-grade-item"
+        v-for="(level, index) in roughLevelList"
         :key="index"
       >
         <div
           :class="[
-            'action-mark-item-content',
+            'action-grade-item-content',
             {
               'action-item-content-disabled': btnClicked,
-              'is-active': keyInput == score
+              'is-active': keyInput == level.name
             }
           ]"
-          @click="selectScore(score)"
+          @click="selectRoughLevel(level)"
         >
-          <p>{{ score }}</p>
+          <p>{{ level.name | levelNameFilter }}</p>
+          <p>{{ level.minScore }}~{{ level.maxScore }}</p>
         </div>
       </div>
     </div>
+    <div v-if="ribbonSet.keyboardMark" class="action-grade-keyboard">
+      <div class="keyboard-input">{{ keyInput }}</div>
+      <div class="keyboard-clear" @click="clearKeyInput">
+        <Icon type="md-trash" />
+      </div>
+    </div>
     <!-- 跳过 -->
     <div
       class="action-grade-pass"
@@ -169,6 +182,14 @@
       跳过
     </div>
 
+    <!-- marker confirm grade change -->
+    <div
+      class="action-grade-change-confirm"
+      v-if="IS_MARKER && rights.gradeChange"
+    >
+      <Button type="primary" @click="gradeChangeConfirm">确认改档</Button>
+    </div>
+
     <!-- 评卷记录 -->
     <div class="action-grade-history" v-if="rights.gradeHis">
       <h3>评卷记录</h3>
@@ -179,7 +200,7 @@
           :key="his.id"
         >
           <p>{{ his.loginName }}</p>
-          <p>{{ his.value | levelNameFilter }}</p>
+          <p>{{ his.value }}</p>
         </div>
       </div>
     </div>
@@ -220,9 +241,6 @@ import { levelNameTransform } from "@/plugins/utils";
 
 // 三种情况:
 // 管理员(ADMIN),科组长(MARK_LEADER),评卷员(MARKER)
-// 管理员:查询,头部信息,评卷记录
-// 科组长:查询,头部信息,选择档位,评卷记录
-// 评卷员:头部信息,选择档位
 
 // MARK_LEADER / ADMIN: curPaperOrTask => paper
 // MARKER: curPaperOrTask => task
@@ -259,38 +277,54 @@ import { levelNameTransform } from "@/plugins/utils";
 }
 [marktask template]
 {
-  "id": 511,
-  "sn": "4929446110",
-  "redoLevel": null,
-  "level": "A",
-  "score": null,
-  "result": "100",
-  "originLevel": null,
-  "markerId": 49,
-  "marker": "pj061001",
-  "updatedOn": 1594775592000,
-  "imgSrc": "",
-  "thumbSrc": "",
-  "markByLeader": true,
-  "oldRejected": false,
-  "paperId": 168,
-  "randomSeqNew": 9446110,
-  "randomSeq": null,
-  "rejected": false,
-  "sample": true
-}
+  id: 58,
+  sn: "18111595446",
+  redoLevel: null,
+  level: null,
+  roughLevel: "5",
+  score: null,
+  result: null,
+  originLevel: "",
+  markerId: 16,
+  loginName: "sm1",
+  marker: "sm1",
+  updatedOn: null,
+  imgSrc: "",
+  thumbSrc: "",
+  markByLeader: false,
+  oldRejected: false,
+  paperId: 107,
+  randomSeqNew: 11595446,
+  randomSeq: null,
+  serialNumber: null,
+  displayNumber: false,
+  shift: false,
+  shiftScore: false,
+  isRejectedByLeader: false,
+  rejectedCount: 0,
+  dateMineResult: null,
+  deviationDirection: null,
+  sample: false,
+  rejected: false,
+  mark: false,
+  key: "i9k7nqr8s2kb60uo",
+  title: "NO.18111595446",
+  selected: false
+};
 */
 
 const initRights = {
-  search: false,
+  roughGradeInfo: false,
   gradeInfo: false,
-  gradeList: false,
+  levelList: false,
+  roughLevelList: false,
   gradePass: false,
-  gradeHis: false
+  gradeHis: false,
+  search: false
 };
 
 export default {
-  name: "grade-action",
+  name: "grade-action-rough",
   props: {
     curPaperOrTask: {
       type: Object,
@@ -330,22 +364,44 @@ export default {
       cacheRights: null,
       roleRight: {
         ADMIN: {
-          done: ["search", "gradeHis", "gradeInfo"],
-          reject: ["search", "gradeInfo", "gradeHis"],
-          arbitrate: ["search", "gradeHis"]
+          done: ["roughGradeInfo", "gradeInfo", "gradeHis", "search"],
+          reject: ["roughGradeInfo", "gradeInfo", "gradeHis", "search"],
+          arbitrate: ["gradeHis", "search"],
+          shift: [
+            "roughGradeInfo",
+            "gradeInfo",
+            "search",
+            "gradeChangeSearch",
+            "gradeChange"
+          ]
         },
         MARK_LEADER: {
-          undo: ["gradeList", "gradePass", "gradeInfo"],
-          done: ["gradeList", "gradeHis", "gradeInfo"],
-          reject: ["gradeList", "gradePass", "gradeInfo", "gradeHis"],
-          arbitrate: ["gradeList", "gradePass", "gradeHis"],
-          batch: ["gradeList"]
+          undo: ["roughGradeInfo", "gradeInfo", "levelList", "roughLevelList"],
+          done: [
+            "roughGradeInfo",
+            "gradeInfo",
+            "levelList",
+            "roughLevelList",
+            "gradeHis"
+          ],
+          reject: [
+            "roughGradeInfo",
+            "gradeInfo",
+            "levelList",
+            "roughLevelList",
+            "gradeHis"
+          ],
+          arbitrate: ["roughGradeInfo", "gradeInfo", "levelList", "gradeHis"],
+          shift: ["gradeChange", "roughLevelList"],
+          batch: ["levelList"]
         },
         MARKER: {
-          done: ["gradeList", "gradeInfo"],
-          undo: ["gradeList", "gradePass"],
-          reject: ["gradeList", "gradePass", "gradeInfo"],
-          batch: ["gradeList"]
+          done: ["roughGradeInfo", "gradeInfo", "levelList"],
+          undo: ["roughGradeInfo", "gradeInfo", "levelList", "gradePass"],
+          reject: ["gradeInfo", "levelList", "gradePass"],
+          shift: ["gradeChange"],
+          shiftScore: ["roughGradeInfo", "gradeInfo", "levelList", "levelPass"],
+          batch: ["levelList"]
         },
         STANDARD: ["gradeInfo"]
       },
@@ -359,6 +415,8 @@ export default {
         done: "已评",
         reject: "打回",
         arbitrate: "待仲裁",
+        shift: "改大档",
+        shiftScore: "改大档打小档",
         sample: "标准卷",
         batch: "批量操作"
       },
@@ -367,6 +425,8 @@ export default {
       gradingHistory: [],
       levelList: [],
       curLevel: {},
+      roughLevelList: [],
+      curRoughLevel: {},
       setT: null,
       btnClicked: false,
       keyInput: null,
@@ -384,9 +444,6 @@ export default {
     },
     IS_MARK_LEADER() {
       return this.curUserRoleType === "MARK_LEADER";
-    },
-    levelRangeName() {
-      return this.curSubject.stage === "LEVEL" ? "分数" : "档位";
     }
   },
   watch: {
@@ -448,6 +505,9 @@ export default {
     getStepType() {
       const info = this.curPaperOrTask;
       if (info.sample) return "sample";
+      if (info.shift && info.shiftScore && !info.level && !info.result)
+        return "shift";
+      if (!info.shift && info.shiftScore && !info.result) return "shiftScore";
       if (this.curPaperOrTaskLevel) return "done";
       if (info.arbitrated) return "arbitrate";
       if (info.rejected) return "reject";
@@ -481,15 +541,15 @@ export default {
       this.keyInput = null;
     },
     initLevels() {
-      this.levelList = [...this.levels];
-      if (
-        this.curSubject.roughLevelEnable &&
-        this.curSubject.stage === "LEVEL"
-      ) {
-        this.levelList = this.levels.filter(
-          item => item.roughCode === this.curPaperOrTask.roughLevel
-        );
-      }
+      this.levelList = this.levels.filter(
+        item => item.roughCode === this.curPaperOrTask.roughLevel
+      );
+      this.roughLevelList = this.parseRoughLevels(this.levels);
+      const curRoughLevel = this.roughLevelList.find(
+        item => item.name === this.curPaperOrTask.roughLevel
+      );
+      this.curRoughLevel = curRoughLevel || {};
+
       const levelName = this.curPaperOrTask.rejected
         ? this.curPaperOrTask.redoLevel
         : this.curPaperOrTaskLevel;
@@ -499,6 +559,27 @@ export default {
         this.curLevel = {};
       }
     },
+    parseRoughLevels(levelList) {
+      const levelMap = {};
+      levelList.forEach(item => {
+        const ind = item.roughCode;
+        if (!levelMap[ind]) levelMap[ind] = [];
+        levelMap[ind].push(item);
+      });
+      let roughLevelList = Object.keys(levelMap).map((roughCode, ind) => {
+        const group = levelMap[roughCode];
+        const levels = group.map(item => item.code);
+
+        return {
+          id: ind + 1,
+          name: roughCode,
+          minScore: levels[0],
+          maxScore: levels.slice(-1)[0]
+        };
+      });
+      roughLevelList.sort((a, b) => (a.name < b.name ? -1 : 1));
+      return roughLevelList;
+    },
     async getMarkHistory() {
       // 只有科组长和超管才会展示评卷记录
       const data = await markHistoryList(
@@ -561,6 +642,29 @@ export default {
 
       this.$emit("on-select-level", level);
     },
+    selectRoughLevel(level) {
+      if (this.curPaperOrTask.roughLevel === level.name) return;
+
+      if (this.btnClicked) return;
+      this.btnClicked = true;
+
+      this.setT = setTimeout(() => {
+        this.btnClicked = false;
+      }, 500);
+      // 科组长改档 / 评卷同意改档:只使用selectedLevel
+      const curLevel =
+        this.stepType === "shift"
+          ? this.curPaperOrTask.redoLevel
+          : this.curPaperOrTask.roughLevel;
+      this.$emit("on-leader-change-level", {
+        paperId: this.curPaperOrTask.paperId,
+        curLevel,
+        selectedLevel: level.name
+      });
+    },
+    gradeChangeConfirm() {
+      this.selectRoughLevel({ name: this.curPaperOrTask.redoLevel });
+    },
     toPass() {
       this.$emit("on-pass");
     },
@@ -599,7 +703,10 @@ export default {
       }
     },
     getKeyInputLevel(key) {
-      return this.levelList.find(item => item.name === key);
+      return (
+        this.levelList.find(item => item.name === key) ||
+        this.roughLevelList.find(item => item.name === key)
+      );
     },
     toKeySubmit() {
       if (!this.keyInput) {
@@ -607,7 +714,11 @@ export default {
         return;
       }
       const level = this.getKeyInputLevel(this.keyInput);
-      this.selectLevel(level);
+      if (/^[a-z]$/.test(level.name)) {
+        this.selectLevel(level);
+      } else {
+        this.selectRoughLevel(level);
+      }
     },
     clearKeyInput() {
       this.keyInput = null;

+ 69 - 13
src/modules/grading/leader/LeaderGrading.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="marker-grading">
     <marker-header
-      v-if="curSubject.id"
+      v-if="dataReady"
       ref="MarkerHeader"
       show-select-all
       @area-change="areaChange"
@@ -17,24 +17,39 @@
     ></marker-header>
 
     <div
+      v-if="dataReady"
       :class="[
         'marker-action',
         'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
     >
-      <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 v-if="curSubject.id" ref="GradeRibbon"></grade-ribbon>
+      <template v-if="curPaper && curPaper.id">
+        <grade-action-rough
+          v-if="IS_ROUGH_THIN_LEVEL"
+          ref="GradeAction"
+          :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"
+          @on-leader-change-level="leaderChangeLevel"
+        ></grade-action-rough>
+        <grade-action
+          v-else
+          ref="GradeAction"
+          :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"
+        ></grade-action>
+      </template>
+      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
 
     <div class="marker-body">
@@ -140,9 +155,11 @@ import MarkerStandard from "../marker/MarkerStandard";
 import LeaderProgress from "./LeaderProgress";
 import LeaderStatistics from "./LeaderStatistics";
 import GradeAction from "../components/GradeAction";
+import GradeActionRough from "../components/GradeActionRough";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import ModifyLeaderGrading from "../components/ModifyLeaderGrading";
 import GradeRibbon from "../components/GradeRibbon";
+import { levelNameTransform } from "@/plugins/utils";
 
 import {
   paperList,
@@ -153,6 +170,7 @@ import {
   subjectDetail,
   markHistoryList,
   getParamsSet,
+  markStepChangeLevel,
   leaderGradingPaper
 } from "@/api";
 
@@ -166,6 +184,7 @@ export default {
     LeaderProgress,
     LeaderStatistics,
     GradeAction,
+    GradeActionRough,
     GradeRibbon,
     SimpleImagePreview,
     ModifyLeaderGrading
@@ -187,6 +206,7 @@ export default {
           arbi: true
         }
       },
+      dataReady: false,
       speFilter: null,
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
@@ -225,6 +245,11 @@ export default {
     IS_TEST() {
       return this.curSubject.test === 2;
     },
+    IS_ROUGH_THIN_LEVEL() {
+      return (
+        this.curSubject.roughLevelEnable && this.curSubject.stage === "LEVEL"
+      );
+    },
     ACTION_CAN_BATCH() {
       return (
         this.curStep.type === "done" && !this.paramsSet.collectConfig.paperStage
@@ -254,9 +279,11 @@ export default {
       "clearState"
     ]),
     async initData() {
+      this.dataReady = false;
       await this.getSubjectDetail();
       await this.getParamsSetInfo();
       await this.getWorkLevels();
+      this.dataReady = true;
     },
     async getParamsSetInfo() {
       const data = await getParamsSet(this.workId);
@@ -612,6 +639,35 @@ export default {
         this.toActionNextPaper();
       }
     },
+    leaderChangeLevel(levelInfo) {
+      const content = `确定申请由${levelNameTransform(
+        levelInfo.curLevel
+      )}档改为${levelNameTransform(
+        levelInfo.selectedLevel
+      )}档,并打回给所有老师吗?`;
+      this.$Modal.confirm({
+        content,
+        width: 450,
+        onOk: async () => {
+          await markStepChangeLevel({
+            subjectId: this.subjectId,
+            paperId: levelInfo.paperId,
+            level: levelInfo.selectedLevel,
+            userId: this.$ls.get("user", { id: "" }).id
+          });
+          this.$Message.success("申请改档成功!");
+          this.getStepLevels();
+          if (this.carouselType) {
+            this.$refs.CarouselPapersPreview.cancel();
+            this.$refs.MarkerHistory.updatePapers();
+          } else {
+            // this.toActionNextPaper();
+            // 调档之后,试卷还在当前类别中,应该调用下一张
+            this.toNextPaper();
+          }
+        }
+      });
+    },
     imagePreviewClose() {
       this.isFullscreenMarking = false;
       this.setShortcut(["page", "action"]);

+ 88 - 19
src/modules/grading/marker/MarkerGrading.vue

@@ -2,7 +2,7 @@
   <div class="marker-grading">
     <marker-header
       ref="MarkerHeader"
-      v-if="curSubject.id"
+      v-if="dataReady"
       @area-change="areaChange"
       @step-change="stepChange"
       @page-set-change="pageSetChange"
@@ -12,25 +12,42 @@
     ></marker-header>
 
     <div
+      v-if="dataReady"
       :class="[
         'marker-action',
         'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
     >
-      <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 v-if="curSubject.id" ref="GradeRibbon"></grade-ribbon>
+      <template v-if="curPaper && curPaper.id">
+        <grade-action-rough
+          v-if="IS_ROUGH_THIN_LEVEL"
+          ref="GradeAction"
+          :cur-paper-or-task="curPaper"
+          :levels="levels"
+          :params-set="paramsSet"
+          :key="curPaper.key"
+          :is-batch-action="!!multipleGradingList.length"
+          @on-leader-change-level="leaderGradeCurPaper"
+          @on-select-level="gradeCurPaper"
+          @on-pass="passCurPaper"
+          @on-batch-level="multipleSelectLevel"
+        ></grade-action-rough>
+        <grade-action
+          v-else
+          ref="GradeAction"
+          :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"
+        ></grade-action>
+      </template>
+
+      <grade-ribbon ref="GradeRibbon"></grade-ribbon>
     </div>
 
     <div class="marker-body">
@@ -119,12 +136,14 @@ import MarkerHistory from "./MarkerHistory";
 import MarkerStandard from "./MarkerStandard";
 import MarkerStatistics from "./MarkerStatistics";
 import GradeAction from "../components/GradeAction";
+import GradeActionRough from "../components/GradeActionRough";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import GradeRibbon from "../components/GradeRibbon";
 
 import {
   markerTaskList,
   markerMarkPaperList,
+  markerChangeLevelPaperList,
   markerLevelTotalStatData,
   workLevelList,
   paperSelectLevelOrScore,
@@ -143,6 +162,7 @@ export default {
     MarkerStandard,
     MarkerStatistics,
     GradeAction,
+    GradeActionRough,
     GradeRibbon,
     SimpleImagePreview
   },
@@ -162,8 +182,17 @@ export default {
         reject: {
           reject: true
         },
+        shift: {
+          isShift: true,
+          isShiftScore: false
+        },
+        shiftScore: {
+          isShift: false,
+          isShiftScore: true
+        },
         markPaper: {}
       },
+      dataReady: false,
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
       subject: "",
@@ -194,6 +223,11 @@ export default {
     ]),
     markerImageListClasses() {
       return ["marker-image-list", `marker-image-list-${this.page.size}`];
+    },
+    IS_ROUGH_THIN_LEVEL() {
+      return (
+        this.curSubject.roughLevelEnable && this.curSubject.stage === "LEVEL"
+      );
     }
   },
   created() {
@@ -219,10 +253,12 @@ export default {
       "clearState"
     ]),
     async initData() {
+      this.dataReady = false;
       await this.getSubjectDetail();
       await this.getParamsSetInfo();
       // 必须在获取subject之后再获取levels
       await this.getWorkLevels();
+      this.dataReady = true;
     },
     async getParamsSetInfo() {
       const data = await getParamsSet(this.workId);
@@ -248,7 +284,10 @@ export default {
       }
 
       let requestAction = null;
-      if (this.curStep.type === "markPaper") {
+      if (this.curStep.type.includes("shift")) {
+        //  细分档的改大裆
+        requestAction = markerChangeLevelPaperList;
+      } else if (this.curStep.type === "markPaper") {
         requestAction = markerMarkPaperList;
       } else {
         requestAction = markerTaskList;
@@ -300,6 +339,20 @@ export default {
         count: undo.rejected,
         type: "reject"
       });
+
+      if (this.IS_ROUGH_THIN_LEVEL) {
+        otherStep.push({
+          name: "改大档",
+          count: undo.shift || 0,
+          type: "shift"
+        });
+        otherStep.push({
+          name: "改大档打小档",
+          count: undo.shiftScore || 0,
+          type: "shiftScore"
+        });
+      }
+
       const mpInfo = data.find(item => item.id === "markPaper");
       if (mpInfo) {
         otherStep.push({
@@ -352,10 +405,17 @@ export default {
         this.steps.otherStep[opos].count -= count;
       }
 
-      const pos = this.steps.levelStep.findIndex(
-        item => item.name === curLevel
-      );
-      this.steps.levelStep[pos].count += count;
+      if (curStep.type === "shift") {
+        const spos = this.steps.otherStep.findIndex(
+          item => item.type === "shiftScore"
+        );
+        this.steps.otherStep[spos].count += count;
+      } else {
+        const pos = this.steps.levelStep.findIndex(
+          item => item.name === curLevel
+        );
+        this.steps.levelStep[pos].count += count;
+      }
 
       this.steps.levelStep.forEach(item => {
         item.percent =
@@ -513,6 +573,15 @@ export default {
       if (!this.papers.length) this.$refs.SimpleImagePreview.cancel();
       this.selectPaper(this.curPaperIndex);
     },
+    async leaderGradeCurPaper({ selectedLevel }) {
+      await paperSelectLevelOrScore(
+        this.curPaper.id, // is taskId
+        selectedLevel,
+        "ROUGH_LEVEL"
+      );
+      this.updateStepLevel(this.curStep, "shiftScore", 1);
+      this.toActionNextPaper();
+    },
     async gradeCurPaper(level) {
       const paper = await paperSelectLevelOrScore(
         this.curPaper.id, // is taskId

+ 5 - 3
src/modules/inspection/InspectionGrading.vue

@@ -121,10 +121,12 @@
         </div>
         <div class="action-grade-info">
           <p>
-            <span>原始档位:</span><span>{{ curPaper.originLevel }}</span>
+            <span>原始档位:</span
+            ><span>{{ curPaper.originLevel | levelNameFilter }}</span>
           </p>
           <p>
-            <span>申请档位:</span><span>{{ curPaper.redoLevel }}</span>
+            <span>申请档位:</span
+            ><span>{{ curPaper.redoLevel | levelNameFilter }}</span>
           </p>
         </div>
         <div
@@ -231,7 +233,7 @@ export default {
     async getList() {
       const datas = {
         ...this.filter,
-        page: this.current,
+        page: this.current - 1,
         size: this.size
       };
       const data = await changeLevelPaperList(datas);

+ 1 - 0
src/modules/mark/leader/LeaderMarking.vue

@@ -448,6 +448,7 @@ export default {
       const content = `确定申请由${levelInfo.curLevel}档改为${levelInfo.selectedLevel}并打回给所有老师吗?`;
       this.$Modal.confirm({
         content,
+        width: 450,
         onOk: async () => {
           await markStepChangeLevel({
             subjectId: this.subjectId,

+ 2 - 0
src/modules/mark/marker/MarkerMarking.vue

@@ -156,10 +156,12 @@ export default {
           stage: "SCORE"
         },
         shift: {
+          stage: "SCORE",
           isShift: true,
           isShiftScore: false
         },
         shiftScore: {
+          stage: "SCORE",
           isShift: false,
           isShiftScore: true
         },