shenwu 3 days ago
parent
commit
b4baa62ebe

+ 5 - 0
config/routerConfig.ts

@@ -222,6 +222,11 @@ const iaaNovelData = [
                 name: '广告列表',
                 component: './iaaData/novel/tencent/adList',
             },
+            {
+                path: '/iaaData/novel/tencent/adListTotal',
+                name: '广告列表总数据',
+                component: './iaaData/novel/tencent/adListTotal',
+            },
             {
                 path: '/iaaData/novel/tencent/dynamic',
                 name: '创意列表',

+ 197 - 0
src/pages/iaaData/novel/tencent/adListTotal/autoAcquisitionSet.tsx

@@ -0,0 +1,197 @@
+import { InputNumber, message, Modal, Radio, Space, Switch, Table, Tooltip } from "antd"
+import React, { useEffect, useState } from "react"
+import '@/pages/iaaData/components/UpdateAd3/global.less'
+import style from './index.less'
+import { InfoCircleFilled, QuestionCircleOutlined } from "@ant-design/icons"
+import { useAjax } from "@/Hook/useAjax"
+import { updateBatchAdgroupInfoApi } from "@/services/gameData"
+
+interface Props {
+    selectAdList: any[]
+    visible?: boolean
+    onClose?: () => void
+    onChange?: () => void
+}
+
+/**
+ * 批量一键起量
+ * @param param0 
+ * @returns 
+ */
+const AutoAcquisitionSet: React.FC<Props> = ({ selectAdList, visible, onChange, onClose }) => {
+
+    /****************************************/
+    const [autoAcquisitionData, setAutoAcquisitionData] = useState<{ autoAcquisitionEnabled: boolean, autoAcquisitionBudget?: number, autoAcquisitionBudgetPercent?: number }>({ autoAcquisitionEnabled: false })
+    const [isPercent, setIsPercent] = useState<boolean>(false)
+    const [addType, setAddType] = useState<'fixed' | 'percent'>('fixed')
+    const updateBatchAdgroupInfo = useAjax((params) => updateBatchAdgroupInfoApi(params)) // 名称
+    const [failIdList, setFailIdList] = useState<{ adgroupId: number, code: number, message: string, messageCn: string }[]>([])
+    const [failVisible, setFailVisible] = useState<boolean>(false)
+    /****************************************/
+
+    useEffect(() => {
+        if (selectAdList.every(item => item.autoAcquisitionEnabled)) {
+            setIsPercent(true)
+        } else {
+            setIsPercent(false)
+        }
+    }, [selectAdList])
+
+    const handleOk = () => {
+        let params = { ...autoAcquisitionData }
+        if (params?.autoAcquisitionEnabled) {
+            if (addType === 'fixed' && !params?.autoAcquisitionBudget) {
+                message.error('请填写起量预算')
+                return
+            }
+            if (addType === 'percent' && !params?.autoAcquisitionBudgetPercent) {
+                message.error('请填写起量预算百分比')
+                return
+            }
+        }
+
+        if (params?.autoAcquisitionBudgetPercent !== null && params?.autoAcquisitionBudgetPercent !== undefined) params.autoAcquisitionBudgetPercent = params?.autoAcquisitionBudgetPercent / 100
+        let accountAdgroupMaps = [...new Set(selectAdList?.map(item => item.accountId + ',' + item.adgroupId))]
+        updateBatchAdgroupInfo.run({ accountAdgroupMaps, ...params }).then(res => {
+            if (res?.data?.failIdList?.length === 0) {
+                message.success(`修改操作完成!`)
+                onChange?.()
+            } else {
+                setFailIdList(res?.data?.list || [])
+                setFailVisible(true)
+            }
+        })
+        console.log(params)
+    }
+
+    return <Modal
+        title={<strong>批量修改一键起量</strong>}
+        open={visible}
+        onCancel={onClose}
+        onOk={handleOk}
+        className='modalResetCss'
+        width={750}
+        confirmLoading={updateBatchAdgroupInfo.loading}
+    >
+        <div className={style.autoAcquisitionSet}>
+            <div className={style.left}>
+                <Table
+                    dataSource={selectAdList}
+                    size="small"
+                    scroll={{ x: 400, y: 450 }}
+                    bordered
+                    rowKey={'adgroupId'}
+                    pagination={false}
+                    columns={[
+                        {
+                            title: '广告名称',
+                            dataIndex: 'adgroupName',
+                            key: 'adgroupName',
+                            width: 200,
+                            render(value) {
+                                return <span style={{ wordBreak: 'break-all' }}>{value}</span>
+                            },
+                        },
+                        {
+                            title: '原设置',
+                            dataIndex: 'beforeSet',
+                            key: 'beforeSet',
+                            width: 120,
+                            render(value, record) {
+                                if (!record?.autoAcquisitionEnabled) {
+                                    return '未开启'
+                                }
+                                return `一键起量中,起量预算:${record?.autoAcquisitionBudget} 元`
+                            },
+                        }
+                    ]}
+                />
+            </div>
+            <div className={style.right}>
+                <div className={style.header}>
+                    <Space>
+                        <span>修改一键起量</span>
+                        <Tooltip title={<div>
+                            <p>1. 一键起量期间产生的消耗不赔付,但转化计入赔付门槛判断;</p>
+                            <p>2. 一键起量可能导致转化成本高于预期,且起量结束后不一定能持续消耗。</p>
+                        </div>}>
+                            <QuestionCircleOutlined />
+                        </Tooltip>
+                    </Space>
+                </div>
+                <div className={style.edit}>
+                    <div>
+                        <div className={style.tips}>
+                            <InfoCircleFilled style={{ color: '#296BEF', marginTop: 2 }} />
+                            {
+                                autoAcquisitionData?.autoAcquisitionEnabled ?
+                                    // '对于状态为“一键起量中”、“一键起量完成”、“一键起量中止”的广告,将会自动关闭一键起量,同时按照新的起量预算重新开启一键起量'
+                                    '开启一键起量'
+                                    :
+                                    '当前开关为关闭状态,点击「确定」将默认关闭已选广告的一键起量功能'
+                            }
+                        </div>
+                        <div>
+                            <Switch
+                                checkedChildren="开启"
+                                unCheckedChildren="未开启"
+                                onChange={(e) => {
+                                    setAutoAcquisitionData({ ...autoAcquisitionData, autoAcquisitionEnabled: e })
+                                }}
+                                checked={autoAcquisitionData?.autoAcquisitionEnabled}
+                            />
+                        </div>
+                        {autoAcquisitionData?.autoAcquisitionEnabled && <>
+                            <Radio.Group buttonStyle="solid" value={addType} onChange={(e) => setAddType(e.target.value)}>
+                                <Radio.Button value="fixed">固定值</Radio.Button>
+                                <Radio.Button value="percent" disabled={!isPercent}>百分比上下浮动修改</Radio.Button>
+                            </Radio.Group>
+                            {addType === 'fixed' ?
+                                <InputNumber placeholder="起量预算,建议设置为出价的10倍" min={200} max={100000} style={{ width: '100%' }} value={autoAcquisitionData?.autoAcquisitionBudget} onChange={(e) => setAutoAcquisitionData({ autoAcquisitionEnabled: true, autoAcquisitionBudget: e || 0 })} />
+                                :
+                                <InputNumber placeholder="起量预算,原有基础上下调百分比" style={{ width: '100%' }} addonAfter="%" value={autoAcquisitionData?.autoAcquisitionBudgetPercent} onChange={(e) => setAutoAcquisitionData({ autoAcquisitionEnabled: true, autoAcquisitionBudgetPercent: e || 0 })} />
+                            }
+                        </>}
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        {failVisible && <Modal
+            title={<strong>报错信息</strong>}
+            open={failVisible}
+            className='modalResetCss'
+            width={650}
+            onCancel={() => { setFailVisible(false); setFailIdList([]) }}
+            footer={null}
+        >
+            <Table
+                size="small"
+                bordered
+                rowKey={'adgroupId'}
+                columns={[{
+                    title: '广告ID',
+                    dataIndex: 'adgroupId',
+                    key: 'adgroupId',
+                    width: 110,
+                    render: (value) => <span style={{ fontSize: 12 }}>{value}</span>,
+                }, {
+                    title: 'code',
+                    dataIndex: 'code',
+                    key: 'code',
+                    width: 70,
+                    align: 'center',
+                    render: (value) => <span style={{ fontSize: 12 }}>{value}</span>,
+                }, {
+                    title: '错误信息',
+                    dataIndex: 'messageCn',
+                    key: 'messageCn',
+                    render: (value) => <span style={{ fontSize: 12 }}>{value}</span>,
+                }]}
+                dataSource={failIdList}
+            />
+        </Modal>}
+    </Modal>
+}
+
+export default React.memo(AutoAcquisitionSet)

+ 61 - 0
src/pages/iaaData/novel/tencent/adListTotal/const.tsx

@@ -0,0 +1,61 @@
+import { Badge } from "antd";
+import React from "react";
+
+/** 广告状态 */
+export const ADSTATUSEnum = {
+    'STATUS_PENDING': <Badge status="success" text={<span style={{ fontSize: 12 }}>审核中</span>} />,
+    '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': '准备中',
+    'STATUS_ACTIVE_ACCOUNT_LIMIT': <Badge status="warning" text={<span style={{ fontSize: 12 }}>账户达日限额</span>} />,
+    'STATUS_ACTIVE_ACCOUNT_EMPTY': <Badge status="warning" text={<span style={{ fontSize: 12 }}>账户余额不足</span>} />,
+    'STATUS_ACTIVE_ACCOUNT_FROZEN': <Badge status="warning" text={<span style={{ fontSize: 12 }}>账户余额不足</span>} />,
+    'STATUS_ACTIVE_AD_LIMIT': <Badge status="error" text={<span style={{ fontSize: 12 }}>广告达日限额(预算不足)</span>} />,
+}
+
+/** 出价方式 */
+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' = '快应用',
+}
+
+/** 一键起量 */
+export enum AUTO_ACQUISTION_STATUS {
+    AUTO_ACQUISTION_STATUS_UNKNOW="未开启一键起量功能",
+    AUTO_ACQUISTION_STATUS_PENDING="开启一键起量,探索中",
+    AUTO_ACQUISTION_STATUS_END_LESS_THAN_24H="起量完成(探索结束,预算花完,功能开启后未满 24h)",
+    AUTO_ACQUISTION_STATUS_END_MORE_THAN_24H="起量完成(探索结束,预算花完,功能开启后已满 24h)",
+    AUTO_ACQUISTION_STATUS_COMPLETED="起量结束(探索结束,距离广告开启已满 6h,但预算未花完(实际花费<起量预算*90%))",
+    AUTO_ACQUISTION_STATUS_SUSPEND_ON_LEARNING_FAIL="起量中止(探索过程中,因广告起量情况太差,从而探索中止)",
+    AUTO_ACQUISTION_STATUS_SUSPEND_ON_PLAYING_FAIL="起量中止(探索过程中,因广告无法播放,从而起量中止(包括广告主动或被动下线或 timeset 不连续))",
+    AUTO_ACQUISTION_STATUS_ADVERTISER_CLOSED="广告主主动关闭一键起量功能"
+}

