wjx 9 mēneši atpakaļ
vecāks
revīzija
a6426a95e1

+ 3 - 50
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/index.tsx

@@ -7,72 +7,25 @@ import NewDynamic from "./newDynamic"
 import { AD_STATUS_ENUM, CONVERSION_DATA_ENUM, CONVERSION_TARGET_ENUM, DELIVERY_MODE_ENUM, PAGE_TYPE_ENUM, TEXT_LINK_TYPE_ENUM, pageSpecFieldConVertUn } from "../../const"
 import { getCreativeDetailsApi, getProfilesApi } from "@/services/adqV3/global"
 import { useAjax } from "@/Hook/useAjax"
-import { arraysHaveSameValues, processData } from "@/utils/utils"
+import { arraysHaveSameValues } from "@/utils/utils"
 
 /**
  * 创意
  * @returns 
  */
-const Dynamic: React.FC = () => {
+const Dynamic: React.FC<{ creativeTemplateAppellation?: string, creativeTemplateStyle?: string }> = ({ creativeTemplateAppellation, creativeTemplateStyle }) => {
 
     /***************************************/
-    const { addelivery, setAddelivery, setMaterialData, setTextData, clearData, setAccountCreateLogs, accountCreateLogs } = useContext(DispatchAddelivery)!;
+    const { addelivery, setAddelivery, clearData, setAccountCreateLogs, accountCreateLogs } = useContext(DispatchAddelivery)!;
     const { adgroups, dynamic: dynamicData } = addelivery;
-    const { marketingGoal, marketingAssetOuterSpec, marketingCarrierType, siteSet, automaticSiteEnabled, sceneSpec } = adgroups
     const { deliveryMode, creativeTemplateId, dynamicCreativeName, creativeComponents, configuredStatus } = dynamicData
     const { textLink, actionButton, showData, brand, mainJumpInfo } = creativeComponents || {}
     const [newVisible, setNewVisible] = useState<boolean>(false);
-    const [creativeTemplateAppellation, setCreativeTemplateAppellation] = useState<string>()
-    const [creativeTemplateStyle, setCreativeTemplateStyle] = useState<string>()
     const [profileData, setprofileData] = useState<any>()
 
-    const getCreativeDetails = useAjax((params) => getCreativeDetailsApi(params))
     const getProfiles = useAjax((params) => getProfilesApi(params))
     /***************************************/
 
-    useEffect(() => {
-        if (creativeTemplateId) {
-            let params: any = {
-                marketingGoal,
-                marketingTargetType: marketingAssetOuterSpec.marketingTargetType,
-                marketingCarrierType,
-                deliveryMode,
-                creativeTemplateId,
-                wechatSceneSpecPosition: sceneSpec?.wechatPosition,
-                dynamicCreativeType: deliveryMode === 'DELIVERY_MODE_COMPONENT' ? 'DYNAMIC_CREATIVE_TYPE_PROGRAM' : 'DYNAMIC_CREATIVE_TYPE_COMMON'
-            }
-            if (automaticSiteEnabled) {
-                params.automaticSiteEnabled = automaticSiteEnabled
-            } else {
-                params.siteSet = siteSet
-            }
-            getCreativeDetails.run(params).then(res => {
-                if (res?.adcreativeTemplateStructAdpermits?.length > 0) {
-                    let adcreativeTemplateStructAdpermits = res?.adcreativeTemplateStructAdpermits[0]
-                    setCreativeTemplateAppellation(adcreativeTemplateStructAdpermits.creativeTemplateAppellation)
-                    setCreativeTemplateStyle(adcreativeTemplateStructAdpermits.creativeTemplateStyle)
-
-                    let creativeComponents = adcreativeTemplateStructAdpermits?.creativeComponents || []
-                    let result = processData(creativeComponents);
-
-                    let newMaterialData: any = {};
-                    let newTextData: any = {};
-
-                    Object.keys(result).forEach(key => {
-                        let data = result[key]
-                        if ((key === 'image_list' || key === 'short_video' || key === 'video' || key === 'image' || key === 'element_story') && data.required) {
-                            newMaterialData[key] = data
-                        } else if (key === 'title' || (data.required && key === 'description')) {
-                            newTextData[key] = data
-                        }
-                    })
-
-                    setMaterialData(newMaterialData)
-                    setTextData(newTextData)
-                }
-            })
-        }
-    }, [creativeTemplateId, deliveryMode, marketingGoal, marketingAssetOuterSpec, marketingCarrierType, siteSet, sceneSpec?.wechatPosition, automaticSiteEnabled])
 
     useEffect(() => {
         if (['PAGE_TYPE_H5_PROFILE'].includes(brand?.[0]?.value?.jumpInfo?.pageType)) {

+ 2 - 2
src/pages/launchSystemV3/tencentAdPutIn/create/MaterialText/index.tsx

@@ -46,10 +46,10 @@ const MaterialText: React.FC = () => {
                         return <div key={index}>
                             {keys.includes('description') ? <>
                                 <Title level={5} style={{ fontSize: 12 }}>{descName}</Title>
-                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{item['description']?.[0]}</Text></div>
+                                {item['description'].map((t, index) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                             </> : keys.includes('title') ? <>
                                 <Title level={5} style={{ fontSize: 12 }}>{titleName}</Title>
-                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{item['title']?.[0]}</Text></div>
+                                {item['title'].map((t, index) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                             </> : null}
                         </div>
                     }

+ 85 - 47
src/pages/launchSystemV3/tencentAdPutIn/create/MaterialText/newText.tsx

@@ -3,7 +3,7 @@ import { txtLength } from "@/utils/utils"
 import { Button, Card, Form, Modal, Popconfirm, Radio, Space, message } from "antd"
 import React, { useEffect, useState } from "react"
 import { TextTypeList } from "../../const"
-import { DeleteOutlined, PlusOutlined } from "@ant-design/icons"
+import { DeleteOutlined, MinusCircleOutlined, PlusOutlined } from "@ant-design/icons"
 import AddTextS from "./addTextS"
 import style from '../index.less'
 import styles from '../Material/index.less'
@@ -35,46 +35,42 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
     const [textList, setTextList] = useState<PULLIN.TextDtoProps[]>([])
     const [desVisible, setDesVisible] = useState<boolean>(false)
     const [addSTitle, setAddStitle] = useState<string>()
+    const [newText, setNewText] = useState<{ description?: string[], title?: string[] }>({})
     /*************************************/
 
     const handleOk = (values: any) => {
+        console.log(values)
         const { type, textDto } = values
         onChange?.({
             type,
-            dynamicCreativesTextDetailDTOList: textDto.map((item: any) => {
-                let data: any = {}
-                Object.keys(item).forEach(key => {
-                    data[key] = [item[key]]
-                })
-                return data
-            })
+            dynamicCreativesTextDetailDTOList: textDto
         })
     }
 
     useEffect(() => {
         if (value && Object.keys(value).length) {
             const { type, dynamicCreativesTextDetailDTOList } = value
-            form.setFieldsValue({
-                type, textDto: dynamicCreativesTextDetailDTOList.map((item: any) => {
-                    let data: any = {}
-                    Object.keys(item).forEach(key => {
-                        data[key] = item[key]?.[0]
-                    })
-                    return data
-                })
-            })
+            form.setFieldsValue({ type, textDto: dynamicCreativesTextDetailDTOList })
         }
     }, [value])
 
     useEffect(() => {
         if (textData && Object.keys(textData)) {
+            let newText: { description?: string[], title?: string[] } = {}
             let data = Object.values(textData).map((item: any) => {
                 let content = item.children.content
-                return { label: content.description, restriction: content.restriction, value: item.name, required: item.required }
+                if (item.name === 'description') {
+                    newText.description = ['']
+                } else if (item.name === 'title') {
+                    newText.title = ['']
+                }
+                return { label: content.description, restriction: content.restriction, value: item.name, required: item.required, arrayProperty: item?.arrayProperty }
             })
+            setNewText(newText)
+            if (!(value && Object.keys(value).length)) { form.setFieldsValue({ textDto: [newText] }) }
             setTextList(data)
         }
-    }, [textData])
+    }, [textData, value])
 
     // 一一对应显示素材
     const showMaterial = (index: number) => {
@@ -161,7 +157,7 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
             }}
             initialValues={{
                 type: 0,
-                textDto: [{}]
+                textDto: [{ description: [''], title: [''] }]
             }}
             onFinish={handleOk}
         >
@@ -176,7 +172,7 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
                             oldtextDto = [textDto[0] || {}]
                         } else if (value === 1) {
                             if (count > length) {
-                                oldtextDto = oldtextDto.concat(Array(count - length).fill({}))
+                                oldtextDto = oldtextDto.concat(Array(count - length).fill(newText || { description: [''] }))
                             } else {
                                 oldtextDto = oldtextDto.slice(0, count)
                             }
@@ -212,33 +208,49 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
                         >
                             <div style={{ display: 'flex', flexWrap: 'wrap', gap: 10, width: '100%', flexDirection: 'column' }}>
                                 {textList.map(item => {
-                                    return <Form.Item
+                                    return <Form.List
                                         {...restField}
-                                        label={<strong>{item.label}</strong>}
                                         name={[name, item.value]}
                                         key={key}
-                                        style={{ marginBottom: 0, width: '100%' }}
-                                        rules={[{
-                                            required: item.required, message: '请输入正确的' + item.label, validator: (rule, value) => {
-                                                if (!value) {
-                                                    return Promise.reject()
-                                                } else if (!value.match(RegExp(item.restriction.textRestriction.textPattern))) {
-                                                    return Promise.reject()
-                                                } else if (txtLength(value) > item.restriction.textRestriction.maxLength) {
-                                                    return Promise.reject()
-                                                }
-                                                return Promise.resolve()
-                                            }
-                                        }]}
                                     >
-                                        <TextAideInput placeholder={'请输入' + item.label} style={{ width: 580 }} maxTextLength={item.restriction.textRestriction.maxLength} />
-                                    </Form.Item>
+                                        {(fields, { add, remove }) => <>
+                                            {fields.map((field, tIndex) => (
+                                                <Form.Item
+                                                    {...field}
+                                                    label={<Space>
+                                                        <strong>{item.label}</strong>
+                                                        {textDto?.[num]?.[item.value]?.length > 1 && <a style={{ color: 'red', fontSize: 12 }} onClick={() => remove(field.name)}><MinusCircleOutlined /></a>}
+                                                    </Space>}
+                                                    style={{ marginBottom: 0, width: '100%' }}
+                                                    rules={[{
+                                                        required: item.required, message: '请输入正确的' + item.label, validator: (rule, value) => {
+                                                            if (!value) {
+                                                                return Promise.reject()
+                                                            } else if (!value.match(RegExp(item.restriction.textRestriction.textPattern))) {
+                                                                return Promise.reject()
+                                                            } else if (txtLength(value) > item.restriction.textRestriction.maxLength) {
+                                                                return Promise.reject()
+                                                            }
+                                                            return Promise.resolve()
+                                                        }
+                                                    }]}
+                                                >
+                                                    <TextAideInput placeholder={'请输入' + item.label} style={{ width: 580 }} maxTextLength={item.restriction.textRestriction.maxLength} />
+                                                </Form.Item>
+                                            ))}
+                                            {deliveryMode === 'DELIVERY_MODE_COMPONENT' && item.arrayProperty?.maxNumber > 1 && textDto?.[num]?.[item.value]?.length < item.arrayProperty?.maxNumber && <Form.Item style={{ marginTop: 6, marginBottom: 0 }}>
+                                                <Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />} >
+                                                    新增{item.label}
+                                                </Button>
+                                            </Form.Item>}
+                                        </>}
+                                    </Form.List>
                                 })}
                             </div>
                         </Card>
                     ))}
                     {[3, 2, 4].includes(type) && !(type === 2 && textDto.length >= dynamicMaterialDTos.dynamicGroup.length) && <Form.Item style={{ marginTop: 10, marginBottom: 0 }}>
-                        <Button type="dashed" onClick={() => add({})} block icon={<PlusOutlined />} disabled={type === 3 && textDto.length >= 30}>
+                        <Button type="primary" onClick={() => add(newText)} block icon={<PlusOutlined />} disabled={type === 3 && textDto.length >= 30}>
                             新增
                         </Button>
                     </Form.Item>}
@@ -273,8 +285,17 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
                     if (type === 1) {
                         let len = 0
                         const newTextDto = textDto.map((item: { [x: string]: any }) => {
-                            if (fieldData?.value && !item?.[fieldData?.value] && valList.length >= len + 1) {
-                                return { ...item, [fieldData.value]: valList[len++] }
+                            if (fieldData?.value && (item?.[fieldData?.value]?.length === 0 || !item?.[fieldData?.value]?.every((t: string) => t)) && valList.length >= len + 1) {
+                                return {
+                                    ...item,
+                                    [fieldData.value]: (item?.[fieldData?.value]?.length === 0 ? [''] : item?.[fieldData?.value]).map((t: string) => {
+                                        if (t) {
+                                            return t
+                                        } else {
+                                            return valList[len++]
+                                        }
+                                    })
+                                }
                             }
                             return item
                         })
@@ -284,8 +305,17 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
                     } else if (type === 2) {
                         let len = 0
                         const newTextDto = textDto.map((item: { [x: string]: any }) => {
-                            if (fieldData?.value && !item?.[fieldData?.value] && valList.length >= len + 1) {
-                                return { ...item, [fieldData.value]: valList[len++] }
+                            if (fieldData?.value && (item?.[fieldData?.value]?.length === 0 || !item?.[fieldData?.value]?.every((t: string) => t)) && valList.length >= len + 1) {
+                                return {
+                                    ...item,
+                                    [fieldData.value]: (item?.[fieldData?.value]?.length === 0 ? [''] : item?.[fieldData?.value]).map((t: string) => {
+                                        if (t) {
+                                            return t
+                                        } else {
+                                            return valList[len++]
+                                        }
+                                    })
+                                }
                             }
                             return item
                         })
@@ -301,7 +331,7 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
                             }
                             diffTextDto = Array(diff).fill('').map((item: { [x: string]: any }) => {
                                 if (fieldData?.value) {
-                                    return { ...item, [fieldData.value]: valList[len++] }
+                                    return { ...item, [fieldData.value]: [valList[len++]] }
                                 }
                                 return item
                             })
@@ -312,8 +342,16 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
                     } else if ([3, 4].includes(type)) {
                         let len = 0
                         const newTextDto = textDto.map((item: { [x: string]: any }) => {
-                            if (fieldData?.value && !item?.[fieldData?.value] && valList.length >= len + 1) {
-                                return { ...item, [fieldData.value]: valList[len++] }
+                            if (fieldData?.value && (item?.[fieldData?.value]?.length === 0 || !item?.[fieldData?.value]?.every((t: string) => t)) && valList.length >= len + 1) {
+                                return {
+                                    ...item, [fieldData.value]: (item?.[fieldData?.value]?.length === 0 ? [''] : item?.[fieldData?.value]).map((t: string) => {
+                                        if (t) {
+                                            return t
+                                        } else {
+                                            return valList[len++]
+                                        }
+                                    })
+                                }
                             }
                             return item
                         })
@@ -322,7 +360,7 @@ const NewText: React.FC<Props> = ({ visible, onClose, onChange, value, textData,
                             let diff = valList.length - len
                             diffTextDto = Array(diff).fill('').map((item: { [x: string]: any }) => {
                                 if (fieldData?.value) {
-                                    return { ...item, [fieldData.value]: valList[len++] }
+                                    return { ...item, [fieldData.value]: [valList[len++]] }
                                 }
                                 return item
                             })

+ 56 - 4
src/pages/launchSystemV3/tencentAdPutIn/create/index.tsx

@@ -16,12 +16,13 @@ import Dynamic from "./Dynamic"
 import Material from "./Material"
 import MaterialText from "./MaterialText"
 import PageList from "./PageList"
-import { cartesianProduct, distributeArray, randomString, splitArrayIntoRandomChunks } from "@/utils/utils"
+import { cartesianProduct, distributeArray, processData, randomString, splitArrayIntoRandomChunks } from "@/utils/utils"
 import columns from "./tableConfig"
 import SubmitModal from "./submitModal"
 import { createAdgroupTaskApi, getSelectTaskDetailApi } from "@/services/adqV3"
 import WechatAccount from "../../components/WechatAccount"
 import Title from "antd/lib/typography/Title"
+import { getCreativeDetailsApi } from "@/services/adqV3/global"
 
 export const DispatchAddelivery = React.createContext<PULLIN.DispatchAddelivery | null>(null);
 
@@ -35,7 +36,8 @@ const Create: React.FC = () => {
     const { getAllUserAccount } = useModel('useLaunchAdq.useAdAuthorize')
     const { initTargeting } = useModel('useLaunchV3.useTargeting')
     const [addelivery, setAddelivery] = useState<PULLIN.AddeliveryProps>({ adgroups: {}, targeting: [], dynamic: {}, dynamicMaterialDTos: {}, dynamicCreativesTextDTOS: {}, mediaType: 0 })
-    const { marketingAssetOuterSpec, marketingCarrierType } = addelivery.adgroups
+    const { marketingAssetOuterSpec, marketingCarrierType, marketingGoal, siteSet, automaticSiteEnabled, sceneSpec } = addelivery.adgroups
+    const { deliveryMode, creativeTemplateId } = addelivery.dynamic
     const [accSearch, setAccSearch] = useState<string>()
     const [accountCreateLogs, setAccountCreateLogs] = useState<PULLIN.AccountCreateLogsProps[]>([])  // 账户
     const [goodsVisible, setGoodsVisible] = useState<boolean>(false) // 选择小说弹窗控制
@@ -48,10 +50,13 @@ const Create: React.FC = () => {
     const [subVisible, setSubVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
     const [adCount, setAdCount] = useState<number>(0)
     const [dynamicCount, setDynamicCount] = useState<number>(0)
+    const [creativeTemplateAppellation, setCreativeTemplateAppellation] = useState<string>()
+    const [creativeTemplateStyle, setCreativeTemplateStyle] = useState<string>()
 
     const getGroupList = useAjax(() => getGroupListApi())
     const createAdgroupTask = useAjax((params) => createAdgroupTaskApi(params))
     const getSelectTaskDetail = useAjax((params) => getSelectTaskDetailApi(params))
+    const getCreativeDetails = useAjax((params) => getCreativeDetailsApi(params))
     /*******************************************/
 
     useEffect(() => {
@@ -62,6 +67,50 @@ const Create: React.FC = () => {
         initTargeting()
     }, [])
 
+    useEffect(() => {
+        if (creativeTemplateId) {
+            let params: any = {
+                marketingGoal,
+                marketingTargetType: marketingAssetOuterSpec.marketingTargetType,
+                marketingCarrierType,
+                deliveryMode,
+                creativeTemplateId,
+                wechatSceneSpecPosition: sceneSpec?.wechatPosition,
+                dynamicCreativeType: deliveryMode === 'DELIVERY_MODE_COMPONENT' ? 'DYNAMIC_CREATIVE_TYPE_PROGRAM' : 'DYNAMIC_CREATIVE_TYPE_COMMON'
+            }
+            if (automaticSiteEnabled) {
+                params.automaticSiteEnabled = automaticSiteEnabled
+            } else {
+                params.siteSet = siteSet
+            }
+            getCreativeDetails.run(params).then(res => {
+                if (res?.adcreativeTemplateStructAdpermits?.length > 0) {
+                    let adcreativeTemplateStructAdpermits = res?.adcreativeTemplateStructAdpermits[0]
+                    setCreativeTemplateAppellation(adcreativeTemplateStructAdpermits.creativeTemplateAppellation)
+                    setCreativeTemplateStyle(adcreativeTemplateStructAdpermits.creativeTemplateStyle)
+
+                    let creativeComponents = adcreativeTemplateStructAdpermits?.creativeComponents || []
+                    let result = processData(creativeComponents);
+
+                    let newMaterialData: any = {};
+                    let newTextData: any = {};
+
+                    Object.keys(result).forEach(key => {
+                        let data = result[key]
+                        if ((key === 'image_list' || key === 'short_video' || key === 'video' || key === 'image' || key === 'element_story') && data.required) {
+                            newMaterialData[key] = data
+                        } else if (key === 'title' || (data.required && key === 'description')) {
+                            newTextData[key] = data
+                        }
+                    })
+
+                    setMaterialData(newMaterialData)
+                    setTextData(newTextData)
+                }
+            })
+        }
+    }, [creativeTemplateId, deliveryMode, marketingGoal, marketingAssetOuterSpec, marketingCarrierType, siteSet, sceneSpec?.wechatPosition, automaticSiteEnabled])
+
     /** 获取分组里账号 */
     const getGroupAccountList = (ids: number[]) => {
         if (ids.length > 0) {
@@ -688,7 +737,7 @@ const Create: React.FC = () => {
     }
 
     return <Space direction="vertical" style={{ width: '100%' }}>
-        <Spin spinning={createAdgroupTask.loading || getSelectTaskDetail.loading}>
+        <Spin spinning={createAdgroupTask.loading || getSelectTaskDetail.loading || getCreativeDetails.loading}>
             <Card
                 size="small"
                 title={
@@ -810,7 +859,10 @@ const Create: React.FC = () => {
                                 {/* 定向 */}
                                 <Target />
                                 {/* 创意 */}
-                                <Dynamic />
+                                <Dynamic 
+                                    creativeTemplateAppellation={creativeTemplateAppellation}
+                                    creativeTemplateStyle={creativeTemplateStyle}
+                                />
                                 {/* 创意素材 */}
                                 <Material />
                             </div>

+ 8 - 8
src/pages/launchSystemV3/tencentAdPutIn/create/tableConfig.tsx

@@ -176,10 +176,10 @@ const columns = (): TableProps<any>['columns'] => {
                                         return <div key={index}>
                                             {key === 'description' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'文案'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['description']?.toString()}</Text></div>
+                                                {value['description'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : key === 'title' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'标题'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['title']?.toString()}</Text></div>
+                                                {value['title'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : null}
                                         </div>
                                     })}
@@ -190,10 +190,10 @@ const columns = (): TableProps<any>['columns'] => {
                                         return <div key={index}>
                                             {key === 'description' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'文案'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['description']?.toString()}</Text></div>
+                                                {value['description'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : key === 'title' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'标题'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['title']?.toString()}</Text></div>
+                                                {value['title'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : null}
                                         </div>
                                     })}
@@ -338,10 +338,10 @@ export const columnsAddDynamic = (): TableProps<any>['columns'] => {
                                         return <div key={index}>
                                             {key === 'description' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'文案'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['description']?.toString()}</Text></div>
+                                                {value['description'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : key === 'title' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'标题'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['title']?.toString()}</Text></div>
+                                                {value['title'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : null}
                                         </div>
                                     })}
@@ -352,10 +352,10 @@ export const columnsAddDynamic = (): TableProps<any>['columns'] => {
                                         return <div key={index}>
                                             {key === 'description' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'文案'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['description']?.toString()}</Text></div>
+                                                {value['description'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : key === 'title' ? <>
                                                 <Title level={5} style={{ fontSize: 12 }}>{'标题'}</Title>
-                                                <div className={style.text}><Text ellipsis={{ tooltip: true }}>{value['title']?.toString()}</Text></div>
+                                                {value['title'].map((t: string, index: number) => <div className={style.text} key={index}><Text ellipsis={{ tooltip: true }}>{t}</Text></div>)}
                                             </> : null}
                                         </div>
                                     })}

+ 16 - 12
src/pages/launchSystemV3/tencentAdPutIn/typings.d.ts

@@ -4,7 +4,7 @@ declare namespace PULLIN {
         bidMode: string;
         siteSet: string[];
         automaticSiteEnabled: boolean,
-        marketingTargetType?: string, 
+        marketingTargetType?: string,
         marketingCarrierType?: string,
     }
     interface AdReactContent {
@@ -58,19 +58,19 @@ declare namespace PULLIN {
         pageNum: number,
         pageSize: number,
         accountId?: number,
-        targetingName?: string,  
-        min?: string, 
+        targetingName?: string,
+        min?: string,
         max?: string,
     }
-    interface AccountCreateLogsProps { 
-        accountId: number, 
-        userActionSetsList?: any[], 
+    interface AccountCreateLogsProps {
+        accountId: number,
+        userActionSetsList?: any[],
         productList?: any[],
         wechatChannelList?: any[],
-        conversionList?: any, 
-        customAudienceList?: any, 
-        excludedCustomAudienceList?: any, 
-        pageList?: any, 
+        conversionList?: any,
+        customAudienceList?: any,
+        excludedCustomAudienceList?: any,
+        pageList?: any,
         coldStartAudienceList?: any[]
     }
     interface DynamicReactContent {
@@ -89,9 +89,9 @@ declare namespace PULLIN {
         creativeTemplateStyle: string,
         isGeneral: boolean,
         siteSet: number,
-        label: string | number, 
+        label: string | number,
         value: any,
-        tooltip?: string, 
+        tooltip?: string,
         img?: string
     }
     interface GetTaskV3Props {
@@ -122,6 +122,10 @@ declare namespace PULLIN {
                 textPattern: string
             }
         }
+        arrayProperty: {
+            maxNumber: number
+            minNumber: number
+        }
     }
     /**
      * 当前广告新增创意