Selaa lähdekoodia

成绩管理接口调整

zhangjie 1 vuosi sitten
vanhempi
commit
248d663ac9

+ 1 - 1
src/modules/base/components/course-simple/SelectDimensionDialog.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    class="select-user-dialog"
+    class="select-dimension-dialog"
     :visible.sync="modalIsShow"
     title="选择知识点"
     top="10vh"

+ 18 - 17
src/modules/course/api.js

@@ -7,25 +7,29 @@ export const targetScoreListPage = (datas) => {
 // 成绩管理-平时成绩 ------------------->
 // 成绩管理-导入平时成绩-下载模版
 export const scoreTemplateDownload = (datas) => {
-  return $postParam("/api/admin/course/degree/score/template_download", datas, {
-    responseType: "blob",
-  });
+  return $postParam(
+    "/api/admin/course/degree/usual_score/template_download",
+    datas,
+    {
+      responseType: "blob",
+    }
+  );
 };
 // 成绩管理-平时成绩列表
 export const normalScoreListPage = (datas) => {
-  return $postParam("/api/admin/course/degree/score/normal/list", datas);
+  return $postParam("/api/admin/course/degree/usual_score/list", datas);
 };
 // 成绩管理-平时成绩编辑
 export const normalScoreEdit = (datas) => {
-  return $post("/api/admin/course/degree/score/normal/edit", datas);
+  return $post("/api/admin/course/degree/usual_score/edit", datas);
 };
 // 成绩管理-平时成绩保存
 export const normalScoreSave = (datas) => {
-  return $post("/api/admin/course/degree/score/normal/save", datas);
+  return $post("/api/admin/course/degree/usual_score/save", datas);
 };
 // 成绩管理-平时成绩启用/禁用
 export const normalScoreEnable = ({ id, enable }) => {
-  return $postParam("/api/admin/course/degree/score/normal/enable", {
+  return $postParam("/api/admin/course/degree/usual_score/enable", {
     id,
     enable,
   });
@@ -34,7 +38,7 @@ export const normalScoreEnable = ({ id, enable }) => {
 // 成绩管理-导入期末成绩-下载模版
 export const endScoreTemplateDownload = (datas) => {
   return $postParam(
-    "/api/admin/course/degree/score/end_exam/template_download",
+    "/api/admin/course/degree/final_score/template_download",
     datas,
     {
       responseType: "blob",
@@ -43,19 +47,19 @@ export const endScoreTemplateDownload = (datas) => {
 };
 // 成绩管理-期末成绩列表
 export const endScoreListPage = (datas) => {
-  return $postParam("/api/admin/course/degree/score/end_exam/list", datas);
+  return $postParam("/api/admin/course/degree/final_score/list", datas);
 };
 // 成绩管理-期末成绩编辑
 export const endScoreEdit = (datas) => {
-  return $post("/api/admin/course/degree/score/end_exam/edit", datas);
+  return $post("/api/admin/course/degree/final_score/edit", datas);
 };
 // 成绩管理-期末成绩保存
 export const endScoreSave = (datas) => {
-  return $post("/api/admin/course/degree/score/end_exam/save", datas);
+  return $post("/api/admin/course/degree/final_score/save", datas);
 };
 // 成绩管理-期末成绩启用/禁用
 export const endScoreEnable = ({ id, enable }) => {
-  return $postParam("/api/admin/course/degree/score/end_exam/enable", {
+  return $postParam("/api/admin/course/degree/final_score/enable", {
     id,
     enable,
   });
@@ -63,16 +67,13 @@ export const endScoreEnable = ({ id, enable }) => {
 // 成绩管理-试卷蓝图详情
 export const endScorePaperPositiveDetail = (datas) => {
   return $post(
-    "/api/admin/course/degree/score/end_exam/paper_positive/query",
+    "/api/admin/course/degree/final_score/paper_struct/query",
     datas
   );
 };
 // 成绩管理-保存试卷蓝图
 export const endScorePaperPositiveSave = (datas) => {
-  return $post(
-    "/api/admin/course/degree/score/end_exam/paper_positive/save",
-    datas
-  );
+  return $post("/api/admin/course/degree/final_score/paper_struct/save", datas);
 };
 
 // 报告管理 ------------------->

+ 13 - 5
src/modules/course/components/EndScoreManage.vue

@@ -10,8 +10,8 @@
     <div class="part-box part-box-pad">
       <el-table :data="dataList">
         <el-table-column type="index" label="序号" width="70"></el-table-column>
-        <el-table-column prop="examStudentName" label="姓名"></el-table-column>
-        <el-table-column prop="examNumber" label="学号"></el-table-column>
+        <el-table-column prop="name" label="姓名"></el-table-column>
+        <el-table-column prop="studentCode" label="学号"></el-table-column>
         <el-table-column prop="score" label="成绩"> </el-table-column>
         <el-table-column prop="scoreDetailContent" label="成绩明细">
         </el-table-column>
@@ -45,11 +45,12 @@
       ref="ImportFile"
       title="导入期末成绩"
       :upload-url="uploadUrl"
+      :upload-data="filter"
       :format="['xls', 'xlsx']"
       :download-handle="downloadHandle"
       :download-filename="dfilename"
       :auto-upload="false"
-      @upload-success="getList"
+      @upload-success="uploadSuccess"
     ></import-file>
     <!-- SetBlueDialog -->
     <set-blue-dialog ref="SetBlueDialog" :course="course"> </set-blue-dialog>
@@ -135,6 +136,14 @@ export default {
       this.curRow = { ...row };
       this.$refs.ModifyEndScore.open();
     },
+    uploadSuccess({ data }) {
+      let msg = `${data.success}`;
+      if (data.error) {
+        msg = +`,${data.error}`;
+      }
+      this.$message.success(msg);
+      this.getList();
+    },
     async downloadHandle() {
       if (this.downloading) return;
       this.downloading = true;
@@ -144,7 +153,6 @@ export default {
           examId: this.course.examId,
           courseCode: this.course.courseCode,
           paperNumber: this.course.paperNumber,
-          paperType: this.course.paperType,
         };
         return endScoreTemplateDownload(datas);
       }).catch((e) => {
@@ -158,7 +166,7 @@ export default {
     async toEnable(row) {
       const action = row.enable ? "禁用" : "启用";
       const confirm = await this.$confirm(
-        `确定要${action}考生【${row.examStudentName}】的成绩吗?`,
+        `确定要${action}考生【${row.name}】的成绩吗?`,
         "提示",
         {
           type: "warning",

+ 18 - 5
src/modules/course/components/ModifyEndScore.vue

@@ -15,11 +15,23 @@
       :key="modalForm.id"
       label-width="100px"
     >
-      <el-form-item label="考生姓名:">
-        {{ modalForm.examStudentName }}
+      <el-form-item
+        prop="name"
+        label="考生姓名:"
+        :rules="{
+          required: true,
+          message: '考生姓名为空',
+          trigger: 'change',
+        }"
+      >
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="考生姓名"
+          clearable
+        ></el-input>
       </el-form-item>
       <el-form-item label="考生学号:">
-        {{ modalForm.examNumber }}
+        {{ modalForm.studentCode }}
       </el-form-item>
       <el-form-item label="成绩:">
         {{ totalScore }}
@@ -63,8 +75,8 @@ import { endScoreSave } from "../api";
 
 const initModalForm = {
   id: null,
-  examStudentName: "",
-  examNumber: "",
+  name: "",
+  studentCode: "",
   score: "",
   scoreDetail: [],
 };
@@ -110,6 +122,7 @@ export default {
       this.isSubmit = true;
       const datas = {
         id: this.modalForm.id,
+        name: this.modalForm.name,
         score: this.totalScore,
         scoreDetail: JSON.stringify(this.modalForm.scoreDetail),
       };

+ 19 - 8
src/modules/course/components/ModifyNormalScore.vue

@@ -15,11 +15,23 @@
       :key="modalForm.id"
       label-width="100px"
     >
-      <el-form-item label="考生姓名:">
-        {{ modalForm.examStudentName }}
+      <el-form-item
+        prop="name"
+        label="考生姓名:"
+        :rules="{
+          required: true,
+          message: '考生姓名为空',
+          trigger: 'change',
+        }"
+      >
+        <el-input
+          v-model.trim="modalForm.name"
+          placeholder="考生姓名"
+          clearable
+        ></el-input>
       </el-form-item>
       <el-form-item label="考生学号:">
-        {{ modalForm.examNumber }}
+        {{ modalForm.studentCode }}
       </el-form-item>
       <el-form-item
         v-for="(item, index) in modalForm.normalScore"
@@ -60,8 +72,8 @@ import { normalScoreSave } from "../api";
 
 const initModalForm = {
   id: null,
-  examStudentName: "",
-  examNumber: "",
+  name: "",
+  studentCode: "",
   normalScore: [],
 };
 
@@ -101,9 +113,8 @@ export default {
       this.isSubmit = true;
       const datas = {
         id: this.modalForm.id,
-        scoreNormal: JSON.stringify({
-          normalScore: this.modalForm.normalScore,
-        }),
+        name: this.modalForm.name,
+        score: JSON.stringify(this.modalForm.normalScore),
       };
       const data = await normalScoreSave(datas).catch(() => {});
       this.isSubmit = false;

+ 23 - 15
src/modules/course/components/NormalScoreManage.vue

@@ -9,12 +9,12 @@
     <div class="part-box part-box-pad">
       <el-table :data="dataList">
         <el-table-column type="index" label="序号" width="70"></el-table-column>
-        <el-table-column prop="examStudentName" label="姓名"></el-table-column>
-        <el-table-column prop="examNumber" label="学号"></el-table-column>
+        <el-table-column prop="name" label="姓名"></el-table-column>
+        <el-table-column prop="studentCode" label="学号"></el-table-column>
         <template v-for="(item, index) in normalScoreItems">
           <el-table-column :key="index" :label="item">
             <template slot-scope="scope">
-              {{ scope.row.normalScore[index].score }}
+              {{ scope.row[item] }}
             </template>
           </el-table-column>
         </template>
@@ -48,11 +48,12 @@
       ref="ImportFile"
       title="导入平时成绩"
       :upload-url="uploadUrl"
+      :upload-data="filter"
       :format="['xls', 'xlsx']"
       :download-handle="downloadHandle"
       :download-filename="dfilename"
       :auto-upload="false"
-      @upload-success="getList"
+      @upload-success="uploadSuccess"
     ></import-file>
   </div>
 </template>
@@ -92,7 +93,7 @@ export default {
       curRow: {},
       normalScoreItems: [],
       // import
-      uploadUrl: "/api/admin/course/degree/score/import",
+      uploadUrl: "/api/admin/course/degree/usual_score/import",
       dfilename: "平时成绩导入模板.xlsx",
       downloading: false,
     };
@@ -111,21 +112,21 @@ export default {
       const data = await normalScoreListPage(datas);
       this.dataList = data.records.map((item) => {
         const nitem = { ...item };
-        if (!item.scoreNormal) {
-          nitem.normalScore = [];
+        if (!item.score) {
           return nitem;
         }
 
-        const { normalScore } = JSON.parse(item.scoreNormal);
-        nitem.normalScore = normalScore;
+        nitem.normalScore = JSON.parse(item.score);
+        nitem.normalScore.forEach((sItem) => {
+          nitem[sItem.name] = sItem.score;
+        });
         return nitem;
       });
       this.total = data.total;
 
-      const scoreNormal = this.dataList[0]?.scoreNormal;
-      if (scoreNormal) {
-        const { normalScore } = JSON.parse(scoreNormal);
-        this.normalScoreItems = normalScore.map((item) => item.name);
+      const score = data.records[0]?.score;
+      if (score) {
+        this.normalScoreItems = JSON.parse(score).map((item) => item.name);
       }
     },
     toPage(page) {
@@ -139,6 +140,14 @@ export default {
       this.curRow = { ...row };
       this.$refs.ModifyNormalScore.open();
     },
+    uploadSuccess({ data }) {
+      let msg = `${data.success}`;
+      if (data.error) {
+        msg = +`,${data.error}`;
+      }
+      this.$message.success(msg);
+      this.getList();
+    },
     async downloadHandle() {
       if (this.downloading) return;
       this.downloading = true;
@@ -148,7 +157,6 @@ export default {
           examId: this.course.examId,
           courseCode: this.course.courseCode,
           paperNumber: this.course.paperNumber,
-          paperType: this.course.paperType,
         };
         return scoreTemplateDownload(datas);
       }).catch((e) => {
@@ -162,7 +170,7 @@ export default {
     async toEnable(row) {
       const action = row.enable ? "禁用" : "启用";
       const confirm = await this.$confirm(
-        `确定要${action}考生【${row.examStudentName}】的成绩吗?`,
+        `确定要${action}考生【${row.name}】的成绩吗?`,
         "提示",
         {
           type: "warning",

+ 122 - 0
src/modules/course/components/SelectBlueDimensionDialog.vue

@@ -0,0 +1,122 @@
+<template>
+  <el-dialog
+    class="select-blue-dimension-dialog"
+    :visible.sync="modalIsShow"
+    title="选择知识点"
+    top="10vh"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @opened="visibleChange"
+  >
+    <el-tree
+      ref="treeRef"
+      :data="treeData"
+      show-checkbox
+      check-on-click-node
+      node-key="id"
+      :props="defaultProps"
+    >
+    </el-tree>
+
+    <div slot="footer">
+      <el-button type="primary" @click="submit">确认</el-button>
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { courseTargetList } from "../../base/api";
+
+export default {
+  name: "select-blue-dimension-dialog",
+  props: {
+    selectedData: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+    course: {
+      type: Object,
+      default() {
+        return {
+          examId: "",
+          courseCode: "",
+        };
+      },
+    },
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      treeData: [],
+      defaultProps: {
+        children: "children",
+        label: "name",
+      },
+    };
+  },
+  watch: {
+    course: {
+      immediate: true,
+      handler(val, oldVal) {
+        if (!val) return;
+        if (val !== oldVal) this.getTree();
+      },
+    },
+  },
+  methods: {
+    async getTree() {
+      const data = await courseTargetList({
+        examId: this.course.examId,
+        courseCode: this.course.courseCode,
+      });
+      this.treeData = (data || []).map((item) => {
+        return {
+          id: item.id,
+          name: item.targetName,
+          children: item.dimensionList,
+        };
+      });
+    },
+    visibleChange() {
+      this.$refs.treeRef.setCheckedKeys(this.selectedData);
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    submit() {
+      const selectedNodes = this.$refs.treeRef.getCheckedNodes();
+
+      if (!selectedNodes.length) {
+        this.$message.error("请选择知识点");
+        return;
+      }
+
+      this.$emit(
+        "confirm",
+        selectedNodes.map((item) => {
+          return {
+            targetId: item.id,
+            targetName: item.name,
+            dimensionList: item.children.map((dimension) => {
+              return {
+                dimensionId: dimension.dimensionId,
+                dimensionCode: dimension.dimensionCode,
+                dimensionName: dimension.dimensionName,
+              };
+            }),
+          };
+        })
+      );
+      this.cancel();
+    },
+  },
+};
+</script>

+ 29 - 20
src/modules/course/components/SetBlueDialog.vue

@@ -21,14 +21,19 @@
           label="小题号"
           width="100px"
         ></el-table-column>
-        <el-table-column prop="dimensions" label="知识点">
+        <el-table-column prop="dimensionList" label="知识点">
           <template slot-scope="scope">
-            <p v-for="item in scope.row.dimensions" :key="item.dimensionId">
-              {{ item.dimensionName }}
-            </p>
+            <template v-for="target in scope.row.targetList">
+              <p
+                v-for="item in target.dimensionList"
+                :key="`${target.targetId}_${item.dimensionId}`"
+              >
+                {{ item.dimensionName }}
+              </p>
+            </template>
           </template>
         </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="100px">
+        <el-table-column class-name="action-column" label="操作" width="110px">
           <template slot-scope="scope">
             <el-button
               class="btn-primary"
@@ -48,22 +53,22 @@
     </el-dialog>
 
     <!-- 设置知识点 -->
-    <select-dimension-dialog
-      ref="SelectDimensionDialog"
-      :course-code="course.courseCode"
-      :selected-data="curRow.catogoryIds"
+    <select-blue-dimension-dialog
+      ref="SelectBlueDimensionDialog"
+      :course="course"
+      :selected-data="selectedData"
       @confirm="dimensionSelected"
-    ></select-dimension-dialog>
+    ></select-blue-dimension-dialog>
   </div>
 </template>
 
 <script>
 import { endScorePaperPositiveDetail, endScorePaperPositiveSave } from "../api";
-import SelectDimensionDialog from "../../base/components/course-simple/SelectDimensionDialog.vue";
+import SelectBlueDimensionDialog from "./SelectBlueDimensionDialog.vue";
 
 export default {
   name: "SetBlueDialog",
-  components: { SelectDimensionDialog },
+  components: { SelectBlueDimensionDialog },
   props: {
     course: {
       type: Object,
@@ -78,6 +83,7 @@ export default {
       isSubmit: false,
       dataList: [],
       curRow: {},
+      selectedData: [],
     };
   },
   methods: {
@@ -86,7 +92,6 @@ export default {
         examId: this.course.examId,
         courseCode: this.course.courseCode,
         paperNumber: this.course.paperNumber,
-        paperType: this.course.paperType,
       });
       this.dataList = res || [];
     },
@@ -98,16 +103,21 @@ export default {
     },
     checkData() {
       return this.dataList.some(
-        (item) => !item.dimensionIds || !item.dimensionIds.length
+        (item) => !item.targetList || !item.targetList.length
       );
     },
     toLink(row) {
       this.curRow = row;
-      this.$refs.SelectDimensionDialog.open();
+      this.selectedData = [];
+      row.targetList.forEach((target) => {
+        target.dimensionList.forEach((dimension) => {
+          this.selectedData.push(dimension.dimensionId);
+        });
+      });
+      this.$refs.SelectBlueDimensionDialog.open();
     },
-    dimensionSelected(dimensions) {
-      this.curRow.dimensions = [...dimensions];
-      this.curRow.dimensionIds = dimensions.map((item) => item.dimensionId);
+    dimensionSelected(targetList) {
+      this.curRow.targetList = targetList;
     },
     async submit() {
       if (!this.checkData()) {
@@ -120,8 +130,7 @@ export default {
         examId: this.course.examId,
         courseCode: this.course.courseCode,
         paperNumber: this.course.paperNumber,
-        paperType: this.course.paperType,
-        paperDimension: JSON.stringify(this.dataList),
+        paperStruct: JSON.stringify(this.dataList),
       };
       const data = await endScorePaperPositiveSave(datas).catch(() => {});
       this.isSubmit = false;