SelectAnalysisPaper.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <template>
  2. <el-dialog
  3. class="select-analysis-paper page-dialog"
  4. :visible.sync="modalIsShow"
  5. title="选择分析试卷"
  6. top="10px"
  7. width="80%"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @opened="visibleChange"
  12. >
  13. <div class="part-box part-box-filter part-box-flex">
  14. <el-form ref="FilterForm" label-position="left" label-width="55px" inline>
  15. <!-- <el-form-item label="考试:">
  16. <exam-select
  17. v-model="filter.examId"
  18. :semester-id="filter.semesterId"
  19. placeholder="考试"
  20. disabled
  21. @change="examChange"
  22. ></exam-select>
  23. </el-form-item> -->
  24. <el-form-item label="学院:">
  25. <!-- <college-select
  26. v-model="filter.collegeId"
  27. placeholder="学院"
  28. ></college-select> -->
  29. <el-select
  30. v-model="filter.collegeId"
  31. class="college-select"
  32. placeholder="学院"
  33. filterable
  34. clearable
  35. >
  36. <el-option
  37. v-for="item in collegeList"
  38. :key="item.id"
  39. :value="item.id"
  40. :label="item.name"
  41. >
  42. </el-option>
  43. </el-select>
  44. </el-form-item>
  45. <el-form-item label="课程:">
  46. <course-select
  47. v-model="filter.courseId"
  48. placeholder="课程"
  49. :semester-id="filter.semesterId"
  50. :exam-id="filter.examId"
  51. ></course-select>
  52. </el-form-item>
  53. <el-form-item>
  54. <el-input
  55. v-model.trim="filter.teacherName"
  56. placeholder="请输入命题老师姓名"
  57. ></el-input>
  58. </el-form-item>
  59. <el-form-item>
  60. <el-button type="primary" :disabled="!filter.examId" @click="search"
  61. >查询</el-button
  62. >
  63. </el-form-item>
  64. </el-form>
  65. </div>
  66. <div class="mb-4 tab-btns">
  67. <el-button
  68. v-for="tab in tabs"
  69. :key="tab.val"
  70. size="medium"
  71. :type="curTab == tab.val ? 'primary' : 'default'"
  72. @click="selectMenu(tab.val)"
  73. >{{ tab.name }}
  74. <span v-if="tab.val === 'selected'">({{ selectedPapers.length }})</span>
  75. </el-button>
  76. </div>
  77. <div v-if="curTab === 'query'" class="part-box part-box-pad">
  78. <el-table
  79. ref="TableList"
  80. :data="dataList"
  81. key="query"
  82. @select="handleSelectionChange"
  83. @select-all="handleSelectionChange"
  84. >
  85. <el-table-column
  86. type="selection"
  87. fixed="left"
  88. width="55"
  89. align="center"
  90. ></el-table-column>
  91. <el-table-column
  92. prop="semesterName"
  93. label="学期"
  94. min-width="210"
  95. ></el-table-column>
  96. <el-table-column prop="examName" label="考试" min-width="160">
  97. </el-table-column>
  98. <el-table-column prop="courseCode" label="课程(代码)" min-width="120">
  99. <span slot-scope="scope">
  100. {{ scope.row.courseName }}({{ scope.row.courseCode }})
  101. </span>
  102. </el-table-column>
  103. <el-table-column prop="teachCollegeName" label="开课学院">
  104. </el-table-column>
  105. <el-table-column prop="teacherName" label="命题老师"> </el-table-column>
  106. <el-table-column prop="paperNumber" label="试卷编号"> </el-table-column>
  107. <el-table-column prop="paperType" label="试卷类型" width="80">
  108. </el-table-column>
  109. </el-table>
  110. <div class="part-page">
  111. <el-pagination
  112. background
  113. layout="total, sizes, prev, pager, next, jumper"
  114. :pager-count="5"
  115. :current-page="current"
  116. :total="total"
  117. :page-size="size"
  118. @current-change="toPage"
  119. @size-change="pageSizeChange"
  120. >
  121. </el-pagination>
  122. </div>
  123. </div>
  124. <div v-else class="part-box part-box-pad">
  125. <el-table ref="SelectedTableList" key="select" :data="selectedPapers">
  126. <el-table-column
  127. prop="semesterName"
  128. label="学期"
  129. min-width="210"
  130. ></el-table-column>
  131. <el-table-column prop="examName" label="考试" min-width="160">
  132. </el-table-column>
  133. <el-table-column prop="courseCode" label="课程(代码)" min-width="120">
  134. <span slot-scope="scope">
  135. {{ scope.row.courseName }}({{ scope.row.courseCode }})
  136. </span>
  137. </el-table-column>
  138. <el-table-column prop="teachCollegeName" label="开课学院">
  139. </el-table-column>
  140. <el-table-column prop="teacherName" label="命题老师"> </el-table-column>
  141. <el-table-column prop="paperNumber" label="试卷编号"> </el-table-column>
  142. <el-table-column prop="paperType" label="试卷类型" width="80">
  143. </el-table-column>
  144. <el-table-column
  145. class-name="action-column"
  146. label="操作"
  147. width="80px"
  148. align="center"
  149. >
  150. <template slot-scope="scope">
  151. <el-button
  152. class="btn-danger"
  153. type="text"
  154. @click="toDelete(scope.row)"
  155. >删除</el-button
  156. >
  157. </template>
  158. </el-table-column>
  159. </el-table>
  160. </div>
  161. <div slot="footer">
  162. <el-button type="primary" :loading="isSubmit" @click="submit"
  163. >确认</el-button
  164. >
  165. <el-button type="danger" @click="cancel" plain>取消</el-button>
  166. </div>
  167. </el-dialog>
  168. </template>
  169. <script>
  170. import { teachCollegeList } from "../../base/api";
  171. import { analysisPaperList, addAnalysisBatchPaper } from "../api";
  172. const initFilter = {
  173. batchId: "",
  174. semesterId: "",
  175. examId: "",
  176. collegeId: "",
  177. courseId: "",
  178. teacherName: "",
  179. };
  180. export default {
  181. name: "select-analysis-paper",
  182. props: {
  183. batch: {
  184. type: Object,
  185. default() {
  186. return {};
  187. },
  188. },
  189. },
  190. data() {
  191. return {
  192. modalIsShow: false,
  193. filter: {
  194. ...initFilter,
  195. },
  196. current: 1,
  197. size: this.GLOBAL.pageSize,
  198. total: 0,
  199. curTab: "query",
  200. tabs: [
  201. {
  202. name: "列表",
  203. val: "query",
  204. },
  205. {
  206. name: "已选",
  207. val: "selected",
  208. },
  209. ],
  210. collegeList: [],
  211. searchList: [],
  212. dataList: [],
  213. selectedPapers: [],
  214. selectedPaperIds: [],
  215. isSubmit: false,
  216. };
  217. },
  218. methods: {
  219. visibleChange() {
  220. this.curTab = "query";
  221. this.selectedPapers = [];
  222. this.selectedPaperIds = [];
  223. this.filter = Object.assign({}, initFilter, {
  224. batchId: this.batch.id,
  225. semesterId: this.batch.semesterId,
  226. examId: this.batch.examId,
  227. });
  228. this.examChange();
  229. this.$nextTick(() => this.changeCurListSelect());
  230. },
  231. cancel() {
  232. this.modalIsShow = false;
  233. },
  234. open() {
  235. this.modalIsShow = true;
  236. },
  237. examChange() {
  238. this.filter.collegeId = "";
  239. this.collegeList = [];
  240. this.getCollegeList();
  241. },
  242. async getCollegeList() {
  243. const data = await teachCollegeList(this.filter.examId);
  244. this.collegeList = data || [];
  245. },
  246. async search() {
  247. const datas = {
  248. ...this.filter,
  249. };
  250. const data = await analysisPaperList(datas);
  251. this.searchList = data.map((item) => {
  252. item.id = `${item.paperNumber}-${item.paperType}`;
  253. return item;
  254. });
  255. this.total = data.length;
  256. this.toPage(1);
  257. },
  258. changeCurListSelect() {
  259. this.dataList.forEach((row) => {
  260. if (this.selectedPaperIds.includes(row.id)) {
  261. this.$refs.TableList.toggleRowSelection(row, true);
  262. } else {
  263. this.$refs.TableList.toggleRowSelection(row, false);
  264. }
  265. });
  266. },
  267. getList() {
  268. this.dataList = this.searchList
  269. .slice((this.current - 1) * this.size, this.current * this.size)
  270. .map((item) => {
  271. return { ...item };
  272. });
  273. if (this.curTab === "query") {
  274. this.$nextTick(() => this.changeCurListSelect());
  275. }
  276. },
  277. toPage(page) {
  278. this.current = page;
  279. this.getList();
  280. },
  281. selectMenu(tab) {
  282. this.curTab = tab;
  283. if (this.curTab === "query") {
  284. this.$nextTick(() => this.changeCurListSelect());
  285. }
  286. },
  287. toDelete(row) {
  288. this.selectedPapers = this.selectedPapers.filter(
  289. (item) => item.id !== row.id
  290. );
  291. this.updateSelectedIds();
  292. },
  293. updateSelectedIds() {
  294. this.selectedPaperIds = this.selectedPapers.map((item) => item.id);
  295. },
  296. handleSelectionChange(selection) {
  297. // console.log(selection);
  298. const seletedIds = selection.map((item) => item.id);
  299. this.dataList.forEach((item) => {
  300. const isSelected = seletedIds.includes(item.id);
  301. if (isSelected) {
  302. if (this.selectedPaperIds.includes(item.id)) return;
  303. this.selectedPapers.push({ ...item });
  304. } else {
  305. if (!this.selectedPaperIds.includes(item.id)) return;
  306. const pos = this.selectedPapers.findIndex((p) => p.id === item.id);
  307. this.selectedPapers.splice(pos, 1);
  308. }
  309. });
  310. this.updateSelectedIds();
  311. },
  312. async submit() {
  313. if (!this.selectedPapers.length) {
  314. this.$message.error("请选择试卷");
  315. return;
  316. }
  317. if (this.isSubmit) return;
  318. this.isSubmit = true;
  319. const ableAnalyzePaperList = this.selectedPapers.map((item) => {
  320. return {
  321. teachCollegeName: item.teachCollegeName,
  322. paperName: item.paperName,
  323. teachCollegeId: item.teachCollegeId,
  324. paperType: item.paperType,
  325. paperNumber: item.paperNumber,
  326. };
  327. });
  328. const res = await addAnalysisBatchPaper({
  329. batchId: this.batch.id,
  330. ableAnalyzePaperList,
  331. }).catch(() => {});
  332. this.isSubmit = false;
  333. if (!res) return;
  334. this.$message.success("添加成功!");
  335. this.cancel();
  336. this.$emit("modified");
  337. },
  338. },
  339. };
  340. </script>