wjx 8 miesięcy temu
rodzic
commit
4c29c84983
25 zmienionych plików z 596 dodań i 159 usunięć
  1. 20 5
      src/pages/launchSystemNew/account/game/index.tsx
  2. 28 9
      src/pages/launchSystemNew/account/novel/index.tsx
  3. 1 1
      src/pages/launchSystemNew/account/novel/tableConfig.tsx
  4. 1 0
      src/pages/launchSystemV3/adqv3/ad/index.tsx
  5. 206 0
      src/pages/launchSystemV3/components/ConversionSelect/index.tsx
  6. 46 0
      src/pages/launchSystemV3/components/ConversionSelect/tableConfig.tsx
  7. 4 2
      src/pages/launchSystemV3/components/GoodsModal/index.tsx
  8. 1 1
      src/pages/launchSystemV3/components/GoodsModal/tableConfig.tsx
  9. 54 44
      src/pages/launchSystemV3/components/PageModal/index.tsx
  10. 51 41
      src/pages/launchSystemV3/components/PageModal/indexOfficial.tsx
  11. 0 0
      src/pages/launchSystemV3/tencentAdPutIn/const.ts
  12. 46 9
      src/pages/launchSystemV3/tencentAdPutIn/create/Ad/adgroupsMarketingContent.tsx
  13. 2 2
      src/pages/launchSystemV3/tencentAdPutIn/create/Ad/adgroupsPrice.tsx
  14. 2 2
      src/pages/launchSystemV3/tencentAdPutIn/create/Ad/adgroupsSitSet.tsx
  15. 9 1
      src/pages/launchSystemV3/tencentAdPutIn/create/Ad/index.tsx
  16. 2 1
      src/pages/launchSystemV3/tencentAdPutIn/create/Ad/newCreateAd.tsx
  17. 2 2
      src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/index.tsx
  18. 2 2
      src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/newDynamic.tsx
  19. 2 1
      src/pages/launchSystemV3/tencentAdPutIn/create/PageList/index.tsx
  20. 12 4
      src/pages/launchSystemV3/tencentAdPutIn/create/addDynamic.tsx
  21. 60 26
      src/pages/launchSystemV3/tencentAdPutIn/create/index.tsx
  22. 3 3
      src/pages/launchSystemV3/tencentAdPutIn/create/tableConfig.tsx
  23. 2 1
      src/pages/launchSystemV3/tencentAdPutIn/typings.d.ts
  24. 26 0
      src/services/adqV3/global.ts
  25. 14 2
      src/services/launchAdq/adq.ts

+ 20 - 5
src/pages/launchSystemNew/account/game/index.tsx

@@ -11,7 +11,7 @@ import GroupLeft from './groupLeft'
 import QQAuth from './qqAuto'
 import { MenuFoldOutlined, MenuUnfoldOutlined, PlusOutlined, SwapOutlined } from '@ant-design/icons'
 import TeamMembers from '../../components/teamMembers'
-import { getAdAccountAllOfMemberGame, getErpUserAll, getServiceProviderAll, putConfigServiceProvider } from '@/services/launchAdq/adq'
+import { getAdAccountAllOfMemberGame, getErpUserAll, getServiceProviderAll, putConfigServiceProvider, putRefreshTokenApi } from '@/services/launchAdq/adq'
 import AddAccountToGroup from './addAccountToGroup'
 import { delAccountToGroupApi } from '@/services/launchAdq/subgroup'
 import { useModel } from 'umi'
@@ -64,6 +64,7 @@ const AdAuthorize: React.FC = () => {
     const erpUserALL = useAjax(() => getErpUserAll(), { formatResult: true })
     const api_getServiceProviderAll = useAjax(() => getServiceProviderAll(), { formatResult: true })
     const api_putConfigServiceProvider = useAjax((params) => putConfigServiceProvider(params), { formatResult: true })
+    const putRefreshToken = useAjax((params) => putRefreshTokenApi(params), { formatResult: true })
     /*************************/
 
     useEffect(() => {
@@ -141,6 +142,19 @@ const AdAuthorize: React.FC = () => {
             }
         })
     }
+
+    /** 刷新token */
+    const handleRefreshToken = () => {
+        putRefreshToken.run(selectAccData.map(item => item.accountId)).then(res => {
+            console.log(res)
+            if (res?.data?.length) {
+                message.error(res.data.toString())
+            } else {
+                setSelectAccData([])
+                message.success('刷新成功')
+            }
+        })
+    }
     // 
     return <div style={{ height: '100%' }}>
         <Tabs
