zhangjie 4 years ago
parent
commit
dd45ffd3a9

+ 10 - 1
src/api.js

@@ -272,7 +272,7 @@ export const paperSelectLevelOrScore = (paperId, result, stage) => {
   // stage => LEVEL or SCORE
   // stage => LEVEL or SCORE
   return $patch(`/api/marktasks/${paperId}`, { stage, result }, "json");
   return $patch(`/api/marktasks/${paperId}`, { stage, result }, "json");
 };
 };
-export const paperPassLevel = paperId => {
+export const paperTaskPass = paperId => {
   return $post(`/api/marktasks/${paperId}/skip`, {});
   return $post(`/api/marktasks/${paperId}/skip`, {});
 };
 };
 // grade or mark history
 // grade or mark history
@@ -331,6 +331,15 @@ export const checkMarkTaskCanSubmit = (subjectId, questionId) => {
 export const markTaskInfo = (subjectId, questionId) => {
 export const markTaskInfo = (subjectId, questionId) => {
   return $get(`/api/marksubjects/${subjectId}/scoreProgress`, { questionId });
   return $get(`/api/marksubjects/${subjectId}/scoreProgress`, { questionId });
 };
 };
+// mark-detail
+export const markerScoreStatData = (userId, questionId) => {
+  return $get(`/api/markers/${userId}/stat/scores`, { questionId });
+};
+// mark-operation
+export const markerStepChangeList = datas => {
+  // ?markerId=49&size=6&page=0&isShift=true&isShiftScore=false&questionId=10
+  return $get(`/api/marktasks/shift`, datas);
+};
 
 
 // inspection -------------------------->
 // inspection -------------------------->
 // inspection-log
 // inspection-log

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

@@ -294,7 +294,7 @@ h3.account-title {
   font-weight: 600;
   font-weight: 600;
   color: #333;
   color: #333;
   position: absolute;
   position: absolute;
-  top: 10px;
+  top: 0;
   left: 16px;
   left: 16px;
   line-height: 30px;
   line-height: 30px;
   z-index: 99;
   z-index: 99;

+ 8 - 1
src/assets/styles/common-component.less

@@ -244,12 +244,19 @@
     height: 20px;
     height: 20px;
     line-height: 20px;
     line-height: 20px;
   }
   }
+  &-body {
+    color: @dark-color-light;
+  }
   &-footer {
   &-footer {
     padding: 10px 0;
     padding: 10px 0;
     font-size: 14px;
     font-size: 14px;
-    a:hover {
+    color: @dark-color-light;
+    a {
       color: @main-color;
       color: @main-color;
     }
     }
+    a:hover {
+      color: @info-color;
+    }
   }
   }
 }
 }
 
 

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

@@ -184,7 +184,8 @@
   text-align: center;
   text-align: center;
   &-act {
   &-act {
     img {
     img {
-      box-shadow: 0px 10px 20px 0px rgba(34, 192, 255, 0.5);
+      // box-shadow: 0px 10px 20px 0px rgba(34, 192, 255, 0.5);
+      box-shadow: 0 0 20px rgba(34, 192, 255, 0.6);
     }
     }
   }
   }
 
 

+ 43 - 14
src/assets/styles/mark.less

@@ -196,29 +196,32 @@
 // grade-step
 // grade-step
 .grade-step {
 .grade-step {
   font-size: 0;
   font-size: 0;
-  margin-bottom: 26px;
+  margin-bottom: 4px;
   &-level {
   &-level {
     white-space: nowrap;
     white-space: nowrap;
     overflow-x: scroll;
     overflow-x: scroll;
     overflow-y: visible;
     overflow-y: visible;
+    padding: 0 0 20px;
   }
   }
   &-other {
   &-other {
     float: right;
     float: right;
+    padding: 0 0 20px 20px;
   }
   }
   .step-item {
   .step-item {
     display: inline-block;
     display: inline-block;
     vertical-align: top;
     vertical-align: top;
     padding: 10px;
     padding: 10px;
     min-width: 90px;
     min-width: 90px;
-    height: 86px;
-    margin-right: 10px;
     background-color: @white;
     background-color: @white;
     border-radius: @box-border-radius-small;
     border-radius: @box-border-radius-small;
     color: @dark-color-light;
     color: @dark-color-light;
     text-align: center;
     text-align: center;
     cursor: pointer;
     cursor: pointer;
+    &:not(:last-child) {
+      margin-right: 10px;
+    }
     &:hover {
     &:hover {
-      box-shadow: 0px 20px 20px 0px rgba(34, 192, 255, 0.3);
+      box-shadow: 0px 10px 15px 0px rgba(34, 192, 255, 0.4);
     }
     }
     p {
     p {
       font-size: 12px;
       font-size: 12px;
@@ -242,23 +245,27 @@
       }
       }
     }
     }
     &.step-other {
     &.step-other {
-      width: 72px;
-      min-width: auto;
-      margin-left: 10px;
-      margin-right: 0;
-      float: right;
+      min-width: 72px;
+      .step-name {
+        font-size: 20px;
+      }
     }
     }
 
 
     &.step-act {
     &.step-act {
       background-color: @info-color;
       background-color: @info-color;
       color: @white;
       color: @white;
-      box-shadow: 0px 20px 20px 0px rgba(34, 192, 255, 0.3);
+      box-shadow: 0px 10px 15px 0px rgba(34, 192, 255, 0.4);
       .step-name {
       .step-name {
         color: @white;
         color: @white;
       }
       }
     }
     }
   }
   }
 }
 }
