wjx 1 rok pred
rodič
commit
25d71bbbd1

+ 7 - 1
config/routerConfig.ts

@@ -144,9 +144,15 @@ const gameDataStatistics = {
             routes: [
                 {
                     path: '/gameDataStatistics/adlist/monitor',
-                    name: '广告监控',
+                    name: '头条广告监控',
                     access: 'monitor',
                     component: './gameDataStatistics/adlist/monitor',
+                },
+                {
+                    path: '/gameDataStatistics/adlist/tencentMonitor',
+                    name: '腾讯广告监控',
+                    access: 'tencentMonitor',
+                    component: './gameDataStatistics/adlist/tencentMonitor',
                 }
             ]
         },

+ 2 - 2
src/pages/gameDataStatistics/adlist/monitor/index.tsx

@@ -87,7 +87,7 @@ const Monitor = () => {
                 field: queryForm?.sortFiled,
                 order: queryForm?.sortType === 'asc' ? 'ascend' : 'descend'
             }}
-            title='广告监控'
+            title='头条广告监控'
             onChange={(props: any) => {
                 let { pagination, sortData } = props
                 let { current, pageSize } = pagination
@@ -104,7 +104,7 @@ const Monitor = () => {
                 setQueryForm({ ...newQueryForm })
             }}
             config={columns12(dayHandle)}
-            configName={'广告监控'}
+            configName={'头条广告监控'}
         />
 
         {visible && <DayAd adName={adName} visible={visible} onClose={() => { setVisible(false); setPromotionId(undefined) }} queryForm={queryForm} promotionId={promotionId} />}

+ 45 - 0
src/pages/gameDataStatistics/adlist/tencentMonitor/const.tsx

@@ -0,0 +1,45 @@
+import { Badge } from "antd";
+import React from "react";
+
+/** 广告状态 */
+export const ADSTATUSEnum = {
+    'STATUS_PENDING': '审核中',
+    'STATUS_DENIED': <Badge status="error" text={<span style={{ fontSize: 12 }}>审核不通过</span>} />,
+    'STATUS_SUSPEND': <Badge status="warning" text={<span style={{ fontSize: 12 }}>暂停中</span>} />,
+    'STATUS_READY': <Badge status="default" text={<span style={{ fontSize: 12 }}>未到投放时间</span>} />,
+    'STATUS_ACTIVE': <Badge status="processing" text={<span style={{ fontSize: 12 }}>投放中</span>} />,
+    'STATUS_STOP': '投放结束',
+    'STATUS_ACTIVE_CAMPAIGN_SUSPEND': '广告被暂停',
+    'STATUS_PART_READY': '部分待投放',
+    'STATUS_PART_ACTIVE': '部分投放中',
+    'STATUS_DELETED': <Badge status="error" text={<span style={{ fontSize: 12 }}>已删除</span>} />,
+    'STATUS_UNKNOWN': '未知状态',
+    'STATUS_FROZEN': '冻结',
+    'STATUS_PREPARE': '准备中'
+}
+
+/** 出价方式 */
+export enum PRICINGEnum {
+    "BID_MODE_CPC" = "CPC",
+    "BID_MODE_CPA" = "CPA",
+    "BID_MODE_CPM" = "CPM",
+    "BID_MODE_OCPC" = "oCPC",
+    "BID_MODE_OCPM" = "oCPM"
+}
+
+export enum LANDINGTYPEEnum {
+    'PROMOTED_OBJECT_TYPE_APP_ANDROID' = 'Android 应用',
+    'PROMOTED_OBJECT_TYPE_APP_IOS' = 'IOS 应用',
+    'PROMOTED_OBJECT_TYPE_ECOMMERCE' = '电商推广',
+    'PROMOTED_OBJECT_TYPE_LINK_WECHAT' = '品牌活动推广',
+    'PROMOTED_OBJECT_TYPE_APP_ANDROID_MYAPP' = '应用宝推广',
+    'PROMOTED_OBJECT_TYPE_LOCAL_ADS_WECHAT' = '本地广告',
+    'PROMOTED_OBJECT_TYPE_QQ_BROWSER_MINI_PROGRAM' = 'QQ 浏览器小程序',
+    'PROMOTED_OBJECT_TYPE_QQ_MESSAGE' = 'QQ 消息',
+    'PROMOTED_OBJECT_TYPE_QZONE_VIDEO_PAGE' = '视频说说',
+    'PROMOTED_OBJECT_TYPE_LEAD_AD' = '销售线索收集',
+    'PROMOTED_OBJECT_TYPE_MINI_GAME_WECHAT' = '微信小游戏',
+    'PROMOTED_OBJECT_TYPE_MINI_GAME_QQ' = 'QQ 小游戏',
+    'PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT' = '微信公众号',
+    'PROMOTED_OBJECT_TYPE_APP_QUICK_APP' = '快应用',
+}

+ 70 - 0
src/pages/gameDataStatistics/adlist/tencentMonitor/dayAd.tsx

@@ -0,0 +1,70 @@
+import { useAjax } from "@/Hook/useAjax"
+import { PromotionDataDay, getPromotionDataTencentDayListApi } from "@/services/gameData/adlist"
+import { Drawer } from "antd"
+import React, { useEffect, useState } from "react"
+import TableData from "../../components/TableData"
+import columns12 from './tableConfigDay'
+
+interface Props {
+    queryForm: PromotionDataDay
+    adName: string,
+    promotionId?: number
+    onClose?: () => void
+    visible?: boolean
+}
+
+/**
+ * 广告每日监控
+ * @returns 
+ */
+const DayAd: React.FC<Props> = ({ adName, queryForm, promotionId, onClose, visible }) => {
+
+    /***********************************/
+    const [data, setData] = useState<{ pageSize: number, pageNum: number, sortFiled?: string, sortType?: string }>({ pageNum: 1, pageSize: 100 })
+    const getPromotionDataTencentDayList = useAjax((params) => getPromotionDataTencentDayListApi(params))
+    /***********************************/
+
+    useEffect(() => {
+        let params = JSON.parse(JSON.stringify(queryForm))
+        delete params.sortType
+        delete params.sortFiled
+        delete params.pageSize
+        delete params.pageNum
+        if (promotionId) {
+            params.promotionId = promotionId
+        }
+        getPromotionDataTencentDayList.run({...params, ...data})
+    }, [promotionId, queryForm, data])
+
+    return <Drawer title={`${adName} 腾讯广告每日数据`} placement="right" width={'90%'} onClose={onClose} visible={visible}>
+        <TableData
+            scroll={{ x: 1000, y: 600 }}
+            ajax={getPromotionDataTencentDayList}
+            fixed={{ left: 3, right: 0 }}
+            dataSource={getPromotionDataTencentDayList?.data?.records?.map((item: any, index: number) => ({ ...item, id:  Number(data.pageNum.toString() + index.toString()) }))}
+            total={getPromotionDataTencentDayList?.data?.total}
+            page={queryForm.pageNum}
+            pageSize={queryForm.pageSize}
+            title='腾讯广告每日监控'
+            onChange={(props: any) => {
+                let { pagination, sortData } = props
+                let { current, pageSize } = pagination
+                let newQueryForm = JSON.parse(JSON.stringify(data))
+                if (sortData && sortData?.order) {
+                    newQueryForm['sortType'] = sortData?.order === 'ascend' ? 'asc' : 'desc'
+                    newQueryForm['sortFiled'] = sortData?.field
+                } else {
+                    delete newQueryForm['sortType']
+                    delete newQueryForm['sortFiled']
+                }
+                newQueryForm.pageNum = current
+                newQueryForm.pageSize = pageSize
+                setData({ ...newQueryForm })
+            }}
+            config={columns12()}
+            configName={'腾讯广告每日监控'}
+        />
+    </Drawer>
+}
+
+export default React.memo(DayAd)

+ 7 - 0
src/pages/gameDataStatistics/adlist/tencentMonitor/index.less

@@ -0,0 +1,7 @@
+.adDataBackColorClass {
+    background-color: #fff2e8;
+}
+
+.payDataBackColorClass {
+    background-color: #f9f0ff;
+}

+ 115 - 0
src/pages/gameDataStatistics/adlist/tencentMonitor/index.tsx

@@ -0,0 +1,115 @@
+import React, { useEffect, useState } from "react"
+import DayAd from "./dayAd"
+import columns12 from "./tableConfig"
+import { getPresets } from "@/components/QueryForm/const"
+import TableData from "../../components/TableData"
+import QueryForm from "@/components/QueryForm"
+import { PromotionDataDay, getPromotionDataTencentListApi, getPromotionDataTencentTotalApi } from "@/services/gameData/adlist"
+import { useAjax } from "@/Hook/useAjax"
+import moment from "moment"
+
+
+
+const TencentMonitor: React.FC = () => {
+
+    /***************************************/
+    const [queryForm, setQueryForm] = useState<PromotionDataDay>({ pageNum: 1, pageSize: 100, sourceSystem: 'ZX_ONE', costBeginDate: moment().format('YYYY-MM-DD'), costEndDate: moment().format('YYYY-MM-DD') })
+    const [totalData, setTotalData] = useState<any[]>([])
+    const [visible, setVisible] = useState<boolean>(false)
+    const [promotionId, setPromotionId] = useState<number>()
+    const [adName, setAdName] = useState<string>('')
+
+    const getPromotionDataTencentList = useAjax((params) => getPromotionDataTencentListApi(params))
+    const getPromotionDataTencentTotal = useAjax((params) => getPromotionDataTencentTotalApi(params))
+    /***************************************/
+
+    useEffect(() => {
+        getPromotionDataTencentList.run(queryForm)
+        getPromotionDataTencentTotal.run(queryForm).then(res => {
+            res.id = 1
+            res.accountName = '总计'
+            setTotalData([res])
+        })
+    }, [queryForm])
+
+    const dayHandle = (data: any) => {
+        setVisible(true)
+        setAdName(data.promotionName)
+        setPromotionId(data.promotionId)
+    }
+
+    return <div>
+        <TableData
+            leftChild={<QueryForm
+                initialValues={{ sourceSystem: 'ZX_ONE', consumeDay: [moment(), moment()] }}
+                onChange={(data: any) => {
+                    const { type, gameClassify, costBeginDay, costEndDay, sysUserName, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    newQueryForm.pitcherName = sysUserName
+                    newQueryForm.accountType = type
+                    newQueryForm.classify = gameClassify
+                    if (costBeginDay && costEndDay) {
+                        newQueryForm.costBeginDate = costBeginDay
+                        newQueryForm.costEndDate = costEndDay
+                    } else {
+                        delete newQueryForm.costBeginDate
+                        delete newQueryForm.costEndDate
+                    }
+
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+                isSource
+                isAccountId
+                isAccount
+                isType
+                isAgentId
+                isBGGameClassify
+                isConsumeDay={{ ranges: getPresets() }}
+                isCpName
+                isGameId
+                isSysUserId
+                isProjectId
+                isProjectName
+                isPromotionId
+                isPromotionName
+                isAdStatus
+            />}
+            isZj
+            totalData={totalData}
+            scroll={{ x: 1000, y: 600 }}
+            ajax={getPromotionDataTencentList}
+            fixed={{ left: 3, right: 1 }}
+            dataSource={getPromotionDataTencentList?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryForm.pageNum.toString() + index.toString()) }))}
+            total={getPromotionDataTencentList?.data?.total}
+            page={queryForm.pageNum}
+            pageSize={queryForm.pageSize}
+            sortData={{
+                field: queryForm?.sortFiled,
+                order: queryForm?.sortType === 'asc' ? 'ascend' : 'descend'
+            }}
+            title='腾讯广告监控'
+            onChange={(props: any) => {
+                let { pagination, sortData } = props
+                let { current, pageSize } = pagination
+                let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                if (sortData && sortData?.order) {
+                    newQueryForm['sortType'] = sortData?.order === 'ascend' ? 'asc' : 'desc'
+                    newQueryForm['sortFiled'] = sortData?.field
+                } else {
+                    delete newQueryForm['sortType']
+                    delete newQueryForm['sortFiled']
+                }
+                newQueryForm.pageNum = current
+                newQueryForm.pageSize = pageSize
+                setQueryForm({ ...newQueryForm })
+            }}
+            config={columns12(dayHandle)}
+            configName={'腾讯广告监控'}
+        />
+
+        {visible && <DayAd adName={adName} visible={visible} onClose={() => { setVisible(false); setPromotionId(undefined) }} queryForm={queryForm} promotionId={promotionId} />}
+    </div>
+}
+
+export default TencentMonitor

