|
@@ -1,522 +1,527 @@
|
|
|
-<template>
|
|
|
- <div class="marker-marking marker-grading">
|
|
|
- <marker-header
|
|
|
- v-if="paramsSetReady"
|
|
|
- :show-standard="false"
|
|
|
- :show-statistics="false"
|
|
|
- @area-change="areaChange"
|
|
|
- @step-change="stepChange"
|
|
|
- @page-set-change="pageSetChange"
|
|
|
- @to-history="toHistory"
|
|
|
- @to-statistics="toStatistics"
|
|
|
- ></marker-header>
|
|
|
-
|
|
|
- <div
|
|
|
- :class="[
|
|
|
- 'marker-action',
|
|
|
- { 'marker-action-fullscreen': isFullscreenMarking }
|
|
|
- ]"
|
|
|
- >
|
|
|
- <mark-action
|
|
|
- :cur-paper-or-task="curPaper"
|
|
|
- :levels="levels"
|
|
|
- :show-count="showPaperRelateCount"
|
|
|
- :params-set="paramsSet"
|
|
|
- :key="curPaper.key"
|
|
|
- @on-leader-level="gradingCurPaper"
|
|
|
- @on-select-score="scoreCurPaper"
|
|
|
- @on-pass="passCurPaper"
|
|
|
- ref="GradeAction"
|
|
|
- v-if="curPaper.id"
|
|
|
- ></mark-action>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="marker-body">
|
|
|
- <div :class="markerImageListClasses" v-if="papers.length">
|
|
|
- <div
|
|
|
- v-for="(paper, index) in papers"
|
|
|
- :key="`${paper.key}-${paper.result}`"
|
|
|
- :class="[
|
|
|
- 'marker-image-item',
|
|
|
- {
|
|
|
- 'marker-image-item-act': curPaperIndex === index
|
|
|
- }
|
|
|
- ]"
|
|
|
- >
|
|
|
- <div class="marker-image-content">
|
|
|
- <marker-image-view
|
|
|
- :data="paper"
|
|
|
- :stage="stage"
|
|
|
- @to-review="toReview(index)"
|
|
|
- ></marker-image-view>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div v-else class="marker-image-none">暂无数据</div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- MarkerHistory -->
|
|
|
- <marker-history
|
|
|
- :question-id="filter.questionId"
|
|
|
- :stage="stage"
|
|
|
- @on-paper-click="
|
|
|
- (index, papers) => {
|
|
|
- toViewCarouselPaper(index, papers, 'history');
|
|
|
- }
|
|
|
- "
|
|
|
- ref="MarkerHistory"
|
|
|
- ></marker-history>
|
|
|
- <!-- image-preview -->
|
|
|
- <simple-image-preview
|
|
|
- class="grading-operation-image-preview"
|
|
|
- :cur-image="curPaper"
|
|
|
- @on-prev="toPrevPaper"
|
|
|
- @on-next="toNextPaper"
|
|
|
- @on-close="isFullscreenMarking = false"
|
|
|
- ref="SimpleImagePreview"
|
|
|
- ></simple-image-preview>
|
|
|
- <!-- carousel paper review -->
|
|
|
- <simple-image-preview
|
|
|
- class="grading-operation-image-preview"
|
|
|
- :cur-image="curPaper"
|
|
|
- @on-prev="toCarousePaper('prev')"
|
|
|
- @on-next="toCarousePaper('next')"
|
|
|
- @on-close="carouseImagePreviewClose"
|
|
|
- ref="CarouselPapersPreview"
|
|
|
- ></simple-image-preview>
|
|
|
- <!-- level-change-modal-info -->
|
|
|
- <Modal
|
|
|
- v-model="levelChangeModalIsShow"
|
|
|
- width="400"
|
|
|
- footer-hide
|
|
|
- :z-index="2001"
|
|
|
- :closable="false"
|
|
|
- :mask-closable="false"
|
|
|
- >
|
|
|
- <div class="ivu-modal-confirm">
|
|
|
- <div class="ivu-modal-confirm-body">
|
|
|
- <div>{{ levelChangeTips }}</div>
|
|
|
- </div>
|
|
|
- <div class="ivu-modal-confirm-footer">
|
|
|
- <Button type="primary" @click="levelChangeModalIsShow = false"
|
|
|
- >确定</Button
|
|
|
- >
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </Modal>
|
|
|
- </div>
|
|
|
-</template>
|
|
|
-
|
|
|
-<script>
|
|
|
-import { mapState, mapMutations } from "vuex";
|
|
|
-import MarkerHeader from "../../grading/marker/MarkerHeader";
|
|
|
-import MarkAction from "../components/MarkAction";
|
|
|
-import SimpleImagePreview from "@/components/SimpleImagePreview";
|
|
|
-import MarkerImageView from "../../grading/marker/MarkerImageView";
|
|
|
-import MarkerHistory from "../../grading/marker/MarkerHistory";
|
|
|
-
|
|
|
-import {
|
|
|
- getParamsSet,
|
|
|
- markerTaskList,
|
|
|
- markerChangeLevelPaperList,
|
|
|
- markerScoreTotalStatData,
|
|
|
- workLevelList,
|
|
|
- paperSelectLevelOrScore,
|
|
|
- markerManualScorePaperList,
|
|
|
- paperTaskPass
|
|
|
-} from "@/api";
|
|
|
-
|
|
|
-export default {
|
|
|
- name: "marker-marking",
|
|
|
- components: {
|
|
|
- MarkerHeader,
|
|
|
- MarkerImageView,
|
|
|
- MarkerHistory,
|
|
|
- MarkAction,
|
|
|
- SimpleImagePreview
|
|
|
- },
|
|
|
- data() {
|
|
|
- return {
|
|
|
- filter: {
|
|
|
- markerId: this.$ls.get("user").id,
|
|
|
- questionId: ""
|
|
|
- },
|
|
|
- typeFilter: {
|
|
|
- undo: {
|
|
|
- sort: "paper.level",
|
|
|
- stage: "SCORE"
|
|
|
- },
|
|
|
- done: {
|
|
|
- level: "",
|
|
|
- sort: "updatedOn,desc",
|
|
|
- stage: "SCORE"
|
|
|
- },
|
|
|
- shift: {
|
|
|
- isShift: true,
|
|
|
- isShiftScore: false
|
|
|
- },
|
|
|
- shiftScore: {
|
|
|
- isShift: false,
|
|
|
- isShiftScore: true
|
|
|
- },
|
|
|
- manualScore: {}
|
|
|
- },
|
|
|
- stage: "SCORE",
|
|
|
- workId: this.$route.params.workId,
|
|
|
- subjectId: this.$route.params.subjectId,
|
|
|
- subject: "",
|
|
|
- workSubject: {},
|
|
|
- curSubject: {},
|
|
|
- changeStage: 0, // 是否显示改档及改档打分
|
|
|
- curStandardGradeId: "",
|
|
|
- levels: [],
|
|
|
- papers: [],
|
|
|
- curPaper: {},
|
|
|
- curPaperIndex: 0,
|
|
|
- paramsSetReady: false,
|
|
|
- // carousel paper review,
|
|
|
- carouselPapers: [],
|
|
|
- curCarouselPaperIndex: 0,
|
|
|
- isFullscreenMarking: false,
|
|
|
- // tips-modal
|
|
|
- levelChangeTips: "",
|
|
|
- levelChangeModalIsShow: false
|
|
|
- };
|
|
|
- },
|
|
|
- computed: {
|
|
|
- ...mapState("marker", ["paramsSet", "page", "steps", "curStep", "curArea"]),
|
|
|
- markerImageListClasses() {
|
|
|
- return ["marker-image-list", `marker-image-list-${this.page.size}`];
|
|
|
- },
|
|
|
- showPaperRelateCount() {
|
|
|
- return !!this.paramsSet["showPaperCount"];
|
|
|
- }
|
|
|
- },
|
|
|
- created() {
|
|
|
- this.subject = this.subjectId.split("-")[1];
|
|
|
- this.workSubject = {
|
|
|
- workId: this.workId,
|
|
|
- subject: this.subject
|
|
|
- };
|
|
|
- const curUserRoleType = this.$ls.get("user", { role: "" }).role;
|
|
|
- this.setCurUserRoleType(curUserRoleType);
|
|
|
- this.initData();
|
|
|
- },
|
|
|
- methods: {
|
|
|
- ...mapMutations("marker", [
|
|
|
- "setParamSet",
|
|
|
- "setPage",
|
|
|
- "setSteps",
|
|
|
- "setCurArea",
|
|
|
- "setCurStep",
|
|
|
- "setCurUserRoleType",
|
|
|
- "clearState"
|
|
|
- ]),
|
|
|
- initData() {
|
|
|
- this.getParamsSetInfo();
|
|
|
- this.getWorkLevels();
|
|
|
- },
|
|
|
- async getParamsSetInfo() {
|
|
|
- const data = await getParamsSet(this.workId);
|
|
|
- this.setParamSet(data || {});
|
|
|
- this.changeStage = this.paramsSet.changeStage;
|
|
|
- this.paramsSetReady = true;
|
|
|
- },
|
|
|
- async getList() {
|
|
|
- const datas = {
|
|
|
- ...this.filter,
|
|
|
- ...this.typeFilter[this.curStep.type],
|
|
|
- subject: this.subject,
|
|
|
- workId: this.workId,
|
|
|
- page: this.page.current - 1,
|
|
|
- size: this.page.size
|
|
|
- };
|
|
|
- if (this.curStep.type === "done") {
|
|
|
- datas.level = this.curStep.name;
|
|
|
- }
|
|
|
-
|
|
|
- let requestAction = null;
|
|
|
- if (this.curStep.type.includes("shift")) {
|
|
|
- requestAction = markerChangeLevelPaperList;
|
|
|
- } else if (this.curStep.type === "manualScore") {
|
|
|
- requestAction = markerManualScorePaperList;
|
|
|
- } else {
|
|
|
- requestAction = markerTaskList;
|
|
|
- }
|
|
|
-
|
|
|
- const data = await requestAction(datas);
|
|
|
- this.papers = data.data.map(paper => {
|
|
|
- paper.key = this.$randomCode();
|
|
|
- paper.title = `NO.${paper.sn}`;
|
|
|
- paper.score = paper.result;
|
|
|
- return paper;
|
|
|
- });
|
|
|
- this.setPage({
|
|
|
- total: data.totalCount,
|
|
|
- totalPage: data.pageCount
|
|
|
- });
|
|
|
- },
|
|
|
- async toPage(page) {
|
|
|
- this.setPage({
|
|
|
- current: page
|
|
|
- });
|
|
|
- await this.getList();
|
|
|
- this.selectPaper(this.curPaperIndex);
|
|
|
- },
|
|
|
- async getStepLevels() {
|
|
|
- const data = await markerScoreTotalStatData(
|
|
|
- this.filter.markerId,
|
|
|
- this.filter.questionId
|
|
|
- );
|
|
|
- const undoIndex = data.findIndex(item => item.id === null);
|
|
|
- let otherStep = [];
|
|
|
- let undo = {
|
|
|
- count: 0,
|
|
|
- shift: 0,
|
|
|
- shiftScore: 0
|
|
|
- };
|
|
|
- if (undoIndex !== -1) {
|
|
|
- undo = { ...data[undoIndex] };
|
|
|
- data.splice(undoIndex, 1);
|
|
|
- }
|
|
|
- otherStep.push({
|
|
|
- name: "待评",
|
|
|
- count: undo.count,
|
|
|
- type: "undo"
|
|
|
- });
|
|
|
-
|
|
|
- if (this.changeStage) {
|
|
|
- otherStep.push({
|
|
|
- name: "改档",
|
|
|
- count: undo.shift,
|
|
|
- type: "shift"
|
|
|
- });
|
|
|
- otherStep.push({
|
|
|
- name: "改档打分",
|
|
|
- count: undo.shiftScore,
|
|
|
- type: "shiftScore"
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- let levelStep = data
|
|
|
- .filter(item => item.id !== "manualScore")
|
|
|
- .map(item => {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- name: item.id,
|
|
|
- type: "done"
|
|
|
- };
|
|
|
- });
|
|
|
- const msInfo = data.find(item => item.id === "manualScore");
|
|
|
- if (msInfo) {
|
|
|
- otherStep.push({
|
|
|
- count: msInfo.count,
|
|
|
- name: "输分试卷",
|
|
|
- type: "manualScore"
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- this.setSteps({ levelStep, otherStep });
|
|
|
-
|
|
|
- if (!this.curStep.name) {
|
|
|
- let curStep = {};
|
|
|
- if (undoIndex === -1) {
|
|
|
- curStep = levelStep[0];
|
|
|
- } else {
|
|
|
- const firstStep = otherStep.find(item => item.count);
|
|
|
- curStep = firstStep || levelStep[0];
|
|
|
- }
|
|
|
- this.setCurStep(curStep);
|
|
|
- } else {
|
|
|
- const curStep = [...levelStep, ...otherStep].find(
|
|
|
- item => item.name === this.curStep.name
|
|
|
- );
|
|
|
- this.setCurStep(curStep);
|
|
|
- }
|
|
|
- },
|
|
|
- updateStepLevel(curStep, curLevel, count = 1) {
|
|
|
- if (curStep.type === "done") return;
|
|
|
-
|
|
|
- const opos = this.steps.otherStep.findIndex(
|
|
|
- item => item.type === curStep.type
|
|
|
- );
|
|
|
- this.steps.otherStep[opos].count -= count;
|
|
|
-
|
|
|
- if (curStep.type === "shift") {
|
|
|
- const spos = this.steps.otherStep.findIndex(
|
|
|
- item => item.type === "shiftScore"
|
|
|
- );
|
|
|
- this.steps.otherStep[spos].count += count;
|
|
|
- } else {
|
|
|
- const pos = this.steps.levelStep.findIndex(
|
|
|
- item => item.name === curLevel
|
|
|
- );
|
|
|
- this.steps.levelStep[pos].count += count;
|
|
|
- }
|
|
|
- },
|
|
|
- async getWorkLevels() {
|
|
|
- const data = await workLevelList(this.workId);
|
|
|
- this.levels = data.map(item => {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- name: item.code
|
|
|
- };
|
|
|
- });
|
|
|
- },
|
|
|
- async pageSetChange() {
|
|
|
- await this.getList();
|
|
|
- this.selectPaper(this.curPaperIndex);
|
|
|
- },
|
|
|
- async stepChange(step) {
|
|
|
- this.setCurStep(step);
|
|
|
- this.setPage({ current: 1 });
|
|
|
- this.isFullscreenMarking = false;
|
|
|
- await this.getList();
|
|
|
- this.getStepLevels();
|
|
|
- if (this.papers.length) {
|
|
|
- this.selectPaper(0);
|
|
|
- } else {
|
|
|
- this.curPaper = {};
|
|
|
- }
|
|
|
- },
|
|
|
- async areaChange(curArea) {
|
|
|
- this.setCurArea(curArea);
|
|
|
- this.filter.questionId = curArea.id;
|
|
|
- await this.getStepLevels();
|
|
|
- this.toPage(1);
|
|
|
- },
|
|
|
- toReview(index) {
|
|
|
- this.isFullscreenMarking = true;
|
|
|
- this.selectPaper(index);
|
|
|
- this.$refs.SimpleImagePreview.open();
|
|
|
- },
|
|
|
- selectPaper(index) {
|
|
|
- let nindex = index;
|
|
|
- if (!this.papers.length) {
|
|
|
- nindex = 0;
|
|
|
- } else if (index > this.papers.length - 1) {
|
|
|
- nindex = this.papers.length - 1;
|
|
|
- } else if (index < 0) {
|
|
|
- nindex = 0;
|
|
|
- }
|
|
|
- const lastPaper = { ...this.curPaper };
|
|
|
- this.curPaperIndex = nindex;
|
|
|
- this.curPaper = this.papers[nindex] ? { ...this.papers[nindex] } : {};
|
|
|
-
|
|
|
- // 待评时,检查当前试卷是否已经切换档位
|
|
|
- if (
|
|
|
- this.curStep.type === "undo" &&
|
|
|
- this.curPaper["level"] &&
|
|
|
- this.curPaper["level"] !== lastPaper["level"]
|
|
|
- ) {
|
|
|
- this.levelChangeTips = `即将打分档位:${this.curPaper.level}`;
|
|
|
- this.levelChangeModalIsShow = true;
|
|
|
- }
|
|
|
- },
|
|
|
- async toPrevPaper() {
|
|
|
- if (this.curPaperIndex === 0) {
|
|
|
- if (this.page.current > 1) {
|
|
|
- this.setPage({ current: this.page.current - 1 });
|
|
|
- this.curPaperIndex = this.page.size - 1;
|
|
|
- await this.getList();
|
|
|
- } else {
|
|
|
- this.$Message.warning("当前已经是第一条数据了");
|
|
|
- return;
|
|
|
- }
|
|
|
- } else {
|
|
|
- this.curPaperIndex--;
|
|
|
- }
|
|
|
-
|
|
|
- this.selectPaper(this.curPaperIndex);
|
|
|
- },
|
|
|
- async toNextPaper() {
|
|
|
- if (this.curPaperIndex === this.papers.length - 1) {
|
|
|
- if (this.page.current === this.page.totalPage) {
|
|
|
- this.$Message.warning("当前已经是最后一条数据了");
|
|
|
- return;
|
|
|
- } else {
|
|
|
- this.setPage({ current: this.page.current + 1 });
|
|
|
- this.curPaperIndex = 0;
|
|
|
- await this.getList();
|
|
|
- }
|
|
|
- } else {
|
|
|
- this.curPaperIndex++;
|
|
|
- }
|
|
|
-
|
|
|
- this.selectPaper(this.curPaperIndex);
|
|
|
- },
|
|
|
- async toActionNextPaper() {
|
|
|
- if (this.page.current > 1 && this.papers.length === 1) {
|
|
|
- this.setPage({ current: this.page.current - 1 });
|
|
|
- this.curPaperIndex = this.page.size;
|
|
|
- }
|
|
|
-
|
|
|
- await this.getList();
|
|
|
- if (!this.papers.length) this.$refs.SimpleImagePreview.cancel();
|
|
|
- this.selectPaper(this.curPaperIndex);
|
|
|
- },
|
|
|
- async gradingCurPaper({ selectedLevel }) {
|
|
|
- await paperSelectLevelOrScore(
|
|
|
- this.curPaper.id, // is taskId
|
|
|
- selectedLevel,
|
|
|
- "LEVEL"
|
|
|
- );
|
|
|
- this.updateStepLevel(this.curStep, "shiftScore");
|
|
|
- this.toActionNextPaper();
|
|
|
- },
|
|
|
- async scoreCurPaper(info) {
|
|
|
- const paper = await paperSelectLevelOrScore(
|
|
|
- this.curPaper.id, // is taskId
|
|
|
- info.score,
|
|
|
- "SCORE",
|
|
|
- info.manualScore
|
|
|
- );
|
|
|
- if (!paper) return;
|
|
|
- this.updateStepLevel(this.curStep, this.curPaper.level);
|
|
|
- this.toActionNextPaper();
|
|
|
- },
|
|
|
- async passCurPaper(level) {
|
|
|
- await paperTaskPass(this.curPaper.id);
|
|
|
- this.toActionNextPaper();
|
|
|
- },
|
|
|
- // paper carousel
|
|
|
- toViewCarouselPaper(paperIndex, papers) {
|
|
|
- this.isFullscreenMarking = true;
|
|
|
- this.carouselPapers = papers;
|
|
|
- this.selectCarouselPaper(paperIndex);
|
|
|
- this.$nextTick(() => {
|
|
|
- this.$refs.CarouselPapersPreview.open();
|
|
|
- });
|
|
|
- },
|
|
|
- selectCarouselPaper(index) {
|
|
|
- this.curCarouselPaperIndex = index;
|
|
|
- this.curPaper = { ...this.carouselPapers[index] };
|
|
|
- },
|
|
|
- toCarousePaper(type) {
|
|
|
- if (type === "prev" && this.curCarouselPaperIndex > 0) {
|
|
|
- this.curCarouselPaperIndex--;
|
|
|
- } else if (
|
|
|
- type === "next" &&
|
|
|
- this.curCarouselPaperIndex < this.carouselPapers.length - 1
|
|
|
- ) {
|
|
|
- this.curCarouselPaperIndex++;
|
|
|
- }
|
|
|
- this.selectCarouselPaper(this.curCarouselPaperIndex);
|
|
|
- },
|
|
|
- carouseImagePreviewClose() {
|
|
|
- this.isFullscreenMarking = false;
|
|
|
- this.selectPaper(this.curPaperIndex);
|
|
|
- },
|
|
|
- // header
|
|
|
- toHistory() {
|
|
|
- this.$refs.MarkerHistory.open();
|
|
|
- },
|
|
|
- toStatistics() {
|
|
|
- this.$refs.MarkerStatistics.open();
|
|
|
- }
|
|
|
- },
|
|
|
- beforeDestroy() {
|
|
|
- this.clearState();
|
|
|
- }
|
|
|
-};
|
|
|
-</script>
|
|
|
+<template>
|
|
|
+ <div class="marker-marking marker-grading">
|
|
|
+ <marker-header
|
|
|
+ v-if="paramsSetReady"
|
|
|
+ :show-standard="false"
|
|
|
+ :show-statistics="false"
|
|
|
+ @area-change="areaChange"
|
|
|
+ @step-change="stepChange"
|
|
|
+ @page-set-change="pageSetChange"
|
|
|
+ @to-history="toHistory"
|
|
|
+ @to-statistics="toStatistics"
|
|
|
+ ></marker-header>
|
|
|
+
|
|
|
+ <div
|
|
|
+ :class="[
|
|
|
+ 'marker-action',
|
|
|
+ { 'marker-action-fullscreen': isFullscreenMarking }
|
|
|
+ ]"
|
|
|
+ >
|
|
|
+ <mark-action
|
|
|
+ :cur-paper-or-task="curPaper"
|
|
|
+ :levels="levels"
|
|
|
+ :show-count="showPaperRelateCount"
|
|
|
+ :params-set="paramsSet"
|
|
|
+ :key="curPaper.key"
|
|
|
+ @on-leader-level="gradingCurPaper"
|
|
|
+ @on-select-score="scoreCurPaper"
|
|
|
+ @on-pass="passCurPaper"
|
|
|
+ ref="GradeAction"
|
|
|
+ v-if="curPaper.id"
|
|
|
+ ></mark-action>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="marker-body">
|
|
|
+ <div :class="markerImageListClasses" v-if="papers.length">
|
|
|
+ <div
|
|
|
+ v-for="(paper, index) in papers"
|
|
|
+ :key="`${paper.key}-${paper.result}`"
|
|
|
+ :class="[
|
|
|
+ 'marker-image-item',
|
|
|
+ {
|
|
|
+ 'marker-image-item-act': curPaperIndex === index
|
|
|
+ }
|
|
|
+ ]"
|
|
|
+ >
|
|
|
+ <div class="marker-image-content">
|
|
|
+ <marker-image-view
|
|
|
+ :data="paper"
|
|
|
+ :stage="stage"
|
|
|
+ @to-review="toReview(index)"
|
|
|
+ ></marker-image-view>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else class="marker-image-none">暂无数据</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- MarkerHistory -->
|
|
|
+ <marker-history
|
|
|
+ :question-id="filter.questionId"
|
|
|
+ :stage="stage"
|
|
|
+ @on-paper-click="
|
|
|
+ (index, papers) => {
|
|
|
+ toViewCarouselPaper(index, papers, 'history');
|
|
|
+ }
|
|
|
+ "
|
|
|
+ ref="MarkerHistory"
|
|
|
+ ></marker-history>
|
|
|
+ <!-- image-preview -->
|
|
|
+ <simple-image-preview
|
|
|
+ class="grading-operation-image-preview"
|
|
|
+ :cur-image="curPaper"
|
|
|
+ @on-prev="toPrevPaper"
|
|
|
+ @on-next="toNextPaper"
|
|
|
+ @on-close="isFullscreenMarking = false"
|
|
|
+ ref="SimpleImagePreview"
|
|
|
+ ></simple-image-preview>
|
|
|
+ <!-- carousel paper review -->
|
|
|
+ <simple-image-preview
|
|
|
+ class="grading-operation-image-preview"
|
|
|
+ :cur-image="curPaper"
|
|
|
+ @on-prev="toCarousePaper('prev')"
|
|
|
+ @on-next="toCarousePaper('next')"
|
|
|
+ @on-close="carouseImagePreviewClose"
|
|
|
+ ref="CarouselPapersPreview"
|
|
|
+ ></simple-image-preview>
|
|
|
+ <!-- level-change-modal-info -->
|
|
|
+ <Modal
|
|
|
+ v-model="levelChangeModalIsShow"
|
|
|
+ width="400"
|
|
|
+ footer-hide
|
|
|
+ :z-index="2001"
|
|
|
+ :closable="false"
|
|
|
+ :mask-closable="false"
|
|
|
+ >
|
|
|
+ <div class="ivu-modal-confirm">
|
|
|
+ <div class="ivu-modal-confirm-body">
|
|
|
+ <div>{{ levelChangeTips }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="ivu-modal-confirm-footer">
|
|
|
+ <Button type="primary" @click="levelChangeModalIsShow = false"
|
|
|
+ >确定</Button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Modal>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import { mapState, mapMutations } from "vuex";
|
|
|
+import MarkerHeader from "../../grading/marker/MarkerHeader";
|
|
|
+import MarkAction from "../components/MarkAction";
|
|
|
+import SimpleImagePreview from "@/components/SimpleImagePreview";
|
|
|
+import MarkerImageView from "../../grading/marker/MarkerImageView";
|
|
|
+import MarkerHistory from "../../grading/marker/MarkerHistory";
|
|
|
+
|
|
|
+import {
|
|
|
+ getParamsSet,
|
|
|
+ markerTaskList,
|
|
|
+ markerChangeLevelPaperList,
|
|
|
+ markerScoreTotalStatData,
|
|
|
+ workLevelList,
|
|
|
+ paperSelectLevelOrScore,
|
|
|
+ markerManualScorePaperList,
|
|
|
+ paperTaskPass
|
|
|
+} from "@/api";
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: "marker-marking",
|
|
|
+ components: {
|
|
|
+ MarkerHeader,
|
|
|
+ MarkerImageView,
|
|
|
+ MarkerHistory,
|
|
|
+ MarkAction,
|
|
|
+ SimpleImagePreview
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ filter: {
|
|
|
+ markerId: this.$ls.get("user").id,
|
|
|
+ questionId: ""
|
|
|
+ },
|
|
|
+ typeFilter: {
|
|
|
+ undo: {
|
|
|
+ sort: "paper.level",
|
|
|
+ stage: "SCORE"
|
|
|
+ },
|
|
|
+ done: {
|
|
|
+ level: "",
|
|
|
+ sort: "updatedOn,desc",
|
|
|
+ stage: "SCORE"
|
|
|
+ },
|
|
|
+ shift: {
|
|
|
+ isShift: true,
|
|
|
+ isShiftScore: false
|
|
|
+ },
|
|
|
+ shiftScore: {
|
|
|
+ isShift: false,
|
|
|
+ isShiftScore: true
|
|
|
+ },
|
|
|
+ manualScore: {}
|
|
|
+ },
|
|
|
+ stage: "SCORE",
|
|
|
+ workId: this.$route.params.workId,
|
|
|
+ subjectId: this.$route.params.subjectId,
|
|
|
+ subject: "",
|
|
|
+ workSubject: {},
|
|
|
+ curSubject: {},
|
|
|
+ changeStage: 0, // 是否显示改档及改档打分
|
|
|
+ curStandardGradeId: "",
|
|
|
+ levels: [],
|
|
|
+ papers: [],
|
|
|
+ curPaper: {},
|
|
|
+ curPaperIndex: 0,
|
|
|
+ paramsSetReady: false,
|
|
|
+ // carousel paper review,
|
|
|
+ carouselPapers: [],
|
|
|
+ curCarouselPaperIndex: 0,
|
|
|
+ isFullscreenMarking: false,
|
|
|
+ // tips-modal
|
|
|
+ levelChangeTips: "",
|
|
|
+ levelChangeModalIsShow: false
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapState("marker", ["paramsSet", "page", "steps", "curStep", "curArea"]),
|
|
|
+ markerImageListClasses() {
|
|
|
+ return ["marker-image-list", `marker-image-list-${this.page.size}`];
|
|
|
+ },
|
|
|
+ showPaperRelateCount() {
|
|
|
+ return !!this.paramsSet["showPaperCount"];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.subject = this.subjectId.split("-")[1];
|
|
|
+ this.workSubject = {
|
|
|
+ workId: this.workId,
|
|
|
+ subject: this.subject
|
|
|
+ };
|
|
|
+ const curUserRoleType = this.$ls.get("user", { role: "" }).role;
|
|
|
+ this.setCurUserRoleType(curUserRoleType);
|
|
|
+ this.initData();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ ...mapMutations("marker", [
|
|
|
+ "setParamSet",
|
|
|
+ "setPage",
|
|
|
+ "setSteps",
|
|
|
+ "setCurArea",
|
|
|
+ "setCurStep",
|
|
|
+ "setCurUserRoleType",
|
|
|
+ "clearState"
|
|
|
+ ]),
|
|
|
+ initData() {
|
|
|
+ this.getParamsSetInfo();
|
|
|
+ this.getWorkLevels();
|
|
|
+ },
|
|
|
+ async getParamsSetInfo() {
|
|
|
+ const data = await getParamsSet(this.workId);
|
|
|
+ this.setParamSet(data || {});
|
|
|
+ this.changeStage = this.paramsSet.changeStage;
|
|
|
+ this.paramsSetReady = true;
|
|
|
+ },
|
|
|
+ async getList() {
|
|
|
+ const datas = {
|
|
|
+ ...this.filter,
|
|
|
+ ...this.typeFilter[this.curStep.type],
|
|
|
+ subject: this.subject,
|
|
|
+ workId: this.workId,
|
|
|
+ page: this.page.current - 1,
|
|
|
+ size: this.page.size
|
|
|
+ };
|
|
|
+ if (this.curStep.type === "done") {
|
|
|
+ datas.level = this.curStep.name;
|
|
|
+ }
|
|
|
+
|
|
|
+ let requestAction = null;
|
|
|
+ if (this.curStep.type.includes("shift")) {
|
|
|
+ requestAction = markerChangeLevelPaperList;
|
|
|
+ } else if (this.curStep.type === "manualScore") {
|
|
|
+ requestAction = markerManualScorePaperList;
|
|
|
+ } else {
|
|
|
+ requestAction = markerTaskList;
|
|
|
+ }
|
|
|
+
|
|
|
+ const data = await requestAction(datas);
|
|
|
+ this.papers = data.data.map(paper => {
|
|
|
+ paper.key = this.$randomCode();
|
|
|
+ paper.title = `NO.${paper.sn}`;
|
|
|
+ paper.score = paper.result;
|
|
|
+ return paper;
|
|
|
+ });
|
|
|
+ this.setPage({
|
|
|
+ total: data.totalCount,
|
|
|
+ totalPage: data.pageCount
|
|
|
+ });
|
|
|
+ },
|
|
|
+ async toPage(page) {
|
|
|
+ this.setPage({
|
|
|
+ current: page
|
|
|
+ });
|
|
|
+ await this.getList();
|
|
|
+ this.selectPaper(this.curPaperIndex);
|
|
|
+ },
|
|
|
+ async getStepLevels() {
|
|
|
+ const data = await markerScoreTotalStatData(
|
|
|
+ this.filter.markerId,
|
|
|
+ this.filter.questionId
|
|
|
+ );
|
|
|
+ const undoIndex = data.findIndex(item => item.id === null);
|
|
|
+ let otherStep = [];
|
|
|
+ let undo = {
|
|
|
+ count: 0,
|
|
|
+ shift: 0,
|
|
|
+ shiftScore: 0
|
|
|
+ };
|
|
|
+ if (undoIndex !== -1) {
|
|
|
+ undo = { ...data[undoIndex] };
|
|
|
+ data.splice(undoIndex, 1);
|
|
|
+ }
|
|
|
+ otherStep.push({
|
|
|
+ name: "待评",
|
|
|
+ count: undo.count,
|
|
|
+ type: "undo"
|
|
|
+ });
|
|
|
+
|
|
|
+ if (this.changeStage) {
|
|
|
+ otherStep.push({
|
|
|
+ name: "改档",
|
|
|
+ count: undo.shift,
|
|
|
+ type: "shift"
|
|
|
+ });
|
|
|
+ otherStep.push({
|
|
|
+ name: "改档打分",
|
|
|
+ count: undo.shiftScore,
|
|
|
+ type: "shiftScore"
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ let levelStep = data
|
|
|
+ .filter(item => item.id !== "manualScore")
|
|
|
+ .map(item => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ name: item.id,
|
|
|
+ type: "done"
|
|
|
+ };
|
|
|
+ });
|
|
|
+ const msInfo = data.find(item => item.id === "manualScore");
|
|
|
+ if (msInfo) {
|
|
|
+ otherStep.push({
|
|
|
+ count: msInfo.count,
|
|
|
+ name: "输分试卷",
|
|
|
+ type: "manualScore"
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ this.setSteps({ levelStep, otherStep });
|
|
|
+
|
|
|
+ if (!this.curStep.name) {
|
|
|
+ let curStep = {};
|
|
|
+ if (undoIndex === -1) {
|
|
|
+ curStep = levelStep[0];
|
|
|
+ } else {
|
|
|
+ const firstStep = otherStep.find(item => item.count);
|
|
|
+ curStep = firstStep || levelStep[0];
|
|
|
+ }
|
|
|
+ this.setCurStep(curStep);
|
|
|
+ } else {
|
|
|
+ const curStep = [...levelStep, ...otherStep].find(
|
|
|
+ item => item.name === this.curStep.name
|
|
|
+ );
|
|
|
+ this.setCurStep(curStep);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ updateStepLevel(curStep, curLevel, count = 1) {
|
|
|
+ if (curStep.type === "done") return;
|
|
|
+
|
|
|
+ const opos = this.steps.otherStep.findIndex(
|
|
|
+ item => item.type === curStep.type
|
|
|
+ );
|
|
|
+ this.steps.otherStep[opos].count -= count;
|
|
|
+
|
|
|
+ if (curStep.type === "shift") {
|
|
|
+ const spos = this.steps.otherStep.findIndex(
|
|
|
+ item => item.type === "shiftScore"
|
|
|
+ );
|
|
|
+ this.steps.otherStep[spos].count += count;
|
|
|
+ } else {
|
|
|
+ const pos = this.steps.levelStep.findIndex(
|
|
|
+ item => item.name === curLevel
|
|
|
+ );
|
|
|
+ this.steps.levelStep[pos].count += count;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async getWorkLevels() {
|
|
|
+ const data = await workLevelList(this.workId);
|
|
|
+ this.levels = data.map(item => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ name: item.code
|
|
|
+ };
|
|
|
+ });
|
|
|
+ },
|
|
|
+ async pageSetChange() {
|
|
|
+ await this.getList();
|
|
|
+ this.selectPaper(this.curPaperIndex);
|
|
|
+ },
|
|
|
+ async stepChange(step) {
|
|
|
+ this.setCurStep(step);
|
|
|
+ this.setPage({ current: 1 });
|
|
|
+ this.isFullscreenMarking = false;
|
|
|
+ await this.getList();
|
|
|
+ this.getStepLevels();
|
|
|
+ if (this.papers.length) {
|
|
|
+ this.selectPaper(0);
|
|
|
+ } else {
|
|
|
+ this.curPaper = {};
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async areaChange(curArea) {
|
|
|
+ this.setCurArea(curArea);
|
|
|
+ this.filter.questionId = curArea.id;
|
|
|
+ await this.getStepLevels();
|
|
|
+ this.toPage(1);
|
|
|
+ },
|
|
|
+ toReview(index) {
|
|
|
+ this.isFullscreenMarking = true;
|
|
|
+ this.selectPaper(index);
|
|
|
+ this.$refs.SimpleImagePreview.open();
|
|
|
+ },
|
|
|
+ selectPaper(index) {
|
|
|
+ let nindex = index;
|
|
|
+ if (!this.papers.length) {
|
|
|
+ nindex = 0;
|
|
|
+ } else if (index > this.papers.length - 1) {
|
|
|
+ nindex = this.papers.length - 1;
|
|
|
+ } else if (index < 0) {
|
|
|
+ nindex = 0;
|
|
|
+ }
|
|
|
+ const lastPaper = { ...this.curPaper };
|
|
|
+ this.curPaperIndex = nindex;
|
|
|
+ this.curPaper = this.papers[nindex] ? { ...this.papers[nindex] } : {};
|
|
|
+
|
|
|
+ // 待评时,检查当前试卷是否已经切换档位
|
|
|
+ if (
|
|
|
+ this.curStep.type === "undo" &&
|
|
|
+ this.curPaper["level"] &&
|
|
|
+ this.curPaper["level"] !== lastPaper["level"]
|
|
|
+ ) {
|
|
|
+ this.levelChangeTips = `即将打分档位:${this.curPaper.level}`;
|
|
|
+ this.levelChangeModalIsShow = true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async toPrevPaper() {
|
|
|
+ if (this.curPaperIndex === 0) {
|
|
|
+ if (this.page.current > 1) {
|
|
|
+ this.setPage({ current: this.page.current - 1 });
|
|
|
+ this.curPaperIndex = this.page.size - 1;
|
|
|
+ await this.getList();
|
|
|
+ } else {
|
|
|
+ this.$Message.warning("当前已经是第一条数据了");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.curPaperIndex--;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.selectPaper(this.curPaperIndex);
|
|
|
+ },
|
|
|
+ async toNextPaper() {
|
|
|
+ if (this.curPaperIndex === this.papers.length - 1) {
|
|
|
+ if (this.page.current === this.page.totalPage) {
|
|
|
+ this.$Message.warning("当前已经是最后一条数据了");
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ this.setPage({ current: this.page.current + 1 });
|
|
|
+ this.curPaperIndex = 0;
|
|
|
+ await this.getList();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.curPaperIndex++;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.selectPaper(this.curPaperIndex);
|
|
|
+ },
|
|
|
+ async toActionNextPaper() {
|
|
|
+ if (this.page.current > 1 && this.papers.length === 1) {
|
|
|
+ this.setPage({ current: this.page.current - 1 });
|
|
|
+ this.curPaperIndex = this.page.size;
|
|
|
+ }
|
|
|
+
|
|
|
+ await this.getList();
|
|
|
+ if (!this.papers.length) this.$refs.SimpleImagePreview.cancel();
|
|
|
+ this.selectPaper(this.curPaperIndex);
|
|
|
+ },
|
|
|
+ async gradingCurPaper({ selectedLevel }) {
|
|
|
+ await paperSelectLevelOrScore(
|
|
|
+ this.curPaper.id, // is taskId
|
|
|
+ selectedLevel,
|
|
|
+ "LEVEL"
|
|
|
+ );
|
|
|
+ this.updateStepLevel(this.curStep, "shiftScore");
|
|
|
+ this.toActionNextPaper();
|
|
|
+ },
|
|
|
+ async scoreCurPaper(info) {
|
|
|
+ const paper = await paperSelectLevelOrScore(
|
|
|
+ this.curPaper.id, // is taskId
|
|
|
+ info.score,
|
|
|
+ "SCORE",
|
|
|
+ info.manualScore
|
|
|
+ );
|
|
|
+ if (!paper) return;
|
|
|
+ if (this.carouselType) {
|
|
|
+ this.$refs.CarouselPapersPreview.cancel();
|
|
|
+ this.$refs.MarkerHistory.updatePapers();
|
|
|
+ } else {
|
|
|
+ this.updateStepLevel(this.curStep, this.curPaper.level);
|
|
|
+ this.toActionNextPaper();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async passCurPaper(level) {
|
|
|
+ await paperTaskPass(this.curPaper.id);
|
|
|
+ this.toActionNextPaper();
|
|
|
+ },
|
|
|
+ // paper carousel
|
|
|
+ toViewCarouselPaper(paperIndex, papers) {
|
|
|
+ this.isFullscreenMarking = true;
|
|
|
+ this.carouselPapers = papers;
|
|
|
+ this.selectCarouselPaper(paperIndex);
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.CarouselPapersPreview.open();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ selectCarouselPaper(index) {
|
|
|
+ this.curCarouselPaperIndex = index;
|
|
|
+ this.curPaper = { ...this.carouselPapers[index] };
|
|
|
+ },
|
|
|
+ toCarousePaper(type) {
|
|
|
+ if (type === "prev" && this.curCarouselPaperIndex > 0) {
|
|
|
+ this.curCarouselPaperIndex--;
|
|
|
+ } else if (
|
|
|
+ type === "next" &&
|
|
|
+ this.curCarouselPaperIndex < this.carouselPapers.length - 1
|
|
|
+ ) {
|
|
|
+ this.curCarouselPaperIndex++;
|
|
|
+ }
|
|
|
+ this.selectCarouselPaper(this.curCarouselPaperIndex);
|
|
|
+ },
|
|
|
+ carouseImagePreviewClose() {
|
|
|
+ this.isFullscreenMarking = false;
|
|
|
+ this.selectPaper(this.curPaperIndex);
|
|
|
+ },
|
|
|
+ // header
|
|
|
+ toHistory() {
|
|
|
+ this.$refs.MarkerHistory.open();
|
|
|
+ },
|
|
|
+ toStatistics() {
|
|
|
+ this.$refs.MarkerStatistics.open();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ beforeDestroy() {
|
|
|
+ this.clearState();
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|