index.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import OEmpty from '@/components/o-empty'
  2. import OHeader from '@/components/o-header'
  3. import OSearch from '@/components/o-search'
  4. import OSticky from '@/components/o-sticky'
  5. import { snedStatus } from '@/constant'
  6. import request from '@/helpers/request'
  7. import item from '@/student/coupons/item'
  8. import { Cell, CellGroup, Icon, List, Tab, Tabs } from 'vant'
  9. import { defineComponent, onMounted, reactive } from 'vue'
  10. import { useRouter } from 'vue-router'
  11. import styles from './index.module.less'
  12. export default defineComponent({
  13. name: 'mass-message',
  14. setup() {
  15. const router = useRouter()
  16. const status = sessionStorage.getItem('mass-message-send')
  17. const state = reactive({
  18. list: [],
  19. dataShow: true, // 判断是否有数据
  20. loading: false,
  21. finished: false,
  22. tabValue: status || 'WAIT',
  23. params: {
  24. keyword: null as any,
  25. sendStatus: status || 'WAIT',
  26. page: 1,
  27. rows: 10
  28. },
  29. isClick: false
  30. })
  31. const getList = async () => {
  32. try {
  33. if (state.isClick) return
  34. state.isClick = true
  35. const res = await request.post('/api-school/imMessageBatchSending/page', {
  36. data: {
  37. ...state.params
  38. }
  39. })
  40. state.isClick = false
  41. state.loading = false
  42. const result = res.data || {}
  43. // 处理重复请求数据
  44. if (state.list.length > 0 && result.current === 1) {
  45. return
  46. }
  47. state.list = state.list.concat(result.rows || [])
  48. state.finished = result.current >= result.pages
  49. state.params.page = result.current + 1
  50. state.dataShow = state.list.length > 0
  51. } catch {
  52. state.isClick = false
  53. state.dataShow = false
  54. state.finished = true
  55. }
  56. }
  57. // 搜索
  58. const onSearch = () => {
  59. state.params.page = 1
  60. state.list = []
  61. state.dataShow = true // 判断是否有数据
  62. state.loading = false
  63. state.finished = false
  64. getList()
  65. }
  66. // 查看详情
  67. const onDetail = async (item: any) => {
  68. router.push({
  69. path: '/create-message',
  70. query: {
  71. id: item.id
  72. }
  73. })
  74. }
  75. onMounted(() => {
  76. getList()
  77. })
  78. return () => (
  79. <div class={styles.massMessage}>
  80. <OSticky position="top">
  81. <OHeader border={false}>
  82. {{
  83. right: () => (
  84. <span
  85. style="color: var(--van-primary-color)"
  86. onClick={() => {
  87. router.push('/create-message')
  88. }}
  89. >
  90. 消息群发
  91. </span>
  92. )
  93. }}
  94. </OHeader>
  95. <Tabs
  96. lineWidth={18}
  97. v-model:active={state.tabValue}
  98. onChange={(val: string) => {
  99. state.params.sendStatus = val
  100. onSearch()
  101. sessionStorage.setItem('mass-message-send', val)
  102. }}
  103. >
  104. <Tab title="待发送" name="WAIT"></Tab>
  105. <Tab title="已发送" name="SEND"></Tab>
  106. </Tabs>
  107. <OSearch
  108. background="#f6f8f9"
  109. inputBackground="white"
  110. placeholder="请输入群聊/学员名称"
  111. onSearch={(val: string) => {
  112. console.log('val', val)
  113. state.params.keyword = val
  114. onSearch()
  115. }}
  116. />
  117. </OSticky>
  118. {state.dataShow ? (
  119. <List
  120. v-model:loading={state.loading}
  121. finished={state.finished}
  122. finishedText=" "
  123. class={[styles.liveList]}
  124. onLoad={getList}
  125. immediateCheck={false}
  126. >
  127. {state.list.map((item: any) => (
  128. <CellGroup inset onClick={() => onDetail(item)} style={{ marginBottom: '12px' }}>
  129. <Cell
  130. class={[styles.waitSend, item.sendStatus === 'SEND' && styles.messageSend]}
  131. titleStyle={{ flex: '1 auto' }}
  132. >
  133. {{
  134. title: () => (
  135. <div class={styles.time}>
  136. {item.sendStatus === 'WAIT' && (
  137. <Icon name="clock-o" class={styles.clockO} />
  138. )}
  139. {item.sendTime}
  140. </div>
  141. ),
  142. value: () => <span>{snedStatus[item.sendStatus]}</span>
  143. }}
  144. </Cell>
  145. <Cell valueClass={[styles.messageContent, 'van-multi-ellipsis--l3']}>
  146. {item.textMessage}
  147. </Cell>
  148. </CellGroup>
  149. ))}
  150. </List>
  151. ) : (
  152. <OEmpty btnStatus={false} tips="暂无群发消息" />
  153. )}
  154. </div>
  155. )
  156. }
  157. })