import React, { useCallback, useState, useEffect } from 'react' import { Modal, Form, Input, Divider, Select, Radio, Checkbox, TreeSelect } from 'antd' import { GenderEnum, EducationEnum, ExcludedDimensionEnum, MaritalStatusEnum, OptimizationGoalEnum, UserOsEnum, DevicePriceEnum, NetworkEnum, WechatAdBehaviorEnum } from '@/services/launchAdq/enum' import { ModalConfig } from '.' import { useAjax } from '@/Hook/useAjax' import { getTagsList } from '@/services/launchAdq/global' interface Props { title?: string, visible: boolean, PupFn: (arg: ModalConfig) => void, callback: (params: any) => void, confirmLoading: boolean, type?: 'add' | 'look' | 'edit',//新增,查看,编辑 dataInfo?: any } const ios_os = Object.keys(UserOsEnum).filter(key => key.includes('IOS')) const android_os = Object.keys(UserOsEnum).filter(key => key.includes('ANDROID')) /**创意模板*/ function AdModal(props: Props) { let { visible, confirmLoading, PupFn, callback, type, dataInfo } = props let arg = type === 'look' ? { footer: null } : {} const tagsList_REGION = useAjax((params) => getTagsList(params)) const tagsList_MODEL = useAjax((params) => getTagsList(params)) const [form] = Form.useForm(); const [indeterminateIos, setIndeterminateIos] = useState(false); const [indeterminateAndroid, setIndeterminateAndroid] = useState(false); const [modelList, setModelList] = useState([]) const [regionsList, setRegionsList] = useState([]) let educationType = Form.useWatch('educationType', form) let ageType = Form.useWatch('ageType', form) let age_min = Form.useWatch('age_min', form) let age_max = Form.useWatch('age_max', form) let maritalStatusType = Form.useWatch('maritalStatusType', form) let excludedDimension = Form.useWatch('excludedDimension', form) let userOsType = Form.useWatch('userOsType', form) let userOsIos = Form.useWatch('userOsIos', form) let userOsAndroid = Form.useWatch('userOsAndroid', form) let devicePriceType = Form.useWatch('devicePriceType', form) let networkType = Form.useWatch('networkType', form) let wechatAdBehaviorType = Form.useWatch('wechatAdBehaviorType', form) let actions = Form.useWatch('actions', form) let excludedActions = Form.useWatch('excludedActions', form) let deviceBrandModelType = Form.useWatch('deviceBrandModelType', form) let deviceBrandModelList = Form.useWatch('deviceBrandModelList', form) let geoLocationType = Form.useWatch('geoLocationType', form) // 确定事件 const handleOk = useCallback(() => { form.validateFields().then(values => { let newValues = JSON.parse(JSON.stringify(values)) newValues.targeting = {} Object.keys(newValues).forEach(key => { switch (key) { case 'geoLocationType': if (newValues[key] === '1') { newValues.targeting.geoLocation = { locationTypes: ['LIVE_IN'],//对于微信流量(site_set=SITE_SET_WECHAT、SITE_SET_MOMENTS、SITE_SET_MINI_GAME_WECHAT),仅能选择"LIVE_IN"(常住); regions: newValues.regions && newValues.regions[0] === 1156 ? regionsList[0]?.children?.filter((item: any) => !item.disabled)?.map((item: { value: any }) => item.value) : newValues.regions } } delete newValues[key] delete newValues.regions break; case 'ageType'://年龄处理 if (newValues[key] === '1') { newValues.targeting.age = [{ min: newValues.age_min, max: newValues.age_max }] } delete newValues[key] delete newValues.age_min delete newValues.age_max break; case 'gender'://性别 newValues[key] !== '0' && (newValues.targeting.gender = [newValues[key]]) delete newValues[key] break; case 'educationType'://学历 newValues[key] === '1' && (newValues.targeting.education = newValues.education) delete newValues[key] delete newValues['education'] break; case 'maritalStatusType'://婚恋 newValues[key] === '1' && (newValues.targeting.maritalStatus = newValues.maritalStatus) delete newValues[key] delete newValues['maritalStatus'] break; case 'customAudienceType'://定向人群 break; case 'deviceBrandModelType'://品牌型号 if (newValues[key] === '1') { newValues.targeting.deviceBrandModel = {} if (newValues.isexcluded) { newValues.targeting.deviceBrandModel.excludedList = newValues.deviceBrandModelList delete newValues.targeting.deviceBrandModel.includedList } else { newValues.targeting.deviceBrandModel.includedList = newValues.deviceBrandModelList delete newValues.targeting.deviceBrandModel.excludedList } if (!newValues.targeting.deviceBrandModel.excludedList && !newValues.targeting.deviceBrandModel.includedList) { delete newValues.targeting.deviceBrandModel } } delete newValues[key] delete newValues.deviceBrandModelList delete newValues.isexcluded break; case 'wechatAdBehaviorType'://微信再营销 if (newValues[key] === '1') { newValues.targeting.wechatAdBehavior = {} if (newValues.actions) { newValues.targeting.wechatAdBehavior = { ...newValues.targeting.wechatAdBehavior, actions: newValues.actions } } if (newValues.excludedActions) { newValues.targeting.wechatAdBehavior = { ...newValues.targeting.wechatAdBehavior, excludedActions: newValues.excludedActions } } // 去除空值的参数 Object.keys(newValues.targeting.wechatAdBehavior).forEach(key => { if (!newValues.targeting.wechatAdBehavior[key] || newValues.targeting.wechatAdBehavior[key]?.length === 0) { delete newValues.targeting.wechatAdBehavior[key] } }) // 什么都没删除参数 if (!newValues.targeting.wechatAdBehavior.actions && !newValues.targeting.wechatAdBehavior.excludedActions) { delete newValues.targeting.wechatAdBehavior } } delete newValues[key] delete newValues.actions delete newValues.excludedActions break; case 'networkType'://联网方式 newValues[key] === '1' && (newValues.targeting.networkType = newValues.network) delete newValues[key] delete newValues.network break; case 'devicePriceType'://手机价格 newValues[key] === '1' && (newValues.targeting.devicePrice = newValues.devicePrice) delete newValues[key] delete newValues.devicePrice break; case 'userOsType'://手机系统 if (newValues[key] === '1') { newValues.targeting.userOs = [] if (newValues.userOsIos) { newValues.targeting.userOs = [...newValues.targeting.userOs, ...newValues.userOsIos] } if (newValues.userOsAndroid) { newValues.targeting.userOs = [...newValues.targeting.userOs, ...newValues.userOsAndroid] } if (newValues.targeting.userOs.length === 0) { delete newValues.targeting.userOs } } delete newValues[key] delete newValues.userOsIosAll delete newValues.userOsAndroidAll delete newValues.userOsIos delete newValues.userOsAndroid break; case 'excludedDimension'://排除已转化用户 if (newValues[key] !== '0') { newValues.targeting.excludedConvertedAudience = newValues.conversionBehaviorList ? { excludedDimension: newValues.excludedDimension, conversionBehaviorList: [newValues.conversionBehaviorList] } : { excludedDimension: newValues.excludedDimension, } } delete newValues[key] delete newValues.conversionBehaviorList break; } }) // console.log(JSON.stringify(newValues)) callback(newValues) }) }, [form, regionsList]) // 监听ios系统全选事件 useEffect(() => { setIndeterminateIos(!!userOsIos?.length && userOsIos?.length < ios_os.length) form.setFieldsValue({ userOsIosAll: userOsIos?.length === ios_os.length }) }, [userOsIos]) // 监听android系统全选事件 useEffect(() => { setIndeterminateAndroid(!!userOsAndroid?.length && userOsAndroid?.length < android_os.length) form.setFieldsValue({ userOsAndroidAll: userOsAndroid?.length === android_os.length }) }, [userOsAndroid]) // 获取定向标签 useEffect(() => { // 获取地域 tagsList_REGION.run({ type: 'REGION' }).then(res => { let arr: any = Object.values(res).filter(v => typeof v !== 'string') let parentList = arr.filter((item: { parentName: any }) => !item.parentName) let childrenList = arr.filter((item: { parentName: any }) => item.parentName) parentList = parentList.map((item: { name: any; id: any, parentId: any }) => { let children = childrenList?.filter((c: { parentId: any }) => { return item.id === c.parentId }) let obj = { title: item.name, value: item.id, key: item.id, parentId: item.parentId, disabled: item.id === 710000 || item.id === 810000 || item.id === 820000, children: children.map((item: { name: any; id: any, parentId: any }) => ({ title: item.name, value: item.id, key: item.id, parentId: item.parentId, disabled: item.parentId === 710000 || item.parentId === 810000 || item.parentId === 820000 })) } return obj }) parentList = parentList.map((item: any) => { let itemArr = item?.children?.map((c: any) => { let arr = childrenList.filter((d: { parentId: any }) => { return d.parentId === c.value }) arr = arr.map((i: { name: any; id: any }) => ({ title: i.name, value: i.id, key: i.id, })) return { ...c, children: arr } }) return { ...item, children: itemArr } }) let zg = parentList.filter((item: { title: string }) => item.title === '中国') let zg_children = parentList.filter((item: { title: string }) => (item.title !== '中国' && item.title !== '国外')) zg[0].children = zg_children setRegionsList(zg) }) // 获取手机 tagsList_MODEL.run({ type: 'DEVICE_BRAND_MODEL' }).then(res => { let arr: any = Object.values(res).filter(v => typeof v !== 'string') let parentList = arr.filter((item: { parentName: any }) => !item.parentName) let childrenList = arr.filter((item: { parentName: any }) => item.parentName) parentList = parentList.map((item: { name: any; id: any }) => { let children = childrenList?.filter((c: { parentId: any }) => { return item.id === c.parentId }) let obj = { title: item.name, value: item.id, key: item.id, children: children.map((item: { name: any; id: any }) => ({ title: item.name, value: item.id, key: item.id, })) } return obj }) setModelList(parentList) }) }, []) // 回填数据 useEffect(() => { if (regionsList.length > 0 && dataInfo) { let newArr = regionsList[0]?.children?.filter((item: any) => !item.disabled)?.map((item: { value: any }) => item.value)//全选省列表 let { description, targetingName, targeting } = dataInfo let { age, deviceBrandModel, devicePrice, education, excludedConvertedAudience, gender, geoLocation, maritalStatus, networkType, userOs, wechatAdBehavior } = targeting form.setFieldsValue({ targetingName,//定向名称 description,//定向描述 geoLocationType: geoLocation?.regions ? '1' : '0',//地域选项 regions: geoLocation?.regions && JSON.stringify(geoLocation?.regions) === JSON.stringify(newArr) ? [1156] : geoLocation?.regions,//地域回填 ageType: age ? '1' : '0',//年龄选项 age_min: age ? age[0].min : 14,//年龄 age_max: age ? age[0].max : 66,//年龄 gender: gender ? gender?.join() : '0',//性别 educationType: education ? '1' : '0',//学历 education,//学历 maritalStatusType: maritalStatus ? '1' : '0',//婚恋 maritalStatus,//婚恋 excludedDimension: excludedConvertedAudience ? excludedConvertedAudience?.excludedDimension : '0',//排除已转化 conversionBehaviorList: excludedConvertedAudience ? excludedConvertedAudience?.conversionBehaviorList[0] : undefined,//排除已转化 deviceBrandModelType: deviceBrandModel ? '1' : '0',//设备品牌型号 deviceBrandModelList: deviceBrandModel?.excludedList || deviceBrandModel?.includedList,//设备品牌型号 isexcluded: deviceBrandModel && deviceBrandModel?.excludedList,//设备品牌型号 userOsType:userOs?'1':'0',//操作系统 userOsIos:userOs?.filter((os:string)=>os.includes('IOS')),//操作系统 userOsAndroid:userOs?.filter((os:string)=>os.includes('ANDROID')),//操作系统 networkType:networkType?'1':'0',//联网方式 network:networkType,//联网方式 devicePriceType:devicePrice?'1':'0',//设备价格 devicePrice,//设备价格 wechatAdBehaviorType:wechatAdBehavior?'1':'0',//微信再营销 actions:wechatAdBehavior?.actions,//再营销 excludedActions:wechatAdBehavior?.excludedActions,//排除再营销 }) } }, [regionsList, dataInfo]) return { PupFn({ visible: false ,dataInfo:null,type:'add'}) }} onOk={handleOk} width={900} confirmLoading={confirmLoading} {...arg} >
{/* ============================================================基本信息============================================================= */}

基本信息

{/* ====================定向名称========================= */} 定向名称} name='targetingName' rules={[{ required: true, message: '请输入定向名称!' }]}> {/* ====================定向描述========================= */} 定向描述} name='description' > {/* ============================================================排期与出价============================================================= */} 人口学数学 {/* ====================地理位置========================= */} 地理位置} name='geoLocationType' style={geoLocationType === '1' ? { marginBottom: 5 } : {}}> 不限 按区域 { geoLocationType === '1' && { if (treeNode.title.includes(inputValue)) { return true } else { return false } }} /> } {/* ====================年龄========================= */} 年龄} name='ageType' style={ageType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { ageType === '1' &&
} {/* ====================性别========================= */} 性别} name='gender'> 不限 { Object.keys(GenderEnum).map(key => { return {GenderEnum[key]} }) } {/* ====================学历========================= */} 学历} name='educationType' style={educationType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { educationType === '1' && ({ label: EducationEnum[key], value: key }))} /> } {/* ====================婚恋育儿状态========================= */} 婚恋育儿状态} name='maritalStatusType' style={maritalStatusType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { maritalStatusType === '1' && ({ label: MaritalStatusEnum[key], value: key }))} /> } {/* ============================================================用户行为============================================================= */} 用户行为 {/* 行为兴趣意向} name='behaviorOrInterestType'> 不限 自定义 */} {/* ====================排除已转化用户========================= */} 排除已转化用户} name='excludedDimension' style={excludedDimension !== '0' ? { marginBottom: 5 } : {}}> 不限 { Object.keys(ExcludedDimensionEnum).map(key => { return {ExcludedDimensionEnum[key]} }) } { excludedDimension !== '0' && } {/* ============================================================自定义人群============================================================= */} {/* 自定义人群 */} {/* ====================自定义人群========================= */} {/* 自定义人群} name='customAudienceType'> 不限 自定义 */} {/* ============================================================设备定向============================================================= */} 设备定向 {/* ====================设备品牌型号========================= */} 设备品牌型号} name='deviceBrandModelType' style={deviceBrandModelType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { deviceBrandModelType === '1' && <> { if (treeNode.title.includes(inputValue)) { return true } else { return false } }} />

排除所选设备的用户 已选 400 ? { color: 'red' } : {}}>{deviceBrandModelList?.length ?? 0}/400

} {/* ====================操作系统版本========================= */} 操作系统版本} name='userOsType' style={userOsType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { userOsType === '1' && <> { let checked = e.target.checked form.setFieldsValue({ userOsIos: checked ? ios_os : [] }) setIndeterminateIos(false) }}> IOS全选 { return { label: UserOsEnum[key], value: key } }) } /> { let checked = e.target.checked form.setFieldsValue({ userOsAndroid: checked ? android_os : [] }) setIndeterminateAndroid(false) }}> Android全选 { return { label: UserOsEnum[key], value: key } }) } /> } {/* ====================联网方式========================= */} 联网方式} name='networkType' style={networkType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { networkType === '1' && ({ label: NetworkEnum[key], value: key }))} /> } {/* ====================设备价格========================= */} 设备价格} name='devicePriceType' style={devicePriceType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { devicePriceType === '1' && ({ label: DevicePriceEnum[key], value: key }))} /> } {/* ============================================================流量方数学============================================================= */} 流量方数学 {/* ====================微信再营销========================= */} 微信再营销} name='wechatAdBehaviorType' style={wechatAdBehaviorType === '1' ? { marginBottom: 5 } : {}}> 不限 自定义 { wechatAdBehaviorType === '1' && <>

再营销

({ label: WechatAdBehaviorEnum[key], value: key, disabled: excludedActions?.some((k: string) => k === key) }))} />

排除营销

({ label: WechatAdBehaviorEnum[key], value: key, disabled: actions?.some((k: string) => k === key) }))} /> }
} export default AdModal