Эх сурвалжийг харах

评卷参数-多选和分班阅问题

zhangjie 1 жил өмнө
parent
commit
b59a26c303

+ 11 - 0
src/modules/mark/api.js

@@ -52,6 +52,17 @@ export const markClassList = (datas) => {
 export const markClassSave = (datas) => {
   return $post("/api/admin/mark/class/save", datas);
 };
+export const markClassMarkerList = (datas) => {
+  return $postParam("/api/admin/mark/class/list", datas);
+};
+export const markClassMarkerSave = (datas) => {
+  return $post("/api/admin/mark/class/save", datas);
+};
+export const examStructureClassListPage = (datas) => {
+  // examId,paperNumber
+  return $postParam("/api/admin/exam/structure/list_user_class", datas);
+};
+
 // objective question answer
 export const markObjectiveQuestionList = (datas) => {
   return $postParam("/api/admin/mark/question/objective/list", datas);

+ 1 - 1
src/modules/mark/components/markDetail/MarkDetailMarker.vue

@@ -69,7 +69,7 @@
         <el-table-column prop="courseName" label="评卷员" min-width="100">
           <template slot-scope="scope">
             <el-tag size="medium" type="info">
-              {{ scope.row.name }}({{ scope.row.orgName }})
+              {{ scope.row.name }}({{ scope.row.loginName }})
             </el-tag>
           </template>
         </el-table-column>

+ 2 - 2
src/modules/mark/components/markDetail/ModifyMarkerBind.vue

@@ -87,7 +87,7 @@
                 :disable-transitions="false"
                 @close="toDeleteUser(user)"
               >
-                {{ user.name }}({{ user.orgName }})
+                {{ user.name }}({{ user.loginName }})
               </el-tag>
             </el-form-item>
           </el-form>
@@ -270,7 +270,7 @@ export default {
           } else {
             if (item.isUser) {
               let nitem = { ...item };
-              nitem.label = `${nitem.name}(${nitem.orgName})`;
+              nitem.label = `${nitem.name}`;
               userList.push(nitem);
             }
           }

+ 161 - 0
src/modules/mark/components/markParam/MarkParamClass.marker.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="mark-param-class">
+    <div class="part-box part-box-pad">
+      <el-table :data="classList" border>
+        <el-table-column type="index" width="50"> </el-table-column>
+
+        <el-table-column label="班级" width="200">
+          <template slot-scope="scope">
+            <el-tag size="medium">
+              {{ scope.row.className }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="评阅题目" prop="groupQuestions">
+        </el-table-column>
+        <el-table-column label="评卷员">
+          <template slot-scope="scope">
+            <el-tag
+              v-for="item in scope.row.classMarkerList"
+              :key="item"
+              size="medium"
+              class="mb-1 mr-1"
+            >
+              {{ item.name }}({{ item.loginName }})
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="120">
+          <template slot-scope="scope">
+            <el-button
+              class="btn-primary"
+              type="text"
+              @click="toSelectMarker(scope.row)"
+              >选择评卷员</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <!-- 选择评卷员 -->
+    <el-dialog
+      :visible.sync="modalIsShow"
+      title="选择评卷员"
+      top="10px"
+      width="600px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      append-to-body
+    >
+      <el-form ref="modalFormComp" :model="modalForm" :rules="rules">
+        <el-form-item prop="selectedMarkerIds">
+          <el-checkbox-group v-model="modalForm.selectedMarkerIds">
+            <el-checkbox
+              v-for="mark in curClass.markerList"
+              :key="mark.userId"
+              :label="mark.userId"
+            >
+              {{ mark.name }}({{ mark.loginName }})
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button type="primary" :disabled="isSubmit" @click="conform"
+          >确认</el-button
+        >
+        <el-button @click="modalIsShow = false">取消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { markClassList, markClassSave } from "../../api";
+import { mapState } from "vuex";
+
+export default {
+  name: "mark-param-class",
+  components: {},
+  data() {
+    return {
+      classList: [],
+      curClass: {},
+      // modify
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: { selectedMarkerIds: [] },
+      rules: {
+        selectedMarkerIds: [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value.length) {
+                callback(new Error("请选择评卷员"));
+              } else {
+                callback();
+              }
+            },
+            trigger: "change",
+          },
+        ],
+      },
+    };
+  },
+  computed: {
+    ...mapState("markParam", ["basicInfo", "paperStructureInfo"]),
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      const params = {
+        examId: this.basicInfo.examId,
+        paperNumber: this.basicInfo.paperNumber,
+      };
+      const res = await markClassList(params);
+      this.classList = res || [];
+    },
+    toSelectMarker(row) {
+      this.curClass = row;
+      this.modalForm.selectedMarkerIds = row.classMarkerList.map(
+        (item) => item.userId
+      );
+      this.modalIsShow = true;
+    },
+    async conform() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      this.isSubmit = true;
+      const classMarkerList = this.curClass.markerList.filter((item) =>
+        this.modalForm.selectedMarkerIds.includes(item.userId)
+      );
+      const res = await markClassSave({
+        examId: this.basicInfo.examId,
+        paperNumber: this.basicInfo.paperNumber,
+        className: this.curClass.className,
+        groupNumber: this.curClass.groupNumber,
+        classMarkerList,
+      }).catch(() => {});
+      this.isSubmit = false;
+      if (!res) return;
+      this.$message.success("操作成功!");
+      this.curClass.classMarkerList = classMarkerList;
+      this.modalIsShow = false;
+    },
+    getData() {
+      return {
+        openClassReading: this.openClassReading,
+        classInfo: this.markerClassList.map((item) => {
+          let nitem = { ...item };
+          nitem.className = item.className.join();
+          return nitem;
+        }),
+      };
+    },
+  },
+};
+</script>

