round-select.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <template>
  2. <div class="app-container" v-loading="loading">
  3. <el-card shadow="hover">
  4. <template #header>选科信息</template>
  5. <el-row :gutter="20">
  6. <el-col :span="12">
  7. <el-form ref="form" v-if="selectObj" label-position="right" label-width="80px">
  8. <el-form-item label="选科轮次" class="form-item-readonly">{{ selectObj.year }}{{ selectObj.name }}
  9. </el-form-item>
  10. <el-form-item label="选科时间" class="form-item-readonly">{{ selectObj.beginTime }} 至 {{ selectObj.endTime }}
  11. </el-form-item>
  12. </el-form>
  13. </el-col>
  14. <el-col :span="12" style="vertical-align: center">
  15. 为了让同学们更好地选科,请完成左侧几项功能,如有疑问,请观看此
  16. <el-link type="primary" icon="el-icon-video-play" underline @click="helpVideo.visible=true">介绍视频</el-link>
  17. 、咨询客服或拨打电话4001797985
  18. </el-col>
  19. </el-row>
  20. </el-card>
  21. <!-- 自选专业 推荐专业 -->
  22. <select-subject class="mt20" :evaluationMajors="evaluationMajors" :optionalMajors="optionalMajors"
  23. :list="activeModel ? activeModel.models : []"></select-subject>
  24. <!-- 选科报名表 -->
  25. <el-card class="box-card mt20">
  26. <template #header>
  27. <elective-generation-steps v-if="selectObj" v-model="activeStep" :generation="generation"
  28. disable-hidden-feature></elective-generation-steps>
  29. </template>
  30. <report-table v-if="activeModel&&activeModel.models" :generation="generation"
  31. :optional-majors="optionalMajors"></report-table>
  32. <evaluation-empty v-else :shadow="false" :title="emptyTitle"></evaluation-empty>
  33. </el-card>
  34. <el-card shadow="hover" class="mt20">
  35. <template #header>选科报告</template>
  36. <el-button v-if="false" @click="goReportDemo">选科报告1</el-button>
  37. <el-button @click="goReportDemoOnline">选科报告</el-button>
  38. <el-button @click="goStudyReportDemoOnline">学情报告</el-button>
  39. </el-card>
  40. <el-dialog :visible.sync="helpVideo.visible">
  41. <mx-video v-if="helpVideo.visible" :src="helpVideo.src" :ali-id-type="helpVideo.aliIdType"
  42. class="mt15"></mx-video>
  43. </el-dialog>
  44. </div>
  45. </template>
  46. <script>
  47. import { saveStudentSelected } from '@/api/webApi/selection'
  48. import TestEntry from '@/views/elective/test/components/test-entry'
  49. import TestResult from '@/views/elective/test/components/test-result'
  50. import SelectSubject from '@/views/system/user/profile/components/select-subject'
  51. import ReportTable from '@/views/elective/select/components/elective-table'
  52. import ElectiveGenerationSteps from '@/views/elective/generation/components/elective-generation-steps'
  53. import TransferMixin from '@/components/mx-transfer-mixin'
  54. import ElectiveToolsMixin from '../../../elective/select/components/elective-tools-mixins'
  55. import config from '@/common/mx-config'
  56. import {
  57. getStudentElectiveModels,
  58. getOptionalMajors,
  59. getStudentSelected,
  60. getRecommendMajor
  61. } from '@/api/webApi/elective/selected-subject'
  62. export default {
  63. mixins: [TransferMixin, ElectiveToolsMixin],
  64. provide() {
  65. return {
  66. optionalMajors: this.getOptionalMajors,
  67. refreshData: this.refreshData
  68. }
  69. },
  70. components: { SelectSubject, TestResult, TestEntry, ReportTable, ElectiveGenerationSteps },
  71. name: 'round-select',
  72. data() {
  73. return {
  74. helpVideo: {
  75. visible: false,
  76. src: '9fca0b997b8346ce8c3ce69feaf89294',
  77. aliIdType: 2
  78. },
  79. loading: false,
  80. //
  81. optionalMajors: [],
  82. evaluationMajors: [],
  83. //
  84. selectObj: null,
  85. allowSelect: false,
  86. stepOptions: config.electiveGenerationOptions,
  87. activeStep: '',
  88. generationModels: []
  89. }
  90. },
  91. computed: {
  92. emptyTitle() {
  93. if (!this.activeOpt) return
  94. if (this.activeModel && !this.activeModel.models && this.activeOpt.decisionMaking) {
  95. return this.activeOpt.title + '正在进行...'
  96. }
  97. return this.activeOpt.title + '还未开启'
  98. },
  99. currentOpt() {
  100. /// 当前进程代对应的配置项,可能没有值
  101. return Object.values(this.stepOptions).find(opt => opt.value == this.selectObj.currentGeneration)
  102. },
  103. activeOpt() {
  104. return Object.values(this.stepOptions).find(opt => opt.key == this.activeStep)
  105. },
  106. activeModels() {
  107. if (!this.activeStep || !this.selectObj) return []
  108. if (this.activeOpt.value > this.selectObj.currentGeneration) return []
  109. /// 当前选中的进程代,可能没有值
  110. return this.generationModels.filter(gm => gm.generation <= this.activeOpt.value)
  111. },
  112. activeModel() {
  113. if (!this.activeStep || !this.selectObj) return null
  114. return this.generationModels.find(gm => gm.generation == this.activeOpt.value)
  115. },
  116. roundGroups() {
  117. if (!this.selectObj?.groupIds) return []
  118. if (!this.generationModels.length) return []
  119. return this.selectObj['groupList']?.map(g => {
  120. return ({
  121. ...g,
  122. groupName: g.name
  123. })
  124. }) || []
  125. },
  126. generation() {
  127. if (!this.selectObj) return {}
  128. return {
  129. // generation key value
  130. hiddenGenerations: [],
  131. options: this.stepOptions,
  132. current: this.selectObj.currentGeneration,
  133. currentOpt: this.currentOpt,
  134. active: this.activeOpt?.value,
  135. activeOpt: this.activeOpt,
  136. roundGroups: this.roundGroups,
  137. status: {
  138. ...this.selectObj,
  139. roundName: this.selectObj.name || ''
  140. },
  141. models: this.generationModels, // 全量generation model集合
  142. activeModels: this.activeModels, // 从开始到active代的generation model集合
  143. activeModel: this.activeModel // active代的generation model
  144. }
  145. }
  146. },
  147. mounted() {
  148. try {
  149. this.loading = true
  150. this.loadStudentSelected()
  151. this.getStudentElectiveModels()
  152. this.getOptionalMajors()
  153. this.getRecommendMajor()
  154. } finally {
  155. this.loading = false
  156. }
  157. },
  158. methods: {
  159. refreshData() {
  160. try {
  161. this.loading = true
  162. this.loadStudentSelected()
  163. this.getStudentElectiveModels()
  164. } finally {
  165. this.loading = false
  166. }
  167. },
  168. getStudentElectiveModels() {
  169. getStudentElectiveModels().then(res => {
  170. // NOTE: create local selected list !!important
  171. res.data.forEach(gen => {
  172. const localSelected = gen.models?.filter(this.isGroupSelected)
  173. localSelected?.sort((l, r) => l.selectedRank - r.selectedRank)
  174. gen.selectedList = localSelected || []
  175. gen.selectedListSnapshot = this.deepClone(gen.selectedList) // 快照,用于对比变更
  176. gen.option = Object.values(this.stepOptions).find(opt => opt.value == gen.generation)
  177. gen.prevModel = res.data.find(m => m.generation == gen.generation - 1)
  178. gen.nextModel = res.data.find(m => m.generation == gen.generation + 1)
  179. })
  180. this.generationModels = res.data
  181. })
  182. },
  183. getRecommendMajor() {
  184. getRecommendMajor().then(res => {
  185. this.evaluationMajors = res.data
  186. })
  187. },
  188. getOptionalMajors() {
  189. getOptionalMajors().then(res => {
  190. this.optionalMajors = res.data
  191. })
  192. },
  193. loadStudentSelected() {
  194. getStudentSelected().then(res => {
  195. console.log('getStudentSelected', res)
  196. const status = res.data['selectResult']
  197. status.currentGeneration = res.data.currentGeneration || 9
  198. status.preferenceCount = res.data.preferenceCount || 3
  199. this.selectObj = res.data['selectResult']
  200. this.allowSelect = res.data.allowSelect
  201. })
  202. },
  203. goReportDemo() {
  204. const path = '/elective/report/index'
  205. this.transferTo(path)
  206. },
  207. goReportDemoOnline() {
  208. const path = 'https://online.fliphtml5.com/jkrou/ybov/'
  209. window.open(path)
  210. },
  211. goStudyReportDemoOnline() {
  212. const path = 'https://online.fliphtml5.com/jkrou/hjig/'
  213. window.open(path)
  214. }
  215. }
  216. }
  217. </script>
  218. <style scoped>
  219. </style>