Browse Source

grading -md

zhangjie 5 years ago
parent
commit
242fe0de3c

+ 15 - 0
src/api.js

@@ -221,6 +221,9 @@ export const workLevelList = workId => {
 export const levelStatData = (subjectId, questionId) => {
   return $get(`/api/marksubjects/${subjectId}/stat/levels`, { questionId });
 };
+export const markerLevelStatData = (userId, questionId) => {
+  return $get(`/api/markers/${userId}/stat/levels`, { questionId });
+};
 // area
 export const areaList = ({ workId, subject }) => {
   return $get("/api/questions", { workId, subject });
@@ -234,6 +237,13 @@ export const markerPaperList = datas => {
   // ?stage=LEVEL&markerId=49&size=6&page=0&sort=updatedOn,desc&questionId=73&isSample=false&level=C
   return $get("/api/marktasks", datas);
 };
+// grading or scoring
+export const paperSelectLevel = (paperId, level, stage) => {
+  return $patch(`/api/marktasks/${paperId}`, { stage, result: level }, "json");
+};
+export const paperPassLevel = paperId => {
+  return $post(`/api/marktasks/${paperId}/skip`, {});
+};
 // grade or mark history
 export const markHistoryList = (paperId, stage) => {
   return $get(`/api/papers/${paperId}/marktasks`, { stage });
@@ -242,6 +252,11 @@ export const markHistoryList = (paperId, stage) => {
 export const markerDetail = userId => {
   return $get(`/api/markers/${userId}`);
 };
+// leader mark paper
+export const leaderGradingPaper = (paperId, datas) => {
+  // datas:{value: ,level:,range?}
+  return $patch(`/api/papers/${paperId}`, datas);
+};
 
 // mark -------------------------->
 // mark-progress

+ 3 - 0
src/assets/styles/main.less

@@ -85,6 +85,9 @@
   padding: 10px;
   width: 300px;
   text-align: center;
+  &-act {
+    box-shadow: 0 0 1px @mainColor;
+  }
 
   &-title {
     font-size: 16px;

+ 77 - 59
src/modules/grading/GradingDetail.vue

@@ -4,6 +4,7 @@
       :steps="steps"
       @on-change="stepChange"
       ref="GradeStep"
+      v-if="steps.length"
     ></grade-step>
     <div class="detail-body" v-if="curStep.name !== 'analysis'">
       <div class="detail-filter">
@@ -33,7 +34,7 @@
             ref="GradeStandardPaper"
           ></grade-standard-paper>
           <paper-carousel
-            :papers="papers"
+            :papers="historyList"
             v-if="!IS_ADMIN"
             ref="PaperCarousel"
           ></paper-carousel>
@@ -41,7 +42,10 @@
         <div class="detail-papers-list">
           <div :class="imageViewClasses">
             <div
-              class="image-view"
+              :class="[
+                'image-view',
+                { 'image-view-act': curPaperIndex === index }
+              ]"
               v-for="(image, index) in papers"
               :key="index"
             >
@@ -62,9 +66,6 @@
               :page-size="size"
               show-total
               show-elevator
-              :show-sizer="IS_MARKER"
-              :page-size-opts="[4, 6, 8]"
-              @on-page-size-change="pageSizeChange"
               @on-change="toPage"
             ></Page>
           </div>
@@ -73,11 +74,11 @@
       <!-- detail-aciton -->
       <div class="detail-action">
         <grade-action
-          :paper="curPaper"
+          :cur-paper="curPaper"
           :levels="levels"
           :step="curStep"
           :user-role="curUserRoleType"
-          @on-confirm="gradeCurPaper"
+          @on-leader-level="leaderSelectLevel"
           ref="GradeAction"
           v-if="curPaper.id && curStep.name"
         ></grade-action>
@@ -92,29 +93,44 @@
       class="grading-detail-image-preview"
       :image-list="papers"
       :init-index="curPaperIndex"
-      @on-prev="paperPrev"
-      @on-next="paperNext"
+      @on-prev="selectPaper"
+      @on-next="selectPaper"
       @on-page-prev="prevPage"
       @on-page-next="nextPage"
       header-hide
       ref="ImagePreview"
       v-if="papers.length"
     ></image-preview>
+    <!-- modify-leader-grading -->
+    <modify-leader-grading
+      :level-info="levelInfo"
+      :markers="markers"
+      @modified="leaderGradingSuccess"
+      ref="ModifyLeaderGrading"
+    ></modify-leader-grading>
   </div>
 </template>
 
 <script>
-import { paperList, levelStatData, areaList, workLevelList } from "@/api";
+import {
+  paperList,
+  levelStatData,
+  areaList,
+  workLevelList,
+  paperSelectLevel
+} from "@/api";
 import ImagePreview from "@/components/common/ImagePreview";
 import GradeStep from "./components/GradeStep";
 import GradeStandardPaper from "./components/GradeStandardPaper";
 import PaperCarousel from "./components/PaperCarousel";
 import GradeAction from "./components/GradeAction";
 import GradeAnalysis from "./components/GradeAnalysis";
+import ModifyLeaderGrading from "./components/ModifyLeaderGrading";
 // 三种情况:
 // 管理员(ADMIN),科组长(MARK_LEADER),评卷员(MARKER)
 // 管理员:标准卷,试卷列表,操作盘
 // 科组长:标准卷,操作记录,试卷列表,操作盘(定档,标准卷,打回)
+
 // TIP:不考虑评卷员的情况
 // 评卷员:标准卷,操作记录,试卷列表,操作盘(只分档)
 
@@ -126,7 +142,8 @@ export default {
     GradeStep,
     GradeStandardPaper,
     GradeAction,
-    GradeAnalysis
+    GradeAnalysis,
+    ModifyLeaderGrading
   },
   data() {
     return {
@@ -136,7 +153,7 @@ export default {
         isSample: false
       },
       typeFilter: {
-        level: {
+        done: {
           level: ""
         },
         reject: {
@@ -161,7 +178,11 @@ export default {
       areas: [],
       papers: [],
       curPaper: {},
-      curPaperIndex: 0
+      curPaperIndex: 0,
+      historyList: [],
+      // leader-grade
+      levelInfo: {},
+      markers: []
     };
   },
   computed: {
@@ -174,9 +195,6 @@ export default {
     IS_ADMIN() {
       return this.curUserRoleType === "ADMIN";
     },
-    IS_MARKER() {
-      return this.curUserRoleType === "MARKER";
-    },
     IS_MARK_LEADER() {
       return this.curUserRoleType === "MARK_LEADER";
     }
@@ -200,10 +218,9 @@ export default {
         page: this.current - 1,
         size: this.size
       };
-      if (this.curStep.type === "level") datas.level = this.curStep.name;
+      if (this.curStep.type === "done") datas.level = this.curStep.name;
 
-      let data = [];
-      data = await paperList(datas);
+      const data = await paperList(datas);
       this.papers = data.data.map(paper => {
         paper.title = paper.examNumber;
         return paper;
@@ -222,25 +239,22 @@ export default {
         const undo = { ...data[undoIndex] };
         data.splice(undoIndex, 1);
 
+        otherStep.push({
+          name: "打回",
+          count: undo.rejected,
+          type: "reject"
+        });
         otherStep.push({
           name: "仲裁",
           count: undo.arbitrated,
           type: "arbitrate"
         });
-
-        if (this.IS_MARK_LEADER) {
-          otherStep.push({
-            name: "打回",
-            count: undo.rejected,
-            type: "reject"
-          });
-        }
       }
       let levelMenu = data.map(item => {
         return {
           ...item,
           name: item.id,
-          type: "level"
+          type: "done"
         };
       });
       this.steps = [...levelMenu, ...otherStep];
@@ -269,59 +283,63 @@ export default {
         };
       });
     },
-    pageSizeChange(size) {
-      this.size = size;
-      this.toPage(1);
-      this.initData();
-      this.$nextTick(() => {
-        this.$refs.GradeStandardPaper.$refs.Carousel.handleResize();
-        this.$refs.PaperCarousel &&
-          this.$refs.PaperCarousel.$refs.Carousel.handleResize();
-      });
-    },
-    stepChange(step) {
+    async stepChange(step) {
       this.curStep = step;
-      this.toPage(1);
+      if (step.type === "analysis") return;
+
+      this.current = 1;
+      await this.getList();
+      if (this.papers.length) {
+        this.selectPaper(0);
+      }
     },
-    toReview(index) {
-      this.curPaper = { ...this.papers[index] };
+    selectPaper(index) {
       this.curPaperIndex = index;
-      this.$refs.ImagePreview.open();
-    },
-    paperPrev(index) {
       this.curPaper = { ...this.papers[index] };
-      this.curPaperIndex = index;
     },
-    paperNext(index) {
+    toReview(index) {
       this.curPaper = { ...this.papers[index] };
       this.curPaperIndex = index;
+      this.$refs.ImagePreview.open();
     },
-    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();
     },
-    gradeCurPaper(grade) {
-      // TODO:to grade
+    async gradeCurPaper(level) {
+      if (!this.IS_MARK_LEADER) return;
 
+      await paperSelectLevel(this.curPaper.id, level.name, "LEVEL");
+      this.getStepLevels();
+      this.toNext();
+    },
+    toNext() {
       this.$refs.ImagePreview.showNext();
-      // if (this.curPaperIndex === this.size - 1) {
-      //   this.nextPage();
-      //   return;
-      // } else {
-      //   this.paperNext(this.curPaperIndex + 1);
-      // }
+    },
+    leaderSelectLevel(levelInfo, markers) {
+      this.levelInfo = levelInfo;
+      this.markers = markers;
+      this.$refs.ModifyLeaderGrading.open();
+    },
+    leaderGradingSuccess() {
+      this.getStepLevels();
+      this.toNext();
     }
   }
 };

+ 173 - 144
src/modules/grading/GradingOperation.vue

@@ -1,87 +1,101 @@
 <template>
-  <div class="grading-operation">
-    <grade-step
-      :steps="steps"
-      @on-change="stepChange"
-      ref="GradeStep"
-    ></grade-step>
-    <div class="detail-body" v-if="curStep.name !== 'analysis'">
-      <div class="detail-filter">
-        <Form ref="FilterForm" label-position="left" inline>
-          <FormItem>
-            <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>
-            <Button type="primary" icon="ios-search" @click="toPage(1)"
-              >查询</Button
-            >
-          </FormItem>
-        </Form>
-      </div>
-      <!-- detail-papers -->
-      <div :class="detailPapersClasses">
-        <div class="detail-papers-carousel">
-          <grade-standard-paper ref="GradeStandardPaper"></grade-standard-paper>
-          <paper-carousel
-            :papers="papers"
-            v-if="!IS_ADMIN"
-            ref="PaperCarousel"
-          ></paper-carousel>
-        </div>
-        <div class="detail-papers-list">
-          <div :class="imageViewClasses">
-            <div
-              class="image-view"
-              v-for="(image, index) in papers"
-              :key="index"
-            >
-              <h5 class="image-view-title">{{ image.title }}</h5>
-              <div class="image-view-contain">
-                <img
-                  :src="image.thumbSrc"
-                  :alt="image.title"
-                  @click="toReview(index)"
-                />
+  <div class="grading-operation home">
+    <div class="home-header">
+      <view-header>
+        <h1 slot="logo">{{ curSubject.name }}</h1>
+      </view-header>
+    </div>
+    <div class="home-body">
+      <div class="home-main home-main-nofooter grading-detail">
+        <grade-step
+          :steps="steps"
+          :init-step="curStep"
+          :show-analysis="false"
+          @on-change="stepChange"
+          ref="GradeStep"
+          v-if="steps.length"
+        ></grade-step>
+        <div class="detail-body">
+          <div class="detail-filter">
+            <Form ref="FilterForm" label-position="left" inline>
+              <FormItem>
+                <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>
+                <Button type="primary" icon="ios-search" @click="toPage(1)"
+                  >查询</Button
+                >
+              </FormItem>
+            </Form>
+          </div>
+          <!-- detail-papers -->
+          <div :class="detailPapersClasses">
+            <div class="detail-papers-carousel">
+              <grade-standard-paper
+                :levels="levels"
+                ref="GradeStandardPaper"
+              ></grade-standard-paper>
+              <paper-carousel
+                :papers="historyList"
+                ref="PaperCarousel"
+              ></paper-carousel>
+            </div>
+            <div class="detail-papers-list">
+              <div :class="imageViewClasses">
+                <div
+                  :class="[
+                    'image-view',
+                    { 'image-view-act': curPaperIndex === index }
+                  ]"
+                  v-for="(image, index) in papers"
+                  :key="index"
+                >
+                  <h5 class="image-view-title">{{ image.title }}</h5>
+                  <div class="image-view-contain">
+                    <img
+                      :src="image.thumbSrc"
+                      :alt="image.title"
+                      @click="toReview(index)"
+                    />
+                  </div>
+                </div>
+              </div>
+              <div class="part-page" v-if="total > size">
+                <Page
+                  :current="current"
+                  :total="total"
+                  :page-size="size"
+                  show-total
+                  show-elevator
+                  :page-size-opts="[4, 6, 8]"
+                  @on-page-size-change="pageSizeChange"
+                  @on-change="toPage"
+                ></Page>
               </div>
             </div>
           </div>
-          <div class="part-page" v-if="total > size">
-            <Page
-              :current="current"
-              :total="total"
-              :page-size="size"
-              show-total
-              show-elevator
-              :show-sizer="IS_MARKER"
-              :page-size-opts="[4, 6, 8]"
-              @on-page-size-change="pageSizeChange"
-              @on-change="toPage"
-            ></Page>
+          <!-- detail-aciton -->
+          <div class="detail-action">
+            <grade-action
+              :cur-paper="curPaper"
+              :levels="levels"
+              :step="curStep"
+              :user-role="curUserRoleType"
+              @on-select-level="gradeCurPaper"
+              @on-pass="passCurPaper"
+              ref="GradeAction"
+              v-if="curPaper.id && curStep.name"
+            ></grade-action>
           </div>
         </div>
       </div>
-      <!-- detail-aciton -->
-      <div class="detail-action">
-        <grade-action
-          :paper="curPaper"
-          :levels="levels"
-          :step="curStep"
-          :user-role="curUserRoleType"
-          @on-confirm="gradeCurPaper"
-          ref="GradeAction"
-          v-if="curPaper.id && curStep.name"
-        ></grade-action>
-      </div>
-    </div>
-    <div class="detail-body" v-else>
-      <grade-analysis ref="GradeAnalysis"></grade-analysis>
     </div>
 
     <!-- image-preview -->
@@ -89,8 +103,8 @@
       class="grading-detail-image-preview"
       :image-list="papers"
       :init-index="curPaperIndex"
-      @on-prev="paperPrev"
-      @on-next="paperNext"
+      @on-prev="selectPaper"
+      @on-next="selectPaper"
       @on-page-prev="prevPage"
       @on-page-next="nextPage"
       header-hide
@@ -102,18 +116,19 @@
 
 <script>
 import {
-  paperList,
   markerPaperList,
-  levelStatData,
+  markerLevelStatData,
   areaList,
-  workLevelList
+  workLevelList,
+  subjectDetail,
+  paperSelectLevel,
+  paperPassLevel
 } from "@/api";
 import ImagePreview from "@/components/common/ImagePreview";
 import GradeStep from "./components/GradeStep";
 import GradeStandardPaper from "./components/GradeStandardPaper";
 import PaperCarousel from "./components/PaperCarousel";
 import GradeAction from "./components/GradeAction";
-import GradeAnalysis from "./components/GradeAnalysis";
 // 三种情况:
 // 管理员(ADMIN),科组长(MARK_LEADER),评卷员(MARKER)
 // 评卷员:标准卷,操作记录,试卷列表,操作盘(只分档)
@@ -129,33 +144,44 @@ export default {
     PaperCarousel,
     GradeStep,
     GradeStandardPaper,
-    GradeAction,
-    GradeAnalysis
+    GradeAction
   },
   data() {
     return {
       filter: {
+        markerId: this.$ls.get("user").id,
         questionId: "",
-        level: "",
-        sort: "secretNumber",
+        sort: "randomSeq,asc",
+        stage: "LEVEL",
         isSample: false
       },
+      typeFilter: {
+        done: {
+          level: ""
+        },
+        undo: {},
+        reject: {
+          reject: true
+        }
+      },
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
       subject: "",
+      curSubject: {},
       curUserRoleType: "MARKER",
       current: 1,
       size: 6,
       total: 0,
       totalPage: 1,
-      curStep: { type: "analysis", name: "analysis" },
+      curStep: { type: "undo", name: "待评" },
       curStandardGradeId: "",
       steps: [],
       levels: [],
       areas: [],
       papers: [],
       curPaper: {},
-      curPaperIndex: 0
+      curPaperIndex: 0,
+      historyList: []
     };
   },
   computed: {
@@ -164,43 +190,36 @@ export default {
     },
     imageViewClasses() {
       return ["image-view-list", `image-view-list-${this.size / 2}`];
-    },
-    IS_ADMIN() {
-      return this.curUserRoleType === "ADMIN";
-    },
-    IS_MARKER() {
-      return this.curUserRoleType === "MARKER";
-    },
-    IS_MARK_LEADER() {
-      return this.curUserRoleType === "MARK_LEADER";
     }
   },
   mounted() {
     this.subject = this.subjectId.split("-")[1];
-    this.curUserRoleType = this.$ls.get("user", { role: "" }).role;
     this.initData();
   },
   methods: {
     async initData() {
+      this.getSubjectDetail();
       await this.getAreaList();
       this.filter.questionId = this.areas[0].id;
       this.getStepLevels();
       this.getWorkLevels();
     },
+    async getSubjectDetail() {
+      this.curSubject = await subjectDetail(this.subjectId);
+    },
     async getList() {
       const datas = {
         ...this.filter,
+        ...this.typeFilter[this.curStep.type],
         page: this.current - 1,
         size: this.size
       };
-      let data = [];
-      if (this.IS_MARKER) {
+      if (this.curStep.type === "done") {
+        datas.level = this.curStep.name;
         datas.sort = "updatedOn,desc";
-        datas.markerId = this.$ls.get("user").id;
-        data = await markerPaperList(datas);
-      } else {
-        data = await paperList(datas);
       }
+
+      const data = await markerPaperList(datas);
       this.papers = data.data.map(paper => {
         paper.title = paper.examNumber;
         return paper;
@@ -212,7 +231,10 @@ export default {
       this.getList();
     },
     async getStepLevels() {
-      const data = await levelStatData(this.subjectId, this.filter.questionId);
+      const data = await markerLevelStatData(
+        this.filter.markerId,
+        this.filter.questionId
+      );
       const undoIndex = data.findIndex(item => item.id === null);
       let otherStep = [];
       if (undoIndex !== -1) {
@@ -220,27 +242,31 @@ export default {
         data.splice(undoIndex, 1);
 
         otherStep.push({
-          name: "仲裁",
-          count: undo.arbitrated,
-          type: "arbitrate"
+          name: "待评",
+          count: undo.count,
+          type: "undo"
+        });
+        otherStep.push({
+          name: "打回",
+          count: undo.rejected,
+          type: "reject"
         });
-
-        if (this.IS_MARK_LEADER) {
-          otherStep.push({
-            name: "打回",
-            count: undo.rejected,
-            type: "reject"
-          });
-        }
       }
       let levelMenu = data.map(item => {
         return {
           ...item,
           name: item.id,
-          type: "level"
+          type: "done"
         };
       });
       this.steps = [...levelMenu, ...otherStep];
+      let curStep = {};
+      if (undoIndex === -1) {
+        curStep = this.steps[0];
+      } else {
+        curStep = this.steps[this.steps.length - 2];
+      }
+      this.curStep = curStep;
     },
     async getWorkLevels() {
       const data = await workLevelList(this.workId);
@@ -269,57 +295,60 @@ export default {
     pageSizeChange(size) {
       this.size = size;
       this.toPage(1);
-      this.initData();
+      this.getStepLevels();
       this.$nextTick(() => {
         this.$refs.GradeStandardPaper.$refs.Carousel.handleResize();
         this.$refs.PaperCarousel &&
           this.$refs.PaperCarousel.$refs.Carousel.handleResize();
       });
     },
-    stepChange(step) {
+    async stepChange(step) {
       this.curStep = step;
-      if (step.type === "level") this.filter.level = step.name;
-      this.initData();
+      this.current = 1;
+      await this.getList();
+      if (this.papers.length) {
+        this.selectPaper(0);
+      }
     },
-    toReview(index) {
-      this.curPaper = { ...this.papers[index] };
+    selectPaper(index) {
       this.curPaperIndex = index;
-      this.$refs.ImagePreview.open();
-    },
-    paperPrev(index) {
       this.curPaper = { ...this.papers[index] };
-      this.curPaperIndex = index;
     },
-    paperNext(index) {
-      this.curPaper = { ...this.papers[index] };
-      this.curPaperIndex = index;
+    toReview(index) {
+      this.selectPaper(index);
+      this.$refs.ImagePreview.open();
     },
-    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();
     },
-    gradeCurPaper(grade) {
-      // TODO:to grade
-
+    async gradeCurPaper(level) {
+      await paperSelectLevel(this.curPaper.id, level.name, "LEVEL");
+      this.getStepLevels();
+      this.toNext();
+    },
+    async passCurPaper(level) {
+      await paperPassLevel(this.curPaper.id);
+      this.toNext();
+    },
+    toNext() {
       this.$refs.ImagePreview.showNext();
-      // if (this.curPaperIndex === this.size - 1) {
-      //   this.nextPage();
-      //   return;
-      // } else {
-      //   this.paperNext(this.curPaperIndex + 1);
-      // }
     }
   }
 };

+ 36 - 32
src/modules/grading/components/GradeAction.vue

@@ -23,7 +23,7 @@
     <!-- 试卷状态 -->
     <!-- 状态:已评,待评,打回,仲裁 -->
     <div class="action-paper-state" v-if="rights.paperState">
-      <p class="paper-state-cont">{{ step.typeName }}</p>
+      <p class="paper-state-cont">{{ stepLabel }}</p>
     </div>
     <!-- 试卷信息 -->
     <div class="action-paper-info" v-if="rights.paperInfo">
@@ -33,6 +33,7 @@
     <!-- 档位信息 -->
     <!-- 已评(已评档位),打回(建议档位) -->
     <div class="action-grade-info" v-if="rights.gradeInfo">
+      <p v-if="curPaper.rejected">建议档位</p>
       <h3 class="grade-info-name">{{ curLevel.name }}</h3>
       <p class="grade-info-range">
         <span>{{ curLevel.minScore }}</span>
@@ -47,11 +48,11 @@
         v-for="(level, index) in levels"
         :key="index"
       >
-        <p>{{ level.name }}</p>
+        <p @click="selectLevel(level)">{{ level.name }}</p>
         <p>{{ level.minScore }}~{{ level.maxScore }}</p>
       </div>
     </div>
-    <div class="action-grade-pass" v-if="rights.gradeList">
+    <div class="action-grade-pass" v-if="rights.gradeList && IS_MARKER">
       <Button type="primary" @click="toPass">跳过</Button>
     </div>
 
@@ -124,7 +125,7 @@ const initRights = {
 export default {
   name: "grade-action",
   props: {
-    paper: {
+    curPaper: {
       type: Object,
       default() {
         return {};
@@ -185,16 +186,15 @@ export default {
         code: ""
       },
       CODE_TYPE,
-      curPaper: {
-        examNumber: "2020105133",
-        sn: "2020105133",
-        level: ""
+      stepDict: {
+        undo: "待评",
+        done: "已评",
+        reject: "打回",
+        arbitrate: "仲裁"
       },
+      stepLabel: "",
       gradingHistory: [],
-      curLevel: {
-        name: "A",
-        range: [95, 100]
-      }
+      curLevel: {}
     };
   },
   computed: {
@@ -209,50 +209,54 @@ export default {
     }
   },
   watch: {
-    paper(val) {
+    curPaper(val) {
       this.rebuildRight();
     }
   },
   mounted() {
-    this.initData();
     this.rebuildRight();
   },
   methods: {
-    initData() {
-      this.gradingHistory = "ABCDEFGHIJK".split("").map((item, index) => {
-        return {
-          id: index,
-          name: `评卷员${index}`,
-          value: item
-        };
-      });
-    },
     rebuildRight() {
+      this.stepLabel = this.stepDict[this.step.type];
       this.rights = { ...initRights };
       const rights = this.roleRight[this.userRole][this.step.type] || [];
       rights.map(key => {
         this.rights[key] = true;
       });
-      if (this.paper.level) {
-        const paperLevel = this.levels.find(
-          level => level.name === this.paper.level
+      if (this.curPaper.level) {
+        this.curLevel = this.levels.find(
+          level => level.name === this.curPaper.level
         );
-        this.curLevel = {
-          name: paperLevel.name,
-          range: paperLevel.range
-        };
+      }
+      if (this.rights.gradeHis) {
+        this.getMarkHistory();
       }
     },
     async getMarkHistory() {
-      const data = await markHistoryList(this.curPaper.id);
+      const data = await markHistoryList(this.curPaper.id, "LEVEL");
       this.gradingHistory = data.map(item => {
         return {
-          id: item.id,
+          id: item.markerId,
           name: item.marker,
           value: item.result
         };
       });
     },
+    selectLevel(level) {
+      if (this.IS_MARK_LEADER) {
+        this.$emit(
+          "on-leader-level",
+          {
+            curLevel: this.curPaper.level,
+            selectLevel: level.name
+          },
+          this.gradingHistory
+        );
+        return;
+      }
+      this.$emit("on-select-level", level);
+    },
     toPass() {
       this.$emit("on-pass");
     },

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

@@ -50,9 +50,7 @@ export default {
       curPaperIndex: 0
     };
   },
-  mounted() {
-    this.initData();
-  },
+  mounted() {},
   methods: {
     async getPapers() {
       const datas = {

+ 11 - 2
src/modules/grading/components/GradeStep.vue

@@ -18,7 +18,7 @@
           :class="['step-item', { 'step-act': curStep.name === step.name }]"
           @click="selectStep(step)"
         >
-          <div v-if="step.type === 'level'">
+          <div v-if="step.type === 'done'">
             <p>
               <span>{{ step.gcount }}/</span><span>{{ step.gpercent }}%</span
               ><span>({{ step.pt }}%)</span>
@@ -53,13 +53,22 @@ export default {
       default() {
         return [];
       }
+    },
+    initStep: {
+      type: Object,
+      default() {
+        return { type: "analysis", name: "analysis" };
+      }
     }
   },
   data() {
     return {
-      curStep: { type: "analysis", name: "analysis" }
+      curStep: {}
     };
   },
+  mounted() {
+    this.selectStep(this.initStep);
+  },
   methods: {
     selectStep(step) {
       this.curStep = { ...step };

+ 133 - 0
src/modules/grading/components/ModifyLeaderGrading.vue

@@ -0,0 +1,133 @@
+<template>
+  <Modal
+    class="modify-leader-grading"
+    v-model="modalIsShow"
+    title="科组长评档"
+    :mask-closable="false"
+    @on-visible-change="visibleChange"
+  >
+    <div class="leader-grading">
+      <div class="leader-level">
+        <h3>{{ LevelInfo.selectLevel }}</h3>
+      </div>
+      <RadioGroup v-model="actionType">
+        <div class="leader-aciton" v-if="standardVolume">
+          <Radio label="sampling">设为标准卷</Radio>
+        </div>
+        <div class="leader-aciton" v-if="oneClickLevel">
+          <Radio label="leveling" :disabled="noneedLevelOrReject"
+            >一键定档</Radio
+          >
+        </div>
+        <div class="leader-aciton" v-if="levelCallback">
+          <Radio label="reject" :disabled="noneedLevelOrReject"
+            >建议档位打回</Radio
+          >
+        </div>
+      </RadioGroup>
+      <div class="leader-markers">
+        <CheckboxGroup v-model="selectedMarkers">
+          <Checkbox
+            v-for="(marker, index) in markers"
+            :key="index"
+            :label="marker.id"
+            >{{ marker.name }}</Checkbox
+          >
+        </CheckboxGroup>
+      </div>
+    </div>
+
+    <div slot="footer">
+      <Button type="text" @click="cancel">取消</Button>
+      <Button type="primary" :disabled="isSubmit" @click="submit">确认</Button>
+    </div>
+  </Modal>
+</template>
+
+<script>
+import { leaderGradingPaper } from "@/api";
+
+export default {
+  name: "modify-leader-grading",
+  props: {
+    LevelInfo: {
+      type: Object,
+      default() {
+        return {
+          curLevel: "",
+          selectLevel: ""
+        };
+      }
+    },
+    markers: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      standardVolume: false,
+      oneClickLevel: false,
+      levelCallback: false,
+      noneedLevelOrReject: false,
+      actionType: null,
+      selectedMarkers: []
+    };
+  },
+  methods: {
+    initData(val) {
+      this.noneedLevelOrReject =
+        this.LevelInfo.curLevel === this.LevelInfo.selectLevel;
+      const user = this.$ls.get("user");
+      this.standardVolume = user.standardVolume;
+      this.levelCallback = user.levelCallback;
+      this.oneClickLevel = user.oneClickLevel;
+    },
+    visibleChange(visible) {
+      if (visible) {
+        this.initData(this.instance);
+      }
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async submit() {
+      if (!this.actionType) {
+        this.$Message.error("请选择操作类型!");
+        return;
+      }
+      if (this.actionType === "reject" && !this.selectedMarkers.length) {
+        this.$Message.error("请指定评卷员!");
+        return;
+      }
+      const datas = {
+        aciton: this.actionType,
+        level: this.LevelInfo.selectLevel
+      };
+      if (this.actionType === "reject")
+        datas.range = this.selectedMarkers.join();
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      let result = true;
+      await leaderGradingPaper(datas).catch(() => {
+        result = false;
+      });
+      this.isSubmit = false;
+
+      if (!result) return;
+
+      this.$Message.success("操作成功!");
+      this.$emit("modified");
+      this.cancel();
+    }
+  }
+};
+</script>

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

@@ -80,16 +80,34 @@ export default {
 
       this.$ls.set("user", data, this.GLOBAL.authTimeout);
       this.$store.commit("setUser", data);
+      // 初次登陆强制修改密码
+      // if (
+      //   data.role !== "ADMIN" &&
+      //   data.role != "INSPECTION" &&
+      //   !data.pwChangedCount
+      // ) {
+      //   this.$refs.ResetPwd.open();
+      //   return;
+      // }
+
       // TODO:根据角色跳转不同的路由
+      if (data.role === "MARKER") {
+        this.$router.push({
+          name: "GradingOperation",
+          params: {
+            workId: data.workId,
+            subjectId: `${data.workId}-${data.subject}`
+          }
+        });
+        return;
+      }
+
       this.$router.push({
         name: "WorkManage"
       });
     },
-    resetSuccess() {
-      this.loginModel = {
-        loginName: "",
-        password: ""
-      };
+    resetSuccess(newpassword) {
+      this.loginModel.password = newpassword;
     }
   }
 };