zhangjie 1 سال پیش
والد
کامیت
dd296d46ad

+ 7 - 0
src/assets/styles/base.scss

@@ -224,6 +224,13 @@ body {
   align-items: center;
   justify-content: space-between;
 }
+.box-grow {
+  flex-grow: 2;
+}
+.box-static {
+  flex-grow: 0;
+  flex-shrink: 0;
+}
 
 // page-head
 .page-head {

+ 3 - 0
src/assets/styles/pages.scss

@@ -1263,6 +1263,9 @@
     max-width: 160px;
     max-height: 40px;
   }
+  .el-form-item {
+    margin-bottom: 12px;
+  }
 }
 
 // .data-task-dialog

+ 8 - 10
src/modules/admin/components/ModifySchool.vue

@@ -35,17 +35,15 @@
           clearable
         ></el-input>
       </el-form-item>
-      <el-form-item label="是否默认学校">
-        <el-radio-group v-model="modalForm.defaultSchool">
-          <el-radio :label="false">否</el-radio>
-          <el-radio :label="true">是</el-radio>
-        </el-radio-group>
+      <el-form-item>
+        <el-checkbox v-model="modalForm.defaultSchool"
+          >是否默认学校
+        </el-checkbox>
       </el-form-item>
-      <el-form-item label="学校是否有固定试卷编号">
-        <el-radio-group v-model="modalForm.hasPaperNumber">
-          <el-radio :label="false">否</el-radio>
-          <el-radio :label="true">是</el-radio>
-        </el-radio-group>
+      <el-form-item>
+        <el-checkbox v-model="modalForm.hasPaperNumber"
+          >学校是否有固定试卷编号
+        </el-checkbox>
       </el-form-item>
       <el-form-item prop="logo" label="学校logo:">
         <UploadFetchFile

+ 2 - 2
src/modules/base/components/course-simple/ModifyCourseEvaluation.vue

@@ -14,7 +14,7 @@
       ref="modalFormComp"
       :model="modalForm"
       :rules="rules"
-      label-width="100px"
+      label-width="120px"
     >
       <el-form-item prop="evaluation" label="评价方式:">
         <el-input
