PrintTaskManage.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. <template>
  2. <div class="print-task-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.trim="filter.semesterId"
  9. placeholder="学期"
  10. default-select
  11. @default-selected="search"
  12. ></semester-select>
  13. </el-form-item>
  14. <el-form-item label="考试:">
  15. <exam-select
  16. v-model="filter.examId"
  17. :semester-id="filter.semesterId"
  18. ></exam-select>
  19. </el-form-item>
  20. <el-form-item label="印刷计划:">
  21. <print-plan-select
  22. v-model.trim="filter.printPlanId"
  23. placeholder="印刷计划"
  24. clearable
  25. :semester-id="filter.semesterId"
  26. :exam-id="filter.examId"
  27. @change="printPlanChange"
  28. ></print-plan-select>
  29. </el-form-item>
  30. <el-form-item label="课程(代码):" label-width="110px">
  31. <course-select
  32. v-model.trim="filter.courseCode"
  33. :semester-id="filter.semesterId"
  34. :exam-id="filter.examId"
  35. :print-plan-id="filter.printPlanId"
  36. placeholder="课程(代码)"
  37. clearable
  38. ></course-select>
  39. </el-form-item>
  40. <el-form-item label="试卷编号:">
  41. <paper-number-select
  42. ref="PaperNumberSelect"
  43. v-model="filter.paperNumber"
  44. :semester-id="filter.semesterId"
  45. :exam-id="filter.examId"
  46. :print-plan-id="filter.printPlanId"
  47. :course-code="filter.courseCode"
  48. placeholder="试卷编号"
  49. clearable
  50. ></paper-number-select>
  51. </el-form-item>
  52. <el-form-item label="印刷室:">
  53. <print-room-select
  54. v-model.trim="filter.printHouseId"
  55. placeholder="印刷室"
  56. clearable
  57. @change="printPlanChange"
  58. ></print-room-select>
  59. </el-form-item>
  60. <el-form-item label="印刷状态:">
  61. <el-select
  62. v-model="filter.status"
  63. style="width: 120px;"
  64. placeholder="印刷状态"
  65. clearable
  66. >
  67. <el-option
  68. v-for="(val, key) in PRINT_TASK_STATUS"
  69. :key="key"
  70. :value="key"
  71. :label="val"
  72. ></el-option>
  73. </el-select>
  74. </el-form-item>
  75. <el-form-item label="考点:" label-width="55px">
  76. <place-select
  77. v-model.trim="filter.examPlace"
  78. :print-plan-id="filter.printPlanId"
  79. placeholder="考点"
  80. clearable
  81. ></place-select>
  82. </el-form-item>
  83. <el-form-item label="考场:" label-width="55px">
  84. <room-select
  85. v-model.trim="filter.examRoom"
  86. :print-plan-id="filter.printPlanId"
  87. placeholder="考场"
  88. clearable
  89. ></room-select>
  90. </el-form-item>
  91. <el-form-item label="考试日期:">
  92. <el-date-picker
  93. v-model="createTime"
  94. type="daterange"
  95. :picker-options="pickerOptions"
  96. range-separator="至"
  97. start-placeholder="考试开始日期"
  98. end-placeholder="考试结束日期"
  99. value-format="timestamp"
  100. align="right"
  101. unlink-panels
  102. >
  103. </el-date-picker>
  104. </el-form-item>
  105. <el-form-item label="打印时间:">
  106. <el-date-picker
  107. v-model="printTime"
  108. type="datetimerange"
  109. :picker-options="pickerOptions"
  110. range-separator="至"
  111. start-placeholder="打印开始时间"
  112. end-placeholder="打印结束时间"
  113. value-format="timestamp"
  114. align="right"
  115. unlink-panels
  116. >
  117. </el-date-picker>
  118. </el-form-item>
  119. </template>
  120. <el-form-item label-width="0px">
  121. <el-button
  122. v-if="checkPrivilege('button', 'select')"
  123. type="primary"
  124. @click="search"
  125. >查询</el-button
  126. >
  127. </el-form-item>
  128. </el-form>
  129. <div class="box-justify">
  130. <div></div>
  131. <div>
  132. <el-button
  133. v-if="checkPrivilege('button', 'BatchDownload')"
  134. icon="el-icon-download"
  135. type="primary"
  136. :disabled="loading"
  137. @click="toExport"
  138. >
  139. 批量下载PDF
  140. </el-button>
  141. <el-button
  142. v-if="checkPrivilege('button', 'BatchDownload')"
  143. type="primary"
  144. icon="el-icon-s-order"
  145. @click="toDataTask"
  146. >下载结果查询</el-button
  147. >
  148. </div>
  149. </div>
  150. </div>
  151. <div class="part-box part-box-pad box-justify">
  152. <p>
  153. <span class="mr-4"
  154. >科次总计:<i class="color-primary">{{ totalInfo.totalSubjects }}</i>
  155. 科次</span
  156. >
  157. <span class="mr-4"
  158. >试卷总计:<i class="color-primary">{{ totalInfo.paperCount }}</i>
  159. 套</span
  160. >
  161. <span class="mr-4"
  162. >卷袋总计:<i class="color-primary">{{ totalInfo.packageCount }}</i>
  163. 个</span
  164. >
  165. <span
  166. >总印量:<i class="color-primary">{{
  167. totalInfo.paperPages + totalInfo.cardPages
  168. }}</i>
  169. 张</span
  170. >
  171. <span
  172. >(试卷:<i class="color-primary">{{ totalInfo.paperPages }}</i>
  173. 张,</span
  174. >
  175. <span
  176. >题卡:<i class="color-primary">{{ totalInfo.cardPages }}</i>
  177. 张)</span
  178. >
  179. </p>
  180. <p>
  181. <span
  182. >剩余印量:<i class="color-danger">{{
  183. totalInfo.paperPagesLeft + totalInfo.cardPagesLeft
  184. }}</i>
  185. 张</span
  186. >
  187. <span
  188. >(试卷:<i class="color-danger">{{ totalInfo.paperPagesLeft }}</i>
  189. 张,</span
  190. >
  191. <span
  192. >题卡:<i class="color-danger">{{ totalInfo.cardPagesLeft }}</i>
  193. 张)</span
  194. >
  195. </p>
  196. </div>
  197. <div class="part-box part-box-pad">
  198. <el-table
  199. ref="TableList"
  200. :data="dataList"
  201. @selection-change="handleSelectionChange"
  202. >
  203. <el-table-column
  204. type="selection"
  205. width="55"
  206. align="center"
  207. ></el-table-column>
  208. <el-table-column
  209. type="index"
  210. label="序号"
  211. width="60"
  212. :index="indexMethod"
  213. ></el-table-column>
  214. <el-table-column
  215. prop="semesterName"
  216. label="学期"
  217. min-width="160"
  218. ></el-table-column>
  219. <el-table-column
  220. prop="examName"
  221. label="考试"
  222. min-width="160"
  223. ></el-table-column>
  224. <el-table-column
  225. prop="packageCode"
  226. label="卷袋编号"
  227. min-width="160"
  228. ></el-table-column>
  229. <el-table-column
  230. prop="printPlanName"
  231. label="印刷计划"
  232. min-width="200"
  233. ></el-table-column>
  234. <el-table-column
  235. prop="printHouseName"
  236. label="印刷室"
  237. min-width="160"
  238. ></el-table-column>
  239. <el-table-column
  240. prop="examDate"
  241. label="考试日期"
  242. width="100"
  243. ></el-table-column>
  244. <el-table-column
  245. prop="examTime"
  246. label="考试时间"
  247. width="100"
  248. ></el-table-column>
  249. <el-table-column
  250. prop="courseNameCode"
  251. label="课程(代码)"
  252. min-width="200"
  253. >
  254. </el-table-column>
  255. <el-table-column
  256. prop="paperNumber"
  257. label="试卷编号"
  258. min-width="160"
  259. ></el-table-column>
  260. <el-table-column
  261. prop="examPlace"
  262. label="考点"
  263. min-width="160"
  264. ></el-table-column>
  265. <el-table-column
  266. prop="examRoom"
  267. label="考场"
  268. min-width="160"
  269. ></el-table-column>
  270. <!-- <el-table-column
  271. prop="singlePagesA3"
  272. label="单科次准印量A3(页)"
  273. width="80"
  274. ></el-table-column> -->
  275. <el-table-column
  276. prop="totalSubjects"
  277. label="科次"
  278. width="80"
  279. ></el-table-column>
  280. <!-- <el-table-column
  281. prop="pagesA3"
  282. label="A3准印量小计(页)"
  283. width="80"
  284. ></el-table-column>
  285. <el-table-column
  286. prop="pagesA4"
  287. label="A4准印量小计(页)"
  288. width="80"
  289. ></el-table-column> -->
  290. <el-table-column prop="status" label="印刷状态" width="80">
  291. <span slot-scope="scope">{{
  292. scope.row.status | printTaskStatusFilter
  293. }}</span>
  294. </el-table-column>
  295. <el-table-column prop="validate" label="是否校验" width="80">
  296. <span slot-scope="scope">{{ scope.row.validate ? "是" : "否" }}</span>
  297. </el-table-column>
  298. <el-table-column prop="printStartTime" label="打印开始时间" width="170">
  299. <span slot-scope="scope">{{
  300. scope.row.printStartTime | timestampFilter
  301. }}</span>
  302. </el-table-column>
  303. <el-table-column prop="printEndTime" label="打印完成时间" width="170">
  304. <span slot-scope="scope">{{
  305. scope.row.printEndTime | timestampFilter
  306. }}</span>
  307. </el-table-column>
  308. <el-table-column prop="normal" label="任务状态" width="80">
  309. <span slot-scope="scope">{{
  310. scope.row.normal ? "正常" : "作废"
  311. }}</span>
  312. </el-table-column>
  313. <el-table-column
  314. class-name="action-column"
  315. label="操作"
  316. width="160"
  317. fixed="right"
  318. >
  319. <template slot-scope="scope">
  320. <el-button
  321. v-if="checkPrivilege('link', 'download')"
  322. class="btn-primary"
  323. type="text"
  324. @click="toViewPdf(scope.row)"
  325. >查看pdf</el-button
  326. >
  327. <el-button
  328. v-if="
  329. scope.row.status === 'READY' && checkPrivilege('link', 'submit')
  330. "
  331. class="btn-primary"
  332. type="text"
  333. @click="toSubmit(scope.row)"
  334. >提交印刷</el-button
  335. >
  336. <!-- <el-button
  337. v-if="scope.row.status === 'PRINTING'"
  338. class="btn-primary"
  339. type="text"
  340. @click="toResubmit(scope.row)"
  341. >重新提交</el-button> -->
  342. <el-button
  343. v-if="
  344. scope.row.status === 'WAITING' && checkPrivilege('link', 'end')
  345. "
  346. class="btn-danger"
  347. type="text"
  348. @click="toCancel(scope.row)"
  349. >撤回提交</el-button
  350. >
  351. <el-button
  352. v-if="
  353. (scope.row.status === 'END' ||
  354. scope.row.status === 'PRINT_FINISH') &&
  355. checkPrivilege('link', 'normal')
  356. "
  357. :class="scope.row.normal ? 'btn-danger' : 'btn-primary'"
  358. type="text"
  359. @click="toNormal(scope.row)"
  360. >{{ scope.row.normal ? "作废" : "恢复" }}</el-button
  361. >
  362. <!-- <el-button
  363. class="btn-primary"
  364. type="text"
  365. @click="toPreview(scope.row)"
  366. >查看印品模板</el-button> -->
  367. </template>
  368. </el-table-column>
  369. </el-table>
  370. <div class="part-page">
  371. <el-pagination
  372. background
  373. layout="total, sizes, prev, pager, next, jumper"
  374. :pager-count="5"
  375. :current-page="current"
  376. :total="total"
  377. :page-size="size"
  378. @current-change="toPage"
  379. @size-change="pageSizeChange"
  380. >
  381. </el-pagination>
  382. </div>
  383. </div>
  384. <!-- PreviewPrintTaskTemplate-->
  385. <preview-print-task-template
  386. :instance="curTask"
  387. ref="PreviewPrintTaskTemplate"
  388. ></preview-print-task-template>
  389. <!-- pdf-view -->
  390. <el-dialog
  391. class="pdf-view-dialog"
  392. :visible.sync="padViewDialogVisible"
  393. title="请选择PDF类型"
  394. top="10vh"
  395. width="540px"
  396. :close-on-click-modal="false"
  397. :close-on-press-escape="false"
  398. append-to-body
  399. >
  400. <el-button
  401. v-for="item in pdfList"
  402. :key="item.name"
  403. type="primary"
  404. size="large"
  405. @click="viewPdf(item)"
  406. >{{ item.type | printPdfTypeFilter }}</el-button
  407. >
  408. <div slot="footer"></div>
  409. </el-dialog>
  410. <!-- data-task-dialog -->
  411. <data-task-dialog
  412. v-if="checkPrivilege('button', 'BatchDownload')"
  413. ref="DataTaskDialog"
  414. task-type="PRINT_PDF_DOWNLOAD"
  415. ></data-task-dialog>
  416. </div>
  417. </template>
  418. <script>
  419. import {
  420. printTaskListPage,
  421. submitPrintTask,
  422. resubmitPrintTask,
  423. cancelPrintTask,
  424. printTaskTotalInfo,
  425. getPrintTaskPdf,
  426. downloadPrintTaskPdf,
  427. printTaskNormal
  428. } from "../api";
  429. import { PRINT_TASK_STATUS } from "@/constants/enumerate";
  430. import pickerOptions from "@/constants/datePickerOptions";
  431. import { parseTimeRangeDateAndTime } from "@/plugins/utils";
  432. import PreviewPrintTaskTemplate from "../components/PreviewPrintTaskTemplate";
  433. export default {
  434. name: "print-task-manage",
  435. components: { PreviewPrintTaskTemplate },
  436. data() {
  437. return {
  438. filter: {
  439. semesterId: "",
  440. examId: "",
  441. printPlanId: "",
  442. printHouseId: "",
  443. status: "",
  444. courseCode: "",
  445. paperNumber: "",
  446. examPlace: "",
  447. examRoom: "",
  448. examStartTime: "",
  449. examEndTime: "",
  450. printStartTime: "",
  451. printEndTime: ""
  452. },
  453. current: 1,
  454. size: this.GLOBAL.pageSize,
  455. total: 0,
  456. totalInfo: {},
  457. dataList: [],
  458. curRow: {},
  459. multipleSelection: [],
  460. PRINT_TASK_STATUS,
  461. loading: false,
  462. // view-pdf
  463. padViewDialogVisible: false,
  464. pdfList: [],
  465. // view-template
  466. curTask: {},
  467. // date-picker
  468. createTime: [],
  469. printTime: [],
  470. pickerOptions
  471. };
  472. },
  473. mounted() {
  474. // this.search();
  475. },
  476. methods: {
  477. async getList() {
  478. if (!this.checkPrivilege("list", "list")) return;
  479. const datas = {
  480. ...this.filter,
  481. pageNumber: this.current,
  482. pageSize: this.size
  483. };
  484. if (this.createTime) {
  485. datas.examStartTime = this.createTime[0];
  486. datas.examEndTime = this.createTime[1];
  487. }
  488. if (this.printTime) {
  489. datas.printStartTime = this.printTime[0];
  490. datas.printEndTime = this.printTime[1];
  491. }
  492. const data = await printTaskListPage(datas);
  493. this.dataList = data.records.map(item => {
  494. const { date, time } = parseTimeRangeDateAndTime(
  495. item.examStartTime,
  496. item.examEndTime
  497. );
  498. item.examDate = date || "--";
  499. item.examTime = time || "--";
  500. return item;
  501. });
  502. this.total = data.total;
  503. },
  504. toPage(page) {
  505. this.current = page;
  506. this.getList();
  507. this.multipleSelection = [];
  508. },
  509. search() {
  510. this.toPage(1);
  511. this.getTotalInfo();
  512. },
  513. printPlanChange() {
  514. this.filter.paperNumber = "";
  515. this.filter.courseCode = "";
  516. this.filter.examRoom = "";
  517. this.filter.examPlace = "";
  518. },
  519. async getTotalInfo() {
  520. const datas = {
  521. ...this.filter,
  522. pageNumber: this.current,
  523. pageSize: this.size
  524. };
  525. if (this.createTime) {
  526. datas.examStartTime = this.createTime[0];
  527. datas.examEndTime = this.createTime[1];
  528. }
  529. const data = await printTaskTotalInfo(datas);
  530. this.totalInfo = data || {};
  531. },
  532. handleSelectionChange(val) {
  533. this.multipleSelection = val.map(item => item.examDetailId);
  534. },
  535. toPreview(row) {
  536. this.curTask = row;
  537. this.$refs.PreviewPrintTaskTemplate.open();
  538. },
  539. toSubmit(row) {
  540. this.$confirm("确定提交该印刷任务吗?", "提示", {
  541. type: "warning"
  542. })
  543. .then(async () => {
  544. const data = await submitPrintTask(row.examDetailId);
  545. if (!data) return;
  546. this.$message.success("提交成功!");
  547. this.getList();
  548. })
  549. .catch(() => {});
  550. },
  551. toResubmit(row) {
  552. this.$confirm("确定重新提交该印刷任务吗?", "提示", {
  553. type: "warning"
  554. })
  555. .then(async () => {
  556. const data = await resubmitPrintTask({
  557. id: row.examDetailId,
  558. printPlanId: row.printPlanId
  559. });
  560. if (!data) return;
  561. this.$message.success("提交成功!");
  562. this.getList();
  563. })
  564. .catch(() => {});
  565. },
  566. toCancel(row) {
  567. this.$confirm("确定撤回该印刷任务的提交吗?", "提示", {
  568. type: "warning"
  569. })
  570. .then(async () => {
  571. const data = await cancelPrintTask(row.examDetailId);
  572. if (!data) return;
  573. this.$message.success("撤回成功!");
  574. this.getList();
  575. })
  576. .catch(() => {});
  577. },
  578. async toViewPdf(row) {
  579. this.pdfList = [];
  580. let result = true;
  581. const data = await getPrintTaskPdf(row.examDetailId).catch(() => {
  582. result = false;
  583. });
  584. if (!result) return;
  585. if (!data || !data.length) {
  586. this.$message.error("当前任务pdf还未生成好,请稍后再试!");
  587. return;
  588. }
  589. if (data.length === 1) {
  590. this.viewPdf(data[0]);
  591. } else {
  592. this.pdfList = data;
  593. this.padViewDialogVisible = true;
  594. }
  595. },
  596. viewPdf(item) {
  597. window.open(item.url);
  598. // this.padViewDialogVisible = false;
  599. },
  600. async toExport() {
  601. if (this.loading) return;
  602. if (!this.multipleSelection.length) {
  603. this.$message.error("请选择要下载的记录!");
  604. return;
  605. }
  606. this.loading = true;
  607. const data = await downloadPrintTaskPdf(
  608. this.multipleSelection
  609. ).catch(() => {});
  610. this.loading = false;
  611. if (!data) return;
  612. this.$message.success("文件下载任务提交成功!");
  613. },
  614. toDataTask() {
  615. this.$refs.DataTaskDialog.open();
  616. },
  617. async toNormal(row) {
  618. const typeName = row.normal ? "作废" : "恢复";
  619. const action = await this.$confirm(
  620. `确定${typeName}该印刷任务吗?`,
  621. "提示",
  622. {
  623. type: "warning"
  624. }
  625. ).catch(() => {});
  626. if (action !== "confirm") return;
  627. const data = await printTaskNormal({
  628. id: row.examDetailId,
  629. normal: !row.normal
  630. });
  631. if (!data) return;
  632. row.normal = !row.normal;
  633. this.$message.success("撤回成功!");
  634. }
  635. }
  636. };
  637. </script>