PrintTaskManage.vue 20 KB

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