Browse Source

评卷员选择修改

zhangjie 2 years ago
parent
commit
ff79b3fecf

+ 29 - 0
src/assets/styles/pages.scss

@@ -931,6 +931,35 @@
     margin-bottom: 10px;
     flex-grow: 0;
   }
+
+  .user-types {
+    font-size: 0;
+    margin-bottom: 10px;
+    flex-grow: 0;
+  }
+  .user-type {
+    display: inline-block;
+    vertical-align: top;
+    font-size: 14px;
+    height: 28px;
+    width: 50%;
+    padding: 0 10px;
+    line-height: 26px;
+    border: 1px solid #e0e0e0;
+    text-align: center;
+    background-color: #fff;
+    cursor: pointer;
+    &:hover {
+      border-color: $--color-primary;
+      color: $--color-primary;
+    }
+
+    &.is-active {
+      background-color: $--color-primary;
+      border-color: $--color-primary;
+      color: #fff;
+    }
+  }
   .user-tree {
     padding: 10px;
     border-radius: 4px;

+ 1 - 0
src/modules/stmms/components/markParam/MarkPaperMarker.vue

@@ -109,6 +109,7 @@
     <!-- ModifyMarkerQuestion -->
     <modify-marker-question
       ref="ModifyMarkerQuestion"
+      :course-code="datas.basicPaperInfo.courseCode"
       :instance="curGroupInfo"
       :disabled-question-ids="disabledQuestionIds"
       :paper-structure="subjectiveQuestionList"

+ 85 - 52
src/modules/stmms/components/markParam/ModifyMarkerQuestion.vue

@@ -25,6 +25,20 @@
               @input="labelChange"
             ></el-input>
           </div>
+          <div class="user-types">
+            <div
+              :class="['user-type', { 'is-active': userType === 'org' }]"
+              @click="switchUserType('org')"
+            >
+              组织架构
+            </div>
+            <div
+              :class="['user-type', { 'is-active': userType === 'course' }]"
+              @click="switchUserType('course')"
+            >
+              课程
+            </div>
+          </div>
           <div class="user-tree">
             <el-tree
               ref="UserTree"
@@ -38,7 +52,7 @@
                 <el-checkbox
                   v-if="data.isUser"
                   v-model="node.checked"
-                  @change="userChange"
+                  @change="val => userChange(val, data)"
                 >
                   {{ node.label }}
                 </el-checkbox>
@@ -72,7 +86,7 @@
                 :disable-transitions="false"
                 @close="toDeleteUser(user)"
               >
-                {{ user.label }}
+                {{ user.name }}({{ user.orgName }})
               </el-tag>
             </el-form-item>
             <el-form-item prop="questions" label="选择评卷题目:">
@@ -142,6 +156,10 @@ export default {
       default() {
         return [];
       }
+    },
+    courseCode: {
+      type: String,
+      default: ""
     }
   },
   data() {
@@ -163,6 +181,8 @@ export default {
     return {
       modalIsShow: false,
       filterLabel: "",
+      userType: "course",
+      courseUsers: [],
       orgUsers: [],
       userTree: [],
       userList: [],
@@ -200,10 +220,13 @@ export default {
     visibleChange() {
       this.parseStructs();
       this.filterLabel = "";
+      this.userType = "course";
       this.selectedQuestions = this.instance.questions;
       this.selectedQuestionIds = this.selectedQuestions.map(item => item.id);
+      this.selectedUsers = this.instance.markerList.map(item => {
+        return { ...item };
+      });
       this.selectedUserIds = this.instance.markerList.map(item => item.id);
-      this.updateSelectedUsersFromUserIds();
       this.labelChange();
     },
     cancel() {
@@ -213,8 +236,20 @@ export default {
       this.modalIsShow = true;
     },
     // user
+    switchUserType(type) {
+      this.filterLabel = "";
+      this.userType = type;
+
+      this.userTree =
+        type === "org" ? deepCopy(this.orgUsers) : deepCopy(this.courseUsers);
+      this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
+    },
     async getOrgData() {
-      const data = await organizationList({ specialPrivilege: "MARKER" });
+      let params = {
+        specialPrivilege: "MARKER"
+      };
+      if (this.courseCode) params.courseCode = this.courseCode;
+      const data = await organizationList(params);
       this.parseUserData(data);
       this.getUserList();
     },
@@ -251,11 +286,29 @@ export default {
             });
             nitem.children = [...nitem.children, ...users];
           }
+
+          if (item["courseUserList"] && item["courseUserList"].length) {
+            nitem.courseUserList = item.courseUserList.map(user => {
+              return {
+                id: user.id,
+                userId: user.id,
+                label: user.realName,
+                name: user.realName,
+                orgName: user.orgName,
+                loginName: user.loginName,
+                selected: false,
+                isUser: true
+              };
+            });
+          }
           return nitem;
         });
       };
       this.orgUsers = parseUser(data);
       this.userTree = deepCopy(this.orgUsers);
