zhangjie 1 år sedan
förälder
incheckning
bfd7fcc22e

+ 1 - 1
src/modules/exam/components/WaitTaskStmms.vue

@@ -142,7 +142,7 @@ import { stmmsTaskListPage } from "../api";
 import { examBindMarkLeader, examTransferUser } from "../../stmms/api";
 import UploadPaperAnswerDialog from "../../stmms/components/UploadPaperAnswerDialog";
 import ModifyMarkParams from "../../stmms/components/markParam/ModifyMarkParams";
-import ModifyObjectiveAnswer from "../../stmms/components/markParam/ModifyObjectiveAnswer.vue";
+import ModifyObjectiveAnswer from "../../stmms/components/markParam/MarkParamObjectiveAnswer.vue";
 import SelectTypeUser from "../../stmms/components/SelectTypeUser.vue";
 import SelectTransferUser from "../../stmms/components/SelectTransferUser.vue";
 

+ 10 - 46
src/modules/stmms/components/markParam/MarkPaperMarker.vue → src/modules/stmms/components/markParam/MarkPaperGroup.vue

@@ -12,34 +12,20 @@
         >道主观题,还有<span class="mlr-1">{{
           subjectiveQuestionCount - groupQuestionCount
         }}</span
-        >道主观题未设置评卷员,请继续设置,确保全部主观题均已分配评卷员
+        >道主观题未设置分组,请继续设置,确保全部主观题均已设置分组
       </p>
       <p class="marker-desc color-success" v-else>
         本试卷共<span class="mlr-1">{{ questionCount }}</span
         >道小题,客观题<span class="mlr-1">{{ objectiveQuestionCount }}</span
         >道,主观题<span class="mlr-1">{{ subjectiveQuestionCount }}</span
-        >道,主观题已全部设置评卷员
+        >道,主观题已全部设置分组
       </p>
-      <el-button v-if="!onlyMarker" type="primary" @click="toAdd"
-        >新增</el-button
-      >
+      <el-button type="primary" @click="toAdd">新增</el-button>
     </div>
 
     <el-table :data="groupInfo" border>
       <el-table-column type="index" width="50"> </el-table-column>
-      <el-table-column label="评卷员">
-        <template slot-scope="scope">
-          <el-tag
-            v-for="user in scope.row.markerList"
-            :key="user.id"
-            class="tag-spin"
-            size="medium"
-          >
-            {{ user.name }}({{ user.orgName }})
-          </el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column v-if="!onlyMarker" label="评卷方式">
+      <el-table-column label="评卷方式">
         <template slot-scope="scope">
           <el-radio-group v-model="scope.row.doubleRate">
             <el-radio
@@ -69,12 +55,7 @@
           {{ scope.row.questions | questionsFilter }}
         </template>
       </el-table-column>
-      <el-table-column
-        v-if="!onlyMarker"
-        label="评卷区"
-        width="80"
-        align="center"
-      >
+      <el-table-column label="评卷区" width="80" align="center">
         <template slot-scope="scope">
           <i
             v-if="scope.row.pictureConfigList.length"
@@ -128,9 +109,9 @@
 </template>
 
 <script>
-import ModifyMarkerQuestion from "./ModifyMarkerQuestion";
+import ModifyMarkerQuestion from "./ModifyMarkerQuestion.vue";
 import ModifyMarkArea from "./ModifyMarkArea.vue";
-import { examStructureFindJpg, examBindMarker } from "../../api";
+import { examStructureFindJpg } from "../../api";
 import { cardDetail } from "../../../card/api";
 
 export default {
@@ -147,10 +128,6 @@ export default {
         };
       },
     },