+ 38 - 97
src/modules/mark/components/markParam/MarkParamClass.vue

@@ -1,27 +1,26 @@
 <template>
   <div class="mark-param-class">
     <div class="part-box part-box-pad">
-      <el-table :data="classList" border>
+      <el-table :data="dataList" border>
         <el-table-column type="index" width="50"> </el-table-column>
 
-        <el-table-column label="班级" width="200">
+        <el-table-column label="评卷员" width="200">
           <template slot-scope="scope">
             <el-tag size="medium">
-              {{ scope.row.className }}
+              {{ scope.row.name }}({{ scope.row.loginName }})
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="评阅题目" prop="groupQuestions">
-        </el-table-column>
-        <el-table-column label="评卷员">
+        <el-table-column label="评卷班级">
           <template slot-scope="scope">
             <el-tag
-              v-for="item in scope.row.classMarkerList"
+              v-for="item in scope.row.className"
               :key="item"
               size="medium"
+              type="info"
               class="mb-1 mr-1"
             >
-              {{ item.name }}({{ item.orgName }})
+              {{ item }}
             </el-tag>
           </template>
         </el-table-column>
@@ -30,81 +29,45 @@
             <el-button
               class="btn-primary"
               type="text"
-              @click="toSelectMarker(scope.row)"
-              >选择评卷员</el-button
+              @click="toSelectClass(scope.row)"
+              >选择班级</el-button
             >
           </template>
         </el-table-column>
       </el-table>
     </div>
 
-    <!-- 选择评卷员 -->
-    <el-dialog
-      :visible.sync="modalIsShow"
-      title="选择评卷员"
-      top="10px"
-      width="600px"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-    >
-      <el-form ref="modalFormComp" :model="modalForm" :rules="rules">
-        <el-form-item prop="selectedMarkerIds">
-          <el-checkbox-group v-model="modalForm.selectedMarkerIds">
-            <el-checkbox
-              v-for="mark in curClass.markerList"
-              :key="mark.userId"
-              :label="mark.userId"
-            >
-              {{ mark.name }}({{ mark.orgName }})
-            </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-      </el-form>
-      <div slot="footer">
-        <el-button type="primary" :disabled="isSubmit" @click="conform"
-          >确认</el-button
-        >
-        <el-button @click="modalIsShow = false">取消</el-button>
-      </div>
-    </el-dialog>
+    <!-- SelectClassByCourse -->
+    <select-class-by-course
+      ref="SelectClassByCourse"
+      :filter-data="{
+        examId: datas.basicInfo.examId,
+        paperNumber: datas.basicInfo.paperNumber,
+      }"
+      :selected-ids="selectedClassIds"
+      required
+      @confirm="classSelected"
+    ></select-class-by-course>
   </div>
 </template>
 
 <script>
-import { markClassList, markClassSave } from "../../api";
+import { markClassMarkerList, markClassMarkerSave } from "../../api";
 import { mapState } from "vuex";
