ScoreArchive.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. <template>
  2. <div class="score-archive">
  3. <div class="part-box part-box-filter">
  4. <el-form ref="FilterForm" label-position="left" inline>
  5. <template v-if="checkPrivilege('condition', 'condition')">
  6. <el-form-item label="学期:">
  7. <semester-select
  8. v-model="filter.semesterId"
  9. default-select
  10. ></semester-select>
  11. </el-form-item>
  12. <el-form-item label="考试:">
  13. <exam-select
  14. v-model="filter.examId"
  15. :semester-id="filter.semesterId"
  16. ></exam-select>
  17. </el-form-item>
  18. <el-form-item label="课程:">
  19. <course-select
  20. v-model="filter.courseId"
  21. placeholder="课程"
  22. filterable
  23. clearable
  24. :semester-id="filter.semesterId"
  25. :exam-id="filter.examId"
  26. ></course-select>
  27. </el-form-item>
  28. <el-form-item label="班级:">
  29. <class-select
  30. v-model="filter.clazzId"
  31. placeholder="班级"
  32. :semester-id="filter.semesterId"
  33. :exam-id="filter.examId"
  34. :course-id="filter.courseId"
  35. ></class-select>
  36. </el-form-item>
  37. </template>
  38. <el-form-item label-width="0px">
  39. <el-button
  40. v-if="checkPrivilege('button', 'select')"
  41. type="primary"
  42. @click="toPage(1)"
  43. >查询</el-button
  44. >
  45. </el-form-item>
  46. </el-form>
  47. <div class="box-justify">
  48. <div>
  49. <el-button
  50. v-if="checkPrivilege('button', 'BatchDownload')"
  51. type="primary"
  52. icon="el-icon-download"
  53. :loading="loading"
  54. :disabled="!filter.semesterId || !filter.examId"
  55. @click="toDownloadAll"
  56. >一键下载</el-button
  57. >
  58. <el-button
  59. v-if="checkPrivilege('button', 'BatchDownload')"
  60. type="primary"
  61. icon="el-icon-s-order"
  62. @click="toDataTask('SCORE_DOWNLOAD')"
  63. >下载结果查询</el-button
  64. >
  65. </div>
  66. <div>
  67. <el-button
  68. v-if="checkPrivilege('button', 'export')"
  69. type="primary"
  70. icon="el-icon-download"
  71. :loading="exportLoading"
  72. :disabled="!filter.semesterId || !filter.examId || !filter.courseId"
  73. @click="toExport"
  74. >成绩导出</el-button
  75. >
  76. <el-button
  77. v-if="checkPrivilege('button', 'export')"
  78. type="primary"
  79. icon="el-icon-s-order"
  80. @click="toDataTask('SCORE_EXPORT')"
  81. >导出结果查询</el-button
  82. >
  83. </div>
  84. </div>
  85. </div>
  86. <div class="part-box part-box-pad">
  87. <el-table ref="TableList" :data="dataList">
  88. <el-table-column
  89. type="index"
  90. label="序号"
  91. width="70"
  92. :index="indexMethod"
  93. ></el-table-column>
  94. <el-table-column
  95. prop="semesterName"
  96. label="学期"
  97. width="210"
  98. ></el-table-column>
  99. <el-table-column
  100. prop="name"
  101. label="姓名"
  102. min-width="100"
  103. ></el-table-column>
  104. <el-table-column
  105. prop="studentCode"
  106. label="学号"
  107. min-width="100"
  108. ></el-table-column>
  109. <el-table-column
  110. prop="examNumber"
  111. label="学号"
  112. min-width="100"
  113. ></el-table-column>
  114. <el-table-column
  115. prop="orgName"
  116. label="院系"
  117. min-width="160"
  118. ></el-table-column>
  119. <el-table-column
  120. prop="majorName"
  121. label="专业"
  122. min-width="160"
  123. ></el-table-column>
  124. <el-table-column
  125. prop="clazzName"
  126. label="班级"
  127. min-width="160"
  128. ></el-table-column>
  129. <el-table-column
  130. prop="courseName"
  131. label="课程名称"
  132. min-width="160"
  133. ></el-table-column>
  134. <el-table-column
  135. prop="totalScore"
  136. label="成绩"
  137. width="80"
  138. ></el-table-column>
  139. <el-table-column
  140. class-name="action-column"
  141. label="操作"
  142. width="160px"
  143. fixed="right"
  144. >
  145. <template slot-scope="scope">
  146. <el-button
  147. v-if="checkPrivilege('link', 'Preview')"
  148. class="btn-primary"
  149. type="text"
  150. @click="toViewSheetPaper(scope.row)"
  151. >原图</el-button
  152. >
  153. <el-button
  154. v-if="checkPrivilege('link', 'Preview')"
  155. class="btn-primary"
  156. type="text"
  157. @click="toViewPaper(scope.row)"
  158. >轨迹图</el-button
  159. >
  160. <el-button
  161. v-if="checkPrivilege('link', 'download')"
  162. class="btn-primary"
  163. type="text"
  164. :disabled="downloading"
  165. @click="toDownload(scope.row)"
  166. >下载</el-button
  167. >
  168. </template>
  169. </el-table-column>
  170. </el-table>
  171. <div class="part-page">
  172. <el-pagination
  173. background
  174. layout="total, sizes, prev, pager, next, jumper"
  175. :pager-count="5"
  176. :current-page="current"
  177. :total="total"
  178. :page-size="size"
  179. @current-change="toPage"
  180. @size-change="pageSizeChange"
  181. >
  182. </el-pagination>
  183. </div>
  184. </div>
  185. <!-- image-preview -->
  186. <simple-image-preview
  187. v-if="checkPrivilege('link', 'Preview')"
  188. :cur-image="curImage"
  189. @on-prev="toPrevImage"
  190. @on-next="toNextImage"
  191. ref="SimpleImagePreview"
  192. ></simple-image-preview>
  193. <!-- data-task-dialog -->
  194. <data-task-dialog
  195. v-if="
  196. checkPrivilege('button', 'export') ||
  197. checkPrivilege('button', 'BatchDownload')
  198. "
  199. ref="DataTaskDialog"
  200. :task-type="taskType"
  201. ></data-task-dialog>
  202. </div>
  203. </template>
  204. <script>
  205. import {
  206. scoreListPage,
  207. scoreExport,
  208. scoreBatchDownload,
  209. scoreDownload,
  210. scorePreview,
  211. } from "../api";
  212. import { downloadByApi } from "@/plugins/download";
  213. import SimpleImagePreview from "@/components/SimpleImagePreview";
  214. export default {
  215. name: "score-archive",
  216. components: { SimpleImagePreview },
  217. data() {
  218. return {
  219. filter: {
  220. semesterId: "",
  221. examId: "",
  222. clazzId: "",
  223. courseId: "",
  224. },
  225. current: 1,
  226. size: this.GLOBAL.pageSize,
  227. total: 0,
  228. dataList: [],
  229. curImage: {},
  230. curRow: {},
  231. curPapers: [],
  232. downloading: false,
  233. syncLoading: false,
  234. exportLoading: false,
  235. loading: false,
  236. taskType: "",
  237. // img view
  238. curImageIndex: 0,
  239. imageList: [],
  240. };
  241. },
  242. mounted() {
  243. // this.getList();
  244. },
  245. methods: {
  246. async getList() {
  247. if (!this.checkPrivilege("list", "list")) return;
  248. const datas = {
  249. ...this.filter,
  250. pageNumber: this.current,
  251. pageSize: this.size,
  252. };
  253. const data = await scoreListPage(datas);
  254. this.dataList = data.records;
  255. this.total = data.total;
  256. },
  257. toPage(page) {
  258. this.current = page;
  259. this.getList();
  260. },
  261. async toDownloadAll() {
  262. if (this.loading) return;
  263. this.loading = true;
  264. const res = await scoreBatchDownload(this.filter).catch(() => {});
  265. this.loading = false;
  266. if (!res) return;
  267. this.$message.success("下载任务已经提交");
  268. },
  269. async toExport() {
  270. if (this.exportLoading) return;
  271. this.exportLoading = true;
  272. const res = await scoreExport(this.filter).catch(() => {});
  273. this.exportLoading = false;
  274. if (!res) return;
  275. this.$message.success("导出任务已经提交");
  276. },
  277. async toDownload(row) {
  278. if (this.downloading) return;
  279. this.downloading = true;
  280. const res = await downloadByApi(() => {
  281. return scoreDownload(row.id);
  282. }).catch((e) => {
  283. this.$message.error(e || "下载失败,请重新尝试!");
  284. });
  285. this.downloading = false;
  286. if (!res) return;
  287. this.$message.success("下载成功!");
  288. },
  289. toDataTask(taskType) {
  290. this.taskType = taskType;
  291. this.$refs.DataTaskDialog.open();
  292. },
  293. // img view
  294. toViewSheetPaper(row) {
  295. const dataList = row.sheetUrls ? JSON.parse(row.sheetUrls) : [];
  296. this.curImageIndex = 0;
  297. this.imageList = dataList.map((item, index) => {
  298. return { url: item, name: index + 1 };
  299. });
  300. this.selectImage(this.curImageIndex);
  301. this.$refs.SimpleImagePreview.open();
  302. },
  303. async toViewPaper(row) {
  304. const res = await scorePreview(row.id).catch(() => {});
  305. if (!res) return;
  306. const dataList = res || [];
  307. if (!dataList || !dataList.length) {
  308. this.$message.error("数据缺失!");
  309. return;
  310. }
  311. this.curImageIndex = 0;
  312. this.imageList = dataList.map((item, index) => {
  313. return { url: item, name: index + 1 };
  314. });
  315. this.selectImage(this.curImageIndex);
  316. this.$refs.SimpleImagePreview.open();
  317. },
  318. selectImage(index) {
  319. this.curImage = this.imageList[index];
  320. },
  321. toPrevImage() {
  322. if (this.curImageIndex === 0) {
  323. this.curImageIndex = this.imageList.length - 1;
  324. } else {
  325. this.curImageIndex--;
  326. }
  327. this.selectImage(this.curImageIndex);
  328. },
  329. toNextImage() {
  330. if (this.curImageIndex === this.imageList.length - 1) {
  331. this.curImageIndex = 0;
  332. } else {
  333. this.curImageIndex++;
  334. }
  335. this.selectImage(this.curImageIndex);
  336. },
  337. },
  338. };
  339. </script>