<template> <section class="content gen-paper"> <div class="part-box"> <h2 class="part-box-title">卷库列表</h2> <el-form class="part-filter-form" :inline="true" :model="formSearch"> <el-form-item label="课程名称"> <el-select v-model="formSearch.courseId" filterable :remote-method="getCourses" remote clearable placeholder="全部" @focus="(e) => getCourses(e.target.value)" > <el-option v-for="item in courseInfoSelect" :key="item.courseId" :label="item.courseInfo" :value="item.courseId" > </el-option> </el-select> </el-form-item> <el-form-item label="试卷名称"> <el-input v-model="formSearch.name" placeholder="试卷名称"></el-input> </el-form-item> <el-form-item label="层次"> <el-select v-model="formSearch.level" clearable placeholder="请选择"> <el-option v-for="item in levelList" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> <el-form-item label="录入人"> <el-input v-model="formSearch.creator" placeholder="录入人" ></el-input> </el-form-item> <el-form-item label="修改人"> <el-input v-model="formSearch.lastModifyName" placeholder="修改人" ></el-input> </el-form-item> <el-form-item> <el-button type="danger" @click="searchFrom">查询</el-button> <el-button type="danger" plain @click="resetForm">重置</el-button> </el-form-item> </el-form> <div class="part-box-action"> <div> <el-button type="danger" plain icon="icon icon-delete" :disabled="noBatchSelected" @click="batchDeleteGenPaper" >删除成卷 </el-button> <el-button type="danger" plain icon="icon icon-delete" :disabled="noBatchSelected" @click="recoveryPapers" >回收 </el-button> <el-button type="primary" plain icon="icon icon-export" :disabled="noBatchSelected" @click="openBatchExportPaperDialog" >下载成卷</el-button > <el-button type="primary" plain icon="icon icon-edit" :disabled="noBatchSelected" @click="openQuesPro" >试卷属性</el-button > </div> <div> <el-button type="primary" icon="icon icon-plus-white" @click="genPaperDetail" >组卷</el-button > </div> </div> </div> <div class="part-box"> <el-table v-loading="loading" element-loading-text="拼命加载中" :data="tableData" @selection-change="selectChange" > <el-table-column type="selection" width="50" align="center" ></el-table-column> <el-table-column label="课程名称" width="180"> <template slot-scope="scope"> <span>{{ scope.row.course.name }}</span> </template> </el-table-column> <el-table-column label="课程代码" width="80"> <template slot-scope="scope"> <span>{{ scope.row.course.code }}</span> </template> </el-table-column> <el-table-column label="试卷名称" width="180"> <template slot-scope="scope"> <span>{{ scope.row.name }}</span> </template> </el-table-column> <el-table-column label="试卷总分" width="103" sortable prop="totalScore" > </el-table-column> <el-table-column label="试卷难度" width="103" sortable prop="difficultyDegree" > </el-table-column> <el-table-column label="大题数量" width="103" sortable prop="paperDetailCount" > </el-table-column> <el-table-column label="录入员" width="150"> <template slot-scope="scope"> <span>{{ scope.row.creator }}</span> </template> </el-table-column> <el-table-column label="创建时间" width="153" sortable prop="creationDate" > </el-table-column> <el-table-column label="修改人" width="150"> <template slot-scope="scope"> <span>{{ scope.row.lastModifyName }}</span> </template> </el-table-column> <el-table-column label="修改时间" width="153" sortable prop="updateDate" > </el-table-column> <el-table-column label="操作" width="180" fixed="right"> <template slot-scope="scope"> <div class="operate_left"> <el-button size="mini" type="primary" plain @click="editGenPaper(scope.row)" >编辑</el-button > <el-dropdown> <el-button type="primary" size="mini" plain> 更多 <i class="el-icon-more el-icon--right"></i> </el-button> <el-dropdown-menu slot="dropdown" class="action-dropdown"> <el-dropdown-item> <el-button size="mini" type="danger" plain @click="recoveryPaper(scope.row)" > 回收 </el-button> </el-dropdown-item> <el-dropdown-item> <el-button size="mini" type="primary" plain @click="openExportDialog(scope.row)" >下载</el-button > </el-dropdown-item> <el-dropdown-item> <el-button size="mini" type="primary" plain @click="previewPDF2(scope.row)" >预览</el-button > </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </div> </template> </el-table-column> </el-table> <div class="part-page"> <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[10, 20, 50, 100, 200, 300]" layout="total, sizes, prev, pager, next, jumper" :total="total" @current-change="handleCurrentChange" @size-change="handleSizeChange" > </el-pagination> </div> </div> <!-- 下载 --> <el-dialog title="导出" :visible.sync="exportDialog" width="600px" :modal="false" append-to-body custom-class="side-dialog" > <el-form :model="exportModel" label-position="right" label-width="80px"> <el-form-item v-if="isShow" label="课程名称"> {{ exportModel.courseName }} </el-form-item> <el-form-item v-if="isShow" label="课程代码"> {{ exportModel.courseCode }} </el-form-item> <el-form-item label="导出内容"> <el-checkbox-group v-model="exportModel.exportContentList"> <el-checkbox label="PAPER">试卷</el-checkbox> <el-checkbox label="ANSWER">答案</el-checkbox> <el-checkbox label="THEMIS_PACKAGE">数据包</el-checkbox> <!-- <el-checkbox v-if="isShowPrintExamPackage" label="PRINT_EXAM_PACKAGE" >分布式印刷数据包 </el-checkbox> --> <el-input v-if="isShowPrintExamPackagePassword" v-model="printExamPackagePassword" placeholder="加密密码 (可选)" type="password" style="width: 150px" ></el-input> </el-checkbox-group> </el-form-item> <el-form-item v-if="showSeqMode()" label="小题序号"> <el-radio-group v-model="exportModel.seqMode" class="input"> <el-radio label="MODE1">单题型连续</el-radio> <el-radio label="MODE2">客观题整体连续</el-radio> <el-radio label="MODE3">按大题独立</el-radio> <el-radio label="MODE5">整卷连续</el-radio> </el-radio-group> </el-form-item> </el-form> <div slot="footer"> <el-button type="primary" @click="exportPaperInfo">开始导出</el-button> </div> </el-dialog> <!-- 试卷属性 --> <el-dialog title="属性修改" :visible.sync="quesPropertyDialog" width="500px" :modal="false" append-to-body custom-class="side-dialog" > <el-form :loading="quesLoading" :inline="true" label-width="100px"> <el-form-item> <span slot="label"> <el-checkbox v-model="difficultyDegreeDis" style="margin-right: 30px" ></el-checkbox> <span>难度</span> </span> <el-select v-model="difficultyDegree" class="dialog_input_width" :disabled="!difficultyDegreeDis" > <el-option v-for="item in difficultyDegreeList" :key="item.value" :label="item.label" :value="item.value" ></el-option> </el-select> </el-form-item> <el-form-item> <span slot="label"> <el-checkbox v-model="publicityDis" style="margin-right: 16px" ></el-checkbox> <span>公开度</span> </span> <el-select v-model="publicity" class="dialog_input_width" :disabled="!publicityDis" > <el-option v-for="item in publicityList" :key="item.value" :label="item.label" :value="item.value" ></el-option> </el-select> </el-form-item> </el-form> <div slot="footer"> <el-button v-loading.fullscreen.lock="quesLoading" type="primary" @click="updateQuesPropertyByPaper()" >保存</el-button > <el-button type="danger" plain @click="resetQuesProForm" >重置</el-button > <el-button type="danger" plain @click="closePropertyDialog" >返 回</el-button > </div> </el-dialog> </section> </template> <script> import { QUESTION_API } from "@/constants/constants"; import { LEVEL_TYPE, PUBLICITY_LIST } from "../constants/constants"; import { mapState } from "vuex"; export default { data() { return { publicityDis: false, difficultyDegreeDis: false, quesLoading: false, quesPropertyDialog: false, difficultyDegree: 0.1, publicity: true, difficultyDegreeList: [ { label: 0.1, value: 0.1 }, { label: 0.2, value: 0.2 }, { label: 0.3, value: 0.3 }, { label: 0.4, value: 0.4 }, { label: 0.5, value: 0.5 }, { label: 0.6, value: 0.6 }, { label: 0.7, value: 0.7 }, { label: 0.8, value: 0.8 }, { label: 0.9, value: 0.9 }, { label: 1.0, value: 1.0 }, ], publicityList: PUBLICITY_LIST, isClear: 0, courseLoading: false, formSearch: { courseId: "", courseName: "", creator: "", lastModifyName: "", level: "", name: "", }, tableData: [], currentPage: 1, pageSize: 10, total: 0, loading: false, courseList: [], levelList: LEVEL_TYPE, dialogVisible: false, selectedPaperIds: [], fileList: [], uploadAction: "", formUpload: { paperName: "", }, uploadData: {}, fileLoading: false, exportDialog: false, exportModel: { id: "", courseCode: "", courseName: "", exportContentList: [], seqMode: "MODE1", }, isShow: true, examList: [], dialogModel: false, rowIds: [], isShowPrintExamPackage: false, isShowPrintExamPackagePassword: false, printExamPackagePassword: "", printFrom: { examId: "", }, rules: { examId: [{ required: true, message: "请输入名称", trigger: "change" }], }, }; }, computed: { paperIds() { var paperIds = ""; for (let paperId of this.selectedPaperIds) { if (!paperIds) { paperIds += paperId; } else { paperIds += "," + paperId; } } return paperIds; }, courseInfoSelect() { var courseList = []; for (let course of this.courseList) { var courseInfo = course.name + "(" + course.code + ")"; var courseId = course.id; var courseName = course.name; courseList.push({ courseId: courseId, courseInfo: courseInfo, courseName: courseName, }); } return courseList; }, noBatchSelected() { return this.selectedPaperIds.length === 0; }, ...mapState({ user: (state) => state.user }), }, watch: { $route: "initVue", }, created() { this.initVue(); }, methods: { recoveryPaper(row) { this.$confirm("确认回收试卷吗?", "提示", { type: "warning", }).then(() => { this.loading = true; this.$http.put(QUESTION_API + "/paper_storage/recovery/" + row.id).then( () => { this.$notify({ message: "操作成功", type: "success", }); this.searchGenPaper(); }, (response) => { this.$notify({ message: response.response.data.desc, type: "error", }); this.loading = false; } ); }); }, recoveryPapers() { var paperIds = this.paperIds; if (this.selectedPaperIds.length != 0) { this.$confirm("确认回收试卷吗?", "提示", { type: "warning", }).then(() => { this.loading = true; this.$http .put(QUESTION_API + "/paper_storage/recovery/" + paperIds) .then( () => { this.$notify({ message: "操作成功", type: "success", }); this.selectedPaperIds = []; this.searchGenPaper(); }, (response) => { this.$notify({ message: response.response.data.desc, type: "error", }); this.loading = false; } ); }); } else { this.$notify({ message: "请勾选回收的试卷", type: "warning", }); } }, showSeqMode() { for (let i = 0; i < this.exportModel.exportContentList.length; i++) { let element = this.exportModel.exportContentList[i]; if (element == "PAPER" || element == "ANSWER") { // this.showSeqMode = true; return true; } } // this.showSeqMode = false; return false; }, updateQuesPropertyByPaper() { if (!this.difficultyDegreeDis && !this.publicityDis) { this.$notify({ title: "警告", message: "请勾选难度或公开度", type: "warning", }); return; } var params = "?ids=" + this.selectedPaperIds; if (this.difficultyDegreeDis) { params = params + "&difficultyDegree=" + this.difficultyDegree; } if (this.publicityDis) { params = params + "&publicity=" + this.publicity; } this.quesLoading = true; this.$httpWithMsg .put(QUESTION_API + "/question/updatePro/paperIds" + params) .then(() => { this.$notify({ message: "更新成功", type: "success", }); this.searchGenPaper(); this.quesLoading = false; this.closePropertyDialog(); }) .catch(() => { this.quesLoading = false; }); }, openQuesPro() { if (!this.selectedPaperIds || this.selectedPaperIds.length < 1) { this.$notify({ title: "警告", message: "请选择试卷", type: "warning", }); return; } this.difficultyDegree = 0.1; this.publicity = true; this.quesPropertyDialog = true; }, closePropertyDialog() { this.quesPropertyDialog = false; }, resetQuesProForm() { this.difficultyDegree = 0.1; this.publicity = true; }, resetForm() { this.formSearch = { courseId: "", courseName: "", level: "", name: "", }; }, //查询 searchFrom() { this.currentPage = 1; this.searchGenPaper(); }, searchGenPaper() { var pageNo = this.currentPage; this.currentPage = 1; this.loading = true; var url = QUESTION_API + "/genPaper/" + pageNo + "/" + this.pageSize; this.$http.get(url, { params: this.formSearch }).then((response) => { this.tableData = response.data.content; this.total = response.data.totalElements; this.currentPage = Number(pageNo); }); this.loading = false; }, genPaperDetail() { var courseId = this.formSearch.courseId; if (!courseId) { this.$notify({ title: "警告", message: "请选择课程", type: "warning", }); } else { var course = this.getCourseObj(courseId); this.formSearch.courseName = course.name; sessionStorage.setItem("gen_paper", JSON.stringify(this.formSearch)); sessionStorage.setItem("gen_paper_currentPage", this.currentPage); this.$router.push({ name: "gen_paper_detail", params: { courseId: courseId }, }); } }, handleCurrentChange(val) { this.currentPage = val; this.searchGenPaper(); }, handleSizeChange(val) { this.pageSize = val; this.currentPage = 1; this.searchGenPaper(); }, getCourseObj(courseId) { for (let course of this.courseList) { if (course.id == courseId) { return course; } } return ""; }, editGenPaper(row) { var course = this.getCourseObj(this.formSearch.courseId); if (course) { this.formSearch.courseName = course.name; } sessionStorage.setItem("gen_paper", JSON.stringify(this.formSearch)); sessionStorage.setItem("gen_paper_currentPage", this.currentPage); sessionStorage.setItem("question_back", "false"); this.$router.push({ path: "/edit_paper/" + row.id + "/gen_paper", }); }, deleteGenPaper(row) { this.$confirm("确认删除试卷吗?", "提示", { type: "warning", }).then(() => { this.loading = true; this.$http.delete(QUESTION_API + "/paper/" + row.id).then( () => { this.$notify({ message: "删除成功", type: "success", }); this.searchGenPaper(); }, (response) => { this.$notify({ message: response.response.data.desc, type: "error", }); this.loading = false; } ); }); }, selectChange(row) { this.selectedPaperIds = []; row.forEach((element) => { this.selectedPaperIds.push(element.id); }); }, batchDeleteGenPaper() { var paperIds = this.paperIds; if (this.selectedPaperIds.length != 0) { this.$confirm("确认删除试卷吗?", "提示", { type: "warning", }).then(() => { this.loading = true; this.$http.delete(QUESTION_API + "/paper/" + paperIds).then( () => { this.$notify({ message: "删除成功", type: "success", }); this.searchGenPaper(); this.selectedPaperIds = []; }, (response) => { this.$notify({ message: response.response.data.desc, type: "error", }); this.loading = false; } ); }); } else { this.$notify({ message: "请勾选删除的数据", type: "warning", }); } }, //查询所有课程 getCourses(query) { if (query) { query = query.trim(); } this.courseLoading = true; this.$http .get(QUESTION_API + "/course/query?name=" + query + "&enable=true") .then((response) => { this.courseList = response.data; this.courseLoading = false; }); }, //打开导出弹框 openExportDialog(row) { this.isShow = true; this.isShow = true; this.exportDialog = true; this.exportModel.id = row.id; this.exportModel.courseCode = row.course.code; this.exportModel.courseName = row.course.name; this.exportModel.exportContentList = []; /* 分布式印刷数据包设置 */ this.isShowPrintExamPackage = true; this.isShowPrintExamPackagePassword = false; this.printExamPackagePassword = ""; }, //打开批量弹出框 openBatchExportPaperDialog() { if (this.selectedPaperIds.length != 0) { this.exportDialog = true; this.isShow = false; this.isShow = false; this.exportModel.exportContentList = []; } else { this.$notify({ message: "请勾选导出的数据", type: "warning", }); } /* 分布式印刷数据包设置 */ this.isShowPrintExamPackage = false; this.isShowPrintExamPackagePassword = false; this.printExamPackagePassword = ""; }, //导出试卷,答案,机考数据包 exportPaperInfo() { if (this.exportModel.exportContentList.length == 0) { this.$notify({ message: "请选择导出内容", type: "error", }); return false; } if (this.printExamPackagePassword.length > 0) { var reg = /^[0-9A-Za-z]{6,12}$/; if (!reg.test(this.printExamPackagePassword)) { this.$notify({ message: "加密密码请输入6至12位的数字或字母!", type: "error", }); return false; } } var key = this.user.key; var token = this.user.token; if (this.isShow) { window.location.href = QUESTION_API + "/paper/export/" + this.exportModel.id + "/" + this.exportModel.exportContentList + "/onLine" + "?psw=" + this.printExamPackagePassword + "&$key=" + key + "&$token=" + token + "&seqMode=" + this.exportModel.seqMode; this.exportDialog = false; } else { var paperIds = this.paperIds; window.location.href = QUESTION_API + "/paper/batch_export/" + paperIds + "/" + this.exportModel.exportContentList + "/onLine" + "?psw=" + this.printExamPackagePassword + "&$key=" + key + "&$token=" + token + "&seqMode=" + this.exportModel.seqMode; this.exportDialog = false; } }, removeItem() { sessionStorage.removeItem("gen_paper"); sessionStorage.removeItem("gen_paper_currentPage"); }, previewPDF2(row) { var key = this.user.key; var token = this.user.token; window.open( QUESTION_API + "/paper/pdf/" + row.id + "?$key=" + key + "&$token=" + token ); }, initVue() { this.isClear = this.$route.params.isClear; if (this.isClear == 0 || !this.isClear) { this.removeItem(); this.formSearch = { courseId: "", courseName: "", level: "", name: "", }; this.currentPage = 1; } else { this.formSearch = JSON.parse(sessionStorage.getItem("gen_paper")); this.currentPage = sessionStorage.getItem("gen_paper_currentPage") == null ? 1 : parseInt(sessionStorage.getItem("gen_paper_currentPage")); } this.getCourses(this.formSearch.courseName); this.searchGenPaper(); }, }, }; </script>