index.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <!--
  2. * @Author: wanglj wanglijie@dashoo.cn
  3. * @Date: 2025-03-11 18:02:10
  4. * @LastEditors: wanglj wanglijie@dashoo.cn
  5. * @LastEditTime: 2025-04-16 16:19:33
  6. * @FilePath: \vant-demo-master\vant\vue3-ts\src\view\login\index.vue
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. -->
  9. <template>
  10. <div class="entry-container">
  11. <van-tabs v-model:active="state.queryParams.approveStatus" @change="changeType">
  12. <van-tab title="审批中" name="20"></van-tab>
  13. <van-tab title="已通过" name="30"></van-tab>
  14. <van-tab title="全部申请" name=""></van-tab>
  15. </van-tabs>
  16. <div class="list-container">
  17. <van-list v-model:loading="state.loading" :finished="state.finished" finished-text="没有更多了" @load="onLoad">
  18. <van-cell v-for="item in state.list" :key="item" @click="toDetail(item.id)">
  19. <template #default>
  20. <div class="list">
  21. <header class="flex justify-between">
  22. <strong class="title">{{ `${item.memberName}的${item.platformName}入室申请` }}</strong>
  23. <van-tag v-if="item.approveStatus == 10" type="warning">待提交</van-tag>
  24. <van-tag v-else-if="item.approveStatus == 20" type="primary">审批中</van-tag>
  25. <van-tag v-else-if="item.approveStatus == 30" type="success">审批通过</van-tag>
  26. <van-tag v-else-if="item.approveStatus == 40" type="danger">审批退回</van-tag>
  27. <!-- 05 待确认 10 待上传 20 待审核 30 已驳回 35 已撤回 40 待分配 50 可入室 60 已出室 -->
  28. <van-tag v-if="item.appointStatus == '05'" class="ml4">待确认</van-tag>
  29. <van-tag v-else-if="item.appointStatus == '10'" class="ml4">待上传</van-tag>
  30. <van-tag v-else-if="item.appointStatus == '20'" type="primary" class="ml4">待审核</van-tag>
  31. <van-tag v-else-if="item.appointStatus == '30'" type="danger" class="ml4">已驳回</van-tag>
  32. <van-tag v-else-if="item.appointStatus == '35'" type="warning" class="ml4">已撤回</van-tag>
  33. <van-tag v-else-if="item.appointStatus == '40'" class="ml4">待分配</van-tag>
  34. <van-tag v-else-if="item.appointStatus == '50'" type="success" class="ml4">可入室</van-tag>
  35. <van-tag v-else-if="item.appointStatus == '60'" class="ml4">已出室</van-tag>
  36. </header>
  37. <p class="inst-title">
  38. <span>课题名称</span>
  39. <span class="title ml8">{{ item.pgName }}</span>
  40. </p>
  41. <p class="inst-title">
  42. <span>申请平台</span>
  43. <span class="title ml8">{{ item.platformName }}</span>
  44. </p>
  45. <p class="inst-title">
  46. <span>申请时长</span>
  47. <span class="title ml8">{{ item.platformTime }}个月</span>
  48. </p>
  49. <p class="inst-title">
  50. <span>入室周期</span>
  51. <span class="title ml8">{{
  52. item.appointEndDate
  53. ? `${formatDate(new Date(item.appointEndDate), 'YYYY-mm-dd')}~${formatDate(new Date(item.appointEndDate), 'YYYY-mm-dd')}`
  54. : '-'
  55. }}</span>
  56. </p>
  57. <footer class="flex justify-between mt4">
  58. <span class="title">{{ item.memberName }}</span>
  59. <span class="time">{{ formatDate(new Date(item.createdTime), 'YYYY-mm-dd') }}</span>
  60. </footer>
  61. </div>
  62. </template>
  63. </van-cell>
  64. </van-list>
  65. </div>
  66. <!-- <van-floating-bubble v-model:offset="offset" icon="plus" @click="onClick" axis="y" /> -->
  67. </div>
  68. </template>
  69. <script name="home" lang="ts" setup>
  70. import to from 'await-to-js'
  71. import { formatDate } from '/@/utils/formatTime'
  72. import { onMounted, reactive, ref } from 'vue'
  73. import { useRouter, useRoute } from 'vue-router'
  74. import { usePlatformAppointApi } from '/@/api/platform/appoint'
  75. const platformAppointApi = usePlatformAppointApi()
  76. const router = useRouter()
  77. const route = useRoute()
  78. const offset = ref({ x: -80, y: 600 })
  79. const state = reactive({
  80. queryParams: {
  81. approveStatus: '20',
  82. pageNum: 1,
  83. pageSize: 10
  84. },
  85. finished: false,
  86. loading: true,
  87. list: [] as any[]
  88. })
  89. const changeType = (name: string) => {
  90. state.queryParams.pageNum = 1
  91. state.list = []
  92. onLoad()
  93. }
  94. const onLoad = async () => {
  95. const [err, res]: ToResponse = await to(platformAppointApi.getList(state.queryParams))
  96. if (err) return
  97. const list = res?.data?.list || []
  98. for (const item of list) {
  99. state.list.push(item)
  100. }
  101. state.loading = false
  102. state.queryParams.pageNum++
  103. if (list.length < state.queryParams.pageSize) {
  104. state.finished = true
  105. }
  106. }
  107. const toDetail = (id: number) => {
  108. router.push({
  109. path: '/entry/detail',
  110. query: {
  111. id
  112. }
  113. })
  114. }
  115. const onClick = () => {
  116. router.push('/entry/add')
  117. }
  118. onMounted(() => {
  119. const type = route.query.type
  120. if (type) {
  121. state.queryParams.approveStatus = type as string
  122. }
  123. onLoad()
  124. })
  125. </script>
  126. <style lang="scss" scoped>
  127. .entry-container {
  128. position: relative;
  129. display: flex;
  130. flex-direction: column;
  131. .list-container {
  132. overflow-y: auto;
  133. padding: 10px;
  134. border-radius: 4px;
  135. flex: 1;
  136. }
  137. .van-list {
  138. .van-cell {
  139. background-color: #fff;
  140. + .van-cell {
  141. margin-top: 10px;
  142. }
  143. header,
  144. footer {
  145. color: #333;
  146. }
  147. .title {
  148. flex: 1;
  149. white-space: nowrap;
  150. overflow: hidden;
  151. text-overflow: ellipsis;
  152. text-align: left;
  153. }
  154. .inst-title {
  155. color: #333;
  156. text-align: left;
  157. flex: 1;
  158. overflow: hidden;
  159. white-space: nowrap;
  160. text-overflow: ellipsis;
  161. margin-top: 4px;
  162. span:first-child {
  163. color: rgb(120, 120, 120);
  164. }
  165. }
  166. .time {
  167. color: #f69a4d;
  168. }
  169. }
  170. }
  171. }
  172. </style>