wjx 8 mēneši atpakaļ
vecāks
revīzija
ccbdecfe34

+ 5 - 0
config/routerConfig.ts

@@ -132,6 +132,11 @@ const iaaData = {
                     name: '广告列表',
                     component: './iaaData/tencentIaa/adList',
                 },
+                {
+                    path: '/iaaData/tencentIaa/dynamic',
+                    name: '创意列表',
+                    component: './iaaData/tencentIaa/dynamic',
+                },
                 {
                     path: '/iaaData/tencentIaa/appEveryDayData',
                     name: '应用每日数据',

BIN
node_modules.7z


+ 2 - 0
src/app.tsx

@@ -25,6 +25,7 @@ import { ReactComponent as RetainedSvg } from '@/assets/retained.svg'
 import { ReactComponent as TrendSvg } from '@/assets/trend.svg'
 import { ReactComponent as AppEveryDataSvg } from '@/assets/appEveryData.svg'
 import { ReactComponent as AdListSvg } from '@/assets/adList.svg'
+import { ReactComponent as DynamicSvg } from '@/assets/dynamic.svg'
 import versions from './utils/versions';
 
 
@@ -139,6 +140,7 @@ const IconMap = {
     trend: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><TrendSvg /></span>,
     appEveryData: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><AppEveryDataSvg /></span>,
     adList: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><AdListSvg /></span>,
+    dynamic: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><DynamicSvg /></span>,
     eye: <EyeOutlined />
 };
 

+ 1 - 0
src/assets/dynamic.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M763.611429 918.162286c20.260571 0 36.937143 15.652571 38.4 35.84l0.146285 2.925714a38.765714 38.765714 0 0 1-38.546285 38.619429H260.388571a38.4 38.4 0 0 1-38.546285-38.692572 38.692571 38.692571 0 0 1 38.546285-38.692571h503.222858zM512 28.525714A406.162286 406.162286 0 0 1 744.082286 768v72.630857a38.765714 38.765714 0 0 1-38.765715 38.912H318.683429a38.838857 38.838857 0 0 1-38.765715-38.912V768A406.162286 406.162286 0 0 1 512 28.525714z m0 77.385143A328.777143 328.777143 0 0 0 357.229714 724.845714v58.002286c0 10.678857 8.704 19.309714 19.382857 19.309714H647.314286a19.309714 19.309714 0 0 0 19.382857-19.309714V724.845714A328.777143 328.777143 0 0 0 512 105.837714zM448.073143 317.44L512 419.693714l63.926857-102.253714a38.692571 38.692571 0 0 1 65.609143 0l96.694857 154.697143a38.692571 38.692571 0 1 1-65.609143 41.033143l-63.926857-102.253715-63.926857 102.253715a38.692571 38.692571 0 0 1-65.609143 0l-63.853714-102.253715-63.926857 102.253715a38.692571 38.692571 0 0 1-65.609143-40.96L382.464 317.44a38.692571 38.692571 0 0 1 65.609143 0z" p-id="5323"></path></svg>

+ 12 - 1
src/components/QueryForm/index.tsx

@@ -18,6 +18,8 @@ interface Props {
     isPromotionName?: boolean
     /** 是否开启 广告ID 搜索 */
     isPromotionId?: boolean
+    /** 是否开启 创意ID 搜索 */
+    isDynamicCreativeId?: boolean
 
     /** 是否开启 投手 搜索 */
     isPutUserIdList?: boolean
@@ -43,7 +45,7 @@ const QueryForm: React.FC<Props> = (props) => {
 
     /**************************/
     const {
-        onChange, initialValues, isAccountId, isPromotionName, isPromotionId, isCpaBid, isPutUserIdList, isPricing, isStatus, isDeleted, day1, day2, day3
+        onChange, initialValues, isAccountId, isPromotionName, isPromotionId, isDynamicCreativeId, isCpaBid, isPutUserIdList, isPricing, isStatus, isDeleted, day1, day2, day3
     } = props
     const [form] = Form.useForm()
     const [putUserList, setPutUserList] = useState<{ label: string, value: string }[]>([])
@@ -59,6 +61,9 @@ const QueryForm: React.FC<Props> = (props) => {
                 }
             })
         }