@@ -185,7 +199,7 @@ const AdAuthorize: React.FC = () => {
                             style={{ width: 120 }}
                             placeholder="选择操作类型"
                             onChange={(e) => {
-                                setSwitchType(e); 
+                                setSwitchType(e);
                                 setSelectAccData([])
                             }}
                             value={switchType}
@@ -228,10 +242,11 @@ const AdAuthorize: React.FC = () => {
                         {switchType === 'account' ?
                             (selectAccData?.length > 0 && <>
                                 <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { checkAccount(selectAccData) }}>批量切号</Button>
-                                <SetEarlyWarningsAccount onChange={() => { setSelectAccData([]); }} accountIds={selectAccData.map(item => item.accountId)?.toString()}/>
+                                <SetEarlyWarningsAccount onChange={() => { setSelectAccData([]); }} accountIds={selectAccData.map(item => item.accountId)?.toString()} />
                             </>) :
-                            switchType === 'putUser' ? (selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { putUserHandle(selectAccData) }}>批量指派投放助理</Button>) :
-                                selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { setOpenServer(selectAccData) }}>批量配置服务商</Button>
+                            switchType === 'putUser' ? (selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { putUserHandle(selectAccData) }}>批量指派投放助理</Button>) : switchType === 'setServer' ?
+                                selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { setOpenServer(selectAccData) }}>批量配置服务商</Button> :
+                                selectAccData.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} loading={putRefreshToken.loading} onClick={() => { handleRefreshToken() }}>批量刷新TOKEN</Button>
                         }
                     </Space>}
                     rowSelection={{

+ 28 - 9
src/pages/launchSystemNew/account/novel/index.tsx

@@ -11,7 +11,7 @@ import GroupLeft from './groupLeft'
 import QQAuth from './qqAuto'
 import { MenuFoldOutlined, MenuUnfoldOutlined, PlusOutlined, SwapOutlined } from '@ant-design/icons'
 import TeamMembers from '../../components/teamMembers'
-import { getAdAccountAllOfMember, getErpUserAll, getServiceProviderAll, putConfigServiceProvider } from '@/services/launchAdq/adq'
+import { getAdAccountAllOfMember, getErpUserAll, getServiceProviderAll, putConfigServiceProvider, putRefreshTokenApi } from '@/services/launchAdq/adq'
 import AddAccountToGroup from './addAccountToGroup'
 import { delAccountToGroupApi } from '@/services/launchAdq/subgroup'
 import { useModel } from 'umi'
@@ -56,7 +56,7 @@ const AdAuthorize: React.FC = () => {
     const [selectAccData, setSelectAccData] = useState<any[]>([])
     const [puShow, setPuShow] = useState<boolean>(false)
     const [puData, setPuData] = useState<any[]>([])
-    const [switchType, setSwitchType] = useState<'account' | 'putUser' | 'setServer'>('account')
+    const [switchType, setSwitchType] = useState<'account' | 'putUser' | 'setServer' | 'refreshToken'>('account')
     const putRemark = useAjax((adAccountId: any, remark: any) => putAdAccountApi(adAccountId, remark))
     const delAccountToGroup = useAjax((params) => delAccountToGroupApi(params))
     const getAdAccountList = useAjax((params) => getAdAccountListApi(params), { formatResult: true })
@@ -64,6 +64,7 @@ const AdAuthorize: React.FC = () => {
     const erpUserALL = useAjax(() => getErpUserAll(), { formatResult: true })
     const api_getServiceProviderAll = useAjax(() => getServiceProviderAll(), { formatResult: true })
     const api_putConfigServiceProvider = useAjax((params) => putConfigServiceProvider(params), { formatResult: true })
+    const putRefreshToken = useAjax((params) => putRefreshTokenApi(params), { formatResult: true })
     /*************************/
 
     useEffect(() => {
@@ -142,6 +143,18 @@ const AdAuthorize: React.FC = () => {
         })
     }
 
+    /** 刷新token */
+    const handleRefreshToken = () => {
+        putRefreshToken.run(selectAccData.map(item => item.accountId)).then(res => {
+            console.log(res)
+            if (res?.data?.length) {
+                message.error(res.data.toString())
+            } else {
+                setSelectAccData([])
+                message.success('刷新成功')
+            }
+        })
+    }
 
     return <div style={{ height: '100%' }}>
         <Tabs
@@ -186,17 +199,22 @@ const AdAuthorize: React.FC = () => {
                             style={{ width: 120 }}
                             placeholder="选择操作类型"
                             onChange={(e) => {
-                                setSwitchType(e); 
+                                setSwitchType(e);
                                 setSelectAccData([])
                             }}
                             value={switchType}
                             dropdownMatchSelectWidth={false}
-                            options={[{ label: '批量切号', value: 'account' }, { label: '批量指派投放助理', value: 'putUser' }, { label: '批量配置服务商', value: 'setServer' }]}
+                            options={[
+                                { label: '批量切号', value: 'account' },
+                                { label: '批量指派投放助理', value: 'putUser' },
+                                { label: '批量配置服务商', value: 'setServer' },
+                                { label: '批量刷新TOKEN', value: 'refreshToken' }
+                            ]}
                         />
                         <Input.TextArea
                             placeholder="多个广告账号以,隔开(id1,id2)"
                             allowClear
-                            style={{ minWidth: 200 }}
+                            style={{ minWidth: 180 }}
                             value={queryForm?.accountIds}
                             rows={1}
                             onChange={(e) => {
@@ -204,7 +222,7 @@ const AdAuthorize: React.FC = () => {
                             }}
                         />
                         <Select
-                            style={{ width: 120 }}
+                            style={{ width: 110 }}
                             placeholder="是3.0账号?"
                             allowClear
                             onChange={(e) => {
@@ -214,7 +232,7 @@ const AdAuthorize: React.FC = () => {
                             options={[{ label: '是', value: true }, { label: '否', value: false }]}
                         />
                         <Select
-                            style={{ width: 120 }}
+                            style={{ width: 110 }}
                             placeholder="是业务单元?"
                             allowClear
                             onChange={(e) => {
@@ -231,8 +249,9 @@ const AdAuthorize: React.FC = () => {
                                 <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { checkAccount(selectAccData) }}>批量切号</Button>
                                 <SetEarlyWarningsAccount onChange={() => { setSelectAccData([]); }} accountIds={selectAccData.map(item => item.accountId)?.toString()} />
                             </>) :
-                            switchType === 'putUser' ? (selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { putUserHandle(selectAccData) }}>批量指派投放助理</Button>) :
-                                selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { setOpenServer(selectAccData) }}>批量配置服务商</Button>
+                            switchType === 'putUser' ? (selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { putUserHandle(selectAccData) }}>批量指派投放助理</Button>) : switchType === 'setServer' ?
+                                selectAccData?.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} onClick={() => { setOpenServer(selectAccData) }}>批量配置服务商</Button> :
+                                selectAccData.length > 0 && <Button type="primary" ghost icon={<SwapOutlined />} loading={putRefreshToken.loading} onClick={() => { handleRefreshToken() }}>批量刷新TOKEN</Button>
                         }
                     </Space>}
                     rowSelection={{

+ 1 - 1
src/pages/launchSystemNew/account/novel/tableConfig.tsx

@@ -209,7 +209,7 @@ export function columnsMp(
             align: 'center',
             width: 80,
             render: (a: string | number) => {
-                return FundStatusEnum[a]
+                return FundStatusEnum[a as keyof typeof FundStatusEnum]
             }
         },
         {

+ 1 - 0
src/pages/launchSystemV3/adqv3/ad/index.tsx

@@ -438,6 +438,7 @@ const Ad: React.FC<ADQV3.AdProps> = ({ userId, creativeHandle }) => {
             visible={addDynamicVisible}
             onClose={() => {
                 setAddDynamicVisible(false)
+                getAdqV3AdList.refresh()
             }}
             tactics={tactics}
             onChange={() => {

+ 206 - 0
src/pages/launchSystemV3/components/ConversionSelect/index.tsx

@@ -0,0 +1,206 @@
+import { useAjax } from "@/Hook/useAjax"
+import { CheckOutlined, QuestionCircleOutlined, SyncOutlined } from "@ant-design/icons"
+import { Button, Input, message, Modal, Space, Table, Tooltip } from "antd"
+import React, { useEffect, useState } from "react"
+import style from '../GoodsModal/index.less'
+import columns from './tableConfig'
+import { getConversionInfoApi } from "@/services/adqV3/global"
+import { useUpdateEffect } from "ahooks"
+
+/**
+ * 转化归因
+ * @returns 
+ */
+interface Props {
+    adgroups: any
+    visible?: boolean,
+    onClose?: () => void,
+    onChange?: (data: PULLIN.AccountCreateLogsProps[]) => void,
+    data: PULLIN.AccountCreateLogsProps[]
+}
+const ConversionSelect: React.FC<Props> = (props) => {
+
+    /************************/
+    const { visible, onClose, data: data1, onChange, adgroups } = props
+    const [tableData, setTableData] = useState<any[]>([])//table数据
+    const [selectAdz, setSelectAdz] = useState<number>(1)   // 选择广告主
+    const [data, setData] = useState<PULLIN.AccountCreateLogsProps[]>(data1)
+    const [loading, setLoading] = useState<boolean>(false)
+    const [accountId, setAccountId] = useState<number>(data[selectAdz - 1].accountId)
+    const [conversionName, setConversionName] = useState<string>()
+
+    const getConversionInfo = useAjax((params) => getConversionInfoApi(params))
+    /************************/
+
+    useUpdateEffect(() => {
+        setAccountId(data[selectAdz - 1].accountId)
+    }, [selectAdz])
+
+    useEffect(() => {
+        if (data?.length > 0 && accountId) {
+            getList(accountId)
+        } else {
+            setTableData([])
+        }
+    }, [accountId, adgroups, conversionName])
+
+    // 获取公众号列表
+    const getList = (accountId: number) => {
+        let { optimizationGoal, deepConversionSpec, siteSet } = adgroups
+        getConversionInfo.run({ accountId, pageNum: 1, pageSize: 100, conversionName, createSourceType: 'SELF_CREATED', optimizationGoal, deepWorthOptimizationGoal: deepConversionSpec?.deepConversionWorthSpec?.goal, siteSet }).then(res => {
+            setTableData(res?.records || [])
+        })
+    }
+
+    const handleOk = () => {
+        onChange && onChange(data)
+    }
+
+    /** 设置选中广告主 */
+    const handleSelectAdz = (value: number) => {
+        if (value === selectAdz) {
+            return
+        }
+        setSelectAdz(value)
+    }
+
+    /** 表格选折 */
+    const onChangeTable = (_: React.Key[], selectedRows: any) => {
+        let newData = JSON.parse(JSON.stringify(data))
+        newData[selectAdz - 1]['newConversionList'] = selectedRows
+        setData([...newData])
+    }
+
+    // 清空已选
+    const clearGoods = () => {
+        let newData = JSON.parse(JSON.stringify(data))
+        newData[selectAdz - 1]['newConversionList'] = []
+        setData([...newData])
+    }
+
+    /** 一键设置 */
+    const setOnekey = (isFirst?: boolean) => {
+        // let newData: PULLIN.AccountCreateLogsProps[] = JSON.parse(JSON.stringify(data))
+        // const hide = message.loading(`正在设置...`, 0, () => {
+        //     message.success('设置成功');
+        // });
+        // if (isFirst) {
+        //     setLoading(true)
+        //     let ajax = data.map(item => getWechatOfficialAccountApi({ accountId: item.accountId }))
+        //     Promise.all(ajax).then(res => {
+        //         if (res) {
+        //             res.forEach(a => {
+        //                 let data = a?.data?.[0] || {}
+        //                 newData = newData.map(item => {
+        //                     if (item.accountId.toString() === data.accountId.toString()) {
+        //                         return { ...item, newConversionList: [data] }
+        //                     }
+        //                     return item
+        //                 })
+        //             })
+        //             setData(newData)
+        //         }
+        //         message.success('设置完成');
+        //         setLoading(false)
+        //         hide()
+        //     }).catch(() => {
+        //         message.success('设置失败');
+        //         setLoading(false)
+        //         hide()
+        //     })
+        // } else {
+        //     let wechatChannelNames: string[] = data[selectAdz - 1]['newConversionList']?.map((item: { wechatOfficialAccountName: string }) => item.wechatOfficialAccountName) || []
+        //     getWechatOfficialAccounts.run({ accountIdList: newData?.filter(item => item.accountId !== data[selectAdz - 1].accountId)?.map(item => item?.accountId) }).then(res => {
+        //         if (res?.length > 0) {
+        //             res.forEach((i: { accountId: number, wechatOfficialAccountName: string }) => {
+        //                 if (wechatChannelNames.includes(i.wechatOfficialAccountName)) {
+        //                     newData = newData.map(item => {
+        //                         if (item.accountId.toString() === i.accountId.toString()) {
+        //                             return { ...item, newConversionList: [i] }
+        //                         }
+        //                         return item
+        //                     })
+        //                 }
+        //             })
+        //             setData(newData)
+        //         }
+        //         message.success('设置完成');
+        //         hide()
+        //     })
+        // }
+    }
+
+
+    return <Modal
+        title={<strong>选择转化归因</strong>}
+        visible={visible}
+        onCancel={() => { onClose && onClose() }}
+        onOk={handleOk}
+        width={900}
+        className={`${style.SelectPackage} modalResetCss`}
+        bodyStyle={{ padding: '0 10px 0 10px' }}
+    >
+        <div className={style.content}>
+            <div className={style.left}>
+                <h4 className={style.title}>媒体账户</h4>
+                <div className={style.accountIdList}>
+                    {data?.map((item, index) => {
+                        let newConversionList = data[index].newConversionList || []
+                        return <div key={index} onClick={() => { handleSelectAdz(index + 1) }} className={`${style.accItem} ${selectAdz === index + 1 && style.select} `}>
+                            {item?.accountId}
+                            {newConversionList?.length > 0 && <CheckOutlined style={{ color: '#1890ff' }} />}
+                        </div>
+                    })}
+                </div>
+            </div>
+            <div className={style.right}>
+                <Space style={{ marginBottom: 10 }} align="end" size={0}>
+                    <Input.Search enterButton allowClear onSearch={(value) => setConversionName(value)} placeholder="搜索转化名称"/>
+                    <Button icon={<SyncOutlined />} type='link' loading={getConversionInfo?.loading} onClick={() => { getList(data[selectAdz - 1].accountId) }}>刷新</Button>
+                    {/* {data?.length > 1 && <Button disabled={!data[selectAdz - 1]['newConversionList']?.length} onClick={() => setOnekey()} type="link" loading={getConversionInfo.loading}>
+                        <Space>
+                            <span>一键设置</span>
+                            <Tooltip color="#FFF" overlayInnerStyle={{ color: '#000' }} title="设置其它账号有相同名称的商品为那个账号的商品(注意需要用户商品称相同,否则不设置)">
+                                <QuestionCircleOutlined />
+                            </Tooltip>
+                        </Space>
+                    </Button>} */}
+                    {(data[selectAdz - 1]?.newConversionList || [])?.length > 0 && <Button type='link' onClick={() => { clearGoods() }}>清空</Button>}
+                </Space>
+                <Table
+                    columns={columns() as any}
+                    dataSource={tableData}
+                    size="small"
+                    loading={getConversionInfo?.loading}
+                    scroll={{ y: 400 }}
+                    rowKey={'conversionId'}
+                    rowSelection={{
+                        type: 'radio',
+                        selectedRowKeys: data[selectAdz - 1]?.newConversionList?.map((item: any) => item?.conversionId),
+                        onChange: onChangeTable,
+                        getCheckboxProps: (record: any) => {
+                            const { deepConversionSpec } = adgroups
+                            return {
+                                disabled: !deepConversionSpec ? (record?.deepWorthOptimizationGoal || record?.deepBehaviorOptimizationGoal) ? true : false : false
+                            }
+                        },
+                    }}
+                    onRow={(record) => ({
+                        onClick: () => {
+                            let newDatas = JSON.parse(JSON.stringify(data))
+                            let oldData = newDatas[selectAdz - 1]?.newConversionList || []
+                            const selected = oldData?.some((item: any) => item?.conversionId === record.conversionId);
+                            const newSelectedRows = selected
+                                ? oldData?.filter((item: any) => item?.conversionId !== record.conversionId)
+                                : [...oldData, record];
+                            newDatas[selectAdz - 1]['newConversionList'] = newSelectedRows;
+                            setData([...newDatas])
+                        },
+                    })}
+                />
+            </div>
+        </div>
+    </Modal>
+}
+
+export default React.memo(ConversionSelect)

+ 46 - 0
src/pages/launchSystemV3/components/ConversionSelect/tableConfig.tsx

@@ -0,0 +1,46 @@
+import React from "react"
+import { GOAL_ROAS_ENUM, OPTIMIZATIONGOAL_ENUM } from "../../tencentAdPutIn/const"
+import { TableProps } from "antd"
+let columns = (): TableProps<any>['columns'] => [
+    {
+        title: '转化名称',
+        dataIndex: 'conversionName',
+        key: 'conversionName',
+        ellipsis: true,
+        render: (a: any, b: any) => {
+            return <span style={{ fontSize: "12px" }}>{a}</span>
+        }
+    },
+    {
+        title: '优化目标',
+        dataIndex: 'optimizationGoal',
+        key: 'optimizationGoal',
+        width: 100,
+        align: 'center',
+        ellipsis: true,
+        render: (a: any, b: any) => {
+            return <span style={{ fontSize: "12px" }}>{OPTIMIZATIONGOAL_ENUM[a as keyof typeof OPTIMIZATIONGOAL_ENUM]}</span>
+        }
+    },
+    {
+        title: '深度优化目标',
+        dataIndex: 'deepBehaviorOptimizationGoal',
+        key: 'deepBehaviorOptimizationGoal',
+        width: 120,
+        ellipsis: true,
+        render: (a: any, b: any) => {
+            return <span style={{ fontSize: "12px" }}>{a ? OPTIMIZATIONGOAL_ENUM[a as keyof typeof OPTIMIZATIONGOAL_ENUM] : b?.deepWorthOptimizationGoal ? GOAL_ROAS_ENUM[b?.deepWorthOptimizationGoal as keyof typeof GOAL_ROAS_ENUM] : null}</span>
+        }
+    },
+    {
+        title: '上报类型',
+        dataIndex: 'createSourceType',
+        key: 'createSourceType',
+        width: 100,
+        render: (a: any, b: any) => {
+            return <span style={{ fontSize: "12px" }}>{a === 'SELF_CREATED' ? '自建转化' : a === 'PLATFORM' ? '平台类转化' : ''}</span>
+        }
+    }
+]
+
+export default columns

+ 4 - 2
src/pages/launchSystemV3/components/GoodsModal/index.tsx

@@ -5,6 +5,7 @@ import React, { useEffect, useState } from "react"
 import style from './index.less'
 import columns from './tableConfig'
 import { getByRemotemarketingAssetContentApi } from "@/services/adqV3/global"
+import { MARKETING_TARGET_TYPE_ENUM } from "../../tencentAdPutIn/const"
 const { Title, Text } = Typography;
 
 /**
@@ -12,6 +13,7 @@ const { Title, Text } = Typography;
  * @returns 
  */
 interface Props {
+    marketingTargetType: MARKETING_TARGET_TYPE_ENUM,
     visible?: boolean,
     onClose?: () => void,
     onChange?: (data: PULLIN.AccountCreateLogsProps[]) => void,
@@ -20,7 +22,7 @@ interface Props {
 const GoodsModal: React.FC<Props> = (props) => {
 
     /************************/
-    const { visible, onClose, data: data1, onChange } = props
+    const { marketingTargetType, visible, onClose, data: data1, onChange } = props
     const [selectAdz, setSelectAdz] = useState<number>(1)   // 选择广告主
     const [data, setData] = useState<PULLIN.AccountCreateLogsProps[]>(data1)
     const [queryForm, setQueryForm] = useState<{
@@ -52,7 +54,7 @@ const GoodsModal: React.FC<Props> = (props) => {
         accountId?: number
     }) => {
         setQueryForm(data)
-        getByRemotemarketingAssetContent.run(data)
+        getByRemotemarketingAssetContent.run({ ...data, marketingAssetType: marketingTargetType })
     }
 
     const handleOk = () => {

+ 1 - 1
src/pages/launchSystemV3/components/GoodsModal/tableConfig.tsx

@@ -3,7 +3,7 @@ import React from "react"
 let columns = (): TableProps<any>['columns'] => {
     return [
         {
-            title: '小说名称',
+            title: '产品名称',
             dataIndex: 'marketingAssetName',
             key: 'marketingAssetName',
             ellipsis: true,

+ 54 - 44
src/pages/launchSystemV3/components/PageModal/index.tsx

@@ -119,53 +119,64 @@ const PageModal: React.FC<Props> = (props) => {
         setSelectAdz(value)
     }
 
-    /** 表格选折 */
-    // const onChangeTable = (_: React.Key[], selectedRows: any) => {
-    //     let newData = JSON.parse(JSON.stringify(data))
-    //     newData[selectAdz - 1]['pageList'] = selectedRows
-    //     setData([...newData])
-    // }
-
     /** 一键设置 */
     const setOnekey = () => {
-        let pageName: string = data[selectAdz - 1]['pageList']?.[0]?.pageName
         let newData: PULLIN.AccountCreateLogsProps[] = JSON.parse(JSON.stringify(data))
-        const hide = message.loading(`正在设置...`, 0, () => {
-            message.success('设置成功');
-        });
-        let filterData = newData?.filter(item => item.accountId !== data[selectAdz - 1].accountId)
-        let ajax = filterData?.map(item => {
-            let params: any = { ...queryForm, pageNum: 1, accountId: item.accountId, ownerUid: wXDownPageAuthInfo[item.accountId]?.[0]?.accountId, pageName, pageStatus: 'NORMAL', marketingGoal, marketingTargetType, marketingCarrierType, siteSet }
-            if (!params.isSqDownPage) {
-                delete params?.ownerUid
-            }
-            if (params?.isCanvasType) {
-                params.canvasType = 'CANVAS_TYPE_COMMON_PAGE'
-            }
-            delete params?.isCanvasType
-            delete params.isSqDownPage
-            return getAdqLandingPageListApi(params)
-        })
-        Promise.all(ajax).then(res => {
-            if (res && Array.isArray(res)) {
-                res.forEach((item: any, index) => {
-                    let records = item?.data?.records
-                    if (Array.isArray(records) && records?.length > 0) {
-                        let record = records[0]
-                        let filterD = filterData[index]
-                        newData = newData.map(item => {
-                            if (item.accountId.toString() === filterD.accountId.toString() && record) {
-                                return { ...item, pageList: [{ ...record, id: record.pageId }] }
-                            }
-                            return item
-                        })
+        function setPageData(pageIndex: number) {
+            let pageList = data[selectAdz - 1]['pageList']
+            let count = pageList.length
+            let curPageData = pageList[pageIndex]
+            let pageName: string = curPageData.pageName
+
+            const hide = message.loading(`正在查找设置《${pageName}》当前第${pageIndex + 1}个...`, 0, () => {
+                message.success('设置成功');
+            });
+            let filterData = newData?.filter(item => item.accountId !== data[selectAdz - 1].accountId)
+            let ajax = filterData?.map(item => {
+                let params: any = { ...queryForm, pageNum: 1, accountId: item.accountId, ownerUid: wXDownPageAuthInfo[item.accountId]?.[0]?.accountId, pageNameFull: pageName, pageStatus: 'NORMAL', marketingGoal, marketingTargetType, marketingCarrierType, siteSet }
+                if (!params.isSqDownPage) {
+                    delete params?.ownerUid
+                }
+                if (params?.isCanvasType) {
+                    params.canvasType = 'CANVAS_TYPE_COMMON_PAGE'
+                }
+                delete params?.isCanvasType
+                delete params.isSqDownPage
+                return getAdqLandingPageListApi(params)
+            })
+            Promise.all(ajax).then(res => {
+                if (res && Array.isArray(res)) {
+                    res.forEach((item: any, index) => {
+                        let records = item?.data?.records
+                        if (Array.isArray(records) && records?.length > 0) {
+                            let record = records.find(item => item.pageName === pageName)
+                            let filterD = filterData[index]
+                            newData = newData.map(item => {
+                                if (item.accountId.toString() === filterD.accountId.toString() && record) {
+                                    if (pageIndex === 0) {
+                                        return { ...item, pageList: [{ ...record, id: record.pageId }] }
+                                    } else {
+                                        let pageList = item.pageList || []
+                                        pageList.push({ ...record, id: record.pageId })
+                                        return { ...item, pageList }
+                                    }
+                                }
+                                return item
+                            })
+                        }
+                    })
+                    if (count > pageIndex + 1) {
+                        setPageData(pageIndex + 1)
                     }
-                })
-                setData(newData)
-            }
-            message.success('设置完成');
-            hide()
-        })
+                    if (count === pageIndex + 1) {
+                        setData(newData)
+                    }
+                }
+                message.success('设置完成');
+                hide()
+            })
+        }
+        setPageData(0)
     }
 
     return <Modal
@@ -343,7 +354,6 @@ const PageModal: React.FC<Props> = (props) => {
                             }
                         },
                         selectedRowKeys: data[selectAdz - 1]?.pageList?.map((item: any) => item?.pageId),
-                        // onChange: onChangeTable,
                         hideSelectAll: deliveryMode === "DELIVERY_MODE_COMPONENT",
                         onSelect: (record: any, selected: boolean) => {
                             let newData = JSON.parse(JSON.stringify(data))

+ 51 - 41
src/pages/launchSystemV3/components/PageModal/indexOfficial.tsx

@@ -68,7 +68,7 @@ const PageOfficialModal: React.FC<Props> = (props) => {
 
     // 获取落地页列表
     const getList = () => {
-        let params: any = { ...queryForm, pageStatus: 'NORMAL', marketingGoal, marketingTargetType, marketingCarrierType, siteSet, pageType: 'PAGE_TYPE_OFFICIAL', creativeTemplateId: 311  }
+        let params: any = { ...queryForm, pageStatus: 'NORMAL', marketingGoal, marketingTargetType, marketingCarrierType, siteSet, pageType: 'PAGE_TYPE_OFFICIAL', creativeTemplateId: creativeTemplateId || 311 }
         if (params.isSqDownPage) {
             if (!params?.ownerUid) {
                 setTableData({ total: 0, records: [] })
@@ -105,49 +105,60 @@ const PageOfficialModal: React.FC<Props> = (props) => {
         setSelectAdz(value)
     }
 
-    /** 表格选折 */
-    // const onChangeTable = (_: React.Key[], selectedRows: any) => {
-    //     let newData = JSON.parse(JSON.stringify(data))
-    //     newData[selectAdz - 1]['pageList'] = selectedRows
-    //     setData([...newData])
-    // }
-
     /** 一键设置 */
     const setOnekey = () => {
-        let pageName: string = data[selectAdz - 1]['pageList']?.[0]?.pageName
         let newData: PULLIN.AccountCreateLogsProps[] = JSON.parse(JSON.stringify(data))
-        const hide = message.loading(`正在设置...`, 0, () => {
-            message.success('设置成功');
-        });
-        let filterData = newData?.filter(item => item.accountId !== data[selectAdz - 1].accountId)
-        let ajax = filterData?.map(item => {
-            let params: any = { ...queryForm, pageNum: 1, accountId: item.accountId, ownerUid: wXDownPageAuthInfo[item.accountId]?.[0]?.accountId, pageName, pageStatus: 'NORMAL', marketingGoal, marketingTargetType, marketingCarrierType, siteSet, pageType: 'PAGE_TYPE_OFFICIAL', creativeTemplateId }
-            if (!params.isSqDownPage) {
-                delete params?.ownerUid
-            }
-            delete params.isSqDownPage
-            return getAdqLandingPageOfficialListApi(params)
-        })
-        Promise.all(ajax).then(res => {
-            if (res && Array.isArray(res)) {
-                res.forEach((item: any, index) => {
-                    let records = item?.data?.records
-                    if (Array.isArray(records) && records?.length > 0) {
-                        let record = records[0]
-                        let filterD = filterData[index]
-                        newData = newData.map(item => {
-                            if (item.accountId.toString() === filterD.accountId.toString() && record) {
-                                return { ...item, pageList: [{ ...record, id: record.pageId }] }
-                            }
-                            return item
-                        })
+        function setPageData(pageIndex: number) {
+            let pageList = data[selectAdz - 1]['pageList']
+            let count = pageList.length
+            let curPageData = pageList[pageIndex]
+            let pageName: string = curPageData.pageName
+
+            const hide = message.loading(`正在查找设置《${pageName}》当前第${pageIndex + 1}个...`, 0, () => {
+                message.success('设置成功');
+            });
+            let filterData = newData?.filter(item => item.accountId !== data[selectAdz - 1].accountId)
+            let ajax = filterData?.map(item => {
+                let params: any = { ...queryForm, pageNum: 1, accountId: item.accountId, ownerUid: wXDownPageAuthInfo[item.accountId]?.[0]?.accountId, pageNameFull: pageName, pageStatus: 'NORMAL', marketingGoal, marketingTargetType, marketingCarrierType, siteSet, pageType: 'PAGE_TYPE_OFFICIAL', creativeTemplateId: creativeTemplateId || 311 }
+                if (!params.isSqDownPage) {
+                    delete params?.ownerUid
+                }
+                delete params.isSqDownPage
+                return getAdqLandingPageOfficialListApi(params)
+            })
+            Promise.all(ajax).then(res => {
+                if (res && Array.isArray(res)) {
+                    res.forEach((item: any, index) => {
+                        let records = item?.data?.records
+                        if (Array.isArray(records) && records?.length > 0) {
+                            let record = records.find(item => (item.pageName === pageName && item.disableCode === 0))
+                            let filterD = filterData[index]
+                            newData = newData.map(item => {
+                                if (item.accountId.toString() === filterD.accountId.toString() && record) {
+                                    if (pageIndex === 0) {
+                                        return { ...item, pageList: [{ ...record, id: record.pageId }] }
+                                    } else {
+                                        let pageList = item.pageList || []
+                                        pageList.push({ ...record, id: record.pageId })
+                                        return { ...item, pageList }
+                                    }
+                                }
+                                return item
+                            })
+                        }
+                    })
+                    if (count > pageIndex + 1) {
+                        setPageData(pageIndex + 1)
                     }
-                })
-                setData(newData)
-            }
-            message.success('设置完成');
-            hide()
-        })
+                    if (count === pageIndex + 1) {
+                        setData(newData)
+                    }
+                }
+                message.success('设置完成');
+                hide()
+            })
+        }
+        setPageData(0)
     }
 
     return <Modal
@@ -278,7 +289,6 @@ const PageOfficialModal: React.FC<Props> = (props) => {
                             }
                         },
                         selectedRowKeys: data[selectAdz - 1]?.pageList?.map((item: any) => item?.pageId),
-                        // onChange: onChangeTable,
                         hideSelectAll: deliveryMode === "DELIVERY_MODE_COMPONENT",
                         onSelect: (record: any, selected: boolean) => {
                             let newData = JSON.parse(JSON.stringify(data))

Plik diff jest za duży
+ 0 - 0
src/pages/launchSystemV3/tencentAdPutIn/const.ts


+ 46 - 9
src/pages/launchSystemV3/tencentAdPutIn/create/Ad/adgroupsMarketingContent.tsx

@@ -1,4 +1,4 @@
-import { Card, Form, Select, Switch } from "antd"
+import { Card, Form, Radio, Select, Space, Switch, Tooltip } from "antd"
 import React, { useContext, useEffect, useState } from "react"
 import MarketingGoal from "./marketingGoal"
 import NewRadio from "@/pages/launchSystemV3/components/NewRadio"
@@ -8,6 +8,7 @@ import New1Radio from "@/pages/launchSystemV3/components/New1Radio"
 import { useAjax } from "@/Hook/useAjax"
 import { getOptimizationGoalPermissionsV3Api } from "@/services/adqV3/global"
 import { adRules } from "../../rules"
+import { QuestionCircleFilled } from "@ant-design/icons"
 
 
 /**
@@ -28,6 +29,7 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
     const smartBidType = Form.useWatch('smartBidType', form);
     const depthConversionEnabled = Form.useWatch('depthConversionEnabled', form);
     const deepConversionType = Form.useWatch(['deepConversionSpec', 'deepConversionType'], form);
+    const goal = Form.useWatch(['deepConversionSpec', deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? 'deepConversionBehaviorSpec' : 'deepConversionWorthSpec', 'goal'], form);
     // 推广产品
     const [marketingTargetTypeList, setMarketingTargetTypeList] = useState<PULLIN.DataType[]>([])
     const [marketingCarrierTypeList, setMarketingCarrierTypeList] = useState<PULLIN.DataType[]>([])
@@ -80,22 +82,23 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
             (newBehaviorList?.length > 0 && newDeepConversionData.push({ label: '优化转化行为', value: 'DEEP_CONVERSION_BEHAVIOR' }))
             { newWorthList?.length > 0 && newDeepConversionData.push({ label: '优化ROI', value: 'DEEP_CONVERSION_WORTH' }) }
             setDeepConversionData(newDeepConversionData)
+            let deepConversionType = newBehaviorList?.length > 0 ? 'DEEP_CONVERSION_BEHAVIOR' : newWorthList?.length > 0 ? "DEEP_CONVERSION_WORTH" : ''
             form.setFieldsValue({
                 deepConversionSpec: {
-                    deepConversionType: newBehaviorList?.length > 0 ? 'DEEP_CONVERSION_BEHAVIOR' : newWorthList?.length > 0 ? "DEEP_CONVERSION_WORTH" : ''
+                    deepConversionType
                 }
             })
         }
-    }, [optimizationGoal, queryOptimizationGoalPermissions?.data])
+    }, [optimizationGoal, queryOptimizationGoalPermissions?.data, goal])
 
     // 选择营销目的触发
     useEffect(() => {
         let newRule: any = {}
         let newMarketingTargetTypeList: PULLIN.DataType[] = []
         if (marketingGoal) {
-            newRule = adRules[marketingGoal]
+            newRule = adRules[marketingGoal as keyof typeof adRules]
             // 根据const里数据对比选出可展示数据
-            newMarketingTargetTypeList = Object.keys(MARKETING_TARGET_TYPE_ENUM).filter(key => newRule?.[key]).map(key => ({ label: MARKETING_TARGET_TYPE_ENUM[key], value: key }))
+            newMarketingTargetTypeList = Object.keys(MARKETING_TARGET_TYPE_ENUM).filter(key => newRule?.[key]).map(key => ({ label: MARKETING_TARGET_TYPE_ENUM[key as keyof typeof MARKETING_TARGET_TYPE_ENUM], value: key }))
         }
         setMarketingTargetTypeList(newMarketingTargetTypeList)
         setRules(newRule)
@@ -115,7 +118,7 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
         // 推广产品是公众号不展示 营销载体类型
         if (marketingTargetType) {
             let marketingTargetTypeRules: string[] = rules?.[marketingTargetType]?.MARKETING_SUB_GOAL_UNKNOWN
-            newMarketingTargetTypeListList = Object.keys(MARKETING_CARRIER_TYPE_ENUM).filter(key => marketingTargetTypeRules?.[key]).map(key => ({ label: MARKETING_CARRIER_TYPE_ENUM[key], value: key }))
+            newMarketingTargetTypeListList = Object.keys(MARKETING_CARRIER_TYPE_ENUM).filter(key => marketingTargetTypeRules?.[key as keyof typeof marketingTargetTypeRules]).map(key => ({ label: MARKETING_CARRIER_TYPE_ENUM[key as keyof typeof MARKETING_CARRIER_TYPE_ENUM], value: key }))
         }
         setMarketingCarrierTypeList(newMarketingTargetTypeListList)
     }, [marketingTargetType, rules])
@@ -141,6 +144,20 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
         if (bidMode === 'BID_MODE_OCPM' || bidMode === 'BID_MODE_OCPC') {
             setIsUpdateOptimizationGoal(true)
         }
+        form.setFieldsValue({
+            deepConversionSpec: {
+                deepConversionType,
+                ...(deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? {
+                    deepConversionBehaviorSpec: {
+                        goal: undefined
+                    }
+                } : {
+                    deepConversionWorthSpec: {
+                        goal: undefined
+                    }
+                })
+            }
+        })
     }
 
     return <Card
@@ -165,6 +182,26 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
             <New1Radio data={marketingCarrierTypeList} onChange={(e) => { setOGPparams({ ...OGPParams, marketingCarrierType: e }); setIsUpdate() }} />
         </Form.Item>}
         {(bidMode === 'BID_MODE_OCPM' || bidMode === 'BID_MODE_OCPC') && <>
+            {['MARKETING_CARRIER_TYPE_JUMP_PAGE', 'MARKETING_CARRIER_TYPE_APP_IOS', 'MARKETING_CARRIER_TYPE_APP_QUICK_APP'].includes(marketingCarrierType) && <Form.Item
+                label={<Space>
+                    <strong>转化归因新链路</strong>
+                    <Tooltip title={<>
+                        <h5 style={{ color: '#FFF' }}>注意账号需要开通权限,该功能与“精准匹配归因”互斥;</h5>
+                        <p>
+                            转化中包含你希望高效获取的行为作为优化目标,深度优化目标,以及转化数据上报和归因的方式。
+                            我们将按照你设置的优化目标,为你尽可能找到实现转化的用户。
+                            你可以在工具箱-转化归因模块进行转化配置。
+                            <a href="https://e.qq.com/ads/helpcenter/detail/?cid=3529&pid=3179" target="__blank">了解更多</a>
+                        </p>
+                    </>}>
+                        <QuestionCircleFilled />
+                    </Tooltip>
+                </Space>}
+                name='isConversion'
+                help="注意账号需要开通权限"
+            >
+                <New1Radio data={[{ label: '开启', value: true }, { label: '关闭', value: false }]} />
+            </Form.Item>}
             <Form.Item label={<strong>优化目标</strong>} name='optimizationGoal' rules={[{ required: true, message: '请选择优化目标' }]}>
                 <Select
                     style={{ width: 480 }}
@@ -177,7 +214,7 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
                     loading={queryOptimizationGoalPermissions.loading}
                 >
                     {queryOptimizationGoalPermissions?.data?.optimizationGoalPermissionList.filter((key: string) => key !== 'UNKNOWN').map((key: string) => {
-                        return <Select.Option value={key} key={key}>{OPTIMIZATIONGOAL_ENUM[key]}</Select.Option>
+                        return <Select.Option value={key} key={key}>{OPTIMIZATIONGOAL_ENUM[key as keyof typeof OPTIMIZATIONGOAL_ENUM]}</Select.Option>
                     })}
                 </Select>
             </Form.Item>
@@ -200,8 +237,8 @@ const AdgroupsMarketingContent: React.FC<{ value?: any }> = ({ value }) => {
                     </Form.Item>
                     <Form.Item label={<strong>深度优化目标</strong>} name={['deepConversionSpec', deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? 'deepConversionBehaviorSpec' : 'deepConversionWorthSpec', 'goal']} rules={[{ required: true, message: '请选择深度优化目标' }]}>
                         <Select style={{ width: 480 }} placeholder='请选择'>
-                            {deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? Object.keys(OPTIMIZATIONGOAL_ENUM).filter(key => behaviorList?.includes(key)).map(key => <Select.Option value={key} key={key}>{OPTIMIZATIONGOAL_ENUM[key]}</Select.Option>) : deepConversionType === 'DEEP_CONVERSION_WORTH' ?
-                                Object.keys(GOAL_ROAS_ENUM).filter(key => worthList?.includes(key)).map(key => <Select.Option value={key} key={key}>{GOAL_ROAS_ENUM[key]}</Select.Option>) : null}
+                            {deepConversionType === 'DEEP_CONVERSION_BEHAVIOR' ? Object.keys(OPTIMIZATIONGOAL_ENUM).filter(key => behaviorList?.includes(key)).map(key => <Select.Option value={key} key={key}>{OPTIMIZATIONGOAL_ENUM[key as keyof typeof OPTIMIZATIONGOAL_ENUM]}</Select.Option>) : deepConversionType === 'DEEP_CONVERSION_WORTH' ?
+                                Object.keys(GOAL_ROAS_ENUM).filter(key => worthList?.includes(key)).map(key => <Select.Option value={key} key={key}>{GOAL_ROAS_ENUM[key as keyof typeof GOAL_ROAS_ENUM]}</Select.Option>) : null}
                         </Select>
                     </Form.Item>
                 </>}

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

@@ -101,7 +101,7 @@ const AdgroupsPrice: React.FC = () => {
                         name={['deepConversionSpec', 'deepConversionWorthSpec', 'expectedRoi']}
                         rules={[
                             { required: true, message: '请输入期望ROI' },
-                            { type: 'number', min: 0.001, max: 1000, message: '范围0.001~1000' },
+                            { type: 'number', ...(goal === 'GOAL_1DAY_MONETIZATION_ROAS' ? { min: 0.001, max: 50, message: '范围0.001~50' } : { min: 0.001, max: 1000, message: '范围0.001~1000' }) },
                             {
                                 validator: (_: any, value: string) => {
                                     if (!value || /^\d+(\.\d{0,3})?$/.test(value)) {
@@ -112,7 +112,7 @@ const AdgroupsPrice: React.FC = () => {
                             }
                         ]}
                     >
-                        <InputNumber style={{ width: 480 }} placeholder={`期望ROI目标范围0.001~1000,输入0.05,表示ROI目标为5%`} />
+                        <InputNumber style={{ width: 480 }} placeholder={`期望ROI目标范围${goal === 'GOAL_1DAY_MONETIZATION_ROAS' ? '0.001~50' : '0.001~1000'},输入0.05,表示ROI目标为5%`} />
                     </Form.Item>
                 </> : null}
 

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

@@ -245,7 +245,7 @@ const AdgroupsSitSet: React.FC = () => {
                     </div>
                     {tencentNewsType === '1' && <div className={style.newSpace_bottom}>
                         <Form.Item name={['sceneSpec', 'tencentNews']} rules={[{ required: true, message: '请选择!' }]}>
-                            <Checkbox.Group options={Object.keys(TENCENT_NEWS_ENUM)?.map(key => ({ label: TENCENT_NEWS_ENUM[key], value: key }))} />
+                            <Checkbox.Group options={Object.keys(TENCENT_NEWS_ENUM)?.map(key => ({ label: TENCENT_NEWS_ENUM[key as keyof typeof TENCENT_NEWS_ENUM], value: key }))} />
                         </Form.Item>
                     </div>}
                 </div>}
@@ -262,7 +262,7 @@ const AdgroupsSitSet: React.FC = () => {
                     </div>
                     {displaySceneType === '1' && <div className={style.newSpace_bottom}>
                         <Form.Item name={['sceneSpec', 'displayScene']} rules={[{ required: true, message: '请选择!' }]}>
-                            <Checkbox.Group options={Object.keys(DISPLAY_SCENE_ENUM)?.map(key => ({ label: DISPLAY_SCENE_ENUM[key], value: key }))} />
+                            <Checkbox.Group options={Object.keys(DISPLAY_SCENE_ENUM)?.map(key => ({ label: DISPLAY_SCENE_ENUM[key as keyof typeof DISPLAY_SCENE_ENUM], value: key }))} />
                         </Form.Item>
                     </div>}
                 </div>}

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

@@ -19,7 +19,7 @@ const Ad: React.FC = () => {
     const { addelivery, setAddelivery, accountCreateLogs, clearData, setAccountCreateLogs } = useContext(DispatchAddelivery)!;
     const { adgroups } = addelivery
     const {
-        marketingGoal, marketingAssetOuterSpec, marketingCarrierType, automaticSiteEnabled, siteSet, searchExpandTargetingSwitch, bidMode, smartBidType, bidAmount, optimizationGoal,
+        marketingGoal, marketingAssetOuterSpec, marketingCarrierType, automaticSiteEnabled, siteSet, searchExpandTargetingSwitch, bidMode, smartBidType, bidAmount, optimizationGoal, isConversion, depthConversionEnabled,
         deepConversionSpec, autoAcquisitionEnabled, autoAcquisitionBudget, dailyBudget, endDate, beginDate, timeSeries, firstDayBeginTime, configuredStatus, adgroupName, sceneSpec, autoDerivedCreativeEnabled
     } = adgroups
     const [newVisible, setNewVisible] = useState<boolean>(false)
@@ -43,6 +43,7 @@ const Ad: React.FC = () => {
                         <p>计费方式:{BID_MODE_ENUM[bidMode as keyof typeof BID_MODE_ENUM]}</p>
                         <p>出价类型:{SMART_BID_TYPE_ENUM[smartBidType as keyof typeof SMART_BID_TYPE_ENUM]}</p>
                         <p>出价:{bidAmount}元/{optimizationGoal ? OPTIMIZATIONGOAL_ENUM[optimizationGoal as keyof typeof OPTIMIZATIONGOAL_ENUM] : ['BID_MODE_OCPM', 'BID_MODE_OCPC'].includes(bidMode) ? '千次曝光' : '点击'}</p>
+                        {isConversion && <p style={{ fontWeight: 'bold', color: '#000' }}>转化:新链路转化</p>}
                         {optimizationGoal && <p style={{ fontWeight: 'bold', color: '#000' }}>优化目标:{OPTIMIZATIONGOAL_ENUM[optimizationGoal as keyof typeof OPTIMIZATIONGOAL_ENUM]}</p>}
                         {deepConversionSpec && <>
                             <p style={{ fontWeight: 'bold', color: '#000' }}>深度转化优化:开启</p>
@@ -95,6 +96,13 @@ const Ad: React.FC = () => {
                     arraysHaveSameValues(adgroups?.siteSet || [], siteSet || []) &&  // 版位
                     arraysHaveSameValues(adgroups?.sceneSpec?.wechatPosition || [], sceneSpec?.wechatPosition || []) // 微信公众号与小程序定投
                 ) {
+                    if (adgroups?.isConversion !== isConversion || ((isConversion || adgroups?.isConversion) && adgroups?.depthConversionEnabled !== depthConversionEnabled)) {
+                        setAccountCreateLogs(accountCreateLogs.map(item => {
+                            delete item?.newConversionList
+                            delete item?.userActionSetsList
+                            return item
+                        }))
+                    }
                     setAddelivery({ ...addelivery, adgroups })
                     setNewVisible(false)
                     clearData()

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

@@ -206,7 +206,8 @@ const NewCreateAd: React.FC<Props> = ({ value, visible, onChange, onClose }) =>
                 wechatChannelsSceneType: '0',
                 timeSeriesType: '0',
                 isSetfirstDayBeginTime: false,
-                autoDerivedCreativeEnabled: false
+                autoDerivedCreativeEnabled: false,
+                isConversion: false
             }}
         >
             <DispatchAd.Provider value={{ form, OGPParams, setOGPparams }}>

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

@@ -64,8 +64,8 @@ const Dynamic: React.FC<{ creativeTemplateAppellation?: string, creativeTemplate
                         </Space>}
                     </>}
                     <p style={{ fontWeight: 'bold', color: '#000' }}>跳转类型:{mainJumpInfo?.map((item: any) => {
-                        let pageSpec = item.value.pageSpec
-                        return PAGE_TYPE_ENUM[pageSpecFieldConVertUn[Object.keys(pageSpec)?.[0] as keyof typeof pageSpecFieldConVertUn] as keyof typeof PAGE_TYPE_ENUM]
+                        let pageType = item.value.pageType
+                        return PAGE_TYPE_ENUM[pageType as keyof typeof PAGE_TYPE_ENUM]
                     }).toString()}</p>
                     {textLink?.length > 0 && <>
                         <p style={{ fontWeight: 'bold', color: '#000' }}>朋友圈文字链:开启</p>

+ 2 - 2
src/pages/launchSystemV3/tencentAdPutIn/create/Dynamic/newDynamic.tsx

@@ -419,10 +419,10 @@ const NewDynamic: React.FC<Props> = ({ value: newValue, visible, onClose, onChan
 
             if (mainJumpInfo && mainJumpInfo?.length > 0) {
                 dynamicValues.pageSpec = mainJumpInfo.map((item: any) => {
-                    let { pageSpec } = item.value
+                    let { pageSpec, pageType } = item.value
                     let key = Object.keys(pageSpec)[0]
                     let pageSpecValue = pageSpec[key]
-                    return { ...pageSpecValue, pageType: pageSpecFieldConVertUn[key as keyof typeof pageSpecFieldConVertUn] }
+                    return { ...pageSpecValue, pageType }
                 })
             }
 

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

@@ -64,7 +64,8 @@ const PageList: React.FC<{ adDataGroup?: { [x: number]: any[] } }> = ({ adDataGr
                 </Button>
             </div>
         </div>
-
+        
+        {/* 原生推广页 */}
         {addVisible && <PageModal
             data={accountCreateLogs}
             adgroups={adgroups}

+ 12 - 4
src/pages/launchSystemV3/tencentAdPutIn/create/addDynamic.tsx

@@ -1,4 +1,4 @@
-import { Button, Card, Drawer, Empty, Popconfirm, Space, Spin, Table, Tabs, Typography, message } from "antd"
+import { Button, Card, Drawer, Empty, Modal, Popconfirm, Space, Spin, Table, Tabs, Typography, message } from "antd"
 import React, { useEffect, useState } from "react"
 import '../index.less'
 import style from './index.less'
@@ -479,8 +479,16 @@ const AddDynamic: React.FC<PULLIN.NewAddDynamic> = ({ visible, onChange, onClose
         }
         createDynamicTask.run(params).then(res => {
             if (res) {
-                message.success('创建任务提交成功')
-                onChange?.()
+                Modal.success({
+                    content: '创建任务提交成功',
+                    bodyStyle: { fontWeight: 700 },
+                    okText: '返回上一页',
+                    closable: true,
+                    onOk: () => {
+                        onChange?.()
+                    },
+                    onCancel: () => {}
+                })
             }
         })
     }
@@ -500,7 +508,7 @@ const AddDynamic: React.FC<PULLIN.NewAddDynamic> = ({ visible, onChange, onClose
                     className={style.createAd}
                 >
                     <Space wrap>
-                        {(adgroups?.marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT' || adgroups?.marketingCarrierType === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT') && <Button type="primary" danger={!accountCreateLogs?.some(item => item?.wechatChannelList?.length)} onClick={() => { setWechatVisible(true) }}>{accountCreateLogs?.some(item => item?.wechatChannelList?.length) ? <>重新选择公众号 <CheckOutlined style={{ color: '#FFFFFF' }} /></> : '请选择公众号'}</Button>}
+                        {(adgroups?.marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT' || adgroups?.marketingCarrierType === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT' || addelivery?.dynamic?.creativeComponents?.brand?.[0]?.value?.jumpInfo?.pageType === 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL') && <Button type="primary" danger={!accountCreateLogs?.some(item => item?.wechatChannelList?.length)} onClick={() => { setWechatVisible(true) }}>{accountCreateLogs?.some(item => item?.wechatChannelList?.length) ? <>重新选择公众号 <CheckOutlined style={{ color: '#FFFFFF' }} /></> : '请选择公众号'}</Button>}
                     </Space>
                     <div className={style.settingsBody}>
                         <div className={style.settingsBody_content}>

+ 60 - 26
src/pages/launchSystemV3/tencentAdPutIn/create/index.tsx

@@ -23,6 +23,7 @@ import { createAdgroupTaskApi, getSelectTaskDetailApi } from "@/services/adqV3"
 import WechatAccount from "../../components/WechatAccount"
 import Title from "antd/lib/typography/Title"
 import { getCreativeDetailsApi } from "@/services/adqV3/global"
+import ConversionSelect from "../../components/ConversionSelect"
 
 export const DispatchAddelivery = React.createContext<PULLIN.DispatchAddelivery | null>(null);
 
@@ -36,13 +37,14 @@ const Create: React.FC = () => {
     const { getAllUserAccount } = useModel('useLaunchAdq.useAdAuthorize')
     const { initTargeting } = useModel('useLaunchV3.useTargeting')
     const [addelivery, setAddelivery] = useState<PULLIN.AddeliveryProps>({ adgroups: {}, targeting: [], dynamic: {}, dynamicMaterialDTos: {}, dynamicCreativesTextDTOS: {}, mediaType: 0 })
-    const { marketingAssetOuterSpec, marketingCarrierType, marketingGoal, siteSet, automaticSiteEnabled, sceneSpec } = addelivery.adgroups
-    const { deliveryMode, creativeTemplateId } = addelivery.dynamic
+    const { marketingAssetOuterSpec, marketingCarrierType, marketingGoal, siteSet, automaticSiteEnabled, sceneSpec, isConversion } = addelivery.adgroups
+    const { deliveryMode, creativeTemplateId, creativeComponents } = addelivery.dynamic
     const [accSearch, setAccSearch] = useState<string>()
     const [accountCreateLogs, setAccountCreateLogs] = useState<PULLIN.AccountCreateLogsProps[]>([])  // 账户
     const [goodsVisible, setGoodsVisible] = useState<boolean>(false) // 选择小说弹窗控制
     const [wechatVisible, setWechatVisible] = useState<boolean>(false) // 选择微信公众号弹窗控制
     const [sourceVisible, setSourceVisible] = useState<boolean>(false) // 选择数据源弹窗控制
+    const [conversionVisible, setConversionVisible] = useState<boolean>(false) // 选择转化归因控制
     const [materialData, setMaterialData] = useState<any>({}) // 素材数据
     const [textData, setTextData] = useState<any>({})
     const [tableData, setTableData] = useState<any>({})
@@ -223,19 +225,9 @@ const Create: React.FC = () => {
                         })
                     }
 
-                    setAddelivery({
-                        adgroups: { ...adgroupDTO, adgroupName: adgroupDTO.adgroupName + '_副本' + randomString(true, 3, 5), endDate, beginDate },
-                        targeting: targetings.map((item: any) => {
-                            const { targetingName, ...targeting } = item
-                            return { targetingName, targeting }
-                        }),
-                        dynamic,
-                        dynamicMaterialDTos: dynamicGroup.length > 0 ? { dynamicGroup } : {},
-                        dynamicCreativesTextDTOS: dynamicCreativesTextDTO,
-                        mediaType: mediaType || 0
-                    })
+                    let isConversion = false
                     setAccountCreateLogs(Object.keys(accountIdParamVOMap || {}).map(accountId => {
-                        const { productDTOS, wechatOfficialAccountsVO, pageList, landingPageVOS, userActionSetsList } = accountIdParamVOMap[accountId]
+                        const { productDTOS, wechatOfficialAccountsVO, pageList, landingPageVOS, userActionSetsList, conversionInfo } = accountIdParamVOMap[accountId]
                         let data: PULLIN.AccountCreateLogsProps = {
                             accountId: Number(accountId),
                             productList: productDTOS
@@ -249,8 +241,24 @@ const Create: React.FC = () => {
                         if (userActionSetsList) {
                             data.userActionSetsList = userActionSetsList
                         }
+                        if (conversionInfo) {
+                            isConversion = true
+                            data.newConversionList = [conversionInfo]
+                        }
                         return data
                     }))
+
+                    setAddelivery({
+                        adgroups: { ...adgroupDTO, isConversion, adgroupName: adgroupDTO.adgroupName + '_副本' + randomString(true, 3, 5), endDate, beginDate },
+                        targeting: targetings.map((item: any) => {
+                            const { targetingName, ...targeting } = item
+                            return { targetingName, targeting }
+                        }),
+                        dynamic,
+                        dynamicMaterialDTos: dynamicGroup.length > 0 ? { dynamicGroup } : {},
+                        dynamicCreativesTextDTOS: dynamicCreativesTextDTO,
+                        mediaType: mediaType || 0
+                    })
                     sessionStorage.removeItem('TASKID3.0')
                 }
             })
@@ -284,14 +292,18 @@ const Create: React.FC = () => {
             message.error('请先配置广告信息')
             return
         }
-        if (['MARKETING_TARGET_TYPE_FICTION'].includes(marketingAssetOuterSpec?.marketingTargetType) && !accountCreateLogs?.some(item => item?.productList?.length)) {
-            message.error('请先选择小说')
+        if (['MARKETING_TARGET_TYPE_FICTION', 'MARKETING_TARGET_TYPE_SHORT_DRAMA'].includes(marketingAssetOuterSpec?.marketingTargetType) && !accountCreateLogs?.some(item => item?.productList?.length)) {
+            message.error(marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_FICTION' ? '请先选择小说' : '请先选择短剧')
             return
         }
-        if ((['MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT'].includes(marketingAssetOuterSpec?.marketingTargetType) || marketingCarrierType === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT') && !accountCreateLogs?.some(item => item?.wechatChannelList?.length)) {
+        if ((['MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT'].includes(marketingAssetOuterSpec?.marketingTargetType) || marketingCarrierType === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT' || dynamic?.creativeComponents?.brand?.[0]?.value?.jumpInfo?.pageType === 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL') && !accountCreateLogs?.some(item => item?.wechatChannelList?.length)) {
             message.error('请先选择公众号')
             return
         }
+        if (isConversion && !accountCreateLogs?.some(item => item?.newConversionList?.length)) {
+            message.error('请先选择转化归因')
+            return
+        }
         if (!(targeting?.length)) {
             message.error('请先添加定向')
             return
@@ -346,7 +358,7 @@ const Create: React.FC = () => {
             let adLength = 0
             accountCreateLogs.forEach(item => {
                 let productList: any[] = []
-                if (['MARKETING_TARGET_TYPE_FICTION'].includes(marketingAssetOuterSpec?.marketingTargetType)) { // 小说
+                if (['MARKETING_TARGET_TYPE_FICTION', 'MARKETING_TARGET_TYPE_SHORT_DRAMA'].includes(marketingAssetOuterSpec?.marketingTargetType)) { // 小说
                     productList = item?.productList || []
                 } else if (['MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT'].includes(marketingAssetOuterSpec?.marketingTargetType)) { // 公众号
                     productList = item?.wechatChannelList || []
@@ -403,7 +415,7 @@ const Create: React.FC = () => {
         let accountIndex = 0, accountIndex1 = 0
         accountCreateLogs.forEach(item => {
             let productList: any[] = []
-            if (['MARKETING_TARGET_TYPE_FICTION'].includes(marketingAssetOuterSpec?.marketingTargetType)) { // 小说
+            if (['MARKETING_TARGET_TYPE_FICTION', 'MARKETING_TARGET_TYPE_SHORT_DRAMA'].includes(marketingAssetOuterSpec?.marketingTargetType)) { // 小说
                 productList = item?.productList || []
             } else if (['MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT'].includes(marketingAssetOuterSpec?.marketingTargetType)) { // 公众号
                 productList = item?.wechatChannelList || []
@@ -416,6 +428,7 @@ const Create: React.FC = () => {
                     id: item.accountId + '_' + index,
                     accountId: item.accountId,                    // 账户
                     userActionSetsList: item.userActionSetsList,  // 数据源
+                    conversionList: item.newConversionList,       // 转化归因
                     pageListDto: item.pageList,                   // 落地页
                     productDto,                                   // 商品
                     targetDto: {                                  // 定向
@@ -458,7 +471,7 @@ const Create: React.FC = () => {
                                 isRowSpan: true
                             })
                         })
-                        
+
                     })
                 } else {
                     newData = cartesianProduct(data, item.pageList).map((item, index) => {
@@ -570,7 +583,7 @@ const Create: React.FC = () => {
 
     // 提交
     const onSubmit = (values: any) => {
-        const { adgroups, targeting, dynamic, dynamicMaterialDTos, dynamicCreativesTextDTOS, mediaType } = addelivery
+        const { adgroups, targeting, dynamic, dynamicMaterialDTos, dynamicCreativesTextDTOS, mediaType } = JSON.parse(JSON.stringify(addelivery)) as PULLIN.AddeliveryProps
 
         let dynamicMaterialDTOS = []
         if (dynamic.deliveryMode === 'DELIVERY_MODE_CUSTOMIZE') {
@@ -680,7 +693,7 @@ const Create: React.FC = () => {
         }
         let accountIdParamDTOMap: any = {}
         accountCreateLogs.forEach(item => {
-            let { pageList, productList, userActionSetsList, accountId, wechatChannelList } = item
+            let { pageList, productList, userActionSetsList, accountId, wechatChannelList, newConversionList } = item
 
             let userActionSetsListDto = userActionSetsList?.map((item: any) => ({ id: item?.userActionSetId, type: item?.type })) // dataSourceId
 
@@ -696,6 +709,9 @@ const Create: React.FC = () => {
             if (wechatChannelList) {
                 map.wechatChannelId = wechatChannelList?.[0]?.wechatOfficialAccountId
             }
+            if (newConversionList) {
+                map.conversionId = newConversionList[0].conversionId
+            }
 
             accountIdParamDTOMap[accountId] = map
         })
@@ -703,6 +719,7 @@ const Create: React.FC = () => {
         if (dynamic.deliveryMode === 'DELIVERY_MODE_COMPONENT') {
             dynamicCreativesDTO.creativeTemplateId = 711
         }
+        delete adgroups?.isConversion  // 前端控制新链路字段
         let params = {
             ...values,
             adgroupDTO: adgroups,
@@ -833,9 +850,13 @@ const Create: React.FC = () => {
                     </Selector>
 
                     {accountCreateLogs?.length > 0 && <>
-                        {marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_FICTION' && <Button type="primary" danger={!accountCreateLogs?.some(item => item?.productList?.length)} onClick={() => { setGoodsVisible(true) }}>{accountCreateLogs?.some(item => item?.productList?.length) ? <>重新选择小说 <CheckOutlined style={{ color: '#FFFFFF' }} /></> : '请选择小说'}</Button>}
-                        {(marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT' || marketingCarrierType === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT') && <Button type="primary" danger={!accountCreateLogs?.some(item => item?.wechatChannelList?.length)} onClick={() => { setWechatVisible(true) }}>{accountCreateLogs?.some(item => item?.wechatChannelList?.length) ? <>重新选择公众号 <CheckOutlined style={{ color: '#FFFFFF' }} /></> : '请选择公众号'}</Button>}
-                        <Button onClick={() => { setSourceVisible(true) }}>精准匹配归因(选填){accountCreateLogs?.some(item => item?.userActionSetsList?.length) && <CheckOutlined style={{ color: '#1890ff' }} />}</Button>
+                        {['MARKETING_TARGET_TYPE_FICTION', 'MARKETING_TARGET_TYPE_SHORT_DRAMA'].includes(marketingAssetOuterSpec?.marketingTargetType) && <Button type="primary" danger={!accountCreateLogs?.some(item => item?.productList?.length)} onClick={() => { setGoodsVisible(true) }}>{accountCreateLogs?.some(item => item?.productList?.length) ? <>重新选择{marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_FICTION' ? '小说' : '短剧'} <CheckOutlined style={{ color: '#FFFFFF' }} /></> : `请选择${marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_FICTION' ? '小说' : '短剧'}`}</Button>}
+                        {(marketingAssetOuterSpec?.marketingTargetType === 'MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT' || marketingCarrierType === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT' || creativeComponents?.brand?.[0]?.value?.jumpInfo?.pageType === 'PAGE_TYPE_WECHAT_OFFICIAL_ACCOUNT_DETAIL') && <Button type="primary" danger={!accountCreateLogs?.some(item => item?.wechatChannelList?.length)} onClick={() => { setWechatVisible(true) }}>{accountCreateLogs?.some(item => item?.wechatChannelList?.length) ? <>重新选择公众号 <CheckOutlined style={{ color: '#FFFFFF' }} /></> : '请选择公众号'}</Button>}
+                        {!isConversion ?
+                            <Button onClick={() => { setSourceVisible(true) }}>精准匹配归因(选填){accountCreateLogs?.some(item => item?.userActionSetsList?.length) && <CheckOutlined style={{ color: '#1890ff' }} />}</Button>
+                            :
+                            <Button type="primary" danger={!accountCreateLogs?.some(item => item?.newConversionList?.length)} onClick={() => { setConversionVisible(true) }}>{accountCreateLogs?.some(item => item?.newConversionList?.length) ? <>重新选择转化归因<CheckOutlined style={{ color: '#FFF' }} /></> : '请选择转化归因'}</Button>
+                        }
                     </>}
                 </Space>
 
@@ -859,7 +880,7 @@ const Create: React.FC = () => {
                                 {/* 定向 */}
                                 <Target />
                                 {/* 创意 */}
-                                <Dynamic 
+                                <Dynamic
                                     creativeTemplateAppellation={creativeTemplateAppellation}
                                     creativeTemplateStyle={creativeTemplateStyle}
                                 />
@@ -888,6 +909,7 @@ const Create: React.FC = () => {
 
                 {/* 选择小说 */}
                 {goodsVisible && <GoodsModal
+                    marketingTargetType={marketingAssetOuterSpec?.marketingTargetType}
                     visible={goodsVisible}
                     data={accountCreateLogs}
                     onClose={() => setGoodsVisible(false)}
@@ -919,6 +941,18 @@ const Create: React.FC = () => {
                         clearData()
                     }}
                 />}
+                {/* 转化归因 */}
+                {conversionVisible && <ConversionSelect
+                    adgroups={addelivery.adgroups}
+                    visible={conversionVisible}
+                    data={accountCreateLogs}
+                    onClose={() => setConversionVisible(false)}
+                    onChange={(e) => {
+                        setAccountCreateLogs(e);
+                        setConversionVisible(false);
+                        clearData()
+                    }}
+                />}
             </Card>
         </Spin>
 

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

@@ -33,18 +33,18 @@ const columns = (): TableProps<any>['columns'] => {
                     key: 'productName',
                     width: 200,
                     render: (_, b) => {
-                        if (['MARKETING_TARGET_TYPE_FICTION'].includes(b.adgroupsDto?.marketingAssetOuterSpec?.marketingTargetType)) {
+                        if (['MARKETING_TARGET_TYPE_FICTION', 'MARKETING_TARGET_TYPE_SHORT_DRAMA'].includes(b.adgroupsDto?.marketingAssetOuterSpec?.marketingTargetType)) {
                             return <Space size={0} direction="vertical">
                                 <Text style={{ fontSize: 12 }}>推广产品:{b?.productDto?.marketingAssetName}(产品ID:{b?.productDto?.marketingAssetId})</Text>
                                 {(b.adgroupsDto?.marketingCarrierType === 'MARKETING_CARRIER_TYPE_WECHAT_OFFICIAL_ACCOUNT' && b?.marketingCarrierDto) && <Text style={{ fontSize: 12 }}>营销载体:{b.marketingCarrierDto.map((item: { wechatOfficialAccountName: any; wechatOfficialAccountId: any; }) => `${item?.wechatOfficialAccountName}(${item?.wechatOfficialAccountId})`)?.toString()}</Text>}
-                                <Text style={{ fontSize: 12 }}>转化归因:{b?.userActionSetsList ? b?.userActionSetsList.map((item: { name: any; }) => item.name).toString() : '暂未配置'}</Text>
+                                <Text style={{ fontSize: 12 }}>转化归因:{b?.userActionSetsList ? b?.userActionSetsList.map((item: { name: any; }) => item.name).toString() : b?.conversionList ? b?.conversionList.map((item: { conversionName: any; conversionId: any; }) => `${item?.conversionName}(${item.conversionId})`).toString() : '暂未配置'}</Text>
                             </Space>
                         } else if (['MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT'].includes(b.adgroupsDto?.marketingAssetOuterSpec?.marketingTargetType)) {
                             return <Space size={0} direction="vertical">
                                 <Text style={{ fontSize: 12 }}>推广产品:微信公众号</Text>
                                 <Text style={{ fontSize: 12 }}>营销载体:微信公众号</Text>
                                 <Text style={{ fontSize: 12 }}>应用:{b?.productDto?.wechatOfficialAccountName}({b?.productDto?.wechatOfficialAccountId})</Text>
-                                <Text style={{ fontSize: 12 }}>转化归因:{b?.userActionSetsList ? b?.userActionSetsList.map((item: { name: any; }) => item.name).toString() : '暂未配置'}</Text>
+                                <Text style={{ fontSize: 12 }}>转化归因:{b?.userActionSetsList ? b?.userActionSetsList.map((item: { name: any; }) => item.name).toString() : b?.conversionList ? b?.conversionList.map((item: { conversionName: any; conversionId: any; }) => `${item?.conversionName}(${item.conversionId})`).toString() : '暂未配置'}</Text>
                             </Space>
                         }
                         return 'ERROR,请联系管理员'

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

@@ -71,7 +71,8 @@ declare namespace PULLIN {
         customAudienceList?: any,
         excludedCustomAudienceList?: any,
         pageList?: any,
-        coldStartAudienceList?: any[]
+        coldStartAudienceList?: any[],
+        newConversionList?: any[]
     }
     interface DynamicReactContent {
         form: FormInstance<any>

+ 26 - 0
src/services/adqV3/global.ts

@@ -101,6 +101,32 @@ export async function getWechatOfficialAccountsApi(data: { accountIdList: number
     });
 }
 
+/**
+ * 获取转化归因
+ * @param data 
+ * @returns 
+ */
+export async function getConversionInfoApi(data: { 
+    accountId: number,
+    pageNum: number,
+    pageSize: number,
+    accessStatus?: string[] // ACCESS_STATUS_COMPLETED 已接入 ACCESS_STATUS_PENDING 待接入
+    conversionId?: number,
+    conversionName?: string,
+    conversionType?: string, // 扣费类型(ID_TYPE_CPC, BID_TYPE_CPA, BID_TYPE_CPS, BID_TYPE_CPM, BID_TYPE_CPD)
+    createSourceType?: string,  // 转化创建来源,如 (SELF_CREATED 自建转化),(PLATFORM 平台类转化)
+    deepBehaviorOptimizationGoal?: string,
+    deepWorthAdvancedGoal?: string,
+    deepWorthOptimizationGoal?: string,
+    marketingScene?: string,
+    optimizationGoal?: string,
+    siteSet?: string,
+}) {
+    return request(api + `/adq/v3/launch/tools/getConversionInfo`, {
+        method: 'POST',
+        data,
+    });
+}
 
 
 /**

+ 14 - 2
src/services/launchAdq/adq.ts

@@ -263,8 +263,8 @@ export async function getAdqLandingPageList(params: {
   pageStatus?: string;
 }) {
   Object.keys(params).forEach(key => {
-    if (!params[key]) {
-      delete params[key]
+    if (!params[key as keyof typeof params]) {
+      delete params[key as keyof typeof params]
     }
   })
   return request(api + '/adq/landingPageWechat/list ', {
@@ -415,6 +415,18 @@ export async function putConfigServiceProvider(data: { accountIds: any[], servic
   });
 }
 
+/**
+ * 刷新token
+ * @param data 
+ * @returns 
+ */
+export async function putRefreshTokenApi(data: number[]) {
+  return request(api + `/adq/admin/adAccount/refreshToken`, {
+    method: 'PUT',
+    data
+  });
+}
+
 /**
  * 删除计划
  * @param data 

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików