wjx 7 달 전
부모
커밋
22b99ebef0

BIN
public/image/newGameTest.png


BIN
public/image/newGameTestSelected.png


BIN
public/image/newGameUser.png


BIN
public/image/newGameUserSelected.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 6 - 0
src/pages/launchSystemV3/tencentAdPutIn/const.ts


+ 2 - 2
src/pages/launchSystemV3/tencentAdPutIn/create/Ad/adgroupsAdSetting.tsx

@@ -6,7 +6,7 @@ import moment from "moment";
 import style from '../index.less'
 import TimeInSelect from "@/pages/launchSystemNew/components/timeInSelect";
 import { QuestionCircleFilled } from "@ant-design/icons";
-import { AD_STATUS_ENUM, MARKETING_TARGET_TYPE_ENUM, SelectTimeList, marketingGoalList } from "../../const";
+import { AD_STATUS_ENUM, MARKETING_TARGET_TYPE_ENUM, MARKETING_TARGET_TYPE_GAME_ENUM, SelectTimeList, marketingGoalList } from "../../const";
 import New1Radio from "@/pages/launchSystemV3/components/New1Radio";
 import { txtLength } from "@/utils/utils";
 import InputName from "@/components/InputName";
@@ -28,7 +28,7 @@ const AdgroupsAdSetting: React.FC<{ value?: any }> = ({ value }) => {
     useEffect(() => {
         if (!(value && Object.keys(value).length)) {
             form.setFieldsValue({
-                adgroupName: marketingGoalList.find(item => item.value === marketingGoal)?.label + '_' + MARKETING_TARGET_TYPE_ENUM[marketingTargetType as keyof typeof MARKETING_TARGET_TYPE_ENUM] + '_' + localStorage.getItem('userId')// + '_' + moment().format('MM_DD_HH:mm:ss')
+                adgroupName: marketingGoalList.find(item => item.value === marketingGoal)?.label + '_' + (MARKETING_TARGET_TYPE_ENUM[marketingTargetType as keyof typeof MARKETING_TARGET_TYPE_ENUM] || MARKETING_TARGET_TYPE_GAME_ENUM[marketingTargetType as keyof typeof MARKETING_TARGET_TYPE_GAME_ENUM]) + '_' + localStorage.getItem('userId')// + '_' + moment().format('MM_DD_HH:mm:ss')
             })
         }
     }, [marketingGoal, marketingTargetType])

+ 20 - 10
src/pages/launchSystemV3/tencentAdPutIn/create/Ad/adgroupsMarketingContent.tsx

@@ -3,7 +3,7 @@ import React, { useContext, useEffect, useState } from "react"
 import MarketingGoal from "./marketingGoal"
 import NewRadio from "@/pages/launchSystemV3/components/NewRadio"
 import { DispatchAd } from "./newCreateAd"
-import { GOAL_ROAS_ENUM, MARKETING_CARRIER_TYPE_ENUM, MARKETING_TARGET_TYPE_ENUM, OPTIMIZATIONGOAL_ENUM, defaultSiteSet } from "../../const"
+import { GOAL_ROAS_ENUM, MARKETING_CARRIER_TYPE_ENUM, MARKETING_TARGET_TYPE_ENUM, MARKETING_TARGET_TYPE_GAME_ENUM, OPTIMIZATIONGOAL_ENUM, defaultSiteSet, marketingGoalGameList, marketingGoalList, marketingSubGoalGameList } from "../../const"
 import New1Radio from "@/pages/launchSystemV3/components/New1Radio"
 import { useAjax } from "@/Hook/useAjax"
 import { getOptimizationGoalPermissionsV3Api } from "@/services/adqV3/global"
@@ -21,9 +21,10 @@ import { SelectCorpWechat } from "@/pages/launchSystemV3/tencenTasset/corpWechat
 const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
 
     /****************************************/
-    const { form, OGPParams, setOGPparams } = useContext(DispatchAd)!;
+    const { form, OGPParams, setOGPparams, putInType } = useContext(DispatchAd)!;
 
     const marketingGoal = Form.useWatch('marketingGoal', form);
+    const marketingSubGoal = Form.useWatch<string>('marketingSubGoal', form);
     const marketingTargetType = Form.useWatch('marketingTargetType', form);
     const marketingCarrierType = Form.useWatch('marketingCarrierType', form);
     const bidMode = Form.useWatch('bidMode', form);
@@ -56,7 +57,7 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
             marketingCarrierType = 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT'
         }
         if ((bidMode && siteSet && siteSet?.length > 0 && marketingGoal && marketingCarrierType && marketingTargetType) || automaticSiteEnabled) {
-            let obj: any = { siteSet: automaticSiteEnabled ? defaultSiteSet : siteSet, marketingGoal, marketingCarrierType: marketingCarrierType, marketingTargetType, marketingSubGoal: 'MARKETING_SUB_GOAL_UNKNOWN' }
+            let obj: any = { siteSet: automaticSiteEnabled ? defaultSiteSet : siteSet, marketingGoal, marketingCarrierType: marketingCarrierType, marketingTargetType, marketingSubGoal: OGPParams?.marketingSubGoal || 'MARKETING_SUB_GOAL_UNKNOWN' }
             if (bidMode === 'BID_MODE_OCPC' || bidMode === 'BID_MODE_OCPM') {
                 obj.bidMode = bidMode
             }
@@ -98,28 +99,34 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
         let newRule: any = {}
         let newMarketingTargetTypeList: PULLIN.DataType[] = []
         if (marketingGoal) {
-            newRule = adRules[marketingGoal as keyof typeof adRules]
             // 根据const里数据对比选出可展示数据
-            newMarketingTargetTypeList = Object.keys(MARKETING_TARGET_TYPE_ENUM).filter(key => newRule?.[key]).map(key => ({ label: MARKETING_TARGET_TYPE_ENUM[key as keyof typeof MARKETING_TARGET_TYPE_ENUM], value: key }))
+            if (putInType === 'NOVEL') {
+                newRule = adRules[marketingGoal]
+                newMarketingTargetTypeList = Object.keys(MARKETING_TARGET_TYPE_ENUM).filter(key => newRule?.[key]).map(key => ({ label: MARKETING_TARGET_TYPE_ENUM[key as keyof typeof MARKETING_TARGET_TYPE_ENUM], value: key }))
+            } else if (putInType === 'GAME') {
+                newRule = adRules[marketingGoal][marketingSubGoal]
+                newMarketingTargetTypeList = Object.keys(MARKETING_TARGET_TYPE_GAME_ENUM).filter(key => newRule?.[key]).map(key => ({ label: MARKETING_TARGET_TYPE_GAME_ENUM[key as keyof typeof MARKETING_TARGET_TYPE_GAME_ENUM], value: key }))
+            }
         }
         setMarketingTargetTypeList(newMarketingTargetTypeList)
         setRules(newRule)
-    }, [marketingGoal])
+    }, [marketingGoal, marketingSubGoal, putInType])
+
 
     // 推广产品设置默认值
     useEffect(() => {
         if (!(value && Object.keys(value).length > 0) && marketingTargetTypeList && (!marketingTargetType || (marketingTargetType && !marketingTargetTypeList.some(item => item.value === marketingTargetType)))) {
             form.setFieldsValue({ marketingTargetType: marketingTargetTypeList?.[0]?.value })
-            // setOGPparams({ ...OGPParams, marketingTargetType: marketingTargetTypeList?.[0]?.value })
         }
     }, [marketingTargetType, marketingTargetTypeList, OGPParams, value])
 
