Browse Source

评卷参数修改

zhangjie 1 year ago
parent
commit
2b03c14420

+ 101 - 0
src/modules/stmms/components/SelectClassByCourse.vue

@@ -0,0 +1,101 @@
+<template>
+  <el-dialog
+    class="select-class-dialog"
+    :visible.sync="modalIsShow"
+    append-to-body
+    top="20px"
+    width="600px"
+    :title="dialogTitle"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :show-close="false"
+    @opened="visibleChange"
+  >
+    <el-transfer v-model="value" :data="dataList" filterable></el-transfer>
+
+    <div class="marker-footer">
+      <el-button type="primary" @click="confirm">确认</el-button>
+      <el-button @click="cancel">取消</el-button>
+    </div>
+
+    <div slot="footer"></div>
+  </el-dialog>
+</template>
+
+<script>
+import { conditionListClazz } from "../../base/api";
+
+export default {
+  name: "modify-marker-question",
+  props: {
+    courseCode: {
+      type: String,
+      default: "",
+    },
+    selectedIds: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+    disableIds: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      dataList: [],
+      classIds: [],
+    };
+  },
+  mounted() {
+    this.getClassData();
+  },
+  methods: {
+    visibleChange() {
+      this.classIds = [...this.selectedIds];
+      this.dataList.forEach((item) => {
+        item.disabled = this.disableIds.includes(item.id);
+      });
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    // user
+    async getClassData() {
+      const data = await conditionListClazz({
+        courseCode: this.courseCode,
+      });
+      this.dataList = data.map((item) => {
+        return {
+          id: item.id,
+          key: item.id,
+          label: item.name,
+          disabled: false,
+        };
+      });
+    },
+    // confirm
+    confirm() {
+      if (!this.classIds.length) {
+        this.$message.error("请选择班级");
+        return;
+      }
+
+      const data = this.dataList.filter((item) =>
+        this.classIds.includes(item.id)
+      );
+
+      this.$emit("confirm", data);
+      this.cancel();
+    },
+  },
+};
+</script>

+ 137 - 22
src/modules/stmms/components/markParam/MarkPaperGroup.vue

@@ -1,30 +1,39 @@
 <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>
-      <el-button type="primary" @click="toAdd">新增</el-button>
+    <div class="box-justify part-box part-box-pad">
+      <div>
+        <p class="tips-info">1.请点击右上角新增按钮创建评卷分组;</p>
+        <p class="tips-info">
+          2.如果采用整卷批阅,请将全部主观题选上,然后选择评卷老师。如果采用流水阅卷,请选择试题勾选对应的评卷老师;
+        </p>
+        <p class="tips-info tips-error">3.开始阅卷后不允许删除评卷分组!</p>
+      </div>
+      <div>
+        <span
+          ><i class="el-icon-success color-success"></i>评卷参数提交成功!</span
+        >
+        <span
+          ><i class="el-icon-success color-danger"></i>
+          评卷参数同步阅卷模块失败!</span
+        >
+        <el-button type="primary" @click="toAdd">新增</el-button>
+      </div>
     </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">
           <el-radio-group v-model="scope.row.doubleRate">
@@ -82,6 +91,49 @@
       </el-table-column>
     </el-table>
 
