adgroupsMarketingContent.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import { Card, Form, Select, Switch } from "antd"
  2. import React, { useContext, useEffect, useState } from "react"
  3. import MarketingGoal from "./marketingGoal"
  4. import NewRadio from "@/pages/launchSystemV3/components/NewRadio"
  5. import { DispatchAd } from "./newCreateAd"
  6. import { GOAL_ROAS_ENUM, MARKETING_CARRIER_TYPE_ENUM, MARKETING_TARGET_TYPE_ENUM, OPTIMIZATIONGOAL_ENUM, defaultSiteSet } from "../../const"
  7. import New1Radio from "@/pages/launchSystemV3/components/New1Radio"
  8. import { useAjax } from "@/Hook/useAjax"
  9. import { getOptimizationGoalPermissionsV3Api } from "@/services/adqV3/global"
  10. import { adRules } from "../../rules"
  11. /**
  12. * 营销内容
  13. * @param value 回填
  14. * @returns
  15. */
  16. const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
  17. /****************************************/
  18. const { form, OGPParams, setOGPparams } = useContext(DispatchAd)!;
  19. const marketingGoal = Form.useWatch('marketingGoal', form);
  20. const marketingTargetType = Form.useWatch('marketingTargetType', form);
  21. const marketingCarrierType = Form.useWatch('marketingCarrierType', form);
  22. const bidMode = Form.useWatch('bidMode', form);
  23. const optimizationGoal = Form.useWatch('optimizationGoal', form);
  24. const smartBidType = Form.useWatch('smartBidType', form);
  25. const depthConversionEnabled = Form.useWatch('depthConversionEnabled', form);
  26. const deepConversionType = Form.useWatch(['deepConversionSpec', 'deepConversionType'], form);
  27. // 推广产品
  28. const [marketingTargetTypeList, setMarketingTargetTypeList] = useState<PULLIN.DataType[]>([])
  29. const [marketingCarrierTypeList, setMarketingCarrierTypeList] = useState<PULLIN.DataType[]>([])
  30. const [rules, setRules] = useState<any>({})
  31. const [behaviorList, setBehaviorList] = useState<string[]>([])
  32. const [worthList, setWorthList] = useState<string[]>([])
  33. const [deepConversionData, setDeepConversionData] = useState<PULLIN.DataType[]>([])
  34. const [isUpdateOptimizationGoal, setIsUpdateOptimizationGoal] = useState<boolean>(false)
  35. const queryOptimizationGoalPermissions = useAjax((params) => getOptimizationGoalPermissionsV3Api(params))
  36. /****************************************/
  37. /** 获取深度优化 出价和版位改变时查询 */
  38. const getOptimizationGoalPermissions = () => {
  39. let marketingCarrierType = OGPParams?.marketingCarrierType
  40. let bidMode = OGPParams.bidMode
  41. let siteSet = OGPParams.siteSet
  42. let automaticSiteEnabled = OGPParams.automaticSiteEnabled
  43. let marketingGoal = OGPParams.marketingGoal
  44. let marketingTargetType = OGPParams?.marketingTargetType
  45. if (marketingTargetType === 'MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT') {
  46. marketingCarrierType = 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT'
  47. }
  48. if ((bidMode && siteSet && siteSet?.length > 0 && marketingGoal && marketingCarrierType && marketingTargetType) || automaticSiteEnabled) {
  49. let obj: any = { siteSet: automaticSiteEnabled ? defaultSiteSet : siteSet, marketingGoal, marketingCarrierType: marketingCarrierType, marketingTargetType, marketingSubGoal: 'MARKETING_SUB_GOAL_UNKNOWN' }
  50. if (bidMode === 'BID_MODE_OCPC' || bidMode === 'BID_MODE_OCPM') {
  51. obj.bidMode = bidMode
  52. }
  53. queryOptimizationGoalPermissions.run(obj)
  54. }
  55. }
  56. useEffect(() => {
  57. if (OGPParams.marketingCarrierType && OGPParams.marketingTargetType) {
  58. getOptimizationGoalPermissions()
  59. }
  60. }, [OGPParams])
  61. // 处理深度转化优化
  62. useEffect(() => {
  63. if (optimizationGoal && queryOptimizationGoalPermissions?.data) {
  64. let { deepBehaviorOptimizationGoalPermissionList, deepWorthOptimizationGoalPermissionList } = queryOptimizationGoalPermissions?.data
  65. let behavior = deepBehaviorOptimizationGoalPermissionList?.find((item: { optimizationGoal: string }) => item.optimizationGoal === optimizationGoal)
  66. let worth = deepWorthOptimizationGoalPermissionList?.find((item: { optimizationGoal: string }) => item.optimizationGoal === optimizationGoal)
  67. let newBehaviorList = behavior?.deepBehaviorOptimizationGoalList || []
  68. setBehaviorList(newBehaviorList)
  69. let newWorthList = worth?.deepWorthOptimizationGoalList || []
  70. setWorthList(newWorthList)
  71. let newDeepConversionData: PULLIN.DataType[] = [];
  72. (newBehaviorList?.length > 0 && newDeepConversionData.push({ label: '优化转化行为', value: 'DEEP_CONVERSION_BEHAVIOR' }))
  73. { newWorthList?.length > 0 && newDeepConversionData.push({ label: '优化ROI', value: 'DEEP_CONVERSION_WORTH' }) }
  74. setDeepConversionData(newDeepConversionData)
  75. form.setFieldsValue({
  76. deepConversionSpec: {
  77. deepConversionType: newBehaviorList?.length > 0 ? 'DEEP_CONVERSION_BEHAVIOR' : newWorthList?.length > 0 ? "DEEP_CONVERSION_WORTH" : ''
  78. }
  79. })
  80. }
  81. }, [optimizationGoal, queryOptimizationGoalPermissions?.data])
  82. // 选择营销目的触发
  83. useEffect(() => {
  84. let newRule: any = {}
  85. let newMarketingTargetTypeList: PULLIN.DataType[] = []
  86. if (marketingGoal) {
  87. newRule = adRules[marketingGoal]
  88. // 根据const里数据对比选出可展示数据
  89. newMarketingTargetTypeList = Object.keys(MARKETING_TARGET_TYPE_ENUM).filter(key => newRule?.[key]).map(key => ({ label: MARKETING_TARGET_TYPE_ENUM[key], value: key }))
  90. }
  91. setMarketingTargetTypeList(newMarketingTargetTypeList)
  92. setRules(newRule)
  93. }, [marketingGoal])
  94. // 推广产品设置默认值
  95. useEffect(() => {
  96. if (!(value && Object.keys(value).length > 0) && marketingTargetTypeList && (!marketingTargetType || (marketingTargetType && !marketingTargetTypeList.some(item => item.value === marketingTargetType)))) {
  97. form.setFieldsValue({ marketingTargetType: marketingTargetTypeList?.[0]?.value })
  98. // setOGPparams({ ...OGPParams, marketingTargetType: marketingTargetTypeList?.[0]?.value })
  99. }
  100. }, [marketingTargetType, marketingTargetTypeList, OGPParams, value])
  101. // 营销载体类型
  102. useEffect(() => {
  103. let newMarketingTargetTypeListList: PULLIN.DataType[] = []
  104. // 推广产品是公众号不展示 营销载体类型
  105. if (marketingTargetType) {
  106. let marketingTargetTypeRules: string[] = rules?.[marketingTargetType]?.MARKETING_SUB_GOAL_UNKNOWN
  107. newMarketingTargetTypeListList = Object.keys(MARKETING_CARRIER_TYPE_ENUM).filter(key => marketingTargetTypeRules?.[key]).map(key => ({ label: MARKETING_CARRIER_TYPE_ENUM[key], value: key }))
  108. }
  109. setMarketingCarrierTypeList(newMarketingTargetTypeListList)
  110. }, [marketingTargetType, rules])
  111. // 设置营销载体默认值
  112. useEffect(() => {
  113. if (!(value && Object.keys(value).length > 0) && !marketingCarrierType || (marketingCarrierType && !marketingCarrierTypeList.some(item => item.value === marketingCarrierType))) {
  114. let newMarketingCarrierType = marketingCarrierTypeList?.[0]?.value
  115. form.setFieldsValue({ marketingCarrierType: newMarketingCarrierType })
  116. setOGPparams({ ...OGPParams, marketingTargetType, marketingCarrierType: newMarketingCarrierType })
  117. }
  118. }, [marketingCarrierType, marketingCarrierTypeList, OGPParams, value, marketingTargetType])
  119. useEffect(() => {
  120. let optimizationGoalPermissionList: string[] = queryOptimizationGoalPermissions?.data?.optimizationGoalPermissionList
  121. if (isUpdateOptimizationGoal && optimizationGoalPermissionList?.length > 0 && !optimizationGoalPermissionList?.includes(optimizationGoal)) {
  122. form.setFieldsValue({ optimizationGoal: optimizationGoalPermissionList?.includes('OPTIMIZATIONGOAL_ECOMMERCE_ORDER') ? 'OPTIMIZATIONGOAL_ECOMMERCE_ORDER' : optimizationGoalPermissionList?.includes('OPTIMIZATIONGOAL_PAGE_SCAN_CODE') ? 'OPTIMIZATIONGOAL_PAGE_SCAN_CODE' : undefined })
  123. setIsUpdateOptimizationGoal(false)
  124. }
  125. }, [queryOptimizationGoalPermissions?.data?.optimizationGoalPermissionList, marketingGoal, marketingTargetType, marketingCarrierType, optimizationGoal, value, isUpdateOptimizationGoal])
  126. const setIsUpdate = () => {
  127. if (bidMode === 'BID_MODE_OCPM' || bidMode === 'BID_MODE_OCPC') {
  128. setIsUpdateOptimizationGoal(true)
  129. }
  130. }
  131. return <Card
  132. title={<strong style={{ fontSize: 18 }}>营销内容</strong>}
  133. className="cardResetCss"
  134. >
  135. <Form.Item name="marketingGoal" label={<strong>营销目的</strong>} rules={[{ required: true, message: '请选择营销目的!' }]}>
  136. <MarketingGoal onChange={(e) => { setOGPparams({ ...OGPParams, marketingGoal: e as string }); setIsUpdate() }} />
  137. </Form.Item>
  138. {marketingTargetTypeList?.length > 0 && <Form.Item name="marketingTargetType" label={<strong>推广产品</strong>} rules={[{ required: true, message: '请选择推广产品!' }]}>
  139. <NewRadio data={marketingTargetTypeList} onChange={(e) => {
  140. if (e === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT') { // 公众号
  141. setOGPparams({ ...OGPParams, marketingTargetType: e, marketingCarrierType: 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT' })
  142. form.setFieldsValue({ marketingCarrierType: 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT' })
  143. } else {
  144. setOGPparams({ ...OGPParams, marketingTargetType: e })
  145. }
  146. setIsUpdate()
  147. }} />
  148. </Form.Item>}
  149. {marketingCarrierTypeList?.length > 0 && <Form.Item name="marketingCarrierType" label={<strong>营销载体类型</strong>} rules={[{ required: true, message: '请选择营销载体类型!' }]}>
  150. <New1Radio data={marketingCarrierTypeList} onChange={(e) => { setOGPparams({ ...OGPParams, marketingCarrierType: e }); setIsUpdate() }} />
  151. </Form.Item>}
  152. {(bidMode === 'BID_MODE_OCPM' || bidMode === 'BID_MODE_OCPC') && <>
  153. <Form.Item label={<strong>优化目标</strong>} name='optimizationGoal' rules={[{ required: true, message: '请选择优化目标' }]}>
  154. <Select
  155. style={{ width: 480 }}
  156. showSearch
  157. filterOption={(input, option) =>
  158. (option!.children as unknown as string)?.toLowerCase()?.includes(input?.toLowerCase())
  159. }
  160. allowClear
  161. placeholder='请选择'
  162. loading={queryOptimizationGoalPermissions.loading}
  163. >
  164. {queryOptimizationGoalPermissions?.data?.optimizationGoalPermissionList.filter((key: string) => key !== 'UNKNOWN').map((key: string) => {
  165. return <Select.Option value={key} key={key}>{OPTIMIZATIONGOAL_ENUM[key]}</Select.Option>
  166. })}
  167. </Select>
  168. </Form.Item>
  169. {/* 深度优化 */}
  170. {((behaviorList?.length > 0 || worthList?.length > 0) && smartBidType !== 'SMART_BID_TYPE_SYSTEMATIC') && <>
  171. <Form.Item label={<strong>深度转化优化</strong>} name='depthConversionEnabled' valuePropName="checked">
  172. <Switch checkedChildren="开启" unCheckedChildren="关闭" onChange={(e) => {
  173. if (e) {
  174. form.setFieldsValue({
  175. deepConversionSpec: {
  176. deepConversionType: behaviorList?.length > 0 ? 'DEEP_CONVERSION_BEHAVIOR' : worthList?.length > 0 ? "DEEP_CONVERSION_WORTH" : ''
  177. }
  178. })
  179. }
  180. }} />
  181. </Form.Item>
  182. {depthConversionEnabled && <>
  183. <Form.Item label={<strong>深度优化类型</strong>} name={['deepConversionSpec', 'deepConversionType']} rules={[{ required: true, message: '请选择深度优化类型' }]}>
  184. <New1Radio data={deepConversionData} />
  185. </Form.Item>
  186. <Form.Item label={<strong>深度优化目标</strong>} name={['deepConversionSpec', deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? 'deepConversionBehaviorSpec' : 'deepConversionWorthSpec', 'goal']} rules={[{ required: true, message: '请选择深度优化目标' }]}>
  187. <Select style={{ width: 480 }} placeholder='请选择'>
  188. {deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? Object.keys(OPTIMIZATIONGOAL_ENUM).filter(key => behaviorList?.includes(key)).map(key => <Select.Option value={key} key={key}>{OPTIMIZATIONGOAL_ENUM[key]}</Select.Option>) : deepConversionType === 'DEEP_CONVERSION_WORTH' ?
  189. Object.keys(GOAL_ROAS_ENUM).filter(key => worthList?.includes(key)).map(key => <Select.Option value={key} key={key}>{GOAL_ROAS_ENUM[key]}</Select.Option>) : null}
  190. </Select>
  191. </Form.Item>
  192. </>}
  193. </>}
  194. </>}
  195. </Card>
  196. }
  197. export default React.memo(AdgroupsMarketingContent)