ExamManagement.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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="210" 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. <div class="mb-2"></div>
  102. <el-button
  103. size="mini"
  104. type="primary"
  105. plain
  106. @click="editActivities(scope.row)"
  107. v-if="scope.row.mode === 'TOGETHER'"
  108. >
  109. 场次设置
  110. </el-button>
  111. <span v-if="scope.row.mode === 'TOGETHER'" class="ml-2"></span>
  112. <el-badge
  113. :value="scope.row.scoreStatus === 'NEED_CALCULATE' ? 'new' : ''"
  114. >
  115. <el-button
  116. size="mini"
  117. type="primary"
  118. @click="reCalcBtn(scope.row)"
  119. plain
  120. :loading="scope.row.scoreStatus === 'CALCULATING'"
  121. >
  122. {{
  123. scope.row.scoreStatus === "CALCULATING"
  124. ? "正在算分"
  125. : "重新算分"
  126. }}
  127. </el-button>
  128. </el-badge>
  129. <el-button
  130. size="mini"
  131. type="primary"
  132. plain
  133. @click="syncExam(scope.row)"
  134. >同步</el-button
  135. >
  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. </div>
  153. </template>
  154. <script>
  155. import StateSelect from "@/components/StateSelect";
  156. import ExamTypeSelect from "@/components/ExamTypeSelect";
  157. import {
  158. searchExams,
  159. toggleEnableExam,
  160. reCalcExam,
  161. syncCloudMarkExam,
  162. } from "@/api/examwork-exam";
  163. import CopyExamDialog from "./CopyExamDialog";
  164. export default {
  165. name: "ExamManagement",
  166. components: {
  167. StateSelect,
  168. ExamTypeSelect,
  169. CopyExamDialog,
  170. },
  171. data() {
  172. return {
  173. form: {
  174. orgId: "",
  175. roleCode: "",
  176. loginName: "",
  177. name: "",
  178. enableState: null,
  179. },
  180. tableData: [],
  181. currentPage: 1,
  182. pageSize: 10,
  183. total: 10,
  184. selected: null,
  185. };
  186. },
  187. created() {
  188. this.searchForm();
  189. },
  190. // activated() {
  191. // console.log("im activated");
  192. // },
  193. // deactivated() {
  194. // console.log("im deactivated");
  195. // },
  196. beforeRouteEnter(to, from, next) {
  197. if (from.name === "ExamEdit") {
  198. next((vm) => vm.$nextTick(() => vm.searchForm()));
  199. } else {
  200. next();
  201. }
  202. },
  203. methods: {
  204. async searchForm() {
  205. const res = await searchExams({
  206. enable: this.form.enableState,
  207. name: this.form.name,
  208. mode: this.form.mode,
  209. pageNumber: this.currentPage,
  210. pageSize: this.pageSize,
  211. });
  212. this.tableData = res.data.data.records;
  213. this.total = res.data.data.total;
  214. if (this.total > 0 && this.tableData.length === 0) {
  215. this.handleCurrentChange(this.currentPage - 1);
  216. }
  217. },
  218. handleCurrentChange(val) {
  219. this.currentPage = val;
  220. this.searchForm();
  221. },
  222. handleSizeChange(val) {
  223. this.pageSize = val;
  224. this.currentPage = 1;
  225. this.searchForm();
  226. },
  227. add() {
  228. this.$router.push("/exam/edit/");
  229. },
  230. edit(exam) {
  231. this.$router.push("/exam/edit/" + exam.id);
  232. },
  233. async toggleEnableExam(exam) {
  234. await toggleEnableExam({
  235. id: exam.id,
  236. enable: exam.enable === 0 ? 1 : 0,
  237. });
  238. this.searchForm();
  239. },
  240. async copy() {
  241. let rows = this.$refs.table.selection;
  242. if (rows.length !== 1) {
  243. this.$notify({
  244. type: "warning",
  245. title: rows.length === 0 ? "请选择一个批次" : "请仅选择一个批次",
  246. });
  247. return;
  248. }
  249. this.selected = rows[0];
  250. this.$refs.theDialog.openDialog();
  251. },
  252. editActivities(exam) {
  253. window.sessionStorage.setItem(
  254. "examInfo",
  255. JSON.stringify({ examName: exam.name, examCode: exam.code })
  256. );
  257. this.$router.push({
  258. name: "ActivityManagement",
  259. params: { examId: exam.id },
  260. });
  261. },
  262. reCalcBtn(exam) {
  263. this.$confirm(
  264. `<div>批次ID:${exam.id}</div><div>批次名称:${exam.name}</div>`,
  265. "是否重新计算该批次成绩?",
  266. {
  267. confirmButtonText: "确定",
  268. cancelButtonText: "取消",
  269. type: "warning",
  270. dangerouslyUseHTMLString: true,
  271. }
  272. )
  273. .then(() => {
  274. reCalcExam(exam.id);
  275. this.$message({
  276. type: "success",
  277. message: "重新算分任务已启动!",
  278. });
  279. })
  280. .catch(() => {});
  281. },
  282. async syncExam(exam) {
  283. await syncCloudMarkExam({
  284. examId: exam.id,
  285. yunMarkExamId: exam.yunMarkExamId,
  286. });
  287. this.$message.success("操作成功!");
  288. },
  289. },
  290. };
  291. </script>