detail.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <template>
  2. <z-paging ref="paging" v-model="list" :auto="false" auto-show-system-loading @query="handleQuery">
  3. <template #top>
  4. <mx-nav-bar :title="prevData.name"/>
  5. </template>
  6. <view class="fx-col gap-20 p-20">
  7. <voluntary-item v-for="item in list" :item="item" @major="openMajorPopup(item)" @notify="showNotify"/>
  8. </view>
  9. <major-popup ref="majorPopup" readonly @notify="showNotify"/>
  10. <uv-notify ref="notifier"/>
  11. <template #bottom>
  12. <mx-bottom-buttons left="编辑" left-type="primary" right="下载" class="h-[60px] px-30 bg-white mx-shadow-up"
  13. left-icon="edit-pen" right-icon="download" @left="handleEdit" @right="handleDownload"/>
  14. </template>
  15. </z-paging>
  16. </template>
  17. <script setup>
  18. import {ref, onMounted} from 'vue';
  19. import {
  20. downloadRecommendReport,
  21. getDownloadRecommendReportOptionsForWap2App,
  22. getRecommendVoluntary,
  23. getVoluntaryMarjors,
  24. getZhiyuanDetail,
  25. } from '@/api/webApi/volunteer.js'
  26. import MxConst from '@/common/MxConst'
  27. import MajorPopup from '../index/components/major-popup.vue'
  28. import VoluntaryItem from "../index/components/voluntary-item.vue";
  29. import {useProvideTransfer} from "@/hooks/useTransfer";
  30. import {useVoluntaryMajorGroupIdentifier} from "@/pages/voluntary/hooks/useVoluntaryMajorGroupIdentifier";
  31. import {useProvideVoluntaryMajorHighlight} from "@/pages/voluntary/hooks/useVoluntaryMajorHighlightInjection";
  32. import {useProvideVoluntaryHeader} from "@/pages/voluntary/hooks/useVoluntaryHeaderInjection";
  33. import {useProvideVoluntaryCart} from "@/pages/voluntary/hooks/useVoluntaryCartInjection";
  34. import {useVoluntaryPageDataFormat} from "@/pages/voluntary/hooks/useVoluntaryPageDataFormat";
  35. import {useUserStore} from "@/hooks/useUserStore";
  36. import {alertAsync} from "@/utils/uni-helper";
  37. import {useEnvStore} from "@/hooks/useEnvStore";
  38. import {useDownload} from "@/hooks/useDownload";
  39. const {isWap2App, isH5} = useEnvStore()
  40. const {currentUser, isScoreLocked} = useUserStore()
  41. const {prevData, transferTo, onPageCallback} = useProvideTransfer()
  42. const {downloadBlobFileForWap2app, downloadBlobFile} = useDownload()
  43. const paging = ref(null)
  44. const notifier = ref(null)
  45. const majorPopup = ref(null)
  46. const {resolveFormedMajorsFromSavedData} = useProvideVoluntaryMajorHighlight(true)
  47. const {ensureHistoryYearsFromPageData} = useProvideVoluntaryHeader(true)
  48. const {id, name, total, list} = useProvideVoluntaryCart()
  49. const loadDataById = async (id) => {
  50. const res = await getZhiyuanDetail(id)
  51. prevData.value = res.data
  52. await loadDataByCache()
  53. }
  54. const loadDataByCache = async () => {
  55. useVoluntaryPageDataFormat(prevData)
  56. resolveFormedMajorsFromSavedData(prevData.value)
  57. await ensureHistoryYearsFromPageData(prevData.value)
  58. // ready for reload voluntary detail data
  59. paging.value.reload()
  60. }
  61. const handleQuery = (pageNum, pageSize) => {
  62. const {id, mode, score, batchName} = prevData.value
  63. const data = {wishResId: id, mode, score, batchName}
  64. getRecommendVoluntary(data, {pageNum, pageSize}).then(res => {
  65. const rows = res.rows.map(item => {
  66. item.isExpand = false
  67. item.majors = []
  68. item.selectedCount = 0
  69. item.recruitPlan = item.recruitPlan || {planCount: '-'}
  70. useVoluntaryMajorGroupIdentifier(item)
  71. return item
  72. })
  73. paging.value.completeByTotal(rows, res.total)
  74. }).catch(e => paging.value.complete(false))
  75. }
  76. const showNotify = (message) => {
  77. const msg = message || '未发布详细的征集信息'
  78. notifier.value.show({
  79. message: msg,
  80. type: 'warning',
  81. top: 1
  82. })
  83. }
  84. const openMajorPopup = (item) => {
  85. if (item.isExpand) {
  86. return majorPopup.value.open(item)
  87. } else {
  88. item.isExpand = true
  89. loadMajorDetails(item)
  90. }
  91. }
  92. const loadMajorDetails = (item) => {
  93. uni.showLoading()
  94. const {batchName, mode, id} = prevData.value
  95. getVoluntaryMarjors({
  96. batchName: batchName,
  97. mode: mode,
  98. wishResId: id,
  99. collegeCode: item.recruitPlan.collegeCode,
  100. jCode: item.jCode
  101. }).then(res => {
  102. item.majors = res.data.map(item => {
  103. item.selected = false
  104. return item
  105. })
  106. openMajorPopup(item)
  107. }).finally(() => uni.hideLoading())
  108. }
  109. const handleEdit = async () => {
  110. if (isScoreLocked.value) {
  111. const {score, mode} = currentUser.value
  112. if (prevData.value.score != score || prevData.value.mode != mode) {
  113. return alertAsync('现在是志愿填报高峰期,此志愿表与您的考试分数不符,为保证系统稳定性,填报期间您不能修改这张志愿表')
  114. }
  115. }
  116. if (prevData.value.obsoleted) {
  117. return alertAsync('此志愿表已经过期,不能使用修改功能')
  118. }
  119. const next = {...prevData.value, callback: MxConst.globalEvents.voluntaryChanged}
  120. transferTo('/pages/voluntary/edit/edit', next, null, true)
  121. }
  122. const handleDownload = async () => {
  123. const {name, score, batchName, id} = prevData.value
  124. const fileName = `${name}-${score}-${batchName}`
  125. const params = {wishResId: id}
  126. if (isWap2App.value) {
  127. const opt = getDownloadRecommendReportOptionsForWap2App(params)
  128. downloadBlobFileForWap2app(opt, fileName)
  129. } else if (isH5.value) {
  130. const rep = await downloadRecommendReport(params)
  131. downloadBlobFile(rep, fileName)
  132. } else {
  133. console.error('unexpected env, neither wap2app nor h5')
  134. }
  135. }
  136. onMounted(() => {
  137. if (prevData.value.id) {
  138. // This is transferred from creation
  139. loadDataById(prevData.value.id)
  140. } else {
  141. loadDataByCache()
  142. }
  143. })
  144. onPageCallback((change) => {
  145. if (change) loadDataById(prevData.value.id)
  146. })
  147. </script>
  148. <style lang="scss" scoped>
  149. ::v-deep .zp-page-bottom-container {
  150. z-index: 10;
  151. }
  152. </style>