hazard-treatment-stats.tsx 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. "use client"
  2. import {Card, Col, DatePicker, Row, Select, Space} from "antd"
  3. import EChart from "@/components/echarts"
  4. import {useState} from "react"
  5. const { RangePicker } = DatePicker
  6. const { Option } = Select
  7. export default function HazardTreatmentStats() {
  8. const [timeRange, setTimeRange] = useState("month")
  9. // 隐患类型统计数据
  10. const hazardTypeData = [
  11. { type: "压力异常", count: 45, percentage: 28.8 },
  12. { type: "泄漏隐患", count: 38, percentage: 24.4 },
  13. { type: "设施损坏", count: 35, percentage: 22.4 },
  14. { type: "管道老化", count: 25, percentage: 16.0 },
  15. { type: "其他", count: 13, percentage: 8.3 },
  16. ]
  17. // 处理状态统计数据
  18. const statusData = [
  19. { status: "已完成", count: 88, color: "#52c41a" },
  20. { status: "处理中", count: 45, color: "#faad14" },
  21. { status: "待处理", count: 23, color: "#f5222d" },
  22. ]
  23. // 月度趋势数据
  24. const trendData = [
  25. { month: "2023-07", 新增: 12, 完成: 8, 处理中: 4 },
  26. { month: "2023-08", 新增: 15, 完成: 12, 处理中: 7 },
  27. { month: "2023-09", 新增: 18, 完成: 15, 处理中: 10 },
  28. { month: "2023-10", 新增: 22, 完成: 18, 处理中: 14 },
  29. { month: "2023-11", 新增: 20, 完成: 22, 处理中: 12 },
  30. { month: "2023-12", 新增: 16, 完成: 20, 处理中: 8 },
  31. { month: "2024-01", 新增: 25, 完成: 16, 处理中: 17 },
  32. ]
  33. // 处理效率数据
  34. const efficiencyData = [
  35. { department: "管网维护部", 平均处理天数: 8.5, 完成率: 92 },
  36. { department: "安全监察部", 平均处理天数: 12.3, 完成率: 88 },
  37. { department: "技术服务部", 平均处理天数: 6.8, 完成率: 95 },
  38. { department: "应急抢修部", 平均处理天数: 4.2, 完成率: 98 },
  39. ]
  40. const barOption = {
  41. title: { text: "隐患类型分布", left: "center" },
  42. tooltip: { trigger: "axis" },
  43. grid: { left: "3%", right: "4%", bottom: "3%", containLabel: true },
  44. xAxis: { type: "value" },
  45. yAxis: {
  46. type: "category",
  47. data: hazardTypeData.map((item) => item.type),
  48. },
  49. series: [
  50. {
  51. type: "bar",
  52. data: hazardTypeData.map((item) => item.count),
  53. itemStyle: {
  54. color: (params: any) => {
  55. const colors = ["#1890ff", "#52c41a", "#faad14", "#f5222d", "#722ed1"]
  56. return colors[params.dataIndex % colors.length]
  57. },
  58. },
  59. },
  60. ],
  61. }
  62. const pieOption = {
  63. title: { text: "处理状态分布", left: "center" },
  64. tooltip: { trigger: "item" },
  65. legend: { orient: "vertical", left: "left" },
  66. series: [
  67. {
  68. type: "pie",
  69. radius: "50%",
  70. data: statusData.map((item) => ({
  71. value: item.count,
  72. name: item.status,
  73. itemStyle: { color: item.color },
  74. })),
  75. emphasis: {
  76. itemStyle: {
  77. shadowBlur: 10,
  78. shadowOffsetX: 0,
  79. shadowColor: "rgba(0, 0, 0, 0.5)",
  80. },
  81. },
  82. },
  83. ],
  84. }
  85. const lineOption = {
  86. title: { text: "隐患处理趋势", left: "center" },
  87. tooltip: { trigger: "axis" },
  88. legend: { data: ["新增", "完成", "处理中"] },
  89. grid: { left: "3%", right: "4%", bottom: "3%", containLabel: true },
  90. xAxis: {
  91. type: "category",
  92. data: trendData.map((item) => item.month),
  93. },
  94. yAxis: { type: "value" },
  95. series: [
  96. {
  97. name: "新增",
  98. type: "line",
  99. data: trendData.map((item) => item.新增),
  100. itemStyle: { color: "#1890ff" },
  101. },
  102. {
  103. name: "完成",
  104. type: "line",
  105. data: trendData.map((item) => item.完成),
  106. itemStyle: { color: "#52c41a" },
  107. },
  108. {
  109. name: "处理中",
  110. type: "line",
  111. data: trendData.map((item) => item.处理中),
  112. itemStyle: { color: "#faad14" },
  113. },
  114. ],
  115. }
  116. const efficiencyBarOption = {
  117. title: { text: "部门处理效率", left: "center" },
  118. tooltip: { trigger: "axis" },
  119. grid: { left: "3%", right: "4%", bottom: "3%", containLabel: true },
  120. xAxis: {
  121. type: "category",
  122. data: efficiencyData.map((item) => item.department),
  123. },
  124. yAxis: { type: "value", name: "平均处理天数" },
  125. series: [
  126. {
  127. type: "bar",
  128. data: efficiencyData.map((item) => item.平均处理天数),
  129. itemStyle: { color: "#722ed1" },
  130. },
  131. ],
  132. }
  133. return (
  134. <div className="p-6">
  135. <Card title="隐患治理统计分析">
  136. <div className="mb-6">
  137. <Space>
  138. <Select value={timeRange} onChange={setTimeRange} style={{ width: 120 }}>
  139. <Option value="week">本周</Option>
  140. <Option value="month">本月</Option>
  141. <Option value="quarter">本季度</Option>
  142. <Option value="year">本年</Option>
  143. </Select>
  144. <RangePicker />
  145. </Space>
  146. </div>
  147. {/* 统计概览 */}
  148. <Row gutter={16} className="mb-6">
  149. <Col span={6}>
  150. <Card size="small">
  151. <div className="text-center">
  152. <div className="text-2xl font-bold text-blue-600">156</div>
  153. <div className="text-gray-600">隐患总数</div>
  154. </div>
  155. </Card>
  156. </Col>
  157. <Col span={6}>
  158. <Card size="small">
  159. <div className="text-center">
  160. <div className="text-2xl font-bold text-green-600">88</div>
  161. <div className="text-gray-600">已完成</div>
  162. <div className="text-sm text-gray-500">完成率: 56.4%</div>
  163. </div>
  164. </Card>
  165. </Col>
  166. <Col span={6}>
  167. <Card size="small">
  168. <div className="text-center">
  169. <div className="text-2xl font-bold text-orange-600">45</div>
  170. <div className="text-gray-600">处理中</div>
  171. <div className="text-sm text-gray-500">占比: 28.8%</div>
  172. </div>
  173. </Card>
  174. </Col>
  175. <Col span={6}>
  176. <Card size="small">
  177. <div className="text-center">
  178. <div className="text-2xl font-bold text-red-600">23</div>
  179. <div className="text-gray-600">待处理</div>
  180. <div className="text-sm text-gray-500">占比: 14.7%</div>
  181. </div>
  182. </Card>
  183. </Col>
  184. </Row>
  185. {/* 图表展示 */}
  186. <Row gutter={16} className="mb-6">
  187. <Col span={12}>
  188. <Card title="隐患类型分布" size="small">
  189. <EChart option={barOption} style={{ height: 300 }} />
  190. </Card>
  191. </Col>
  192. <Col span={12}>
  193. <Card title="处理状态分布" size="small">
  194. <EChart option={pieOption} style={{ height: 300 }} />
  195. </Card>
  196. </Col>
  197. </Row>
  198. <Row gutter={16} className="mb-6">
  199. <Col span={24}>
  200. <Card title="隐患处理趋势" size="small">
  201. <EChart option={lineOption} style={{ height: 300 }} />
  202. </Card>
  203. </Col>
  204. </Row>
  205. <Row gutter={16}>
  206. <Col span={12}>
  207. <Card title="部门处理效率" size="small">
  208. <EChart option={efficiencyBarOption} style={{ height: 300 }} />
  209. </Card>
  210. </Col>
  211. <Col span={12}>
  212. <Card title="处理效率统计" size="small">
  213. <div className="space-y-4">
  214. {efficiencyData.map((item, index) => (
  215. <div key={index} className="flex justify-between items-center p-3 bg-gray-50 rounded">
  216. <div>
  217. <div className="font-medium">{item.department}</div>
  218. <div className="text-sm text-gray-600">平均处理: {item.平均处理天数}天</div>
  219. </div>
  220. <div className="text-right">
  221. <div className="text-lg font-bold text-green-600">{item.完成率}%</div>
  222. <div className="text-sm text-gray-600">完成率</div>
  223. </div>
  224. </div>
  225. ))}
  226. </div>
  227. </Card>
  228. </Col>
  229. </Row>
  230. </Card>
  231. </div>
  232. )
  233. }