+.mark-step {
+  .step-item {
+    min-width: 60px;
+  }
+}
 
 
 // grading-detail
 // grading-detail
 .grading-detail {
 .grading-detail {
@@ -315,10 +322,18 @@
       vertical-align: top;
       vertical-align: top;
       width: 100%;
       width: 100%;
       font-size: 14px;
       font-size: 14px;
-      min-height: 500px;
+      min-height: 625px;
+      position: relative;
+      padding-bottom: 60px;
       .image-view-list {
       .image-view-list {
         margin: 0;
         margin: 0;
       }
       }
+      .part-page {
+        position: absolute;
+        bottom: 10px;
+        width: 100%;
+        z-index: auto;
+      }
     }
     }
     &-none {
     &-none {
       padding-top: 200px;
       padding-top: 200px;
@@ -486,7 +501,7 @@
   }
   }
 
 
   .action-paper-info {
   .action-paper-info {
-    font-size: 16px;
+    font-size: 14px;
     line-height: 30px;
     line-height: 30px;
     margin-bottom: 32px;
     margin-bottom: 32px;
     color: @dark-color-light;
     color: @dark-color-light;
@@ -542,10 +557,18 @@
     + .action-mark-info {
     + .action-mark-info {
       margin-top: -10px;
       margin-top: -10px;
     }
     }
+    &-title {
+      color: @dark-color;
+      font-size: 16px;
+      font-weight: 600;
+      line-height: 32px;
+      margin-bottom: 10px;
+      text-align: left;
+    }
 
 
     .grade-info-name {
     .grade-info-name {
       display: inline-block;
       display: inline-block;
-      vertical-align: middle;
+      vertical-align: top;
       height: 67px;
       height: 67px;
       line-height: 69px;
       line-height: 69px;
       font-size: 60px;
       font-size: 60px;
@@ -558,12 +581,18 @@
     }
     }
     .grade-info-range {
     .grade-info-range {
       display: inline-block;
       display: inline-block;
-      vertical-align: middle;
+      vertical-align: top;
       margin-left: 20px;
       margin-left: 20px;
       font-size: 12px;
       font-size: 12px;
       text-align: left;
       text-align: left;
+      p:first-child {
+        line-height: 17px;
+        margin: 12px 0 2px;
+      }
+
       p:last-child {
       p:last-child {
         font-size: 22px;
         font-size: 22px;
+        line-height: 26px;
       }
       }
 
 
       > span {
       > span {

+ 150 - 39
src/components/EchartRender.vue

@@ -22,7 +22,9 @@ export default {
       required: true,
       required: true,
       validator(value) {
       validator(value) {
         return (
         return (
-          ["bar", "pie", "line", "barGroup", "lineGroup"].indexOf(value) !== -1
+          ["bar", "barReverse", "pie", "line", "barGroup", "lineGroup"].indexOf(
+            value
+          ) !== -1
         );
         );
       }
       }
     },
     },
@@ -33,6 +35,19 @@ export default {
     chartTitle: {
     chartTitle: {
       type: String,
       type: String,
       default: ""
       default: ""
+    },
+    chartColor: {
+      type: Array,
+      default() {
+        return [
+          "#22C0FF",
+          "#41CD7D",
+          "#FF7786",
+          "#4E7CFF",
+          "#6d32f9",
+          "#dd7755"
+        ];
+      }
     }
     }
   },
   },
   data() {
   data() {
@@ -147,7 +162,7 @@ export default {
     },
     },
     getPieOption(datas) {
     getPieOption(datas) {
       if (!datas.chartLabels.length) return;
       if (!datas.chartLabels.length) return;
-      var seriesData = datas.chartLabels.map(function(item, index) {
+      const seriesData = datas.chartLabels.map(function(item, index) {
         return {
         return {
           name: item,
           name: item,
           value: datas.chartData[0][index]
           value: datas.chartData[0][index]
@@ -193,9 +208,12 @@ export default {
     getBarOption(datas) {
     getBarOption(datas) {
       if (!datas.names.length) return;
       if (!datas.names.length) return;
       return {
       return {
+        color: this.chartColor,
         grid: {
         grid: {
-          top: "15%",
-          bottom: "18%"
+          top: "20%",
+          bottom: "10%",
+          left: "8%",
+          right: "5%"
         },
         },
         tooltip: {
         tooltip: {
           show: true
           show: true
@@ -203,8 +221,14 @@ export default {
         xAxis: {
         xAxis: {
           type: "category",
           type: "category",
           data: datas.names,
           data: datas.names,
+          axisLine: {
+            lineStyle: {
+              color: "rgba(231,234,241,1)"
+            }
+          },
           axisLabel: {
           axisLabel: {
-            fontSize: 14,
+            color: "#7C86A3",
+            fontSize: 12,
             fontWeight: "bold"
             fontWeight: "bold"
           },
           },
           axisTick: {
           axisTick: {
@@ -216,16 +240,18 @@ export default {
           splitLine: {
           splitLine: {
             show: true,
             show: true,
             lineStyle: {
             lineStyle: {
-              color: "#e0e0e0"
+              color: "rgba(231,234,241,1)"
             }
             }
           },
           },
           axisLine: {
           axisLine: {
             lineStyle: {
             lineStyle: {
-              color: "#333"
+              color: "rgba(231,234,241,1)"
             }
             }
           },
           },
           axisLabel: {
           axisLabel: {
-            fontSize: 14
+            color: "#7C86A3",
+            fontSize: 12,
+            fontWeight: "bold"
           },
           },
           axisTick: {
           axisTick: {
             show: false
             show: false
@@ -233,15 +259,83 @@ export default {
         },
         },
         series: [
         series: [
           {
           {
-            name: "",
+            name: this.chartTitle || "值",
             type: "bar",
             type: "bar",
-            barWidth: 30,
+            barWidth: 16,
             data: datas.dataList,
             data: datas.dataList,
-            label: {
-              show: true,
-              position: "top",
-              color: "#333",
-              fontWeight: 600
+            itemStyle: {
+              barBorderRadius: 4
+            }
+          }
+        ]
+      };
+    },
+    getBarReverseOption(datas) {
+      if (!datas.names.length) return;
+      return {
+        color: this.chartColor,
+        grid: {
+          top: "20%",
+          bottom: "10%",
+          left: "12%",
+          right: "5%"
+        },
+        tooltip: {
+          show: true
+        },
+        yAxis: {
+          type: "category",
+          data: datas.names,
+          axisLine: {
+            lineStyle: {
+              color: "rgba(231,234,241,1)"
+            }
+          },
+          splitLine: {
+            show: true,
+            lineStyle: {
+              color: "rgba(231,234,241,1)"
+            }
+          },
+          axisLabel: {
+            color: "#7C86A3",
+            fontSize: 12,
+            fontWeight: "bold"
+          },
+          axisTick: {
+            show: false
+          }
+        },
+        xAxis: {
+          type: "value",
+          splitLine: {
+            show: false,
+            lineStyle: {
+              color: "rgba(231,234,241,1)"
+            }
+          },
+          axisLine: {
+            lineStyle: {
+              color: "rgba(231,234,241,1)"
+            }
+          },
+          axisLabel: {
+            color: "#7C86A3",
+            fontSize: 12,
+            fontWeight: "bold"
+          },
+          axisTick: {
+            show: false
+          }
+        },
+        series: [
+          {
+            name: this.chartTitle || "值",
+            type: "bar",
+            barWidth: 16,
+            data: datas.dataList,
+            itemStyle: {
+              barBorderRadius: 4
             }
             }
           }
           }
         ]
         ]
@@ -249,21 +343,23 @@ export default {
     },
     },
     getBarGroupOption(datas) {
     getBarGroupOption(datas) {
       if (!datas.names.length) return;
       if (!datas.names.length) return;
-      var onePageMaxBarNum = 20;
-      var barNum = datas.names.length * datas.dataList.length;
-      var xAxis = datas.dataList.map(function(item) {
+      const onePageMaxBarNum = 20;
+      const barNum = datas.names.length * datas.dataList.length;
+      const xAxis = datas.dataList.map(function(item) {
         return item.name;
         return item.name;
       });
       });
-      var series = datas.names.map(function(name, index) {
-        var data = datas.dataList.map(function(item) {
+      const series = datas.names.map(function(name, index) {
+        const data = datas.dataList.map(function(item) {
           return item.data[index];
           return item.data[index];
         });
         });
         return {
         return {
           name: name,
           name: name,
           type: "bar",
           type: "bar",
           data: data,
           data: data,
-          barMaxWidth: 30,
-          barMinHeight: 2
+          barMaxWidth: 8,
+          itemStyle: {
+            barBorderRadius: 2
+          }
           // label: {
           // label: {
           //   show: true,
           //   show: true,
           //   position: "top",
           //   position: "top",
@@ -276,10 +372,13 @@ export default {
         };
         };
       });
       });
 
 
-      var options = {
+      const options = {
+        color: this.chartColor,
         grid: {
         grid: {
-          top: "15%",
-          bottom: "10%"
+          top: "20%",
+          bottom: "10%",
+          left: "8%",
+          right: "5%"
         },
         },
         tooltip: {
         tooltip: {
           show: true,
           show: true,
@@ -288,8 +387,8 @@ export default {
             type: "shadow"
             type: "shadow"
           },
           },
           formatter: function(params) {
           formatter: function(params) {
-            var label = params[0].axisValueLabel;
-            var infos = params.map(function(item) {
+            const label = params[0].axisValueLabel;
+            let infos = params.map(function(item) {
               return item.seriesName + ":" + item.value.toFixed(2) + "%";
               return item.seriesName + ":" + item.value.toFixed(2) + "%";
             });
             });
             infos.unshift(label);
             infos.unshift(label);
@@ -308,7 +407,8 @@ export default {
           type: "category",
           type: "category",
           data: xAxis,
           data: xAxis,
           axisLabel: {
           axisLabel: {
-            fontSize: 14,
+            color: "#7C86A3",
+            fontSize: 12,
             fontWeight: "bold"
             fontWeight: "bold"
           },
           },
           axisTick: {
           axisTick: {
@@ -318,10 +418,20 @@ export default {
         yAxis: {
         yAxis: {
           type: "value",
           type: "value",
           splitLine: {
           splitLine: {
-            show: false
+            show: true,
+            lineStyle: {
+              color: "rgba(231,234,241,1)"
+            }
+          },
+          axisLine: {
+            lineStyle: {
+              color: "rgba(231,234,241,1)"
+            }
           },
           },
           axisLabel: {
           axisLabel: {
-            fontSize: 14,
+            color: "#7C86A3",
+            fontSize: 12,
+            fontWeight: "bold",
             formatter: function(value, index) {
             formatter: function(value, index) {
               return value + "%";
               return value + "%";
             }
             }
@@ -334,8 +444,8 @@ export default {
       };
       };
 
 
       if (barNum > onePageMaxBarNum) {
       if (barNum > onePageMaxBarNum) {
-        var zoomInitRange = Math.floor((onePageMaxBarNum * 100) / barNum);
-        options.grid.bottom = "16%";
+        const zoomInitRange = Math.floor((onePageMaxBarNum * 100) / barNum);
+        options.grid.bottom = "18%";
         options.dataZoom = [
         options.dataZoom = [
           {
           {
             type: "inside",
             type: "inside",
@@ -345,7 +455,8 @@ export default {
           {
           {
             type: "slider",
             type: "slider",
             start: 0,
             start: 0,
-            end: zoomInitRange
+            end: zoomInitRange,
+            bottom: "0%"
           }
           }
         ];
         ];
       }
       }
@@ -354,14 +465,14 @@ export default {
     },
     },
     getLineGroupOption(datas) {
     getLineGroupOption(datas) {
       if (!datas.length) return;
       if (!datas.length) return;
-      var names = datas.map(function(item) {
+      const names = datas.map(function(item) {
         return item.name;
         return item.name;
       });
       });
-      var xaxis = datas[0].dataList.map(function(item, index) {
+      const xaxis = datas[0].dataList.map(function(item, index) {
         return index;
         return index;
       });
       });
 
 
-      var series = datas.map(function(item) {
+      const series = datas.map(function(item) {
         return {
         return {
           name: item.name,
           name: item.name,
           type: "line",
           type: "line",
@@ -389,8 +500,8 @@ export default {
             type: "shadow"
             type: "shadow"
           },
           },
           formatter: function(params) {
           formatter: function(params) {
-            var label = params[0].axisValueLabel;
-            var infos = params.map(function(item) {
+            const label = params[0].axisValueLabel;
+            let infos = params.map(function(item) {
               return item.seriesName + ":" + Math.sqrt(item.value);
               return item.seriesName + ":" + Math.sqrt(item.value);
             });
             });
             infos.unshift(label);
             infos.unshift(label);
@@ -425,7 +536,7 @@ export default {
           axisLabel: {
           axisLabel: {
             fontSize: 14,
             fontSize: 14,
             formatter: function(value) {
             formatter: function(value) {
-              var num = Math.sqrt(value);
+              const num = Math.sqrt(value);
               return num % 1 ? "" : parseInt(num);
               return num % 1 ? "" : parseInt(num);
             }
             }
           },
           },

+ 1 - 1
src/components/common/ImportFile/ImportFile.vue

@@ -43,7 +43,7 @@
         </p>
         </p>
       </div>
       </div>
       <div :class="[`${prefixCls}-footer`]" v-if="downloadUrl">
       <div :class="[`${prefixCls}-footer`]" v-if="downloadUrl">
-        文件下载:
+        模板下载:
         <a :href="downloadUrl" :download="dfilename">{{ dfilename }}</a>
         <a :href="downloadUrl" :download="dfilename">{{ dfilename }}</a>
       </div>
       </div>
     </Modal>
     </Modal>

+ 2 - 1
src/modules/grading/Grading.vue

@@ -65,6 +65,7 @@ import { subjectDetail, gradingProgressDetail } from "@/api";
 import { grading, main } from "@/constants/authority";
 import { grading, main } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 import menuMixins from "@/components/homeMenuMixins";
 import { SUBJECT_STAGE } from "@/constants/enumerate";
 import { SUBJECT_STAGE } from "@/constants/enumerate";
+import { deepCopy } from "@/plugins/utils";
 
 
 export default {
 export default {
   name: "grading",
   name: "grading",
@@ -117,7 +118,7 @@ export default {
       this.stepProgress = data.totalProgress.progress.toFixed(2) + "%";
       this.stepProgress = data.totalProgress.progress.toFixed(2) + "%";
     },
     },
     buildNavs() {
     buildNavs() {
-      this.navs = [...grading];
+      this.navs = deepCopy(grading);
       if (this.IS_ADMIN) {
       if (this.IS_ADMIN) {
         this.navs.pop();
         this.navs.pop();
         this.navs = [...main.slice(0, 2), ...this.navs];
         this.navs = [...main.slice(0, 2), ...this.navs];

+ 11 - 6
src/modules/grading/GradingDetail.vue

@@ -127,7 +127,7 @@
       @on-paper-change="selectPaper"
       @on-paper-change="selectPaper"
       @on-page-prev="prevPage"
       @on-page-prev="prevPage"
       @on-page-next="nextPage"
       @on-page-next="nextPage"
-      @on-close="imagePreviewClose"
+      @on-close="isFullscreenMarking = false"
       header-hide
       header-hide
       ref="ImagePreview"
       ref="ImagePreview"
       v-if="papers.length"
       v-if="papers.length"
@@ -138,7 +138,7 @@
       :image-list="carouselPapers"
       :image-list="carouselPapers"
       :init-index="curCarouselPaperIndex"
       :init-index="curCarouselPaperIndex"
       @on-paper-change="selectCarouselPaper"
       @on-paper-change="selectCarouselPaper"
-      @on-close="imagePreviewClose"
+      @on-close="carouseImagePreviewClose"
       loop
       loop
       header-hide
       header-hide
       ref="CarouselPapersPreview"
       ref="CarouselPapersPreview"
@@ -227,6 +227,7 @@ export default {
       // carousel paper review,
       // carousel paper review,
       carouselPapers: [],
       carouselPapers: [],
       curCarouselPaperIndex: 0,
       curCarouselPaperIndex: 0,
+      beforeCarouselCurPaperIndex: 0,
       isFullscreenMarking: false
       isFullscreenMarking: false
     };
     };
   },
   },
@@ -274,6 +275,7 @@ export default {
         return paper;
         return paper;
       });
       });
       this.total = data.totalCount;
       this.total = data.totalCount;
+      this.totalPage = data.pageCount;
     },
     },
     toPage(page) {
     toPage(page) {
       this.current = page;
       this.current = page;
@@ -360,9 +362,6 @@ export default {
       this.selectPaper(index);
       this.selectPaper(index);
       this.$refs.ImagePreview.open();
       this.$refs.ImagePreview.open();
     },
     },
-    imagePreviewClose() {
-      this.isFullscreenMarking = false;
-    },
     async prevPage() {
     async prevPage() {
       if (this.current === 1) {
       if (this.current === 1) {
         this.$Message.warning("当前已经是第一条数据了");
         this.$Message.warning("当前已经是第一条数据了");
@@ -427,8 +426,10 @@ export default {
     // paper carousel
     // paper carousel
     toViewCarouselPaper(paperIndex, papers) {
     toViewCarouselPaper(paperIndex, papers) {
       this.isFullscreenMarking = true;
       this.isFullscreenMarking = true;
-      this.curCarouselPaperIndex = paperIndex;
+      this.beforeCarouselCurPaperIndex = this.curPaperIndex;
+      this.curPaperIndex = null;
       this.carouselPapers = papers;
       this.carouselPapers = papers;
+      this.selectCarouselPaper(paperIndex);
       this.$nextTick(() => {
       this.$nextTick(() => {
         this.$refs.CarouselPapersPreview.open();
         this.$refs.CarouselPapersPreview.open();
       });
       });
@@ -436,6 +437,10 @@ export default {
     selectCarouselPaper(index) {
     selectCarouselPaper(index) {
       this.curCarouselPaperIndex = index;
       this.curCarouselPaperIndex = index;
       this.curPaper = { ...this.carouselPapers[index] };
       this.curPaper = { ...this.carouselPapers[index] };
+    },
+    carouseImagePreviewClose() {
+      this.isFullscreenMarking = false;
+      this.selectPaper(this.beforeCarouselCurPaperIndex);
     }
     }
   }
   }
 };
 };

+ 14 - 10
src/modules/grading/GradingOperation.vue

@@ -125,7 +125,7 @@
       @on-paper-change="selectPaper"
       @on-paper-change="selectPaper"
       @on-page-prev="prevPage"
       @on-page-prev="prevPage"
       @on-page-next="nextPage"
       @on-page-next="nextPage"
-      @on-close="imagePreviewClose"
+      @on-close="isFullscreenMarking = false"
       header-hide
       header-hide
       ref="ImagePreview"
       ref="ImagePreview"
       v-if="papers.length"
       v-if="papers.length"
@@ -137,7 +137,7 @@
       :image-list="carouselPapers"
       :image-list="carouselPapers"
       :init-index="curCarouselPaperIndex"
       :init-index="curCarouselPaperIndex"
       @on-paper-change="selectCarouselPaper"
       @on-paper-change="selectCarouselPaper"
-      @on-close="imagePreviewClose"
+      @on-close="carouseImagePreviewClose"
       loop
       loop
       header-hide
       header-hide
       ref="CarouselPapersPreview"
       ref="CarouselPapersPreview"
@@ -154,7 +154,7 @@ import {
   workLevelList,
   workLevelList,
   subjectDetail,
   subjectDetail,
   paperSelectLevelOrScore,
   paperSelectLevelOrScore,
-  paperPassLevel
+  paperTaskPass
 } from "@/api";
 } from "@/api";
 import ImagePreview from "@/components/common/ImagePreview";
 import ImagePreview from "@/components/common/ImagePreview";
 import GradeStep from "./components/GradeStep";
 import GradeStep from "./components/GradeStep";
@@ -216,6 +216,7 @@ export default {
       // carousel paper review,
       // carousel paper review,
       carouselPapers: [],
       carouselPapers: [],
       curCarouselPaperIndex: 0,
       curCarouselPaperIndex: 0,
+      beforeCarouselCurPaperIndex: 0,
       isFullscreenMarking: false
       isFullscreenMarking: false
     };
     };
   },
   },
@@ -262,7 +263,7 @@ export default {
         return paper;
         return paper;
       });
       });
       this.total = data.totalCount;
       this.total = data.totalCount;
-      this.totalPage = data.totalPage;
+      this.totalPage = data.pageCount;
     },
     },
     toPage(page) {
     toPage(page) {
       this.current = page;
       this.current = page;
@@ -361,9 +362,6 @@ export default {
       this.selectPaper(index);
       this.selectPaper(index);
       this.$refs.ImagePreview.open();
       this.$refs.ImagePreview.open();
     },
     },
-    imagePreviewClose() {
-      this.isFullscreenMarking = false;
-    },
     async prevPage() {
     async prevPage() {
       if (this.current === 1) {
       if (this.current === 1) {
         this.$Message.warning("当前已经是第一条数据了");
         this.$Message.warning("当前已经是第一条数据了");
@@ -402,8 +400,8 @@ export default {
       const index = this.papers.findIndex(item => item.id === data.id);
       const index = this.papers.findIndex(item => item.id === data.id);
       this.papers[index] = Object.assign(this.papers[index], data);
       this.papers[index] = Object.assign(this.papers[index], data);
     },
     },
-    async passCurPaper(level) {
-      await paperPassLevel(this.curPaper.id);
+    async passCurPaper() {
+      await paperTaskPass(this.curPaper.id);
       this.toNext();
       this.toNext();
     },
     },
     toNext() {
     toNext() {
@@ -415,8 +413,10 @@ export default {
     // paper carousel
     // paper carousel
     toViewCarouselPaper(paperIndex, papers) {
     toViewCarouselPaper(paperIndex, papers) {
       this.isFullscreenMarking = true;
       this.isFullscreenMarking = true;
-      this.curCarouselPaperIndex = paperIndex;
+      this.beforeCarouselCurPaperIndex = this.curPaperIndex;
+      this.curPaperIndex = null;
       this.carouselPapers = papers;
       this.carouselPapers = papers;
+      this.selectCarouselPaper(paperIndex);
       this.$nextTick(() => {
       this.$nextTick(() => {
         this.$refs.CarouselPapersPreview.open();
         this.$refs.CarouselPapersPreview.open();
       });
       });
@@ -424,6 +424,10 @@ export default {
     selectCarouselPaper(index) {
     selectCarouselPaper(index) {
       this.curCarouselPaperIndex = index;
       this.curCarouselPaperIndex = index;
       this.curPaper = { ...this.carouselPapers[index] };
       this.curPaper = { ...this.carouselPapers[index] };
+    },
+    carouseImagePreviewClose() {
+      this.isFullscreenMarking = false;
+      this.selectPaper(this.beforeCarouselCurPaperIndex);
     }
     }
   }
   }
 };
 };

+ 4 - 2
src/modules/grading/GradingProgress.vue

@@ -137,7 +137,8 @@ export default {
       return (
       return (
         (this.curSubject.stage == "INIT" &&
         (this.curSubject.stage == "INIT" &&
           this.curSubject.test !== 2 &&
           this.curSubject.test !== 2 &&
-          !this.curSubject.formal) ||
+          !this.curSubject.formal &&
+          this.totalProgress.progress === 100) ||
         (this.curSubject.stage == "LEVEL" &&
         (this.curSubject.stage == "LEVEL" &&
           this.totalProgress.progress !== 100 &&
           this.totalProgress.progress !== 100 &&
           this.curSubject.test === 0 &&
           this.curSubject.test === 0 &&
@@ -148,7 +149,8 @@ export default {
       return (
       return (
         (this.curSubject.stage == "INIT" &&
         (this.curSubject.stage == "INIT" &&
           this.curSubject.test !== 2 &&
           this.curSubject.test !== 2 &&
-          !this.curSubject.formal) ||
+          !this.curSubject.formal &&
+          this.totalProgress.progress === 100) ||
         (this.curSubject.stage == "LEVEL" && this.curSubject.test === 2)
         (this.curSubject.stage == "LEVEL" && this.curSubject.test === 2)
       );
       );
     },
     },

+ 14 - 6
src/modules/grading/components/GradeAction.vue

@@ -41,8 +41,8 @@
     </div>
     </div>
     <!-- 档位信息 -->
     <!-- 档位信息 -->
     <!-- 已评(已评档位),打回(建议档位) -->
     <!-- 已评(已评档位),打回(建议档位) -->
+    <h3 class="action-grade-info-title" v-if="curPaper.rejected">建议档位:</h3>
     <div class="action-grade-info" v-if="rights.gradeInfo">
     <div class="action-grade-info" v-if="rights.gradeInfo">
-      <p v-if="curPaper.rejected">建议档位</p>
       <h3 class="grade-info-name">{{ curLevel.name }}</h3>
       <h3 class="grade-info-name">{{ curLevel.name }}</h3>
       <div class="grade-info-range">
       <div class="grade-info-range">
         <p>分数范围</p>
         <p>分数范围</p>
@@ -67,7 +67,7 @@
       </div>
       </div>
     </div>
     </div>
     <div class="action-grade-pass" v-if="rights.gradeList && IS_MARKER">
     <div class="action-grade-pass" v-if="rights.gradeList && IS_MARKER">
-      <Button type="primary" @click="toPass">跳过</Button>
+      <Button @click="toPass">跳过</Button>
     </div>
     </div>
 
 
     <!-- 评卷记录 -->
     <!-- 评卷记录 -->
@@ -76,8 +76,8 @@
       <div class="grade-history-list">
       <div class="grade-history-list">
         <div
         <div
           class="grade-history-item"
           class="grade-history-item"
-          v-for="(his, hindex) in gradingHistory"
-          :key="hindex"
+          v-for="his in gradingHistory"
+          :key="his.id"
         >
         >
           <p>{{ his.name }}</p>
           <p>{{ his.name }}</p>
           <p>{{ his.value }}</p>
           <p>{{ his.value }}</p>
@@ -184,10 +184,12 @@ export default {
       roleRight: {
       roleRight: {
         ADMIN: {
         ADMIN: {
           done: ["search", "gradeHis", "gradeInfo"],
           done: ["search", "gradeHis", "gradeInfo"],
+          reject: ["search", "gradeInfo", "gradeHis"],
           arbitrate: ["search", "gradeHis"]
           arbitrate: ["search", "gradeHis"]
         },
         },
         MARK_LEADER: {
         MARK_LEADER: {
           done: ["search", "gradeList", "gradeHis", "gradeInfo"],
           done: ["search", "gradeList", "gradeHis", "gradeInfo"],
+          reject: ["search", "gradeList", "gradeInfo", "gradeHis"],
           arbitrate: ["search", "gradeList", "gradeHis"]
           arbitrate: ["search", "gradeList", "gradeHis"]
         },
         },
         MARKER: {
         MARKER: {
@@ -274,7 +276,8 @@ export default {
       const data = await markHistoryList(this.curPaper.id, "LEVEL");
       const data = await markHistoryList(this.curPaper.id, "LEVEL");
       this.gradingHistory = data.map(item => {
       this.gradingHistory = data.map(item => {
         return {
         return {
-          id: item.markerId,
+          id: item.id,
+          markerId: item.markerId,
           name: item.marker,
           name: item.marker,
           value: item.result || "未评"
           value: item.result || "未评"
         };
         };
@@ -289,7 +292,12 @@ export default {
             curLevel: this.curPaper.level,
             curLevel: this.curPaper.level,
             selectedLevel: level.name
             selectedLevel: level.name
           },
           },
-          this.gradingHistory
+          this.gradingHistory.map(item => {
+            return {
+              id: item.markerId,
+              name: item.name
+            };
+          })
         );
         );
         return;
         return;
       }
       }

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

@@ -1,6 +1,9 @@
 <template>
 <template>
   <div class="grade-step">
   <div class="grade-step">
-    <div class="grade-step-other">
+    <div
+      class="grade-step-other"
+      v-if="steps.otherStep && steps.otherStep.length"
+    >
       <div
       <div
         v-for="(step, sindex) in steps.otherStep"
         v-for="(step, sindex) in steps.otherStep"
         :key="sindex"
         :key="sindex"
@@ -18,7 +21,7 @@
         <p>{{ step.count }}</p>
         <p>{{ step.count }}</p>
       </div>
       </div>
     </div>
     </div>
-    <div class="grade-step-level" :style="levelStepStyles">
+    <div class="grade-step-level">
       <div
       <div
         class="step-item"
         class="step-item"
         v-if="showAnalysis"
         v-if="showAnalysis"
@@ -81,15 +84,6 @@ export default {
       curStep: {}
       curStep: {}
     };
     };
   },
   },
-  computed: {
-    levelStepStyles() {
-      return {
-        marginRight: this.steps.otherStep.length
-          ? this.steps.otherStep.length * 82 + 20 + "px"
-          : "0"
-      };
-    }
-  },
   mounted() {
   mounted() {
     this.selectStep(this.initStep);
     this.selectStep(this.initStep);
   },
   },

+ 2 - 2
src/modules/grading/components/ModifyLeaderGrading.vue

@@ -29,8 +29,8 @@
       <div class="leader-markers" v-if="actionType === 'reject'">
       <div class="leader-markers" v-if="actionType === 'reject'">
         <CheckboxGroup v-model="selectedMarkers">
         <CheckboxGroup v-model="selectedMarkers">
           <Checkbox
           <Checkbox
-            v-for="(marker, index) in markers"
-            :key="index"
+            v-for="marker in markers"
+            :key="marker.id"
             :label="marker.id"
             :label="marker.id"
             >{{ marker.name }}</Checkbox
             >{{ marker.name }}</Checkbox
           >
           >

+ 1 - 1
src/modules/grading/components/ModifyUnformalGradingTask.vue

@@ -70,7 +70,7 @@ export default {
       isSubmit: false,
       isSubmit: false,
       uploadData: {},
       uploadData: {},
       uploadBtnName: "导入考生数据",
       uploadBtnName: "导入考生数据",
-      uploadUrl: this.GLOBAL.domain + "/import/students/batchAllForTrial"
+      uploadUrl: this.GLOBAL.domain + "/api/import/students/batchAllForTrial"
     };
     };
   },
   },
   created() {
   created() {

+ 112 - 31
src/modules/main/QualityAnalysis.vue

@@ -4,7 +4,11 @@
       <div class="part-box-head-left">
       <div class="part-box-head-left">
         <Form label-position="left" inline>
         <Form label-position="left" inline>
           <FormItem>
           <FormItem>
-            <Select v-model="filter.subject" placeholder="选择科目">
+            <Select
+              v-model="filter.subject"
+              @on-change="subjectChange"
+              placeholder="科目"
+            >
               <Option
               <Option
                 v-for="(item, index) in subjects"
                 v-for="(item, index) in subjects"
                 :key="index"
                 :key="index"
@@ -13,11 +17,22 @@
               ></Option>
               ></Option>
             </Select>
             </Select>
           </FormItem>
           </FormItem>
+          <FormItem>
+            <Select v-model="filter.areaCode" placeholder="考区">
+              <Option
+                v-for="area in areas"
+                :key="area.id"
+                :value="area.areaCode"
+                :label="area.areaName"
+              ></Option>
+            </Select>
+          </FormItem>
           <FormItem>
           <FormItem>
             <DatePicker
             <DatePicker
               v-model="searchTime"
               v-model="searchTime"
               type="datetimerange"
               type="datetimerange"
-              placeholder="请选择查询时间段"
+              @on-change="searchTimeChange"
+              placeholder="查询时间段"
               style="width: 400px"
               style="width: 400px"
               transfer
               transfer
             ></DatePicker>
             ></DatePicker>
@@ -27,6 +42,7 @@
               class="btn-form-search"
               class="btn-form-search"
               size="small"
               size="small"
               type="primary"
               type="primary"
+              :disabled="!filter.subject || !filter.areaCode"
               @click="toSearch"
               @click="toSearch"
               >查询</Button
               >查询</Button
             >
             >
@@ -42,12 +58,52 @@
           >导出表格</Button
           >导出表格</Button
         >
         >
       </div>
       </div>
-
-      <div class="analysis-part" v-if="levelsPropReportOption">
-        <!-- TODO: -->
-        <v-chart :options="levelsPropReportOption" autoresize></v-chart>
-      </div>
     </div>
     </div>
+
+    <Row :gutter="20">
+      <Col span="12">
+        <div class="part-box" v-if="levelsPropReportData">
+          <echart-render
+            chart-title="档位分布图"
+            :chart-data="levelsPropReportData"
+            chart-type="barGroup"
+          ></echart-render>
+        </div>
+      </Col>
+      <Col span="12">
+        <div class="part-box" v-if="absReportData">
+          <echart-render
+            chart-title="累计偏差"
+            :chart-data="absReportData"
+            :chart-color="['#FF7786']"
+            chart-type="barReverse"
+          ></echart-render>
+        </div>
+      </Col>
+    </Row>
+
+    <Row :gutter="20">
+      <Col span="12">
+        <div class="part-box" v-if="distanceReportData">
+          <echart-render
+            chart-title="累计误差"
+            :chart-data="distanceReportData"
+            :chart-color="['#22C0FF']"
+            chart-type="bar"
+          ></echart-render>
+        </div>
+      </Col>
+      <Col span="12">
+        <div class="part-box" v-if="callbackReportData">
+          <echart-render
+            chart-title="打回次数"
+            :chart-data="callbackReportData"
+            :chart-color="['#41CD7D']"
+            chart-type="bar"
+          ></echart-render>
+        </div>
+      </Col>
+    </Row>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -56,23 +112,31 @@ import {
   levelsPropReport,
   levelsPropReport,
   distanceReport,
   distanceReport,
   callbackReport,
   callbackReport,
-  subjectList
+  subjectList,
+  areaList
 } from "@/api";
 } from "@/api";
-import chartOption from "@/constants/chartOptions";
+import EchartRender from "@/components/EchartRender";
+import { filterObjNull } from "@/plugins/utils";
 
 
 export default {
 export default {
   name: "quality-analysis",
   name: "quality-analysis",
+  components: { EchartRender },
   data() {
   data() {
     return {
     return {
       filter: {
       filter: {
         workId: this.$route.params.workId,
         workId: this.$route.params.workId,
-        subject: ""
+        subject: "",
+        areaCode: "",
+        startTime: null,
+        endTime: null
       },
       },
       searchTime: [],
       searchTime: [],
-      levelsPropReportOption: null,
-      distanceReportOption: null,
-      callbackReportOption: null,
-      subjects: []
+      levelsPropReportData: null,
+      distanceReportData: null,
+      absReportData: null,
+      callbackReportData: null,
+      subjects: [],
+      areas: []
     };
     };
   },
   },
   mounted() {
   mounted() {
@@ -82,6 +146,23 @@ export default {
     async getSubjects() {
     async getSubjects() {
       this.subjects = await subjectList(this.filter.workId);
       this.subjects = await subjectList(this.filter.workId);
     },
     },
+    async getAreaList() {
+      const data = await areaList({
+        workId: this.filter.workId,
+        subject: this.filter.subject
+      });
+      this.areas = data.map(item => {
+        return {
+          id: item.id,
+          areaName: item.areaName,
+          areaCode: item.areaCode
+        };
+      });
+    },
+    subjectChange() {
+      this.filter.areaCode = "";
+      this.getAreaList();
+    },
     parseGroupBarData(datas) {
     parseGroupBarData(datas) {
       if (!datas.length) {
       if (!datas.length) {
         return { names: [], dataList: [] };
         return { names: [], dataList: [] };
@@ -115,11 +196,9 @@ export default {
       };
       };
     },
     },
     async toSearch() {
     async toSearch() {
-      const datas = {
-        ...this.filter,
-        startTime: this.searchTime[0],
-        endTime: this.searchTime[1]
-      };
+      const datas = filterObjNull({
+        ...this.filter
+      });
       const requests = [
       const requests = [
         levelsPropReport(datas),
         levelsPropReport(datas),
         distanceReport(datas),
         distanceReport(datas),
@@ -127,18 +206,20 @@ export default {
       ];
       ];
       const data = await Promise.all(requests);
       const data = await Promise.all(requests);
 
 
-      this.levelsPropReportOption = chartOption.getBarGroupOption(
-        this.parseGroupBarData(data[0]),
-        "档位分布图"
-      );
-      this.distanceReportOption = chartOption.getBarOption(
-        this.parseBarData(data[1]),
-        "差值和"
-      );
-      this.callbackReportOption = chartOption.getBarOption(
-        this.parseBarData(data[2]),
-        "打回次数"
-      );
+      this.levelsPropReportData = this.parseGroupBarData(data[0]);
+
+      this.distanceReportData = this.parseBarData(data[1]);
+      // TODO:
+      this.absReportData = {
+        names: ["zj-pj-01", "zj-pj-02", "zj-pj-03", "zj-pj-04"],
+        dataList: [-2, 5, -4, 3]
+      };
+
+      this.callbackReportData = this.parseBarData(data[2]);
+    },
+    searchTimeChange(val) {
+      this.filter.startTime = val[0] || null;
+      this.filter.endTime = val[1] || null;
     },
     },
     toExport() {}
     toExport() {}
   }
   }

+ 11 - 6
src/modules/mark/MarkDetail.vue

@@ -110,7 +110,7 @@
       @on-paper-change="selectPaper"
       @on-paper-change="selectPaper"
       @on-page-prev="prevPage"
       @on-page-prev="prevPage"
       @on-page-next="nextPage"
       @on-page-next="nextPage"
-      @on-close="imagePreviewClose"
+      @on-close="isFullscreenMarking = false"
       header-hide
       header-hide
       ref="ImagePreview"
       ref="ImagePreview"
       v-if="papers.length"
       v-if="papers.length"
@@ -121,7 +121,7 @@
       :image-list="carouselPapers"
       :image-list="carouselPapers"
       :init-index="curCarouselPaperIndex"
       :init-index="curCarouselPaperIndex"
       @on-paper-change="selectCarouselPaper"
       @on-paper-change="selectCarouselPaper"
-      @on-close="imagePreviewClose"
+      @on-close="carouseImagePreviewClose"
       loop
       loop
       header-hide
       header-hide
       ref="CarouselPapersPreview"
       ref="CarouselPapersPreview"
@@ -188,6 +188,7 @@ export default {
       // carousel paper review,
       // carousel paper review,
       carouselPapers: [],
       carouselPapers: [],
       curCarouselPaperIndex: 0,
       curCarouselPaperIndex: 0,
+      beforeCarouselCurPaperIndex: 0,
       isFullscreenMarking: false
       isFullscreenMarking: false
     };
     };
   },
   },
@@ -261,6 +262,7 @@ export default {
         return paper;
         return paper;
       });
       });
       this.total = data.totalCount;
       this.total = data.totalCount;
+      this.totalPage = data.pageCount;
     },
     },
     toPage(page) {
     toPage(page) {
       this.current = page;
       this.current = page;
@@ -336,9 +338,6 @@ export default {
       this.selectPaper(index);
       this.selectPaper(index);
       this.$refs.ImagePreview.open();
       this.$refs.ImagePreview.open();
     },
     },
-    imagePreviewClose() {
-      this.isFullscreenMarking = false;
-    },
     async prevPage() {
     async prevPage() {
       if (this.current === 1) {
       if (this.current === 1) {
         this.$Message.warning("当前已经是第一条数据了");
         this.$Message.warning("当前已经是第一条数据了");
@@ -407,8 +406,10 @@ export default {
     // paper carousel
     // paper carousel
     toViewCarouselPaper(paperIndex, papers) {
     toViewCarouselPaper(paperIndex, papers) {
       this.isFullscreenMarking = true;
       this.isFullscreenMarking = true;
-      this.curCarouselPaperIndex = paperIndex;
+      this.beforeCarouselCurPaperIndex = this.curPaperIndex;
+      this.curPaperIndex = null;
       this.carouselPapers = papers;
       this.carouselPapers = papers;
+      this.selectCarouselPaper(paperIndex);
       this.$nextTick(() => {
       this.$nextTick(() => {
         this.$refs.CarouselPapersPreview.open();
         this.$refs.CarouselPapersPreview.open();
       });
       });
@@ -416,6 +417,10 @@ export default {
     selectCarouselPaper(index) {
     selectCarouselPaper(index) {
       this.curCarouselPaperIndex = index;
       this.curCarouselPaperIndex = index;
       this.curPaper = { ...this.carouselPapers[index] };
       this.curPaper = { ...this.carouselPapers[index] };
+    },
+    carouseImagePreviewClose() {
+      this.isFullscreenMarking = false;
+      this.selectPaper(this.beforeCarouselCurPaperIndex);
     }
     }
   }
   }
 };
 };

+ 2 - 1
src/modules/mark/MarkHome.vue

@@ -64,6 +64,7 @@ import { subjectDetail } from "@/api";
 import { mark, main } from "@/constants/authority";
 import { mark, main } from "@/constants/authority";
 import menuMixins from "@/components/homeMenuMixins";
 import menuMixins from "@/components/homeMenuMixins";
 import { SUBJECT_STAGE } from "@/constants/enumerate";
 import { SUBJECT_STAGE } from "@/constants/enumerate";
+import { deepCopy } from "@/plugins/utils";
 
 
 export default {
 export default {
   name: "mark-home",
   name: "mark-home",
@@ -97,7 +98,7 @@ export default {
       this.actSubNav();
       this.actSubNav();
     },
     },
     buildNavs() {
     buildNavs() {
-      this.navs = [...mark];
+      this.navs = deepCopy(mark);
       if (this.IS_ADMIN) {
       if (this.IS_ADMIN) {
         this.navs.pop();
         this.navs.pop();
         this.navs = [...main.slice(0, 2), ...this.navs];
         this.navs = [...main.slice(0, 2), ...this.navs];

+ 51 - 24
src/modules/mark/MarkOperation.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-  <div class="mark-operation home">
+  <div class="mark-operation grading-operation home">
     <view-header> </view-header>
     <view-header> </view-header>
     <div class="home-body">
     <div class="home-body">
       <div class="home-main grading-detail">
       <div class="home-main grading-detail">
@@ -30,14 +30,14 @@
             </FormItem>
             </FormItem>
           </Form>
           </Form>
         </div>
         </div>
-        <grade-step
+        <mark-step
           :steps="steps"
           :steps="steps"
           :init-step="curStep"
           :init-step="curStep"
           :show-analysis="false"
           :show-analysis="false"
           @on-change="stepChange"
           @on-change="stepChange"
-          ref="GradeStep"
+          ref="MarkStep"
           v-if="steps.levelStep"
           v-if="steps.levelStep"
-        ></grade-step>
+        ></mark-step>
         <div class="detail-body clear-float">
         <div class="detail-body clear-float">
           <!-- detail-aciton -->
           <!-- detail-aciton -->
           <div
           <div
@@ -112,13 +112,13 @@
 
 
     <!-- image-preview -->
     <!-- image-preview -->
     <image-preview
     <image-preview
-      class="grading-detail-image-preview"
+      class="grading-operation-image-preview"
       :image-list="papers"
       :image-list="papers"
       :init-index="curPaperIndex"
       :init-index="curPaperIndex"
       @on-paper-change="selectPaper"
       @on-paper-change="selectPaper"
       @on-page-prev="prevPage"
       @on-page-prev="prevPage"
       @on-page-next="nextPage"
       @on-page-next="nextPage"
-      @on-close="imagePreviewClose"
+      @on-close="isFullscreenMarking = false"
       header-hide
       header-hide
       ref="ImagePreview"
       ref="ImagePreview"
       v-if="papers.length"
       v-if="papers.length"
@@ -126,11 +126,11 @@
 
 
     <!-- carousel paper review -->
     <!-- carousel paper review -->
     <image-preview
     <image-preview
-      class="grading-detail-image-preview"
+      class="grading-operation-image-preview"
       :image-list="carouselPapers"
       :image-list="carouselPapers"
       :init-index="curCarouselPaperIndex"
       :init-index="curCarouselPaperIndex"
       @on-paper-change="selectCarouselPaper"
       @on-paper-change="selectCarouselPaper"
-      @on-close="imagePreviewClose"
+      @on-close="carouseImagePreviewClose"
       loop
       loop
       header-hide
       header-hide
       ref="CarouselPapersPreview"
       ref="CarouselPapersPreview"
@@ -142,15 +142,16 @@
 <script>
 <script>
 import {
 import {
   markerPaperList,
   markerPaperList,
-  markerLevelStatData,
+  markerStepChangeList,
+  markerScoreStatData,
   areaList,
   areaList,
   workLevelList,
   workLevelList,
   subjectDetail,
   subjectDetail,
   paperSelectLevelOrScore,
   paperSelectLevelOrScore,
-  paperPassLevel
+  paperTaskPass
 } from "@/api";
 } from "@/api";
 import ImagePreview from "@/components/common/ImagePreview";
 import ImagePreview from "@/components/common/ImagePreview";
-import GradeStep from "../grading/components/GradeStep";
+import MarkStep from "./components/MarkStep";
 import GradeHistoryPaper from "../grading/components/GradeHistoryPaper";
 import GradeHistoryPaper from "../grading/components/GradeHistoryPaper";
 import MarkAction from "./components/MarkAction";
 import MarkAction from "./components/MarkAction";
 // 三种情况:
 // 三种情况:
@@ -165,7 +166,7 @@ export default {
   name: "mark-operation",
   name: "mark-operation",
   components: {
   components: {
     ImagePreview,
     ImagePreview,
-    GradeStep,
+    MarkStep,
     GradeHistoryPaper,
     GradeHistoryPaper,
     MarkAction
     MarkAction
   },
   },
@@ -173,9 +174,26 @@ export default {
     return {
     return {
       filter: {
       filter: {
         markerId: this.$ls.get("user").id,
         markerId: this.$ls.get("user").id,
-        questionId: "",
-        sort: "paper.level",
-        stage: "SCORE"
+        questionId: ""
+      },
+      typeFilter: {
+        undo: {
+          sort: "paper.level",
+          stage: "SCORE"
+        },
+        done: {
+          level: "",
+          sort: "updatedOn,desc",
+          stage: "SCORE"
+        },
+        shife: {
+          isShift: true,
+          isShiftScore: false
+        },
+        shiftScore: {
+          isShift: false,
+          isShiftScore: true
+        }
       },
       },
       workId: this.$route.params.workId,
       workId: this.$route.params.workId,
       subjectId: this.$route.params.subjectId,
       subjectId: this.$route.params.subjectId,
@@ -197,6 +215,7 @@ export default {
       // carousel paper review,
       // carousel paper review,
       carouselPapers: [],
       carouselPapers: [],
       curCarouselPaperIndex: 0,
       curCarouselPaperIndex: 0,
+      beforeCarouselCurPaperIndex: 0,
       isFullscreenMarking: false
       isFullscreenMarking: false
     };
     };
   },
   },
@@ -228,28 +247,31 @@ export default {
     async getList() {
     async getList() {
       const datas = {
       const datas = {
         ...this.filter,
         ...this.filter,
+        ...this.typeFilter[this.curStep.type],
         page: this.current - 1,
         page: this.current - 1,
         size: this.size
         size: this.size
       };
       };
       if (this.curStep.type === "done") {
       if (this.curStep.type === "done") {
         datas.level = this.curStep.name;
         datas.level = this.curStep.name;
-        datas.sort = "updatedOn,desc";
       }
       }
+      const requestAction = this.curStep.type.includes("shift")
+        ? markerStepChangeList
+        : markerPaperList;
 
 
-      const data = await markerPaperList(datas);
+      const data = await requestAction(datas);
       this.papers = data.data.map(paper => {
       this.papers = data.data.map(paper => {
         paper.title = `NO.${paper.sn}`;
         paper.title = `NO.${paper.sn}`;
         return paper;
         return paper;
       });
       });
       this.total = data.totalCount;
       this.total = data.totalCount;
-      this.totalPage = data.totalPage;
+      this.totalPage = data.pageCount;
     },
     },
     toPage(page) {
     toPage(page) {
       this.current = page;
       this.current = page;
       this.getList();
       this.getList();
     },
     },
     async getStepLevels() {
     async getStepLevels() {
-      const data = await markerLevelStatData(
+      const data = await markerScoreStatData(
         this.filter.markerId,
         this.filter.markerId,
         this.filter.questionId
         this.filter.questionId
       );
       );
@@ -345,9 +367,6 @@ export default {
       this.selectPaper(index);
       this.selectPaper(index);
       this.$refs.ImagePreview.open();
       this.$refs.ImagePreview.open();
     },
     },
-    imagePreviewClose() {
-      this.isFullscreenMarking = false;
-    },
     async prevPage() {
     async prevPage() {
       if (this.current === 1) {
       if (this.current === 1) {
         this.$Message.warning("当前已经是第一条数据了");
         this.$Message.warning("当前已经是第一条数据了");
@@ -359,10 +378,12 @@ export default {
       if (this.papers.length) this.$refs.ImagePreview.initData();
       if (this.papers.length) this.$refs.ImagePreview.initData();
     },
     },
     async nextPage() {
     async nextPage() {
+      console.log(this.current, this.totalPage);
       if (this.current === this.totalPage) {
       if (this.current === this.totalPage) {
         if (this.current > 1) {
         if (this.current > 1) {
           this.current--;
           this.current--;
         } else {
         } else {
+          console.log("122");
           this.$Message.warning("当前已经是最后一条数据了");
           this.$Message.warning("当前已经是最后一条数据了");
         }
         }
       }
       }
@@ -387,7 +408,7 @@ export default {
       this.papers[index] = Object.assign(this.papers[index], data);
       this.papers[index] = Object.assign(this.papers[index], data);
     },
     },
     async passCurPaper(level) {
     async passCurPaper(level) {
-      await paperPassLevel(this.curPaper.id);
+      await paperTaskPass(this.curPaper.id);
       this.toNext();
       this.toNext();
     },
     },
     toNext() {
     toNext() {
@@ -399,8 +420,10 @@ export default {
     // paper carousel
     // paper carousel
     toViewCarouselPaper(paperIndex, papers) {
     toViewCarouselPaper(paperIndex, papers) {
       this.isFullscreenMarking = true;
       this.isFullscreenMarking = true;
-      this.curCarouselPaperIndex = paperIndex;
+      this.beforeCarouselCurPaperIndex = this.curPaperIndex;
+      this.curPaperIndex = null;
       this.carouselPapers = papers;
       this.carouselPapers = papers;
+      this.selectCarouselPaper(paperIndex);
       this.$nextTick(() => {
       this.$nextTick(() => {
         this.$refs.CarouselPapersPreview.open();
         this.$refs.CarouselPapersPreview.open();
       });
       });
@@ -408,6 +431,10 @@ export default {
     selectCarouselPaper(index) {
     selectCarouselPaper(index) {
       this.curCarouselPaperIndex = index;
       this.curCarouselPaperIndex = index;
       this.curPaper = { ...this.carouselPapers[index] };
       this.curPaper = { ...this.carouselPapers[index] };
+    },
+    carouseImagePreviewClose() {
+      this.isFullscreenMarking = false;
+      this.selectPaper(this.beforeCarouselCurPaperIndex);
     }
     }
   }
   }
 };
 };

+ 1 - 1
src/modules/mark/MarkTaskManage.vue

@@ -25,7 +25,7 @@
       </div>
       </div>
       <div class="part-box-head-right">
       <div class="part-box-head-right">
         <p class="mark-task-total">
         <p class="mark-task-total">
-          <span>已选任务数量:</span>
+          <span>已选试卷数量:</span>
           <span>{{ curTaskCount }}</span>
           <span>{{ curTaskCount }}</span>
         </p>
         </p>
         <Button
         <Button

+ 10 - 6
src/modules/mark/components/MarkAction.vue

@@ -95,8 +95,8 @@
     </div>
     </div>
     <!-- 打分信息 -->
     <!-- 打分信息 -->
     <div class="action-grade-info action-mark-info" v-if="rights.markInfo">
     <div class="action-grade-info action-mark-info" v-if="rights.markInfo">
-      <p class="grade-info-name" v-if="curPaper.score !== null">
-        {{ curPaper.score }}
+      <p class="grade-info-name" v-if="curPaper.result">
+        {{ curPaper.result }}
       </p>
       </p>
       <p class="grade-info-name grade-info-none" v-else>未打分</p>
       <p class="grade-info-name grade-info-none" v-else>未打分</p>
     </div>
     </div>
@@ -124,9 +124,12 @@
         </div>
         </div>
       </div>
       </div>
     </div>
     </div>
-    <!-- <div class="action-grade-pass" v-if="rights.gradeList && IS_MARKER">
-      <Button type="primary" @click="toPass">跳过</Button>
-    </div> -->
+    <div
+      class="action-grade-pass"
+      v-if="rights.gradeList && IS_MARKER && stepType === 'undo'"
+    >
+      <Button @click="toPass">跳过</Button>
+    </div>
 
 
     <!-- 评卷记录 -->
     <!-- 评卷记录 -->
     <div class="action-grade-history" v-if="rights.markHis">
     <div class="action-grade-history" v-if="rights.markHis">
@@ -300,7 +303,8 @@ export default {
   methods: {
   methods: {
     getStepType() {
     getStepType() {
       const paper = this.curPaper;
       const paper = this.curPaper;
-      if (paper.level) return "done";
+      if (!paper.result) return "undo";
+      if (paper.result) return "done";
       // TODO:
       // TODO:
       if (paper.arbitrated) return "arbitrate";
       if (paper.arbitrated) return "arbitrate";
       if (paper.rejected) return "reject";
       if (paper.rejected) return "reject";

+ 79 - 0
src/modules/mark/components/MarkStep.vue

@@ -0,0 +1,79 @@
+<template>
+  <div class="mark-step grade-step">
+    <div
+      class="grade-step-other"
+      v-if="steps.otherStep && steps.otherStep.length"
+    >
+      <div
+        v-for="(step, sindex) in steps.otherStep"
+        :key="sindex"
+        :class="[
+          'step-item',
+          {
+            'step-act': curStep.name === step.name,
+            'step-other': step.type !== 'done'
+          }
+        ]"
+        @click="selectStep(step)"
+      >
+        <p class="step-name">{{ step.name }}</p>
+        <p>{{ step.count }}</p>
+      </div>
+    </div>
+    <div class="grade-step-level">
+      <div
+        v-for="(step, sindex) in steps.levelStep"
+        :key="sindex"
+        :class="[
+          'step-item',
+          {
+            'step-act': curStep.name === step.name,
+            'step-other': step.type !== 'done'
+          }
+        ]"
+        @click="selectStep(step)"
+      >
+        <p class="step-name">{{ step.name }}</p>
+        <p>{{ step.count }}</p>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "mark-step",
+  props: {
+    showAnalysis: {
+      type: Boolean,
+      default: true
+    },
+    steps: {
+      type: Object,
+      default() {
+        return { levelStep: [], otherStep: [] };
+      }
+    },
+    initStep: {
+      type: Object,
+      default() {
+        return { type: "", name: "" };
+      }
+    }
+  },
+  data() {
+    return {
+      curStep: {}
+    };
+  },
+  mounted() {
+    this.selectStep(this.initStep);
+  },
+  methods: {
+    selectStep(step) {
+      this.curStep = { ...step };
+      this.$emit("on-change", this.curStep);
+    }
+  }
+};
+</script>