zhangjie пре 2 година
родитељ
комит
ca6bd30ffb

+ 0 - 83
src/components/selection/DetailNameSelect.vue

@@ -1,83 +0,0 @@
-<template>
-  <el-select
-    v-model="selected"
-    :clearable="clearable"
-    :disabled="disabled"
-    :placeholder="placeholder"
-    @change="select"
-  >
-    <el-option
-      v-for="item in optionList"
-      :key="item"
-      :label="item"
-      :value="item"
-    ></el-option>
-  </el-select>
-</template>
-
-<script>
-import { questionDetailNameQueryApi } from "../../modules/question/api";
-
-export default {
-  name: "DetailNameSelect",
-  props: {
-    value: {
-      type: String,
-      default: "",
-    },
-    filterData: {
-      type: Object,
-      default() {
-        return {
-          courseId: "",
-          questionType: "",
-        };
-      },
-    },
-    disabled: { type: Boolean, default: false },
-    placeholder: { type: String, default: "请选择来源大题" },
-    clearable: { type: Boolean, default: true },
-  },
-  data() {
-    return {
-      selected: "",
-      optionList: [],
-    };
-  },
-  watch: {
-    value: {
-      immediate: true,
-      handler(val) {
-        this.selected = val;
-      },
-    },
-    filterData: {
-      deep: true,
-      immediate: true,
-      handler(val, oldval) {
-        if (JSON.stringify(val) === JSON.stringify(oldval)) return;
-        this.search();
-      },
-    },
-  },
-  methods: {
-    async search() {
-      if (!this.filterData.courseId || !this.filterData.questionType) {
-        this.optionList = [];
-        this.selected = "";
-        this.select();
-        return;
-      }
-
-      this.loading = true;
-      const res = await questionDetailNameQueryApi(this.filterData);
-      this.optionList = res.data || [];
-      this.loading = false;
-    },
-    select() {
-      this.$emit("input", this.selected);
-      this.$emit("change", this.selected);
-    },
-  },
-};
-</script>

+ 99 - 0
src/components/selection/SourceDetailSelect.vue

@@ -0,0 +1,99 @@
+<template>
+  <el-select
+    v-model="selected"
+    :clearable="clearable"
+    :disabled="disabled"
+    :placeholder="placeholder"
+    value-key="id"
+    @change="select"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.id"
+      :label="item.name"
+      :value="item"
+    ></el-option>
+  </el-select>
+</template>
+
+<script>
+import { sourceDetailPageListApi } from "../../modules/question/api";
+
+export default {
+  name: "SourceDetailSelect",
+  props: {
+    value: {
+      type: Object,
+      default() {
+        return {
+          questionType: "",
+          sourceDetailId: "",
+        };
+      },
+    },
+    courseId: {
+      type: [String, Number],
+      default: "",
+    },
+    disabled: { type: Boolean, default: false },
+    placeholder: { type: String, default: "请选择题型" },
+    clearable: { type: Boolean, default: true },
+  },
+  data() {
+    return {
+      selected: null,
+      optionList: [],
+    };
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.selected = {
+          questionType: val.questionType,
+          id: val.sourceDetailId,
+        };
+      },
+    },
+    courseId(val, oldval) {
+      if (val === oldval) return;
+      this.search();
+    },
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    async search() {
+      if (!this.courseId) {
+        this.optionList = [];
+        this.selected = null;
+        this.select();
+        return;
+      }
+
+      const res = await sourceDetailPageListApi({
+        pageNumber: 1,
+        pageSize: 100,
+        courseId: this.courseId,
+        rootOrgId: this.$store.state.user.rootOrgId,
+      });
+      this.optionList = res.data.content || [];
+    },
+    select() {
+      if (this.selected) {
+        const selectVal = Object.assign({}, this.value, {
+          questionType: this.selected.questionType,
+          sourceDetailId: this.selected.id,
+          sourceDetailName: this.selected.name,
+        });
+        this.$emit("input", selectVal);
+        this.$emit("change", this.selected);
+      } else {
+        this.$emit("input", this.value);
+        this.$emit("change", null);
+      }
+    },
+  },
+};
+</script>

+ 1 - 1
src/modules/paper/components/BuildPaperAuto.vue

