ScoreClassDetail.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <template>
  2. <el-dialog
  3. :visible.sync="modalIsShow"
  4. top="0"
  5. :close-on-click-modal="false"
  6. :close-on-press-escape="false"
  7. :show-close="false"
  8. append-to-body
  9. fullscreen
  10. @open="initData"
  11. >
  12. <div slot="title">
  13. <h2 class="el-dialog__title">成绩详情</h2>
  14. <button class="el-dialog__headerbtn" @click="cancel"></button>
  15. </div>
  16. <div class="part-box part-box-filter part-box-flex">
  17. <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
  18. <el-form-item label="学院">
  19. <college-select
  20. v-model="filter.college"
  21. placeholder="学院"
  22. ></college-select>
  23. </el-form-item>
  24. <el-form-item label="专业">
  25. <el-select v-model="filter.major" placeholder="专业" clearable>
  26. <!-- TODO: -->
  27. <el-option :value="1">班级1</el-option>
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item label="班级">
  31. <major-class-select
  32. v-model="filter.className"
  33. :major-id="filter.majorId"
  34. cascader
  35. placeholder="班级"
  36. ></major-class-select>
  37. </el-form-item>
  38. <el-form-item label="姓名">
  39. <el-input
  40. v-model.trim="filter.studentName"
  41. placeholder="姓名"
  42. clearable
  43. >
  44. </el-input>
  45. </el-form-item>
  46. <el-form-item label="学号">
  47. <el-input
  48. v-model.trim="filter.studentCode"
  49. placeholder="学号"
  50. clearable
  51. >
  52. </el-input>
  53. </el-form-item>
  54. <el-form-item label-width="0px">
  55. <el-button type="primary" @click="search">查询</el-button>
  56. </el-form-item>
  57. </el-form>
  58. <div class="part-box-action">
  59. <el-button
  60. type="primary"
  61. :disabled="downloading"
  62. @click="toExportScore"
  63. >
  64. 成绩导出
  65. </el-button>
  66. </div>
  67. </div>
  68. <div class="part-box part-box-pad">
  69. <el-table ref="TableList" :data="dataList">
  70. <el-table-column
  71. type="index"
  72. label="序号"
  73. width="70"
  74. :index="indexMethod"
  75. ></el-table-column>
  76. <el-table-column prop="studentName" label="姓名" min-width="100">
  77. </el-table-column>
  78. <el-table-column
  79. prop="studentCode"
  80. label="学号"
  81. width="180"
  82. ></el-table-column>
  83. <el-table-column
  84. prop="secretNumber"
  85. label="院系"
  86. width="180"
  87. ></el-table-column>
  88. <el-table-column
  89. prop="className"
  90. label="班级"
  91. min-width="100"
  92. ></el-table-column>
  93. <el-table-column prop="checkTime" label="考试时间" width="170">
  94. <span slot-scope="scope">{{
  95. scope.row.checkTime | timestampFilter
  96. }}</span>
  97. </el-table-column>
  98. <el-table-column
  99. prop="className"
  100. label="课程名称"
  101. min-width="100"
  102. ></el-table-column>
  103. <el-table-column
  104. prop="className"
  105. label="成绩"
  106. min-width="100"
  107. ></el-table-column>
  108. <el-table-column
  109. class-name="action-column"
  110. label="操作"
  111. width="300"
  112. fixed="right"
  113. >
  114. <template slot-scope="scope">
  115. <el-button
  116. class="btn-primary"
  117. type="text"
  118. @click="toViewSheetPaper(scope.row)"
  119. >原图</el-button
  120. >
  121. <el-button
  122. class="btn-primary"
  123. type="text"
  124. @click="toViewTrack(scope.row)"
  125. >轨迹图</el-button
  126. >
  127. </template>
  128. </el-table-column>
  129. </el-table>
  130. <div class="part-page">
  131. <el-pagination
  132. background
  133. layout="total, sizes, prev, pager, next, jumper"
  134. :pager-count="5"
  135. :current-page="current"
  136. :total="total"
  137. :page-size="size"
  138. @current-change="toPage"
  139. @size-change="pageSizeChange"
  140. >
  141. </el-pagination>
  142. </div>
  143. </div>
  144. <!-- image-preview -->
  145. <simple-image-preview
  146. :cur-image="curImage"
  147. @on-prev="toPrevImage"
  148. @on-next="toNextImage"
  149. ref="SimpleImagePreview"
  150. ></simple-image-preview>
  151. <div slot="footer"></div>
  152. </el-dialog>
  153. </template>
  154. <script>
  155. import { scoreDetailListPage, scoreClassDetailScoreExport } from "../api";
  156. import SimpleImagePreview from "@/components/SimpleImagePreview";
  157. import { downloadByApi } from "@/plugins/download";
  158. import markMinxin from "../markMinxin";
  159. export default {
  160. name: "score-class-detail",
  161. components: { SimpleImagePreview },
  162. mixins: [markMinxin],
  163. props: {
  164. instance: {
  165. type: Object,
  166. default() {
  167. return {};
  168. },
  169. },
  170. },
  171. data() {
  172. return {
  173. modalIsShow: false,
  174. filter: {
  175. college: "",
  176. className: "",
  177. major: "",
  178. studentName: "",
  179. studentCode: "",
  180. },
  181. current: 1,
  182. size: this.GLOBAL.pageSize,
  183. total: 0,
  184. dataList: [],
  185. downloading: false,
  186. // img view
  187. curImage: {},
  188. curImageIndex: 0,
  189. imageList: [],
  190. };
  191. },
  192. methods: {
  193. cancel() {
  194. this.modalIsShow = false;
  195. },
  196. open() {
  197. this.modalIsShow = true;
  198. },
  199. async getList() {
  200. const datas = {
  201. ...this.filter,
  202. examId: this.instance.examId,
  203. paperNumber: this.instance.pageNumber,
  204. pageNumber: this.current,
  205. pageSize: this.size,
  206. };
  207. if (datas.absent !== null && datas.absent !== "")
  208. datas.absent = !!datas.absent;
  209. if (datas.breach !== null && datas.breach !== "")
  210. datas.breach = !!datas.breach;
  211. const data = await scoreDetailListPage(datas);
  212. this.dataList = data.records;
  213. this.total = data.total;
  214. },
  215. toPage(page) {
  216. this.current = page;
  217. this.getList();
  218. },
  219. search() {
  220. this.toPage(1);
  221. },
  222. async toExportScore() {
  223. if (this.downloading) return;
  224. this.downloading = true;
  225. const res = await downloadByApi(() => {
  226. return scoreClassDetailScoreExport({
  227. ...this.filter,
  228. examId: this.instance.examId,
  229. paperNumber: this.instance.pageNumber,
  230. });
  231. }).catch((e) => {
  232. this.$message.error(e || "下载失败,请重新尝试!");
  233. });
  234. this.downloading = false;
  235. if (!res) return;
  236. this.$message.success("下载成功!");
  237. },
  238. // img view
  239. async toViewTrack(row) {
  240. this.toMarkTrack(row.studentId);
  241. },
  242. toViewSheetPaper(row) {
  243. this.curImageIndex = 0;
  244. this.imageList = (row.sheetUrls || []).map((url, index) => {
  245. return { url, index: index + 1 };
  246. });
  247. this.selectImage(this.curImageIndex);
  248. this.$refs.SimpleImagePreview.open();
  249. },
  250. selectImage(index) {
  251. this.curImage = this.imageList[index];
  252. },
  253. toPrevImage() {
  254. if (this.curImageIndex === 0) {
  255. this.curImageIndex = this.imageList.length - 1;
  256. } else {
  257. this.curImageIndex--;
  258. }
  259. this.selectImage(this.curImageIndex);
  260. },
  261. toNextImage() {
  262. if (this.curImageIndex === this.imageList.length - 1) {
  263. this.curImageIndex = 0;
  264. } else {
  265. this.curImageIndex++;
  266. }
  267. this.selectImage(this.curImageIndex);
  268. },
  269. },
  270. };
  271. </script>