import { Card, Form, Input, InputNumber, Space, Switch, Tooltip } from "antd" import React, { useContext } from "react" import { DispatchAd } from "./newCreateAd"; import New1Radio from "@/pages/launchSystemV3/components/New1Radio"; import { BID_ALL_OCATION_MODE, BID_MODE_ENUM, BID_SCENE_NORMAL_ENUM, OPTIMIZATIONGOAL_ENUM, ROI_ALL_OCATION_MODE, SMART_BID_TYPE_ENUM } from "../../const"; import { QuestionCircleFilled } from "@ant-design/icons"; /** * 出价与预算 * @returns */ const AdgroupsPrice: React.FC = () => { /****************************************/ const { form, setOGPparams, OGPParams, putInType } = useContext(DispatchAd)!; const siteSet = Form.useWatch('siteSet', form) const bidMode = Form.useWatch('bidMode', form) const bidAllocationMode = Form.useWatch('bidAllocationMode', form) const roiAllocationMode = Form.useWatch(['deepConversionSpec', 'deepConversionWorthSpec', 'roiAllocationMode'], form) const optimizationGoal = Form.useWatch('optimizationGoal', form) const smartBidType = Form.useWatch('smartBidType', form) const bidScene = Form.useWatch('bidScene', form) const autoAcquisitionEnabled = Form.useWatch('autoAcquisitionEnabled', form) const automaticSiteEnabled = Form.useWatch('automaticSiteEnabled', form) const deepConversionType = Form.useWatch(['deepConversionSpec', 'deepConversionType'], form); const goal = Form.useWatch(['deepConversionSpec', deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? 'deepConversionBehaviorSpec' : 'deepConversionWorthSpec', 'goal'], form); /****************************************/ return 出价与预算} className="cardResetCss" > 计费方式 } name='bidMode' rules={[{ required: true, message: '请选择计费方式' }]} > { if (siteSet?.some((name: string) => ['SITE_SET_CHANNELS', 'SITE_SET_MOMENTS'].includes(name)) || automaticSiteEnabled) { return key === 'BID_MODE_OCPM' || key === 'BID_MODE_CPM' } else { return true } })?.map(key => ({ label: BID_MODE_ENUM[key as keyof typeof BID_MODE_ENUM], value: key, disabled: optimizationGoal && ['BID_MODE_CPM', 'BID_MODE_CPC', 'BID_MODE_CPA'].includes(key) ? true : false }))} onChange={(e) => { // form.setFieldsValue({ siteSet: defaultSiteSet }) setOGPparams({ ...OGPParams, automaticSiteEnabled: e, bidMode: e as string }) if (e === "BID_MODE_CPM" || e === "BID_MODE_CPC") { form.setFieldsValue({ optimizationGoal: null, smartBidType: null, bidScene: null, // bidAmount:null, bidStrategy: null, autoAcquisitionEnabled: false, autoAcquisitionBudget: null, dailyBudget: null, }) } else { form.setFieldsValue({ optimizationGoal: "OPTIMIZATIONGOAL_ECOMMERCE_ORDER", smartBidType: "SMART_BID_TYPE_CUSTOM", bidScene: "BID_SCENE_NORMAL_AVERAGE", bidAmount: '1000', bidStrategy: "BID_STRATEGY_TARGET_COST", autoAcquisitionEnabled: false, autoAcquisitionBudget: null, dailyBudget: null, }) } }} /> {(bidMode === 'BID_MODE_OCPM' || bidMode === 'BID_MODE_OCPC') && <> {putInType === 'GAME' ? 出价场景} name='bidScene' rules={[{ required: true, message: '请选择出价场景' }]}> ({ label: BID_SCENE_NORMAL_ENUM[key as keyof typeof BID_SCENE_NORMAL_ENUM], value: key }))} /> : 出价类型} name='smartBidType' rules={[{ required: true, message: '请选择出价类型' }]}> ({ label: SMART_BID_TYPE_ENUM[key as keyof typeof SMART_BID_TYPE_ENUM], value: key }))} /> } } {(putInType === 'GAME' ? bidScene !== 'BID_SCENE_NORMAL_MAX' : smartBidType !== 'SMART_BID_TYPE_SYSTEMATIC') && <> 出价分配方式} name='bidAllocationMode' rules={[{ required: true, message: '请选择出价分配方式' }]}> {bidAllocationMode === 1 ? 出价} name='bidAmount' rules={[{ required: true, message: '请输入价格' }]}> : {bidAllocationMode === 2 ? '随机出价' : '阶梯出价'}} required> - 元/{optimizationGoal ? OPTIMIZATIONGOAL_ENUM[optimizationGoal as keyof typeof OPTIMIZATIONGOAL_ENUM] : ['BID_MODE_OCPM', 'BID_MODE_OCPC'].includes(bidMode) ? '千次曝光' : '点击'} } {deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? <> 深度目标出价} name={['deepConversionSpec', 'deepConversionBehaviorSpec', 'bidAmount']} rules={[{ required: true, message: '请输入深度目标出价' }]}> : deepConversionType === 'DEEP_CONVERSION_WORTH' ? <> ROI分配方式} name={['deepConversionSpec', 'deepConversionWorthSpec', 'roiAllocationMode']} rules={[{ required: true, message: '请选择ROI分配方式' }]}> {roiAllocationMode === 1 ? 期望ROI} name={['deepConversionSpec', 'deepConversionWorthSpec', 'expectedRoi']} rules={[ { required: true, message: '请输入期望ROI' }, { type: 'number', ...(goal === 'GOAL_1DAY_MONETIZATION_ROAS' ? { min: 0.001, max: 50, message: '范围0.001~50' } : { min: 0.001, max: 1000, message: '范围0.001~1000' }) }, { validator: (_: any, value: string) => { if (!value || /^\d+(\.\d{0,3})?$/.test(value)) { return Promise.resolve(); } return Promise.reject(new Error('请输入最多三位小数')); } } ]} > : {roiAllocationMode === 2 ? '随机ROI' : '阶梯ROI'}} required> { if (!value || /^\d+(\.\d{0,3})?$/.test(value)) { return Promise.resolve(); } return Promise.reject(new Error('请输入最多三位小数')); } } ]} noStyle > - { if (!value || /^\d+(\.\d{0,3})?$/.test(value)) { return Promise.resolve(); } return Promise.reject(new Error('请输入最多三位小数')); } } ]} noStyle > } : null} {((bidMode === 'BID_MODE_OCPM' || bidMode === 'BID_MODE_OCPC') && (putInType === 'GAME' ? bidScene !== 'BID_SCENE_NORMAL_MAX' : smartBidType !== 'SMART_BID_TYPE_SYSTEMATIC')) && <> 一键起量

1. 一键起量原理:给该广告提供一笔起量预算,系统会在 6 小时内快速花完预算,帮助广告激进探索,获取更多曝光,期间转化成本可能高于预期;

2. 一键起量注意事项:
探索中任何原因导致广告暂停播放,都会导致起量中止,且恢复播放后也不会再继续探索; 一键起量期间产生的消耗不赔付,但转化计入赔付门槛判断;你可以在该广告的一键起量状态中止或结束时,重新设置起量预算,开始一次新的起量周期

点击查看赔付规则
点击了解一键起量

}>
} name='autoAcquisitionEnabled' valuePropName="checked" >
{/* 一键起量开启时才出现 */} {autoAcquisitionEnabled && 1. 一键起量期间产生的消耗不赔付,但转化计入赔付门槛判断
2. 一键起量可能导致转化成本高于预期,且起量结束后不一定能持续消耗 } >
} } } 广告日预算} name='dailyBudget' rules={[{ required: (smartBidType === 'SMART_BID_TYPE_SYSTEMATIC' || bidScene === 'BID_SCENE_NORMAL_MAX'), message: '请输入广告日预算' }]}>
} export default React.memo(AdgroupsPrice)