wjx 9 月之前
父節點
當前提交
93194eaa1e

+ 5 - 0
src/pages/launchSystemV3/components/GoodsModal/index.less

@@ -8,6 +8,11 @@
         }
     }
 
+    .pageType {
+        border-bottom: 1px solid #f0f0f0;
+        padding: 16px 4px;
+    }
+
     .content {
         width: 100%;
         display: flex;

+ 23 - 6
src/pages/launchSystemV3/components/PageModal/index.tsx

@@ -7,6 +7,7 @@ import style from '../GoodsModal/index.less'
 import columns from "./tableConfig"
 import { getAdqLandingPageListApi, getWXDownPageAuthInfoListApi } from "@/services/adqV3/global"
 import { OPTION_ENUM } from "../../tencentAdPutIn/const"
+import New1Radio from "../New1Radio"
 const { Title, Text } = Typography;
 
 /**
@@ -16,7 +17,7 @@ const { Title, Text } = Typography;
 interface Props {
     visible?: boolean,
     onClose?: () => void,
-    onChange?: (data: PULLIN.AccountCreateLogsProps[]) => void,
+    onChange?: (value: { data: PULLIN.AccountCreateLogsProps[], landingPageType: 0 | 1 }) => void,
     adgroups: any
     dynamic: any
     data: PULLIN.AccountCreateLogsProps[]
@@ -26,7 +27,7 @@ const PageModal: React.FC<Props> = (props) => {
     /*************************/
     const { visible, onClose, data: data1, adgroups, onChange, dynamic } = props
     const { marketingGoal, marketingAssetOuterSpec: { marketingTargetType }, marketingCarrierType, siteSet } = adgroups
-    const { creativeTemplateId, deliveryMode, creativeComponents: { mainJumpInfo } } = dynamic
+    const { creativeTemplateId, deliveryMode, creativeComponents: { mainJumpInfo }, landingPageType } = dynamic
     let overrideCanvasHeadOption = ''
     if (mainJumpInfo && mainJumpInfo?.length > 0) {
         mainJumpInfo.forEach((item: any) => {
@@ -42,6 +43,7 @@ const PageModal: React.FC<Props> = (props) => {
     const [loading, setLoading] = useState<boolean>(false)
     const [wXDownPageAuthInfo, setWXDownPageAuthInfo] = useState<any>({})
     const [tableData, setTableData] = useState<any>({})
+    const [pageAllocationType, setPageAllocationType] = useState<0 | 1>(landingPageType || 0)
 
     const listAjax = useAjax((params) => getAdqLandingPageListApi(params))
     /*************************/
@@ -101,7 +103,7 @@ const PageModal: React.FC<Props> = (props) => {
             return
         }
         if (data?.every(item => item.pageList)) {
-            onChange && onChange(data)
+            onChange && onChange({ data, landingPageType: pageAllocationType })
         } else {
             message.error('还有账号未选择落地页!')
         }
@@ -177,7 +179,7 @@ const PageModal: React.FC<Props> = (props) => {
                     </Tooltip>
                 </Space>
             </Button>}
-            <Text type="warning">{OPTION_ENUM[overrideCanvasHeadOption]}</Text>
+            {![910].includes(creativeTemplateId) && <Text type="warning">{OPTION_ENUM[overrideCanvasHeadOption]}</Text>}
         </Space>}
         visible={visible}
         onCancel={() => { onClose && onClose() }}
@@ -186,7 +188,18 @@ const PageModal: React.FC<Props> = (props) => {
         className={`${style.SelectPackage} modalResetCss`}
         bodyStyle={{ padding: '0 10px 0 10px' }}
     >
-
+        {[910].includes(creativeTemplateId) && <div className={style.pageType}>
+            <Space size={12}>
+                <strong>落地页分配规则</strong>
+                <New1Radio
+                    data={[{ label: '全部相同', value: 0 }, { label: '平均分配', value: 1 }]}
+                    value={pageAllocationType}
+                    onChange={(e) => {
+                        setPageAllocationType(e)
+                    }}
+                />
+            </Space>
+        </div>}
         <div className={style.content}>
             <div className={style.left}>
                 <h4 className={style.title}>媒体账户</h4>
@@ -268,7 +281,11 @@ const PageModal: React.FC<Props> = (props) => {
                         getCheckboxProps: (record) => {
                             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) {

+ 11 - 0
src/pages/launchSystemV3/tencentAdPutIn/create/Material/index.tsx

@@ -138,6 +138,17 @@ const Material: React.FC<{ adData?: any[] }> = ({ adData }) => {
                 if (addelivery.mediaType !== mediaType && mediaType !== 1 && addelivery.dynamicCreativesTextDTOS?.type === 4) {
                     newAddelivery.dynamicCreativesTextDTOS = {}
                 }
+                if (newAddelivery.dynamicCreativesTextDTOS && Object.keys(newAddelivery.dynamicCreativesTextDTOS).length && dynamicMaterialDTos.dynamicGroup.length !== addelivery?.dynamicMaterialDTos?.dynamicGroup?.length && addelivery.dynamicCreativesTextDTOS?.type === 1) {
+                    let lengthN = dynamicMaterialDTos.dynamicGroup.length
+                    let lengthO = addelivery.dynamicMaterialDTos.dynamicGroup.length
+                    let diff = lengthN - lengthO
+                    let lengthL = addelivery.dynamicCreativesTextDTOS.dynamicCreativesTextDetailDTOList.length
+                    if (diff > 0) {
+                        newAddelivery.dynamicCreativesTextDTOS.dynamicCreativesTextDetailDTOList = [...newAddelivery.dynamicCreativesTextDTOS.dynamicCreativesTextDetailDTOList, ...Array(diff).fill({})]
+                    } else {
+                        newAddelivery.dynamicCreativesTextDTOS.dynamicCreativesTextDetailDTOList = newAddelivery.dynamicCreativesTextDTOS.dynamicCreativesTextDetailDTOList.splice(0, lengthL + diff)
+                    }
+                }
                 setAddelivery(newAddelivery)
                 setNewVisible(false)
                 clearData()

+ 37 - 6
src/pages/launchSystemV3/tencentAdPutIn/create/PageList/index.tsx

@@ -1,6 +1,6 @@
 import React, { useContext, useState } from 'react'
 import style from '../index.less'
-import { Button, Empty, Typography } from 'antd'
+import { Button, Empty, Typography, message } from 'antd'
 import { DispatchAddelivery } from '..';
 import { PlusCircleOutlined } from '@ant-design/icons';
 import PageModal from '@/pages/launchSystemV3/components/PageModal';
@@ -10,11 +10,11 @@ const { Title, Text } = Typography;
  * 落地页
  * @returns 
  */
-const PageList: React.FC = () => {
+const PageList: React.FC<{ adDataGroup?: { [x: number]: any[] } }> = ({ adDataGroup }) => {
 
     /********************************/
-    const { addelivery, accountCreateLogs, setAccountCreateLogs, clearData } = useContext(DispatchAddelivery)!;
-    const { dynamic, adgroups } = addelivery
+    const { addelivery, setAddelivery, accountCreateLogs, setAccountCreateLogs, clearData } = useContext(DispatchAddelivery)!;
+    const { dynamic, adgroups, targeting } = addelivery
 
     const [addVisible, setAddVisible] = useState<boolean>(false)
     /********************************/
@@ -25,6 +25,7 @@ const PageList: React.FC = () => {
         </div>
         <div className={style.detail}>
             <div className={style.detail_body}>
+                {[910].includes(dynamic?.creativeTemplateId) && <Title level={5} style={{ fontSize: 12 }}>{dynamic?.landingPageType === 1 ? '平均分配' : '全部相同'}</Title>}
                 {accountCreateLogs?.map((item, index) => {
                     return <div key={index}>
                         <Title level={5} style={{ fontSize: 12 }}>{item.accountId}</Title>
@@ -47,8 +48,38 @@ const PageList: React.FC = () => {
             onClose={() => {
                 setAddVisible(false)
             }}
-            onChange={(e) => {
-                setAccountCreateLogs(e);
+            onChange={({ data, landingPageType }) => {
+                if (landingPageType === 1) {
+                    if (adDataGroup && Object.keys(adDataGroup).length) {
+                        if (data.some(item => {
+                            let total = adDataGroup[item.accountId].length
+                            let pageLength = item.pageList.length
+                            if (total > pageLength) {
+                                message.error(`当前${item.accountId}下的广告总数(${total})大于落地页总数(${pageLength}),平均分配需要落地页总数大于广告总数`)
+                                return true
+                            }
+                            return false
+                        })) {
+                            return
+                        }
+                    } else {
+                        let targetingLength = targeting.length
+                        if (data.some(item => {
+                            let productListLength = item?.productList?.length || 1
+                            let total = targetingLength * productListLength
+                            let pageLength = item.pageList.length
+                            if (total > pageLength) {
+                                message.error(`当前${item.accountId}下的广告总数(${total})大于落地页总数(${pageLength}),平均分配需要落地页总数大于广告总数`)
+                                return true
+                            }
+                            return false
+                        })) {
+                            return
+                        }
+                    }
+                }
+                setAccountCreateLogs(data);
+                setAddelivery({ ...addelivery, dynamic: { ...dynamic, landingPageType } })
                 setAddVisible(false);
                 clearData()
             }}

+ 177 - 99
src/pages/launchSystemV3/tencentAdPutIn/create/addDynamic.tsx

@@ -33,10 +33,26 @@ const AddDynamic: React.FC<PULLIN.NewAddDynamic> = ({ visible, onChange, onClose
     const [activeKey, setActiveKey] = useState<string>()
     const [dynamicCount, setDynamicCount] = useState<number>(0)
     const [adData, setAdData] = useState<any[]>(selectData)
+    const [adDataGroup, setAdDataGroup] = useState<{ [x: number]: any[] }>({})
 
     const createDynamicTask = useAjax((params) => createDynamicTaskApi(params))
     /****************************************/
 
+    useEffect(() => {
+        if (adData && adData.length) {
+            let adDataGroup: { [x: number]: any[] } = {}
+            adData.forEach(item => {
+                let accountId = item.accountId
+                if (adDataGroup?.[accountId]?.length) {
+                    adDataGroup[accountId].push(item)
+                } else {
+                    adDataGroup[accountId] = [item]
+                }
+            })
+            setAdDataGroup(adDataGroup)
+        }
+    }, [adData])
+
     useEffect(() => {
         if (tactics) {
             const {
@@ -149,112 +165,169 @@ const AddDynamic: React.FC<PULLIN.NewAddDynamic> = ({ visible, onChange, onClose
                 }
             }
         }
+        // 落地页平均分配判断数量
+        if ([910].includes(dynamic.creativeTemplateId) && dynamic?.landingPageType === 1) {
+            if (accountCreateLogs.some(item => {
+                let total = adDataGroup[item.accountId].length
+                let pageLength = item.pageList.length
+                if (total > pageLength) {
+                    message.error(`当前${item.accountId}下的广告总数(${total})大于落地页总数(${pageLength}),平均分配需要落地页总数大于广告总数`)
+                    return true
+                }
+                return false
+            })) {
+                return
+            }
+        }
 
-        let accountIndex1 = 0
-        adData.forEach((ad, index) => {
-            let item = accountCreateLogs.find(a => a.accountId === ad.accountId) as PULLIN.AccountCreateLogsProps
-            let averageAdDynamic = averageAdDynamicList?.[index]
-            let data = [{
-                id: ad.adgroupId + '_' + index,
-                pageListDto: item.pageList,                   // 落地页
-                adgroupsDto: ad,
-                dynamicDto: dynamic,                          // 创意信息
-                averageAdDynamic,
-                rowSpan: (mediaType === 1 && textType !== 4) ? averageAdDynamic.length : ([910].includes(dynamic.creativeTemplateId) ? item.pageList?.length : (textType === 3 ? textDtoLenth * dynamicGroupLength : dynamicGroupLength)) || 1
-            }]
+        if (textType === 1) {
+            if (dynamicGroupLength !== textDtoLenth) {
+                message.error(`当前创意文案是“创意组一一对应”模式,创意组总数(${dynamicGroupLength})要等于创意文案总数(${textDtoLenth})`)
+                return
+            }
+            if (!dynamicCreativesTextDTOS.dynamicCreativesTextDetailDTOList.every((item: {}) => item && Object.keys(item).length)) {
+                message.error('创意文案配置错误,内容空')
+                return
+            }
+        }
 
-            let newData: any[] = []
-            if ([910].includes(dynamic.creativeTemplateId)) {
-                newData = cartesianProduct(data, item.pageList).map((item, index) => {
-                    let [d1, pageList, num] = item
-                    return {
-                        ...d1,
-                        id: d1.id + '_' + index,
-                        pageListDto: [pageList],
-                        dynamicDto: {
-                            ...d1.dynamicDto,
-                            dynamicCreativeName: d1.dynamicDto.dynamicCreativeName + num
+        let accountIndex1 = 0
+        if (dynamic?.landingPageType === 1 && [910].includes(dynamic.creativeTemplateId)) {
+            accountCreateLogs.forEach(item => {
+                let adData = adDataGroup[item.accountId]
+                let averageAdPageList: any[] = distributeArray(item.pageList, adData.length)
+                let newData: any[] = []
+                adData.forEach((ad, index) => {
+                    let data = [{
+                        id: ad.adgroupId + '_' + index,
+                        adgroupsDto: ad,
+                        dynamicDto: dynamic,                          // 创意信息
+                    }]
+                    newData = cartesianProduct(data, averageAdPageList[index]).map((item, index) => {
+                        let [d1, pageList, num] = item
+                        return {
+                            ...d1,
+                            id: d1.id + '_' + index,
+                            pageListDto: [pageList],
+                            dynamicDto: {
+                                ...d1.dynamicDto,
+                                dynamicCreativeName: d1.dynamicDto.dynamicCreativeName + num
+                            },
+                            rowSpan: index === 0 ? averageAdPageList[index].length : 0,
+                            isRowSpan: true
                         }
-                    }
+                    })
+                    newTableData[ad.adgroupId] = newData
                 })
-            } else {
-                if (mediaType === 1) {
-                    data.forEach(item => {
-                        const { averageAdDynamic, ...ad } = item
-                        if (textType === 3) {
-                            let rowSpan = textDtoLenth * averageAdDynamic.length
-                            cartesianProduct(textDto, averageAdDynamic).forEach((taad: any, index) => {
-                                let [textValue, aad] = taad
-                                newData.push({
-                                    ...ad,
-                                    id: ad.id + '_' + index,
-                                    dynamicGroup: aad,
-                                    textDto: textValue,
-                                    rowSpan
+                newDynamicCount += item.pageList.length
+            })
+        } else {
+            adData.forEach((ad, index) => {
+                let item = accountCreateLogs.find(a => a.accountId === ad.accountId) as PULLIN.AccountCreateLogsProps
+                let averageAdDynamic = averageAdDynamicList?.[index]
+                let data = [{
+                    id: ad.adgroupId + '_' + index,
+                    pageListDto: item.pageList,                   // 落地页
+                    adgroupsDto: ad,
+                    dynamicDto: dynamic,                          // 创意信息
+                    averageAdDynamic,
+                    rowSpan: (mediaType === 1 && textType !== 4) ? averageAdDynamic.length : ([910].includes(dynamic.creativeTemplateId) ? item.pageList?.length : (textType === 3 ? textDtoLenth * dynamicGroupLength : dynamicGroupLength)) || 1
+                }]
+
+                let newData: any[] = []
+                if ([910].includes(dynamic.creativeTemplateId)) {
+                    newData = cartesianProduct(data, item.pageList).map((item, index) => {
+                        let [d1, pageList, num] = item
+                        return {
+                            ...d1,
+                            id: d1.id + '_' + index,
+                            pageListDto: [pageList],
+                            dynamicDto: {
+                                ...d1.dynamicDto,
+                                dynamicCreativeName: d1.dynamicDto.dynamicCreativeName + num
+                            }
+                        }
+                    })
+                } else {
+                    if (mediaType === 1) {
+                        data.forEach(item => {
+                            const { averageAdDynamic, ...ad } = item
+                            if (textType === 3) {
+                                let rowSpan = textDtoLenth * averageAdDynamic.length
+                                cartesianProduct(textDto, averageAdDynamic).forEach((taad: any, index) => {
+                                    let [textValue, aad] = taad
+                                    newData.push({
+                                        ...ad,
+                                        id: ad.id + '_' + index,
+                                        dynamicGroup: aad,
+                                        textDto: textValue,
+                                        rowSpan
+                                    })
                                 })
-                            })
-                        } else if (textType === 4) {
-                            averageAdDynamic.forEach((aad: any, index: number) => {
-                                newData.push({
-                                    ...ad,
-                                    id: ad.id + '_' + index,
-                                    dynamicGroup: aad,
-                                    textDto: aad?.textDto,
-                                    rowSpan: index === 0 ? averageAdDynamic.length : 0,
-                                    isRowSpan: true
+                            } else if (textType === 4) {
+                                averageAdDynamic.forEach((aad: any, index: number) => {
+                                    newData.push({
+                                        ...ad,
+                                        id: ad.id + '_' + index,
+                                        dynamicGroup: aad,
+                                        textDto: aad?.textDto,
+                                        rowSpan: index === 0 ? averageAdDynamic.length : 0,
+                                        isRowSpan: true
+                                    })
                                 })
-                            })
-                        } else {
-                            averageAdDynamic.forEach((aad: any, index: number) => {
-                                newData.push({
-                                    ...ad,
-                                    id: ad.id + '_' + index,
-                                    dynamicGroup: aad,
-                                    textDto: aad?.textDto
+                            } else {
+                                averageAdDynamic.forEach((aad: any, index: number) => {
+                                    newData.push({
+                                        ...ad,
+                                        id: ad.id + '_' + index,
+                                        dynamicGroup: aad,
+                                        textDto: aad?.textDto
+                                    })
                                 })
-                            })
-                        }
-                    })
-                } else if (mediaType === 2) {
-                    data.forEach((item) => {
-                        const { averageAdDynamic, ...ad } = item
-                        if (textType === 3) {
-                            cartesianProduct(textDto, [newDynamicGroup[accountIndex1 % newDynamicGroup.length]]).forEach((taad: any) => {
-                                let [textValue, aad, index] = taad
+                            }
+                        })
+                    } else if (mediaType === 2) {
+                        data.forEach((item) => {
+                            const { averageAdDynamic, ...ad } = item
+                            if (textType === 3) {
+                                cartesianProduct(textDto, [newDynamicGroup[accountIndex1 % newDynamicGroup.length]]).forEach((taad: any) => {
+                                    let [textValue, aad, index] = taad
+                                    newData.push({
+                                        ...ad,
+                                        id: ad.id + '_' + index,
+                                        dynamicGroup: aad,
+                                        textDto: textValue,
+                                        rowSpan: textDto.length
+                                    })
+                                })
+                            } else {
+                                let { textDto, ...dynamicGroup } = newDynamicGroup[accountIndex1 % newDynamicGroup.length]
                                 newData.push({
                                     ...ad,
-                                    id: ad.id + '_' + index,
-                                    dynamicGroup: aad,
-                                    textDto: textValue,
-                                    rowSpan: textDto.length
+                                    dynamicGroup,
+                                    textDto,
+                                    rowSpan: 1
                                 })
-                            })
-                        } else {
-                            let { textDto, ...dynamicGroup } = newDynamicGroup[accountIndex1 % newDynamicGroup.length]
-                            newData.push({
-                                ...ad,
-                                dynamicGroup,
-                                textDto,
-                                rowSpan: 1
-                            })
-                        }
-                        accountIndex1 += 1
-                    })
-                } else {
-                    newData = cartesianProduct(data, newDynamicGroup.length > 0 ? newDynamicGroup : [{}]).map((item, index) => {
-                        let [d1, group] = item
-                        return {
-                            ...d1,
-                            id: d1.id + '_' + index,
-                            dynamicGroup: group,
-                            textDto: (group as any)?.textDto
-                        }
-                    })
+                            }
+                            accountIndex1 += 1
+                        })
+                    } else {
+                        newData = cartesianProduct(data, newDynamicGroup.length > 0 ? newDynamicGroup : [{}]).map((item, index) => {
+                            let [d1, group] = item
+                            return {
+                                ...d1,
+                                id: d1.id + '_' + index,
+                                dynamicGroup: group,
+                                textDto: (group as any)?.textDto
+                            }
+                        })
+                    }
                 }
-            }
-            newDynamicCount += newData.length
-            newTableData[ad.adgroupId] = newData
-        })
+                newDynamicCount += newData.length
+                newTableData[ad.adgroupId] = newData
+            })
+        }
+
         setDynamicCount(newDynamicCount)
         setActiveKey(adData?.[0].adgroupId?.toString())
         console.log('newTableData-->', newTableData)
@@ -451,9 +524,14 @@ const AddDynamic: React.FC<PULLIN.NewAddDynamic> = ({ visible, onChange, onClose
                                         <div className={style.detail}>
                                             <div className={style.detail_body}>
                                                 <Title level={5} style={{ fontSize: 12 }}>已选广告</Title>
-                                                {adData?.map(item => {
-                                                    return <div key={item.adgroupId}>
-                                                        <div className={style.text}><Text ellipsis={{ tooltip: true }}>{item.adgroupName}</Text></div>
+                                                {Object.keys(adDataGroup).map(key => {
+                                                    return <div key={key}>
+                                                        <Title level={5} style={{ fontSize: 12 }}>{key}</Title>
+                                                        {adDataGroup[key]?.map((item: any) => {
+                                                            return <div key={item.adgroupId}>
+                                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{item.adgroupName}</Text></div>
+                                                            </div>
+                                                        })}
                                                     </div>
                                                 })}
                                             </div>
@@ -468,7 +546,7 @@ const AddDynamic: React.FC<PULLIN.NewAddDynamic> = ({ visible, onChange, onClose
                                     {/* 创意文案 */}
                                     <MaterialText />
                                     {/* 落地页 */}
-                                    <PageList />
+                                    <PageList adDataGroup={adDataGroup} />
                                 </div>
                             </DispatchAddelivery.Provider>
                         </div>

+ 59 - 12
src/pages/launchSystemV3/tencentAdPutIn/create/index.tsx

@@ -326,6 +326,32 @@ const Create: React.FC = () => {
                 }
             }
         }
+        if (textType === 1) {
+            if (dynamicGroupLength !== textDtoLenth) {
+                message.error(`当前创意文案是“创意组一一对应”模式,创意组总数(${dynamicGroupLength})要等于创意文案总数(${textDtoLenth})`)
+                return
+            }
+            if (!dynamicCreativesTextDTOS.dynamicCreativesTextDetailDTOList.every((item: {}) => item && Object.keys(item).length)) {
+                message.error('创意文案配置错误,内容空')
+                return
+            }
+        }
+        // 落地页平均分配判断数量
+        if ([910].includes(dynamic.creativeTemplateId) && dynamic?.landingPageType === 1) {
+            let targetingLength = targeting.length
+            if (accountCreateLogs.some(item => {
+                let productListLength = item?.productList?.length || 1
+                let total = targetingLength * productListLength
+                let pageLength = item.pageList.length
+                if (total > pageLength) {
+                    message.error(`当前${item.accountId}下的广告总数(${total})大于落地页总数(${pageLength}),平均分配需要落地页总数大于广告总数`)
+                    return true
+                }
+                return false
+            })) {
+                return
+            }
+        }
         let accountIndex = 0, accountIndex1 = 0
         accountCreateLogs.forEach(item => {
             let productList: any[] = []
@@ -334,7 +360,6 @@ const Create: React.FC = () => {
             } else if (['MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT'].includes(marketingAssetOuterSpec?.marketingTargetType)) { // 公众号
                 productList = item?.wechatChannelList || []
             }
-
             let data = cartesianProduct(productList, targeting).map(newD => {
                 let [productDto, targetDto, index] = newD
                 let suffix = '_' + item.accountId + '_' + index
@@ -367,18 +392,40 @@ const Create: React.FC = () => {
             newAdCount += data.length
             let newData: any[] = []
             if ([910].includes(dynamic.creativeTemplateId)) {
-                newData = cartesianProduct(data, item.pageList).map((item, index) => {
-                    let [d1, pageList, num] = item
-                    return {
-                        ...d1,
-                        id: d1.id + '_' + index,
-                        pageListDto: [pageList],
-                        dynamicDto: {
-                            ...d1.dynamicDto,
-                            dynamicCreativeName: d1.dynamicDto.dynamicCreativeName + num
+                if (dynamic?.landingPageType === 1) {
+                    let averageAdPageList: any[] = distributeArray(item.pageList, productList.length * targeting.length)
+                    data.forEach((item, aIndex) => {
+                        let aPageList: any[] = averageAdPageList[aIndex]
+                        aPageList.forEach((page, index) => {
+                            newData.push({
+                                ...item,
+                                id: item.id + '_' + index,
+                                pageListDto: [page],
+                                dynamicDto: {
+                                    ...item.dynamicDto,
+                                    dynamicCreativeName: item.dynamicDto.dynamicCreativeName + index
+                                },
+                                rowSpan: index === 0 ? aPageList.length : 0,
+                                adLength: data.length,
+                                isRowSpan: true
+                            })
+                        })
+                        
+                    })
+                } else {
+                    newData = cartesianProduct(data, item.pageList).map((item, index) => {
+                        let [d1, pageList, num] = item
+                        return {
+                            ...d1,
+                            id: d1.id + '_' + index,
+                            pageListDto: [pageList],
+                            dynamicDto: {
+                                ...d1.dynamicDto,
+                                dynamicCreativeName: d1.dynamicDto.dynamicCreativeName + num
+                            }
                         }
-                    }
-                })
+                    })
+                }
             } else {
                 if (mediaType === 1) {
                     data.forEach(item => {

+ 2 - 2
src/pages/launchSystemV3/tencentAdPutIn/taskList/dynamicLog.tsx

@@ -41,7 +41,7 @@ const DynamicLog: React.FC<Props> = ({ record, isHandle }) => {
         loading={getDynamicList?.loading}
         scroll={{ y: 300 }}
         bordered
-        rowKey={'dynamicCreativeId'}
+        rowKey={'id'}
         pagination={{
             pageSize: queryForm.pageSize,
             current: queryForm.pageNum,
@@ -70,7 +70,7 @@ const DynamicLog: React.FC<Props> = ({ record, isHandle }) => {
             loading={getDynamicList?.loading}
             scroll={{ y: 300 }}
             bordered
-            rowKey={'dynamicCreativeId'}
+            rowKey={'id'}
             pagination={{
                 pageSize: queryForm.pageSize,
                 current: queryForm.pageNum,

+ 29 - 10
src/utils/utils.ts

@@ -70,12 +70,31 @@ export const getChannelName = (name: string) => {
   return newName
 }
 
+function extractAndFilterBracketsContent(input: string): { extracted: string[], filteredString: string } {
+  const regex = /\[([^\]]+)\]/g;
+  const matches: string[] = [];
+  let match;
+
+  // 提取方括号内的内容
+  while ((match = regex.exec(input)) !== null) {
+    matches.push(match[1]);
+  }
+
+  // 过滤掉原字符串中方括号及其包裹的内容
+  const filteredString = input.replace(/\[([^\]]+)\]/g, '');
+
+  return { extracted: matches, filteredString: filteredString };
+}
+
 // 输入文案时判断
-export const txtLength = (value?: string) => {
-  if (value) {
+export const txtLength = (t?: string) => {
+  if (t) {
+    const result = extractAndFilterBracketsContent(t);
+    let extracted = result.extracted;
+    let value = result.filteredString;
     let length = value?.length
     let text = value?.replace(/[\x00-\xff]/g, '')
-    return text?.length + Number(((length - text?.length) / 2).toFixed())
+    return extracted.length + text?.length + Number(((length - text?.length) / 2).toFixed())
   } else {
     return 0
   }
@@ -402,7 +421,7 @@ export const distributeArray = (originalArray: any[], numGroups: number): any[][
  */
 export function getRandomElements<T>(arr: T[], n: number): T[] {
   if (n > arr.length) {
-      throw new RangeError("getRandomElements: more elements taken than available");
+    throw new RangeError("getRandomElements: more elements taken than available");
   }
 
   const result: T[] = new Array(n);
@@ -410,9 +429,9 @@ export function getRandomElements<T>(arr: T[], n: number): T[] {
   const taken: number[] = new Array(len);
 
   while (n--) {
-      const x: number = Math.floor(Math.random() * len);
-      result[n] = arr[x in taken ? taken[x] : x];
-      taken[x] = --len in taken ? taken[len] : len;
+    const x: number = Math.floor(Math.random() * len);
+    result[n] = arr[x in taken ? taken[x] : x];
+    taken[x] = --len in taken ? taken[len] : len;
   }
 
   return result;
@@ -427,8 +446,8 @@ export function getRandomElements<T>(arr: T[], n: number): T[] {
 export function shuffleArray<T>(array: T[]): T[] {
   const shuffled = array.slice();
   for (let i = shuffled.length - 1; i > 0; i--) {
-      const j = Math.floor(Math.random() * (i + 1));
-      [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
+    const j = Math.floor(Math.random() * (i + 1));
+    [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
   }
   return shuffled;
 }
@@ -436,7 +455,7 @@ export function shuffleArray<T>(array: T[]): T[] {
 function chunkArray<T>(array: T[], numChunks: number): T[][] {
   const chunks: T[][] = Array.from({ length: numChunks }, () => []);
   array.forEach((item, index) => {
-      chunks[index % numChunks].push(item);
+    chunks[index % numChunks].push(item);
   });
   return chunks;
 }