shenwu 2 年之前
父節點
當前提交
99fb52ad49
共有 27 個文件被更改,包括 2845 次插入6760 次删除
  1. 1 0
      src/pages/launchSystemNew/components/adModal/index.tsx
  2. 0 1
      src/pages/launchSystemNew/components/targetingTooltip/index.tsx
  3. 11 0
      src/pages/launchSystemNew/launchManage/adAuthorize/index.less
  4. 52 5
      src/pages/launchSystemNew/launchManage/adAuthorize/index.tsx
  5. 26 3
      src/pages/launchSystemNew/launchManage/adAuthorize/tableConfig.tsx
  6. 83 0
      src/pages/launchSystemNew/launchManage/createAd/ad/index.tsx
  7. 354 0
      src/pages/launchSystemNew/launchManage/createAd/ad/modal/leadAd.tsx
  8. 338 0
      src/pages/launchSystemNew/launchManage/createAd/ad/modal/wechat.tsx
  9. 1 1
      src/pages/launchSystemNew/launchManage/createAd/adcreativeCol.tsx
  10. 2 1
      src/pages/launchSystemNew/launchManage/createAd/adgroupsCol.tsx
  11. 75 0
      src/pages/launchSystemNew/launchManage/createAd/creative/index.tsx
  12. 93 0
      src/pages/launchSystemNew/launchManage/createAd/creative/modal/index.less
  13. 939 0
      src/pages/launchSystemNew/launchManage/createAd/creative/modal/index.tsx
  14. 4 0
      src/pages/launchSystemNew/launchManage/createAd/index.less
  15. 36 139
      src/pages/launchSystemNew/launchManage/createAd/index.tsx
  16. 140 0
      src/pages/launchSystemNew/launchManage/createAd/targeting/index.tsx
  17. 646 0
      src/pages/launchSystemNew/launchManage/createAd/targeting/modal/index.tsx
  18. 2 2
      src/pages/launchSystemNew/launchManage/localAd/ad/index.tsx
  19. 1 1
      src/pages/launchSystemNew/launchManage/localAd/ad/modal.tsx
  20. 1 6587
      src/pages/launchSystemNew/launchManage/localAd/adenum.ts
  21. 2 2
      src/pages/launchSystemNew/launchManage/localAd/creative/index.tsx
  22. 2 2
      src/pages/launchSystemNew/launchManage/localAd/targeting/index.tsx
  23. 0 1
      src/pages/launchSystemNew/launchManage/localAd/targeting/modal.tsx
  24. 9 0
      src/services/launchAdq/adAuthorize.ts
  25. 4 1
      src/services/launchAdq/createAd.ts
  26. 13 13
      src/services/launchAdq/enum.ts
  27. 10 1
      src/services/launchAdq/global.ts

+ 1 - 0
src/pages/launchSystemNew/components/adModal/index.tsx

