zhangjie 2 роки тому
батько
коміт
7b07495dba

+ 12 - 1
src/modules/analysis/components/baseConfig/baseConfigsStore.js

@@ -53,8 +53,19 @@ const actions = {
       paperNumber: state.baseInfo.paperNumber,
       paperType: state.baseInfo.paperType
     };
-    const data = await paperStructList(datas).catch(() => {});
+    let data = await paperStructList(datas).catch(() => {});
     if (!data) return Promise.reject();
+    // 临时改don
+    data.forEach(item => {
+      item.bigQuestionNumber = Number(item.bigQuestionNumber);
+      item.smallQuestionNumber = Number(item.smallQuestionNumber);
+    });
+    data.sort((a, b) => {
+      if (a.bigQuestionNumber < b.bigQuestionNumber) return -1;
+      if (a.bigQuestionNumber > b.bigQuestionNumber) return 1;
+      return a.smallQuestionNumber - b.smallQuestionNumber;
+    });
+
     commit("setStructList", data);
   },
   async fetchDefineList({ state, commit }) {

+ 343 - 343
src/modules/stmms/components/markParam/MarkPaperStructure.vue

@@ -1,343 +1,343 @@
-<template>
-  <div class="mark-paper-structure">
-    <p class="structure-desc">
-      <span>课程名称:</span>
-      <span class="mr-4">{{ datas.basicPaperInfo.courseName }}</span>
-      <span>课程代码:</span>
-      <span>{{ datas.basicPaperInfo.courseCode }}</span>
-    </p>
-    <el-table
-      ref="TableList"
-      :data="tableData"
-      border
-      :row-class-name="getRowClassName"
-    >
-      <el-table-column width="50" align="center">
-        <template slot-scope="scope" v-if="scope.row.isMainFirstSub">
-          <div
-            :class="[
-              'expand-btn',
-              { 'expand-btn-unexpand': !scope.row.expandSub }
-            ]"
-            @click="switchExpandSub(scope.row)"
-          >
-            <i
-              :class="scope.row.expandSub ? 'el-icon-minus' : 'el-icon-plus'"
-            ></i>
-          </div>
-        </template>
-      </el-table-column>
-      <el-table-column prop="mainTitle" label="大题名称">
-        <span slot-scope="scope" v-if="scope.row.isMainFirstSub">
-          <el-input
-            v-model.trim="scope.row.mainTitle"
-            size="small"
-            :maxlength="32"
-            clearable
-            @change="mainTitleChange(scope.row)"
-          ></el-input>
-        </span>
-      </el-table-column>
-      <el-table-column prop="qType" label="类型" width="160">
-        <template slot-scope="scope" v-if="scope.row.isMainFirstSub">
-          <el-radio-group
-            v-model="scope.row.qType"
-            size="mini"
-            @change="qTypeChange(scope.row)"
-          >
-            <el-radio-button
-              v-for="(val, key) in Q_TYPE"
-              :key="key"
-              :label="key"
-              >{{ val }}</el-radio-button
-            >
-          </el-radio-group>
-        </template>
-      </el-table-column>
-      <el-table-column prop="mainNumber" label="大题号" width="80">
-        <template slot-scope="scope" v-if="scope.row.isMainFirstSub">
-          <span>{{ scope.row.mainNumber }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column
-        prop="subNumber"
-        label="小题号"
-        width="80"
-      ></el-table-column>
-      <el-table-column prop="totalScore" label="小题满分" width="105">
-        <template slot-scope="scope">
-          <el-input-number
-            v-model="scope.row.totalScore"
-            class="width-80"
-            size="small"
-            :min="0.5"
-            :max="500"
-            :step="0.5"
-            step-strictly
-            :controls="false"
-          ></el-input-number>
-        </template>
-      </el-table-column>
-      <el-table-column class-name="action-column" label="操作" width="200px">
-        <template slot-scope="scope">
-          <el-button
-            class="btn-primary"
-            type="text"
-            @click="toAddMain(scope.row)"
-            >新增大题</el-button
-          >
-          <el-button
-            class="btn-primary"
-            type="text"
-            @click="toAddSub(scope.row)"
-            >新增小题</el-button
-          >
-          <el-button
-            :disabled="tableData.length <= 1"
-            class="btn-danger"
-            type="text"
-            @click="toDeleteSub(scope.row)"
-            >删除</el-button
-          >
-        </template>
-      </el-table-column>
-    </el-table>
-    <div class="total-info">
-      试卷总分:<span>{{ paperTotalScore }}</span
-      >分
-    </div>
-  </div>
-</template>
-
-<script>
-import { calcSum } from "@/plugins/utils";
-
-export default {
-  name: "mark-paper-structure",
-  props: {
-    datas: {
-      type: Object,
-      default() {
-        return {
-          basicPaperInfo: {},
-          paperStructureInfo: [],
-          groupInfo: []
-        };
-      }
-    }
-  },
-  data() {
-    return {
-      tableData: [],
-      Q_TYPE: {
-        objective: "客观题",
-        subjective: "主观题"
-      }
-    };
-  },
-  computed: {
-    paperTotalScore() {
-      return calcSum(this.tableData.map(item => item.totalScore || 0));
-    }
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    initData() {
-      this.tableData = this.datas.paperStructureInfo.map(item => {
-        return { ...item };
-      });
-      if (!this.tableData.length) {
-        this.createMain();
-      }
-
-      this.$emit("on-ready");
-    },
-    createMain() {
-      this.tableData.push({
-        id: this.$randomCode(),
-        qType: "objective",
-        mainId: this.$randomCode(),
-        mainTitle: "",
-        mainNumber: 1,
-        subNumber: 1,
-        totalScore: undefined,
-        isMainFirstSub: true,
-        expandSub: true
-      });
-    },
-    getRowClassName({ row }) {
-      let classNames = [];
-      if (row.isMainFirstSub) {
-        classNames.push("row-main-first-sub");
-      }
-      if (!row.isMainFirstSub && !row.expandSub) {
-        classNames.push("row-unexpand-sub");
-      }
-      return classNames.join(" ");
-    },
-    getNextMainStartPos(startPos, curMainId) {
-      let nextMainStartPos = null;
-      for (let i = startPos, len = this.tableData.length; i < len; i++) {
-        const element = this.tableData[i];
-        if (element.mainId !== curMainId) {
-          nextMainStartPos = i;
-          return nextMainStartPos;
-        }
-      }
-      if (nextMainStartPos === null) return this.tableData.length;
-    },
-    toAddMain(row) {
-      const startPos = this.tableData.findIndex(item => item.id === row.id);
-      let nextMainStartPos = this.getNextMainStartPos(startPos, row.mainId);
-      this.tableData.splice(nextMainStartPos, 0, {
-        id: this.$randomCode(),
-        qType: row.qType,
-        mainId: this.$randomCode(),
-        mainTitle: "",
-        mainNumber: row.mainNumber + 1,
-        subNumber: 1,
-        totalScore: row.totalScore,
-        isMainFirstSub: true,
-        expandSub: true
-      });
-      this.updateMainData();
-    },
-    updateMainData() {
-      let curMainNumber = 0,
-        curMainId = null;
-      this.tableData.forEach(item => {
-        if (item.mainId !== curMainId) {
-          curMainId = item.mainId;
-          curMainNumber++;
-        }
-        item.mainNumber = curMainNumber;
-      });
-    },
-    toAddSub(row) {
-      const subPos = this.tableData.findIndex(item => item.id === row.id);
-      this.tableData.splice(subPos + 1, 0, {
-        id: this.$randomCode(),
-        qType: row.qType,
-        mainId: row.mainId,
-        mainTitle: row.mainTitle,
-        mainNumber: row.mainNumber,
-        subNumber: row.subNumber + 1,
-        totalScore: row.totalScore,
-        isMainFirstSub: false,
-        expandSub: row.expandSub
-      });
-      this.updateSubData(row.mainId);
-    },
-    updateSubData(mainId) {
-      this.tableData
-        .filter(item => item.mainId === mainId)
-        .forEach((item, index) => {
-          item.subNumber = index + 1;
-        });
-    },
-    toDeleteSub(row) {
-      const subPos = this.tableData.findIndex(item => item.id === row.id);
-      this.tableData.splice(subPos, 1);
-
-      this.tableData
-        .filter(item => item.mainId === row.mainId)
-        .forEach((item, index) => {
-          item.isMainFirstSub = !index;
-        });
-      this.updateSubData(row.mainId);
-      this.updateMainData();
-    },
-    switchExpandSub(row) {
-      row.expandSub = !row.expandSub;
-      this.tableData
-        .filter(item => item.mainId === row.mainId && !item.isMainFirstSub)
-        .forEach(item => (item.expandSub = row.expandSub));
-    },
-    mainTitleChange(row) {
-      this.tableData
-        .filter(item => item.mainId === row.mainId && !item.isMainFirstSub)
-        .forEach(item => (item.mainTitle = row.mainTitle));
-    },
-    qTypeChange(row) {
-      this.tableData
-        .filter(item => item.mainId === row.mainId && !item.isMainFirstSub)
-        .forEach(item => (item.qType = row.qType));
-    },
-    checkData() {
-      if (
-        this.tableData.some(item => item.qType === "objective") &&
-        this.tableData[0].qType !== "objective"
-      ) {
-        this.$message.error("请保持客观题在前,主观题在后!");
-        return;
-      }
-
-      const objectiveNos = this.tableData
-        .filter(item => item.isMainFirstSub && item.qType === "objective")
-        .map(item => item.mainNumber);
-      const unValid = objectiveNos.some(
-        (no, index) => objectiveNos[0] + index !== no
-      );
-      if (unValid) {
-        this.$message.error("请保持主客观题题号连续");
-        return;
-      }
-
-      let errorMessages = [];
-      this.tableData.forEach(item => {
-        let errorMsg = ``;
-        if (item.isMainFirstSub) {
-          let errorFields = [];
-          if (!item.mainTitle) {
-            errorFields.push("大题名称");
-          }
-          if (!item.mainNumber) {
-            errorFields.push("大题号");
-          }
-          if (errorFields.length) {
-            errorMsg += `${errorFields.join("、")}不能为空,`;
-          }
-        }
-
-        let errorFields = [];
-        if (!item.subNumber) {
-          errorFields.push("小题号");
-        }
-        if (!item.totalScore) {
-          errorFields.push("小题满分");
-        }
-        if (errorFields.length) {
-          errorMsg += `第${item.subNumber}小题,${errorFields.join(
-            "、"
-          )}不能为空,`;
-        }
-
-        if (errorMsg) {
-          errorMsg = `第${item.mainNumber}大题,${errorMsg}`;
-          errorMessages.push(errorMsg);
-        }
-      });
-
-      if (errorMessages.length) {
-        this.$message.error(errorMessages.join("。"));
-        return;
-      }
-
-      this.updateData();
-      this.$emit("next-step");
-    },
-    getData() {
-      return this.tableData.map(item => {
-        return { ...item };
-      });
-    },
-    updateData() {
-      this.$emit("data-change", {
-        paperStructureInfo: this.getData()
-      });
-    }
-  }
-};
-</script>
+<template>
+  <div class="mark-paper-structure">
+    <p class="structure-desc">
+      <span>课程名称:</span>
+      <span class="mr-4">{{ datas.basicPaperInfo.courseName }}</span>
+      <span>课程代码:</span>
+      <span>{{ datas.basicPaperInfo.courseCode }}</span>
+    </p>
+    <el-table
+      ref="TableList"
+      :data="tableData"
+      border
+      :row-class-name="getRowClassName"
+    >
+      <el-table-column width="50" align="center">
+        <template slot-scope="scope" v-if="scope.row.isMainFirstSub">
+          <div
+            :class="[
+              'expand-btn',
+              { 'expand-btn-unexpand': !scope.row.expandSub }
+            ]"
+            @click="switchExpandSub(scope.row)"
+          >
+            <i
+              :class="scope.row.expandSub ? 'el-icon-minus' : 'el-icon-plus'"
+            ></i>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="mainTitle" label="大题名称">
+        <span slot-scope="scope" v-if="scope.row.isMainFirstSub">
+          <el-input
+            v-model.trim="scope.row.mainTitle"
+            size="small"
+            :maxlength="32"
+            clearable
+            @change="mainTitleChange(scope.row)"
+          ></el-input>
+        </span>
+      </el-table-column>
+      <el-table-column prop="qType" label="类型" width="160">
+        <template slot-scope="scope" v-if="scope.row.isMainFirstSub">
+          <el-radio-group
+            v-model="scope.row.qType"
+            size="mini"
+            @change="qTypeChange(scope.row)"
+          >
+            <el-radio-button
+              v-for="(val, key) in Q_TYPE"
+              :key="key"
+              :label="key"
+              >{{ val }}</el-radio-button
+            >
+          </el-radio-group>
+        </template>
+      </el-table-column>
+      <el-table-column prop="mainNumber" label="大题号" width="80">
+        <template slot-scope="scope" v-if="scope.row.isMainFirstSub">
+          <span>{{ scope.row.mainNumber }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="subNumber"
+        label="小题号"
+        width="80"
+      ></el-table-column>
+      <el-table-column prop="totalScore" label="小题满分" width="105">
+        <template slot-scope="scope">
+          <el-input-number
+            v-model="scope.row.totalScore"
+            class="width-80"
+            size="small"
+            :min="0.5"
+            :max="500"
+            :step="0.5"
+            step-strictly
+            :controls="false"
+          ></el-input-number>
+        </template>
+      </el-table-column>
+      <el-table-column class-name="action-column" label="操作" width="200px">
+        <template slot-scope="scope">
+          <el-button
+            class="btn-primary"
+            type="text"
+            @click="toAddMain(scope.row)"
+            >新增大题</el-button
+          >
+          <el-button
+            class="btn-primary"
+            type="text"
+            @click="toAddSub(scope.row)"
+            >新增小题</el-button
+          >
+          <el-button
+            :disabled="tableData.length <= 1"
+            class="btn-danger"
+            type="text"
+            @click="toDeleteSub(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="total-info">
+      试卷总分:<span>{{ paperTotalScore }}</span
+      >分
+    </div>
+  </div>
+</template>
+
+<script>
+import { calcSum } from "@/plugins/utils";
+
+export default {
+  name: "mark-paper-structure",
+  props: {
+    datas: {
+      type: Object,
+      default() {
+        return {
+          basicPaperInfo: {},
+          paperStructureInfo: [],
+          groupInfo: []
+        };
+      }
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      Q_TYPE: {
+        objective: "客观题",
+        subjective: "主观题"
+      }
+    };
+  },
+  computed: {
+    paperTotalScore() {
+      return calcSum(this.tableData.map(item => item.totalScore || 0));
+    }
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    initData() {
+      this.tableData = this.datas.paperStructureInfo.map(item => {
+        return { ...item };
+      });
+      if (!this.tableData.length) {
+        this.createMain();
+      }
+
+      this.$emit("on-ready");
+    },
+    createMain() {
+      this.tableData.push({
+        id: this.$randomCode(),
+        qType: "objective",
+        mainId: this.$randomCode(),
+        mainTitle: "",
+        mainNumber: 1,
+        subNumber: 1,
+        totalScore: undefined,
+        isMainFirstSub: true,
+        expandSub: true
+      });
+    },
+    getRowClassName({ row }) {
+      let classNames = [];
+      if (row.isMainFirstSub) {
+        classNames.push("row-main-first-sub");
+      }
+      if (!row.isMainFirstSub && !row.expandSub) {
+        classNames.push("row-unexpand-sub");
+      }
+      return classNames.join(" ");
+    },
+    getNextMainStartPos(startPos, curMainId) {
+      let nextMainStartPos = null;
+      for (let i = startPos, len = this.tableData.length; i < len; i++) {
+        const element = this.tableData[i];
+        if (element.mainId !== curMainId) {
+          nextMainStartPos = i;
+          return nextMainStartPos;
+        }
+      }
+      if (nextMainStartPos === null) return this.tableData.length;
+    },
+    toAddMain(row) {
+      const startPos = this.tableData.findIndex(item => item.id === row.id);
+      let nextMainStartPos = this.getNextMainStartPos(startPos, row.mainId);
+      this.tableData.splice(nextMainStartPos, 0, {
+        id: this.$randomCode(),
+        qType: row.qType,
+        mainId: this.$randomCode(),
+        mainTitle: "",
+        mainNumber: row.mainNumber + 1,
+        subNumber: 1,
+        totalScore: row.totalScore,
+        isMainFirstSub: true,
+        expandSub: true
+      });
+      this.updateMainData();
+    },
+    updateMainData() {
+      let curMainNumber = 0,
+        curMainId = null;
+      this.tableData.forEach(item => {
+        if (item.mainId !== curMainId) {
+          curMainId = item.mainId;
+          curMainNumber++;
+        }
+        item.mainNumber = curMainNumber;
+      });
+    },
+    toAddSub(row) {
+      const subPos = this.tableData.findIndex(item => item.id === row.id);
+      this.tableData.splice(subPos + 1, 0, {
+        id: this.$randomCode(),
+        qType: row.qType,
+        mainId: row.mainId,
+        mainTitle: row.mainTitle,
+        mainNumber: row.mainNumber,
+        subNumber: row.subNumber + 1,
+        totalScore: row.totalScore,
+        isMainFirstSub: false,
+        expandSub: row.expandSub
+      });
+      this.updateSubData(row.mainId);
+    },
+    updateSubData(mainId) {
+      this.tableData
+        .filter(item => item.mainId === mainId)
+        .forEach((item, index) => {
+          item.subNumber = index + 1;
+        });
+    },
+    toDeleteSub(row) {
+      const subPos = this.tableData.findIndex(item => item.id === row.id);
+      this.tableData.splice(subPos, 1);
+
+      this.tableData
+        .filter(item => item.mainId === row.mainId)
+        .forEach((item, index) => {
+          item.isMainFirstSub = !index;
+        });
+      this.updateSubData(row.mainId);
+      this.updateMainData();
+    },
+    switchExpandSub(row) {
+      row.expandSub = !row.expandSub;
+      this.tableData
+        .filter(item => item.mainId === row.mainId && !item.isMainFirstSub)
+        .forEach(item => (item.expandSub = row.expandSub));
+    },
+    mainTitleChange(row) {
+      this.tableData
+        .filter(item => item.mainId === row.mainId && !item.isMainFirstSub)
+        .forEach(item => (item.mainTitle = row.mainTitle));
+    },
+    qTypeChange(row) {
+      this.tableData
+        .filter(item => item.mainId === row.mainId && !item.isMainFirstSub)
+        .forEach(item => (item.qType = row.qType));
+    },
+    checkData() {
+      // if (
+      //   this.tableData.some(item => item.qType === "objective") &&
+      //   this.tableData[0].qType !== "objective"
+      // ) {
+      //   this.$message.error("请保持客观题在前,主观题在后!");
+      //   return;
+      // }
+
+      // const objectiveNos = this.tableData
+      //   .filter(item => item.isMainFirstSub && item.qType === "objective")
+      //   .map(item => item.mainNumber);
+      // const unValid = objectiveNos.some(
+      //   (no, index) => objectiveNos[0] + index !== no
+      // );
+      // if (unValid) {
+      //   this.$message.error("请保持主客观题题号连续");
+      //   return;
+      // }
+
+      let errorMessages = [];
+      this.tableData.forEach(item => {
+        let errorMsg = ``;
+        if (item.isMainFirstSub) {
+          let errorFields = [];
+          if (!item.mainTitle) {
+            errorFields.push("大题名称");
+          }
+          if (!item.mainNumber) {
+            errorFields.push("大题号");
+          }
+          if (errorFields.length) {
+            errorMsg += `${errorFields.join("、")}不能为空,`;
+          }
+        }
+
+        let errorFields = [];
+        if (!item.subNumber) {
+          errorFields.push("小题号");
+        }
+        if (!item.totalScore) {
+          errorFields.push("小题满分");
+        }
+        if (errorFields.length) {
+          errorMsg += `第${item.subNumber}小题,${errorFields.join(
+            "、"
+          )}不能为空,`;
+        }
+
+        if (errorMsg) {
+          errorMsg = `第${item.mainNumber}大题,${errorMsg}`;
+          errorMessages.push(errorMsg);
+        }
+      });
+
+      if (errorMessages.length) {
+        this.$message.error(errorMessages.join("。"));
+        return;
+      }
+
+      this.updateData();
+      this.$emit("next-step");
+    },
+    getData() {
+      return this.tableData.map(item => {
+        return { ...item };
+      });
+    },
+    updateData() {
+      this.$emit("data-change", {
+        paperStructureInfo: this.getData()
+      });
+    }
+  }
+};
+</script>