entry-ai-report.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <template>
  2. <view class="page-content">
  3. <large-header v-bind="reportTitleBinding" :scroll-top="scrollTop"/>
  4. <view class="rounded-t-2xl bg-white" style="margin-top: -60px">
  5. <profession-analysis/>
  6. <view class="h-15 bg-slate-100"/>
  7. <hot-profession/>
  8. <view class="h-15 bg-slate-100"/>
  9. <analysis-summary/>
  10. </view>
  11. </view>
  12. </template>
  13. <script>
  14. import LargeHeader from "@/pages/ie/components/large-header.vue";
  15. import ProfessionAnalysis from "./components/profession-analysis.vue";
  16. import HotProfession from "./components/hot-profession.vue";
  17. import AnalysisSummary from "./components/analysis-summary.vue";
  18. import AIFormCommonStyle from "@/pages/ie/components/AIFormCommonStyle";
  19. import {useProvideTransfer} from "@/hooks/useTransfer";
  20. import {useCacheStore} from "@/hooks/useCacheStore";
  21. import {useProvidePageScroll} from "@/hooks/usePageScrollInjection";
  22. import {useProvideMajorTreeService} from "@/pages/ie/hooks/useMajorTreeInjection";
  23. import {universityDetail} from "@/api/webApi/collegemajor";
  24. import {findTreeNode} from "@/utils/tree-helper";
  25. export default {
  26. mixins: [AIFormCommonStyle],
  27. components: {LargeHeader, ProfessionAnalysis, HotProfession, AnalysisSummary},
  28. setup() {
  29. const {prevData} = useProvideTransfer()
  30. const scrollTop = useProvidePageScroll()
  31. const {dispatchCache} = useCacheStore()
  32. const {majorTree} = useProvideMajorTreeService()
  33. return {
  34. scrollTop,
  35. prevData,
  36. majorTree,
  37. dispatchCache
  38. }
  39. },
  40. watch: {
  41. 'majorTree': 'fillPageData',
  42. 'prevData': 'fillPageData'
  43. },
  44. async mounted() {
  45. await this.prevInit()
  46. await this.initData()
  47. },
  48. methods: {
  49. async prevInit() {
  50. },
  51. async initData() {
  52. // - must have current year
  53. // - maybe api need not to fill pageData.details.university
  54. if (!this.prevData.year) this.prevData.year = '2024'
  55. for (const u of this.prevData.details) {
  56. if (u.university?.code && (!u.university.name || !u.professions)) {
  57. const payload = {code: u.university.code}
  58. const res = await this.dispatchCache(universityDetail, payload)
  59. this.$set(u, 'university', res.data.baseInfo)
  60. this.$set(u, 'professions', res.data.professions)
  61. }
  62. }
  63. },
  64. fillPageData() {
  65. if (!this.majorTree.length || !this.prevData.details?.length) return
  66. this.prevData.details?.forEach(u => u.majorDetails?.forEach(m => {
  67. if (!Object.hasOwnProperty.call(m, 'majorName') && m.majorCode) {
  68. this.$set(m, 'majorName', findTreeNode(this.majorTree, n => n.code == m.majorCode)?.name)
  69. }
  70. }))
  71. }
  72. }
  73. }
  74. </script>
  75. <style lang="scss" scoped>
  76. </style>