ExamManagement.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <template>
  2. <div class="exam-management">
  3. <div class="part-box-head">
  4. <div class="part-box-head-left"><h1>批次管理</h1></div>
  5. </div>
  6. <div class="part-filter">
  7. <div class="part-filter-form">
  8. <el-form :model="form" inline>
  9. <el-form-item label="批次名称">
  10. <el-input
  11. v-model.trim="form.name"
  12. placeholder="输入批次名称"
  13. ></el-input>
  14. </el-form-item>
  15. <el-form-item label="类型">
  16. <ExamTypeSelect v-model="form.mode"></ExamTypeSelect>
  17. </el-form-item>
  18. <el-form-item label="状态">
  19. <StateSelect v-model="form.enableState"></StateSelect>
  20. </el-form-item>
  21. <el-form-item>
  22. <el-button type="primary" @click="handleCurrentChange(0)"
  23. >查询</el-button
  24. >
  25. </el-form-item>
  26. </el-form>
  27. <div class="part-filter-form-action">
  28. <el-button type="primary" icon="icon icon-add" @click="add"
  29. >新增</el-button
  30. >
  31. <el-button type="primary" icon="icon icon-copy" @click="copy"
  32. >复制</el-button
  33. >
  34. </div>
  35. </div>
  36. </div>
  37. <el-table ref="table" :data="tableData">
  38. <el-table-column type="selection" width="42" />
  39. <el-table-column width="100" label="ID">
  40. <span slot-scope="scope">{{ scope.row.id }}</span>
  41. </el-table-column>
  42. <el-table-column width="200" label="批次编码">
  43. <span slot-scope="scope">{{ scope.row.code }}</span>
  44. </el-table-column>
  45. <el-table-column width="200" label="批次名称">
  46. <span slot-scope="scope">{{ scope.row.name }}</span>
  47. </el-table-column>
  48. <el-table-column label="模式">
  49. <span slot-scope="scope">{{ scope.row.mode | modeFilter }}</span>
  50. </el-table-column>
  51. <el-table-column width="120" label="状态">
  52. <span slot-scope="scope">{{
  53. scope.row.enable | zeroOneEnableDisableFilter
  54. }}</span>
  55. </el-table-column>
  56. <el-table-column width="100" label="开始时间">
  57. <span slot-scope="scope">{{
  58. scope.row.startTime | datetimeFilter
  59. }}</span>
  60. </el-table-column>
  61. <el-table-column width="100" label="结束时间">
  62. <span slot-scope="scope">{{ scope.row.endTime | datetimeFilter }}</span>
  63. </el-table-column>
  64. <el-table-column width="100" label="监考状态">
  65. <span slot-scope="scope">{{
  66. scope.row.monitorStatus | monitorStatusFilter
  67. }}</span>
  68. </el-table-column>
  69. <el-table-column width="100" label="算分进度">
  70. <span slot-scope="scope">
  71. <div class="text-center">{{ scope.row.progress }}%</div>
  72. <el-progress
  73. type="line"
  74. :show-text="false"
  75. :stroke-width="12"
  76. :percentage="scope.row.progress"
  77. ></el-progress
  78. ></span>
  79. </el-table-column>
  80. <el-table-column width="120" label="更新人">
  81. <span slot-scope="scope">{{ scope.row.updateName }}</span>
  82. </el-table-column>
  83. <el-table-column width="100" label="更新时间">
  84. <span slot-scope="scope">{{
  85. scope.row.updateTime | datetimeFilter
  86. }}</span>
  87. </el-table-column>
  88. <el-table-column :context="_self" label="操作" width="220" fixed="right">
  89. <div slot-scope="scope">
  90. <el-button
  91. size="mini"
  92. type="primary"
  93. plain
  94. @click="toggleEnableExam(scope.row)"
  95. >
  96. {{ !scope.row.enable | booleanEnableDisableFilter }}
  97. </el-button>
  98. <el-button size="mini" type="primary" plain @click="edit(scope.row)">
  99. 编辑
  100. </el-button>
  101. <el-button
  102. size="mini"
  103. type="primary"
  104. plain
  105. @click="pushExam(scope.row)"
  106. >推送</el-button
  107. >
  108. <div class="mb-2"></div>
  109. <el-button
  110. size="mini"
  111. type="primary"
  112. plain
  113. @click="editActivities(scope.row)"
  114. v-if="scope.row.mode === 'TOGETHER'"
  115. >
  116. 场次设置
  117. </el-button>
  118. <span v-if="scope.row.mode === 'TOGETHER'" class="ml-2"></span>
  119. <el-badge
  120. :value="scope.row.scoreStatus === 'NEED_CALCULATE' ? 'new' : ''"
  121. >
  122. <el-button
  123. size="mini"
  124. type="primary"
  125. @click="reCalcBtn(scope.row)"
  126. plain
  127. :loading="scope.row.scoreStatus === 'CALCULATING'"
  128. >
  129. {{
  130. scope.row.scoreStatus === "CALCULATING"
  131. ? "正在算分"
  132. : "重新算分"
  133. }}
  134. </el-button>
  135. </el-badge>
  136. </div>
  137. </el-table-column>
  138. </el-table>
  139. <div class="part-page">
  140. <el-pagination
  141. background
  142. @current-change="handleCurrentChange"
  143. :current-page="currentPage"
  144. :page-size="pageSize"
  145. :page-sizes="[10, 20, 50, 100, 200, 300]"
  146. @size-change="handleSizeChange"
  147. layout="total, sizes, prev, pager, next, jumper"
  148. :total="total"
  149. />
  150. </div>
  151. <CopyExamDialog ref="theDialog" :exam="selected" @reload="searchForm" />
  152. <PushSetDialog ref="PushSetDialog" :exam-id="curExamId" />
  153. </div>
  154. </template>
  155. <script>
  156. import StateSelect from "@/components/StateSelect";
  157. import ExamTypeSelect from "@/components/ExamTypeSelect";
  158. import { searchExams, toggleEnableExam, reCalcExam } from "@/api/examwork-exam";
  159. import CopyExamDialog from "./CopyExamDialog";
  160. import PushSetDialog from "./PushSetDialog.vue";
  161. export default {
  162. name: "ExamManagement",
  163. components: {
  164. StateSelect,
  165. ExamTypeSelect,
  166. CopyExamDialog,
  167. PushSetDialog,
  168. },
  169. data() {
  170. return {
  171. form: {
  172. orgId: "",
  173. roleCode: "",
  174. loginName: "",
  175. name: "",
  176. enableState: null,
  177. },
  178. tableData: [],
  179. currentPage: 1,
  180. pageSize: 10,
  181. total: 10,
  182. selected: null,
  183. curExamId: null,
  184. };
  185. },
  186. created() {
  187. this.searchForm();
  188. },
  189. // activated() {
  190. // console.log("im activated");
  191. // },
  192. // deactivated() {
  193. // console.log("im deactivated");
  194. // },
  195. beforeRouteEnter(to, from, next) {
  196. if (from.name === "ExamEdit") {
  197. next((vm) => vm.$nextTick(() => vm.searchForm()));
  198. } else {
  199. next();
  200. }
  201. },
  202. methods: {
  203. async searchForm() {
  204. const res = await searchExams({
  205. enable: this.form.enableState,
  206. name: this.form.name,
  207. mode: this.form.mode,
  208. pageNumber: this.currentPage,
  209. pageSize: this.pageSize,
  210. });
  211. this.tableData = res.data.data.records;
  212. this.total = res.data.data.total;
  213. if (this.total > 0 && this.tableData.length === 0) {
  214. this.handleCurrentChange(this.currentPage - 1);
  215. }
  216. },
  217. handleCurrentChange(val) {
  218. this.currentPage = val;
  219. this.searchForm();
  220. },
  221. handleSizeChange(val) {
  222. this.pageSize = val;
  223. this.currentPage = 1;
  224. this.searchForm();
  225. },
  226. add() {
  227. this.$router.push("/exam/edit/");
  228. },
  229. edit(exam) {
  230. this.$router.push("/exam/edit/" + exam.id);
  231. },
  232. async toggleEnableExam(exam) {
  233. await toggleEnableExam({
  234. id: exam.id,
  235. enable: exam.enable === 0 ? 1 : 0,
  236. });
  237. this.searchForm();
  238. },
  239. async copy() {
  240. let rows = this.$refs.table.selection;
  241. if (rows.length !== 1) {
  242. this.$notify({
  243. type: "warning",
  244. title: rows.length === 0 ? "请选择一个批次" : "请仅选择一个批次",
  245. });
  246. return;
  247. }
  248. this.selected = rows[0];
  249. this.$refs.theDialog.openDialog();
  250. },
  251. editActivities(exam) {
  252. window.sessionStorage.setItem(
  253. "examInfo",
  254. JSON.stringify({ examName: exam.name, examCode: exam.code })
  255. );
  256. this.$router.push({
  257. name: "ActivityManagement",
  258. params: { examId: exam.id },
  259. });
  260. },
  261. reCalcBtn(exam) {
  262. this.$confirm(
  263. `<div>批次ID:${exam.id}</div><div>批次名称:${exam.name}</div>`,
  264. "是否重新计算该批次成绩?",
  265. {
  266. confirmButtonText: "确定",
  267. cancelButtonText: "取消",
  268. type: "warning",
  269. dangerouslyUseHTMLString: true,
  270. }
  271. )
  272. .then(() => {
  273. reCalcExam(exam.id);
  274. this.$message({
  275. type: "success",
  276. message: "重新算分任务已启动!",
  277. });
  278. })
  279. .catch(() => {});
  280. },
  281. pushExam(exam) {
  282. this.curExamId = exam.id;
  283. this.$refs.PushSetDialog.open();
  284. },
  285. },
  286. };
  287. </script>