Browse Source

elective report + enroll analysis report

hare8999@163.com 2 years ago
parent
commit
ddcee65145

+ 136 - 0
src/views/career/bigdataSelectCourse/enrollReport.vue

@@ -0,0 +1,136 @@
+<template>
+  <div class="report f16">
+    <p class="mb10">{{ nickName }}同学:</p>
+    <p class="mb10">您好!</p>
+    <div style="letterSpacing:1px">
+      <span>您所在的学校开设了</span>
+      <span v-for="group in groupsDemo" :key="group.groupId">
+        {{ `${group.groupName}(${group.classCount}个班级)(${group.actualCount})` }},
+      </span>
+      <span>共计{{ groupsDemo.length }}个组合。</span>
+    </div>
+    <el-steps direction="vertical">
+      <template v-for="step in dmSteps">
+        <el-step status="process">
+          <div slot="description" class="f16">
+            <!-- 已录取 -->
+            <div v-if="step.isEnroll">
+              <div v-if="step.enrollByForce">
+                您被调剂至<span class="f-primary"> {{ step.enrollByForce.groupName }} </span>组合
+              </div>
+              <div v-else>
+                <span>您在{{ step.prevName }}时选报了</span>
+                <span class="f-primary"> {{ step.selectedList.map(item => item.groupName).join(',') }} </span>
+                组合 您在{{ step.name }}阶段被
+                <span class="f-primary"> {{ step.enrollByApprove.groupName }} </span>
+                组合录取
+              </div>
+            </div>
+            <!--    未录取   -->
+            <div v-else>
+              <div>
+                您在{{ step.prevName }}时{{ applyType(step.selectedList) }}
+                <span class="f-red">
+                  {{ step.selectedList.map(item => item.groupName).join(',') }}
+                </span>
+                , 由于条件不符未被录取
+              </div>
+              <div>
+                您在{{ step.name }}阶段未被录取,
+                <span v-if="step.noNextApply">
+                  您将在调剂阶段调剂录取
+                </span>
+                <span v-else>
+                  系统推荐您选报
+                  <span class="f-primary">
+                   {{ step.nextRecommend && step.nextRecommend.groupName }}
+                  </span>
+                  组合参与{{ step.nextName }}
+                </span>
+              </div>
+            </div>
+          </div>
+        </el-step>
+      </template>
+      <template>
+        <el-step status="process">
+          <div slot="description" class="f16">
+            选科完成后您将从原{{ dispatchInfo.originalClassName }}班,重新分班至{{ dispatchInfo.className }}班。
+          </div>
+        </el-step>
+      </template>
+    </el-steps>
+  </div>
+</template>
+
+<script>
+
+import { mapGetters } from 'vuex'
+import ElectiveTableMixin from '@/views/elective/select/components/elective-table-mixins'
+import ElectiveEnrollInfo from '@/views/elective/select/components/elective-enroll-info'
+
+export default {
+  name: 'enroll-report',
+  components: { ElectiveEnrollInfo },
+  mixins: [ElectiveTableMixin],
+  data() {
+    return {}
+  },
+  props: {
+    generation: Object,
+    optionalMajors: { type: Array, default: () => [] },
+    dispatchInfo: {
+      type: Object, default: () => {
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['nickName']),
+    groupsDemo() {
+      return this.generation.models?.first()?.models || []
+    },
+    dmSteps() {
+      if (!this.generation.models?.length) return []
+      const allOpts = Object.values(this.generation.options)
+      const dmOpts = allOpts.filter(opt => opt.stepsVisible && opt.decisionMaking)
+      const steps = dmOpts.map(opt => {
+        const genModel = this.generation.models.find(gm => gm.option == opt)
+        const prevName = allOpts.find(item => item.value == opt.value - 1).title
+        const nextName = allOpts.find(item => item.value == opt.value + 1).title
+        const nextRecommend = genModel.models.find(item => item.nextRecommend)
+        const noNextApply = opt == this.generation.options.finalAdjustDM
+        return {
+          selectedList: genModel.selectedList,
+          isEnroll: genModel.models.some(this.isGroupEnrolled),
+          enrollGroup: genModel.models.find(this.isGroupEnrolled),
+          enrollByForce: genModel.models.find(this.isGroupForceAdjusted),
+          enrollByApprove: genModel.models.find(this.isGroupApproved),
+          models: genModel.models,
+          name: opt.title,
+          noNextApply,
+          prevName,
+          nextName,
+          nextRecommend
+        }
+      })
+      const enrollIndex = steps.findIndex(step => step.isEnroll)
+      return steps.slice(0, enrollIndex + 1)
+    }
+  },
+  methods: {
+    applyType(model) {
+      if (!model.length) return '未填报'
+      return model.find(group => this.isGroupRejected(group)) ? '拒绝填报' : '选报了'
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.report {
+  color: #333;
+
+  div {
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 108 - 110
src/views/career/bigdataSelectCourse/personalDivideClass.vue

@@ -4,8 +4,8 @@
       <mx-condition ref="condition" :query-params="queryParams" :require-fields="requireFields" @query="handleQuery"
                     @invalid="handleInvalidQuery"></mx-condition>
     </el-card>
-    <el-card v-if="queryParams.roundId && rows.length"  class="box-card" >
-      <div slot="header" class="clearfix text-center f20 pb10 pt10" >
+    <el-card v-if="queryParams.roundId && rows.length" class="box-card">
+      <div slot="header" class="clearfix text-center f20 pb10 pt10">
         {{ title }}
       </div>
       <div>
@@ -36,7 +36,7 @@
       width="60"
       :close-on-click-modal="false"
     >
-      <report :generation="generation" :dispatchInfo="rows[0]" :optional-majors="optionalMajors"></report>
+      <enroll-report :generation="generation" :dispatchInfo="rows[0]" :optional-majors="optionalMajors"></enroll-report>
       <elective-sign ref="sign" :flowId="rows[0] ? rows[0].flowId : ''"></elective-sign>
       <span slot="footer" class="dialog-footer">
         <el-button type="primary" @click="handleGenerate">确 定</el-button>
@@ -50,115 +50,113 @@
 import { classesResult, getRound } from '@/api/webApi/elective/dispatch'
 import MxCondition from '@/components/MxCondition/mx-condition'
 import RoundSelect from '@/views/system/user/profile/round-select'
-import Report from './report'
+import EnrollReport from './enrollReport'
 import ElectiveSign from './electiveSign'
 import { mapGetters } from 'vuex'
- export default {
-   components:{MxCondition,Report,ElectiveSign},
-   mixins:[RoundSelect],
-   data(){
-     return{
-       dialogVisible:false,
-       rows: [],
-       requireFields: ['year', 'roundId'],
-       queryParams: {
-         year: '',
-         roundId: ''
-       },
-       activeStep:'forceAdjust',
-       round: {},
-       propsDefines: {
-         year: {
-           label:'学年'
-         },
-         groupName: {
-           label:'选择组合'
-         },
-         name: {
-           label:'姓名'
-         },
-         originalClassName: {
-           label:'原班级'
-         },
-         className: {
-           label:'新班级'
-         },
-         tips: {
-           label:'新班报道备注',
-           slot: 'tips'
-         },
-       }
-     }
-   },
-   computed:{
-     apply(){
-       return this.appliedModel.selectedList.map(item => item.groupName)
-     },
-     ...mapGetters(['school','nickName']),
-     title(){
-        const store  = this.$store.getters
-        if(!store) return  ''
-        console.log(store)
-        return `${this.school.schoolName}${this.round.name}分班信息  ${store.nickName}同学`
-     },
-     isSign() {
-        if(!this.rows.length) return false
-        return this.rows[0].statusText == '分班完成'
-     },
-     tips() {
-       if(!this.isSign) return ''
-       return `通知:${this.nickName}同学您的新班级信息于${this.rows[0].activeDate}点生效`
-     }
-   },
-   methods: {
-     handleQuery() {
-       this.getRound()
-       this.getInfo()
-     },
-     toSign() {
-       if(!this.rows[0].flowId) {
-         this.$message.error(this.rows[0].statusText)
-         return
-       }
-       this.dialogVisible = true
-     },
-     // 获取批次的组合
-     getRound() {
-       getRound({
-         year:this.queryParams.year,
-         round:this.queryParams.roundId,
-       }).then(res => {
-         this.round = res.data
-       })
-     },
-     getInfo() {
-       classesResult({
-         roundId: this.queryParams.roundId
-       }).then(res =>{
-         this.rows= res.rows.map(item => {
-           item.year = this.queryParams.year
-           return item
-         })
-         console.log(res)
-       })
-     },
-     showDispatchInfo() {
-       if(this.rows[0].statusText != '分班完成'){
-         this.$message.warning(this.rows[0].statusText )
-         return
-       }
-     },
-     handleGenerate() {
-       this.$refs.sign.handleGenerate(res=> {
-         this.dialogVisible = false
-         this.getInfo()
-       })
-     },
-     handleInvalidQuery() {
-       this.rows = []
-     }
-   }
- }
+
+export default {
+  components: { MxCondition, EnrollReport, ElectiveSign },
+  mixins: [RoundSelect],
+  data() {
+    return {
+      dialogVisible: false,
+      rows: [],
+      requireFields: ['year', 'roundId'],
+      queryParams: {
+        year: '',
+        roundId: ''
+      },
+      activeStep: 'forceAdjust',
+      round: {},
+      propsDefines: {
+        year: {
+          label: '学年'
+        },
+        groupName: {
+          label: '选择组合'
+        },
+        name: {
+          label: '姓名'
+        },
+        originalClassName: {
+          label: '原班级'
+        },
+        className: {
+          label: '新班级'
+        },
+        tips: {
+          label: '新班报道备注',
+          slot: 'tips'
+        }
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['school', 'nickName']),
+    apply() {
+      return this.appliedModel.selectedList.map(item => item.groupName)
+    },
+    title() {
+      return `${this.school.schoolName}${this.round.name}分班信息  ${this.nickName}同学`
+    },
+    isSign() {
+      if (!this.rows.length) return false
+      return this.rows[0].statusText == '分班完成'
+    },
+    tips() {
+      if (!this.isSign) return ''
+      return `通知:${this.nickName}同学您的新班级信息于${this.rows[0].activeDate}点生效`
+    }
+  },
+  methods: {
+    handleQuery() {
+      this.getRound()
+      this.getInfo()
+    },
+    toSign() {
+      if (!this.rows[0].flowId) {
+        this.$message.error(this.rows[0].statusText)
+        return
+      }
+      this.dialogVisible = true
+    },
+    // 获取批次的组合
+    getRound() {
+      getRound({
+        year: this.queryParams.year,
+        round: this.queryParams.roundId
+      }).then(res => {
+        this.round = res.data
+      })
+    },
+    getInfo() {
+      classesResult({
+        roundId: this.queryParams.roundId
+      }).then(res => {
+        this.rows = res.rows.map(item => {
+          item.year = this.queryParams.year
+          return item
+        })
+        console.log(res)
+      })
+    },
+    showDispatchInfo() {
+      if (this.rows[0].statusText != '分班完成') {
+        this.$message.warning(this.rows[0].statusText)
+        return
+      }
+    },
+    handleGenerate() {
+      this.$refs.sign.handleGenerate(res => {
+        this.dialogVisible = false
+        this.getInfo()
+      })
+    },
+    handleInvalidQuery() {
+      this.rows = []
+    }
+  }
+}
 </script>
 <style>
 

+ 0 - 138
src/views/career/bigdataSelectCourse/report.vue

@@ -1,138 +0,0 @@
-<template>
-  <div class="report f16">
-    <p class="mb10">{{ nickName }}同学:</p>
-    <p class="mb10">您好!</p>
-    <div style="letterSpacing:1px">
-      <span>您所在的学校开设了</span>
-      <span v-for="item in stepOne">{{ `${item.groupName}(${item.classCount}个班级)(${item.count})` }},</span>
-      <span>共计{{ stepOne.length }}个组合。</span>
-    </div>
-    <el-steps direction="vertical"  >
-      <template v-for="(result,index) in allResult">
-        <el-step v-if="index <= allResult.findIndex(item => item.isEnroll)" status="process">
-          <div slot="description" class="f16">
-            <!-- 已录取 -->
-            <div v-if="result.isEnroll">
-              <div v-if="result.model.find(item => item.forceAdjusted)">
-                 您被调剂至<span class="f-primary"> {{ result.groupList.map(item => item.groupName).toString(',') }} </span>组合
-              </div>
-              <div v-else>
-                <span>您在{{ result.name }}时报选了</span><span class="f-primary"
-              > {{ result.groupList.map(item => item.groupName).toString(',') }} </span>组合
-                您在{{ result.name }}阶段被 <span class="f-primary"
-              > {{ result.groupList.filter(item => item.approved).map(item => item.groupName).toString(',') }} </span>组合录取
-              </div>
-            </div>
-            <!--    未录取   -->
-            <div v-else>
-              <div>
-                您在{{ result.name }}时{{applyType(result.groupList)}}
-                <span class="f-red">
-                  {{ result.groupList.map(item => item.groupName).toString(',') }}
-                </span>
-                , 由于条件不符未被录取
-              </div>
-              <div>
-                您在{{ result.name }}未被录取,
-                <span v-if="result.name == '二次补录报名'">
-                  您将在调剂阶段调剂录取
-                </span>
-                <span v-else>
-                  系统推荐您选报
-                  <span class="f-primary">
-                   {{ result.model.find(item => item.nextRecommend) ? result.model.find(item => item.nextRecommend).groupName : '' }}</span>
-                  组合参与{{allResult[index + 1].name}}
-                </span>
-              </div>
-            </div>
-          </div>
-        </el-step>
-      </template>
-      <template>
-        <el-step status="process">
-          <div slot="description" class="f16">
-            选科完成后您将从原{{ dispatchInfo.originalClassName }}班,重新分班至{{ dispatchInfo.className }}班。
-          </div>
-        </el-step>
-      </template>
-    </el-steps>
-  </div>
-</template>
-
-<script>
-
-import { mapGetters } from 'vuex'
-import ElectiveTableMixin from '@/views/elective/select/components/elective-table-mixins'
-import ElectiveEnrollInfo from '@/views/elective/select/components/elective-enroll-info'
-
-export default {
-  components: { ElectiveEnrollInfo },
-  mixins: [ElectiveTableMixin],
-  data() {
-    return {}
-  },
-  props: {
-    generation: Object,
-    optionalMajors: { type: Array, default: () => [] },
-    dispatchInfo: {
-      type: Object, default: () => {
-      }
-    }
-  },
-  computed: {
-    ...mapGetters(['nickName']),
-    stepOne() {
-      return this.generation.models[0].models.map(item => {
-        return {
-          groupName: item.groupName,
-          classCount: item.classCount,
-          count: item.actualCount
-        }
-      })
-    },
-    allResult() {
-      let options = [
-        {
-          key: 'primaryDM',
-          value: '初录报名'
-        },
-        {
-          key: 'backTrackingDM',
-          value: '补录报名'
-        },
-        {
-          key: 'finalAdjustDM',
-          value: '二次补录报名'
-        },
-        {
-          key: 'forceAdjust',
-          value: '调剂'
-        }]
-      return options.map(item => {
-        let result = this.generation.models.find(i => i.generation == this.generation.options[item.key].value)
-        let name = item.value
-        return {
-          groupList: result.selectedList,
-          isEnroll: result.selectedList.findIndex(group => this.isGroupEnrolled(group)) != -1,
-          name: name,
-          model: result.models
-        }
-      })
-    }
-  },
-  methods: {
-    applyType(model){
-      if(!model.length) return '未填报'
-      return model.find(group => this.isGroupRejected(group)) ? '拒绝填报' : '报选了'
-    }
-  }
-}
-</script>
-<style lang="scss" scoped>
-.report {
-  color: #333;
-  div {
-    margin-bottom: 10px;
-  }
-}
-</style>

+ 43 - 0
src/views/elective/report/components/elective-enroll-analysis.vue

@@ -0,0 +1,43 @@
+<template>
+  <enroll-report :generation="generation" :optional-majors="optionalMajors"
+                 :dispatch-info="dispatchInfo"></enroll-report>
+</template>
+
+<script>
+import EnrollReport from '@/views/career/bigdataSelectCourse/enrollReport'
+import { classesResult } from '@/api/webApi/elective/dispatch'
+
+export default {
+  name: 'elective-enroll-analysis',
+  inject: ['getGeneration', 'getOptionalMajors'],
+  components: { EnrollReport },
+  data() {
+    return {
+      dispatchInfo: {}
+    }
+  },
+  computed: {
+    generation() {
+      return this.getGeneration() || {}
+    },
+    optionalMajors() {
+      return this.getOptionalMajors() || []
+    }
+  },
+  watch: {
+    'generation': function(newVal) {
+      if (newVal?.status?.roundId) this.loadDispatchInfo()
+    }
+  },
+  methods: {
+    loadDispatchInfo() {
+      const { year, roundId } = this.generation.status
+      classesResult({ year, roundId }).then(res => this.dispatchInfo = res.rows.first())
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 27 - 13
src/views/elective/report/index.vue

@@ -1,18 +1,22 @@
 <template>
   <div class="app-container fx-column fx-sta-cen">
     <div class="elective-report-container">
-      <el-divider><h1>选科测评报告</h1></el-divider>
-      <elective-test-reports></elective-test-reports>
-      <el-divider><h1>选科大数据分析</h1></el-divider>
-      <group-subject-query></group-subject-query>
-      <el-divider><h1>自选专业</h1></el-divider>
-      <major-match-optional></major-match-optional>
-      <el-divider><h1>专业介绍</h1></el-divider>
-      <major-introduce-batch></major-introduce-batch>
-      <el-divider><h1>选科成绩表</h1></el-divider>
-      <group-score-table></group-score-table>
-      <el-divider><h1>选科进程表</h1></el-divider>
-      <elective-flow-table></elective-flow-table>
+      <template v-if="false">
+        <el-divider><h1>选科测评报告</h1></el-divider>
+        <elective-test-reports></elective-test-reports>
+        <el-divider><h1>选科大数据分析</h1></el-divider>
+        <group-subject-query></group-subject-query>
+        <el-divider><h1>自选专业</h1></el-divider>
+        <major-match-optional></major-match-optional>
+        <el-divider><h1>专业介绍</h1></el-divider>
+        <major-introduce-batch></major-introduce-batch>
+        <el-divider><h1>选科成绩表</h1></el-divider>
+        <group-score-table></group-score-table>
+        <el-divider><h1>选科进程表</h1></el-divider>
+        <elective-flow-table></elective-flow-table>
+      </template>
+      <el-divider><h1>选科录取分析报告</h1></el-divider>
+      <elective-enroll-analysis></elective-enroll-analysis>
     </div>
   </div>
 </template>
@@ -26,11 +30,21 @@ import MajorMatchOptional from '@/views/elective/report/components/major-match-o
 import MajorIntroduceBatch from '@/views/elective/report/components/major-introduce-batch'
 import GroupScoreTable from '@/views/elective/report/components/group-score-table'
 import ElectiveFlowTable from '@/views/elective/report/components/elective-flow-table'
+import ElectiveEnrollAnalysis from '@/views/elective/report/components/elective-enroll-analysis'
 
 export default {
   name: 'report-index',
   extends: RoundSelect,
-  components: { ElectiveFlowTable, GroupScoreTable, MajorIntroduceBatch, MajorMatchOptional, RoundSelect, GroupSubjectQuery, ElectiveTestReports },
+  components: {
+    ElectiveEnrollAnalysis,
+    ElectiveFlowTable,
+    GroupScoreTable,
+    MajorIntroduceBatch,
+    MajorMatchOptional,
+    RoundSelect,
+    GroupSubjectQuery,
+    ElectiveTestReports
+  },
   data() {
     // TODO: 报告应该与学年和轮次相关,先暂时渲染出最近的轮次数据
     return {