+ 95 - 0
src/pages/iaaData/novel/tencent/adListTotal/dayAd.tsx

@@ -0,0 +1,95 @@
+import { useAjax } from "@/Hook/useAjax"
+import { Button, Drawer } from "antd"
+import React, { useEffect, useState } from "react"
+import columns12 from './tableConfigDay'
+import QueryForm from "@/components/QueryForm"
+import { CloseOutlined } from "@ant-design/icons"
+import TablePro from "@/components/TablePro"
+import moment from "moment"
+import { getNovelGDTDetailListApi } from "@/services/iaaData"
+
+interface Props {
+    queryForm: {
+        costDayBegin?: string,
+        costDayEnd?: string
+    }
+    appId: number[],
+    productType: string,
+    adName: string,
+    promotionId?: number
+    onClose?: () => void
+    visible?: boolean
+    configName?: string
+}
+
+/**
+ * 广告每日监控
+ * @returns 
+ */
+const DayAd: React.FC<Props> = ({ appId, productType, adName, queryForm, promotionId, onClose, visible, configName }) => {
+
+    /***********************************/
+    const [data, setData] = useState<{ pageSize: number, pageNum: number, sortFiled?: string, sortType?: string }>({ pageNum: 1, pageSize: 30 })
+    const [date, setDate] = useState<[string, string] | undefined>((queryForm?.costDayBegin && queryForm.costDayEnd) ? [queryForm.costDayBegin, queryForm.costDayEnd] : undefined)
+    const getGDTDailyList = useAjax((params) => getNovelGDTDetailListApi(params))
+    /***********************************/
+
+    useEffect(() => {
+        let params: any = {}
+        if (promotionId) {
+            params.adgroupId = promotionId
+        }
+        if (date && date?.length > 0) {
+            params.costDayBegin = date[0]
+            params.costDayEnd = date[1]
+        } else {
+            delete params?.costDayBegin
+            delete params?.costDayEnd
+        }
+        getGDTDailyList.run({ ...params, ...data, appId, productType })
+    }, [promotionId, queryForm, data, date, appId, productType])
+
+    return <Drawer title={<div style={{ display: 'flex', justifyContent: 'space-between' }}><span>{`${adName} 腾讯广告每日数据`}</span> <Button type="text" icon={<CloseOutlined />} onClick={() => onClose?.()}></Button> </div>} closable={false} placement="right" width={'90%'} onClose={onClose} open={visible}>
+        <TablePro
+            leftChild={<QueryForm
+                initialValues={{ day1: queryForm?.costDayBegin ? [moment(queryForm?.costDayBegin), moment(queryForm?.costDayEnd)] : null }}
+                onChange={(data: any) => {
+                    const { day1 } = data
+                    if (day1 && day1?.length === 2) {
+                        setDate([moment(day1[0]).format('YYYY-MM-DD'), moment(day1[1]).format('YYYY-MM-DD')])
+                    } else {
+                        setDate(undefined)
+                    }
+                }}
+                day1={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+            />}
+            scroll={{ x: 1000, y: 600 }}
+            ajax={getGDTDailyList}
+            loading={getGDTDailyList.loading}
+            fixed={{ left: 3, right: 0 }}
+            dataSource={getGDTDailyList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(data.pageNum.toString() + index.toString()) }))}
+            page={getGDTDailyList?.data?.data?.current || 1}
+            pageSize={getGDTDailyList?.data?.data?.size || 20}
+            total={getGDTDailyList?.data?.data?.total || 0}
+            title='腾讯广告每日监控'
+            onChange={(pagination: any, _: any, sortData: any) => {
+                let { current, pageSize } = pagination
+                let newQueryForm = JSON.parse(JSON.stringify(data))
+                if (sortData && sortData?.order) {
+                    newQueryForm['sortAsc'] = sortData?.order === 'ascend' ? true : false
+                    newQueryForm['sortFiled'] = sortData?.field
+                } else {
+                    delete newQueryForm['sortAsc']
+                    delete newQueryForm['sortFiled']
+                }
+                newQueryForm.pageNum = current || newQueryForm.pageNum
+                newQueryForm.pageSize = pageSize || newQueryForm.pageSize
+                setData({ ...newQueryForm })
+            }}
+            config={columns12()}
+            configName={configName || '腾讯小说广告总数据每日监控'}
+        />
+    </Drawer>
+}
+
+export default React.memo(DayAd)

+ 48 - 0
src/pages/iaaData/novel/tencent/adListTotal/index.less

@@ -0,0 +1,48 @@
+.autoAcquisitionSet {
+    display: flex;
+
+    .left {
+        width: 60%;
+    }
+
+    .right {
+        width: 40%;
+        border: 1px solid #f0f0f0;
+        display: flex;
+        flex-direction: column;
+
+        .header {
+            padding: 8px;
+            font-size: 14px;
+            font-weight: 600;
+            border-bottom: 1px solid #f0f0f0;
+            background: #fafafa;
+        }
+
+        .edit {
+            flex: 1;
+            display: flex;
+            align-items: center;
+            padding: 8px;
+            box-sizing: border-box;
+            width: 100%;
+
+            >div {
+                display: flex;
+                flex-direction: column;
+                gap: 10px;
+                width: 100%;
+            }
+        }
+
+        .tips {
+            border: 1px solid #D4E1FC;
+            border-radius: 18px;
+            display: flex;
+            gap: 8px;
+            padding: 7px 12px;
+            background-color: #f5f8ff;
+            margin-bottom: 10px;
+        }
+    }
+}

