index.jsx 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import React, { useState, useEffect } from 'react'
  2. import WuYeBanner from '@/components/WuYeBanner/index'
  3. import ScrollPageRefresh from '@/components/ScrollPageRefresh/index'
  4. import request, { apis } from '@/utils/request'
  5. import nav2detail from '@/utils/nav2detail'
  6. import Taro from '@tarojs/taro'
  7. import { Swiper, SwiperItem } from '@tarojs/components'
  8. import { Checkbox, CheckboxGroup } from '@tarojs/components'
  9. import '@/assets/css/reset.less'
  10. import '@/assets/css/iconfont.less'
  11. import './index.less'
  12. const cancelOrder = outTradeNo => {
  13. return new Promise((resolve, reject) => {
  14. if (outTradeNo) {
  15. request({ ...apis.wxCancelPay, args: { outTradeNo }, params: { type: 'bill' } })
  16. .then(res => resolve(res))
  17. .catch(err => reject(err))
  18. } else {
  19. resolve()
  20. }
  21. })
  22. }
  23. export default function WuYeJiaoFei () {
  24. const [PageList, setPageList] = useState([])
  25. const [BannerList, setBannerList] = useState([])
  26. const [checkedIds, setCheckedIds] = useState([])
  27. const [totalPrice, setTotalPrice] = useState(0)
  28. const [IsEmpty, setIsEmpty] = useState(false)
  29. const [ToReset, setToReset] = useState(false)
  30. useEffect(() => {
  31. GetBanner()
  32. }, [])
  33. const pay = idArray => {
  34. return new Promise((resolve, reject) => {
  35. // 准备下单
  36. request({ ...apis.wxStartPay, data: { type: 'bill', idArray } }).then(res => {
  37. const outTradeNo = res.outTradeNo
  38. // 下单
  39. request({ ...apis.wxUnifiedOrder, args: { outTradeNo }, params: { type: 'bill' } }).then(res => {
  40. Taro.requestPayment({
  41. timeStamp: res.timeStamp,
  42. nonceStr: res.nonceStr,
  43. package: res.package,
  44. paySign: res.sign,
  45. signType: res.signType,
  46. success: resp => {
  47. resolve({ ...resp, orderId: outTradeNo })
  48. },
  49. fail: err => {
  50. cancelOrder(outTradeNo)
  51. reject(err)
  52. }
  53. })
  54. }).catch(err => {
  55. cancelOrder(outTradeNo)
  56. reject(err)
  57. })
  58. }).catch(err => reject(err))
  59. })
  60. }
  61. const GetBanner = (done = () => { }) => { // 获取轮播图
  62. request({ ...apis.getBanner, params: { showPosition: `property`, showType: 'banner', pageNum: 1, pageSize: 5 } }).then((res) => {
  63. setBannerList([...(res || [])])
  64. done()
  65. }).catch(() => {
  66. done()
  67. })
  68. }
  69. const Refresh = (e) => { // 下拉刷新
  70. if (e && e.length) {
  71. setIsEmpty(false)
  72. // 缴费中的不显示
  73. const list = e.filter(x => x.billStatus !== '3')
  74. setPageList(list)
  75. } else {
  76. setIsEmpty(true)
  77. }
  78. }
  79. const Push = (e) => { // 上拉加载
  80. setPageList(PageList.concat(e))
  81. }
  82. const handleGroupChange = e => {
  83. const ids = e.detail.value || []
  84. setCheckedIds(ids.map(x => x - 0))
  85. }
  86. const handlePay = () => {
  87. Taro.showModal({
  88. title: '提示',
  89. content: `确定缴费 ${totalPrice} 元?`,
  90. success: res => {
  91. if (res.confirm) {
  92. pay(checkedIds).then((res) => {
  93. Taro.showToast({
  94. title: '缴费成功',
  95. icon: 'success'
  96. })
  97. setToReset(true)
  98. // Taro.navigateTo({ url: `/pages/WuYe/JiaoFeiDetail/index?id=${res.orderId}` })
  99. // 页面刷新
  100. // todo
  101. }).catch(err => {
  102. Taro.showToast({
  103. title: (err.message || err.errMsg || err),
  104. icon: 'none'
  105. })
  106. })
  107. }
  108. }
  109. })
  110. }
  111. useEffect(() => {
  112. const items = checkedIds.map(x => PageList.filter(y => y.id === x)[0]).filter(Boolean)
  113. const total = items.reduce((acc, x) => acc + x.payPrice, 0)
  114. setTotalPrice(total)
  115. }, [checkedIds, PageList])
  116. return (
  117. <view className='WuYeJiaoFei flex-v'>
  118. <view className='flex-item'>
  119. <view>
  120. <ScrollPageRefresh
  121. IsEmpty={IsEmpty}
  122. ApiName={`getJiaoFeiList`}
  123. ListName={`list`}
  124. RequestUrlData={{ type: 0 }}
  125. Refresh={Refresh}
  126. Push={Push}
  127. Reset={ToReset}
  128. CloseReset={() => { setToReset(false) }}
  129. KeepChildren={
  130. <view>
  131. {/* 大图 */}
  132. <view className='BigImg'>
  133. <view>
  134. <WuYeBanner List={BannerList}></WuYeBanner>
  135. </view>
  136. </view>
  137. </view>
  138. }
  139. >
  140. {/* 缴费列表 */}
  141. <view className='List'>
  142. <CheckboxGroup onChange={handleGroupChange}>
  143. {
  144. PageList.map((item, index) => (
  145. <Checkbox className='CheckBoxItem' key={`WuYeJiaoFeiItem-${index}`} value={item.id} disabled={item.billStatus !== '0'}>
  146. {/* <WuYeJiaoFeiItem Data={item}></WuYeJiaoFeiItem> */}
  147. <view className='flex-h'>
  148. <view className='flex-item'>{item.billInvoiceExplain}</view>
  149. <view className='Price'>{`${item.payPrice} 元`}</view>
  150. </view>
  151. </Checkbox>
  152. ))
  153. }
  154. </CheckboxGroup>
  155. </view>
  156. </ScrollPageRefresh>
  157. </view>
  158. </view>
  159. <view className='PayLine flex-h'>
  160. <view>
  161. <text>总金额:</text>
  162. </view>
  163. <view className='flex-item'>
  164. <text>{totalPrice}元</text>
  165. </view>
  166. <view className='Btn'>
  167. <text onClick={handlePay}>支付</text>
  168. </view>
  169. </view>
  170. </view>
  171. )
  172. }