@@ -23,7 +23,7 @@
         :name="detail.id"
       >
         <div slot="title" class="detail-header">
-          <h3>{{ index + 1 }}、{{ detail.name }}</h3>
+          <h3>{{ index + 1 }}、{{ detail.detailName }}</h3>
           <div>
             <el-button
               size="mini"

+ 7 - 22
src/modules/paper/components/ModifyDetailStruct.vue

@@ -28,19 +28,11 @@
           :enable-formula="false"
         ></v-editor>
       </el-form-item>
-      <el-form-item v-if="!onlyName" label="题型" prop="questionType">
-        <question-type-select
-          v-model="modalForm.questionType"
-        ></question-type-select>
-      </el-form-item>
-      <el-form-item v-if="!onlyName" label="来源大题" prop="sourceDetailName">
-        <detail-name-select
-          v-model="modalForm.sourceDetailName"
-          :filter-data="{
-            questionType: modalForm.questionType,
-            courseId: modalForm.courseId,
-          }"
-        ></detail-name-select>
+      <el-form-item v-if="!onlyName" label="题型" prop="sourceDetailId">
+        <source-detail-select
+          v-model="modalForm"
+          :course-id="modalForm.courseId"
+        ></source-detail-select>
       </el-form-item>
       <el-form-item v-if="!onlyName" label="每题分值" prop="scorePerQuestion">
         <el-input-number
@@ -71,7 +63,7 @@ const initModalForm = {
   courseId: "",
   description: "",
   questionType: null,
-  sourceDetailName: null,
+  sourceDetailId: null,
   scorePerQuestion: 1,
 };
 export default {
@@ -100,20 +92,13 @@ export default {
             trigger: "change",
           },
         ],
