BusinessDataExport.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <template>
  2. <div class="business-data-export">
  3. <div class="part-box part-box-filter part-box-flex">
  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. <print-plan-select
  8. v-model.trim="filter.printPlanIdList"
  9. placeholder="印刷计划"
  10. clearable
  11. multiple
  12. @change="printPlanChange"
  13. ></print-plan-select>
  14. </el-form-item>
  15. <el-form-item label="课程(代码):" label-width="110px">
  16. <course-select
  17. v-model.trim="filter.courseCode"
  18. :print-plan-id="filter.printPlanIdList"
  19. placeholder="课程(代码)"
  20. clearable
  21. ></course-select>
  22. </el-form-item>
  23. <el-form-item label="试卷编号:">
  24. <paper-number-select
  25. ref="PaperNumberSelect"
  26. v-model="filter.paperNumber"
  27. :print-plan-id="filter.printPlanIdList"
  28. placeholder="试卷编号"
  29. clearable
  30. ></paper-number-select>
  31. </el-form-item>
  32. <el-form-item label="考点:" label-width="55px">
  33. <place-select
  34. v-model.trim="filter.examPlace"
  35. :print-plan-id="filter.printPlanIdList"
  36. placeholder="考点"
  37. clearable
  38. ></place-select>
  39. </el-form-item>
  40. <el-form-item label="考场:" label-width="55px">
  41. <room-select
  42. v-model.trim="filter.examRoom"
  43. :print-plan-id="filter.printPlanIdList"
  44. placeholder="考场"
  45. clearable
  46. ></room-select>
  47. </el-form-item>
  48. <el-form-item label="卷袋号:" label-width="70px">
  49. <el-input
  50. v-model="filter.packageCode"
  51. placeholder="卷袋号"
  52. clearable
  53. ></el-input>
  54. </el-form-item>
  55. <el-form-item label="考试日期:">
  56. <el-date-picker
  57. v-model="createTime"
  58. type="daterange"
  59. :picker-options="pickerOptions"
  60. range-separator="至"
  61. start-placeholder="考试开始日期"
  62. end-placeholder="考试结束日期"
  63. value-format="timestamp"
  64. align="right"
  65. unlink-panels
  66. >
  67. </el-date-picker>
  68. </el-form-item>
  69. </template>
  70. <el-form-item label-width="0px">
  71. <el-button
  72. v-if="checkPrivilege('button', 'select')"
  73. type="primary"
  74. @click="search"
  75. >查询</el-button
  76. >
  77. </el-form-item>
  78. </el-form>
  79. <div class="part-box-action">
  80. <el-button
  81. v-if="checkPrivilege('button', 'TempleteDownload')"
  82. icon="el-icon-download"
  83. type="success"
  84. :loading="loading"
  85. @click="toDownloadTemplate"
  86. >
  87. 考务数据模板下载
  88. </el-button>
  89. <el-button
  90. v-if="checkPrivilege('button', 'import')"
  91. icon="el-icon-circle-plus-outline"
  92. type="success"
  93. @click="toUpload"
  94. >
  95. 导入
  96. </el-button>
  97. <el-button
  98. v-if="checkPrivilege('button', 'export')"
  99. icon="el-icon-download"
  100. type="primary"
  101. :loading="loading"
  102. @click="toExport"
  103. >
  104. 导出查询结果
  105. </el-button>
  106. </div>
  107. </div>
  108. <div class="part-box part-box-pad">
  109. <el-table class="mb-2" ref="TableList" :data="dataList">
  110. <el-table-column
  111. type="index"
  112. label="序号"
  113. width="70"
  114. :index="indexMethod"
  115. ></el-table-column>
  116. <el-table-column
  117. prop="printPlanName"
  118. label="印刷计划"
  119. ></el-table-column>
  120. <el-table-column prop="examDate" label="考试日期"> </el-table-column>
  121. <el-table-column prop="examTime" label="考试时间"> </el-table-column>
  122. <el-table-column prop="examPlace" label="考点"> </el-table-column>
  123. <el-table-column prop="examRoom" label="考场"> </el-table-column>
  124. <el-table-column prop="packageCode" label="卷袋号"> </el-table-column>
  125. <el-table-column prop="courseNameCode" label="课程(代码)">
  126. </el-table-column>
  127. <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
  128. <el-table-column prop="totalSubjects" label="科次" width="80">
  129. </el-table-column>
  130. <el-table-column class-name="action-column" label="操作" width="100">
  131. <template slot-scope="scope">
  132. <el-button
  133. v-if="checkPrivilege('link', 'preview')"
  134. class="btn-primary"
  135. type="text"
  136. @click="toPreview(scope.row)"
  137. >查看详情</el-button
  138. >
  139. </template>
  140. </el-table-column>
  141. </el-table>
  142. <div class="box-justify">
  143. <div>
  144. <span class="mr-2"
  145. >科次总计:<i class="color-primary">{{
  146. totalData.totalSubjects
  147. }}</i>
  148. 科次</span
  149. >
  150. <span
  151. >卷袋数量总计:<i class="color-primary">{{
  152. totalData.packageCount
  153. }}</i>
  154. 个</span
  155. >
  156. </div>
  157. <el-pagination
  158. background
  159. layout="total,prev, pager, next"
  160. :current-page="current"
  161. :total="total"
  162. :page-size="size"
  163. @current-change="toPage"
  164. >
  165. </el-pagination>
  166. </div>
  167. </div>
  168. <!-- PreviewBusinessDetail -->
  169. <preview-business-detail
  170. ref="PreviewBusinessDetail"
  171. :instance="curRow"
  172. ></preview-business-detail>
  173. <!-- UploadBusinessDataDialog -->
  174. <upload-business-data-dialog
  175. ref="UploadBusinessDataDialog"
  176. @modified="getList"
  177. ></upload-business-data-dialog>
  178. </div>
  179. </template>
  180. <script>
  181. import {
  182. businessDataListPage,
  183. businessTotalData,
  184. businessTemplateDownload,
  185. businessDataExport
  186. } from "../api";
  187. import PreviewBusinessDetail from "../components/PreviewBusinessDetail";
  188. import UploadBusinessDataDialog from "../components/UploadBusinessDataDialog";
  189. import { parseTimeRangeDateAndTime } from "@/plugins/utils";
  190. import { downloadByApi } from "@/plugins/download";
  191. import pickerOptions from "@/constants/datePickerOptions";
  192. export default {
  193. name: "business-data-export",
  194. components: { PreviewBusinessDetail, UploadBusinessDataDialog },
  195. data() {
  196. return {
  197. filter: {
  198. printPlanIdList: "",
  199. courseCode: "",
  200. paperNumber: "",
  201. examPlace: "",
  202. examRoom: "",
  203. packageCode: "",
  204. startDate: "",
  205. endDate: ""
  206. },
  207. current: 1,
  208. size: this.GLOBAL.pageSize,
  209. total: 0,
  210. dataList: [],
  211. curRow: {},
  212. totalData: {},
  213. curPrintPlan: {},
  214. loading: false,
  215. // date-picker
  216. createTime: [],
  217. pickerOptions,
  218. // import
  219. // TODO:
  220. uploadUrl: "/api/admin/exam/print/data_import",
  221. uploadData: {
  222. type: "FILE",
  223. printPlanId: ""
  224. }
  225. };
  226. },
  227. computed: {
  228. canImport() {
  229. return (
  230. this.curPrintPlan && ["NEW", "READY"].includes(this.curPrintPlan.status)
  231. );
  232. }
  233. },
  234. mounted() {
  235. this.search();
  236. },
  237. methods: {
  238. async getList() {
  239. if (!this.checkPrivilege("list", "list")) return;
  240. const datas = {
  241. ...this.filter,
  242. pageNumber: this.current,
  243. pageSize: this.size
  244. };
  245. if (this.createTime) {
  246. datas.startDate = this.createTime[0];
  247. datas.endDate = this.createTime[1];
  248. }
  249. const data = await businessDataListPage(datas);
  250. this.dataList = data.records.map(item => {
  251. const { date, time } = parseTimeRangeDateAndTime(
  252. item.examStartTime,
  253. item.examEndTime
  254. );
  255. item.examDate = date || "--";
  256. item.examTime = time || "--";
  257. return item;
  258. });
  259. this.total = data.total;
  260. },
  261. async getTotalData() {
  262. const datas = {
  263. ...this.filter
  264. };
  265. if (this.createTime) {
  266. datas.startDate = this.createTime[0];
  267. datas.endDate = this.createTime[1];
  268. }
  269. this.totalData = await businessTotalData(datas);
  270. },
  271. toPage(page) {
  272. this.current = page;
  273. this.getList();
  274. },
  275. search() {
  276. this.toPage(1);
  277. this.getTotalData();
  278. },
  279. printPlanChange() {
  280. this.filter.paperNumber = "";
  281. this.filter.courseCode = "";
  282. this.filter.examRoom = "";
  283. this.filter.examPlace = "";
  284. },
  285. toUpload() {
  286. this.$refs.UploadBusinessDataDialog.open();
  287. },
  288. async toExport() {
  289. // 异步导出
  290. if (this.loading) return;
  291. this.loading = true;
  292. const datas = {
  293. ...this.filter
  294. };
  295. if (this.createTime) {
  296. datas.startDate = this.createTime[0];
  297. datas.endDate = this.createTime[1];
  298. }
  299. const res = await businessDataExport(datas).catch(() => {});
  300. this.loading = false;
  301. if (res) {
  302. this.$message.success(
  303. "导出任务已提交,请在系统设置-任务管理中下载文件!"
  304. );
  305. } else {
  306. this.$message.error("导出任务提交失败,请重新尝试!");
  307. }
  308. },
  309. async toDownloadTemplate() {
  310. if (this.loading) return;
  311. this.loading = true;
  312. const res = await downloadByApi(() => {
  313. return businessTemplateDownload();
  314. }, `考务数据模板.xlsx`).catch(e => {
  315. this.$message.error(e || "下载失败,请重新尝试!");
  316. });
  317. this.downloading = false;
  318. if (!res) return;
  319. this.$message.success("下载成功!");
  320. },
  321. toPreview(row) {
  322. this.curRow = { ...row };
  323. this.$refs.PreviewBusinessDetail.open();
  324. }
  325. }
  326. };
  327. </script>