SynthesisPaperStorage.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  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="difficulty"
  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-radio-group
  209. v-model="exportModel.exportContent"
  210. @change="getTemplates('')"
  211. >
  212. <el-radio label="PAPER">试卷</el-radio>
  213. <el-radio label="ANSWER">答案</el-radio>
  214. </el-radio-group>
  215. </el-form-item>
  216. <el-form-item v-if="showSeqMode" label="小题序号">
  217. <el-radio-group v-model="exportModel.seqMode" class="input">
  218. <el-radio label="MODE1">单题型连续</el-radio>
  219. <el-radio label="MODE2">客观题整体连续</el-radio>
  220. <el-radio label="MODE3">按大题独立</el-radio>
  221. <el-radio label="MODE5">整卷连续</el-radio>
  222. </el-radio-group>
  223. </el-form-item>
  224. <el-form-item v-if="showSeqMode" label="模板">
  225. <el-select
  226. v-model="exportModel.templateId"
  227. filterable
  228. :remote-method="getTemplates"
  229. remote
  230. clearable
  231. placeholder="请选择"
  232. @clear="getTemplates('')"
  233. >
  234. <el-option
  235. v-for="item in templateList"
  236. :key="item.id"
  237. :label="item.fileName"
  238. :value="item.id"
  239. >
  240. </el-option>
  241. </el-select>
  242. </el-form-item>
  243. </el-form>
  244. <div slot="footer">
  245. <el-button type="primary" @click="exportPaperInfo">开始导出</el-button>
  246. </div>
  247. </el-dialog>
  248. </section>
  249. </template>
  250. <script>
  251. import { mapState } from "vuex";
  252. import {
  253. courseQueryApi,
  254. synthesizePaperPageListApi,
  255. synthesizePaperDeleteApi,
  256. synthesizePaperDownloadApi,
  257. } from "../api";
  258. import { downloadByApi } from "@/plugins/download";
  259. import { QUESTION_API } from "@/constants/constants";
  260. export default {
  261. data() {
  262. return {
  263. templateList: [],
  264. courseLoading: false,
  265. formSearch: {
  266. courseId: "",
  267. courseName: "",
  268. creationBy: "",
  269. updateBy: "",
  270. paperName: "",
  271. },
  272. tableData: [],
  273. currentPage: 1,
  274. pageSize: 10,
  275. total: 0,
  276. loading: false,
  277. courseList: [],
  278. selectedPaperIds: [],
  279. exportDialog: false,
  280. exportModel: {
  281. id: "",
  282. courseCode: "",
  283. courseName: "",
  284. templateId: "",
  285. exportContent: "",
  286. seqMode: "MODE1",
  287. },
  288. };
  289. },
  290. computed: {
  291. courseInfoSelect() {
  292. var courseList = [];
  293. for (let course of this.courseList) {
  294. var courseInfo = course.name + "(" + course.code + ")";
  295. var courseId = course.id;
  296. var courseName = courseName;
  297. courseList.push({
  298. courseId: courseId,
  299. courseInfo: courseInfo,
  300. courseName: courseName,
  301. });
  302. }
  303. return courseList;
  304. },
  305. noBatchSelected() {
  306. return this.selectedPaperIds.length === 0;
  307. },
  308. showSeqMode() {
  309. return (
  310. this.exportModel.exportContent == "PAPER" ||
  311. this.exportModel.exportContent == "ANSWER"
  312. );
  313. },
  314. ...mapState({ user: (state) => state.user }),
  315. },
  316. created() {
  317. this.initData();
  318. },
  319. methods: {
  320. getTemplates(name) {
  321. this.exportModel.templateId = "";
  322. var url = QUESTION_API + "/exportTemplate/page/1/20";
  323. let type;
  324. if (this.exportModel.exportContent == "PAPER") {
  325. type = "SYNTHESIZE_PAPER_EXPORT";
  326. } else if (this.exportModel.exportContent == "ANSWER") {
  327. type = "SYNTHESIZE_ANSWER_EXPORT";
  328. } else {
  329. return;
  330. }
  331. let params = {
  332. rootOrgId: this.user.rootOrgId,
  333. fileName: name,
  334. enable: true,
  335. type: type,
  336. };
  337. this.$httpWithMsg.get(url, { params: params }).then((response) => {
  338. this.templateList = response.data.content;
  339. });
  340. },
  341. async getCourses(query) {
  342. this.courseLoading = true;
  343. query = query && query.trim();
  344. const res = await courseQueryApi(query, "true");
  345. this.courseList = res.data || [];
  346. this.courseLoading = false;
  347. },
  348. courseChange() {
  349. const course = this.courseList.find(
  350. (item) => item.id === this.formSearch.courseId
  351. );
  352. if (course) {
  353. this.formSearch.courseName = course.name;
  354. }
  355. },
  356. resetForm() {
  357. this.formSearch = {
  358. courseId: "",
  359. courseName: "",
  360. creationBy: "",
  361. updateBy: "",
  362. name: "",
  363. };
  364. },
  365. //查询
  366. searchFrom() {
  367. this.currentPage = 1;
  368. this.searchGenPaper();
  369. },
  370. async searchGenPaper() {
  371. this.loading = true;
  372. const datas = {
  373. ...this.formSearch,
  374. pageNumber: this.currentPage,
  375. pageSize: this.pageSize,
  376. };
  377. const res = await synthesizePaperPageListApi(datas).catch(() => {});
  378. this.loading = false;
  379. if (!res) return;
  380. this.tableData = res.data.content;
  381. this.total = res.data.totalElements;
  382. },
  383. handleCurrentChange(val) {
  384. this.currentPage = val;
  385. this.searchGenPaper();
  386. },
  387. handleSizeChange(val) {
  388. this.pageSize = val;
  389. this.currentPage = 1;
  390. this.searchGenPaper();
  391. },
  392. selectChange(row) {
  393. this.selectedPaperIds = row.map((item) => item.id);
  394. },
  395. toViewPaper(row) {
  396. var key = this.user.key;
  397. var token = this.user.token;
  398. window.open(
  399. QUESTION_API +
  400. "/synthesize/paper/preview?synthesizePaperId=" +
  401. row.id +
  402. "&$key=" +
  403. key +
  404. "&$token=" +
  405. token
  406. );
  407. },
  408. toEditPaper(paper) {
  409. this.cacheSearchInfo();
  410. this.$router.push({
  411. path: "/edit_paper/" + paper.paperId + "/synthesis_paper_storage",
  412. });
  413. },
  414. openExportDialog(row) {
  415. this.exportModel.id = row.id;
  416. this.exportModel.courseCode = row.courseCode;
  417. this.exportModel.courseName = row.courseName;
  418. this.exportModel.exportContent = "";
  419. this.exportModel.templateId = "";
  420. this.exportDialog = true;
  421. },
  422. toBuildPaper() {
  423. this.cacheSearchInfo();
  424. this.$router.push({ name: "SynthesisPaper" });
  425. },
  426. // batch action
  427. async batchDeleteGenPaper() {
  428. if (!this.selectedPaperIds.length) {
  429. this.$notify({
  430. message: "请勾选删除的数据",
  431. type: "warning",
  432. });
  433. return;
  434. }
  435. const confirm = await this.$confirm("确认删除试卷吗?", "提示", {
  436. type: "warning",
  437. }).catch(() => {});
  438. if (confirm !== "confirm") return;
  439. const res = await synthesizePaperDeleteApi(this.selectedPaperIds).catch(
  440. () => {}
  441. );
  442. if (!res) return;
  443. this.$notify({
  444. message: "删除成功",
  445. type: "success",
  446. });
  447. this.searchGenPaper();
  448. this.selectedPaperIds = [];
  449. },
  450. openBatchExportPaperDialog() {
  451. if (!this.selectedPaperIds.length) {
  452. this.$notify({
  453. message: "请勾选数据",
  454. type: "warning",
  455. });
  456. return;
  457. }
  458. this.exportModel = {
  459. id: "",
  460. courseCode: "",
  461. courseName: "",
  462. templateId: "",
  463. exportContent: "",
  464. seqMode: "MODE1",
  465. };
  466. this.exportDialog = true;
  467. },
  468. //导出试卷,答案,机考数据包
  469. async exportPaperInfo() {
  470. if (
  471. !this.exportModel.exportContent ||
  472. this.exportModel.exportContent == ""
  473. ) {
  474. this.$notify({
  475. message: "请选择导出内容",
  476. type: "error",
  477. });
  478. return false;
  479. }
  480. let element = this.exportModel.exportContent;
  481. if (
  482. (element == "PAPER" || element == "ANSWER") &&
  483. !this.exportModel.templateId
  484. ) {
  485. this.$notify({
  486. message: "请选择模板",
  487. type: "error",
  488. });
  489. return false;
  490. }
  491. let synthesizePaperIds =
  492. this.selectedPaperIds.join() || this.exportModel.id;
  493. const exportContent = this.exportModel.exportContent;
  494. this.exportDialog = false;
  495. const res = await downloadByApi(() => {
  496. return synthesizePaperDownloadApi({
  497. exportContent,
  498. synthesizePaperIds,
  499. seqMode: this.exportModel.seqMode,
  500. templateId: this.exportModel.templateId,
  501. });
  502. }).catch((e) => {
  503. this.$message.error(e || "下载失败,请重新尝试!");
  504. });
  505. this.downloading = false;
  506. if (!res) return;
  507. this.$message.success("下载成功!");
  508. },
  509. // init
  510. initData() {
  511. const cacheInfo = window.sessionStorage.getItem("synthesis-paper");
  512. if (cacheInfo) {
  513. const { currentPage, pageSize, formSearch } = JSON.parse(cacheInfo);
  514. this.formSearch = { ...formSearch };
  515. this.currentPage = currentPage;
  516. this.pageSize = pageSize;
  517. this.handleCurrentChange(this.currentPage);
  518. window.sessionStorage.removeItem("synthesis-paper");
  519. } else {
  520. this.handleCurrentChange(1);
  521. }
  522. this.getCourses(this.formSearch.courseName);
  523. },
  524. cacheSearchInfo() {
  525. window.sessionStorage.setItem(
  526. "synthesis-paper",
  527. JSON.stringify({
  528. formSearch: this.formSearch,
  529. currentPage: this.currentPage,
  530. pageSize: this.pageSize,
  531. })
  532. );
  533. },
  534. },
  535. };
  536. </script>