ExtractPaperRule.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. <template>
  2. <div>
  3. <section class="content">
  4. <div class="box box-info">
  5. <!-- 头信息 -->
  6. <div class="box-header with-border">
  7. <h3 class="box-title">调卷规则</h3>
  8. </div>
  9. <!-- 正文信息 -->
  10. <div class="box-body" v-loading.body="loading">
  11. <el-form :inline="true" :model="formSearch">
  12. <el-row>
  13. <el-form-item label="考试名称">
  14. <el-select
  15. filterable
  16. clearable
  17. v-model="formSearch.examId"
  18. @change="getExamCourses"
  19. placeholder="请选择"
  20. :remote-method="getExams"
  21. remote
  22. >
  23. <el-option
  24. v-for="item in examList"
  25. :key="item.id"
  26. :label="item.name"
  27. :value="item.id"
  28. >
  29. </el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="课程名称">
  33. <el-select
  34. filterable
  35. clearable
  36. v-model="formSearch.courseNo"
  37. placeholder="请选择"
  38. :remote-method="getCourses"
  39. remote
  40. >
  41. <el-option
  42. v-for="item in courseInfoSelect"
  43. :label="item.courseInfo"
  44. :value="item.courseNo"
  45. :key="item.courseNo"
  46. >
  47. </el-option>
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item class="pull-right buttonframe">
  51. <el-button
  52. size="small"
  53. type="primary"
  54. icon="search"
  55. @click="searchRulePaper"
  56. >查询</el-button
  57. >
  58. <el-button
  59. size="small"
  60. type="primary"
  61. icon="plus"
  62. @click="markRules"
  63. >新增</el-button
  64. >
  65. <el-button
  66. size="small"
  67. type="primary"
  68. icon="upload2"
  69. @click="openBatchExportPaperDialog"
  70. >批量导出
  71. </el-button>
  72. </el-form-item>
  73. </el-row>
  74. </el-form>
  75. <!-- 页面列表 -->
  76. <el-table
  77. :data="tableData"
  78. border
  79. style="width: 100%;text-align:center;"
  80. >
  81. <el-table-column prop="examName" label="考试名称">
  82. </el-table-column>
  83. <el-table-column label="考试类型">
  84. <template slot-scope="scope">
  85. <div class="el_table_inner_left">
  86. <span v-show="scope.row.examType == 'ONLINE'">在线考试</span>
  87. <span v-show="scope.row.examType == 'TRADITION'"
  88. >传统考试</span
  89. >
  90. <span v-show="scope.row.examType == 'PRACTICE'"
  91. >练习考试</span
  92. >
  93. <span v-show="scope.row.examType == 'OFFLINE'">离线考试</span>
  94. <span v-show="scope.row.examType == 'PRINT_EXAM'"
  95. >分布式印刷考试</span
  96. >
  97. </div>
  98. </template>
  99. </el-table-column>
  100. <el-table-column prop="courseName" label="课程名称">
  101. </el-table-column>
  102. <el-table-column prop="courseCode" label="课程代码">
  103. </el-table-column>
  104. <el-table-column label="调卷类型">
  105. <template slot-scope="scope">
  106. <div class="el_table_inner_left">
  107. <span v-show="scope.row.callType == 'WHOLE_SET'"
  108. >成套调用</span
  109. >
  110. <span v-show="scope.row.callType == 'RESTRUCT'"
  111. >重组调用</span
  112. >
  113. </div>
  114. </template>
  115. </el-table-column>
  116. <el-table-column label="调卷规则">
  117. <template slot-scope="scope">
  118. <div class="el_table_inner_left">
  119. <span v-show="scope.row.id">
  120. <el-tag type="success">已制定</el-tag>
  121. </span>
  122. </div>
  123. </template>
  124. </el-table-column>
  125. <el-table-column label="操作">
  126. <template slot-scope="scope">
  127. <div>
  128. <el-button
  129. v-if="scope.row.ifFinish == 1"
  130. size="small"
  131. type="primary"
  132. @click="openSingleExportPaperDialog(scope.row);"
  133. >
  134. 导出
  135. </el-button>
  136. <el-button
  137. v-if="scope.row.id"
  138. size="small"
  139. type="warning"
  140. @click="updateRules(scope.row);"
  141. >
  142. 修改
  143. </el-button>
  144. </div>
  145. </template>
  146. </el-table-column>
  147. </el-table>
  148. <div class="page pull-right">
  149. <el-pagination
  150. @current-change="handleCurrentChange"
  151. :current-page="currentPage"
  152. :page-size="pageSize"
  153. layout="total, prev, pager, next, jumper"
  154. :total="total"
  155. >
  156. </el-pagination>
  157. </div>
  158. </div>
  159. </div>
  160. <el-dialog title="导出" :visible.sync="exportDialog">
  161. <el-form :model="exportModel" label-position="right" label-width="80px">
  162. <el-row>
  163. <el-col :md="24">
  164. <el-form-item label="考试名称">
  165. <el-select
  166. v-model="exportModel.examId"
  167. filterable
  168. clearable
  169. :disabled="
  170. exportDialog.exportWay == 'SINGLE' &&
  171. exportModel.courseCode != ''
  172. "
  173. @change="checkPaperStructure"
  174. >
  175. <el-option
  176. v-for="item in examList"
  177. :key="item.id"
  178. :label="item.name"
  179. :value="item.id"
  180. >
  181. </el-option>
  182. </el-select>
  183. </el-form-item>
  184. </el-col>
  185. </el-row>
  186. <el-row v-show="exportModel.courseId">
  187. <el-col :md="24">
  188. <el-form-item label="课程名称">
  189. <el-input v-model="exportModel.courseName" disabled></el-input>
  190. </el-form-item>
  191. </el-col>
  192. </el-row>
  193. <el-row>
  194. <el-col :md="24">
  195. <el-form-item
  196. label="导出内容"
  197. v-if="exportModel.examType != 'PRINT_EXAM'"
  198. >
  199. <el-checkbox-group
  200. v-model="exportModel.exportContentList"
  201. v-if="exportModel.exportType == 'NORMAL'"
  202. >
  203. <el-checkbox label="PAPER" :disabled="paperDisabled"
  204. >试卷</el-checkbox
  205. >
  206. <el-checkbox label="ANSWER" :disabled="answerDisabled"
  207. >答案</el-checkbox
  208. >
  209. <el-checkbox
  210. label="PAPER_STRUCTURE_OBJECTIVE,PAPER_STRUCTURE_SUBJECTIVE"
  211. :disabled="structureDisabled"
  212. >试卷结构
  213. </el-checkbox>
  214. </el-checkbox-group>
  215. <el-checkbox-group
  216. v-model="exportModel.exportContentList"
  217. v-if="exportModel.exportType == 'ONLINE'"
  218. >
  219. <el-checkbox
  220. label="COMPUTERTEST_PACKAGE"
  221. :disabled="onlineDisabled"
  222. >机考数据包
  223. </el-checkbox>
  224. </el-checkbox-group>
  225. </el-form-item>
  226. <el-form-item
  227. label="导出内容"
  228. v-if="exportModel.examType == 'PRINT_EXAM'"
  229. >
  230. <el-checkbox-group v-model="exportModel.exportContentList">
  231. <el-checkbox label="PAPER" :disabled="paperDisabled"
  232. >试卷</el-checkbox
  233. >
  234. <el-checkbox label="ANSWER" :disabled="answerDisabled"
  235. >答案</el-checkbox
  236. >
  237. <el-checkbox
  238. v-if="isShowPrintExamPackage"
  239. label="PRINT_EXAM_PACKAGE"
  240. >分布式印刷数据包
  241. </el-checkbox>
  242. <el-input
  243. v-if="isShowPrintExamPackagePassword"
  244. v-model="printExamPackagePassword"
  245. placeholder="加密密码 (可选)"
  246. type="password"
  247. style="width: 150px"
  248. ></el-input>
  249. </el-checkbox-group>
  250. </el-form-item>
  251. </el-col>
  252. </el-row>
  253. <el-row>
  254. <el-col :md="24" class="text-center">
  255. <el-button type="primary" @click="exportPaperInfo"
  256. >开始导出</el-button
  257. >
  258. </el-col>
  259. </el-row>
  260. </el-form>
  261. </el-dialog>
  262. </section>
  263. </div>
  264. </template>
  265. <script>
  266. import {
  267. CORE_API,
  268. EXAM_WORK_API,
  269. LEVEL_TYPE,
  270. Q_API
  271. } from "../constants/constants";
  272. import { mapState } from "vuex";
  273. import _ from "lodash";
  274. export default {
  275. data() {
  276. return {
  277. isClear: 0,
  278. formSearch: {
  279. examId: "",
  280. courseNo: ""
  281. },
  282. tableData: [],
  283. currentPage: 1,
  284. levelList: LEVEL_TYPE,
  285. pageSize: 10,
  286. total: 0,
  287. examList: [], //考试list
  288. courseList: [], //课程list
  289. loading: false,
  290. paperModels: "",
  291. exportDialog: false,
  292. exportModel: {
  293. examType: "",
  294. examId: "",
  295. courseId: "",
  296. courseName: "",
  297. exportWay: "",
  298. exportType: "NORMAL",
  299. exportContentList: []
  300. },
  301. paperDisabled: true,
  302. answerDisabled: true,
  303. structureDisabled: true,
  304. onlineDisabled: true,
  305. courseAllList: [],
  306. isShowPrintExamPackage: false,
  307. isShowPrintExamPackagePassword: false,
  308. printExamPackagePassword: ""
  309. };
  310. },
  311. methods: {
  312. //初始化
  313. initialize(examId) {
  314. this.examList = [];
  315. //查询所有考试
  316. this.$http.get(EXAM_WORK_API + "/exam/" + examId).then(response => {
  317. this.examList.push(response.data);
  318. this.formSearch.examId = parseInt(examId);
  319. this.searchRulePaper();
  320. });
  321. },
  322. //查询列表
  323. searchRulePaper() {
  324. if (!this.formSearch.examId) {
  325. this.$notify({
  326. message: "请选择考试",
  327. type: "info"
  328. });
  329. return false;
  330. }
  331. this.loading = true;
  332. let currentPage = this.currentPage;
  333. this.$http
  334. .get(
  335. Q_API +
  336. "/findPageExtractConfig/" +
  337. currentPage +
  338. "/" +
  339. this.pageSize +
  340. "?examId=" +
  341. this.formSearch.examId +
  342. "&courseNo=" +
  343. this.formSearch.courseNo
  344. )
  345. .then(response => {
  346. this.tableData = response.data.content;
  347. this.total = response.data.totalElements;
  348. this.loading = false;
  349. })
  350. .catch(error => {
  351. this.loading = false;
  352. this.$notify({
  353. message: error.body.desc,
  354. type: "error"
  355. });
  356. this.tableData = [];
  357. this.total = 0;
  358. });
  359. },
  360. //分页
  361. handleCurrentChange(val) {
  362. this.currentPage = val;
  363. this.searchRulePaper();
  364. },
  365. //制定调卷规则
  366. markRules() {
  367. this.$router.push({
  368. name: "extract_paper_info_add"
  369. });
  370. },
  371. //修改调卷规则
  372. updateRules(row) {
  373. sessionStorage.setItem("extract_paper_examId", row.examId);
  374. sessionStorage.setItem("extract_paper_courseNo", row.courseCode);
  375. sessionStorage.setItem("extract_paper_currentPage", this.currentPage);
  376. this.$router.push({
  377. name: "extract_paper_info_edit",
  378. params: { extractConfigId: row.id }
  379. });
  380. },
  381. openSingleExportPaperDialog(row) {
  382. this.exportModel = {
  383. examType: row.examType,
  384. examId: row.examId,
  385. examName: row.examName,
  386. courseId: row.courseCode,
  387. courseName: row.courseName,
  388. exportType: "NORMAL",
  389. exportWay: "SINGLE",
  390. exportContentList: []
  391. };
  392. this.checkPaperStructure();
  393. this.exportDialog = true;
  394. /* 分布式印刷数据包设置 */
  395. //this.exportModel.examType = 'PRINT_EXAM';//todo
  396. this.isShowPrintExamPackage = true;
  397. this.isShowPrintExamPackagePassword = false;
  398. this.printExamPackagePassword = "";
  399. },
  400. openBatchExportPaperDialog() {
  401. this.exportModel = {
  402. examType: "",
  403. examId: "",
  404. examName: "",
  405. courseId: "",
  406. courseName: "",
  407. exportType: "NORMAL",
  408. exportWay: "BATCH",
  409. exportContentList: []
  410. };
  411. this.resetDisabled();
  412. this.exportDialog = true;
  413. /* 分布式印刷数据包设置 */
  414. this.isShowPrintExamPackage = false;
  415. this.isShowPrintExamPackagePassword = false;
  416. this.printExamPackagePassword = "";
  417. },
  418. checkPaperStructure() {
  419. if (!this.exportModel.examId) {
  420. return false;
  421. }
  422. this.exportModel.exportContentList = [];
  423. let examFile = {
  424. examId: this.exportModel.examId,
  425. courseId: this.exportModel.courseId ? this.exportModel.courseId : null
  426. };
  427. this.resetDisabled();
  428. this.$http.post(Q_API + "/findExamFile", examFile).then(response => {
  429. let examFiles = response.data;
  430. if (examFiles != null && examFiles.length > 0) {
  431. this.paperDisabled = this.isDisabled(examFiles, "PAPER");
  432. this.answerDisabled = this.isDisabled(examFiles, "ANSWER");
  433. this.onlineDisabled = this.isDisabled(
  434. examFiles,
  435. "COMPUTERTEST_PACKAGE"
  436. );
  437. this.$http
  438. .get(Q_API + "/findExportStructure/" + this.exportModel.examId)
  439. .then(response => {
  440. this.exportModel.exportType = response.data
  441. ? response.data.exportType
  442. : "NORMAL";
  443. this.structureDisabled = !response.data;
  444. if (this.exportModel.exportWay == "SINGLE") {
  445. this.structureDisabled = this.isDisabled(
  446. examFiles,
  447. "PAPER_STRUCTURE_OBJECTIVE"
  448. );
  449. }
  450. });
  451. } else {
  452. this.resetDisabled();
  453. }
  454. });
  455. },
  456. isDisabled(examFiles, fileType) {
  457. return (
  458. _.filter(examFiles, function(examFile) {
  459. return examFile.examFileType == fileType;
  460. }).length == 0
  461. );
  462. },
  463. resetDisabled() {
  464. this.paperDisabled = true;
  465. this.answerDisabled = true;
  466. this.structureDisabled = true;
  467. this.onlineDisabled = true;
  468. },
  469. exportPaperInfo() {
  470. let examId = this.exportModel.examId;
  471. let courseId = this.exportModel.courseId;
  472. let exportWay = this.exportModel.exportWay;
  473. if (!examId) {
  474. this.$notify({
  475. message: "请选择考试",
  476. type: "error"
  477. });
  478. return false;
  479. }
  480. if (this.exportModel.exportContentList.length == 0) {
  481. this.$notify({
  482. message: "请选择导出内容",
  483. type: "error"
  484. });
  485. return false;
  486. }
  487. if (this.printExamPackagePassword.length > 0) {
  488. var reg = /^[0-9A-Za-z]{6,12}$/;
  489. if (!reg.test(this.printExamPackagePassword)) {
  490. this.$notify({
  491. message: "加密密码请输入6至12位的数字或字母!",
  492. type: "error"
  493. });
  494. return false;
  495. }
  496. }
  497. let exportContentList = this.exportModel.exportContentList.toString();
  498. var key = this.user.key;
  499. var token = this.user.token;
  500. this.$http
  501. .get(
  502. Q_API +
  503. "/exportBatchExamPaperInfoCheck/" +
  504. exportWay +
  505. "/" +
  506. examId +
  507. "?$key=" +
  508. key +
  509. "&$token=" +
  510. token
  511. )
  512. .then(
  513. response => {
  514. console.log(response);
  515. if (response.data) {
  516. this.$notify({
  517. message: response.data.desc,
  518. type: "error"
  519. });
  520. } else {
  521. var key = this.user.key;
  522. var token = this.user.token;
  523. if (exportWay == "SINGLE") {
  524. window.location.href =
  525. Q_API +
  526. "/exportSingleExamPaperInfo/" +
  527. this.user.rootOrgName +
  528. "/" +
  529. exportWay +
  530. "/" +
  531. examId +
  532. "/" +
  533. courseId +
  534. "/" +
  535. exportContentList +
  536. "/" +
  537. this.user.displayName +
  538. "?psw=" +
  539. this.printExamPackagePassword +
  540. "&$key=" +
  541. key +
  542. "&$token=" +
  543. token;
  544. } else if (exportWay == "BATCH") {
  545. window.location.href =
  546. Q_API +
  547. "/exportBatchExamPaperInfo/" +
  548. this.user.rootOrgName +
  549. "/" +
  550. exportWay +
  551. "/" +
  552. examId +
  553. "/" +
  554. exportContentList +
  555. "/" +
  556. this.user.displayName +
  557. "?$key=" +
  558. key +
  559. "&$token=" +
  560. token;
  561. }
  562. }
  563. },
  564. error => {
  565. console.log("aaa");
  566. this.$notify({
  567. message: error.body.desc,
  568. type: "error"
  569. });
  570. }
  571. );
  572. },
  573. removeItem() {
  574. sessionStorage.removeItem("extract_paper_currentPage");
  575. sessionStorage.removeItem("extract_paper_examId");
  576. sessionStorage.removeItem("extract_paper_courseNo");
  577. },
  578. //查询所有课程
  579. getCourses(query) {
  580. query = query.trim();
  581. if (query) {
  582. if (!(query.indexOf("(") > -1 && query.indexOf(")") > -1)) {
  583. this.courseLoading = true;
  584. this.$http
  585. .get(CORE_API + "/course/query?name=" + query + "&enable=true")
  586. .then(response => {
  587. this.courseList = response.data;
  588. this.courseLoading = false;
  589. });
  590. }
  591. } else {
  592. this.courseList = [];
  593. }
  594. },
  595. //查询考试
  596. getExams(query) {
  597. query = query.trim();
  598. this.$http
  599. .get(
  600. EXAM_WORK_API + "/exam/queryByNameLike?name=" + query + "&enable=true"
  601. )
  602. .then(response => {
  603. this.examList = response.data;
  604. });
  605. },
  606. //清空课程列表
  607. getExamCourses() {
  608. console.log("clean");
  609. this.formSearch.courseNo = "";
  610. }
  611. },
  612. computed: {
  613. ...mapState({ user: state => state.user }),
  614. courseInfoSelect() {
  615. var courseList = [];
  616. for (let course of this.courseList) {
  617. var courseInfo = course.name + "(" + course.code + ")";
  618. courseList.push({
  619. courseNo: course.code,
  620. courseName: course.name,
  621. courseInfo: courseInfo
  622. });
  623. }
  624. return courseList;
  625. }
  626. },
  627. created() {
  628. this.isClear = this.$route.params.isClear;
  629. if (this.isClear == 0 || !this.isClear) {
  630. this.removeItem();
  631. //查询所有考试
  632. this.getExams("");
  633. } else {
  634. this.formSearch.courseNo =
  635. sessionStorage.getItem("extract_paper_courseNo") == "null"
  636. ? ""
  637. : sessionStorage.getItem("extract_paper_courseNo");
  638. this.formSearch.examId = parseInt(
  639. sessionStorage.getItem("extract_paper_examId")
  640. );
  641. this.currentPage =
  642. sessionStorage.getItem("extract_paper_currentPage") == null
  643. ? 1
  644. : parseInt(sessionStorage.getItem("extract_paper_currentPage"));
  645. this.initialize(this.formSearch.examId);
  646. }
  647. }
  648. };
  649. </script>