PrintTaskManage.vue 12 KB

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