+    <div>
+      <span>分班阅卷:</span>
+      <el-switch
+        v-model="openClassMark"
+        @change="openClassMarkChange"
+      ></el-switch>
+    </div>
+
+    <el-table v-if="openClassMark" :data="markerClassList" border>
+      <el-table-column type="index" width="50"> </el-table-column>
+      <el-table-column label="评卷员" width="120"> </el-table-column>
+      <el-table-column label="评卷员" width="120">
+        <template slot-scope="scope">
+          <el-tag class="tag-spin" size="medium">
+            {{ scope.row.marker.name }}({{ scope.row.marker.orgName }})
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="评卷班级">
+        <template slot-scope="scope">
+          <el-tag
+            v-for="item in scope.row.classList"
+            :key="item.id"
+            size="medium"
+            effect="dark"
+            type="info"
+          >
+            {{ item.label }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column class-name="action-column" label="操作" width="100">
+        <template slot-scope="scope">
+          <el-button
+            class="btn-primary"
+            type="text"
+            @click="toEditClass(scope.row)"
+            >选择班级</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
     <!-- ModifyMarkerQuestion -->
     <modify-marker-question
       ref="ModifyMarkerQuestion"
@@ -99,18 +151,25 @@
       :paper-list="paperList"
       @modified="areaModified"
     ></modify-mark-area>
+    <!-- SelectClassByCourse -->
+    <select-class-by-course
+      ref="SelectClassByCourse"
+      :course-code="datas.basicPaperInfo.courseCode"
+      @confirm="classSelected"
+    ></select-class-by-course>
   </div>
 </template>
 
 <script>
 import ModifyMarkerQuestion from "./ModifyMarkerQuestion.vue";
 import ModifyMarkArea from "./ModifyMarkArea.vue";
+import SelectClassByCourse from "../SelectClassByCourse.vue";
 import { examStructureFindJpg } from "../../api";
 import { cardDetail } from "../../../card/api";
 
 export default {
   name: "mark-paper-marker",
-  components: { ModifyMarkerQuestion, ModifyMarkArea },
+  components: { ModifyMarkerQuestion, ModifyMarkArea, SelectClassByCourse },
   props: {
     datas: {
       type: Object,
@@ -139,6 +198,13 @@ export default {
       },
       paperList: [],
       cardPages: [],
+      // 分班阅卷
+      openClassMark: false,
+      markerClassList: [],
+      curMarkClass: {},
+      selectedClassIds: [],
+      disabledClassIds: [],
+      casheMarkerClass: {},
     };
   },
   filters: {
@@ -257,6 +323,11 @@ export default {
       }
       this.updateDisableQuestionIds();
       this.updateGroupNumber();
+
+      // 分班阅卷相关
+      if (!this.openClassMark) return;
+      this.updateCasheMarkerClass();
+      this.initMarkerClassList();
     },
     autoParsePictureConfigList(questions) {
       if (!questions.length) return [];
@@ -346,6 +417,50 @@ export default {
       if (pos === -1) return;
       this.groupInfo.splice(pos, 1, row);
     },
+    // 分班阅卷 --->
+    openClassMarkChange(val) {
+      if (val) {
+        this.initMarkerClassList();
+      } else {
+        this.updateCasheMarkerClass();
+        this.markerClassList = [];
+      }
+    },
+    initMarkerClassList() {
+      let markerClassList = [];
+      this.groupInfo.forEach((group) => {
+        group.markerList.forEach((marker) => {
+          markerClassList.push({
+            marker: { ...marker },
+            classList: this.casheMarkerClass[marker.id] || [],
+          });
+        });
+      });
+      this.markerClassList = markerClassList;
+    },
+    updateCasheMarkerClass() {
+      let casheMarkerClass = {};
+      this.markerClassList.forEach((item) => {
+        casheMarkerClass[item.marker.id] = item.classList;
+      });
+      this.casheMarkerClass = casheMarkerClass;
+    },
+    toEditClass(row) {
+      this.curMarkClass = row;
+      this.selectedClassIds = row.classList.map((item) => item.id);
+      let disabledClassIds = [];
+      this.markerClassList
+        .filter((item) => item.marker.id !== row.marker.id)
+        .forEach((item) => {
+          disabledClassIds.push(...item.classList.map((item) => item.id));
+        });
+      this.disabledClassIds = disabledClassIds;
+      this.$refs.SelectClassByCourse.open();
+    },
+    classSelected(classList) {
+      this.curMarkClass.classList = classList;
+    },
+    // 分班阅卷 end --->
     checkData() {
       let errorMessages = [];
 

+ 12 - 6
src/modules/stmms/components/markParam/MarkPaperStructure.vue

@@ -1,11 +1,17 @@
 <template>
   <div class="mark-paper-structure">
-    <p class="structure-desc">
-      <span>课程名称:</span>
-      <span class="mr-4">{{ datas.basicPaperInfo.courseName }}</span>
-      <span>课程代码:</span>
-      <span>{{ datas.basicPaperInfo.courseCode }}</span>
-    </p>
+    <div class="box-justify part-box part-box-pad">
+      <div>
+        <p class="tips-info">
+          1.请确认展示的试卷结构与提交的试卷、答题卡是否一致?
+        </p>
+        <p class="tips-info">2.请补充所有题目的小题分值,并确认试卷总分!</p>
+        <p class="tips-info tips-error">
+          3.开始阅卷后不允许修改试卷结构,请确认清楚后再提交!
+        </p>
+      </div>
+    </div>
+
     <el-table
       ref="TableList"
       :data="tableData"

+ 15 - 20
src/modules/stmms/components/markParam/MarkParamMarker.vue

@@ -1,25 +1,20 @@
 <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 class="box-justify part-box part-box-pad">
+      <div>
+        <p class="tips-info">
+          1.评卷过程中需要增加评卷员,可以在需要增加分组下绑定评卷员
+        </p>
+      </div>
+      <div>
+        <span
+          ><i class="el-icon-success color-success"></i>评卷员绑定成功!</span
+        >
+        <span
+          ><i class="el-icon-success color-danger"></i>
+          评卷员同步阅卷模块失败!</span
+        >
+      </div>
     </div>
 
     <el-table :data="groupInfo" border>

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

@@ -1,5 +1,23 @@
 <template>
   <div class="mark-param-marker-leader">
+    <div class="box-justify part-box part-box-pad">
+      <div>
+        <p class="tips-info">
+          1.科组长支持查看该课程下全部学生的成绩及查看分析报告!
+        </p>
+        <p class="tips-info">2.支持绑定多个科组长!</p>
+      </div>
+      <div>
+        <span
+          ><i class="el-icon-success color-success"></i>科组长绑定成功!</span
+        >
+        <span
+          ><i class="el-icon-success color-danger"></i>
+          科组长同步阅卷模块失败!</span
+        >
+      </div>
+    </div>
+
     <table class="table">
       <colgroup>
         <col />

+ 20 - 0
src/modules/stmms/components/markParam/MarkParamObjectiveAnswer.vue

@@ -1,5 +1,25 @@
 <template>
   <div class="mark-param-objective-answer">
+    <div class="box-justify part-box part-box-pad">
+      <div>
+        <p class="tips-info">1.请录入客观题标答;</p>
+        <p class="tips-info">
+          2.多选题请根据需求设置判分策略,目前支持漏选给半分,任选给半分或者不设置,不设置时表示与标答一致得分,否则不得分。
+        </p>
+      </div>
+      <div>
+        <span
+          ><i class="el-icon-success color-success"></i
+          >客观题标答提交成功!</span
+        >
+        <span
+          ><i class="el-icon-success color-danger"></i>
+          客观题标答同步阅卷模块失败!</span
+        >
+        <el-button type="primary" @click="toAdd">新增</el-button>
+      </div>
+    </div>
+
     <p class="tips-info mb-1">
       <i class="el-icon-warning"></i> 客观题标答只能输入大写字母ABCDE...
       ,判断题正确请输入A,错误输入B

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

@@ -1,20 +1,5 @@
 <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"

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

@@ -1,5 +1,25 @@
 <template>
   <div class="mark-param-upload-answer">
+    <div class="box-justify part-box part-box-pad">
+      <div>
+        <p class="tips-info">1.主观题标答请上传PDF文档;</p>
+        <p class="tips-info">
+          2.主观题标答文档上传后,在评卷界面小助手里可以打开进行查看,作为评卷参考;
+        </p>
+        <p class="tips-info">3.支持重复提交,以最后一次提交标答文件为准。</p>
+      </div>
+      <div>
+        <span
+          ><i class="el-icon-success color-success"></i
+          >主观题标答提交成功!</span
+        >
+        <span
+          ><i class="el-icon-success color-danger"></i>
+          主观题标答同步阅卷模块失败!</span
+        >
+        <el-button type="primary" @click="toAdd">新增</el-button>
+      </div>
+    </div>
     <el-form ref="modalFormComp" :model="infos" label-width="50px">
       <div class="part-box">
         <h3 class="mb-2">卷型{{ instance.paperType }}</h3>

+ 7 - 1
src/modules/stmms/components/markParam/ModifyMarkParams.vue

@@ -2,7 +2,6 @@
   <el-dialog
     class="modify-mark-params"
     :visible.sync="modalIsShow"
-    title="评卷参数设置"
     top="0"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
@@ -11,6 +10,13 @@
     :before-close="beforeClose"
     @open="initData"
   >
+    <div class="box-justify" slot="title">
+      <h2 class="el-dialog__title">评卷参数设置</h2>
+      <span
+        >课程名称:{{ instance.courseName }}({{ instance.courseCode }})</span
+      >
+    </div>
+
     <div class="mb-4 tab-btns">
       <el-button
         v-for="tab in tabs"