Details.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import useEcharts from "@/Hook/useEcharts"
  2. import { GetColumnTrendProps, GetListForAdProps } from "@/services/adMonitor/adMonitor"
  3. import { Card, DatePicker, Drawer, Select, Space, Spin, Tabs } from "antd"
  4. import React, { useEffect, useState } from "react"
  5. import { useModel } from "umi"
  6. import '@/pages/adMonitor/adMonitorList/components/index.less'
  7. import TableData from "@/pages/launchSystemNew/components/TableData"
  8. import { detailsConfig } from "@/pages/adMonitor/adMonitorList/config1"
  9. import moment from "moment"
  10. import { columnsList } from "@/pages/adMonitor/adMonitorList/tableMonitorConfig1"
  11. import { LineField } from "@/pages/adMonitor/adMonitorList/config"
  12. import TabAd from "./TabAd"
  13. interface Props {
  14. data: any,
  15. onClose?: () => void,
  16. visible?: boolean
  17. }
  18. const Details: React.FC<Props> = ({ data, onClose, visible }) => {
  19. /****************************************/
  20. const { adgroup_id, account_id } = data
  21. const [activeKey, setActiveKey] = useState<string>('1')
  22. const [queryColumnTrend, setQueryColumnTrend] = useState<GetColumnTrendProps>({ accountId: account_id, adgroupId: adgroup_id, trendColumns: ['cost'], timeUnit: 'hour', dataTimeMin: moment().format('YYYY-MM-DD'), dataTimeMax: moment().format('YYYY-MM-DD') })
  23. const [queryList, setQueryList] = useState<GetListForAdProps>({ accountId: account_id, adgroupId: adgroup_id, columns: [], pageNum: 1, pageSize: 20, timeUnit: 'hour', dataTimeMin: moment().format('YYYY-MM-DD'), dataTimeMax: moment().format('YYYY-MM-DD') })
  24. const [lineDis, setLineDis] = useState<any[]>([])
  25. const { LineMonitor } = useEcharts()
  26. const configName = '数据报表3.0'
  27. const [totalData, setTotalData] = useState<any[]>([])
  28. const { getColumnTrendV3, getAdTotalDataV3, getListForAdV3 } = useModel('useAdMonitor.useMonitor')
  29. /****************************************/
  30. useEffect(() => {
  31. getCTList()
  32. }, [queryColumnTrend])
  33. const getCTList = () => {
  34. getColumnTrendV3.run(queryColumnTrend).then(res => {
  35. if (res?.data) {
  36. let trendColumns = queryColumnTrend.trendColumns
  37. let data = trendColumns.map((field) => {
  38. let value: any = {}
  39. res?.data?.forEach((item: any, index: number) => {
  40. if (index === 0) value.legendName = LineField[field];
  41. value[item?.trend_unit] = item?.[field]
  42. });
  43. return value
  44. })
  45. setLineDis(() => data)
  46. }
  47. })
  48. }
  49. useEffect(() => {
  50. getListList()
  51. }, [queryList])
  52. const getListList = () => {
  53. let columns: string[] = []
  54. let message = localStorage.getItem(`myAdMonitorConfig1.0.1_${configName}`)
  55. if (message) {
  56. message = JSON.parse(message)
  57. }
  58. if (message && Array.isArray(message)) {
  59. message.forEach((item: { serverIndex: any; dataIndex: string; }) => {
  60. columns.push('adgroup_data.' + item.dataIndex)
  61. })
  62. } else {
  63. detailsConfig.forEach((item: any) => {
  64. item?.data?.forEach((d: { default: any, serverIndex: string, dataIndex: string }) => {
  65. if (d.default) {
  66. columns.push('adgroup_data.' + d.dataIndex)
  67. }
  68. })
  69. })
  70. }
  71. getListForAdV3.run({ ...queryList, columns })
  72. let queryTotal = JSON.parse(JSON.stringify(queryList))
  73. delete queryTotal.pageNum
  74. delete queryTotal.pageSize
  75. delete queryTotal.timeUnit
  76. getAdTotalDataV3.run({ ...queryTotal, columns }).then(res => {
  77. console.log(res)
  78. if (res?.data) {
  79. let data = res.data
  80. data.id = 1
  81. data.time = '总计'
  82. setTotalData([data])
  83. }
  84. })
  85. }
  86. return <Drawer
  87. title={data?.adgroup_name}
  88. placement="right"
  89. onClose={onClose}
  90. visible={visible}
  91. width={'70%'}
  92. bodyStyle={{ padding: '0 10px', background: '#efefef' }}
  93. className="detail_drawer"
  94. >
  95. <Tabs activeKey={activeKey} onChange={(e) => setActiveKey(e)} tabBarExtraContent={activeKey === '1' ? <Space>
  96. <Select
  97. size="small"
  98. value={queryColumnTrend.timeUnit}
  99. style={{ width: 78 }}
  100. onChange={(e) => {
  101. setQueryColumnTrend({ ...queryColumnTrend, timeUnit: e })
  102. setQueryList({ ...queryList, timeUnit: e })
  103. }}
  104. >
  105. <Select.Option value="day">天</Select.Option>
  106. <Select.Option value="hour">小时</Select.Option>
  107. <Select.Option value="minute">5min</Select.Option>
  108. </Select>
  109. <DatePicker.RangePicker
  110. size="small"
  111. placeholder={['数据时间筛选(起始)', '数据时间筛选(结束)']}
  112. value={(queryColumnTrend?.dataTimeMin && queryColumnTrend?.dataTimeMax) ? [moment(queryColumnTrend.dataTimeMin), moment(queryColumnTrend.dataTimeMax)] : undefined as any}
  113. style={{ width: 320 }}
  114. onChange={(_, o) => {
  115. setQueryColumnTrend({ ...queryColumnTrend, dataTimeMin: o[0], dataTimeMax: o[1] })
  116. setQueryList({ ...queryList, dataTimeMin: o[0], dataTimeMax: o[1], pageNum: 1 })
  117. }}
  118. />
  119. </Space> : null}
  120. >
  121. <Tabs.TabPane tab="效果数据" key="1">
  122. <Space direction="vertical" style={{ width: '100%' }}>
  123. <Card
  124. className="detail_card"
  125. hoverable
  126. >
  127. <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '12px 16px 0' }}>
  128. <Space>
  129. <strong>趋势</strong>
  130. <Select
  131. showSearch
  132. mode='multiple'
  133. maxTagCount={2}
  134. value={queryColumnTrend.trendColumns}
  135. style={{ minWidth: 160 }}
  136. allowClear
  137. placeholder="请选择图表字段"
  138. onChange={(value: string[]) => {
  139. setQueryColumnTrend({ ...queryColumnTrend, trendColumns: value?.length ? value : ['cost'] })
  140. }}
  141. size="small"
  142. >
  143. {Object.keys(LineField).map((key) => <Select.Option value={key} key={key}>
  144. {LineField[key]}
  145. </Select.Option>)}
  146. </Select>
  147. </Space>
  148. <Space align="center">
  149. <span style={{ fontSize: 10, color: '#999' }}>刷新时间:{getColumnTrendV3?.data?.reqTime}</span>
  150. <a onClick={() => getCTList()} style={{ fontSize: 14 }}>刷新</a>
  151. </Space>
  152. </div>
  153. <div style={{ width: '100%', height: 260, textAlign: 'center' }}>
  154. {getColumnTrendV3?.loading ? <Spin /> : <LineMonitor style={{ width: '100%', height: 260 }} series smooth data={lineDis} />}
  155. </div>
  156. </Card>
  157. <div className={'MYtable'}>
  158. <TableData
  159. refreshData={getListList}
  160. isZj
  161. totalData={totalData}
  162. bodyStyle={{ padding: '12px 16px' }}
  163. gutter={[0, 12]}
  164. columns={columnsList()}
  165. dataSource={getListForAdV3?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryList.pageNum.toString() + index.toString()) }))}
  166. loading={getListForAdV3?.loading}
  167. ajax={getListForAdV3}
  168. leftChild={
  169. <Space>
  170. <strong>数据报表</strong>
  171. </Space>
  172. }
  173. fixed={{ left: 0, right: 0 }}
  174. total={getListForAdV3?.data?.data?.total}
  175. onChange={(props: any) => {
  176. let { sortData, pagination } = props
  177. let { current, pageSize } = pagination
  178. let newQueryForm = JSON.parse(JSON.stringify(queryList))
  179. newQueryForm.pageNum = current
  180. newQueryForm.pageSize = pageSize
  181. if (sortData && JSON.stringify('sortData') !== '{}') {
  182. let { order } = sortData // descend 降序 大到小 ascend 升序 小到大
  183. if (order) {
  184. // newQueryForm.sortColumn = field
  185. newQueryForm.sortAsc = order === 'ascend'
  186. } else {
  187. Object.keys(newQueryForm).forEach(key => {
  188. if (key === 'sortColumn' || key === 'sortAsc') {
  189. delete newQueryForm[key]
  190. }
  191. })
  192. }
  193. } else {
  194. Object.keys(newQueryForm).forEach(key => {
  195. if (key === 'sortField' || key === 'sort') {
  196. delete newQueryForm[key]
  197. }
  198. })
  199. }
  200. setQueryList({ ...newQueryForm })
  201. }}
  202. page={queryList.pageNum}
  203. pageSize={queryList.pageSize}
  204. scroll={{ y: 500 }}
  205. config={detailsConfig}
  206. configName={configName}
  207. />
  208. </div>
  209. </Space>
  210. </Tabs.TabPane>
  211. <Tabs.TabPane tab="广告详情" key="2">
  212. <TabAd accountId={account_id} adgroupId={adgroup_id} />
  213. </Tabs.TabPane>
  214. </Tabs>
  215. </Drawer>
  216. }
  217. export default React.memo(Details)