InsertPaperStructure.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. <template>
  2. <div>
  3. <section class="content">
  4. <div>
  5. <!-- 头信息 -->
  6. <div><h3 class="box-title">精确结构创建-->创建大题</h3></div>
  7. <!-- 正文信息 -->
  8. <div class="box-body">
  9. <el-form
  10. :inline="true"
  11. :model="paperStruct"
  12. ref="paperStruct"
  13. :rules="rules2"
  14. >
  15. <el-row>
  16. <el-form-item label="精确结构名称" prop="name">
  17. <el-input
  18. v-model="paperStruct.name"
  19. auto-complete="off"
  20. placeholder="试卷结构名称"
  21. ></el-input>
  22. </el-form-item>
  23. <el-form-item label="总分" prop="score">
  24. <el-input
  25. v-model.number="paperStruct.totalScore"
  26. auto-complete="off"
  27. placeholder="请输入总分"
  28. ></el-input>
  29. </el-form-item>
  30. <el-form-item label="制定课程">
  31. <el-select
  32. v-model="paperStruct.courseNo"
  33. filterable
  34. :remote-method="getCourses"
  35. remote
  36. clearable
  37. placeholder="请选择"
  38. >
  39. <el-option label="请选择" value="ALL" key="ALL"></el-option>
  40. <el-option label="公用" value="" key=""></el-option>
  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>
  51. <el-button
  52. size="small"
  53. type="success"
  54. :disabled="button_disabled"
  55. @click="savePaperStruct();"
  56. >
  57. <i class="fa fa-floppy-o"></i>保 存</el-button
  58. >
  59. <el-button
  60. size="small"
  61. type="primary"
  62. icon="plus"
  63. :disabled="button_disabled"
  64. @click="insert();"
  65. >添加大题</el-button
  66. >
  67. <el-button
  68. size="small"
  69. type="primary"
  70. icon="caret-left"
  71. @click="back"
  72. >返 回</el-button
  73. >
  74. </el-form-item>
  75. </el-row>
  76. <el-row>
  77. <el-form-item label="考试说明">
  78. <div style="width:550px;">
  79. <ckeditor v-model="paperStruct.examRemark"></ckeditor>
  80. </div>
  81. </el-form-item>
  82. </el-row>
  83. </el-form>
  84. <!-- 添加大题弹出框 -->
  85. <el-dialog
  86. title="大题信息"
  87. :visible.sync="paperDetailStructDialog"
  88. size="tiny"
  89. >
  90. <el-form
  91. :inline="true"
  92. :model="paperDetailStructForm"
  93. ref="paperDetailStructForm"
  94. :rules="rules"
  95. label-position="right"
  96. label-width="90px"
  97. >
  98. <el-row>
  99. <el-form-item label="大题名称" label-width="120px" prop="name">
  100. <el-input
  101. v-model="paperDetailStructForm.name"
  102. auto-complete="off"
  103. placeholder="请输入题型名称"
  104. ></el-input>
  105. </el-form-item>
  106. </el-row>
  107. <el-row>
  108. <el-form-item
  109. label="题型描述"
  110. label-width="120px"
  111. prop="remark"
  112. >
  113. <el-input
  114. type="textarea"
  115. :rows="2"
  116. v-model="paperDetailStructForm.remark"
  117. auto-complete="off"
  118. placeholder="请输入题型描述"
  119. ></el-input>
  120. </el-form-item>
  121. </el-row>
  122. <el-row>
  123. <span v-if="dialogType == 'ADD'">
  124. <el-button
  125. type="primary"
  126. @click="submitForm('paperDetailStructForm');"
  127. >保 存</el-button
  128. >
  129. </span>
  130. <span v-else>
  131. <el-button
  132. type="primary"
  133. @click="submitEditForm('paperDetailStructForm');"
  134. >保 存</el-button
  135. >
  136. </span>
  137. <el-button type="danger" @click="resetForm();">重 置</el-button>
  138. </el-row>
  139. </el-form>
  140. </el-dialog>
  141. <!-- 页面列表 -->
  142. <el-table :data="paperDetailStructs" border>
  143. <el-table-column label="大题名称">
  144. <template slot-scope="scope">
  145. <div>
  146. <span>{{ scope.row.name }}</span>
  147. </div>
  148. </template>
  149. </el-table-column>
  150. <el-table-column label="小题数">
  151. <template slot-scope="scope">
  152. <div>
  153. <span>{{ scope.row.detailCount }}</span>
  154. </div>
  155. </template>
  156. </el-table-column>
  157. <el-table-column label="大题分数">
  158. <template slot-scope="scope">
  159. <div>
  160. <span>{{ scope.row.totalScore }}</span>
  161. </div>
  162. </template>
  163. </el-table-column>
  164. <el-table-column :context="_self" label="操作">
  165. <template slot-scope="scope">
  166. <div>
  167. <el-button
  168. size="mini"
  169. type="primary"
  170. @click="insertTopicStruct(scope.row);"
  171. >添加小题</el-button
  172. >
  173. <el-button
  174. size="mini"
  175. type="info"
  176. @click="editPaperDetail(scope.row.id);"
  177. >
  178. 编辑
  179. </el-button>
  180. <el-button
  181. size="mini"
  182. type="danger"
  183. @click="deletePaperDetail(scope.row.id);"
  184. >删除</el-button
  185. >
  186. </div>
  187. </template>
  188. </el-table-column>
  189. </el-table>
  190. </div>
  191. </div>
  192. </section>
  193. </div>
  194. </template>
  195. <script>
  196. import { CORE_API, Q_API } from "../constants/constants";
  197. import ckeditor from "../component/ckeditor.vue";
  198. export default {
  199. components: { ckeditor },
  200. data() {
  201. return {
  202. loading: false,
  203. courseList: [],
  204. paperDetailStructForm: {
  205. id: "",
  206. number: "",
  207. name: "",
  208. remark: "",
  209. totalScore: "",
  210. detailCount: "",
  211. unitStructs: []
  212. },
  213. paperStruct: {
  214. name: "",
  215. totalScore: "",
  216. paperDetailStructs: [],
  217. courseNo: "ALL",
  218. type: "EXACT", //试卷结构类型
  219. genPaperType: "COMMON", //组卷类型
  220. examRemark: ""
  221. },
  222. paperDetailStructs: [],
  223. paperDeatilId: "",
  224. rules: {
  225. name: [{ required: true, message: "请输入名称", trigger: "blur" }],
  226. remark: [{ required: true, message: "请输入题型描述", trigger: "blur" }]
  227. },
  228. rules2: {
  229. name: [
  230. { required: true, message: "请输入试卷结构名称", trigger: "blur" }
  231. ]
  232. },
  233. paperStructId: "",
  234. paperDetailStructDialog: false,
  235. dialogType: ""
  236. };
  237. },
  238. methods: {
  239. //查询列表集合
  240. searchForm() {
  241. this.loading = true;
  242. var paperStructStorge = sessionStorage.getItem("paperStruct");
  243. if (typeof paperStructStorge == "string") {
  244. var paperStruct = JSON.parse(paperStructStorge);
  245. console.log(paperStruct);
  246. this.paperStruct = paperStruct;
  247. this.paperDetailStructs = paperStruct.paperDetailStructs;
  248. }
  249. this.loading = false;
  250. },
  251. //保存
  252. savePaperStruct() {
  253. if (this.paperStruct.name.trim().length == 0) {
  254. this.$notify({
  255. message: "结构名称不能为空格",
  256. type: "error"
  257. });
  258. return false;
  259. }
  260. if (!this.checkPaperStruct()) {
  261. return false;
  262. }
  263. if (this.paperStruct.courseNo == "ALL") {
  264. this.$notify({
  265. message: "请选择课程",
  266. type: "error"
  267. });
  268. return false;
  269. }
  270. this.loading = true;
  271. var url = Q_API + "/paperStruct";
  272. console.log(this.paperStructId);
  273. if (this.paperStructId != "add") {
  274. //假如没ID就是新增
  275. this.$http
  276. .put(url, this.paperStruct)
  277. .then(() => {
  278. this.$notify({
  279. message: "保存成功",
  280. type: "success"
  281. });
  282. this.loading = false;
  283. this.removeItem();
  284. this.back();
  285. })
  286. .catch(() => {
  287. this.$notify({
  288. type: "error",
  289. message: "试卷结构名称重复,请重新命名"
  290. });
  291. this.loading = false;
  292. });
  293. } else {
  294. this.$http
  295. .post(url, this.paperStruct)
  296. .then(() => {
  297. this.$notify({
  298. message: "保存成功",
  299. type: "success"
  300. });
  301. this.loading = false;
  302. this.removeItem();
  303. this.back();
  304. })
  305. .catch(() => {
  306. this.loading = false;
  307. this.$notify({
  308. type: "error",
  309. message: "试卷结构名称重复,请重新命名"
  310. });
  311. });
  312. }
  313. },
  314. checkPaperStruct() {
  315. if (
  316. !(
  317. this.paperStruct.paperDetailStructs &&
  318. this.paperStruct.paperDetailStructs.length > 0
  319. )
  320. ) {
  321. this.$notify({
  322. message: "请添加大题",
  323. type: "error"
  324. });
  325. return false;
  326. }
  327. for (let paperDetailStruct of this.paperStruct.paperDetailStructs) {
  328. if (
  329. !(
  330. paperDetailStruct.unitStructs &&
  331. paperDetailStruct.unitStructs.length > 0
  332. )
  333. ) {
  334. this.$notify({
  335. message: "请添加大题下的题型",
  336. type: "error"
  337. });
  338. return false;
  339. }
  340. }
  341. if (this.paperStruct.totalScore != this.totalScore) {
  342. this.$notify({
  343. message: "大题总分与结构满分不一致",
  344. type: "error"
  345. });
  346. return false;
  347. }
  348. return true;
  349. },
  350. //保存大题
  351. submitForm(formData) {
  352. //校验大题名称
  353. if (
  354. !this.paperDetailStructForm.name ||
  355. this.paperDetailStructForm.name.trim().length == 0
  356. ) {
  357. this.$notify({
  358. message: "大题名称不能为空",
  359. type: "error"
  360. });
  361. return;
  362. }
  363. this.loading = true;
  364. this.$refs[formData].validate(valid => {
  365. if (valid) {
  366. var ids = [];
  367. for (let paperDetailStruct of this.paperDetailStructs) {
  368. ids.push(paperDetailStruct.id);
  369. }
  370. ids.sort();
  371. var maxId;
  372. if (ids.length == 0) {
  373. maxId = 1;
  374. } else {
  375. maxId = ids[ids.length - 1];
  376. }
  377. var paperDetailStruct = Object.assign({}, this.paperDetailStructForm);
  378. paperDetailStruct.id = maxId + 1;
  379. paperDetailStruct.number = this.paperDetailStructs.length + 1;
  380. this.paperDetailStructs.push(paperDetailStruct);
  381. this.paperDetailStructDialog = false;
  382. this.paperDetailStructForm = { name: "", remark: "" };
  383. this.paperStruct.paperDetailStructs = this.paperDetailStructs;
  384. sessionStorage.setItem(
  385. "paperStruct",
  386. JSON.stringify(this.paperStruct)
  387. );
  388. } else {
  389. return false;
  390. }
  391. });
  392. this.loading = false;
  393. },
  394. submitEditForm(formData) {
  395. //校验大题名称
  396. if (
  397. !this.paperDetailStructForm.name ||
  398. this.paperDetailStructForm.name.trim().length == 0
  399. ) {
  400. this.$notify({
  401. message: "大题名称不能为空",
  402. type: "error"
  403. });
  404. return;
  405. }
  406. this.loading = true;
  407. this.$refs[formData].validate(valid => {
  408. if (valid) {
  409. var paperDetailStructs = this.paperDetailStructs;
  410. for (let i = paperDetailStructs.length - 1; i >= 0; i--) {
  411. if (paperDetailStructs[i].id == this.paperDeatilId) {
  412. paperDetailStructs[i].remark = this.paperDetailStructForm.remark;
  413. paperDetailStructs[i].name = this.paperDetailStructForm.name;
  414. }
  415. }
  416. this.paperDetailStructDialog = false;
  417. this.paperDetailStructForm = { name: "", remark: "" };
  418. this.paperStruct.paperDetailStructs = paperDetailStructs;
  419. sessionStorage.setItem(
  420. "paperStruct",
  421. JSON.stringify(this.paperStruct)
  422. );
  423. } else {
  424. return false;
  425. }
  426. });
  427. this.loading = false;
  428. },
  429. deletePaperDetail(id) {
  430. var paperDetailStructs = this.paperDetailStructs;
  431. for (let i = paperDetailStructs.length - 1; i >= 0; i--) {
  432. if (paperDetailStructs[i].id == id) {
  433. paperDetailStructs.splice(i, 1);
  434. }
  435. }
  436. this.paperStruct.paperDetailStructs = paperDetailStructs;
  437. sessionStorage.setItem("paperStruct", JSON.stringify(this.paperStruct));
  438. console.log(sessionStorage.getItem("paperStruct"));
  439. },
  440. setPaperStruct() {
  441. var paperStruct = sessionStorage.getItem("paperStruct");
  442. this.paperStruct = JSON.parse(paperStruct);
  443. },
  444. removeItem() {
  445. sessionStorage.removeItem("paperStruct");
  446. },
  447. //重置
  448. resetForm() {
  449. this.paperDetailStructForm = {
  450. name: "",
  451. remark: ""
  452. };
  453. },
  454. //添加大题型
  455. insert() {
  456. this.dialogType = "ADD";
  457. this.paperDetailStructForm.remark = "";
  458. this.paperDetailStructForm.name = "";
  459. this.paperDetailStructDialog = true;
  460. },
  461. editPaperDetail(paperDeatilId) {
  462. this.dialogType = "EDIT";
  463. this.paperDeatilId = paperDeatilId;
  464. var paperDetailStructs = this.paperDetailStructs;
  465. for (let i = paperDetailStructs.length - 1; i >= 0; i--) {
  466. if (paperDetailStructs[i].id == this.paperDeatilId) {
  467. this.paperDetailStructForm.remark = paperDetailStructs[i].remark;
  468. this.paperDetailStructForm.name = paperDetailStructs[i].name;
  469. }
  470. }
  471. this.paperDetailStructDialog = true;
  472. },
  473. //添加小题
  474. insertTopicStruct(row) {
  475. let courseNo =
  476. this.paperStruct.courseNo === "" ? "all" : this.paperStruct.courseNo;
  477. sessionStorage.setItem("paperStruct", JSON.stringify(this.paperStruct));
  478. this.$router.push({
  479. path:
  480. "/questions/insert_paper_structure_info/" +
  481. this.paperStructId +
  482. "/" +
  483. row.name +
  484. "/" +
  485. row.id +
  486. "/" +
  487. courseNo
  488. });
  489. },
  490. //返回
  491. back() {
  492. this.$router.push({
  493. path: "/questions/paper_structure/1"
  494. });
  495. },
  496. //查询所有课程
  497. getCourses(query) {
  498. query = query.trim();
  499. if (query) {
  500. if (!(query.indexOf("(") > -1 && query.indexOf(")") > -1)) {
  501. this.courseLoading = true;
  502. this.$http
  503. .get(CORE_API + "/course/query?name=" + query + "&enable=true")
  504. .then(response => {
  505. this.courseList = response.data;
  506. this.courseLoading = false;
  507. });
  508. }
  509. } else {
  510. this.courseList = [];
  511. }
  512. }
  513. },
  514. computed: {
  515. button_disabled: function() {
  516. //var reg = /^[-\+]?\d+(\.\d+)?$/; //正小数
  517. var reg = /^\d+(?=\.{0,1}\d+$|$)/;
  518. if (
  519. reg.test(this.paperStruct.totalScore) &&
  520. this.paperStruct.totalScore > 0 &&
  521. this.paperStruct.name
  522. ) {
  523. return false;
  524. } else {
  525. return true;
  526. }
  527. },
  528. totalScore() {
  529. var sum = 0.0;
  530. for (let paperDetailStruct of this.paperDetailStructs) {
  531. sum += paperDetailStruct.totalScore;
  532. }
  533. return sum;
  534. },
  535. courseInfoSelect() {
  536. var courseList = [];
  537. for (let course of this.courseList) {
  538. var courseInfo = course.name + "(" + course.code + ")";
  539. var courseNo = course.code;
  540. courseList.push({ courseNo: courseNo, courseInfo: courseInfo });
  541. }
  542. return courseList;
  543. }
  544. },
  545. created() {
  546. this.paperStructId = this.$route.params.id;
  547. this.searchForm();
  548. }
  549. };
  550. </script>