+        () => {
+
+        }
     }, [isPutUserIdList])
 
     const onFinish = (data: any) => {
@@ -84,6 +89,11 @@ const QueryForm: React.FC<Props> = (props) => {
                 <Input placeholder="广告ID" style={{ width: 150 }} />
             </Form.Item></Col>}
 
+            {/* 广告ID */}
+            {isDynamicCreativeId && <Col><Form.Item name='dynamicCreativeId'>
+                <Input placeholder="创意ID" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
             {/* 出价 */}
             {isCpaBid && <Col><Form.Item name='cpaBid'>
                 <InputNumber placeholder="出价" style={{ width: 120 }} />
@@ -100,6 +110,7 @@ const QueryForm: React.FC<Props> = (props) => {
                     filterOption={(input, option) =>
                         (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
                     }
+                    maxTagCount={1}
                     loading={getPutUserList.loading}
                     options={putUserList}
                 />

+ 4 - 2
src/components/RightContent/index.tsx

@@ -24,6 +24,7 @@ const GlobalHeaderRight: React.FC<{}> = () => {
     const [productTypeList, setProductTypeList] = useState<{ label: string, value: string }[]>([])
     const [mediaPlatformList, setMediaPlatformList] = useState<{ label: string, value: string }[]>([])
     const [productType, setProductType] = useState<string>()
+    const [isJr, setIsJr] = useState<boolean>(false)
 
     const haveTo = (type: 'MEDIA_PLATFORM_TENCENT' | 'MEDIA_PLATFORM_OCENAENGINE') => {
         let menus = initialState?.menu?.data?.find((item: { path: string; }) => item.path === "/iaaData")?.routes
@@ -44,7 +45,8 @@ const GlobalHeaderRight: React.FC<{}> = () => {
     }
 
     useEffect(() => {
-        if (location.hash.includes('/iaaData')) {
+        if (location.hash.includes('/iaaData') && !isJr) {
+            setIsJr(() => true)
             getAppList.run().then(res => {
                 if (res?.data) {
                     let menus = initialState?.menu?.data?.find((item: { path: string; }) => item.path === "/iaaData")?.routes
@@ -82,7 +84,7 @@ const GlobalHeaderRight: React.FC<{}> = () => {
                 }
             })
         }
-    }, [])
+    }, [location.hash, isJr])
 
 
     useEffect(() => {

+ 2 - 3
src/components/Settings/index.tsx

@@ -11,13 +11,12 @@ const Settings: React.FC = () => {
 
     /******************************/
     const { isFullscreen, setIsFullscreen, isFull, toggleFull, setVisible, czChild, leftChild, ajax } = useContext(DispatchHeader)!;
-    const colData = czChild ? { span: 24 } : { flex: '1 1 150px' }
     /******************************/
 
     return <Col span={24}>
         <Row gutter={[0, 10]} align='bottom'>
-            <Col {...colData}>
-                {isFullscreen && leftChild}
+            <Col {...(czChild ? { span: 24 } : { flex: '1 1 150px' })}>
+                {(isFullscreen && leftChild) && leftChild}
             </Col>
             {czChild && <Col flex='1 1 150px'>{czChild}</Col>}
             <Col flex='0 1 150px'>

+ 55 - 0
src/pages/iaaData/tencentIaa/dynamic/const.tsx

@@ -0,0 +1,55 @@
+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 DELIVERY_MODE_Enum {
+    DELIVERY_MODE_CUSTOMIZE = '自定义创意',
+    DELIVERY_MODE_COMPONENT = '组件化创意'
+}

+ 98 - 0
src/pages/iaaData/tencentIaa/dynamic/dayAd.tsx

@@ -0,0 +1,98 @@
+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 { getGDTDynamicDayListApi } from "@/services/iaaData"
+
+interface Props {
+    queryForm: {
+        costDayBegin?: string,
+        costDayEnd?: string
+    }
+    iaaApp: string,
+    adName: string,
+    promotionId?: number
+    dynamicCreativeId?: number
+    onClose?: () => void
+    visible?: boolean
+}
+
+/**
+ * 广告每日监控
+ * @returns 
+ */
+const DayAd: React.FC<Props> = ({ iaaApp, adName, queryForm, promotionId, dynamicCreativeId, onClose, visible }) => {
+
+    /***********************************/
+    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 getGDTDynamicDayList = useAjax((params) => getGDTDynamicDayListApi(params))
+    /***********************************/
+
+    useEffect(() => {
+        let params: any = {}
+        const [appId, productType] = iaaApp.split('||')
+        if (promotionId) {
+            params.promotionId = promotionId
+        }
+        if (dynamicCreativeId) {
+            params.dynamicCreativeId = dynamicCreativeId
+        }
+        if (date && date?.length > 0) {
+            params.costDayBegin = date[0]
+            params.costDayEnd = date[1]
+        } else {
+            delete params?.costDayBegin
+            delete params?.costDayEnd
+        }
+        getGDTDynamicDayList.run({ ...params, ...data, appId, productType })
+    }, [promotionId, dynamicCreativeId, queryForm, data, date, iaaApp])
+
+    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={getGDTDynamicDayList}
+            loading={getGDTDynamicDayList.loading}
+            fixed={{ left: 3, right: 0 }}
+            dataSource={getGDTDynamicDayList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(data.pageNum.toString() + index.toString()) }))}
+            page={getGDTDynamicDayList?.data?.data?.current || 1}
+            pageSize={getGDTDynamicDayList?.data?.data?.size || 20}
+            total={getGDTDynamicDayList?.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={'腾讯创意每日监控'}
+        />
+    </Drawer>
+}
+
+export default React.memo(DayAd)

+ 0 - 0
src/pages/iaaData/tencentIaa/dynamic/index.less


+ 265 - 0
src/pages/iaaData/tencentIaa/dynamic/index.tsx

@@ -0,0 +1,265 @@
+import React, { useEffect, useState } from "react"
+import { useAjax } from "@/Hook/useAjax"
+import { getDynamicListApi, getDynamicTotalApi, GetGDTListProps } from "@/services/iaaData"
+import TablePro from "@/components/TablePro"
+import columns12 from "./tableConfig"
+import QueryForm from "@/components/QueryForm"
+import moment from "moment"
+import { useModel } from "umi"
+import { Button, message, Modal, notification, Space, Table } from "antd"
+import { newEditAdqAdgroupsDataApi, updateBatchDynamicCreativesInfoApi } from "@/services/gameData"
+import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons"
+import DayAd from "./dayAd"
+
+/**
+ * 腾讯创意列表
+ * @returns 
+ */
+const Dynamic: React.FC = () => {
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [selectedRows, setSelectedRows] = useState<any[]>([])
+    const [queryForm, setQueryForm] = useState<GetGDTListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().format('YYYY-MM-DD'),
+        costDayEnd: moment().format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([{ dynamicCreativeId: 1, accountId: '总计' }])
+    const [visible, setVisible] = useState<boolean>(false)
+    const [promotionId, setPromotionId] = useState<number>()
+    const [dynamicCreativeId, setDynamicCreativeId] = useState<number>()
+    const [adName, setAdName] = useState<string>('')
+    const [failIdList, setFailIdList] = useState<{ adgroupId: number, code: number, message: string, messageCn: string }[]>([])
+    const [failVisible, setFailVisible] = useState<boolean>(false)
+
+    const updateBatchDynamicCreativesInfo = useAjax((params) => updateBatchDynamicCreativesInfoApi(params))
+    const getDynamicList = useAjax((params) => getDynamicListApi(params))
+    const getDynamicTotal = useAjax((params) => getDynamicTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getDynamicList.run({ ...queryForm, appId, productType })
+            getDynamicTotal.run({ ...queryForm, appId, productType }).then((res: { data: { dynamicCreativeId: number; accountId: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.dynamicCreativeId = 1
+                    data.accountId = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ dynamicCreativeId: 1, accountId: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    const dayHandle = (data: any) => {
+        setVisible(true)
+        setAdName(data.promotionName)
+        setPromotionId(data.promotionId)
+        setDynamicCreativeId(data.dynamicCreativeId)
+    }
+
+    const dynamicHandle = (type: '删除' | '启动' | '暂停', data?: any) => {
+        let accountAdgroupMaps = data ? [data.accountId + ',' + data.dynamicCreativeId] : [...new Set(selectedRows?.map(item => item.accountId + ',' + item.dynamicCreativeId))]
+        let hide: any
+        if (data) {
+            hide = message.loading(`正在设置...`, 0, () => {
+                message.success('设置成功');
+            });
+        }
+        switch (type) {
+            case '启动':
+            case '暂停':
+                updateBatchDynamicCreativesInfo.run({ accountAdgroupMaps, suspend: type === '暂停' }).then(res => {
+                    if (res?.failIdList?.length === 0) {
+                        message.success(`修改操作完成!`)
+                        getDynamicList.refresh()
+                        setSelectedRows([])
+                    } else {
+                        setFailIdList(res?.list || [])
+                        setFailVisible(true)
+                    }
+                    if (hide) {
+                        hide()
+                    }
+                })
+                break
+        }
+    }
+
+
+    return <div>
+        <TablePro
+            czChild={<Space>
+                {/* <Switch checkedChildren="开启全选" unCheckedChildren="关闭全选" checked={!isZj} onChange={(e) => { setIsZj(!e); }} /> */}
+                <Button type='primary' size="small" style={{ background: '#67c23a', borderColor: '#67c23a' }} loading={updateBatchDynamicCreativesInfo.loading} icon={<PlayCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => dynamicHandle('启动')}>启动</Button>
+                <Button type='primary' size="small" style={{ background: '#e6a23c', borderColor: '#e6a23c' }} loading={updateBatchDynamicCreativesInfo.loading} icon={<PauseCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => dynamicHandle('暂停')}>暂停</Button>
+                <span style={{ color: 'red' }}>操作完数据结果延时5分钟之内,即时结果去腾讯后台查看</span>
+            </Space>}
+            leftChild={<QueryForm
+                initialValues={{ day3: [moment(), moment()] }}
+                isAccountId
+                isPromotionName
+                isDynamicCreativeId
+                isPutUserIdList
+                isCpaBid
+                isDeleted
+                isPricing
+                isStatus
+                isPromotionId
+                day1={{ placeholder: ['广告创建日期开始', '广告创建日期结束'] }}
+                day2={{ placeholder: ['投放日期开始', '投放日期结束'] }}
+                day3={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, day2, day3, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['adCreateBegin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['adCreateEnd'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['adCreateBegin']
+                        delete newQueryForm['adCreateEnd']
+                    }
+
+                    if (day2 && day2?.length === 2) {
+                        newQueryForm['putDayBegin'] = moment(day2[0]).format('YYYY-MM-DD')
+                        newQueryForm['putDayEnd'] = moment(day2[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['putDayBegin']
+                        delete newQueryForm['putDayEnd']
+                    }
+
+                    if (day3 && day3?.length === 2) {
+                        newQueryForm['costDayBegin'] = moment(day3[0]).format('YYYY-MM-DD')
+                        newQueryForm['costDayEnd'] = moment(day3[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['costDayBegin']
+                        delete newQueryForm['costDayEnd']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12(dayHandle, () => { getDynamicList.refresh() })}
+            configName={'腾讯创意列表'}
+            fixed={{ left: 4, right: 2 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='腾讯创意列表'
+            rowKey={'dynamicCreativeId'}
+            loading={getDynamicList.loading}
+            ajax={getDynamicList}
+            page={getDynamicList?.data?.data?.current || 1}
+            pageSize={getDynamicList?.data?.data?.size || 20}
+            total={getDynamicList?.data?.data?.total || 0}
+            dataSource={getDynamicList?.data?.data?.records?.map((item: any) => ({ ...item, id: item.promotionId }))}
+            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.dynamicCreativeId),
+                getCheckboxProps: (record: any) => ({
+                    disabled: record.dynamicCreativeIsDeleted == 1 || record?.accountId === '总计'
+                }),
+                onSelect: (record: { dynamicCreativeId: number }, selected: boolean) => {
+                    if (selected) {
+                        selectedRows.push({ ...record })
+                        setSelectedRows([...selectedRows])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { dynamicCreativeId: number }) => item.dynamicCreativeId !== record.dynamicCreativeId)
+                        setSelectedRows([...newSelectAccData])
+                    }
+                },
+                onSelectAll: (selected: boolean, selectedRowss: { dynamicCreativeId: number }[], changeRows: { dynamicCreativeId: number }[]) => {
+                    if (selected) {
+                        let newSelectAccData = [...selectedRows]
+                        changeRows.forEach((item: { dynamicCreativeId: number }) => {
+                            let index = newSelectAccData.findIndex((ite: { dynamicCreativeId: number }) => ite.dynamicCreativeId === item.dynamicCreativeId)
+                            if (index === -1) {
+                                newSelectAccData.push({ ...item })
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { dynamicCreativeId: number }) => {
+                            let index = changeRows.findIndex((ite: { dynamicCreativeId: number }) => ite.dynamicCreativeId === item.dynamicCreativeId)
+                            if (index !== -1) {
+                                return false
+                            } else {
+                                return true
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    }
+                }
+            }}
+        />
+
+        {visible && <DayAd
+            iaaApp={initialState?.iaaApp as string}
+            adName={adName}
+            visible={visible}
+            onClose={() => { setVisible(false); setPromotionId(undefined); setDynamicCreativeId(undefined) }}
+            queryForm={queryForm}
+            promotionId={promotionId}
+            dynamicCreativeId={dynamicCreativeId}
+        />}
+
+        {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>}
+    </div>
+}
+
+export default Dynamic

+ 41 - 0
src/pages/iaaData/tencentIaa/dynamic/switchStatus.tsx

@@ -0,0 +1,41 @@
+import { useAjax } from "@/Hook/useAjax"
+import { newEditAdqAdgroupsDataApi, updateBatchDynamicCreativesInfoApi } from "@/services/gameData"
+import { message, notification, Switch } from "antd"
+import React from "react"
+
+
+
+/**
+ * 修改启停
+ */
+interface Props {
+    configuredStatus: string,
+    isDeleted?: boolean,
+    accountId: number,
+    dynamicCreativeId: number,
+    onChange?: () => void
+}
+const SwitchStatus: React.FC<Props> = (prosp) => {
+
+    const { configuredStatus, isDeleted, accountId, dynamicCreativeId, onChange } = prosp
+    const updateBatchDynamicCreativesInfo = useAjax((params) => updateBatchDynamicCreativesInfoApi(params))
+    
+    const switchHandle = (status: boolean) => {
+        updateBatchDynamicCreativesInfo.run({ accountAdgroupMaps: [accountId + ',' + dynamicCreativeId], suspend: !status }).then(res => {
+            message.success(`${configuredStatus === 'AD_STATUS_NORMAL' ? '启动' : '暂停'}成功`)
+            if (res?.fail) {
+                notification.error({
+                    message: `${configuredStatus === 'AD_STATUS_NORMAL' ? '启动' : '暂停'}失败`,
+                    description: `修改失败${res.fail}条,失败的请到任务列表查看`,
+                    duration: 0
+                });
+            }
+            onChange?.()
+        })
+    }
+
+    return <Switch size="small" checked={configuredStatus === 'AD_STATUS_NORMAL'} loading={updateBatchDynamicCreativesInfo.loading} disabled={isDeleted} onChange={(checked) => switchHandle(checked)}/>
+}
+
+
+export default React.memo(SwitchStatus)

+ 593 - 0
src/pages/iaaData/tencentIaa/dynamic/tableConfig.tsx

@@ -0,0 +1,593 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Badge, Progress, Space, Statistic } from "antd"
+import React from "react"
+import { AD_STATUS_ENUM, BID_MODE_ENUM, PRODUCT_TYPE_ENUM } from "../../const"
+import SwitchStatus from "./switchStatus"
+import CreativePreview from "../../components/CreativePreview"
+import { DELIVERY_MODE_Enum } from "./const"
+
+function columns12(dayHandle: (data: any) => void, onChange?: () => void): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+
+    return [
+        {
+            label: '腾讯创意基本信息',
+            data: [
+                {
+                    title: '广告账号', dataIndex: 'accountId', label: '腾讯创意基本信息', align: 'center', width: 80, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '腾讯创意基本信息', align: 'center', width: 80, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '腾讯创意基本信息', align: 'center', width: 100, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '腾讯创意基本信息', align: 'center', width: 100, default: 5,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '腾讯创意基本信息', align: 'center', width: 60, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '创意名称', dataIndex: 'dynamicCreativeName', label: '腾讯创意基本信息', align: 'center', width: 120, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '创意ID', dataIndex: 'dynamicCreativeId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 8,
+                    render: (a: string, b: any) => (b?.accountId === '总计' ? '--' : <WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'promotionName', label: '腾讯创意基本信息', align: 'center', width: 120, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'promotionId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy/>)
+                },
+                {
+                    title: '广告状态', dataIndex: 'status', label: '腾讯创意基本信息', align: 'center', width: 75, default: 11,
+                    render: (a: string) => (<WidthEllipsis value={AD_STATUS_ENUM[a as keyof typeof AD_STATUS_ENUM]} />)
+                },
+                {
+                    title: '投放模式', dataIndex: 'deliveryMode', label: '腾讯创意基本信息', align: 'center', width: 75, 
+                    render: (a: string) => (<WidthEllipsis value={DELIVERY_MODE_Enum[a as keyof typeof DELIVERY_MODE_Enum]} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '腾讯创意基本信息', align: 'center', width: 75, 
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '腾讯创意基本信息', align: 'right', width: 75, sorter: true, default: 12,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '腾讯创意基本信息', align: 'center', width: 70, default: 13,
+                    render: (a: string) => (<WidthEllipsis value={BID_MODE_ENUM[a as keyof typeof BID_MODE_ENUM]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '腾讯创意基本信息', align: 'center', width: 75, default: 14, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '腾讯创意基本信息', align: 'right', width: 75, default: 15,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告日预算', dataIndex: 'budget', label: '腾讯创意基本信息', align: 'right', width: 75, default: 16, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告创建时间', dataIndex: 'adTime', label: '基本信息', align: 'center', width: 140,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告已删除?', dataIndex: 'isDeleted', label: '基本信息', align: 'center', width: 50,
+                    render: (a: number, b: any) => (b?.accountId === '总计' ? '--' : a == 1 ? <Badge status="error" text="是" /> : <Badge status="success" text="否" />)
+                },
+                {
+                    title: '创意已删除?', dataIndex: 'dynamicCreativeIsDeleted', label: '基本信息', align: 'center', width: 50, default: 17,
+                    render: (a: number, b: any) => (b?.accountId === '总计' ? '--' : a == 1 ? <Badge status="error" text="是" /> : <Badge status="success" text="否" />)
+                },
+                {
+                    title: '创意创建时间', dataIndex: 'dynamicCreativeCreatedTime', label: '基本信息', align: 'center', width: 140,
+                    render: (a: string, b: any) => (<WidthEllipsis value={b?.accountId === '总计' ? '--' : `${a}`} />)
+                },
+                {
+                    title: '投放日期', dataIndex: 'startTime', label: '基本信息', align: 'center', width: 180, default: 18,
+                    render: (a: string, b: any) => (<WidthEllipsis value={b?.accountId === '总计' ? '--' : `${a}-${b?.endTime}`} />)
+                },
+                {
+                    title: '消耗时间', dataIndex: 'dt', label: '基本信息', align: 'center', width: 90, default: 19,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '今日消耗', dataIndex: 'cost', label: '腾讯创意基本信息', align: 'center', width: 85, default: 20, 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: 21, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            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: 'validClickCount', label: '腾讯创意基本信息', align: 'center', width: 70, default: 22, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '腾讯创意基本信息', align: 'center', width: 70, default: 23, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '腾讯创意基本信息', align: 'center', width: 70, default: 24, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '腾讯创意基本信息', align: 'right', width: 65, default: 25, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '腾讯创意基本信息', align: 'center', width: 65, default: 26, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标', dataIndex: 'convertTarget', label: '基本信息', align: 'center', width: 65, default: 27, sorter: true,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '转化目标量', dataIndex: 'conversionsCount', label: '基本信息', align: 'center', width: 65, default: 28, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '基本信息', align: 'center', width: 65, default: 29, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标率', dataIndex: 'convertRate', label: '腾讯创意基本信息', align: 'center', width: 70, default: 30, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册人数', dataIndex: 'miniGameRegisterUsers', label: '基本信息', align: 'center', width: 80, default: 31, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册成本', dataIndex: 'miniGameRegisterCost', label: '基本信息', align: 'center', width: 80, default: 32, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册率', dataIndex: 'miniGameRegisterRate', label: '腾讯创意基本信息', align: 'center', width: 75, default: 33, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '创意预览', dataIndex: 'dynamicCreativeVOList', label: '腾讯创意基本信息', width: 150, default: 34,
+                    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: 'IAA补充指标',
+            data: [
+                {
+                    title: '首日ROI', dataIndex: 'firstRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '24小时ROI', dataIndex: 'twentyFourHoursRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '总ROI', dataIndex: 'totalRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告总ROI', dataIndex: 'promotionTotalRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: '其他业务(平台上报指标)',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU(平台上报)', dataIndex: 'firstDayAdPurArppuCost24hPla', label: '其他业务(平台上报指标)', width: 130, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    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: '其他业务(其他指标)',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost24h', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现ARPPU', dataIndex: 'adMonetizationArppu', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    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: '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: 'APP激活次数', dataIndex: 'activatedCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'APP点击激活率', dataIndex: 'clickActivatedRate', 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: 'APP激活成本', dataIndex: 'activatedCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    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} />
+                },
+                {
+                    title: '3日留存人数', dataIndex: 'appRetentionD3Uv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存成本(人数)', dataIndex: 'appRetentionD3Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日留存率(人数)', dataIndex: 'appRetentionD3Rate', 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: '5日留存人数', dataIndex: 'appRetentionD5Uv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存成本(人数)', dataIndex: 'appRetentionD5Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '5日留存率(人数)', dataIndex: 'appRetentionD5Rate', 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日留存人数', dataIndex: 'appRetentionD7Uv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存成本(人数)', dataIndex: 'appRetentionD7Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日留存率(人数)', dataIndex: 'appRetentionD7Rate', 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="%" />
+                },
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            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: 'miniGameIncomeRoi1', 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: '操作',
+            data: [
+                {
+                    title: '操作', dataIndex: 'cz', label: '操作', align: 'center', width: 150, default: 35,
+                    render: (_: number, b: any) => {
+                        if (b?.accountId === '总计') return '--'
+                        return <Space>
+                            <a onClick={() => dayHandle(b)}>创意每日监控</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.promotionId}%22}`)
+                            }}>腾讯广告</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?.dynamicCreativeIsDeleted == 1} accountId={b?.accountId} dynamicCreativeId={b?.dynamicCreativeId} onChange={onChange} />
+                    }
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 544 - 0
src/pages/iaaData/tencentIaa/dynamic/tableConfigDay.tsx

@@ -0,0 +1,544 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Badge, Progress, Statistic } from "antd"
+import React from "react"
+import { AD_STATUS_ENUM, BID_MODE_ENUM, PRODUCT_TYPE_ENUM } from "../../const"
+import CreativePreview from "../../components/CreativePreview"
+import { DELIVERY_MODE_Enum } from "./const"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+
+    return [
+        {
+            label: '腾讯创意基本信息',
+            data: [
+                {
+                    title: '广告账号', dataIndex: 'accountId', label: '腾讯创意基本信息', align: 'center', width: 80, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '腾讯创意基本信息', align: 'center', width: 80, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '腾讯创意基本信息', align: 'center', width: 100, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '腾讯创意基本信息', align: 'center', width: 100, default: 5,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '腾讯创意基本信息', align: 'center', width: 60, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '创意名称', dataIndex: 'dynamicCreativeName', label: '腾讯创意基本信息', align: 'center', width: 120, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '创意ID', dataIndex: 'dynamicCreativeId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 8,
+                    render: (a: string, b: any) => (b?.accountId === '总计' ? '--' : <WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'promotionName', label: '腾讯创意基本信息', align: 'center', width: 120, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'promotionId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy/>)
+                },
+                {
+                    title: '广告状态', dataIndex: 'status', label: '腾讯创意基本信息', align: 'center', width: 75, default: 11,
+                    render: (a: string) => (<WidthEllipsis value={AD_STATUS_ENUM[a as keyof typeof AD_STATUS_ENUM]} />)
+                },
+                {
+                    title: '投放模式', dataIndex: 'deliveryMode', label: '腾讯创意基本信息', align: 'center', width: 75, 
+                    render: (a: string) => (<WidthEllipsis value={DELIVERY_MODE_Enum[a as keyof typeof DELIVERY_MODE_Enum]} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '腾讯创意基本信息', align: 'center', width: 75, 
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '腾讯创意基本信息', align: 'right', width: 75, sorter: true, default: 12,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '腾讯创意基本信息', align: 'center', width: 70, default: 13,
+                    render: (a: string) => (<WidthEllipsis value={BID_MODE_ENUM[a as keyof typeof BID_MODE_ENUM]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '腾讯创意基本信息', align: 'center', width: 75, default: 14, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '腾讯创意基本信息', align: 'right', width: 75, default: 15,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告日预算', dataIndex: 'budget', label: '腾讯创意基本信息', align: 'right', width: 75, default: 16, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告创建时间', dataIndex: 'adTime', label: '基本信息', align: 'center', width: 140,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告已删除?', dataIndex: 'isDeleted', label: '基本信息', align: 'center', width: 50,
+                    render: (a: number, b: any) => (b?.accountId === '总计' ? '--' : a === 1 ? <Badge status="error" text="是" /> : <Badge status="success" text="否" />)
+                },
+                {
+                    title: '创意已删除?', dataIndex: 'dynamicCreativeIsDeleted', label: '基本信息', align: 'center', width: 50, default: 17,
+                    render: (a: number, b: any) => (b?.accountId === '总计' ? '--' : a === 1 ? <Badge status="error" text="是" /> : <Badge status="success" text="否" />)
+                },
+                {
+                    title: '创意创建时间', dataIndex: 'dynamicCreativeCreatedTime', label: '基本信息', align: 'center', width: 140,
+                    render: (a: string, b: any) => (<WidthEllipsis value={b?.accountId === '总计' ? '--' : `${a}`} />)
+                },
+                {
+                    title: '投放日期', dataIndex: 'startTime', label: '基本信息', align: 'center', width: 180, default: 18,
+                    render: (a: string, b: any) => (<WidthEllipsis value={b?.accountId === '总计' ? '--' : `${a}-${b?.endTime}`} />)
+                },
+                {
+                    title: '消耗时间', dataIndex: 'dt', label: '基本信息', align: 'center', width: 90, default: 19,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '今日消耗', dataIndex: 'cost', label: '腾讯创意基本信息', align: 'center', width: 85, default: 20, 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: 21, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            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: 'validClickCount', label: '腾讯创意基本信息', align: 'center', width: 70, default: 22, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '腾讯创意基本信息', align: 'center', width: 70, default: 23, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '腾讯创意基本信息', align: 'center', width: 70, default: 24, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '腾讯创意基本信息', align: 'right', width: 65, default: 25, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '腾讯创意基本信息', align: 'center', width: 65, default: 26, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标', dataIndex: 'convertTarget', label: '基本信息', align: 'center', width: 65, default: 27, sorter: true,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '转化目标量', dataIndex: 'conversionsCount', label: '基本信息', align: 'center', width: 65, default: 28, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '基本信息', align: 'center', width: 65, default: 29, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标率', dataIndex: 'convertRate', label: '腾讯创意基本信息', align: 'center', width: 70, default: 30, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册人数', dataIndex: 'miniGameRegisterUsers', label: '基本信息', align: 'center', width: 80, default: 31, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册成本', dataIndex: 'miniGameRegisterCost', label: '基本信息', align: 'center', width: 80, default: 32, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册率', dataIndex: 'miniGameRegisterRate', label: '腾讯创意基本信息', align: 'center', width: 75, default: 33, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: 'IAA补充指标',
+            data: [
+                {
+                    title: '首日ROI', dataIndex: 'firstRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '24小时ROI', dataIndex: 'twentyFourHoursRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '总ROI', dataIndex: 'totalRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告总ROI', dataIndex: 'promotionTotalRoi', label: 'IAA补充指标', align: 'center', width: 80, sorter: true, className: 'redColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: '其他业务(平台上报指标)',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU(平台上报)', dataIndex: 'firstDayAdPurArppuCost24hPla', label: '其他业务(平台上报指标)', width: 130, align: 'center', sorter: true, className: 'green2ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    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: '其他业务(其他指标)',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost24h', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现ARPPU', dataIndex: 'adMonetizationArppu', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    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: '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: 'APP激活次数', dataIndex: 'activatedCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'APP点击激活率', dataIndex: 'clickActivatedRate', 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: 'APP激活成本', dataIndex: 'activatedCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    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} />
+                },
+                {
+                    title: '3日留存人数', dataIndex: 'appRetentionD3Uv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存成本(人数)', dataIndex: 'appRetentionD3Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日留存率(人数)', dataIndex: 'appRetentionD3Rate', 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: '5日留存人数', dataIndex: 'appRetentionD5Uv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存成本(人数)', dataIndex: 'appRetentionD5Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '5日留存率(人数)', dataIndex: 'appRetentionD5Rate', 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日留存人数', dataIndex: 'appRetentionD7Uv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存成本(人数)', dataIndex: 'appRetentionD7Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日留存率(人数)', dataIndex: 'appRetentionD7Rate', 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="%" />
+                },
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            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: 'miniGameIncomeRoi1', 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="%" />
+                },
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 3 - 3
src/pages/iaaSystem/manage/application/index.tsx

@@ -48,10 +48,10 @@ const Application: React.FC = () => {
             if (res?.data) {
                 let newAppList: DefaultOptionType[] = []
                 let newAppObj: any = {}
-                res.data.forEach((item: { name: any; id: any; }) => {
-                    newAppList.push({ label: item.name, value: item.id })
+                res.data.forEach((item: { name: any; id: any; mediaPlatform: string }) => {
+                    newAppList.push({ label: item.name + `(${item.mediaPlatform === 'MEDIA_PLATFORM_OCENAENGINE' ? '头条' : '腾讯'})`, value: item.id })
                     newAppObj[item.id] = {
-                        text: item.name
+                        text: item.name + `(${item.mediaPlatform === 'MEDIA_PLATFORM_OCENAENGINE' ? '头条' : '腾讯'})`
                     }
                 })
                 setAppList(newAppList)

+ 1 - 1
src/pages/iaaSystem/manage/application/tableConfig.tsx

@@ -68,7 +68,7 @@ const tableConfig = (handleEdit: (data: any) => void, userObj: any, appObj: any)
             title: '操作',
             key: 'option',
             valueType: 'option',
-            render: (_, row, index, action) => [
+            render: (_: any, row: { id: number; }, index: any, action: { reload: () => void; }) => [
                 <a key={'xg'} onClick={() => { handleEdit(row); }} >编辑</a>,
                 <div key={'delete'}><DelApp
                     id={row.id}

+ 12 - 0
src/services/gameData/index.ts

@@ -225,4 +225,16 @@ export async function newEditAdqAdgroupsDataApi(data: EditAdqAdgroupsProps) {
         method: 'POST',
         data
     });
+}
+
+/**
+ * 批量修改创意信息
+ * @param data 
+ * @returns 
+ */
+export async function updateBatchDynamicCreativesInfoApi(data: any) {
+    return request(api + '/adq/adgroup/updateBatchDynamicCreativesInfo', {
+        method: 'PUT',
+        data
+    });
 }

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

@@ -70,6 +70,7 @@ export async function getGDTListApi(data: GetGDTListProps) {
 }
 
 
+
 export interface GetGDTDailyListProps extends Paging, SortProps {
     promotionId: number,
     costDayBegin?: string,
@@ -96,6 +97,64 @@ export async function getGDTTotalApi(data: GetGDTListProps) {
 }
 
 
+export interface GetDynamicListProps extends Paging, SortProps {
+    accountId?: string
+    putUserIdList?: number[]   // 投手ID列表
+    promotionId?: number       // 广告ID
+    promotionName?: string     // 广告账名称
+    status?: string            // 广告状态
+    cpaBid?: number            // 当前出价
+    pricing?: string           // 出价方式
+    adCreateBegin?: string     // 广告创建时间
+    adCreateEnd?: string
+    deleted?: boolean          // 删除状态
+    putDayBegin?: string       // 投放时间
+    putDayEnd?: string
+    costDayBegin?: string      // 消耗时间
+    costDayEnd?: string
+    dynamicCreativeId?: number // 创意ID
+}
+/**
+ * 腾讯创意列表
+ * @param data 
+ * @returns 
+ */
+export async function getDynamicListApi(data: GetDynamicListProps) {
+    return request(wapi + `/monitor/creative/listOfPage`, {
+        method: 'POST',
+        data
+    });
+}
+
+/**
+ * 腾讯创意列表总计
+ * @param data 
+ * @returns 
+ */
+export async function getDynamicTotalApi(data: GetDynamicListProps) {
+    return request(wapi + `/monitor/creative/total`, {
+        method: 'POST',
+        data
+    });
+}
+
+export interface GetGDTDynamicDayListProps extends Paging, SortProps {
+    promotionId: number,
+    dynamicCreativeId: number,
+    costDayBegin?: string,
+    costDayEnd?: string
+}
+/**
+ * 每日
+ * @param data 
+ * @returns 
+ */
+export async function getGDTDynamicDayListApi(data: GetGDTDynamicDayListProps) {
+    return request(wapi + `/monitor/creative/daily/detail`, {
+        method: 'POST',
+        data
+    });
+}
 
 export interface GetAppTxEveryDayListProps extends Paging, SortProps {
     costDayBegin?: string