|
@@ -2,6 +2,7 @@ import Tables from "@/components/Tables"
|
|
|
import { useAjax } from "@/Hook/useAjax"
|
|
|
import { CreateAdProps } from "@/services/launchAdq/createAd"
|
|
|
import { BidModeEnum, BidStrategyEnum, OptimizationGoalEnum, PromotedObjectType, SiteSetEnum } from "@/services/launchAdq/enum"
|
|
|
+import { getTagsList } from "@/services/launchAdq/global"
|
|
|
import { getSysAdgroupsInfo } from "@/services/launchAdq/localAd"
|
|
|
import { getsysTargetingInfo } from "@/services/launchAdq/targeting"
|
|
|
import { CloseOutlined, SearchOutlined } from "@ant-design/icons"
|
|
@@ -15,6 +16,7 @@ import IdModal from "../../components/idModal"
|
|
|
import LookLanding from "../../components/lookLanding"
|
|
|
import SelectCloud from "../../components/selectCloud"
|
|
|
import TargetingModal from "../../components/targetingModal"
|
|
|
+import TargetingTooltip from "../../components/targetingTooltip"
|
|
|
import { WxAutoButton } from "../../req"
|
|
|
import style from './index.less'
|
|
|
import Selector from "./selector"
|
|
@@ -47,14 +49,40 @@ const CreateAd: React.FC = () => {
|
|
|
const [selectImgVisible, setSelectImgVisible] = useState<boolean>(false) // 选择转化ID弹窗控制
|
|
|
const [lookVisible, setLookVisible] = useState<boolean>(false) // 选择转化ID弹窗控制
|
|
|
const [subVisible, setSubVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
|
|
|
- const getSysAdgroups = useAjax((params) => getSysAdgroupsInfo(params))
|
|
|
- const getsysTargeting = useAjax((params) => getsysTargetingInfo(params))
|
|
|
const [wxButtonList, setWxButtonList] = useState<WxAutoButton[]>([])
|
|
|
const [tableData, setTableData] = useState<any[]>([]) // 预览表格
|
|
|
const [tableSelect, setTableSelect] = useState<any[]>([])
|
|
|
+ const [geoLocationList, setGeoLocationList] = useState<any>({}) // 所有地域列表
|
|
|
+ const [modelList, setModelList] = useState<any>({}) // 所有品牌手机
|
|
|
const { init, get } = useModel('useLaunchAdq.useBdMediaPup')
|
|
|
+
|
|
|
+
|
|
|
+ const tagsList_REGION = useAjax((params) => getTagsList(params))
|
|
|
+ const tagsList_MODEL = useAjax((params) => getTagsList(params))
|
|
|
+ const getSysAdgroups = useAjax((params) => getSysAdgroupsInfo(params))
|
|
|
+ const getsysTargeting = useAjax((params) => getsysTargetingInfo(params))
|
|
|
/*************************/
|
|
|
|
|
|
+ // 设置地域
|
|
|
+ useEffect(() => {
|
|
|
+ tagsList_REGION.run({ type: 'REGION' }).then(res => {
|
|
|
+ if (res) {
|
|
|
+ setGeoLocationList(() => (res as any[])?.reduce((prev: any, cur: { id: number }) => {
|
|
|
+ prev[cur.id] = cur
|
|
|
+ return prev
|
|
|
+ }, {}))
|
|
|
+ }
|
|
|
+ })
|
|
|
+ tagsList_MODEL.run({ type: 'DEVICE_BRAND_MODEL' }).then(res => {
|
|
|
+ if (res) {
|
|
|
+ setModelList(() => (res as any[])?.reduce((prev: any, cur: { id: number }) => {
|
|
|
+ prev[cur.id] = cur
|
|
|
+ return prev
|
|
|
+ }, {}))
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }, [])
|
|
|
+
|
|
|
// 获取账户列表
|
|
|
useEffect(() => {
|
|
|
getAdAccount.run()
|
|
@@ -192,16 +220,16 @@ const CreateAd: React.FC = () => {
|
|
|
<Spin spinning={getSysAdgroups.loading}>
|
|
|
<div className={style.centerContent}>
|
|
|
{getSysAdgroups?.data ? <>
|
|
|
- <div>广告名称: {getSysAdgroups?.data?.adgroupName}</div>
|
|
|
- <div>推广目标: {PromotedObjectType[getSysAdgroups?.data?.promotedObjectType]}</div>
|
|
|
- <div>广告版位: {getSysAdgroups?.data?.siteSet?.map((item: string) => SiteSetEnum[item]).toString()}</div>
|
|
|
- <div>投放日期: {getSysAdgroups?.data?.endDate ? getSysAdgroups?.data?.beginDate + '~' + getSysAdgroups?.data?.endDate : getSysAdgroups?.data?.beginDate + '~' + '长期投放'}</div>
|
|
|
- <div>出价方式: {BidModeEnum[getSysAdgroups?.data?.bidMode]}</div>
|
|
|
- <div>优化目标: {OptimizationGoalEnum[getSysAdgroups?.data?.optimizationGoal]}</div>
|
|
|
- <div>出价类型: {getSysAdgroups?.data?.smartBidType === 'SMART_BID_TYPE_CUSTOM' ? '手动出价' : '自动出价'}</div>
|
|
|
- <div>出价策略: {BidStrategyEnum[getSysAdgroups?.data?.bidStrategy]}</div>
|
|
|
- <div>广告出价: {getSysAdgroups?.data?.bidAmount}</div>
|
|
|
- <div>广告日预算: {getSysAdgroups?.data?.dailyBudget || '不限'}</div>
|
|
|
+ <div>广告名称: <span>{getSysAdgroups?.data?.adgroupName}</span></div>
|
|
|
+ <div>推广目标: <span>{PromotedObjectType[getSysAdgroups?.data?.promotedObjectType]}</span></div>
|
|
|
+ <div>广告版位: <span>{getSysAdgroups?.data?.siteSet?.map((item: string) => SiteSetEnum[item]).toString()}</span></div>
|
|
|
+ <div>投放日期: <span>{getSysAdgroups?.data?.endDate ? getSysAdgroups?.data?.beginDate + '~' + getSysAdgroups?.data?.endDate : getSysAdgroups?.data?.beginDate + '~' + '长期投放'}</span></div>
|
|
|
+ <div>出价方式: <span>{BidModeEnum[getSysAdgroups?.data?.bidMode]}</span></div>
|
|
|
+ <div>优化目标: <span>{OptimizationGoalEnum[getSysAdgroups?.data?.optimizationGoal]}</span></div>
|
|
|
+ <div>出价类型: <span>{getSysAdgroups?.data?.smartBidType === 'SMART_BID_TYPE_CUSTOM' ? '手动出价' : '自动出价'}</span></div>
|
|
|
+ <div>出价策略: <span>{BidStrategyEnum[getSysAdgroups?.data?.bidStrategy]}</span></div>
|
|
|
+ <div>广告出价: <span>{getSysAdgroups?.data?.bidAmount}</span></div>
|
|
|
+ <div>广告日预算: <span>{getSysAdgroups?.data?.dailyBudget || '不限'}</span></div>
|
|
|
</> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
|
|
|
</div>
|
|
|
</Spin>
|
|
@@ -221,8 +249,9 @@ const CreateAd: React.FC = () => {
|
|
|
<Spin spinning={getsysTargeting.loading}>
|
|
|
<div className={style.centerContent}>
|
|
|
{getsysTargeting?.data ? <>
|
|
|
- <div>定向名称: {getsysTargeting?.data?.targetingName}</div>
|
|
|
- <div>定向描述: {getsysTargeting?.data?.description}</div>
|
|
|
+ <div>定向名称: <span>{getsysTargeting?.data?.targetingName}</span></div>
|
|
|
+ <div>定向描述: <span>{getsysTargeting?.data?.description}</span></div>
|
|
|
+ <TargetingTooltip data={getsysTargeting?.data} geoLocationList={geoLocationList} modelList={modelList}/>
|
|
|
</> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
|
|
|
</div>
|
|
|
</Spin>
|
|
@@ -323,8 +352,8 @@ const CreateAd: React.FC = () => {
|
|
|
case 'TOP_IMAGE':
|
|
|
return <Image width={80} src={item.topImageSpec.imageUrl} style={{ borderRadius: 8, overflow: 'hidden' }} key={index} />
|
|
|
case 'TOP_SLIDER':
|
|
|
- return <Space>
|
|
|
- {item?.topSliderSpec?.imageUrlList?.map((url: string, index: number) => <Image width={80} src={url} style={{ borderRadius: 8 }} key={index} />)}
|
|
|
+ return <Space wrap>
|
|
|
+ {item?.topSliderSpec?.imageUrlList?.map((url: string, index: number) => <Image width={70} src={url} style={{ borderRadius: 8 }} key={index} />)}
|
|
|
</Space>
|
|
|
case 'TOP_VIDEO':
|
|
|
return <video src={item.topVideoSpec.videoUrl} width={150} controls key={index}></video>
|
|
@@ -360,17 +389,17 @@ const CreateAd: React.FC = () => {
|
|
|
hoverable
|
|
|
extra={tableData?.length > 0 ? <Space>
|
|
|
<span>推广计划总数:{accountCreateLogs?.length}</span>
|
|
|
- <span>广告总数:{accountCreateLogs?.length}</span>
|
|
|
- {tableSelect?.length > 0 && <span> 已选:<span style={{ color: '#1890FF' }}>{tableSelect?.length}</span> 条</span>}
|
|
|
- {
|
|
|
- <Button type='primary' onClick={() => {
|
|
|
- if (tableSelect.length === 0) {
|
|
|
- message.error('请选择要提交的计划!')
|
|
|
- return
|
|
|
- };
|
|
|
- setSubVisible(true)
|
|
|
- }}>批量提交审核</Button>
|
|
|
- }
|
|
|
+ <span>广告总数:{accountCreateLogs?.length}</span>
|
|
|
+ {tableSelect?.length > 0 && <span> 已选:<span style={{ color: '#1890FF' }}>{tableSelect?.length}</span> 条</span>}
|
|
|
+ {
|
|
|
+ <Button type='primary' onClick={() => {
|
|
|
+ if (tableSelect.length === 0) {
|
|
|
+ message.error('请选择要提交的计划!')
|
|
|
+ return
|
|
|
+ };
|
|
|
+ setSubVisible(true)
|
|
|
+ }}>批量提交审核</Button>
|
|
|
+ }
|
|
|
</Space> : false
|
|
|
}
|
|
|
>
|
|
@@ -398,9 +427,9 @@ const CreateAd: React.FC = () => {
|
|
|
|
|
|
|
|
|
{/* 选择广告 */}
|
|
|
- {adVisible && <AdModal visible={adVisible} onClose={() => setAdVisible(false)} promotedObjectType={queryForm.promotedObjectType as string} onChange={(e) => { setQueryForm({ ...queryForm, sysAdgroupsId: e }); setAdVisible(false) }} />}
|
|
|
+ {adVisible && <AdModal visible={adVisible} onClose={() => setAdVisible(false)} promotedObjectType={queryForm.promotedObjectType as string} onChange={(e) => { setQueryForm({ ...queryForm, sysAdgroupsId: e }); setAdVisible(false) }} sysAdgroupsId={queryForm?.sysAdgroupsId}/>}
|
|
|
{/* 选择定向 */}
|
|
|
- {dxVisible && <TargetingModal visible={dxVisible} onClose={() => setDxVisible(false)} onChange={(e) => { setQueryForm({ ...queryForm, sysTargetingId: e }); setDxVisible(false) }} />}
|
|
|
+ {dxVisible && <TargetingModal visible={dxVisible} onClose={() => setDxVisible(false)} onChange={(e) => { setQueryForm({ ...queryForm, sysTargetingId: e }); setDxVisible(false) }} sysTargetingId={queryForm?.sysTargetingId}/>}
|
|
|
{/* 选择商品 */}
|
|
|
{goodsVisible && <GoodsModal visible={goodsVisible} data={accountCreateLogs} onClose={() => setGoodsVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setGoodsVisible(false) }} />}
|
|
|
{/* 选择数据源 */}
|
|
@@ -412,7 +441,7 @@ const CreateAd: React.FC = () => {
|
|
|
{/* 查看落地页 */}
|
|
|
{lookVisible && <LookLanding visible={lookVisible} onClose={() => setLookVisible(false)} id={queryForm?.sysPageId as any} />}
|
|
|
{/* 设置名称 */}
|
|
|
- {subVisible && <SubmitModal visible={subVisible} onClose={() => setSubVisible(false)} onChange={submit}/>}
|
|
|
+ {subVisible && <SubmitModal visible={subVisible} onClose={() => setSubVisible(false)} onChange={submit} />}
|
|
|
</Space>
|
|
|
}
|
|
|
|