DocumentDetailDialog.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <template>
  2. <div>
  3. <el-dialog
  4. class="document-detail-dialog page-dialog"
  5. :visible.sync="modalIsShow"
  6. title="查看详情"
  7. :close-on-click-modal="false"
  8. :close-on-press-escape="false"
  9. append-to-body
  10. fullscreen
  11. @open="visibleChange"
  12. >
  13. <div class="part-box part-box-filter part-box-flex">
  14. <el-form
  15. ref="FilterForm"
  16. label-position="left"
  17. label-width="90px"
  18. inline
  19. >
  20. <el-form-item prop="collegeName" label="学院:">
  21. <college-select
  22. v-model="filter.collegeName"
  23. placeholder="学院"
  24. :exam-id="task.examId"
  25. style="width: 100%"
  26. ></college-select>
  27. </el-form-item>
  28. <el-form-item prop="majorName" label="专业:">
  29. <major-select
  30. v-model="filter.majorName"
  31. :college-name="filter.collegeName"
  32. :exam-id="task.examId"
  33. cascader
  34. placeholder="专业"
  35. style="width: 100%"
  36. ></major-select>
  37. </el-form-item>
  38. <el-form-item prop="clazzName" label="班级:">
  39. <class-select
  40. v-model="filter.clazzName"
  41. :major-name="filter.majorName"
  42. :exam-id="task.examId"
  43. cascader
  44. placeholder="班级"
  45. ></class-select>
  46. </el-form-item>
  47. <el-form-item label="绑定状态:">
  48. <el-select v-model="filter.isBind" placeholder="绑定状态" clearable>
  49. <el-option
  50. v-for="(val, key) in BOUND_TYPE"
  51. :key="key"
  52. :value="key * 1"
  53. :label="val"
  54. >
  55. </el-option>
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item label="任课老师:">
  59. <el-input
  60. v-model.trim="filter.teacher"
  61. placeholder="任课老师"
  62. clearable
  63. ></el-input>
  64. </el-form-item>
  65. <el-form-item label="教学班:">
  66. <el-input
  67. v-model.trim="filter.teachClass"
  68. placeholder="教学班"
  69. clearable
  70. ></el-input>
  71. </el-form-item>
  72. <el-form-item label="考场:">
  73. <el-input
  74. v-model.trim="filter.examRoom"
  75. placeholder="考场"
  76. clearable
  77. ></el-input>
  78. </el-form-item>
  79. <el-form-item label="姓名/学号:">
  80. <el-input
  81. style="width: 142px"
  82. v-model.trim="filter.param"
  83. placeholder="姓名/学号"
  84. clearable
  85. ></el-input>
  86. </el-form-item>
  87. <el-form-item label="起止成绩:">
  88. <el-input-number
  89. style="width: 100px"
  90. v-model="filter.minScore"
  91. :min="0"
  92. :max="999"
  93. :step="1"
  94. step-strictly
  95. :controls="false"
  96. placeholder="成绩"
  97. ></el-input-number>
  98. <span class="el-input-split"></span>
  99. <el-input-number
  100. style="width: 100px"
  101. v-model="filter.maxScore"
  102. :min="0"
  103. :max="999"
  104. :step="1"
  105. step-strictly
  106. :controls="false"
  107. placeholder="成绩"
  108. ></el-input-number>
  109. </el-form-item>
  110. <el-form-item label="起止图片张数:">
  111. <el-input-number
  112. style="width: 100px"
  113. v-model="filter.minBindCount"
  114. :min="0"
  115. :max="999"
  116. :step="1"
  117. step-strictly
  118. :controls="false"
  119. placeholder="图片张数"
  120. ></el-input-number>
  121. <span class="el-input-split"></span>
  122. <el-input-number
  123. style="width: 100px"
  124. v-model="filter.maxBindCount"
  125. :min="0"
  126. :max="999"
  127. :step="1"
  128. step-strictly
  129. :controls="false"
  130. placeholder="图片张数"
  131. ></el-input-number>
  132. </el-form-item>
  133. <el-form-item>
  134. <el-button type="primary" @click="toPage(1)">查询</el-button>
  135. </el-form-item>
  136. </el-form>
  137. <div class="part-box-action">
  138. <el-button
  139. type="success"
  140. icon="el-icon-upload"
  141. :loading="loading"
  142. @click="toDownload"
  143. >批量下载</el-button
  144. >
  145. </div>
  146. </div>
  147. <div class="part-box part-box-pad mb-0">
  148. <el-table
  149. ref="TableList"
  150. :data="dataList"
  151. @selection-change="handleSelectionChange"
  152. >
  153. <el-table-column
  154. type="selection"
  155. width="55"
  156. align="center"
  157. ></el-table-column>
  158. <el-table-column prop="studentName" label="姓名"></el-table-column>
  159. <el-table-column
  160. prop="studentCode"
  161. label="学号"
  162. width="120"
  163. ></el-table-column>
  164. <el-table-column prop="courseCodeName" label="课程名称(代码)">
  165. <template slot-scope="scope">
  166. {{ scope.row.courseName }}({{ scope.row.courseCode }})
  167. </template>
  168. </el-table-column>
  169. <el-table-column prop="teacher" label="任课老师"></el-table-column>
  170. <el-table-column prop="teachClass" label="教学班"></el-table-column>
  171. <el-table-column prop="collegeName" label="学院"></el-table-column>
  172. <el-table-column prop="majorName" label="专业"></el-table-column>
  173. <el-table-column prop="className" label="班级"></el-table-column>
  174. <el-table-column prop="examRoom" label="考场"></el-table-column>
  175. <el-table-column
  176. prop="score"
  177. label="成绩"
  178. width="80"
  179. ></el-table-column>
  180. <el-table-column
  181. prop="remark"
  182. label="备注"
  183. width="120"
  184. ></el-table-column>
  185. <el-table-column class-name="action-column" label="图片" width="80">
  186. <template slot-scope="scope">
  187. <el-button
  188. class="btn-primary"
  189. type="text"
  190. @click="toDetail(scope.row)"
  191. >
  192. <span class="cont-link">{{ scope.row.bindCount }}</span>
  193. </el-button>
  194. </template>
  195. </el-table-column>
  196. </el-table>
  197. <div class="part-page">
  198. <el-pagination
  199. background
  200. layout="total,prev, pager, next"
  201. :current-page="current"
  202. :total="total"
  203. :page-size="size"
  204. @current-change="toPage"
  205. >
  206. </el-pagination>
  207. </div>
  208. </div>
  209. </el-dialog>
  210. <!-- ArchivesDetailStudentDialog -->
  211. <archives-detail-student-dialog
  212. ref="ArchivesDetailStudentDialog"
  213. :student="curRow"
  214. ></archives-detail-student-dialog>
  215. </div>
  216. </template>
  217. <script>
  218. import { documentDetialListPage, documentDetialDownload } from "../api";
  219. import { BOUND_TYPE } from "@/constants/enumerate";
  220. import ArchivesDetailStudentDialog from "./ArchivesDetailStudentDialog.vue";
  221. import { downloadByApi } from "@/plugins/download";
  222. export default {
  223. name: "document-detail-dialog",
  224. components: { ArchivesDetailStudentDialog },
  225. props: {
  226. task: {
  227. type: Object,
  228. default() {
  229. return {};
  230. },
  231. },
  232. },
  233. data() {
  234. return {
  235. modalIsShow: false,
  236. filter: {
  237. paperScanTaskId: "",
  238. collegeName: "",
  239. majorName: "",
  240. clazzName: "",
  241. isBind: "",
  242. teacher: "",
  243. teachClass: "",
  244. examRoom: "",
  245. param: "",
  246. minScore: undefined,
  247. maxScore: undefined,
  248. minBindCount: undefined,
  249. maxBindCount: undefined,
  250. },
  251. current: 1,
  252. size: this.GLOBAL.pageSize,
  253. total: 0,
  254. dataList: [],
  255. curRow: {},
  256. multipleSelection: [],
  257. BOUND_TYPE,
  258. loading: false,
  259. };
  260. },
  261. methods: {
  262. visibleChange() {
  263. this.filter.paperScanTaskId = this.task.paperScanTaskId;
  264. this.dataList = [];
  265. this.toPage(1);
  266. },
  267. cancel() {
  268. this.modalIsShow = false;
  269. },
  270. open() {
  271. this.modalIsShow = true;
  272. },
  273. async getList() {
  274. const datas = {
  275. ...this.filter,
  276. pageNumber: this.current,
  277. pageSize: this.size,
  278. };
  279. const data = await documentDetialListPage(datas);
  280. this.dataList = data.records;
  281. this.total = data.total;
  282. },
  283. toPage(page) {
  284. this.current = page;
  285. this.getList();
  286. },
  287. handleSelectionChange(val) {
  288. this.multipleSelection = val.map((item) => item.studentId);
  289. },
  290. async toDownload() {
  291. if (this.loading) return;
  292. this.loading = true;
  293. const res = await downloadByApi(() => {
  294. return documentDetialDownload(this.filter);
  295. }).catch((e) => {
  296. this.$message.error(e || "下载失败,请重新尝试!");
  297. });
  298. this.loading = false;
  299. if (!res) return;
  300. this.$message.success("下载成功!");
  301. },
  302. toDetail(row) {
  303. if (!row.bindCount) return;
  304. this.curRow = {
  305. ...row,
  306. paperScanTaskId: this.task.paperScanTaskId,
  307. semesterId: this.task.semesterId,
  308. };
  309. this.$refs.ArchivesDetailStudentDialog.open();
  310. },
  311. },
  312. };
  313. </script>