-    // 营销载体类型
+    // // 营销载体类型
     useEffect(() => {
         let newMarketingTargetTypeListList: PULLIN.DataType[] = []
         // 推广产品是公众号不展示 营销载体类型
         if (marketingTargetType) {
             let marketingTargetTypeRules: string[] = rules?.[marketingTargetType]?.MARKETING_SUB_GOAL_UNKNOWN
+            console.log(marketingTargetTypeRules)
             newMarketingTargetTypeListList = Object.keys(MARKETING_CARRIER_TYPE_ENUM).filter(key => marketingTargetTypeRules?.[key as keyof typeof marketingTargetTypeRules]).map(key => ({ label: MARKETING_CARRIER_TYPE_ENUM[key as keyof typeof MARKETING_CARRIER_TYPE_ENUM], value: key }))
         }
         setMarketingCarrierTypeList(newMarketingTargetTypeListList)
@@ -166,9 +173,12 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
         title={<strong style={{ fontSize: 18 }}>营销内容</strong>}
         className="cardResetCss"
     >
-        <Form.Item name="marketingGoal" label={<strong>营销目的</strong>} rules={[{ required: true, message: '请选择营销目的!' }]}>
-            <MarketingGoal onChange={(e) => { setOGPparams({ ...OGPParams, marketingGoal: e as string }); setIsUpdate() }} />
+        <Form.Item name="marketingGoal" label={<strong>营销目的</strong>} rules={[{ required: true, message: '请选择营销目的!' }]} hidden={putInType === 'GAME'}>
+            <MarketingGoal data={putInType === 'GAME' ? marketingGoalGameList : marketingGoalList} onChange={(e) => { setOGPparams({ ...OGPParams, marketingGoal: e as string }); setIsUpdate() }} />
         </Form.Item>
+        {putInType === 'GAME' && <Form.Item name="marketingSubGoal" label={<strong>营销目的</strong>} rules={[{ required: true, message: '请选择营销目的!' }]}>
+            <MarketingGoal data={marketingSubGoalGameList} onChange={(e) => { setOGPparams({ ...OGPParams, marketingSubGoal: e as string }); setIsUpdate() }} />
+        </Form.Item>}
         {marketingTargetTypeList?.length > 0 && <Form.Item name="marketingTargetType" label={<strong>推广产品</strong>} rules={[{ required: true, message: '请选择推广产品!' }]}>
             <NewRadio data={marketingTargetTypeList} onChange={(e) => {
                 if (e === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT') { // 公众号

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

@@ -17,7 +17,7 @@ import { ShowMiniProgramWechatDetail } from "@/pages/launchSystemV3/tencenTasset
 const Ad: React.FC = () => {
 
     /*****************************/
-    const { addelivery, setAddelivery, accountCreateLogs, clearData, setAccountCreateLogs } = useContext(DispatchAddelivery)!;
+    const { addelivery, setAddelivery, accountCreateLogs, clearData, setAccountCreateLogs, putInType } = useContext(DispatchAddelivery)!;
     const { adgroups } = addelivery
     const {
         marketingGoal, marketingAssetOuterSpec, marketingCarrierType, automaticSiteEnabled, siteSet, searchExpandTargetingSwitch, bidMode, smartBidType, bidAmount, optimizationGoal, isConversion, depthConversionEnabled,
@@ -84,6 +84,7 @@ const Ad: React.FC = () => {
 
         {/* 新建广告 */}
         {newVisible && <NewCreateAd
+            putInType={putInType}
             value={addelivery.adgroups}
             visible={newVisible}
             onClose={() => {

+ 2 - 3
src/pages/launchSystemV3/tencentAdPutIn/create/Ad/marketingGoal.tsx

@@ -1,6 +1,5 @@
 import React from "react"
 import style from './index.less'
-import { marketingGoalList } from "../../const"
 import { CheckCircleFilled } from "@ant-design/icons"
 
 /**
@@ -8,12 +7,12 @@ import { CheckCircleFilled } from "@ant-design/icons"
  * @param param0 
  * @returns 
  */
-const MarketingGoal: React.FC<PULLIN.FormItemDataProps> = ({ value, onChange, id }) => {
+const MarketingGoal: React.FC<PULLIN.FormItemDataProps> = ({ data, value, onChange, id }) => {
 
 
     return <div className={style.marketingGoal} id={id}>
         <div className={style.marketingGoal_row}>
-            {marketingGoalList.map(item => <div key={item.value} onClick={() => onChange?.(item.value)} className={`${style.marketingGoal_col} ${value === item.value ? style.marketingGoal_active : ''}`}>
+            {data.map(item => <div key={item.value} onClick={() => onChange?.(item.value)} className={`${style.marketingGoal_col} ${value === item.value ? style.marketingGoal_active : ''}`}>
                 {value === item.value ? <>
                     <img src={item.iconSelected} />
                     <div><CheckCircleFilled /></div>

+ 9 - 6
src/pages/launchSystemV3/tencentAdPutIn/create/Ad/newCreateAd.tsx

@@ -1,7 +1,7 @@
 import { Button, Form, Modal, Space, message } from "antd"
 import React, { useEffect, useState } from "react"
 import '../../index.less'
-import { defaultMarketingGoal, defaultSiteSet } from "../../const"
+import { defaultGameMarketingGoal, defaultMarketingGoal, defaultSiteSet } from "../../const"
 import AdgroupsMarketingContent from "./adgroupsMarketingContent"
 import AdgroupsSitSet from "./adgroupsSitSet"
 import AdgroupsPrice from "./adgroupsPrice"
@@ -12,6 +12,7 @@ import { getTimeSeriesList } from "@/pages/launchSystemNew/adq/ad/const"
 export const DispatchAd = React.createContext<PULLIN.AdReactContent | null>(null);
 
 interface Props {
+    putInType?: 'NOVEL' | 'GAME'
     value?: any,
     visible?: boolean
     onClose?: () => void
@@ -23,12 +24,12 @@ interface Props {
  * @param param0 
  * @returns 
  */
-const NewCreateAd: React.FC<Props> = ({ value, visible, onChange, onClose }) => {
+const NewCreateAd: React.FC<Props> = ({ value, visible, onChange, onClose, putInType }) => {
 
     /***********************************/
     const [form] = Form.useForm();
     // 深度优化副作用参数
-    const [OGPParams, setOGPparams] = useState<PULLIN.OGPParamsProps>({ bidMode: 'BID_MODE_OCPM', siteSet: defaultSiteSet, automaticSiteEnabled: false, marketingGoal: defaultMarketingGoal })
+    const [OGPParams, setOGPparams] = useState<PULLIN.OGPParamsProps>({ bidMode: 'BID_MODE_OCPM', siteSet: defaultSiteSet, automaticSiteEnabled: false, marketingGoal: putInType === 'NOVEL' ? defaultMarketingGoal :  defaultGameMarketingGoal, marketingSubGoal: putInType === 'GAME' ? 'MARKETING_SUB_GOAL_MINI_GAME_NEW_CUSTOMER_GROWTH' : undefined })
     /***********************************/
 
     const handleOk = (values: any) => {
@@ -45,7 +46,8 @@ const NewCreateAd: React.FC<Props> = ({ value, visible, onChange, onClose }) =>
             isSetfirstDayBeginTime,  // 首日开始时间是否开启
             ...surplusValues
         } = values
-
+        console.log(values)
+        return
         let adgroupsValues: any = {
             ...surplusValues,
             beginDate: moment(date?.[0]).format('YYYY-MM-DD'),
@@ -180,7 +182,8 @@ const NewCreateAd: React.FC<Props> = ({ value, visible, onChange, onClose }) =>
             }}
             onFinish={handleOk}
             initialValues={{
-                marketingGoal: defaultMarketingGoal,
+                marketingGoal: putInType === 'NOVEL' ? defaultMarketingGoal : putInType === 'GAME' ? defaultGameMarketingGoal : undefined,
+                marketingSubGoal: putInType === 'GAME' ? 'MARKETING_SUB_GOAL_MINI_GAME_NEW_CUSTOMER_GROWTH' : undefined,
                 automaticSiteEnabled: false,
                 siteSet: defaultSiteSet,
                 searchExpandTargetingSwitch: 'SEARCH_EXPAND_TARGETING_SWITCH_OPEN',
@@ -210,7 +213,7 @@ const NewCreateAd: React.FC<Props> = ({ value, visible, onChange, onClose }) =>
                 isConversion: false
             }}
         >
-            <DispatchAd.Provider value={{ form, OGPParams, setOGPparams }}>
+            <DispatchAd.Provider value={{ form, OGPParams, setOGPparams, putInType }}>
                 <Space direction="vertical" style={{ width: '100%' }}>
                     {/* 营销内容 */}
                     <AdgroupsMarketingContent value={value} />

+ 165 - 117
src/pages/launchSystemV3/tencentAdPutIn/create/index.tsx

@@ -1,4 +1,4 @@
-import { Button, Card, Checkbox, Divider, Empty, Modal, Popconfirm, Select, Space, Spin, Table, Tabs, Tag, Tooltip, message } from "antd"
+import { Button, Card, Checkbox, Divider, Empty, Modal, Popconfirm, Radio, Select, Space, Spin, Table, Tabs, Tag, Tooltip, message } from "antd"
 import React, { useEffect, useState } from "react"
 import style from './index.less'
 import '../index.less'
@@ -26,6 +26,7 @@ import { getCreativeDetailsApi } from "@/services/adqV3/global"
 import ConversionSelect from "../../components/ConversionSelect"
 import VideoChannel from "../../components/VideoChannel"
 import Save from "./Save"
+import { useLocalStorageState } from "ahooks"
 
 export const DispatchAddelivery = React.createContext<PULLIN.DispatchAddelivery | null>(null);
 
@@ -36,6 +37,7 @@ export const DispatchAddelivery = React.createContext<PULLIN.DispatchAddelivery
 const Create: React.FC = () => {
 
     /*******************************************/
+    const { initialState } = useModel('@@initialState');
     const { getAllUserAccount } = useModel('useLaunchAdq.useAdAuthorize')
     const { initTargeting } = useModel('useLaunchV3.useTargeting')
     const [addelivery, setAddelivery] = useState<PULLIN.AddeliveryProps>({ adgroups: {}, targeting: [], dynamic: {}, dynamicMaterialDTos: {}, dynamicCreativesTextDTOS: {}, mediaType: 0 })
@@ -57,6 +59,8 @@ const Create: React.FC = () => {
     const [dynamicCount, setDynamicCount] = useState<number>(0)
     const [creativeTemplateAppellation, setCreativeTemplateAppellation] = useState<string>()
     const [creativeTemplateStyle, setCreativeTemplateStyle] = useState<string>()
+    const [putInTypeList, setPutInTypeList] = useState<{ label: string, value: string }[]>([])
+    const [putInType, setPutInType] = useLocalStorageState<'NOVEL' | 'GAME'>('PUTINTYPE');
 
     const getGroupList = useAjax(() => getGroupListApi())
     const createAdgroupTask = useAjax((params) => createAdgroupTaskApi(params))
@@ -64,6 +68,26 @@ const Create: React.FC = () => {
     const getCreativeDetails = useAjax((params) => getCreativeDetailsApi(params))
     /*******************************************/
 
+    // 判断游戏还是小说短剧
+    useEffect(() => {
+        if (initialState?.menu?.data?.length) {
+            const menu = initialState?.menu?.data
+            const ADLAUNCH3 = menu.find((item: { path: string }) => item.path === "/launchSystemV3")
+            const ADLAUNCH2 = menu.find((item: { path: string }) => item.path === "/launchSystemNew")
+            const ACCOUNTLIST = ADLAUNCH3?.routes?.find((item: { path: string }) => item.path === "/launchSystemV3/account") || ADLAUNCH2?.routes?.find((item: { path: string }) => item.path === "/launchSystemNew/account")
+            let newputInTypeList: { label: string, value: string }[] = []
+            ACCOUNTLIST?.routes.forEach((item: { path: string }) => {
+                if (item.path.includes('novel')) {
+                    newputInTypeList.push({ label: '小说/短剧投放', value: 'NOVEL' })
+                } else if (item.path.includes('game')) {
+                    newputInTypeList.push({ label: '游戏投放', value: 'GAME' })
+                }
+            })
+            setPutInTypeList(newputInTypeList);
+            newputInTypeList.length > 0 && setPutInType(type => (type && newputInTypeList.some(item => item.value === type) ? type : newputInTypeList[0].value) as 'NOVEL' | 'GAME');
+        }
+    }, [initialState?.menu])
+
     useEffect(() => {
         // 获取账户组
         getGroupList.run()
@@ -131,7 +155,7 @@ const Create: React.FC = () => {
                             }
                         })
                     })
-                    setAccountCreateLogs(userArr?.map((item) => ({ accountId: item?.accountId })))
+                    setAccountCreateLogs(userArr?.filter((item: any) => putInType === 'NOVEL' ? ['NOVEL', 'NOVEL_IAA'].includes(item.adUnitType) : putInType === 'GAME' ? ['GAME', 'GAME_IAA'].includes(item.adUnitType) : false)?.map((item) => ({ accountId: item?.accountId })))
                     clearData()
                     setAddelivery({ adgroups: {}, targeting: [], dynamic: {}, dynamicMaterialDTos: {}, dynamicCreativesTextDTOS: {}, mediaType: 0 })
                 } else {
@@ -145,18 +169,23 @@ const Create: React.FC = () => {
 
     /** 存为预设 */
     const severBd = () => {
-        localStorage.setItem('ADQADV3', JSON.stringify({
-            addelivery,
-            accountCreateLogs,
-            materialData,
-            textData
-        }))
-        message.success('存储成功')
+        if (putInType) {
+            localStorage.setItem(putInType === 'GAME' ? 'ADQADV3_GAME' : 'ADQADV3', JSON.stringify({
+                addelivery,
+                accountCreateLogs,
+                materialData,
+                textData,
+                putInType
+            }))
+            message.success('存储成功')
+        }
     }
 
     /** 清除 */
-    const delBdPlan = () => {
-        localStorage.removeItem('ADQADV3')
+    const delBdPlan = ({ isRemoveItem = true }: { isRemoveItem?: boolean }) => {
+        if (isRemoveItem) {
+            localStorage.removeItem(putInType === 'GAME' ? 'ADQADV3_GAME' : 'ADQADV3')
+        }
         setAccountCreateLogs([])
         setMaterialData({})
         setTextData({})
@@ -173,118 +202,125 @@ const Create: React.FC = () => {
 
     /**数据回填 */
     useEffect(() => {
-        let taskId = sessionStorage.getItem('TASKID3.0')
-        let adqAdData = localStorage.getItem('ADQADV3')
-        if (taskId) {
-            getSelectTaskDetail.run(taskId).then(res => {
-                if (res) {
-                    const { adgroupDTO, accountIdParamVOMap, targetings, dynamicCreativesDTO: { mediaType, ...dynamic }, dynamicCreativesTextDTO, dynamicMaterialDTOS } = res
-                    let beginDate = adgroupDTO.beginDate
-                    let endDate = adgroupDTO.endDate
-                    if (beginDate && moment(beginDate) < moment()) {
-                        beginDate = moment().format('YYYY-MM-DD')
-                        endDate = moment().add(7, 'day').format('YYYY-MM-DD')
-                        message.warning('请注意,检测投放开始日期小于今天,已自动改成今天,如需修改,请重新设置')
-                    }
-                    let dynamicGroup: any[] = []
-                    if (dynamic.deliveryMode === 'DELIVERY_MODE_CUSTOMIZE') {
-                        dynamicGroup = dynamicMaterialDTOS?.map((item: any[]) => {
-                            let { type, valueJson } = item[0]
-                            let value = JSON.parse(valueJson).value
-                            if (type === 'image') {
-                                return { image_id: { id: value.imageId, url: value.imageUrl, materialType: value.materialType } }
-                            } else if (type === 'image_list' || type === 'element_story') {
-                                return { [type]: value.list.map((l: { imageUrl: any; imageId: any; materialType: any }) => ({ url: l.imageUrl, id: l.imageId, materialType: l.materialType })) }
-                            } else if (type === 'short_video' || type === 'video') {
-                                let field = type === 'video' ? 'video_id' : 'short_video1'
-                                let videoData: any = {}
-                                videoData[field] = { materialType: value.materialType, url: value.videoUrl, id: value.videoId }
-                                if (value.imageUrl) {
-                                    videoData['cover_id'] = { materialType: value.materialCoverType, url: value.imageUrl, id: value.iamgeId }
-                                }
-                                return videoData
-                            } else {
-                                return {}
+        if (putInTypeList?.length > 0) {
+            let taskId = sessionStorage.getItem('TASKID3.0')
+            let adqAdData = localStorage.getItem(putInType === 'GAME' ? 'ADQADV3_GAME' : 'ADQADV3')
+            if (taskId) {
+                getSelectTaskDetail.run(taskId).then(res => {
+                    if (res) {
+                        const { adgroupDTO, accountIdParamVOMap, targetings, dynamicCreativesDTO: { mediaType, ...dynamic }, dynamicCreativesTextDTO, dynamicMaterialDTOS, taskType = 'NOVEL' } = res
+                        if (putInTypeList.some(item => item.value === taskType)) {
+                            setPutInType(() => taskType)
+                            let beginDate = adgroupDTO.beginDate
+                            let endDate = adgroupDTO.endDate
+                            if (beginDate && moment(beginDate) < moment()) {
+                                beginDate = moment().format('YYYY-MM-DD')
+                                endDate = moment().add(7, 'day').format('YYYY-MM-DD')
+                                message.warning('请注意,检测投放开始日期小于今天,已自动改成今天,如需修改,请重新设置')
                             }
-                        })
-                    } else { // 组件化创意
-                        dynamicGroup = dynamicMaterialDTOS?.map((item: any[]) => {
-                            return {
-                                list: item?.map((i: any) => {
-                                    let { type, valueJson } = i
+                            let dynamicGroup: any[] = []
+                            if (dynamic.deliveryMode === 'DELIVERY_MODE_CUSTOMIZE') {
+                                dynamicGroup = dynamicMaterialDTOS?.map((item: any[]) => {
+                                    let { type, valueJson } = item[0]
                                     let value = JSON.parse(valueJson).value
                                     if (type === 'image') {
-                                        return { id: value.imageId, url: value.imageUrl, materialType: value.materialType }
-                                    } else if (type === 'image_list') {
-                                        return value.list.map((l: { imageUrl: any; imageId: any; materialType: any }) => ({ url: l.imageUrl, id: l.imageId, materialType: l.materialType }))
-                                    } else if (type === 'video') {
-                                        return { materialType: value.materialType, url: value.videoUrl, id: value.videoId }
+                                        return { image_id: { id: value.imageId, url: value.imageUrl, materialType: value.materialType } }
+                                    } else if (type === 'image_list' || type === 'element_story') {
+                                        return { [type]: value.list.map((l: { imageUrl: any; imageId: any; materialType: any }) => ({ url: l.imageUrl, id: l.imageId, materialType: l.materialType })) }
+                                    } else if (type === 'short_video' || type === 'video') {
+                                        let field = type === 'video' ? 'video_id' : 'short_video1'
+                                        let videoData: any = {}
+                                        videoData[field] = { materialType: value.materialType, url: value.videoUrl, id: value.videoId }
+                                        if (value.imageUrl) {
+                                            videoData['cover_id'] = { materialType: value.materialCoverType, url: value.imageUrl, id: value.iamgeId }
+                                        }
+                                        return videoData
                                     } else {
                                         return {}
                                     }
                                 })
+                            } else { // 组件化创意
+                                dynamicGroup = dynamicMaterialDTOS?.map((item: any[]) => {
+                                    return {
+                                        list: item?.map((i: any) => {
+                                            let { type, valueJson } = i
+                                            let value = JSON.parse(valueJson).value
+                                            if (type === 'image') {
+                                                return { id: value.imageId, url: value.imageUrl, materialType: value.materialType }
+                                            } else if (type === 'image_list') {
+                                                return value.list.map((l: { imageUrl: any; imageId: any; materialType: any }) => ({ url: l.imageUrl, id: l.imageId, materialType: l.materialType }))
+                                            } else if (type === 'video') {
+                                                return { materialType: value.materialType, url: value.videoUrl, id: value.videoId }
+                                            } else {
+                                                return {}
+                                            }
+                                        })
+                                    }
+                                })
                             }
-                        })
-                    }
 
-                    let isConversion = false
-                    setAccountCreateLogs(Object.keys(accountIdParamVOMap || {}).map(accountId => {
-                        const { productDTOS, wechatOfficialAccountsVO, pageList, landingPageVOS, userActionSetsList, conversionInfo, wechatChannelVO, wechatAppletList } = accountIdParamVOMap[accountId]
-                        let data: PULLIN.AccountCreateLogsProps = {
-                            accountId: Number(accountId),
-                            productList: productDTOS
-                        }
-                        if (wechatOfficialAccountsVO) {
-                            data.wechatChannelList = [wechatOfficialAccountsVO]
-                        }
-                        if (pageList || landingPageVOS || wechatAppletList) {
-                            data.pageList = pageList || landingPageVOS || wechatAppletList?.map((item: { appletName: any; id: any }) => ({ ...item, pageName: item.appletName, pageId: item.id }))
-                        }
-                        if (userActionSetsList) {
-                            data.userActionSetsList = userActionSetsList
-                        }
-                        if (conversionInfo) {
-                            isConversion = true
-                            data.newConversionList = [conversionInfo]
-                        }
-                        if (wechatChannelVO) {
-                            data.videoChannelList = [wechatChannelVO]
-                        }
-                        return data
-                    }))
+                            let isConversion = false
+                            setAccountCreateLogs(Object.keys(accountIdParamVOMap || {}).map(accountId => {
+                                const { productDTOS, wechatOfficialAccountsVO, pageList, landingPageVOS, userActionSetsList, conversionInfo, wechatChannelVO, wechatAppletList } = accountIdParamVOMap[accountId]
+                                let data: PULLIN.AccountCreateLogsProps = {
+                                    accountId: Number(accountId),
+                                    productList: productDTOS
+                                }
+                                if (wechatOfficialAccountsVO) {
+                                    data.wechatChannelList = [wechatOfficialAccountsVO]
+                                }
+                                if (pageList || landingPageVOS || wechatAppletList) {
+                                    data.pageList = pageList || landingPageVOS || wechatAppletList?.map((item: { appletName: any; id: any }) => ({ ...item, pageName: item.appletName, pageId: item.id }))
+                                }
+                                if (userActionSetsList) {
+                                    data.userActionSetsList = userActionSetsList
+                                }
+                                if (conversionInfo) {
+                                    isConversion = true
+                                    data.newConversionList = [conversionInfo]
+                                }
+                                if (wechatChannelVO) {
+                                    data.videoChannelList = [wechatChannelVO]
+                                }
+                                return data
+                            }))
 
-                    setAddelivery({
-                        adgroups: { ...adgroupDTO, isConversion, adgroupName: adgroupDTO.adgroupName + '_副本' + randomString(true, 3, 5), endDate, beginDate },
-                        targeting: targetings.map((item: any) => {
-                            const { targetingName, ...targeting } = item
-                            return { targetingName, targeting }
-                        }),
-                        dynamic,
-                        dynamicMaterialDTos: dynamicGroup.length > 0 ? { dynamicGroup } : {},
-                        dynamicCreativesTextDTOS: dynamicCreativesTextDTO,
-                        mediaType: mediaType || 0
-                    })
-                    sessionStorage.removeItem('TASKID3.0')
-                }
-            })
-        } else if (adqAdData) {
-            const { addelivery, accountCreateLogs, materialData, textData } = JSON.parse(adqAdData)
-            if (addelivery?.adgroups) {
-                if (addelivery?.adgroups?.beginDate && moment(addelivery?.adgroups?.beginDate) < moment()) {
-                    addelivery.adgroups.beginDate = moment().format('YYYY-MM-DD')
-                    message.warning('请注意,检测投放开始日期小于今天,已自动改成今天,如需修改,请重新设置')
-                }
-                if (addelivery?.adgroups?.endDate && moment(addelivery?.adgroups?.endDate) < moment()) {
-                    addelivery.adgroups.endDate = moment().format('YYYY-MM-DD')
-                    message.warning('请注意,检测投放结束日期小于今天,已自动改成今天,如需修改,请重新设置')
+                            setAddelivery({
+                                adgroups: { ...adgroupDTO, isConversion, adgroupName: adgroupDTO.adgroupName + '_副本' + randomString(true, 3, 5), endDate, beginDate },
+                                targeting: targetings.map((item: any) => {
+                                    const { targetingName, ...targeting } = item
+                                    return { targetingName, targeting }
+                                }),
+                                dynamic,
+                                dynamicMaterialDTos: dynamicGroup.length > 0 ? { dynamicGroup } : {},
+                                dynamicCreativesTextDTOS: dynamicCreativesTextDTO,
+                                mediaType: mediaType || 0
+                            })
+                        } else {
+                            message.error(`没有${taskType === 'NOVEL' ? '小说/短剧' : taskType === 'GAME' ? '游戏' : taskType}投放权限`)
+                        }
+                        sessionStorage.removeItem('TASKID3.0')
+                    }
+                })
+            } else if (adqAdData) {
+                const { addelivery, accountCreateLogs, materialData, textData } = JSON.parse(adqAdData)
+                if (addelivery?.adgroups) {
+                    if (addelivery?.adgroups?.beginDate && moment(addelivery?.adgroups?.beginDate) < moment()) {
+                        addelivery.adgroups.beginDate = moment().format('YYYY-MM-DD')
+                        message.warning('请注意,检测投放开始日期小于今天,已自动改成今天,如需修改,请重新设置')
+                    }
+                    if (addelivery?.adgroups?.endDate && moment(addelivery?.adgroups?.endDate) < moment()) {
+                        addelivery.adgroups.endDate = moment().format('YYYY-MM-DD')
+                        message.warning('请注意,检测投放结束日期小于今天,已自动改成今天,如需修改,请重新设置')
+                    }
                 }
+                setAddelivery({ ...addelivery })
+                setAccountCreateLogs(accountCreateLogs)
+                setMaterialData(materialData)
+                setTextData(textData)
             }
-            setAddelivery({ ...addelivery })
-            setAccountCreateLogs(accountCreateLogs)
-            setMaterialData(materialData)
-            setTextData(textData)
         }
-    }, [])
+    }, [putInType, putInTypeList])
 
     // 预览
     const preview = () => {
@@ -742,9 +778,9 @@ const Create: React.FC = () => {
             dynamicCreativesDTO,
             dynamicCreativesTextDTOS,
             dynamicMaterialDTOS,
-            accountIdParamDTOMap
+            accountIdParamDTOMap,
+            taskType: putInType
         }
-        // setSubVisible(false)
         createAdgroupTask.run(params).then(res => {
             if (res) {
                 Modal.success({
@@ -772,8 +808,19 @@ const Create: React.FC = () => {
         <Spin spinning={createAdgroupTask.loading || getSelectTaskDetail.loading || getCreativeDetails.loading}>
             <Card
                 size="small"
-                title={<Space>
+                title={<Space size={18}>
                     <div className={style.cardTitle}>配置区</div>
+                    {putInTypeList.length >= 1 && <Radio.Group
+                        buttonStyle="solid"
+                        value={putInType}
+                        onChange={(e) => {
+                            setPutInType(e.target.value)
+                            delBdPlan({ isRemoveItem: false })
+                        }}
+                        options={putInTypeList}
+                        optionType='button'
+                        size="small"
+                    />}
                 </Space>}
                 className={style.createAd}
             >
@@ -840,7 +887,7 @@ const Create: React.FC = () => {
                                         <Checkbox onChange={(e) => {
                                             let data = []
                                             if (e.target.checked) {
-                                                data = JSON.parse(JSON.stringify(getAllUserAccount?.data?.data))
+                                                data = JSON.parse(JSON.stringify(getAllUserAccount?.data?.data?.filter((item: any) => putInType === 'NOVEL' ? ['NOVEL', 'NOVEL_IAA'].includes(item.adUnitType) : putInType === 'GAME' ? ['GAME', 'GAME_IAA'].includes(item.adUnitType) : false)))
                                                 if (accSearch) {
                                                     let newAccSearch = accSearch?.split(/[,,\n\s]+/ig).filter((item: any) => item)
                                                     data = data?.filter((item: any) => newAccSearch?.some(val => item!.accountId?.toString().toLowerCase()?.includes(val)))
@@ -852,7 +899,7 @@ const Create: React.FC = () => {
                                 </>
                             )}
                         >
-                            {getAllUserAccount?.data?.data?.map((item: any) => <Select.Option value={item.accountId} key={item.id}>{item.remark ? item.accountId + '_' + item.remark : item.accountId}</Select.Option>)}
+                            {getAllUserAccount?.data?.data?.filter((item: any) => putInType === 'NOVEL' ? ['NOVEL', 'NOVEL_IAA'].includes(item.adUnitType) : putInType === 'GAME' ? ['GAME', 'GAME_IAA'].includes(item.adUnitType) : false)?.map((item: any) => <Select.Option value={item.accountId} key={item.id}>{item.remark ? item.accountId + '_' + item.remark : item.accountId}</Select.Option>)}
                         </Select>
                     </Selector>
 
@@ -880,7 +927,8 @@ const Create: React.FC = () => {
                                 setMaterialData,
                                 textData,
                                 setTextData,
-                                clearData
+                                clearData,
+                                putInType
                             }}>
                             <div className={style.settingsBody_content_right}>
                                 {/* 广告信息 */}
@@ -909,7 +957,7 @@ const Create: React.FC = () => {
                     <Button type='primary' onClick={severBd}>存为预设</Button>
                     <Popconfirm
                         title="确定清空?"
-                        onConfirm={delBdPlan}
+                        onConfirm={() => delBdPlan({})}
                     >
                         <Button>清空配置/预设</Button>
                     </Popconfirm>

+ 27 - 6
src/pages/launchSystemV3/tencentAdPutIn/rules.ts

@@ -1169,7 +1169,7 @@ export const dynamicRules = {
 
 // 视频规则
 export const videoRules = {
-    "videoL": { // 横板视频 16:9
+	"videoL": { // 横板视频 16:9
 		"name": "video",
 		"elementType": "STRUCT",
 		"fieldType": "STRUCT_ARRAY",
@@ -1218,7 +1218,7 @@ export const videoRules = {
 			}
 		}
 	},
-    "videoP": {  // 竖版视频9:16
+	"videoP": {  // 竖版视频9:16
 		"name": "video",
 		"elementType": "STRUCT",
 		"fieldType": "STRUCT_ARRAY",
@@ -1267,7 +1267,7 @@ export const videoRules = {
 			}
 		}
 	},
-    "short_video": {  // 4:3
+	"short_video": {  // 4:3
 		"name": "short_video",
 		"elementType": "STRUCT",
 		"fieldType": "STRUCT_ARRAY",
@@ -1335,7 +1335,7 @@ export const videoRules = {
 }
 
 export const imageRules = {
-    "imageL": { // 横板大图16:9
+	"imageL": { // 横板大图16:9
 		"name": "image",
 		"elementType": "STRUCT",
 		"fieldType": "STRUCT_ARRAY",
@@ -1364,7 +1364,7 @@ export const imageRules = {
 			}
 		}
 	},
-    "imageP": { // 竖版大图9:16
+	"imageP": { // 竖版大图9:16
 		"name": "image",
 		"elementType": "STRUCT",
 		"fieldType": "STRUCT_ARRAY",
@@ -1395,8 +1395,13 @@ export const imageRules = {
 	},
 }
 
+type AdRules = {  
+    [goal: string]: {  
+        [subGoal: string]: any; // 根据实际需要可以更改 any 类型  
+    };  
+};
 /** 广告配置数据 */
-export const adRules = {
+export const adRules: AdRules = {
 	"MARKETING_GOAL_BRAND_PROMOTION": {
 		"MARKETING_TARGET_TYPE_APP_ANDROID": {
 			"MARKETING_SUB_GOAL_UNKNOWN": {
@@ -1835,6 +1840,22 @@ export const adRules = {
 					"PRODUCT_TYPE": 43
 				}
 			}
+		},
+		"MARKETING_SUB_GOAL_MINI_GAME_NEW_CUSTOMER_GROWTH": {
+			"MARKETING_TARGET_TYPE_WECHAT_MINI_GAME": {
+				"MARKETING_SUB_GOAL_UNKNOWN": {
+					"MARKETING_CARRIER_TYPE_WECHAT_MINI_GAME": {},
+					"MARKETING_CARRIER_TYPE_WECHAT_CHANNELS_LIVE": {}
+				}
+			}
+		},
+		"MARKETING_SUB_GOAL_NEW_GAME_TEST": {
+			"MARKETING_TARGET_TYPE_WECHAT_MINI_GAME": {
+				"MARKETING_SUB_GOAL_UNKNOWN": {
+					"MARKETING_CARRIER_TYPE_WECHAT_MINI_GAME": {},
+					"MARKETING_CARRIER_TYPE_WECHAT_CHANNELS_LIVE": {}
+				}
+			}
 		}
 	}
 }

+ 5 - 1
src/pages/launchSystemV3/tencentAdPutIn/typings.d.ts

@@ -6,11 +6,13 @@ declare namespace PULLIN {
         automaticSiteEnabled: boolean,
         marketingTargetType?: string,
         marketingCarrierType?: string,
+        marketingSubGoal?: string
     }
     interface AdReactContent {
         form: FormInstance<any>
         OGPParams: OGPParamsProps,
         setOGPparams: React.Dispatch<React.SetStateAction<OGPParamsProps>>
+        putInType?: 'NOVEL' | 'GAME'
     }
     interface AddeliveryProps {
         adgroups: any,
@@ -29,10 +31,12 @@ declare namespace PULLIN {
         setMaterialData: React.Dispatch<any>
         textData: any,
         setTextData: React.Dispatch<any>,
-        clearData: () => void
+        clearData: () => void,
+        putInType?: 'NOVEL' | 'GAME'
     }
     type DataType = { label: string | number, value: any, disabled?: boolean }
     interface FormItemDataProps {
+        data: { label: string, value: string, icon: string, iconSelected: string }[]
         id?: any
         value?: string,
         onChange?: (value?: string) => void

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.