TabAd.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import { useAjax } from "@/Hook/useAjax"
  2. import TimeSeriesLook from "@/pages/launchSystemNew/adq/ad/timeSeriesLook"
  3. import { addAdToRuleBlackListApi, delAdToRuleBlackListApi, delAdWarningRuleApi, getAdgroupDetailsApi } from "@/services/adMonitor/adMonitor"
  4. import { AdStatusEnum, BidModeEnum, BidStrategyEnum, OptimizationGoalEnum, PromotedObjectType } from "@/services/launchAdq/enum"
  5. import { Card, Descriptions, Empty, Popover, Space, Spin, Typography, message } from "antd"
  6. import React, { useEffect, useMemo, useState } from "react"
  7. import TableData from "@/pages/launchSystemNew/components/TableData"
  8. import SetEarlyWarnings from "@/components/EarlyWarning/setEarlyWarnings"
  9. import RuleLog from "@/components/EarlyWarning/ruleLog"
  10. import tableConfigEw from "@/pages/adMonitor/adMonitorList/components/tableConfigEw"
  11. import tableConfig from "../adqv3/creative/tableConfig"
  12. export enum EWTypeEnum {
  13. DEFAULT = '默认告警规则',
  14. ACCOUNT = '广告账号告警规则',
  15. ADGROUP = '广告告警规则',
  16. ADGROUP_BLACK_LIST = '告警黑名单'
  17. }
  18. interface Props {
  19. accountId: any
  20. adgroupId: any
  21. }
  22. const TabAd: React.FC<Props> = ({ accountId, adgroupId }) => {
  23. /*******************************/
  24. const [logVisible, setLogVisible] = useState<boolean>(false)
  25. const [ruleId, setrRleId] = useState<number>(0)
  26. const [ruleName, setrRuleName] = useState<string>('')
  27. const getAdgroupDetails = useAjax((params) => getAdgroupDetailsApi(params), { formatResult: true })
  28. const delAdWarningRule = useAjax((params) => delAdWarningRuleApi(params), { formatResult: true })
  29. const addAdToRuleBlackList = useAjax((params) => addAdToRuleBlackListApi(params), { formatResult: true })
  30. const delAdToRuleBlackList = useAjax((params) => delAdToRuleBlackListApi(params), { formatResult: true })
  31. /*******************************/
  32. useEffect(() => {
  33. getAdgroupDetails.run({ adgroupId, accountId })
  34. }, [adgroupId, accountId])
  35. const addBlack = (value: any) => {
  36. console.log(value)
  37. addAdToRuleBlackList.run({ adgroupId, accountId, ruleId: value.id }).then(res => {
  38. if (res?.data) {
  39. message.success('添加成功')
  40. getAdgroupDetails.refresh()
  41. }
  42. })
  43. }
  44. const remove = (value: any) => {
  45. delAdWarningRule.run({ adgroupId, accountId, ruleId: value.id }).then(res => {
  46. if (res?.data) {
  47. message.success('移除成功')
  48. getAdgroupDetails.refresh()
  49. }
  50. })
  51. }
  52. const removeBlack = (value: any) => {
  53. delAdToRuleBlackList.run({ adgroupId, accountId, ruleId: value.id }).then(res => {
  54. if (res?.data) {
  55. message.success('移出成功')
  56. getAdgroupDetails.refresh()
  57. }
  58. })
  59. }
  60. const log = (value: any) => {
  61. setrRleId(value.id)
  62. setrRuleName(value.ruleName)
  63. setLogVisible(true)
  64. }
  65. const AdContent = useMemo(() => {
  66. if (getAdgroupDetails?.data?.data) {
  67. const { adgroupName, bidAmount, bidMode, optimizationGoal, adgroupId, rejectMessageList, status, smartBidType, beginDate,
  68. endDate, targetingTranslation, timeSeries, firstDayBeginTime, dailyBudget, bidStrategy, promotedObjectType, accountId,
  69. creativeName
  70. } = getAdgroupDetails?.data?.data
  71. return <Spin spinning={getAdgroupDetails.loading}>
  72. <Descriptions column={2} size="small" colon={false}>
  73. <Descriptions.Item labelStyle={{ width: 100, flex: '0 0 auto' }} label="广告名称">
  74. <div style={{ width: '90%' }}>
  75. <Typography.Text ellipsis={{ tooltip: true }}>{adgroupName}</Typography.Text>
  76. </div>
  77. </Descriptions.Item>
  78. <Descriptions.Item labelStyle={{ width: 100 }} label="出价">{`${BidModeEnum[bidMode]} ${bidAmount}元/${bidMode === 'BID_MODE_CPM' ? '千次曝光' : bidMode === 'BID_MODE_CPC' ? '点击' : OptimizationGoalEnum[optimizationGoal]}`}</Descriptions.Item>
  79. <Descriptions.Item labelStyle={{ width: 100 }} label="广告ID">{adgroupId}</Descriptions.Item>
  80. <Descriptions.Item labelStyle={{ width: 100 }} label="状态">
  81. {rejectMessageList?.filter((str: any) => str)?.length > 0 ? <Popover
  82. style={{ width: 500 }}
  83. overlayStyle={{ width: 500, fontSize: 12 }}
  84. placement="left"
  85. content={rejectMessageList?.map((str: string, eq: number) => {
  86. return str ? <><strong style={{ fontSize: 13 }}>{eq + 1}:</strong>{str}<br /></> : ""
  87. })}>
  88. {AdStatusEnum[status]}
  89. </Popover> :
  90. AdStatusEnum[status]}
  91. </Descriptions.Item>
  92. <Descriptions.Item label="广告账号" labelStyle={{ width: 100 }}>{accountId}</Descriptions.Item>
  93. <Descriptions.Item label="出价类型" labelStyle={{ width: 100 }}>{smartBidType === 'SMART_BID_TYPE_CUSTOM' ? '手动出价' : '自动出价'}</Descriptions.Item>
  94. <Descriptions.Item label="推广目标类型" labelStyle={{ width: 100 }}>{PromotedObjectType[promotedObjectType]}</Descriptions.Item>
  95. <Descriptions.Item label="投放日期" labelStyle={{ width: 100 }}>{endDate ? beginDate + '~' + endDate : beginDate + '~' + '长期投放'}</Descriptions.Item>
  96. <Descriptions.Item label="定向" labelStyle={{ width: 100 }} span={2}>{targetingTranslation}</Descriptions.Item>
  97. <Descriptions.Item label="投放时间" labelStyle={{ width: 100 }}>{<TimeSeriesLook timeSeries={timeSeries} />}</Descriptions.Item>
  98. <Descriptions.Item label="首日开始时间" labelStyle={{ width: 100 }}>{firstDayBeginTime}</Descriptions.Item>
  99. <Descriptions.Item label="日预算" labelStyle={{ width: 100 }}>{dailyBudget}</Descriptions.Item>
  100. <Descriptions.Item label="创意名称" labelStyle={{ width: 100 }}>{creativeName}</Descriptions.Item>
  101. <Descriptions.Item label="出价策略" labelStyle={{ width: 100 }}>{BidStrategyEnum[bidStrategy]}</Descriptions.Item>
  102. </Descriptions>
  103. </Spin>
  104. }
  105. return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
  106. }, [getAdgroupDetails?.data?.data, getAdgroupDetails.loading])
  107. console.log(getAdgroupDetails?.data?.data?.dynamicCreativeList)
  108. const CreativePreview = useMemo(() => {
  109. return <Card
  110. hoverable
  111. style={{ width: '100%' }}
  112. bodyStyle={{ padding: 16 }}
  113. >
  114. <TableData
  115. size="small"
  116. isCard={false}
  117. columns={() => tableConfig()}
  118. ajax={getAdgroupDetails}
  119. dataSource={getAdgroupDetails?.data?.data?.dynamicCreativeList || []}
  120. leftChild={<Space>
  121. <strong>创意预览</strong>
  122. </Space>}
  123. myKey={'dynamicCreativeId'}
  124. loading={getAdgroupDetails?.loading}
  125. total={getAdgroupDetails?.data?.data?.dynamicCreativeList?.length || 0}
  126. gutter={[0, 10]}
  127. />
  128. </Card>
  129. }, [getAdgroupDetails, getAdgroupDetails?.data?.data, getAdgroupDetails.loading])
  130. const EWContent = useMemo(() => {
  131. if (getAdgroupDetails?.data?.data?.warningRuleMap && Object.keys(getAdgroupDetails?.data?.data?.warningRuleMap).length > 0) {
  132. let data = getAdgroupDetails?.data?.data?.warningRuleMap
  133. let dataArr = Object.keys(getAdgroupDetails?.data?.data?.warningRuleMap)
  134. if (!dataArr.includes('ADGROUP')) {
  135. dataArr.push('ADGROUP')
  136. }
  137. return dataArr.map(key => <Card
  138. hoverable
  139. style={{ width: '100%' }}
  140. key={key}
  141. bodyStyle={{ padding: 16 }}
  142. >
  143. <TableData
  144. size="small"
  145. isCard={false}
  146. columns={() => tableConfigEw(key as any, addBlack, remove, removeBlack, log)}
  147. ajax={getAdgroupDetails}
  148. dataSource={data[key]}
  149. leftChild={<Space>
  150. <strong>{EWTypeEnum[key]}</strong>
  151. {key === 'ADGROUP' && <SetEarlyWarnings accountId={accountId} adgroupId={adgroupId} onChange={() => getAdgroupDetails.refresh()} />}
  152. </Space>}
  153. loading={getAdgroupDetails?.loading}
  154. total={getAdgroupDetails?.data?.data?.length}
  155. gutter={[0, 10]}
  156. />
  157. </Card>)
  158. }
  159. return <Card
  160. hoverable
  161. style={{ width: '100%' }}
  162. bodyStyle={{ padding: 16 }}
  163. >
  164. <TableData
  165. size="small"
  166. isCard={false}
  167. columns={() => tableConfigEw('ADGROUP', addBlack, remove, removeBlack, log)}
  168. ajax={getAdgroupDetails}
  169. dataSource={[]}
  170. leftChild={<Space>
  171. <strong>{EWTypeEnum['ADGROUP']}</strong>
  172. <SetEarlyWarnings accountId={accountId} adgroupId={adgroupId} onChange={() => getAdgroupDetails.refresh()} />
  173. </Space>}
  174. loading={getAdgroupDetails?.loading}
  175. total={getAdgroupDetails?.data?.data?.length}
  176. gutter={[0, 10]}
  177. />
  178. </Card>
  179. }, [getAdgroupDetails?.data?.data, getAdgroupDetails.loading])
  180. return <Space style={{ width: '100%' }} direction="vertical">
  181. <Card
  182. hoverable
  183. className="detail_card"
  184. style={{ width: '100%' }}
  185. >
  186. <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '12px 16px 0' }}>
  187. <strong>广告</strong>
  188. <Space align="center">
  189. <span style={{ fontSize: 10, color: '#999' }}>刷新时间:{getAdgroupDetails?.data?.reqTime}</span>
  190. <a onClick={() => getAdgroupDetails.refresh()} style={{ fontSize: 14 }}>刷新</a>
  191. </Space>
  192. </div>
  193. <div style={{ padding: 16 }}>
  194. {AdContent}
  195. </div>
  196. </Card>
  197. {CreativePreview}
  198. {EWContent}
  199. {logVisible && <RuleLog ruleName={ruleName} ruleId={ruleId} visible={logVisible} onClose={() => setLogVisible(false)} />}
  200. </Space>
  201. }
  202. export default React.memo(TabAd)