SynthesisPaper.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <template>
  2. <div
  3. v-loading="fullscreenLoading"
  4. class="synthesis-paper gen-paper-detail"
  5. element-loading-text="正在组卷中..."
  6. >
  7. <div class="part-box">
  8. <div class="part-box-header">
  9. <h1 class="part-box-title">综合组卷</h1>
  10. <div>
  11. <el-button
  12. type="primary"
  13. icon="icon icon-save-white"
  14. :loading="fullscreenLoading"
  15. @click="confirmGenPaper"
  16. >确定</el-button
  17. >
  18. <el-button type="danger" plain icon="icon icon-back" @click="goback"
  19. >返回</el-button
  20. >
  21. </div>
  22. </div>
  23. <el-form
  24. ref="modalFormComp"
  25. class="part-filter-form"
  26. :model="modalForm"
  27. :rules="rules"
  28. inline
  29. >
  30. <el-form-item prop="courseName" label="业务课名称" style="width: 300px">
  31. <el-input
  32. v-model="modalForm.courseName"
  33. placeholder="业务课名称"
  34. ></el-input>
  35. </el-form-item>
  36. <el-form-item prop="courseCode" label="业务课代码" style="width: 300px">
  37. <el-input
  38. v-model="modalForm.courseCode"
  39. placeholder="业务课代码"
  40. ></el-input>
  41. </el-form-item>
  42. <el-form-item prop="name" label="试卷名称" style="width: 300px">
  43. <el-input v-model="modalForm.name" placeholder="试卷名称"></el-input>
  44. </el-form-item>
  45. <span class="tips-info margin-left-10"
  46. >会作为试卷标题展示在试卷卷头部分</span
  47. >
  48. <br />
  49. <el-form-item label="组卷模式">
  50. <el-radio-group v-model="modalForm.genModelType">
  51. <el-radio label="A-Type">自动组卷</el-radio>
  52. <!-- <el-radio label="M-Type">手动组卷</el-radio> -->
  53. </el-radio-group>
  54. </el-form-item>
  55. </el-form>
  56. </div>
  57. <!-- 试题来源 -->
  58. <div class="part-box">
  59. <div class="gen-step-title">
  60. <h3>题源选择</h3>
  61. </div>
  62. <div class="gen-step-body">
  63. <el-form class="part-filter-form" :inline="true">
  64. <el-form-item label="课程" style="width: 280px">
  65. <el-select
  66. v-model="filter.courseId"
  67. :remote-method="getCoursesList"
  68. :loading="courseLoading"
  69. remote
  70. filterable
  71. clearable
  72. multiple
  73. placeholder="请选择"
  74. @clear="getCoursesList('')"
  75. >
  76. <el-option
  77. v-for="item in courseList"
  78. :key="item.id"
  79. :label="item.name + ' - ' + item.code"
  80. :value="item.id"
  81. ></el-option>
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item label="题源选择">
  85. <el-select v-model="filter.paperType" placeholder="题源选择">
  86. <!-- <el-option label="题库来源" value="IMPORT"></el-option> -->
  87. <el-option label="卷库来源" value="GENERATE"></el-option>
  88. </el-select>
  89. </el-form-item>
  90. <el-form-item label="创建时间" style="width: 460px">
  91. <el-date-picker
  92. v-model="createTime"
  93. type="datetimerange"
  94. :picker-options="pickerOptions"
  95. range-separator="-"
  96. start-placeholder="创建开始时间"
  97. end-placeholder="创建结束时间"
  98. value-format="timestamp"
  99. align="right"
  100. unlink-panels
  101. >
  102. </el-date-picker>
  103. </el-form-item>
  104. <el-form-item>
  105. <el-button type="primary" :loading="loading" @click="toPage(1)"
  106. >查询</el-button
  107. >
  108. </el-form-item>
  109. </el-form>
  110. <el-table v-loading="loading" class="part-box-border" :data="paperList">
  111. <el-table-column width="50" align="center">
  112. <template slot-scope="scope">
  113. <el-checkbox
  114. v-model="scope.row.selected"
  115. @change="paperSelectChange(scope.row)"
  116. ></el-checkbox>
  117. </template>
  118. </el-table-column>
  119. <el-table-column prop="courseName" label="课程名称">
  120. </el-table-column>
  121. <el-table-column prop="courseCode" label="课程代码">
  122. </el-table-column>
  123. <el-table-column prop="paperName" label="试卷名称"> </el-table-column>
  124. <el-table-column prop="totalScore" label="总分" width="100">
  125. </el-table-column>
  126. <el-table-column prop="unitCount" label="小题数量" width="200">
  127. </el-table-column>
  128. </el-table>
  129. <div class="part-page">
  130. <el-pagination
  131. :current-page="current"
  132. :page-size="size"
  133. :page-sizes="[10, 20, 50, 100, 200, 300]"
  134. layout="total, sizes, prev, pager, next, jumper"
  135. :total="total"
  136. @current-change="toPage"
  137. @size-change="pageSizeChange"
  138. >
  139. </el-pagination>
  140. </div>
  141. </div>
  142. </div>
  143. <!-- 已选试卷 -->
  144. <div class="part-box">
  145. <div class="gen-step-title">
  146. <h3>选中试卷列表</h3>
  147. </div>
  148. <div class="gen-step-body">
  149. <el-table class="part-box-border" :data="selectPapers">
  150. <el-table-column prop="courseName" label="课程名称">
  151. </el-table-column>
  152. <el-table-column prop="courseCode" label="课程代码">
  153. </el-table-column>
  154. <el-table-column prop="aliasName" label="试卷名称">
  155. <template slot-scope="scope">
  156. <el-input
  157. v-model="scope.row.aliasName"
  158. placeholder="请输入试卷名称"
  159. ></el-input>
  160. </template>
  161. </el-table-column>
  162. <el-table-column label="操作" width="220">
  163. <template slot-scope="scope">
  164. <el-button
  165. size="mini"
  166. type="danger"
  167. plain
  168. @click="toRemovePaper(scope.row)"
  169. >移除</el-button
  170. >
  171. <el-button
  172. v-if="scope.$index"
  173. size="mini"
  174. type="primary"
  175. plain
  176. @click="toMoveupPaper(scope.row)"
  177. >上移</el-button
  178. >
  179. <el-button
  180. v-if="scope.$index !== dataListLastInd"
  181. size="mini"
  182. type="primary"
  183. plain
  184. @click="toMovedownPaper(scope.row)"
  185. >下移</el-button
  186. >
  187. </template>
  188. </el-table-column>
  189. </el-table>
  190. </div>
  191. </div>
  192. </div>
  193. </template>
  194. <script>
  195. import {
  196. paperPageListApi,
  197. courseQueryApi,
  198. synthesisBuildPaperApi,
  199. } from "../api";
  200. import pickerOptions from "@/constants/datePickerOptions";
  201. export default {
  202. data() {
  203. return {
  204. modalForm: {
  205. courseName: "",
  206. courseCode: "",
  207. name: "",
  208. genModelType: "A-Type",
  209. },
  210. rules: {
  211. courseName: [
  212. {
  213. required: true,
  214. message: "请输入业务课名称",
  215. trigger: "change",
  216. },
  217. {
  218. max: 100,
  219. message: "业务课名称不可超过100字符",
  220. },
  221. ],
  222. courseCode: [
  223. {
  224. required: true,
  225. message: "请输入业务课代码",
  226. trigger: "change",
  227. },
  228. {
  229. max: 100,
  230. message: "业务课代码不可超过100字符",
  231. },
  232. ],
  233. name: [
  234. {
  235. required: true,
  236. message: "请输入试卷名称",
  237. trigger: "change",
  238. },
  239. {
  240. max: 100,
  241. message: "试卷名称不可超过100字符",
  242. },
  243. ],
  244. },
  245. filter: {
  246. courseId: [],
  247. paperType: "GENERATE",
  248. createStartTime: "",
  249. createEndTime: "",
  250. },
  251. current: 1,
  252. size: 10,
  253. total: 0,
  254. loading: false,
  255. paperList: [],
  256. selectPapers: [],
  257. courseList: [],
  258. courseLoading: false,
  259. fullscreenLoading: false,
  260. // date-picker
  261. createTime: [],
  262. pickerOptions,
  263. };
  264. },
  265. computed: {
  266. dataListLastInd() {
  267. return this.selectPapers.length - 1;
  268. },
  269. },
  270. mounted() {
  271. this.getCoursesList();
  272. },
  273. methods: {
  274. async getCoursesList(query) {
  275. this.courseLoading = true;
  276. query = query && query.trim();
  277. const res = await courseQueryApi(query, "true");
  278. this.courseList = res.data || [];
  279. this.courseLoading = false;
  280. },
  281. async getList() {
  282. const datas = {
  283. ...this.filter,
  284. pageNumber: this.current,
  285. pageSize: this.size,
  286. };
  287. datas.courseId = datas.courseId.join();
  288. if (this.createTime && this.createTime.length) {
  289. datas.createStartTime = this.createTime[0];
  290. datas.createEndTime = this.createTime[1];
  291. }
  292. const res = await paperPageListApi(datas);
  293. const selectedPaperIds = this.selectPapers.map((item) => item.id);
  294. this.paperList = res.data.content.map((item) => {
  295. let nitem = {
  296. ...item,
  297. id: item.paperId,
  298. selected: selectedPaperIds.includes(item.id),
  299. };
  300. return nitem;
  301. });
  302. this.total = res.data.totalElements;
  303. },
  304. toPage(page) {
  305. this.current = page;
  306. this.getList();
  307. },
  308. pageSizeChange(size) {
  309. this.size = size;
  310. this.toPage(1);
  311. },
  312. paperSelectChange(row) {
  313. if (row.selected) {
  314. const paper = this.paperList.find((item) => item.id === row.id);
  315. this.selectPapers.push({ ...paper, aliasName: paper.paperName });
  316. } else {
  317. this.toRemovePaper(row);
  318. }
  319. },
  320. toRemovePaper(row) {
  321. this.selectPapers = this.selectPapers.filter(
  322. (item) => item.id !== row.id
  323. );
  324. },
  325. toMoveupPaper(row) {
  326. const pos = this.selectPapers.findIndex((item) => item.id === row.id);
  327. if (!pos) return;
  328. const curPaper = this.selectPapers.splice(pos, 1)[0];
  329. this.selectPapers.splice(pos - 1, 0, curPaper);
  330. },
  331. toMovedownPaper(row) {
  332. const pos = this.selectPapers.findIndex((item) => item.id === row.id);
  333. if (pos === this.selectPapers.length - 1) return;
  334. const curPaper = this.selectPapers.splice(pos, 1)[0];
  335. this.selectPapers.splice(pos + 1, 0, curPaper);
  336. },
  337. async confirmGenPaper() {
  338. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  339. if (!valid) return;
  340. if (!this.selectPapers.length) {
  341. this.$message.error("请选择试卷");
  342. return;
  343. }
  344. if (this.fullscreenLoading) return;
  345. this.fullscreenLoading = true;
  346. let datas = { ...this.modalForm };
  347. datas.papers = this.selectPapers.map((item) => {
  348. return {
  349. paperId: item.id,
  350. paperName: item.aliasName,
  351. };
  352. });
  353. const res = await synthesisBuildPaperApi(datas).catch(() => {});
  354. this.fullscreenLoading = false;
  355. if (!res) return;
  356. this.$message.success("组卷成功!");
  357. this.goback();
  358. },
  359. },
  360. };
  361. </script>