todo-list.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <view>
  3. <!-- 搜索组件 -->
  4. <TodoSearchForm @search="handleSearch" @reset="handleReset" />
  5. <view class="bpm-list">
  6. <!-- 待办列表 -->
  7. <view
  8. v-for="item in list"
  9. :key="item.id"
  10. class="bpm-card"
  11. @click="handleDetail(item)"
  12. >
  13. <view class="bpm-card-content">
  14. <view class="bpm-card-header">
  15. <view class="bpm-card-title">
  16. {{ item.processInstance?.name }}
  17. </view>
  18. <wd-tag type="primary" plain>
  19. 待审批
  20. </wd-tag>
  21. </view>
  22. <view v-if="item.processInstance?.summary?.length" class="bpm-summary">
  23. <view v-for="(s, idx) in item.processInstance.summary" :key="idx" class="bpm-summary-item">
  24. <text class="text-[#999]">{{ s.key }}:</text>
  25. <text>{{ s.value }}</text>
  26. </view>
  27. </view>
  28. <view class="bpm-card-info">
  29. <view class="bpm-user">
  30. <view class="bpm-avatar">
  31. {{ item.processInstance?.startUser?.nickname?.[0] || '?' }}
  32. </view>
  33. <text class="bpm-nickname">{{ item.processInstance?.startUser?.nickname }}</text>
  34. </view>
  35. <text class="bpm-time--warning">{{ formatPast(item.createTime) }}</text>
  36. </view>
  37. </view>
  38. <view class="bpm-actions">
  39. <view class="bpm-action-btn" @click.stop="handleReject(item)">
  40. <text>拒绝</text>
  41. </view>
  42. <view class="bpm-action-btn" @click.stop="handleApprove(item)">
  43. <text>同意</text>
  44. </view>
  45. </view>
  46. </view>
  47. <!-- 加载更多 -->
  48. <view v-if="loadMoreState !== 'loading' && list.length === 0" class="bpm-empty">
  49. <wd-status-tip image="content" tip="暂无待办任务" />
  50. </view>
  51. <wd-loadmore
  52. v-if="list.length > 0"
  53. :state="loadMoreState"
  54. @reload="loadMore"
  55. />
  56. </view>
  57. </view>
  58. </template>
  59. <script lang="ts" setup>
  60. import type { Task } from '@/api/bpm/task'
  61. import type { LoadMoreState } from '@/http/types'
  62. import { onReachBottom } from '@dcloudio/uni-app'
  63. import { onMounted, ref } from 'vue'
  64. import { getTaskTodoPage } from '@/api/bpm/task'
  65. import { formatPast } from '@/utils/date'
  66. import TodoSearchForm from './todo-search-form.vue'
  67. import '../styles/index.scss'
  68. const total = ref(0)
  69. const list = ref<Task[]>([])
  70. const loadMoreState = ref<LoadMoreState>('loading')
  71. const queryParams = ref({
  72. pageNo: 1,
  73. pageSize: 10,
  74. })
  75. /** 查询列表 */
  76. async function getList() {
  77. loadMoreState.value = 'loading'
  78. try {
  79. const data = await getTaskTodoPage(queryParams.value)
  80. list.value = [...list.value, ...data.list]
  81. total.value = data.total
  82. loadMoreState.value = list.value.length >= total.value ? 'finished' : 'loading'
  83. } catch {
  84. queryParams.value.pageNo = queryParams.value.pageNo > 1 ? queryParams.value.pageNo - 1 : 1
  85. loadMoreState.value = 'error'
  86. }
  87. }
  88. /** 加载更多 */
  89. function loadMore() {
  90. if (loadMoreState.value === 'finished') {
  91. return
  92. }
  93. queryParams.value.pageNo++
  94. getList()
  95. }
  96. /** 搜索 */
  97. function handleSearch(data?: Record<string, any>) {
  98. queryParams.value = {
  99. ...data,
  100. pageNo: 1,
  101. pageSize: queryParams.value.pageSize,
  102. }
  103. list.value = []
  104. getList()
  105. }
  106. /** 重置 */
  107. function handleReset() {
  108. handleSearch()
  109. }
  110. /** 查看详情 */
  111. function handleDetail(item: Task) {
  112. uni.navigateTo({ url: `/pages-bpm/processInstance/detail/index?id=${item.processInstance.id}&taskId=${item.id}` })
  113. }
  114. /** 同意 */
  115. function handleApprove(item: Task) {
  116. uni.navigateTo({ url: `/pages-bpm/processInstance/detail/audit/index?id=${item.id}&pass=true` })
  117. }
  118. /** 拒绝 */
  119. function handleReject(item: Task) {
  120. uni.navigateTo({ url: `/pages-bpm/processInstance/detail/audit/index?id=${item.id}&pass=false` })
  121. }
  122. /** 触底加载更多 */
  123. onReachBottom(() => {
  124. loadMore()
  125. })
  126. /** 初始化 */
  127. onMounted(() => {
  128. getList()
  129. })
  130. </script>