mark_setting_fast.vue 10.0 KB

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