@@ -51,6 +51,7 @@ const AdModal: React.FC<Props> = (props) => {
     const handleOk = () => {
         if (selectedRowKeys?.length) {
             if (sysAdgroupId) {
+                console.log('sysAdgroupIdsysAdgroupId',sysAdgroupId,selectedRowKeys)
                 if (selectedRowKeys?.indexOf(sysAdgroupId) === -1) {
                     onChange && onChange(selectedRowKeys.toString())
                 } else {

+ 0 - 1
src/pages/launchSystemNew/components/targetingTooltip/index.tsx

@@ -55,7 +55,6 @@ const TargetingTooltip: React.FC<Props> = (props) => {
     const { data, geoLocationList, modelList } = props
     const [content, setContent] = useState<ContentProps>({})
     /**********************/
-
     useEffect(() => {
         if (data && geoLocationList && data?.targeting) {
             let newConten: ContentProps = {}

+ 11 - 0
src/pages/launchSystemNew/launchManage/adAuthorize/index.less

@@ -10,3 +10,14 @@
   text-overflow: ellipsis;
   white-space: nowrap;
 }
+.boxCol{
+  display: flex;
+  strong{
+    width: 25%;
+    text-align: right;
+  }
+  span{
+    color: #999;
+    width: 75%;
+  }
+}

+ 52 - 5
src/pages/launchSystemNew/launchManage/adAuthorize/index.tsx

@@ -1,22 +1,47 @@
 
 import HocError from '@/Hoc/HocError'
-import { Card, Table, Tag } from 'antd'
-import React, { useEffect } from 'react'
+import { Card, Col, Modal, Row, Table, Tag, Input, message } from 'antd'
+import React, { useCallback, useEffect, useState } from 'react'
 import { columnsMp } from './tableConfig'
 import { useModel } from 'umi'
-
+import { useAjax } from '@/Hook/useAjax'
+import { putAdAccountApi } from '@/services/launchAdq/adAuthorize'
+import style from './index.less'
 
 /** 投放管理 */
 const AdAuthorize: React.FC = () => {
     const { getAdAccount } = useModel('useLaunchAdq.useAdAuthorize')
-
+    const [remarkData, set_remarkData] = useState<{
+        visible: boolean,
+        remark: string,
+        data: any
+    }>({
+        visible: false,
+        remark: '',
+        data: null
+    })
+    const putRemark = useAjax((adAccountId: any, remark: any) => putAdAccountApi(adAccountId, remark))
     useEffect(() => {
         // 获取账号列表
         getAdAccount.run()
     }, [])
+    const remark = useCallback(() => {
+        if (remarkData.remark && remarkData.data) {
+            putRemark.run(remarkData.data.id, remarkData.remark).then(res => {
+                set_remarkData({...remarkData,visible:false,remark:'',data:null})
+                getAdAccount.refresh()
+            })
+        } else {
+            message.error('请输入备注!')
+        }
 
+    }, [getAdAccount, remarkData])
+    const edit = useCallback((data) => {
+        set_remarkData({ ...remarkData, visible: true, data,remark:data.remark})
+    }, [remarkData])
     return <Card>
-        <Table dataSource={getAdAccount?.data?.data} loading={getAdAccount?.loading} columns={columnsMp()} size="small" bordered
+        <Table dataSource={getAdAccount?.data?.data} loading={getAdAccount?.loading} columns={columnsMp(edit)} size="small" bordered
+            scroll={{ x: 2000 }}
             pagination={{
                 position: ['bottomRight'],
                 total: getAdAccount?.data?.data?.length,//总共多少条数据,服务器给,设置后分页自动计算页数
@@ -28,6 +53,28 @@ const AdAuthorize: React.FC = () => {
             }}
             rowKey={(row) => row.id}
         />
+        {remarkData.visible && <Modal
+            visible={remarkData.visible}
+            title='编辑账户'
+            onCancel={() => { set_remarkData({ ...remarkData, visible: false, data: null }) }}
+            onOk={remark}
+        >
+            <Row gutter={[20, 20]}>
+                <Col span={24} className={style.boxCol}><strong>广告主ID:</strong><span>{remarkData?.data.accountId}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>类型:</strong><span>{remarkData?.data.sourceType === 0 ? '微信' : 'QQ'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>公众号信息:</strong><span>{remarkData?.data.wechatAccountName || '无'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>企业名称:</strong><span>{remarkData?.data.corporationName || '无'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>服务商ID列表:</strong><span>{remarkData?.data.agencyIdList ? remarkData.data.agencyIdList?.join() : '无'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>行业ID:</strong><span>{remarkData?.data.systemIndustryId || '无'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>授权状态:</strong><span>{remarkData?.data.authStatus || '无'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>日限额(分):</strong><span>{remarkData?.data.dailyBudget || '无'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>授权时间:</strong><span>{remarkData?.data.createTime || '无'}</span></Col>
+                <Col span={24} className={style.boxCol}><strong>备注:</strong><span><Input.TextArea rows={5} maxLength={200} value={remarkData.remark} onChange={(e) => {
+                    let value = e.target.value
+                    set_remarkData({ ...remarkData, remark: value })
+                }} /></span></Col>
+            </Row>
+        </Modal>}
     </Card>
 }
 

+ 26 - 3
src/pages/launchSystemNew/launchManage/adAuthorize/tableConfig.tsx

@@ -1,14 +1,15 @@
-import { Tooltip } from "antd"
+import { Space, Tooltip } from "antd"
 import React from "react"
 import './index.less'
-export function columnsMp(): any {
+export function columnsMp(edit:(params: any)=>void): any {
     return [
         {
             title: 'ID',
             dataIndex: 'id',
             key: 'id',
             align: 'center',
-            width: 55
+            width: 55,
+            fixed:'left'
         },
         {
             title: '广告主ID',
@@ -16,6 +17,7 @@ export function columnsMp(): any {
             key: 'accountId',
             align: 'center',
             width: 100,
+            fixed:'left'
         },
         {
             title: '类型',
@@ -27,6 +29,14 @@ export function columnsMp(): any {
                 return <span>{a == 0 ? '微信' : 'QQ'}</span>
             }
         },
+        {
+            title: '备注',
+            dataIndex: 'remark',
+            key: 'remark',
+            align: 'center',
+            width: 200,
+            ellipsis:true,
+        },
         {
             title: '公众号信息',
             dataIndex: 'wechatAccountName',
@@ -97,5 +107,18 @@ export function columnsMp(): any {
             align: 'center',
             width: 120
         },
+        {
+            title: '操作',
+            dataIndex: 'cz',
+            key: 'cz',
+            align: 'center',
+            width: 120,
+            fixed:'right',
+            render:(a: any,b: any)=>{
+                return <Space>
+                    <a onClick={()=>{edit(b)}}>备注</a>
+                </Space>
+            }
+        },
     ]
 }

+ 83 - 0
src/pages/launchSystemNew/launchManage/createAd/ad/index.tsx

@@ -0,0 +1,83 @@
+import { CreateAdProps } from '@/services/launchAdq/createAd'
+import { Col, Empty, Space, Spin, Tooltip } from 'antd'
+import React, { useCallback, useState } from 'react'
+import style from '../index.less'
+import AdgroupsCol from "../adgroupsCol"
+import { BaseResult } from '@ahooksjs/use-request/lib/types'
+import AdModal from "../../../components/adModal"
+import WeChatAdModal from "./modal/wechat"
+import LeadAdModal from "./modal/leadAd"
+type Props = {
+    queryForm: Partial<CreateAdProps>,
+    setQueryForm: React.Dispatch<React.SetStateAction<Partial<CreateAdProps>>>,
+    getSysAdgroups: BaseResult<any, any>,
+    clearData: () => void
+}
+export interface ModalConfig {
+    visible: boolean;
+    title?: string;
+    type?: 'add' | 'look' | 'edit',
+    dataInfo?: null
+}
+function Ad(props: Props) {
+    let { queryForm, getSysAdgroups, setQueryForm, clearData } = props
+    const [adVisible, setAdVisible] = useState<boolean>(false) // 选择广告弹窗控制
+    const [adModalConfig, setAdModalConfig] = useState<ModalConfig>({//新建广告弹窗
+        visible: false,
+        type: 'add'
+    })
+    // 设置变量
+    const handleAdModalConfig = useCallback((arg: ModalConfig) => {
+        setAdModalConfig({ ...adModalConfig, ...arg })
+    }, [adModalConfig])
+    // 获取广告详情
+    const getInfo = useCallback((sysAdgroupId) => {
+        getSysAdgroups.run(sysAdgroupId).then(res => {
+            setQueryForm({ ...queryForm, sysAdgroupId: sysAdgroupId, sysAdcreativeId: undefined, sysAdgroup: res });
+            setAdVisible(false);
+            clearData()
+        })
+    }, [queryForm])
+    return <Col className={style.conRightBorder}>
+        <div className={style.top}>
+            广告基本信息
+            {queryForm.sysAdgroup && <a onClick={() => {
+                setQueryForm({ ...queryForm, sysAdgroup: undefined, sysAdgroupId: undefined, sysAdcreativeId: undefined })
+            }}>清空</a>}
+        </div>
+        <div className={style.center}>
+            <Spin spinning={getSysAdgroups.loading}>
+                <div className={style.centerContent}>
+                    {queryForm?.sysAdgroup ? <AdgroupsCol data={queryForm?.sysAdgroup} /> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
+                </div>
+            </Spin>
+        </div>
+        <div className={style.bottom}>
+            <Space size={20}>
+                {
+                    queryForm?.promotedObjectType ? <span onClick={() => { setAdVisible(true) }}>{queryForm?.sysAdgroup ? '重选广告' : '选择广告'}</span> : <Tooltip title="请先选择推广目标">
+                        <span>选择广告</span>
+                    </Tooltip>
+                }
+                {
+                    queryForm?.promotedObjectType ? <span onClick={() => { handleAdModalConfig(queryForm?.sysAdgroup ? { visible: true, type: 'edit' } : { visible: true, type: 'add' }) }}>{queryForm?.sysAdgroup ? '编辑广告' : '新建广告'}</span> : <Tooltip title="请先选择推广目标">
+                        <span>新建广告</span>
+                    </Tooltip>
+                }
+            </Space>
+        </div>
+        {/* 选择广告 */}
+        {adVisible && <AdModal visible={adVisible} onClose={() => setAdVisible(false)} promotedObjectType={queryForm.promotedObjectType as string} onChange={getInfo} sysAdgroupId={queryForm?.sysAdgroupId} />}
+        {/* 微信公众号广告弹窗 */}
+        {adModalConfig.visible && queryForm.promotedObjectType === "PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT" && <WeChatAdModal visible={adModalConfig.visible} PupFn={handleAdModalConfig} callback={(values) => {
+            setQueryForm({ ...queryForm, sysAdgroup: values, sysAdcreativeId: undefined }); setAdVisible(false); clearData()
+            handleAdModalConfig({ visible: false, dataInfo: null, type: 'add' })
+        }} type={adModalConfig.type} dataInfo={queryForm.sysAdgroup} queryForm={queryForm} />}
+        {/* 收集线索广告弹窗 */}
+        {adModalConfig.visible && queryForm.promotedObjectType === "PROMOTED_OBJECT_TYPE_LEAD_AD" && <LeadAdModal visible={adModalConfig.visible} PupFn={handleAdModalConfig} callback={(values) => {
+            setQueryForm({ ...queryForm, sysAdgroup: values, sysAdcreativeId: undefined }); setAdVisible(false); clearData()
+            handleAdModalConfig({ visible: false, dataInfo: null, type: 'add' })
+        }} type={adModalConfig.type} dataInfo={queryForm.sysAdgroup} queryForm={queryForm} />}
+    </Col>
+}
+export default Ad

+ 354 - 0
src/pages/launchSystemNew/launchManage/createAd/ad/modal/leadAd.tsx

@@ -0,0 +1,354 @@
+import React, { useCallback, useEffect, useState } from 'react'
+import { Modal, Form, Input, Divider, Select, Radio, DatePicker, Switch, Checkbox, message, Tooltip, Row, Col, Space, TimePicker, Button } from 'antd'
+import { BidModeEnum, OptimizationGoalEnum, BidStrategyEnum } from '@/services/launchAdq/enum'
+import { ModalConfig } from '../index'
+import moment from 'moment';
+import { useAjax } from '@/Hook/useAjax';
+import { getSceneTagsList } from '@/services/launchAdq/global';
+import { ExclamationCircleOutlined } from '@ant-design/icons';
+import { CreateAdProps } from '@/services/launchAdq/createAd';
+import { createSysAdgroups } from '@/services/launchAdq/localAd';
+const { RangePicker }: { RangePicker: any } = DatePicker;
+let DatePickers: any = DatePicker
+interface Props {
+    queryForm: Partial<CreateAdProps>,
+    visible: boolean,
+    PupFn: (arg: ModalConfig) => void,
+    callback: (params: any) => void,
+    confirmLoading?: boolean,
+    type?: 'add' | 'look' | 'edit',//新增,查看,编辑
+    dataInfo?: any
+}
+/**收集线索广告弹窗*/
+function LeadAdModal(props: Props) {
+    let { visible, confirmLoading, PupFn, callback, type, dataInfo, queryForm } = props
+    const createSysAdgroup = useAjax((params) => createSysAdgroups(params))
+    let arg = type === 'look' ? { footer: null } : {}
+    let [state, setState] = useState<any>({
+        isShowTime: []
+    })
+    let [template_checked, settemplate_checked] = useState<boolean>(localStorage.getItem('template_checked') === '1' || false)
+    const sceneTagsList = useAjax((params) => getSceneTagsList(params))
+    const [form] = Form.useForm();
+    let dateType = Form.useWatch('dateType', form)
+    let bidMode = Form.useWatch('bidMode', form)
+    let smartBidType = Form.useWatch('smartBidType', form)
+    let autoAcquisitionEnabled = Form.useWatch('autoAcquisitionEnabled', form)
+    let siteSet = Form.useWatch('siteSet', form)
+    let wechatPositionType = Form.useWatch('wechatPositionType', form)
+    let wechatSceneType = Form.useWatch('wechatSceneType', form)
+    let automaticSiteEnabled = Form.useWatch('automaticSiteEnabled', form)
+    let optimizationGoal = Form.useWatch('optimizationGoal', form)
+    // 确定事件
+    const handleOk = useCallback(() => {
+        form.validateFields().then(values => {
+            let newValues = JSON.parse(JSON.stringify(values))
+            newValues.sceneSpec = {}
+            if (newValues.dateType === '2') {
+                newValues['beginDate'] = moment(newValues.date).format('YYYY-MM-DD')
+            } else {
+                newValues['beginDate'] = moment(newValues.date[0]).format('YYYY-MM-DD')
+                newValues['endDate'] = moment(newValues.date[1]).format('YYYY-MM-DD')
+            }
+            if (newValues.firstDayBeginTime) {
+                console.log(newValues.firstDayBeginTime)
+                newValues['firstDayBeginTime'] = moment(newValues.firstDayBeginTime).format('HH:mm:ss')
+            }
+            Object.keys(newValues).forEach(key => {
+                switch (key) {
+                    case 'wechatPositionType':
+                        if (newValues[key] === '1') {
+                            newValues.sceneSpec = { ...newValues.sceneSpec, wechatPosition: newValues.wechatPosition }
+                        }
+                        break;
+                    case 'wechatSceneType':
+                        if (newValues[key] === '1') {
+                            newValues.sceneSpec = {
+                                ...newValues.sceneSpec, wechatScene: {
+                                    officialAccountMediaCategory: newValues.officialAccountMediaCategory,
+                                    miniProgramAndMiniGame: newValues.miniProgramAndMiniGame,
+                                    payScene: newValues.payScene
+                                }
+                            }
+                        }
+
+                        break;
+                }
+            })
+            if (newValues.sceneSpec.wechatPosition?.length === 0) {
+                delete newValues.sceneSpec.wechatPosition
+            }
+            if (newValues.sceneSpec.wechatScene) {
+                newValues.sceneSpec.wechatScene.officialAccountMediaCategory?.length === 0 && (delete newValues.sceneSpec.wechatScene.officialAccountMediaCategory)
+                newValues.sceneSpec.wechatScene.miniProgramAndMiniGame?.length === 0 && (delete newValues.sceneSpec.wechatScene.miniProgramAndMiniGame)
+                newValues.sceneSpec.wechatScene.payScene?.length === 0 && (delete newValues.sceneSpec.wechatScene.payScene)
+            }
+            if (!newValues.sceneSpec.wechatPosition && !newValues.sceneSpec.wechatScene) {
+                delete newValues.sceneSpec
+            }
+            delete newValues.officialAccountMediaCategory
+            delete newValues.miniProgramAndMiniGame
+            delete newValues.payScene
+            delete newValues.wechatPositionType
+            delete newValues.wechatPosition
+            delete newValues.wechatScene
+            delete newValues['dateType']
+            delete newValues['date']
+            newValues['timeSeries'] = Array(336).fill(1).join('')
+            newValues['promotedObjectType'] =  queryForm.promotedObjectType
+            console.log(newValues)
+
+            // 开启存为模板开关执行
+            if (template_checked && type==='add') {
+                createSysAdgroup.run(newValues).then(res => {
+                    if (res) {
+                        callback(newValues)
+                    }
+                })
+            } else {
+                callback(newValues)
+            }
+        })
+    }, [form, template_checked,queryForm,type])
+    // 场景定向
+    useEffect(() => {
+        sceneTagsList.run({ typeList: ['WECHAT_POSITION', 'OFFICIAL_ACCOUNT_MEDIA_CATEGORY', 'MINI_PROGRAM_AND_MINI_GAME', 'PAY_SCENE'] })
+    }, [])
+    // 数据回填
+    useEffect(() => {
+        if (dataInfo) {
+            form.setFieldsValue({
+                adgroupName: dataInfo?.adgroupName,//广告名称
+                promotedObjectType: dataInfo?.promotedObjectType,//推广目标
+                siteSet: dataInfo?.siteSet,//广告版位
+                autoAcquisitionEnabled: dataInfo?.autoAcquisitionEnabled,//一键起量
+                bidAmount: dataInfo?.bidAmount,//出价
+                smartBidType: dataInfo?.smartBidType,//出价类型
+                bidStrategy: dataInfo?.bidStrategy,//出价策略
+                bidMode: dataInfo?.bidMode,//出价方式
+                optimizationGoal: dataInfo?.optimizationGoal,//优化目标
+                dateType: dataInfo?.endDate ? '1' : '2',//投放日期
+                dailyBudget: dataInfo?.dailyBudget,//广告日预算
+                date: dataInfo?.endDate ? [moment(dataInfo?.beginDate), moment(dataInfo?.endDate)] : moment(dataInfo?.beginDate),//日期
+                autoAcquisitionBudget: dataInfo?.autoAcquisitionBudget,//起量预算
+                wechatPositionType: dataInfo?.sceneSpec?.wechatPosition ? '1' : '0',//微信公众号与小程序定投
+                wechatPosition: dataInfo?.sceneSpec?.wechatPosition,//微信公众号与小程序定投
+                wechatSceneType: dataInfo?.sceneSpec?.wechatScene?.officialAccountMediaCategory || dataInfo?.sceneSpec?.wechatScene?.miniProgramAndMiniGame || dataInfo?.sceneSpec?.wechatScene?.payScene ? '1' : '0',//微信公众号与小程序场景
+                officialAccountMediaCategory: dataInfo?.sceneSpec?.wechatScene?.officialAccountMediaCategory,//公众号媒体类型
+                miniProgramAndMiniGame: dataInfo?.sceneSpec?.wechatScene?.miniProgramAndMiniGame,//小程序小游戏流量类型
+                payScene: dataInfo?.sceneSpec?.wechatScene?.payScene,//订单详情页消费场景
+                firstDayBeginTime:dataInfo?.firstDayBeginTime?moment(`${dataInfo?.beginDate} ${dataInfo?.firstDayBeginTime}`) : undefined,//首日开始时间
+            })
+            if(dataInfo?.firstDayBeginTime){//存在首日开始时间,选中开关
+                setState({...state,isShowTime:['1']})
+            }
+        }
+    }, [dataInfo])
+    return <Modal
+        visible={visible}
+        title={type === 'add' ? '新建广告' : type === 'look' ? '广告详情' : '编辑广告'}
+        onCancel={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}
+        onOk={type === 'look' ? () => message.warning('详情无法改动内容') : handleOk}
+        width={900}
+        confirmLoading={createSysAdgroup?.loading}
+        footer={<Space>
+            <Button onClick={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}>取消</Button>
+            <Button type='primary' onClick={handleOk}>确定</Button>
+            {type === 'add' &&<Checkbox checked={template_checked} onChange={(e) => {
+                let checked = e.target.checked
+                settemplate_checked(checked)
+                localStorage.setItem('template_checked', checked ? '1' : '0')
+            }}>存为模板</Checkbox>}
+        </Space>}
+        {...arg}
+    >
+        <Form
+            form={form}
+            labelCol={{ span: 5 }}
+            initialValues={
+                {
+                    promotedObjectType: queryForm.promotedObjectType,
+                    siteSet: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
+                    bidMode: 'BID_MODE_OCPM',
+                    automaticSiteEnabled: false,
+                    dateType: '2',
+                    bidStrategy: 'BID_STRATEGY_AVERAGE_COST',
+                    timeSeries: '1',
+                    smartBidType: 'SMART_BID_TYPE_CUSTOM',
+                    autoAcquisitionEnabled: false,
+                    wechatSceneType: '0',
+                    wechatPositionType: '0',
+                    optimizationGoal: 'OPTIMIZATIONGOAL_ECOMMERCE_ORDER'
+                }
+            }
+        >
+            {/* ============================================================基本信息============================================================= */}
+            <Divider orientation='center'>基本信息</Divider>
+            <Form.Item label={<strong>广告名称</strong>} name='adgroupName' rules={[{ required: true, message: '请输入广告名称!' }]}>
+                <Input placeholder='广告名称' style={{ width: 300 }} />
+            </Form.Item>
+            <Form.Item label={<strong>广告版位</strong>}>
+                <Form.Item name='automaticSiteEnabled'>
+                    <Radio.Group buttonStyle="solid">
+                        <Radio.Button value={true} disabled={queryForm.promotedObjectType === 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT'}>自动版位</Radio.Button>
+                        <Radio.Button value={false}>选择特定版位</Radio.Button>
+                    </Radio.Group>
+                </Form.Item>
+                {!automaticSiteEnabled && <Form.Item name='siteSet' noStyle rules={[{ required: true, message: '请输入选择广告版位!' }]}>
+                    <Checkbox.Group style={{ width: '100%' }}>
+                        <Row>
+                            <Col span={4}>
+                                <Checkbox value="SITE_SET_MOMENTS">微信朋友圈</Checkbox>
+                            </Col>
+                            <Col span={4}>
+                                <Checkbox value="SITE_SET_MOBILE_UNION">优量汇</Checkbox>
+                            </Col>
+                            <Col span={4}>
+                                <Checkbox value="SITE_SET_TENCENT_NEWS">腾讯新闻</Checkbox>
+                            </Col>
+                            <Col span={4}>
+                                <Checkbox value="SITE_SET_TENCENT_VIDEO">腾讯视频</Checkbox>
+                            </Col>
+                            <Col span={4}>
+                                <Checkbox value="SITE_SET_KANDIAN">腾讯看点</Checkbox>
+                            </Col>
+                            <Col span={6}>
+                                <Checkbox value="SITE_SET_QQ_MUSIC_GAME">QQ、腾讯音乐及游戏</Checkbox>
+                            </Col>
+                            <Col span={6}>
+                                <Checkbox value="SITE_SET_WECHAT">微信公众号与小程序</Checkbox>
+                            </Col>
+                        </Row>
+                    </Checkbox.Group>
+                </Form.Item>}
+            </Form.Item>
+            {
+                siteSet?.some((s: string) => s === 'SITE_SET_WECHAT') && <>
+                    <Form.Item label={<strong>微信公众号与小程序定投</strong>} name='wechatPositionType' style={wechatPositionType === '1' ? { marginBottom: 5 } : {}}>
+                        <Radio.Group >
+                            <Radio.Button value="0">不限</Radio.Button>
+                            <Radio.Button value="1">自定义</Radio.Button>
+                        </Radio.Group>
+                    </Form.Item>
+                    {wechatPositionType === '1' && <Form.Item style={{ marginLeft: 177 }} name='wechatPosition'>
+                        <Checkbox.Group options={sceneTagsList?.data?.WECHAT_POSITION?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                    </Form.Item>}
+                    <Form.Item label={<strong>微信公众号与小程序场景</strong>} name='wechatSceneType' style={wechatSceneType === '1' ? { marginBottom: 5 } : {}} >
+                        <Radio.Group >
+                            <Radio.Button value="0">不限</Radio.Button>
+                            <Radio.Button value="1">自定义</Radio.Button>
+                        </Radio.Group>
+                    </Form.Item>
+                    {wechatSceneType === '1' && <>
+                        <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>公众号媒体类型</strong></p>
+                        <Form.Item style={{ marginLeft: 177 }} name='officialAccountMediaCategory'>
+                            <Checkbox.Group options={sceneTagsList?.data?.OFFICIAL_ACCOUNT_MEDIA_CATEGORY?.filter((i: { description: string; }) => i.description !== '不限')?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                        </Form.Item>
+                        <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>小程序小游戏流量类型</strong></p>
+                        <Form.Item style={{ marginLeft: 177 }} name='miniProgramAndMiniGame'>
+                            <Checkbox.Group options={sceneTagsList?.data?.MINI_PROGRAM_AND_MINI_GAME?.filter((i: { description: string; }) => i.description !== '不限')?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                        </Form.Item>
+                        <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>订单详情页消费场景</strong></p>
+                        <Form.Item style={{ marginLeft: 177 }} name='payScene'>
+                            <Checkbox.Group options={sceneTagsList?.data?.PAY_SCENE?.filter((i: { description: string; }) => i.description !== '不限')?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                        </Form.Item>
+                    </>}
+                </>
+            }
+            {/* ============================================================排期与出价============================================================= */}
+            <Divider orientation='center'>排期与出价</Divider>
+            <Form.Item label={<strong>投放日期</strong>} name='dateType'>
+                <Radio.Group >
+                    <Radio.Button value="1">选择开始与结束日期</Radio.Button>
+                    <Radio.Button value="2">长期投放</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {/* 投放日期的不同展示不同的日期选择 */}
+            {
+                dateType === '1' ? <Form.Item name='date' rules={[{ required: true, message: '请选择日期' }]}>
+                    <RangePicker style={{ marginLeft: 177 }}></RangePicker>
+                </Form.Item> : <Form.Item name='date' style={{ marginLeft: 177 }} rules={[{ required: true, message: '请选择日期' }]}>
+                    <DatePickers />
+                </Form.Item>
+            }
+            <Form.Item label={<strong>投放时段</strong>}>
+                <Space>
+                    <Radio.Group name='timeSeries' defaultValue='1'>
+                        <Radio.Button value={'1'}>全天投放</Radio.Button>
+                    </Radio.Group>
+                    <Checkbox.Group options={[{ label: '指定首日开始投放时间', value: '1' }]} onChange={(checkedValue) => {
+                        setState({ ...state, isShowTime: checkedValue })
+                    }
+                    } value={state.isShowTime} />
+                </Space>
+                {state?.isShowTime?.length > 0 && <Form.Item name='firstDayBeginTime' noStyle rules={[{ required: true, message: '请选择时间' }]}>
+                    <TimePicker />
+                </Form.Item>}
+            </Form.Item>
+            <Form.Item label={<strong>出价方式<Tooltip title='出价方式不同将影响自定义人群,行为兴趣意向等某些功能无法使用'><ExclamationCircleOutlined style={{ color: '#e91e63', marginLeft: 5 }} /></Tooltip></strong>} name='bidMode'>
+                <Radio.Group >
+                    {
+                        Object.keys(BidModeEnum).map(key => {
+                            return <Radio.Button value={key} key={key} >{BidModeEnum[key]}</Radio.Button>
+                        })
+                    }
+
+                </Radio.Group>
+            </Form.Item>
+            {/* 出价方式为OCPM才展示 */}
+            {
+                (bidMode === 'BID_MODE_OCPM' || bidMode === 'BID_MODE_OCPC') && <>
+                    <Form.Item label={<strong>优化目标</strong>} name='optimizationGoal' rules={[{ required: true, message: '请选择优化目标' }]}>
+                        <Select style={{ width: 300 }} showSearch filterOption={(input, option) =>
+                            (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                        } allowClear>
+                            {
+                                Object.keys(OptimizationGoalEnum).map(key => {
+                                    return <Select.Option value={key} key={key}>{OptimizationGoalEnum[key]}</Select.Option>
+                                })
+                            }
+                        </Select>
+                    </Form.Item>
+                    <Form.Item label={<strong>出价类型</strong>} name='smartBidType'>
+                        <Radio.Group >
+                            <Radio.Button value="SMART_BID_TYPE_CUSTOM">手动出价</Radio.Button>
+                            <Radio.Button value="SMART_BID_TYPE_SYSTEMATIC">自动出价</Radio.Button>
+                        </Radio.Group>
+                    </Form.Item>
+                    <Form.Item label={<strong>出价策略</strong>} name='bidStrategy'>
+                        <Radio.Group >
+                            {
+                                Object.keys(BidStrategyEnum).map(key => {
+                                    return <Radio.Button value={key} key={key} disabled={smartBidType === 'SMART_BID_TYPE_SYSTEMATIC' && key === 'BID_STRATEGY_PRIORITY_CAP_COST'}> {BidStrategyEnum[key]}</Radio.Button>
+                                })
+                            }
+                        </Radio.Group>
+                    </Form.Item>
+                </>
+            }
+            {/* 出价类型为手动出价才展示 */}
+            {
+                smartBidType !== 'SMART_BID_TYPE_SYSTEMATIC' && <>
+                    <Form.Item label={<strong>出价</strong>} name='bidAmount' rules={[{ required: true, message: '请输入价格' }]}>
+                        <Input placeholder={`输入价格 元/${bidMode === 'BID_MODE_CPM' ? '千次曝光' : bidMode === 'BID_MODE_CPC' ? '点击' : OptimizationGoalEnum[optimizationGoal]}`} style={{ width: 300 }} />
+                    </Form.Item>
+                    {/* 当版位选择大于1时才出现 */}
+                    {/* {siteSet?.length > 1 &&<Form.Item label={<strong>分版位出价</strong>} name='bidAdjustment'>
+                        <Switch checkedChildren="开启" unCheckedChildren="关闭" />
+                    </Form.Item>} */}
+                    <Form.Item label={<strong>一键起量</strong>} name='autoAcquisitionEnabled' valuePropName="checked">
+                        <Switch checkedChildren="开启" unCheckedChildren="关闭" />
+                    </Form.Item>
+                    {/* 一键起量开启时才出现 */}
+                    {autoAcquisitionEnabled && <Form.Item label={<strong>起量预算</strong>} name='autoAcquisitionBudget' rules={[{ required: true, message: '请输入起量预算' }]}>
+                        <Input placeholder='起量预算' style={{ width: 300 }} />
+                    </Form.Item>}
+                </>
+            }
+            <Form.Item label={<strong>广告日预算</strong>} name='dailyBudget'>
+                <Input placeholder='不填默认为不限' style={{ width: 300 }} />
+            </Form.Item>
+        </Form>
+    </Modal >
+}
+export default LeadAdModal

+ 338 - 0
src/pages/launchSystemNew/launchManage/createAd/ad/modal/wechat.tsx

@@ -0,0 +1,338 @@
+import React, { useCallback, useEffect, useState } from 'react'
+import { Modal, Form, Input, Divider, Select, Radio, DatePicker, Switch, Checkbox, message, Tooltip, Row, Col, Space, TimePicker, Button } from 'antd'
+import { BidModeEnum, OptimizationGoalEnum, BidStrategyEnum } from '@/services/launchAdq/enum'
+import { ModalConfig } from '../index'
+import moment from 'moment';
+import { useAjax } from '@/Hook/useAjax';
+import { getSceneTagsList } from '@/services/launchAdq/global';
+import { ExclamationCircleOutlined } from '@ant-design/icons';
+import { CreateAdProps } from '@/services/launchAdq/createAd';
+import { createSysAdgroups } from '@/services/launchAdq/localAd';
+const { RangePicker }: { RangePicker: any } = DatePicker;
+let DatePickers: any = DatePicker
+interface Props {
+    queryForm: Partial<CreateAdProps>,
+    visible: boolean,
+    PupFn: (arg: ModalConfig) => void,
+    callback: (params: any) => void,
+    confirmLoading?: boolean,
+    type?: 'add' | 'look' | 'edit',//新增,查看,编辑
+    dataInfo?: any
+}
+/**微信公众号广告弹窗*/
+function WeChatAdModal(props: Props) {
+    let { visible, confirmLoading, PupFn, callback, type, dataInfo, queryForm } = props
+    const createSysAdgroup = useAjax((params) => createSysAdgroups(params))
+    let [state, setState] = useState<any>({
+        isShowTime: []
+    })
+    let [template_checked, settemplate_checked] = useState<boolean>(localStorage.getItem('template_checked') === '1' || false)
+    let arg = type === 'look' ? { footer: null } : {}
+    const sceneTagsList = useAjax((params) => getSceneTagsList(params))
+    const [form] = Form.useForm();
+    let dateType = Form.useWatch('dateType', form)
+    let bidMode = Form.useWatch('bidMode', form)
+    let smartBidType = Form.useWatch('smartBidType', form)
+    let autoAcquisitionEnabled = Form.useWatch('autoAcquisitionEnabled', form)
+    let siteSet = Form.useWatch('siteSet', form)
+    let wechatPositionType = Form.useWatch('wechatPositionType', form)
+    let wechatSceneType = Form.useWatch('wechatSceneType', form)
+    let automaticSiteEnabled = Form.useWatch('automaticSiteEnabled', form)
+    let optimizationGoal = Form.useWatch('optimizationGoal', form)
+
+    // 确定事件
+    const handleOk = useCallback(() => {
+        form.validateFields().then(values => {
+            let newValues = JSON.parse(JSON.stringify(values))
+            newValues.sceneSpec = {}
+            if (newValues.dateType === '2') {
+                newValues['beginDate'] = moment(newValues.date).format('YYYY-MM-DD')
+            } else {
+                newValues['beginDate'] = moment(newValues.date[0]).format('YYYY-MM-DD')
+                newValues['endDate'] = moment(newValues.date[1]).format('YYYY-MM-DD')
+            }
+            if (newValues.firstDayBeginTime) {
+                newValues['firstDayBeginTime'] = moment(newValues.firstDayBeginTime).format('HH:mm:ss')
+            }
+            Object.keys(newValues).forEach(key => {
+                switch (key) {
+                    case 'wechatPositionType':
+                        if (newValues[key] === '1') {
+                            newValues.sceneSpec = { ...newValues.sceneSpec, wechatPosition: newValues.wechatPosition }
+                        }
+                        break;
+                    case 'wechatSceneType':
+                        if (newValues[key] === '1') {
+                            newValues.sceneSpec = {
+                                ...newValues.sceneSpec, wechatScene: {
+                                    officialAccountMediaCategory: newValues.officialAccountMediaCategory,
+                                    miniProgramAndMiniGame: newValues.miniProgramAndMiniGame,
+                                    payScene: newValues.payScene
+                                }
+                            }
+                        }
+
+                        break;
+                }
+            })
+            if (newValues.sceneSpec.wechatPosition?.length === 0) {
+                delete newValues.sceneSpec.wechatPosition
+            }
+            if (newValues.sceneSpec.wechatScene) {
+                newValues.sceneSpec.wechatScene.officialAccountMediaCategory?.length === 0 && (delete newValues.sceneSpec.wechatScene.officialAccountMediaCategory)
+                newValues.sceneSpec.wechatScene.miniProgramAndMiniGame?.length === 0 && (delete newValues.sceneSpec.wechatScene.miniProgramAndMiniGame)
+                newValues.sceneSpec.wechatScene.payScene?.length === 0 && (delete newValues.sceneSpec.wechatScene.payScene)
+            }
+            if (!newValues.sceneSpec.wechatPosition && !newValues.sceneSpec.wechatScene) {
+                delete newValues.sceneSpec
+            }
+            delete newValues.officialAccountMediaCategory
+            delete newValues.miniProgramAndMiniGame
+            delete newValues.payScene
+            delete newValues.wechatPositionType
+            delete newValues.wechatPosition
+            delete newValues.wechatScene
+            delete newValues['dateType']
+            delete newValues['date']
+            newValues['timeSeries'] = Array(336).fill(1).join('')
+            newValues['promotedObjectType'] = queryForm.promotedObjectType
+            console.log(newValues)
+            // 开启存为模板开关执行
+            if (template_checked && type === 'add') {
+                createSysAdgroup.run(newValues).then(res => {
+                    if (res) {
+                        callback(newValues)
+                    }
+                })
+            } else {
+                callback(newValues)
+            }
+        })
+    }, [form, template_checked, queryForm,type])
+    // 场景定向
+    useEffect(() => {
+        sceneTagsList.run({ typeList: ['WECHAT_POSITION', 'OFFICIAL_ACCOUNT_MEDIA_CATEGORY', 'MINI_PROGRAM_AND_MINI_GAME', 'PAY_SCENE'] })
+    }, [])
+    // 数据回填
+    useEffect(() => {
+        if (dataInfo) {
+            form.setFieldsValue({
+                adgroupName: dataInfo?.adgroupName,//广告名称
+                promotedObjectType: dataInfo?.promotedObjectType,//推广目标
+                siteSet: dataInfo?.siteSet,//广告版位
+                autoAcquisitionEnabled: dataInfo?.autoAcquisitionEnabled,//一键起量
+                bidAmount: dataInfo?.bidAmount,//出价
+                smartBidType: dataInfo?.smartBidType,//出价类型
+                bidStrategy: dataInfo?.bidStrategy,//出价策略
+                bidMode: dataInfo?.bidMode,//出价方式
+                optimizationGoal: dataInfo?.optimizationGoal,//优化目标
+                dateType: dataInfo?.endDate ? '1' : '2',//投放日期
+                dailyBudget: dataInfo?.dailyBudget,//广告日预算
+                date: dataInfo?.endDate ? [moment(dataInfo?.beginDate), moment(dataInfo?.endDate)] : moment(dataInfo?.beginDate),//日期
+                autoAcquisitionBudget: dataInfo?.autoAcquisitionBudget,//起量预算
+                wechatPositionType: dataInfo?.sceneSpec?.wechatPosition ? '1' : '0',//微信公众号与小程序定投
+                wechatPosition: dataInfo?.sceneSpec?.wechatPosition,//微信公众号与小程序定投
+                wechatSceneType: dataInfo?.sceneSpec?.wechatScene?.officialAccountMediaCategory || dataInfo?.sceneSpec?.wechatScene?.miniProgramAndMiniGame || dataInfo?.sceneSpec?.wechatScene?.payScene ? '1' : '0',//微信公众号与小程序场景
+                officialAccountMediaCategory: dataInfo?.sceneSpec?.wechatScene?.officialAccountMediaCategory,//公众号媒体类型
+                miniProgramAndMiniGame: dataInfo?.sceneSpec?.wechatScene?.miniProgramAndMiniGame,//小程序小游戏流量类型
+                payScene: dataInfo?.sceneSpec?.wechatScene?.payScene,//订单详情页消费场景
+                firstDayBeginTime:dataInfo?.firstDayBeginTime?moment(`${dataInfo?.beginDate} ${dataInfo?.firstDayBeginTime}`) : undefined,//首日开始时间
+            })
+            if(dataInfo?.firstDayBeginTime){//存在首日开始时间,选中开关
+                setState({...state,isShowTime:['1']})
+            }
+        }
+    }, [dataInfo])
+    return <Modal
+        visible={visible}
+        title={type === 'add' ? '新建广告' : type === 'look' ? '广告详情' : '编辑广告'}
+        onCancel={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}
+        // onOk={ handleOk}
+        width={900}
+        confirmLoading={createSysAdgroup?.loading}
+        footer={<Space>
+            <Button onClick={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}>取消</Button>
+            <Button type='primary' onClick={handleOk}>确定</Button>
+            {type === 'add' && <Checkbox checked={template_checked} onChange={(e) => {
+                let checked = e.target.checked
+                settemplate_checked(checked)
+                localStorage.setItem('template_checked', checked ? '1' : '0')
+            }}>存为模板</Checkbox>}
+        </Space>}
+        {...arg}
+    >
+        <Form
+            form={form}
+            labelCol={{ span: 5 }}
+            initialValues={
+                {
+                    promotedObjectType: queryForm.promotedObjectType,
+                    siteSet: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
+                    bidMode: 'BID_MODE_OCPM',
+                    automaticSiteEnabled: false,
+                    dateType: '2',
+                    bidStrategy: 'BID_STRATEGY_AVERAGE_COST',
+                    timeSeries: '1',
+                    smartBidType: 'SMART_BID_TYPE_CUSTOM',
+                    autoAcquisitionEnabled: false,
+                    wechatSceneType: '0',
+                    wechatPositionType: '0',
+                    optimizationGoal: 'OPTIMIZATIONGOAL_ECOMMERCE_ORDER'
+                }
+            }
+        >
+            {/* ============================================================基本信息============================================================= */}
+            <Divider orientation='center'>基本信息</Divider>
+            <Form.Item label={<strong>广告名称</strong>} name='adgroupName' rules={[{ required: true, message: '请输入广告名称!' }]}>
+                <Input placeholder='广告名称' style={{ width: 300 }} />
+            </Form.Item>
+            <Form.Item label={<strong>广告版位</strong>}>
+                <Form.Item name='automaticSiteEnabled'>
+                    <Radio.Group buttonStyle="solid">
+                        <Radio.Button value={true} disabled={queryForm.promotedObjectType === 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT'}>自动版位</Radio.Button>
+                        <Radio.Button value={false}>选择特定版位</Radio.Button>
+                    </Radio.Group>
+                </Form.Item>
+                {!automaticSiteEnabled && <Form.Item name='siteSet' noStyle rules={[{ required: true, message: '请输入选择广告版位!' }]}>
+                    <Checkbox.Group style={{ width: '100%' }}>
+                        <Row>
+                            <Col span={5}>
+                                <Checkbox value="SITE_SET_MOMENTS">微信朋友圈</Checkbox>
+                            </Col>
+                            <Col span={6}>
+                                <Checkbox value="SITE_SET_WECHAT">微信公众号与小程序</Checkbox>
+                            </Col>
+                        </Row>
+                    </Checkbox.Group>
+                </Form.Item>}
+            </Form.Item>
+            {
+                siteSet?.some((s: string) => s === 'SITE_SET_WECHAT') && <>
+                    <Form.Item label={<strong>微信公众号与小程序定投</strong>} name='wechatPositionType' style={wechatPositionType === '1' ? { marginBottom: 5 } : {}}>
+                        <Radio.Group >
+                            <Radio.Button value="0">不限</Radio.Button>
+                            <Radio.Button value="1">自定义</Radio.Button>
+                        </Radio.Group>
+                    </Form.Item>
+                    {wechatPositionType === '1' && <Form.Item style={{ marginLeft: 177 }} name='wechatPosition'>
+                        <Checkbox.Group options={sceneTagsList?.data?.WECHAT_POSITION?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                    </Form.Item>}
+                    <Form.Item label={<strong>微信公众号与小程序场景</strong>} name='wechatSceneType' style={wechatSceneType === '1' ? { marginBottom: 5 } : {}} >
+                        <Radio.Group >
+                            <Radio.Button value="0">不限</Radio.Button>
+                            <Radio.Button value="1">自定义</Radio.Button>
+                        </Radio.Group>
+                    </Form.Item>
+                    {wechatSceneType === '1' && <>
+                        <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>公众号媒体类型</strong></p>
+                        <Form.Item style={{ marginLeft: 177 }} name='officialAccountMediaCategory'>
+                            <Checkbox.Group options={sceneTagsList?.data?.OFFICIAL_ACCOUNT_MEDIA_CATEGORY?.filter((i: { description: string; }) => i.description !== '不限')?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                        </Form.Item>
+                        <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>小程序小游戏流量类型</strong></p>
+                        <Form.Item style={{ marginLeft: 177 }} name='miniProgramAndMiniGame'>
+                            <Checkbox.Group options={sceneTagsList?.data?.MINI_PROGRAM_AND_MINI_GAME?.filter((i: { description: string; }) => i.description !== '不限')?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                        </Form.Item>
+                        <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>订单详情页消费场景</strong></p>
+                        <Form.Item style={{ marginLeft: 177 }} name='payScene'>
+                            <Checkbox.Group options={sceneTagsList?.data?.PAY_SCENE?.filter((i: { description: string; }) => i.description !== '不限')?.map((item: { description: any; id: any; }) => ({ label: item.description, value: item.id }))} />
+                        </Form.Item>
+                    </>}
+                </>
+            }
+            {/* ============================================================排期与出价============================================================= */}
+            <Divider orientation='center'>排期与出价</Divider>
+            <Form.Item label={<strong>投放日期</strong>} name='dateType'>
+                <Radio.Group >
+                    <Radio.Button value="1">选择开始与结束日期</Radio.Button>
+                    <Radio.Button value="2">长期投放</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {/* 投放日期的不同展示不同的日期选择 */}
+            {
+                dateType === '1' ? <Form.Item name='date' rules={[{ required: true, message: '请选择日期' }]}>
+                    <RangePicker style={{ marginLeft: 177 }}></RangePicker>
+                </Form.Item> : <Form.Item name='date' style={{ marginLeft: 177 }} rules={[{ required: true, message: '请选择日期' }]}>
+                    <DatePickers />
+                </Form.Item>
+            }
+            <Form.Item label={<strong>投放时段</strong>}>
+                <Space>
+                    <Radio.Group name='timeSeries' defaultValue='1'>
+                        <Radio.Button value={'1'}>全天投放</Radio.Button>
+                    </Radio.Group>
+                    <Checkbox.Group options={[{ label: '指定首日开始投放时间', value: '1' }]} onChange={(checkedValue) => {
+                        setState({ ...state, isShowTime: checkedValue })
+                    }
+                    } value={state.isShowTime} />
+                </Space>
+                {state?.isShowTime?.length > 0 && <Form.Item name='firstDayBeginTime' noStyle rules={[{ required: true, message: '请选择时间' }]}>
+                    <TimePicker />
+                </Form.Item>}
+            </Form.Item>
+            <Form.Item label={<strong>出价方式<Tooltip title='出价方式不同将影响自定义人群,行为兴趣意向等某些功能无法使用'><ExclamationCircleOutlined style={{ color: '#e91e63', marginLeft: 5 }} /></Tooltip></strong>} name='bidMode'>
+                <Radio.Group >
+                    {
+                        Object.keys(BidModeEnum).map(key => {
+                            return <Radio.Button value={key} key={key} disabled={!key.includes('CPM')}>{BidModeEnum[key]}</Radio.Button>
+                        })
+                    }
+
+                </Radio.Group>
+            </Form.Item>
+            {/* 出价方式为OCPM才展示 */}
+            {
+                bidMode === 'BID_MODE_OCPM' && <>
+                    <Form.Item label={<strong>优化目标</strong>} name='optimizationGoal' rules={[{ required: true, message: '请选择优化目标' }]}>
+                        <Select style={{ width: 300 }} showSearch filterOption={(input, option) =>
+                            (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                        } allowClear>
+                            {
+                                Object.keys(OptimizationGoalEnum).map(key => {
+                                    return <Select.Option value={key} key={key}>{OptimizationGoalEnum[key]}</Select.Option>
+                                })
+                            }
+                        </Select>
+                    </Form.Item>
+                    <Form.Item label={<strong>出价类型</strong>} name='smartBidType'>
+                        <Radio.Group >
+                            <Radio.Button value="SMART_BID_TYPE_CUSTOM">手动出价</Radio.Button>
+                            <Radio.Button value="SMART_BID_TYPE_SYSTEMATIC">自动出价</Radio.Button>
+                        </Radio.Group>
+                    </Form.Item>
+                    <Form.Item label={<strong>出价策略</strong>} name='bidStrategy'>
+                        <Radio.Group >
+                            {
+                                Object.keys(BidStrategyEnum).map(key => {
+                                    return <Radio.Button value={key} key={key} disabled={smartBidType === 'SMART_BID_TYPE_SYSTEMATIC' && key === 'BID_STRATEGY_PRIORITY_CAP_COST'}> {BidStrategyEnum[key]}</Radio.Button>
+                                })
+                            }
+                        </Radio.Group>
+                    </Form.Item>
+                </>
+            }
+            {/* 出价类型为手动出价才展示 */}
+            {
+                smartBidType !== 'SMART_BID_TYPE_SYSTEMATIC' && <>
+                    <Form.Item label={<strong>出价</strong>} name='bidAmount' rules={[{ required: true, message: '请输入价格' }]}>
+                        <Input placeholder={`输入价格 元/${bidMode === 'BID_MODE_CPM' ? '千次曝光' : bidMode === 'BID_MODE_CPC' ? '点击' : OptimizationGoalEnum[optimizationGoal]}`} style={{ width: 300 }} />
+                    </Form.Item>
+                    {/* 当版位选择大于1时才出现 */}
+                    {/* {siteSet?.length > 1 &&<Form.Item label={<strong>分版位出价</strong>} name='bidAdjustment'>
+                        <Switch checkedChildren="开启" unCheckedChildren="关闭" />
+                    </Form.Item>} */}
+                    <Form.Item label={<strong>一键起量</strong>} name='autoAcquisitionEnabled' valuePropName="checked">
+                        <Switch checkedChildren="开启" unCheckedChildren="关闭" />
+                    </Form.Item>
+                    {/* 一键起量开启时才出现 */}
+                    {autoAcquisitionEnabled && <Form.Item label={<strong>起量预算</strong>} name='autoAcquisitionBudget' rules={[{ required: true, message: '请输入起量预算' }]}>
+                        <Input placeholder='起量预算' style={{ width: 300 }} />
+                    </Form.Item>}
+                </>
+            }
+            <Form.Item label={<strong>广告日预算</strong>} name='dailyBudget'>
+                <Input placeholder='不填默认为不限' style={{ width: 300 }} />
+            </Form.Item>
+        </Form>
+    </Modal >
+}
+export default WeChatAdModal

+ 1 - 1
src/pages/launchSystemNew/launchManage/createAd/adcreativeCol.tsx

@@ -46,7 +46,7 @@ const AdcreativeCol: React.FC<Props> = (props) => {
         <div>创意形式: <span>{adcreativeTemplate?.find((item: any) => item?.adcreativeTemplateId === adcreativeTemplateId)?.adcreativeTemplateAppellation || ''}</span></div>
         {adcreativeElements?.description && <div>创意文案: <span>{adcreativeElements?.description}</span></div>}
         {adcreativeElements?.title && <div>文案: <span>{adcreativeElements?.title}</span></div>}
-        {adcreativeElements?.imageUrl && <div style={{ display: 'flex', alignItems: 'flex-start' }}>创意素材: <Image width={80} src={adcreativeElements?.imageUrl} style={{ borderRadius: 8, overflow: 'hidden', marginLeft: 5 }} /></div>}
+        {adcreativeElements?.imageUrl && <div style={{ display: 'flex', alignItems: 'flex-start',marginBottom:4 }}>创意素材: <Image width={80} src={adcreativeElements?.imageUrl} style={{ borderRadius: 8, overflow: 'hidden', marginLeft: 5 }} /></div>}
         {adcreativeElements?.imageUrlList && <div style={{ display: 'flex', alignItems: 'flex-start', flexWrap: 'wrap' }}><span style={{ marginRight: 4 }}>创意素材:</span> <Image.PreviewGroup>
             <Space wrap>
                 {adcreativeElements?.imageUrlList?.map((url: string, index: number) => <Image width={50} src={url} style={{ borderRadius: 4 }} key={'TOP_SLIDER' + index} />)}

+ 2 - 1
src/pages/launchSystemNew/launchManage/createAd/adgroupsCol.tsx

@@ -13,7 +13,7 @@ const AdgroupsCol = React.forwardRef((props: Props, ref) => {
 
     /*************************/
     const { data } = props
-    const { adgroupName, promotedObjectType, siteSet, endDate, beginDate, bidMode, optimizationGoal, smartBidType, bidStrategy, bidAmount, dailyBudget } = data
+    const { adgroupName, promotedObjectType, siteSet, endDate, beginDate, bidMode, optimizationGoal, smartBidType, bidStrategy, bidAmount, dailyBudget ,firstDayBeginTime} = data
     /*************************/
 
     return <>
@@ -21,6 +21,7 @@ const AdgroupsCol = React.forwardRef((props: Props, ref) => {
         <div>推广目标: <span>{PromotedObjectType[promotedObjectType]}</span></div>
         <div>广告版位: <span>{siteSet?.map((item: string) => SiteSetEnum[item]).toString()}</span></div>
         <div>投放日期: <span>{endDate ? beginDate + '~' + endDate : beginDate + '~' + '长期投放'}</span></div>
+        {firstDayBeginTime && <div>首日时间: <span>{firstDayBeginTime}</span></div>}
         <div>出价方式: <span>{BidModeEnum[bidMode]}</span></div>
         {optimizationGoal && <div>优化目标: <span>{OptimizationGoalEnum[optimizationGoal]}</span></div>}
         <div>出价类型: <span>{smartBidType === 'SMART_BID_TYPE_CUSTOM' ? '手动出价' : '自动出价'}</span></div>

+ 75 - 0
src/pages/launchSystemNew/launchManage/createAd/creative/index.tsx

@@ -0,0 +1,75 @@
+import React, { useCallback, useState } from 'react'
+import { Button, Col, Space, Spin, Tooltip, } from 'antd'
+import style from '../index.less'
+import CreativeModal from "../../../components/creativeModal"
+import { CreateAdProps } from '@/services/launchAdq/createAd'
+import { BaseResult } from '@ahooksjs/use-request/lib/types'
+import { ModalConfig } from '../ad'
+import AdcreativeCol from "../adcreativeCol"
+import CreativePup from './modal'
+
+type Props = {
+    queryForm: Partial<CreateAdProps>,
+    setQueryForm: React.Dispatch<React.SetStateAction<Partial<CreateAdProps>>>,
+    getSysAdgroups: BaseResult<any, any>,
+    getSysAdcreative: BaseResult<any, any>,
+    clearData: () => void,
+}
+function Creative(props: Props) {
+    let { queryForm, getSysAdgroups, getSysAdcreative, setQueryForm, clearData } = props
+    const [adModalConfig, setAdModalConfig] = useState<ModalConfig>({//新建广告弹窗
+        visible: false,
+        type: 'add'
+    })
+    const [creativeVisible, setCreativeVisible] = useState<boolean>(false) // 选择创意弹窗控制
+
+    // 设置变量
+    const handleAdModalConfig = useCallback((arg: ModalConfig) => {
+        setAdModalConfig({ ...adModalConfig, ...arg })
+    }, [adModalConfig])
+
+    // 获取创意详情
+    const getInfo = useCallback((sysAdcreativeId) => {
+        getSysAdcreative.run(sysAdcreativeId).then(res => {
+            setQueryForm({ ...queryForm, sysAdcreativeId, sysAdcreative: res });
+            setCreativeVisible(false);
+            clearData()
+        })
+    }, [queryForm])
+    return <Col span={12} className={style.conRightBorder}>
+        <div className={style.top}>创意基本信息
+            {queryForm.sysAdcreative && <a onClick={() => {
+                setQueryForm({ ...queryForm, sysAdcreative: undefined, sysAdcreativeId: undefined })
+            }}>清空</a>}
+        </div>
+        <div className={style.center}>
+            <Spin spinning={getSysAdcreative.loading}>
+                <div className={style.centerContent}>
+                    {(queryForm?.sysAdcreative && queryForm?.sysAdcreativeId) && <AdcreativeCol data={queryForm?.sysAdcreative} />}
+                </div>
+            </Spin>
+        </div>
+        <div className={style.bottom}>
+            <Space size={20}>
+                {queryForm?.sysAdgroup ? <>
+                    <span onClick={() => { setCreativeVisible(true) }}>{queryForm?.sysAdcreative ? '重选创意' : '选择创意'}</span>
+                </> : <Tooltip title="请先设置广告">
+                    <span>选择创意</span>
+                </Tooltip>}
+                {queryForm?.sysAdgroup ? <>
+                    <span onClick={() => { handleAdModalConfig(queryForm?.sysAdcreative ? { visible: true, type: 'edit' } : { visible: true, type: 'add' }) }}>{queryForm?.sysAdcreative ? '编辑创意' : '新建创意'}</span>
+                </> : <Tooltip title="请先设置广告">
+                    <span>新建创意</span>
+                </Tooltip>}
+            </Space>
+        </div>
+        {/* 选择创意 */}
+        {creativeVisible && <CreativeModal siteSet={getSysAdgroups?.data?.siteSet} visible={creativeVisible} onClose={() => setCreativeVisible(false)} onChange={getInfo} sysAdcreativeId={queryForm?.sysAdcreativeId} promotedObjectType={queryForm.promotedObjectType as string} />}
+        {/* 创建创意 */}
+        {adModalConfig.visible && <CreativePup visible={adModalConfig.visible} type={adModalConfig.type} PupFn={handleAdModalConfig} callback={(values: any) => {
+            setQueryForm({ ...queryForm, sysTargeting: values, }); setCreativeVisible(false); clearData();
+            handleAdModalConfig({ visible: false, dataInfo: null, type: 'add' })
+        }} dataInfo={queryForm.sysAdcreative} queryForm={queryForm} />}
+    </Col>
+}
+export default Creative

+ 93 - 0
src/pages/launchSystemNew/launchManage/createAd/creative/modal/index.less

@@ -0,0 +1,93 @@
+.adcreative_template{
+    width: 100%;
+    overflow-y: auto;
+    display: flex;
+    height: 173px;
+    >label{
+        height: 100%;
+        margin-right: 15px;
+    }
+}
+.videoImgs{
+    width: 100%;
+    overflow-y: auto;
+    display: flex;
+    img{
+        width: 100%;
+    }
+    label{
+        height: 100%;
+        padding: 0;
+        width: 32%;
+        margin-right: 1%;
+    }
+}
+.adcreative_template_item{
+    width: 150px;
+    height: 160px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-flow: column;
+}
+
+.video{
+  
+}
+.box {
+    width: 60%;
+    height: 200px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background-color: #f5f7fa;
+    flex-direction: column;
+    color: rgba(0,0,0,.3);
+    border-radius: 5px;
+    >p{
+        display: flex;
+        align-items: center;
+        flex-flow: column;
+        font-size: 10px;
+        cursor: pointer;
+        max-height: 150px;
+        margin-bottom:0;
+        img{
+            height: 100%;
+        }
+        video{
+            height: 100%;
+        }
+    }
+}
+
+.image_list{
+    flex-flow: row wrap;
+    background-color: transparent;
+    height:auto;
+    justify-content: flex-start;
+    >p{
+        width: 150px;
+        background-color: #f5f7fa;
+        height: 150px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border: 1px solid #e6e8ed;
+        margin: 0;
+    }
+}
+.crt{
+    display: inline-flex;
+    align-items: center;
+    width: auto;
+    margin-left: 8px;
+    padding: 1px 4px;
+    height: 16px;
+    border-radius: 3px;
+    font-size: 12px;
+    color: #fff;
+    border: 1px solid #296bef;
+    background-color: #296bef;
+    line-height: normal;
+}

+ 939 - 0
src/pages/launchSystemNew/launchManage/createAd/creative/modal/index.tsx

@@ -0,0 +1,939 @@
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { Modal, Form, Input, Divider, Select, Radio, Switch, Spin, List, Checkbox, Space, Button, message ,Image} from 'antd'
+import { SiteSetEnum, PromotedObjectType } from '@/services/launchAdq/enum'
+import styles from './index.less'
+import { useAjax } from '@/Hook/useAjax'
+import { getText, get_adcreative_template, get_adcreative_template_list, get_tools_video_capture } from '@/services/launchAdq/global'
+import { AdcreativeTemplate, AdcreativeTemplateList } from '@/services/launchAdq'
+import { mySet } from '@/utils/arrFn'
+import SelectCloud from '@/pages/launchSystemNew/components/selectCloud'
+import { useModel } from '@/.umi/plugin-model/useModel'
+import { ModalConfig } from '../../ad';
+import { outAdcreativeTemplateIdFun } from '../../../localAd/adenum'
+import { CreateAdProps } from '@/services/launchAdq/createAd'
+import { createSysAdcreative } from '@/services/launchAdq/creative'
+import getMD5 from '@/components/MD5'
+interface Props {
+    queryForm: Partial<CreateAdProps>,
+    title?: string,
+    visible: boolean,
+    PupFn: (arg: ModalConfig) => void,
+    callback: (params: any) => void,
+    confirmLoading?: boolean,
+    type?: 'add' | 'look' | 'edit',//新增,查看,编辑
+    dataInfo?: any
+}
+/**创意模板*/
+function CreativePup(props: Props) {
+    let { visible, confirmLoading, PupFn, callback, type, dataInfo, queryForm } = props
+    let [template_checked, settemplate_checked] = useState<boolean>(localStorage.getItem('template_checked') === '1' || false)
+    let { promotedObjectType, sysAdgroup } = queryForm
+    let { siteSet } = sysAdgroup
+    const { init } = useModel('useLaunchAdq.useBdMediaPup')
+    let arg = type === 'look' ? { footer: null } : {}
+    // 请求
+    const getAdcreativeTemplate = useAjax((params) => get_adcreative_template(params))
+    const getAdcreativeTemplateList = useAjax((params) => get_adcreative_template_list(params))
+    const getTextLsit = useAjax((params) => getText(params))
+    const addSysAdgroup = useAjax((params) => createSysAdcreative(params))
+    const getVideoCapture = useAjax((params) => get_tools_video_capture(params))
+    // 变量
+    const [adcreative_template, set_adcreative_template] = useState<AdcreativeTemplate>()
+    const [adcreative_template_list, set_adcreative_template_list] = useState<AdcreativeTemplateList[]>([])
+    const [selectImgVisible, set_selectImgVisible] = useState(false)
+    const [selectVideoVisible, set_selectVideoVisible] = useState(false)
+    const [videoImgsVisbile, set_videoImgsVisbile] = useState(false)
+    const [descriptionShow, setdescriptionshow] = useState(false)
+    const [endPageDescShow, setendPageDescnshow] = useState(false)
+    const [videoImgs, set_videoImgs] = useState<{//视频封面图设置
+        activeUrl:string,//选中的视频封面图地址
+        preview:boolean,//是否开启图片点击预览
+        urlList:any[],//生成的视频封面列表
+    }>({
+        activeUrl:'',
+        preview:false,
+        urlList:[
+            'https://test-adq-media.oss-cn-hangzhou.aliyuncs.com/image/21D8D51AD98C4FF8BF41F1C2D28EA39F.jpg', 
+            'https://test-adq-media.oss-cn-hangzhou.aliyuncs.com/image/80DBE1AB3EDE4E85ABAE5F1670D9FED0.jpg',
+            'https://test-adq-media.oss-cn-hangzhou.aliyuncs.com/image/BCB2DAB86BDB4549BCB8E493C4F29E82.jpg',
+            'https://test-adq-media.oss-cn-hangzhou.aliyuncs.com/image/545A4C2A5B874C82A9D1C0C063624AE5.jpg'
+        ]
+    })
+    const [titleShow, settitleshow] = useState(false)
+    const [form] = Form.useForm();
+    const [pupState, setPupState] = useState({
+        kp_show: false,
+        xd_show: false,
+        sj_show: false,
+        bq_show: false,
+        sp_show: false
+    })
+    const [imgMaterialConfig, setImgMaterialConfig] = useState<{
+        adcreativeTemplateId?: number,
+        type: string,
+        cloudSize: { relation: string, width: number, height: number }[],
+        list: any[],
+        max: number
+    }>({
+        type: '',//类型
+        cloudSize: [],//素材搜索条件
+        list: [],//素材
+        max: 1,//素材数量
+    })//图片素材配置
+    const [videoMaterialConfig, setVideoMaterialConfig] = useState<{
+        adcreativeTemplateId?: number,
+        type: string,
+        cloudSize: { relation: string, width: number, height: number }[],
+        list: any[],
+        max: number
+    }>({
+        type: '',//类型
+        cloudSize: [],//素材搜索条件
+        list: [],//素材
+        max: 1,//素材数量
+    })//图片素材配置
+    const [conversionList, setConversionList] = useState<any>(null)
+    let pageType = Form.useWatch('pageType', form)
+    let adcreativeTemplateId = Form.useWatch('adcreativeTemplateId', form)
+    let actionBtn = Form.useWatch('actionBtn', form)
+    // let siteSet = Form.useWatch('siteSet', form)
+    // let promotedObjectType = Form.useWatch('promotedObjectType', form)
+    let adcreativeElementsType = Form.useWatch('adcreativeElementsType', form)
+    let dataShow = Form.useWatch('dataShow', form)
+    let conversionDataType = Form.useWatch('conversionDataType', form)
+    let titles = Form.useWatch('title', form)
+    let description = Form.useWatch('description', form)
+    let videoOver = Form.useWatch('videoOver', form)
+    let endPageDesc = Form.useWatch('endPageDesc', form)
+
+    // 确定事件
+    const handleOk = useCallback(() => {
+        form.validateFields().then(values => {
+            console.log('values=>1', values)
+            let newValues = JSON.parse(JSON.stringify(values))
+            for (let key in newValues) {
+                switch (key) {
+                    case 'image'://图素材
+                        newValues.adcreativeElements = {
+                            ...newValues.adcreativeElements,
+                            imageUrl: imgMaterialConfig.list[0].url,
+                        }
+                        delete newValues[key]
+                        break;
+                    case 'video'://视频素材
+                        newValues.adcreativeElements = {
+                            ...newValues.adcreativeElements,
+                            videoUrl: videoMaterialConfig.list[0].url,
+                        }
+                        delete newValues[key]
+                        break;
+                    case 'image_list'://图素材
+                        newValues.adcreativeElements = {
+                            imageUrlList: imgMaterialConfig.list?.map(item => item.url),
+                            description: newValues.description,
+                        }
+                        delete newValues[key]
+                        break;
+                    case 'short_video1'://视频素材
+                        newValues.adcreativeElements = {
+                            shortVideoStruct: {
+                                shortVideo1Url: videoMaterialConfig.list[0].url
+                            },
+                            description: newValues.description,
+                        }
+                        delete newValues[key]
+                        break;
+                    case 'description'://文案
+                        newValues.adcreativeElements = { ...newValues.adcreativeElements, description: newValues.description }
+                        break;
+                    case 'title'://文案
+                        newValues.adcreativeElements = { ...newValues.adcreativeElements, title: newValues.title }
+                        break;
+                    case 'endPageType'://视频结束l类型
+                        newValues.adcreativeElements = { ...newValues.adcreativeElements, endPage: { ...newValues.adcreativeElements.endPage, endPageType: newValues.endPageType } }
+                        delete newValues[key]
+                        break;
+                    case 'endPageDesc'://视频结束文案
+                        newValues.adcreativeElements = { ...newValues.adcreativeElements, endPage: { ...newValues.adcreativeElements.endPage, endPageDesc: newValues.endPageDesc } }
+                        delete newValues[key]
+                        break;
+                }
+            }
+            delete newValues.description //删除外层文案
+            delete newValues.title //删除外层文案
+            delete newValues.adcreativeElementsType //删除创意形式
+            delete newValues.dataShow //删除数据开关
+            delete newValues.actionBtn //删除行动开关
+            console.log('newValues=>2', newValues)
+            if (!newValues.adcreativeElements) {
+                newValues.adcreativeElements = {}
+            }
+            if (newValues?.overrideCanvasHeadOption?.length === 0 || !newValues?.overrideCanvasHeadOption) {
+                newValues.overrideCanvasHeadOption = 'OPTION_KEEP_DIFFERENT'
+            }
+            if (newValues?.overrideCanvasHeadOption?.length === 1 && newValues?.overrideCanvasHeadOption[0] === 'OPTION_CREATIVE_OVERRIDE_CANVAS') {
+                newValues.overrideCanvasHeadOption = 'OPTION_CREATIVE_OVERRIDE_CANVAS'
+            }
+            //假如不存在promotedObjectType
+            if (!newValues?.promotedObjectType) {
+                newValues['promotedObjectType'] = queryForm.promotedObjectType
+            }
+            // 假如不存在siteSet
+            if (!newValues?.siteSet) {
+                newValues['siteSet'] = queryForm.sysAdgroup.siteSet
+            }
+            // 开启存为模板开关执行
+            if (template_checked && type === 'add') {
+                addSysAdgroup.run(newValues).then(res => {
+                    if (res) {
+                        callback(newValues)
+                    }
+                })
+            } else {
+                callback(newValues)
+            }
+        })
+        // PupFn({ visible: false })
+    }, [form, imgMaterialConfig, videoMaterialConfig, queryForm])
+    // 获取创意形式列表
+    useEffect(() => {
+        if (siteSet?.length > 0 && promotedObjectType) {
+            getAdcreativeTemplateList.run({
+                siteSet,
+                promotedObjectType,
+                campaignType: 'CAMPAIGN_TYPE_NORMAL',
+            }).then(res => {
+                let newArr: any = []
+                // 过滤掉相同的和即将下线的
+                if (!res) {
+                    return
+                }
+                Object.values(res)?.forEach((arr: any) => {
+                    Array.isArray(arr) && arr?.forEach((item: any) => {
+                        if (newArr.length > 0) {
+                            if (outAdcreativeTemplateIdFun(item.adcreativeTemplateId) && newArr.every((i: { adcreativeTemplateId: any }) => i.adcreativeTemplateId !== item.adcreativeTemplateId)) {
+                                newArr.push(item)
+                            } else {
+                                // 找出通用创意
+                                newArr = newArr?.map((arr: { adcreativeTemplateId: any }) => {
+                                    if (arr.adcreativeTemplateId === item.adcreativeTemplateId) {
+                                        return { ...arr, isGeneral: true }
+                                    }
+                                    return arr
+                                })
+                            }
+                        } else {
+                            if (outAdcreativeTemplateIdFun(item.adcreativeTemplateId)) {
+                                newArr.push(item)
+                            }
+                        }
+                    })
+                })
+                set_adcreative_template_list(newArr)
+            })
+        }
+    }, [siteSet, promotedObjectType, form])
+    // 获取创意形式详情
+    useEffect(() => {
+        // CAMPAIGN_TYPE_NORMAL
+        if (siteSet?.length > 0 && promotedObjectType && adcreativeTemplateId) {
+            if (adcreativeTemplateId) {
+                getAdcreativeTemplate.run({
+                    siteSet,
+                    promotedObjectType,
+                    adcreativeTemplateId
+                }).then(res => {
+                    if (res?.length > 0) {
+                        set_adcreative_template(res[0])
+                    }
+                })
+            }
+        }
+    }, [siteSet, promotedObjectType, adcreativeTemplateId])
+    // 获取对应落地页按钮
+    const pageTypeList = useMemo(() => {
+        if (adcreativeTemplateId) {
+            let arr: any = adcreative_template?.landingPageConfig?.supportPageTypeList
+            return arr
+        }
+        return null
+
+    }, [adcreativeTemplateId, adcreative_template])
+    // 获取对应行动按钮数据
+    const linkNameList = useMemo(() => {
+        if (pageType) {
+            let arr = (pageTypeList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkNameType?.list
+            return arr
+        }
+        return null
+    }, [pageType, pageTypeList])
+    // 跳转落地页
+    const linkPageList = useMemo(() => {
+        if (pageType) {
+            let arr = (pageTypeList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkPageType?.list
+            return arr
+        }
+        return null
+    }, [pageType, pageTypeList])
+    // 切换创意形式默认选中第一个
+    useEffect(() => {
+        // 设置默认选中第一个
+        if (adcreativeElementsType && adcreative_template_list?.length > 0) {
+            let adcreativeTemplateIdArr = adcreative_template_list?.filter(item => item.adcreativeTemplateStyle === adcreativeElementsType)
+            form.setFieldsValue({ adcreativeTemplateId: adcreativeTemplateIdArr[0].adcreativeTemplateId })
+        }
+    }, [adcreativeElementsType, adcreative_template_list])
+
+
+    //每次选中创意设置该展示的界面
+    useEffect(() => {
+        let states = {
+            kp_show: false,
+            xd_show: true,
+            sj_show: false,
+            bq_show: false,
+            sp_show: false
+        }
+        let values: any = { pageType: 'PAGE_TYPE_CANVAS_WECHAT', }
+        if (adcreative_template) {
+            let pageList = adcreative_template?.landingPageConfig?.supportPageTypeList
+            let pageType = pageList?.length ? pageList[0]?.pageType : null
+            //数据展示组件
+            if (adcreative_template.adcreativeAttributes.some(item => item.name === 'conversion_data_type' || item.name === 'conversion_target_type')) {
+                let arr = adcreative_template.adcreativeAttributes?.filter((item: { name: string; }) => item.name === 'conversion_data_type' || item.name === 'conversion_target_type')
+                let newObj: any = {}
+                arr.forEach((item) => {
+                    let arr: any[] = mySet(item.propertyDetail.enumDetail.enumeration)
+                    newObj[item.name] = arr
+                })
+                setConversionList(newObj)
+
+                states = { ...states, sj_show: true }
+                if (newObj.conversion_data_type) {
+                    values = { ...values, conversionDataType: newObj.conversion_data_type[0].value }
+                }
+                if (newObj.conversion_target_type) {
+                    values = { ...values, conversionTargetType: newObj.conversion_target_type[0].value }
+                }
+            }
+            //行动按钮组件存在
+            if (states.xd_show) {
+                let linkNameList = (pageList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkNameType?.list
+                let linkPageList = (pageList?.filter((item: { pageType: any; }) => item.pageType === pageType)[0] as any)?.supportLinkPageType?.list
+                if (linkNameList) {
+                    let linkNameType = linkNameList[0]?.linkNameType
+                    let linkPageType = linkPageList[0]?.linkPageType
+                    values = { ...values, linkNameType, linkPageType }
+                } else {
+                    states = { ...states, xd_show: false }
+                }
+            }
+            // 视频结束页 end_page
+            if (adcreative_template.adcreativeElements.some(item => item.name === 'end_page')) {
+                // let endPageType =adcreative_template?.adcreativeElements?.filter(item=>item.name === 'end_page_type')[0]?.enumProperty?.enumeration
+                values = { ...values, endPageType: 'END_PAGE_AVATAR_NICKNAME_HIGHLIGHT' }
+                states = { ...states, sp_show: true }
+            }
+            setPupState(states)
+            form.setFieldsValue(values)
+        }
+    }, [adcreative_template])
+    // 版位改变清空数据
+    useEffect(() => {
+        if (imgMaterialConfig.adcreativeTemplateId && adcreativeTemplateId !== imgMaterialConfig.adcreativeTemplateId) {
+            setImgMaterialConfig({ ...imgMaterialConfig, adcreativeTemplateId: undefined, list: [] })
+        }
+        if (videoMaterialConfig.adcreativeTemplateId && adcreativeTemplateId !== videoMaterialConfig.adcreativeTemplateId) {
+            setVideoMaterialConfig({ ...videoMaterialConfig, adcreativeTemplateId: undefined, list: [] })
+        }
+    }, [adcreativeTemplateId, imgMaterialConfig, videoMaterialConfig])
+    // 文案助手
+    const textList = useCallback((arg: { maxTextLength: number, keyword?: string }) => {
+        let { maxTextLength, keyword } = arg
+        getTextLsit.run({ keyword: keyword || titles || description, maxTextLength })
+    }, [titles, description])
+    // 监听点击取消文案助手弹窗
+    useEffect(() => {
+        let modal = document.querySelector('.myModal')
+        let onBiurdescription = (e: any) => {
+            let d = document.querySelector('.my_description')
+            let t = document.querySelector('.my_title')
+            let p = document.querySelector('.my_endPageDesc')
+            if (!d?.contains(e.target)) {
+                setdescriptionshow(false)
+            }
+            if (!t?.contains(e.target)) {
+                settitleshow(false)
+            }
+            if (!p?.contains(e.target)) {
+                setendPageDescnshow(false)
+            }
+        }
+        modal?.addEventListener('click', onBiurdescription)
+        return () => {
+            modal?.removeEventListener('click', onBiurdescription)
+        }
+
+    }, [])
+    // 数据回填
+    useEffect(() => {
+        if (dataInfo && adcreative_template_list?.length > 0 && adcreative_template) {
+            let { adcreativeName, adcreativeTemplateId, conversionDataType, conversionTargetType, linkNameType, linkPageType, pageType, promotedObjectType, siteSet, adcreativeElements } = dataInfo
+            let { description, imageUrl, title, videoUrl, imageUrlList, endPage, shortVideoStruct } = adcreativeElements
+            let obj: any = {
+                adcreativeName,
+                siteSet,
+                promotedObjectType,
+                adcreativeTemplateId,
+            }
+            if ([720, 721, 618, 1708].some(n => n === adcreativeTemplateId)) {
+                obj = { ...obj, adcreativeElementsType: '视频' }
+            } else {
+                obj = { ...obj, adcreativeElementsType: '图片' }
+            }
+            if (conversionDataType) {
+                obj = { ...obj, conversionDataType, dataShow: true }
+            }
+            if (conversionTargetType) {
+                obj = { ...obj, conversionTargetType, dataShow: true }
+            }
+            if (linkNameType) {
+                obj = { ...obj, linkNameType, actionBtn: true }
+            }
+            if (linkPageType) {
+                obj = { ...obj, linkPageType, actionBtn: true }
+            }
+            if (pageType) {
+                obj = { ...obj, pageType }
+            }
+            if (description) {
+                obj = { ...obj, description }
+            }
+            if (title) {
+                obj = { ...obj, title }
+            }
+            if (endPage) {
+                obj = { ...obj, videoOver: true, ...endPage }
+            }
+            if (videoUrl) {
+                setVideoMaterialConfig({
+                    cloudSize: [],
+                    list: [{ url: videoUrl }],
+                    max: 1,
+                    type: 'video',
+                    adcreativeTemplateId
+                })
+            }
+            if (imageUrl) {
+                setImgMaterialConfig({
+                    cloudSize: [],
+                    list: [{ url: imageUrl }],
+                    max: 1,
+                    type: 'image',
+                    adcreativeTemplateId
+                })
+            }
+            if (imageUrlList) {
+                setImgMaterialConfig({
+                    cloudSize: [],
+                    list: imageUrlList?.map((url: any) => ({ url })),
+                    max: imageUrlList.length,
+                    type: 'image_list',
+                    adcreativeTemplateId
+                })
+            }
+            if (shortVideoStruct) {
+                setVideoMaterialConfig({
+                    cloudSize: [],
+                    list: [{ url: shortVideoStruct.shortVideo1Url }],
+                    max: 1,
+                    type: 'short_video1',
+                    adcreativeTemplateId
+                })
+            }
+            form.setFieldsValue(obj)
+        }
+    }, [dataInfo, adcreative_template_list, adcreative_template])
+    // 生成视频封面图
+    const videoToImgs = useCallback(() => {
+
+        if (videoMaterialConfig.list[0]) {
+            set_videoImgsVisbile(true)
+            // let url = videoMaterialConfig.list[0].url
+            // fetch(url).then(res => res.blob()).then(async (blob) => {
+            //     let file = new File([blob], 'sp', { type: blob.type })
+            //     // let md5 = await getMD5(file)
+            //     let formData = new FormData()
+            //     formData.append('videoFile', file)
+            //     formData.append('number', '12')
+            //     getVideoCapture.run(formData).then(res => {
+            //         console.log(res)
+            //     })
+            // })
+        } else {
+            message.warning('请先选择视频文件!!!')
+        }
+    }, [videoMaterialConfig.list])
+    return <Modal
+        visible={visible}
+        title={type === 'add' ? '新建创意' : type === 'look' ? '创意详情' : '编辑创意'}
+        onCancel={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}
+        // onOk={handleOk}
+        width={1200}
+        confirmLoading={confirmLoading}
+        footer={<Space>
+            <Button onClick={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}>取消</Button>
+            <Button type='primary' onClick={handleOk}>确定</Button>
+            {type === 'add' && <Checkbox checked={template_checked} onChange={(e) => {
+                let checked = e.target.checked
+                settemplate_checked(checked)
+                localStorage.setItem('template_checked', checked ? '1' : '0')
+            }}>存为模板</Checkbox>}
+        </Space>}
+        className='myModal'
+        {...arg}
+    >
+        <Form
+            form={form}
+            labelCol={{ span: 5 }}
+            labelWrap={true}
+            initialValues={
+                {
+                    adcreativeElementsType: '视频',
+                    // promotedObjectType:queryForm?.promotedObjectType,
+                    // siteSet:queryForm?.sysAdgroup?.siteSet,
+                    // overrideCanvasHeadOption:['OPTION_KEEP_DIFFERENT'],//默认'自定义广告创意素材,和原生推广页顶部素材保持两者不同,(仅支持朋友圈非常规创意形式)'
+                    // actionBtn: false,//行动按钮
+                    // dataShow: false,//数据展示
+                }
+            }
+        >
+            {/* ============================================================基本信息============================================================= */}
+            <Divider orientation='center'>基本信息</Divider>
+            {/* ============================================================创意名称============================================================= */}
+            <Form.Item label={<strong>创意名称</strong>} name='adcreativeName' rules={[{ required: true, message: '请输入广告名称!' }]}>
+                <Input placeholder='创意名称' style={{ width: 300 }} />
+            </Form.Item>
+            {/* ============================================================推广目标类型============================================================= */}
+            {/* <Form.Item label={<strong>推广目标类型</strong>} name='promotedObjectType' rules={[{ required: true, message: '请选择推广告推广目标类型!' }]}>
+                <Select style={{ width: 300 }} showSearch filterOption={(input, option) =>
+                    (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                } allowClear>
+                    {
+                        Object.keys(PromotedObjectType).map(key => {
+                            return <Select.Option value={key} key={key}>{PromotedObjectType[key]}</Select.Option>
+                        })
+                    }
+                </Select>
+            </Form.Item> */}
+            {/* ============================================================投放版位============================================================= */}
+            {/* <Form.Item label={<strong>投放版位</strong>} name='siteSet' rules={[{ required: true, message: '请输入选择广告版位!' }]}>
+                <Select mode='multiple' style={{ width: 300 }} allowClear>
+                    {
+                        Object.keys(SiteSetEnum).map(key => {
+                            return <Select.Option value={key} key={key}>{SiteSetEnum[key]}</Select.Option>
+                        })
+                    }
+                </Select>
+            </Form.Item> */}
+            {/* ============================================================创意形式============================================================= */}
+            <Divider orientation='center'>创意形式</Divider>
+            {/* ============================================================创意形式============================================================= */}
+            <Form.Item label={<strong>创意形式</strong>} name='adcreativeElementsType'>
+                <Radio.Group >
+                    <Radio.Button value="视频">视频</Radio.Button>
+                    <Radio.Button value="图片">图片</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+
+            {
+                getAdcreativeTemplateList?.loading ? <Spin tip="Loading..." style={{ width: '100%' }}></Spin> :
+                    <>
+                        <Form.Item style={{ marginLeft: 177 }} name='adcreativeTemplateId'>
+                            <Radio.Group className={styles.adcreative_template}>
+                                {
+                                    adcreative_template_list?.filter(item => item.adcreativeTemplateStyle === adcreativeElementsType)?.map((item: any) => {
+                                        return <Radio.Button value={item.adcreativeTemplateId} key={item.adcreativeTemplateId}>
+                                            <div className={styles.adcreative_template_item}>
+                                                {item.isGeneral && <span style={{ color: '#4080ff', fontSize: 10 }}>所选版位通投</span>}
+                                                <img src={item.adcreativeSampleImage} />
+                                                <span style={{ fontSize: 12, height: 20, lineHeight: '20px' }}>{item.adcreativeTemplateAppellation}</span>
+                                                <span style={{ fontSize: 12, height: 20, lineHeight: '20px' }}>{item.adcreativeTemplateId}</span>
+                                            </div>
+                                        </Radio.Button>
+                                    })
+                                }
+                            </Radio.Group>
+                        </Form.Item>
+                        {/* ============================================================创意内容============================================================= */}
+                        <Divider orientation='center'>创意内容</Divider>
+                        {/* ============================================================素材============================================================= */}
+                        {/* 优先展示视频或图片 */}
+                        <div style={{ display: 'flex', flexFlow: 'column' }}>
+                            {
+                                adcreative_template?.adcreativeElements?.filter(item => item.required && item.name === 'image_list' || item.name === 'short_video1' || item.name === 'video' || item.name === 'image').map(item => {
+                                    return <Form.Item label={<strong>{item.description === '图片' && adcreative_template?.adcreativeElements?.some(item => item.name === 'video') ? '视频封面图' : item.description}</strong>} rules={[{ required: true, message: '请选择素材!' }]} key={item.name} name={item.name} style={item.description === '图片' && adcreative_template?.adcreativeElements?.some(item => item.name === 'video') ? { order: 2 } : {}}>
+                                        {/* 视频 */}
+                                        {
+                                            (item.name === 'short_video1' || item.name === 'video') && <div className={`${styles.box} ${styles.video}`} onClick={() => {
+                                                init({ mediaType: 'VIDEO', cloudSize: adcreativeTemplateId === 1708 ? [[{ relation: '=', width: 1280, height: 720 }]] : [[{ relation: '=', width: item.restriction.videoRestriction.minWidth, height: item.restriction.videoRestriction.minHeight }]], maxSize: item.restriction.videoRestriction.fileSize * 1024 })
+                                                setTimeout(() => {
+                                                    set_selectVideoVisible(true)
+                                                    setVideoMaterialConfig({
+                                                        ...videoMaterialConfig,
+                                                        type: item.name,
+                                                        max: 1,
+                                                        adcreativeTemplateId
+                                                    })
+                                                }, 100)
+                                            }}>
+                                                <p>
+                                                    {
+                                                        videoMaterialConfig?.list[0] ? <video src={videoMaterialConfig?.list[0].url} controls /> : <>
+                                                            <span>{`推荐尺寸(${adcreativeTemplateId === 1708 ? 1280 : item.restriction.videoRestriction.minWidth} x ${adcreativeTemplateId === 1708 ? 720 : item.restriction.videoRestriction.minHeight})`}</span>
+                                                            <span>{`${item.restriction.videoRestriction.fileFormat?.map(str => str?.replace('MEDIA_TYPE_', ''))};< ${item.restriction.videoRestriction.fileSize / 1024}M;时长 ≥ ${item.restriction.videoRestriction.minDuration}s,≤ ${item.restriction.videoRestriction.maxDuration}s,必须带有声音`}</span>
+                                                        </>
+                                                    }
+                                                </p>
+                                            </div>
+                                        }
+                                        {/* 单图 */}
+                                        {
+                                            item.name === 'image' && <div className={`${styles.box} ${styles.image}`} onClick={() => {
+                                                init({ mediaType: 'IMG', cloudSize: [[{ relation: '=', width: item.restriction.imageRestriction.width, height: item.restriction.imageRestriction.height }]], maxSize: item.restriction.imageRestriction.fileSize * 1024 })
+                                                setTimeout(() => {
+                                                    set_selectImgVisible(true)
+                                                    setImgMaterialConfig({
+                                                        ...imgMaterialConfig,
+                                                        type: item.name,
+                                                        max: 1,
+                                                        adcreativeTemplateId
+                                                    })
+                                                }, 100)
+
+                                            }}>
+                                                <p>
+                                                    {imgMaterialConfig?.list[0] ? <img src={imgMaterialConfig?.list[0].url} /> : <>
+                                                        <span>{`推荐尺寸(${item.restriction.imageRestriction.width} x ${item.restriction.imageRestriction.height})`}</span>
+                                                        <span>{`${item.restriction.imageRestriction.fileFormat?.map(str => str?.replace('IMAGE_TYPE_', ''))};小于 ${item.restriction.imageRestriction.fileSize}KB`}</span>
+                                                    </>
+                                                    }
+                                                </p>
+                                            </div>
+                                        }
+                                        {
+                                            item.description === '图片' && adcreative_template?.adcreativeElements?.some(item => item.name === 'video') && <Button onClick={videoToImgs} size='small' type='primary' disabled={!videoMaterialConfig.list[0]}>从视频生成封面图</Button>
+                                        }
+                                        {/* 多图 */}
+                                        {
+                                            item.name === 'image_list' && <div className={`${styles.box} ${item.arrayProperty.maxNumber >= 3 ? styles.image_list : styles.image}`} onClick={() => {
+                                                init({ mediaType: 'IMG', num: item.arrayProperty.maxNumber, cloudSize: [[{ relation: '=', width: item.restriction.imageRestriction.width, height: item.restriction.imageRestriction.height }]], maxSize: item.restriction.imageRestriction.fileSize * 1024 })
+                                                setTimeout(() => {
+                                                    set_selectImgVisible(true)
+                                                    setImgMaterialConfig({
+                                                        ...imgMaterialConfig,
+                                                        type: item.name,
+                                                        max: item.arrayProperty.maxNumber,
+                                                        adcreativeTemplateId
+                                                    })
+                                                }, 100)
+                                            }}>
+                                                {
+                                                    Array(item.arrayProperty.maxNumber).fill('').map((arr, index) => {
+                                                        return <p key={index}>
+                                                            {
+                                                                imgMaterialConfig?.list[index] ? <img src={imgMaterialConfig?.list[index].url} /> : <>
+                                                                    <span>{`推荐尺寸(${item.restriction.imageRestriction.width} x ${item.restriction.imageRestriction.height})`}</span>
+                                                                    <span>{`${item.restriction.imageRestriction.fileFormat?.map(str => str?.replace('IMAGE_TYPE_', ''))};小于 ${item.restriction.imageRestriction.fileSize}KB`}</span>
+                                                                </>
+                                                            }
+
+                                                        </p>
+                                                    })
+                                                }
+                                            </div>
+                                        }
+                                    </Form.Item>
+                                })
+                            }
+                        </div>
+
+                        {/* 标题 */}
+                        {
+                            adcreative_template?.adcreativeElements?.filter(item => item.name === 'title').map(item => {
+                                return <div key={item.fieldType}>
+                                    <Form.Item label={<strong>{item.description}(选填)</strong>} className={'my_title'} >
+                                        <Form.Item name={item.name} rules={[{ pattern: RegExp(item.restriction.textRestriction.textPattern?.replace(/\+/ig, `{1,${item.restriction.textRestriction.maxLength}}`)), message: '请输入正确的' + item.description }]} noStyle>
+                                            <Input
+                                                placeholder={'请输入' + item.description}
+                                                style={{ width: 500 }}
+                                                allowClear
+                                                onFocus={() => {
+                                                    settitleshow(true)
+                                                    textList({ maxTextLength: item.restriction.textRestriction.maxLength })
+                                                }}
+                                                onChange={(e) => {
+                                                    let value = e.target.value
+                                                    textList({ maxTextLength: item.restriction.textRestriction.maxLength, keyword: value })
+                                                }}
+                                            />
+                                        </Form.Item>
+                                        <span>{`${titles?.length ?? 0}/${item.restriction.textRestriction.maxLength}`}</span>
+                                        {
+                                            titleShow && <List
+                                                loading={getTextLsit?.loading}
+                                                size="small"
+                                                style={{ maxHeight: 300, overflowX: 'auto' }}
+                                                bordered
+                                                dataSource={getTextLsit?.data?.returnTexts}
+                                                renderItem={(item: any) => <List.Item onClick={() => {
+                                                    form.setFieldsValue({ title: item.text })
+                                                    settitleshow(false)
+                                                }}><span >{item.text}{item.tag && <span className={styles.crt}>{'CTR 高'}</span>}</span></List.Item>}
+                                            />
+                                        }
+                                    </Form.Item>
+                                </div>
+                            })
+                        }
+                        {//过滤了不必传和品牌名称,品牌标识图(外部传)短视频结构(组装使用)
+                            adcreative_template?.adcreativeElements?.filter(item => item.required && item.name === 'description').map(item => {
+                                let maxNum = adcreativeTemplateId === 1708 ? pupState.xd_show ? 10 : item.restriction.textRestriction.maxLength : item.restriction.textRestriction.maxLength
+                                return <div key={item.fieldType}>
+                                    <Form.Item label={<strong>{item.description}</strong>} className={'my_description'}>
+                                        <Form.Item name={item.name} noStyle rules={[{ required: true, pattern: RegExp(item.restriction.textRestriction.textPattern?.replace(/\+/ig, `{1,${maxNum}}`)), message: '请输入正确的' + item.description }]}>
+                                            <Input
+                                                placeholder={'请输入' + item.description}
+                                                style={{ width: 500 }}
+                                                onFocus={() => {
+                                                    setdescriptionshow(true)
+                                                    textList({ maxTextLength: maxNum })
+                                                }}
+                                                onChange={(e) => {
+                                                    let value = e.target.value
+                                                    textList({ maxTextLength: maxNum, keyword: value })
+                                                }}
+                                                allowClear
+                                            />
+                                        </Form.Item>
+                                        <span>{`${description?.length ?? 0}/${maxNum}`}</span>
+                                        {
+                                            descriptionShow && <List
+                                                loading={getTextLsit?.loading}
+                                                size="small"
+                                                style={{ maxHeight: 300, overflowX: 'auto' }}
+                                                bordered
+                                                dataSource={getTextLsit?.data?.returnTexts}
+                                                renderItem={(item: any) => <List.Item onClick={(e: any) => {
+                                                    form.setFieldsValue({ description: item.text })
+                                                    setdescriptionshow(false)
+                                                }}><span >{item.text}{item.tag && <span className={styles.crt}>{'CTR 高'}</span>}</span></List.Item>}
+                                            />
+                                        }
+                                    </Form.Item>
+                                </div>
+                            })
+                        }
+                        {/* ============================================================落地页============================================================= */}
+                        <Form.Item label={<strong>落地页</strong>} name='pageType'>
+                            <Radio.Group>
+                                {
+                                    pageTypeList?.map((item: any) => {
+                                        return <Radio.Button value={item.pageType} key={item.pageType} disabled={!item.description.includes('微信原生推广页')}>{item.description.includes('微信原生推广页') ? '微信原生推广页' : item.description}</Radio.Button>
+                                    })
+                                }
+                            </Radio.Group>
+                        </Form.Item>
+                        {
+                            pageType === 'PAGE_TYPE_CANVAS_WECHAT' && <Form.Item label={<strong>素材选项</strong>} name='overrideCanvasHeadOption'>
+                                <Checkbox.Group options={[{ label: '使用外层创意素材替换原生推广页顶部素材', value: 'OPTION_CREATIVE_OVERRIDE_CANVAS' }]} />
+                            </Form.Item>
+                        }
+                        {/* ============================================================行动按钮============================================================= */}
+                        {
+                            pupState.xd_show && <Form.Item label={<strong>行动按钮</strong>} name='actionBtn' valuePropName="checked">
+                                <Switch checkedChildren="开启" unCheckedChildren="关闭" />
+                            </Form.Item>
+                        }
+                        {
+                            actionBtn && <>
+                                <div style={{ display: 'flex' }}>
+                                    <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>按钮文案</strong></p>
+                                    <Form.Item name='linkNameType'>
+                                        <Select style={{ width: 200 }} showSearch filterOption={(input, option) =>
+                                            (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                                        } allowClear>
+                                            {
+                                                linkNameList?.map((item: any) => {
+                                                    return <Select.Option value={item.linkNameType} key={item.linkNameType}>{item.description}</Select.Option>
+                                                })
+                                            }
+                                        </Select>
+                                    </Form.Item>
+                                </div>
+                                <div style={{ display: 'flex' }}>
+                                    <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>跳转落地页</strong></p>
+                                    <Form.Item name='linkPageType'>
+                                        <Radio.Group>
+                                            {
+                                                linkPageList?.map((item: { linkPageType: string; description: string; }, index: number) => {
+                                                    return <Radio.Button value={item.linkPageType} key={item.linkPageType}>{item.description}</Radio.Button>
+                                                })
+                                            }
+                                        </Radio.Group>
+                                    </Form.Item>
+                                </div>
+                            </>
+                        }
+                        {/* ============================================================数据展示============================================================= */}
+                        {pupState.sj_show && <Form.Item label={<strong>数据展示</strong>} name='dataShow' valuePropName="checked">
+                            <Switch checkedChildren="开启" unCheckedChildren="关闭" />
+                        </Form.Item>}
+                        {
+                            dataShow && <>
+                                <div style={{ display: 'flex' }}>
+                                    <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>数据类型</strong></p>
+                                    <Form.Item name='conversionDataType'>
+                                        <Radio.Group>
+                                            {
+                                                conversionList?.conversion_data_type?.map((item: { value: string; description: string; }, index: number) => {
+                                                    return <Radio.Button value={item.value} key={item.value}>{item.description}</Radio.Button>
+                                                })
+                                            }
+                                        </Radio.Group>
+                                    </Form.Item>
+                                </div>
+                                {conversionList?.conversion_target_type && conversionDataType === 'CONVERSION_DATA_ADMETRIC' && <div style={{ display: 'flex' }}>
+                                    <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>转化行为</strong></p>
+                                    <Form.Item name='conversionTargetType'>
+                                        <Radio.Group>
+                                            {
+                                                conversionList?.conversion_target_type?.map((item: { value: string; description: string; }, index: number) => {
+                                                    return <Radio.Button value={item.value} key={item.value}>{item.description}</Radio.Button>
+                                                })
+                                            }
+                                        </Radio.Group>
+                                    </Form.Item>
+                                </div>}
+                            </>
+                        }
+                        {/* ============================================================视频结束页============================================================= */}
+                        {pupState.sp_show && <Form.Item label={<strong>视频结束页</strong>} name='videoOver' valuePropName="checked">
+                            <Switch checkedChildren="开启" unCheckedChildren="关闭" />
+                        </Form.Item>}
+                        {
+                            videoOver && <>
+                                <div style={{ display: 'flex', alignItems: 'center', marginBottom: 10 }}>
+                                    <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>视频结束页类型</strong></p>
+                                    <Form.Item name='endPageType' style={{ marginBottom: 0 }} >
+                                        <Radio.Group>
+                                            {
+                                                adcreative_template?.adcreativeElements?.filter(item => item.name === 'end_page_type')[0]?.enumProperty?.enumeration?.map((item) => {
+                                                    return <Radio.Button value={item.value} key={item.value}>{item.description}</Radio.Button>
+                                                })
+                                            }
+                                        </Radio.Group>
+                                    </Form.Item>
+                                </div>
+                                <div className={'my_endPageDesc'}>
+                                    <div style={{ display: 'flex', alignItems: 'center' }} >
+                                        <p style={{ marginBottom: 5, marginLeft: 177 }}><strong style={{ marginRight: 20 }}>结束文案</strong></p>
+                                        <Form.Item name='endPageDesc' rules={[{ required: true, pattern: RegExp("^[^\\<\\>\\&'\\\"\\/\\x08\\x09\\x0A\\x0D\\\\]{1,12}$"), message: '请输入正确的结束页文案' }]} style={{ marginBottom: 0, marginRight: 10 }}>
+                                            <Input
+                                                placeholder='请输入结束页文案'
+                                                style={{ width: 300 }}
+                                                onFocus={() => {
+                                                    setendPageDescnshow(true)
+                                                    textList({ maxTextLength: 12 })
+                                                }}
+                                                onChange={(e) => {
+                                                    let value = e.target.value
+                                                    textList({ maxTextLength: 12, keyword: value })
+                                                }}
+                                                allowClear
+                                            />
+                                        </Form.Item>
+                                        <span>{endPageDesc?.length || 0}/12</span>
+                                    </div>
+                                    {
+                                        endPageDescShow && <List
+                                            loading={getTextLsit?.loading}
+                                            size="small"
+                                            style={{ maxHeight: 300, maxWidth: 300, overflowX: 'auto', marginLeft: 253 }}
+                                            bordered
+                                            dataSource={getTextLsit?.data?.returnTexts}
+                                            renderItem={(item: any) => <List.Item onClick={(e: any) => {
+                                                form.setFieldsValue({ endPageDesc: item.text })
+                                                setendPageDescnshow(false)
+                                            }}><span >{item.text}{item.tag && <span className={styles.crt}>{'CTR 高'}</span>}</span></List.Item>}
+                                        />
+                                    }
+                                </div>
+                            </>
+                        }
+                    </>
+            }
+        </Form>
+        {/* 选择图片素材 */}
+        {
+            selectImgVisible && <SelectCloud
+                visible={selectImgVisible}
+                onClose={() => set_selectImgVisible(false)}
+                sliderImgContent={imgMaterialConfig.list}
+                onChange={(content) => {
+                    if (content.length > 0) {
+                        form.setFieldsValue({ [imgMaterialConfig.type]: imgMaterialConfig.type })
+                    }
+                    setImgMaterialConfig({ ...imgMaterialConfig, list: content })
+                    set_selectImgVisible(false)
+                }} />
+        }
+        {/* 选择视频素材 */}
+        {
+            selectVideoVisible && <SelectCloud
+                visible={selectVideoVisible}
+                onClose={() => set_selectVideoVisible(false)}
+                sliderImgContent={videoMaterialConfig.list}
+                onChange={(content) => {
+                    if (content.length > 0) {
+                        form.setFieldsValue({ [videoMaterialConfig.type]: videoMaterialConfig.type })
+                    }
+                    setVideoMaterialConfig({ ...videoMaterialConfig, list: content })
+                    set_selectVideoVisible(false)
+                }} />
+        }
+        {/* 视频封面图弹窗 */}
+        {
+            videoImgsVisbile && <Modal
+                visible={videoImgsVisbile}
+                title={<div>生成封面图 <Switch checkedChildren="开启预览" unCheckedChildren="关闭预览"  checked={videoImgs.preview} onChange={(checked)=>{set_videoImgs({...videoImgs,preview:checked})}}/></div>}
+                onOk={() => {
+                    if(videoImgs.activeUrl){
+                        setImgMaterialConfig({ ...imgMaterialConfig, list: [{url:videoImgs.activeUrl}] })
+                        set_videoImgsVisbile(false)
+                    }else{
+                        message.error('请选择图片,获取使用取消按钮关闭弹窗!')
+                    }
+                 }}
+                onCancel={() => { set_videoImgsVisbile(false) }}
+                confirmLoading={getVideoCapture.loading}
+                width={600}
+            >
+
+                <Radio.Group className={styles.videoImgs} onChange={(e)=>{
+                    let url = e.target.value
+                    set_videoImgs({...videoImgs,activeUrl:url})
+                }}>
+                    {
+                        videoImgs?.urlList?.map((item: any,index:number) => {
+                            return <Radio.Button value={item} key={index}>
+                                <Image src={item} preview={videoImgs.preview}/>
+                            </Radio.Button>
+                        })
+                    }
+                </Radio.Group>
+            </Modal>
+        }
+    </Modal >
+}
+export default CreativePup

+ 4 - 0
src/pages/launchSystemNew/launchManage/createAd/index.less

@@ -80,6 +80,10 @@
             font-size: 12px;
             color: rgb(90, 90, 90);
           }
+          >a{
+            font-size: 12px;
+            font-weight: 400;
+          }
         }
 
         .center {

+ 36 - 139
src/pages/launchSystemNew/launchManage/createAd/index.tsx

@@ -8,26 +8,22 @@ import { getSysAdgroupsInfo } from "@/services/launchAdq/localAd"
 import { getsysTargetingInfo } from "@/services/launchAdq/targeting"
 import { CloseOutlined, EditOutlined, QuestionCircleOutlined, SearchOutlined } from "@ant-design/icons"
 import { Button, Card, Col, Empty, Row, Select, Space, Spin, Tooltip, Image, message, Popover } from "antd"
-import React, { useEffect, useRef, useState } from "react"
+import React, { useCallback, useEffect, useRef, useState } from "react"
 import { useModel } from "umi"
-import AdModal from "../../components/adModal"
-import CreativeModal from "../../components/creativeModal"
-import CrowdPackModal from "../../components/crowdPackModal"
+import Ad from "./ad"
 import DataSourceModal from "../../components/dataSourceModal"
 import GoodsModal from "../../components/goodsModal"
 import IdModal from "../../components/idModal"
 import LookLanding from "../../components/lookLanding"
 import PageModal from "../../components/pageModal"
 import SelectCloud from "../../components/selectCloud"
-import TargetingModal from "../../components/targetingModal"
-import TargetingTooltip from "../../components/targetingTooltip"
 import { WxAutoButton } from "../../req"
-import AdcreativeCol from "./adcreativeCol"
-import AdgroupsCol from "./adgroupsCol"
 import style from './index.less'
 import Selector from "./selector"
 import SubmitModal from "./submitModal"
 import columns from "./tableConfig"
+import TargetIng from './targeting'
+import Creative from './creative'
 
 const CreateAd: React.FC = () => {
 
@@ -38,25 +34,25 @@ const CreateAd: React.FC = () => {
         campaignType: 'CAMPAIGN_TYPE_NORMAL', // 计划类型 CAMPAIGN_TYPE_NORMAL CAMPAIGN_TYPE_SEARCH 
         promotedObjectType: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT', // 推广目标类型
         speedMode: 'SPEED_MODE_STANDARD', // 投放速度模式
-        sysAdgroupId: undefined,  // 广告组内容
+        sysAdgroupId: undefined,  // 广告组ID
+        sysAdgroup: undefined,//广告组内容
         sysTargetingId: undefined,  // 定向包 id
+        sysTargeting: undefined,  // 定向包 内容
         adgroupName: undefined,  // 广告名称
         configuredStatus: 'AD_STATUS_SUSPEND',  // 广告状态
         sysAdcreativeId: undefined, // 创意ID
+        sysAdcreative: undefined, // 创意内容
         sysPageId: undefined, // 落地页Id
     })
     const [accountCreateLogs, setAccountCreateLogs] = useState<{ adAccountId: number, id: number, userActionSetsList?: number, productList?: any, conversionList?: any, customAudienceList?: any, excludedCustomAudienceList?: any, pageList?: any }[]>([])  // 账户
 
-    const [adVisible, setAdVisible] = useState<boolean>(false) // 选择广告弹窗控制
-    const [dxVisible, setDxVisible] = useState<boolean>(false) // 选择定向弹窗控制
-    const [creativeVisible, setCreativeVisible] = useState<boolean>(false) // 选择创意弹窗控制
+
     const [goodsVisible, setGoodsVisible] = useState<boolean>(false) // 选择商品弹窗控制
     const [sourceVisible, setSourceVisible] = useState<boolean>(false) // 选择数据源弹窗控制
     const [idVisible, setIdVisible] = useState<boolean>(false) // 选择转化ID弹窗控制
     const [selectImgVisible, setSelectImgVisible] = useState<boolean>(false) // 选择转化ID弹窗控制
     const [lookVisible, setLookVisible] = useState<boolean>(false) // 选择转化ID弹窗控制
     const [subVisible, setSubVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
-    const [cpVisible, setCpVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
     const [pageVisible, setPageVisible] = useState<boolean>(false) // 选择云端落地页控制
     const [wxButtonList, setWxButtonList] = useState<WxAutoButton[]>([])
     const [tableData, setTableData] = useState<any[]>([])   // 预览表格
@@ -111,12 +107,6 @@ const CreateAd: React.FC = () => {
     }, [])
 
     /** 获取广告详情 */
-    useEffect(() => {
-        if (queryForm?.sysAdgroupId) {
-            getSysAdgroups.run(queryForm?.sysAdgroupId)
-        }
-    }, [queryForm?.sysAdgroupId])
-
     useEffect(() => {
         if (getSysAdgroups?.data?.bidMode !== 'BID_MODE_CPM' && accountCreateLogs?.length > 0) {
             let newAccountCreateLogs = accountCreateLogs?.map((item: any) => {
@@ -131,17 +121,13 @@ const CreateAd: React.FC = () => {
 
     /** 获取创意详情 */
     useEffect(() => {
-        if (queryForm?.sysAdcreativeId) {
-            getSysAdcreative.run(queryForm?.sysAdcreativeId)
+        if (queryForm?.sysAdcreativeId && queryForm.sysAdcreativeId !== getSysAdcreative.params[0]) {
+            getSysAdcreative.run(queryForm?.sysAdcreativeId).then(res=>{
+                setQueryForm({...queryForm,sysAdcreative:res})
+            })
         }
-    }, [queryForm?.sysAdcreativeId])
+    }, [queryForm])
 
-    /** 获取定向详情 */
-    useEffect(() => {
-        if (queryForm?.sysTargetingId) {
-            getsysTargeting.run(queryForm?.sysTargetingId)
-        }
-    }, [queryForm?.sysTargetingId])
 
     /** 获取落地页详情 */
     useEffect(() => {
@@ -292,6 +278,7 @@ const CreateAd: React.FC = () => {
             sysPageId: undefined, // 落地页Id
         })
     }
+    console.log(queryForm)
 
     return <Space direction="vertical" style={{ width: '100%' }}>
         <Card title={<div className={style.cardTitle}>配置区</div>} className={style.createAd} hoverable>
@@ -304,8 +291,10 @@ const CreateAd: React.FC = () => {
                         maxTagCount={1}
                         allowClear
                         bordered={false}
-                        filterOption={(input: any, option: any) =>
-                            (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                        filterOption={(input: any, option: any) => {
+                            return option!.children?.toString().toLowerCase().includes(input.toLowerCase())
+                        }
+
                         }
                         value={accountCreateLogs?.map((item: { id: number }) => item?.id)}
                         onChange={(e, option) => {
@@ -313,7 +302,7 @@ const CreateAd: React.FC = () => {
                             clearData()
                         }}
                     >
-                        {getAdAccount?.data?.data?.map((item: any) => <Select.Option value={item.id} key={item.id}>{item.accountId}</Select.Option>)}
+                        {getAdAccount?.data?.data?.map((item: any) => <Select.Option value={item.id} key={item.id}>{item.accountId+'——'+item.remark}</Select.Option>)}
                         {/* <Select.OptGroup label="Engineer">
                             <Select.Option value="20632113">20632113</Select.Option>
                         </Select.OptGroup> */}
@@ -323,7 +312,7 @@ const CreateAd: React.FC = () => {
                 <Selector label="推广目标">
                     <Select style={{ width: 200 }} value={queryForm?.promotedObjectType} placeholder="请选择推广目标" bordered={false} showSearch filterOption={(input: any, option: any) =>
                         (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
-                    } onChange={(e) => { setQueryForm({ ...queryForm, promotedObjectType: e }); clearData() }}>
+                    } onChange={(e) => { setQueryForm({ ...queryForm, promotedObjectType: e ,sysAdgroup:null,sysAdgroupId:undefined,sysAdcreative:null,sysAdcreativeId:undefined}); clearData() }}>
                         {Object.keys(PromotedObjectType).map(key => {
                             return <Select.Option value={key} key={key}>{PromotedObjectType[key]}</Select.Option>
                         })}
@@ -337,90 +326,20 @@ const CreateAd: React.FC = () => {
                         <Row className={`${style.conTitle} ${style.conRightBorder}`}><Col span={24}>广告</Col></Row>
                         <Row className={style.items}>
                             {/* =============广告基本信息=========== */}
-                            <Col className={style.conRightBorder}>
-                                <div className={style.top}>
-                                    广告基本信息
-                                </div>
-                                <div className={style.center}>
-                                    <Spin spinning={getSysAdgroups.loading}>
-                                        <div className={style.centerContent}>
-                                            {getSysAdgroups?.data ? <AdgroupsCol data={getSysAdgroups?.data} /> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
-                                        </div>
-                                    </Spin>
-                                </div>
-                                <div className={style.bottom}>
-                                    {queryForm?.promotedObjectType ? <span onClick={() => { setAdVisible(true) }}>{getSysAdgroups?.data ? '修改' : '添加'}</span> : <Tooltip title="请先选择推广目标">
-                                        <span>添加</span>
-                                    </Tooltip>}
-                                </div>
-                            </Col>
+                            <Ad queryForm={queryForm} setQueryForm={setQueryForm} getSysAdgroups={getSysAdgroups} clearData={clearData} />
                             {/* =============定向包=========== */}
-                            <Col className={style.conRightBorder}>
-                                <div className={style.top}>
-                                    定向
-                                    {getSysAdgroups?.data?.bidMode === 'BID_MODE_CPM' && <>{accountCreateLogs?.length > 0 && queryForm?.sysTargetingId ? <Button type="link" style={{ fontSize: 12, padding: 0 }} onClick={() => setCpVisible(true)}>选择定向包</Button> : <Tooltip title={accountCreateLogs?.length > 0 ? `请先添加定向` : `请先选择媒体账户`}>
-                                        <Button type="link" style={{ fontSize: 12, padding: 0 }}>选择定向包</Button>
-                                    </Tooltip>}</>}
-                                </div>
-                                <div className={style.center}>
-                                    <Spin spinning={getsysTargeting.loading}>
-                                        <div className={style.centerContent}>
-                                            {queryForm?.sysTargetingId ? <>
-                                                {accountCreateLogs?.some((item: any) => item?.customAudienceList?.length > 0) ? <>
-                                                    {getsysTargeting?.data && <Popover
-                                                        content={<div className={style.popover}>
-                                                            <TargetingTooltip data={getsysTargeting?.data} geoLocationList={geoLocationList} modelList={modelList} />
-                                                        </div>}
-                                                        trigger="hover"
-                                                        placement="right"
-                                                    >
-                                                        <div className={style.popoverContent}>
-                                                            <div>定向名称: <span>{getsysTargeting?.data?.targetingName}</span></div>
-                                                            <div>定向描述: <span>{getsysTargeting?.data?.description || '<空>'}</span></div>
-                                                        </div>
-                                                    </Popover>}
-                                                    {accountCreateLogs?.map((item: any, index: number) => {
-                                                        if (item?.customAudienceList) {
-                                                            return <div className={style.acc} key={index}>
-                                                                <div className={style.accName} style={{ fontWeight: 800 }}>{item.adAccountId}</div>
-                                                                {item?.customAudienceList?.length > 0 && <>
-                                                                    <div className={style.accName}>定向用户群</div>
-                                                                    {
-                                                                        item?.customAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
-                                                                            return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
-                                                                                cpDel(index, index1, 'customAudienceList')
-                                                                            }} /></div>
-                                                                        })
-                                                                    }
-                                                                </>}
-                                                                {item?.excludedCustomAudienceList?.length > 0 && <>
-                                                                    <div className={style.accName} style={{ marginTop: 5 }}>排除用户群</div>
-                                                                    {
-                                                                        item?.excludedCustomAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
-                                                                            return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
-                                                                                cpDel(index, index1, 'excludedCustomAudienceList')
-                                                                            }} /></div>
-                                                                        })
-                                                                    }
-                                                                </>}
-                                                            </div>
-                                                        } else {
-                                                            return null
-                                                        }
-                                                    })}
-                                                </> : <>
-                                                    <div>定向名称: <span>{getsysTargeting?.data?.targetingName}</span></div>
-                                                    <div>定向描述: <span>{getsysTargeting?.data?.description || '<空>'}</span></div>
-                                                    <TargetingTooltip data={getsysTargeting?.data} geoLocationList={geoLocationList} modelList={modelList} />
-                                                </>}
-
-
-                                            </> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
-                                        </div>
-                                    </Spin>
-                                </div>
-                                <div className={style.bottom}><span onClick={() => { setDxVisible(true) }}>{getsysTargeting?.data ? '修改' : '添加'}</span></div>
-                            </Col>
+                            <TargetIng
+                                queryForm={queryForm}
+                                setQueryForm={setQueryForm}
+                                getSysAdgroups={getSysAdgroups}
+                                clearData={clearData}
+                                setAccountCreateLogs={setAccountCreateLogs}
+                                getsysTargeting={getsysTargeting}
+                                geoLocationList={geoLocationList}
+                                modelList={modelList}
+                                cpDel={cpDel}
+                                accountCreateLogs={accountCreateLogs}
+                            />
                             {/* =============商品=========== */}
                             <Col className={style.conRightBorder}>
                                 <div className={style.top}>
@@ -491,22 +410,7 @@ const CreateAd: React.FC = () => {
                         <Row className={style.conTitle}><Col span={24}>广告创意</Col></Row>
                         <Row className={style.items}>
                             {/* 创意 */}
-                            <Col span={12} className={style.conRightBorder}>
-                                <div className={style.top}>创意基本信息</div>
-                                <div className={style.center}>
-                                    <Spin spinning={getSysAdcreative.loading}>
-                                        <div className={style.centerContent}>
-                                            {(getSysAdcreative?.data && queryForm?.sysAdcreativeId) && <AdcreativeCol data={getSysAdcreative?.data} />}
-                                        </div>
-                                    </Spin>
-                                </div>
-                                <div className={style.bottom}>{queryForm?.sysAdgroupId ? <>
-                                    <Button type="link" onClick={() => { setCreativeVisible(true) }}>{queryForm?.sysAdcreativeId ? '修改' : '添加'}</Button>
-                                </> : <Tooltip title="请先设置广告">
-                                    <Button type="link"><span>添加</span></Button>
-                                </Tooltip>}
-                                </div>
-                            </Col>
+                            <Creative queryForm={queryForm} setQueryForm={setQueryForm} getSysAdgroups={getSysAdgroups} clearData={clearData} getSysAdcreative={getSysAdcreative}/>
                             {/* 落地页 */}
                             <Col span={12} >
                                 <div className={style.top}>
@@ -623,20 +527,13 @@ const CreateAd: React.FC = () => {
         </Card>
 
 
-        {/* 选择广告 */}
-        {adVisible && <AdModal visible={adVisible} onClose={() => setAdVisible(false)} promotedObjectType={queryForm.promotedObjectType as string} onChange={(e) => { setQueryForm({ ...queryForm, sysAdgroupId: e, sysAdcreativeId: undefined }); setAdVisible(false); clearData() }} sysAdgroupId={queryForm?.sysAdgroupId} />}
-        {/* 选择定向 */}
-        {dxVisible && <TargetingModal visible={dxVisible} onClose={() => setDxVisible(false)} onChange={(e) => { setQueryForm({ ...queryForm, sysTargetingId: e }); setDxVisible(false); clearData() }} sysTargetingId={queryForm?.sysTargetingId} />}
-        {/* 选择创意 */}
-        {creativeVisible && <CreativeModal siteSet={getSysAdgroups?.data?.siteSet} visible={creativeVisible} onClose={() => setCreativeVisible(false)} onChange={(e) => { setQueryForm({ ...queryForm, sysAdcreativeId: e }); setCreativeVisible(false); clearData() }} sysAdcreativeId={queryForm?.sysAdcreativeId} promotedObjectType={queryForm.promotedObjectType as string} />}
+       
         {/* 选择商品 */}
         {goodsVisible && <GoodsModal visible={goodsVisible} data={accountCreateLogs} onClose={() => setGoodsVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setGoodsVisible(false); clearData() }} />}
         {/* 选择数据源 */}
         {sourceVisible && <DataSourceModal visible={sourceVisible} data={accountCreateLogs} onClose={() => setSourceVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setSourceVisible(false); clearData() }} />}
         {/* 选择转化ID */}
         {idVisible && <IdModal visible={idVisible} data={accountCreateLogs} onClose={() => setIdVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setSourceVisible(false); clearData() }} />}
-        {/* 选择定向包 */}
-        {cpVisible && <CrowdPackModal visible={cpVisible} data={accountCreateLogs} onClose={() => setCpVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setCpVisible(false); clearData() }} />}
         {/* 选择ADQ落地页 */}
         {pageVisible && <PageModal visible={pageVisible} data={accountCreateLogs} onClose={() => setPageVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setPageVisible(false); clearData() }} />}
         {/* 选择素材 */}

+ 140 - 0
src/pages/launchSystemNew/launchManage/createAd/targeting/index.tsx

@@ -0,0 +1,140 @@
+import { CreateAdProps } from "@/services/launchAdq/createAd"
+import { BaseResult } from "@ahooksjs/use-request/lib/types"
+import { CloseOutlined } from "@ant-design/icons"
+import { Button, Col, Empty, Popover, Space, Spin, Tooltip } from "antd"
+import React, { useCallback, useState } from "react"
+import TargetingModal from "../../../components/targetingModal"
+import TargetingPup from "./modal"
+import TargetingTooltip from "../../../components/targetingTooltip"
+import CrowdPackModal from "../../../components/crowdPackModal"
+import style from '../index.less'
+import { ModalConfig } from "./modal"
+type Props = {
+    queryForm: Partial<CreateAdProps>,
+    setQueryForm: React.Dispatch<React.SetStateAction<Partial<CreateAdProps>>>,
+    setAccountCreateLogs: React.Dispatch<React.SetStateAction<{
+        adAccountId: number;
+        id: number;
+        userActionSetsList?: number | undefined;
+        productList?: any;
+        conversionList?: any;
+        customAudienceList?: any;
+        excludedCustomAudienceList?: any;
+        pageList?: any;
+    }[]>>,
+    getSysAdgroups: BaseResult<any, any>,
+    getsysTargeting: BaseResult<any, any>,
+    accountCreateLogs: any[],
+    geoLocationList: any[],
+    modelList: any[],
+    clearData: () => void,
+    cpDel: (index: number, num: number, key: string) => void,
+}
+function TargetIng(props: Props) {
+    let { queryForm, getSysAdgroups, getsysTargeting, accountCreateLogs, geoLocationList, modelList, setQueryForm, clearData, cpDel, setAccountCreateLogs } = props
+    const [adModalConfig, setAdModalConfig] = useState<ModalConfig>({//新建广告弹窗
+        visible: false,
+        type: 'add'
+    })
+    const [dxVisible, setDxVisible] = useState<boolean>(false) // 选择定向弹窗控制
+    const [cpVisible, setCpVisible] = useState<boolean>(false) // 选择设置名称弹窗控制
+
+    // 设置变量
+    const handleAdModalConfig = useCallback((arg: ModalConfig) => {
+        setAdModalConfig({ ...adModalConfig, ...arg })
+    }, [adModalConfig])
+     // 获取定向详情
+     const getInfo = useCallback((sysTargetingId) => {
+        getsysTargeting.run(sysTargetingId).then(res=>{
+            setQueryForm({ ...queryForm, sysTargetingId: sysTargetingId,sysTargeting:res });
+             setDxVisible(false);
+              clearData() 
+        })
+    }, [queryForm])
+    return <Col className={style.conRightBorder}>
+        <div className={style.top}>
+            定向
+            {getSysAdgroups?.data?.bidMode === 'BID_MODE_CPM' && <>{accountCreateLogs?.length > 0 && queryForm?.sysTargetingId ? <Button type="link" style={{ fontSize: 12, padding: 0 }} onClick={() => setCpVisible(true)}>选择定向包</Button> : <Tooltip title={accountCreateLogs?.length > 0 ? `请先添加定向` : `请先选择媒体账户`}>
+                <Button type="link" style={{ fontSize: 12, padding: 0 }}>选择定向包</Button>
+            </Tooltip>}</>}
+            {queryForm.sysTargeting && <a onClick={() => {
+                setQueryForm({ ...queryForm, sysTargeting: undefined, sysTargetingId: undefined})
+                setAccountCreateLogs([])
+            }}>清空</a>}
+        </div>
+        <div className={style.center}>
+            <Spin spinning={getsysTargeting.loading}>
+                <div className={style.centerContent}>
+                    {queryForm?.sysTargetingId ? <>
+                        {accountCreateLogs?.some((item: any) => item?.customAudienceList?.length > 0) ? <>
+                            {queryForm.sysTargeting && <Popover
+                                content={<div className={style.popover}>
+                                    <TargetingTooltip data={queryForm.sysTargeting} geoLocationList={geoLocationList} modelList={modelList} />
+                                </div>}
+                                trigger="hover"
+                                placement="right"
+                            >
+                                <div className={style.popoverContent}>
+                                    <div>定向名称: <span>{queryForm?.sysTargeting?.targetingName}</span></div>
+                                    <div>定向描述: <span>{queryForm?.sysTargeting?.description || '<空>'}</span></div>
+                                </div>
+                            </Popover>}
+                            {accountCreateLogs?.map((item: any, index: number) => {
+                                if (item?.customAudienceList) {
+                                    return <div className={style.acc} key={index}>
+                                        <div className={style.accName} style={{ fontWeight: 800 }}>{item.adAccountId}</div>
+                                        {item?.customAudienceList?.length > 0 && <>
+                                            <div className={style.accName}>定向用户群</div>
+                                            {
+                                                item?.customAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
+                                                    return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
+                                                        cpDel(index, index1, 'customAudienceList')
+                                                    }} /></div>
+                                                })
+                                            }
+                                        </>}
+                                        {item?.excludedCustomAudienceList?.length > 0 && <>
+                                            <div className={style.accName} style={{ marginTop: 5 }}>排除用户群</div>
+                                            {
+                                                item?.excludedCustomAudienceList?.map((pack: { name: string, id: number }, index1: number) => {
+                                                    return <div className={style.accCon} key={pack.id}>{pack.name}<CloseOutlined className={style.close} onClick={() => {
+                                                        cpDel(index, index1, 'excludedCustomAudienceList')
+                                                    }} /></div>
+                                                })
+                                            }
+                                        </>}
+                                    </div>
+                                } else {
+                                    return null
+                                }
+                            })}
+                        </> : <>
+                            <div>定向名称: <span>{queryForm?.sysTargeting?.targetingName}</span></div>
+                            <div>定向描述: <span>{queryForm?.sysTargeting?.description || '<空>'}</span></div>
+                            <TargetingTooltip data={queryForm?.sysTargeting} geoLocationList={geoLocationList} modelList={modelList} />
+                        </>}
+
+
+                    </> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
+                </div>
+            </Spin>
+        </div>
+        <div className={style.bottom}>
+            <Space size={20}>
+                <span onClick={() => { setDxVisible(true) }}>{queryForm?.sysTargeting ? '重选定向' : '选择定向'}</span>
+                <span onClick={() => {handleAdModalConfig(queryForm?.sysTargeting ? { visible: true,type: 'edit' }:{ visible: true ,type: 'add'}) }}>{queryForm?.sysTargeting ? '编辑定向' : '新建定向'}</span>
+            </Space>
+        </div>
+        {/* 选择定向 */}
+        {dxVisible && <TargetingModal visible={dxVisible} onClose={() => setDxVisible(false)} onChange={getInfo} sysTargetingId={queryForm?.sysTargetingId} />}
+        {/* 选择定向包 */}
+        {cpVisible && <CrowdPackModal visible={cpVisible} data={accountCreateLogs} onClose={() => setCpVisible(false)} onChange={(e) => { setAccountCreateLogs(e); setCpVisible(false); clearData() }} />}
+        {/* 新建定向包 */}
+        {adModalConfig.visible && <TargetingPup visible={adModalConfig.visible} PupFn={handleAdModalConfig} callback={(values: any) => {
+            setQueryForm({ ...queryForm, sysTargeting: values, }); setDxVisible(false); clearData();
+            handleAdModalConfig({ visible: false, dataInfo: null, type: 'add' }) 
+        }} type={adModalConfig.type} dataInfo={queryForm.sysTargeting} />}
+    </Col>
+}
+
+export default TargetIng

+ 646 - 0
src/pages/launchSystemNew/launchManage/createAd/targeting/modal/index.tsx

@@ -0,0 +1,646 @@
+import React, { useCallback, useState, useEffect } from 'react'
+import { Modal, Form, Input, Divider, Select, Radio, Checkbox, TreeSelect, Button, Space } from 'antd'
+import { GenderEnum, EducationEnum, ExcludedDimensionEnum, MaritalStatusEnum, OptimizationGoalEnum, UserOsEnum, DevicePriceEnum, NetworkEnum, WechatAdBehaviorEnum } from '@/services/launchAdq/enum'
+import { useAjax } from '@/Hook/useAjax'
+import { getTagsList } from '@/services/launchAdq/global'
+import { createsysTargeting } from '@/services/launchAdq/targeting'
+interface Props {
+    title?: string,
+    visible: boolean,
+    PupFn: (arg: ModalConfig) => void,
+    callback: (params: any) => void,
+    confirmLoading?: boolean,
+    type?: 'add' | 'look' | 'edit',//新增,查看,编辑
+    dataInfo?: any
+}
+export interface ModalConfig {
+    visible: boolean;
+    title?: string;
+    type?: 'add' | 'look' | 'edit',
+    dataInfo?: null
+}
+const ios_os = Object.keys(UserOsEnum).filter(key => key.includes('IOS'))
+const android_os = Object.keys(UserOsEnum).filter(key => key.includes('ANDROID'))
+/**定向弹窗弹窗*/
+function TargetingPup(props: Props) {
+    let { visible, PupFn, callback, type, dataInfo } = props
+    let [template_checked, settemplate_checked] = useState<boolean>(localStorage.getItem('template_checked') === '1' || false)
+    const create = useAjax((params) => createsysTargeting(params))
+    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<any[]>([])
+    // form 监听
+    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))
+            // 开启存为模板开关执行
+            if (template_checked && type === 'add') {
+                create.run(newValues).then(res => {
+                    if (res) {
+                        callback(newValues)
+                    }
+                })
+            } else {
+                callback(newValues)
+            }
+        })
+    }, [form, regionsList, template_checked, type])
+
+    // 监听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 <Modal
+        visible={visible}
+        title={type === 'add' ? '新建定向' : type === 'look' ? '定向详情' : '编辑定向'}
+        onCancel={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}
+        width={900}
+        footer={<Space>
+            <Button onClick={() => { PupFn({ visible: false, dataInfo: null, type: 'add' }) }}>取消</Button>
+            <Button type='primary' onClick={handleOk}>确定</Button>
+            {type === 'add' &&<Checkbox checked={template_checked} onChange={(e) => {
+                let checked = e.target.checked
+                settemplate_checked(checked)
+                localStorage.setItem('template_checked', checked ? '1' : '0')
+            }}>存为模板</Checkbox>}
+        </Space>}
+        confirmLoading={create?.loading || tagsList_REGION?.loading || tagsList_MODEL?.loading}
+        {...arg}
+    >
+        <Form
+            form={form}
+            labelCol={{ span: 3 }}
+            initialValues={
+                {
+                    geoLocationType: '0',
+                    educationType: '0',
+                    ageType: '0',
+                    gender: '0',
+                    maritalStatusType: '0',
+                    age_min: 14,
+                    age_max: 66,
+                    targetingName: '',
+                    excludedDimension: '0',
+                    userOsType: '0',
+                    devicePriceType: '0',
+                    networkType: '0',
+                    wechatAdBehaviorType: '0',
+                    deviceBrandModelType: '0'
+                }
+            }
+        >
+            {/* ============================================================基本信息============================================================= */}
+            <Divider orientation='left'><h3>基本信息</h3></Divider>
+            {/* ====================定向名称========================= */}
+            <Form.Item label={<strong>定向名称</strong>} name='targetingName' rules={[{ required: true, message: '请输入定向名称!' }]}>
+                <Input placeholder='定向名称' style={{ width: 300 }} />
+            </Form.Item>
+            {/* ====================定向描述========================= */}
+            <Form.Item label={<strong>定向描述</strong>} name='description' >
+                <Input.TextArea placeholder='定向名称' style={{ width: 300 }} rows={2} />
+            </Form.Item>
+            {/* ============================================================排期与出价============================================================= */}
+            <Divider orientation='left'>人口学数学</Divider>
+            {/* ====================地理位置========================= */}
+            <Form.Item label={<strong>地理位置</strong>} name='geoLocationType' style={geoLocationType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">按区域</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                geoLocationType === '1' && <Form.Item
+                    style={{ marginLeft: 107, marginBottom: 10 }}
+                    name='regions'
+                    rules={[{ type: 'array', max: 1000, message: '最多选择1000' }]}
+                >
+                    <TreeSelect
+                        showSearch={true}
+                        maxTagCount={50}
+                        treeCheckable={true}
+                        showCheckedStrategy={TreeSelect.SHOW_PARENT}
+                        treeData={regionsList}
+                        style={{ width: '100%' }}
+                        allowClear
+                        filterTreeNode={(inputValue: string, treeNode: any) => {
+                            if (treeNode.title.includes(inputValue)) {
+                                return true
+                            } else {
+                                return false
+                            }
+                        }}
+                    />
+                </Form.Item>
+            }
+            {/* ====================年龄========================= */}
+            <Form.Item label={<strong>年龄</strong>} name='ageType' style={ageType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                ageType === '1' && <div style={{ display: 'flex', justifyContent: 'left', alignItems: 'center' }}>
+                    <Form.Item style={{ marginLeft: 107 }} name='age_min'>
+                        <Select style={{ width: 120 }} >
+                            {
+                                Array(66 - 13).fill('').map((n, i) => i + 14).filter(i => i !== 15 && i !== 16 && i !== 17).map(i => {
+                                    return <Select.Option disabled={i > age_max} value={i} key={i}>{i === 66 ? '66 岁及以上' : i + ' 岁'}</Select.Option>
+                                })
+
+                            }
+
+                        </Select>
+                    </Form.Item>
+                    <Form.Item style={{ marginLeft: 10 }} name='age_max'>
+                        <Select style={{ width: 120 }}>
+                            {
+                                Array(66 - 17).fill('').map((n, i) => {
+                                    return <Select.Option disabled={i + 18 < age_min} value={i + 18} key={i + 18}>{i + 18 === 66 ? '66 岁及以上' : i + 18 + ' 岁'}</Select.Option>
+                                })
+                            }
+
+                        </Select>
+                    </Form.Item>
+                </div>
+            }
+            {/* ====================性别========================= */}
+            <Form.Item label={<strong>性别</strong>} name='gender'>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    {
+                        Object.keys(GenderEnum).map(key => {
+                            return <Radio.Button value={key} key={key}>{GenderEnum[key]}</Radio.Button>
+                        })
+                    }
+
+                </Radio.Group>
+            </Form.Item>
+            {/* ====================学历========================= */}
+            <Form.Item label={<strong>学历</strong>} name='educationType' style={educationType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                educationType === '1' && <Form.Item style={{ marginLeft: 107 }} name='education'>
+                    <Checkbox.Group options={Object.keys(EducationEnum).map(key => ({ label: EducationEnum[key], value: key }))} />
+                </Form.Item>
+            }
+            {/* ====================婚恋育儿状态========================= */}
+            <Form.Item label={<strong>婚恋育儿状态</strong>} name='maritalStatusType' style={maritalStatusType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                maritalStatusType === '1' && <Form.Item style={{ marginLeft: 107 }} name='maritalStatus'>
+                    <Checkbox.Group options={Object.keys(MaritalStatusEnum).map(key => ({ label: MaritalStatusEnum[key], value: key }))} />
+                </Form.Item>
+            }
+
+            {/* ============================================================用户行为============================================================= */}
+            <Divider orientation='left'>用户行为</Divider>
+            {/* <Form.Item label={<strong>行为兴趣意向</strong>} name='behaviorOrInterestType'>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item> */}
+            {/* ====================排除已转化用户========================= */}
+            <Form.Item label={<strong>排除已转化用户</strong>} name='excludedDimension' style={excludedDimension !== '0' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    {
+                        Object.keys(ExcludedDimensionEnum).map(key => {
+                            return <Radio.Button value={key} key={key}>{ExcludedDimensionEnum[key]}</Radio.Button>
+                        })
+                    }
+                </Radio.Group>
+            </Form.Item>
+            {
+                excludedDimension !== '0' && <Form.Item style={{ marginLeft: 107 }} name='conversionBehaviorList'>
+                    <Select style={{ width: 300 }} showSearch filterOption={(input, option) =>
+                        (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                    } allowClear placeholder='转化行为,不选为默认行为'>
+                        {
+                            Object.keys(OptimizationGoalEnum).map(key => {
+                                return <Select.Option value={key} key={key}>{OptimizationGoalEnum[key]}</Select.Option>
+                            })
+                        }
+                    </Select>
+                </Form.Item>
+            }
+            {/* ============================================================自定义人群============================================================= */}
+            {/* <Divider orientation='left'>自定义人群</Divider> */}
+            {/* ====================自定义人群========================= */}
+            {/* <Form.Item label={<strong>自定义人群</strong>} name='customAudienceType'>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item> */}
+
+            {/* ============================================================设备定向============================================================= */}
+            <Divider orientation='left'>设备定向</Divider>
+            {/* ====================设备品牌型号========================= */}
+            <Form.Item label={<strong>设备品牌型号</strong>} name='deviceBrandModelType' style={deviceBrandModelType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                deviceBrandModelType === '1' && <>
+                    <Form.Item style={{ marginLeft: 107, marginBottom: 10 }}
+                        name='deviceBrandModelList'
+                        rules={[{ type: 'array', max: 400, message: '最多选择400个设备型号' }]}
+                    >
+                        <TreeSelect
+                            showSearch={true}
+                            maxTagCount={50}
+                            treeCheckable={true}
+                            showCheckedStrategy={TreeSelect.SHOW_CHILD}
+                            treeData={modelList}
+                            style={{ width: '100%' }}
+                            allowClear
+                            filterTreeNode={(inputValue: string, treeNode: any) => {
+                                if (treeNode.title.includes(inputValue)) {
+                                    return true
+                                } else {
+                                    return false
+                                }
+                            }}
+                        />
+                    </Form.Item>
+                    <Form.Item name='isexcluded' valuePropName="checked" style={{ marginLeft: 107, marginBottom: 10 }} >
+                        <Checkbox ><p style={{
+                            position: 'absolute',
+                            width: '95%',
+                            top: '50%',
+                            transform: 'translate(0, -50%)'
+                        }}>排除所选设备的用户 <span style={{ float: 'right' }}>已选 <span style={deviceBrandModelList?.length > 400 ? { color: 'red' } : {}}>{deviceBrandModelList?.length ?? 0}</span>/400</span></p></Checkbox>
+                    </Form.Item>
+                </>
+            }
+            {/* ====================操作系统版本========================= */}
+            <Form.Item label={<strong>操作系统版本</strong>} name='userOsType' style={userOsType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                userOsType === '1' && <>
+                    <Form.Item style={{ marginLeft: 107, marginBottom: 0 }} name='userOsIosAll' valuePropName="checked" getValueFromEvent={(e) => {
+                        let checked = e.target.checked
+                        form.setFieldsValue({ userOsIos: checked ? ios_os : [] })
+                        setIndeterminateIos(false)
+                    }}>
+                        <Checkbox indeterminate={indeterminateIos} >
+                            IOS全选
+                        </Checkbox>
+                    </Form.Item>
+                    <Form.Item style={{ marginLeft: 107 }} name='userOsIos' >
+                        <Checkbox.Group
+                            options={
+                                ios_os.map(key => {
+                                    return { label: UserOsEnum[key], value: key }
+                                })
+                            }
+                        />
+                    </Form.Item>
+                    <Form.Item style={{ marginLeft: 107, marginBottom: 0 }} name='userOsAndroidAll' valuePropName="checked" getValueFromEvent={(e) => {
+                        let checked = e.target.checked
+                        form.setFieldsValue({ userOsAndroid: checked ? android_os : [] })
+                        setIndeterminateAndroid(false)
+                    }}>
+                        <Checkbox indeterminate={indeterminateAndroid}>
+                            Android全选
+                        </Checkbox>
+                    </Form.Item>
+                    <Form.Item style={{ marginLeft: 107 }} name='userOsAndroid'>
+                        <Checkbox.Group
+                            options={
+                                android_os.map(key => {
+                                    return { label: UserOsEnum[key], value: key }
+                                })
+                            }
+                        />
+                    </Form.Item>
+                </>
+            }
+            {/* ====================联网方式========================= */}
+            <Form.Item label={<strong>联网方式</strong>} name='networkType' style={networkType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                networkType === '1' && <Form.Item style={{ marginLeft: 107 }} name='network'>
+                    <Checkbox.Group options={Object.keys(NetworkEnum).map(key => ({ label: NetworkEnum[key], value: key }))} />
+                </Form.Item>
+            }
+            {/* ====================设备价格========================= */}
+            <Form.Item label={<strong>设备价格</strong>} name='devicePriceType' style={devicePriceType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                devicePriceType === '1' && <Form.Item style={{ marginLeft: 107 }} name='devicePrice'>
+                    <Checkbox.Group options={Object.keys(DevicePriceEnum).map(key => ({ label: DevicePriceEnum[key], value: key }))} />
+                </Form.Item>
+            }
+            {/* ============================================================流量方数学============================================================= */}
+            <Divider orientation='left'>流量方数学</Divider>
+            {/* ====================微信再营销========================= */}
+            <Form.Item label={<strong>微信再营销</strong>} name='wechatAdBehaviorType' style={wechatAdBehaviorType === '1' ? { marginBottom: 5 } : {}}>
+                <Radio.Group >
+                    <Radio.Button value="0">不限</Radio.Button>
+                    <Radio.Button value="1">自定义</Radio.Button>
+                </Radio.Group>
+            </Form.Item>
+            {
+                wechatAdBehaviorType === '1' && <>
+                    <p style={{ marginBottom: 5, marginLeft: 107 }}><strong style={{ marginRight: 20 }}>再营销</strong></p>
+                    <Form.Item style={{ marginLeft: 107, marginBottom: 10 }} name='actions'>
+                        <Checkbox.Group options={Object.keys(WechatAdBehaviorEnum).map(key => ({ label: WechatAdBehaviorEnum[key], value: key, disabled: excludedActions?.some((k: string) => k === key) }))} />
+                    </Form.Item>
+                    <p style={{ marginBottom: 5, marginLeft: 107 }}><strong style={{ marginRight: 20 }}>排除营销</strong></p>
+                    <Form.Item style={{ marginLeft: 107 }} name='excludedActions'>
+                        <Checkbox.Group options={Object.keys(WechatAdBehaviorEnum).map(key => ({ label: WechatAdBehaviorEnum[key], value: key, disabled: actions?.some((k: string) => k === key) }))} />
+                    </Form.Item>
+                </>
+            }
+        </Form>
+    </Modal >
+}
+export default TargetingPup

+ 2 - 2
src/pages/launchSystemNew/launchManage/localAd/ad/index.tsx

@@ -78,9 +78,9 @@ function Ad() {
             pageSize={sysAdgroupsList?.data?.data?.size}
             leftChild={<>
                 <Row gutter={[10, 10]}>
-                    <Col span={24}><Button type='primary' onClick={() => {
+                    {/* <Col span={24}><Button type='primary' onClick={() => {
                         handleModalConfig({ visible: true })
-                    }}>新建广告模板</Button></Col>
+                    }}>新建广告模板</Button></Col> */}
                     <Col>
                         <Input
                             placeholder='广告名称'

+ 1 - 1
src/pages/launchSystemNew/launchManage/localAd/ad/modal.tsx

@@ -12,7 +12,7 @@ interface Props {
     visible: boolean,
     PupFn: (arg: ModalConfig) => void,
     callback: (params: any) => void,
-    confirmLoading: boolean,
+    confirmLoading?: boolean,
     type?: 'add' | 'look' | 'edit',//新增,查看,编辑
     dataInfo?: any
 }

+ 1 - 6587
src/pages/launchSystemNew/launchManage/localAd/adenum.ts

@@ -1,6591 +1,5 @@
-import { AdcreativeTemplate } from '@/services/launchAdq';
 
-export const adcreativeTemplateList = [
-  // 720
-  {
-    //创意规格示意图链接
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/creative_template_720.svg',
-    adcreative_template_appellation: '横版视频 16:9', //创意形式名称
-    adcreative_template_id: 720, //创意形式 id
-    adcreative_template_style: '视频', //创意形式类型
-    xd_show: true,
-    sp_show: true,
-    adcreativeElements: {
-      description: '文案(1-30字)',
-      video:
-        '视频比例(宽:高):9:16,最小尺寸(宽×高):720*1280,大小:不超过102400 KB,时长:5~30 s,格式:*.mp4|*.avi|*.mov;',
-      end_page: {
-        end_page_type: '视频结束页类型',
-        end_page_desc: '结束页文案,字数:1~12;',
-      },
-    },
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: true,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案(1-30字)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '视频结束页类型',
-        element_type: 'ELEMENT_TYPE_ENUM',
-        enum_property: {
-          default: 'END_PAGE_AVATAR_NICKNAME_HIGHLIGHT',
-          enumeration: [
-            {
-              description: '突出头像及昵称',
-              value: 'END_PAGE_AVATAR_NICKNAME_HIGHLIGHT',
-            },
-            {
-              description: '突出文案',
-              value: 'END_PAGE_DESCRIPTION_HIGHLIGHT',
-            },
-          ],
-        },
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'end_page_type',
-        parent_name: 'end_page',
-        required: true,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '结束页文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'end_page_desc',
-        parent_name: 'end_page',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '视频结束页',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'end_page',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: '视频',
-        element_type: 'ELEMENT_TYPE_VIDEO',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'video',
-        parent_name: '',
-        required: true,
-        restriction: {
-          video_restriction: {
-            file_format: ['MEDIA_TYPE_MP4', 'MEDIA_TYPE_MOV', 'MEDIA_TYPE_AVI'],
-            file_size: 102400,
-            height: 0,
-            max_duration: 30,
-            min_duration: 5,
-            min_height: 720,
-            min_width: 1280,
-            ratio_height: 9,
-            ratio_width: 16,
-            width: 0,
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    landing_page_config: {
-      //支持的落地页类型
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-            ],
-            required: true,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT', //推广目标类型
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'], //投放版位集合
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'], //支持的出价方式
-    support_billing_spec_list: [
-      //支持的计费信息
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION', //计费方式
-        max_price: 99900, //最高出价,单位分
-        min_price: 150, //最低出价,单位分
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      //
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: [],
-      },
-    ],
-  },
-  //721
-  {
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/creative_template_721.svg',
-    adcreative_template_appellation: '竖版视频 9:16',
-    adcreative_template_id: 721,
-    adcreative_template_style: '视频',
-    xd_show: true,
-    adcreativeElements: {
-      description: '文案(1-30字)',
-      video:
-        '视频比例(宽:高):9:16,最小尺寸(宽×高):720*1280,大小:不超过102400 KB,时长:5~30 s,格式:*.mp4|*.avi|*.mov;',
-    },
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: true,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案(1-30字)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '视频',
-        element_type: 'ELEMENT_TYPE_VIDEO',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'video',
-        parent_name: '',
-        required: true,
-        restriction: {
-          video_restriction: {
-            file_format: ['MEDIA_TYPE_MP4', 'MEDIA_TYPE_MOV', 'MEDIA_TYPE_AVI'],
-            file_size: 102400,
-            height: 0,
-            max_duration: 30,
-            min_duration: 5,
-            min_height: 1280,
-            min_width: 720,
-            ratio_height: 16,
-            ratio_width: 9,
-            width: 0,
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: [],
-      },
-    ],
-  },
-  //618
-  {
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_data_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: '',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: '',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据量类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_target_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '预定',
-                value: 'CONVERSION_TARGET_BOOK',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '关注',
-                value: 'CONVERSION_TARGET_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '阅读',
-                value: 'CONVERSION_TARGET_READ',
-              },
-              {
-                category: '',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: '',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: '',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: '',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: '',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '链接名称类型',
-        element_type: 'ELEMENT_TYPE_ENUM',
-        enum_property: {
-          default: '',
-          enumeration: [
-            {
-              description: '去唯品会',
-              value: 'GO_TO_VIP',
-            },
-            {
-              description: '去小红书',
-              value: 'GO_TO_RED',
-            },
-            {
-              description: '去快手',
-              value: 'GO_TO_KUAISHOU',
-            },
-            {
-              description: '进入小程序',
-              value: 'ENTER_MINI_PROGRAM',
-            },
-            {
-              description: '立即购买',
-              value: 'BUY_NOW',
-            },
-            {
-              description: '去京东',
-              value: 'GO_TO_JD',
-            },
-            {
-              description: '去苏宁',
-              value: 'GO_TO_SUNING',
-            },
-            {
-              description: '领取优惠',
-              value: 'GET_COUPONS',
-            },
-            {
-              description: '预约活动',
-              value: 'MAKE_AN_APPOINTMENT',
-            },
-            {
-              description: '去逛逛',
-              value: 'GO_SHOPPING',
-            },
-            {
-              description: '进入小游戏',
-              value: 'ENTER_MINI_GAME',
-            },
-            {
-              description: '去拼多多',
-              value: 'GO_TO_PDD',
-            },
-            {
-              description: '查看详情',
-              value: 'VIEW_DETAILS',
-            },
-          ],
-        },
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'link_name_type',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序id',
-        element_type: 'ELEMENT_TYPE_REFERENCE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'mini_program_id',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序路径',
-        element_type: 'ELEMENT_TYPE_URL',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'mini_program_path',
-        parent_name: '',
-        required: false,
-        restriction: {
-          url_restriction: {
-            url_pattern: '.*',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '视频',
-        element_type: 'ELEMENT_TYPE_VIDEO',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'short_video1',
-        parent_name: 'short_video_struct',
-        required: true,
-        restriction: {
-          video_restriction: {
-            file_format: ['MEDIA_TYPE_MP4', 'MEDIA_TYPE_MOV', 'MEDIA_TYPE_AVI'],
-            file_size: 102400,
-            height: 0,
-            max_duration: 30,
-            min_duration: 5,
-            min_height: 480,
-            min_width: 640,
-            ratio_height: 3,
-            ratio_width: 4,
-            width: 0,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '短视频结构',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'short_video_struct',
-        parent_name: '',
-        required: true,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/mp-video-nor.svg',
-    adcreative_template_appellation: '常规视频  4:3',
-    adcreative_template_id: 618,
-    xd_show: true,
-    sj_show: true,
-    adcreative_template_style: '视频',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-            ],
-            required: false,
-          },
-        },
-        {
-          description: '微信简版原生页',
-          example: '',
-          page_type: 'PAGE_TYPE_MOMENTS_SIMPLE_NATIVE_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-  },
-  //1708
-  {
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时结束时间(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_expiring_timestamp',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 13,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '广告详情',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        description: '标签内容',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'content',
-        parent_name: 'label',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 16,
-            min_length: 1,
-            text_pattern: '',
-          },
-        },
-      },
-      {
-        array_property: {
-          max_number: 3,
-          min_number: 0,
-        },
-        description: '标签',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT_ARRAY',
-        name: 'label',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '标题',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'title',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 14,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '视频',
-        element_type: 'ELEMENT_TYPE_VIDEO',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'video',
-        parent_name: '',
-        required: true,
-        restriction: {
-          video_restriction: {
-            file_format: ['MEDIA_TYPE_MP4', 'MEDIA_TYPE_MOV', 'MEDIA_TYPE_AVI'],
-            file_size: 102400,
-            height: 0,
-            max_duration: 30,
-            min_duration: 5,
-            min_height: 360,
-            min_width: 640,
-            ratio_height: 9,
-            ratio_width: 16,
-            width: 0,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image',
-        parent_name: '',
-        required: false,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 20,
-            height: 80,
-            width: 80,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时开始时间(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_begin',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 11,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时时间描述',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_time_type',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 64,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时价格展示(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_price',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 9,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '是否支开启卖点图',
-        element_type: 'ELEMENT_TYPE_BOOLEAN',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_BOOLEAN',
-        name: 'shop_image_switch',
-        parent_name: 'shop_image_struct',
-        required: true,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '启用动态卖点图',
-        element_type: 'ELEMENT_TYPE_BOOLEAN',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_BOOLEAN',
-        name: 'dynamic_shop_image_switch',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image_id',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 20,
-            height: 80,
-            width: 80,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点标题(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image_title',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 10,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点描述',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image_description',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 10,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点图',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'shop_image_struct',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: '右按钮跳转',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_landing_page2',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '左按钮文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_text1',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 4,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '左按钮跳转',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_landing_page1',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '右按钮文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_text2',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 4,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '选择按钮',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'chosen_button',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: '是否开启轮播文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'living_desc_struct_switch',
-        parent_name: 'living_desc_struct',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 8,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: {
-          max_number: 5,
-          min_number: 2,
-        },
-        description: '轮播文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING_ARRAY',
-        name: 'living_desc_list',
-        parent_name: 'living_desc_struct',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 16,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '轮播文案',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'living_desc_struct',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/mp-video-act.svg',
-    adcreative_template_appellation: '卡片广告 横版视频 16:9',
-    adcreative_template_id: 1708,
-    kp_show: true,
-    adcreative_template_style: '视频',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-            ],
-            required: false,
-          },
-        },
-        {
-          description: ' 微信公众号详情页',
-          example: '',
-          page_type: 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: [],
-      },
-    ],
-  },
-  //311
-  {
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_data_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: '',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: '',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据量类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_target_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '预定',
-                value: 'CONVERSION_TARGET_BOOK',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '关注',
-                value: 'CONVERSION_TARGET_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '阅读',
-                value: 'CONVERSION_TARGET_READ',
-              },
-              {
-                category: '',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: '',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: '',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: '',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: '',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: {
-          max_number: 1,
-          min_number: 1,
-        },
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING_ARRAY',
-        name: 'image_list',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 300,
-            height: 800,
-            width: 800,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '链接名称类型',
-        element_type: 'ELEMENT_TYPE_ENUM',
-        enum_property: {
-          default: '',
-          enumeration: [
-            {
-              description: '去唯品会',
-              value: 'GO_TO_VIP',
-            },
-            {
-              description: '领取优惠',
-              value: 'GET_COUPONS',
-            },
-            {
-              description: '进入小程序',
-              value: 'ENTER_MINI_PROGRAM',
-            },
-            {
-              description: '进入小游戏',
-              value: 'ENTER_MINI_GAME',
-            },
-            {
-              description: '去拼多多',
-              value: 'GO_TO_PDD',
-            },
-            {
-              description: '去逛逛',
-              value: 'GO_SHOPPING',
-            },
-            {
-              description: '去苏宁',
-              value: 'GO_TO_SUNING',
-            },
-            {
-              description: '去快手',
-              value: 'GO_TO_KUAISHOU',
-            },
-            {
-              description: '查看详情',
-              value: 'VIEW_DETAILS',
-            },
-            {
-              description: '去京东',
-              value: 'GO_TO_JD',
-            },
-            {
-              description: '预约活动',
-              value: 'MAKE_AN_APPOINTMENT',
-            },
-            {
-              description: '立即购买',
-              value: 'BUY_NOW',
-            },
-            {
-              description: '去小红书',
-              value: 'GO_TO_RED',
-            },
-          ],
-        },
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'link_name_type',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序id',
-        element_type: 'ELEMENT_TYPE_REFERENCE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'mini_program_id',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序路径',
-        element_type: 'ELEMENT_TYPE_URL',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'mini_program_path',
-        parent_name: '',
-        required: false,
-        restriction: {
-          url_restriction: {
-            url_pattern: '.*',
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/mp-img-big.svg',
-    adcreative_template_appellation: '常规大图 1:1',
-    adcreative_template_id: 311,
-    xd_show: true,
-    sj_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-  },
-  // 641
-  {
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_data_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: '',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: '',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据量类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_target_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '预定',
-                value: 'CONVERSION_TARGET_BOOK',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '关注',
-                value: 'CONVERSION_TARGET_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '阅读',
-                value: 'CONVERSION_TARGET_READ',
-              },
-              {
-                category: '',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: '',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: '',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: '',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: '',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: {
-          max_number: 3,
-          min_number: 3,
-        },
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING_ARRAY',
-        name: 'image_list',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 300,
-            height: 800,
-            width: 800,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '链接名称类型',
-        element_type: 'ELEMENT_TYPE_ENUM',
-        enum_property: {
-          default: '',
-          enumeration: [
-            {
-              description: '去苏宁',
-              value: 'GO_TO_SUNING',
-            },
-            {
-              description: '领取优惠',
-              value: 'GET_COUPONS',
-            },
-            {
-              description: '立即购买',
-              value: 'BUY_NOW',
-            },
-            {
-              description: '去唯品会',
-              value: 'GO_TO_VIP',
-            },
-            {
-              description: '查看详情',
-              value: 'VIEW_DETAILS',
-            },
-            {
-              description: '去快手',
-              value: 'GO_TO_KUAISHOU',
-            },
-            {
-              description: '预约活动',
-              value: 'MAKE_AN_APPOINTMENT',
-            },
-            {
-              description: '进入小游戏',
-              value: 'ENTER_MINI_GAME',
-            },
-            {
-              description: '去拼多多',
-              value: 'GO_TO_PDD',
-            },
-            {
-              description: '去小红书',
-              value: 'GO_TO_RED',
-            },
-            {
-              description: '去逛逛',
-              value: 'GO_SHOPPING',
-            },
-            {
-              description: '去京东',
-              value: 'GO_TO_JD',
-            },
-            {
-              description: '进入小程序',
-              value: 'ENTER_MINI_PROGRAM',
-            },
-          ],
-        },
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'link_name_type',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序id',
-        element_type: 'ELEMENT_TYPE_REFERENCE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'mini_program_id',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序路径',
-        element_type: 'ELEMENT_TYPE_URL',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'mini_program_path',
-        parent_name: '',
-        required: false,
-        restriction: {
-          url_restriction: {
-            url_pattern: '.*',
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/mp-img-multimg.svg',
-    adcreative_template_appellation: '常规多图 1:1 三图',
-    adcreative_template_id: 641,
-    xd_show: true,
-    sj_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-  },
-  //642
-  {
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_data_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: '',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: '',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据量类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_target_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '预定',
-                value: 'CONVERSION_TARGET_BOOK',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '关注',
-                value: 'CONVERSION_TARGET_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '阅读',
-                value: 'CONVERSION_TARGET_READ',
-              },
-              {
-                category: '',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: '',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: '',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: '',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: '',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: {
-          max_number: 4,
-          min_number: 4,
-        },
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING_ARRAY',
-        name: 'image_list',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 300,
-            height: 800,
-            width: 800,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '链接名称类型',
-        element_type: 'ELEMENT_TYPE_ENUM',
-        enum_property: {
-          default: '',
-          enumeration: [
-            {
-              description: '去京东',
-              value: 'GO_TO_JD',
-            },
-            {
-              description: '预约活动',
-              value: 'MAKE_AN_APPOINTMENT',
-            },
-            {
-              description: '去逛逛',
-              value: 'GO_SHOPPING',
-            },
-            {
-              description: '进入小程序',
-              value: 'ENTER_MINI_PROGRAM',
-            },
-            {
-              description: '进入小游戏',
-              value: 'ENTER_MINI_GAME',
-            },
-            {
-              description: '去小红书',
-              value: 'GO_TO_RED',
-            },
-            {
-              description: '去唯品会',
-              value: 'GO_TO_VIP',
-            },
-            {
-              description: '查看详情',
-              value: 'VIEW_DETAILS',
-            },
-            {
-              description: '去快手',
-              value: 'GO_TO_KUAISHOU',
-            },
-            {
-              description: '领取优惠',
-              value: 'GET_COUPONS',
-            },
-            {
-              description: '去苏宁',
-              value: 'GO_TO_SUNING',
-            },
-            {
-              description: '去拼多多',
-              value: 'GO_TO_PDD',
-            },
-            {
-              description: '立即购买',
-              value: 'BUY_NOW',
-            },
-          ],
-        },
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'link_name_type',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序id',
-        element_type: 'ELEMENT_TYPE_REFERENCE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'mini_program_id',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序路径',
-        element_type: 'ELEMENT_TYPE_URL',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'mini_program_path',
-        parent_name: '',
-        required: false,
-        restriction: {
-          url_restriction: {
-            url_pattern: '.*',
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/mp-img-multimg.svg',
-    adcreative_template_appellation: '常规多图 1:1 四图',
-    adcreative_template_id: 642,
-    xd_show: true,
-    sj_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-  },
-  //643
-  {
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_data_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-              {
-                category: '',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-              {
-                category: '',
-                description: '好友关注量',
-                value: 'CONVERSION_DATA_FRIEND_FOLLOW',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据量类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_target_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: 'VIEW_DETAILS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'VIEW_DETAILS',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'MORE_INFO',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'BUY_NOW',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: 'RESERVE_NOW',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: 'CONSULT_NOW',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-              {
-                category: 'APPLY_NOW',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: 'BOOK_NOW',
-                description: '预定',
-                value: 'CONVERSION_TARGET_BOOK',
-              },
-              {
-                category: 'GET_COUPONS',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'GET_IT_NOW',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: 'FOLLOW_OFFICIAL_ACCOUNT',
-                description: '关注',
-                value: 'CONVERSION_TARGET_FOLLOW',
-              },
-              {
-                category: 'READ_NOVELS',
-                description: '阅读',
-                value: 'CONVERSION_TARGET_READ',
-              },
-              {
-                category: '',
-                description: '领取',
-                value: 'CONVERSION_TARGET_GET',
-              },
-              {
-                category: '',
-                description: '预约',
-                value: 'CONVERSION_TARGET_RESERVE',
-              },
-              {
-                category: '',
-                description: '购买',
-                value: 'CONVERSION_TARGET_BUY',
-              },
-              {
-                category: '',
-                description: '申请',
-                value: 'CONVERSION_TARGET_APPLY',
-              },
-              {
-                category: '',
-                description: '咨询',
-                value: 'CONVERSION_TARGET_CONSULT',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: {
-          max_number: 6,
-          min_number: 6,
-        },
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING_ARRAY',
-        name: 'image_list',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 300,
-            height: 800,
-            width: 800,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '链接名称类型',
-        element_type: 'ELEMENT_TYPE_ENUM',
-        enum_property: {
-          default: '',
-          enumeration: [
-            {
-              description: '预约活动',
-              value: 'MAKE_AN_APPOINTMENT',
-            },
-            {
-              description: '去小红书',
-              value: 'GO_TO_RED',
-            },
-            {
-              description: '去快手',
-              value: 'GO_TO_KUAISHOU',
-            },
-            {
-              description: '进入小程序',
-              value: 'ENTER_MINI_PROGRAM',
-            },
-            {
-              description: '领取优惠',
-              value: 'GET_COUPONS',
-            },
-            {
-              description: '立即购买',
-              value: 'BUY_NOW',
-            },
-            {
-              description: '去拼多多',
-              value: 'GO_TO_PDD',
-            },
-            {
-              description: '去苏宁',
-              value: 'GO_TO_SUNING',
-            },
-            {
-              description: '去逛逛',
-              value: 'GO_SHOPPING',
-            },
-            {
-              description: '去京东',
-              value: 'GO_TO_JD',
-            },
-            {
-              description: '去唯品会',
-              value: 'GO_TO_VIP',
-            },
-            {
-              description: '查看详情',
-              value: 'VIEW_DETAILS',
-            },
-            {
-              description: '进入小游戏',
-              value: 'ENTER_MINI_GAME',
-            },
-          ],
-        },
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'link_name_type',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序id',
-        element_type: 'ELEMENT_TYPE_REFERENCE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'mini_program_id',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '小程序路径',
-        element_type: 'ELEMENT_TYPE_URL',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'mini_program_path',
-        parent_name: '',
-        required: false,
-        restriction: {
-          url_restriction: {
-            url_pattern: '.*',
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/mp-img-multimg.svg',
-    adcreative_template_appellation: '常规多图 1:1 六图',
-    adcreative_template_id: 643,
-    xd_show: true,
-    sj_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-  },
-  //711
-  {
-    adcreative_attributes: [
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_data_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: '',
-                description: '转化数据量',
-                value: 'CONVERSION_DATA_ADMETRIC',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '转化数据量类型',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'conversion_target_type',
-        property_detail: {
-          enum_detail: {
-            enumeration: [
-              {
-                category: '',
-                description: '关注',
-                value: 'CONVERSION_TARGET_FOLLOW',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: true,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '文案(1-30字)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'image',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 140,
-            height: 720,
-            width: 1280,
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/creative_template_711.svg',
-    adcreative_template_appellation: '横版大图 16:9',
-    adcreative_template_id: 711,
-    xd_show: true,
-    sj_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: ' 微信公众号详情页',
-          example: '',
-          page_type: 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-            ],
-            required: true,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: '微信一键关注页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_FOCUS_DAILOG',
-              },
-            ],
-            required: true,
-          },
-        },
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-            ],
-            required: true,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-              {
-                description: '微信一键关注页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_FOCUS_DAILOG',
-              },
-            ],
-            required: true,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC', 'BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        max_price: 10000,
-        min_price: 10,
-      },
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-  },
-  //712
-  {
-    adcreative_attributes: [
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: true,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'image',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 140,
-            height: 1920,
-            width: 1080,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        description: '标签内容',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'content',
-        parent_name: 'label',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 15,
-            min_length: 2,
-            text_pattern: '',
-          },
-        },
-      },
-      {
-        array_property: {
-          max_number: 3,
-          min_number: 1,
-        },
-        description: '标签',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT_ARRAY',
-        name: 'label',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/creative_template_712.svg',
-    adcreative_template_appellation: '竖版大图 9:16',
-    adcreative_template_id: 712,
-    bq_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: ' 微信公众号详情页',
-          example: '',
-          page_type: 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-        },
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-  },
-  //910
-  {
-    adcreative_attributes: [
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'https://qzonestyle.gtimg.cn/gdt_ui_proj/dist/phoenix/images/ctpl/ctpl-inspires.svg',
-    adcreative_template_appellation: '激励浏览广告',
-    adcreative_template_id: 910,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: [],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-  },
-  //925
-  {
-    adcreative_attributes: [
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'image',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 100,
-            height: 334,
-            width: 960,
-          },
-        },
-        struct_property: [],
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/ad-process/images/creative-size-banner.svg',
-    adcreative_template_appellation: 'Banner图片 20:7',
-    adcreative_template_id: 925,
-    xd_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-              {
-                description: '微信一键关注页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_FOCUS_DAILOG',
-              },
-            ],
-            required: false,
-          },
-        },
-        {
-          description: ' 微信公众号详情页',
-          example: '',
-          page_type: 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: '微信一键关注页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_FOCUS_DAILOG',
-              },
-            ],
-            required: false,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC', 'BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        max_price: 10000,
-        min_price: 10,
-      },
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-    ],
-  },
-  //1707
-  {
-    adcreative_attributes: [
-      {
-        description: '头像及昵称跳转页',
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'profile_id',
-        property_detail: {
-          integer_detail: {
-            max: 20,
-            min: 0,
-          },
-        },
-        required: true,
-      },
-      {
-        description: '分享信息',
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'share_content_spec',
-        property_detail: {
-          struct_detail: {
-            element_list: [
-              {
-                description: '分享描述',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_desc',
-                property_detail: {
-                  string_detail: {
-                    max_length: 20,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-              {
-                description: '分享标题',
-                field_type: 'FIELD_TYPE_STRING',
-                name: 'share_title',
-                property_detail: {
-                  string_detail: {
-                    max_length: 14,
-                    min_length: 1,
-                    text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-                  },
-                },
-                required: true,
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-      {
-        description: '动态创意分组',
-        field_type: 'FIELD_TYPE_ENUM',
-        name: 'dynamic_creative_group_used',
-        property_detail: {
-          enum_detail: {
-            default: 'NOT_USE_GROUP',
-            enumeration: [
-              {
-                description: '不使用组合',
-                value: 'NOT_USE_GROUP',
-              },
-              {
-                description: '视频封面图组合',
-                value: 'VIDEO_IMAGE_GROUP',
-              },
-            ],
-          },
-        },
-        required: false,
-      },
-    ],
-    adcreative_elements: [
-      {
-        array_property: [],
-        description: '品牌名称',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_name',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 12,
-            min_length: 2,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌标识图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'brand_img',
-        parent_name: 'brand',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 512,
-            width: 512,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '品牌形象',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'brand',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: 'Canvas',
-        element_type: 'ELEMENT_TYPE_CANVAS',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_INTEGER',
-        name: 'canvas',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时结束时间(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_expiring_timestamp',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 13,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '广告详情',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'description',
-        parent_name: '',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 30,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: {
-          max_number: 1,
-          min_number: 1,
-        },
-        description: '图片',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING_ARRAY',
-        name: 'image_list',
-        parent_name: '',
-        required: true,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 400,
-            height: 720,
-            width: 1280,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        description: '标签内容',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'content',
-        parent_name: 'label',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 16,
-            min_length: 1,
-            text_pattern: '',
-          },
-        },
-      },
-      {
-        array_property: {
-          max_number: 3,
-          min_number: 0,
-        },
-        description: '标签',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT_ARRAY',
-        name: 'label',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '标题',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'title',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 14,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image',
-        parent_name: '',
-        required: false,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 20,
-            height: 80,
-            width: 80,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时开始时间(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_begin',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 11,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时时间描述',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_time_type',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 64,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '倒计时价格展示(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'countdown_price',
-        parent_name: '',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 9,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '是否支开启卖点图',
-        element_type: 'ELEMENT_TYPE_BOOLEAN',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_BOOLEAN',
-        name: 'shop_image_switch',
-        parent_name: 'shop_image_struct',
-        required: true,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '启用动态卖点图',
-        element_type: 'ELEMENT_TYPE_BOOLEAN',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_BOOLEAN',
-        name: 'dynamic_shop_image_switch',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点图',
-        element_type: 'ELEMENT_TYPE_IMAGE',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image_id',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: {
-          image_restriction: {
-            file_format: ['IMAGE_TYPE_JPG', 'IMAGE_TYPE_PNG'],
-            file_size: 20,
-            height: 80,
-            width: 80,
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点标题(选填)',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image_title',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 10,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点描述',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'shop_image_description',
-        parent_name: 'shop_image_struct',
-        required: false,
-        restriction: {
-          text_restriction: {
-            max_length: 10,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '卖点图',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'shop_image_struct',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: '左按钮文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_text1',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 4,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '左按钮跳转',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_landing_page1',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '右按钮文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_text2',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 4,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '右按钮跳转',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'chosen_button_landing_page2',
-        parent_name: 'chosen_button',
-        required: true,
-        restriction: [],
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '选择按钮',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'chosen_button',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-      {
-        array_property: [],
-        description: '是否开启轮播文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING',
-        name: 'living_desc_struct_switch',
-        parent_name: 'living_desc_struct',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 8,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: {
-          max_number: 5,
-          min_number: 2,
-        },
-        description: '轮播文案',
-        element_type: 'ELEMENT_TYPE_TEXT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRING_ARRAY',
-        name: 'living_desc_list',
-        parent_name: 'living_desc_struct',
-        required: true,
-        restriction: {
-          text_restriction: {
-            max_length: 16,
-            min_length: 1,
-            text_pattern: '^[^\\<\\>\\&\'\\"\\/\\x08\\x09\\x0A\\x0D\\\\]+$',
-          },
-        },
-        struct_property: [],
-      },
-      {
-        array_property: [],
-        description: '轮播文案',
-        element_type: 'ELEMENT_TYPE_STRUCT',
-        enum_property: [],
-        field_type: 'FIELD_TYPE_STRUCT',
-        name: 'living_desc_struct',
-        parent_name: '',
-        required: false,
-        restriction: [],
-        struct_property: {
-          element_mutual_exclusive: false,
-        },
-      },
-    ],
-    adcreative_sample_image:
-      'http://qzonestyle.gtimg.cn/gdt_ui_proj/dist/gdt/imgbox/mp-img-act.svg',
-    adcreative_template_appellation: '卡片广告 横版大图 16:9',
-    adcreative_template_id: 1707,
-    kp_show: true,
-    adcreative_template_style: '图片',
-    landing_page_config: {
-      required: false,
-      support_page_type_list: [
-        {
-          description: '微信原生推广页',
-          example: '',
-          page_type: 'PAGE_TYPE_CANVAS_WECHAT',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: '微信原生页',
-                link_page_type: 'LINK_PAGE_TYPE_CANVAS_WECHAT',
-              },
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-            ],
-            required: true,
-          },
-        },
-        {
-          description: ' 微信公众号详情页',
-          example: '',
-          page_type: 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-          support_link_name_type: {
-            list: [
-              {
-                description: '查看详情',
-                link_name_type: 'VIEW_DETAILS',
-              },
-              {
-                description: '了解更多',
-                link_name_type: 'MORE_INFO',
-              },
-              {
-                description: '立即购买',
-                link_name_type: 'BUY_NOW',
-              },
-              {
-                description: '立即申请',
-                link_name_type: 'APPLY_NOW',
-              },
-              {
-                description: '立即预定',
-                link_name_type: 'BOOK_NOW',
-              },
-              {
-                description: '立即咨询',
-                link_name_type: 'CONSULT_NOW',
-              },
-              {
-                description: '立即预约',
-                link_name_type: 'RESERVE_NOW',
-              },
-              {
-                description: '立即领取',
-                link_name_type: 'GET_IT_NOW',
-              },
-              {
-                description: '领取优惠',
-                link_name_type: 'GET_COUPONS',
-              },
-              {
-                description: '去逛逛',
-                link_name_type: 'GO_SHOPPING',
-              },
-              {
-                description: '关注公众号',
-                link_name_type: 'FOLLOW_OFFICIAL_ACCOUNT',
-              },
-              {
-                description: '阅读小说',
-                link_name_type: 'READ_NOVELS',
-              },
-            ],
-            required: false,
-          },
-          support_link_page_type: {
-            list: [
-              {
-                description: ' 微信公众号详情页',
-                link_page_type: 'LINK_PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL',
-              },
-            ],
-            required: true,
-          },
-        },
-      ],
-    },
-    promoted_object_type: 'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT',
-    site_set: ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT'],
-    support_bid_mode_list: ['BID_MODE_CPM', 'BID_MODE_OCPM'],
-    support_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_IMPRESSION',
-        max_price: 99900,
-        min_price: 150,
-      },
-    ],
-    support_dynamic_ability_spec_list: {
-      dynamic_ability_type: ['DYNAMIC_TYPE_DYNAMIC_CREATIVE'],
-      product_item_display_quantity: [],
-    },
-    unsupport_bid_mode_list: [
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPC', 'BID_MODE_OCPC'],
-        site_set: ['SITE_SET_MOMENTS'],
-      },
-      {
-        bid_mode_list: ['BID_MODE_CPA'],
-        site_set: ['SITE_SET_WECHAT'],
-      },
-    ],
-    unsupport_billing_spec_list: [
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_CLICK',
-        site_set: ['SITE_SET_MOMENTS'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-      {
-        billing_event: 'BILLINGEVENT_APP_DOWNLOAD',
-        site_set: ['SITE_SET_WECHAT'],
-        unsupport_type: 'UNSUPPORT_TYPE_EXPOSURE',
-      },
-    ],
-    unsupport_siteset_detail_spec: [
-      {
-        site_set: [],
-      },
-    ],
-  },
-];
+
 
 /**即将下线创意形式*/
 const outAdcreativeTemplateIdEnum = [

+ 2 - 2
src/pages/launchSystemNew/launchManage/localAd/creative/index.tsx

@@ -78,9 +78,9 @@ function Creative() {
             pageSize={sysAdcreativeList?.data?.data?.size}
             leftChild={<>
                 <Row gutter={[10, 10]}>
-                    <Col span={24}><Button type='primary' onClick={() => {
+                    {/* <Col span={24}><Button type='primary' onClick={() => {
                         handleModalConfig({ visible: true })
-                    }}>新建创意模板</Button></Col>
+                    }}>新建创意模板</Button></Col> */}
                     <Col>
                         <Input
                             placeholder='创意名称'

+ 2 - 2
src/pages/launchSystemNew/launchManage/localAd/targeting/index.tsx

@@ -77,9 +77,9 @@ function Targeting() {
             pageSize={list?.data?.data?.size}
             leftChild={<>
                 <Row gutter={[10, 10]}>
-                    <Col span={24}><Button type='primary' onClick={() => {
+                    {/* <Col span={24}><Button type='primary' onClick={() => {
                         handleModalConfig({ visible: true })
-                    }}>新建定向模板</Button></Col>
+                    }}>新建定向模板</Button></Col> */}
                     <Col>
                         <Input
                             placeholder='定向名称'

+ 0 - 1
src/pages/launchSystemNew/launchManage/localAd/targeting/modal.tsx

@@ -4,7 +4,6 @@ import { GenderEnum, EducationEnum, ExcludedDimensionEnum, MaritalStatusEnum, Op
 import { ModalConfig } from '.'
 import { useAjax } from '@/Hook/useAjax'
 import { getTagsList } from '@/services/launchAdq/global'
-import { filter } from '@umijs/deps/compiled/lodash'
 interface Props {
     title?: string,
     visible: boolean,

+ 9 - 0
src/services/launchAdq/adAuthorize.ts

@@ -9,4 +9,13 @@ export async function getAdAccountApi() {
     return request(api + '/adq/adAccount/allOfUser', {
         method: 'GET',
     });
+}
+/**
+ * 获取账号列表
+ * @returns 
+ */
+export async function putAdAccountApi(adAccountId: any,remark: any) {
+    return request(api + `/adq/adAccount/modifyRemark/${adAccountId}/${encodeURIComponent(remark)}`, {
+        method: 'PUT',
+    });
 }

+ 4 - 1
src/services/launchAdq/createAd.ts

@@ -12,11 +12,14 @@ export interface CreateAdProps {
     dailyBudget?: number,   // 推广计划日预算
     totalBudget?: number, // 推广计划总预算
     speedMode: string, // 投放速度模式
-    sysAdgroupId: number,  // 广告组内容
+    sysAdgroupId: number,  // 广告组ID
+    sysAdgroup:any,//广告组内容
     sysTargetingId: number,  // 定向包 id
+    sysTargeting: any,  // 定向包内容
     adgroupName: string,  // 广告名称
     configuredStatus: string,  // 广告状态
     sysAdcreativeId: number, // 创意ID
+    sysAdcreative:any,//创意内容
     sysPageId: number, // 落地页Id
     beginDate?: string, // 开始日期
     firstDayBeginTime?: string,  //hh:mm:ss 开始时间

+ 13 - 13
src/services/launchAdq/enum.ts

@@ -1,7 +1,7 @@
 /**广告组推广目标类型*/
 export enum PromotedObjectType {
   PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT = '微信公众号',
-  // PROMOTED_OBJECT_TYPE_LEAD_AD = '销售线索',
+  PROMOTED_OBJECT_TYPE_LEAD_AD = '销售线索',
   // PROMOTED_OBJECT_TYPE_LINK = '网页',
   // PROMOTED_OBJECT_TYPE_LINK_WECHAT = '品牌网页',
   // PROMOTED_OBJECT_TYPE_ECOMMERCE = '商品推广',
@@ -190,17 +190,17 @@ export enum ExcludedDimensionEnum {
 
 /**广告版位*/
 export enum SiteSetEnum {
-  // "SITE_SET_KANDIAN"="腾讯看点",
-  // "SITE_SET_MINI_GAME_QQ"="QQ小游戏",
-  // "SITE_SET_MINI_GAME_WECHAT"="微信小游戏",
-  // "SITE_SET_MOBILE_GAME"="App游戏",
-  // "SITE_SET_MOBILE_MYAPP"="应用宝移动",
-  // "SITE_SET_MOBILE_UNION"="优量汇",
-  // "SITE_SET_MOBILE_YYB"="应用宝",
+  "SITE_SET_KANDIAN"="腾讯看点",
+  "SITE_SET_MINI_GAME_QQ"="QQ小游戏",
+  "SITE_SET_MINI_GAME_WECHAT"="微信小游戏",
+  "SITE_SET_MOBILE_GAME"="App游戏",
+  "SITE_SET_MOBILE_MYAPP"="应用宝移动",
+  "SITE_SET_MOBILE_UNION"="优量汇",
+  "SITE_SET_MOBILE_YYB"="应用宝",
   'SITE_SET_MOMENTS' = '微信朋友圈',
-  // "SITE_SET_QQ_MUSIC_GAME"="QQ、腾讯音乐及游戏",
-  // "SITE_SET_TENCENT_NEWS"="腾讯新闻",
-  // "SITE_SET_TENCENT_VIDEO"="腾讯视频",
+  "SITE_SET_QQ_MUSIC_GAME"="QQ、腾讯音乐及游戏",
+  "SITE_SET_TENCENT_NEWS"="腾讯新闻",
+  "SITE_SET_TENCENT_VIDEO"="腾讯视频",
   'SITE_SET_WECHAT' = '微信公众号与小程序',
 }
 /***/
@@ -209,14 +209,14 @@ export enum BidModeEnum {
   BID_MODE_OCPM = 'oCPM',
   BID_MODE_CPM = 'CPM',
   BID_MODE_CPC = 'CPC',
-  BID_MODE_CPA = 'CPA',
+  // BID_MODE_CPA = 'CPA',
   BID_MODE_OCPC = 'oCPC',
 }
 /**出价策略*/
 export enum BidStrategyEnum {
   BID_STRATEGY_AVERAGE_COST = '稳定拿量',
   BID_STRATEGY_TARGET_COST = '优先拿量',
-  //   BID_STRATEGY_PRIORITY_LOW_COST = '优先低成本',
+    BID_STRATEGY_PRIORITY_LOW_COST = '优先低成本',
   BID_STRATEGY_PRIORITY_CAP_COST = '控制成本上限',
 }
 

+ 10 - 1
src/services/launchAdq/global.ts

@@ -61,4 +61,13 @@ export async function getText(params:{
         params
     })
     
-} 
+} 
+/**
+ * 视频封面图生成
+ * */ 
+ export async function get_tools_video_capture(params:any){
+    return request(api+`/adq/launch/tools/video/maker/capture`,{
+        method:'POST',
+        data:params
+    })
+}