zhangjie пре 4 година
родитељ
комит
eede99f7e9

+ 11 - 2
src/api.js

@@ -307,9 +307,18 @@ export const markerTaskList = datas => {
   return $get("/api/marktasks", datas);
 };
 // grading or scoring
-export const paperSelectLevelOrScore = (taskId, result, stage) => {
+export const paperSelectLevelOrScore = (
+  taskId,
+  result,
+  stage,
+  manualScore = 0
+) => {
   // stage => LEVEL or SCORE
-  return $patch(`/api/marktasks/${taskId}`, { stage, result }, "json");
+  return $patch(
+    `/api/marktasks/${taskId}`,
+    { stage, result, manualScore },
+    "json"
+  );
 };
 export const paperSelectLevelBatch = (taskIds, result, stage) => {
   return $patch(`/api/marktasks/batch`, { taskIds, result, stage }, "json");

+ 6 - 0
src/assets/styles/base.less

@@ -174,6 +174,12 @@ h2.part-box-head-left {
 .part-page {
   margin-top: 15px;
   text-align: center;
+
+  &-simple {
+    .ivu-page-item {
+      display: none;
+    }
+  }
 }
 .part-filter {
   border-bottom: 1px dashed #e0e0e0;

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

@@ -268,7 +268,7 @@
     margin-top: 20px;
     height: 32px;
     position: relative;
-    .ivu-btn {
+    .ivu-btn[class^="view-action"] {
       position: absolute;
       top: 0;
       left: 50%;

+ 17 - 0
src/assets/styles/mark.less

@@ -723,6 +723,23 @@
       }
     }
   }
+  .action-mark-input {
+    margin-bottom: 30px;
+    .tips-info {
+      line-height: 20px;
+      text-align: left;
+    }
+    .ivu-icon {
+      margin-right: 3px;
+    }
+    .ivu-input-number {
+      width: 90px;
+      min-width: 0;
+    }
+    .ivu-form-item:last-child {
+      margin-right: 0;
+    }
+  }
 }
 
 // .grade-analysis

+ 5 - 0
src/constants/authority.js

@@ -146,6 +146,11 @@ export const mark = [
     title: "用户管理",
     icon: "ivu-icon-student"
   },
+  {
+    name: "MarkGroupManage",
+    title: "打分分组",
+    icon: "ivu-icon-group"
+  },
   {
     name: "MarkExamPaperView",
     title: "查看试卷",

+ 3 - 3
src/modules/client-set/ClientParamSet.vue

@@ -55,7 +55,7 @@
         <div class="part-box">
           <h2 class="client-param-title">其他设置</h2>
           <Form ref="modalFormComp" :model="modalForm" :label-width="120">
-            <FormItem label="是否整包扫描:">
+            <!-- <FormItem label="是否整包扫描:">
               <Select
                 v-model="modalForm.packageScan"
                 :disabled="!modalFormCanEdit"
@@ -68,7 +68,7 @@
                   :label="val"
                 ></Option>
               </Select>
-            </FormItem>
+            </FormItem> 
             <FormItem label="图片是否加密:">
               <Select
                 v-model="modalForm.imageEncrypt"
@@ -96,7 +96,7 @@
                   :label="val"
                 ></Option>
               </Select>
-            </FormItem>
+            </FormItem> -->
             <FormItem label="试卷档位:">
               <Select
                 v-model="modalForm.paperStage"

+ 16 - 1
src/modules/grading-set/GradingRuleSet.vue

@@ -71,6 +71,20 @@
           ></Option>
         </Select>
       </FormItem>
+      <FormItem prop="examNumber" label="是否显示试卷数量:">
+        <Select
+          v-model="modalForm.showPaperCount"
+          :disabled="!modalFormCanEdit"
+          placeholder="是否显示试卷数量"
+        >
+          <Option
+            v-for="(val, key) in BOOLEAN_TYPE"
+            :key="key"
+            :value="key * 1"
+            :label="val"
+          ></Option>
+        </Select>
+      </FormItem>
       <FormItem>
         <Button
           shape="circle"
@@ -109,7 +123,8 @@ export default {
         cumulativeError: null,
         autoCallback: 0,
         majority: 0,
-        levelShowAllPaper: 0
+        levelShowAllPaper: 0,
+        showPaperCount: 1
       },
       modalFormCanEdit: false,
       modalForm: {},

+ 0 - 3
src/modules/grading/Grading.vue

@@ -135,9 +135,6 @@ export default {
           ? main.slice(0, 3)
           : main.slice(1, 3);
         this.navs = [...navHead, ...this.navs];
-        if (this.curSubject.stage === "LEVEL") {
-          this.navs[this.navs.length - 1].title = "打分分组";
-        }
       } else {
         this.navs.splice(2, 2);
       }

+ 14 - 3
src/modules/grading/GradingDetail.vue

@@ -41,6 +41,7 @@
     </div>
     <grade-step
       :steps="steps"
+      :show-count="showPaperRelateCount"
       @on-change="stepChange"
       ref="GradeStep"
       v-if="steps.levelStep"
@@ -151,12 +152,18 @@
               </div>
             </div>
           </div>
-          <div class="part-page" v-if="total > size">
+          <div
+            :class="[
+              'part-page',
+              { 'part-page-simple': !showPaperRelateCount }
+            ]"
+            v-if="total > size"
+          >
             <Page
               :current="current"
               :total="total"
               :page-size="size"
-              show-total
+              :show-total="showPaperRelateCount"
               show-elevator
               @on-change="toPage"
             ></Page>
@@ -171,6 +178,7 @@
       <grade-analysis
         :question-id="filter.questionId"
         :subject-id="subjectId"
+        :show-count="showPaperRelateCount"
         ref="GradeAnalysis"
         v-if="filter.questionId && subjectId"
       ></grade-analysis>
@@ -313,6 +321,9 @@ export default {
     imageViewClasses() {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
     },
+    showPaperRelateCount() {
+      return this.IS_ADMIN || this.paramsSet["showPaperCount"];
+    },
     IS_ADMIN() {
       return (
         this.curUserRoleType === "ADMIN" ||
@@ -345,7 +356,7 @@ export default {
   },
   methods: {
     async initData() {
-      this.getParamsSetInfo();
+      await this.getParamsSetInfo();
       await this.getSubjectDetail();
       // 获取档位列表
       this.getWorkLevels();

+ 18 - 3
src/modules/grading/GradingOperation.vue

@@ -36,6 +36,7 @@
           :steps="steps"
           :init-step="curStep"
           :show-analysis="false"
+          :show-count="showPaperRelateCount"
           @on-change="stepChange"
           ref="GradeStep"
           v-if="steps.levelStep"
@@ -146,12 +147,17 @@
                   </div>
                 </div>
               </div>
-              <div class="part-page">
+              <div
+                :class="[
+                  'part-page',
+                  { 'part-page-simple': !showPaperRelateCount }
+                ]"
+              >
                 <Page
                   :current="current"
                   :total="total"
                   :page-size="size"
-                  show-total
+                  :show-total="showPaperRelateCount"
                   show-elevator
                   show-sizer
                   :page-size-opts="[4, 6, 8]"
@@ -201,7 +207,8 @@ import {
   subjectDetail,
   paperSelectLevelOrScore,
   paperSelectLevelBatch,
-  paperTaskPass
+  paperTaskPass,
+  getParamsSet
 } from "@/api";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import GradeStep from "./components/GradeStep";
@@ -259,6 +266,7 @@ export default {
       papers: [],
       curPaper: {},
       curPaperIndex: 0,
+      paramsSet: {},
       // multiple grading
       multiplebtnClicked: false,
       multipleGradingList: [],
@@ -275,6 +283,9 @@ export default {
     },
     imageViewClasses() {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
+    },
+    showPaperRelateCount() {
+      return this.paramsSet["showPaperCount"];
     }
   },
   mounted() {
@@ -283,6 +294,7 @@ export default {
   },
   methods: {
     async initData() {
+      this.getParamsSetInfo();
       // this.getSubjectDetail();
       this.getWorkLevels();
 
@@ -290,6 +302,9 @@ export default {
       this.filter.questionId = this.areas[0].id;
       this.getStepLevels();
     },
+    async getParamsSetInfo() {
+      this.paramsSet = await getParamsSet(this.workId);
+    },
     async getSubjectDetail() {
       this.curSubject = await subjectDetail(this.subjectId);
     },

+ 16 - 9
src/modules/grading/GradingProgress.vue

@@ -42,6 +42,7 @@
                 <progress-line
                   :sum="item.totalCount"
                   :current="item.successCount"
+                  :show-count="showPaperRelateCount"
                 ></progress-line>
               </td>
               <td>进度:{{ item.progress }}%</td>
@@ -68,6 +69,7 @@
                 <progress-line
                   :sum="item.totalCount"
                   :current="item.successCount"
+                  :show-count="showPaperRelateCount"
                 ></progress-line>
               </td>
               <td>进度:{{ item.progress }}%</td>
@@ -82,6 +84,7 @@
                 <progress-line
                   :sum="item.totalCount"
                   :current="item.successCount"
+                  :show-count="showPaperRelateCount"
                 ></progress-line>
               </td>
               <td>进度:{{ item.progress }}%</td>
@@ -159,16 +162,17 @@ export default {
       );
     },
     showTryGradingBtn() {
-      // 采集时已知档位,则不显示试评任务按钮
-      if (this.paramsSet.paperStage) return false;
+      return false;
+      // // 采集时已知档位,则不显示试评任务按钮
+      // if (this.paramsSet.paperStage) return false;
 
-      return (
-        (this.curSubject.stage == "INIT" &&
-          this.curSubject.test !== 2 &&
-          !this.curSubject.formal &&
-          this.totalProgress.progress > 0) ||
-        (this.curSubject.stage == "LEVEL" && this.curSubject.test === 2)
-      );
+      // return (
+      //   (this.curSubject.stage == "INIT" &&
+      //     this.curSubject.test !== 2 &&
+      //     !this.curSubject.formal &&
+      //     this.totalProgress.progress > 0) ||
+      //   (this.curSubject.stage == "LEVEL" && this.curSubject.test === 2)
+      // );
     },
     showMarkBtn() {
       // 采集时已知档位,分档阶段则可直接进入打分
@@ -181,6 +185,9 @@ export default {
         (this.curSubject.stage == "SCORE" && !this.curSubject.allLevel)
       );
     },
+    showPaperRelateCount() {
+      return this.IS_ADMIN || this.paramsSet["showPaperCount"];
+    },
     IS_ADMIN() {
       return (
         this.curUserRoleType === "ADMIN" ||

+ 10 - 0
src/modules/grading/components/GradeAnalysis.vue

@@ -33,6 +33,10 @@ export default {
     subjectId: {
       type: String,
       required: true
+    },
+    showCount: {
+      type: Boolean,
+      default: true
     }
   },
   data() {
@@ -108,6 +112,12 @@ export default {
         workId: subs[0],
         subject: subs[1]
       });
+      this.levelData = this.levelData.map(item => {
+        item.levelCount = this.showCount ? item.levelCount : "";
+        item.cumulateCount = this.showCount ? item.cumulateCount : "";
+        item.adjustmentCount = this.showCount ? item.adjustmentCount : "";
+        return item;
+      });
 
       this.lineChartData = this.levelData.map(item => {
         return {

+ 12 - 6
src/modules/grading/components/GradeStep.vue

@@ -16,9 +16,9 @@
         ]"
         @click="selectStep(step)"
       >
-        <p>{{ step.count }}</p>
+        <p>{{ showCount || step.type !== "undo" ? step.count : "" }}</p>
         <p class="step-name">{{ step.name }}</p>
-        <p>{{ step.count }}</p>
+        <p>{{ showCount || step.type !== "undo" ? step.count : "" }}</p>
       </div>
     </div>
     <div class="grade-step-level">
@@ -45,13 +45,15 @@
         @click="selectStep(step)"
       >
         <p>
-          <span>{{ step.gcount }}/</span><span>{{ step.gpercent }}%</span
-          ><span>({{ step.pt }}%)</span>
+          <span>{{ showCount ? step.gcount + "/" : "" }}</span>
+          <span>{{ step.gpercent }}%</span>
+          <span>({{ step.pt }}%)</span>
         </p>
         <p class="step-name">{{ step.name }}</p>
         <p>
-          <span>{{ step.count }}/</span><span>{{ step.percent }}%</span
-          ><span v-if="step.kdpt !== null">({{ step.kdpt }}%)</span>
+          <span>{{ showCount ? step.count + "/" : "" }}</span>
+          <span>{{ step.percent }}%</span>
+          <span v-if="step.kdpt !== null">({{ step.kdpt }}%)</span>
         </p>
       </div>
     </div>
@@ -77,6 +79,10 @@ export default {
       default() {
         return { type: "analysis", name: "analysis" };
       }
+    },
+    showCount: {
+      type: Boolean,
+      default: true
     }
   },
   data() {

+ 12 - 4
src/modules/grading/components/ProgressLine.vue

@@ -1,11 +1,15 @@
 <template>
   <div class="progress-line">
     <div class="progress-rate" :style="{ width: progress + '%' }">
-      <span class="progress-num progress-current">{{ current }}</span>
+      <span class="progress-num progress-current" v-if="showCount">{{
+        current
+      }}</span>
     </div>
-    <span class="progress-num progress-remain" v-if="progress < 99.9">{{
-      sum - current
-    }}</span>
+    <span
+      class="progress-num progress-remain"
+      v-if="progress < 99.9 && showCount"
+      >{{ sum - current }}</span
+    >
   </div>
 </template>
 
@@ -24,6 +28,10 @@ export default {
     minRate: {
       type: Number,
       default: 1
+    },
+    showCount: {
+      type: Boolean,
+      default: true
     }
   },
   data() {

+ 17 - 2
src/modules/main/PaperManage.vue

@@ -154,9 +154,20 @@ export default {
   },
   mounted() {
     this.CAFA_EXCEPTION_TYPE = { ...CAFA_EXCEPTION_TYPE, 2: "全部" };
-    this.getSubjects();
+    this.initData();
   },
   methods: {
+    async initData() {
+      await this.getSubjects();
+      this.filter.subject = this.subjects[0].subject;
+      this.filter.areaCode = "";
+      this.areas = [];
+      await this.getAreaList();
+      if (!this.filter.areaCode) {
+        this.filter.areaCode = this.areas[0].areaCode;
+      }
+      this.toPage(1);
+    },
     async getList() {
       const datas = {
         ...this.filter,
@@ -165,9 +176,13 @@ export default {
       };
       const data = await paperPageList(datas);
       this.papers = data.data.map(paper => {
+        const title =
+          this.paperType === "0"
+            ? `${paper.examNumber} ${paper.studentName}`
+            : paper.examNumber;
         return {
           id: paper.id,
-          title: paper.examNumber,
+          title,
           imgSrc: paper.imgSrc,
           thumbSrc: paper.thumbSrc,
           missing: paper.missing,

+ 10 - 1
src/modules/main/QualityAnalysis.vue

@@ -158,9 +158,18 @@ export default {
     };
   },
   mounted() {
-    this.getSubjects();
+    this.initData();
   },
   methods: {
+    async initData() {
+      await this.getSubjects();
+      this.filter.subject = this.subjects[0].subject;
+      this.filter.areaCode = "";
+      this.areas = [];
+      await this.getAreaList();
+      this.filter.areaCode = this.areas[0].areaCode;
+      this.toSearch();
+    },
     async getSubjects() {
       const data = await subjectList(this.filter.workId);
       this.subjects = data.filter(item => item.enable);

+ 21 - 2
src/modules/main/StudentManage.vue

@@ -8,12 +8,12 @@
           @click="$refs.ExportStudent.open()"
           >导入考生信息</Button
         >
-        <Button
+        <!-- <Button
           icon="upload icon"
           shape="circle"
           @click="$refs.ExportRelate.open()"
           >导入关联信息</Button
-        >
+        > -->
       </div>
       <div class="part-box-head-right">
         <Button
@@ -23,6 +23,13 @@
           @click="toAdd"
           >添加考生</Button
         >
+        <Button
+          type="success"
+          icon="upload-white icon"
+          shape="circle"
+          @click="toExport"
+          >导出表格</Button
+        >
       </div>
     </div>
     <div class="part-box part-box-filter">
@@ -199,6 +206,7 @@ import {
 import ImportFile from "@/components/common/ImportFile";
 import ModifyStudent from "./components/ModifyStudent";
 import { BOOLEAN_TYPE, PAPER_UPLOAD_TYPE } from "@/constants/enumerate";
+import qs from "qs";
 
 export default {
   name: "students",
@@ -337,6 +345,7 @@ export default {
         this.$Message.error("上传状态和科目必须同时选择!");
         return;
       }
+      if (datas.subject === "ALL") datas.subject = null;
       const data = await studentPageList(datas);
       this.students = data.data.map(student => {
         student.uploadStatus.split(",").map(status => {
@@ -372,6 +381,10 @@ export default {
         };
         this.columns.splice(this.columns.length - 1, 0, column);
       });
+      this.subjects.unshift({
+        subject: "ALL",
+        name: "全部"
+      });
     },
     areaChange() {
       const curArea = this.cascadeList.find(
@@ -418,6 +431,12 @@ export default {
       await deleteStudent(id);
       this.$Message.success("删除成功!");
       this.deletePageLastItem();
+    },
+    toExport() {
+      const sqDatas = qs.stringify(this.filter, {
+        arrayFormat: "brackets"
+      });
+      window.open(`${this.GLOBAL.domain}/api/export/student?${sqDatas}`);
     }
   }
 };

+ 18 - 3
src/modules/mark/MarkDetail.vue

@@ -40,6 +40,7 @@
     <mark-step
       :steps="steps"
       :init-step="curStep"
+      :show-count="showPaperRelateCount"
       @on-change="stepChange"
       ref="MarkStep"
       v-if="steps.levelStep"
@@ -97,12 +98,18 @@
               </div>
             </div>
           </div>
-          <div class="part-page" v-if="total > size">
+          <div
+            :class="[
+              'part-page',
+              { 'part-page-simple': !showPaperRelateCount }
+            ]"
+            v-if="total > size"
+          >
             <Page
               :current="current"
               :total="total"
               :page-size="size"
-              show-total
+              :show-total="showPaperRelateCount"
               show-elevator
               @on-change="toPage"
             ></Page>
@@ -143,7 +150,8 @@ import {
   areaList,
   workLevelList,
   taskSnSearch,
-  markStepChangeLevel
+  markStepChangeLevel,
+  getParamsSet
 } from "@/api";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import MarkStep from "./components/MarkStep";
@@ -187,6 +195,7 @@ export default {
       papers: [],
       curPaper: {},
       curPaperIndex: 0,
+      paramsSet: {},
       // carousel paper review,
       carouselPapers: [],
       curCarouselPaperIndex: 0,
@@ -219,6 +228,9 @@ export default {
     imageViewClasses() {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
     },
+    showPaperRelateCount() {
+      return this.IS_ADMIN || this.paramsSet["showPaperCount"];
+    },
     IS_ADMIN() {
       return (
         this.curUserRoleType === "ADMIN" ||
@@ -248,6 +260,9 @@ export default {
       this.filter.questionId = this.areas[0].id;
       this.getStepLevels();
     },
+    async getParamsSetInfo() {
+      this.paramsSet = await getParamsSet(this.workId);
+    },
     async getList() {
       let data = [];
       if (this.curStep.type === "shift") {

+ 31 - 7
src/modules/mark/MarkOperation.vue

@@ -50,6 +50,7 @@
               :cur-paper-or-task="curPaper"
               :levels="levels"
               :user-role="curUserRoleType"
+              :show-count="showPaperRelateCount"
               @on-leader-level="gradingCurPaper"
               @on-select-score="scoreCurPaper"
               @on-pass="passCurPaper"
@@ -93,12 +94,18 @@
                   </div>
                 </div>
               </div>
-              <div class="part-page" v-if="total > size">
+              <div
+                :class="[
+                  'part-page',
+                  { 'part-page-simple': !showPaperRelateCount }
+                ]"
+                v-if="total > size"
+              >
                 <Page
                   :current="current"
                   :total="total"
                   :page-size="size"
-                  show-total
+                  :show-total="showPaperRelateCount"
                   show-elevator
                   :page-size-opts="[4, 6, 8]"
                   @on-page-size-change="pageSizeChange"
@@ -213,6 +220,7 @@ export default {
       papers: [],
       curPaper: {},
       curPaperIndex: 0,
+      paramsSet: {},
       // carousel paper review,
       carouselPapers: [],
       curCarouselPaperIndex: 0,
@@ -225,6 +233,9 @@ export default {
     },
     imageViewClasses() {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
+    },
+    showPaperRelateCount() {
+      return this.paramsSet["showPaperCount"];
     }
   },
   mounted() {
@@ -246,8 +257,8 @@ export default {
       this.curSubject = await subjectDetail(this.subjectId);
     },
     async getParamsSetInfo() {
-      const data = await getParamsSet(this.workId);
-      this.changeStage = data.changeStage;
+      this.paramsSet = await getParamsSet(this.workId);
+      this.changeStage = this.paramsSet.changeStage;
     },
     async getList() {
       const datas = {
@@ -385,8 +396,20 @@ export default {
       } else if (index < 0) {
         nindex = 0;
       }
+      const lastPaper = { ...this.curPaper };
       this.curPaperIndex = nindex;
       this.curPaper = this.papers[nindex] ? { ...this.papers[nindex] } : {};
+
+      // 待评时,检查当前试卷是否已经切换档位
+      if (
+        this.curStep.type === "undo" &&
+        this.curPaper["level"] &&
+        this.curPaper["level"] !== lastPaper["level"]
+      ) {
+        this.$Modal.info({
+          content: `即将打分档位:${this.curPaper.level}`
+        });
+      }
     },
     async toPrevPaper() {
       if (this.curPaperIndex === 0) {
@@ -440,11 +463,12 @@ export default {
       this.updateHistory();
       this.toActionNextPaper();
     },
-    async scoreCurPaper(score) {
+    async scoreCurPaper(info) {
       await paperSelectLevelOrScore(
         this.curPaper.id, // is taskId
-        score,
-        "SCORE"
+        info.score,
+        "SCORE",
+        info.manualScore
       );
       this.getStepLevels();
       this.updateHistory();

+ 75 - 2
src/modules/mark/components/MarkAction.vue

@@ -144,6 +144,34 @@
         </div>
       </div>
     </div>
+    <div class="action-mark-input">
+      <Form
+        ref="ManualScoreForm"
+        label-position="left"
+        :model="manualScoreModel"
+        :rules="manualScoreModelRules"
+        inline
+      >
+        <FormItem prop="score" label="分数" :show-message="false">
+          <InputNumber
+            :max="manualMaxScore"
+            :min="manualMinScore"
+            :precision="0"
+            v-model="manualScoreModel.score"
+          ></InputNumber>
+        </FormItem>
+        <FormItem>
+          <Button type="primary" size="small" @click="toInputScore">
+            确定
+          </Button>
+        </FormItem>
+      </Form>
+      <p class="tips-info">
+        <Icon type="md-alert" />分数必须介于{{ manualMinScore }}和{{
+          manualMaxScore
+        }}之间
+      </p>
+    </div>
     <div class="action-grade-pass" v-if="rights.levelList">
       <Button @click="toPass">跳过</Button>
     </div>
@@ -175,6 +203,7 @@
 <script>
 import { markHistoryList } from "@/api";
 import { CODE_TYPE, CHANGE_LEVEL_STATUS } from "@/constants/enumerate";
+
 // 三种情况:
 // 管理员(ADMIN),科组长(MARK_LEADER),评卷员(MARKER)
 // 管理员:查询,头部信息,评卷记录
@@ -292,6 +321,26 @@ export default {
         codeType: "examNumber",
         code: ""
       },
+      manualMaxScore: 100,
+      manualMinScore: 0,
+      manualScoreModel: {
+        score: null,
+        manualScore: 1
+      },
+      manualScoreModelRules: {
+        score: [
+          {
+            validator: (rule, value, callback) => {
+              if (value === null) {
+                callback(new Error("请输入分数"));
+              } else {
+                callback();
+              }
+            },
+            trigger: "change"
+          }
+        ]
+      },
       codeTypes: [],
       CHANGE_LEVEL_STATUS,
       applyChangeLevelStatus: null,
@@ -340,8 +389,22 @@ export default {
       })
       .filter(item => this.IS_ADMIN || item.key !== "examNumber");
     this.rebuildRight();
+    this.getValidScoreArea();
   },
   methods: {
+    getValidScoreArea() {
+      let nums = [];
+      this.levels.forEach(level => {
+        if (level.levelType === "ADMITED") {
+          nums = [...nums, level.minScore, level.maxScore];
+        } else {
+          let scores = this.curLevel.scoreList.split(",").map(item => item * 1);
+          nums = [...nums, ...scores];
+        }
+      });
+      this.manualMaxScore = Math.max.apply(null, nums);
+      this.manualMinScore = Math.min.apply(null, nums);
+    },
     getStepType() {
       const paper = this.curPaperOrTask;
       if (paper.shift && paper.shiftScore && !paper.level) return "shift";
@@ -425,7 +488,8 @@ export default {
     gradeChangeConfirm() {
       this.selectLevel({ name: this.curPaperOrTask.redoLevel });
     },
-    selectScore(score) {
+    selectScore(score, manualScore = 0) {
+      if (!score && score !== 0) return;
       if (this.btnClicked) return;
       this.btnClicked = true;
 
@@ -433,7 +497,16 @@ export default {
         this.btnClicked = false;
       }, 500);
       // 评卷员打分
-      this.$emit("on-select-score", score * 1);
+      this.$emit("on-select-score", { score, manualScore });
+    },
+    async toInputScore() {
+      const valid = await this.$refs.ManualScoreForm.validate();
+      if (!valid) return;
+      this.selectScore(
+        this.manualScoreModel.score,
+        this.manualScoreModel.manualScore
+      );
+      this.manualScoreModel.score = null;
     },
     toPass() {
       this.$emit("on-pass");

+ 7 - 3
src/modules/mark/components/MarkStep.vue

@@ -18,7 +18,7 @@
       >
         <p v-if="showTopNumber"></p>
         <p class="step-name">{{ step.name }}</p>
-        <p>{{ step.count }}</p>
+        <p>{{ showCount || step.type !== "undo" ? step.count : "" }}</p>
       </div>
     </div>
     <div class="grade-step-level">
@@ -34,9 +34,9 @@
         ]"
         @click="selectStep(step)"
       >
-        <p v-if="showTopNumber">{{ step.gcount }}</p>
+        <p v-if="showTopNumber && showCount">{{ step.gcount }}</p>
         <p class="step-name">{{ step.name }}</p>
-        <p>{{ step.count }}</p>
+        <p>{{ showCount ? step.count : "" }}</p>
       </div>
     </div>
   </div>
@@ -61,6 +61,10 @@ export default {
       default() {
         return { type: "", name: "" };
       }
+    },
+    showCount: {
+      type: Boolean,
+      default: true
     }
   },
   data() {

+ 10 - 1
src/routers/mark.js

@@ -4,7 +4,7 @@ import MarkProgress from "../modules/mark/MarkProgress";
 import MarkDetail from "../modules/mark/MarkDetail";
 import MarkTaskManage from "../modules/mark/MarkTaskManage";
 import MarkUserManage from "../modules/mark/MarkUserManage";
-// import MarkGroupManage from "../modules/mark/MarkGroupManage";
+import MarkGroupManage from "../modules/mark/MarkGroupManage";
 import ExamPaperView from "../modules/main/ExamPaperView";
 
 // 阅卷员打分
@@ -43,6 +43,15 @@ const markRoutes = [
       title: "用户管理"
     }
   },
+
+  {
+    path: "mark-group-manage",
+    name: "MarkGroupManage",
+    component: MarkGroupManage,
+    meta: {
+      title: "打分分组"
+    }
+  },
   {
     path: "exam-paper-view",
     name: "MarkExamPaperView",