-        questionType: [
+        sourceDetailId: [
           {
             required: true,
             message: "请选择题型",
             trigger: "change",
           },
         ],
-        sourceDetailName: [
-          {
-            required: true,
-            message: "请选择来源大题",
-            trigger: "change",
-          },
-        ],
         scorePerQuestion: [
           {
             required: true,

+ 3 - 3
src/modules/question/components/ModifySourceDetail.vue

@@ -82,12 +82,12 @@ export default {
         name: [
           {
             required: true,
-            message: "请输入来源大题名称",
+            message: "请输入题名称",
             trigger: "change",
           },
           {
             max: 100,
-            message: "来源大题名称不能超过100",
+            message: "题名称不能超过100",
             trigger: "change",
           },
         ],
@@ -107,7 +107,7 @@ export default {
       return !!this.instance.id;
     },
     title() {
-      return (this.isEdit ? "编辑" : "新增") + "来源大题";
+      return (this.isEdit ? "编辑" : "新增") + "题";
     },
   },
   methods: {

+ 117 - 19
src/modules/question/components/QuestionEditDialog.vue

@@ -30,14 +30,28 @@
       <el-form label-width="100px">
         <el-form-item label="题型">
           <el-button
-            v-for="item in QUESTION_TYPES"
-            :key="item.code"
-            :type="curQuestionType === item.code ? 'primary' : 'default'"
+            v-for="item in sourceDetailList"
+            :key="item.id"
+            :type="
+              questionModel.sourceDetailId === item.id ? 'primary' : 'default'
+            "
             size="small"
-            :disabled="isEdit"
+            :disabled="isEdit || loading"
             @click="switchType(item)"
             >{{ item.name }}</el-button
           >
+          <el-button
+            v-if="sourceDetailAllList.length > limitShowCount && !isEdit"
+            size="small"
+            :icon="showMore ? 'el-icon-arrow-up' : 'el-icon-more'"
+            @click="switchMoreSourceDetail"
+          ></el-button>
+          <el-button
+            v-if="!isEdit"
+            size="small"
+            icon="el-icon-plus"
+            @click="toAddSourceDetail"
+          ></el-button>
           <p class="tips-info">
             说明:如果是综合类试题(套题)可以选择题型为阅卷理解进行录入操作。
           </p>
@@ -52,6 +66,13 @@
       ></component>
     </div>
     <div slot="footer"></div>
+
+    <!-- ModifySourceDetail -->
+    <modify-source-detail
+      ref="ModifySourceDetail"
+      :instance="curSourceInfo"
+      @modified="sourceDetailAdded"
+    ></modify-source-detail>
   </el-dialog>
 </template>
 
@@ -65,7 +86,16 @@ import TextAnswerQuestion from "./edit/TextAnswerQuestion.vue";
 import NestedQuestion from "./edit/NestedQuestion.vue";
 import BankedClozeQuestion from "./edit/BankedClozeQuestion.vue";
 import { randomCode } from "@/plugins/utils";
-import { updateQuestionApi } from "../api";
+import { updateQuestionApi, sourceDetailPageListApi } from "../api";
+import ModifySourceDetail from "./ModifySourceDetail.vue";
+
+const initQuestionModel = {
+  courseId: null,
+  courseCode: "",
+  courseName: "",
+  sourceDetailId: null,
+  questionType: "",
+};
 
 export default {
   name: "QuestionEditDialog",
@@ -76,6 +106,7 @@ export default {
     BooleanQuestion,
     NestedQuestion,
     BankedClozeQuestion,
+    ModifySourceDetail,
   },
   props: {
     question: {
@@ -88,7 +119,10 @@ export default {
   data() {
     return {
       modalIsShow: false,
-      QUESTION_TYPES,
+      sourceDetailAllList: [],
+      sourceDetailList: [],
+      limitShowCount: 10,
+      showMore: false,
       // curQuestionType: "PARAGRAPH_MATCHING",
       curQuestionType: "SINGLE_ANSWER_QUESTION",
       questionModel: {},
@@ -96,6 +130,7 @@ export default {
       questionKey: "",
       loading: false,
       hasModifyQuestion: false,
+      curSourceInfo: {},
     };
   },
   computed: {
@@ -110,17 +145,32 @@ export default {
     },
   },
   methods: {
-    visibleChange() {
+    async visibleChange() {
+      await this.getSourceDetailList();
       this.initData();
     },
     initData() {
+      this.loading = false;
       this.hasModifyQuestion = false;
+
+      if (this.isEdit) {
+        this.sourceDetailList = this.sourceDetailAllList;
+        return;
+      }
+      if (this.sourceDetailAllList.length > this.limitShowCount) {
+        this.sourceDetailList = this.sourceDetailAllList.slice(
+          0,
+          this.limitShowCount
+        );
+      }
+
       this.questionKey = randomCode();
-      this.curQuestionType = this.question.questionType || this.curQuestionType;
-      this.questionModel = { ...this.question };
-      if (!this.questionModel.questionType)
-        this.questionModel.questionType = this.curQuestionType;
-      this.loading = false;
+      this.questionModel = Object.assign({}, initQuestionModel, this.question);
+      if (!this.question.questionType) {
+        const curSourceDetail = this.sourceDetailList[0];
+        this.questionModel.questionType = curSourceDetail.questionType;
+        this.questionModel.sourceDetailId = curSourceDetail.id;
+      }
     },
     close() {
       this.modalIsShow = false;
@@ -132,22 +182,70 @@ export default {
       if (this.hasModifyQuestion) this.$emit("modified");
       this.close();
     },
+    async getSourceDetailList() {
+      const res = await sourceDetailPageListApi({
+        pageNumber: 1,
+        pageSize: 100,
+        courseId: this.question.courseId,
+        rootOrgId: this.$store.state.user.rootOrgId,
+      });
+      this.sourceDetailAllList = res.data.content || [];
+      let questionTypeSerial = {};
+      QUESTION_TYPES.forEach((item, index) => {
+        questionTypeSerial[item.code] = index;
+      });
+      this.sourceDetailAllList.sort(
+        (a, b) =>
+          questionTypeSerial[a.questionType] -
+          questionTypeSerial[b.questionType]
+      );
+    },
+    switchMoreSourceDetail() {
+      if (this.showMore) {
+        this.sourceDetailList = this.sourceDetailAllList.slice(
+          0,
+          this.limitShowCount
+        );
+      } else {
+        this.sourceDetailList = this.sourceDetailAllList;
+      }
+      this.showMore = !this.showMore;
+    },
+    toAddSourceDetail() {
+      this.curSourceInfo = {
+        courseId: this.question.courseId,
+        rootOrgId: this.$store.state.user.rootOrgId,
+      };
+      this.$refs.ModifySourceDetail.open();
+    },
+    async sourceDetailAdded() {
+      await this.getSourceDetailList();
+      if (this.isEdit) {
+        this.sourceDetailList = this.sourceDetailAllList;
+        return;
+      }
+
+      this.showMore = !this.showMore;
+      this.switchMoreSourceDetail();
+    },
     async switchType(item) {
       if (this.isEdit) return;
-      if (this.curQuestionType === item.code) return;
+      if (this.questionModel.sourceDetailId === item.id) return;
+      if (this.questionModel.questionType === item.questionType) {
+        this.questionModel.sourceDetailId = item.id;
+        return;
+      }
 
       const confirm = await this.$confirm("确认更改题型吗?", "提示", {
         type: "warning",
       }).catch(() => {});
       if (confirm !== "confirm") return;
 
-      this.curQuestionType = item.code;
       this.questionKey = randomCode();
-      this.questionModel = {
-        ...this.questionModel,
-        questionType: this.curQuestionType,
-      };
-      this.loading = false;
+      this.questionModel = Object.assign({}, this.questionModel, {
+        questionType: item.questionType,
+        sourceDetailId: item.id,
+      });
     },
     async confirm() {
       const valid = await this.$refs.QuestionEditDetail.validate().catch(

+ 0 - 19
src/modules/question/components/edit/BankedClozeQuestion.vue

@@ -6,13 +6,6 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item prop="detailName" label="大题来源">
-        <el-input
-          v-model="modalForm.detailName"
-          placeholder="请输入大题来源"
-          clearable
-        ></el-input>
-      </el-form-item>
       <el-form-item prop="quesBody" label="大题题干">
         <v-editor
           v-model="modalForm.quesBody"
@@ -125,18 +118,6 @@ export default {
       modalForm: {},
       activeNames: [],
       rules: {
-        detailName: [
-          {
-            required: true,
-            message: "请输入大题来源",
-            trigger: "change",
-          },
-          {
-            max: 30,
-            message: "大题来源不能超过30",
-            trigger: "change",
-          },
-        ],
         quesBody: [
           {
             validator: (rule, value, callback) => {

+ 0 - 19
src/modules/question/components/edit/BooleanQuestion.vue

@@ -6,13 +6,6 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item prop="detailName" label="大题来源">
-        <el-input
-          v-model="modalForm.detailName"
-          placeholder="请输入大题来源"
-          clearable
-        ></el-input>
-      </el-form-item>
       <el-form-item prop="quesBody" label="题干">
         <v-editor
           v-model="modalForm.quesBody"
@@ -72,18 +65,6 @@ export default {
         },
       ],
       rules: {
-        detailName: [
-          {
-            required: true,
-            message: "请输入大题来源",
-            trigger: "change",
-          },
-          {
-            max: 30,
-            message: "大题来源不能超过30",
-            trigger: "change",
-          },
-        ],
         quesBody: [
           {
             validator: (rule, value, callback) => {

+ 0 - 19
src/modules/question/components/edit/FillBlankQuestion.vue

@@ -6,13 +6,6 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item prop="detailName" label="大题来源">
-        <el-input
-          v-model="modalForm.detailName"
-          placeholder="请输入大题来源"
-          clearable
-        ></el-input>
-      </el-form-item>
       <el-form-item prop="quesBody" label="题干">
         <v-editor
           v-model="modalForm.quesBody"
@@ -70,18 +63,6 @@ export default {
     return {
       modalForm: {},
       rules: {
-        detailName: [
-          {
-            required: true,
-            message: "请输入大题来源",
-            trigger: "change",
-          },
-          {
-            max: 30,
-            message: "大题来源不能超过30",
-            trigger: "change",
-          },
-        ],
         quesBody: [
           {
             validator: (rule, value, callback) => {

+ 0 - 19
src/modules/question/components/edit/MatchQuestion.vue

@@ -6,13 +6,6 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item prop="detailName" label="大题来源">
-        <el-input
-          v-model="modalForm.detailName"
-          placeholder="请输入大题来源"
-          clearable
-        ></el-input>
-      </el-form-item>
       <el-form-item v-if="IS_PARAGRAPH_MATCHING" prop="quesBody" label="题干">
         <v-editor
           v-model="modalForm.quesBody"
@@ -69,18 +62,6 @@ export default {
       modalForm: {},
       quesAnswer: null,
       rules: {
-        detailName: [
-          {
-            required: true,
-            message: "请输入大题来源",
-            trigger: "change",
-          },
-          {
-            max: 30,
-            message: "大题来源不能超过30",
-            trigger: "change",
-          },
-        ],
         quesBody: [
           {
             validator: (rule, value, callback) => {

+ 0 - 19
src/modules/question/components/edit/NestedQuestion.vue

@@ -1,12 +1,5 @@
 <template>
   <div class="nested-question">
-    <el-form-item prop="detailName" label="大题来源">
-      <el-input
-        v-model="modalForm.detailName"
-        placeholder="请输入大题来源"
-        clearable
-      ></el-input>
-    </el-form-item>
     <el-form
       ref="modalFormComp"
       :model="modalForm"
@@ -128,18 +121,6 @@ export default {
       BASE_QUESTION_TYPES,
       activeNames: [],
       rules: {
-        detailName: [
-          {
-            required: true,
-            message: "请输入大题来源",
-            trigger: "change",
-          },
-          {
-            max: 30,
-            message: "大题来源不能超过30",
-            trigger: "change",
-          },
-        ],
         quesBody: [
           {
             validator: (rule, value, callback) => {

+ 0 - 19
src/modules/question/components/edit/SelectQuestion.vue

@@ -6,13 +6,6 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item prop="detailName" label="大题来源">
-        <el-input
-          v-model="modalForm.detailName"
-          placeholder="请输入大题来源"
-          clearable
-        ></el-input>
-      </el-form-item>
       <el-form-item prop="quesBody" label="题干">
         <v-editor
           v-model="modalForm.quesBody"
@@ -133,18 +126,6 @@ export default {
       modalForm: {},
       quesAnswer: null,
       rules: {
-        detailName: [
-          {
-            required: true,
-            message: "请输入大题来源",
-            trigger: "change",
-          },
-          {
-            max: 30,
-            message: "大题来源不能超过30",
-            trigger: "change",
-          },
-        ],
         quesBody: [
           {
             validator: (rule, value, callback) => {

+ 0 - 19
src/modules/question/components/edit/TextAnswerQuestion.vue

@@ -6,13 +6,6 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item prop="detailName" label="大题来源">
-        <el-input
-          v-model="modalForm.detailName"
-          placeholder="请输入大题来源"
-          clearable
-        ></el-input>
-      </el-form-item>
       <el-form-item prop="quesBody" label="题干">
         <v-editor
           v-model="modalForm.quesBody"
@@ -54,18 +47,6 @@ export default {
     return {
       modalForm: {},
       rules: {
-        detailName: [
-          {
-            required: true,
-            message: "请输入大题来源",
-            trigger: "change",
-          },
-          {
-            max: 30,
-            message: "大题来源不能超过30",
-            trigger: "change",
-          },
-        ],
         quesBody: [
           {
             validator: (rule, value, callback) => {

+ 1 - 1
src/modules/question/components/model/questionModel.js

@@ -117,7 +117,7 @@ const models = {
 export const getInitQuestionModel = (qtype) => {
   return {
     id: null,
-    detailName: "",
+    sourceDetailId: "",
     courseId: "",
     difficulty: "易",
     quesProperties: [],

+ 2 - 2
src/plugins/globalVuePlugins.js

@@ -6,7 +6,7 @@ import CourseSelect from "../components/selection/CourseSelect";
 import QuestionTypeSelect from "../components/selection/QuestionTypeSelect";
 import PropertySelect from "../components/selection/PropertySelect";
 import PropertySubSelect from "../components/selection/PropertySubSelect";
-import DetailNameSelect from "../components/selection/DetailNameSelect";
+import SourceDetailSelect from "../components/selection/SourceDetailSelect";
 // mixins
 import commonMixins from "../mixins/common";
 
@@ -21,7 +21,7 @@ export default {
     Vue.component("QuestionTypeSelect", QuestionTypeSelect);
     Vue.component("PropertySelect", PropertySelect);
     Vue.component("PropertySubSelect", PropertySubSelect);
-    Vue.component("DetailNameSelect", DetailNameSelect);
+    Vue.component("SourceDetailSelect", SourceDetailSelect);
     //全局 mixins
     Vue.mixin(commonMixins);
   },