ExamTaskManage.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. <template>
  2. <div class="exam-task-manage">
  3. <div class="part-box part-box-filter">
  4. <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
  5. <template v-if="checkPrivilege('condition', 'condition')">
  6. <secp-select v-model="filter" defaultSelectExam></secp-select>
  7. <el-form-item label="命题状态:">
  8. <el-select
  9. v-model="filter.status"
  10. style="width: 142px"
  11. placeholder="命题状态"
  12. clearable
  13. >
  14. <el-option
  15. v-for="(val, key) in EXAM_TASK_STATUS"
  16. :key="key"
  17. :value="key"
  18. :label="val"
  19. ></el-option>
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="命题老师:">
  23. <el-input
  24. v-model="filter.userName"
  25. placeholder="命题老师姓名"
  26. clearable
  27. ></el-input>
  28. </el-form-item>
  29. <el-form-item label="命题时间:">
  30. <el-date-picker
  31. v-model="createTime"
  32. type="datetimerange"
  33. :picker-options="pickerOptions"
  34. range-separator="至"
  35. start-placeholder="命题开始时间"
  36. end-placeholder="命题结束时间"
  37. value-format="timestamp"
  38. align="right"
  39. unlink-panels
  40. >
  41. </el-date-picker>
  42. </el-form-item>
  43. <el-form-item label="启用/禁用:" label-width="90px">
  44. <el-select
  45. v-model="filter.enable"
  46. style="width: 120px"
  47. placeholder="启用/禁用"
  48. clearable
  49. >
  50. <el-option
  51. v-for="(val, key) in ABLE_TYPE"
  52. :key="key"
  53. :value="key * 1"
  54. :label="val"
  55. ></el-option>
  56. </el-select>
  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. @click="toPage(1)"
  64. >查询</el-button
  65. >
  66. </el-form-item>
  67. </el-form>
  68. <div class="box-justify">
  69. <div>
  70. <el-button
  71. v-if="checkPrivilege('button', 'BatchAdd')"
  72. icon="el-icon-circle-plus-outline"
  73. type="info"
  74. @click="toBatchAdd"
  75. >
  76. 批量新增
  77. </el-button>
  78. </div>
  79. <div>
  80. <el-button
  81. v-if="checkPrivilege('button', 'add')"
  82. icon="el-icon-circle-plus-outline"
  83. type="primary"
  84. @click="toAdd"
  85. >
  86. 新增
  87. </el-button>
  88. </div>
  89. </div>
  90. </div>
  91. <div class="part-box part-box-pad">
  92. <el-table ref="TableList" :data="examTasks">
  93. <el-table-column
  94. type="index"
  95. label="序号"
  96. width="70"
  97. :index="indexMethod"
  98. ></el-table-column>
  99. <!-- <el-table-column prop="semesterName" label="学期" min-width="210">
  100. </el-table-column>
  101. <el-table-column
  102. prop="examName"
  103. label="考试"
  104. min-width="160"
  105. ></el-table-column> -->
  106. <el-table-column
  107. prop="paperNumber"
  108. label="试卷编号"
  109. width="160"
  110. ></el-table-column>
  111. <el-table-column prop="courseName" label="课程(代码)" min-width="260">
  112. <template slot-scope="scope">
  113. {{ scope.row.courseName }}({{ scope.row.courseCode }})
  114. </template>
  115. </el-table-column>
  116. <el-table-column
  117. prop="userName"
  118. label="命题老师"
  119. min-width="120"
  120. ></el-table-column>
  121. <el-table-column prop="startTime" label="命题开始时间" width="170">
  122. <span slot-scope="scope">{{
  123. scope.row.startTime | timestampFilter
  124. }}</span>
  125. </el-table-column>
  126. <el-table-column prop="endTime" label="命题结束时间" width="170">
  127. <span slot-scope="scope">{{
  128. scope.row.endTime | timestampFilter
  129. }}</span>
  130. </el-table-column>
  131. <el-table-column prop="status" label="命题状态" width="100">
  132. <template slot-scope="scope">
  133. {{ scope.row.status | examTaskStatusFilter }}
  134. </template>
  135. </el-table-column>
  136. <el-table-column prop="enable" label="启用/禁用" width="100">
  137. <template slot-scope="scope">
  138. {{ scope.row.enable | enableFilter }}
  139. </template>
  140. </el-table-column>
  141. <el-table-column prop="createTime" label="创建时间" width="170">
  142. <span slot-scope="scope">{{
  143. scope.row.createTime | timestampFilter
  144. }}</span>
  145. </el-table-column>
  146. <el-table-column
  147. class-name="action-column"
  148. label="操作"
  149. width="140px"
  150. fixed="right"
  151. >
  152. <template slot-scope="scope">
  153. <el-button
  154. v-if="checkPrivilege('link', 'preview')"
  155. class="btn-primary"
  156. type="text"
  157. @click="toPreview(scope.row)"
  158. >预览</el-button
  159. >
  160. <el-button
  161. v-if="
  162. ((scope.row.status === 'STAGE' && !scope.row.enable) ||
  163. scope.row.status === 'DRAFT') &&
  164. scope.row.createId === curUserId &&
  165. checkPrivilege('link', 'assign')
  166. "
  167. class="btn-primary"
  168. type="text"
  169. @click="toEdit(scope.row)"
  170. >{{ scope.row.status === "DRAFT" ? "指派" : "更改" }}</el-button
  171. >
  172. <el-button
  173. v-if="
  174. scope.row.status !== 'FINISH' &&
  175. scope.row.createId === curUserId &&
  176. checkPrivilege('link', 'cancel')
  177. "
  178. :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
  179. type="text"
  180. @click="toEnable(scope.row)"
  181. >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
  182. >
  183. <el-button
  184. v-if="checkPrivilege('link', 'delete')"
  185. class="btn-danger"
  186. type="text"
  187. @click="toDelete(scope.row)"
  188. >删除</el-button
  189. >
  190. </template>
  191. </el-table-column>
  192. </el-table>
  193. <div class="part-page">
  194. <el-pagination
  195. background
  196. layout="total, sizes, prev, pager, next, jumper"
  197. :pager-count="5"
  198. :current-page="current"
  199. :total="total"
  200. :page-size="size"
  201. @current-change="toPage"
  202. @size-change="pageSizeChange"
  203. >
  204. </el-pagination>
  205. </div>
  206. </div>
  207. <!-- ModifyExamTask -->
  208. <modify-exam-task
  209. ref="ModifyExamTask"
  210. :instance="curExamTask"
  211. :edit-type="editType"
  212. @modified="taskModified"
  213. ></modify-exam-task>
  214. <!-- BatchAddExamTask -->
  215. <batch-add-exam-task
  216. ref="BatchAddExamTask"
  217. @modified="taskModified"
  218. ></batch-add-exam-task>
  219. </div>
  220. </template>
  221. <script>
  222. import ModifyExamTask from "../components/ModifyExamTask";
  223. import BatchAddExamTask from "../components/BatchAddExamTask.vue";
  224. import { ABLE_TYPE, EXAM_TASK_STATUS } from "@/constants/enumerate";
  225. import pickerOptions from "@/constants/datePickerOptions";
  226. import { examTaskListPage, ableExamTask, deleteExamTask } from "../api";
  227. import { mapActions } from "vuex";
  228. export default {
  229. name: "exam-task-manage",
  230. components: {
  231. ModifyExamTask,
  232. BatchAddExamTask,
  233. },
  234. data() {
  235. return {
  236. filter: {
  237. semesterId: "",
  238. examId: "",
  239. status: "",
  240. cardRuleId: "",
  241. courseId: "",
  242. paperNumber: "",
  243. userName: "",
  244. createName: "",
  245. startTime: null,
  246. endTime: null,
  247. enable: null,
  248. },
  249. current: 1,
  250. size: this.GLOBAL.pageSize,
  251. total: 0,
  252. editType: "ADD",
  253. ABLE_TYPE,
  254. EXAM_TASK_STATUS,
  255. examTasks: [],
  256. curExamTask: {},
  257. curUserId: this.$ls.get("user", { id: "" }).id,
  258. // date-picker
  259. createTime: [],
  260. pickerOptions,
  261. };
  262. },
  263. watch: {
  264. "filter.examId": {
  265. handler(val, oldval) {
  266. if (val && val !== oldval) this.toPage(1);
  267. },
  268. immediate: true,
  269. },
  270. },
  271. methods: {
  272. ...mapActions("exam", ["updateWaitTaskCount"]),
  273. async getList() {
  274. if (!this.checkPrivilege("list", "list")) return;
  275. const datas = {
  276. ...this.filter,
  277. pageNumber: this.current,
  278. pageSize: this.size,
  279. };
  280. if (datas.enable !== null && datas.enable !== "")
  281. datas.enable = !!datas.enable;
  282. if (this.createTime) {
  283. datas.startTime = this.createTime[0];
  284. datas.endTime = this.createTime[1];
  285. }
  286. const data = await examTaskListPage(datas);
  287. this.examTasks = data.records;
  288. this.total = data.total;
  289. },
  290. toPage(page) {
  291. this.current = page;
  292. this.getList();
  293. },
  294. async toEnable(row) {
  295. const msgs = [
  296. [
  297. "命题任务取消后,有如下后果:",
  298. "1.命题老师将无法看到该命题任务;",
  299. "2.该任务无法审核和与考试计划关联;",
  300. "3.该任务已绑定的题卡将取消绑定。",
  301. "您确定要取消命题任务吗?",
  302. ],
  303. [
  304. "命题任务启用后:",
  305. "1.命题老师将重新看到该命题任务;",
  306. "2.该任务将允许继续审核及与考试计划关联;",
  307. "3.该任务需重新绑定题卡。",
  308. "您确定要启用命题任务吗?",
  309. ],
  310. ];
  311. const msg = row.enable ? msgs[0] : msgs[1];
  312. const msgHtml = msg
  313. .map((item) => `<p class="text-left">${item}</p>`)
  314. .join("");
  315. this.$confirm(msgHtml, "提示", {
  316. dangerouslyUseHTMLString: true,
  317. type: "warning",
  318. })
  319. .then(async () => {
  320. const enable = !row.enable;
  321. await ableExamTask({
  322. id: row.id,
  323. enable,
  324. });
  325. row.enable = enable;
  326. this.$message.success("操作成功!");
  327. // 启用之后,更新列表。
  328. // 因为禁用时会解绑题卡,影响命题任务状态。
  329. if (enable) this.getList();
  330. })
  331. .catch(() => {});
  332. },
  333. toBatchAdd() {
  334. this.$refs.BatchAddExamTask.open();
  335. },
  336. toAdd() {
  337. this.curExamTask = {};
  338. this.editType = "ADD";
  339. this.$refs.ModifyExamTask.open();
  340. },
  341. toEdit(row) {
  342. this.curExamTask = row;
  343. this.editType = "EDIT";
  344. this.$refs.ModifyExamTask.open();
  345. },
  346. toPreview(row) {
  347. this.curExamTask = row;
  348. this.editType = "PREVIEW";
  349. this.$refs.ModifyExamTask.open();
  350. },
  351. taskModified() {
  352. this.getList();
  353. this.updateWaitTaskCount();
  354. },
  355. async toDelete(row) {
  356. const result = await this.$confirm(`确定要删除命题任务吗?`, "提示", {
  357. type: "warning",
  358. }).catch(() => {});
  359. if (result !== "confirm") return;
  360. await deleteExamTask(row.id);
  361. this.$message.success("操作成功!");
  362. this.deletePageLastItem();
  363. },
  364. },
  365. };
  366. </script>