123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- <template>
- <uv-popup ref="popup" mode="bottom" closeable round="16" @change="handleChange">
- <view class="h-[50px] fx-row fx-cen-cen text-lg text-main font-bold">
- {{ group.university.name }}
- </view>
- <scroll-view scroll-y class="bg-bg" style="height: 50vh" lower-threshold="100"
- @scrolltolower="handleMajorScroll">
- <view class="p-30">
- <view v-for="item in pagedMajors" class="fx-col">
- <view class="fx-row fx-bet-cen">
- <view class="flex-1 fx-row items-center">
- <text :class="{'highlight-major': isSearchingMajorFired(item)}">
- {{ item.marjorName }}
- </text>
- ({{ item.marjorBelongs }})
- <text v-if="item.level" class="text-error">({{ item.level }})</text>
- <uv-tags v-if="item.enrollFluctuate" text="大小年" size="tiny" type="error"
- class="ml-5" @click="$emit('notify', '近两年录取分差较大')"/>
- </view>
- <uv-tags v-if="!readonly" :plain="!item.selected" :text="item.selected?'已填':'填报'"
- shape="circle" @click="handleApply(item)"/>
- </view>
- <view v-if="item.professionType||item.typeNames" class="mb-10 text-xs text-primary font-light">
- {{ item.professionType }}
- {{ item.typeNames }}
- </view>
- <view class="fx-row fx-sta-cen text-2xs mb-10">
- <text class="text-content mr-10">录取概率</text>
- <text class="text-sm font-bold">{{ item.enrollRatio || '-' }}</text>
- %
- <text class="text-content ml-10" :class="[getPickTypeColor(item.pickType)]">
- {{ item.enrollRatioText }}
- </text>
- </view>
- <view class="text-2xs">
- <view class="mb-5 text-main font-bold">
- {{
- `代码 ${item.marjorBelongs} ${headerPlanYear}计划 ${item.planCount}人 ${formatXueZhi(item.xuezhi)} ¥${item.xuefei || '-'}`
- }}
- </view>
- <view class="mb-5 text-content">
- {{ item.marjorDirection }}
- </view>
- <voluntary-history-list :container="item" @notify="$emit('notify', $event)"/>
- </view>
- <uv-divider/>
- </view>
- </view>
- </scroll-view>
- </uv-popup>
- </template>
- <script setup>
- import {ref, computed} from 'vue';
- import MxConst from "@/common/MxConst";
- import {createPropDefine} from "@/utils";
- import {toValue} from "@vueuse/core";
- import VoluntaryHistoryList from "@/pages/voluntary/index/components/voluntary-history-list.vue";
- import {useInjectVoluntaryHeader} from "@/pages/voluntary/hooks/useVoluntaryHeaderInjection";
- import {useInjectVoluntaryMajorHighlight} from "@/pages/voluntary/hooks/useVoluntaryMajorHighlightInjection";
- import {useInjectVoluntaryAssistant} from "@/pages/voluntary/hooks/useVoluntaryAssistantInjection";
- import {useInjectVoluntaryCart} from "@/pages/voluntary/hooks/useVoluntaryCartInjection";
- const props = defineProps({
- readonly: createPropDefine(false, Boolean)
- })
- const emits = defineEmits(['notify'])
- const popup = ref(null)
- const show = ref(false)
- const group = ref({})
- const localPageNum = ref(1)
- const localPageSize = ref(4)
- const {headerPlanYear} = useInjectVoluntaryHeader()
- const {toggleMajorSelected} = useInjectVoluntaryCart()
- const {isSearchingMajorFired, snapshotSearchingMajorWhenApply} = useInjectVoluntaryMajorHighlight()
- const {voluntaryDataCalculate} = useInjectVoluntaryAssistant(props.readonly)
- // 已填
- // const selectedCount = computed(() => {
- // if (empty(group.value.majors)) return 0
- // return _.countBy(group.value.majors, m => m.selected)[true]
- // })
- const pagedMajors = computed(() => {
- return group.value.majors?.slice(0, toValue(localPageNum) * toValue(localPageSize)) || []
- })
- const handleMajorScroll = () => {
- if (toValue(pagedMajors).length >= toValue(group).majors.length) return
- localPageNum.value += 1
- }
- const formatXueZhi = (val) => {
- if (!val) return val
- return val.endsWith('年') ? val : val + '年'
- }
- const getPickTypeColor = (pickType) => {
- return MxConst.enum.simulatePickTypes.find(t => t.value == pickType)?.color || ''
- }
- const handleApply = async (major) => {
- const majorGroup = group.value
- const voluntaryOptions = toValue(voluntaryDataCalculate)
- await toggleMajorSelected(major, majorGroup, voluntaryOptions)
- snapshotSearchingMajorWhenApply(major) // snapshot when toggle succeed.
- }
- const open = (item) => {
- localPageNum.value = 1
- group.value = item
- popup.value.open()
- }
- const close = () => {
- popup.value.close()
- }
- const handleChange = (e) => show.value = e.show
- defineExpose({open, close, show})
- </script>
- <style scoped lang="scss">
- ::v-deep(.uv-tags) {
- .uv-tags__text--medium {
- font-size: 12px !important;
- }
- }
- </style>
|