zhangjie 2 年 前
コミット
9f1dd1356a
1 ファイル変更361 行追加362 行削除
  1. 361 362
      src/modules/stmms/components/markParam/ModifyMarkParams.vue

+ 361 - 362
src/modules/stmms/components/markParam/ModifyMarkParams.vue

@@ -1,362 +1,361 @@
-<template>
-  <el-dialog
-    class="modify-mark-params"
-    :visible.sync="modalIsShow"
-    title="评卷参数设置"
-    top="0"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    fullscreen
-    :before-close="beforeClose"
-    @open="visibleChange"
-  >
-    <el-steps
-      class="mark-step"
-      :active="current"
-      align-center
-      finish-status="success"
-    >
-      <el-step
-        v-for="step in steps"
-        :key="step.name"
-        :title="step.title"
-        :description="step.desc"
-      >
-      </el-step>
-    </el-steps>
-
-    <div class="mark-body" v-if="dataReady">
-      <component
-        :is="currentComponent"
-        :ref="currentComponent"
-        :datas="infos"
-        @next-step="toNext"
-        @on-ready="compReady"
-        @data-change="dataChange"
-      ></component>
-    </div>
-
-    <div class="text-center">
-      <el-button
-        v-if="!isFirstStep"
-        type="primary"
-        :disabled="loading"
-        @click="prevStep"
-        >上一步</el-button
-      >
-      <el-button
-        v-if="isLastStep"
-        type="success"
-        :disabled="loading"
-        @click="nextStep"
-        >提交</el-button
-      >
-      <el-button v-else type="primary" @click="nextStep" :disabled="loading"
-        >下一步</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import MarkPaperMarker from "./MarkPaperMarker.vue";
-import MarkPaperStructure from "./MarkPaperStructure.vue";
-// import paramData from "./paramData";
-import { examStructureSubmit } from "../../api";
-import { calcSum } from "@/plugins/utils";
-
-const STEPS_LIST = [
-  {
-    name: "structure",
-    title: "试卷结构",
-    desc: "请按试卷填写相应试卷结构信息"
-  },
-  {
-    name: "marker",
-    title: "评卷员",
-    desc: "请选择评卷老师及设置对应评卷题目"
-  }
-];
-
-export default {
-  name: "modify-mark-params",
-  components: { MarkPaperMarker, MarkPaperStructure },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      }
-    }
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      infos: {
-        basicPaperInfo: {},
-        paperStructureInfo: [],
-        groupInfo: [],
-        paperStat: {}
-      },
-      // step
-      steps: STEPS_LIST,
-      current: 0,
-      loading: false,
-      dataReady: false
-    };
-  },
-  computed: {
-    currentComponent() {
-      return `mark-paper-${this.steps[this.current].name}`;
-    },
-    isFirstStep() {
-      return this.current === 0;
-    },
-    isLastStep() {
-      return this.current === this.lastStep;
-    },
-    lastStep() {
-      return this.steps.length - 1;
-    }
-  },
-  methods: {
-    visibleChange() {
-      this.current = 0;
-      this.loading = false;
-
-      if (this.instance.paperInfoJson) {
-        const { paperStructureInfo, groupInfo } = JSON.parse(
-          this.instance.paperInfoJson
-        );
-        this.infos = {
-          paperStructureInfo: [
-            ...paperStructureInfo.objectiveQuestionList,
-            ...paperStructureInfo.subjectiveQuestionList
-          ],
-          groupInfo,
-          basicPaperInfo: { ...this.instance }
-        };
-        this.infos.paperStat = this.statPaperStructure(
-          this.infos.paperStructureInfo
-        );
-      } else {
-        this.infos = {
-          paperStructureInfo: [],
-          groupInfo: [],
-          basicPaperInfo: { ...this.instance },
-          paperStat: this.statPaperStructure([])
-        };
-      }
-
-      this.dataReady = true;
-    },
-    statPaperStructure(paperStructureInfo) {
-      const questionCount = paperStructureInfo.length;
-
-      const subjectiveQuestionCount = paperStructureInfo.filter(
-        item => item.qType === "subjective"
-      ).length;
-
-      return {
-        questionCount,
-        paperTotalScore: calcSum(
-          paperStructureInfo.map(item => item.totalScore || 0)
-        ),
-        subjectiveQuestionCount,
-        objectiveQuestionCount: questionCount - subjectiveQuestionCount,
-        structChanged: false
-      };
-    },
-    async cancel() {
-      const res = await this.$confirm("确定要退出阅卷参数编辑吗?", "提示", {
-        type: "warning"
-      }).catch(() => {});
-      if (res !== "confirm") return;
-
-      this.modalIsShow = false;
-      this.dataReady = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async beforeClose(done) {
-      const res = await this.$confirm("确定要退出阅卷参数编辑吗?", "提示", {
-        type: "warning"
-      }).catch(() => {});
-      if (res !== "confirm") return;
-
-      this.dataReady = false;
-      done();
-    },
-    prevStep() {
-      if (this.isFirstStep) return;
-      this.$refs[this.currentComponent].updateData();
-      this.current -= 1;
-      if (this.steps[this.current].name === "structure") {
-        this.$notify({
-          title: "警告",
-          message: "修改试卷结构会清空已经设置的评卷员,需要重新设置!",
-          type: "warning",
-          duration: 5000
-        });
-      }
-    },
-    nextStep() {
-      this.$refs[this.currentComponent].checkData();
-    },
-    toNext() {
-      if (this.isLastStep) {
-        this.submit();
-      } else {
-        const paperStat = this.infos.paperStat;
-
-        let tipsContent = `本试卷共${paperStat.questionCount}道小题,客观题${paperStat.objectiveQuestionCount}道,主观题${paperStat.subjectiveQuestionCount}道,总分为${paperStat.paperTotalScore}分。`;
-        if (paperStat.structChanged) {
-          tipsContent += "试卷结构有变动,评卷员将被清空。";
-        }
-        if (paperStat.subjectiveQuestionCount) {
-          this.$confirm(`${tipsContent}确定要下一步吗?`, "提示", {
-            type: "warning"
-          })
-            .then(() => {
-              this.current += 1;
-            })
-            .catch(() => {});
-        } else {
-          // 没有主观题,可以直接提交,不需要设置评卷员分组
-          this.$confirm(`${tipsContent}, 是否立即提交?`, "提示", {
-            type: "warning"
-          })
-            .then(() => {
-              this.submit();
-            })
-            .catch(() => {});
-        }
-      }
-    },
-    getPaperStructData(paperStructureInfo) {
-      let originStruct = [];
-      let group = [];
-      let curMainId = null;
-      let curQType = null;
-      paperStructureInfo.forEach(item => {
-        if (curMainId !== item.mainId) {
-          curMainId = item.mainId;
-          curQType = item.qType[0];
-          if (group.length) originStruct.push(`${curQType}${group.length}`);
-          group = [];
-        }
-        group.push(item);
-      });
-      if (group.length) originStruct.push(`${curQType}${group.length}`);
-      return originStruct;
-    },
-    dataChange(data) {
-      if (data.paperStructureInfo) {
-        data.paperStat = this.statPaperStructure(data.paperStructureInfo);
-      }
-      if (data.paperStructureInfo && this.infos.paperStructureInfo.length) {
-        // 检验试卷结构是否有变化
-        const originStruct = this.getPaperStructData(
-          this.infos.paperStructureInfo
-        );
-        const curStruct = this.getPaperStructData(data.paperStructureInfo);
-        if (curStruct.join("") !== originStruct.join("")) {
-          data.groupInfo = [];
-          data.paperStat.structChanged = true;
-        } else {
-          // 更新分组中的试题信息
-          const paperMap = {};
-          data.paperStructureInfo.forEach(item => {
-            paperMap[`${item.mainNumber}-${item.subNumber}`] = item;
-          });
-          const groupInfo = this.infos.groupInfo.map(group => {
-            let ngroup = { ...group };
-            ngroup.questions = ngroup.questions.map(q => {
-              return { ...paperMap[`${q.mainNumber}-${q.subNumber}`] };
-            });
-            return ngroup;
-          });
-          data.groupInfo = groupInfo;
-        }
-      }
-
-      Object.entries(data).forEach(([key, val]) => {
-        this.infos[key] = val;
-      });
-    },
-    compReady(type = false) {
-      this.loading = type;
-    },
-    getBaseInfo(baseInfo) {
-      const data = this.$objAssign(
-        {
-          examPaperStructureId: null,
-          examId: null,
-          thirdRelateId: null,
-          thirdRelateName: "",
-          courseName: "",
-          courseCode: "",
-          paperNumber: null,
-          paperType: "",
-          sequence: null,
-          status: ""
-        },
-        baseInfo
-      );
-      data.examPaperStructureId = baseInfo.id;
-      return data;
-    },
-    async submit() {
-      if (this.loading) return;
-      const hasGroupNoPic = this.infos.groupInfo.some(
-        item => !item.pictureConfigList.length
-      );
-      if (hasGroupNoPic) {
-        const confirm = await this.$confirm(
-          `当前评卷员分组中存在没有设置评卷区的分组, 确定要提交吗?`,
-          "提示",
-          {
-            type: "warning"
-          }
-        ).catch(() => {});
-        if (confirm !== "confirm") return;
-      }
-
-      this.loading = true;
-      let subjectiveStartPos = this.infos.paperStructureInfo.findIndex(
-        item => item.qType === "subjective"
-      );
-      if (subjectiveStartPos === -1) {
-        subjectiveStartPos = this.infos.paperStructureInfo.length;
-      }
-      const datas = {
-        basicPaperInfo: this.getBaseInfo(this.infos.basicPaperInfo),
-        paperStructureInfo: {
-          objectiveQuestionList: this.infos.paperStructureInfo.slice(
-            0,
-            subjectiveStartPos
-          ),
-          subjectiveQuestionList: this.infos.paperStructureInfo.slice(
-            subjectiveStartPos
-          )
-        },
-        groupInfo: this.infos.groupInfo
-      };
-      const res = await examStructureSubmit(datas).catch(() => false);
-      this.loading = false;
-
-      if (!res) return;
-
-      this.$message.success("提交成功!");
-      this.$emit("modified");
-      this.modalIsShow = false;
-      this.dataReady = false;
-    }
-  }
-};
-</script>
+<template>
+  <el-dialog
+    class="modify-mark-params"
+    :visible.sync="modalIsShow"
+    title="评卷参数设置"
+    top="0"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    fullscreen
+    :before-close="beforeClose"
+    @open="visibleChange"
+  >
+    <el-steps
+      class="mark-step"
+      :active="current"
+      align-center
+      finish-status="success"
+    >
+      <el-step
+        v-for="step in steps"
+        :key="step.name"
+        :title="step.title"
+        :description="step.desc"
+      >
+      </el-step>
+    </el-steps>
+
+    <div class="mark-body" v-if="dataReady">
+      <component
+        :is="currentComponent"
+        :ref="currentComponent"
+        :datas="infos"
+        @next-step="toNext"
+        @on-ready="compReady"
+        @data-change="dataChange"
+      ></component>
+    </div>
+
+    <div class="text-center">
+      <el-button
+        v-if="!isFirstStep"
+        type="primary"
+        :disabled="loading"
+        @click="prevStep"
+        >上一步</el-button
+      >
+      <el-button
+        v-if="isLastStep"
+        type="success"
+        :disabled="loading"
+        @click="nextStep"
+        >提交</el-button
+      >
+      <el-button v-else type="primary" @click="nextStep" :disabled="loading"
+        >下一步</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+
+    <div slot="footer"></div>
+  </el-dialog>
+</template>
+
+<script>
+import MarkPaperMarker from "./MarkPaperMarker.vue";
+import MarkPaperStructure from "./MarkPaperStructure.vue";
+// import paramData from "./paramData";
+import { examStructureSubmit } from "../../api";
+import { calcSum } from "@/plugins/utils";
+
+const STEPS_LIST = [
+  {
+    name: "structure",
+    title: "试卷结构",
+    desc: "请按试卷填写相应试卷结构信息"
+  },
+  {
+    name: "marker",
+    title: "评卷员",
+    desc: "请选择评卷老师及设置对应评卷题目"
+  }
+];
+
+export default {
+  name: "modify-mark-params",
+  components: { MarkPaperMarker, MarkPaperStructure },
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      infos: {
+        basicPaperInfo: {},
+        paperStructureInfo: [],
+        groupInfo: [],
+        paperStat: {}
+      },
+      // step
+      steps: STEPS_LIST,
+      current: 0,
+      loading: false,
+      dataReady: false
+    };
+  },
+  computed: {
+    currentComponent() {
+      return `mark-paper-${this.steps[this.current].name}`;
+    },
+    isFirstStep() {
+      return this.current === 0;
+    },
+    isLastStep() {
+      return this.current === this.lastStep;
+    },
+    lastStep() {
+      return this.steps.length - 1;
+    }
+  },
+  methods: {
+    visibleChange() {
+      this.current = 0;
+      this.loading = false;
+
+      if (this.instance.paperInfoJson) {
+        const { paperStructureInfo, groupInfo } = JSON.parse(
+          this.instance.paperInfoJson
+        );
+        this.infos = {
+          paperStructureInfo: [
+            ...paperStructureInfo.objectiveQuestionList,
+            ...paperStructureInfo.subjectiveQuestionList
+          ],
+          groupInfo,
+          basicPaperInfo: { ...this.instance }
+        };
+        this.infos.paperStat = this.statPaperStructure(
+          this.infos.paperStructureInfo
+        );
+      } else {
+        this.infos = {
+          paperStructureInfo: [],
+          groupInfo: [],
+          basicPaperInfo: { ...this.instance },
+          paperStat: this.statPaperStructure([])
+        };
+      }
+
+      this.dataReady = true;
+    },
+    statPaperStructure(paperStructureInfo) {
+      const questionCount = paperStructureInfo.length;
+
+      const subjectiveQuestionCount = paperStructureInfo.filter(
+        item => item.qType === "subjective"
+      ).length;
+
+      return {
+        questionCount,
+        paperTotalScore: calcSum(
+          paperStructureInfo.map(item => item.totalScore || 0)
+        ),
+        subjectiveQuestionCount,
+        objectiveQuestionCount: questionCount - subjectiveQuestionCount,
+        structChanged: false
+      };
+    },
+    async cancel() {
+      const res = await this.$confirm("确定要退出阅卷参数编辑吗?", "提示", {
+        type: "warning"
+      }).catch(() => {});
+      if (res !== "confirm") return;
+
+      this.modalIsShow = false;
+      this.dataReady = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async beforeClose(done) {
+      const res = await this.$confirm("确定要退出阅卷参数编辑吗?", "提示", {
+        type: "warning"
+      }).catch(() => {});
+      if (res !== "confirm") return;
+
+      this.dataReady = false;
+      done();
+    },
+    prevStep() {
+      if (this.isFirstStep) return;
+      this.$refs[this.currentComponent].updateData();
+      this.current -= 1;
+      if (this.steps[this.current].name === "structure") {
+        this.$notify({
+          title: "警告",
+          message: "修改试卷结构会清空已经设置的评卷员,需要重新设置!",
+          type: "warning",
+          duration: 5000
+        });
+      }
+    },
+    nextStep() {
+      this.$refs[this.currentComponent].checkData();
+    },
+    toNext() {
+      if (this.isLastStep) {
+        this.submit();
+      } else {
+        const paperStat = this.infos.paperStat;
+
+        let tipsContent = `本试卷共${paperStat.questionCount}道小题,客观题${paperStat.objectiveQuestionCount}道,主观题${paperStat.subjectiveQuestionCount}道,总分为${paperStat.paperTotalScore}分。`;
+        if (paperStat.structChanged) {
+          tipsContent += "试卷结构有变动,评卷员将被清空。";
+        }
+        if (paperStat.subjectiveQuestionCount) {
+          this.$confirm(`${tipsContent}确定要下一步吗?`, "提示", {
+            type: "warning"
+          })
+            .then(() => {
+              this.current += 1;
+            })
+            .catch(() => {});
+        } else {
+          // 没有主观题,可以直接提交,不需要设置评卷员分组
+          this.$confirm(`${tipsContent}, 是否立即提交?`, "提示", {
+            type: "warning"
+          })
+            .then(() => {
+              this.submit();
+            })
+            .catch(() => {});
+        }
+      }
+    },
+    getPaperStructData(paperStructureInfo) {
+      let originStruct = [];
+      let group = [];
+      let curMainId = null;
+      let curQType = null;
+      paperStructureInfo.forEach(item => {
+        if (curMainId !== item.mainId) {
+          curMainId = item.mainId;
+          curQType = item.qType[0];
+          if (group.length) originStruct.push(`${curQType}${group.length}`);
+          group = [];
+        }
+        group.push(item);
+      });
+      if (group.length) originStruct.push(`${curQType}${group.length}`);
+      return originStruct;
+    },
+    dataChange(data) {
+      if (data.paperStructureInfo) {
+        data.paperStat = this.statPaperStructure(data.paperStructureInfo);
+      }
+      if (data.paperStructureInfo && this.infos.paperStructureInfo.length) {
+        // 检验试卷结构是否有变化
+        const originStruct = this.getPaperStructData(
+          this.infos.paperStructureInfo
+        );
+        const curStruct = this.getPaperStructData(data.paperStructureInfo);
+        if (curStruct.join("") !== originStruct.join("")) {
+          data.groupInfo = [];
+          data.paperStat.structChanged = true;
+        } else {
+          // 更新分组中的试题信息
+          const paperMap = {};
+          data.paperStructureInfo.forEach(item => {
+            paperMap[`${item.mainNumber}-${item.subNumber}`] = item;
+          });
+          const groupInfo = this.infos.groupInfo.map(group => {
+            let ngroup = { ...group };
+            ngroup.questions = ngroup.questions.map(q => {
+              return { ...paperMap[`${q.mainNumber}-${q.subNumber}`] };
+            });
+            return ngroup;
+          });
+          data.groupInfo = groupInfo;
+        }
+      }
+
+      Object.entries(data).forEach(([key, val]) => {
+        this.infos[key] = val;
+      });
+    },
+    compReady(type = false) {
+      this.loading = type;
+    },
+    getBaseInfo(baseInfo) {
+      const data = this.$objAssign(
+        {
+          examPaperStructureId: null,
+          examId: null,
+          thirdRelateId: null,
+          thirdRelateName: "",
+          courseName: "",
+          courseCode: "",
+          paperNumber: null,
+          paperType: "",
+          sequence: null,
+          status: ""
+        },
+        baseInfo
+      );
+      data.examPaperStructureId = baseInfo.id;
+      return data;
+    },
+    async submit() {
+      if (this.loading) return;
+      const hasGroupNoPic = this.infos.groupInfo.some(
+        item => !item.pictureConfigList.length
+      );
+      if (hasGroupNoPic) {
+        const confirm = await this.$confirm(
+          `当前评卷员分组中存在没有设置评卷区的分组, 确定要提交吗?`,
+          "提示",
+          {
+            type: "warning"
+          }
+        ).catch(() => {});
+        if (confirm !== "confirm") return;
+      }
+
+      this.loading = true;
+      // let subjectiveStartPos = this.infos.paperStructureInfo.findIndex(
+      //   item => item.qType === "subjective"
+      // );
+      // if (subjectiveStartPos === -1) {
+      //   subjectiveStartPos = this.infos.paperStructureInfo.length;
+      // }
+      const datas = {
+        basicPaperInfo: this.getBaseInfo(this.infos.basicPaperInfo),
+        paperStructureInfo: {
+          objectiveQuestionList: this.infos.paperStructureInfo.filter(
+            item => item.qType === "objective"
+          ),
+          subjectiveQuestionList: this.infos.paperStructureInfo.filter(
+            item => item.qType === "subjective"
+          )
+        },
+        groupInfo: this.infos.groupInfo
+      };
+      const res = await examStructureSubmit(datas).catch(() => false);
+      this.loading = false;
+
+      if (!res) return;
+
+      this.$message.success("提交成功!");
+      this.$emit("modified");
+      this.modalIsShow = false;
+      this.dataReady = false;
+    }
+  }
+};
+</script>