-    onlyMarker: {
-      type: Boolean,
-      default: false,
-    },
   },
   data() {
     return {
@@ -179,10 +156,8 @@ export default {
   },
   mounted() {
     this.initData();
-    if (!this.onlyMarker) {
-      this.getPaperList();
-      this.getCardPages();
-    }
+    this.getPaperList();
+    this.getCardPages();
   },
   methods: {
     async getPaperList() {
@@ -288,10 +263,6 @@ export default {
       }
       this.updateDisableQuestionIds();
       this.updateGroupNumber();
-
-      if (this.onlyMarker) {
-        this.updateGroupMarker(row);
-      }
     },
     autoParsePictureConfigList(questions) {
       if (!questions.length) return [];
@@ -376,13 +347,6 @@ export default {
 
       return combinePictureConfigList;
     },
-    async updateGroupMarker(group) {
-      console.log(group);
-      await examBindMarker({
-        paperStructureId: this.datas.basicPaperInfo.id,
-        groupInfo: group,
-      });
-    },
     areaModified(row) {
       const pos = this.groupInfo.findIndex((item) => item.id === row.id);
       if (pos === -1) return;
@@ -392,7 +356,7 @@ export default {
       let errorMessages = [];
 
       if (this.subjectiveQuestionCount > this.groupQuestionCount) {
-        errorMessages.push("当前还有题目未设置评卷员");
+        errorMessages.push("当前还有题目未设置分组");
       }
 
       this.groupInfo.forEach((item, index) => {

+ 196 - 0
src/modules/stmms/components/markParam/MarkParamMarker.vue

@@ -0,0 +1,196 @@
+<template>
+  <div class="mark-paper-marker">
+    <div class="marker-header">
+      <p
+        class="marker-desc color-danger"
+        v-if="subjectiveQuestionCount > groupQuestionCount"
+      >
+        本试卷共<span class="mlr-1">{{ questionCount }}</span
+        >道小题,客观题<span class="mlr-1">{{ objectiveQuestionCount }}</span
+        >道,主观题<span class="mlr-1">{{ subjectiveQuestionCount }}</span
+        >道,已经设置<span class="mlr-1">{{ groupQuestionCount }}</span
+        >道主观题,还有<span class="mlr-1">{{
+          subjectiveQuestionCount - groupQuestionCount
+        }}</span
+        >道主观题未设置评卷员,请继续设置,确保全部主观题均已分配评卷员!
+      </p>
+      <p class="marker-desc color-success" v-else>
+        本试卷共<span class="mlr-1">{{ questionCount }}</span
+        >道小题,客观题<span class="mlr-1">{{ objectiveQuestionCount }}</span
+        >道,主观题<span class="mlr-1">{{ subjectiveQuestionCount }}</span
+        >道,主观题已全部设置评卷员!
+      </p>
+    </div>
+
+    <el-table :data="groupInfo" border>
+      <el-table-column type="index" width="50"> </el-table-column>
+      <el-table-column label="评卷员">
+        <template slot-scope="scope">
+          <el-tag
+            v-for="user in scope.row.markerList"
+            :key="user.id"
+            class="tag-spin"
+            size="medium"
+          >
+            {{ user.name }}({{ user.orgName }})
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="评卷方式">
+        <template slot-scope="scope">
+          <span>{{ MARK_TYPE[scope.row.doubleRate] }}</span>
+          <span v-if="scope.row.doubleRate === 1">
+            仲裁阀值:{{ scope.row.arbitrateThreshold }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="评阅题目">
+        <template slot-scope="scope">
+          {{ scope.row.questions | questionsFilter }}
+        </template>
+      </el-table-column>
+      <el-table-column class-name="action-column" label="操作" width="160px">
+        <template slot-scope="scope">
+          <el-button class="btn-primary" type="text" @click="toEdit(scope.row)"
+            >编辑</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="text-center">
+      <!-- <el-button type="success" :disabled="loading" @click="submit"
+        >提交</el-button
+      > -->
+      <el-button @click="cancel">取消</el-button>
+    </div>
+
+    <!-- ModifyMarkerQuestion -->
+    <modify-marker-question
+      ref="ModifyMarkerQuestion"
+      :course-code="datas.basicPaperInfo.courseCode"
+      :instance="curGroupInfo"
+      :disabled-question-ids="disabledQuestionIds"
+      :paper-structure="subjectiveQuestionList"
+      :can-select-question="false"
+      @modified="groupModified"
+    ></modify-marker-question>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations } from "vuex";
+import ModifyMarkerQuestion from "./ModifyMarkerQuestion";
+import { examBindMarker } from "../../api";
+
+export default {
+  name: "mark-paper-marker",
+  components: { ModifyMarkerQuestion },
+  data() {
+    return {
+      questionCount: 0,
+      groupQuestionCount: 0,
+      groupInfo: [],
+      disabledQuestionIds: [],
+      curGroupInfo: {},
+      subjectiveQuestionList: [],
+      subjectiveQuestionCount: 0,
+      objectiveQuestionCount: 0,
+      MARK_TYPE: {
+        0: "单评",
+        1: "双评",
+      },
+      paperList: [],
+      cardPages: [],
+    };
+  },
+  filters: {
+    questionsFilter(val) {
+      return val
+        .map((item) => `${item.mainNumber}-${item.subNumber}`)
+        .join(",");
+    },
+  },
+  computed: {
+    ...mapState("markParam", ["markParamInfos"]),
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    ...mapMutations("markParam", ["setMarkParamInfos"]),
+    initData() {
+      this.groupInfo = this.markParamInfos.groupInfo.map((item, index) => {
+        return { ...item, groupNumber: index + 1 };
+      });
+      this.questionCount = this.markParamInfos.paperStructureInfo.length;
+      this.updateDisableQuestionIds();
+
+      this.subjectiveQuestionList =
+        this.markParamInfos.paperStructureInfo.filter(
+          (item) => item.qType === "subjective"
+        );
+      this.subjectiveQuestionCount = this.subjectiveQuestionList.length;
+      this.objectiveQuestionCount =
+        this.questionCount - this.subjectiveQuestionCount;
+    },
+    updateDisableQuestionIds(filterId) {
+      let groupInfo = this.groupInfo;
+      if (filterId)
+        groupInfo = this.groupInfo.filter((item) => item.id !== filterId);
+      let disabledQuestionIds = [];
+      groupInfo.forEach((item) => {
+        disabledQuestionIds = [
+          ...disabledQuestionIds,
+          ...item.questions.map((item) => item.id),
+        ];
+      });
+      this.disabledQuestionIds = disabledQuestionIds;
+      if (!filterId) this.groupQuestionCount = disabledQuestionIds.length;
+    },
+    updateGroupNumber() {
+      this.groupInfo.forEach((group, index) => {
+        group.groupNumber = index + 1;
+      });
+    },
+    toEdit(row) {
+      this.curGroupInfo = row;
+      this.updateDisableQuestionIds(row.id);
+      this.$refs.ModifyMarkerQuestion.open();
+    },
+    async groupModified(row) {
+      const pos = this.groupInfo.findIndex((item) => item.id === row.id);
+      if (pos === -1) return;
+      this.groupInfo.splice(pos, 1, row);
+
+      this.updateDisableQuestionIds();
+      this.updateGroupNumber();
+      await this.updateGroupMarker(row);
+
+      this.setMarkParamInfos({ groupInfo: this.groupInfo });
+    },
+    async updateGroupMarker(group) {
+      console.log(group);
+      await examBindMarker({
+        paperStructureId: this.datas.basicPaperInfo.id,
+        groupInfo: group,
+      });
+    },
+    checkData() {
+      let errorMessages = [];
+
+      if (this.subjectiveQuestionCount > this.groupQuestionCount) {
+        errorMessages.push("当前还有题目未设置评卷员");
+      }
+
+      if (errorMessages.length) {
+        this.$message.error(errorMessages.join("。"));
+        return;
+      }
+    },
+    cancel() {
+      this.$emit("cancel");
+    },
+  },
+};
+</script>

+ 13 - 0
src/modules/stmms/components/markParam/MarkParamMarkerLeader.vue

@@ -0,0 +1,13 @@
+<template>
+  <div class="mark-param-marker-leader">mark-param-marker-leader</div>
+</template>
+
+<script>
+export default {
+  name: "mark-param-marker-leader",
+  data() {
+    return {};
+  },
+  methods: {},
+};
+</script>

+ 31 - 45
src/modules/stmms/components/markParam/ModifyObjectiveAnswer.vue → src/modules/stmms/components/markParam/MarkParamObjectiveAnswer.vue

@@ -1,28 +1,5 @@
 <template>
-  <el-dialog
-    class="modify-objective-answer modify-mark-params"
-    :visible.sync="modalIsShow"
-    top="0"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    :show-close="false"
-    append-to-body
-    fullscreen
-    destroy-on-close
-    @open="visibleChange"
-  >
-    <div class="box-justify" slot="title">
-      <h2 class="el-dialog__title">
-        设置客观题标答
-        <span>-{{ instance.courseName }}({{ instance.courseCode }})</span>
-      </h2>
-      <div>
-        <el-button type="success" :disabled="isSubmit" @click="submit"
-          >确定</el-button
-        >
-        <el-button @click="cancel">取消</el-button>
-      </div>
-    </div>
+  <div class="mark-param-objective-answer">
     <p class="tips-info mb-1">
       <i class="el-icon-warning"></i> 客观题标答只能输入大写字母ABCDE...
       ,判断题正确请输入A,错误输入B
@@ -103,13 +80,20 @@
       </el-table-column>
     </el-table>
 
-    <div slot="footer"></div>
-  </el-dialog>
+    <div class="text-center">
+      <el-button type="success" :disabled="loading" @click="submit"
+        >提交</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </div>
 </template>
 
 <script>
 import { QUESTION_SCORE_TYPE } from "@/constants/enumerate";
 import { updateObjectiveAnswer } from "../../api";
+import { mapState, mapMutations } from "vuex";
+import { deepCopy } from "@/plugins/utils";
 
 export default {
   name: "modify-objective-answer",
@@ -123,18 +107,26 @@ export default {
   },
   data() {
     return {
-      modalIsShow: false,
-      isSubmit: false,
+      loading: false,
       tableData: [],
       QUESTION_SCORE_TYPE,
       abc: "abcdefghijklmnopqrstuvwxyz".toUpperCase(),
     };
   },
+  computed: {
+    ...mapState("markParam", ["objectiveStructure"]),
+  },
+  mounted() {
+    this.initData();
+  },
   methods: {
+    ...mapMutations("markParam", ["setObjectiveStructure"]),
     initData() {
-      let objectiveStructure = JSON.parse(
-        this.instance.objectiveStructure || "[]"
-      );
+      let objectiveStructure = this.objectiveStructure.length
+        ? deepCopy(this.objectiveStructure)
+        : [];
+      if (!objectiveStructure.length) return;
+
       objectiveStructure.sort((a, b) => {
         if (a.mainNumber === b.mainNumber) {
           return a.subNumber - b.subNumber;
@@ -162,15 +154,6 @@ export default {
         return nitem;
       });
     },
-    visibleChange() {
-      this.initData();
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
     getRowClassName({ row }) {
       let classNames = [];
       if (row.mainFirstSub) {
@@ -247,8 +230,8 @@ export default {
     async submit() {
       if (!this.checkData()) return;
 
-      if (this.isSubmit) return;
-      this.isSubmit = true;
+      if (this.loading) return;
+      this.loading = true;
       const datas = {
         id: this.instance.id,
         objectiveStructure: this.tableData.map((item) => {
@@ -259,12 +242,15 @@ export default {
         }),
       };
       const data = await updateObjectiveAnswer(datas).catch(() => {});
-      this.isSubmit = false;
+      this.loading = false;
       if (!data) return;
 
+      this.setObjectiveStructure(data.objectiveStructure);
       this.$message.success("编辑成功!");
-      this.$emit("modified");
-      this.cancel();
+      this.$emit("confirm");
+    },
+    cancel() {
+      this.$emit("cancel");
     },
   },
 };

+ 345 - 0
src/modules/stmms/components/markParam/MarkParamStructure.vue

@@ -0,0 +1,345 @@
+<template>
+  <div class="mark-param-structure">
+    <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>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations } from "vuex";
+
+import MarkPaperGroup from "./MarkPaperGroup.vue";
+import MarkPaperStructure from "./MarkPaperStructure.vue";
+// import paramData from "./paramData";
+import { examStructureSubmit } from "../../api";
+import { calcSum, deepCopy } from "@/plugins/utils";
+
+const STEPS_LIST = [
+  {
+    name: "structure",
+    title: "试卷结构",
+    desc: "请按试卷填写相应试卷结构信息",
+  },
+  {
+    name: "group",
+    title: "评卷分组",
+    desc: "请设置评卷分组",
+  },
+];
+
+export default {
+  name: "mark-paper-structure",
+  components: { MarkPaperGroup, MarkPaperStructure },
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      infos: {
+        basicPaperInfo: {},
+        paperStructureInfo: [],
+        groupInfo: [],
+        paperStat: {},
+        structureCanEdit: true,
+      },
+      // step
+      steps: STEPS_LIST,
+      current: 0,
+      loading: false,
+      dataReady: false,
+    };
+  },
+  computed: {
+    ...mapState("markParam", ["markParamInfos"]),
+    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;
+    },
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    ...mapMutations("markParam", ["setMarkParamInfos"]),
+    async initData() {
+      this.current = 0;
+      this.loading = false;
+      const {
+        structureCanEdit,
+        paperStructureInfo,
+        groupInfo,
+        basicPaperInfo,
+      } = this.markParamInfos;
+
+      this.infos = {
+        structureCanEdit,
+        paperStructureInfo: deepCopy(paperStructureInfo),
+        groupInfo: deepCopy(groupInfo),
+        basicPaperInfo: deepCopy(basicPaperInfo),
+        paperStat: this.statPaperStructure(paperStructureInfo),
+      };
+      this.dataReady = true;
+    },
+    getQuestionType(topic) {
+      // const questionType = {
+      //   1: "SINGLE_ANSWER_QUESTION",
+      //   2: "MULTIPLE_ANSWER_QUESTION",
+      //   3: "BOOL_ANSWER_QUESTION",
+      //   4: "FILL_BLANK_QUESTION",
+      //   5: "TEXT_ANSWER_QUESTION",
+      // };
+      if (topic.type === "COMPOSITION" || topic.type === "EXPLAIN") {
+        return {
+          type: 5,
+          typeName: "解答题",
+          qType: "subjective",
+        };
+      }
+      if (topic.type === "FILL_LINE") {
+        return {
+          type: 4,
+          typeName: "填空题",
+          qType: "subjective",
+        };
+      }
+      if (topic.type === "FILL_QUESTION") {
+        if (topic.isBoolean)
+          return {
+            type: 3,
+            typeName: "判断题",
+            qType: "objective",
+          };
+        if (topic.isMultiply)
+          return {
+            type: 2,
+            typeName: "多选题",
+            qType: "objective",
+          };
+        return {
+          type: 1,
+          typeName: "单选题",
+          qType: "objective",
+        };
+      }
+      return;
+    },
+    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,
+      };
+    },
+    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;
+    },
+    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;
+      const datas = {
+        structureCanEdit: this.infos.structureCanEdit,
+        basicPaperInfo: 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.setMarkParamInfos(this.infos);
+      this.$message.success("提交成功!");
+      this.$emit("confirm");
+    },
+    cancel() {
+      this.$emit("cancel");
+    },
+  },
+};
+</script>

+ 84 - 0
src/modules/stmms/components/markParam/MarkParamUploadAnswer.vue

@@ -0,0 +1,84 @@
+<template>
+  <div class="mark-param-upload-answer">
+    <el-form ref="modalFormComp" :model="infos" label-width="50px">
+      <div class="part-box">
+        <h3 class="mb-2">卷型{{ instance.paperType }}</h3>
+        <el-form-item prop="file" label="标答:">
+          <select-file
+            :format="fileFormat"
+            :disabled="loading"
+            @file-change="fileChange"
+          ></select-file>
+        </el-form-item>
+      </div>
+    </el-form>
+    <div class="text-center">
+      <el-button type="primary" :disabled="loading" @click="submit"
+        >确认</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { examStructureUploadAnswer } from "../api";
+import SelectFile from "./SelectFile.vue";
+
+export default {
+  name: "mark-param-upload-answer",
+  components: { SelectFile },
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      loading: false,
+      infos: { file: null, md5: null, errorMsg: null },
+      fileFormat: ["pdf"],
+    };
+  },
+  methods: {
+    fileChange(data) {
+      if (data.errorMsg) {
+        this.infos.file = null;
+        this.infos.md5 = null;
+        this.infos.errorMsg = data.errorMsg;
+      } else {
+        this.infos.file = data.file;
+        this.infos.md5 = data.md5;
+        this.infos.errorMsg = null;
+      }
+    },
+    async submit() {
+      if (!this.infos.file) {
+        this.$message.error("请选择标答文件");
+        return;
+      }
+
+      if (this.loading) return;
+      this.loading = true;
+
+      let formData = new FormData();
+      formData.append("id", this.instance.id);
+      formData.append(`file`, this.infos.file);
+      formData.append(`md5`, this.infos.md5);
+      const data = await examStructureUploadAnswer(formData).catch(() => {});
+      this.loading = false;
+      if (!data) return;
+
+      this.$message.success("上传成功!");
+      this.$emit("confirm");
+    },
+    cancel() {
+      this.$emit("cancel");
+    },
+  },
+};
+</script>

+ 108 - 320
src/modules/stmms/components/markParam/ModifyMarkParams.vue

@@ -9,83 +9,50 @@
     append-to-body
     fullscreen
     :before-close="beforeClose"
-    @open="visibleChange"
+    @open="initData"
   >
-    <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="mb-4 tab-btns">
+      <el-button
+        v-for="tab in tabs"
+        :key="tab.val"
+        size="medium"
+        :type="curTab == tab.val ? 'primary' : 'default'"
+        @click="selectMenu(tab.val)"
+        >{{ tab.name }}
+      </el-button>
+    </div>
 
-    <div class="mark-body" v-if="dataReady">
+    <div v-if="dataReady" class="mark-body">
       <component
         :is="currentComponent"
-        :ref="currentComponent"
-        :datas="infos"
-        @next-step="toNext"
-        @on-ready="compReady"
-        @data-change="dataChange"
+        def="MarkParamRef"
+        :instance="instance"
+        @cancel="cancel"
+        @confirm="confirm"
       ></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 { mapMutations } from "vuex";
+import MarkParamStructure from "./MarkParamStructure.vue";
+import MarkParamMarker from "./MarkParamMarker.vue";
+import MarkParamMarkerLeader from "./MarkParamMarkerLeader.vue";
+import MarkParamObjectiveAnswer from "./MarkParamObjectiveAnswer.vue";
+import MarkParamUploadAnswer from "./MarkParamUploadAnswer.vue";
 import { cardDetail } from "../../../card/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 },
+  components: {
+    MarkParamStructure,
+    MarkParamMarker,
+    MarkParamMarkerLeader,
+    MarkParamObjectiveAnswer,
+    MarkParamUploadAnswer,
+  },
   props: {
     instance: {
       type: Object,
@@ -97,22 +64,37 @@ export default {
   data() {
     return {
       modalIsShow: false,
-      infos: {
-        basicPaperInfo: {},
-        paperStructureInfo: [],
-        groupInfo: [],
-        paperStat: {},
-      },
+      dataReady: false,
       // step
-      steps: STEPS_LIST,
+      curTab: "structure",
+      tabs: [
+        {
+          name: "设置试卷结构及分组",
+          val: "structure",
+        },
+        {
+          name: "设置评卷员",
+          val: "marker",
+        },
+        {
+          name: "设置科组长",
+          val: "marker-leader",
+        },
+        {
+          name: "设置客观题标答",
+          val: "objective-answer",
+        },
+        {
+          name: "上传标答文件",
+          val: "upload-answer",
+        },
+      ],
       current: 0,
-      loading: false,
-      dataReady: false,
     };
   },
   computed: {
     currentComponent() {
-      return `mark-paper-${this.steps[this.current].name}`;
+      return `mark-param-${this.tabs[this.current].name}`;
     },
     isFirstStep() {
       return this.current === 0;
@@ -121,54 +103,72 @@ export default {
       return this.current === this.lastStep;
     },
     lastStep() {
-      return this.steps.length - 1;
+      return this.tabs.length - 1;
     },
   },
   methods: {
-    async visibleChange() {
-      this.current = 0;
-      this.loading = false;
+    ...mapMutations("markParam", [
+      "setMarkParamInfos",
+      "setObjectiveStructure",
+      "initStore",
+    ]),
+    async initData() {
+      this.initStore();
 
       if (this.instance.paperInfoJson) {
         const { paperStructureInfo, groupInfo, structureCanEdit } = JSON.parse(
           this.instance.paperInfoJson
         );
-        this.infos = {
+        const infos = {
           structureCanEdit,
           paperStructureInfo: [
             ...paperStructureInfo.objectiveQuestionList,
             ...paperStructureInfo.subjectiveQuestionList,
           ],
           groupInfo,
-          basicPaperInfo: { ...this.instance },
+          basicPaperInfo: this.getBaseInfo(this.instance),
         };
-        this.infos.paperStat = this.statPaperStructure(
-          this.infos.paperStructureInfo
-        );
-        this.dataReady = true;
-        return;
+        this.setMarkParamInfos(infos);
+      } else {
+        const detData = await cardDetail(this.instance.cardId);
+        const cardContent = JSON.parse(detData.content);
+        let infos = {};
+        if (
+          (detData.type === "GENERIC" && detData.createMethod === "STANDARD") ||
+          detData.type === "CUSTOM"
+        ) {
+          infos.structureCanEdit = false;
+          infos.paperStructureInfo = this.parsePaperStructureFromCard(
+            cardContent.pages
+          );
+        }
+        this.setMarkParamInfos(infos);
       }
 
-      const detData = await cardDetail(this.instance.cardId);
-      const cardContent = JSON.parse(detData.content);
-      this.infos = {
-        structureCanEdit: true,
-        paperStructureInfo: [],
-        groupInfo: [],
-        basicPaperInfo: { ...this.instance },
-        paperStat: this.statPaperStructure([]),
-      };
-      if (
-        (detData.type === "GENERIC" && detData.createMethod === "STANDARD") ||
-        detData.type === "CUSTOM"
-      ) {
-        this.infos.structureCanEdit = false;
-        this.infos.paperStructureInfo = this.parsePaperStructureFromCard(
-          cardContent.pages
-        );
-      }
+      const objectiveStructure = JSON.parse(
+        this.instance.objectiveStructure || "[]"
+      );
+      this.setObjectiveStructure(objectiveStructure);
+
       this.dataReady = true;
     },
+    getBaseInfo(baseInfo) {
+      return this.$objAssign(
+        {
+          examPaperStructureId: baseInfo.id,
+          examId: null,
+          thirdRelateId: null,
+          thirdRelateName: "",
+          courseName: "",
+          courseCode: "",
+          paperNumber: null,
+          paperType: "",
+          sequence: null,
+          status: "",
+        },
+        baseInfo
+      );
+    },
     parsePaperStructureFromCard(pages) {
       let structData = [];
       let curTopicId = 0;
@@ -211,7 +211,7 @@ export default {
           });
         });
       });
-      console.log(structData);
+      // console.log(structData);
       let structure = [];
       let mainIds = {};
       structData.forEach((struct) => {
@@ -249,65 +249,9 @@ export default {
       });
       return structure;
     },
-    getQuestionType(topic) {
-      // const questionType = {
-      //   1: "SINGLE_ANSWER_QUESTION",
-      //   2: "MULTIPLE_ANSWER_QUESTION",
-      //   3: "BOOL_ANSWER_QUESTION",
-      //   4: "FILL_BLANK_QUESTION",
-      //   5: "TEXT_ANSWER_QUESTION",
-      // };
-      if (topic.type === "COMPOSITION" || topic.type === "EXPLAIN") {
-        return {
-          type: 5,
-          typeName: "解答题",
-          qType: "subjective",
-        };
-      }
-      if (topic.type === "FILL_LINE") {
-        return {
-          type: 4,
-          typeName: "填空题",
-          qType: "subjective",
-        };
-      }
-      if (topic.type === "FILL_QUESTION") {
-        if (topic.isBoolean)
-          return {
-            type: 3,
-            typeName: "判断题",
-            qType: "objective",
-          };
-        if (topic.isMultiply)
-          return {
-            type: 2,
-            typeName: "多选题",
-            qType: "objective",
-          };
-        return {
-          type: 1,
-          typeName: "单选题",
-          qType: "objective",
-        };
-      }
-      return;
-    },
-    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,
-      };
+    selectMenu(val) {
+      this.curTab = val;
+      this.current = this.tabs.findIndex((item) => item.val === val);
     },
     async cancel() {
       const res = await this.$confirm("确定要退出阅卷参数编辑吗?", "提示", {
@@ -316,7 +260,6 @@ export default {
       if (res !== "confirm") return;
 
       this.modalIsShow = false;
-      this.dataReady = false;
     },
     open() {
       this.modalIsShow = true;
@@ -330,164 +273,9 @@ export default {
       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;
-      const datas = {
-        structureCanEdit: this.infos.structureCanEdit,
-        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;
+    confirm() {
+      if (this.isLastStep) return;
+      this.selectMenu(this.tabs[this.current + 1]);
     },
   },
 };

+ 27 - 10
src/modules/stmms/components/markParam/ModifyMarkerQuestion.vue

@@ -100,7 +100,11 @@
                   <div class="struct-header box-justify">
                     <h4>{{ mainItem.mainNumber }}、{{ mainItem.mainTitle }}</h4>
                     <el-checkbox
-                      v-if="mainItem.children && mainItem.children.length"
+                      v-if="
+                        canSelectQuestion &&
+                        mainItem.children &&
+                        mainItem.children.length
+                      "
                       v-model="mainItem.selected"
                       title="全选"
                       @change="
@@ -112,15 +116,24 @@
                     v-if="mainItem.children && mainItem.children.length"
                     class="struct-questions"
                   >
-                    <el-checkbox
-                      v-for="question in mainItem.children"
-                      :key="question.id"
-                      v-model="question.selected"
-                      :disabled="question.disabled"
-                      @change="questionChange"
-                    >
-                      {{ question.subNumber }}
-                    </el-checkbox>
+                    <template v-if="canSelectQuestion">
+                      <el-checkbox
+                        v-for="question in mainItem.children"
+                        :key="question.id"
+                        v-model="question.selected"
+                        :disabled="question.disabled"
+                        @change="questionChange"
+                      >
+                        {{ question.subNumber }}
+                      </el-checkbox>
+                    </template>
+                    <template v-else>
+                      <template v-for="question in mainItem.children">
+                        <el-tag v-if="question.selected" :key="question.id">{{
+                          question.subNumber
+                        }}</el-tag>
+                      </template>
+                    </template>
                   </div>
                 </div>
               </div>
@@ -168,6 +181,10 @@ export default {
       type: String,
       default: "",
     },
+    canSelectQuestion: {
+      type: Boolean,
+      default: true,
+    },
   },
   data() {
     const usersValidator = (rule, value, callback) => {

+ 1 - 1
src/modules/stmms/components/markParam/ModifyPaperMarker.vue

@@ -24,7 +24,7 @@
 </template>
 
 <script>
-import MarkPaperMarker from "./MarkPaperMarker.vue";
+import MarkPaperMarker from "./MarkParamMarker.vue";
 // import paramData from "./paramData";
 import { calcSum } from "@/plugins/utils";
 

+ 39 - 0
src/modules/stmms/components/markParam/store.js

@@ -0,0 +1,39 @@
+import { deepCopy } from "@/plugins/utils";
+
+const state = {
+  markParamInfos: {
+    basicPaperInfo: {},
+    groupInfo: [],
+    paperStructureInfo: [],
+    structureCanEdit: false,
+  },
+  objectiveStructure: [],
+};
+
+const mutations = {
+  setMarkParamInfos(state, data) {
+    state.markParamInfos = Object.assign(
+      {},
+      state.markParamInfos,
+      deepCopy(data)
+    );
+  },
+  setObjectiveStructure(state, objectiveStructure) {
+    state.objectiveStructure = objectiveStructure;
+  },
+  initStore(state) {
+    state.markParamInfos = {
+      basicPaperInfo: {},
+      groupInfo: [],
+      paperStructureInfo: [],
+      structureCanEdit: false,
+    };
+    state.objectiveStructure = [];
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+};

+ 0 - 67
src/modules/stmms/views/UploadStructure.vue

@@ -82,33 +82,6 @@
               @click="toSetParams(scope.row)"
               >评卷参数设置</el-button
             >
-            <el-button
-              class="btn-primary"
-              type="text"
-              :disabled="
-                !scope.row.paperInfoJson || scope.row.taskStatus === 'RUNNING'
-              "
-              @click="toSetAnswer(scope.row)"
-              >设置客观题标答</el-button
-            >
-            <el-button
-              class="btn-primary"
-              type="text"
-              :disabled="
-                !scope.row.paperInfoJson || scope.row.taskStatus === 'RUNNING'
-              "
-              @click="toBindMarkLeader(scope.row)"
-              >绑定科组长</el-button
-            >
-            <el-button
-              class="btn-primary"
-              type="text"
-              :disabled="
-                !scope.row.paperInfoJson || scope.row.taskStatus === 'RUNNING'
-              "
-              @click="toBindMarker(scope.row)"
-              >绑定评卷员</el-button
-            >
             <el-button
               v-if="checkPrivilege('link', 'transfer')"
               class="btn-primary"
@@ -116,14 +89,6 @@
               @click="toTransfer(scope.row)"
               >{{ scope.row.transferId ? "打回" : "转办" }}</el-button
             >
-            <el-button
-              v-if="checkPrivilege('link', 'Upload')"
-              class="btn-primary"
-              type="text"
-              :disabled="scope.row.taskStatus === 'RUNNING'"
-              @click="toUpload(scope.row)"
-              >上传标答文件</el-button
-            >
             <el-button
               v-if="checkPrivilege('link', 'Preview')"
               class="btn-primary"
@@ -150,35 +115,11 @@
       </div>
     </div>
 
-    <UploadPaperAnswerDialog
-      v-if="checkPrivilege('link', 'Upload')"
-      ref="UploadPaperAnswerDialog"
-      :instance="curTask"
-      @modified="delayUpdateList"
-    />
     <ModifyMarkParams
       ref="ModifyMarkParams"
       :instance="curTask"
       @modified="delayUpdateList"
     />
-    <ModifyPaperMarker
-      ref="ModifyPaperMarker"
-      :instance="curTask"
-      @close="delayUpdateList"
-    />
-    <ModifyObjectiveAnswer
-      ref="ModifyObjectiveAnswer"
-      :instance="curTask"
-      @modified="delayUpdateList"
-    />
-    <SelectTypeUser
-      ref="SelectTypeUser"
-      special-privilege="SUBJECT_HEADER"
-      dialog-title="选择科组长"
-      :user-ids="curMarkLeaders"
-      :user-limit-count="0"
-      @confirm="headerBind"
-    />
     <SelectTransferUser
       v-if="checkPrivilege('link', 'transfer')"
       ref="SelectTransferUser"
@@ -194,21 +135,13 @@ import {
   examBindMarkLeader,
   examTransferUser,
 } from "../api";
-import UploadPaperAnswerDialog from "../components/UploadPaperAnswerDialog";
 import ModifyMarkParams from "../components/markParam/ModifyMarkParams";
-import ModifyObjectiveAnswer from "../components/markParam/ModifyObjectiveAnswer.vue";
-import ModifyPaperMarker from "../components/markParam/ModifyPaperMarker.vue";
-import SelectTypeUser from "../components/SelectTypeUser.vue";
 import SelectTransferUser from "../components/SelectTransferUser.vue";
 
 export default {
   name: "upload-structure",
   components: {
-    UploadPaperAnswerDialog,
     ModifyMarkParams,
-    ModifyObjectiveAnswer,
-    SelectTypeUser,
-    ModifyPaperMarker,
     SelectTransferUser,
   },
   data() {

+ 2 - 0
src/store.js

@@ -11,6 +11,7 @@ const privilegeMap = privilegeMapData ? JSON.parse(privilegeMapData).value : {};
 import { card, free } from "./modules/card/store";
 import exam from "./modules/exam/store";
 import baseConfigs from "./modules/analysis/components/baseConfig/baseConfigsStore";
+import markParam from "./modules/stmms/components/markParam/store";
 
 export default new Vuex.Store({
   state: {
@@ -32,5 +33,6 @@ export default new Vuex.Store({
     free,
     exam,
     baseConfigs,
+    markParam,
   },
 });