voluntary-major.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <template>
  2. <view class="bg-white mx-card overflow-hidden">
  3. <view class="px-10 fx-row" @click="expandInit=true,expanded=!expanded">
  4. <view class="self-start fx-col fx-cen-cen w-100 flex-none">
  5. <view class="pt-5 pb-15 px-20 rounded-b-full text-xs text-white" :class="displayPickType.bg">
  6. {{ displayPickType.tag }}
  7. </view>
  8. <view class="mt-5 text-2xl text-main font-bold">{{ displayRate }}%</view>
  9. <view class="mt-5 text-2xs text-content">{{ displayRateText }}</view>
  10. </view>
  11. <college-item :item="data.university" hidden-logo hidden-star class="flex-1">
  12. <template #address>
  13. <uv-text slot="address" size="13" type="content" prefix-icon="empty-address"
  14. :text="`${data.university.location} ${data.university.cityName}`"/>
  15. </template>
  16. </college-item>
  17. <view class="pt-20 flex-none">
  18. <view class="fx-row fx-end-cen">
  19. <view>
  20. <uv-tags v-if="!selectedOnly" class="pointer-events-none" plain
  21. :text="`专业${displayMajors.length}`"/>
  22. <uv-tags v-else :text="`删除${displayMajors.length}`" type="error" @click="handleMajorDelete"/>
  23. </view>
  24. <view class="ml-10 arrow-icon" :class="{'is-expand': expanded}">
  25. <uv-icon name="arrow-right" size="18" color="primary"></uv-icon>
  26. </view>
  27. </view>
  28. <view v-if="!selectedOnly&&!disableSummary&&data.majorDetails.some(m => m.selected)"
  29. class="text-2xs text-error pl-10 mt-5">
  30. 已填报{{ data.majorDetails.filter(m => m.selected).length }}
  31. </view>
  32. </view>
  33. </view>
  34. <view v-if="expandInit||expanded" v-show="expanded" class="major-wrap p-30">
  35. <view v-for="([label, group], idx) in groupedDisplayMajors">
  36. <view v-if="label" class="mb-20 text-main font-bold">{{ label }}</view>
  37. <view class="cell px-30 py-20 rounded-lg relative" v-for="(major, i) in group">
  38. <view class="fx-row fx-sta-cen" @click="goSingleResult(major)">
  39. <view class="fx-col">
  40. <text class="text-lg">{{ major.majorName }}</text>
  41. <text v-if="major.majorDirection" class="text-2xs text-primary-light">
  42. {{ major.majorDirection }}
  43. </text>
  44. </view>
  45. <text class="text-xs text-primary ml-10 mr-5">查看</text>
  46. <uv-icon name="eye" size="16" color="primary"></uv-icon>
  47. </view>
  48. <view v-if="!hideBtn" class="btn">
  49. <uv-tags v-if="!selectedOnly" :plain="!major.selected"
  50. :text="major.selected ? '已填报' : '填报'"
  51. @click="toggleCartSelected(major)"/>
  52. <uv-tags v-else text="删除" type="error" size="mini" icon="trash" plain plain-fill
  53. @click="handleMajorDelete(major)"/>
  54. </view>
  55. <view class="mt-15 text-xs fx-row fx-sta-cen">
  56. <text class="text-content">录取率</text>
  57. <text class="ml-10 text-primary">{{ major.enrollRate || '-' }}%</text>
  58. <text class="ml-20 text-content">{{ major.enrollRateText }}</text>
  59. </view>
  60. <view class="mt-10 text-xs fx-row fx-sta-cen">
  61. <text class="">专业代码 {{ major.majorCode }}</text>
  62. <text class="ml-20">{{ getFormattedPlan(major) }}</text>
  63. <text class="ml-20"></text>
  64. </view>
  65. </view>
  66. <uv-divider v-if="idx<groupedDisplayMajors.length-1"/>
  67. </view>
  68. </view>
  69. </view>
  70. </template>
  71. <script>
  72. import _ from 'lodash';
  73. import MxConst from "@/common/MxConst";
  74. import InjectAIDataMixin from "@/pages/ie/entry-ai-form/components/InjectAIDataMixin";
  75. import {confirmAsync} from "@/utils/uni-helper";
  76. import CollegeItem from "@/pages/college-library/components/college-item.vue";
  77. import {useTransfer} from "@/hooks/useTransfer";
  78. export default {
  79. components: {CollegeItem},
  80. mixins: [InjectAIDataMixin],
  81. props: {
  82. data: {
  83. type: Object,
  84. default: () => ({})
  85. },
  86. hideBtn: {
  87. type: Boolean,
  88. default: false
  89. },
  90. selectedOnly: {
  91. // 仅显示填报项
  92. type: Boolean,
  93. default: false
  94. },
  95. defaultExpand: {
  96. // 默认展开
  97. type: Boolean,
  98. default: false
  99. },
  100. disableSummary: {
  101. // 控制显示已填报N项
  102. type: Boolean,
  103. default: false
  104. }
  105. },
  106. data() {
  107. return {
  108. expandInit: false,
  109. expanded: true
  110. };
  111. },
  112. setup() {
  113. const {transferTo} = useTransfer()
  114. return {
  115. transferTo
  116. }
  117. },
  118. computed: {
  119. displayMajors() {
  120. if (this.selectedOnly) return this.data.majorDetails?.filter(m => m.selected) || []
  121. return this.data.majorDetails || []
  122. },
  123. groupedDisplayMajors() {
  124. return Object.entries(_.groupBy(this.displayMajors, m => m.majorGroup))
  125. },
  126. displayPickType() {
  127. switch (this.data.enumPickType) {
  128. // bg - 走配置的话tailwind检测不到,所以直接写在这里。
  129. case MxConst.enum.ai.pickType.danger.value:
  130. return {bg: 'bg-error', tag: '冲'}
  131. case MxConst.enum.ai.pickType.normal.value:
  132. return {bg: 'bg-primary', tag: '稳'}
  133. case MxConst.enum.ai.pickType.safety.value:
  134. return {bg: 'bg-success', tag: '保'}
  135. default:
  136. return {bg: 'bg-light', tag: '无'}
  137. }
  138. },
  139. displayRate() {
  140. return this.data.enrollRate !== null ? this.data.enrollRate : '-'
  141. },
  142. displayRateText() {
  143. return this.data.enrollRateText || this.data.enrollRate === null && '无概率' || ''
  144. }
  145. },
  146. async created() {
  147. this.expanded = this.defaultExpand;
  148. },
  149. methods: {
  150. getFormattedPlan(majorResult) {
  151. const demo = _.first(majorResult.histories)
  152. if (!demo) return ''
  153. return `${demo.year}年计划 ${demo.plan || '-'}人`
  154. },
  155. goSingleResult(majorResult) {
  156. const path = '/pages/ie/entry-ai-form/ai-major-detail'
  157. this.transferTo(path, majorResult, null, true)
  158. },
  159. toggleCartSelected(m) {
  160. if (m.selected) this.handleCartRemove(this.data, m)
  161. else this.handleCartAdd(this.data, m)
  162. },
  163. async handleMajorDelete(m = null) {
  164. if (!m) await confirmAsync('确认删除该院校下所有填报专业?!')
  165. this.handleCartRemove(this.data, m)
  166. }
  167. }
  168. };
  169. </script>
  170. <style lang="scss" scoped>
  171. .major-wrap {
  172. background-color: white;
  173. border-top: 1px solid #efefef;
  174. }
  175. .cell {
  176. background-color: #eef2fd;
  177. & + & {
  178. margin-top: 5px;
  179. }
  180. }
  181. .btn {
  182. position: absolute;
  183. right: 14px;
  184. bottom: 15px;
  185. }
  186. .arrow-icon {
  187. transition: transform .2s;
  188. }
  189. .is-expand {
  190. transform: rotate(90deg);
  191. }
  192. </style>