zhangjie 1 рік тому
батько
коміт
73b9f2c70e

+ 1 - 1
src/modules/course/router.js

@@ -11,7 +11,7 @@ export default [
   },
   {
     path: "/course/target-report-manage",
-    name: "TargetReportManage",
+    name: "CourseTargetReportManage",
     component: TargetReportManage,
   },
   {

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

@@ -118,6 +118,9 @@ export const updateCourseOutlineTarget = (datas) => {
 export const updateCourseOutlineTargetPredict = (datas) => {
   return $post("/api/admin/obe/course_target/setting_expect_value", datas);
 };
+export const courseOutlineTargetRequirementList = (datas) => {
+  return $postParam("/api/admin/obe/course_target/sub_requirement/list", datas);
+};
 export const courseOutlineTargetKnowledgeList = (datas) => {
   return $postParam("/api/admin/obe/course_target/dimension_tree", datas);
 };
@@ -212,11 +215,8 @@ export const targetStatisticsChangeCheck = (datas) => {
 };
 // 学生毕业要求达成度 ------------------->
 export const studentTargetListPage = (datas) => {
-  return $postParam("/api/admin/course/degree/report/list", datas);
+  return $postParam("/api/admin/obe/student_requirement/page", datas);
 };
 export const studentTargetDetail = (datas) => {
   return $postParam("/api/admin/course/degree/report/view", datas);
 };
-export const studentSemesterTargetList = (datas) => {
-  return $postParam("/api/admin/course/degree/report/view", datas);
-};

+ 4 - 0
src/modules/target/components/course-examine/CourseExamineWeight.vue

@@ -82,6 +82,8 @@ export default {
   },
   methods: {
     async initData() {
+      this.dataList = [];
+      this.columns = [];
       await this.getList();
     },
     async getList() {
@@ -90,6 +92,8 @@ export default {
       });
       const dataList = res.submitForm || [];
 
+      if (!dataList[0]) return;
+
       this.columns = dataList[0].evaluationList.map(
         (item) => item.evaluationName
       );

+ 2 - 0
src/modules/target/components/course-outline/CourseOutlineTarget.vue

@@ -120,6 +120,7 @@ export default {
       this.curRow = {
         obeCourseOutlineId: this.rowData.id,
         cultureProgramId: this.rowData.cultureProgramId,
+        courseId: this.rowData.courseId,
       };
       this.$refs.ModifyCourseOutlineTarget.open();
     },
@@ -131,6 +132,7 @@ export default {
         ...row,
         obeCourseOutlineId: this.rowData.id,
         cultureProgramId: this.rowData.cultureProgramId,
+        courseId: this.rowData.courseId,
       };
       this.$refs.ModifyCourseOutlineTarget.open();
     },

+ 5 - 2
src/modules/target/components/course-outline/ModifyCourseOutlineTarget.vue

@@ -31,13 +31,16 @@
         >
           <requirement-select
             v-model="modalForm.obeCultureProgramRequirementId"
-            :filter-param="{ cultureProgramId: instance.cultureProgramId }"
+            :filter-param="{
+              cultureProgramId: instance.cultureProgramId,
+              courseId: instance.courseId,
+            }"
             @change="requirementChange"
           ></requirement-select>
 
           <el-button
             type="text"
-            class="btn-act-primary"
+            class="btn-act-primary ml-1"
             icon="el-icon-circle-plus-outline"
             @click="toSelectDimension"
             >选择知识点</el-button

+ 6 - 7
src/modules/target/components/course-outline/RequirementSelect.vue

@@ -82,7 +82,7 @@
 </template>
 
 <script>
-import { trainingPlanRequirementListPage } from "../../api";
+import { courseOutlineTargetRequirementList } from "../../api";
 import Clickoutside from "element-ui/src/utils/clickoutside";
 
 export default {
@@ -122,7 +122,7 @@ export default {
       inputHovering: false,
       orgs: [],
       defaultProps: {
-        label: "label",
+        label: "name",
       },
     };
   },
@@ -145,14 +145,11 @@ export default {
   },
   methods: {
     async getList() {
-      const data = await trainingPlanRequirementListPage(this.filterParam);
+      const data = await courseOutlineTargetRequirementList(this.filterParam);
       this.orgs = (data || []).map((item) => {
-        item.label = `${item.sortNum}.${item.name}`;
-        item.children = item.subRequirementList.map((elem) => {
+        item.children = item.subRequirements.map((elem) => {
           const nelem = { ...elem };
-          nelem.label = `指标点${item.sortNum}-${elem.sortNum}`;
           nelem.parentName = item.name;
-          delete nelem.subRequirementList;
           return nelem;
         });
         return item;
@@ -218,6 +215,8 @@ export default {
       this.emitChange();
     },
     nodeClick(data) {
+      if (data.children) return;
+
       if (!this.multiple) {
         this.selectedOrg = { ...data };
         this.selectedOrgList = [{ ...data }];

+ 19 - 20
src/modules/target/components/student-target/DetailStudentTarget.vue

@@ -6,7 +6,6 @@
     :close-on-press-escape="false"
     append-to-body
     fullscreen
-    @close="closeHandle"
   >
     <div slot="title">{{ rowData.name }}毕业要求达成情况</div>
 
@@ -34,9 +33,10 @@
       </el-form>
 
       <el-table ref="TableList" :data="dataList">
-        <el-table-column prop="name" label="课程名称"> </el-table-column>
-        <el-table-column prop="name" label="所属学期"> </el-table-column>
-        <el-table-column prop="name" label="期末成绩"> </el-table-column>
+        <el-table-column prop="courseName" label="课程名称"> </el-table-column>
+        <el-table-column prop="semesterName" label="所属学期">
+        </el-table-column>
+        <el-table-column prop="score" label="期末成绩"> </el-table-column>
         <el-table-column
           v-for="(column, cindex) in columns"
           :key="cindex"
@@ -54,7 +54,7 @@
 </template>
 
 <script>
-import { studentTargetDetail, studentSemesterTargetList } from "../../api";
+import { studentTargetDetail } from "../../api";
 
 export default {
   name: "detail-requirement-statistics",
@@ -83,12 +83,21 @@ export default {
     open() {
       this.modalIsShow = true;
     },
-    async getDetail() {
+    async search() {
       const res = await studentTargetDetail({
         cultureProgramId: this.rowData.id,
+        studentCode: this.rowData.studentCode,
+        ...this.filter,
       });
-      this.dataList = res || [];
+      this.dataList = res.studentTotalRequirementList || [];
       this.updateChartOption();
+
+      this.tableData = res.studentCourseRequirementList || [];
+      this.columns = !this.tableData[0]
+        ? []
+        : this.tableData[0].requirementDetailList.map(
+            (item) => item.requirementName
+          );
     },
     updateChartOption() {
       const options = {
@@ -114,7 +123,7 @@ export default {
           nameTextStyle: {
             color: "#363D59",
           },
-          data: this.courseTargetList.map((item) => item.targetName),
+          data: this.dataList.map((item) => item.requirementName),
           axisLabel: {
             color: "#6F7482",
             interval: 0,
@@ -165,28 +174,18 @@ export default {
             name: "个人达成情况",
             type: "bar",
             barWidth: 20,
-            data: this.courseTargetList.map((item) => item.evaluationValue),
+            data: this.dataList.map((item) => item.studentDegree),
           },
           {
             name: "专业达成情况",
             type: "bar",
             barWidth: 20,
-            data: this.courseTargetList.map((item) => item.evaluationValue),
+            data: this.dataList.map((item) => item.professionalDegree),
           },
         ],
       };
       return options;
     },
-    async search() {
-      if (!this.filter.semesterId) return;
-
-      const res = await studentSemesterTargetList(this.filter);
-      this.tableData = res || [];
-
-      this.columns = !this.tableData[0]
-        ? []
-        : this.tableData[0].requirements.map((item) => item.name);
-    },
   },
 };
 </script>

+ 1 - 1
src/modules/target/components/target-statistics/DetailTargetStatistics.vue

@@ -381,7 +381,7 @@ import {
   targetStatisticsReport,
   targetStatisticsSave,
   targetStatisticsChangeCheck,
-} from "../api";
+} from "../../api";
 import { downloadByApi } from "@/plugins/download";
 import { calcSum } from "@/plugins/utils";
 

+ 0 - 2
src/modules/target/components/training-plan/ModifyTrainingPlan.vue

@@ -27,7 +27,6 @@
         <professional-select
           v-model="modalForm.professionalId"
           placeholder="所属专业"
-          :org-id="userOrgId"
         ></professional-select>
       </el-form-item>
     </el-form>
@@ -63,7 +62,6 @@ export default {
     return {
       modalIsShow: false,
       isSubmit: false,
-      userOrgId: this.$ls.get("orgId", ""),
       modalForm: { ...initModalForm },
       rules: {
         name: [

+ 18 - 0
src/modules/target/router.js

@@ -1,6 +1,9 @@
 import TrainingPlanManage from "./views/TrainingPlanManage.vue";
 import CourseOutlineManage from "./views/CourseOutlineManage.vue";
 import CourseExamine from "./views/CourseExamine.vue";
+import StudentTarget from "./views/StudentTarget.vue";
+import TargetStatistics from "./views/TargetStatistics.vue";
+import RequirementStatistics from "./views/RequirementStatistics.vue";
 
 export default [
   {
@@ -18,4 +21,19 @@ export default [
     name: "CourseAssessmentSetting",
     component: CourseExamine,
   },
+  {
+    path: "/target/requirement-statistics",
+    name: "GraduationRequirement",
+    component: RequirementStatistics,
+  },
+  {
+    path: "/target/target-statistics",
+    name: "TargetReportManage",
+    component: TargetStatistics,
+  },
+  {
+    path: "/target/student-target",
+    name: "StudentRequirement",
+    component: StudentTarget,
+  },
 ];

+ 0 - 1
src/modules/target/views/CourseExamine.vue

@@ -122,7 +122,6 @@ export default {
       total: 0,
       dataList: [],
       curRow: {},
-      userOrgId: this.$ls.get("orgId", ""),
     };
   },
   mounted() {

+ 0 - 1
src/modules/target/views/CourseOutlineManage.vue

@@ -162,7 +162,6 @@ export default {
       total: 0,
       dataList: [],
       curRow: {},
-      userOrgId: this.$ls.get("orgId", ""),
     };
   },
   mounted() {

+ 12 - 8
src/modules/target/views/RequirementStatistics.vue

@@ -4,12 +4,15 @@
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <template v-if="checkPrivilege('condition', 'condition')">
           <el-form-item label="专业:">
-            <org-select v-model="filter.orgId" placeholder="学院"></org-select>
+            <professional-select
+              v-model="filter.professionalId"
+              placeholder="专业"
+            ></professional-select>
           </el-form-item>
-          <el-form-item label="专业名称:">
+          <el-form-item label="培养方案名称:">
             <el-input
               v-model.trim="filter.name"
-              placeholder="专业名称"
+              placeholder="培养方案名称"
               clearable
             ></el-input>
           </el-form-item>
@@ -33,7 +36,8 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="name" label="培养方案名称"> </el-table-column>
+        <el-table-column prop="cultureProgramName" label="培养方案名称">
+        </el-table-column>
         <el-table-column prop="professionalName" label="专业">
         </el-table-column>
         <el-table-column prop="targetCount" label="毕业要求达成值" width="120">
@@ -79,7 +83,7 @@
 </template>
 
 <script>
-import { trainingPlanListPage } from "../api";
+import { requirementStatisticsListPage } from "../api";
 import DetailRequirementStatistics from "../components/requirement-statistics/DetailRequirementStatistics.vue";
 
 export default {
@@ -88,8 +92,8 @@ export default {
   data() {
     return {
       filter: {
-        orgId: "",
-        professionalName: "",
+        professionalId: "",
+        name: "",
       },
       current: 1,
       size: this.GLOBAL.pageSize,
@@ -110,7 +114,7 @@ export default {
         pageNumber: this.current,
         pageSize: this.size,
       };
-      const data = await trainingPlanListPage(datas);
+      const data = await requirementStatisticsListPage(datas);
       this.dataList = data.records;
       this.total = data.total;
     },

+ 21 - 14
src/modules/target/views/StudentTarget.vue

@@ -3,11 +3,19 @@
     <div class="part-box part-box-filter part-box-flex">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <template v-if="checkPrivilege('condition', 'condition')">
-          <secp-select
-            v-model="filter"
-            defaultSelectExam
-            @exam-default="search"
-          ></secp-select>
+          <el-form-item label="培养方案:">
+            <training-plan-select
+              v-model="filter.cultureProgramId"
+              placeholder="培养方案"
+            ></training-plan-select>
+          </el-form-item>
+          <el-form-item label="学生学号/姓名:">
+            <el-input
+              v-model.trim="filter.studentCodeOrName"
+              placeholder="学生学号/姓名"
+              clearable
+            ></el-input>
+          </el-form-item>
         </template>
         <el-form-item label-width="0px">
           <el-button
@@ -28,11 +36,10 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="name" label="姓名"> </el-table-column>
-        <el-table-column prop="code" label="学号"> </el-table-column>
-        <el-table-column prop="college" label="学院"> </el-table-column>
-        <el-table-column prop="professionalName" label="专业">
-        </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="collegeName" label="学院"> </el-table-column>
+        <el-table-column prop="majorName" label="专业"> </el-table-column>
         <el-table-column
           class-name="action-column"
           label="操作"
@@ -41,7 +48,7 @@
         >
           <template slot-scope="scope">
             <el-button
-              v-if="checkPrivilege('link', 'View')"
+              v-if="checkPrivilege('link', 'Detail')"
               class="btn-primary"
               type="text"
               @click="toDetail(scope.row)"
@@ -66,6 +73,7 @@
     </div>
     <!-- DetailStudentTarget -->
     <detail-student-target
+      v-if="checkPrivilege('link', 'Detail')"
       ref="DetailStudentTarget"
       :row-data="curRow"
     ></detail-student-target>
@@ -82,9 +90,8 @@ export default {
   data() {
     return {
       filter: {
-        semesterId: "",
-        examId: "",
-        courseCode: "",
+        cultureProgramId: "",
+        studentCodeOrName: "",
       },
       current: 1,
       size: this.GLOBAL.pageSize,

+ 23 - 9
src/modules/target/views/TargetStatistics.vue

@@ -3,11 +3,21 @@
     <div class="part-box part-box-filter part-box-flex">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <template v-if="checkPrivilege('condition', 'condition')">
-          <secp-select
-            v-model="filter"
-            defaultSelectExam
-            @exam-default="search"
-          ></secp-select>
+          <el-form-item label="培养方案:">
+            <training-plan-select
+              v-model="filter.cultureProgramId"
+              placeholder="培养方案"
+              @change="trainingPlanChange"
+            ></training-plan-select>
+          </el-form-item>
+          <el-form-item label="课程:">
+            <training-plan-course-select
+              v-model="filter.courseId"
+              placeholder="课程"
+              :professional-id="filter.professionalId"
+              :culture-program-id="filter.cultureProgramId"
+            ></training-plan-course-select>
+          </el-form-item>
         </template>
         <el-form-item label-width="0px">
           <el-button
@@ -52,7 +62,7 @@
         >
           <template slot-scope="scope">
             <el-button
-              v-if="checkPrivilege('link', 'View')"
+              v-if="checkPrivilege('link', 'detail')"
               class="btn-primary"
               type="text"
               @click="toDetail(scope.row)"
@@ -77,6 +87,7 @@
     </div>
     <!-- DetailTargetStatistics -->
     <detail-target-statistics
+      v-if="checkPrivilege('link', 'detail')"
       ref="DetailTargetStatistics"
       :course="curRow"
     ></detail-target-statistics>
@@ -93,9 +104,9 @@ export default {
   data() {
     return {
       filter: {
-        semesterId: "",
-        examId: "",
-        courseCode: "",
+        professionalId: "",
+        cultureProgramId: "",
+        courseId: "",
       },
       current: 1,
       size: this.GLOBAL.pageSize,
@@ -124,6 +135,9 @@ export default {
     search() {
       this.toPage(1);
     },
+    trainingPlanChange(val) {
+      this.filter.professionalId = val?.professionalId;
+    },
     toDetail(row) {
       this.curRow = row;
       this.$refs.DetailTargetStatistics.open();

+ 0 - 2
src/modules/target/views/TrainingPlanManage.vue

@@ -7,7 +7,6 @@
             <professional-select
               v-model="filter.professionalId"
               placeholder="专业"
-              :org-id="userOrgId"
             ></professional-select>
           </el-form-item>
           <el-form-item label="培养方案名称:">
@@ -155,7 +154,6 @@ export default {
       total: 0,
       dataList: [],
       curRow: {},
-      userOrgId: this.$ls.get("orgId", ""),
     };
   },
   mounted() {