@@ -95,7 +95,7 @@ export default {
         ],
         evaluationDesc: [
           {
-            required: false,
+            required: true,
             max: 999,
             message: "评价方式描述不能超过999个字",
             trigger: "change",

+ 42 - 9
src/modules/base/views/ExamStudentManage.vue

@@ -116,24 +116,48 @@
         <el-table-column
           prop="courseName"
           label="课程名称"
-          min-width="120"
+          min-width="100"
         ></el-table-column>
         <el-table-column
           prop="courseCode"
           label="课程代码"
           width="120"
         ></el-table-column>
-        <el-table-column prop="studentName" label="姓名"></el-table-column>
-        <el-table-column prop="studentCode" label="学号"></el-table-column>
-        <el-table-column prop="college" label="学院"></el-table-column>
-        <el-table-column prop="major" label="专业"></el-table-column>
-        <el-table-column prop="teachClazz" label="教学班"></el-table-column>
+        <el-table-column
+          prop="studentName"
+          label="姓名"
+          min-width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="studentCode"
+          label="学号"
+          width="140"
+        ></el-table-column>
+        <el-table-column
+          prop="college"
+          label="学院"
+          min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="major"
+          label="专业"
+          min-width="120"
+        ></el-table-column>
+        <el-table-column
+          prop="teachClazz"
+          label="教学班"
+          min-width="180"
+        ></el-table-column>
         <el-table-column
           prop="paperNumber"
           label="试卷编号"
           width="120"
         ></el-table-column>
-        <el-table-column prop="teacherName" label="任课老师"></el-table-column>
+        <el-table-column
+          prop="teacherName"
+          label="任课老师"
+          min-width="100"
+        ></el-table-column>
         <el-table-column
           prop="teacherCode"
           label="任课老师工号"
@@ -152,7 +176,7 @@
         <el-table-column
           prop="examPlace"
           label="考点(校区)"
-          width="120"
+          min-width="100"
         ></el-table-column>
         <el-table-column
           prop="examRoom"
@@ -238,6 +262,7 @@ import ModifyExamStudent from "../components/ModifyExamStudent.vue";
 import ImportFile from "../../../components/ImportFile.vue";
 import { downloadByApi } from "@/plugins/download";
 import templateDownload from "@/mixins/templateDownload";
+import { getExamDateTime } from "@/plugins/utils";
 
 export default {
   name: "exam-student-manage",
@@ -280,7 +305,15 @@ export default {
         pageSize: this.size,
       };
       const data = await examStudentListPage(datas);
-      this.dataList = data.records;
+      this.dataList = data.records.map((item) => {
+        const { examDate, examTime } = getExamDateTime(
+          item.examStartTime,
+          item.examEndTime
+        );
+        item.examDate = examDate;
+        item.examTime = examTime;
+        return item;
+      });
       this.total = data.total;
     },
     toPage(page) {

+ 7 - 0
src/modules/course/api.js

@@ -79,6 +79,13 @@ export const endScorePaperPositiveDetail = (datas) => {
 export const endScorePaperPositiveSave = (datas) => {
   return $post("/api/admin/course/degree/final_score/paper_struct/save", datas);
 };
+// 成绩管理-同步试卷蓝图
+export const endScorePaperPositiveSync = (datas) => {
+  return $post(
+    "/api/admin/course/degree/final_score/paper_struct_dimension/sync",
+    datas
+  );
+};
 
 // 报告管理 ------------------->
 export const targetReportListPage = (datas) => {

+ 70 - 22
src/modules/course/components/SetBlueDialog.vue

@@ -10,8 +10,27 @@
       append-to-body
       @open="visibleChange"
     >
-      <p class="mb-2">{{ targetDesc }}</p>
-      <el-table :data="dataList" border>
+      <div class="mb-2 box-justify">
+        <div class="box-grow mr-2">
+          <span v-for="(target, index) in treeData" :key="target.id">
+            <span>{{ target.name }}占比</span>
+            <span
+              v-if="targetRates[target.id]"
+              :class="[
+                'mlr-1',
+                targetRates[target.id].valid ? 'color-success' : 'color-danger',
+              ]"
+              >{{ targetRates[target.id].rate }}%</span
+            >
+            <span>({{ target.totalWeight || 0 }}%)</span>
+            <span>{{ index === treeData.length - 1 ? "。" : "," }}</span>
+          </span>
+        </div>
+        <el-button type="primary" :loading="loading" @click="toSync"
+          >同步</el-button
+        >
+      </div>
+      <el-table :data="dataList" border height="400">
         <el-table-column
           prop="mainNumber"
           label="大题号"
@@ -73,7 +92,11 @@
 <script>
 import { calcSum } from "@/plugins/utils";
 import { courseTargetList } from "../../base/api";
-import { endScorePaperPositiveDetail, endScorePaperPositiveSave } from "../api";
+import {
+  endScorePaperPositiveDetail,
+  endScorePaperPositiveSave,
+  endScorePaperPositiveSync,
+} from "../api";
 import SelectBlueDimensionDialog from "./SelectBlueDimensionDialog.vue";
 
 export default {
@@ -95,7 +118,8 @@ export default {
       curRow: {},
       selectedData: [],
       treeData: [],
-      targetDesc: "",
+      targetRates: {},
+      loading: false,
     };
   },
   watch: {
@@ -124,11 +148,6 @@ export default {
           }),
         };
       });
-
-      this.targetDesc = this.treeData
-        .map((item) => `${item.name}占比${item.totalWeight || 0}%`)
-        .join(",");
-      this.targetDesc += "。";
     },
     async getBlueDetail() {
       const res = await endScorePaperPositiveDetail({
@@ -137,6 +156,7 @@ export default {
         paperNumber: this.course.paperNumber,
       });
       this.dataList = res || [];
+      this.updateTargetRates();
     },
     visibleChange() {
       this.getBlueDetail();
@@ -147,6 +167,21 @@ export default {
     open() {
       this.modalIsShow = true;
     },
+    async toSync() {
+      if (this.loading) return;
+      this.loading = true;
+
+      const res = await endScorePaperPositiveSync({
+        examId: this.course.examId,
+        courseCode: this.course.courseCode,
+        paperNumber: this.course.paperNumber,
+      }).catch(() => {});
+      this.loading = false;
+      if (!res) return;
+
+      this.$message.success(`${res.success},错误:${res.error}`);
+      this.getBlueDetail();
+    },
     checkData() {
       const valid = !this.dataList.some(
         (item) => !item.targetList || !item.targetList.length
@@ -157,20 +192,10 @@ export default {
         return;
       }
 
-      const scoreData = {};
-      this.dataList.forEach((item) => {
-        if (!item.targetList || !item.targetList.length) return;
-        const targetId = item.targetList[0].targetId;
-        if (!scoreData[targetId]) scoreData[targetId] = 0;
-        scoreData[targetId] += item.score;
-      });
-      // console.log(scoreData);
-      const totalScore = calcSum(Object.values(scoreData));
-
       const unvalidTargets = [];
-      this.treeData.forEach((target) => {
-        const rate = (100 * scoreData[target.id]) / totalScore;
-        if (rate != target.totalWeight) unvalidTargets.push(target.name);
+      Object.keys(this.targetRates).forEach((tid) => {
+        const target = this.targetRates[tid];
+        if (!target.valid) unvalidTargets.push(target.name);
       });
       if (unvalidTargets.length) {
         this.$message.error(`${unvalidTargets.join("、")}占比不符合要求`);
@@ -192,6 +217,29 @@ export default {
     dimensionSelected(targetList) {
       this.curRow.targetList = targetList;
       this.curRow.courseTargetName = targetList[0].targetName;
+      this.updateTargetRates();
+    },
+    updateTargetRates() {
+      const scoreData = {};
+      this.dataList.forEach((item) => {
+        if (!item.targetList || !item.targetList.length) return;
+        const targetId = item.targetList[0].targetId;
+        if (!scoreData[targetId]) scoreData[targetId] = 0;
+        scoreData[targetId] += item.score;
+      });
+      const totalScore = calcSum(Object.values(scoreData));
+
+      const targetRates = {};
+      this.treeData.forEach((target) => {
+        const targetScore = scoreData[target.id] || 0;
+        const rate = !totalScore ? 0 : (100 * targetScore) / totalScore;
+        targetRates[target.id] = {
+          rate: Number.isInteger(rate) ? rate : rate.toFixed(2),
+          valid: rate == target.totalWeight,
+          name: target.name,
+        };
+      });
+      this.targetRates = targetRates;
     },
     async submit() {
       if (!this.checkData()) {

+ 4 - 0
src/modules/course/components/TargetReportDetail.vue

@@ -55,6 +55,7 @@
                 v-model="courseBasicInfo.courseType"
                 placeholder="请填写课程类别"
                 size="small"
+                :maxlength="30"
               ></el-input>
             </td>
             <td class="td-bg">学分</td>
@@ -77,6 +78,7 @@
                 v-model="courseBasicInfo.evaluationMode"
                 placeholder="请填写考核方式"
                 size="small"
+                :maxlength="30"
               ></el-input>
             </td>
             <td class="td-bg">开课时间</td>
@@ -136,6 +138,7 @@
                 v-model="courseBasicInfo.director"
                 placeholder="请填写评价负责人姓名"
                 size="small"
+                :maxlength="30"
               ></el-input>
             </td>
             <td class="td-bg">评价参与人</td>
@@ -144,6 +147,7 @@
                 v-model="courseBasicInfo.participant"
                 placeholder="请填写评价人姓名"
                 size="small"
+                :maxlength="30"
               ></el-input>
             </td>
           </tr>

+ 1 - 1
src/modules/exam/components/createExamAndPrintTask/InfoPrintTask.vue

@@ -265,7 +265,7 @@
 import { calcSum, getTimeDatestamp } from "@/plugins/utils";
 import { examRuleDetail } from "../../../base/api";
 import { listTaskPrintHouse } from "../../api";
-import ModifyExamStudent from "./ModifyExamStudent";
+import ModifyExamStudent from "./ModifyExamStudent.vue";
 import PreviewTaskStudent from "./PreviewTaskStudent";
 import { mapState, mapMutations } from "vuex";
 import UploadButton from "@/components/UploadButton";

+ 13 - 0
src/plugins/utils.js

@@ -285,6 +285,19 @@ export function getTimeDatestamp(time) {
   return new Date(`${date} 00:00:00`).getTime();
 }
 
+export function getExamDateTime(startTime, endTime) {
+  const examDate = startTime
+    ? formatDate("YYYY-MM-DD", new Date(startTime))
+    : "-";
+  const examSt = startTime ? formatDate("HH:mm", new Date(startTime)) : "";
+  const examEt = endTime ? formatDate("HH:mm", new Date(endTime)) : "";
+
+  return {
+    examDate,
+    examTime: `${examSt}-${examEt}`,
+  };
+}
+
 /**
  * 获取指定元素个数的数组
  * @param {Number} num