ScoreClassDetail.vue 8.0 KB

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