Ver código fonte

命题任务新建修改

zhangjie 2 anos atrás
pai
commit
e3ac92d9c6

+ 109 - 118
src/modules/exam/components/ApplyContent.vue

@@ -13,7 +13,6 @@
         <tr>
           <th>试卷类型</th>
           <th>试卷文件</th>
-          <th>答题卡创建方式</th>
           <th>答题卡</th>
           <th v-if="IS_APPLY">操作</th>
         </tr>
@@ -56,36 +55,54 @@
               <i>{{ attachment.filename }}</i>
             </el-button>
           </td>
-          <td :rowspan="paperAttachments.length" v-if="index === 0">
-            {{ createCardTypeName }}
-          </td>
-          <td :rowspan="paperAttachments.length" v-if="index === 0">
-            <el-button
-              type="text"
-              class="btn-primary"
-              v-if="!exposedMode && IS_APPLY"
-              @click="toCreateOrViewCard"
-              >{{ cardTodoName }}</el-button
-            >
+          <td>
+            <template v-if="IS_APPLY">
+              <el-select
+                class="mr-2"
+                v-model="attachment.cardId"
+                placeholder="请选择"
+                style="width: 200px"
+                filterable
+                @change="cardChange(attachment)"
+              >
+                <el-option
+                  v-for="item in cards"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.title"
+                >
+                </el-option>
+              </el-select>
+              <el-button
+                class="btn-primary"
+                type="text"
+                :disabled="!attachment.cardId"
+                @click="toViewCard(attachment)"
+                >预览</el-button
+              >
+              <el-button
+                class="btn-primary"
+                type="text"
+                :disabled="
+                  !attachment.cardId || attachment.cardType === 'GENERIC'
+                "
+                @click="toEditCard(attachment)"
+                >编辑</el-button
+              >
+              <el-button
+                class="btn-primary"
+                type="text"
+                :disabled="!canCreateCard"
+                @click="toCreateCard(attachment)"
+                >新建</el-button
+              >
+            </template>
             <el-button
               v-else
               type="text"
               class="btn-primary"
-              @click="toViewCard"
-            >
-              查看题卡
-            </el-button>
-            <el-button
-              v-if="
-                curTaskApply.makeMethod &&
-                  curTaskApply.makeMethod !== 'CUST' &&
-                  !exposedMode &&
-                  IS_APPLY
-              "
-              type="text"
-              class="btn-danger"
-              @click="changeCreateCardType"
-              >切换题卡创建方式</el-button
+              @click="toViewCard(attachment)"
+              >{{ attachment.cardTitle || "预览" }}</el-button
             >
           </td>
           <td v-if="IS_APPLY">
@@ -469,19 +486,14 @@ import CardOptionDialog from "./CardOptionDialog";
 import {
   taskApplyDetail,
   updateTaskApply,
-  // updateTaskReview,
   taskAuditApply,
-  switchCardCreateMethod
-  // taskAllFlowSetups,
-  // taskAllApproverPeople,
-  // taskAllApproverExchangePeople,
-  // taskApproverNextPeople
+  cardForSelectList
 } from "../api";
 import { attachmentPreview } from "../../login/api";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import SelectUserDialog from "../../base/components/SelectUserDialog";
 import ModifyCard from "../../card/components/ModifyCard";
