PrintTaskManage.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. <template>
  2. <div class="print-task-manage">
  3. <div class="part-box part-box-filter part-box-flex">
  4. <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
  5. <el-form-item label="印刷计划:">
  6. <print-plan-select
  7. v-model.trim="filter.printPlanId"
  8. placeholder="请选择"
  9. clearable
  10. @change="printPlanChange"
  11. ></print-plan-select>
  12. </el-form-item>
  13. <el-form-item label="印刷状态:">
  14. <el-select
  15. v-model="filter.status"
  16. style="width: 100px;"
  17. placeholder="请选择"
  18. clearable
  19. >
  20. <el-option
  21. v-for="(val, key) in PRINT_TASK_STATUS"
  22. :key="key"
  23. :value="key"
  24. :label="val"
  25. ></el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item label="课程(代码):" label-width="110px">
  29. <course-select
  30. v-model.trim="filter.courseCode"
  31. :print-plan-id="filter.printPlanId"
  32. placeholder="请选择"
  33. clearable
  34. ></course-select>
  35. </el-form-item>
  36. <el-form-item label="试卷编号:">
  37. <paper-number-select
  38. ref="PaperNumberSelect"
  39. v-model="filter.paperNumber"
  40. :print-plan-id="filter.printPlanId"
  41. placeholder="请选择"
  42. clearable
  43. ></paper-number-select>
  44. </el-form-item>
  45. <el-form-item label="考点:" label-width="55px">
  46. <place-select
  47. v-model.trim="filter.examPlace"
  48. :print-plan-id="filter.printPlanId"
  49. placeholder="请选择"
  50. clearable
  51. ></place-select>
  52. </el-form-item>
  53. <el-form-item label="考场:" label-width="55px">
  54. <room-select
  55. v-model.trim="filter.examRoom"
  56. :print-plan-id="filter.printPlanId"
  57. placeholder="请选择"
  58. clearable
  59. ></room-select>
  60. </el-form-item>
  61. <el-form-item label="考试日期:">
  62. <el-date-picker
  63. v-model="createTime"
  64. type="daterange"
  65. :picker-options="pickerOptions"
  66. range-separator="至"
  67. start-placeholder="开始日期"
  68. end-placeholder="结束日期"
  69. value-format="timestamp"
  70. align="right"
  71. unlink-panels
  72. >
  73. </el-date-picker>
  74. </el-form-item>
  75. <el-form-item label-width="0px">
  76. <el-button type="primary" icon="el-icon-search" @click="search"
  77. >查询</el-button
  78. >
  79. </el-form-item>
  80. </el-form>
  81. <div class="part-box-action">
  82. <el-button
  83. icon="el-icon-download"
  84. type="primary"
  85. :disabled="loading"
  86. @click="toExport"
  87. >
  88. 批量下载PDF
  89. </el-button>
  90. </div>
  91. </div>
  92. <div class="part-box part-box-flex">
  93. <p>
  94. <span class="mr-4"
  95. >科次总计:<i class="color-primary">{{ totalInfo.totalSubjects }}</i>
  96. 科次</span
  97. >
  98. <span class="mr-4"
  99. >试卷总计:<i class="color-primary">{{ totalInfo.paperCount }}</i>
  100. 个</span
  101. >
  102. <span class="mr-4"
  103. >卷袋数量总计:<i class="color-primary">{{
  104. totalInfo.packageCount
  105. }}</i>
  106. 个</span
  107. >
  108. <span class="mr-4"
  109. >A3印量总计:<i class="color-primary">{{ totalInfo.pagesA3 }}</i>
  110. 张</span
  111. >
  112. <span class="mr-4"
  113. >A4印量总计:<i class="color-primary">{{ totalInfo.pagesA4 }}</i>
  114. 张</span
  115. >
  116. </p>
  117. <p>
  118. <span class="mr-4"
  119. >A3剩余印量:<i class="color-primary">{{ totalInfo.pagesA3Left }}</i>
  120. 张</span
  121. >
  122. <span
  123. >A4剩余印量:<i class="color-primary">{{ totalInfo.pagesA4Left }}</i>
  124. 张</span
  125. >
  126. </p>
  127. </div>
  128. <div class="part-box">
  129. <el-table
  130. ref="TableList"
  131. :data="dataList"
  132. border
  133. stripe
  134. @selection-change="handleSelectionChange"
  135. >
  136. <el-table-column type="selection" width="50"></el-table-column>
  137. <el-table-column
  138. type="index"
  139. label="序号"
  140. width="60"
  141. align="center"
  142. :index="indexMethod"
  143. ></el-table-column>
  144. <el-table-column prop="packageCode" label="卷袋编号"></el-table-column>
  145. <el-table-column
  146. prop="printPlanName"
  147. label="印刷计划"
  148. ></el-table-column>
  149. <el-table-column
  150. prop="examDate"
  151. label="考试日期"
  152. width="100"
  153. ></el-table-column>
  154. <el-table-column
  155. prop="examTime"
  156. label="考试时间"
  157. width="100"
  158. ></el-table-column>
  159. <el-table-column prop="courseNameCode" label="课程(代码)">
  160. </el-table-column>
  161. <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
  162. <el-table-column prop="examPlace" label="考点"></el-table-column>
  163. <el-table-column prop="examRoom" label="考场"></el-table-column>
  164. <el-table-column
  165. prop="singlePagesA3"
  166. label="单科次准印量A3(页)"
  167. width="80"
  168. ></el-table-column>
  169. <el-table-column
  170. prop="totalSubjects"
  171. label="科次"
  172. width="80"
  173. ></el-table-column>
  174. <el-table-column
  175. prop="pagesA3"
  176. label="A3准印量小计(页)"
  177. width="80"
  178. ></el-table-column>
  179. <el-table-column
  180. prop="pagesA4"
  181. label="A4准印量小计(页)"
  182. width="80"
  183. ></el-table-column>
  184. <el-table-column prop="status" label="印刷状态" width="80">
  185. <span slot-scope="scope">{{
  186. scope.row.status | printTaskStatusFilter
  187. }}</span>
  188. </el-table-column>
  189. <el-table-column prop="validate" label="是否校验" width="80">
  190. <span slot-scope="scope">{{ scope.row.validate ? "是" : "否" }}</span>
  191. </el-table-column>
  192. <el-table-column prop="printStartTime" label="打印开始时间" width="160">
  193. <span slot-scope="scope">{{
  194. scope.row.printStartTime | timestampFilter
  195. }}</span>
  196. </el-table-column>
  197. <el-table-column prop="printEndTime" label="打印完成时间" width="160">
  198. <span slot-scope="scope">{{
  199. scope.row.printEndTime | timestampFilter
  200. }}</span>
  201. </el-table-column>
  202. <el-table-column
  203. class-name="action-column"
  204. label="操作"
  205. align="center"
  206. width="120px"
  207. fixed="right"
  208. >
  209. <template slot-scope="scope">
  210. <el-button
  211. class="btn-table-icon"
  212. type="text"
  213. icon="icon icon-download-act"
  214. @click="toViewPdf(scope.row)"
  215. title="查看pdf"
  216. ></el-button>
  217. <el-button
  218. v-if="scope.row.status === 'READY'"
  219. class="btn-table-icon"
  220. type="text"
  221. icon="icon icon-circle-share"
  222. @click="toSubmit(scope.row)"
  223. title="提交印刷"
  224. ></el-button>
  225. <el-button
  226. v-if="scope.row.status === 'PRINTING'"
  227. class="btn-table-icon"
  228. type="text"
  229. icon="icon icon-circle-share"
  230. @click="toResubmit(scope.row)"
  231. title="重新提交"
  232. ></el-button>
  233. <el-button
  234. v-if="scope.row.status === 'WAITING'"
  235. class="btn-table-icon"
  236. type="text"
  237. icon="icon icon-close-act"
  238. @click="toCancel(scope.row)"
  239. title="撤回提交"
  240. ></el-button>
  241. <!-- <el-button
  242. class="btn-table-icon"
  243. type="text"
  244. icon="icon icon-circle-right"
  245. @click="toPreview(scope.row)"
  246. title="查看印品模板"
  247. ></el-button> -->
  248. </template>
  249. </el-table-column>
  250. </el-table>
  251. <div class="part-page">
  252. <el-pagination
  253. background
  254. layout="total,prev, pager, next"
  255. :current-page="current"
  256. :total="total"
  257. :page-size="size"
  258. @current-change="toPage"
  259. >
  260. </el-pagination>
  261. </div>
  262. </div>
  263. <!-- PreviewPrintTaskTemplate-->
  264. <preview-print-task-template
  265. :instance="curTask"
  266. ref="PreviewPrintTaskTemplate"
  267. ></preview-print-task-template>
  268. </div>
  269. </template>
  270. <script>
  271. import {
  272. printTaskListPage,
  273. submitPrintTask,
  274. resubmitPrintTask,
  275. cancelPrintTask,
  276. printTaskTotalInfo,
  277. getPrintTaskPdf,
  278. downloadPrintTaskPdf
  279. } from "../api";
  280. import { PRINT_TASK_STATUS } from "@/constants/enumerate";
  281. import pickerOptions from "@/constants/datePickerOptions";
  282. import { parseTimeRangeDateAndTime } from "@/plugins/utils";
  283. import PreviewPrintTaskTemplate from "../components/PreviewPrintTaskTemplate";
  284. export default {
  285. name: "print-task-manage",
  286. components: { PreviewPrintTaskTemplate },
  287. data() {
  288. return {
  289. filter: {
  290. printPlanId: "",
  291. status: "",
  292. courseCode: "",
  293. paperNumber: "",
  294. examPlace: "",
  295. examRoom: "",
  296. examStartTime: "",
  297. examEndTime: ""
  298. },
  299. current: 1,
  300. size: this.GLOBAL.pageSize,
  301. total: 0,
  302. totalInfo: {},
  303. dataList: [],
  304. curRow: {},
  305. multipleSelection: [],
  306. PRINT_TASK_STATUS,
  307. loading: false,
  308. // view-template
  309. curTask: {},
  310. // date-picker
  311. createTime: [],
  312. pickerOptions
  313. };
  314. },
  315. created() {
  316. this.search();
  317. },
  318. methods: {
  319. async getList() {
  320. const datas = {
  321. ...this.filter,
  322. pageNumber: this.current,
  323. pageSize: this.size
  324. };
  325. if (this.createTime) {
  326. datas.examStartTime = this.createTime[0];
  327. datas.examEndTime = this.createTime[1];
  328. }
  329. const data = await printTaskListPage(datas);
  330. this.dataList = data.records.map(item => {
  331. const { date, time } = parseTimeRangeDateAndTime(
  332. item.examStartTime,
  333. item.examEndTime
  334. );
  335. item.examDate = date;
  336. item.examTime = time;
  337. return item;
  338. });
  339. this.total = data.total;
  340. },
  341. toPage(page) {
  342. this.current = page;
  343. this.getList();
  344. this.multipleSelection = [];
  345. },
  346. search() {
  347. this.toPage(1);
  348. this.getTotalInfo();
  349. },
  350. printPlanChange() {
  351. this.filter.paperNumber = "";
  352. this.filter.courseCode = "";
  353. this.filter.examRoom = "";
  354. this.filter.examPlace = "";
  355. },
  356. async getTotalInfo() {
  357. const datas = {
  358. ...this.filter,
  359. pageNumber: this.current,
  360. pageSize: this.size
  361. };
  362. if (this.createTime) {
  363. datas.examStartTime = this.createTime[0];
  364. datas.examEndTime = this.createTime[1];
  365. }
  366. const data = await printTaskTotalInfo(datas);
  367. this.totalInfo = data || {};
  368. },
  369. handleSelectionChange(val) {
  370. this.multipleSelection = val.map(item => item.examDetailId);
  371. },
  372. toPreview(row) {
  373. this.curTask = row;
  374. this.$refs.PreviewPrintTaskTemplate.open();
  375. },
  376. toSubmit(row) {
  377. this.$confirm("确定提交该印刷任务吗?", "提示", {
  378. cancelButtonClass: "el-button--danger is-plain",
  379. confirmButtonClass: "el-button--primary",
  380. type: "warning"
  381. })
  382. .then(async () => {
  383. const data = await submitPrintTask(row.examDetailId);
  384. if (!data) return;
  385. this.$message.success("提交成功!");
  386. this.getList();
  387. })
  388. .catch(() => {});
  389. },
  390. toResubmit(row) {
  391. this.$confirm("确定重新提交该印刷任务吗?", "提示", {
  392. cancelButtonClass: "el-button--danger is-plain",
  393. confirmButtonClass: "el-button--primary",
  394. type: "warning"
  395. })
  396. .then(async () => {
  397. const data = await resubmitPrintTask({
  398. id: row.examDetailId,
  399. printPlanId: row.printPlanId
  400. });
  401. if (!data) return;
  402. this.$message.success("提交成功!");
  403. this.getList();
  404. })
  405. .catch(() => {});
  406. },
  407. toCancel(row) {
  408. this.$confirm("确定撤回该印刷任务的提交吗?", "提示", {
  409. cancelButtonClass: "el-button--danger is-plain",
  410. confirmButtonClass: "el-button--primary",
  411. type: "warning"
  412. })
  413. .then(async () => {
  414. const data = await cancelPrintTask(row.examDetailId);
  415. if (!data) return;
  416. this.$message.success("撤回成功!");
  417. this.getList();
  418. })
  419. .catch(() => {});
  420. },
  421. async toViewPdf(row) {
  422. let result = true;
  423. const data = await getPrintTaskPdf(row.examDetailId).catch(() => {
  424. result = false;
  425. });
  426. if (!result) return;
  427. if (data) {
  428. window.open(data);
  429. } else {
  430. this.$message.error("当前任务pdf还未生成好,请稍后再试!");
  431. }
  432. },
  433. async toExport() {
  434. if (this.loading) return;
  435. if (!this.multipleSelection.length) {
  436. this.$message.error("请选择要下载的记录!");
  437. return;
  438. }
  439. this.loading = true;
  440. const data = await downloadPrintTaskPdf(this.multipleSelection);
  441. this.loading = false;
  442. if (!data) return;
  443. this.$message.success("文件下载任务提交成功!");
  444. }
  445. }
  446. };
  447. </script>