index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import Header from '@/components/Header'
  2. import { tenderStore } from '@/store/mobx'
  3. import consts from '@/utils/consts'
  4. import dayjs from 'dayjs'
  5. import React, { useEffect, useState, useMemo } from 'react'
  6. import { useActivate } from 'react-activation'
  7. import { Link } from 'react-router-dom'
  8. import { apiGetSafeSurvey } from './api'
  9. import ColumnChart from './columnChart'
  10. import './index.scss'
  11. import PieChart from './pieChart'
  12. export interface SafeColumnCharType {
  13. name: 'rectifyed' | 'submit'
  14. month: string
  15. count: number
  16. }
  17. export interface SafeLineChartType {
  18. month: string
  19. percentage: number
  20. }
  21. interface iRectifyData {
  22. auditName: string
  23. createTime: string
  24. id: string
  25. inspectionDetail: string
  26. status: number
  27. }
  28. interface iSummaryState {
  29. approvalTotal: number
  30. rectifyTotal: number
  31. rectifyedTotal: number
  32. rectifylist: iRectifyData[]
  33. columnarData: SafeColumnCharType[]
  34. lineData: SafeLineChartType[]
  35. }
  36. const Summary: React.FC<{}> = () => {
  37. const [ state, setState ] = useState<iSummaryState>({
  38. approvalTotal: 0,
  39. rectifyTotal: 0,
  40. rectifyedTotal: 0,
  41. rectifylist: [],
  42. columnarData: [],
  43. lineData: []
  44. })
  45. useEffect(() => {
  46. initData()
  47. }, [ tenderStore.bid ])
  48. useActivate(() => {
  49. initData()
  50. })
  51. useActivate(() => initData())
  52. const initData = async () => {
  53. const { data, code = -1 } = await apiGetSafeSurvey(tenderStore.bid)
  54. if (code === consts.RET_CODE.SUCCESS) {
  55. setState({ ...state, ...data })
  56. }
  57. }
  58. const pieData = useMemo(() => {
  59. const data = [
  60. {
  61. type: '审批中',
  62. value: state.approvalTotal
  63. },
  64. {
  65. type: '整改中',
  66. value: state.rectifyTotal
  67. },
  68. {
  69. type: '已整改',
  70. value: state.rectifyedTotal
  71. }
  72. ]
  73. return data
  74. }, [ state.approvalTotal, state.rectifyTotal, state.rectifyedTotal ])
  75. const columnCharData = useMemo(() => {
  76. return { columnData: state.columnarData, lineData: state.lineData }
  77. }, [ state.columnarData, state.lineData ])
  78. const handleDate = (createTime: string) => {
  79. return dayjs(new Date()).diff(dayjs(createTime), 'day') + '天'
  80. }
  81. return (
  82. <div className="wrap-contaniner">
  83. <Header title="巡检概况"></Header>
  84. <div className="wrap-content m-3 pi-flex-column pi-justify-start">
  85. <div className="pi-justify-start">
  86. <div className="pi-flex-twice card pi-flex-column">
  87. <header className="card-title">整改中 ({state.rectifyTotal}) </header>
  88. <div>
  89. {state.rectifylist.map(item => {
  90. return (
  91. <div key={item.id} className="pi-justify-between pi-lh-18 pi-height-18">
  92. <Link to={{ pathname: '/console/safe/content/detail/info', state: { saveId: item.id } }}>{item.inspectionDetail}</Link>
  93. <div className="pi-align-center">
  94. <span className="pi-mg-right-5">{item.auditName}</span>
  95. <span className="pi-badge danger">{handleDate(item.createTime)}</span>
  96. </div>
  97. </div>
  98. )
  99. })}
  100. </div>
  101. </div>
  102. <div className="pi-flex-treble pi-mg-left-30 card">
  103. <PieChart data={pieData}></PieChart>
  104. </div>
  105. </div>
  106. <div className="card echarts-column-chart mt-3">
  107. <h5 className="pi-fz-25 pi-fw-5">整改趋势</h5>
  108. <div className="pi-width-100P">
  109. <ColumnChart data={columnCharData}></ColumnChart>
  110. </div>
  111. </div>
  112. </div>
  113. </div>
  114. )
  115. }
  116. export default Summary