StudyTimeDualAxes.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { DualAxes } from "@ant-design/plots";
  2. import { message } from "antd";
  3. import { useEffect, useState } from "react";
  4. import { get } from "../../request";
  5. import type {
  6. IUserOperationDailyRequest,
  7. IUserOperationDailyResponse,
  8. } from "../../api/Exp";
  9. interface IDailyData {
  10. time: string;
  11. sum: number;
  12. hit: number;
  13. }
  14. interface IWidget {
  15. studioName?: string;
  16. }
  17. const StudyTimeDualAxesWidget = ({ studioName }: IWidget) => {
  18. const [dailyData, setDailyData] = useState<IDailyData[]>([]);
  19. useEffect(() => {
  20. get<IUserOperationDailyResponse>(
  21. `/v2/user-operation-daily?view=user-all&studio_name=${studioName}`
  22. ).then((json) => {
  23. if (json.ok) {
  24. if (json.data.count === 0) {
  25. return;
  26. }
  27. let timeSum = 0;
  28. /**
  29. * 算法
  30. * 返回的数据只包涵有活动的天。需要补足缺失的日子。
  31. * 找到最小日期
  32. * 查询从最小时期到现在的每天的数值
  33. */
  34. const today = new Date();
  35. const fullData: IUserOperationDailyRequest[] = [];
  36. for (
  37. let day = json.data.rows[0].date_int;
  38. day < today.getTime();
  39. day += 24 * 3600 * 1000
  40. ) {
  41. const currDay = json.data.rows.find(
  42. (value) =>
  43. new Date(value.date_int).toLocaleDateString() ===
  44. new Date(day).toLocaleDateString()
  45. );
  46. if (currDay) {
  47. fullData.push(currDay);
  48. } else {
  49. fullData.push({
  50. date_int: day,
  51. duration: 0,
  52. hit: 0,
  53. });
  54. }
  55. }
  56. const data = fullData.map((item) => {
  57. const date = new Date(item.date_int);
  58. timeSum += item.duration / 1000 / 3600;
  59. return {
  60. time:
  61. date.getFullYear() +
  62. "-" +
  63. (date.getMonth() + 1) +
  64. "-" +
  65. date.getDate(),
  66. sum: timeSum,
  67. hit: item.hit ? item.hit : 0,
  68. };
  69. });
  70. console.log("data", data);
  71. setDailyData(data);
  72. } else {
  73. message.error(json.message);
  74. }
  75. });
  76. }, [studioName]);
  77. const config = {
  78. data: [dailyData, dailyData],
  79. xField: "time",
  80. yField: ["hit", "sum"],
  81. limitInPlot: false,
  82. padding: [10, 20, 80, 30],
  83. // 需要设置底部 padding 值,同 css
  84. slider: {},
  85. meta: {
  86. time: {
  87. sync: false, // 开启之后 slider 无法重绘
  88. },
  89. },
  90. geometryOptions: [
  91. {
  92. geometry: "column",
  93. },
  94. {
  95. geometry: "line",
  96. },
  97. ],
  98. };
  99. return <DualAxes {...config} />;
  100. };
  101. export default StudyTimeDualAxesWidget;