Prechádzať zdrojové kódy

feat: 毕业要求达成度统计完成调试

zhangjie 1 rok pred
rodič
commit
c66475a74f

+ 1 - 0
src/assets/styles/element-ui-costom.scss

@@ -661,6 +661,7 @@
     border-left-color: $--color-text-dark-1;
   }
 }
+
 // popper-list
 .popper-list {
   min-width: auto;

+ 12 - 0
src/components/base/ProfessionalSelect.vue

@@ -27,6 +27,7 @@ export default {
     placeholder: { type: String, default: "请选择" },
     value: { type: [Number, String], default: "" },
     clearable: { type: Boolean, default: true },
+    defaultSelect: { type: Boolean, default: false },
   },
   data() {
     return {
@@ -50,6 +51,8 @@ export default {
       this.optionList = [];
       const res = await conditionProfessionalList();
       this.optionList = res;
+
+      if (this.defaultSelect && !this.value) this.selectDefault();
     },
     select() {
       this.$emit("input", this.selected);
@@ -58,6 +61,15 @@ export default {
         this.optionList.find((item) => item.id === this.selected)
       );
     },
+    selectDefault() {
+      const defaultData = this.optionList[0];
+      if (defaultData) {
+        this.selected = defaultData.id;
+        this.$emit("input", this.selected);
+        this.$emit("change", defaultData);
+        this.$emit("default-selected", defaultData);
+      }
+    },
   },
 };
 </script>

+ 0 - 3
src/modules/mark/components/ModifyMarkSetting.vue

@@ -33,7 +33,6 @@
           <el-date-picker
             v-model="markTime"
             type="datetimerange"
-            :picker-options="pickerOptions"
             range-separator="至"
             start-placeholder="评卷开始日期"
             end-placeholder="评卷结束日期"
@@ -119,7 +118,6 @@ import {
 } from "../api";
 import { MARK_MODE_TYPE } from "@/constants/enumerate";
 import ModifyPaperArea from "./ModifyPaperArea.vue";
-import pickerOptions from "@/constants/datePickerOptions";
 
 const initModalForm = {
   examId: null,
@@ -186,7 +184,6 @@ export default {
       },
       // date-picker
       markTime: [],
-      pickerOptions,
     };
   },
   methods: {

+ 7 - 7
src/modules/target/api.js

@@ -131,7 +131,7 @@ export const courseOutlineTargetRequirementKnowledge = (datas) => {
   );
 };
 
-// 不要了
+// 暂时不做
 // 课程大纲管理-知识点 ------------------->
 // export const courseOutlineKnowledgeListPage = (datas) => {
 //   return $postParam("/api/admin/obe/culture/program/course/list", datas);
