adExpandedRowRender.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import useEcharts from "@/Hook/useEcharts"
  2. import { GetColumnTrendProps, getAdgroupDetailsApi } from "@/services/adMonitor/adMonitor"
  3. import { Card, Descriptions, Empty, Select, Space, Spin, Typography } from "antd"
  4. import React, { useEffect, useMemo, useState } from "react"
  5. import { useModel } from "umi"
  6. import '../../launchSystemNew/adq/ad/index.less'
  7. import { useAjax } from "@/Hook/useAjax"
  8. import { BidModeEnum, BidStrategyEnum, OptimizationGoalEnum } from "@/services/launchAdq/enum"
  9. import TimeSeriesLook from "../../launchSystemNew/adq/ad/timeSeriesLook"
  10. import { ADGROUP_STATUS } from "../adqv3/const"
  11. const AdExpandedRowRender: React.FC<{ data: any, scrollLeft: number, width?: number }> = ({ data, scrollLeft, width = 0 }) => {
  12. const { getColumnTrendV3 } = useModel('useAdMonitor.useMonitor')
  13. const getAdgroupDetails = useAjax((params) => getAdgroupDetailsApi(params), { formatResult: true })
  14. const [queryColumnTrend, setQueryColumnTrend] = useState<GetColumnTrendProps>({ accountId: data.account_id, adgroupId: data.adgroup_id, trendColumns: ['view', 'cost'], timeUnit: 'hour' })
  15. const { LineMonitor } = useEcharts()
  16. const [lineDis, setLineDis] = useState<any[]>([])
  17. useEffect(() => {
  18. getAdgroupDetails.run({ accountId: data.account_id, adgroupId: data.adgroup_id })
  19. }, [data])
  20. useEffect(() => {
  21. getCTList()
  22. }, [queryColumnTrend])
  23. const getCTList = () => {
  24. getColumnTrendV3.run(queryColumnTrend).then(res => {
  25. if (res?.data) {
  26. let spendData: any = { legendName: '花费' }
  27. let exposureData: any = { legendName: '曝光次数' }
  28. res?.data?.forEach((item: { day: string, trend_unit: string, view: string, cost: string }) => {
  29. spendData[item?.trend_unit] = item?.cost
  30. exposureData[item?.trend_unit] = item?.view
  31. });
  32. setLineDis(() => [spendData, exposureData])
  33. }
  34. })
  35. }
  36. const AdContent = useMemo(() => {
  37. if (getAdgroupDetails?.data?.data) {
  38. const { adgroupName, bidAmount, bidMode, optimizationGoal, systemStatus, targetingTranslation, timeSeries, firstDayBeginTime, dailyBudget, bidStrategy,
  39. } = getAdgroupDetails?.data?.data
  40. return <Spin spinning={getAdgroupDetails.loading}>
  41. <Descriptions column={2} size="small" colon={false}>
  42. <Descriptions.Item labelStyle={{ width: 100, flex: '0 0 auto' }} label="广告名称">
  43. <div style={{ width: (width - 20) / 4 }}>
  44. <Typography.Text ellipsis={{ tooltip: true }}>{adgroupName}</Typography.Text>
  45. </div>
  46. </Descriptions.Item>
  47. <Descriptions.Item labelStyle={{ width: 100 }} label="状态">
  48. {ADGROUP_STATUS[systemStatus as keyof typeof ADGROUP_STATUS] || '--'}
  49. </Descriptions.Item>
  50. <Descriptions.Item labelStyle={{ width: 100 }} label="出价">{`${BidModeEnum[bidMode as keyof typeof BidModeEnum]} ${bidAmount}元/${bidMode === 'BID_MODE_CPM' ? '千次曝光' : bidMode === 'BID_MODE_CPC' ? '点击' : OptimizationGoalEnum[optimizationGoal as keyof typeof OptimizationGoalEnum]}`}</Descriptions.Item>
  51. <Descriptions.Item label="投放时间" labelStyle={{ width: 100 }}>{<TimeSeriesLook timeSeries={timeSeries} />}</Descriptions.Item>
  52. <Descriptions.Item label="定向" labelStyle={{ width: 100, flex: '0 0 auto' }} span={2}><div style={{ width: '98%' }}>
  53. <Typography.Paragraph ellipsis={{ tooltip: true, rows: 2 }}>{targetingTranslation}</Typography.Paragraph>
  54. </div></Descriptions.Item>
  55. <Descriptions.Item label="首日开始时间" labelStyle={{ width: 100 }}>{firstDayBeginTime}</Descriptions.Item>
  56. <Descriptions.Item label="日预算" labelStyle={{ width: 100 }}>{dailyBudget}</Descriptions.Item>
  57. <Descriptions.Item label="出价策略" labelStyle={{ width: 100 }}>{BidStrategyEnum[bidStrategy as keyof typeof BidStrategyEnum]}</Descriptions.Item>
  58. </Descriptions>
  59. </Spin>
  60. }
  61. return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
  62. }, [getAdgroupDetails?.data?.data, getAdgroupDetails.loading])
  63. return <div style={{ width: width - 20, left: scrollLeft }} className="expandContent">
  64. <Card
  65. className="detail_card"
  66. hoverable
  67. style={{ width: (width - 20) / 2 }}
  68. >
  69. <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '12px 16px 0' }}>
  70. <strong>广告</strong>
  71. <Space align="center">
  72. <span style={{ fontSize: 10, color: '#999' }}>刷新时间:{getAdgroupDetails?.data?.reqTime}</span>
  73. <a onClick={() => getAdgroupDetails.refresh()} style={{ fontSize: 14 }}>刷新</a>
  74. </Space>
  75. </div>
  76. <div style={{ padding: 16 }}>
  77. {AdContent}
  78. </div>
  79. </Card>
  80. <Card
  81. className="detail_card"
  82. hoverable
  83. style={{ width: (width - 20) / 2 }}
  84. >
  85. <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '12px 16px 0' }}>
  86. <strong>趋势</strong>
  87. <Space align="center">
  88. <Select
  89. size="small"
  90. value={queryColumnTrend.timeUnit}
  91. style={{ width: 78 }}
  92. onChange={(e) => {
  93. setQueryColumnTrend({ ...queryColumnTrend, timeUnit: e })
  94. }}
  95. >
  96. <Select.Option value="day">天</Select.Option>
  97. <Select.Option value="hour">小时</Select.Option>
  98. <Select.Option value="minute">5min</Select.Option>
  99. </Select>
  100. <span style={{ fontSize: 10, color: '#999' }}>刷新时间:{getColumnTrendV3?.data?.reqTime}</span>
  101. <a onClick={() => getCTList()} style={{ fontSize: 14 }}>刷新</a>
  102. </Space>
  103. </div>
  104. <div style={{ width: '100%', height: 260, textAlign: 'center' }}>
  105. {getColumnTrendV3?.loading ? <Spin /> : <LineMonitor style={{ width: '100%', height: 260 }} series smooth data={lineDis} />}
  106. </div>
  107. </Card>
  108. </div>
  109. }
  110. export default React.memo(AdExpandedRowRender)