+      if (this.courseCode && this.orgUsers[0].courseUserList) {
+        this.courseUsers = deepCopy(this.orgUsers[0].courseUserList);
+      }
       this.getUserList();
     },
     getUserList() {
@@ -279,45 +332,54 @@ export default {
     },
     labelChange() {
       if (!this.filterLabel) {
-        this.userTree = deepCopy(this.orgUsers);
+        this.switchUserType(this.userType);
       } else {
         const escapeRegexpString = (value = "") =>
           String(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
         const reg = new RegExp(escapeRegexpString(this.filterLabel), "i");
 
-        this.userTree = this.userList.filter(item => reg.test(item.name));
+        if (this.userType === "org") {
+          this.userTree = this.userList.filter(item => reg.test(item.name));
+        } else {
+          this.userTree = this.courseUsers.filter(item => reg.test(item.name));
+        }
       }
       this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
     },
     selectNodeAll(checked, data) {
-      let userIds = [];
+      let users = [];
       const getUserIds = list => {
         list.forEach(item => {
           item.selected = checked;
           if (item.children && item.children.length) {
             getUserIds(item.children);
           } else {
-            if (item.isUser) userIds.push(item.userId);
+            if (item.isUser) users.push(item);
           }
         });
       };
       getUserIds(data.children);
 
-      userIds.forEach(userId => {
-        const userPos = this.selectedUserIds.indexOf(userId);
+      const userIds = users.map(u => u.id);
+      const selectedUserIds = this.selectedUsers.map(item => item.id);
+
+      let deleteUserIds = [];
+      userIds.forEach((userId, uindex) => {
+        const userPos = selectedUserIds.indexOf(userId);
         const includeUser = userPos !== -1;
         if (checked) {
-          if (!includeUser) this.selectedUserIds.push(userId);
+          if (!includeUser) this.selectedUsers.push(users[uindex]);
         } else {
           if (includeUser) {
-            this.selectedUserIds.splice(userPos, 1);
+            deleteUserIds.push(userId);
           }
         }
       });
-
+      this.selectedUsers = this.selectedUsers.filter(
+        u => !deleteUserIds.includes(u.id)
+      );
+      this.selectedUserIds = this.selectedUsers.map(item => item.id);
       this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-      this.updateSelectedUsersFromUserIds();
-
       this.$refs.modalFormRef.validateField("users");
     },
     updateSelectedUsersFromUserIds() {
@@ -325,45 +387,16 @@ export default {
         this.selectedUserIds.includes(user.id)
       );
     },
-    userChange() {
-      if (this.filterLabel) {
-        let prevSelectUserIds = this.selectedUsers.map(item => item.id);
-        const prevUserListSelectUserIds = this.userTree
-          .filter(user => prevSelectUserIds.includes(user.id))
-          .map(user => user.id);
-        const selectedUsers = this.$refs.UserTree.getCheckedNodes(true);
-        const sIds = selectedUsers.map(user => user.id);
-        const prevDeletedUserIds = prevUserListSelectUserIds.filter(
-          uid => !sIds.includes(uid)
-        );
+    userChange(checked, user) {
+      if (checked) {
+        this.selectedUsers.push(user);
+      } else {
         this.selectedUsers = this.selectedUsers.filter(
-          user => !prevDeletedUserIds.includes(user.id)
+          item => item.id !== user.id
         );
-        prevSelectUserIds = this.selectedUsers.map(item => item.id);
-
-        selectedUsers.forEach(user => {
-          if (prevSelectUserIds.includes(user.id)) return;
-          const nuser = {
-            id: user.id,
-            name: user.name,
-            label: `${user.name}(${user.orgName})`
-          };
-          this.selectedUsers.push(nuser);
-        });
-        this.selectedUserIds = this.selectedUsers.map(item => item.id);
-      } else {
-        const selectedUsers = this.$refs.UserTree.getCheckedNodes(true);
-        this.selectedUsers = selectedUsers.map(user => {
-          const nuser = {
-            id: user.id,
-            name: user.name,
-            label: `${user.name}(${user.orgName})`
-          };
-          return nuser;
-        });
-        this.selectedUserIds = this.selectedUsers.map(item => item.id);
       }
-      this.updateSelectedUsersFromUserIds();
+      this.selectedUserIds = this.selectedUsers.map(item => item.id);
+      this.$refs.modalFormRef.validateField("users");
     },
     toDeleteUser(user) {
       const pos = this.selectedUsers.findIndex(item => item.id === user.id);
@@ -432,7 +465,7 @@ export default {
           id: item.id,
           name: item.name,
           loginName: item.loginName,
-          label: item.label
+          orgName: item.orgName
         };
       });
       datas.questions = this.selectedQuestions.map(item => {