@@ -185,13 +185,13 @@ export const courseExamineWeightSave = (datas) => {
 // 统计相关页面 =====================>
 // 毕业要求达成度统计 ------------------->
 export const requirementStatisticsListPage = (datas) => {
-  return $postParam("/api/admin/obe/course_outline/page", datas);
+  return $postParam("/api/admin/obe/requirements/list", datas);
 };
-export const requirementStatisticsRadar = (id) => {
-  return $postParam("/api/admin/obe/course_outline/delete", { id });
+export const requirementStatisticsRadar = (datas) => {
+  return $postParam("/api/admin/obe/requirements/radar/report", datas);
 };
-export const requirementStatisticsDetail = (id) => {
-  return $postParam("/api/admin/obe/course_outline/delete", { id });
+export const requirementStatisticsDetail = (datas) => {
+  return $postParam("/api/admin/obe/requirements/detail/report", datas);
 };
 
 // 课程目标达成度统计 ------------------->
@@ -209,10 +209,10 @@ export const targetStatisticsReport = (datas) => {
     responseType: "blob",
   });
 };
-// 报告数据发生变化
 export const targetStatisticsChangeCheck = (datas) => {
   return $postParam("/api/admin/course/degree/report/change", datas);
 };
+
 // 学生毕业要求达成度 ------------------->
 export const studentTargetListPage = (datas) => {
   return $postParam("/api/admin/obe/student_requirement/page", datas);

+ 1 - 1
src/modules/target/components/requirement-statistics/DetailRequirementStatistics.vue

@@ -8,7 +8,7 @@
     fullscreen
     @close="closeHandle"
   >
-    <div slot="title">{{ rowData.name }}</div>
+    <div slot="title">{{ rowData.obeCultureProgramName }}</div>
     <div class="mb-4 tab-btns">
       <el-button
         v-for="tab in tabs"

+ 63 - 36
src/modules/target/components/requirement-statistics/RequirementStatisticsRadar.vue

@@ -2,44 +2,54 @@
   <div class="part-box part-box-pad">
     <el-row type="flex" :gutter="20">
       <el-col :span="12">
-        <div class="chart-box" style="height: 500px">
+        <div class="chart-box" style="height: 520px">
           <v-chart v-if="chartOption" :option="chartOption"></v-chart>
         </div>
       </el-col>
       <el-col :span="12">
-        <el-table :data="dataList">
+        <el-table :data="dataList" border>
           <el-table-column label="毕业要求" min-width="200">
             <template slot-scope="scope">
               {{ scope.$index + 1 }}.{{ scope.row.name }}
             </template>
           </el-table-column>
-          <el-table-column label="预期值" prop="预期值"></el-table-column>
-          <el-table-column label="实际值" prop="预期值"></el-table-column>
-          <el-table-column label="评价结果" prop="预期值"></el-table-column>
+          <el-table-column label="预期值" prop="expectValue"></el-table-column>
+          <el-table-column label="实际值" prop="matrixDegree"></el-table-column>
+          <el-table-column label="评价结果">
+            <span
+              slot-scope="scope"
+              :class="
+                scope.row.matrixDegree >= scope.row.expectValue
+                  ? 'color-success'
+                  : 'color-gray'
+              "
+            >
+              {{
+                scope.row.matrixDegree >= scope.row.expectValue
+                  ? "达成"
+                  : "未达成"
+              }}
+            </span>
+          </el-table-column>
           <el-table-column class-name="action-column" label="操作" width="100">
             <template slot-scope="scope">
-              <el-tooltip placement="left">
-                <div slot="content">
-                  <el-table :data="scope.row.details" border>
-                    <el-table-column
-                      label="毕业要求指标"
-                      prop=""
-                      width="120"
-                    ></el-table-column>
-                    <el-table-column
-                      label="达成值"
-                      prop=""
-                      width="80"
-                    ></el-table-column>
-                  </el-table>
-                </div>
-                <el-button
-                  class="btn-primary"
-                  type="text"
-                  @click="toDetail(scope.row)"
+              <el-popover placement="right" trigger="hover">
+                <el-table :data="scope.row.obeSubRequirements" border>
+                  <el-table-column
+                    label="毕业要求指标"
+                    prop="name"
+                    width="120"
+                  ></el-table-column>
+                  <el-table-column
+                    label="达成值"
+                    prop="matrixDegree"
+                    width="100"
+                  ></el-table-column>
+                </el-table>
+                <el-button slot="reference" class="btn-act-primary" type="text"
                   >查看详情</el-button
                 >
-              </el-tooltip>
+              </el-popover>
             </template>
           </el-table-column>
         </el-table>
@@ -49,6 +59,7 @@
 </template>
 
 <script>
+import { maxNum } from "@/plugins/utils";
 import { requirementStatisticsRadar } from "../../api";
 
 export default {
@@ -67,31 +78,47 @@ export default {
       chartOption: null,
     };
   },
+  mounted() {
+    this.getDetail();
+  },
   methods: {
     async getDetail() {
       const res = await requirementStatisticsRadar({
-        cultureProgramId: this.rowData.id,
+        cultureProgramId: this.rowData.cultureProgramId,
       });
-      this.dataList = res || [];
+      this.dataList = res.obeRequirements || [];
       this.updateChartOption();
     },
     updateChartOption() {
+      const vals = this.dataList
+        .map((item) => [item.expectValue, item.matrixDegree])
+        .flat();
+      const maxVal = Math.min(maxNum(vals) * 1.2, 1);
       const option = {
-        color: ["#556dff", "#f59a23"],
+        color: ["#3a5ae5", "#fe5d4e"],
         legend: {
           top: 0,
           data: ["预期值", "实际值"],
-          itemWidth: 12,
+          itemWidth: 16,
           itemHeight: 4,
           itemGap: 22,
-          left: 40,
+          left: "center",
         },
         radar: {
           shape: "circle",
-          indicator: this.dataList.map((item) => {
+          axisName: {
+            color: "#1f2230",
+            fontSize: 14,
+          },
+          axisLine: {
+            lineStyle: {
+              color: "#d3d5e0",
+            },
+          },
+          indicator: this.dataList.map((item, index) => {
             return {
-              name: item.name,
-              max: 1,
+              name: `${index + 1}.${item.name}`,
+              max: maxVal,
             };
           }),
         },
@@ -100,18 +127,18 @@ export default {
             type: "radar",
             data: [
               {
-                value: this.dataList.map((item) => item.predict),
+                value: this.dataList.map((item) => item.expectValue),
                 name: "预期值",
               },
               {
-                value: this.dataList.map((item) => item.val),
+                value: this.dataList.map((item) => item.matrixDegree),
                 name: "实际值",
               },
             ],
           },
         ],
       };
-      return option;
+      this.chartOption = option;
     },
   },
 };

+ 18 - 43
src/modules/target/components/requirement-statistics/RequirementStatisticsStatement.vue

@@ -1,12 +1,6 @@
 <template>
   <div class="part-box part-box-pad">
-    <el-table
-      :data="dataList"
-      border
-      :cell-style="cellStyleHandle"
-      :summary-method="getSummaries"
-      show-summary
-    >
+    <el-table :data="dataList" border>
       <el-table-column label="课程信息" align="center">
         <el-table-column label="课程名称(代码)" min-width="200">
           <template slot-scope="scope">
@@ -20,7 +14,7 @@
         ></el-table-column>
         <el-table-column
           label="学分"
-          prop="credit"
+          prop="matrixDegree"
           width="80"
         ></el-table-column>
       </el-table-column>
@@ -33,13 +27,16 @@
             align="center"
           >
             <el-table-column
-              v-for="subr in column.subRequirements"
-              :key="subr.name"
+              v-for="(subr, sindex) in column.subRequirements"
+              :key="sindex"
+              :label="subr.name"
               align="center"
-              :prop="`${column.name}_${subr.name}`"
             >
               <template slot-scope="scope">
-                {{ scope.row[`${column.name}_${subr.name}`].value }}
+                {{
+                  scope.row.obeRequirements[cindex].obeSubRequirements[sindex]
+                    .matrixDegree
+                }}
               </template>
             </el-table-column>
           </el-table-column>
@@ -51,10 +48,9 @@
             :key="cindex"
             :label="column.name"
             align="center"
-            :prop="`${column.name}_null`"
           >
             <template slot-scope="scope">
-              <span>{{ scope.row[`${column.name}_null`].value }}</span>
+              {{ scope.row.obeRequirements[cindex].matrixDegree }}
             </template>
           </el-table-column>
         </template>
@@ -89,49 +85,28 @@ export default {
   methods: {
     async getList() {
       const res = await requirementStatisticsDetail({
-        cultureProgramId: this.rowData.id,
-      });
-      const tableData = res || [];
-      this.dataList = tableData.map((item, index) => {
-        if (!index) this.parseColumns(item.requirements);
-
-        const nitem = {
-          courseId: item.courseId,
-          courseCode: item.courseCode,
-          courseName: item.courseName,
-          canEdit: item.canEdit,
-        };
-        item.requirements.forEach((requirement) => {
-          requirement.subRequirements.forEach((subr) => {
-            nitem[`${requirement.name}_${subr.name + ""}`] = {
-              id: subr.id,
-              value: subr.scale || undefined,
-            };
-          });
-        });
-
-        return nitem;
+        cultureProgramId: this.rowData.cultureProgramId,
       });
+      this.dataList = res || [];
+      if (this.dataList[0]) this.parseColumns(this.dataList[0].obeRequirements);
     },
     parseColumns(requirements) {
       this.hasSubRequirements = requirements.some(
-        (item) => item.subRequirements[0].name !== null
+        (item) => item.obeSubRequirements[0].name !== null
       );
       if (!this.hasSubRequirements) {
-        this.columns = requirements.map((item, index) => {
-          return { name: item.name, columnIndex: index + 1 };
+        this.columns = requirements.map((item) => {
+          return { name: item.name };
         });
         return;
       }
 
-      let cindex = 0;
       this.columns = requirements.map((item) => {
         return {
           name: item.name,
-          subRequirements: item.subRequirements.map((subr) => {
+          subRequirements: item.obeSubRequirements.map((subr) => {
             return {
-              name: subr.name + "",
-              columnIndex: ++cindex,
+              name: subr.name,
               content: subr.content,
             };
           }),

+ 9 - 4
src/modules/target/components/student-target/DetailStudentTarget.vue

@@ -33,7 +33,11 @@
       </el-form>
 
       <el-table ref="TableList" :data="dataList">
-        <el-table-column prop="courseName" label="课程名称"> </el-table-column>
+        <el-table-column label="课程名称(代码)" min-width="200">
+          <template slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </template>
+        </el-table-column>
         <el-table-column prop="semesterName" label="所属学期">
         </el-table-column>
         <el-table-column prop="score" label="期末成绩"> </el-table-column>
@@ -100,8 +104,8 @@ export default {
           );
     },
     updateChartOption() {
-      const options = {
-        color: ["#556dff", "#f59a23"],
+      const option = {
+        color: ["#3a5ae5", "#fe5d4e"],
         grid: {
           left: 40,
           top: 40,
@@ -184,7 +188,8 @@ export default {
           },
         ],
       };
-      return options;
+
+      this.chartOption = option;
     },
   },
 };

+ 13 - 7
src/modules/target/views/RequirementStatistics.vue

@@ -7,11 +7,14 @@
             <professional-select
               v-model="filter.professionalId"
               placeholder="专业"
+              default-select
+              :clearable="false"
+              @default-selected="search"
             ></professional-select>
           </el-form-item>
           <el-form-item label="培养方案名称:">
             <el-input
-              v-model.trim="filter.name"
+              v-model.trim="filter.cultureProgramName"
               placeholder="培养方案名称"
               clearable
             ></el-input>
@@ -36,11 +39,15 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="cultureProgramName" label="培养方案名称">
+        <el-table-column prop="obeCultureProgramName" label="培养方案名称">
         </el-table-column>
         <el-table-column prop="professionalName" label="专业">
         </el-table-column>
-        <el-table-column prop="targetCount" label="毕业要求达成值" width="120">
+        <el-table-column
+          prop="requirementDegree"
+          label="毕业要求达成值"
+          width="120"
+        >
         </el-table-column>
         <el-table-column
           class-name="action-column"
@@ -93,7 +100,7 @@ export default {
     return {
       filter: {
         professionalId: "",
-        name: "",
+        cultureProgramName: "",
       },
       current: 1,
       size: this.GLOBAL.pageSize,
@@ -102,13 +109,12 @@ export default {
       curRow: {},
     };
   },
-  mounted() {
-    this.toPage(1);
-  },
   methods: {
     async getList() {
       if (!this.checkPrivilege("list", "list")) return;
 
+      if (!this.filter.professionalId) return;
+
       const datas = {
         ...this.filter,
         pageNumber: this.current,