|
@@ -1,11 +1,13 @@
|
|
|
-import { Button, Checkbox, Input, Modal, Select, Space } from "antd";
|
|
|
+import { Button, Checkbox, Input, message, Modal, Select, Space, Table, Typography } from "antd";
|
|
|
import React, { useEffect, useState } from "react"
|
|
|
import '../../tencentAdPutIn/index.less'
|
|
|
import style from '../../components/GoodsModal/index.less'
|
|
|
import { getAdqLandingPageListApi, getWXDownPageAuthInfoListApi } from "@/services/adqV3/global"
|
|
|
-import { getAdqV3AdListApi } from "@/services/launchAdq/adqv3";
|
|
|
+import { batchUpdateDownloadApi, getAdgroupDetailApi } from "@/services/launchAdq/adqv3";
|
|
|
import { useAjax } from "@/Hook/useAjax";
|
|
|
-import { SyncOutlined } from "@ant-design/icons";
|
|
|
+import { CheckOutlined, CloseOutlined, SyncOutlined } from "@ant-design/icons";
|
|
|
+import columns from "../../components/PageModal/tableConfig";
|
|
|
+const { Title, Text } = Typography;
|
|
|
|
|
|
interface ReplacePageProps {
|
|
|
selectedRows: any[];
|
|
@@ -21,21 +23,29 @@ const ReplacePage: React.FC<ReplacePageProps> = ({ selectedRows, visible, onChan
|
|
|
|
|
|
/***********************************************/
|
|
|
const { deliveryMode, creativeTemplateId, creativeComponents: { mainJumpInfo } } = selectedRows[0]
|
|
|
- const pageType: string | undefined = mainJumpInfo?.[0]?.value?.pageType
|
|
|
const pageLength: number | undefined = mainJumpInfo?.length
|
|
|
+ const overrideCanvasHeadOption = mainJumpInfo?.[0]?.value?.pageSpec?.wechatCanvasSpec?.overrideCanvasHeadOption
|
|
|
+ const [data, setData] = useState<{ adgroupId: number, accountId: number, dynamicCreativeId: number, pageLength: number, pageList: any[] }[]>(selectedRows.map(item => {
|
|
|
+ return { adgroupId: item.adgroupId, accountId: item.accountId, dynamicCreativeId: item.dynamicCreativeId, pageList: [], pageLength: item.creativeComponents.mainJumpInfo.length }
|
|
|
+ }))
|
|
|
|
|
|
const [selectAdz, setSelectAdz] = useState<number>(1) // 选择创意
|
|
|
const [selectData, setSelectData] = useState<any>(selectedRows[0]) // 选择创意
|
|
|
const [loading, setLoading] = useState<boolean>(false)
|
|
|
+ const [loading1, setLoading1] = useState<boolean>(false)
|
|
|
const [wXDownPageAuthInfo, setWXDownPageAuthInfo] = useState<any>({})
|
|
|
+ const [adDataInfo, setAdDataInfo] = useState<any>({})
|
|
|
const [queryForm, setQueryForm] = useState<{ accountId?: number, pageName?: string, ownerUid?: number, pageSize: number, pageNum: number, isSqDownPage: boolean, isCanvasType?: boolean }>({ pageNum: 1, pageSize: 20, isSqDownPage: false })
|
|
|
+ const [tableData, setTableData] = useState<any>({})
|
|
|
|
|
|
const getAdqLandingPageList = useAjax((params) => getAdqLandingPageListApi(params))
|
|
|
+ const batchUpdateDownload = useAjax((params) => batchUpdateDownloadApi(params))
|
|
|
/***********************************************/
|
|
|
|
|
|
useEffect(() => {
|
|
|
if (selectedRows?.length > 0) {
|
|
|
setLoading(true)
|
|
|
+ setLoading1(true)
|
|
|
const accountDataList = [...new Set(selectedRows.map(item => item.accountId))]
|
|
|
const infoAjax = accountDataList.map(accountId => getWXDownPageAuthInfoListApi(accountId))
|
|
|
const newData: any = {}
|
|
@@ -46,30 +56,69 @@ const ReplacePage: React.FC<ReplacePageProps> = ({ selectedRows, visible, onChan
|
|
|
setWXDownPageAuthInfo(newData)
|
|
|
setLoading(false)
|
|
|
}).catch(() => setLoading(false))
|
|
|
- const adIdDataList = [...new Set(selectedRows.map(item => item.adgroupId))]
|
|
|
- const adInfoAjax = adIdDataList.map(item => getAdqV3AdListApi({ adgroupIdList: [item], pageNum: 1, pageSize: 1 } as ADQV3.GetAdListProps))
|
|
|
+ const adIdDataList = [...new Set(selectedRows.map(item => item.adgroupId + '_' + item.accountId))]
|
|
|
+ const adInfoAjax = adIdDataList.map(item => {
|
|
|
+ const [adgroupId, accountId] = item.split('_')
|
|
|
+ return getAdgroupDetailApi({ adgroupId: Number(adgroupId), accountId: Number(accountId) })
|
|
|
+ })
|
|
|
+
|
|
|
+ const newAdData: any = {}
|
|
|
Promise.all(adInfoAjax).then(res => {
|
|
|
- // res?.forEach((item, index) => {
|
|
|
- // selectedRows[index].pageList = item?.data?.list || []
|
|
|
- // })
|
|
|
- // setSelectData(selectedRows[0])
|
|
|
- setLoading(false)
|
|
|
- }).catch(() => setLoading(false))
|
|
|
+ res?.forEach((item, index) => {
|
|
|
+ const [adgroupId] = adIdDataList[index].split('_')
|
|
|
+ newAdData[adgroupId] = item?.data || []
|
|
|
+ })
|
|
|
+ setAdDataInfo(newAdData)
|
|
|
+ setLoading1(false)
|
|
|
+ }).catch(() => setLoading1(false))
|
|
|
}
|
|
|
}, [])
|
|
|
|
|
|
useEffect(() => {
|
|
|
- if (selectData) {
|
|
|
+ if (selectData && selectData.accountId && Object.keys(adDataInfo).length) {
|
|
|
getList()
|
|
|
}
|
|
|
- }, [queryForm, selectData])
|
|
|
+ }, [queryForm, selectData, adDataInfo])
|
|
|
|
|
|
const getList = async () => {
|
|
|
-
|
|
|
+ const { marketingGoal, marketingTargetType, marketingCarrierType, siteSet, accountId } = adDataInfo[selectData.adgroupId]
|
|
|
+ let params: any = { ...queryForm, accountId, pageStatus: 'NORMAL', marketingGoal, marketingTargetType, marketingCarrierType, siteSet }
|
|
|
+ if (params.isSqDownPage) {
|
|
|
+ if (!params?.ownerUid) {
|
|
|
+ setTableData({ total: 0, records: [] })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ delete params?.ownerUid
|
|
|
+ }
|
|
|
+ if (params?.isCanvasType) {
|
|
|
+ params.canvasType = 'CANVAS_TYPE_COMMON_PAGE'
|
|
|
+ }
|
|
|
+ delete params?.isCanvasType
|
|
|
+ delete params.isSqDownPage
|
|
|
+ getAdqLandingPageList.run(params).then(res => {
|
|
|
+ setTableData(res || {})
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
const handleOk = () => {
|
|
|
-
|
|
|
+ console.log(data)
|
|
|
+ if (data.every(item => item.pageList.length === item.pageLength)) {
|
|
|
+ batchUpdateDownload.run(data.map(item => {
|
|
|
+ return {
|
|
|
+ accountId: item.accountId,
|
|
|
+ dynamicCreativeId: item.dynamicCreativeId,
|
|
|
+ pageId: item.pageList.map((ite: any) => ite.pageId)
|
|
|
+ }
|
|
|
+ })).then(res => {
|
|
|
+ if (res) {
|
|
|
+ message.success('替换成功,结果记录查看')
|
|
|
+ onChange?.()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ message.error('请为每个创意选择对应的落地页数量')
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/** 设置选中广告主 */
|
|
@@ -84,22 +133,23 @@ const ReplacePage: React.FC<ReplacePageProps> = ({ selectedRows, visible, onChan
|
|
|
}
|
|
|
|
|
|
return <Modal
|
|
|
- title={<strong>替换落地页</strong>}
|
|
|
+ title={<strong>替换原生落地页</strong>}
|
|
|
open={visible}
|
|
|
onCancel={onClose}
|
|
|
onOk={handleOk}
|
|
|
width={1100}
|
|
|
className={`${style.SelectPackage} modalResetCss`}
|
|
|
bodyStyle={{ padding: '0 10px 0 10px' }}
|
|
|
+ confirmLoading={batchUpdateDownload?.loading}
|
|
|
>
|
|
|
<div className={style.content}>
|
|
|
- <div className={style.left} style={{ width: 180 }}>
|
|
|
+ <div className={style.left} style={{ width: 200 }}>
|
|
|
<h4 className={style.title}>创意</h4>
|
|
|
<div className={style.accountIdList}>
|
|
|
- {selectedRows?.map((item, index) => (
|
|
|
- <div key={item?.accountId + '_' + item.dynamicCreativeId} onClick={() => { if (!loading) handleSelectAdz(index + 1) }} className={`${style.accItem} ${selectAdz === index + 1 && style.select} `}>
|
|
|
+ {data?.map((item, index) => (
|
|
|
+ <div key={item?.accountId + '_' + item.dynamicCreativeId} onClick={() => { if (!loading && !loading1) handleSelectAdz(index + 1) }} className={`${style.accItem} ${selectAdz === index + 1 && style.select} `}>
|
|
|
{item.dynamicCreativeId}({item?.accountId})
|
|
|
- {/* {data[index].pageList?.length > 0 && <CheckOutlined style={{ color: '#1890ff' }} />} */}
|
|
|
+ {data[index].pageList?.length === pageLength && <CheckOutlined style={{ color: '#1890ff' }} />}
|
|
|
</div>
|
|
|
))}
|
|
|
</div>
|
|
@@ -115,7 +165,7 @@ const ReplacePage: React.FC<ReplacePageProps> = ({ selectedRows, visible, onChan
|
|
|
<Checkbox
|
|
|
onChange={(e) => {
|
|
|
if (e.target.checked && wXDownPageAuthInfo && Object.keys(wXDownPageAuthInfo).length) {
|
|
|
- setQueryForm({ ...queryForm, pageNum: 1, ownerUid: wXDownPageAuthInfo[selectedRows[selectAdz - 1].accountId]?.[0]?.accountId, isSqDownPage: true })
|
|
|
+ setQueryForm({ ...queryForm, pageNum: 1, ownerUid: wXDownPageAuthInfo[data[selectAdz - 1].accountId]?.[0]?.accountId, isSqDownPage: true })
|
|
|
} else {
|
|
|
setQueryForm({ ...queryForm, pageNum: 1, ownerUid: undefined, isSqDownPage: false })
|
|
|
}
|
|
@@ -136,13 +186,163 @@ const ReplacePage: React.FC<ReplacePageProps> = ({ selectedRows, visible, onChan
|
|
|
value={queryForm?.ownerUid}
|
|
|
dropdownMatchSelectWidth={false}
|
|
|
>
|
|
|
- {wXDownPageAuthInfo?.[selectedRows[selectAdz - 1].accountId]?.map((item: { accountId: number; accountName: string }) => {
|
|
|
+ {wXDownPageAuthInfo?.[data[selectAdz - 1].accountId]?.map((item: { accountId: number; accountName: string }) => {
|
|
|
return <Select.Option value={item.accountId} key={item.accountId}>{item.accountName}({item.accountId})</Select.Option>
|
|
|
})}
|
|
|
</Select>}
|
|
|
<Input value={queryForm?.pageName} style={{ width: 150 }} allowClear placeholder='请输入落地页名称' onChange={(e) => setQueryForm({ ...queryForm, pageNum: 1, pageName: e.target.value })} />
|
|
|
<Button style={{ padding: 0, margin: 0 }} icon={<SyncOutlined />} type='link' loading={getAdqLandingPageList?.loading} onClick={() => { getAdqLandingPageList?.refresh() }}><span style={{ fontSize: 12 }}>刷新</span></Button>
|
|
|
</Space>
|
|
|
+ <Table
|
|
|
+ columns={columns()}
|
|
|
+ dataSource={tableData?.records}
|
|
|
+ size="small"
|
|
|
+ loading={getAdqLandingPageList?.loading || loading || loading1}
|
|
|
+ scroll={{ y: 400 }}
|
|
|
+ bordered
|
|
|
+ rowKey={'pageId'}
|
|
|
+ pagination={{
|
|
|
+ total: tableData?.total,
|
|
|
+ defaultPageSize: 20,
|
|
|
+ current: tableData?.current,
|
|
|
+ pageSize: tableData?.size
|
|
|
+ }}
|
|
|
+ onChange={(pagination) => {
|
|
|
+ const { current, pageSize } = pagination
|
|
|
+ setQueryForm({ ...queryForm, pageNum: current as number, pageSize: pageSize as number || 20 })
|
|
|
+ }}
|
|
|
+ /**
|
|
|
+ * canvasType
|
|
|
+ * VIDEO
|
|
|
+ * VIDEO_1280_960 横板1280*960
|
|
|
+ * VIDEO_1280_720 横板1280*720
|
|
|
+ * VERTICAL_VIDEO_NEW_916 9:16 视频
|
|
|
+ * COMMON_PAGE 引用外层素材原生页
|
|
|
+ * IMAGE
|
|
|
+ */
|
|
|
+ rowSelection={{
|
|
|
+ type: ([910].includes(creativeTemplateId) || deliveryMode === "DELIVERY_MODE_COMPONENT") ? 'checkbox' : 'radio',
|
|
|
+ getCheckboxProps: (record: any) => {
|
|
|
+ let { canvasType, pageElementsSpecList } = record
|
|
|
+ let topData = pageElementsSpecList[0]
|
|
|
+ if ([910].includes(creativeTemplateId) && canvasType === 'COMMON_PAGE') {
|
|
|
+ return {
|
|
|
+ disabled: true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 组件化创意
|
|
|
+ if (deliveryMode === "DELIVERY_MODE_COMPONENT") {
|
|
|
+ if (data[selectAdz - 1]?.pageList?.length >= mainJumpInfo?.length) {
|
|
|
+ return {
|
|
|
+ disabled: data[selectAdz - 1]?.pageList?.some((item: any) => item?.pageId === record?.pageId) ? false : true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 641 三图 642 4图 643 6图 311 一图
|
|
|
+ * 721 素板视频 9:16 -> VERTICAL_VIDEO_NEW_916 720 722 横板视频 -> VIDEO_1280_960
|
|
|
+ * 618 常规视频 ---> VIDEO
|
|
|
+ * 1708 1707 ---> false
|
|
|
+ */
|
|
|
+ if (overrideCanvasHeadOption === 'OPTION_CREATIVE_OVERRIDE_CANVAS' || [1708, 1707].includes(creativeTemplateId)) {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ([721].includes(creativeTemplateId) && canvasType === 'VERTICAL_VIDEO_NEW_916') {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ } else if ([720, 722].includes(creativeTemplateId) && canvasType === 'VIDEO_1280_960') {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ } else if ([618].includes(creativeTemplateId) && canvasType === 'VIDEO') {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ } else if ([311].includes(creativeTemplateId) && canvasType === "IMAGE" && topData.imageSpec.length === 1) {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ } else if ([641].includes(creativeTemplateId) && canvasType === "IMAGE" && topData.imageSpec.length === 3) {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ } else if ([642].includes(creativeTemplateId) && canvasType === "IMAGE" && topData.imageSpec.length === 4) {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ } else if ([643].includes(creativeTemplateId) && canvasType === "IMAGE" && topData.imageSpec.length === 6) {
|
|
|
+ return {
|
|
|
+ disabled: false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ disabled: true
|
|
|
+ }
|
|
|
+ },
|
|
|
+ selectedRowKeys: data[selectAdz - 1]?.pageList?.map((item: any) => item?.pageId),
|
|
|
+ hideSelectAll: deliveryMode === "DELIVERY_MODE_COMPONENT",
|
|
|
+ onSelect: (record: any, selected: boolean) => {
|
|
|
+ let newData = JSON.parse(JSON.stringify(data))
|
|
|
+ if (([910].includes(creativeTemplateId) || deliveryMode === "DELIVERY_MODE_COMPONENT")) {
|
|
|
+ let selectedRows = newData?.[selectAdz - 1]?.['pageList'] || []
|
|
|
+ if (selected) {
|
|
|
+ selectedRows.push({ ...record })
|
|
|
+ newData[selectAdz - 1]['pageList'] = selectedRows
|
|
|
+ } else {
|
|
|
+ newData[selectAdz - 1]['pageList'] = selectedRows.filter((item: { pageId: number }) => item.pageId !== record.pageId)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ newData[selectAdz - 1]['pageList'] = [record]
|
|
|
+ }
|
|
|
+ setData([...newData])
|
|
|
+ },
|
|
|
+ onSelectAll: (selected: boolean, _: any[], changeRows: { pageId: number }[]) => {
|
|
|
+ let newData = JSON.parse(JSON.stringify(data))
|
|
|
+ let selectedRows = newData?.[selectAdz - 1]?.['pageList'] || []
|
|
|
+ if (selected) {
|
|
|
+ let newSelectAccData = [...selectedRows]
|
|
|
+ changeRows.forEach((item: { pageId: number }) => {
|
|
|
+ let index = newSelectAccData.findIndex((ite: { pageId: number }) => ite.pageId === item.pageId)
|
|
|
+ if (index === -1) {
|
|
|
+ let data: any = { ...item }
|
|
|
+ newSelectAccData.push(data)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ newData[selectAdz - 1]['pageList'] = newSelectAccData
|
|
|
+ } else {
|
|
|
+ newData[selectAdz - 1]['pageList'] = selectedRows.filter((item: { pageId: number }) => {
|
|
|
+ let index = changeRows.findIndex((ite: { pageId: number }) => ite.pageId === item.pageId)
|
|
|
+ if (index !== -1) {
|
|
|
+ return false
|
|
|
+ } else {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ setData([...newData])
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div className={style.center}>
|
|
|
+ <Title level={5}>已选:{data[selectAdz - 1]?.pageList?.length || 0}/{data[selectAdz - 1].pageLength}</Title>
|
|
|
+ <div className={style.select_content} style={{ height: 416 }}>
|
|
|
+ {data[selectAdz - 1]?.pageList?.map((item: any) => <div key={item.pageId}>
|
|
|
+ <Text ellipsis={{ tooltip: true }} className={style.marketingAssetName}>{item.pageName}</Text>
|
|
|
+ <CloseOutlined className={style.close} onClick={() => {
|
|
|
+ let newData: { adgroupId: number, accountId: number, dynamicCreativeId: number, pageLength: number, pageList: any[] }[] = JSON.parse(JSON.stringify(data))
|
|
|
+ newData[selectAdz - 1].pageList = newData[selectAdz - 1]?.pageList?.filter((i: any) => i?.pageId !== item.pageId)
|
|
|
+ setData(newData)
|
|
|
+ }} />
|
|
|
+ </div>)}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</Modal>
|