Result.jsx 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import React, { useEffect, useState } from 'react'
  2. import { ScrollView } from '@tarojs/components'
  3. import InnerTabs from '@/components/Tabs'
  4. import './style.scss'
  5. const tabs = ['等额本息', '等额本金']
  6. const getMixList = (lst1, lst2) => {
  7. const len = lst1.length > lst2.length ? lst1.length : lst2.length
  8. const rtn = []
  9. let lastPaid1 = 0;
  10. let lastPaid2 = 0;
  11. for (let i = 0; i < len; i += 1) {
  12. const it1 = lst1[i] || {}
  13. const it2 = lst2[i] || {}
  14. const paid1 = it1.paid || 0;
  15. const paid2 = it2.paid || 0;
  16. rtn.push({
  17. benjin: (it1.benjin || 0) + (it2.benjin || 0),
  18. benxi: (it1.benxi || 0) + (it2.benxi || 0),
  19. rate: (it1.rate || 0) + (it2.rate || 0),
  20. paid: (paid1 || lastPaid1) + (paid2 || lastPaid2),
  21. })
  22. if (paid1 > 0) {
  23. lastPaid1 = paid1;
  24. }
  25. if (paid2 > 0) {
  26. lastPaid2 = paid2;
  27. }
  28. }
  29. return rtn;
  30. }
  31. export default (props) => {
  32. const { dataSource, isMixed, onClose } = props
  33. const [current, setCurrent] = useState(1)
  34. const [data, setData] = useState({})
  35. const [summary, setSummary] = useState({})
  36. const [list, setList] = useState([])
  37. const tipText = current === 1 ? '每月还款' : '贷款总额'
  38. useEffect(() => {
  39. if (!dataSource[0] && !dataSource[1]) return;
  40. if (isMixed) {
  41. //
  42. const bj = {
  43. summary: {
  44. money: dataSource[0].bj.summary.money + dataSource[1].bj.summary.money,
  45. moneyOfFirstMonth: dataSource[0].bj.summary.moneyOfFirstMonth + dataSource[1].bj.summary.moneyOfFirstMonth,
  46. totalRate: dataSource[0].bj.summary.totalRate + dataSource[1].bj.summary.totalRate,
  47. totalMoney: dataSource[0].bj.summary.totalMoney + dataSource[1].bj.summary.totalMoney,
  48. },
  49. list: getMixList(dataSource[0].bj.list, dataSource[1].bj.list)
  50. }
  51. const bx = {
  52. summary: {
  53. money: dataSource[0].bx.summary.money + dataSource[1].bx.summary.money,
  54. moneyOfFirstMonth: dataSource[0].bx.summary.moneyOfFirstMonth + dataSource[1].bx.summary.moneyOfFirstMonth,
  55. totalRate: dataSource[0].bx.summary.totalRate + dataSource[1].bx.summary.totalRate,
  56. totalMoney: dataSource[0].bx.summary.totalMoney + dataSource[1].bx.summary.totalMoney,
  57. },
  58. list: getMixList(dataSource[0].bx.list, dataSource[1].bx.list)
  59. }
  60. setData({ bj, bx })
  61. } else {
  62. const res = dataSource[0] || dataSource[1]
  63. setData(res)
  64. }
  65. }, [dataSource, isMixed])
  66. useEffect(() => {
  67. const { bj, bx } = data || {}
  68. if (current === 1) {
  69. setSummary(bx?.summary || {})
  70. setList(bx?.list || [])
  71. } else {
  72. setSummary(bj?.summary || {})
  73. setList(bj?.list || [])
  74. }
  75. }, [current, data])
  76. return (
  77. <view className='calc-result'>
  78. <view className='header-nav'>
  79. <InnerTabs tabs={tabs} current={current} onChange={setCurrent} />
  80. <view className='header-close' onClick={onClose}>
  81. <text>重新计算</text>
  82. </view>
  83. </view>
  84. <view className='summary-card'>
  85. <view className='tip'>{tipText}</view>
  86. <view className='money'>
  87. {current !== 1 ? Number(summary.money / 10000).toFixed(0) : Number(summary.moneyOfFirstMonth || 0).toFixed(2)}
  88. <text className='small'>{current !== 1 ? '万元' : '元'}</text>
  89. </view>
  90. <view className='footer flex'>
  91. <view>
  92. <view>{`${Number((summary.totalRate || 0) / 10000).toFixed(2)}万`}</view>
  93. <view className='label'>利息总额</view>
  94. </view>
  95. <view>
  96. <view>{`${Number((summary.totalMoney || 0) / 10000).toFixed(2)}万`}</view>
  97. <view className='label'>还款总额</view>
  98. </view>
  99. {
  100. current === 1 && (
  101. <view>
  102. <view>{`${Number(summary.money || 0 / 10000).toFixed(0)}万`}</view>
  103. <view className='label'>贷款金额</view>
  104. </view>
  105. )
  106. }
  107. {
  108. !isMixed && (
  109. <view>
  110. <view>{`${summary.year || 0}年`}</view>
  111. <view className='label'>贷款期限</view>
  112. </view>
  113. )
  114. }
  115. </view>
  116. </view>
  117. <view className='result-list'>
  118. <view className='flex result-list-item result-list-title'>
  119. <view>期数</view>
  120. <view>月供总额</view>
  121. <view>月供本金</view>
  122. <view>月供利息</view>
  123. <view>剩余还款</view>
  124. </view>
  125. <ScrollView scrollY className='result-scroll'>
  126. {
  127. list.map((it, inx) => {
  128. const no = inx + 1
  129. const benxi = Number(it.benxi).toFixed(0)
  130. const benjin = Number(it.benjin).toFixed(0)
  131. const rate = Number(it.rate).toFixed(0)
  132. const left = Number(summary.totalMoney - it.paid).toFixed(0)
  133. return (
  134. <view className='flex result-list-item' key={inx}>
  135. <view>{no}</view>
  136. <view>{benxi}</view>
  137. <view>{benjin}</view>
  138. <view>{rate}</view>
  139. <view>{left}</view>
  140. </view>
  141. )
  142. })
  143. }
  144. </ScrollView>
  145. </view>
  146. </view>
  147. )
  148. }