Эх сурвалжийг харах

题卡大题号手动输入

zhangjie 2 жил өмнө
parent
commit
012bf8144a

+ 35 - 1
card/components/ElementPropEdit.vue

@@ -58,7 +58,7 @@ export default {
     return { loading: false };
   },
   computed: {
-    ...mapState("card", ["curElement", "openElementEditDialog"]),
+    ...mapState("card", ["curElement", "topics", "openElementEditDialog"]),
     title() {
       return this.curElement.type
         ? getElementName(this.curElement.type)
@@ -93,7 +93,41 @@ export default {
       }, 500);
       this.$refs.ElementPropEditComp.submit();
     },
+    checkTopic(element) {
+      if (element.type === "COMPOSITION") return true;
+
+      const relateTopics = this.topics.filter(
+        item =>
+          item.topicNo === element.topicNo &&
+          item.parent &&
+          item.parent.id !== element.id
+      );
+      if (!relateTopics.length) return true;
+
+      let er = [
+        element.startNumber,
+        element.startNumber + element.questionsCount - 1
+      ];
+
+      const unvalid = relateTopics.some(topic => {
+        const tr = [
+          topic.startNumber,
+          topic.startNumber + topic.questionsCount - 1
+        ];
+        return (
+          (er[0] <= tr[1] && er[0] >= tr[0]) ||
+          (er[1] <= tr[1] && er[1] >= tr[0])
+        );
+      });
+
+      return !unvalid;
+    },
     modified(element) {
+      // 在不校验大题号重复的情况下,需要校验小题号重复
+      if (!this.checkTopic(element)) {
+        this.$message.error("小题号重复,请重新设置小题号");
+        return;
+      }
       // 编辑试题
       // 属性存在的条件:parent:大题的小题,container:题目内的子元素
       if (this.curElement["_edit"]) {

+ 17 - 4
card/components/PagePropEdit.vue

@@ -46,18 +46,27 @@
           >启用</el-checkbox
         >
       </el-form-item>
-      <el-form-item label="大题数">
-        <ul class="topicno-list" v-if="topicSeries.length">
-          <li>{{ topicSeries.length }}</li>
+      <el-form-item label="大题顺序">
+        <ul class="topicno-list" v-if="topicNoSeries.length">
+          <li v-for="item in topicNoSeries" :key="item.id">
+            {{ item.topicNo }}
+          </li>
         </ul>
+        <el-button type="text" class="btn-primary" @click="toViewStruct"
+          >查看题卡结构<i class="el-icon-arrow-right"></i
+        ></el-button>
       </el-form-item>
     </el-form>
+
+    <!-- PageStructDialog -->
+    <page-struct-dialog ref="PageStructDialog"></page-struct-dialog>
   </div>
 </template>
 
 <script>
 import { mapState, mapMutations, mapActions } from "vuex";
 import { objAssign } from "../plugins/utils";
+import PageStructDialog from "./PageStructDialog.vue";
 
 const COLUMN_OPTIONS = [
   {
@@ -92,6 +101,7 @@ const COLUMN_OPTIONS = [
 
 export default {
   name: "page-prop-edit",
+  components: { PageStructDialog },
   data() {
     return {
       columnOptions: [],
@@ -108,7 +118,7 @@ export default {
     };
   },
   computed: {
-    ...mapState("card", ["curPageNo", "pages", "cardConfig", "topicSeries"]),
+    ...mapState("card", ["curPageNo", "pages", "cardConfig", "topicNoSeries"]),
     curPage() {
       return this.pages[this.curPageNo];
     }
@@ -188,6 +198,9 @@ export default {
         .catch(() => {
           this.form.pageSize = this.prePageSize;
         });
+    },
+    toViewStruct() {
+      this.$refs.PageStructDialog.open();
     }
   }
 };

+ 77 - 0
card/components/PageStructDialog.vue

@@ -0,0 +1,77 @@
+<template>
+  <el-dialog
+    class="page-struct-dialog"
+    :visible.sync="modalIsShow"
+    title="题卡结构"
+    top="10vh"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <el-table :data="structData">
+      <el-table-column
+        prop="topicNo"
+        label="大题号"
+        width="80"
+      ></el-table-column>
+      <el-table-column prop="topicName" label="大题名称"></el-table-column>
+      <el-table-column prop="questionsCount" label="小题数" width="80">
+        <span slot-scope="scope">{{ scope.row.questionsCount || "--" }}</span>
+      </el-table-column>
+    </el-table>
+
+    <div slot="footer"></div>
+  </el-dialog>
+</template>
+
+<script>
+import { mapState } from "vuex";
+
+export default {
+  name: "PageStructDialog",
+  data() {
+    return {
+      modalIsShow: false,
+      structData: []
+    };
+  },
+  computed: {
+    ...mapState("card", ["topics"])
+  },
+  methods: {
+    visibleChange() {
+      let structData = {};
+      let curTopicNo = "";
+      this.topics.forEach(topic => {
+        if (!topic.parent) return;
+        curTopicNo = topic.parent.topicNo;
+        if (structData[curTopicNo]) {
+          if (topic.type !== "COMPOSITION") {
+            structData[curTopicNo].questionsCount +=
+              topic.parent.questionsCount;
+          }
+        } else {
+          let sd = {
+            topicNo: curTopicNo,
+            topicName: topic.parent.topicName,
+            questionsCount: topic.parent.questionsCount
+          };
+          structData[curTopicNo] = sd;
+        }
+      });
+
+      structData = Object.values(structData);
+      structData.sort((a, b) => a.topicNo - b.topicNo);
+      this.structData = structData;
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    }
+  }
+};
+</script>

+ 18 - 0
card/elements/composition/EditComposition.vue

@@ -7,6 +7,16 @@
       :key="modalForm.id"
       label-width="100px"
     >
+      <el-form-item prop="topicNo" label="大题序号:">
+        <el-input-number
+          v-model="modalForm.topicNo"
+          :min="1"
+          :max="99"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
       <el-form-item prop="topicName" label="题目名称:">
         <el-input
           v-model="modalForm.topicName"
@@ -24,6 +34,7 @@
 <script>
 const initModalForm = {
   id: "",
+  topicNo: null,
   topicName: ""
 };
 
@@ -41,6 +52,13 @@ export default {
     return {
       modalForm: { ...initModalForm },
       rules: {
+        topicNo: [
+          {
+            required: true,
+            message: "请输入大题序号",
+            trigger: "change"
+          }
+        ],
         topicName: [
           {
             required: true,

+ 18 - 0
card/elements/explain/EditExplain.vue

@@ -7,6 +7,16 @@
       :key="modalForm.id"
       label-width="100px"
     >
+      <el-form-item prop="topicNo" label="大题序号:">
+        <el-input-number
+          v-model="modalForm.topicNo"
+          :min="1"
+          :max="99"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
       <el-form-item prop="topicName" label="题目名称:">
         <el-input
           v-model="modalForm.topicName"
@@ -45,6 +55,7 @@
 <script>
 const initModalForm = {
   id: "",
+  topicNo: null,
   topicName: "",
   startNumber: 1,
   endNumber: 4,
@@ -75,6 +86,13 @@ export default {
     return {
       modalForm: { ...initModalForm },
       rules: {
+        topicNo: [
+          {
+            required: true,
+            message: "请输入大题序号",
+            trigger: "change"
+          }
+        ],
         topicName: [
           {
             required: true,

+ 18 - 0
card/elements/fill-line/EditFillLine.vue

@@ -7,6 +7,16 @@
       :key="modalForm.id"
       label-width="120px"
     >
+      <el-form-item prop="topicNo" label="大题序号:">
+        <el-input-number
+          v-model="modalForm.topicNo"
+          :min="1"
+          :max="99"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
       <el-form-item prop="topicName" label="题目名称:">
         <el-input
           v-model="modalForm.topicName"
@@ -139,6 +149,7 @@ import { DIRECTION_TYPE } from "../../enumerate";
 
 const initModalForm = {
   id: "",
+  topicNo: null,
   topicName: "",
   startNumber: 1,
   endNumber: 2,
@@ -179,6 +190,13 @@ export default {
       DIRECTION_TYPE,
       questionLineNumOptions: [{ no: 1, count: 1 }],
       rules: {
+        topicNo: [
+          {
+            required: true,
+            message: "请输入大题序号",
+            trigger: "change"
+          }
+        ],
         topicName: [
           {
             required: true,

+ 18 - 0
card/elements/fill-question/EditFillQuestion.vue

@@ -14,6 +14,16 @@
           <el-radio-button label="boolean">判断</el-radio-button>
         </el-radio-group>
       </el-form-item>
+      <el-form-item prop="topicNo" label="大题序号:">
+        <el-input-number
+          v-model="modalForm.topicNo"
+          :min="1"
+          :max="99"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
       <el-form-item prop="topicName" label="题目名称:">
         <el-input
           v-model="modalForm.topicName"
@@ -108,6 +118,7 @@ import { BOOLEAN_TYPE, DIRECTION_TYPE } from "../../enumerate";
 
 const initModalForm = {
   id: "",
+  topicNo: null,
   topicName: "",
   startNumber: 1,
   endNumber: 5,
@@ -182,6 +193,13 @@ export default {
             trigger: "change"
           }
         ],
+        topicNo: [
+          {
+            required: true,
+            message: "请输入大题序号",
+            trigger: "change"
+          }
+        ],
         topicName: [
           {
             required: true,

+ 20 - 10
card/store/card.js

@@ -17,7 +17,8 @@ const state = {
   curPageNo: 0,
   pages: [],
   topics: [],
-  topicSeries: [], // 大题顺序号
+  topicSeries: [], // 大题顺序号,不排重
+  topicNoSeries: [], // 大题顺序号,按顺序排重
   insetTarget: {}, // 需要在其后面插入大题的大题
   openElementEditDialog: false
 };
@@ -52,6 +53,9 @@ const mutations = {
   setTopicSeries(state, topicSeries) {
     state.topicSeries = topicSeries;
   },
+  setTopicNoSeries(state, topicNoSeries) {
+    state.topicNoSeries = topicNoSeries;
+  },
   setInsetTarget(state, insetTarget) {
     state.insetTarget = insetTarget;
   },
@@ -238,22 +242,28 @@ const actions = {
   resetTopicSeries({ state, commit }) {
     let curTopicId = "",
       curTopicNo = 0,
-      topicSeries = [];
+      topicSeries = [],
+      topicNoSeries = [];
     state.topics.forEach(topic => {
       if (!topic.parent) return;
+
+      let data = {
+        id: topic.parent.id,
+        topicNo: topic.parent.topicNo,
+        type: topic.type,
+        sign: topic.sign
+      };
       if (curTopicId !== topic.parent.id) {
         curTopicId = topic.parent.id;
-        curTopicNo++;
-        topicSeries.push({
-          id: curTopicId,
-          topicNo: curTopicNo,
-          type: topic.type,
-          sign: topic.sign
-        });
+        topicSeries.push(data);
+      }
+      if (curTopicNo !== topic.parent.topicNo) {
+        curTopicNo = topic.parent.topicNo;
+        topicNoSeries.push(data);
       }
-      topic.topicNo = curTopicNo;
     });
     commit("setTopicSeries", topicSeries);
+    commit("setTopicNoSeries", topicNoSeries);
   },
   // 新增试题 --------------->
   addElement({ state, commit, dispatch }, element) {