MarkSettingFast.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <template>
  2. <div>
  3. <LinkTitlesCustom :currentPaths="['评卷设置', '设置列表', '快速设置']" />
  4. <section class="content">
  5. <div class="box box-info">
  6. <div class="box-header with-border">
  7. <div class="box-tools pull-right"></div>
  8. </div>
  9. <div class="box-body">
  10. <div class="scroll">
  11. <el-form
  12. :inline="true"
  13. :model="markerSearch"
  14. label-position="right"
  15. label-width="40px"
  16. >
  17. <el-row :gutter="10" v-if="selectedMarker.length != 0">
  18. <el-col :xs="30" :sm="30" :md="30" :lg="30">
  19. <el-form-item label="已选">
  20. <el-tag
  21. v-for="tag in selectedMarker"
  22. :closable="tagClosable"
  23. :close-transition="false"
  24. @close="tagClose(tag)"
  25. :type="tagType"
  26. :key="tag.userId"
  27. >{{ tag.name }}</el-tag
  28. >
  29. </el-form-item>
  30. </el-col>
  31. </el-row>
  32. <el-form-item label="姓名" class="pull-left">
  33. <el-input
  34. placeholder="姓名"
  35. v-model="markerSearch.name"
  36. @change="searchMarker"
  37. ></el-input>
  38. </el-form-item>
  39. <el-form-item>
  40. <el-button
  41. size="small"
  42. type="primary"
  43. icon="el-icon-search"
  44. @click="searchMarker"
  45. >查询</el-button
  46. >
  47. <el-button
  48. size="small"
  49. type="primary"
  50. icon="el-icon-check"
  51. @click="markerSelect"
  52. >确定</el-button
  53. >
  54. <el-button
  55. size="small"
  56. type="primary"
  57. icon="el-icon-arrow-left"
  58. @click="back"
  59. >返回</el-button
  60. >
  61. </el-form-item>
  62. </el-form>
  63. <div class="block-seperator"></div>
  64. <div class="table-native">
  65. <el-table
  66. stripe
  67. v-loading="loading"
  68. element-loading-text="拼命加载中"
  69. :data="markerData"
  70. border
  71. @selection-change="selectChange"
  72. >
  73. <el-table-column type="selection" width="55"></el-table-column>
  74. <el-table-column label="姓名" prop="name"></el-table-column>
  75. <el-table-column
  76. label="登录名"
  77. prop="loginName"
  78. ></el-table-column>
  79. </el-table>
  80. <div class="page pull-right">
  81. <el-pagination
  82. background
  83. @current-change="handleMarkerCurrentChange"
  84. @size-change="handleSizeChange"
  85. :current-page="curMarker"
  86. :page-size="pageSize"
  87. :page-sizes="[10, 20, 50, 100, 200, 300]"
  88. layout="total, sizes, prev, pager, next, jumper"
  89. :total="totalMarker"
  90. ></el-pagination>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </section>
  97. </div>
  98. </template>
  99. <script>
  100. import { MARKING_API, DATA_PROCESS_API } from "@/constants/constants";
  101. import { mapState } from "vuex";
  102. import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
  103. export default {
  104. data() {
  105. return {
  106. markerSearch: {
  107. name: ""
  108. },
  109. markerData: [],
  110. oldData: [],
  111. selectedMarker: [],
  112. oldSelectedMarker: [],
  113. curMarker: 1,
  114. totalMarker: 10,
  115. pageSize: 10,
  116. loading: true,
  117. workId: "",
  118. examId: "",
  119. examName: "",
  120. courseCode: "",
  121. markTasks: {
  122. workId: "",
  123. userId: [],
  124. paperId: ""
  125. },
  126. paperId: "",
  127. tagType: "primary",
  128. tagClosable: true,
  129. marked: false,
  130. progress: 0
  131. };
  132. },
  133. components: {
  134. LinkTitlesCustom
  135. },
  136. methods: {
  137. selectChange(val) {
  138. var selectedMarker = this.selectedMarker;
  139. val.forEach(element => {
  140. selectedMarker.push(element);
  141. this.removeMarkerData(element.userId);
  142. });
  143. this.selectedMarker = selectedMarker;
  144. },
  145. markerSelect() {
  146. if (this.selectedIds.length == 0) {
  147. this.$message.error("请选择评卷员!");
  148. } else {
  149. console.log(this.selectedIds);
  150. this.markTasks = {
  151. workId: this.workId,
  152. userIds: this.selectedIds,
  153. examId: this.examId,
  154. courseCode: this.courseCode
  155. };
  156. this.loading = true;
  157. this.$http.post(DATA_PROCESS_API + "/markTasks", this.markTasks).then(
  158. () => {
  159. this.$notify({
  160. message: "快速设置成功",
  161. type: "success"
  162. });
  163. this.loading = false;
  164. this.initMarker();
  165. this.searchSelectedMarker();
  166. },
  167. () => {
  168. this.$notify({
  169. message: "快速设置失败",
  170. type: "error"
  171. });
  172. this.loading = false;
  173. this.initMarker();
  174. this.searchSelectedMarker();
  175. }
  176. );
  177. }
  178. },
  179. filterMarker() {
  180. var tempData = this.markerData.filter(element => {
  181. if (this.markerSearch.name) {
  182. return element.name.includes(this.markerSearch.name);
  183. } else {
  184. return true;
  185. }
  186. });
  187. this.markerData = tempData;
  188. this.totalMarker = tempData.length;
  189. },
  190. handleMarkerCurrentChange(val) {
  191. this.curMarker = val;
  192. this.searchMarker();
  193. },
  194. handleSizeChange(val) {
  195. this.pageSize = val;
  196. this.searchMarker();
  197. },
  198. pagingMarker() {
  199. var start = (this.curMarker - 1) * this.pageSize;
  200. var end =
  201. this.curMarker * this.pageSize < this.totalMarker
  202. ? this.curMarker * this.pageSize
  203. : this.totalMarker;
  204. var tempData = [];
  205. console.log(`当前页: ${this.curMarker},开始:${start},结束:${end}`);
  206. for (let i = start; i < end; i++) {
  207. tempData.push(this.markerData[i]);
  208. }
  209. console.log(tempData);
  210. this.markerData = tempData;
  211. },
  212. searchMarker() {
  213. this.loading = true;
  214. this.markerData = this.oldData;
  215. this.filterMarker();
  216. this.pagingMarker();
  217. this.loading = false;
  218. },
  219. initMarker() {
  220. this.loading = true;
  221. this.$http
  222. .get(
  223. DATA_PROCESS_API +
  224. "/markUsers?workId=" +
  225. this.workId +
  226. "&courseCode=" +
  227. this.courseCode
  228. )
  229. .then(response => {
  230. this.markerData = response.data;
  231. this.oldData = this.markerData.slice(0);
  232. this.totalMarker = response.data.length;
  233. this.searchMarker();
  234. this.loading = false;
  235. });
  236. },
  237. checkMarked() {
  238. var self = this;
  239. self.loading = true;
  240. self.$http
  241. .get(MARKING_API + "/markWorks/" + self.workId)
  242. .then(response => {
  243. self.loading = false;
  244. if (response.markedStudentPaper > 0) {
  245. self.marked = true;
  246. self.progress = response.progress;
  247. }
  248. })
  249. .catch(error => {
  250. this.$notify({
  251. message: error.message,
  252. type: "error"
  253. });
  254. });
  255. },
  256. searchSelectedMarker() {
  257. this.loading = true;
  258. this.$http
  259. .get(
  260. DATA_PROCESS_API +
  261. "/markUsers/assign?workId=" +
  262. this.workId +
  263. "&courseCode=" +
  264. this.courseCode
  265. )
  266. .then(response => {
  267. this.selectedMarker = response.data;
  268. this.oldSelectedMarker = this.selectedMarker.slice(0);
  269. this.loading = false;
  270. });
  271. },
  272. back() {
  273. this.$router.push({
  274. path:
  275. "/marking/mark_setting_main/" +
  276. this.$route.params.workId +
  277. "/" +
  278. this.$route.params.examId +
  279. "/" +
  280. this.$route.params.name
  281. });
  282. },
  283. isOldSelectedMarker(marker) {
  284. var flag = false;
  285. for (let tempMarker of this.oldSelectedMarker) {
  286. if (tempMarker.userId == marker.userId) {
  287. flag = true;
  288. break;
  289. }
  290. }
  291. return flag;
  292. },
  293. tagClose(tag) {
  294. this.checkMarked();
  295. if (this.marked && this.isOldSelectedMarker(tag)) {
  296. this.$notify({
  297. message: "评卷工作已开始,不能删除该评卷员!",
  298. type: "error"
  299. });
  300. return;
  301. }
  302. for (let [index, marker] of this.selectedMarker.entries()) {
  303. if (tag.userId == marker.userId) {
  304. this.selectedMarker.splice(index, 1);
  305. this.markerData.push(tag);
  306. this.oldData.push(tag);
  307. break;
  308. }
  309. }
  310. },
  311. removeMarkerData(userId) {
  312. for (let [index, marker] of this.markerData.entries()) {
  313. if (userId == marker.userId) {
  314. this.markerData.splice(index, 1);
  315. break;
  316. }
  317. }
  318. for (let [index, marker] of this.oldData.entries()) {
  319. if (userId == marker.userId) {
  320. this.oldData.splice(index, 1);
  321. break;
  322. }
  323. }
  324. }
  325. },
  326. computed: {
  327. ...mapState({ user: state => state.user }),
  328. selectedIds() {
  329. var selectedIds = [];
  330. for (let marker of this.selectedMarker) {
  331. selectedIds.push(marker.userId);
  332. }
  333. return selectedIds;
  334. }
  335. },
  336. created() {
  337. this.workId = this.$route.params.workId;
  338. this.examId = this.$route.params.examId;
  339. this.examName = this.$route.params.name;
  340. this.courseCode = this.$route.params.courseCode;
  341. this.initMarker();
  342. this.searchSelectedMarker();
  343. //校验评卷工作是否开始,如果开始则不能删除评卷员
  344. this.checkMarked();
  345. }
  346. };
  347. </script>
  348. <style lang="css" scoped>
  349. li {
  350. list-style-type: none;
  351. }
  352. .searchFrame {
  353. margin-right: 10px;
  354. margin-bottom: 10px;
  355. }
  356. .page {
  357. margin-top: 10px;
  358. }
  359. .el-tag {
  360. margin-right: 10px;
  361. }
  362. .table-native {
  363. width: 700px;
  364. }
  365. </style>