result-header.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <template>
  2. <view class="result-header">
  3. <college-item :item="detail.baseInfo">
  4. <template #address>
  5. <uv-tags size="mini" type="primary" shape="circle" :text="major.name" class="!items-start"
  6. @click="goMajorDetail(major)"/>
  7. </template>
  8. </college-item>
  9. <view class="entry-result rounded-lg">
  10. <view class="fx-row">
  11. <view class="entry-result-txt h-full text-2xs">
  12. <view>结果:</view>
  13. <view class="indent-txt">您测试录取率的院校为
  14. <text class="underline-txt">{{ universityName }}</text>
  15. ,专业为
  16. <text class="underline-txt">{{ result.majorName }}</text>
  17. <text v-if="result.majorDirection" class="underline-txt text-primary-light">
  18. ({{ result.majorDirection }})
  19. </text>
  20. <template v-if="result.enrollRate===null">
  21. 因为缺少关键数据,你被该校录取的概率无法计算!
  22. </template>
  23. <template v-else>
  24. 您被该校录取的概率为
  25. <text class="underline-txt">{{ result.enrollRate }}%</text>
  26. </template>
  27. </view>
  28. </view>
  29. <view class="entry-result-chart min-w-1 ml-10">
  30. <mx-echarts :option="chartOption" canvas-id="dashboard" style="height: 100%"/>
  31. </view>
  32. </view>
  33. <enroll-table v-if="enrollRules.length" :headers="enrollHeader" :data="enrollRules" compact>
  34. <template #cell="{item}">
  35. <enroll-status :rule="item" @tip="handleShowTip"/>
  36. </template>
  37. </enroll-table>
  38. <enroll-table v-if="otherRules.length" :headers="otherHeader" :data="otherRules" compact>
  39. <template #cell="{item}">
  40. <enroll-status :rule="item" @tip="handleShowTip"/>
  41. </template>
  42. </enroll-table>
  43. <uv-text v-if="result.tips" size="11" type="warning" prefix-icon="info-circle" :text="result.tips"
  44. :icon-style="{color: 'var(--warning-color)', fontSize: '12px'}" margin="5px 0 0 0"/>
  45. <view class="mt-10 text-2xs">
  46. 录取概率说明:
  47. <uv-text size="12"
  48. text="1.成绩合格,但是学校的附加录取条件没有达标,会显示零概率(如身高,视力等要求,具体看系统的院校招生要求)"/>
  49. <uv-text size="12"
  50. text="2.成绩合格,考生没有完整填写学校招生附加要求,会显示无概率(如身高,视力等要求,具体看系统的院校招生要求)"
  51. margin="3px 0"/>
  52. <uv-text size="12"
  53. text="3.规则中的`自行参考`项由于官方未公布具体标准,系统无法将其纳入概率计算,考生根据自身情况自行参考"/>
  54. </view>
  55. </view>
  56. <uv-popup ref="popup" mode="center" :safe-area-inset-bottom="false" round="8" closeable close-on-click-overlay>
  57. <view class="fx-col p-30" style="width: 80vw">
  58. <uv-text type="content" size="14" :text="showContent" align="center" margin="20px 0"/>
  59. <uv-button type="primary" shape="circle" :custom-style="{width: '30vw'}" text="我知道了"
  60. class="self-center" @click="$refs.popup.close()"/>
  61. </view>
  62. </uv-popup>
  63. </view>
  64. </template>
  65. <script>
  66. import MxConst from "@/common/MxConst";
  67. import InjectAISingleDataMixin from "@/pages/ie/entry-single-result/components/InjectAISingleDataMixin";
  68. import CollegeItem from "@/pages/college-library/components/college-item.vue";
  69. import IndexTitleWrap from "@/pages/index/components/index-title-wrap.vue";
  70. import EnrollTable from "@/pages/ie/entry-single-result/components/enroll-table.vue";
  71. import EnrollStatus from "@/pages/ie/entry-single-result/components/enroll-status.vue";
  72. import {defaultTheme} from "@/hooks/useTheme";
  73. import {useTransfer} from "@/hooks/useTransfer";
  74. export default {
  75. components: {EnrollStatus, EnrollTable, IndexTitleWrap, CollegeItem},
  76. mixins: [InjectAISingleDataMixin],
  77. computed: {
  78. chartOption() {
  79. if (!this.result || !Object.hasOwnProperty.call(this.result, 'enrollRate')) return {}
  80. return this.createRateChartOption()
  81. },
  82. universityName() {
  83. return this.detail?.baseInfo?.name || ''
  84. },
  85. enrollRules() {
  86. return this.result.rules?.filter(r => r.category == MxConst.enum.ai.ruleCategory.enroll.value) || []
  87. },
  88. otherRules() {
  89. return this.result.rules?.filter(r => r.category != MxConst.enum.ai.ruleCategory.enroll.value) || []
  90. }
  91. },
  92. data() {
  93. return {
  94. enrollHeader: [{prop: 'content', label: '录取规则', clazz: 'flex-4'},
  95. {prop: 'value', label: '计分', clazz: 'flex-1'},
  96. {prop: 'valid', label: '状态', clazz: 'flex-2', slotBody: 'cell'}],
  97. otherHeader: [{prop: 'content', label: '其它要求', clazz: 'flex-5'},
  98. {prop: 'valid', label: '状态', slotBody: 'cell', clazz: 'flex-2'}],
  99. showContent: ''
  100. }
  101. },
  102. setup() {
  103. const {transferTo} = useTransfer()
  104. const goMajorDetail = (major) => {
  105. transferTo('/pages/major-library/detail/detail', ['code'], major)
  106. }
  107. return {
  108. goMajorDetail
  109. }
  110. },
  111. methods: {
  112. createRateChartOption() {
  113. const rate = this.result.enrollRate
  114. return {
  115. grid: {
  116. left: 0,
  117. right: 0
  118. },
  119. series: [
  120. {
  121. type: 'gauge',
  122. center: ['50%', '75%'],
  123. startAngle: 180,
  124. endAngle: 0,
  125. min: 0,
  126. max: 100,
  127. radius: '120%',
  128. itemStyle: {
  129. color: {
  130. type: 'linear',
  131. x: 0,
  132. y: 0,
  133. x2: 1,
  134. y2: 0,
  135. colorStops: [{
  136. offset: 0, color: defaultTheme.colors["primary-deep"]
  137. }, {
  138. offset: 1, color: defaultTheme.colors["primary-light"]
  139. }]
  140. }
  141. },
  142. progress: {
  143. show: true,
  144. roundCap: true,
  145. width: 10,
  146. },
  147. pointer: {
  148. show: false,
  149. },
  150. anchor: {
  151. show: false
  152. },
  153. axisLine: {
  154. roundCap: true,
  155. lineStyle: {
  156. color: [[1, '#e2e2e2']],
  157. width: 10
  158. }
  159. },
  160. axisTick: {
  161. show: false
  162. },
  163. splitLine: {
  164. show: false
  165. },
  166. axisLabel: {
  167. show: false,
  168. },
  169. detail: {
  170. show: true,
  171. formatter: v => {
  172. return isNaN(v) ? '--' : (v + '%');
  173. },
  174. color: '#333',
  175. fontSize: 20,
  176. fontWeight: 'bold',
  177. offsetCenter: [0, '-20%']
  178. },
  179. title: {
  180. show: true,
  181. color: defaultTheme.brands.primary,
  182. fontSize: 10,
  183. offsetCenter: [0, '20%'],
  184. },
  185. data: [
  186. {
  187. value: rate,
  188. name: rate === null ? '无概率' : '录取概率'
  189. }
  190. ]
  191. },
  192. {
  193. type: 'gauge',
  194. center: ['50%', '75%'],
  195. startAngle: 180,
  196. endAngle: 0,
  197. min: 0,
  198. max: 100,
  199. radius: '120%',
  200. z: 3,
  201. progress: {
  202. show: false,
  203. },
  204. pointer: {
  205. showAbove: true,
  206. icon: 'circle',
  207. width: 7,
  208. offsetCenter: [0, '-61%'],
  209. itemStyle: {
  210. color: '#fff'
  211. }
  212. },
  213. anchor: {
  214. show: false
  215. },
  216. axisLine: {
  217. roundCap: true,
  218. lineStyle: {
  219. color: [[1, 'transparent']],
  220. width: 10
  221. }
  222. },
  223. axisTick: {
  224. show: false
  225. },
  226. splitLine: {
  227. show: false
  228. },
  229. axisLabel: {
  230. show: false,
  231. },
  232. detail: {
  233. show: false,
  234. },
  235. title: {
  236. show: false,
  237. },
  238. data: [
  239. {
  240. value: rate
  241. }
  242. ]
  243. }
  244. ]
  245. }
  246. },
  247. handleShowTip(content) {
  248. if (!content) return
  249. this.showContent = content
  250. this.$refs.popup.open()
  251. }
  252. }
  253. };
  254. </script>
  255. <style lang="scss" scoped>
  256. .result-header {
  257. border-radius: 24rpx 24rpx 0 0;
  258. }
  259. .entry-result {
  260. background-color: #E9EDF6;
  261. margin: 0 15rpx 26rpx 15rpx;
  262. padding: 34rpx 17rpx 34rpx 34rpx;
  263. &-txt {
  264. flex: 0.6;
  265. .indent-txt {
  266. text-indent: 2em;
  267. text-align: justify;
  268. }
  269. .underline-txt {
  270. text-decoration: underline;
  271. }
  272. }
  273. &-chart {
  274. flex: 0.4;
  275. height: 180rpx;
  276. }
  277. }
  278. .rate-tips {
  279. height: 70px;
  280. }
  281. </style>