SynthesisPaperStorage.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. <template>
  2. <section class="content">
  3. <div class="part-box">
  4. <h2 class="part-box-title">综合卷列表</h2>
  5. <el-form class="part-filter-form" :inline="true" :model="formSearch">
  6. <el-form-item label="课程名称">
  7. <el-select
  8. v-model="formSearch.courseId"
  9. filterable
  10. :remote-method="getCourses"
  11. remote
  12. clearable
  13. placeholder="全部"
  14. @change="courseChange"
  15. @clear="getCourses('')"
  16. >
  17. <el-option
  18. v-for="item in courseInfoSelect"
  19. :key="item.courseId"
  20. :label="item.courseInfo"
  21. :value="item.courseId"
  22. >
  23. </el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="试卷名称">
  27. <el-input
  28. v-model="formSearch.paperName"
  29. placeholder="试卷名称"
  30. ></el-input>
  31. </el-form-item>
  32. <!-- <el-form-item label="录入人">
  33. <el-input
  34. v-model="formSearch.creationBy"
  35. placeholder="录入人"
  36. ></el-input>
  37. </el-form-item> -->
  38. <el-form-item label="修改人">
  39. <el-input
  40. v-model="formSearch.updateBy"
  41. placeholder="修改人"
  42. ></el-input>
  43. </el-form-item>
  44. <el-form-item>
  45. <el-button type="danger" @click="searchFrom">查询</el-button>
  46. <el-button type="danger" plain @click="resetForm">重置</el-button>
  47. </el-form-item>
  48. </el-form>
  49. <div class="part-box-action">
  50. <div>
  51. <el-button
  52. type="danger"
  53. plain
  54. icon="icon icon-delete"
  55. :disabled="noBatchSelected"
  56. @click="batchDeleteGenPaper"
  57. >删除成卷
  58. </el-button>
  59. <el-button
  60. type="primary"
  61. plain
  62. icon="icon icon-export"
  63. :disabled="noBatchSelected"
  64. @click="openBatchExportPaperDialog"
  65. >下载成卷</el-button
  66. >
  67. </div>
  68. <el-button
  69. type="primary"
  70. icon="icon icon-plus-white"
  71. @click="toBuildPaper"
  72. >综合组卷</el-button
  73. >
  74. </div>
  75. </div>
  76. <div class="part-box">
  77. <el-table
  78. v-loading="loading"
  79. element-loading-text="拼命加载中"
  80. :data="tableData"
  81. @selection-change="selectChange"
  82. >
  83. <el-table-column
  84. type="selection"
  85. width="50"
  86. align="center"
  87. ></el-table-column>
  88. <el-table-column label="业务课名称" width="180">
  89. <template slot-scope="scope">
  90. <span>{{ scope.row.courseName }}</span>
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="业务课代码" width="100">
  94. <template slot-scope="scope">
  95. <span>{{ scope.row.courseCode }}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="试卷名称" width="180">
  99. <template slot-scope="scope">
  100. <span>{{ scope.row.name }}</span>
  101. </template>
  102. </el-table-column>
  103. <el-table-column
  104. label="试卷总分"
  105. width="103"
  106. sortable
  107. prop="totalScore"
  108. >
  109. </el-table-column>
  110. <el-table-column
  111. label="试卷难度"
  112. width="103"
  113. sortable
  114. prop="difficultyDegree"
  115. >
  116. </el-table-column>
  117. <el-table-column
  118. label="大题数量"
  119. width="103"
  120. sortable
  121. prop="paperDetailCount"
  122. >
  123. </el-table-column>
  124. <el-table-column
  125. label="创建时间"
  126. width="153"
  127. sortable
  128. prop="creationTime"
  129. >
  130. </el-table-column>
  131. <el-table-column label="修改人" width="150" prop="updateUser">
  132. </el-table-column>
  133. <el-table-column
  134. label="修改时间"
  135. width="153"
  136. sortable
  137. prop="updateTime"
  138. >
  139. </el-table-column>
  140. <el-table-column label="操作" width="220" fixed="right">
  141. <template slot-scope="scope">
  142. <div class="operate_left">
  143. <el-dropdown>
  144. <el-button size="mini" type="primary" plain>编辑</el-button>
  145. <el-dropdown-menu slot="dropdown" class="action-dropdown">
  146. <el-dropdown-item
  147. v-for="paper in scope.row.papers"
  148. :key="paper.paperId"
  149. >
  150. <el-button
  151. size="mini"
  152. type="primary"
  153. plain
  154. @click="toEditPaper(paper)"
  155. >{{ paper.paperName }}</el-button
  156. >
  157. </el-dropdown-item>
  158. </el-dropdown-menu>
  159. </el-dropdown>
  160. <el-button
  161. size="mini"
  162. type="primary"
  163. plain
  164. @click="toViewPaper(scope.row)"
  165. >预览</el-button
  166. >
  167. <el-button
  168. size="mini"
  169. type="primary"
  170. plain
  171. @click="openExportDialog(scope.row)"
  172. >下载</el-button
  173. >
  174. </div>
  175. </template>
  176. </el-table-column>
  177. </el-table>
  178. <div class="part-page">
  179. <el-pagination
  180. :current-page="currentPage"
  181. :page-size="pageSize"
  182. :page-sizes="[10, 20, 50, 100, 200, 300]"
  183. layout="total, sizes, prev, pager, next, jumper"
  184. :total="total"
  185. @current-change="handleCurrentChange"
  186. @size-change="handleSizeChange"
  187. >
  188. </el-pagination>
  189. </div>
  190. </div>
  191. <!-- 下载 -->
  192. <el-dialog
  193. title="下载试卷"
  194. :visible.sync="exportDialog"
  195. width="700px"
  196. :modal="false"
  197. append-to-body
  198. custom-class="side-dialog"
  199. >
  200. <el-form :model="exportModel" label-position="right" label-width="100px">
  201. <el-form-item v-if="exportModel.courseName" label="业务课名称">
  202. {{ exportModel.courseName }}
  203. </el-form-item>
  204. <el-form-item v-if="exportModel.courseCode" label="业务课代码">
  205. {{ exportModel.courseCode }}
  206. </el-form-item>
  207. <el-form-item label="导出内容">
  208. <el-checkbox-group v-model="exportModel.exportContentList">
  209. <el-checkbox label="PAPER">试卷</el-checkbox>
  210. <el-checkbox label="ANSWER">答案</el-checkbox>
  211. <!-- <el-checkbox label="THEMIS_PACKAGE">数据包</el-checkbox> -->
  212. </el-checkbox-group>
  213. </el-form-item>
  214. <el-form-item v-if="showSeqMode" label="小题序号">
  215. <el-radio-group v-model="exportModel.seqMode" class="input">
  216. <el-radio label="MODE1">单题型连续</el-radio>
  217. <el-radio label="MODE2">客观题整体连续</el-radio>
  218. <el-radio label="MODE3">按大题独立</el-radio>
  219. <el-radio label="MODE5">整卷连续</el-radio>
  220. </el-radio-group>
  221. </el-form-item>
  222. </el-form>
  223. <div slot="footer">
  224. <el-button type="primary" @click="exportPaperInfo">开始导出</el-button>
  225. </div>
  226. </el-dialog>
  227. </section>
  228. </template>
  229. <script>
  230. import { mapState } from "vuex";
  231. import {
  232. courseQueryApi,
  233. synthesizePaperPageListApi,
  234. synthesizePaperDeleteApi,
  235. synthesizePaperDownloadApi,
  236. } from "../api";
  237. import { downloadByApi } from "@/plugins/download";
  238. import { QUESTION_API } from "@/constants/constants";
  239. export default {
  240. data() {
  241. return {
  242. courseLoading: false,
  243. formSearch: {
  244. courseId: "",
  245. courseName: "",
  246. creationBy: "",
  247. updateBy: "",
  248. paperName: "",
  249. },
  250. tableData: [],
  251. currentPage: 1,
  252. pageSize: 10,
  253. total: 0,
  254. loading: false,
  255. courseList: [],
  256. selectedPaperIds: [],
  257. exportDialog: false,
  258. exportModel: {
  259. id: "",
  260. courseCode: "",
  261. courseName: "",
  262. exportContentList: [],
  263. seqMode: "MODE1",
  264. },
  265. };
  266. },
  267. computed: {
  268. courseInfoSelect() {
  269. var courseList = [];
  270. for (let course of this.courseList) {
  271. var courseInfo = course.name + "(" + course.code + ")";
  272. var courseId = course.id;
  273. var courseName = courseName;
  274. courseList.push({
  275. courseId: courseId,
  276. courseInfo: courseInfo,
  277. courseName: courseName,
  278. });
  279. }
  280. return courseList;
  281. },
  282. noBatchSelected() {
  283. return this.selectedPaperIds.length === 0;
  284. },
  285. showSeqMode() {
  286. return (
  287. this.exportModel.exportContentList.includes("PAPER") ||
  288. this.exportModel.exportContentList.includes("ANSWER")
  289. );
  290. },
  291. ...mapState({ user: (state) => state.user }),
  292. },
  293. created() {
  294. this.initData();
  295. },
  296. methods: {
  297. async getCourses(query) {
  298. this.courseLoading = true;
  299. query = query && query.trim();
  300. const res = await courseQueryApi(query, "true");
  301. this.courseList = res.data || [];
  302. this.courseLoading = false;
  303. },
  304. courseChange() {
  305. const course = this.courseList.find(
  306. (item) => item.id === this.formSearch.courseId
  307. );
  308. if (course) {
  309. this.formSearch.courseName = course.name;
  310. }
  311. },
  312. resetForm() {
  313. this.formSearch = {
  314. courseId: "",
  315. courseName: "",
  316. creationBy: "",
  317. updateBy: "",
  318. name: "",
  319. };
  320. },
  321. //查询
  322. searchFrom() {
  323. this.currentPage = 1;
  324. this.searchGenPaper();
  325. },
  326. async searchGenPaper() {
  327. this.loading = true;
  328. const datas = {
  329. ...this.formSearch,
  330. pageNumber: this.currentPage,
  331. pageSize: this.pageSize,
  332. };
  333. const res = await synthesizePaperPageListApi(datas).catch(() => {});
  334. this.loading = false;
  335. if (!res) return;
  336. this.tableData = res.data.content;
  337. this.total = res.data.totalElements;
  338. },
  339. handleCurrentChange(val) {
  340. this.currentPage = val;
  341. this.searchGenPaper();
  342. },
  343. handleSizeChange(val) {
  344. this.pageSize = val;
  345. this.currentPage = 1;
  346. this.searchGenPaper();
  347. },
  348. selectChange(row) {
  349. this.selectedPaperIds = row.map((item) => item.id);
  350. },
  351. toViewPaper(row) {
  352. var key = this.user.key;
  353. var token = this.user.token;
  354. window.open(
  355. QUESTION_API +
  356. "/synthesize/paper/preview?synthesizePaperId=" +
  357. row.id +
  358. "&$key=" +
  359. key +
  360. "&$token=" +
  361. token
  362. );
  363. },
  364. toEditPaper(paper) {
  365. this.cacheSearchInfo();
  366. this.$router.push({
  367. path: "/edit_paper/" + paper.paperId + "/synthesis_paper_storage",
  368. });
  369. },
  370. openExportDialog(row) {
  371. this.exportModel.id = row.id;
  372. this.exportModel.courseCode = row.courseCode;
  373. this.exportModel.courseName = row.courseName;
  374. this.exportModel.exportContentList = [];
  375. this.exportDialog = true;
  376. },
  377. toBuildPaper() {
  378. this.cacheSearchInfo();
  379. this.$router.push({ name: "SynthesisPaper" });
  380. },
  381. // batch action
  382. async batchDeleteGenPaper() {
  383. if (!this.selectedPaperIds.length) {
  384. this.$notify({
  385. message: "请勾选删除的数据",
  386. type: "warning",
  387. });
  388. return;
  389. }
  390. const confirm = await this.$confirm("确认删除试卷吗?", "提示", {
  391. type: "warning",
  392. }).catch(() => {});
  393. if (confirm !== "confirm") return;
  394. const res = await synthesizePaperDeleteApi(this.selectedPaperIds).catch(
  395. (error) => {
  396. this.$notify({
  397. message: error.response.data.desc,
  398. type: "error",
  399. });
  400. }
  401. );
  402. if (!res) return;
  403. this.$notify({
  404. message: "删除成功",
  405. type: "success",
  406. });
  407. this.searchGenPaper();
  408. this.selectedPaperIds = [];
  409. },
  410. openBatchExportPaperDialog() {
  411. if (!this.selectedPaperIds.length) {
  412. this.$notify({
  413. message: "请勾选数据",
  414. type: "warning",
  415. });
  416. return;
  417. }
  418. this.exportModel = {
  419. id: "",
  420. courseCode: "",
  421. courseName: "",
  422. exportContentList: [],
  423. seqMode: "MODE1",
  424. };
  425. this.exportDialog = true;
  426. },
  427. //导出试卷,答案,机考数据包
  428. async exportPaperInfo() {
  429. if (!this.exportModel.exportContentList.length) {
  430. this.$notify({
  431. message: "请选择导出内容",
  432. type: "error",
  433. });
  434. return false;
  435. }
  436. let synthesizePaperIds =
  437. this.selectedPaperIds.join() || this.exportModel.id;
  438. const exportContentList = this.exportModel.exportContentList.join();
  439. this.exportDialog = false;
  440. const res = await downloadByApi(() => {
  441. return synthesizePaperDownloadApi({
  442. exportContentList,
  443. synthesizePaperIds,
  444. seqMode: this.exportModel.seqMode,
  445. });
  446. }).catch((e) => {
  447. this.$message.error(e || "下载失败,请重新尝试!");
  448. });
  449. this.downloading = false;
  450. if (!res) return;
  451. this.$message.success("下载成功!");
  452. },
  453. // init
  454. initData() {
  455. const cacheInfo = window.sessionStorage.getItem("synthesis-paper");
  456. if (cacheInfo) {
  457. const { currentPage, pageSize, formSearch } = JSON.parse(cacheInfo);
  458. this.formSearch = { ...formSearch };
  459. this.currentPage = currentPage;
  460. this.pageSize = pageSize;
  461. this.handleCurrentChange(this.currentPage);
  462. window.sessionStorage.removeItem("synthesis-paper");
  463. } else {
  464. this.handleCurrentChange(1);
  465. }
  466. this.getCourses(this.formSearch.courseName);
  467. },
  468. cacheSearchInfo() {
  469. window.sessionStorage.setItem(
  470. "synthesis-paper",
  471. JSON.stringify({
  472. formSearch: this.formSearch,
  473. currentPage: this.currentPage,
  474. pageSize: this.pageSize,
  475. })
  476. );
  477. },
  478. },
  479. };
  480. </script>