index.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import { CreateAdProps } from "@/services/launchAdq/createAd"
  2. import { BaseResult } from "@ahooksjs/use-request/lib/types"
  3. import { CloseOutlined, DownOutlined } from "@ant-design/icons"
  4. import { Button, Col, Dropdown, Empty, Menu, message, Popover, Space, Spin, Tooltip } from "antd"
  5. import React, { useCallback, useEffect, useState } from "react"
  6. import TargetingModal from "../../../components/targetingModal"
  7. import TargetingPup from "./modal"
  8. import TargetingTooltip from "../../../components/targetingTooltip"
  9. import CrowdPackModal from "../../../components/crowdPackModal"
  10. import style from '../index.less'
  11. import { ModalConfig } from "./modal"
  12. import ExpandModal from "@/pages/launchSystemNew/components/expandModal"
  13. import { ExpandTargeting } from "@/services/launchAdq/enum"
  14. type Props = {
  15. queryForm: Partial<CreateAdProps>,
  16. setQueryForm: React.Dispatch<React.SetStateAction<Partial<CreateAdProps>>>,
  17. setAccountCreateLogs: React.Dispatch<React.SetStateAction<{
  18. adAccountId: number;
  19. id: number;
  20. userActionSetsList?: any[];
  21. productList?: any;
  22. conversionList?: any;
  23. customAudienceList?: any;
  24. excludedCustomAudienceList?: any;
  25. pageList?: any;
  26. }[]>>,
  27. getSysAdgroups: BaseResult<any, any>,
  28. getsysTargeting: BaseResult<any, any>,
  29. accountCreateLogs: any[],
  30. geoLocationList: any[],
  31. modelList: any[],
  32. clearData: () => void,
  33. cpDel: (index: number, num: number, key: string) => void,
  34. }
  35. function TargetIng(props: Props) {
  36. let { queryForm, getSysAdgroups, getsysTargeting, accountCreateLogs, geoLocationList, modelList, setQueryForm, clearData, cpDel, setAccountCreateLogs } = props
  37. const [adModalConfig, setAdModalConfig] = useState<ModalConfig>({//新建广告弹窗
  38. visible: false,
  39. type: 'add'
  40. })
  41. const [dxVisible, setDxVisible] = useState<boolean>(false) // 选择定向弹窗控制
  42. const [cpVisible, setCpVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
  43. const [expandVisible, setExpandVisible] = useState<boolean>(false) // 自动扩量弹窗控制
  44. // 设置变量
  45. const handleAdModalConfig = useCallback((arg: ModalConfig) => {
  46. setAdModalConfig({ ...adModalConfig, ...arg })
  47. }, [adModalConfig])
  48. // 获取定向详情
  49. const getInfo = useCallback((sysTargetingId) => {
  50. getsysTargeting.run(sysTargetingId).then(res => {
  51. setQueryForm({ ...queryForm, sysTargetingId: sysTargetingId, sysTargeting: { ...res, isTemplate: false } });
  52. setDxVisible(false);
  53. clearData()
  54. })
  55. }, [queryForm])
  56. return <Col className={style.conRightBorder}>
  57. <div className={style.top}>
  58. 定向
  59. {/* (queryForm.sysAdgroup?.bidMode === 'BID_MODE_CPM' || queryForm.sysAdgroup?.bidMode === 'BID_MODE_CPC') && */}
  60. <Dropdown
  61. overlay={<Menu style={{ padding: 0 }} items={[
  62. {
  63. key: '1',
  64. label: <>
  65. {accountCreateLogs?.length > 0 && queryForm?.sysTargeting ? <Button type="link" style={{ fontSize: 12, padding: 0 }} onClick={() => setCpVisible(true)}>选择定向包</Button> : <Tooltip title={accountCreateLogs?.length > 0 ? `请先添加定向` : `请先选择媒体账户`}>
  66. <Button type="link" style={{ fontSize: 12, padding: 0 }}>选择定向包</Button>
  67. </Tooltip>}
  68. </>
  69. },
  70. {
  71. key: '2',
  72. label: <>
  73. {accountCreateLogs?.length > 0 && queryForm?.sysTargeting ? <Button type="link" style={{ fontSize: 12, padding: 0 }} onClick={() => setExpandVisible(true)}>自动扩量</Button> : <Tooltip title={accountCreateLogs?.length > 0 ? `请先添加定向` : `请先选择媒体账户`}>
  74. <Button type="link" style={{ fontSize: 12, padding: 0 }}>自动扩量</Button>
  75. </Tooltip>}
  76. </>
  77. }
  78. ]} />}
  79. >
  80. <a onClick={e => e.preventDefault()}>
  81. <Space>
  82. 扩展
  83. <DownOutlined />
  84. </Space>
  85. </a>
  86. </Dropdown>
  87. {queryForm.sysTargeting && <a onClick={() => {
  88. setQueryForm({ ...queryForm, sysTargeting: undefined, sysTargetingId: undefined })
  89. setAccountCreateLogs([])
  90. }}>清空</a>}
  91. </div>
  92. <div className={style.center}>
  93. <Spin spinning={getsysTargeting.loading}>
  94. <div className={style.centerContent}>
  95. {queryForm?.sysTargeting ? <>
  96. {queryForm.expandEnabled && <div className={style.popoverContent}>
  97. <div><strong>自动扩量:</strong> <span style={{ color: "#5a5a5a" }}>开启</span></div>
  98. <div><strong>不可突破定向:</strong> <span style={{ color: "#5a5a5a" }}>{queryForm?.expandTargeting?.map(item => ExpandTargeting[item]).toString() || '无'}</span></div>
  99. {accountCreateLogs?.map((item: any, index: number) => {
  100. if (item?.coldStartAudienceList) {
  101. return <div className={style.acc} key={index}>
  102. <div className={style.accName} style={{ fontWeight: 800 }}>{item.adAccountId}</div>
  103. {item?.coldStartAudienceList?.length > 0 && <>
  104. <div className={style.accName}>扩量种子人群</div>
  105. {
  106. item?.coldStartAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
  107. return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
  108. cpDel(index, index1, 'coldStartAudienceList')
  109. }} /></div>
  110. })
  111. }
  112. </>}
  113. </div>
  114. } else {
  115. return null
  116. }
  117. })}
  118. </div>}
  119. {accountCreateLogs?.some((item: any) => item?.customAudienceList?.length > 0) ?
  120. <>
  121. {queryForm.sysTargeting && <Popover
  122. content={<div className={style.popover}>
  123. <TargetingTooltip data={queryForm.sysTargeting} geoLocationList={geoLocationList} modelList={modelList} />
  124. </div>}
  125. trigger="hover"
  126. placement="right"
  127. >
  128. <div className={style.popoverContent}>
  129. <div><strong>定向名称:</strong> <span style={{ color: "#5a5a5a" }}>{queryForm?.sysTargeting?.targetingName}</span></div>
  130. <div><strong>定向描述:</strong> <span style={{ color: "#5a5a5a" }}>{queryForm?.sysTargeting?.description || '<空>'}</span></div>
  131. </div>
  132. </Popover>}
  133. {accountCreateLogs?.map((item: any, index: number) => {
  134. if (item?.customAudienceList) {
  135. return <div className={style.acc} key={index}>
  136. <div className={style.accName} style={{ fontWeight: 800 }}>{item.adAccountId}</div>
  137. {item?.customAudienceList?.length > 0 && <>
  138. <div className={style.accName}>定向用户群</div>
  139. {
  140. item?.customAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
  141. return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
  142. cpDel(index, index1, 'customAudienceList')
  143. }} /></div>
  144. })
  145. }
  146. </>}
  147. {item?.excludedCustomAudienceList?.length > 0 && <>
  148. <div className={style.accName} style={{ marginTop: 5 }}>排除用户群</div>
  149. {
  150. item?.excludedCustomAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
  151. return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
  152. cpDel(index, index1, 'excludedCustomAudienceList')
  153. }} /></div>
  154. })
  155. }
  156. </>}
  157. </div>
  158. } else {
  159. return null
  160. }
  161. })}
  162. </>
  163. :
  164. <>
  165. <div><strong>定向名称:</strong> <span style={{ color: "#5a5a5a" }}>{queryForm?.sysTargeting?.targetingName}</span></div>
  166. <div><strong>定向描述:</strong> <span style={{ color: "#5a5a5a" }}>{queryForm?.sysTargeting?.description || '<空>'}</span></div>
  167. <TargetingTooltip data={queryForm?.sysTargeting} geoLocationList={geoLocationList} modelList={modelList} />
  168. </>}
  169. </> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
  170. </div>
  171. </Spin>
  172. </div>
  173. <div className={style.bottom}>
  174. <Space size={20}>
  175. <span onClick={() => { setDxVisible(true) }}>{queryForm?.sysTargeting ? '重选定向' : '选择定向'}</span>
  176. <span onClick={() => { handleAdModalConfig(queryForm?.sysTargeting ? { visible: true, type: 'edit' } : { visible: true, type: 'add' }) }}>{queryForm?.sysTargeting ? '编辑定向' : '新建定向'}</span>
  177. </Space>
  178. </div>
  179. {/* 选择定向 */}
  180. {dxVisible && <TargetingModal visible={dxVisible} onClose={() => setDxVisible(false)} onChange={getInfo} sysTargetingId={queryForm?.sysTargetingId} />}
  181. {/* 选择定向包 */}
  182. {cpVisible && <CrowdPackModal visible={cpVisible} data={accountCreateLogs} onClose={() => setCpVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setCpVisible(false); clearData() }} />}
  183. {/* 设置自动扩量 */}
  184. {expandVisible && <ExpandModal
  185. visible={expandVisible}
  186. sysTargeting={queryForm.sysTargeting}
  187. expandData={{ expandEnabled: queryForm.expandEnabled || false, expandTargeting: queryForm.expandTargeting || [] }}
  188. data={accountCreateLogs}
  189. onClose={() => setExpandVisible(false)}
  190. onChange={(e, expandData) => {
  191. setAccountCreateLogs(e);
  192. setQueryForm({ ...queryForm, ...expandData })
  193. setExpandVisible(false)
  194. clearData()
  195. }}
  196. />}
  197. {/* 新建定向包 */}
  198. {adModalConfig.visible && <TargetingPup visible={adModalConfig.visible} PupFn={handleAdModalConfig} callback={(values: any) => {
  199. if (queryForm?.expandEnabled && queryForm?.expandTargeting && queryForm?.expandTargeting?.length > 0) {
  200. message.error('不可突破定向已重置,需要请重新设置')
  201. setQueryForm({ ...queryForm, sysTargeting: values, expandTargeting: [] });
  202. } else {
  203. setQueryForm({ ...queryForm, sysTargeting: values });
  204. }
  205. setDxVisible(false);
  206. clearData();
  207. handleAdModalConfig({ visible: false, dataInfo: null, type: 'add' })
  208. }} type={adModalConfig.type} dataInfo={queryForm.sysTargeting} />}
  209. </Col>
  210. }
  211. export default TargetIng