+import SelectClassByCourse from "./SelectClassByCourse.vue";
 
 export default {
   name: "mark-param-class",
-  components: {},
+  components: { SelectClassByCourse },
   data() {
     return {
-      classList: [],
-      curClass: {},
-      // modify
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { selectedMarkerIds: [] },
-      rules: {
-        selectedMarkerIds: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (!value.length) {
-                callback(new Error("请选择评卷员"));
-              } else {
-                callback();
-              }
-            },
-            trigger: "change",
-          },
-        ],
-      },
+      dataList: [],
+      curRow: {},
+      selectedClassIds: [],
     };
   },
   computed: {
-    ...mapState("markParam", ["basicInfo", "paperStructureInfo"]),
+    ...mapState("markParam", ["basicInfo"]),
   },
   mounted() {
     this.initData();
@@ -115,46 +78,24 @@ export default {
         examId: this.basicInfo.examId,
         paperNumber: this.basicInfo.paperNumber,
       };
-      const res = await markClassList(params);
-      this.classList = res || [];
+      const res = await markClassMarkerList(params);
+      this.dataList = res || [];
     },
-    toSelectMarker(row) {
-      this.curClass = row;
-      this.modalForm.selectedMarkerIds = row.classMarkerList.map(
-        (item) => item.userId
-      );
-      this.modalIsShow = true;
+    toSelectClass(row) {
+      this.curRow = row;
+      this.selectedClassIds = row.className;
+      this.$refs.SelectClassByCourse.open();
     },
-    async conform() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      this.isSubmit = true;
-      const classMarkerList = this.curClass.markerList.filter((item) =>
-        this.modalForm.selectedMarkerIds.includes(item.userId)
-      );
-      const res = await markClassSave({
+    async classSelected(className) {
+      const res = await markClassMarkerSave({
         examId: this.basicInfo.examId,
         paperNumber: this.basicInfo.paperNumber,
-        className: this.curClass.className,
-        groupNumber: this.curClass.groupNumber,
-        classMarkerList,
+        groupNumber: this.curRow.groupNumber,
+        className,
       }).catch(() => {});
-      this.isSubmit = false;
       if (!res) return;
       this.$message.success("操作成功!");
-      this.curClass.classMarkerList = classMarkerList;
-      this.modalIsShow = false;
-    },
-    getData() {
-      return {
-        openClassReading: this.openClassReading,
-        classInfo: this.markerClassList.map((item) => {
-          let nitem = { ...item };
-          nitem.className = item.className.join();
-          return nitem;
-        }),
-      };
+      this.curRow.className = className;
     },
   },
 };

+ 1 - 1
src/modules/mark/components/markParam/MarkParamGroup.vue

@@ -31,7 +31,7 @@
               class="tag-spin"
               size="medium"
             >
-              {{ user.name }}({{ user.orgName }})
+              {{ user.name }}({{ user.loginName }})
             </el-tag>
           </template>
         </el-table-column>

+ 2 - 2
src/modules/mark/components/markParam/ModifyMarkGroup.vue

@@ -139,7 +139,7 @@
                 :disable-transitions="false"
                 @close="toDeleteUser(user)"
               >
-                {{ user.name }}({{ user.orgName }})
+                {{ user.name }}({{ user.loginName }})
               </el-tag>
             </el-form-item>
             <el-form-item
@@ -450,7 +450,7 @@ export default {
           } else {
             if (item.isUser) {
               let nitem = { ...item };
-              nitem.label = `${nitem.name}(${nitem.orgName})`;
+              nitem.label = `${nitem.name}`;
               userList.push(nitem);
             }
           }

+ 102 - 0
src/modules/mark/components/markParam/SelectClassByCourse.vue

@@ -0,0 +1,102 @@
+<template>
+  <el-dialog
+    class="select-class-dialog"
+    :visible.sync="modalIsShow"
+    append-to-body
+    top="20px"
+    width="650px"
+    title="选择班级"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :show-close="false"
+    @opened="visibleChange"
+  >
+    <el-transfer
+      v-model="classIds"
+      :data="dataList"
+      :titles="['班级列表', '已选班级']"
+      filterable
+    ></el-transfer>
+
+    <div slot="footer">
+      <el-button type="primary" @click="confirm">确认</el-button>
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { examStructureClassListPage } from "../../api";
+
+export default {
+  name: "select-class-dialog",
+  props: {
+    filterData: {
+      type: Object,
+      default: null,
+    },
+    selectedIds: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+    disableIds: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+    required: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  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() {
+      if (!this.filterData) return;
+      const data = await examStructureClassListPage(this.filterData);
+      this.dataList = data.map((item) => {
+        return {
+          id: item,
+          key: item,
+          label: item,
+          disabled: false,
+        };
+      });
+    },
+    // confirm
+    confirm() {
+      if (this.required && !this.classIds.length) {
+        this.$message.error("请选择班级");
+        return;
+      }
+      this.$emit("confirm", this.classIds);
+      this.cancel();
+    },
+  },
+};
+</script>