浏览代码

student elective - enroll info re-constructor

hare8999@163.com 2 年之前
父节点
当前提交
9e44088493

+ 13 - 0
src/views/elective/select/index.vue

@@ -0,0 +1,13 @@
+<template>
+
+</template>
+
+<script>
+export default {
+  name: 'index'
+}
+</script>
+
+<style scoped>
+
+</style>

+ 65 - 0
src/views/system/user/profile/components/elective-enroll-info.vue

@@ -0,0 +1,65 @@
+<template>
+  <p>
+    <template v-if="!appliedModel.selectedList.length">
+      您在{{ appliedModel.option.title }}阶段未填报志愿
+    </template>
+    <template v-else-if="appliedModel.selectedList.some(m=>m.rejected)">
+      您在{{ appliedModel.option.title }}阶段拒绝填报志愿
+    </template>
+    <template v-else>
+      您在{{ appliedModel.option.title }}阶段填报的
+      <span v-for="group in appliedModel.selectedList" :key="group.groupId"
+            :class="{'f-primary':activeGroup(group),'f-red':!activeGroup(group)}">
+        {{ group.groupName }}
+      </span>
+    </template>
+    <template v-if="enrolled">
+      <span v-if="appliedModel.selectedList.length == 1">
+        符合条件 已被录取
+      </span>
+      <span v-else-if="appliedModel.selectedList.length > 1">
+        其中{{ enrollStatus.enrolledGroup.groupName }}符合条件 已被录取
+      </span>
+      <template v-else-if="appliedModel.nextModel.selectedList.length == 1">
+        但系统按推荐组合 <span class="f-primary">{{ appliedModel.nextModel.selectedList.first().groupName }}</span> 进行了录取
+      </template>
+    </template>
+    <template v-else>
+      <span v-if="appliedModel.selectedList.length">不符合条件</span>未被录取
+    </template>
+    <template v-if="enableSelect">
+      现有以下标黄组合可以重新报名
+    </template>
+  </p>
+</template>
+
+<script>
+export default {
+  name: 'elective-enroll-info',
+  props: ['generation', 'enrollStatus'],
+  computed: {
+    enrolled() {
+      return !!this.enrollStatus?.enrolledGroup
+    },
+    appliedModel() {
+      let appliedModel = this.enrollStatus?.enrolledModel || this.generation.activeModel.prevModel
+      if (appliedModel.option.decisionMaking) appliedModel = appliedModel.prevModel
+      return appliedModel
+    },
+    enableSelect() {
+      return !this.enrolled &&
+        this.generation.active == this.generation.current &&
+        !this.generation.activeOpt.decisionMaking
+    }
+  },
+  methods: {
+    activeGroup(group) {
+      return this.enrolled && group.groupId == this.enrollStatus.enrolledGroup.groupId
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 30 - 24
src/views/system/user/profile/components/report-table.vue

@@ -1,14 +1,12 @@
 <template>
 <template>
   <div>
   <div>
-    <div class="mb10 fx-row fx-end-base jc-between">
+    <div class="mb10 fx-row fx-bet-cen">
       <div class="fx-row fx-end-cen">
       <div class="fx-row fx-end-cen">
-        <slot name="header-prefix"></slot>
-        <p v-if="generation.active > 1" v-html="currentSupplyInfo"></p>
-      </div>
-      <div>
-        <el-button v-if="aiButtonShow" type="primary" @click="toAiAnalysis">AI分析</el-button>
-        <!--        <el-button>选科历史记录</el-button>-->
+        <el-button circle icon="el-icon-refresh" @click="refreshData" class="mr30"></el-button>
+        <elective-enroll-info v-if="enrollInfoVisible" :generation="generation"
+                              :enroll-status="enrollStatus"></elective-enroll-info>
       </div>
       </div>
+      <el-button v-if="enableAIFeature" type="primary" @click="toAiAnalysis">AI分析</el-button>
     </div>
     </div>
 
 
     <mx-table :propDefines="formatCols" :rows="formatRows">
     <mx-table :propDefines="formatCols" :rows="formatRows">
@@ -17,7 +15,7 @@
       </template>
       </template>
       <template #group="{row}">
       <template #group="{row}">
         <over-under-badge :value="row.isRecommend?1:0" over-text="荐" over-type="success">
         <over-under-badge :value="row.isRecommend?1:0" over-text="荐" over-type="success">
-          <el-tag size="medium" :type="isGroupOverSetting(row) ? 'danger' : 'warning'">{{ row.groupName }}</el-tag>
+          <el-tag size="medium" :type="row.allowSelect ? 'warning' : 'danger'">{{ row.groupName }}</el-tag>
         </over-under-badge>
         </over-under-badge>
       </template>
       </template>
       <template #temp="{row}">
       <template #temp="{row}">
@@ -133,7 +131,8 @@
     <esign-dialog ref="esignDialog"></esign-dialog>
     <esign-dialog ref="esignDialog"></esign-dialog>
     <choose-subject-dialog ref="chooseDialog"></choose-subject-dialog>
     <choose-subject-dialog ref="chooseDialog"></choose-subject-dialog>
     <select-subject-report-dialog ref="reportDialog"></select-subject-report-dialog>
     <select-subject-report-dialog ref="reportDialog"></select-subject-report-dialog>
-    <Ai-dialog ref="aiDialog" :optionalMajors="optionalMajors" :prevPreferencesInfo="currentSupplyInfo" :generation="generation"></Ai-dialog>
+    <Ai-dialog ref="aiDialog" :optionalMajors="optionalMajors" :prevPreferencesInfo="currentSupplyInfo"
+               :generation="generation"></Ai-dialog>
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
@@ -146,6 +145,7 @@ import EsignDialog from '@/views/system/user/profile/components/esign-dialog'
 import ReportStep from './report-step'
 import ReportStep from './report-step'
 import OverUnderBadge from '@/views/elective/publish/components/steps/fauclty/over-under-badge'
 import OverUnderBadge from '@/views/elective/publish/components/steps/fauclty/over-under-badge'
 import { rejectRecommend, submitElectiveModels } from '@/api/webApi/elective/selected-subject'
 import { rejectRecommend, submitElectiveModels } from '@/api/webApi/elective/selected-subject'
+import ElectiveEnrollInfo from '@/views/system/user/profile/components/elective-enroll-info'
 
 
 const resolverModules = require.context('./round-select-resolvers', false, /\.js$/)
 const resolverModules = require.context('./round-select-resolvers', false, /\.js$/)
 const resolvers = resolverModules.keys().map(key => resolverModules(key).default)
 const resolvers = resolverModules.keys().map(key => resolverModules(key).default)
@@ -157,6 +157,7 @@ export default {
     optionalMajors: { type: Array, default: () => [] }
     optionalMajors: { type: Array, default: () => [] }
   },
   },
   components: {
   components: {
+    ElectiveEnrollInfo,
     OverUnderBadge,
     OverUnderBadge,
     SelectSubjectReportDialog,
     SelectSubjectReportDialog,
     ReportStep,
     ReportStep,
@@ -168,7 +169,6 @@ export default {
   inject: {
   inject: {
     'refreshData': {
     'refreshData': {
       default: function() {
       default: function() {
-        // do nothing
       }
       }
     }
     }
   },
   },
@@ -176,7 +176,6 @@ export default {
   data() {
   data() {
     return {
     return {
       popoShow: false,
       popoShow: false,
-      activeStep: '',
       regInfo: '', // 拒绝原因
       regInfo: '', // 拒绝原因
       dialogVisible: false,
       dialogVisible: false,
       singleList: [], // 单志愿列表
       singleList: [], // 单志愿列表
@@ -184,6 +183,24 @@ export default {
     }
     }
   },
   },
   computed: {
   computed: {
+    enrollInfoVisible() {
+      return this.generation.active > this.generation.options.primary.value
+    },
+    enrollStatus() {
+      const enrolledGroup = this.generation.activeModel.models?.find(m => m.approved || m.forceAdjusted)
+      if (enrolledGroup) {
+        let enrolledModel = this.generation.activeModel
+        do {
+          const matched = enrolledModel.models?.find(m => m.groupId == enrolledGroup.groupId && (m.approved || m.forceAdjusted))
+          if (matched && enrolledModel.selectedList.includes(matched)) {
+            return { enrolledGroup, enrolledModel }
+          }
+          enrolledModel = enrolledModel.prevModel
+        }
+        while (enrolledModel)
+      }
+      return { enrolledGroup, enrolledModel: null }
+    },
     historySupply() {
     historySupply() {
       // 当前代历史报名信息
       // 当前代历史报名信息
       if (!this.generation.models.length) return ''
       if (!this.generation.models.length) return ''
@@ -271,12 +288,11 @@ export default {
       const selectStep = !this.generation.activeOpt.decisionMaking
       const selectStep = !this.generation.activeOpt.decisionMaking
       return stepMatched && selectStep && !this.readonly && !this.activeModels.isAdmission
       return stepMatched && selectStep && !this.readonly && !this.activeModels.isAdmission
     },
     },
-    aiButtonShow() {
+    enableAIFeature() {
       if (!this.generation.activeOpt) return false
       if (!this.generation.activeOpt) return false
       const options = this.generation.options
       const options = this.generation.options
       return !this.generation.activeOpt.decisionMaking &&
       return !this.generation.activeOpt.decisionMaking &&
-        this.generation.activeOpt != options.primary &&
-        !this.readonly
+        this.generation.activeOpt != options.primary && !this.readonly
     },
     },
     resolveTablePrefix() {
     resolveTablePrefix() {
       return {
       return {
@@ -403,10 +419,8 @@ export default {
     },
     },
     isGroupOverSetting(row) {
     isGroupOverSetting(row) {
       if (this.generation.activeOpt.decisionMaking) {
       if (this.generation.activeOpt.decisionMaking) {
-        console.log('isGroupOverSetting decisionMaking', row.groupApprovedCount >= row.personCount, row)
         return row.groupApprovedCount >= row.personCount
         return row.groupApprovedCount >= row.personCount
       } else {
       } else {
-        console.log('isGroupOverSetting', row.actualCount >= row.groupIndicator, row)
         return row.actualCount >= row.groupIndicator
         return row.actualCount >= row.groupIndicator
       }
       }
     },
     },
@@ -548,12 +562,4 @@ export default {
 }
 }
 </script>
 </script>
 <style scoped>
 <style scoped>
-/*.cell .el-tag {*/
-/*  margin-right: 2px;*/
-/*}*/
-
-/*.group /deep/ .el-badge__content.is-fixed {*/
-/*  top: 8px;*/
-/*  right: 14px;*/
-/*}*/
 </style>
 </style>

+ 1 - 3
src/views/system/user/profile/components/round-select-resolvers/backTrackingDM-resolver-mixins.js

@@ -7,9 +7,7 @@ export default {
         const currentGroup = models.find(group => group.groupId == item.groupId) || {}
         const currentGroup = models.find(group => group.groupId == item.groupId) || {}
         item.supplyIndicator = currentGroup.nextGroupIndicator
         item.supplyIndicator = currentGroup.nextGroupIndicator
         // 录取人数加指标/ 设置人数
         // 录取人数加指标/ 设置人数
-        item.backTrackingApply = `${currentGroup.actualCount} /${currentGroup.groupIndicator}`
-        // item.backTrackingApply = `${currentGroup.groupApprovedCount + currentGroup.actualCount} /${currentGroup.personCount}`
-        // item.supplyRecord = `${currentGroup.groupApprovedCount + currentGroup.actualCount} /${currentGroup.personCount}`
+        item.backTrackingApply = `${currentGroup.groupApprovedCount + currentGroup.actualCount} /${currentGroup.personCount}`
       })
       })
 
 
       return {
       return {

+ 7 - 7
src/views/system/user/profile/round-select.vue

@@ -27,11 +27,8 @@
         <elective-generation-steps v-if="selectObj" v-model="activeStep" :generation="generation"
         <elective-generation-steps v-if="selectObj" v-model="activeStep" :generation="generation"
                                    disable-hidden-feature></elective-generation-steps>
                                    disable-hidden-feature></elective-generation-steps>
       </template>
       </template>
-      <report-table v-if="activeModel&&activeModel.models" :generation="generation" :optional-majors="optionalMajors">
-        <template #header-prefix>
-          <el-button circle icon="el-icon-refresh" @click="refreshData" class="mr30"></el-button>
-        </template>
-      </report-table>
+      <report-table v-if="activeModel&&activeModel.models" :generation="generation"
+                    :optional-majors="optionalMajors"></report-table>
       <evaluation-empty v-else :shadow="false" :title="emptyTitle"></evaluation-empty>
       <evaluation-empty v-else :shadow="false" :title="emptyTitle"></evaluation-empty>
     </el-card>
     </el-card>
     <el-card shadow="hover" class="mt20">
     <el-card shadow="hover" class="mt20">
@@ -171,11 +168,14 @@ export default {
     },
     },
     getStudentElectiveModels() {
     getStudentElectiveModels() {
       getStudentElectiveModels().then(res => {
       getStudentElectiveModels().then(res => {
-        // create local selected list
+        // NOTE: create local selected list !!important
         res.data.forEach(gen => {
         res.data.forEach(gen => {
-          const localSelected = gen.models?.filter(m => m.selected)
+          const localSelected = gen.models?.filter(m => m.selected || m.rejected)
           localSelected?.sort((l, r) => l.selectedRank - r.selectedRank)
           localSelected?.sort((l, r) => l.selectedRank - r.selectedRank)
           gen.selectedList = localSelected || []
           gen.selectedList = localSelected || []
+          gen.option = Object.values(this.stepOptions).find(opt => opt.value == gen.generation)
+          gen.prevModel = res.data.find(m => m.generation == gen.generation - 1)
+          gen.nextModel = res.data.find(m => m.generation == gen.generation + 1)
         })
         })
         this.generationModels = res.data
         this.generationModels = res.data
       })
       })