TaskPaperManage.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. <template>
  2. <div class="task-paper-manage">
  3. <div class="part-box part-box-filter part-box-flex">
  4. <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
  5. <template v-if="checkPrivilege('condition', 'condition')">
  6. <el-form-item label="课程(代码):" label-width="110px">
  7. <course-select
  8. ref="CourseSelect"
  9. v-model.trim="filter.courseCode"
  10. placeholder="请选择"
  11. clearable
  12. ></course-select>
  13. </el-form-item>
  14. <el-form-item label="试卷编号:">
  15. <paper-number-select
  16. ref="PaperNumberSelect"
  17. v-model="filter.paperNumber"
  18. placeholder="请选择"
  19. clearable
  20. ></paper-number-select>
  21. </el-form-item>
  22. <el-form-item label="题卡规则:">
  23. <card-rule-select
  24. v-model="filter.cardRuleId"
  25. placeholder="请选择"
  26. clearable
  27. ></card-rule-select>
  28. </el-form-item>
  29. <el-form-item label="题卡创建类型:">
  30. <el-select
  31. v-model="filter.makeMethod"
  32. placeholder="请选择"
  33. clearable
  34. >
  35. <el-option
  36. v-for="(val, key) in CARD_SOURCE_TYPE"
  37. :key="key"
  38. :value="key"
  39. :label="val"
  40. >
  41. </el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="入库时间:">
  45. <el-date-picker
  46. v-model="createTime"
  47. type="datetimerange"
  48. :picker-options="pickerOptions"
  49. range-separator="至"
  50. start-placeholder="开始时间"
  51. end-placeholder="结束时间"
  52. value-format="timestamp"
  53. align="right"
  54. unlink-panels
  55. >
  56. </el-date-picker>
  57. </el-form-item>
  58. </template>
  59. <el-form-item label-width="0px">
  60. <el-button
  61. v-if="checkPrivilege('button', 'select')"
  62. type="primary"
  63. icon="el-icon-search"
  64. @click="toPage(1)"
  65. >查询</el-button
  66. >
  67. </el-form-item>
  68. </el-form>
  69. <div class="part-box-action">
  70. <el-button
  71. v-if="checkPrivilege('button', 'BatchDownload')"
  72. icon="el-icon-download"
  73. type="primary"
  74. :loading="loading"
  75. @click="toBatchExport"
  76. >
  77. 批量下载试卷题卡
  78. </el-button>
  79. </div>
  80. </div>
  81. <div class="part-box">
  82. <el-table ref="TableList" :data="papers" border stripe>
  83. <el-table-column
  84. type="index"
  85. label="序号"
  86. width="70"
  87. align="center"
  88. :index="indexMethod"
  89. ></el-table-column>
  90. <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
  91. <el-table-column prop="courseName" label="课程(代码)">
  92. <template slot-scope="scope">
  93. {{ scope.row.courseName }}({{ scope.row.courseCode }})
  94. </template>
  95. </el-table-column>
  96. <el-table-column
  97. prop="paperType"
  98. label="卷型"
  99. width="100"
  100. ></el-table-column>
  101. <el-table-column
  102. prop="userName"
  103. label="命题老师"
  104. width="100"
  105. ></el-table-column>
  106. <el-table-column prop="createTime" label="入库时间">
  107. <span slot-scope="scope">{{
  108. scope.row.createTime | timestampFilter
  109. }}</span>
  110. </el-table-column>
  111. <el-table-column
  112. prop="exposedPaperType"
  113. label="已曝光"
  114. width="100"
  115. ></el-table-column>
  116. <el-table-column
  117. prop="unexposedPaperType"
  118. label="未曝光"
  119. width="100"
  120. ></el-table-column>
  121. <el-table-column prop="cardRuleName" label="题卡规则"></el-table-column>
  122. <el-table-column prop="makeMethod" label="题卡创建类型">
  123. <span slot-scope="scope">{{
  124. scope.row.makeMethod | cardSourceTypeFilter
  125. }}</span>
  126. </el-table-column>
  127. <el-table-column prop="enable" label="启用/禁用" width="100">
  128. <template slot-scope="scope">
  129. {{ scope.row.enable | enableFilter }}
  130. </template>
  131. </el-table-column>
  132. <el-table-column
  133. class-name="action-column"
  134. label="操作"
  135. align="center"
  136. width="120px"
  137. >
  138. <template slot-scope="scope">
  139. <el-button
  140. v-if="checkPrivilege('link', 'preview')"
  141. class="btn-table-icon"
  142. type="text"
  143. icon="icon icon-circle-right"
  144. @click="toPreview(scope.row)"
  145. title="查看"
  146. ></el-button>
  147. <el-button
  148. v-if="checkPrivilege('link', 'edit')"
  149. class="btn-table-icon"
  150. type="text"
  151. icon="icon icon-edit"
  152. @click="toEdit(scope.row)"
  153. title="修改"
  154. ></el-button>
  155. <el-button
  156. v-if="checkPrivilege('link', 'enable')"
  157. class="btn-table-icon"
  158. type="text"
  159. :icon="
  160. scope.row.enable
  161. ? 'icon icon-circle-stop'
  162. : 'icon icon-circle-caret-right'
  163. "
  164. @click="toEnable(scope.row)"
  165. :title="scope.row.enable ? '禁用' : '启用'"
  166. ></el-button>
  167. <el-button
  168. v-if="checkPrivilege('link', 'download')"
  169. class="btn-table-icon"
  170. type="text"
  171. icon="icon icon-download-act"
  172. :disabled="loading"
  173. @click="toDownload(scope.row)"
  174. title="下载"
  175. ></el-button>
  176. <el-button
  177. v-if="checkPrivilege('link', 'publish')"
  178. class="btn-table-icon"
  179. type="text"
  180. icon="icon icon-download-act"
  181. @click="toPublishPrintTask(scope.row)"
  182. title="发布印刷任务"
  183. ></el-button>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <div class="part-page">
  188. <el-pagination
  189. v-if="papers.length"
  190. background
  191. layout="total,prev, pager, next"
  192. :current-page="current"
  193. :total="total"
  194. :page-size="size"
  195. @current-change="toPage"
  196. >
  197. </el-pagination>
  198. </div>
  199. </div>
  200. <!-- ModifyTaskPaper -->
  201. <modify-task-paper
  202. :instance="curPaper"
  203. :edit-type="editType"
  204. ref="ModifyTaskPaper"
  205. @modified="getList"
  206. ></modify-task-paper>
  207. <!-- PublishPrintTask -->
  208. <publish-print-task
  209. :instance="curPaper"
  210. ref="PublishPrintTask"
  211. ></publish-print-task>
  212. </div>
  213. </template>
  214. <script>
  215. import {
  216. taskPaperListPage,
  217. ableTaskPaper,
  218. downloadPaper,
  219. paperAndCardBatchExport
  220. } from "../api";
  221. import pickerOptions from "@/constants/datePickerOptions";
  222. import { downloadBlob } from "@/plugins/utils";
  223. import { CARD_SOURCE_TYPE } from "@/constants/enumerate";
  224. import ModifyTaskPaper from "../components/ModifyTaskPaper";
  225. import PublishPrintTask from "../components/PublishPrintTask";
  226. export default {
  227. name: "task-paper-manage",
  228. components: { ModifyTaskPaper, PublishPrintTask },
  229. data() {
  230. return {
  231. filter: {
  232. courseCode: "",
  233. paperNumber: "",
  234. cardRuleId: "",
  235. makeMethod: "",
  236. startTime: "",
  237. endTime: ""
  238. },
  239. current: 1,
  240. size: this.GLOBAL.pageSize,
  241. total: 0,
  242. papers: [],
  243. curPaper: {},
  244. loading: false,
  245. editType: "EDIT",
  246. CARD_SOURCE_TYPE,
  247. IS_QUESTION_TEACHER: this.$ls
  248. .get("user", { roleList: [] })
  249. .roleList.includes("QUESTION_TEACHER"),
  250. IS_EXAM_TEACHER: this.$ls
  251. .get("user", { roleList: [] })
  252. .roleList.includes("EXAM_TEACHER"),
  253. // date-picker
  254. createTime: [],
  255. pickerOptions
  256. };
  257. },
  258. mounted() {
  259. this.initData();
  260. },
  261. methods: {
  262. async initData() {
  263. const cachePageInfo = this.$ls.get("cachePageInfo");
  264. if (cachePageInfo) {
  265. this.filter = this.$objAssign(this.filter, cachePageInfo.filter);
  266. if (this.filter.startTime && this.filter.endTime)
  267. this.createTime = [this.filter.startTime, this.filter.endTime];
  268. this.current = cachePageInfo.page;
  269. await this.getList();
  270. this.$nextTick(() => {
  271. const curRow = this.papers.find(
  272. item => item.id === cachePageInfo.curRowId
  273. );
  274. if (!curRow) return;
  275. this.toEdit(curRow);
  276. });
  277. } else {
  278. this.toPage(1);
  279. }
  280. this.$ls.remove("cachePageInfo");
  281. },
  282. async getList() {
  283. if (!this.checkPrivilege("list", "list")) return;
  284. const datas = {
  285. ...this.filter,
  286. pageNumber: this.current,
  287. pageSize: this.size
  288. };
  289. if (this.createTime) {
  290. datas.startTime = this.createTime[0];
  291. datas.endTime = this.createTime[1];
  292. }
  293. const data = await taskPaperListPage(datas);
  294. this.papers = data.records;
  295. this.total = data.total;
  296. },
  297. toPage(page) {
  298. this.current = page;
  299. this.getList();
  300. },
  301. async toEnable(row) {
  302. const msgs = [
  303. ["命题任务禁用后,会触发试卷关联解除,您确定要禁用命题任务吗?"],
  304. [
  305. "命题任务启用后,触发试卷关联校验,若能匹配则自动关联试卷,您确定要启用命题任务吗?"
  306. ]
  307. ];
  308. const msg = row.enable ? msgs[0] : msgs[1];
  309. const msgHtml = msg
  310. .map(item => `<p class="text-left">${item}</p>`)
  311. .join("");
  312. this.$confirm(msgHtml, "提示", {
  313. cancelButtonClass: "el-button--danger is-plain",
  314. confirmButtonClass: "el-button--primary",
  315. dangerouslyUseHTMLString: true,
  316. type: "warning"
  317. })
  318. .then(async () => {
  319. const enable = !row.enable;
  320. await ableTaskPaper({
  321. id: row.id,
  322. enable
  323. });
  324. row.enable = enable;
  325. this.$message.success("操作成功!");
  326. })
  327. .catch(() => {});
  328. },
  329. toEdit(row) {
  330. this.curPaper = row;
  331. this.editType = "EDIT";
  332. this.$refs.ModifyTaskPaper.open();
  333. },
  334. toPreview(row) {
  335. this.curPaper = row;
  336. this.editType = "PREVIEW";
  337. this.$refs.ModifyTaskPaper.open();
  338. },
  339. toPublishPrintTask(row) {
  340. this.curPaper = row;
  341. this.$refs.PublishPrintTask.open();
  342. },
  343. async toDownload(row) {
  344. if (this.loading) return;
  345. this.loading = true;
  346. const res = await downloadBlob(() => {
  347. return downloadPaper(row.id);
  348. }, `${row.paperNumber}-${Date.now()}.zip`).catch(() => {});
  349. this.loading = false;
  350. if (res) {
  351. this.$message.success("文件下载成功!");
  352. } else {
  353. this.$message.error("文件下载失败,请重新尝试!");
  354. }
  355. },
  356. async toBatchExport() {
  357. // 异步导出
  358. if (this.loading) return;
  359. this.loading = true;
  360. let datas = {
  361. ...this.filter
  362. };
  363. if (this.createTime) {
  364. datas.startTime = this.createTime[0];
  365. datas.endTime = this.createTime[1];
  366. }
  367. const res = await paperAndCardBatchExport(datas).catch(() => {});
  368. this.loading = false;
  369. if (res) {
  370. this.$message.success(
  371. "导出任务已提交,请在数据管理-任务管理中下载文件!"
  372. );
  373. } else {
  374. this.$message.error("导出任务提交失败,请重新尝试!");
  375. }
  376. }
  377. },
  378. beforeRouteLeave(to, from, next) {
  379. if (to.name === "CardDesign") {
  380. this.$ls.set("cachePageInfo", {
  381. page: this.current,
  382. filter: this.filter,
  383. curRowId: this.curPaper.id
  384. });
  385. } else {
  386. this.$ls.remove("cachePageInfo");
  387. }
  388. next();
  389. }
  390. };
  391. </script>