+ 366 - 0
src/pages/iaaData/novel/tencent/adListTotal/index.tsx

@@ -0,0 +1,366 @@
+import React, { useCallback, useEffect, useState } from "react"
+import { useAjax } from "@/Hook/useAjax"
+import { getNovelGDadTotalListApi, getNovelGDTadTotalTotalApi, GetNovelGDTListProps } from "@/services/iaaData"
+import TablePro from "@/components/TablePro"
+import columns12 from "./tableConfig"
+import moment from "moment"
+import { useModel } from "umi"
+import { Button, Dropdown, message, Select, Space, Switch } from "antd"
+import { modifyStatusBatchApi, syncBatchApi } from "@/services/gameData"
+import { DeleteOutlined, DownOutlined, PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons"
+import DayAd from "./dayAd"
+import QueryFormNovel from "@/components/QueryForm/queryFormNovel"
+import UpdateAd3 from "@/pages/iaaData/components/UpdateAd3"
+import AutoAcquisitionSet from "./autoAcquisitionSet"
+import AutoAcquisitionSetTask from "@/pages/iaaData/components/AutoAcquisitionSet/autoAcquisitionSetTask"
+
+/**
+ * 腾讯广告列表
+ * @returns 
+ */
+const TencentNovelAd: React.FC<{ configName?: string, dayConfigName?: string }> = ({ configName, dayConfigName }) => {
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [selectedRows, setSelectedRows] = useState<any[]>([])
+    const [queryForm, setQueryForm] = useState<GetNovelGDTListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        // dataTimeMin: moment().format('YYYY-MM-DD'),
+        // dataTimeMax: 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 [updateData, setUpdateDate] = useState<{ visible: boolean, type: '修改出价' | '修改名称' | '修改日限额' | '修改投放时间' | '删除' | '深度优化ROI' | '修改投放首日开始时间' }>({ visible: false, type: '修改出价' })
+    const [autoAcqVisible, setAutoAcqVisible] = useState<boolean>(false)
+    const [handleType, setHandleType] = useState<number>(1)
+    const [isZj, setIsZj] = useState<boolean>(true)
+
+    const modifyStatusBatch = useAjax((params) => modifyStatusBatchApi(params))
+    const getGDTList = useAjax((params) => getNovelGDadTotalListApi(params))
+    const getGDTTotal = useAjax((params) => getNovelGDTadTotalTotalApi(params))
+    const syncBatch = useAjax((params) => syncBatchApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        getList()
+    }, [queryForm, initialState?.iaaApp, initialState?.productType])
+
+    const getList = () => {
+        if (initialState?.iaaApp?.length && initialState?.productType) {
+            getGDTList.run({ ...queryForm, appId: initialState.iaaApp, productType: initialState.productType })
+            getGDTTotal.run({ ...queryForm, appId: initialState.iaaApp, productType: initialState.productType }).then((res: { data: { id: number; accountId: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.accountId = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, accountId: '总计' }])
+                }
+            })
+        } else {
+            setTotalData([{ id: 1, accountId: '总计' }])
+            getGDTList.mutate({ data: undefined })
+        }
+    }
+
+    const dayHandle = (data: any) => {
+        setVisible(true)
+        setAdName(data.adgroupName)
+        setPromotionId(data.adgroupId)
+    }
+
+    // 批量启停
+    const adStatus = (type: boolean) => {
+        let newSelectedRows = []
+        if (type) {
+            newSelectedRows = selectedRows.filter((item: { configuredStatus: string, adgroupId: number }) => item.configuredStatus === 'AD_STATUS_SUSPEND')
+        } else {
+            newSelectedRows = selectedRows.filter((item: { configuredStatus: string, adgroupId: number }) => item.configuredStatus === 'AD_STATUS_NORMAL')
+        }
+        if (newSelectedRows.length === 0) {
+            message.warn(`所有广告都是${type ? '启动' : '暂停'}状态,无需${type ? '启动' : '暂停'}操作`)
+            return
+        }
+        let accountAdgroupMaps = [...new Set(newSelectedRows?.map(item => item.accountId + ',' + item.adgroupId))]
+        modifyStatusBatch.run({ accountAdgroupMaps, suspend: !type }).then(res => {
+            if (res?.data?.failIdList?.length === 0) {
+                message.success(`${type ? '启动' : '暂停'}成功`)
+                getGDTList.refresh()
+                setSelectedRows([])
+            } else {
+                message.success(`${type ? '启动' : '暂停'}失败,${JSON.stringify(res?.data?.list)}`)
+            }
+        })
+    }
+
+    // 同步 
+    const sync = useCallback(() => {
+        if (selectedRows?.length > 0) {
+            let accountAdgroupMaps = [...new Set(selectedRows?.map(item => item.accountId + ',' + item.adgroupId))]
+            syncBatch.run({ accountAdgroupMaps }).then(res => {
+                res?.data && getGDTList.refresh()
+                res?.data ? message.success('同步成功!') : message.error('同步失败!')
+            })
+        } else {
+            message.error('请勾选需要同步的广告')
+        }
+
+    }, [getGDTList, selectedRows])
+
+    return <div>
+        <TablePro
+            czChild={<Space>
+                <Switch checkedChildren="开启全选" unCheckedChildren="关闭全选" checked={!isZj} onChange={(e) => { setIsZj(!e); }} />
+                <Select
+                    style={{ width: 120 }}
+                    onChange={(e) => {
+                        setHandleType(e)
+                        setSelectedRows([])
+                    }}
+                    value={handleType}
+                    dropdownMatchSelectWidth={false}
+                    options={[{ label: '广告操作', value: 1 }, { label: '修改首日付费 ROI', value: 3 }, { label: '修改首日变现 ROI', value: 4 }]}
+                />
+                <Button type='primary' style={{ background: '#67c23a', borderColor: '#67c23a' }} loading={modifyStatusBatch.loading} icon={<PlayCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus(true)}>启动</Button>
+                <Button type='primary' style={{ background: '#e6a23c', borderColor: '#e6a23c' }} loading={modifyStatusBatch.loading} icon={<PauseCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus(false)}>暂停</Button>
+                <Button type='primary' loading={syncBatch.loading} disabled={selectedRows.length === 0} onClick={sync}>同步</Button>
+                {handleType === 1 ? <>
+                    <Button type='primary' danger icon={<DeleteOutlined />} disabled={selectedRows.length === 0} onClick={() => {
+                        setUpdateDate({ visible: true, type: '删除' })
+                    }}>删除</Button>
+                    <Dropdown
+                        menu={{
+                            items: [
+                                {
+                                    label: <span style={{ display: 'inline-block', width: 120 }}>修改出价</span>,
+                                    key: '1',
+                                    disabled: selectedRows.length === 0,
+                                    onClick: () => { setUpdateDate({ visible: true, type: '修改出价' }) }
+                                },
+                                {
+                                    label: '修改名称',
+                                    key: '2',
+                                    disabled: selectedRows.length === 0,
+                                    onClick: () => { setUpdateDate({ visible: true, type: '修改名称' }) }
+                                },
+                                {
+                                    label: '修改日限额',
+                                    key: '3',
+                                    disabled: selectedRows.length === 0,
+                                    onClick: () => { setUpdateDate({ visible: true, type: '修改日限额' }) }
+                                },
+                                {
+                                    label: '修改投放日期',
+                                    key: '4',
+                                    disabled: selectedRows.length === 0,
+                                    onClick: () => { setUpdateDate({ visible: true, type: '修改投放时间' }) }
+                                },
+                                {
+                                    label: '修改投放首日开始时间',
+                                    key: '5',
+                                    disabled: selectedRows.length === 0,
+                                    onClick: () => { setUpdateDate({ visible: true, type: '修改投放首日开始时间' }) }
+                                },
+                                {
+                                    label: '一键起量',
+                                    key: '6',
+                                    disabled: selectedRows.length === 0,
+                                    onClick: () => { setAutoAcqVisible(true) }
+                                }
+                            ]
+                        }}
+                        placement="bottomLeft"
+                        arrow
+                    >
+                        <Button>
+                            <Space>
+                                修改广告
+                                <DownOutlined />
+                            </Space>
+                        </Button>
+                    </Dropdown>
+                    <AutoAcquisitionSetTask
+                        selectAdList={selectedRows}
+                    />
+                </> : handleType === 3 ? <>
+                    <Button type='primary' disabled={selectedRows.length === 0} onClick={() => {
+                        setUpdateDate({ visible: true, type: '深度优化ROI' })
+                    }}>修改首日付费 ROI</Button>
+                </> : handleType === 4 ? <>
+                    <Button type='primary' disabled={selectedRows.length === 0} onClick={() => {
+                        setUpdateDate({ visible: true, type: '深度优化ROI' })
+                    }}>修改首日变现 ROI</Button>
+                </> : null}
+                <span style={{ color: 'red' }}>操作完数据结果延时5分钟之内,即时结果去腾讯后台查看</span>
+            </Space>}
+            leftChild={<QueryFormNovel
+                initialValues={{ day3: [moment(), moment()] }}
+                isAccountId
+                isPutUserIdList
+                isAdgroupId
+                isAdgroupName
+                isMarketingGoal
+                isMarketingTargetType
+                isMemo
+                isRemark
+                isBookNameList
+                isDeleted
+                isStatus
+                isPromotedObjectName
+                isPromotedObjectType
+                isOptimizationGoal
+                isCostTotalMin
+                isThousandDisplayPriceTotalMin
+                isConversionsCountTotalMin
+                isIncomeRoi1
+                isRegCost
+                isRegCostPla
+                isCpc
+                // day1={{ placeholder: ['广告创建日期开始', '广告创建日期结束'] }}
+                // day2={{ placeholder: ['投放日期开始', '投放日期结束'] }}
+                // day3={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, day2, day3, bookNameList, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['adCreateTimeMin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['adCreateTimeMax'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['adCreateTimeMin']
+                        delete newQueryForm['adCreateTimeMax']
+                    }
+
+                    if (day2 && day2?.length === 2) {
+                        newQueryForm['putDateBegin'] = moment(day2[0]).format('YYYY-MM-DD')
+                        newQueryForm['putDateEnd'] = moment(day2[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['putDateBegin']
+                        delete newQueryForm['putDateEnd']
+                    }
+
+                    if (day3 && day3?.length === 2) {
+                        newQueryForm['dataTimeMin'] = moment(day3[0]).format('YYYY-MM-DD')
+                        newQueryForm['dataTimeMax'] = moment(day3[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['dataTimeMin']
+                        delete newQueryForm['dataTimeMax']
+                    }
+
+                    if (bookNameList) {
+                        newQueryForm['bookNameList'] = bookNameList.replace(/[,,\s]/g, ',').split(',').filter((a: any) => a)
+                    } else {
+                        delete newQueryForm['bookNameList']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj={isZj}
+            totalData={totalData}
+            config={columns12(dayHandle, () => { getList() })}
+            configName={configName || '腾讯小说广告总数据列表'}
+            fixed={{ left: 4, right: 2 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='腾讯广告列表'
+            loading={getGDTList.loading}
+            ajax={getGDTList}
+            page={queryForm?.pageNum || 1}
+            pageSize={queryForm?.pageSize || 20}
+            total={getGDTList?.data?.data?.total || 0}
+            dataSource={getGDTList?.data?.data?.records?.map((item: any) => ({ ...item, id: item.adgroupId, deepConversionSpec: item?.deepConversionSpecJson ? JSON.parse(item.deepConversionSpecJson) : {} }))}
+            onChange={(pagination: any, _: any, sortData: any) => {
+                let { current, pageSize } = pagination
+                let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                if (sortData && sortData?.order) {
+                    newQueryForm['sortAsc'] = sortData?.order === 'ascend' ? true : false
+                    newQueryForm['sortFiled'] = sortData?.field
+                } else {
+                    delete newQueryForm['sortAsc']
+                    delete newQueryForm['sortFiled']
+                }
+                newQueryForm.pageNum = current || newQueryForm.pageNum
+                newQueryForm.pageSize = pageSize || newQueryForm.pageSize
+                setQueryForm({ ...newQueryForm })
+            }}
+            rowSelection={{
+                selectedRowKeys: selectedRows.map(item => item.adgroupId + ''),
+                getCheckboxProps: (record: any) => ({
+                    disabled:
+                        handleType === 3 ? record.status === 'STATUS_DELETED' || record?.accountId === '总计' || !(record?.deepConversionSpec?.deepConversionWorthSpec?.goal === 'GOAL_1DAY_PURCHASE_ROAS') :
+                            handleType === 4 ? record.status === 'STATUS_DELETED' || record?.accountId === '总计' || !(record?.deepConversionSpec?.deepConversionWorthSpec?.goal === 'GOAL_1DAY_MONETIZATION_ROAS') :
+                                record.status === 'STATUS_DELETED' || record?.accountId === '总计'
+                }),
+                onSelect: (record: { adgroupId: number }, selected: boolean) => {
+                    if (selected) {
+                        selectedRows.push({ ...record })
+                        setSelectedRows([...selectedRows])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { adgroupId: number }) => item.adgroupId !== record.adgroupId)
+                        setSelectedRows([...newSelectAccData])
+                    }
+                },
+                onSelectAll: (selected: boolean, selectedRowss: { adgroupId: number }[], changeRows: { adgroupId: number }[]) => {
+                    if (selected) {
+                        let newSelectAccData = [...selectedRows]
+                        changeRows.forEach((item: { adgroupId: number }) => {
+                            let index = newSelectAccData.findIndex((ite: { adgroupId: number }) => ite.adgroupId === item.adgroupId)
+                            if (index === -1) {
+                                newSelectAccData.push({ ...item })
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { adgroupId: number }) => {
+                            let index = changeRows.findIndex((ite: { adgroupId: number }) => ite.adgroupId === item.adgroupId)
+                            if (index !== -1) {
+                                return false
+                            } else {
+                                return true
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    }
+                }
+            }}
+        />
+
+        {visible && <DayAd configName={dayConfigName} appId={initialState?.iaaApp as number[]} productType={initialState?.productType as string} adName={adName} visible={visible} onClose={() => { setVisible(false); setPromotionId(undefined) }} queryForm={{ costDayBegin: queryForm?.dataTimeMin, costDayEnd: queryForm?.dataTimeMax }} promotionId={promotionId} />}
+
+        {/* 修改广告 */}
+        {updateData.visible && <UpdateAd3
+            {...updateData}
+            updateData={selectedRows}
+            onClose={() => {
+                setUpdateDate({ visible: false, type: '修改出价' })
+            }}
+            onChange={() => {
+                setUpdateDate({ visible: false, type: '修改出价' })
+                getGDTList.refresh()
+                if (updateData.type === '删除') {
+                    setSelectedRows([])
+                }
+            }}
+        />}
+
+        {/* 批量一键起量 */}
+        {autoAcqVisible && <AutoAcquisitionSet
+            selectAdList={selectedRows}
+            visible={autoAcqVisible}
+            onClose={() => {
+                setAutoAcqVisible(false)
+            }}
+            onChange={() => {
+                setAutoAcqVisible(false)
+                getGDTList.refresh()
+                setSelectedRows([])
+            }}
+        />}
+    </div>
+}
+
+export default TencentNovelAd

+ 38 - 0
src/pages/iaaData/novel/tencent/adListTotal/switchStatus.tsx

@@ -0,0 +1,38 @@
+import { useAjax } from "@/Hook/useAjax"
+import { modifyStatusBatchApi } from "@/services/gameData"
+import { message, notification, Switch } from "antd"
+import React from "react"
+
+
+
+/**
+ * 修改启停
+ */
+interface Props {
+    configuredStatus: string,
+    accountId: number
+    adgroupId: number
+    isDeleted?: boolean,
+    onChange?: () => void
+}
+const SwitchStatus: React.FC<Props> = (prosp) => {
+
+    const { configuredStatus, isDeleted, adgroupId, accountId, onChange } = prosp
+    const modifyStatusBatch = useAjax((params) => modifyStatusBatchApi(params))
+    
+    const switchHandle = (accountAdgroupMaps: string[], type: boolean) => {
+        modifyStatusBatch.run({ accountAdgroupMaps, suspend: !type }).then(res => {
+            if (res?.data?.failIdList?.length === 0) {
+                message.success(`${type ? '启动' : '暂停'}成功,结果有延迟请手动刷新`)
+                // onChange?.()
+            } else {
+                message.success(`${type ? '启动' : '暂停'}失败,${JSON.stringify(res?.data?.failIdList)}`)
+            }
+        })
+    }
+
+    return <Switch size="small" checked={configuredStatus === 'AD_STATUS_NORMAL'} loading={modifyStatusBatch.loading} disabled={isDeleted} onChange={(checked) => switchHandle([accountId + ',' + adgroupId] ,checked)}/>
+}
+
+
+export default React.memo(SwitchStatus)

+ 876 - 0
src/pages/iaaData/novel/tencent/adListTotal/tableConfig.tsx

@@ -0,0 +1,876 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Badge, Progress, Space, Statistic, Tag } from "antd"
+import React from "react"
+import { ADGROUP_STATUS, BID_MODE_ENUM, COST_GUARANTEE_STATUS_ENUM, MARKETING_GOAL_ENUM, MARKETING_TARGET_TYPE_ENUM, OPTIMIZATIONGOAL_ENUM, PRODUCT_TYPE_ENUM, SMART_BID_TYPE_ENUM } from "../../../const"
+import SwitchStatus from "./switchStatus"
+import CreativePreview from "../../../components/CreativePreview"
+import TimeSeriesLook from "@/pages/iaaData/components/TimeSeriesLook"
+import { AUTO_ACQUISTION_STATUS } from "./const"
+
+function columns12(dayHandle: (data: any) => void, onChange?: () => void): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[], bcColor?: string }[] {
+
+
+    return [
+        {
+            label: '广告基本信息',
+            data: [
+                {
+                    title: '广告账号', dataIndex: 'accountId', label: '广告基本信息', align: 'center', width: 80, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '腾讯备注', dataIndex: 'memo', label: '广告基本信息', width: 80, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '本地备注', dataIndex: 'remark', label: '广告基本信息', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '广告基本信息', align: 'center', width: 80, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '广告基本信息', align: 'center', width: 100, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '广告基本信息', align: 'center', width: 100,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'adgroupId', label: '广告基本信息', align: 'center', width: 80, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+
+                {
+                    title: '公司ID', dataIndex: 'companyId', label: '广告基本信息', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '广告基本信息', align: 'center', width: 60, default: 8,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'adgroupName', label: '广告基本信息', align: 'center', width: 120, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放日期', dataIndex: 'beginDate', label: '广告基本信息', align: 'center', width: 180, default: 10,
+                    render: (a: string, b: any) => (<WidthEllipsis value={b?.accountId === '总计' ? '--' : `${a}-${b?.endDate}`} />)
+                },
+                {
+                    title: '投放时间', dataIndex: 'timeSeries', label: '广告基本信息', align: 'center', width: 180, default: 11,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <TimeSeriesLook timeSeries={a} />
+                    }
+                },
+                {
+                    title: '首日开始投放时间', dataIndex: 'firstDayBeginTime', label: '广告基本信息', align: 'center', width: 70, default: 12,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '出价', dataIndex: 'bidAmount', label: '广告基本信息', align: 'right', width: 140, default: 13,
+                    render: (a: string, b: { bidMode: string, optimizationGoal: string, accountId: any }) => {
+                        if (b?.accountId === '总计') return '--';
+                        return `${b?.bidMode ? BID_MODE_ENUM[b?.bidMode as keyof typeof BID_MODE_ENUM] : ''} ${a}元/${b?.bidMode === 'BID_MODE_CPM' ? '千次曝光' : b?.bidMode === 'BID_MODE_CPC' ? '点击' : OPTIMIZATIONGOAL_ENUM[b?.optimizationGoal as keyof typeof OPTIMIZATIONGOAL_ENUM]}`
+                    }
+                },
+                {
+                    title: '一键起量', dataIndex: 'autoAcquisitionEnabled', label: '广告基本信息', width: 200, default: 14,
+                    render: (a: boolean, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <Space size={2}>
+                            {a ? <>
+                                <Tag color="success">开启</Tag>
+                                <Statistic prefix={'¥'} value={b?.autoAcquisitionBudget || 0} precision={2} />
+                            </> : <Tag color="error">关闭</Tag>}
+                            {b?.autoAcquisitionStatus && <div style={{ width: 65, paddingLeft: 4 }}><WidthEllipsis value={AUTO_ACQUISTION_STATUS[b?.autoAcquisitionStatus as keyof typeof AUTO_ACQUISTION_STATUS]} /></div>}
+                        </Space>
+                    }
+                },
+                {
+                    title: '深度优化出价', dataIndex: 'deepConversionWorthRate', label: '广告基本信息', align: 'center', width: 70, default: 15,
+                    render: (a: string, b: { accountId: any }) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <Statistic value={a || 0} precision={2} />
+                    }
+                },
+                {
+                    title: '出价类型', dataIndex: 'smartBidType', label: '广告基本信息', align: 'center', width: 80, default: 16,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return SMART_BID_TYPE_ENUM[a as keyof typeof SMART_BID_TYPE_ENUM]
+                    }
+                },
+                {
+                    title: '广告组日预算(元)', dataIndex: 'dailyBudget', label: '广告基本信息', align: 'right', width: 70, sorter: true, default: 17,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <Statistic value={a || 0} precision={2} />
+                    }
+                },
+                {
+                    title: '是否开启自动版位功能', dataIndex: 'automaticSiteEnabled', label: '广告基本信息', align: 'center', width: 80, default: 18,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <WidthEllipsis value={a ? '是' : '否'} />
+                    }
+                },
+                {
+                    title: '定向条件描述', dataIndex: 'targetingTranslation', label: '广告基本信息', align: 'center', width: 120,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '是否已删除', dataIndex: 'isDeleted', label: '广告基本信息', align: 'center', width: 60, default: 19,
+                    render: (a: any, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <Badge status={!a ? "processing" : "error"} text={a ? '是' : '否'} />
+                    }
+                },
+                {
+                    title: '广告状态', dataIndex: 'systemStatus', label: '广告基本信息', align: 'center', width: 100, default: 20,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return ADGROUP_STATUS[a as keyof typeof ADGROUP_STATUS]
+                    }
+                },
+                {
+                    title: '营销目的', dataIndex: 'marketingGoal', label: '广告基本信息', align: 'center', width: 85, default: 21,
+                    render: (a: string) => (<WidthEllipsis value={MARKETING_GOAL_ENUM[a as keyof typeof MARKETING_GOAL_ENUM]} />)
+                },
+                {
+                    title: '推广内容资产类型', dataIndex: 'marketingTargetType', label: '广告基本信息', align: 'center', width: 85, default: 22,
+                    render: (a: string) => (<WidthEllipsis value={MARKETING_TARGET_TYPE_ENUM[a as keyof typeof MARKETING_TARGET_TYPE_ENUM]} />)
+                },
+                {
+                    title: '书名', dataIndex: 'bookName', label: '广告基本信息', align: 'center', width: 110, default: 23,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '成本保障状态', dataIndex: 'costGuaranteeStatus', label: '广告基本信息', align: 'center', width: 85,
+                    render: (a: string) => (<WidthEllipsis value={COST_GUARANTEE_STATUS_ENUM[a as keyof typeof COST_GUARANTEE_STATUS_ENUM]} />)
+                },
+                {
+                    title: '成本保障赔付金额', dataIndex: 'costGuaranteeMoney', label: '广告基本信息', align: 'right', width: 70, sorter: true,
+                    render: (a: string) => {
+                        return <Statistic value={a || 0} precision={2} />
+                    }
+                },
+                {
+                    title: '标记备注', dataIndex: 'tagRemark', label: '广告基本信息', align: 'center', width: 80, default: 24,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '创意预览', dataIndex: 'dynamicCreativeVOList', label: '腾讯广告列表', width: 150, default: 33,
+                    render: (a: any, b: any) => {
+                        if (b?.accountId === '总计') {
+                            return '--'
+                        }
+                        if (a?.length) {
+                            let deliveryMode: string[] = []
+                            let creativePreview = a?.map((item: { creativeComponents: any, deliveryMode: string }) => {
+                                deliveryMode.push(item.deliveryMode)
+                                return { ...item?.creativeComponents }
+                            })
+                            return <CreativePreview creativePreview={creativePreview} deliveryMode={deliveryMode} />
+                        }
+                        return null
+                    }
+                }
+            ]
+        },
+        {
+            label: '广告消耗信息',
+            data: [
+                {
+                    title: '真实消耗', dataIndex: 'cost', label: '广告消耗信息', align: 'center', width: 85, default: 25, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: 0, top: 2, bottom: 0, right: 0, padding: '0 5px' }}><Statistic value={a || 0} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 500 } : { fontWeight: 500 }} /></span>
+                    </div>
+                },
+                {
+                    title: '消耗', dataIndex: 'totalCost', label: '广告消耗信息', align: 'center', width: 85, default: 40, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: 0, top: 2, bottom: 0, right: 0, padding: '0 5px' }}><Statistic value={a || 0} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 500 } : { fontWeight: 500 }} /></span>
+                    </div>
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '广告消耗信息', align: 'center', width: 70, default: 26, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告消耗信息', align: 'right', width: 65, default: 27, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告消耗信息', align: 'center', width: 70, default: 28, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告消耗信息', align: 'center', width: 70, default: 29, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '广告消耗信息', align: 'center', width: 65, default: 30, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '不感兴趣点击次数', dataIndex: 'noInterestCount', label: '广告消耗信息', align: 'center', width: 65, default: 31, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '朋友圈视频播放次数', dataIndex: 'videoPlayCount', label: '广告消耗信息', align: 'center', width: 65, default: 32, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '广告转化信息',
+            data: [
+                {
+                    title: '下载次数', dataIndex: 'downloadCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '安装次数', dataIndex: 'installCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活次数', dataIndex: 'activatedCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注人数', dataIndex: 'followUv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本', dataIndex: 'followCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '公众号关注率', dataIndex: 'followRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '公众号关注次数', dataIndex: 'bizFollowCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注次数成本', dataIndex: 'bizFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '快应用添加次数', dataIndex: 'addDesktopPv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '快应用添加成本', dataIndex: 'addDesktopCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '快应用添加率', dataIndex: 'addDesktopRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加企业微信客服人数', dataIndex: 'scanFollowUserCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服成本', dataIndex: 'scanFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '加企业微信客服率', dataIndex: 'scanFollowRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '商品转化',
+            data: [
+                {
+                    title: '首日新增下单量', dataIndex: 'firstDayOrderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日新增下单金额', dataIndex: 'firstDayOrderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日新增下单ROI', dataIndex: 'firstDayOrderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '订单量', dataIndex: 'orderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '订单金额', dataIndex: 'orderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单成本', dataIndex: 'orderCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单率', dataIndex: 'orderRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单ROI', dataIndex: 'orderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '客单价', dataIndex: 'atv', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化量', dataIndex: 'conversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化成本', dataIndex: 'conversionsCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '深度转化', dataIndex: 'deepConversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化率', dataIndex: 'conversionsRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加粉数', dataIndex: 'addFansCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加粉成本', dataIndex: 'addFansCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+            ]
+        },
+        {
+            label: '其他业务(平台上报指标)',
+            bcColor: '#f6ffed',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU(平台上报)', dataIndex: 'firstDayAdPurArppuCost24hPla', label: '其他业务(平台上报指标)', width: 130, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现ROI(平台上报)', dataIndex: 'incomeRoi124hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活首24小时广告变现次数(平台上报)', dataIndex: 'incomePv24hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现次数(平台上报)', dataIndex: 'incomePv1dPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现次数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive3dPv', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数(平台上报)', dataIndex: 'minigame7dIncomeCount', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现次数(平台上报)', dataIndex: 'minigame3dIncomeCount', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额(平台上报)', dataIndex: 'incomeVal24hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册首日广告变现金额(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationAmount', label: '其他业务(平台上报指标)', width: 120, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册7日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD7', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活14日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD14', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmount', label: '其他业务(平台上报指标)', width: 100, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现人数(平台上报)', dataIndex: 'adPayingUsers24hPla', label: '其他业务(平台上报指标)', width: 115, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive1dPv', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive7dPv', label: '其他业务(平台上报指标)', width: 100, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '其他业务(其他指标)',
+            bcColor: '#fff2e8',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost24h', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首日广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现ARPPU', dataIndex: 'adMonetizationArppu', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现ROI', dataIndex: 'incomeRoi124h', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.8 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活首日广告变现ROI', dataIndex: 'incomeRoi1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.75 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活3日广告变现ROI', dataIndex: 'incomeRoi3', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.84 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活7日广告变现ROI', dataIndex: 'incomeRoi7', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活14日广告变现ROI', dataIndex: 'incomeRoi14', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告变现ROI', dataIndex: 'adMonetizationRoi', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活首日广告变现成本(人数)', dataIndex: 'adPayingCostD1', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现成本', dataIndex: 'adMonetizationCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活3日广告变现次数', dataIndex: 'adMonetizationActive3dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数', dataIndex: 'adMonetizationActive7dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现次数(平台上报)', dataIndex: 'incomePvPla', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额', dataIndex: 'incomeVal24h', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首日广告变现金额', dataIndex: 'incomeVal1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活3日广告变现金额', dataIndex: 'incomeVal3', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活7日广告变现金额', dataIndex: 'incomeVal7', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活14日广告变现金额', dataIndex: 'incomeVal14', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现人数', dataIndex: 'appAdPayingUsers', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现金额', dataIndex: 'adMonetizationAmount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现人数', dataIndex: 'adPayingUsers24h', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数', dataIndex: 'adPayingUsersD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现人数', dataIndex: 'adMonetizationDedupActive3dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现人数', dataIndex: 'adMonetizationDedupActive7dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册次数', dataIndex: 'regPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册人数', dataIndex: 'regDedupPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本', dataIndex: 'regCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册次数成本', dataIndex: 'regPvCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册率', dataIndex: 'regRate', label: '其他业务(其他指标)', width: 110, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活注册率', dataIndex: 'activateRegisterRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存次数', dataIndex: 'retentionCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存人数', dataIndex: 'miniGameRetentionD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存成本', dataIndex: 'retentionCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '关键页面次日留存率', dataIndex: 'appKeyPageRetentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存率', dataIndex: 'miniGameRetentionD1Rate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存成本', dataIndex: 'miniGameRetentionD1Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            bcColor: '#f9f0ff',
+            data: [
+                {
+                    title: '小游戏注册首日广告变现ARPU(平台上报)', dataIndex: 'miniGameFirstDayAdPayingArpu', label: '小游戏(平台上报)', width: 130, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现ARPU(平台上报)', dataIndex: 'miniGameAdMonetizationArpu', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册首日广告变现ROI(平台上报)', dataIndex: 'miniGame1dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册3日广告变现ROI(平台上报)', dataIndex: 'minigame3dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册7日广告变现ROI(平台上报)', dataIndex: 'minigame7dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏广告变现ROI(平台上报)', dataIndex: 'miniGameAdMonetizationRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册首日广告变现成本(平台上报)', dataIndex: 'miniGameFirstDayAdPayingCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏广告变现成本(平台上报)', dataIndex: 'miniGameAdMonetizationCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册3日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD3', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现人数(平台上报)', dataIndex: 'minigame3dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现人数(平台上报)', dataIndex: 'minigame7dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现人数(平台上报)', dataIndex: 'miniGameAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册次数(平台上报)', dataIndex: 'regPlaPv', label: '小游戏(平台上报)', width: 90, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册人数(平台上报+广告主上报)', dataIndex: 'regAllDedupPv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(平台上报+广告主上报)', dataIndex: 'regCostPla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册率(平台上报+广告主上报)', dataIndex: 'regClickRatePla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: 'App相关字段',
+            data: [
+                {
+                    title: '回流率', dataIndex: 'miniGameRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流次日留存人数', dataIndex: 'retentionPlaDedupPv', label: 'App相关字段', width: 80, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流次日留存率', dataIndex: 'retentionPlaDedupRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流人数(平台上报)', dataIndex: 'miniGameBfUv', label: 'App相关字段', width: 80, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流成本(平台上报)', dataIndex: 'miniGameBfCost', label: 'App相关字段', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupPv', label: 'App相关字段', width: 90, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流广告变现金额(平台上报)', dataIndex: 'miniGameBfIncomeAmount', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流首日广告变现金额(平台上报)', dataIndex: 'miniGameBfIncomeD1Amount', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流广告变现人数(平台上报)', dataIndex: 'adMonetizationBkPlaDedupPv', label: 'App相关字段', width: 90, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流广告变现ROI(平台上报)', dataIndex: 'miniGameBfIncomePlaRoi', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流广告变现ARPU(平台上报)', dataIndex: 'miniGameBfIncomePlaArpu', label: 'App相关字段', width: 100, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流广告变现成本(平台上报)', dataIndex: 'adMonetizationBkPlaCost', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流首日广告变现人数(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive1dPv', label: 'App相关字段', width: 100, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流首24小时广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive24hAmount', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流首24小时广告变现人数(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hPv', label: 'App相关字段', width: 110, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流首24小时广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hRoi', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流首24小时广告变现ARPU(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hArpu', label: 'App相关字段', width: 120, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流首24小时广告变现成本(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hCost', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流3日广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive3dAmount', label: 'App相关字段', width: 95, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流3日广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaActive3dRoi', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流7日广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive7dAmount', label: 'App相关字段', width: 95, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流7日广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaActive7dRoi', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流14日广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive14dAmount', label: 'App相关字段', width: 95, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流14日广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaActive14dRoi', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP下载激活率', dataIndex: 'activatedRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP下载率', dataIndex: 'downloadRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP下载成本', dataIndex: 'downloadCost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'APP安装率', dataIndex: 'installRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP安装成本', dataIndex: 'installCost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'APP激活成本', dataIndex: 'activatedCost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'APP点击激活率', dataIndex: 'clickActivatedRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '3日留存人数', dataIndex: 'appRetentionD3Uv', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存成本(人数)', dataIndex: 'appRetentionD3Cost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日留存率(人数)', dataIndex: 'appRetentionD3Rate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '5日留存人数', dataIndex: 'appRetentionD5Uv', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存成本(人数)', dataIndex: 'appRetentionD5Cost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '5日留存率(人数)', dataIndex: 'appRetentionD5Rate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '7日留存人数', dataIndex: 'appRetentionD7Uv', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存成本(人数)', dataIndex: 'appRetentionD7Cost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日留存率(人数)', dataIndex: 'appRetentionD7Rate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: '操作',
+            data: [
+                {
+                    title: '操作', dataIndex: 'cz', label: '操作', align: 'center', width: 150, default: 100,
+                    render: (_: number, b: any) => {
+                        if (b?.accountId === '总计') return '--'
+                        return <Space>
+                            <a onClick={() => dayHandle(b)} style={{ fontSize: 12 }}>广告每日监控</a>
+                            <a onClick={() => {
+                                window.open(`https://ad.qq.com/atlas/${b?.accountId}/admanage/adgroup?tab=adgroup&query={%22operation_status%22:[%22CALCULATE_STATUS_EXCLUDE_DEL%22],%22system_status%22:[],%22search_name%22:%22${b.adgroupId}%22}`)
+                            }} style={{ fontSize: 12 }}>腾讯广告</a>
+                        </Space>
+                    }
+                },
+                {
+                    title: '启停',
+                    dataIndex: 'configuredStatus',
+                    label: '操作',
+                    align: 'center',
+                    width: 45,
+                    default: 1,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') {
+                            return '--'
+                        }
+                        return <SwitchStatus configuredStatus={a} isDeleted={b?.isDeleted} adgroupId={b?.adgroupId} accountId={b?.accountId} onChange={onChange} />
+                    }
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 696 - 0
src/pages/iaaData/novel/tencent/adListTotal/tableConfigDay.tsx

@@ -0,0 +1,696 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { PRODUCT_TYPE_ENUM } from "../../../const"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[], bcColor?: string }[] {
+
+
+    return [
+        {
+            label: '广告基本信息',
+            data: [
+                {
+                    title: '广告账号', dataIndex: 'accountId', label: '广告基本信息', align: 'center', width: 80, default: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '广告基本信息', align: 'center', width: 80, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '广告基本信息', align: 'center', width: 100, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '广告基本信息', align: 'center', width: 100,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'adgroupId', label: '广告基本信息', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '统计日', dataIndex: 'day', label: '广告基本信息', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '公司ID', dataIndex: 'companyId', label: '广告基本信息', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '广告基本信息', align: 'center', width: 60, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'adgroupName', label: '广告基本信息', align: 'center', width: 120, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                }
+            ]
+        },
+        {
+            label: '广告消耗信息',
+            data: [
+                {
+                    title: '消耗', dataIndex: 'cost', label: '广告消耗信息', align: 'center', width: 85, default: 7, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: 0, top: 2, bottom: 0, right: 0, padding: '0 5px' }}><Statistic value={a || 0} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 500 } : { fontWeight: 500 }} /></span>
+                    </div>
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '广告消耗信息', align: 'center', width: 70, default: 8, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告消耗信息', align: 'right', width: 65, default: 9, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告消耗信息', align: 'center', width: 70, default: 10, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告消耗信息', align: 'center', width: 70, default: 11, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '广告消耗信息', align: 'center', width: 65, default: 12, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '不感兴趣点击次数', dataIndex: 'noInterestCount', label: '广告消耗信息', align: 'center', width: 65, default: 13, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '朋友圈视频播放次数', dataIndex: 'videoPlayCount', label: '广告消耗信息', align: 'center', width: 65, default: 14, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '广告转化信息',
+            data: [
+                {
+                    title: '下载次数', dataIndex: 'downloadCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 15,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '安装次数', dataIndex: 'installCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 16,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活次数', dataIndex: 'activatedCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 17,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注人数', dataIndex: 'followUv', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 18,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本', dataIndex: 'followCost', label: '广告转化信息', align: 'right', width: 80, sorter: true, default: 19,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '公众号关注率', dataIndex: 'followRate', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 20,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '公众号关注次数', dataIndex: 'bizFollowCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 21,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注次数成本', dataIndex: 'bizFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true, default: 22,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '快应用添加次数', dataIndex: 'addDesktopPv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '快应用添加成本', dataIndex: 'addDesktopCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '快应用添加率', dataIndex: 'addDesktopRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加企业微信客服人数', dataIndex: 'scanFollowUserCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 23,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服成本', dataIndex: 'scanFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true, default: 24,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '加企业微信客服率', dataIndex: 'scanFollowRate', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 25,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '商品转化',
+            data: [
+                {
+                    title: '首日新增下单量', dataIndex: 'firstDayOrderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日新增下单金额', dataIndex: 'firstDayOrderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日新增下单ROI', dataIndex: 'firstDayOrderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '订单量', dataIndex: 'orderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '订单金额', dataIndex: 'orderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单成本', dataIndex: 'orderCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单率', dataIndex: 'orderRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单ROI', dataIndex: 'orderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '客单价', dataIndex: 'atv', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化量', dataIndex: 'conversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化成本', dataIndex: 'conversionsCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '深度转化', dataIndex: 'deepConversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化率', dataIndex: 'conversionsRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加粉数', dataIndex: 'addFansCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加粉成本', dataIndex: 'addFansCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+            ]
+        },
+        {
+            label: '其他业务(平台上报指标)',
+            bcColor: '#f6ffed',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU(平台上报)', dataIndex: 'firstDayAdPurArppuCost24hPla', label: '其他业务(平台上报指标)', width: 130, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '激活首24小时广告变现ROI(平台上报)', dataIndex: 'incomeRoi124hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活首24小时广告变现次数(平台上报)', dataIndex: 'incomePv24hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现次数(平台上报)', dataIndex: 'incomePv1dPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现次数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive3dPv', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数(平台上报)', dataIndex: 'minigame7dIncomeCount', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现次数(平台上报)', dataIndex: 'minigame3dIncomeCount', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额(平台上报)', dataIndex: 'incomeVal24hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册首日广告变现金额(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationAmount', label: '其他业务(平台上报指标)', width: 120, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册7日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD7', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活14日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD14', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmount', label: '其他业务(平台上报指标)', width: 100, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现人数(平台上报)', dataIndex: 'adPayingUsers24hPla', label: '其他业务(平台上报指标)', width: 115, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive1dPv', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive7dPv', label: '其他业务(平台上报指标)', width: 100, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '其他业务(其他指标)',
+            bcColor: '#fff2e8',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost24h', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '激活首日广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '广告变现ARPPU', dataIndex: 'adMonetizationArppu', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '激活首24小时广告变现ROI', dataIndex: 'incomeRoi124h', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活首日广告变现ROI', dataIndex: 'incomeRoi1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活3日广告变现ROI', dataIndex: 'incomeRoi3', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活7日广告变现ROI', dataIndex: 'incomeRoi7', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活14日广告变现ROI', dataIndex: 'incomeRoi14', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告变现ROI', dataIndex: 'adMonetizationRoi', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活首日广告变现成本(人数)', dataIndex: 'adPayingCostD1', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现成本', dataIndex: 'adMonetizationCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活3日广告变现次数', dataIndex: 'adMonetizationActive3dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数', dataIndex: 'adMonetizationActive7dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现次数(平台上报)', dataIndex: 'incomePvPla', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额', dataIndex: 'incomeVal24h', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首日广告变现金额', dataIndex: 'incomeVal1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活3日广告变现金额', dataIndex: 'incomeVal3', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活7日广告变现金额', dataIndex: 'incomeVal7', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活14日广告变现金额', dataIndex: 'incomeVal14', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现人数', dataIndex: 'appAdPayingUsers', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现金额', dataIndex: 'adMonetizationAmount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现人数', dataIndex: 'adPayingUsers24h', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数', dataIndex: 'adPayingUsersD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现人数', dataIndex: 'adMonetizationDedupActive3dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现人数', dataIndex: 'adMonetizationDedupActive7dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册次数', dataIndex: 'regPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册人数', dataIndex: 'regDedupPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本', dataIndex: 'regCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册次数成本', dataIndex: 'regPvCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册率', dataIndex: 'regRate', label: '其他业务(其他指标)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活注册率', dataIndex: 'activateRegisterRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存次数', dataIndex: 'retentionCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存人数', dataIndex: 'miniGameRetentionD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存成本', dataIndex: 'retentionCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '关键页面次日留存率', dataIndex: 'appKeyPageRetentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存率', dataIndex: 'miniGameRetentionD1Rate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存成本', dataIndex: 'miniGameRetentionD1Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            bcColor: '#f9f0ff',
+            data: [
+                {
+                    title: '小游戏注册首日广告变现ARPU(平台上报)', dataIndex: 'miniGameFirstDayAdPayingArpu', label: '小游戏(平台上报)', width: 130, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现ARPU(平台上报)', dataIndex: 'miniGameAdMonetizationArpu', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册首日广告变现ROI(平台上报)', dataIndex: 'miniGame1dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册3日广告变现ROI(平台上报)', dataIndex: 'minigame3dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册7日广告变现ROI(平台上报)', dataIndex: 'minigame7dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏广告变现ROI(平台上报)', dataIndex: 'miniGameAdMonetizationRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册首日广告变现成本(平台上报)', dataIndex: 'miniGameFirstDayAdPayingCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏广告变现成本(平台上报)', dataIndex: 'miniGameAdMonetizationCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册3日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD3', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现人数(平台上报)', dataIndex: 'minigame3dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现人数(平台上报)', dataIndex: 'minigame7dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现人数(平台上报)', dataIndex: 'miniGameAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册次数(平台上报)', dataIndex: 'regPlaPv', label: '小游戏(平台上报)', width: 90, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册人数(平台上报+广告主上报)', dataIndex: 'regAllDedupPv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(平台上报+广告主上报)', dataIndex: 'regCostPla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册率(平台上报+广告主上报)', dataIndex: 'regClickRatePla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: 'App相关字段',
+            data: [
+                {
+                    title: '回流率', dataIndex: 'miniGameRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流次日留存人数', dataIndex: 'retentionPlaDedupPv', label: 'App相关字段', width: 80, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流次日留存率', dataIndex: 'retentionPlaDedupRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流人数(平台上报)', dataIndex: 'miniGameBfUv', label: 'App相关字段', width: 80, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流成本(平台上报)', dataIndex: 'miniGameBfCost', label: 'App相关字段', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupPv', label: 'App相关字段', width: 90, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流广告变现金额(平台上报)', dataIndex: 'miniGameBfIncomeAmount', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流首日广告变现金额(平台上报)', dataIndex: 'miniGameBfIncomeD1Amount', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流广告变现人数(平台上报)', dataIndex: 'adMonetizationBkPlaDedupPv', label: 'App相关字段', width: 90, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流广告变现ROI(平台上报)', dataIndex: 'miniGameBfIncomePlaRoi', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流广告变现ARPU(平台上报)', dataIndex: 'miniGameBfIncomePlaArpu', label: 'App相关字段', width: 100, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流广告变现成本(平台上报)', dataIndex: 'adMonetizationBkPlaCost', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流首日广告变现人数(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive1dPv', label: 'App相关字段', width: 100, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流首24小时广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive24hAmount', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流首24小时广告变现人数(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hPv', label: 'App相关字段', width: 110, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流首24小时广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hRoi', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流首24小时广告变现ARPU(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hArpu', label: 'App相关字段', width: 120, align: 'center', sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '回流首24小时广告变现成本(平台上报)', dataIndex: 'adMonetizationBkPlaDedupActive24hCost', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流3日广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive3dAmount', label: 'App相关字段', width: 95, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流3日广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaActive3dRoi', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流7日广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive7dAmount', label: 'App相关字段', width: 95, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流7日广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaActive7dRoi', label: 'App相关字段', width: 100, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '回流14日广告变现金额(平台上报)', dataIndex: 'adMonetizationBkPlaActive14dAmount', label: 'App相关字段', width: 95, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '回流14日广告变现ROI(平台上报)', dataIndex: 'adMonetizationBkPlaActive14dRoi', label: 'App相关字段', width: 110, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP下载激活率', dataIndex: 'activatedRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP下载率', dataIndex: 'downloadRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP下载成本', dataIndex: 'downloadCost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'APP安装率', dataIndex: 'installRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: 'APP安装成本', dataIndex: 'installCost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'APP激活成本', dataIndex: 'activatedCost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'APP点击激活率', dataIndex: 'clickActivatedRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '3日留存人数', dataIndex: 'appRetentionD3Uv', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存成本(人数)', dataIndex: 'appRetentionD3Cost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日留存率(人数)', dataIndex: 'appRetentionD3Rate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '5日留存人数', dataIndex: 'appRetentionD5Uv', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存成本(人数)', dataIndex: 'appRetentionD5Cost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '5日留存率(人数)', dataIndex: 'appRetentionD5Rate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '7日留存人数', dataIndex: 'appRetentionD7Uv', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存成本(人数)', dataIndex: 'appRetentionD7Cost', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日留存率(人数)', dataIndex: 'appRetentionD7Rate', label: 'App相关字段', width: 70, align: 'center', sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 14 - 0
src/services/iaaData/index.ts

@@ -435,6 +435,14 @@ export async function getNovelGDTListApi(data: GetNovelGDTListProps) {
     });
 }
 
+
+export async function getNovelGDadTotalListApi(data: GetNovelGDTListProps) {
+    return request(wapi + `/monitor/novel/adTotal/listOfPage`, {
+        method: 'POST',
+        data
+    });
+}
+
 /**
  * 广告总计
  * @param data 
@@ -446,6 +454,12 @@ export async function getNovelGDTTotalApi(data: GetNovelGDTListProps) {
         data
     });
 }
+export async function getNovelGDTadTotalTotalApi(data: GetNovelGDTListProps) {
+    return request(wapi + `/monitor/novel/adTotal/total`, {
+        method: 'POST',
+        data
+    });
+}
 
 
 export interface GetNovelGDTDetailListProps extends Paging, SortProps {