CourseDocumentDetail.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <div class="course-document-detail">
  3. <el-dialog
  4. class="page-dialog"
  5. :visible.sync="modalIsShow"
  6. :close-on-click-modal="false"
  7. :close-on-press-escape="false"
  8. top="20px"
  9. append-to-body
  10. width="750px"
  11. @opened="getList"
  12. >
  13. <div slot="title">
  14. 文档详情
  15. <span class="color-gray ml-2"
  16. >{{ course.courseName }}({{ course.courseCode }})</span
  17. >
  18. </div>
  19. <div class="box-justify mb-2">
  20. <div>
  21. <el-button
  22. type="primary"
  23. :loading="bloading"
  24. icon="el-icon-download"
  25. @click="toBatchDownload"
  26. >批量下载</el-button
  27. >
  28. </div>
  29. <div>
  30. <el-button
  31. v-if="checkPrivilege('button', 'add')"
  32. type="primary"
  33. icon="el-icon-circle-plus-outline"
  34. @click="toAdd"
  35. >新建文档</el-button
  36. >
  37. </div>
  38. </div>
  39. <div class="part-box part-box-pad">
  40. <el-table :data="dataList">
  41. <el-table-column
  42. type="index"
  43. label="序号"
  44. width="70"
  45. ></el-table-column>
  46. <el-table-column prop="name" label="材料名称"></el-table-column>
  47. <el-table-column
  48. prop="fileCount"
  49. label="数量"
  50. width="80"
  51. ></el-table-column>
  52. <el-table-column
  53. class-name="action-column"
  54. label="操作"
  55. width="120px"
  56. align="right"
  57. fixed="right"
  58. >
  59. <template slot-scope="scope">
  60. <upload-button
  61. v-if="checkUpload(scope.row)"
  62. btn-content="上传"
  63. btn-type="text"
  64. btn-class="btn-primary"
  65. :upload-url="uploadUrl"
  66. :upload-data="{ id: scope.row.id }"
  67. :format="format"
  68. style="margin: 0"
  69. @valid-error="validError"
  70. @upload-success="uploadSuccess"
  71. >
  72. </upload-button>
  73. <el-button
  74. v-if="checkView(scope.row)"
  75. class="btn-primary"
  76. type="text"
  77. @click="toView(scope.row)"
  78. >查看</el-button
  79. >
  80. <el-button
  81. v-if="checkDelete(scope.row)"
  82. class="btn-danger"
  83. type="text"
  84. @click="toDelete(scope.row)"
  85. >删除</el-button
  86. >
  87. <el-button
  88. v-if="checkDownload(scope.row)"
  89. class="btn-primary"
  90. type="text"
  91. :disabled="downloading"
  92. @click="toDownload(scope.row)"
  93. >下载</el-button
  94. >
  95. <el-button
  96. v-if="checkDownloadUrl(scope.row)"
  97. class="btn-primary"
  98. type="text"
  99. @click="toDownloadUrl(scope.row)"
  100. >下载</el-button
  101. >
  102. </template>
  103. </el-table-column>
  104. </el-table>
  105. </div>
  106. <div class="tips-markedness">
  107. <p v-if="toolUrl">
  108. 学生答卷原图和轨迹图请先下载工具后登录账号再进行下载
  109. <a class="btn-link ml-2" :href="toolUrl" download>点击下载工具</a>
  110. </p>
  111. </div>
  112. <div slot="footer"></div>
  113. </el-dialog>
  114. <!-- AddDocumentDialog -->
  115. <add-document-dialog
  116. ref="AddDocumentDialog"
  117. :course="course"
  118. @modified="getList"
  119. ></add-document-dialog>
  120. <!-- ScoreReportPreview -->
  121. <score-report-preview
  122. ref="ScoreReportPreview"
  123. :instance="reportParams"
  124. ></score-report-preview>
  125. <!-- PaperApproveTable -->
  126. <paper-approve-table
  127. :instance="course"
  128. ref="PaperApproveTable"
  129. ></paper-approve-table>
  130. </div>
  131. </template>
  132. <script>
  133. import { downloadByApi } from "@/plugins/download";
  134. import { toolInfo } from "@/modules/admin/api";
  135. import {
  136. documentListPage,
  137. documentDownload,
  138. documentDelete,
  139. documentBatchDownload,
  140. } from "../api";
  141. import AddDocumentDialog from "./AddDocumentDialog.vue";
  142. import UploadButton from "@/components/UploadButton.vue";
  143. import ScoreReportPreview from "@/modules/mark/components/ScoreReportPreview.vue";
  144. import PaperApproveTable from "@/modules/exam/components/PaperApproveTable.vue";
  145. /*
  146. SYLLABUS("课程教学大纲", 1),
  147. PROCESS_SCORE("过程考核成绩", 2),
  148. PAPER("试卷样卷", 3),
  149. ANSWER("试卷评阅标准", 4),
  150. PAPER_REPORT("试卷分析报告", 5),
  151. APPROVE_RECORD("试卷审批记录", 6),
  152. SCORE("学生期末考试成绩单", 7),
  153. SCORE_REPORT("学生期末考试成绩分析", 8),
  154. SHEET("学生答卷原图", 9),
  155. TRACK("学生答卷轨迹图", 10),
  156. SIGN("期末考试签到表", 11),
  157. CHECK_IN("期考考试考场记录单", 12),
  158. CUSTOM("自定义", 13),
  159. */
  160. export default {
  161. name: "course-document-detail",
  162. components: {
  163. AddDocumentDialog,
  164. UploadButton,
  165. ScoreReportPreview,
  166. PaperApproveTable,
  167. },
  168. props: {
  169. course: {
  170. type: Object,
  171. default() {
  172. return {};
  173. },
  174. },
  175. },
  176. data() {
  177. return {
  178. modalIsShow: false,
  179. dataList: [],
  180. curRow: {},
  181. downloading: false,
  182. uploadUrl: "/api/admin/mark/archive/document/import",
  183. reportParams: {},
  184. curExamTask: {},
  185. format: ["docx", "doc", "xlsx", "xls", "pdf", "jpg", "png", "zip"],
  186. toolUrl: "",
  187. bloading: false,
  188. };
  189. },
  190. mounted() {
  191. this.getToolInfo();
  192. },
  193. methods: {
  194. async getToolInfo() {
  195. const res = await toolInfo();
  196. const info = res || {};
  197. this.toolUrl = info.url || "";
  198. },
  199. cancel() {
  200. this.modalIsShow = false;
  201. },
  202. open() {
  203. this.modalIsShow = true;
  204. },
  205. checkView(row) {
  206. return ["PAPER", "ANSWER", "APPROVE_RECORD", "SCORE_REPORT"].includes(
  207. row.type
  208. );
  209. },
  210. checkDelete(row) {
  211. return ["CUSTOM"].includes(row.type);
  212. },
  213. checkUpload(row) {
  214. return ["SYLLABUS", "PROCESS_SCORE", "PAPER_REPORT", "CHECK_IN"].includes(
  215. row.type
  216. );
  217. },
  218. checkDownload(row) {
  219. return ["SCORE", "SHEET", "TRACK", "SIGN"].includes(row.type);
  220. },
  221. checkDownloadUrl(row) {
  222. return [
  223. "SYLLABUS",
  224. "PROCESS_SCORE",
  225. "PAPER_REPORT",
  226. "CHECK_IN",
  227. "CUSTOM",
  228. ].includes(row.type);
  229. },
  230. async getList() {
  231. const datas = {
  232. examId: this.course.examId,
  233. paperNumber: this.course.paperNumber,
  234. };
  235. const res = await documentListPage(datas);
  236. this.dataList = res || [];
  237. },
  238. toView(row) {
  239. // 试卷审批记录
  240. if (row.type === "APPROVE_RECORD") {
  241. this.$refs.PaperApproveTable.open();
  242. return;
  243. }
  244. // 学生期末考试成绩分析
  245. if (row.type === "SCORE_REPORT") {
  246. this.reportParams = {
  247. ...this.course,
  248. filter: {},
  249. };
  250. this.$refs.ScoreReportPreview.open();
  251. return;
  252. }
  253. this.toDownloadUrl(row);
  254. },
  255. toDownloadUrl(row) {
  256. if (!row.filePath) {
  257. this.$message.error("当前无文档可下载");
  258. return;
  259. }
  260. window.open(row.filePath);
  261. },
  262. async toDownload(row) {
  263. if (this.downloading) return;
  264. this.downloading = true;
  265. const res = await downloadByApi(() => {
  266. return documentDownload(row.id);
  267. }).catch((e) => {
  268. this.$message.error(e || "下载失败,请重新尝试!");
  269. });
  270. this.downloading = false;
  271. if (!res) return;
  272. this.$message.success("下载成功!");
  273. },
  274. toAdd() {
  275. this.$refs.AddDocumentDialog.open();
  276. },
  277. toDelete(row) {
  278. this.$confirm(`确定要删除文档【${row.name}】吗?`, "提示", {
  279. type: "warning",
  280. })
  281. .then(async () => {
  282. await documentDelete(row.id);
  283. this.$message.success("删除成功!");
  284. this.getList();
  285. })
  286. .catch(() => {});
  287. },
  288. async toBatchDownload() {
  289. if (this.bloading) return;
  290. this.bloading = true;
  291. const res = await downloadByApi(() => {
  292. return documentBatchDownload({
  293. examId: this.course.examId,
  294. paperNumber: this.course.paperNumber,
  295. });
  296. }).catch((e) => {
  297. this.$message.error(e || "下载失败,请重新尝试!");
  298. });
  299. this.bloading = false;
  300. if (!res) return;
  301. this.$message.success("下载成功!");
  302. },
  303. // upload
  304. validError(errorData) {
  305. this.$message.error(errorData.message);
  306. },
  307. uploadSuccess(data) {
  308. this.$message.success(data.data || "文档上传成功!");
  309. this.getList();
  310. },
  311. },
  312. };
  313. </script>