index.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import Header from '@/components/Header'
  2. import { tenderStore } from '@/store/mobx'
  3. import consts from '@/utils/consts'
  4. import React, { useEffect, useState, useMemo } from 'react'
  5. import { useActivate } from 'react-activation'
  6. import { apiGetContractSurvey } from './api'
  7. import Content from './components/Content'
  8. import './index.scss'
  9. type ireturnDate = {
  10. [key: string]: number
  11. }
  12. interface iBaseState {
  13. closeNumber: number
  14. performNumber: number
  15. returnDate: ireturnDate
  16. totalContractPrice: number
  17. totalContractPriceShow: number
  18. uncloseNumber: number
  19. }
  20. interface iExpenditureState extends iBaseState {
  21. totalPaidPriceShow: number
  22. }
  23. interface iIncomeState extends iBaseState {
  24. totalReturnPriceShow: number
  25. }
  26. interface iContractSummaryState {
  27. expenditureData: iExpenditureState
  28. incomeData: iIncomeState
  29. }
  30. export default function Summary() {
  31. useEffect(() => {
  32. initData()
  33. }, [ tenderStore.bid ])
  34. useActivate(() => initData())
  35. const [ state, setState ] = useState<iContractSummaryState>({
  36. expenditureData: {
  37. closeNumber: 0,
  38. performNumber: 0,
  39. returnDate: {},
  40. totalContractPrice: 0,
  41. totalContractPriceShow: 0,
  42. totalPaidPriceShow: 0,
  43. uncloseNumber: 0
  44. },
  45. incomeData: {
  46. closeNumber: 0,
  47. performNumber: 0,
  48. returnDate: {},
  49. totalContractPrice: 0,
  50. totalContractPriceShow: 0,
  51. totalReturnPriceShow: 0,
  52. uncloseNumber: 0
  53. }
  54. })
  55. const initData = async () => {
  56. const { code = -1, data } = await apiGetContractSurvey(tenderStore.bid)
  57. if (code === consts.RET_CODE.SUCCESS) {
  58. setState({ ...state, ...data })
  59. }
  60. }
  61. const expenditurePieData = useMemo(() => {
  62. const { closeNumber, performNumber, uncloseNumber, totalContractPrice, totalContractPriceShow, totalPaidPriceShow, returnDate } = state.expenditureData
  63. const pieData = [
  64. {
  65. type: '正常关闭',
  66. value: closeNumber
  67. },
  68. {
  69. type: '履行中',
  70. value: performNumber
  71. },
  72. {
  73. type: '待关闭',
  74. value: uncloseNumber
  75. }
  76. ]
  77. const dualAxes = []
  78. for (const key in returnDate) {
  79. if (Object.prototype.hasOwnProperty.call(returnDate, key)) {
  80. const value = returnDate[key]
  81. dualAxes.push({ month: key, value })
  82. }
  83. }
  84. const newDualAxes = dualAxes.map(item => {
  85. return { ...item, count: item.value / totalContractPrice * 100 }
  86. })
  87. const progress = totalPaidPriceShow ? (totalPaidPriceShow / totalContractPrice) : 0
  88. return { pieData, returnDate: newDualAxes, totalContractPrice, totalContractPriceShow, totalPaidPriceShow, progress }
  89. }, [ state.expenditureData ])
  90. const incomePieData = useMemo(() => {
  91. const { closeNumber, performNumber, uncloseNumber, returnDate, totalContractPrice, totalContractPriceShow, totalReturnPriceShow } = state.incomeData
  92. const pieData = [
  93. {
  94. type: '正常关闭',
  95. value: closeNumber
  96. },
  97. {
  98. type: '履行中',
  99. value: performNumber
  100. },
  101. {
  102. type: '待关闭',
  103. value: uncloseNumber
  104. }
  105. ]
  106. const dualAxes = []
  107. for (const key in returnDate) {
  108. if (Object.prototype.hasOwnProperty.call(returnDate, key)) {
  109. const value = returnDate[key] as number
  110. dualAxes.push({ month: key, value })
  111. }
  112. }
  113. const newDualAxes = dualAxes.map(item => {
  114. return { ...item, count: item.value / totalContractPrice * 100 }
  115. })
  116. const progress = totalReturnPriceShow ? (totalReturnPriceShow / totalContractPrice) : 0
  117. return { pieData, returnDate: newDualAxes, totalContractPrice, totalContractPriceShow, totalReturnPriceShow, progress }
  118. }, [ state.incomeData ])
  119. return (
  120. <div className="wrap-contaniner">
  121. <Header title="合同概况"></Header>
  122. <div className="wrap-content m-3 pi-grid pi-col-2 pi-col-space-3">
  123. <Content data={expenditurePieData} type="expenditure"></Content>
  124. <Content data={incomePieData} type="income"></Content>
  125. </div>
  126. </div>
  127. )
  128. }