entry-calculate.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <view class="page-content">
  3. <large-header v-bind="calculateTitleBinding" :scroll-top="scrollTop"/>
  4. <view class="-mt-60 mx-20 bg-white mx-card px-40 py-30">
  5. <ai-form ref="form" :model="model" :rules="rules" :render-rules="renderRules"
  6. :render-rule-loading="renderRuleLoading">
  7. <template #prefix>
  8. <ai-form-item prop="universityCode">
  9. <ai-form-college v-model="model.universityCode"/>
  10. </ai-form-item>
  11. <ai-form-item prop="majorCode">
  12. <ai-form-college-major v-model="model.majorCode" v-model:enroll-code="model.majorEnrollCode"
  13. :university-code="model.universityCode"/>
  14. </ai-form-item>
  15. </template>
  16. <template #suffix>
  17. <uv-form-item>
  18. <uv-button :text="next" v-bind="gradientBtnBinding" @click="handleNext"/>
  19. </uv-form-item>
  20. </template>
  21. </ai-form>
  22. </view>
  23. <uv-gap height="20"/>
  24. </view>
  25. </template>
  26. <script>
  27. import {ref, watch} from 'vue';
  28. import MxConst from "@/common/mxConst";
  29. import AIFormCommonStyle from "@/pages/ie/components/AIFormCommonStyle";
  30. import {useProvidePageScroll} from "@/hooks/usePageScrollInjection";
  31. import {useProvideMajorTreeService} from "@/pages/ie/hooks/useMajorTreeInjection";
  32. import {useAIRenderRules} from "@/pages/ie/hooks/useAIRenderRules";
  33. import {useTransfer} from "@/hooks/useTransfer";
  34. import LargeHeader from "@/pages/ie/components/large-header.vue";
  35. import AiForm from "@/pages/ie/components/ai-form/ai-form.vue";
  36. import AiFormItem from "@/pages/ie/components/ai-form/ai-form-item.vue";
  37. import AiFormCollege from "@/pages/ie/components/ai-form/items/ai-form-college.vue";
  38. import AiFormCollegeMajor from "@/pages/ie/components/ai-form/items/ai-form-college-major.vue";
  39. export default {
  40. components: {AiFormCollegeMajor, AiFormCollege, AiForm, AiFormItem, LargeHeader},
  41. mixins: [AIFormCommonStyle],
  42. data() {
  43. return {};
  44. },
  45. setup() {
  46. const next = ref('开始计算')
  47. const nextPath = ref('/pages/ie/entry-calculate-result/entry-calculate-result')
  48. useProvideMajorTreeService()
  49. const scrollTop = useProvidePageScroll()
  50. const form = ref(null)
  51. const model = ref({
  52. universityCode: '',
  53. majorCode: '',
  54. majorEnrollCode: ''
  55. })
  56. const rules = ref({
  57. universityCode: [{required: true, message: '请选择学校'}],
  58. majorCode: [{required: true, message: '请选择专业'}]
  59. })
  60. const paramFactory = () => {
  61. const renderType = MxConst.enum.ai.renderType.calculate
  62. const {universityCode, majorCode, majorEnrollCode} = model.value
  63. return {renderType, universityCode, majorCodes: [majorCode], majorEnrollCodes: [majorEnrollCode]}
  64. }
  65. const {
  66. renderRules,
  67. renderRuleLoading,
  68. reloadRenderRules,
  69. validateRenderRule
  70. } = useAIRenderRules(paramFactory)
  71. const {transferTo} = useTransfer()
  72. watch(() => model.value.majorEnrollCode, val => {
  73. renderRules.value = []
  74. if (val) reloadRenderRules()
  75. })
  76. watch(() => model.value.universityCode, _ => scrollTop.value = 0)
  77. const handleNext = async () => {
  78. await form.value.validate()
  79. await validateRenderRule()
  80. transferTo(nextPath.value, model.value)
  81. }
  82. return {
  83. scrollTop,
  84. next,
  85. nextPath,
  86. form,
  87. model,
  88. rules,
  89. renderRules,
  90. renderRuleLoading,
  91. handleNext
  92. }
  93. }
  94. }
  95. </script>
  96. <style lang="scss" scoped>
  97. .page-content {
  98. background-image: url("~@/static/ie/entry/bg-calculate-full.png");
  99. background-repeat: no-repeat;
  100. background-size: contain;
  101. }
  102. </style>