+ 546 - 0
src/pages/gameDataStatistics/adlist/tencentMonitor/tableConfig.tsx

@@ -0,0 +1,546 @@
+import { TYPE, gameClassifyEnum } from "@/components/QueryForm/const"
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Space, Statistic } from "antd"
+import React from "react"
+import { ADSTATUSEnum, LANDINGTYPEEnum, PRICINGEnum } from './const'
+import './index.less'
+
+function columns12(dayHandle: (data: any) => void): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+    const data = [{ lable: '次日', value: 2 }, { lable: 'D3', value: 3 }, { lable: 'D7', value: 7 }, { lable: 'D15', value: 15 }]
+    let date = data.map(item => {
+        let field = `d${item.value}Trend`
+        return {
+            title: item.lable,
+            dataIndex: `D${item.value}`,
+            label: '付费数据',
+            align: 'center',
+            width: 85,
+            className: 'payDataBackColorClass',
+            children: [
+                {
+                    title: 'ROI',
+                    dataIndex: 'roi',
+                    key: 'roi',
+                    width: 60,
+                    align: 'center',
+                    render: (_: any, b: any) => {
+                        let data: any = {}
+                        if (b?.[field]) {
+                            data = b?.[field]
+                            return <Statistic value={data?.roi ? data?.roi * 100 : 0} precision={2} valueStyle={data?.roi >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                        }
+                        return '--'
+                    }
+                },
+                {
+                    title: '付费',
+                    dataIndex: 'rechargeMoney',
+                    key: 'rechargeMoney',
+                    width: 60,
+                    align: 'center',
+                    render: (_: any, b: any) => {
+                        let data: any = {}
+                        if (b?.[field]) {
+                            data = b?.[field]
+                            return <Statistic value={data?.rechargeMoney || 0} />
+                        }
+                        return '--'
+                    }
+                },
+                {
+                    title: '倍数',
+                    dataIndex: 'multiples',
+                    key: 'multiples',
+                    width: 40,
+                    align: 'center',
+                    render: (_: any, b: any) => {
+                        let data: any = {}
+                        if (b?.[field]) {
+                            data = b?.[field]
+                            return <span>{data?.multiples || 0}</span>
+                        }
+                        return '--'
+                    }
+                },
+            ]
+        }
+    })
+
+    return [
+        {
+            label: '账户信息',
+            data: [
+                {
+                    title: '推广账号名称', dataIndex: 'accountName', label: '账户信息', align: 'center', width: 100, default: 1,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '推广账号ID', dataIndex: 'accountId', label: '账户信息', align: 'center', width: 120, default: 2,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '备注', dataIndex: 'notes', label: '账户信息', align: 'center', width: 120,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '账户信息', align: 'center', width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放渠道', dataIndex: 'agentName', label: '账户信息', align: 'center', width: 75, default: 3,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '账户信息', align: 'center', width: 95,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放媒体', dataIndex: 'accountType', label: '账户信息', align: 'center', width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={TYPE[a]} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '账户信息', align: 'center', width: 70, sorter: true,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                }
+            ]
+        },
+        {
+            label: '推广内容',
+            data: [
+                {
+                    title: '推广游戏名称', dataIndex: 'gameName', label: '推广内容', align: 'center', width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '推广游戏应用类型', dataIndex: 'classify', label: '推广内容', align: 'center', width: 95,
+                    render: (a: string) => (<span>{gameClassifyEnum[a]}</span>)
+                }
+            ]
+        },
+        {
+            label: '广告信息',
+            data: [
+                {
+                    title: '推广广告名称', dataIndex: 'promotionName', label: '广告信息', align: 'center', width: 130, default: 4,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'promotionId', label: '广告信息', align: 'center', width: 90, default: 5,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '项目名称', dataIndex: 'projectName', label: '广告信息', align: 'center', width: 130,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '项目ID', dataIndex: 'projectId', label: '广告信息', align: 'center', width: 90,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告状态', dataIndex: 'status', label: '广告信息', align: 'left', width: 120, default: 6,
+                    render: (a: string, b: any) => (<WidthEllipsis value={ADSTATUSEnum[a]} />)
+                },
+                {
+                    title: '推广目标', dataIndex: 'landingType', label: '广告信息', align: 'center', width: 80,
+                    render: (a: string, b: any) => (<WidthEllipsis value={LANDINGTYPEEnum[a]} />)
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '广告信息', align: 'center', width: 100, default: 7,
+                    render: (a: string, b: any) => (<WidthEllipsis value={PRICINGEnum[a]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '广告信息', align: 'center', width: 70, default: 8,
+                    render: (a: any) => <Statistic value={a || '--'} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '广告信息', align: 'center', width: 65,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '日预算', dataIndex: 'budget', label: '广告信息', align: 'center', width: 70, default: 9, sorter: true,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放时间', dataIndex: 'scheduleTime', label: '广告信息', align: 'center', width: 135, default: 10,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                }
+            ]
+        },
+        {
+            label: '消耗',
+            data: [
+                {
+                    title: '今日消耗', dataIndex: 'todayCost', label: '消耗', align: 'center', width: 85, sorter: true, default: 11,
+                    render: (a: any) => <Statistic valueStyle={{ fontWeight: 'bold', fontSize: 14 }} value={a || 0} />
+                },
+                {
+                    title: '总消耗', dataIndex: 'promotionTotalCost', label: '消耗', align: 'center', width: 100, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '广告媒体端数据',
+            data: [
+                {
+                    title: '曝光量', dataIndex: 'showCount', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, default: 12, className: "adDataBackColorClass",
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告媒体端数据', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass", default: 14,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, className: "adDataBackColorClass", default: 13,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'avgClickCost', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, className: "adDataBackColorClass", default: 15,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, className: "adDataBackColorClass", default: 16,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '转化目标', dataIndex: 'convertTarget', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '转化目标量', dataIndex: 'convertCount', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 60, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 85, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} valueStyle={a > 700 ? { color: 'red', fontWeight: 'bold' } : {}} />
+                },
+                {
+                    title: '目标转化率', dataIndex: 'convertRate', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 60, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册人数(广告)', dataIndex: 'active', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 17,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(广告)', dataIndex: 'activeCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 18,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日转化数(广告)', dataIndex: 'firstConvertCount', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 19,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日转化成本(广告)', dataIndex: 'firstConvertCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 20,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首次付费率(广告)', dataIndex: 'firstActivePayRate', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 21,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日付费金额(广告)', dataIndex: 'firstAttributionGameInAppLtv1day', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 22,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费ROI(广告)', dataIndex: 'firstAttributionGameInAppRoi1day', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 85, sorter: true, default: 23,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '付费次数(广告)', dataIndex: 'gamePayCount', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 24,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '付费次数成本(广告)', dataIndex: 'gamePayCountCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 80, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '用户数据',
+            data: [
+                {
+                    title: '注册人数',
+                    tips: '新增用户数(首次注册用户)',
+                    dataIndex: 'regNum',
+                    label: '用户数据',
+                    align: 'center',
+                    width: 70,
+                    sorter: true,
+                    default: 29,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总注册人数', dataIndex: 'regTotalNum', label: '用户数据', align: 'center', width: 70, tips: '广告的总注册人数', sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日创角人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 60, sorter: true, default: 31,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户累计创角人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总创角人数', dataIndex: 'roleTotalNum', label: '用户数据', align: 'center', width: 60, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本', dataIndex: 'regCost', label: '用户数据', align: 'center', width: 70, sorter: true, default: 30,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总注册成本', dataIndex: 'regTotalCost', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日创角成本', dataIndex: 'firstRoleCost', label: '用户数据', align: 'center', width: 60, sorter: true, default: 32,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户创角成本', dataIndex: 'newUserTotalRoleCost', label: '用户数据', align: 'center', width: 65, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总创角成本', dataIndex: 'roleTotalCost', label: '用户数据', align: 'center', width: 60, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日创角率', dataIndex: 'firstRoleRate', label: '用户数据', align: 'center', width: 70, sorter: true, default: 33,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '新用户创角率', dataIndex: 'newUserTotalRoleRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '总创角率', dataIndex: 'roleTotalRate', label: '用户数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '付费数据',
+            data: [
+                {
+                    title: '首日充值次数', tips: "新增付费次数(首次注册并充值的总次数)", dataIndex: 'firstNewUserAmountCount', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass', default: 25,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日充值人数', tips: '新增付费人数(首次注册并充值人数)', dataIndex: 'firstNewUserAmountNum', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass', default: 26,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日充值金额', tips: '新增付费金额(首次注册并充值金额)', dataIndex: 'firstNewUserAmount', label: '付费数据', align: 'center', width: 90, sorter: true, className: 'payDataBackColorClass', default: 27,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费次数', dataIndex: 'newUserTotalAmountCount', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费人数', dataIndex: 'newUserTotalAmountNum', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费金额', dataIndex: 'newUserTotalAmount', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户24小时充值金额', dataIndex: 'twentyFourHoursAmount', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值次数', dataIndex: 'totalAmountCount', label: '付费数据', align: 'center', width: 50, className: 'payDataBackColorClass', sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值人数', dataIndex: 'totalAmountNum', label: '付费数据', align: 'center', width: 50, className: 'payDataBackColorClass', sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值金额', dataIndex: 'totalAmount', label: '付费数据', align: 'center', width: 70, className: 'payDataBackColorClass', sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 65, sorter: true, default: 34, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '24小时ROI', dataIndex: 'twentyFourHoursRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 35, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '总ROI', dataIndex: 'totalRoi', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告总ROI', dataIndex: 'promotionTotalRoi', label: '付费数据', align: 'center', width: 70, className: 'payDataBackColorClass', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日充值成本', tips: '新增付费成本(首次注册并充值的用户成本)', dataIndex: 'firstNewUserRechargeCost', label: '付费数据', align: 'center', width: 80, sorter: true, default: 28, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费成本', dataIndex: 'newUserTotalRechargeCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总付费成本', tips: '总付费成本(广告总付费用户成本)', dataIndex: 'totalRechargeCost', label: '付费数据', align: 'center', width: 70, className: 'payDataBackColorClass', sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费用户ARPPU', tips: '首日充值金额/首日充值人数', dataIndex: 'firstNewUserArppu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 37, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费ARPPU', dataIndex: 'newUserTotalAmountArppu', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费100+用户数', tips: '首次注册并在注册当天单笔充值金额大于100的用户人数', dataIndex: 'firstNewUserHundredUserNum', label: '付费数据', align: 'center', width: 90, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费100+用户付费成本', tips: '今日消耗/首日付费100+用户数', dataIndex: 'firstNewUserHundredUserCost', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费100+用户付费成本', dataIndex: 'newUserTotalHundredUserCost', label: '付费数据', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首充50~100元用户数', dataIndex: 'firstRechargeFiftyHundredNum', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首充50~100元占比', dataIndex: 'firstRechargeFiftyHundredRate', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日付费200+人数', tips: '首次注册并在注册当天单笔充值金额大于200的用户人数', dataIndex: 'firstNewUserTwoHundredUserNum', label: '付费数据', align: 'center', width: 90, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费200+用户付费成本', tips: '今日消耗/首日付费200+用户数', dataIndex: 'firstNewUserTwoHundredUserCost', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费100+用户数', dataIndex: 'newUserTotalHundredUserNum', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费次数', dataIndex: 'firstIosAmountCount', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费人数', dataIndex: 'firstIosAmountNum', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费金额', dataIndex: 'firstIosAmount', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费人数占比', dataIndex: 'firstIosAmountNumRate', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日IOS付费金额占比', dataIndex: 'firstIosAmountRate', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日IOS付费ROI', dataIndex: 'firstIosAmountRoi', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日Android付费次数', dataIndex: 'firstAndroidAmountCount', label: '付费数据', align: 'center', width: 78, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日Android付费人数', dataIndex: 'firstAndroidAmountNum', label: '付费数据', align: 'center', width: 78, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日Android付费金额', dataIndex: 'firstAndroidAmount', label: '付费数据', align: 'center', width: 78, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日Android付费人数占比', dataIndex: 'firstAndroidAmountNumRate', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日Android付费金额占比', dataIndex: 'firstAndroidAmountRate', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日Android付费ROI', dataIndex: 'firstAndroidAmountRoi', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日付费率', dataIndex: 'firstAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 36, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日客单价', tips: '首日客单价(数新增客单价)=首日新用户充值金额/首日新用户充值次', dataIndex: 'firstNewUserAvgPrice', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今客单价', dataIndex: 'newUserTotalAvgPrice', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'ltv1', dataIndex: 'ltvDay1', label: '付费数据', align: 'center', width: 60, sorter: true, default: 38, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '每日扣单数', dataIndex: 'subOrderNum', label: '付费数据', align: 'center', width: 60, sorter: true, default: 39, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '每日扣单金额', dataIndex: 'subOrderAmount', label: '付费数据', align: 'center', width: 60, sorter: true, default: 40, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值次数成本', dataIndex: 'totalAmountCountCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新增付费次数成本', dataIndex: 'firstNewUserAmountCountCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费次数成本', dataIndex: 'newUserTotalAmountCountCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                ...date
+            ]
+        },
+        {
+            label: '操作',
+            data: [
+                {
+                    title: '操作', dataIndex: 'cz', label: '操作', align: 'center', width: 170, default: 41,
+                    render: (_: number, b: any) => {
+                        if (b?.accountName === '总计') return '--'
+                        return <Space>
+                            <a onClick={() => dayHandle(b)}>广告每日监控</a>
+                            {
+                                b?.accountType === 'BYTE' ? <a onClick={() => {
+                                    window.open(`https://ad.oceanengine.com/pages/promotion.html?aadvid=${b?.accountId}#/campaign`)
+                                }}>头条广告</a> : <a onClick={() => {
+                                    window.open(`https://ad.qq.com/atlas/${b?.accountId}/admanage/adgroup?query={%22operation_status%22:[%22CALCULATE_STATUS_EXCLUDE_DEL%22],%22system_status%22:[]}`)
+                                }}>腾讯广告</a> 
+                            }
+                        </Space>
+                    }
+                },
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 534 - 0
src/pages/gameDataStatistics/adlist/tencentMonitor/tableConfigDay.tsx

@@ -0,0 +1,534 @@
+import { TYPE, gameClassifyEnum } from "@/components/QueryForm/const"
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Statistic } from "antd"
+import React from "react"
+import { ADSTATUSEnum, LANDINGTYPEEnum, PRICINGEnum } from './const'
+import './index.less'
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+    const data = [{ lable: '次日', value: 2 }, { lable: 'D3', value: 3 }, { lable: 'D7', value: 7 }, { lable: 'D15', value: 15 }]
+    let date = data.map(item => {
+        let field = `d${item.value}Trend`
+        return {
+            title: item.lable,
+            dataIndex: `D${item.value}`,
+            label: '付费数据',
+            align: 'center',
+            width: 85,
+            className: 'payDataBackColorClass',
+            children: [
+                {
+                    title: 'ROI',
+                    dataIndex: 'roi',
+                    key: 'roi',
+                    width: 60,
+                    align: 'center',
+                    render: (_: any, b: any) => {
+                        let data: any = {}
+                        if (b?.[field]) {
+                            data = b?.[field]
+                            return <Statistic value={data?.roi ? data?.roi * 100 : 0} precision={2} valueStyle={data?.roi >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                        }
+                        return '--'
+                    }
+                },
+                {
+                    title: '付费',
+                    dataIndex: 'rechargeMoney',
+                    key: 'rechargeMoney',
+                    width: 60,
+                    align: 'center',
+                    render: (_: any, b: any) => {
+                        let data: any = {}
+                        if (b?.[field]) {
+                            data = b?.[field]
+                            return <Statistic value={data?.rechargeMoney || 0} />
+                        }
+                        return '--'
+                    }
+                },
+                {
+                    title: '倍数',
+                    dataIndex: 'multiples',
+                    key: 'multiples',
+                    width: 40,
+                    align: 'center',
+                    render: (_: any, b: any) => {
+                        let data: any = {}
+                        if (b?.[field]) {
+                            data = b?.[field]
+                            return <span>{data?.multiples || 0}</span>
+                        }
+                        return '--'
+                    }
+                },
+            ]
+        }
+    })
+
+    return [
+        {
+            label: '时间',
+            data: [
+                {
+                    title: '日期', dataIndex: 'dt', label: '时间', align: 'center', width: 100, default: 1,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                }
+            ]
+        },
+        {
+            label: '账户信息',
+            data: [
+                {
+                    title: '推广账号名称', dataIndex: 'accountName', label: '账户信息', align: 'center', width: 100, default: 2,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '推广账号ID', dataIndex: 'accountId', label: '账户信息', align: 'center', width: 120, default: 3,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '备注', dataIndex: 'notes', label: '账户信息', align: 'center', width: 120,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '账户信息', align: 'center', width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放渠道', dataIndex: 'agentName', label: '账户信息', align: 'center', width: 75, default: 4,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '账户信息', align: 'center', width: 95,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放媒体', dataIndex: 'accountType', label: '账户信息', align: 'center', width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={TYPE[a]} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '账户信息', align: 'center', width: 70, sorter: true,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                }
+            ]
+        },
+        {
+            label: '推广内容',
+            data: [
+                {
+                    title: '推广游戏名称', dataIndex: 'gameName', label: '推广内容', align: 'center', width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '推广游戏应用类型', dataIndex: 'classify', label: '推广内容', align: 'center', width: 95,
+                    render: (a: string) => (<span>{gameClassifyEnum[a]}</span>)
+                }
+            ]
+        },
+        {
+            label: '广告信息',
+            data: [
+                {
+                    title: '推广广告名称', dataIndex: 'promotionName', label: '广告信息', align: 'center', width: 130, default: 5,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'promotionId', label: '广告信息', align: 'center', width: 90, default: 6,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '项目名称', dataIndex: 'projectName', label: '广告信息', align: 'center', width: 130,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '项目ID', dataIndex: 'projectId', label: '广告信息', align: 'center', width: 90,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告状态', dataIndex: 'status', label: '广告信息', align: 'left', width: 120, default: 7,
+                    render: (a: string, b: any) => (<WidthEllipsis value={ADSTATUSEnum[a]} />)
+                },
+                {
+                    title: '推广目标', dataIndex: 'landingType', label: '广告信息', align: 'center', width: 80,
+                    render: (a: string, b: any) => (<WidthEllipsis value={LANDINGTYPEEnum[a]} />)
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '广告信息', align: 'center', width: 100, default: 8,
+                    render: (a: string, b: any) => (<WidthEllipsis value={PRICINGEnum[a]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '广告信息', align: 'center', width: 70, default: 9,
+                    render: (a: any) => <Statistic value={a || '--'} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '广告信息', align: 'center', width: 65, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '日预算', dataIndex: 'budget', label: '广告信息', align: 'center', width: 70, default: 10, sorter: true,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放时间', dataIndex: 'scheduleTime', label: '广告信息', align: 'center', width: 135, default: 11,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                }
+            ]
+        },
+        {
+            label: '消耗',
+            data: [
+                {
+                    title: '今日消耗', dataIndex: 'todayCost', label: '消耗', align: 'center', width: 85, sorter: true, default: 12,
+                    render: (a: any) => <Statistic valueStyle={{ fontWeight: 'bold', fontSize: 14 }} value={a || 0} />
+                },
+                {
+                    title: '总消耗', dataIndex: 'promotionTotalCost', label: '消耗', align: 'center', width: 100, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '广告媒体端数据',
+            data: [
+                {
+                    title: '曝光量', dataIndex: 'showCount', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, default: 13, className: "adDataBackColorClass",
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告媒体端数据', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass", default: 15,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, className: "adDataBackColorClass", default: 14,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'avgClickCost', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, className: "adDataBackColorClass", default: 16,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告媒体端数据', align: 'center', width: 60, sorter: true, className: "adDataBackColorClass", default: 17,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '转化目标', dataIndex: 'convertTarget', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '转化目标量', dataIndex: 'convertCount', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 60, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 85, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} valueStyle={a > 700 ? { color: 'red', fontWeight: 'bold' } : {}} />
+                },
+                {
+                    title: '目标转化率', dataIndex: 'convertRate', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 60, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册人数(广告)', dataIndex: 'active', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 18,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(广告)', dataIndex: 'activeCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 19,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日转化数(广告)', dataIndex: 'firstConvertCount', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 20,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日转化成本(广告)', dataIndex: 'firstConvertCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 21,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首次付费率(广告)', dataIndex: 'firstActivePayRate', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 22,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日付费金额(广告)', dataIndex: 'firstAttributionGameInAppLtv1day', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 23,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费ROI(广告)', dataIndex: 'firstAttributionGameInAppRoi1day', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 85, sorter: true, default: 24,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '付费次数(广告)', dataIndex: 'gamePayCount', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 70, sorter: true, default: 25,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '付费次数成本(广告)', dataIndex: 'gamePayCountCost', label: '广告媒体端数据', align: 'center', className: "adDataBackColorClass", width: 80, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '用户数据',
+            data: [
+                {
+                    title: '注册人数',
+                    tips: '新增用户数(首次注册用户)',
+                    dataIndex: 'regNum',
+                    label: '用户数据',
+                    align: 'center',
+                    width: 70,
+                    sorter: true,
+                    default: 30,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总注册人数', dataIndex: 'regTotalNum', label: '用户数据', align: 'center', width: 70, tips: '广告的总注册人数',sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日创角人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 60, sorter: true, default: 32,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户累计创角人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总创角人数', dataIndex: 'roleTotalNum', label: '用户数据', align: 'center', width: 60,sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本', dataIndex: 'regCost', label: '用户数据', align: 'center', width: 70, sorter: true, default: 31,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总注册成本', dataIndex: 'regTotalCost', label: '用户数据', align: 'center', width: 70,sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日创角成本', dataIndex: 'firstRoleCost', label: '用户数据', align: 'center', width: 60, sorter: true, default: 33,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户创角成本', dataIndex: 'newUserTotalRoleCost', label: '用户数据', align: 'center', width: 65, sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总创角成本', dataIndex: 'roleTotalCost', label: '用户数据', align: 'center', width: 60,sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日创角率', dataIndex: 'firstRoleRate', label: '用户数据', align: 'center', width: 70, sorter: true, default: 34,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '新用户创角率', dataIndex: 'newUserTotalRoleRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '总创角率', dataIndex: 'roleTotalRate', label: '用户数据', align: 'center', width: 80,sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '付费数据',
+            data: [
+                {
+                    title: '首日充值次数', tips: "新增付费次数(首次注册并充值的总次数)", dataIndex: 'firstNewUserAmountCount', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass', default: 26,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日充值人数', tips: '新增付费人数(首次注册并充值人数)', dataIndex: 'firstNewUserAmountNum', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass', default: 27,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日充值金额', tips: '新增付费金额(首次注册并充值金额)', dataIndex: 'firstNewUserAmount', label: '付费数据', align: 'center', width: 90, sorter: true, className: 'payDataBackColorClass', default: 28,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费次数', dataIndex: 'newUserTotalAmountCount', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费人数', dataIndex: 'newUserTotalAmountNum', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费金额', dataIndex: 'newUserTotalAmount', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户24小时充值金额', dataIndex: 'twentyFourHoursAmount', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值次数', dataIndex: 'totalAmountCount', label: '付费数据', align: 'center', width: 50, className: 'payDataBackColorClass',sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值人数', dataIndex: 'totalAmountNum', label: '付费数据', align: 'center', width: 50, className: 'payDataBackColorClass',sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值金额', dataIndex: 'totalAmount', label: '付费数据', align: 'center', width: 70, className: 'payDataBackColorClass',sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 65, sorter: true, default: 35, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '24小时ROI', dataIndex: 'twentyFourHoursRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 36, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '总ROI', dataIndex: 'totalRoi', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告总ROI', dataIndex: 'promotionTotalRoi', label: '付费数据', align: 'center', width: 70, className: 'payDataBackColorClass',sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日充值成本', tips: '新增付费成本(首次注册并充值的用户成本)', dataIndex: 'firstNewUserRechargeCost', label: '付费数据', align: 'center', width: 80, sorter: true, default: 29, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费成本', dataIndex: 'newUserTotalRechargeCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总付费成本', tips: '总付费成本(广告总付费用户成本)', dataIndex: 'totalRechargeCost', label: '付费数据', align: 'center', width: 70, className: 'payDataBackColorClass',sorter: true,
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费用户ARPPU', tips: '首日充值金额/首日充值人数', dataIndex: 'firstNewUserArppu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 38, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费ARPPU', dataIndex: 'newUserTotalAmountArppu', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费100+用户数', tips: '首次注册并在注册当天单笔充值金额大于100的用户人数', dataIndex: 'firstNewUserHundredUserNum', label: '付费数据', align: 'center', width: 90, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费100+用户付费成本', tips: '今日消耗/首日付费100+用户数', dataIndex: 'firstNewUserHundredUserCost', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费100+用户付费成本', dataIndex: 'newUserTotalHundredUserCost', label: '付费数据', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首充50~100元用户数', dataIndex: 'firstRechargeFiftyHundredNum', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首充50~100元占比', dataIndex: 'firstRechargeFiftyHundredRate', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日付费200+人数', tips: '首次注册并在注册当天单笔充值金额大于200的用户人数', dataIndex: 'firstNewUserTwoHundredUserNum', label: '付费数据', align: 'center', width: 90, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日付费200+用户付费成本', tips: '今日消耗/首日付费200+用户数', dataIndex: 'firstNewUserTwoHundredUserCost', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费100+用户数', dataIndex: 'newUserTotalHundredUserNum', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费次数', dataIndex: 'firstIosAmountCount', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费人数', dataIndex: 'firstIosAmountNum', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费金额', dataIndex: 'firstIosAmount', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日IOS付费人数占比', dataIndex: 'firstIosAmountNumRate', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日IOS付费金额占比', dataIndex: 'firstIosAmountRate', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日IOS付费ROI', dataIndex: 'firstIosAmountRoi', label: '付费数据', align: 'center', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日Android付费次数', dataIndex: 'firstAndroidAmountCount', label: '付费数据', align: 'center', width: 78, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日Android付费人数', dataIndex: 'firstAndroidAmountNum', label: '付费数据', align: 'center', width: 78, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日Android付费金额', dataIndex: 'firstAndroidAmount', label: '付费数据', align: 'center', width: 78, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日Android付费人数占比', dataIndex: 'firstAndroidAmountNumRate', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日Android付费金额占比', dataIndex: 'firstAndroidAmountRate', label: '付费数据', align: 'center', width: 95, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日Android付费ROI', dataIndex: 'firstAndroidAmountRoi', label: '付费数据', align: 'center', width: 80, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日付费率', dataIndex: 'firstAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 37, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日客单价', tips: '首日客单价(数新增客单价)=首日新用户充值金额/首日新用户充值次', dataIndex: 'firstNewUserAvgPrice', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今客单价', dataIndex: 'newUserTotalAvgPrice', label: '付费数据', align: 'center', width: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'ltv1', dataIndex: 'ltvDay1', label: '付费数据', align: 'center', width: 60, sorter: true, default: 39, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '每日扣单数', dataIndex: 'subOrderNum', label: '付费数据', align: 'center', width: 60, sorter: true, default: 40, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '每日扣单金额', dataIndex: 'subOrderAmount', label: '付费数据', align: 'center', width: 60, sorter: true, default: 41, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总充值次数成本', dataIndex: 'totalAmountCountCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新增付费次数成本', dataIndex: 'firstNewUserAmountCountCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '至今付费次数成本', dataIndex: 'newUserTotalAmountCountCost', label: '付费数据', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: any) => <Statistic value={a || 0} />
+                },
+                ...date
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 41 - 3
src/services/gameData/adlist.ts

@@ -26,7 +26,7 @@ export interface PromotionDataDay extends Paging, SortProps {
     status?: string     //广告状态
 }
 /**
- * 广告监控数据
+ * 头条广告监控数据
  * @param data 
  * @returns 
  */
@@ -38,7 +38,7 @@ export async function getPromotionDataDatListApi(data: PromotionDataDay) {
 }
 
 /**
- * 广告监控数据总计
+ * 头条广告监控数据总计
  * @param data 
  * @returns 
  */
@@ -50,7 +50,7 @@ export async function getPromotionDataDatTotalApi(data: PromotionDataDay) {
 }
 
 /**
- * 广告每日监控
+ * 头条广告每日监控
  * @param data 
  * @returns 
  */
@@ -59,4 +59,42 @@ export async function getPromotionDataDayListApi(data: PromotionDataDay) {
         method: 'POST',
         data
     });
+}
+
+
+/**
+ * 腾讯广告监控数据
+ * @param data 
+ * @returns 
+ */
+export async function getPromotionDataTencentListApi(data: PromotionDataDay) {
+    return request(wapi + `/promotionData/tencent/day`, {
+        method: 'POST',
+        data
+    });
+}
+
+
+/**
+ * 腾讯广告监控数据总计
+ * @param data 
+ * @returns 
+ */
+export async function getPromotionDataTencentTotalApi(data: PromotionDataDay) {
+    return request(wapi + `/promotionData/tencent/total`, {
+        method: 'POST',
+        data
+    });
+}
+
+/**
+ * 腾讯广告每日监控
+ * @param data 
+ * @returns 
+ */
+export async function getPromotionDataTencentDayListApi(data: PromotionDataDay) {
+    return request(wapi + `/promotionData/tencent/day/list`, {
+        method: 'POST',
+        data
+    });
 }