-import { CARD_SOURCE_TYPE, TASK_AUDIT_RESULT } from "@/constants/enumerate";
+import { TASK_AUDIT_RESULT, COMMON_CARD_RULE_ID } from "@/constants/enumerate";
 import {
   taskFlowDetail,
   taskFlowApproverExchange,
@@ -550,6 +562,7 @@ export default {
       curUploadType: "paper",
       attachmentLimitCount: 26,
       abc: "abcdefghijklmnopqrstuvwxyz".toUpperCase(),
+      cards: [],
       task: {},
       reason: "",
       TASK_AUDIT_RESULT: { ...TASK_AUDIT_RESULT, EXCHANGE: "转他人审批" },
@@ -635,29 +648,18 @@ export default {
         : this.curTaskApply.setup > 1;
       return IS_COMMON_AUDIT;
     },
-    cardTodoName() {
-      let name = "创建答题卡";
-      if (this.curTaskApply.cardId) {
-        if (this.curTaskApply.makeMethod === "SELECT") {
-          name = "选择题卡";
-        } else if (this.curTaskApply.makeMethod === "SELF") {
-          name = "编辑题卡";
-        } else {
-          // 已经审核的题卡可以自行编辑,未审核的题卡只能查看
-          name =
-            this.curTaskApply.status === "SUBMIT" ? "编辑题卡" : "查看题卡";
-        }
-      }
-      return name;
-    },
-    createCardTypeName() {
-      return CARD_SOURCE_TYPE[this.curTaskApply.makeMethod] || "";
-    },
     maxFetchCount() {
       return this.paperAttachments.length < 1
         ? 1
         : this.paperAttachments.length;
     },
+    canCreateCard() {
+      return (
+        this.curTaskApply.courseCode &&
+        this.curTaskApply.examId &&
+        this.curTaskApply.cardRuleId !== COMMON_CARD_RULE_ID
+      );
+    },
     exposedMode() {
       return !!this.curTaskApply.exposedPaperType;
     }
@@ -704,6 +706,9 @@ export default {
         ? JSON.parse(this.curTaskApply.paperConfirmAttachmentIds)
         : [];
 
+      this.getCardList();
+
+      // flow
       if (this.curTaskApply.flowStatus === "START") {
         await this.getFlowList();
       } else {
@@ -712,6 +717,14 @@ export default {
 
       if (this.IS_AUDIT) this.getCurFlowNodeInfo();
     },
+    async getCardList() {
+      if (!this.curTaskApply.courseCode || !this.curTaskApply.examId) return;
+      const data = await cardForSelectList({
+        courseCode: this.curTaskApply.courseCode,
+        examId: this.curTaskApply.examId
+      });
+      this.cards = data || [];
+    },
     async getFlowHistory() {
       if (!this.curTaskApply.flowId) return;
 
@@ -813,6 +826,8 @@ export default {
         name,
         attachmentId: "",
         filename: "",
+        cardId: "",
+        cardType: "",
         pages: 0,
         canDelete: true,
         isExposed: false
@@ -864,18 +879,19 @@ export default {
     deletePaperConfirmAttachment(index) {
       this.paperConfirmAttachments.splice(index, 1);
     },
-    toViewCard() {
+    toViewCard(attachment) {
       window.open(
         this.getRouterPath({
           name: "CardPreview",
           params: {
-            cardId: this.curTaskApply.cardId,
+            cardId: attachment.cardId,
             viewType: "view"
           }
         })
       );
     },
-    toEditCard() {
+    toEditCard(attachment) {
+      this.curAttachment = { ...attachment };
       this.$ls.set("prepareTcPCard", {
         cardId: this.task.cardId,
         examTaskId: this.task.examTaskId,
@@ -888,27 +904,45 @@ export default {
       });
       this.$refs.ModifyCard.open();
     },
-    async toCreateOrViewCard() {
-      await this.silentSave();
-      this.task = this.getTaskData();
-      if (!this.curTaskApply.cardId) {
-        this.$refs.CardOptionDialog.open();
-        return;
+    async cardModified(cardId) {
+      if (!cardId) return;
+      let card = this.cards.find(item => item.id === cardId);
+      if (!card) {
+        await this.getCardList();
+        card = this.cards.find(item => item.id === cardId);
       }
 
-      if (this.curTaskApply.makeMethod === "SELECT") {
-        this.$refs.CardOptionDialog.open();
-      } else if (this.curTaskApply.makeMethod === "SELF") {
-        this.toEditCard();
-      } else {
-        // 客服制卡:制作完毕则可以编辑,未制作完毕则可以查看
-        if (this.curTaskApply.status === "SUBMIT") {
-          this.toEditCard();
-        } else {
-          this.toViewCard();
-        }
+      const aind = this.paperAttachments.findIndex(
+        item => item.name === this.curAttachment.name
+      );
+      if (aind !== -1) {
+        this.paperAttachments[aind].cardId = card && card.id;
+      }
+    },
+    cardChange(attachment) {
+      const card = this.cards.find(item => item.id === attachment.cardId);
+      if (card) {
+        attachment.cardType = card.type;
+        attachment.cardTitle = card.title;
       }
     },
+    toCreateCard(attachment) {
+      if (!this.examTask.cardRuleId) {
+        this.$message.error("题卡规则缺失!");
+        return;
+      }
+      this.curAttachment = { ...attachment };
+      this.$ls.set("prepareTcPCard", {
+        courseCode: this.examTask.courseCode,
+        courseName: this.examTask.courseName,
+        schoolName: this.$ls.get("schoolName"),
+        makeMethod: "SELF",
+        cardRuleId: this.examTask.cardRuleId,
+        type: "CUSTOM",
+        createMethod: "STANDARD"
+      });
+      this.$refs.ModifyCard.open();
+    },
     cancel() {
       this.$emit("cancel");
     },
@@ -930,42 +964,6 @@ export default {
         this.$refs.ModifyCard.open();
       }
     },
-    async cardModified(cardId) {
-      if (!cardId) return;
-      this.curTaskApply = this.$objAssign(this.curTaskApply, {
-        cardId,
-        makeMethod: "SELF"
-      });
-      this.silentSave();
-    },
-    async changeCreateCardType() {
-      const h = this.$createElement;
-      const result = await this.$msgbox({
-        title: "切换题卡操作说明",
-        message: h("div", null, [
-          h("p", null, "1、切换题卡会将之前选择题卡数据删除。"),
-          h(
-            "p",
-            null,
-            "2、之前选择专卡进行绘制,切换题卡后再次选择专卡,需要重新开始绘制。"
-          )
-        ]),
-        showCancelButton: true,
-        type: "warning"
-      }).catch(() => {});
-      if (result !== "confirm") return;
-      await this.clearMakeMethod();
-      this.toCreateOrViewCard();
-    },
-    async clearMakeMethod() {
-      // 清除后台记录的题卡
-      if (this.curTaskApply.cardId && this.curTaskApply.makeMethod !== "CUST") {
-        await switchCardCreateMethod(this.examTask.id);
-      }
-
-      this.curTaskApply.makeMethod = "";
-      this.curTaskApply.cardId = "";
-    },
     toSelectNextFlowUser() {
       if (!this.IS_NEED_SELECT_APPROVE_USER) return;
 
@@ -1021,16 +1019,9 @@ export default {
       //   return;
       // }
 
-      if (!this.curTaskApply.cardId) {
-        this.$message.error("请选择题卡创建方式!");
-        return;
-      }
-
-      if (
-        this.curTaskApply.makeMethod !== "SELECT" &&
-        this.curTaskApply.status !== "SUBMIT"
-      ) {
-        this.$message.error("请先提交题卡!");
+      const cardValid = !this.paperAttachments.some(item => !item.cardId);
+      if (!cardValid) {
+        this.$message.error("有试卷类型未选择题卡!");
         return;
       }
 

+ 2 - 2
src/modules/exam/components/createExamAndPrintTask/CreateExamAndPrintTask.vue

@@ -313,8 +313,8 @@ export default {
         return;
       }
       // 更新infos
-      this.$refs.InfoExamTask.updeteData();
-      if (!this.IS_MODEL3) this.$refs.InfoPrintTask.updeteData();
+      this.$refs.InfoExamTask.updateData();
+      if (!this.IS_MODEL3) this.$refs.InfoPrintTask.updateData();
 
       let examTaskContent = {
         examTask: this.infoExamTask,

+ 4 - 9
src/modules/exam/components/createExamAndPrintTask/InfoExamTask.vue

@@ -268,10 +268,7 @@
 import UploadPaperDialog from "../UploadPaperDialog";
 import SimpleImagePreview from "@/components/SimpleImagePreview";
 import ModifyCard from "../../../card/components/ModifyCard";
-import {
-  CARD_SOURCE_TYPE,
-  COMMON_CARD_RULE_ID
-} from "../../../../constants/enumerate";
+import { COMMON_CARD_RULE_ID } from "../../../../constants/enumerate";
 import { cardForSelectList } from "../../api";
 import { courseQuery, examConfigByExamIdOrgId } from "../../../base/api";
 import { mapState, mapMutations } from "vuex";
@@ -351,9 +348,6 @@ export default {
       "infoExamTaskDetail",
       "infoExamPrintPlan"
     ]),
-    createCardTypeName() {
-      return CARD_SOURCE_TYPE[this.examTaskDetail.makeMethod] || "";
-    },
     maxFetchCount() {
       return this.paperAttachments.length < 1
         ? 1
@@ -483,6 +477,7 @@ export default {
       const card = this.cards.find(item => item.id === attachment.cardId);
       if (card) {
         attachment.cardType = card.type;
+        attachment.cardTitle = card.title;
       }
     },
     toCreateCard(attachment) {
@@ -539,7 +534,7 @@ export default {
         item => item.name === this.curAttachment.name
       );
       if (aind !== -1) {
-        this.paperAttachments[aind].cardId = card.id;
+        this.paperAttachments[aind].cardId = card && card.id;
       }
     },
     async checkData() {
@@ -567,7 +562,7 @@ export default {
 
       return Promise.resolve(true);
     },
-    updeteData() {
+    updateData() {
       let data = {
         infoExamTask: this.examTask,
         infoExamTaskDetail: this.getTaskDetailData()

+ 23 - 2
src/modules/exam/components/createExamAndPrintTask/InfoPrintTask.vue

@@ -162,7 +162,12 @@
             ></el-input>
           </div>
         </el-table-column>
-        <el-table-column label="操作" width="100">
+        <el-table-column
+          label="操作"
+          width="100"
+          class-name="action-column"
+          align="center"
+        >
           <template slot-scope="scope">
             <el-button
               class="btn-danger"
@@ -188,6 +193,11 @@
       :course-id="infoExamTask.courseId"
       @modified="examStudentModified"
     ></modify-exam-student>
+    <!-- PreviewTaskStudent -->
+    <preview-task-student
+      ref="PreviewTaskStudent"
+      :student-list="examStudentList"
+    ></preview-task-student>
   </div>
 </template>
 
@@ -196,11 +206,12 @@ import { calcSum, getTimeDatestamp } from "@/plugins/utils";
 import { examRuleDetail } from "../../../base/api";
 import { listTaskPrintHouse } from "../../api";
 import ModifyExamStudent from "./ModifyExamStudent";
+import PreviewTaskStudent from "./PreviewTaskStudent";
 import { mapState, mapMutations } from "vuex";
 
 export default {
   name: "info-print-task",
-  components: { ModifyExamStudent },
+  components: { ModifyExamStudent, PreviewTaskStudent },
   data() {
     return {
       modalForm: {
@@ -224,6 +235,7 @@ export default {
         paperBackupCount: 0
       },
       selectedStudentIds: [],
+      examStudentList: [],
       // date-picker
       curCreateTime: [],
       createDate: "",
@@ -479,6 +491,15 @@ export default {
     },
     toViewStudent(row) {
       console.log(row);
+      this.examStudentList = row.examTaskStudentObjectParamList.map(item => {
+        return {
+          id: item.studentId,
+          studentName: item.studentName,
+          studentCode: item.studentCode,
+          className: row.className
+        };
+      });
+      this.$refs.PreviewTaskStudent.open();
     }
   }
 };

+ 70 - 39
src/modules/exam/components/createExamAndPrintTask/ModifyExamStudent.vue

@@ -1,9 +1,9 @@
 <template>
   <el-dialog
-    class="modify-exam-student"
+    class="modify-exam-student select-user-dialog"
     :visible.sync="modalIsShow"
     title="选择考试对象"
-    top="10px"
+    top="10vh"
     width="600px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
@@ -30,6 +30,7 @@
         btn-content="批量导入"
         btn-type="success"
         :upload-url="uploadUrl"
+        :upload-data="uploadData"
         :format="['xls', 'xlsx']"
         accept=".xls,.xlsx"
         @valid-error="validError"
@@ -41,38 +42,42 @@
     <el-row v-else type="flex" :gutter="10">
       <el-col :span="12">
         <h3 class="user-part-title">班级/学生</h3>
-        <el-tree
-          ref="UserTree"
-          :data="userTree"
-          node-key="id"
-          show-checkbox
-          highlight-current
-          :props="defaultProps"
-          @check-change="checkChange"
-        >
-        </el-tree>
+        <div class="user-tree">
+          <el-tree
+            ref="UserTree"
+            :data="userTree"
+            node-key="id"
+            show-checkbox
+            check-on-click-node
+            :expand-on-click-node="false"
+            :props="defaultProps"
+            @check="checkChange"
+          >
+          </el-tree>
+        </div>
       </el-col>
       <el-col :span="12">
-        <div class="user-part-title">已选范围</div>
-        <el-tree
-          ref="UserSelectedTree"
-          :data="selectedUsers"
-          node-key="id"
-          show-checkbox
-          highlight-current
-          :props="defaultProps"
-        >
-          <span class="custom-tree-node" slot-scope="{ node, data }">
-            <el-button
-              v-if="data.isUser"
-              type="text"
-              icon="el-icon-remove"
-              @click="removeSelectStudent(node, data)"
-            >
-              {{ data.label }}
-            </el-button>
-          </span>
-        </el-tree>
+        <h3 class="user-part-title">已选范围</h3>
+        <div class="user-tree">
+          <el-tree
+            ref="UserSelectedTree"
+            :data="selectedUsers"
+            node-key="id"
+            default-expand-all
+            :props="defaultProps"
+          >
+            <span class="custom-tree-node" slot-scope="{ node, data }">
+              <span>{{ data.label }}</span>
+              <el-button
+                type="text"
+                icon="el-icon-remove"
+                class="color-danger"
+                @click="removeSelectStudent(node)"
+              >
+              </el-button>
+            </span>
+          </el-tree>
+        </div>
       </el-col>
     </el-row>
     <p v-show="!selectValid" class="tips-info tips-error"></p>
@@ -122,7 +127,6 @@ export default {
       },
       userTree: [],
       selectedUsers: [],
-      selectedUserIds: [],
       selectValid: true,
       defaultProps: {
         children: "children",
@@ -130,6 +134,9 @@ export default {
       },
       // import
       uploadUrl: "/api/admin/exam/task/find_exam_task_student_object",
+      uploadData: {
+        examObjectType: "IMPORT_STUDENT"
+      },
       downloadUrl: "/temps/studentTemplate.xlsx",
       dfilename: "学生导入模板.xlsx"
     };
@@ -179,7 +186,6 @@ export default {
       this.examObjectType = val;
       if (val === "IMPORT_STUDENT") return;
 
-      this.selectedUserIds = [];
       this.selectedUsers = [];
 
       if (this.dataTree[val].length) {
@@ -189,13 +195,33 @@ export default {
       }
     },
     checkChange() {
-      let selectedNode = this.$refs.UserTree.getCheckedNodes(false, true);
-      console.log(selectedNode);
+      console.log("check click");
+      let selectedKeys = this.$refs.UserTree.getCheckedKeys(true);
+      let selectedUsers = [];
+      this.userTree.forEach(item => {
+        const children = item.children.filter(elem =>
+          selectedKeys.includes(elem.id)
+        );
+        if (children.length) {
+          selectedUsers.push({
+            ...item,
+            children
+          });
+        }
+      });
+      this.selectedUsers = selectedUsers;
     },
     removeSelectStudent(node) {
-      console.log(node);
-
+      console.log("node remove");
       this.$refs.UserSelectedTree.remove(node);
+      let selectedUserIds = [];
+      this.selectedUsers.forEach(item => {
+        item.children.forEach(elem => {
+          selectedUserIds.push(elem.id);
+        });
+      });
+      this.$refs.UserTree.setCheckedKeys(selectedUserIds);
+      this.checkChange();
     },
     async visibleChange() {
       if (this.examObjectType === "TEACH_CLAZZ_STUDENT") {
@@ -217,7 +243,12 @@ export default {
       this.$message.error(errorData.message);
     },
     uploadSuccess(res) {
-      console.log(res);
+      // console.log(res);
+      this.$message.success("导入成功!");
+      this.getStudents("BASIC_CLAZZ_STUDENT");
+      const selectedUsers = this.parseStudentData(res.data);
+      this.$emit("modified", selectedUsers);
+      this.cancel();
     },
     submit() {
       if (!this.selectedUsers.length) {

+ 46 - 0
src/modules/exam/components/createExamAndPrintTask/PreviewTaskStudent.vue

@@ -0,0 +1,46 @@
+<template>
+  <el-dialog
+    class="preview-task-student"
+    :visible.sync="modalIsShow"
+    title="考试对象学生"
+    top="10px"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+  >
+    <el-table ref="TableList" :data="studentList">
+      <el-table-column type="index" label="序号" width="70"></el-table-column>
+      <el-table-column prop="studentName" label="姓名"> </el-table-column>
+      <el-table-column prop="studentCode" label="学号"> </el-table-column>
+      <el-table-column prop="className" label="班级"> </el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: "preview-task-student",
+  props: {
+    studentList: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false
+    };
+  },
+  methods: {
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    }
+  }
+};
+</script>