TaskPaperManage.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <template>
  2. <div class="task-paper-manage">
  3. <div class="part-box part-box-filter">
  4. <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
  5. <template v-if="checkPrivilege('condition', 'condition')">
  6. <el-form-item label="学期:">
  7. <semester-select
  8. v-model="filter.semesterId"
  9. default-select
  10. @default-selected="getList"
  11. ></semester-select>
  12. </el-form-item>
  13. <el-form-item label="考试:">
  14. <exam-select
  15. v-model="filter.examId"
  16. :semester-id="filter.semesterId"
  17. ></exam-select>
  18. </el-form-item>
  19. <el-form-item label="课程(代码):" label-width="110px">
  20. <course-select
  21. ref="CourseSelect"
  22. v-model="filter.courseCode"
  23. :semester-id="filter.semesterId"
  24. :exam-id="filter.examId"
  25. placeholder="课程(代码)"
  26. clearable
  27. ></course-select>
  28. </el-form-item>
  29. <el-form-item label="试卷编号:">
  30. <paper-number-select
  31. ref="PaperNumberSelect"
  32. v-model="filter.paperNumber"
  33. :semester-id="filter.semesterId"
  34. :exam-id="filter.examId"
  35. :course-code="filter.courseCode"
  36. placeholder="试卷编号"
  37. clearable
  38. ></paper-number-select>
  39. </el-form-item>
  40. <el-form-item label="入库时间:">
  41. <el-date-picker
  42. v-model="createTime"
  43. type="datetimerange"
  44. :picker-options="pickerOptions"
  45. range-separator="至"
  46. start-placeholder="入库开始时间"
  47. end-placeholder="入库结束时间"
  48. value-format="timestamp"
  49. align="right"
  50. unlink-panels
  51. >
  52. </el-date-picker>
  53. </el-form-item>
  54. </template>
  55. <el-form-item label-width="0px">
  56. <el-button
  57. v-if="checkPrivilege('button', 'select')"
  58. type="primary"
  59. @click="toPage(1)"
  60. >查询</el-button
  61. >
  62. </el-form-item>
  63. </el-form>
  64. <div class="box-justify">
  65. <div></div>
  66. <div>
  67. <el-button
  68. v-if="checkPrivilege('button', 'BatchDownload')"
  69. icon="el-icon-download"
  70. type="primary"
  71. :loading="loading"
  72. @click="toBatchExport"
  73. >
  74. 批量下载试卷题卡
  75. </el-button>
  76. <el-button
  77. v-if="checkPrivilege('button', 'BatchDownload')"
  78. type="primary"
  79. icon="el-icon-s-order"
  80. @click="toDataTask"
  81. >下载结果查询</el-button
  82. >
  83. </div>
  84. </div>
  85. </div>
  86. <div class="part-box part-box-pad">
  87. <el-table ref="TableList" :data="papers">
  88. <el-table-column
  89. type="index"
  90. label="序号"
  91. width="70"
  92. :index="indexMethod"
  93. ></el-table-column>
  94. <el-table-column
  95. prop="semesterName"
  96. label="学期"
  97. min-width="160"
  98. ></el-table-column>
  99. <el-table-column
  100. prop="examName"
  101. label="考试"
  102. min-width="160"
  103. ></el-table-column>
  104. <el-table-column
  105. prop="paperNumber"
  106. label="试卷编号"
  107. min-width="160"
  108. ></el-table-column>
  109. <el-table-column prop="courseName" label="课程(代码)" min-width="200">
  110. <template slot-scope="scope">
  111. {{ scope.row.courseName }}({{ scope.row.courseCode }})
  112. </template>
  113. </el-table-column>
  114. <el-table-column
  115. prop="paperType"
  116. label="卷型"
  117. width="80"
  118. ></el-table-column>
  119. <el-table-column
  120. prop="userName"
  121. label="命题老师"
  122. min-width="100"
  123. ></el-table-column>
  124. <el-table-column prop="createTime" label="入库时间" width="170">
  125. <span slot-scope="scope">{{
  126. scope.row.createTime | timestampFilter
  127. }}</span>
  128. </el-table-column>
  129. <el-table-column prop="exposedPaperType" label="已曝光" width="80">
  130. <span slot-scope="scope">{{
  131. scope.row.exposedPaperType | defaultFieldFilter
  132. }}</span>
  133. </el-table-column>
  134. <el-table-column prop="unexposedPaperType" label="未曝光" width="80">
  135. <span slot-scope="scope">{{
  136. scope.row.unexposedPaperType | defaultFieldFilter
  137. }}</span>
  138. </el-table-column>
  139. <el-table-column prop="enable" label="启用/禁用" width="90">
  140. <template slot-scope="scope">
  141. {{ scope.row.enable | enableFilter }}
  142. </template>
  143. </el-table-column>
  144. <el-table-column
  145. class-name="action-column"
  146. label="操作"
  147. width="210px"
  148. fixed="right"
  149. >
  150. <template slot-scope="scope">
  151. <el-button
  152. v-if="checkPrivilege('link', 'preview')"
  153. class="btn-primary"
  154. type="text"
  155. @click="toPreview(scope.row)"
  156. >预览</el-button
  157. >
  158. <el-button
  159. v-if="checkPrivilege('link', 'edit')"
  160. class="btn-primary"
  161. type="text"
  162. @click="toEdit(scope.row)"
  163. >编辑</el-button
  164. >
  165. <el-button
  166. v-if="checkPrivilege('link', 'enable')"
  167. :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
  168. type="text"
  169. @click="toEnable(scope.row)"
  170. >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
  171. >
  172. <el-button
  173. v-if="checkPrivilege('link', 'download')"
  174. class="btn-primary"
  175. type="text"
  176. :disabled="loading"
  177. @click="toDownload(scope.row)"
  178. >下载</el-button
  179. >
  180. <el-button
  181. v-if="checkPrivilege('link', 'publish')"
  182. class="btn-primary"
  183. type="text"
  184. @click="toPublishPrintTask(scope.row)"
  185. >发布印刷任务</el-button
  186. >
  187. <el-button
  188. v-if="checkPrivilege('link', 'cancel')"
  189. class="btn-danger"
  190. type="text"
  191. @click="toCancel(scope.row)"
  192. >作废</el-button
  193. >
  194. </template>
  195. </el-table-column>
  196. </el-table>
  197. <div class="part-page">
  198. <el-pagination
  199. v-if="papers.length"
  200. background
  201. layout="total, sizes, prev, pager, next, jumper"
  202. :pager-count="5"
  203. :current-page="current"
  204. :total="total"
  205. :page-size="size"
  206. @current-change="toPage"
  207. @size-change="pageSizeChange"
  208. >
  209. </el-pagination>
  210. </div>
  211. </div>
  212. <!-- ModifyTaskPaper -->
  213. <modify-task-paper
  214. v-if="checkPrivilege('link', 'edit') || checkPrivilege('link', 'preview')"
  215. :instance="curPaper"
  216. :edit-type="editType"
  217. ref="ModifyTaskPaper"
  218. @modified="getList"
  219. ></modify-task-paper>
  220. <!-- PublishPrintTask -->
  221. <publish-print-task
  222. v-if="checkPrivilege('link', 'publish')"
  223. :instance="curPaper"
  224. ref="PublishPrintTask"
  225. ></publish-print-task>
  226. <!-- data-task-dialog -->
  227. <data-task-dialog
  228. v-if="checkPrivilege('button', 'BatchDownload')"
  229. ref="DataTaskDialog"
  230. task-type="PAPER_AND_CARD_PDF_DOWNLOAD"
  231. ></data-task-dialog>
  232. </div>
  233. </template>
  234. <script>
  235. import {
  236. taskPaperListPage,
  237. ableTaskPaper,
  238. downloadPaper,
  239. paperAndCardBatchExport,
  240. cancelTaskPaper,
  241. } from "../api";
  242. import pickerOptions from "@/constants/datePickerOptions";
  243. import { downloadByApi } from "@/plugins/download";
  244. import { CARD_SOURCE_TYPE } from "@/constants/enumerate";
  245. import ModifyTaskPaper from "../components/ModifyTaskPaper";
  246. import PublishPrintTask from "../components/PublishPrintTask";
  247. export default {
  248. name: "task-paper-manage",
  249. components: { ModifyTaskPaper, PublishPrintTask },
  250. data() {
  251. return {
  252. filter: {
  253. semesterId: "",
  254. examId: "",
  255. courseCode: "",
  256. paperNumber: "",
  257. cardRuleId: "",
  258. makeMethod: "",
  259. startTime: "",
  260. endTime: "",
  261. },
  262. current: 1,
  263. size: this.GLOBAL.pageSize,
  264. total: 0,
  265. papers: [],
  266. curPaper: {},
  267. loading: false,
  268. editType: "EDIT",
  269. CARD_SOURCE_TYPE,
  270. IS_QUESTION_TEACHER: this.$ls
  271. .get("user", { roleList: [] })
  272. .roleList.includes("QUESTION_TEACHER"),
  273. IS_EXAM_TEACHER: this.$ls
  274. .get("user", { roleList: [] })
  275. .roleList.includes("EXAM_TEACHER"),
  276. cancelRemark: "",
  277. // date-picker
  278. createTime: [],
  279. pickerOptions,
  280. };
  281. },
  282. mounted() {
  283. this.initData();
  284. },
  285. methods: {
  286. async initData() {
  287. const cachePageInfo = this.$ls.get("cachePageInfo");
  288. if (cachePageInfo) {
  289. this.filter = this.$objAssign(this.filter, cachePageInfo.filter);
  290. if (this.filter.startTime && this.filter.endTime)
  291. this.createTime = [this.filter.startTime, this.filter.endTime];
  292. this.current = cachePageInfo.page;
  293. await this.getList();
  294. this.$nextTick(() => {
  295. const curRow = this.papers.find(
  296. (item) => item.id === cachePageInfo.curRowId
  297. );
  298. if (!curRow) return;
  299. this.toEdit(curRow);
  300. });
  301. } else {
  302. // this.toPage(1);
  303. }
  304. this.$ls.remove("cachePageInfo");
  305. },
  306. async getList() {
  307. if (!this.checkPrivilege("list", "list")) return;
  308. const datas = {
  309. ...this.filter,
  310. pageNumber: this.current,
  311. pageSize: this.size,
  312. };
  313. if (this.createTime) {
  314. datas.startTime = this.createTime[0];
  315. datas.endTime = this.createTime[1];
  316. }
  317. const data = await taskPaperListPage(datas);
  318. this.papers = data.records;
  319. this.total = data.total;
  320. },
  321. toPage(page) {
  322. this.current = page;
  323. this.getList();
  324. },
  325. async toEnable(row) {
  326. const msgs = [
  327. ["命题任务禁用后,会触发试卷关联解除,您确定要禁用命题任务吗?"],
  328. [
  329. "命题任务启用后,触发试卷关联校验,若能匹配则自动关联试卷,您确定要启用命题任务吗?",
  330. ],
  331. ];
  332. const msg = row.enable ? msgs[0] : msgs[1];
  333. const msgHtml = msg
  334. .map((item) => `<p class="text-left">${item}</p>`)
  335. .join("");
  336. this.$confirm(msgHtml, "提示", {
  337. dangerouslyUseHTMLString: true,
  338. type: "warning",
  339. })
  340. .then(async () => {
  341. const enable = !row.enable;
  342. await ableTaskPaper({
  343. id: row.id,
  344. enable,
  345. });
  346. row.enable = enable;
  347. this.$message.success("操作成功!");
  348. })
  349. .catch(() => {});
  350. },
  351. async toCancel(row) {
  352. const res = await this.$prompt("确定要作废选中的命题任务吗", "提示", {
  353. type: "warning",
  354. showInput: true,
  355. inputPlaceholder: "请输入作废理由",
  356. inputValue: this.cancelRemark,
  357. inputValidator: (val) => {
  358. if (!val) return "请输入作废理由";
  359. if (val.length > 100) return "作废理由不得超过100个字符!";
  360. return true;
  361. },
  362. }).catch(() => {});
  363. if (!res || res.action !== "confirm") {
  364. return;
  365. }
  366. this.cancelRemark = res.value;
  367. const result = await cancelTaskPaper({
  368. id: row.id,
  369. cancelRemark: this.cancelRemark,
  370. }).catch(() => {});
  371. this.cancelRemark = "";
  372. if (!result) return;
  373. this.$message.success("操作成功!");
  374. this.getList();
  375. },
  376. toEdit(row) {
  377. this.curPaper = row;
  378. this.editType = "EDIT";
  379. this.$refs.ModifyTaskPaper.open();
  380. },
  381. toPreview(row) {
  382. this.curPaper = row;
  383. this.editType = "PREVIEW";
  384. this.$refs.ModifyTaskPaper.open();
  385. },
  386. toPublishPrintTask(row) {
  387. this.curPaper = row;
  388. this.$refs.PublishPrintTask.open();
  389. },
  390. async toDownload(row) {
  391. if (this.loading) return;
  392. this.loading = true;
  393. const res = await downloadByApi(() => {
  394. return downloadPaper(row.id);
  395. }, `${row.paperNumber}-${Date.now()}.zip`).catch((e) => {
  396. this.$message.error(e || "下载失败,请重新尝试!");
  397. });
  398. this.loading = false;
  399. if (!res) return;
  400. this.$message.success("下载成功!");
  401. },
  402. async toBatchExport() {
  403. // 异步导出
  404. if (this.loading) return;
  405. this.loading = true;
  406. let datas = {
  407. ...this.filter,
  408. };
  409. if (this.createTime) {
  410. datas.startTime = this.createTime[0];
  411. datas.endTime = this.createTime[1];
  412. }
  413. const res = await paperAndCardBatchExport(datas).catch(() => {});
  414. this.loading = false;
  415. if (res) {
  416. this.$message.success("导出任务已提交!");
  417. } else {
  418. this.$message.error("导出任务提交失败,请重新尝试!");
  419. }
  420. },
  421. toDataTask() {
  422. this.$refs.DataTaskDialog.open();
  423. },
  424. },
  425. beforeRouteLeave(to, from, next) {
  426. if (to.name === "CardEdit") {
  427. this.$ls.set("cachePageInfo", {
  428. page: this.current,
  429. filter: this.filter,
  430. curRowId: this.curPaper.id,
  431. });
  432. } else {
  433. this.$ls.remove("cachePageInfo");
  434. }
  435. next();
  436. },
  437. };
  438. </script>