PrintTaskManage.vue 22 KB

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