wjx 7 bulan lalu
induk
melakukan
32dc6b4c4b
60 mengubah file dengan 11646 tambahan dan 62 penghapusan
  1. 102 1
      config/routerConfig.ts
  2. 64 7
      src/app.tsx
  3. 3 0
      src/components/QueryForm/index.tsx
  4. 415 0
      src/components/QueryForm/queryFormNovel.tsx
  5. 152 46
      src/components/RightContent/index.tsx
  6. 7 0
      src/pages/iaaData/components/TimeSeriesLook/const.ts
  7. 71 0
      src/pages/iaaData/components/TimeSeriesLook/index.tsx
  8. 177 0
      src/pages/iaaData/const.tsx
  9. 94 0
      src/pages/iaaData/game/ocenaengine/adList/dayAd.tsx
  10. 7 0
      src/pages/iaaData/game/ocenaengine/adList/index.less
  11. 250 0
      src/pages/iaaData/game/ocenaengine/adList/index.tsx
  12. 566 0
      src/pages/iaaData/game/ocenaengine/adList/tableConfig.tsx
  13. 539 0
      src/pages/iaaData/game/ocenaengine/adList/tableConfigDay.tsx
  14. 99 0
      src/pages/iaaData/game/ocenaengine/appEveryDayData/index.tsx
  15. 700 0
      src/pages/iaaData/game/ocenaengine/appEveryDayData/tableConfig.tsx
  16. 49 0
      src/pages/iaaData/game/tencent/adList/const.tsx
  17. 94 0
      src/pages/iaaData/game/tencent/adList/dayAd.tsx
  18. 0 0
      src/pages/iaaData/game/tencent/adList/index.less
  19. 214 0
      src/pages/iaaData/game/tencent/adList/index.tsx
  20. 40 0
      src/pages/iaaData/game/tencent/adList/switchStatus.tsx
  21. 592 0
      src/pages/iaaData/game/tencent/adList/tableConfig.tsx
  22. 390 0
      src/pages/iaaData/game/tencent/adList/tableConfigDay.tsx
  23. 99 0
      src/pages/iaaData/game/tencent/appCashAssay/index.tsx
  24. 213 0
      src/pages/iaaData/game/tencent/appCashAssay/tableConfig.tsx
  25. 12 0
      src/pages/iaaData/game/tencent/appCashRetained/index.less
  26. 100 0
      src/pages/iaaData/game/tencent/appCashRetained/index.tsx
  27. 163 0
      src/pages/iaaData/game/tencent/appCashRetained/tableConfig.tsx
  28. 12 0
      src/pages/iaaData/game/tencent/appCashTrend/index.less
  29. 100 0
      src/pages/iaaData/game/tencent/appCashTrend/index.tsx
  30. 165 0
      src/pages/iaaData/game/tencent/appCashTrend/tableConfig.tsx
  31. 99 0
      src/pages/iaaData/game/tencent/appEveryDayData/index.tsx
  32. 535 0
      src/pages/iaaData/game/tencent/appEveryDayData/tableConfig.tsx
  33. 55 0
      src/pages/iaaData/game/tencent/dynamic/const.tsx
  34. 98 0
      src/pages/iaaData/game/tencent/dynamic/dayAd.tsx
  35. 0 0
      src/pages/iaaData/game/tencent/dynamic/index.less
  36. 265 0
      src/pages/iaaData/game/tencent/dynamic/index.tsx
  37. 41 0
      src/pages/iaaData/game/tencent/dynamic/switchStatus.tsx
  38. 593 0
      src/pages/iaaData/game/tencent/dynamic/tableConfig.tsx
  39. 543 0
      src/pages/iaaData/game/tencent/dynamic/tableConfigDay.tsx
  40. 100 0
      src/pages/iaaData/game/tencent/pitcherEveryDay/index.tsx
  41. 300 0
      src/pages/iaaData/game/tencent/pitcherEveryDay/tableConfig.tsx
  42. 49 0
      src/pages/iaaData/novel/tencent/adList/const.tsx
  43. 94 0
      src/pages/iaaData/novel/tencent/adList/dayAd.tsx
  44. 0 0
      src/pages/iaaData/novel/tencent/adList/index.less
  45. 227 0
      src/pages/iaaData/novel/tencent/adList/index.tsx
  46. 40 0
      src/pages/iaaData/novel/tencent/adList/switchStatus.tsx
  47. 659 0
      src/pages/iaaData/novel/tencent/adList/tableConfig.tsx
  48. 520 0
      src/pages/iaaData/novel/tencent/adList/tableConfigDay.tsx
  49. 55 0
      src/pages/iaaData/novel/tencent/dynamic/const.tsx
  50. 98 0
      src/pages/iaaData/novel/tencent/dynamic/dayAd.tsx
  51. 0 0
      src/pages/iaaData/novel/tencent/dynamic/index.less
  52. 259 0
      src/pages/iaaData/novel/tencent/dynamic/index.tsx
  53. 41 0
      src/pages/iaaData/novel/tencent/dynamic/switchStatus.tsx
  54. 678 0
      src/pages/iaaData/novel/tencent/dynamic/tableConfig.tsx
  55. 605 0
      src/pages/iaaData/novel/tencent/dynamic/tableConfigDay.tsx
  56. 11 0
      src/pages/iaaData/playlet/tencent/adList/index.tsx
  57. 12 0
      src/pages/iaaData/playlet/tencent/dynamic/index.tsx
  58. 5 5
      src/pages/user/login/index.tsx
  59. 134 2
      src/services/iaaData/index.ts
  60. 41 1
      src/utils/utils.ts

+ 102 - 1
config/routerConfig.ts

@@ -120,6 +120,104 @@ const iaaSystem = {
     ]
 }
 
+const iaaGameData = [
+    {
+        path: '/iaaData/game/tencent',
+        name: '腾讯',
+        routes: [
+            {
+                path: '/iaaData/game/tencent/adList',
+                name: '广告列表',
+                component: './iaaData/game/tencent/adList',
+            },
+            {
+                path: '/iaaData/game/tencent/dynamic',
+                name: '创意列表',
+                component: './iaaData/game/tencent/dynamic',
+            },
+            {
+                path: '/iaaData/game/tencent/appEveryDayData',
+                name: '应用每日数据',
+                component: './iaaData/game/tencent/appEveryDayData',
+            },
+            {
+                path: '/iaaData/game/tencent/appCashTrend',
+                name: '应用变现趋势',
+                component: './iaaData/game/tencent/appCashTrend',
+            },
+            {
+                path: '/iaaData/game/tencent/appCashRetained',
+                name: '应用变现留存',
+                component: './iaaData/game/tencent/appCashRetained',
+            },
+            {
+                path: '/iaaData/game/tencent/appCashAssay',
+                name: '应用变现分析',
+                component: './iaaData/game/tencent/appCashAssay',
+            },
+            {
+                path: '/iaaData/game/tencent/pitcherEveryDay',
+                name: '投手每日数据',
+                component: './iaaData/game/tencent/pitcherEveryDay',
+            },
+        ]
+    },
+    {
+        path: '/iaaData/game/ocenaengine',
+        name: '头条',
+        routes: [
+            {
+                path: '/iaaData/game/ocenaengine/adList',
+                name: '广告列表',
+                component: './iaaData/game/ocenaengine/adList',
+            },
+            {
+                path: '/iaaData/game/ocenaengine/appEveryDayData',
+                name: '应用每日数据',
+                component: './iaaData/game/ocenaengine/appEveryDayData',
+            }
+        ]
+    }
+]
+
+const iaaNovelData = [
+    {
+        path: '/iaaData/novel/tencent',
+        name: '腾讯',
+        routes: [
+            {
+                path: '/iaaData/novel/tencent/adList',
+                name: '广告列表',
+                component: './iaaData/novel/tencent/adList',
+            },
+            {
+                path: '/iaaData/novel/tencent/dynamic',
+                name: '创意列表',
+                component: './iaaData/novel/tencent/dynamic',
+            }
+        ]
+    }
+]
+
+const iaaPlayletData = [
+    {
+        path: '/iaaData/playlet/tencent',
+        name: '腾讯',
+        routes: [
+            {
+                path: '/iaaData/playlet/tencent/adList',
+                name: '广告列表',
+                component: './iaaData/playlet/tencent/adList',
+            },
+            {
+                path: '/iaaData/playlet/tencent/dynamic',
+                name: '创意列表',
+                component: './iaaData/playlet/tencent/dynamic',
+            }
+        ]
+    }
+]
+
 const iaaData = {
     path: '/iaaData',
     routes: [
@@ -179,7 +277,10 @@ const iaaData = {
                     component: './iaaData/ocenaengineIaa/appEveryDayData',
                 }
             ]
-        }
+        },
+        ...iaaGameData,
+        ...iaaNovelData,
+        ...iaaPlayletData
     ]
 }
 

+ 64 - 7
src/app.tsx

@@ -83,6 +83,23 @@ export async function getInitialState(): Promise<{
                 let path = getMyMenu(code, newData)
                 return { data: path }
             });
+            let newMenu: any[] = []
+            // 处理数据路由
+            menu.data?.forEach((item: any) => {
+                if (item?.path === '/iaaData') {
+                    let iaaR: any[] = []
+                    item.routes.forEach((r: any) => {
+                        if (['/iaaData/game', '/iaaData/novel', '/iaaData/playlet'].includes(r.path)) {
+                            iaaR.push(...r.routes)
+                        } else {
+                            iaaR.push(r)
+                        }
+                    })
+                    item.routes = iaaR
+                }
+                newMenu.push(item)
+            })
+            menu.data = newMenu
             localStorage.setItem('sex', userInfo?.data?.userInfo?.sex)
             localStorage.setItem('userId', userInfo?.data?.userInfo?.userId)
             localStorage.setItem('name', userInfo?.data?.userInfo?.nickname)
@@ -146,31 +163,71 @@ const IconMap = {
 };
 
 //处理菜单
-const loopMenuItem = (menus: MenuDataItem[]): MenuDataItem[] => {
-    let mediaPlatform = sessionStorage.getItem('mediaPlatform')
+const loopMenuItem = (menus: MenuDataItem[], mediaPlatform?: string, productType?: string): MenuDataItem[] => {
     let menu = menus?.map(({ icon, routes, roles, ...item }) => {
         let newItem = JSON.parse(JSON.stringify(item))
         newItem.key = item?.path || item?.key
+        let isHideInMenu = false
+        if (location.hash.includes('/iaaData') && newItem.key !== '/iaaSystem' && newItem.key !== "/iaaData") {
+            if (newItem.key.includes('/iaaData/game/tencent')) {
+                isHideInMenu = false
+            } else {
+                isHideInMenu = true
+            }
+        }
+        if (newItem.key.includes('/iaaData/') && productType && mediaPlatform) {
+            switch (productType) {
+                case 'PRODUCT_TYPE_GAME':
+                    if (mediaPlatform === 'MEDIA_PLATFORM_TENCENT' && newItem.key.includes('/iaaData/game/tencent')) {
+                        isHideInMenu = false
+                    } else if (mediaPlatform === 'MEDIA_PLATFORM_OCENAENGINE' && newItem.key.includes('/iaaData/game/ocenaengine')) {
+                        isHideInMenu = false
+                    } else {
+                        isHideInMenu = true
+                    }
+                    break
+                case 'PRODUCT_TYPE_NOVEL':
+                    if (mediaPlatform === 'MEDIA_PLATFORM_TENCENT' && newItem.key.includes('/iaaData/novel/tencent')) {
+                        isHideInMenu = false
+                    } else if (mediaPlatform === 'MEDIA_PLATFORM_OCENAENGINE' && newItem.key.includes('/iaaData/novel/ocenaengine')) {
+                        isHideInMenu = false
+                    } else {
+                        isHideInMenu = true
+                    }
+                    break
+                case 'PRODUCT_TYPE_PLAYLET':
+                    if (mediaPlatform === 'MEDIA_PLATFORM_TENCENT' && newItem.key.includes('/iaaData/playlet/tencent')) {
+                        isHideInMenu = false
+                    } else if (mediaPlatform === 'MEDIA_PLATFORM_OCENAENGINE' && newItem.key.includes('/iaaData/playlet/ocenaengine')) {
+                        isHideInMenu = false
+                    } else {
+                        isHideInMenu = true
+                    }
+                    break
+            }
+        }
         return {
             ...newItem,
-            hideInMenu: newItem.key.includes('/iaaData/') ? (mediaPlatform === 'MEDIA_PLATFORM_TENCENT' ? newItem.key.includes('/iaaData/tencentIaa') ? false : true : newItem.key.includes("/iaaData/ocenaengineIaa") ? false : true) : false,//校验隐藏菜单
+            hideInMenu: isHideInMenu,//校验隐藏菜单
             icon: icon && IconMap[icon as keyof typeof IconMap],
-            children: routes && loopMenuItem(routes),
+            children: routes && loopMenuItem(routes, mediaPlatform, productType),
         }
     })
     return menu
 }
 
-export const layout = ({ initialState }: { initialState: { settings?: LayoutSettings; currentUser?: CurrentUser; menu?: any; loading: boolean, collapsed: string, onCollapse: any, mediaPlatform?: string }; }): BasicLayoutProps => {
+
+export const layout = ({ initialState }: { initialState: { settings?: LayoutSettings; currentUser?: CurrentUser; menu?: any; loading: boolean, collapsed: string, onCollapse: any, mediaPlatform?: string, iaaApp?: string }; }): BasicLayoutProps => {
 
     return {
         menu: {
             locale: false,//关闭国际化
             params: {//token变化重新获取
-                mediaPlatform: initialState.mediaPlatform
+                mediaPlatform: initialState?.mediaPlatform,
+                productType: initialState?.iaaApp?.split('||')?.[1]
             },
             request: async () => {
-                return loopMenuItem(initialState?.menu?.data || [])
+                return loopMenuItem(initialState?.menu?.data || [], initialState?.mediaPlatform, initialState?.iaaApp?.split('||')?.[1])
             },
         },
         rightContentRender: () => <RightContent />,

+ 3 - 0
src/components/QueryForm/index.tsx

@@ -196,16 +196,19 @@ const QueryForm: React.FC<Props> = (props) => {
 
             {/* 日期选择框 */}
             {day1 && <Col><Form.Item name='day1'>
+                {/* @ts-ignore */}
                 <DatePicker.RangePicker style={{ width: 250 }} {...day1} />
             </Form.Item></Col>}
 
             {/* 日期选择框 */}
             {day2 && <Col><Form.Item name='day2'>
+                {/* @ts-ignore */}
                 <DatePicker.RangePicker style={{ width: 250 }} {...day2} />
             </Form.Item></Col>}
 
             {/* 日期选择框 */}
             {day3 && <Col><Form.Item name='day3'>
+                {/* @ts-ignore */}
                 <DatePicker.RangePicker style={{ width: 250 }} {...day3} />
             </Form.Item></Col>}
 

+ 415 - 0
src/components/QueryForm/queryFormNovel.tsx

@@ -0,0 +1,415 @@
+import { useAjax } from "@/Hook/useAjax"
+import { AD_STATUS_ENUM, BID_MODE_ENUM, MARKETING_GOAL_ENUM, MARKETING_TARGET_TYPE_ENUM, OPTIMIZATIONGOAL_ENUM, PromotedObjectType } from "@/pages/iaaData/const"
+import { getPutUserListApi } from "@/services/iaaData"
+import { Button, Col, Form, Row, Space, DatePicker, Select, Input, InputNumber } from "antd"
+import { RangePickerProps } from "antd/lib/date-picker"
+import React, { useEffect, useState } from "react"
+
+interface Props {
+    onChange?: (data: any) => void
+    /** 默认值 */
+    initialValues?: any
+
+    /** 是否开启 广告账号 搜索 */
+    isAccountId?: boolean
+    /** 是否开启 当前出价 搜索 */
+    isCpaBid?: boolean
+    /** 是否开启 广告名称 搜索 */
+    isAdgroupName?: boolean
+    /** 是否开启 广告ID 搜索 */
+    isAdgroupId?: boolean
+    /** 是否开启 创意名称 搜索 */
+    isDynamicCreativeName?: boolean
+    /** 是否开启 创意ID 搜索 */
+    isDynamicCreativeId?: boolean
+
+    /** 是否开启 腾讯备注 搜索 */
+    isMemo?: boolean
+    /** 是否开启 本地备注 搜索 */
+    isRemark?: boolean
+
+    /** 是否开启 投手 搜索 */
+    isPutUserId?: boolean
+    /** 是否开启 出价方式 搜索 */
+    isPricing?: boolean,
+    /** 是否开启 广告状态 搜索 */
+    isStatus?: boolean,
+    /** 是否开启 删除状态 搜索 */
+    isDeleted?: boolean,
+    /** 是否开启 是否深度优化 搜索 */
+    isDeepConversionSpec?: boolean,
+    /** 是否开启 启用禁用状态 搜索 */
+    isConfiguredStatus?: boolean,
+
+    /** 是否开启 营销目的 搜索 */
+    isMarketingGoal?: boolean,
+    /** 是否开启 营销目的 搜索 */
+    isMarketingTargetType?: boolean,
+    /** 是否开启 推广目标类型 搜索 */
+    isPromotedObjectType?: boolean,
+    /** 是否开启 推广目标名称 搜索 */
+    isPromotedObjectName?: boolean,
+    /** 是否开启 优化目标类型 搜索 */
+    isOptimizationGoal?: boolean,
+    /** 是否开启 投放模式 搜索 */
+    isDeliveryMode?: boolean,
+
+
+    /** 是否开启 日期 搜索 */
+    day1?: RangePickerProps
+    /** 是否开启 日期 搜索 */
+    day2?: RangePickerProps
+    /** 是否开启 日期 搜索 */
+    day3?: RangePickerProps
+
+    /** 是否开启 最小总消耗 搜索 */
+    isCostTotalMin?: boolean
+    /** 是否开启 最低总千次曝光成本 搜索 */
+    isThousandDisplayPriceTotalMin?: boolean
+    /** 是否开启 最低转化数 搜索 */
+    isConversionsCountTotalMin?: boolean
+    /** 是否开启 激活首日广告变现ROI 搜索 */
+    isIncomeRoi1?: boolean
+    /** 是否开启 注册成本 搜索 */
+    isRegCost?: boolean
+    /** 是否开启 注册成本(平台上报+广告主上报 搜索 */
+    isRegCostPla?: boolean
+    /** 是否开启 点击均价 搜索 */
+    isCpc?: boolean
+}
+/**
+ * 游戏数据系统 请求参数
+ * @returns 
+ */
+const QueryFormNovel: React.FC<Props> = (props) => {
+
+    /**************************/
+    const {
+        onChange, initialValues, isAccountId, isAdgroupName, isAdgroupId, isDynamicCreativeName, isDynamicCreativeId, isMemo, isRemark, isCpaBid, isPutUserId, isPricing, isStatus, isMarketingGoal, isMarketingTargetType, isPromotedObjectType, isPromotedObjectName, isOptimizationGoal, isDeliveryMode, isDeleted, isDeepConversionSpec, isConfiguredStatus, day1, day2, day3,
+        isCostTotalMin, isThousandDisplayPriceTotalMin, isConversionsCountTotalMin, isIncomeRoi1, isRegCost, isRegCostPla, isCpc
+    } = props
+    const [form] = Form.useForm()
+    const [putUserList, setPutUserList] = useState<{ label: string, value: string }[]>([])
+
+    const getPutUserList = useAjax(() => getPutUserListApi())
+    /**************************/
+
+    useEffect(() => {
+        if (isPutUserId) {
+            getPutUserList.run().then(res => {
+                if (res?.data) {
+                    setPutUserList(Object.keys(res.data).map(key => ({ value: key, label: res.data[key] })))
+                }
+            })
+        }
+        () => {
+
+        }
+    }, [isPutUserId])
+
+    const onFinish = (data: any) => {
+        console.log('更新了字段---->', data);
+        onChange && onChange(data)
+    }
+
+    return <Form layout="inline" className='queryForm' initialValues={initialValues} name="basic" form={form} onFinish={onFinish}>
+        <Row gutter={[0, 6]}>
+
+            {/* 广告账号 */}
+            {isAccountId && <Col><Form.Item name='accountId'>
+                <Input placeholder="广告账号" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 广告名称 */}
+            {isAdgroupName && <Col><Form.Item name='adgroupName'>
+                <Input placeholder="广告名称" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 广告ID */}
+            {isAdgroupId && <Col><Form.Item name='adgroupId'>
+                <Input placeholder="广告ID" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 创意名称 */}
+            {isDynamicCreativeName && <Col><Form.Item name='dynamicCreativeName'>
+                <Input placeholder="创意名称" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 创意ID */}
+            {isDynamicCreativeId && <Col><Form.Item name='dynamicCreativeId'>
+                <Input placeholder="创意ID" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 腾讯备注 */}
+            {isMemo && <Col><Form.Item name='memo'>
+                <Input placeholder="腾讯备注" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 腾讯备注 */}
+            {isRemark && <Col><Form.Item name='remark'>
+                <Input placeholder="本地备注" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 出价 */}
+            {isCpaBid && <Col><Form.Item name='cpaBid'>
+                <InputNumber placeholder="出价" style={{ width: 120 }} />
+            </Form.Item></Col>}
+
+            {/* 投手 */}
+            {isPutUserId && <Col><Form.Item name='putUserId'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ minWidth: 120 }}
+                    placeholder={'投手'}
+                    filterOption={(input, option) =>
+                        (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    maxTagCount={1}
+                    loading={getPutUserList.loading}
+                    options={putUserList}
+                />
+            </Form.Item></Col>}
+
+            {/* 出价方式 */}
+            {isPricing && <Col><Form.Item name='pricing'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ width: 120 }}
+                    placeholder={'出价方式'}
+                    filterOption={(input, option) =>
+                        (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    options={Object.keys(BID_MODE_ENUM).map(key => ({ label: BID_MODE_ENUM[key as keyof typeof BID_MODE_ENUM], value: key }))}
+                />
+            </Form.Item></Col>}
+
+
+            {/* 广告状态 */}
+            {isStatus && <Col><Form.Item name='status'>
+                <Select
+                    showSearch
+                    allowClear
+                    mode="multiple"
+                    style={{ width: 120 }}
+                    placeholder={'广告状态'}
+                    filterOption={(input, option) =>
+                        (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    options={Object.keys(AD_STATUS_ENUM).map(key => ({ label: AD_STATUS_ENUM[key as keyof typeof AD_STATUS_ENUM], value: key }))}
+                />
+            </Form.Item></Col>}
+
+            {/* 营销目的 */}
+            {isMarketingGoal && <Col><Form.Item name='marketingGoal'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ width: 120 }}
+                    placeholder={'营销目的'}
+                    filterOption={(input, option) =>
+                        (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    options={Object.keys(MARKETING_GOAL_ENUM).map(key => ({ label: MARKETING_GOAL_ENUM[key as keyof typeof MARKETING_GOAL_ENUM], value: key }))}
+                />
+            </Form.Item></Col>}
+
+            {/* 推广内容资产类型 */}
+            {isMarketingTargetType && <Col><Form.Item name='marketingTargetType'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ width: 120 }}
+                    placeholder={'推广内容资产类型'}
+                    filterOption={(input, option) =>
+                        (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    options={Object.keys(MARKETING_TARGET_TYPE_ENUM).map(key => ({ label: MARKETING_TARGET_TYPE_ENUM[key as keyof typeof MARKETING_TARGET_TYPE_ENUM], value: key }))}
+                />
+            </Form.Item></Col>}
+
+            {/* 推广目标 */}
+            {isPromotedObjectType && <Col><Form.Item name='promotedObjectType'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ width: 120 }}
+                    placeholder={'推广目标'}
+                    filterOption={(input, option) =>
+                        (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    options={Object.keys(PromotedObjectType).map(key => ({ label: PromotedObjectType[key as keyof typeof PromotedObjectType], value: key }))}
+                />
+            </Form.Item></Col>}
+
+            {/* 推广目标名称 */}
+            {isPromotedObjectName && <Col><Form.Item name='promotedObjectName'>
+                <Input placeholder="推广目标名称" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 优化目标 */}
+            {isOptimizationGoal && <Col><Form.Item name='optimizationGoal'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ width: 120 }}
+                    placeholder={'优化目标'}
+                    filterOption={(input, option) =>
+                        (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                    options={Object.keys(OPTIMIZATIONGOAL_ENUM).map(key => ({ label: OPTIMIZATIONGOAL_ENUM[key as keyof typeof OPTIMIZATIONGOAL_ENUM], value: key }))}
+                />
+            </Form.Item></Col>}
+
+            {/* 投放模式 */}
+            {isDeliveryMode && <Col><Form.Item name='deliveryMode'>
+                <Select
+                    placeholder='投放模式'
+                    style={{ width: 120, minWidth: 120 }}
+                    showSearch
+                    allowClear
+                    filterOption={(input: any, option: any) =>
+                        (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                    }
+                    mode="multiple"
+                >
+                    <Select.Option value={'DELIVERY_MODE_CUSTOMIZE'}>自定义创意</Select.Option>
+                    <Select.Option value={'DELIVERY_MODE_COMPONENT'}>组件化创意</Select.Option>
+                </Select>
+            </Form.Item></Col>}
+
+            {/* 是否删除 */}
+            {isDeleted && <Col><Form.Item name='deleted'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ width: 120 }}
+                    placeholder={'是否删除?'}
+                    filterOption={(input, option) =>
+                        (option?.children as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                >
+                    <Select.Option value={true}>是</Select.Option>
+                    <Select.Option value={false}>否</Select.Option>
+                </Select>
+            </Form.Item></Col>}
+
+            {/* 是否删除 */}
+            {isDeepConversionSpec && <Col><Form.Item name='isDeepConversionSpec'>
+                <Select
+                    showSearch
+                    allowClear
+                    style={{ width: 120 }}
+                    placeholder={'是否深度优化'}
+                    filterOption={(input, option) =>
+                        (option?.children as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                    }
+                >
+                    <Select.Option value={true}>是</Select.Option>
+                    <Select.Option value={false}>否</Select.Option>
+                </Select>
+            </Form.Item></Col>}
+
+            {/* 启用禁用状态 */}
+            {isConfiguredStatus && <Col><Form.Item name='configuredStatus'>
+                <Select
+                    placeholder='启用禁用状态'
+                    style={{ minWidth: 120 }}
+                    showSearch
+                    allowClear
+                    filterOption={(input: any, option: any) =>
+                        (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
+                    }
+                    mode="multiple"
+                >
+                    <Select.Option value={'AD_STATUS_NORMAL'}>有效</Select.Option>
+                    <Select.Option value={'AD_STATUS_SUSPEND'}>暂停</Select.Option>
+                </Select>
+            </Form.Item></Col>}
+
+            {/* 日期选择框 */}
+            {day1 && <Col><Form.Item name='day1'>
+                {/* @ts-ignore */}
+                <DatePicker.RangePicker style={{ width: 250 }} {...day1} />
+            </Form.Item></Col>}
+
+            {/* 日期选择框 */}
+            {day2 && <Col><Form.Item name='day2'>
+                {/* @ts-ignore */}
+                <DatePicker.RangePicker style={{ width: 250 }} {...day2} />
+            </Form.Item></Col>}
+
+            {/* 日期选择框 */}
+            {day3 && <Col><Form.Item name='day3'>
+                {/* @ts-ignore */}
+                <DatePicker.RangePicker style={{ width: 250 }} {...day3} />
+            </Form.Item></Col>}
+
+            {/* 最小总消耗 */}
+            {isCostTotalMin && <Col><Form.Item name='costTotalMin'>
+                <InputNumber placeholder="最小总消耗" style={{ width: 100 }} />
+            </Form.Item></Col>}
+
+            {/* 最低转化数 */}
+            {isConversionsCountTotalMin && <Col><Form.Item name='conversionsCountTotalMin'>
+                <InputNumber placeholder="最低转化数" style={{ width: 100 }} />
+            </Form.Item></Col>}
+
+            {/* 最低总千次曝光成本 */}
+            {isThousandDisplayPriceTotalMin && <Col><Form.Item name='thousandDisplayPriceTotalMin'>
+                <InputNumber placeholder="最低总千次曝光成本" style={{ width: 150 }} />
+            </Form.Item></Col>}
+
+            {/* 激活首日广告变现ROI */}
+            {isIncomeRoi1 && <>
+                <Col><Form.Item name='incomeRoi1Min'>
+                    <InputNumber placeholder="激活首日广告变现ROI最小值" style={{ width: 200 }} />
+                </Form.Item></Col>
+                <Col><Form.Item name='incomeRoi1Max'>
+                    <InputNumber placeholder="激活首日广告变现ROI最大值" style={{ width: 200 }} />
+                </Form.Item></Col>
+            </>}
+
+            {/* 注册成本(平台上报+广告主上报 */}
+            {isRegCost && <>
+                <Col><Form.Item name='regCostMin'>
+                    <InputNumber placeholder="注册成本最小值" style={{ width: 120 }} />
+                </Form.Item></Col>
+                <Col><Form.Item name='regCostMax'>
+                    <InputNumber placeholder="注册成本最大值" style={{ width: 120 }} />
+                </Form.Item></Col>
+            </>}
+
+            {/* 注册成本(平台上报+广告主上报 */}
+            {isRegCostPla && <>
+                <Col><Form.Item name='regCostPlaMin'>
+                    <InputNumber placeholder="注册成本最小值(平台上报...)" style={{ width: 180 }} />
+                </Form.Item></Col>
+                <Col><Form.Item name='regCostPlaMax'>
+                    <InputNumber placeholder="注册成本最大值(平台上报...)" style={{ width: 180 }} />
+                </Form.Item></Col>
+            </>}
+
+            {/* 注册成本(平台上报+广告主上报 */}
+            {isCpc && <>
+                <Col><Form.Item name='cpcMin'>
+                    <InputNumber placeholder="点击均价最小值" style={{ width: 120 }} />
+                </Form.Item></Col>
+                <Col><Form.Item name='cpcMax'>
+                    <InputNumber placeholder="点击均价最大值" style={{ width: 120 }} />
+                </Form.Item></Col>
+            </>}
+
+            <Col>
+                <Space>
+                    <Button type="primary" htmlType="submit">搜索</Button>
+                    <Button onClick={() => form.resetFields()}>重置</Button>
+                </Space>
+            </Col>
+        </Row>
+    </Form>
+}
+
+
+export default React.memo(QueryFormNovel)

+ 152 - 46
src/components/RightContent/index.tsx

@@ -1,4 +1,4 @@
-import { Tag, Space, Badge, Modal, Select, Avatar as AntdAvatar } from 'antd';
+import { Tag, Space, Badge, Modal, Select, Avatar as AntdAvatar, message } from 'antd';
 import React, { useCallback, useEffect, useState } from 'react';
 import { useModel } from 'umi';
 import Avatar from './AvatarDropdown';
@@ -7,6 +7,19 @@ import { exitFullScreen, requestFullScreen, isFull } from '@/utils/fullScreen'
 import { BellOutlined, UserOutlined } from '@ant-design/icons';
 import { getAppListApi } from '@/services/iaaData';
 import { useAjax } from '@/Hook/useAjax';
+import { groupBy } from '@/utils/utils';
+
+enum MediaPlatform {
+    MEDIA_PLATFORM_TENCENT = "腾讯",
+    MEDIA_PLATFORM_OCENAENGINE = "头条"
+}
+
+// 业务类型
+export const PRODUCT_TYPE = {
+    PRODUCT_TYPE_GAME: '游戏业务',
+    PRODUCT_TYPE_NOVEL: '小说业务',
+    PRODUCT_TYPE_PLAYLET: '短剧业务'
+}
 
 export type SiderTheme = 'light' | 'dark';
 
@@ -19,30 +32,60 @@ const GlobalHeaderRight: React.FC<{}> = () => {
     if (!initialState || !initialState.settings) {
         return null;
     }
+    const [appData, setAppData] = useState<{ [x: string]: { [x: string]: any[] } }>({})
     const [appList, setApplist] = useState<{ label: string, value: string, productType: string; mediaPlatform: string; icon?: string }[]>([])
     const getAppList = useAjax(() => getAppListApi())
-    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 [firstPath, setFirstPath] = useState<{ [x: string]: string }>()
 
-    const haveTo = (type: 'MEDIA_PLATFORM_TENCENT' | 'MEDIA_PLATFORM_OCENAENGINE') => {
-        let menus = initialState?.menu?.data?.find((item: { path: string; }) => item.path === "/iaaData")?.routes
-        const firstTencent = menus?.find((item: { path: string; }) => item.path === "/iaaData/tencentIaa")?.routes?.[0]?.path
-        const firstOcenaengine = menus?.find((item: { path: string; }) => item.path === "/iaaData/ocenaengineIaa")?.routes?.[0]?.path
-        switch (type) {
-            case 'MEDIA_PLATFORM_TENCENT':
-                if (!location.hash.includes('tencentIaa')) {
-                    window.location.href = `/#${firstTencent}`
-                }
-                break
-            case 'MEDIA_PLATFORM_OCENAENGINE':
-                if (!location.hash.includes('ocenaengineIaa')) {
-                    window.location.href = `/#${firstOcenaengine}`
-                }
-                break
+    const haveTo = (
+        type: 'MEDIA_PLATFORM_TENCENT' | 'MEDIA_PLATFORM_OCENAENGINE',
+        productType: keyof typeof PRODUCT_TYPE,
+        firstPathC?: { [x: string]: string }
+    ) => {
+        const pathS = firstPath || firstPathC;
+
+        // 定义映射关系  
+        const redirectMap = {
+            'PRODUCT_TYPE_GAME': {
+                'MEDIA_PLATFORM_TENCENT': pathS?.game_tencent,
+                'MEDIA_PLATFORM_OCENAENGINE': pathS?.game_ocenaengine,
+            },
+            'PRODUCT_TYPE_NOVEL': {
+                'MEDIA_PLATFORM_TENCENT': pathS?.novel_tencent,
+                'MEDIA_PLATFORM_OCENAENGINE': pathS?.novel_ocenaengine,
+            },
+            'PRODUCT_TYPE_PLAYLET': {
+                'MEDIA_PLATFORM_TENCENT': pathS?.playlet_tencent,
+                'MEDIA_PLATFORM_OCENAENGINE': pathS?.playlet_ocenaengine,
+            },
+        };
+
+        // 获取当前类型和产品类型的重定向路径  
+        const redirectPath = redirectMap[productType]?.[type];
+        if (redirectPath) {
+            // 定义映射关系  
+            const platform = {
+                'PRODUCT_TYPE_GAME': {
+                    'MEDIA_PLATFORM_TENCENT': '/game/tencent',
+                    'MEDIA_PLATFORM_OCENAENGINE': '/game/ocenaengine'
+                },
+                'PRODUCT_TYPE_NOVEL': {
+                    'MEDIA_PLATFORM_TENCENT': '/novel/tencent',
+                    'MEDIA_PLATFORM_OCENAENGINE': '/novel/ocenaengine'
+                },
+                'PRODUCT_TYPE_PLAYLET': {
+                    'MEDIA_PLATFORM_TENCENT': '/playlet/tencent',
+                    'MEDIA_PLATFORM_OCENAENGINE': '/playlet/ocenaengine'
+                },
+            };
+            const redirectPlatform = platform[productType]?.[type];
+            if (!location.hash.includes(redirectPlatform)) {
+                window.location.href = `/#${redirectPath}`;
+            }
         }
-    }
+    };
 
     useEffect(() => {
         if (location.hash.includes('/iaaSystem')) {
@@ -55,37 +98,98 @@ const GlobalHeaderRight: React.FC<{}> = () => {
             setIsJr(() => true)
             getAppList.run().then(res => {
                 if (res?.data) {
-                    let menus = initialState?.menu?.data?.find((item: { path: string; }) => item.path === "/iaaData")?.routes
-                    const firstTencent = menus?.find((item: { path: string; }) => item.path === "/iaaData/tencentIaa")?.routes?.[0]?.path
-                    const firstOcenaengine = menus?.find((item: { path: string; }) => item.path === "/iaaData/ocenaengineIaa")?.routes?.[0]?.path
-                    const productTypeSet = new Set();
-                    const mediaPlatformSet = new Set();
-                    const data: { label: string, value: string, productType: string; mediaPlatform: string; icon?: string }[] = res?.data?.filter((item: { mediaPlatform: string; }) => (firstTencent && item.mediaPlatform === 'MEDIA_PLATFORM_TENCENT') || (firstOcenaengine && item.mediaPlatform === 'MEDIA_PLATFORM_OCENAENGINE'))?.map((item: { name: string; id: number; productType: string; mediaPlatform: string; icon?: string }) => {
-                        productTypeSet.add(item.productType)
-                        mediaPlatformSet.add(item.mediaPlatform)
-                        return { label: item.name, value: item.id + '||' + item.productType, productType: item.productType, mediaPlatform: item.mediaPlatform, icon: item.icon }
-                    })
-                    if (data?.length) {
-                        setProductTypeList([{ label: '游戏业务', value: 'PRODUCT_TYPE_GAME' }, { label: '小说业务', value: 'PRODUCT_TYPE_NOVEL' }, { label: '短剧业务', value: 'PRODUCT_TYPE_PLAYLET' }].filter(item => [...productTypeSet].includes(item.value)))
-                        setMediaPlatformList([{ label: '腾讯', value: 'MEDIA_PLATFORM_TENCENT' }, { label: '头条', value: 'MEDIA_PLATFORM_OCENAENGINE' }].filter(item => [...mediaPlatformSet].includes(item.value)))
+                    let menus: { path: string, routes?: { path: string, routes?: { path: string }[] }[] }[] = initialState?.menu?.data?.find((item: { path: string; }) => item.path === "/iaaData")?.routes
+                    if (menus?.length > 0) {
+                        const firstPath: { [x: string]: string } = {}
+                        // 定义业务类型及其路径  
+                        const businessMap = {
+                            game: '/iaaData/game',
+                            novel: '/iaaData/novel',
+                            playlet: '/iaaData/playlet'
+                        };
+
+                        // 定义子路径的映射  
+                        const subRoutesMap = {
+                            tencent: 'tencent',
+                            ocenaengine: 'ocenaengine'
+                        };
+                        // 遍历菜单  
+                        menus?.forEach(menu => {
+                            // 检查是否是业务类型路径  
+                            const businessKey = Object.keys(businessMap).find(key => menu.path.includes(businessMap[key as keyof typeof businessMap]));
+                            if (businessKey && menu?.routes?.[0]?.path) {
+                                const subRouteKey = Object.keys(subRoutesMap).find(subKey => menu.path.endsWith(subRoutesMap[subKey as keyof typeof subRoutesMap]));
+                                if (subRouteKey) {
+                                    // 使用业务类型和子路径的组合构建 `firstPath` 的键  
+                                    firstPath[`${businessKey}_${subRouteKey}`] = menu?.routes?.[0]?.path;
+                                }
+                            }
+                        });
+                        const appTypeGroupList = groupBy(res.data, (item) => item.productType, true);
+                        let appDataList: { [x: string]: { [x: string]: any[] } } = {};
+
+                        // 定义产品类型和对应的 `firstPath` 键的映射  
+                        const productToFirstPathMap = {
+                            'PRODUCT_TYPE_GAME': ['game_tencent', 'game_ocenaengine'],
+                            'PRODUCT_TYPE_NOVEL': ['novel_tencent', 'novel_ocenaengine'],
+                            'PRODUCT_TYPE_PLAYLET': ['playlet_tencent', 'playlet_ocenaengine'],
+                        };
+
+                        let toData: { label: string, value: string, productType: string; mediaPlatform: string; icon?: string }[] = []
+
+                        Object.keys(appTypeGroupList).forEach(productType => {
+                            let data = groupBy(appTypeGroupList[productType], (item) => item.mediaPlatform, true) || {};
+                            // 获取对应的 `firstPath` 键  
+                            const firstPaths = productToFirstPathMap[productType as keyof typeof productToFirstPathMap];
+                            if (firstPaths) {
+                                // 遍历每种媒介平台,检查是否需要删除  
+                                if (!firstPath[firstPaths[0]]) {
+                                    delete data['MEDIA_PLATFORM_TENCENT'];
+                                } else {
+                                    if (data['MEDIA_PLATFORM_TENCENT']) {
+                                        const tencentData = data['MEDIA_PLATFORM_TENCENT'].map((item: { name: any; id: string; productType: string; mediaPlatform: any; icon: any; }) => ({ label: item.name, value: item.id + '||' + item.productType, productType: item.productType, mediaPlatform: item.mediaPlatform, icon: item.icon }))
+                                        data['MEDIA_PLATFORM_TENCENT'] = tencentData
+                                        toData.push(...tencentData)
+                                    }
+                                }
+                                if (!firstPath[firstPaths[1]]) {
+                                    delete data['MEDIA_PLATFORM_OCENAENGINE'];
+                                } else {
+                                    if (data['MEDIA_PLATFORM_OCENAENGINE']) {
+                                        const ocenaengineData = data['MEDIA_PLATFORM_OCENAENGINE'].map((item: { name: any; id: string; productType: string; mediaPlatform: any; icon: any; }) => ({ label: item.name, value: item.id + '||' + item.productType, productType: item.productType, mediaPlatform: item.mediaPlatform, icon: item.icon }))
+                                        data['MEDIA_PLATFORM_OCENAENGINE'] = ocenaengineData
+                                        toData.push(...ocenaengineData)
+                                    }
+                                }
+                            }
+                            // 如果 data 有数据,则添加到 appDataList  
+                            if (Object.keys(data).length > 0) {
+                                appDataList[productType] = data;
+                            }
+                        });
+                        console.log(appDataList, toData, firstPath)
+                        setAppData(appDataList)
                         const app = initialState?.iaaApp
                         let iaaApp: string;
                         let mediaPlatform: string;
-                        const d = data.find(item => item.value === app)
+                        const d = toData.find(item => item.value === app)
                         if (app && d) {
                             iaaApp = app
                             mediaPlatform = d.mediaPlatform
                         } else {
-                            iaaApp = data?.[0].value || undefined as any
-                            mediaPlatform = data?.[0].mediaPlatform || undefined as any
+                            iaaApp = toData?.find(item => item.productType === 'PRODUCT_TYPE_GAME')?.value || toData?.[0].value || undefined as any
+                            mediaPlatform = toData?.[0].mediaPlatform || undefined as any
                         }
                         const productType = iaaApp ? iaaApp.split('||')?.[1] : undefined
-    
-                        haveTo(mediaPlatform as any)
+                        // haveTo(mediaPlatform as any)
                         sessionStorage.setItem('mediaPlatform', mediaPlatform)
                         setProductType(productType)
                         setInitialState({ ...initialState, iaaApp, mediaPlatform })
-                        setApplist(data)
+                        setApplist(toData)
+                        setFirstPath(firstPath)
+                        haveTo(mediaPlatform as any, productType as any, firstPath)
+                    } else {
+                        message.error('没有菜单')
                     }
                 }
             })
@@ -94,7 +198,6 @@ const GlobalHeaderRight: React.FC<{}> = () => {
 
 
     useEffect(() => {
-
         setTimeout(() => {
             let nav: any = document.querySelector('.top-nav-menu')
             let navLi: any = document.querySelectorAll('.top-nav-menu > li')
@@ -153,6 +256,7 @@ const GlobalHeaderRight: React.FC<{}> = () => {
         })
     }, [])
 
+
     return (
         <div style={{ display: 'flex', justifyContent: 'space-between' }}>
             {location.hash.includes('/iaaData') && <div style={{ left: left + 10, position: 'absolute' }}>
@@ -164,14 +268,16 @@ const GlobalHeaderRight: React.FC<{}> = () => {
                         (option?.label as any)?.toLowerCase().indexOf(input.toLowerCase()) >= 0
                     }
                     onChange={(type) => {
-                        let newApplist = appList.filter(item => item.productType === type)
-                        sessionStorage.setItem('mediaPlatform', newApplist?.[0]?.mediaPlatform)
-                        newApplist?.[0]?.mediaPlatform && haveTo(newApplist?.[0]?.mediaPlatform as any);
-                        setInitialState({ ...initialState, iaaApp: newApplist?.[0]?.value, mediaPlatform: newApplist?.[0]?.mediaPlatform })
+                        let newMediaPlatformObj = appData[type]
+                        let newApplist = newMediaPlatformObj?.MEDIA_PLATFORM_TENCENT || newMediaPlatformObj?.MEDIA_PLATFORM_OCENAENGINE
+                        let firstNewApp = newApplist[0]
+                        sessionStorage.setItem('mediaPlatform', firstNewApp.mediaPlatform)
+                        firstNewApp.mediaPlatform && haveTo(newApplist?.[0]?.mediaPlatform as any, type as any);
+                        setInitialState({ ...initialState, iaaApp: firstNewApp.value, mediaPlatform: firstNewApp.mediaPlatform })
                         setProductType(type)
                     }}
                     value={productType}
-                    options={productTypeList}
+                    options={Object.keys(appData).map(key => ({ label: PRODUCT_TYPE[key as keyof typeof PRODUCT_TYPE], value: key }))}
                 />
                 <Select
                     showSearch
@@ -183,11 +289,11 @@ const GlobalHeaderRight: React.FC<{}> = () => {
                     onChange={(type) => {
                         let newApplist = appList.filter(item => item.productType === productType).filter(item => item.mediaPlatform === type)
                         sessionStorage.setItem('mediaPlatform', type)
-                        haveTo(type as any)
+                        haveTo(type as any, productType as any)
                         setInitialState({ ...initialState, iaaApp: newApplist?.[0]?.value, mediaPlatform: type })
                     }}
                     value={initialState?.mediaPlatform}
-                    options={mediaPlatformList}
+                    options={(productType && appData?.[productType]) ? Object.keys(appData?.[productType]).map(key => ({ label: MediaPlatform[key as keyof typeof MediaPlatform], value: key })) : []}
                 />
                 <Select
                     showSearch

+ 7 - 0
src/pages/iaaData/components/TimeSeriesLook/const.ts

@@ -0,0 +1,7 @@
+import moment from "moment";
+export function getTimeSeriesList() {
+    return new Array(7 * 24 * 2).fill('1');
+}
+
+const [_, ...rest] = moment.weekdays();
+export const WEEK_SERIRES = [...rest, _];

+ 71 - 0
src/pages/iaaData/components/TimeSeriesLook/index.tsx

@@ -0,0 +1,71 @@
+import { EyeOutlined } from "@ant-design/icons";
+import { Tooltip } from "antd";
+import React, { useEffect, useState } from "react"
+import { getTimeSeriesList, WEEK_SERIRES } from "./const";
+const totalHour = 48;
+
+interface Props {
+    timeSeries: string,  // 投放时间
+}
+const TimeSeriesLook: React.FC<Props> = (prosp) => {
+
+    const { timeSeries } = prosp
+    const [text, setText] = useState<string[]>([])
+
+
+    useEffect(() => {
+        if (timeSeries) {
+            if (timeSeries === getTimeSeriesList().join('')) {
+                setText([])
+            } else {
+                let newTimesText: string[] = []
+                WEEK_SERIRES.forEach((item, index) => {
+                    let data = timeSeries.slice(index * totalHour, totalHour + totalHour * index)
+                    let times: string[] = []
+                    let startTime = ''
+                    let endTime = ''
+                    for (let i = 0; i < data.length; i++) {
+                        if (data[i] === '1') {
+                            const hour = Math.floor(i / 2);
+                            const curHour = ('00' + hour).slice(-2);
+                            const curMinute = i % 2 ? '30' : '00'
+                            const nextHour = ('00' + (hour + 1)).slice(-2);
+                            if (!startTime) {
+                                startTime = `${curHour}:${curMinute}`
+                                endTime = i % 2 ? `${nextHour}:00` : `${curHour}:${curMinute}`
+                            } else {
+                                endTime = i % 2 ? `${nextHour}:00` : `${curHour}:${curMinute}`
+                            }
+                            if (data.length === i + 1) {
+                                if (startTime && endTime) {
+                                    times.push(`${startTime}-${endTime}`)
+                                }
+                            }
+                        } else {
+                            if (startTime && endTime) {
+                                times.push(`${startTime}-${endTime}`)
+                            }
+                            startTime = ''
+                            endTime = ''
+                        }
+
+                    }
+                    if (times.length > 0) {
+                        newTimesText.push(`${item}:${times.toString()}`)
+                    }
+                })
+                setText(newTimesText)
+            }
+        } else {
+            setText([])
+        }
+    }, [timeSeries])
+
+    return <>
+        {text.length === 0 ? '不限' : <Tooltip title={text.map((item, index) => <div key={index}>{item}</div>)}>
+            <a><EyeOutlined /></a>
+        </Tooltip>}
+    </>
+}
+
+export default React.memo(TimeSeriesLook)

+ 177 - 0
src/pages/iaaData/const.tsx

@@ -102,4 +102,181 @@ export enum PRICINGEnum {
     PRICING_CPV = 'CPV',
     PRICING_CPA = 'CPA(已下线)',
     PRICING_CPC_OCPM = 'CPC - OCPM两阶段出价(仅搜索广告可用)'
+}
+
+/** 营销目的 */
+export enum MARKETING_GOAL_ENUM {
+    MARKETING_GOAL_PRODUCT_SALES = '商品销售',
+    MARKETING_GOAL_LEAD_RETENTION = '线索留资',
+    MARKETING_GOAL_USER_GROWTH = '用户增长',
+    MARKETING_GOAL_BRAND_PROMOTION = '品牌宣传',
+    MARKETING_GOAL_INCREASE_FANS_INTERACTION = '加粉互动'
+}
+
+/** 推广内容资产类型 */
+export enum MARKETING_TARGET_TYPE_ENUM {
+    MARKETING_TARGET_TYPE_FICTION = '小说',
+    MARKETING_TARGET_TYPE_WECHAT_OFFICIAL_ACCOUNT = '微信公众号',
+    MARKETING_TARGET_TYPE_SHORT_DRAMA = '短剧',
+    MARKETING_TARGET_TYPE_MINI_PROGRAM_WECHAT = '微信小程序',
+    MARKETING_TARGET_TYPE_WECHAT_WORK = '企业微信'
+}
+
+/**广告组推广目标类型*/
+export enum PromotedObjectType {
+    PROMOTED_OBJECT_TYPE_WECHAT_OFFICIAL_ACCOUNT = '微信公众号',
+    PROMOTED_OBJECT_TYPE_LEAD_AD = '销售线索',
+    PROMOTED_OBJECT_TYPE_LINK = '网页',
+    PROMOTED_OBJECT_TYPE_LINK_WECHAT = '品牌网页',
+    PROMOTED_OBJECT_TYPE_ECOMMERCE = '商品推广',
+    PROMOTED_OBJECT_TYPE_APP_ANDROID = 'Android应用',
+    PROMOTED_OBJECT_TYPE_APP_IOS = 'IOS应用',
+    PROMOTED_OBJECT_TYPE_APP_ANDROID_MYAPP = '应用宝推广',
+    PROMOTED_OBJECT_TYPE_APP_ANDROID_UNION = 'Android应用(优量汇推广)',
+    PROMOTED_OBJECT_TYPE_LOCAL_ADS_WECHAT = '本地门店',
+    PROMOTED_OBJECT_TYPE_QQ_BROWSER_MINI_PROGRAM = 'QQ浏览器小程序',
+    PROMOTED_OBJECT_TYPE_QQ_MESSAGE = 'QQ消息',
+}
+
+/** 广告优化目标类型 */
+export enum OPTIMIZATIONGOAL_ENUM {
+	OPTIMIZATIONGOAL_NONE = "none",
+	OPTIMIZATIONGOAL_BRAND_CONVERSION = "品牌转化",
+	OPTIMIZATIONGOAL_FOLLOW = "关注",
+	OPTIMIZATIONGOAL_CLICK = "点击",
+	OPTIMIZATIONGOAL_IMPRESSION = "曝光",
+	OPTIMIZATIONGOAL_APP_DOWNLOAD = "下载",
+	OPTIMIZATIONGOAL_APP_ACTIVATE = "激活",
+	OPTIMIZATIONGOAL_APP_REGISTER = "注册",
+	OPTIMIZATIONGOAL_ONE_DAY_RETENTION = "次日留存",
+	OPTIMIZATIONGOAL_APP_PURCHASE = "付费次数",
+	OPTIMIZATIONGOAL_ECOMMERCE_ORDER = "下单",
+	OPTIMIZATIONGOAL_ECOMMERCE_CHECKOUT = "H5 购买",
+	OPTIMIZATIONGOAL_LEADS = "销售线索",
+	OPTIMIZATIONGOAL_ECOMMERCE_CART = "加入购物车",
+	OPTIMIZATIONGOAL_PROMOTION_CLICK_KEY_PAGE = "公众号内注册",
+	OPTIMIZATIONGOAL_VIEW_COMMODITY_PAGE = "商品详情页浏览",
+	OPTIMIZATIONGOAL_ONLINE_CONSULTATION = "在线咨询",
+	OPTIMIZATIONGOAL_TELEPHONE_CONSULTATION = "电话拨打",
+	OPTIMIZATIONGOAL_PAGE_RESERVATION = "表单预约",
+	OPTIMIZATIONGOAL_DELIVERY = "发货",
+	OPTIMIZATIONGOAL_MESSAGE_AFTER_FOLLOW = "公众号内发消息",
+	OPTIMIZATIONGOAL_CLICK_MENU_AFTER_FOLLOW = "公众号内点击菜单栏",
+	OPTIMIZATIONGOAL_PAGE_EFFECTIVE_ONLINE_CONSULT = "有效在线咨询 (待废弃)",
+	OPTIMIZATIONGOAL_APPLY = "完件",
+	OPTIMIZATIONGOAL_CONFIRM_EFFECTIVE_LEADS_CONSULT = "有效在线咨询",
+	OPTIMIZATIONGOAL_CONFIRM_EFFECTIVE_LEADS_PHONE = "有效电话拨打",
+	OPTIMIZATIONGOAL_LEADS_COLLECT = "综合线索收集",
+	OPTIMIZATIONGOAL_FIRST_PURCHASE = "首次付费",
+	OPTIMIZATIONGOAL_PRE_CREDIT = "预授信",
+	OPTIMIZATIONGOAL_CREDIT = "授信",
+	OPTIMIZATIONGOAL_WITHDRAW_DEPOSITS = "提现",
+	OPTIMIZATIONGOAL_PROMOTION_VIEW_KEY_PAGE = "关键页面访问次数",
+	OPTIMIZATIONGOAL_MOBILE_APP_CREATE_ROLE = "小游戏创角",
+	OPTIMIZATIONGOAL_CANVAS_CLICK = "跳转按钮点击",
+	OPTIMIZATIONGOAL_PROMOTION_CLAIM_OFFER = "领券",
+	OPTIMIZATIONGOAL_ECOMMERCE_ADD_TO_WISHLIST = "商品收藏",
+	OPTIMIZATIONGOAL_CONFIRM_EFFECTIVE_LEADS_RESERVATION = "有效表单提交",
+	OPTIMIZATIONGOAL_PAGE_RECEIPT = "签收",
+	OPTIMIZATIONGOAL_PAGE_SCAN_CODE = "加企业微信客服",
+	OPTIMIZATIONGOAL_SELECT_COURSE = "选课",
+	OPTIMIZATIONGOAL_CONFIRM_POTENTIAL_CUSTOMER_PHONE = "电话潜在客户",
+	OPTIMIZATIONGOAL_MOBILE_APP_AD_INCOME = "广告变现",
+	OPTIMIZATIONGOAL_MOBILE_APP_ACCREDIT = "小游戏授权",
+	OPTIMIZATIONGOAL_PURCHASE_MEMBER_CARD = "首次会员购买",
+	OPTIMIZATIONGOAL_PAGE_CONFIRM_EFFECTIVE_LEADS = "有效综合线索",
+	OPTIMIZATIONGOAL_RESERVATION = "微信流量预约行为",
+	OPTIMIZATIONGOAL_FIRST_ECOMMERCE_ORDER = "首次下单",
+	OPTIMIZATIONGOAL_LIKE = "点赞",
+	OPTIMIZATIONGOAL_ADD_DESKTOP = "快应用加桌面",
+	OPTIMIZATIONGOAL_EXTERNAL_LINK_CLICK = "外链点击",
+	OPTIMIZATIONGOAL_BUY_COUPONS = "购券",
+	OPTIMIZATIONGOAL_LEAVE_INFORMATION = "咨询留资",
+	OPTIMIZATIONGOAL_CORE_ACTION = "关键行为",
+	OPTIMIZATIONGOAL_ONE_DAY_RETENTION_RATIO = "次留率",
+	OPTIMIZATIONGOAL_PROMOTION_READ_ARTICLE = "阅读文章",
+	OPTIMIZATIONGOAL_FIRST_TWENTY_FOUR_HOUR_ECOMMERCE_ORDER = "24 小时下单",
+	OPTIMIZATIONGOAL_ECOMMERCE_SCANCODE_WX = "扫码加粉",
+	OPTIMIZATIONGOAL_MOBILE_APP_SEVEN_DAYS_RETENTION = "7 日留存",
+	OPTIMIZATIONGOAL_CLASS_PARTICIPATED = "首次到课",
+	OPTIMIZATIONGOAL_INSURANCE_PURCHASE = "保险支付",
+	OPTIMIZATIONGOAL_RESERVATION_CHECK = "意向表单",
+	OPTIMIZATIONGOAL_OPEN_ACCOUNT = "券商开户",
+	OPTIMIZATIONGOAL_SEVEN_DAY_ECOMMERCE_ORDER = "7 日下单",
+	OPTIMIZATIONGOAL_ADD_WECHAT = "添加个人微信客服",
+	OPTIMIZATIONGOAL_WECOM_CONSULT = "加企微后咨询",
+	OPTIMIZATIONGOAL_ADD_GROUP = "加群",
+	OPTIMIZATIONGOAL_QUICK_ORDER = "快速下单",
+	OPTIMIZATIONGOAL_PRE_PAY = "预付定金",
+	OPTIMIZATIONGOAL_PAGE_ONLINE_CONSULT_ACTIVE_ONE_MSG = "主动一句话咨询",
+	OPTIMIZATIONGOAL_CALL_DURATION_THIRTY_SECONDS = "通话 30S",
+	OPTIMIZATIONGOAL_CLAIM_COURSE = "领课",
+	OPTIMIZATIONGOAL_QUIT_GROUP = "退群",
+	OPTIMIZATIONGOAL_VIEW_ACQUISITION_CONTENT = "拉新访问关键页面",
+	OPTIMIZATIONGOAL_BACK_FLOW = "沉默唤起",
+	OPTIMIZATIONGOAL_PAGE_ONLINE_CONSULT_THREE_MSG = "三句话咨询",
+	OPTIMIZATIONGOAL_RENEWAL = "保险续费",
+	OPTIMIZATIONGOAL_LOW_PRICE_COURSE = "低价课转化",
+	OPTIMIZATIONGOAL_CONSULT_INTENTION = "开口后下单意向",
+	OPTIMIZATIONGOAL_EVERY_DAY_RETENTION = "七日内每次留存成本",
+	OPTIMIZATIONGOAL_PROMOTION_VIEW_KEY_PAGE_UV = "关键页面访问人数",
+	OPTIMIZATIONGOAL_LIVE_STREAM_DURATION_1MIN = "直播观看一分钟",
+	OPTIMIZATIONGOAL_LIVE_STREAM_INTERACTION = "直播互动",
+	OPTIMIZATIONGOAL_ECOMMERCE_CANCEL_ORDER = "取消订单率",
+	OPTIMIZATIONGOAL_CLICK_LEADS_COMPONENT = "点击留资组件",
+	OPTIMIZATIONGOAL_REGULAR_PRICE_COURSE = "正价课",
+	OPTIMIZATIONGOAL_VISIT_STROE = "到店",
+	OPTIMIZATIONGOAL_EFFECTIVE_ENTRY = "每日首次启动",
+	OPTIMIZATIONGOAL_CREDIT_RATIO = "完件授信率",
+	OPTIMIZATIONGOAL_QYT_LIVE_STREAM_DEAL = "全域通直播间成交",
+	OPTIMIZATIONGOAL_QYT_LIVE_STREAM_PRODUCT_CLICK = "全域通直播间商品点击",
+	OPTIMIZATIONGOAL_QYT_LIVE_STREAM_AUDIENCE = "全域通直播间观众",
+	OPTIMIZATIONGOAL_QYT_LIVE_STREAM_COMMENT = "全域通直播评论次数",
+	OPTIMIZATIONGOAL_QYT_LIVE_STREAM_FANS = "全域通直播间涨粉",
+	OPTIMIZATIONGOAL_24H_FIRSTPAY = "首日首次付费",
+	OPTIMIZATIONGOAL_STORE_STAY = "店铺停留",
+	OPTIMIZATIONGOAL_LOW_PRICE_INSURANCE_PAYMENT = "低价险支付",
+	OPTIMIZATIONGOAL_UNDERWRITING = "贷款额度开通",
+	OPTIMIZATIONGOAL_FIRST_WITHDRAW = "借款",
+	OPTIMIZATIONGOAL_BRIDGING_COURSE_COMPLETED = "先导课完课"
+}
+
+
+/** 出价类型 */
+export enum SMART_BID_TYPE_ENUM {
+	SMART_BID_TYPE_CUSTOM = '稳定拿量',
+	SMART_BID_TYPE_SYSTEMATIC = '最大转化量投放'
+}
+
+/** 广告状态 */
+export const ADGROUP_STATUS = {
+    'ADGROUP_STATUS_FROZEN': <Badge status="warning" text={<span style={{ fontSize: 12 }}>已冻结</span>}/>,
+    'ADGROUP_STATUS_SUSPEND': <Badge status="warning" text={<span style={{ fontSize: 12 }}>暂停中</span>}/>,
+    'ADGROUP_STATUS_NOT_IN_DELIVERY_TIME': <Badge status="default" text={<span style={{ fontSize: 12 }}>未到投放时间</span>}/>,
+    'ADGROUP_STATUS_ACTIVE': <Badge status="processing" text={<span style={{ fontSize: 12 }}>投放中</span>}/>,
+    'ADGROUP_STATUS_DELETED': <Badge status="error" text={<span style={{ fontSize: 12 }}>已删除</span>}/>,
+    'ADGROUP_STATUS_ACCOUNT_BALANCE_NOT_ENOUGH': <Badge status="warning" text={<span style={{ fontSize: 12 }}>账户余额不足</span>}/>,
+    'ADGROUP_STATUS_DAILY_BUDGET_REACHED': <Badge status="warning" text={<span style={{ fontSize: 12 }}>广告达到日预算上限</span>}/>,
+    'ADGROUP_STATUS_PARTIAL_ACTIVE': <Badge status="warning" text={<span style={{ fontSize: 12 }}>部分投放中</span>}/>,
+    'ADGROUP_STATUS_CREATIVE_STATUS_PENDING': <Badge status="warning" text={<span style={{ fontSize: 12 }}>创意未投放</span>}/>,
+    'ADGROUP_STATUS_CREATIVE_EMPTY': <Badge status="warning" text={<span style={{ fontSize: 12 }}>创意准备中</span>}/>,
+    'ADGROUP_STATUS_JOINT_BUDGET_REACHED': <Badge status="warning" text={<span style={{ fontSize: 12 }}>广告被暂停</span>}/>,
+    'ADGROUP_STATUS_TOTAL_BUDGET_REACHED': <Badge status="warning" text={<span style={{ fontSize: 12 }}>广告达到总预算上限</span>}/>,
+}
+
+/**
+ * 业务单元类型
+ */
+export enum AdUnitType_Enum {
+    NOVEL = '小说',
+    NOVEL_IAA = '小说IAA',
+    GAME = '游戏',
+    GAME_IAA = '游戏IAA',
+    SHOP = '电商'
+}
+
+/** 创意形式匹配方式 */
+export enum DYNAMIC_CREATIVE_TYPE {
+    DYNAMIC_CREATIVE_TYPE_COMMON = '手动指定',
+    DYNAMIC_CREATIVE_TYPE_PROGRAM = '自动匹配'
 }

+ 94 - 0
src/pages/iaaData/game/ocenaengine/adList/dayAd.tsx

@@ -0,0 +1,94 @@
+import { useAjax } from "@/Hook/useAjax"
+import { Button, Drawer } from "antd"
+import React, { useEffect, useState } from "react"
+import QueryForm from "@/components/QueryForm"
+import { CloseOutlined } from "@ant-design/icons"
+import TablePro from "@/components/TablePro"
+import moment from "moment"
+import { getByteAdEveryListApi } from "@/services/iaaData"
+import columns12 from "./tableConfigDay"
+
+interface Props {
+    queryForm: {
+        costDayBegin?: string,
+        costDayEnd?: string
+    }
+    iaaApp: string,
+    adName: string,
+    promotionId?: number
+    onClose?: () => void
+    visible?: boolean
+}
+
+/**
+ * 广告每日监控
+ * @returns 
+ */
+const DayAd: React.FC<Props> = ({ iaaApp, adName, queryForm, promotionId, 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 getByteAdEveryList = useAjax((params) => getByteAdEveryListApi(params))
+    /***********************************/
+
+    useEffect(() => {
+        let params: any = {}
+        const [appId, productType] = iaaApp.split('||')
+        if (promotionId) {
+            params.adId = promotionId
+        }
+        if (date && date?.length > 0) {
+            params.costDayBegin = date[0]
+            params.costDayEnd = date[1]
+        } else {
+            delete params?.costDayBegin
+            delete params?.costDayEnd
+        }
+        getByteAdEveryList.run({ ...params, ...data, appId, productType })
+    }, [promotionId, 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={getByteAdEveryList}
+            loading={getByteAdEveryList.loading}
+            fixed={{ left: 3, right: 0 }}
+            dataSource={getByteAdEveryList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(data.pageNum.toString() + index.toString()) }))}
+            page={getByteAdEveryList?.data?.data?.current || 1}
+            pageSize={getByteAdEveryList?.data?.data?.size || 20}
+            total={getByteAdEveryList?.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)

+ 7 - 0
src/pages/iaaData/game/ocenaengine/adList/index.less

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

+ 250 - 0
src/pages/iaaData/game/ocenaengine/adList/index.tsx

@@ -0,0 +1,250 @@
+import QueryForm from "@/components/QueryForm";
+import TablePro from "@/components/TablePro";
+import { Button, message, Modal, Space, Table } from "antd";
+import React, { useEffect, useState } from "react"
+import { useModel } from "umi";
+import moment from "moment";
+import { getByteAdListApi, GetByteAdListProps, getByteAdTotalApi } from "@/services/iaaData";
+import { useAjax } from "@/Hook/useAjax";
+import columns12 from "./tableConfig";
+import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons";
+import DayAd from "./dayAd";
+import { newEditTTAdgroupsDataApi } from "@/services/gameData";
+
+
+/**
+ * 头条广告列表
+ * @returns 
+ */
+const AdList: React.FC = () => {
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [selectedRows, setSelectedRows] = useState<any[]>([])
+    const [queryForm, setQueryForm] = useState<GetByteAdListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().format('YYYY-MM-DD'),
+        costDayEnd: moment().format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+    const [visible, setVisible] = useState<boolean>(false)
+    const [promotionId, setPromotionId] = useState<number>()
+    const [adName, setAdName] = useState<string>('')
+    const [failIdList, setFailIdList] = useState<{ adgroupId: number, code: number, message: string, messageCn: string }[]>([])
+    const [failVisible, setFailVisible] = useState<boolean>(false)
+
+    // const editAdqAdgroupsData = useAjax((params) => newEditAdqAdgroupsDataApi(params))
+    const getByteAdList = useAjax((params) => getByteAdListApi(params))
+    const getByteAdTotal = useAjax((params) => getByteAdTotalApi(params))
+    const newEditTTAdgroupsData = useAjax((params) => newEditTTAdgroupsDataApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getByteAdList.run({ ...queryForm, appId, productType })
+            getByteAdTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; accountId: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.accountId = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, accountId: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    const dayHandle = (data: any) => {
+        setVisible(true)
+        setAdName(data.adName)
+        setPromotionId(data.adId)
+    }
+
+    // 批量启停
+    const adStatus = (type: 'play' | 'suspend') => {
+        let params: any = {}
+        params.suspend = type === 'play' ? false : true
+        params.adgroupIds = selectedRows.map(item => item.accountId + ',' + item.adId)
+        if (params.adgroupIds.length === 0) {
+            message.warn(`所以账号都是${type === 'play' ? '启动' : '暂停'}状态,无需${type === 'play' ? '启动' : '暂停'}操作`)
+            return
+        }
+        let hide =  message.loading(`正在设置...`, 0, () => {
+            message.success('设置成功');
+        });
+        newEditTTAdgroupsData.run(params).then((res: any) => {
+            if (res?.failIdList?.length === 0) {
+                message.success(`操作完成!`)
+                getByteAdList.refresh()
+                setSelectedRows([])
+            } else {
+                setFailIdList(res?.list || [])
+                setFailVisible(true)
+            }
+            hide()
+        })
+    }
+
+    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={newEditTTAdgroupsData.loading} icon={<PlayCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus('play')}>启动</Button>
+                <Button type='primary' size="small" style={{ background: '#e6a23c', borderColor: '#e6a23c' }} loading={newEditTTAdgroupsData.loading} icon={<PauseCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus('suspend')}>暂停</Button>
+                <span style={{ color: 'red' }}>操作完数据结果延时5分钟之内,即时结果去腾讯后台查看</span>
+            </Space>}
+            leftChild={<QueryForm
+                initialValues={{ day3: [moment(), moment()] }}
+                isAccountId
+                isPromotionName
+                isPutUserIdList
+                isCpaBid
+                isDeleted
+                isTTPricing
+                isTTStatus
+                isPromotionId
+                day1={{ placeholder: ['广告创建日期开始', '广告创建日期结束'] }}
+                day2={{ placeholder: ['投放日期开始', '投放日期结束'] }}
+                day3={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { promotionId, promotionName, day1, day2, day3, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.adId = promotionId
+                    newQueryForm.adName = promotionName
+                    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)}
+            configName={'头条广告列表'}
+            fixed={{ left: 4, right: 2 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='头条广告列表(游戏)'
+            loading={getByteAdList.loading}
+            ajax={getByteAdList}
+            page={getByteAdList?.data?.data?.current || 1}
+            pageSize={getByteAdList?.data?.data?.size || 20}
+            total={getByteAdList?.data?.data?.total || 0}
+            dataSource={getByteAdList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: item.adId.toString(16) }))}
+            rowKey={'id'}
+            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.id),
+                getCheckboxProps: (record: any) => ({
+                    disabled: record.adStatus === 'PROJECT_STATUS_DELETE' || record?.accountId === '总计'
+                }),
+                onSelect: (record: { adId: string }, selected: boolean) => {
+                    if (selected) {
+                        selectedRows.push({ ...record })
+                        setSelectedRows([...selectedRows])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { adId: string }) => item.adId !== record.adId)
+                        setSelectedRows([...newSelectAccData])
+                    }
+                },
+                onSelectAll: (selected: boolean, selectedRowss: { adId: number }[], changeRows: { adId: number }[]) => {
+                    if (selected) {
+                        let newSelectAccData = [...selectedRows]
+                        changeRows.forEach((item: { adId: number }) => {
+                            let index = newSelectAccData.findIndex((ite: { adId: number }) => ite.adId === item.adId)
+                            if (index === -1) {
+                                newSelectAccData.push({ ...item })
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { adId: number }) => {
+                            let index = changeRows.findIndex((ite: { adId: number }) => ite.adId === item.adId)
+                            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) }} queryForm={queryForm} promotionId={promotionId} />}
+        {failVisible && <Modal
+            title={<strong>报错信息</strong>}
+            open={failVisible}
+            className='modalResetCss'
+            width={650}
+            onCancel={() => { setFailVisible(false); setFailIdList([]) }}
+            footer={null}
+        >
+            <Table
+                size="small"
+                bordered
+                rowKey={'creativeId'}
+                columns={[{
+                    title: '创意ID',
+                    dataIndex: 'creativeId',
+                    key: 'creativeId',
+                    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 AdList

+ 566 - 0
src/pages/iaaData/game/ocenaengine/adList/tableConfig.tsx

@@ -0,0 +1,566 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Space, Statistic } from "antd"
+import React from "react"
+import { ADSTATUSEnum, LANDINGTYPE, PRICINGEnum, PRODUCT_TYPE_ENUM, PROJECTSTATUs } from "../../../const"
+import { APPTYPE } from "@/pages/iaaSystem/manage/const"
+import './index.less'
+
+function columns12(dayHandle: (data: any) => void): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+
+    return [
+        {
+            label: '账户信息',
+            data: [
+                {
+                    title: '推广账号名称', dataIndex: 'accountName', label: '账户信息', align: 'center', width: 100, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '推广账号ID', dataIndex: 'accountId', label: '账户信息', align: 'center', width: 100, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '备注', dataIndex: 'notes', label: '账户信息', align: 'center', width: 100, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '账户信息', align: 'center', width: 100, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '渠道名称', dataIndex: 'agentName', label: '账户信息', align: 'center', width: 80, default: 16,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '渠道ID', dataIndex: 'agentId', label: '账户信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'zxPitcherName', label: '账户信息', align: 'center', width: 60, default: 15,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '账户信息', align: 'right', width: 75, sorter: true, default: 21,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '账户信息', align: 'center', width: 80, default: 11,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用类型', dataIndex: 'appType', label: '账户信息', align: 'center', width: 80, default: 12,
+                    render: (a: string) => (<WidthEllipsis value={APPTYPE[a as keyof typeof APPTYPE]?.text} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '账户信息', align: 'center', width: 100, default: 13,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '账户信息', align: 'center', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序名称', dataIndex: 'mpName', label: '账户信息', align: 'center', width: 100, default: 14,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '账户信息', align: 'center', width: 100,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                }
+            ]
+        },
+        {
+            label: '广告信息',
+            data: [
+                {
+                    title: '广告组', dataIndex: 'campaignId', label: '广告信息', align: 'center', width: 100, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告组名称', dataIndex: 'campaignName', label: '广告信息', align: 'center', width: 100, default: 8,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'adName', label: '广告信息', align: 'center', width: 100, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'adId', label: '广告信息', align: 'center', width: 80, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '广告状态', dataIndex: 'adStatus', label: '广告信息', align: 'center', width: 95, default: 17,
+                    render: (a: string) => (<WidthEllipsis value={(ADSTATUSEnum as any)[a]} />)
+                },
+                {
+                    title: '项目名称', dataIndex: 'projectName', label: '广告信息', align: 'center', width: 75, default: 18,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '项目ID', dataIndex: 'projectId', label: '广告信息', align: 'center', width: 75,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '项目类型', dataIndex: 'adType', label: '广告信息', align: 'center', width: 75, default: 19,
+                    render: (a: string) => (<WidthEllipsis value={a === 'ALL' ? '所有广告' : a === 'SEARCH' ? '搜索广告' : '--'} />)
+                },
+                {
+                    title: '项目状态', dataIndex: 'proStatus', label: '广告信息', align: 'center', width: 75, default: 20,
+                    render: (a: string) => (<WidthEllipsis value={(PROJECTSTATUs as any)[a]} />)
+                },
+                {
+                    title: '项目预算', dataIndex: 'proBudget', label: '广告信息', align: 'right', width: 75, default: 28, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '预算类型', dataIndex: 'budgetMode', label: '广告信息', align: 'center', width: 70, default: 29, 
+                    render: (a: string) => (<WidthEllipsis value={a === 'BUDGET_MODE_DAY' ? '日预算' : a === 'BUDGET_MODE_TOTAL' ? '总预算' : '--'} />)
+                },
+                {
+                    title: '推广目标', dataIndex: 'landingType', label: '广告信息', align: 'center', width: 100, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={(LANDINGTYPE as any)[a]} />)
+                },
+                {
+                    title: '媒体平台', dataIndex: 'mediaPlatform', label: '广告信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '广告信息', align: 'center', width: 80, default: 22,
+                    render: (a: string) => (<WidthEllipsis value={(PRICINGEnum as any)[a]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '广告信息', align: 'center', width: 75, default: 23, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告日预算', dataIndex: 'dayBudget', label: '广告信息', align: 'right', width: 75, default: 24, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '投放时间', dataIndex: 'startTime', label: '广告信息', align: 'center', width: 180, default: 31,
+                    render: (a: string, b: any) => b?.accountId === '总计' ? '--' : <WidthEllipsis value={a + (b?.endTime ? '~' + b?.endTime : '')} />
+                },
+                {
+                    title: '广告创建时间', dataIndex: 'promotionCreateTime', label: '广告信息', align: 'center', width: 130, default: 32,
+                    render: (a: string, b: any) => <WidthEllipsis value={a} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '广告信息', align: 'center', width: 75, default: 30,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '消耗数据',
+            data: [
+                {
+                    title: '今日消耗', dataIndex: 'cost', label: '消耗数据', align: 'center', width: 85, default: 33, 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: 'adTotalCost', label: '消耗数据', align: 'center', width: 85, default: 34, 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>
+                }
+            ]
+        },
+        {
+            label: '广告媒体端展示数据指标',
+            data: [
+                {
+                    title: '曝光量', dataIndex: 'showCount', label: '广告媒体端展示数据指标', align: 'center', width: 70, default: 35, sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击量', dataIndex: 'click', label: '广告媒体端展示数据指标', align: 'center', width: 70, default: 36, sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告媒体端展示数据指标', align: 'center', width: 70, default: 37, sorter: true, 
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击均价', dataIndex: 'avgClickCost', label: '广告媒体端展示数据指标', align: 'center', width: 65, default: 38, sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'avgShowCost', label: '广告媒体端展示数据指标', align: 'right', width: 65, default: 39, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+            ]
+        },
+        {
+            label: '广告媒体端转化数据指标',
+            data: [
+                {
+                    title: '转化目标', dataIndex: 'convertTarget', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 25, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a} />
+                },
+                {
+                    title: '转化目标量', dataIndex: 'convertCount', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 40, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 27, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标率', dataIndex: 'convertRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 26, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活数', dataIndex: 'active', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 41, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活成本', dataIndex: 'activeCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 42, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活率', dataIndex: 'activeRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 43, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册数', dataIndex: 'register', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 49, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(广告)', dataIndex: 'activeRegisterCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 50, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册率', dataIndex: 'activeRegisterRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 51, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '关键行为数', dataIndex: 'gameAddiction', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 46, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '关键行为成本', dataIndex: 'gameAddictionCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 44, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '关键行为率', dataIndex: 'gameAddictionRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 45, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次留成本', dataIndex: 'attributionNextDayOpenCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存数', dataIndex: 'attributionNextDayOpenCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次留率(广告)', dataIndex: 'attributionNextDayOpenRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 72, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次留回传数', dataIndex: 'nextDayOpen', label: '广告媒体端转化数据指标', align: 'center', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '2日留存数', dataIndex: 'attributionRetention2dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '2日留存成本', dataIndex: 'attributionRetention2dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '2日留存率', dataIndex: 'attributionRetention2dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '3日留存数', dataIndex: 'attributionRetention3dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存成本', dataIndex: 'attributionRetention3dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存率', dataIndex: 'attributionRetention3dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '4日留存数', dataIndex: 'attributionRetention4dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '4日留存成本', dataIndex: 'attributionRetention4dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '4日留存率', dataIndex: 'attributionRetention4dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '5日留存数', dataIndex: 'attributionRetention5dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存成本', dataIndex: 'attributionRetention5dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存率', dataIndex: 'attributionRetention5dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '6日留存数', dataIndex: 'attributionRetention6dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '6日留存成本', dataIndex: 'attributionRetention6dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '6日留存率', dataIndex: 'attributionRetention6dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '7日留存数', dataIndex: 'attributionRetention7dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存成本', dataIndex: 'attributionRetention7dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存总数', dataIndex: 'attributionRetention7dSumCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, default: 74, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存率', dataIndex: 'attributionRetention7dTotalCost', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '7日留存总成本', dataIndex: 'attributionRetention7dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, default: 73, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '小程序/小游戏变现指标',
+            data: [
+                {
+                    title: '小程序/小游戏当日LTV(首日)', dataIndex: 'attributionMicroGame0dLtv', label: '小程序/小游戏变现指标', align: 'center', width: 85,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小程序/小游戏激活后三日LTV', dataIndex: 'attributionMicroGame3dLtv', label: '小程序/小游戏变现指标', align: 'center', width: 85,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小程序/小游戏当日(首日)广告变现ROI', dataIndex: 'attributionMicroGame0dRoi', label: '小程序/小游戏变现指标', align: 'center', width: 95, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小程序/小游戏激活后三日广告变现ROI', dataIndex: 'attributionMicroGame3dRoi', label: '小程序/小游戏变现指标', align: 'center', width: 95, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小程序/小游戏激活后七日广告变现ROI', dataIndex: 'attributionMicroGame7dRoi', label: '小程序/小游戏变现指标', align: 'center', width: 95, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小程序/小游戏激活后七日LTV', dataIndex: 'attributionMicroGame7dLtv', label: '小程序/小游戏变现指标', align: 'center', width: 85,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '应用端数据指标',
+            data: [
+                {
+                    title: '今日注册人数', dataIndex: 'todayRegUser', label: '应用端数据指标', align: 'center', width: 65, default: 47, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告总注册人数', dataIndex: 'totalRegUser', label: '应用端数据指标', align: 'center', width: 65, default: 48, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(应用)', dataIndex: 'regCost', label: '应用端数据指标', align: 'right', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均新增成本', dataIndex: 'totalRegCost', label: '应用端数据指标', align: 'right', width: 75, default: 52, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现人数', dataIndex: 'regFirstUser', label: '应用端数据指标', align: 'center', width: 85, default: 53, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现次数', dataIndex: 'regFirstCnt', label: '应用端数据指标', align: 'center', width: 85, default: 54, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现金额', dataIndex: 'regFirstAmount', label: '应用端数据指标', align: 'right', width: 85, default: 55, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日变现ROI', dataIndex: 'regFirstRoi', label: '应用端数据指标', align: 'center', width: 70, default: 56, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册24小时广告变现人数', dataIndex: 'regTwentyFourUser', label: '应用端数据指标', align: 'center', width: 85, default: 57, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时广告变现次数', dataIndex: 'regTwentyFourCnt', label: '应用端数据指标', align: 'center', width: 85, default: 58, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时广告变现金额', dataIndex: 'regTwentyFourAmount', label: '应用端数据指标', align: 'right', width: 85, default: 59, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时变现ROI', dataIndex: 'regTwentyFourRoi', label: '应用端数据指标', align: 'center', width: 70, default: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册3日广告变现人数', dataIndex: 'regThreeUser', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现次数', dataIndex: 'regThreeCnt', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现金额', dataIndex: 'regThreeAmount', label: '应用端数据指标', align: 'right', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日变现ROI', dataIndex: 'regThreeRoi', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册7日广告变现人数', dataIndex: 'regSevenUser', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日广告变现次数', dataIndex: 'regSevenCnt', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日广告变现金额', dataIndex: 'regSevenAmount', label: '应用端数据指标', align: 'right', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日变现ROI', dataIndex: 'regSevenRoi', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '累计广告变现人数', dataIndex: 'regTotalUser', label: '应用端数据指标', align: 'center', width: 85, default: 61, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告变现次数', dataIndex: 'regTotalCnt', label: '应用端数据指标', align: 'center', width: 85, default: 62, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告变现金额', dataIndex: 'regTotalAmount', label: '应用端数据指标', align: 'right', width: 85, default: 63, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告变现ROI', dataIndex: 'regTotalRoi', label: '应用端数据指标', align: 'center', width: 70, default: 64, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日新增ARPU', dataIndex: 'firstNewArpu', label: '应用端数据指标', align: 'center', width: 80, default: 65, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告总ARPU', dataIndex: 'adTotalArpu', label: '应用端数据指标', align: 'center', width: 80, default: 66, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日ecpm', dataIndex: 'firstEcpm', label: '应用端数据指标', align: 'center', width: 80, default: 67, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '总ecpm', dataIndex: 'totalEcpm', label: '应用端数据指标', align: 'center', width: 80, default: 68, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '人均广告有效观看次数', dataIndex: 'userAvgLookCnt', label: '应用端数据指标', align: 'center', width: 85, default: 69, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '用户广告转化率', dataIndex: 'userAdConvertRate', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+
+                {
+                    title: '次日留存率(应用)', dataIndex: 'active2Rate', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存人数', dataIndex: 'active2User', label: '应用端数据指标', align: 'center', width: 75, default: 71, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '操作',
+            data: [
+                {
+                    title: '操作', dataIndex: 'cz', label: '操作', align: 'center', width: 150, default: 75,
+                    render: (_: number, b: any) => {
+                        if (b?.accountId === '总计') return '--'
+                        return <Space>
+                            <a onClick={() => dayHandle(b)} style={{ fontSize: 12 }}>广告每日监控</a>
+                            <a onClick={() => {
+                                window.open(`https://ad.oceanengine.com/superior/promote-manage/ad?aadvid=${b?.accountId}&searchInput=%2522${b?.adId}%2522&searchType=%25229%2522`)
+                            }} style={{ fontSize: 12 }}>头条广告</a>
+                        </Space>
+                    }
+                },
+                // {
+                //     title: '启停',
+                //     dataIndex: 'configuredStatus',
+                //     label: '操作',
+                //     align: 'center',
+                //     width: 45,
+                //     default: 1,
+                //     render: (a: string, b: any) => {
+                //         if (b?.accountId === '总计') {
+                //             return '--'
+                //         }
+                //         return <SwitchStatus configuredStatus={a} isDeleted={b?.isDeleted} adgroupId={b?.promotionId} onChange={onChange} />
+                //     }
+                // }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 539 - 0
src/pages/iaaData/game/ocenaengine/adList/tableConfigDay.tsx

@@ -0,0 +1,539 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { ADSTATUSEnum, LANDINGTYPE, PRICINGEnum, PRODUCT_TYPE_ENUM, PROJECTSTATUs } from "../../../const"
+import { APPTYPE } from "@/pages/iaaSystem/manage/const"
+import './index.less'
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+
+    return [
+        {
+            label: '账户信息',
+            data: [
+                {
+                    title: '推广账号名称', dataIndex: 'accountName', label: '账户信息', align: 'center', width: 100, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '推广账号ID', dataIndex: 'accountId', label: '账户信息', align: 'center', width: 100, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '备注', dataIndex: 'notes', label: '账户信息', align: 'center', width: 100, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '账户信息', align: 'center', width: 100, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '渠道名称', dataIndex: 'agentName', label: '账户信息', align: 'center', width: 80, default: 16,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '渠道ID', dataIndex: 'agentId', label: '账户信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'zxPitcherName', label: '账户信息', align: 'center', width: 60, default: 15,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '账户信息', align: 'right', width: 75, sorter: true, default: 21,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '账户信息', align: 'center', width: 80, default: 11,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用类型', dataIndex: 'appType', label: '账户信息', align: 'center', width: 80, default: 12,
+                    render: (a: string) => (<WidthEllipsis value={APPTYPE[a as keyof typeof APPTYPE]?.text} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '账户信息', align: 'center', width: 100, default: 13,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '账户信息', align: 'center', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序名称', dataIndex: 'mpName', label: '账户信息', align: 'center', width: 100, default: 14,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '账户信息', align: 'center', width: 100,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                }
+            ]
+        },
+        {
+            label: '广告信息',
+            data: [
+                {
+                    title: '广告组', dataIndex: 'campaignId', label: '广告信息', align: 'center', width: 100, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告组名称', dataIndex: 'campaignName', label: '广告信息', align: 'center', width: 100, default: 8,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'adName', label: '广告信息', align: 'center', width: 100, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'adId', label: '广告信息', align: 'center', width: 80, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '广告状态', dataIndex: 'adStatus', label: '广告信息', align: 'center', width: 95, default: 17,
+                    render: (a: string) => (<WidthEllipsis value={(ADSTATUSEnum as any)[a]} />)
+                },
+                {
+                    title: '项目名称', dataIndex: 'projectName', label: '广告信息', align: 'center', width: 75, default: 18,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '项目ID', dataIndex: 'projectId', label: '广告信息', align: 'center', width: 75,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '项目类型', dataIndex: 'adType', label: '广告信息', align: 'center', width: 75, default: 19,
+                    render: (a: string) => (<WidthEllipsis value={a === 'ALL' ? '所有广告' : a === 'SEARCH' ? '搜索广告' : '--'} />)
+                },
+                {
+                    title: '项目状态', dataIndex: 'proStatus', label: '广告信息', align: 'center', width: 75, default: 20,
+                    render: (a: string) => (<WidthEllipsis value={(PROJECTSTATUs as any)[a]} />)
+                },
+                {
+                    title: '项目预算', dataIndex: 'proBudget', label: '广告信息', align: 'right', width: 75, default: 28, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '预算类型', dataIndex: 'budgetMode', label: '广告信息', align: 'center', width: 70, default: 29, 
+                    render: (a: string) => (<WidthEllipsis value={a === 'BUDGET_MODE_DAY' ? '日预算' : a === 'BUDGET_MODE_TOTAL' ? '总预算' : '--'} />)
+                },
+                {
+                    title: '推广目标', dataIndex: 'landingType', label: '广告信息', align: 'center', width: 100, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={(LANDINGTYPE as any)[a]} />)
+                },
+                {
+                    title: '媒体平台', dataIndex: 'mediaPlatform', label: '广告信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '广告信息', align: 'center', width: 80, default: 22,
+                    render: (a: string) => (<WidthEllipsis value={(PRICINGEnum as any)[a]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '广告信息', align: 'center', width: 75, default: 23, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告日预算', dataIndex: 'dayBudget', label: '广告信息', align: 'right', width: 75, default: 24, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '投放时间', dataIndex: 'startTime', label: '广告信息', align: 'center', width: 180, default: 31,
+                    render: (a: string, b: any) => b?.accountId === '总计' ? '--' : <WidthEllipsis value={a + (b?.endTime ? '~' + b?.endTime : '')} />
+                },
+                {
+                    title: '广告创建时间', dataIndex: 'promotionCreateTime', label: '广告信息', align: 'center', width: 130, default: 32,
+                    render: (a: string, b: any) => <WidthEllipsis value={a} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '广告信息', align: 'center', width: 75, default: 30,
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '消耗数据',
+            data: [
+                {
+                    title: '消耗时间', dataIndex: 'dt', label: '消耗数据', align: 'center', width: 100,
+                    render: (a: string) => <WidthEllipsis value={a} />
+                },
+                {
+                    title: '今日消耗', dataIndex: 'cost', label: '消耗数据', align: 'center', width: 85, default: 33, 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: 'adTotalCost', label: '消耗数据', align: 'center', width: 85, default: 34, 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>
+                }
+            ]
+        },
+        {
+            label: '广告媒体端展示数据指标',
+            data: [
+                {
+                    title: '曝光量', dataIndex: 'showCount', label: '广告媒体端展示数据指标', align: 'center', width: 70, default: 35, sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击量', dataIndex: 'click', label: '广告媒体端展示数据指标', align: 'center', width: 70, default: 36, sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告媒体端展示数据指标', align: 'center', width: 70, default: 37, sorter: true, 
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击均价', dataIndex: 'avgClickCost', label: '广告媒体端展示数据指标', align: 'center', width: 65, default: 38, sorter: true, 
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'avgShowCost', label: '广告媒体端展示数据指标', align: 'right', width: 65, default: 39, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+            ]
+        },
+        {
+            label: '广告媒体端转化数据指标',
+            data: [
+                {
+                    title: '转化目标', dataIndex: 'convertTarget', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 25, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a} />
+                },
+                {
+                    title: '转化目标量', dataIndex: 'convertCount', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 40, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 27, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标率', dataIndex: 'convertRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 26, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活数', dataIndex: 'active', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 41, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活成本', dataIndex: 'activeCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 42, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活率', dataIndex: 'activeRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 43, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册数', dataIndex: 'register', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 49, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(广告)', dataIndex: 'activeRegisterCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 50, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册率', dataIndex: 'activeRegisterRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 51, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '关键行为数', dataIndex: 'gameAddiction', label: '广告媒体端转化数据指标', align: 'center', width: 65, default: 46, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '关键行为成本', dataIndex: 'gameAddictionCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 44, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '关键行为率', dataIndex: 'gameAddictionRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 45, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次留成本', dataIndex: 'attributionNextDayOpenCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, default: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存数', dataIndex: 'attributionNextDayOpenCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次留率(广告)', dataIndex: 'attributionNextDayOpenRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, default: 72, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次留回传数', dataIndex: 'nextDayOpen', label: '广告媒体端转化数据指标', align: 'center', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '2日留存数', dataIndex: 'attributionRetention2dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '2日留存成本', dataIndex: 'attributionRetention2dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '2日留存率', dataIndex: 'attributionRetention2dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '3日留存数', dataIndex: 'attributionRetention3dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存成本', dataIndex: 'attributionRetention3dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '3日留存率', dataIndex: 'attributionRetention3dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '4日留存数', dataIndex: 'attributionRetention4dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '4日留存成本', dataIndex: 'attributionRetention4dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '4日留存率', dataIndex: 'attributionRetention4dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '5日留存数', dataIndex: 'attributionRetention5dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存成本', dataIndex: 'attributionRetention5dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '5日留存率', dataIndex: 'attributionRetention5dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '6日留存数', dataIndex: 'attributionRetention6dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '6日留存成本', dataIndex: 'attributionRetention6dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '6日留存率', dataIndex: 'attributionRetention6dRate', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '7日留存数', dataIndex: 'attributionRetention7dCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存成本', dataIndex: 'attributionRetention7dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存总数', dataIndex: 'attributionRetention7dSumCnt', label: '广告媒体端转化数据指标', align: 'center', width: 65, sorter: true, default: 74, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '7日留存率', dataIndex: 'attributionRetention7dTotalCost', label: '广告媒体端转化数据指标', align: 'center', width: 70, sorter: true, className: "adDataBackColorClass",
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '7日留存总成本', dataIndex: 'attributionRetention7dCost', label: '广告媒体端转化数据指标', align: 'right', width: 75, sorter: true, default: 73, className: "adDataBackColorClass",
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '小程序/小游戏变现指标',
+            data: [
+                {
+                    title: '小程序/小游戏当日LTV(首日)', dataIndex: 'attributionMicroGame0dLtv', label: '小程序/小游戏变现指标', align: 'center', width: 85,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小程序/小游戏激活后三日LTV', dataIndex: 'attributionMicroGame3dLtv', label: '小程序/小游戏变现指标', align: 'center', width: 85,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小程序/小游戏当日(首日)广告变现ROI', dataIndex: 'attributionMicroGame0dRoi', label: '小程序/小游戏变现指标', align: 'center', width: 95, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小程序/小游戏激活后三日广告变现ROI', dataIndex: 'attributionMicroGame3dRoi', label: '小程序/小游戏变现指标', align: 'center', width: 95, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小程序/小游戏激活后七日广告变现ROI', dataIndex: 'attributionMicroGame7dRoi', label: '小程序/小游戏变现指标', align: 'center', width: 95, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小程序/小游戏激活后七日LTV', dataIndex: 'attributionMicroGame7dLtv', label: '小程序/小游戏变现指标', align: 'center', width: 85,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '应用端数据指标',
+            data: [
+                {
+                    title: '今日注册人数', dataIndex: 'todayRegUser', label: '应用端数据指标', align: 'center', width: 65, default: 47, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告总注册人数', dataIndex: 'totalRegUser', label: '应用端数据指标', align: 'center', width: 65, default: 48, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(应用)', dataIndex: 'regCost', label: '应用端数据指标', align: 'right', width: 75, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均新增成本', dataIndex: 'totalRegCost', label: '应用端数据指标', align: 'right', width: 75, default: 52, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现人数', dataIndex: 'regFirstUser', label: '应用端数据指标', align: 'center', width: 85, default: 53, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现次数', dataIndex: 'regFirstCnt', label: '应用端数据指标', align: 'center', width: 85, default: 54, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现金额', dataIndex: 'regFirstAmount', label: '应用端数据指标', align: 'right', width: 85, default: 55, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日变现ROI', dataIndex: 'regFirstRoi', label: '应用端数据指标', align: 'center', width: 70, default: 56, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册24小时广告变现人数', dataIndex: 'regTwentyFourUser', label: '应用端数据指标', align: 'center', width: 85, default: 57, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时广告变现次数', dataIndex: 'regTwentyFourCnt', label: '应用端数据指标', align: 'center', width: 85, default: 58, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时广告变现金额', dataIndex: 'regTwentyFourAmount', label: '应用端数据指标', align: 'right', width: 85, default: 59, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时变现ROI', dataIndex: 'regTwentyFourRoi', label: '应用端数据指标', align: 'center', width: 70, default: 60, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册3日广告变现人数', dataIndex: 'regThreeUser', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现次数', dataIndex: 'regThreeCnt', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现金额', dataIndex: 'regThreeAmount', label: '应用端数据指标', align: 'right', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日变现ROI', dataIndex: 'regThreeRoi', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册7日广告变现人数', dataIndex: 'regSevenUser', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日广告变现次数', dataIndex: 'regSevenCnt', label: '应用端数据指标', align: 'center', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日广告变现金额', dataIndex: 'regSevenAmount', label: '应用端数据指标', align: 'right', width: 85, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日变现ROI', dataIndex: 'regSevenRoi', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '累计首日广告变现人数', dataIndex: 'regTotalUser', label: '应用端数据指标', align: 'center', width: 85, default: 61, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告变现次数', dataIndex: 'regTotalCnt', label: '应用端数据指标', align: 'center', width: 85, default: 62, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告变现金额', dataIndex: 'regTotalAmount', label: '应用端数据指标', align: 'right', width: 85, default: 63, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告变现ROI', dataIndex: 'regTotalRoi', label: '应用端数据指标', align: 'center', width: 70, default: 64, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日新增ARPU', dataIndex: 'firstNewArpu', label: '应用端数据指标', align: 'center', width: 80, default: 65, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告总ARPU', dataIndex: 'adTotalArpu', label: '应用端数据指标', align: 'center', width: 80, default: 66, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日ecpm', dataIndex: 'firstEcpm', label: '应用端数据指标', align: 'center', width: 80, default: 67, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '总ecpm', dataIndex: 'totalEcpm', label: '应用端数据指标', align: 'center', width: 80, default: 68, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '人均广告有效观看次数', dataIndex: 'userAvgLookCnt', label: '应用端数据指标', align: 'center', width: 85, default: 69, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '用户广告转化率', dataIndex: 'userAdConvertRate', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                
+                {
+                    title: '次日留存率(应用)', dataIndex: 'active2Rate', label: '应用端数据指标', align: 'center', width: 70, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存人数', dataIndex: 'active2User', label: '应用端数据指标', align: 'center', width: 75, default: 71, sorter: true, className: 'payDataBackColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 99 - 0
src/pages/iaaData/game/ocenaengine/appEveryDayData/index.tsx

@@ -0,0 +1,99 @@
+
+import React, { useEffect, useState } from "react"
+import columns12 from "./tableConfig";
+import TablePro from "@/components/TablePro";
+import QueryForm from "@/components/QueryForm";
+import moment from "moment";
+import { useModel } from "umi";
+import { useAjax } from "@/Hook/useAjax";
+import { getByteAppListApi, GetByteAppListProps, getByteAppTotalApi } from "@/services/iaaData";
+
+/**
+ * 应用每日数据
+ * @returns 
+ */
+const AppEveryDayData: React.FC = () => {
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [queryForm, setQueryForm] = useState<GetByteAppListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().format('YYYY-MM-DD'),
+        costDayEnd: moment().format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+
+    const getByteAppList = useAjax((params) => getByteAppListApi(params))
+    const getByteAppTotal = useAjax((params) => getByteAppTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getByteAppList.run({ ...queryForm, appId, productType })
+            getByteAppTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; appName: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.appName = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, appName: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    return <div>
+        <TablePro
+            leftChild={<QueryForm
+                initialValues={{ day1: [moment(), moment()] }}
+                day1={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['costDayBegin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['costDayEnd'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['costDayBegin']
+                        delete newQueryForm['costDayEnd']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12()}
+            configName={'头条应用每日数据'}
+            fixed={{ left: 4, right: 0 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='头条应用每日数据(游戏)'
+            loading={getByteAppList.loading}
+            ajax={getByteAppList}
+            page={getByteAppList?.data?.data?.current || 1}
+            pageSize={getByteAppList?.data?.data?.size || 20}
+            total={getByteAppList?.data?.data?.total || 0}
+            dataSource={getByteAppList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryForm.pageNum.toString() + (index + '')) }))}
+            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 })
+            }}
+        />
+    </div>
+}
+
+export default AppEveryDayData

+ 700 - 0
src/pages/iaaData/game/ocenaengine/appEveryDayData/tableConfig.tsx

@@ -0,0 +1,700 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { PRODUCT_TYPE_ENUM } from "../../../const"
+import { formatSecondsToTime } from "@/utils/utils"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+
+    return [
+        {
+            label: '基本信息',
+            data: [
+                {
+                    title: '应用', dataIndex: 'appName', label: '基本信息', align: 'center', width: 120, default: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '基本信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序名称', dataIndex: 'mpName', label: '基本信息', align: 'center', width: 85, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '基本信息', align: 'center', width: 80,
+                    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: 'dt', label: '基本信息', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '累计消耗', dataIndex: 'costTotal', label: '基本信息', align: 'center', width: 95, default: 5, sorter: true,
+                    className: 'padding_0 redColorClass',
+                    render: (a: number) => <div style={{ height: 26, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic style={{ fontWeight: 'bold' }} value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '每日真实消耗', dataIndex: 'costDruth', label: '基本信息', align: 'center', width: 90, default: 6, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '每日消耗', dataIndex: 'cost', label: '基本信息', align: 'center', width: 85, default: 7, sorter: true,
+                    className: 'padding_0 redColorClass',
+                    render: (a: number) => <div style={{ height: 26, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '每日赔付金', dataIndex: 'payout', label: '基本信息', align: 'right', width: 80, default: 8, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '推广广告账号数量', tips: '消耗大于0', dataIndex: 'accountCount', label: '基本信息', align: 'center', width: 80, default: 9, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '推广广告数量', tips: '消耗大于0', dataIndex: 'adCount', label: '基本信息', align: 'center', width: 80, default: 10, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '广告媒体端指标',
+            data: [
+                {
+                    title: '点击量(广告)', dataIndex: 'click', label: '广告媒体端指标', align: 'center', width: 65, default: 11, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '曝光量(广告)', dataIndex: 'showCount', label: '广告媒体端指标', align: 'center', width: 65, default: 12, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本(广告)', dataIndex: 'avgShowCost', label: '广告媒体端指标', align: 'right', width: 80, default: 13, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '点击均价(广告)', dataIndex: 'avgClickCost', label: '广告媒体端指标', align: 'right', width: 65, default: 14, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '点击率(广告)', dataIndex: 'ctr', label: '广告媒体端指标', align: 'center', width: 80, default: 15, 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: 'convertCount', label: '广告媒体端指标', align: 'center', width: 65, default: 16, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '广告媒体端指标', align: 'right', width: 65, default: 17, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '转化目标率', dataIndex: 'convertRate', label: '广告媒体端指标', align: 'center', width: 80, default: 18, 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: 'active', label: '广告媒体端指标', align: 'center', width: 65, default: 19, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活成本(广告)', dataIndex: 'activeCost', label: '广告媒体端指标', align: 'right', width: 65, default: 20, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '激活率(广告)', dataIndex: 'activeRate', label: '广告媒体端指标', align: 'center', width: 80, default: 21, 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: 'register', label: '广告媒体端指标', align: 'center', width: 65, default: 22, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(广告)', dataIndex: 'activeRegisterCost', label: '广告媒体端指标', align: 'right', width: 65, default: 23, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '注册率(广告)', dataIndex: 'activeRegisterRate', label: '广告媒体端指标', align: 'center', width: 80, default: 24, 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: '当日LTV(首日)', dataIndex: 'attributionMicroGame0dLtv', label: '广告媒体端指标', align: 'center', width: 75, default: 25, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活后三日LTV', dataIndex: 'attributionMicroGame3dLtv', label: '广告媒体端指标', align: 'center', width: 65, default: 26, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活后七日LTV', dataIndex: 'attributionMicroGame7dLtv', label: '广告媒体端指标', align: 'center', width: 65, default: 27, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '当日(首日)广告变现ROI', dataIndex: 'attributionMicroGame0dRoi', label: '广告媒体端指标', align: 'center', width: 80, default: 28, 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: 'attributionMicroGame3dRoi', label: '广告媒体端指标', align: 'center', width: 80, default: 29, 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: 'attributionMicroGame7dRoi', label: '广告媒体端指标', align: 'center', width: 80, default: 30, 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: 'todayRegUserSys', label: '应用系统数据', align: 'center', width: 80, default: 31, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计注册人数(系统)', dataIndex: 'totalRegUserSys', label: '应用系统数据', align: 'center', width: 80, default: 32, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'DAU(系统)', dataIndex: 'dau', label: '应用系统数据', align: 'center', width: 80, default: 33, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新增占比(系统)', dataIndex: 'newPro', label: '应用系统数据', align: 'center', width: 90, default: 34, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '今日新增注册成本(系统)', dataIndex: 'newRegCost', label: '应用系统数据', align: 'right', width: 80, default: 35, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={(a || 0) / 100} precision={2} />
+                },
+                {
+                    title: '人均新增成本(系统)', dataIndex: 'avgNewRegCost', label: '应用系统数据', align: 'right', width: 80, default: 36, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={(a || 0) / 100} precision={2} />
+                },
+                {
+                    title: '人均活跃成本(系统)', dataIndex: 'avgActiveCost', label: '应用系统数据', align: 'right', width: 80, default: 37, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={(a || 0) / 100} precision={2} />
+                },
+                {
+                    title: '注册首日广告变现人数', dataIndex: 'regFirstUser', label: '应用系统数据', align: 'center', width: 80, default: 38, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现次数', dataIndex: 'regFirstCnt', label: '应用系统数据', align: 'center', width: 80, default: 39, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现金额', dataIndex: 'regFirstAmount', label: '应用系统数据', align: 'right', width: 100, default: 40, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册首日变现ROI', dataIndex: 'regFirstRoi', label: '应用系统数据', align: 'center', width: 80, default: 41, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册24小时广告变现人数', dataIndex: 'regTwentyFourUser', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时广告变现次数', dataIndex: 'regTwentyFourCnt', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册24小时广告变现金额', dataIndex: 'regTwentyFourAmount', label: '应用系统数据', align: 'right', width: 100, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册24小时变现ROI', dataIndex: 'regTwentyFourRoi', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册3日广告变现人数', dataIndex: 'regThreeUser', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现次数', dataIndex: 'regThreeCnt', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现金额', dataIndex: 'regThreeAmount', label: '应用系统数据', align: 'right', width: 100, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册3日变现ROI', dataIndex: 'regThreeRoi', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册7日广告变现人数', dataIndex: 'regSevenUser', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日广告变现次数', dataIndex: 'regSevenCnt', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日广告变现金额', dataIndex: 'regSevenAmount', label: '应用系统数据', align: 'right', width: 100, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册7日变现ROI', dataIndex: 'regSevenRoi', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册累计广告变现人数(系统)', dataIndex: 'regTotalUser', label: '应用系统数据', align: 'center', width: 90, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册累计广告变现次数(系统)', dataIndex: 'regTotalCnt', label: '应用系统数据', align: 'center', width: 90, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册累计广告变现金额(系统)', dataIndex: 'regTotalAmount', label: '应用系统数据', align: 'right', width: 100, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册累计广告变现ROI(系统)', dataIndex: 'regTotalRoi', label: '应用系统数据', align: 'center', width: 90, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日新增ARPU(系统)', dataIndex: 'firstNewArpu', label: '应用系统数据', align: 'center', width: 90, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告总ARPU(系统)', dataIndex: 'adTotalArpu', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日ecpm(系统)', dataIndex: 'firstEcpm', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '总ecpm(系统)', dataIndex: 'totalEcpm', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '人均广告有效观看次数', dataIndex: 'userAvgLookCnt', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存人数(系统)', dataIndex: 'active2User', label: '应用系统数据', align: 'center', width: 70, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存率(系统)', dataIndex: 'active2Rate', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '用户广告转化率(系统)', dataIndex: 'userAdConvertRate', label: '应用系统数据', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    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: 'newUser1', label: '应用媒体数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计新增用户人数(应用)', dataIndex: 'totalNewUser1', label: '应用媒体数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'DAU(应用活跃用户人数)', dataIndex: 'dau1', label: '应用媒体数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '今日新增占比(应用)', dataIndex: 'newPro1', label: '应用媒体数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '今日新增用户成本(应用)', dataIndex: 'newUserCost', label: '应用媒体数据', align: 'right', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '人均新增成本(应用)', dataIndex: 'avgNewCost', label: '应用媒体数据', align: 'right', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '人均活跃成本(应用)', dataIndex: 'avgActiveCost1', label: '应用媒体数据', align: 'right', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '分享次数', dataIndex: 'shareTime', label: '应用媒体数据', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '打开次数', dataIndex: 'openTime', label: '应用媒体数据', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均打开次数', dataIndex: 'perUserOpenTime', label: '应用媒体数据', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '用户总停留时长', dataIndex: 'totalUserStayTimeStr', label: '应用媒体数据', align: 'center', width: 120, sorter: true,
+                    render: (a: number) => {
+                        return formatSecondsToTime(a ? Math.round(a) : 0)
+                    }
+                },
+                {
+                    title: '人均停留时长', dataIndex: 'perUserStayTimeStr', label: '应用媒体数据', align: 'center', width: 120, sorter: true,
+                    render: (a: number) => {
+                        return formatSecondsToTime(a ? Math.round(a) : 0)
+                    }
+                },
+                {
+                    title: '次均停留时长', dataIndex: 'avgStaytimeStr', label: '应用媒体数据', align: 'center', width: 120, sorter: true,
+                    render: (a: number) => {
+                        return formatSecondsToTime(a ? Math.round(a) : 0)
+                    }
+                },
+                {
+                    title: '新增用户次日留存人数(应用)', dataIndex: 'newUserD2', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新增用户次日留存率(应用)', dataIndex: 'newUserD2Rate', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '活跃用户次日留存人数(应用)', dataIndex: 'actUserD2', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '活跃用户次日留存率(应用)', dataIndex: 'actUserD2Rate', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日激活用户人数(应用)', dataIndex: 'firstUser', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日激活用户成本(应用)', dataIndex: 'costPerAction', label: '应用媒体数据', align: 'right', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '注册用户首日激活率(应用)', dataIndex: 'firstUserRate', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活首日新增广告收入(应用)', dataIndex: 'newAdIncome', label: '应用媒体数据', align: 'right', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '激活首日新增广告ROI(应用)', dataIndex: 'newAdRoi', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日激活用户变现人数(应用)', dataIndex: 'newAdUser', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日激活变现率(应用)', dataIndex: 'newAdRate', label: '应用媒体数据', align: 'center', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '注册首日变现率(应用)', dataIndex: 'regAdFirstRate', label: '应用媒体数据', align: 'center', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活用户首日新增ecpm', dataIndex: 'newEcpm', label: '应用媒体数据', align: 'center', width: 85, sorter: true,
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活用户首日新增ARPU', dataIndex: 'newPayArpu', label: '应用媒体数据', align: 'center', width: 85, sorter: true,
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活用户首日曝光pv(应用)', dataIndex: 'adShowPv', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活用户首日点击数pv(应用)', dataIndex: 'adClickPv', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活用户首日cpc', dataIndex: 'costPerClick', label: '应用媒体数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活用户首日ctr', dataIndex: 'clickRate', label: '应用媒体数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活用户次日留存人数(应用)', dataIndex: 'motivateUserD2', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活用户次日留存率(应用)', dataIndex: 'motivateUserD2Rate', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活用户首日LTV(应用)', dataIndex: 'motivateUserFirstLtv', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告变现收入(应用)', dataIndex: 'totalAdIncome', label: '应用媒体数据', align: 'right', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '广告变现累计利润(应用)', dataIndex: 'totalAdProfit', label: '应用媒体数据', align: 'right', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '广告变现成本利润率(应用)', dataIndex: 'totalAdProfitRate', label: '应用媒体数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '毛利率(应用)', dataIndex: 'grossMargin', label: '应用媒体数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '累计广告变现ROI(应用)', dataIndex: 'totalAdRoi', label: '应用媒体数据', align: 'center', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告位总数据(账面)', dataIndex: 'adZMTotal', label: '应用媒体数据', align: 'center',
+                    children: [
+                        {
+                            title: '广告请求PV',
+                            dataIndex: 'totalRequest',
+                            key: 'totalRequest',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '曝光PV',
+                            dataIndex: 'totalShow',
+                            key: 'totalShow',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击PV',
+                            dataIndex: 'totalClick',
+                            key: 'totalClick',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击率',
+                            dataIndex: 'totalClickRate',
+                            key: 'totalClickRate',
+                            width: 80,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                        },
+                        {
+                            title: 'ecpm',
+                            dataIndex: 'totalEcpm1',
+                            key: 'totalEcpm1',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                        {
+                            title: '广告收入',
+                            dataIndex: 'totalRealCost',
+                            key: 'totalRealCost',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                    ]
+                },
+                {
+                    title: '激励式视频(账面)', dataIndex: 'jlZMTotal', label: '应用媒体数据', align: 'center',
+                    children: [
+                        {
+                            title: '广告请求PV',
+                            dataIndex: 'videoRequest',
+                            key: 'videoRequest',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '曝光PV',
+                            dataIndex: 'videoShow',
+                            key: 'videoShow',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击PV',
+                            dataIndex: 'videoClick',
+                            key: 'videoClick',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击率',
+                            dataIndex: 'videoClickRate',
+                            key: 'videoClickRate',
+                            width: 80,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                        },
+                        {
+                            title: 'ecpm',
+                            dataIndex: 'videoEcpm',
+                            key: 'videoEcpm',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                        {
+                            title: '广告收入',
+                            dataIndex: 'videoRealCost',
+                            key: 'videoRealCost',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                    ]
+                },
+                {
+                    title: 'Banner广告(账面)', dataIndex: 'bannerZMTotal', label: '应用媒体数据', align: 'center',
+                    children: [
+                        {
+                            title: '广告请求PV',
+                            dataIndex: 'bannerRequest',
+                            key: 'bannerRequest',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '曝光PV',
+                            dataIndex: 'bannerShow',
+                            key: 'bannerShow',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击PV',
+                            dataIndex: 'bannerClick',
+                            key: 'bannerClick',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击率',
+                            dataIndex: 'bannerClickRate',
+                            key: 'bannerClickRate',
+                            width: 80,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                        },
+                        {
+                            title: 'ecpm',
+                            dataIndex: 'bannerEcpm',
+                            key: 'bannerEcpm',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                        {
+                            title: '广告收入',
+                            dataIndex: 'bannerRealCost',
+                            key: 'bannerRealCost',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                    ]
+                },
+                {
+                    title: '插屏广告(账面)', dataIndex: 'cpZMTotal', label: '应用媒体数据', align: 'center',
+                    children: [
+                        {
+                            title: '广告请求PV',
+                            dataIndex: 'plaqueRequest',
+                            key: 'plaqueRequest',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '曝光PV',
+                            dataIndex: 'plaqueShow',
+                            key: 'plaqueShow',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击PV',
+                            dataIndex: 'plaqueClick',
+                            key: 'plaqueClick',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a || 0} />
+                        },
+                        {
+                            title: '点击率',
+                            dataIndex: 'plaqueClickRate',
+                            key: 'plaqueClickRate',
+                            width: 80,
+                            align: 'center',
+                            render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                        },
+                        {
+                            title: 'ecpm',
+                            dataIndex: 'plaqueEcpm',
+                            key: 'plaqueEcpm',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                        {
+                            title: '广告收入',
+                            dataIndex: 'plaqueRealCost',
+                            key: 'plaqueRealCost',
+                            width: 70,
+                            align: 'center',
+                            render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                        },
+                    ]
+                },
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 49 - 0
src/pages/iaaData/game/tencent/adList/const.tsx

@@ -0,0 +1,49 @@
+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' = '快应用',
+}

+ 94 - 0
src/pages/iaaData/game/tencent/adList/dayAd.tsx

@@ -0,0 +1,94 @@
+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 { getGDTDailyListApi } from "@/services/iaaData"
+
+interface Props {
+    queryForm: {
+        costDayBegin?: string,
+        costDayEnd?: string
+    }
+    iaaApp: string,
+    adName: string,
+    promotionId?: number
+    onClose?: () => void
+    visible?: boolean
+}
+
+/**
+ * 广告每日监控
+ * @returns 
+ */
+const DayAd: React.FC<Props> = ({ iaaApp, adName, queryForm, promotionId, 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 getGDTDailyList = useAjax((params) => getGDTDailyListApi(params))
+    /***********************************/
+
+    useEffect(() => {
+        let params: any = {}
+        const [appId, productType] = iaaApp.split('||')
+        if (promotionId) {
+            params.promotionId = promotionId
+        }
+        if (date && date?.length > 0) {
+            params.costDayBegin = date[0]
+            params.costDayEnd = date[1]
+        } else {
+            delete params?.costDayBegin
+            delete params?.costDayEnd
+        }
+        getGDTDailyList.run({ ...params, ...data, appId, productType })
+    }, [promotionId, queryForm, data, date, 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={getGDTDailyList}
+            loading={getGDTDailyList.loading}
+            fixed={{ left: 3, right: 0 }}
+            dataSource={getGDTDailyList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(data.pageNum.toString() + index.toString()) }))}
+            page={getGDTDailyList?.data?.data?.current || 1}
+            pageSize={getGDTDailyList?.data?.data?.size || 20}
+            total={getGDTDailyList?.data?.data?.total || 0}
+            title='腾讯广告每日监控'
+            onChange={(pagination: any, _: any, sortData: any) => {
+                let { current, pageSize } = pagination
+                let newQueryForm = JSON.parse(JSON.stringify(data))
+                if (sortData && sortData?.order) {
+                    newQueryForm['sortAsc'] = sortData?.order === 'ascend' ? true : false
+                    newQueryForm['sortFiled'] = sortData?.field
+                } else {
+                    delete newQueryForm['sortAsc']
+                    delete newQueryForm['sortFiled']
+                }
+                newQueryForm.pageNum = current || newQueryForm.pageNum
+                newQueryForm.pageSize = pageSize || newQueryForm.pageSize
+                setData({ ...newQueryForm })
+            }}
+            config={columns12()}
+            configName={'腾讯广告每日监控'}
+        />
+    </Drawer>
+}
+
+export default React.memo(DayAd)

+ 0 - 0
src/pages/iaaData/game/tencent/adList/index.less


+ 214 - 0
src/pages/iaaData/game/tencent/adList/index.tsx

@@ -0,0 +1,214 @@
+import React, { useEffect, useState } from "react"
+import { useAjax } from "@/Hook/useAjax"
+import { getGDTListApi, GetGDTListProps, getGDTTotalApi } 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, notification, Space } from "antd"
+import { newEditAdqAdgroupsDataApi } from "@/services/gameData"
+import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons"
+import DayAd from "./dayAd"
+
+/**
+ * 腾讯广告列表
+ * @returns 
+ */
+const TencentIaaAd: 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[]>([])
+    const [visible, setVisible] = useState<boolean>(false)
+    const [promotionId, setPromotionId] = useState<number>()
+    const [adName, setAdName] = useState<string>('')
+
+    const editAdqAdgroupsData = useAjax((params) => newEditAdqAdgroupsDataApi(params))
+    const getGDTList = useAjax((params) => getGDTListApi(params))
+    const getGDTTotal = useAjax((params) => getGDTTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getGDTList.run({ ...queryForm, appId, productType })
+            getGDTTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; accountId: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.accountId = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, accountId: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    const dayHandle = (data: any) => {
+        setVisible(true)
+        setAdName(data.promotionName)
+        setPromotionId(data.promotionId)
+    }
+
+    // 批量启停
+    const adStatus = (type: 'play' | 'suspend') => {
+        let params: any = {}
+        if (type === 'play') {
+            params.configuredStatus = 'AD_STATUS_NORMAL'
+            params.adgroupIds = selectedRows.filter((item: { configuredStatus: string, promotionId: number }) => item.configuredStatus === 'AD_STATUS_SUSPEND').map(item => item.promotionId)
+        } else {
+            params.configuredStatus = 'AD_STATUS_SUSPEND'
+            params.adgroupIds = selectedRows.filter((item: { configuredStatus: string, promotionId: number }) => item.configuredStatus === 'AD_STATUS_NORMAL').map(item => item.promotionId)
+        }
+        if (params.adgroupIds.length === 0) {
+            message.warn(`所以账号都是${type === 'play' ? '启动' : '暂停'}状态,无需${type === 'play' ? '启动' : '暂停'}操作`)
+            return
+        }
+        editAdqAdgroupsData.run(params).then(res => {
+            message.success(`${type === 'play' ? '启动' : '暂停'}成功: ${res.success},失败: ${res.fail}`)//
+            if (res?.fail) {
+                notification.error({
+                    message: `${type === 'play' ? '启动' : '暂停'}失败`,
+                    description: `成功: ${res.success},修改失败${res.fail}条,失败的请到任务列表查看`,
+                    duration: 0
+                });
+            }
+            getGDTList.refresh()
+            setSelectedRows([])
+        })
+    }
+
+
+    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={editAdqAdgroupsData.loading} icon={<PlayCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus('play')}>启动</Button>
+                <Button type='primary' size="small" style={{ background: '#e6a23c', borderColor: '#e6a23c' }} loading={editAdqAdgroupsData.loading} icon={<PauseCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus('suspend')}>暂停</Button>
+                <span style={{ color: 'red' }}>操作完数据结果延时5分钟之内,即时结果去腾讯后台查看</span>
+            </Space>}
+            leftChild={<QueryForm
+                initialValues={{ day3: [moment(), moment()] }}
+                isAccountId
+                isPromotionName
+                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, () => { getGDTList.refresh() })}
+            configName={'腾讯广告列表'}
+            fixed={{ left: 4, right: 2 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='腾讯广告列表(游戏)'
+            loading={getGDTList.loading}
+            ajax={getGDTList}
+            page={getGDTList?.data?.data?.current || 1}
+            pageSize={getGDTList?.data?.data?.size || 20}
+            total={getGDTList?.data?.data?.total || 0}
+            dataSource={getGDTList?.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.promotionId + ''),
+                getCheckboxProps: (record: any) => ({
+                    disabled: record.status === 'STATUS_DELETED' || record?.accountId === '总计'
+                }),
+                onSelect: (record: { promotionId: number }, selected: boolean) => {
+                    if (selected) {
+                        selectedRows.push({ ...record })
+                        setSelectedRows([...selectedRows])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { promotionId: number }) => item.promotionId !== record.promotionId)
+                        setSelectedRows([...newSelectAccData])
+                    }
+                },
+                onSelectAll: (selected: boolean, selectedRowss: { promotionId: number }[], changeRows: { promotionId: number }[]) => {
+                    if (selected) {
+                        let newSelectAccData = [...selectedRows]
+                        changeRows.forEach((item: { promotionId: number }) => {
+                            let index = newSelectAccData.findIndex((ite: { promotionId: number }) => ite.promotionId === item.promotionId)
+                            if (index === -1) {
+                                newSelectAccData.push({ ...item })
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { promotionId: number }) => {
+                            let index = changeRows.findIndex((ite: { promotionId: number }) => ite.promotionId === item.promotionId)
+                            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) }} queryForm={queryForm} promotionId={promotionId} />}
+    </div>
+}
+
+export default TencentIaaAd

+ 40 - 0
src/pages/iaaData/game/tencent/adList/switchStatus.tsx

@@ -0,0 +1,40 @@
+import { useAjax } from "@/Hook/useAjax"
+import { newEditAdqAdgroupsDataApi } from "@/services/gameData"
+import { message, notification, Switch } from "antd"
+import React from "react"
+
+
+
+/**
+ * 修改启停
+ */
+interface Props {
+    configuredStatus: string,
+    isDeleted?: boolean,
+    adgroupId: number,
+    onChange?: () => void
+}
+const SwitchStatus: React.FC<Props> = (prosp) => {
+
+    const { configuredStatus, isDeleted, adgroupId, onChange } = prosp
+    const editAdqAdgroupsData = useAjax((params) => newEditAdqAdgroupsDataApi(params))
+    
+    const switchHandle = (adgroupIds: number[], configuredStatus: string) => {
+        editAdqAdgroupsData.run({ adgroupIds, configuredStatus }).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={editAdqAdgroupsData.loading} disabled={isDeleted} onChange={(checked) => switchHandle([adgroupId] ,checked ? 'AD_STATUS_NORMAL' : 'AD_STATUS_SUSPEND')}/>
+}
+
+
+export default React.memo(SwitchStatus)

+ 592 - 0
src/pages/iaaData/game/tencent/adList/tableConfig.tsx

@@ -0,0 +1,592 @@
+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"
+
+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: 'promotionName', label: '腾讯广告列表', align: 'center', width: 120, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'promotionId', label: '腾讯广告列表', align: 'center', width: 90, default: 8,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告状态', dataIndex: 'status', label: '腾讯广告列表', align: 'center', width: 75, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={AD_STATUS_ENUM[a as keyof typeof AD_STATUS_ENUM]} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '腾讯广告列表', align: 'center', width: 75, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '腾讯广告列表', align: 'right', width: 75, sorter: true, default: 11,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '竞价信用账户', dataIndex: 'creditRollBalance', label: '腾讯广告列表', align: 'center', width: 85,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '专用账户', dataIndex: 'specialGiftBalance', label: '腾讯广告列表', align: 'center', width: 80,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '微信小游戏内购赠送金', dataIndex: 'mpGameDeveloperGiftBalance', label: '腾讯广告列表', align: 'center', width: 75,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏直接激励金资金账户', dataIndex: 'gameChargeDirectRewardsGiftBalance', label: '腾讯广告列表', align: 'center', width: 80,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '微信小游戏内购快周转', dataIndex: 'mpGameDeveloperWorkingFundBalance', label: '腾讯广告列表', align: 'center', width: 90,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '腾讯广告列表', align: 'center', width: 70, default: 12,
+                    render: (a: string) => (<WidthEllipsis value={BID_MODE_ENUM[a as keyof typeof BID_MODE_ENUM]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '腾讯广告列表', align: 'center', width: 75, default: 13, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '腾讯广告列表', align: 'right', width: 75, default: 14,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告日预算', dataIndex: 'budget', label: '腾讯广告列表', align: 'right', width: 75, default: 15, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告创建时间', dataIndex: 'adTime', label: '基本信息', align: 'center', width: 90, default: 16,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告已删除?', dataIndex: 'isDeleted', 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: '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)} style={{ fontSize: 12 }}>广告每日监控</a>
+                            <a onClick={() => {
+                                window.open(`https://ad.qq.com/atlas/${b?.accountId}/admanage/adgroup?tab=adgroup&query={%22operation_status%22:[%22CALCULATE_STATUS_EXCLUDE_DEL%22],%22system_status%22:[],%22search_name%22:%22${b.promotionId}%22}`)
+                            }} style={{ fontSize: 12 }}>腾讯广告</a>
+                        </Space>
+                    }
+                },
+                {
+                    title: '启停',
+                    dataIndex: 'configuredStatus',
+                    label: '操作',
+                    align: 'center',
+                    width: 45,
+                    default: 1,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') {
+                            return '--'
+                        }
+                        return <SwitchStatus configuredStatus={a} isDeleted={b?.isDeleted} adgroupId={b?.promotionId} onChange={onChange} />
+                    }
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 390 - 0
src/pages/iaaData/game/tencent/adList/tableConfigDay.tsx

@@ -0,0 +1,390 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Badge, Statistic } from "antd"
+import React from "react"
+import { AD_STATUS_ENUM, BID_MODE_ENUM, PRODUCT_TYPE_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: 'promotionName', label: '腾讯广告列表', align: 'center', width: 120, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'promotionId', label: '腾讯广告列表', align: 'center', width: 90, default: 8,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告状态', dataIndex: 'status', label: '腾讯广告列表', align: 'center', width: 75, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={AD_STATUS_ENUM[a as keyof typeof AD_STATUS_ENUM]} />)
+                },
+                {
+                    title: '服务商', dataIndex: 'service', label: '腾讯广告列表', align: 'center', width: 75, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '余额', dataIndex: 'balance', label: '腾讯广告列表', align: 'right', width: 75, sorter: true, default: 11,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '出价方式', dataIndex: 'pricing', label: '腾讯广告列表', align: 'center', width: 70, default: 12,
+                    render: (a: string) => (<WidthEllipsis value={BID_MODE_ENUM[a as keyof typeof BID_MODE_ENUM]} />)
+                },
+                {
+                    title: '当前出价', dataIndex: 'cpaBid', label: '腾讯广告列表', align: 'center', width: 75, default: 13, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '深度转化ROI系数', dataIndex: 'roiGoal', label: '腾讯广告列表', align: 'right', width: 75, default: 14,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告日预算', dataIndex: 'budget', label: '腾讯广告列表', align: 'right', width: 75, default: 15, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告创建时间', dataIndex: 'adTime', label: '基本信息', align: 'center', width: 90, default: 16,
+                    render: (a: string, b: any) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告已删除?', dataIndex: 'isDeleted', 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: '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: 'right', width: 70, default: 20, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告总消耗', dataIndex: 'totalCost', label: '腾讯广告列表', align: 'right', width: 85, default: 21, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    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} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '腾讯广告列表', align: 'center', width: 65, default: 26, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    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} />
+                },
+                {
+                    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} />
+                },
+                {
+                    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,
+                    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,
+                    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,
+                    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,
+                    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,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现ROI(平台上报)', dataIndex: 'incomeRoi124hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    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,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现次数(平台上报)', dataIndex: 'incomePv1dPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现次数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive3dPv', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数(平台上报)', dataIndex: 'minigame7dIncomeCount', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现次数(平台上报)', dataIndex: 'minigame3dIncomeCount', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额(平台上报)', dataIndex: 'incomeVal24hPla', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现金额(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationAmount', label: '其他业务(平台上报指标)', width: 120, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册7日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD7', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活14日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD14', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmount', label: '其他业务(平台上报指标)', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现人数(平台上报)', dataIndex: 'adPayingUsers24hPla', label: '其他业务(平台上报指标)', width: 115, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive1dPv', label: '其他业务(平台上报指标)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive7dPv', label: '其他业务(平台上报指标)', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '其他业务(其他指标)',
+            data: [
+                {
+                    title: '激活首24小时广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost24h', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现ARPPU', dataIndex: 'firstDayAdPurArppuCost', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现ARPPU', dataIndex: 'adMonetizationArppu', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现ROI', dataIndex: 'incomeRoi124h', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现ROI', dataIndex: 'incomeRoi1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现ROI', dataIndex: 'incomeRoi3', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现ROI', dataIndex: 'incomeRoi7', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活14日广告变现ROI', dataIndex: 'incomeRoi14', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现ROI', dataIndex: 'adMonetizationRoi', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现成本(人数)', dataIndex: 'adPayingCostD1', label: '其他业务(其他指标)', width: 100, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现成本', dataIndex: 'adMonetizationCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现次数', dataIndex: 'adMonetizationActive3dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数', dataIndex: 'adMonetizationActive7dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现次数(平台上报)', dataIndex: 'incomePvPla', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额', dataIndex: 'incomeVal24h', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现金额', dataIndex: 'incomeVal1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现金额', dataIndex: 'incomeVal3', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现金额', dataIndex: 'incomeVal7', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活14日广告变现金额', dataIndex: 'incomeVal14', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现金额', dataIndex: 'adMonetizationAmount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现人数', dataIndex: 'adPayingUsers24h', label: '其他业务(其他指标)', width: 90, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数', dataIndex: 'adPayingUsersD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现人数', dataIndex: 'adMonetizationDedupActive3dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现人数', dataIndex: 'adMonetizationDedupActive7dPv', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            data: [
+                {
+                    title: '小游戏注册首日广告变现ARPU(平台上报)', dataIndex: 'miniGameFirstDayAdPayingArpu', label: '小游戏(平台上报)', width: 130, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现ARPU(平台上报)', dataIndex: 'miniGameAdMonetizationArpu', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册首日广告变现ROI(平台上报)', dataIndex: 'miniGameIncomeRoi1', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现ROI(平台上报)', dataIndex: 'minigame3dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现ROI(平台上报)', dataIndex: 'minigame7dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现ROI(平台上报)', dataIndex: 'miniGameAdMonetizationRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册首日广告变现成本(平台上报)', dataIndex: 'miniGameFirstDayAdPayingCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现成本(平台上报)', dataIndex: 'miniGameAdMonetizationCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD3', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现人数(平台上报)', dataIndex: 'minigame3dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现人数(平台上报)', dataIndex: 'minigame7dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现人数(平台上报)', dataIndex: 'miniGameAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 99 - 0
src/pages/iaaData/game/tencent/appCashAssay/index.tsx

@@ -0,0 +1,99 @@
+import QueryForm from "@/components/QueryForm";
+import TablePro from "@/components/TablePro";
+import { useAjax } from "@/Hook/useAjax";
+import { getAppAnalysisListApi, GetAppAnalysisListProps, getAppAnalysisTotalApi } from "@/services/iaaData";
+import React, { useEffect, useState } from "react"
+import { useModel } from "umi";
+import moment from "moment";
+import columns12 from "./tableConfig";
+
+/**
+ * 应用变现分析
+ * @returns 
+ */
+const AppCashAssay: React.FC = () => {
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [queryForm, setQueryForm] = useState<GetAppAnalysisListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().subtract(1, 'days').format('YYYY-MM-DD'),
+        costDayEnd: moment().subtract(1, 'days').format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+
+    const getAppAnalysisList = useAjax((params) => getAppAnalysisListApi(params))
+    const getAppAnalysisTotal = useAjax((params) => getAppAnalysisTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getAppAnalysisList.run({ ...queryForm, appId, productType })
+            getAppAnalysisTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; dt: string, costDayBegin: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.costDayBegin = queryForm?.costDayBegin || moment().format('YYYY-MM-DD')
+                    data.dt = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, dt: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    return <div>
+        <TablePro
+            leftChild={<QueryForm
+                initialValues={{ day1: [moment().subtract(1, 'days'), moment().subtract(1, 'days')] }}
+                day1={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['costDayBegin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['costDayEnd'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['costDayBegin']
+                        delete newQueryForm['costDayEnd']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12()}
+            configName={'应用变现分析'}
+            fixed={{ left: 4, right: 0 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='应用变现分析(游戏)'
+            loading={getAppAnalysisList.loading}
+            ajax={getAppAnalysisList}
+            page={getAppAnalysisList?.data?.data?.current || 1}
+            pageSize={getAppAnalysisList?.data?.data?.size || 20}
+            total={getAppAnalysisList?.data?.data?.total || 0}
+            dataSource={getAppAnalysisList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryForm.pageNum.toString() + (index + '')) }))}
+            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 })
+            }}
+        />
+    </div>
+}
+
+export default AppCashAssay

+ 213 - 0
src/pages/iaaData/game/tencent/appCashAssay/tableConfig.tsx

@@ -0,0 +1,213 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { PRODUCT_TYPE_ENUM } from "../../../const"
+import style from '../appCashRetained/index.less'
+import moment from "moment"
+import { formatSecondsToTime } from "@/utils/utils"
+import { ACCOUNTTYPE, APPTYPE } from "@/pages/iaaSystem/manage/const"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+    const defaultIndex = 23
+    const days = Array(90).fill('').map((_, index) => {
+
+        const dataIndex = `d${index + 1}`
+        let day: any = {
+            title: `D${index + 1}`, dataIndex, label: '应用变现分析', width: 120,
+            children: [
+                {
+                    title: '注册用户留存',
+                    dataIndex: `trend${index + 1}`,
+                    key: `trend${index + 1}`,
+                    width: 100,
+                    align: 'center',
+                    className: index % 2 ? "goldColor1Class" : undefined,
+                    render: (_: any, b: any) => {
+                        if (moment().subtract(1, 'days') >= moment(b.dt === '总计' ? b.costDayBegin : b.dt).add(index, 'days')) {
+                            const data = b?.[dataIndex]?.split('/')
+                            return <div className={style.dbox}>
+                                <span style={{ color: '#d81b60', fontWeight: 600 }}>人数:<span><Statistic value={data?.[0] || 0} /></span></span>
+                                <span style={{ color: '#0f538a', fontWeight: 600 }}>率:<span><Statistic value={data?.[1] ? data?.[1] * 100 : 0} precision={2} valueStyle={!data?.[1] ? {} : data?.[1] >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" /></span></span>
+                            </div>
+                        }
+                        return <div style={{ height: 45.84, width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>--</div>
+                    },
+                },
+                {
+                    title: '人均',
+                    dataIndex: `income${index}`,
+                    key: `income${index}`,
+                    width: 140,
+                    align: 'center',
+                    className: index % 2 ? "goldColor1Class" : undefined,
+                    render: (_: any, b: any) => {
+                        if (moment().subtract(1, 'days') >= moment(b.dt === '总计' ? b.costDayBegin : b.dt).add(index, 'days')) {
+                            const data = b?.[dataIndex]?.split('/')
+                            return <div className={style.dbox}>
+                                <span style={{ color: '#d81b60', fontWeight: 600 }}>在线时长:<span>{formatSecondsToTime(data?.[2] ? Math.round(data?.[2]) : 0)}</span></span>
+                                <span style={{ color: '#0f538a', fontWeight: 600 }}>启动次数:<span><Statistic value={data?.[3] || 0} precision={2} /></span></span>
+                                <span style={{ color: 'rgb(12,130,16)', fontWeight: 600 }}>看广告数:<span><Statistic value={data?.[4] || 0} precision={2} /></span></span>
+                            </div>
+                        }
+                        return <div style={{ height: 45.84, width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>--</div>
+                    }
+                },
+                {
+                    title: '广告',
+                    dataIndex: `ad${index}`,
+                    key: `ad${index}`,
+                    width: 120,
+                    align: 'center',
+                    className: index % 2 ? "goldColor1Class" : undefined,
+                    render: (_: any, b: any) => {
+                        if (moment().subtract(1, 'days') >= moment(b.dt === '总计' ? b.costDayBegin : b.dt).add(index, 'days')) {
+                            const data = b?.[dataIndex]?.split('/')
+                            return <div className={style.dbox}>
+                                <span style={{ color: 'rgb(12,130,16)', fontWeight: 600 }}>渗透率:<span><Statistic value={data?.[5] ? data?.[5] * 100 : 0} precision={2} valueStyle={!data?.[5] ? {} : data?.[5] >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" /></span></span>
+                                <span style={{ color: '#ff5722', fontWeight: 600 }}>eCPM:<span><Statistic value={data?.[6] || 0} precision={2} /></span></span>
+                                <span style={{ color: '#d81b60', fontWeight: 600 }}>ARPU:<span><Statistic value={data?.[7] || 0} precision={2} /></span></span>
+                            </div>
+                        }
+                        return <div style={{ height: 45.84, width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>--</div>
+                    }
+                },
+            ]
+        }
+        if (index < 30) {
+            day.default = defaultIndex + index
+        }
+        return day
+    })
+
+    return [
+        {
+            label: '应用变现分析',
+            data: [
+                {
+                    title: '日期', dataIndex: 'dt', label: '应用变现分析', align: 'center', width: 80, default: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '应用变现分析', align: 'center', width: 120, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '应用变现分析', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序名称', dataIndex: 'mpName', label: '应用变现分析', align: 'center', width: 85, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '应用变现分析', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '应用变现分析', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用类型', dataIndex: 'appType', label: '应用变现分析', align: 'center', width: 80, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={APPTYPE[a as keyof typeof APPTYPE]?.text} />)
+                },
+                {
+                    title: '推广媒体', dataIndex: 'accountType', label: '应用变现分析', align: 'center', width: 80, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={ACCOUNTTYPE[a as keyof typeof ACCOUNTTYPE]?.text} />)
+                },
+                {
+                    title: '变现广告位', dataIndex: 'realizationAdUnit', label: '应用变现分析', align: 'center', width: 80, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '总消耗', dataIndex: 'totalCost', label: '应用变现分析', align: 'right', width: 95, default: 8, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 66.27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '消耗', dataIndex: 'cost', label: '应用变现分析', align: 'right', width: 85, default: 9, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 66.27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '赔付金', dataIndex: 'payout', label: '应用变现分析', align: 'right', width: 80, default: 10, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册人数', dataIndex: 'userRegCnt', label: '应用变现分析', align: 'center', width: 80, default: 11, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本', dataIndex: 'regPaid', label: '应用变现分析', align: 'center', width: 80, default: 12, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '最新留存人数', dataIndex: 'userRetentionCnt', label: '应用变现分析', align: 'center', width: 80, default: 13, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '最新留存率', dataIndex: 'userRetentionRatio', label: '应用变现分析', align: 'center', width: 80, default: 14, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告变现人数', dataIndex: 'adMonetizeUv', label: '应用变现分析', align: 'center', width: 75, default: 15, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '总广告ecpm', dataIndex: 'totalAdEcpm', label: '应用变现分析', align: 'center', width: 80, default: 16, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '总广告ARPU', dataIndex: 'totalAdArpu', label: '应用变现分析', align: 'center', width: 80, default: 17, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告曝光量', dataIndex: 'viewTotal', label: '应用变现分析', align: 'center', width: 80, default: 18, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计总收入', dataIndex: 'totalIncome', label: '应用变现分析', align: 'right', width: 80, default: 19, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '累计总回收', dataIndex: 'incomeRoi', label: '应用变现分析', align: 'center', width: 80, default: 20, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '分享成功人数', dataIndex: 'shareUv', label: '应用变现分析', align: 'center', width: 75, default: 21, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '分享后活跃人数', dataIndex: 'shareClkUv', label: '应用变现分析', align: 'center', width: 80, default: 22, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                ...days
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 12 - 0
src/pages/iaaData/game/tencent/appCashRetained/index.less

@@ -0,0 +1,12 @@
+.dbox{
+    display: flex;
+    flex-flow: column;
+    align-items: center;
+    font-size: 12px;
+    // padding: 10px;
+    >span{
+        display: flex;
+        justify-content: left;
+        width: 100%;
+    }
+}

+ 100 - 0
src/pages/iaaData/game/tencent/appCashRetained/index.tsx

@@ -0,0 +1,100 @@
+import { getAppTrendListApi, GetAppTrendListProps, getAppTrendTotalApi } from "@/services/iaaData";
+import React, { useEffect, useState } from "react"
+import { useModel } from "umi";
+import moment from "moment";
+import { useAjax } from "@/Hook/useAjax";
+import TablePro from "@/components/TablePro";
+import QueryForm from "@/components/QueryForm";
+import columns12 from "./tableConfig";
+
+/**
+ * 应用变现留存
+ * @returns 
+ */
+const AppCashTrend: React.FC = () => {
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [queryForm, setQueryForm] = useState<GetAppTrendListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().subtract(1, 'days').format('YYYY-MM-DD'),
+        costDayEnd: moment().subtract(1, 'days').format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+
+    const getAppTrendList = useAjax((params) => getAppTrendListApi(params))
+    const getAppTrendTotal = useAjax((params) => getAppTrendTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getAppTrendList.run({ ...queryForm, appId, productType })
+            getAppTrendTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; dt: string, costDayBegin: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.costDayBegin = queryForm?.costDayBegin || moment().format('YYYY-MM-DD')
+                    data.dt = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, dt: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    return <div>
+        <TablePro
+            leftChild={<QueryForm
+                initialValues={{ day1: [moment().subtract(1, 'days'), moment().subtract(1, 'days')] }}
+                day1={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['costDayBegin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['costDayEnd'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['costDayBegin']
+                        delete newQueryForm['costDayEnd']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12()}
+            configName={'应用变现留存'}
+            fixed={{ left: 4, right: 0 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='应用变现留存(游戏)'
+            loading={getAppTrendList.loading}
+            ajax={getAppTrendList}
+            page={getAppTrendList?.data?.data?.current || 1}
+            pageSize={getAppTrendList?.data?.data?.size || 20}
+            total={getAppTrendList?.data?.data?.total || 0}
+            dataSource={getAppTrendList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryForm.pageNum.toString() + (index + '')) }))}
+            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 })
+            }}
+        />
+    </div>
+}
+
+export default AppCashTrend

+ 163 - 0
src/pages/iaaData/game/tencent/appCashRetained/tableConfig.tsx

@@ -0,0 +1,163 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { PRODUCT_TYPE_ENUM } from "../../../const"
+import { formatSecondsToTime } from "@/utils/utils"
+import style from './index.less'
+import moment from "moment"
+import { ACCOUNTTYPE, APPTYPE } from "@/pages/iaaSystem/manage/const"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+    const defaultIndex = 23
+    const trend = [1, 2, 3, 4, 5, 6, 7, 14, 30, 45, 60, 75, 90].map((index, count) => {
+
+        const dataIndex = `d${index}`
+        return {
+            title: `D${index}`, dataIndex, label: '基本信息', default: defaultIndex + count, width: 120,
+            render: (_: any, b: any) => {
+                if (moment().subtract(1, 'days') >= moment(b.dt === '总计' ? b.costDayBegin : b.dt).add(index - 1, 'days')) {
+                    const data = b?.[dataIndex]?.split('/')
+                    return <div className={style.dbox} style={{ height: 45.84 }}>
+                        <span style={{ color: '#d81b60', fontWeight: 600 }}>人数:<span><Statistic value={data?.[0] || 0} precision={2} /></span></span>
+                        <span style={{ color: '#0f538a', fontWeight: 600 }}>留存率:<span><Statistic value={data?.[1] ? data?.[1] * 100 : 0} precision={2} valueStyle={!data?.[1] ? {} : data?.[1] >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" /></span></span>
+                    </div>
+                }
+                return <div style={{ height: 45.84, width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>--</div>
+            }
+        }
+
+    })
+
+    return [
+        {
+            label: '基本信息',
+            data: [
+                {
+                    title: '日期', dataIndex: 'dt', label: '基本信息', align: 'center', width: 80, default: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '基本信息', align: 'center', width: 120, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '基本信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序名称', dataIndex: 'mpName', label: '基本信息', align: 'center', width: 85, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '基本信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '基本信息', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用类型', dataIndex: 'appType', label: '基本信息', align: 'center', width: 80, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={APPTYPE[a as keyof typeof APPTYPE]?.text} />)
+                },
+                {
+                    title: '推广媒体', dataIndex: 'accountType', label: '基本信息', align: 'center', width: 80, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={ACCOUNTTYPE[a as keyof typeof ACCOUNTTYPE]?.text} />)
+                },
+                {
+                    title: '变现广告位', dataIndex: 'realizationAdUnit', label: '基本信息', align: 'center', width: 80, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '总消耗', dataIndex: 'totalCost', label: '基本信息', align: 'right', width: 95, default: 8, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 53.8, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic style={{ fontWeight: 'bold' }} value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '消耗', dataIndex: 'cost', label: '基本信息', align: 'right', width: 85, default: 9, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 53.8, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '赔付金', dataIndex: 'payout', label: '基本信息', align: 'right', width: 80, default: 10, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册人数', dataIndex: 'userRegCnt', label: '基本信息', align: 'center', width: 80, default: 11, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本', dataIndex: 'regPaid', label: '基本信息', align: 'center', width: 80, default: 12, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '今日留存人数', dataIndex: 'userRetentionCnt', label: '基本信息', align: 'center', width: 80, default: 13, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '今日留存率', dataIndex: 'userRetentionCntRatio', label: '基本信息', align: 'center', width: 80, default: 14, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日广告变现人数', dataIndex: 'appAdPayingUsers', label: '基本信息', align: 'center', width: 75, default: 15, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+
+                {
+                    title: '总ecpm', dataIndex: 'totalEcpm', label: '基本信息', align: 'center', width: 80, default: 16, sorter: true,
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '总arpu', dataIndex: 'totalArpu', label: '基本信息', align: 'center', width: 80, default: 17, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告总曝光量', dataIndex: 'viewTotal', label: '基本信息', align: 'center', width: 80, default: 18, sorter: true,
+                    render: (a: number, b: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计总收入', dataIndex: 'totalIncome', label: '基本信息', align: 'right', width: 80, default: 19, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '累计总回收', dataIndex: 'totalIncomRoi', label: '基本信息', align: 'right', width: 80, default: 20, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '分享成功人数', dataIndex: 'shareUv', label: '基本信息', align: 'center', width: 75, default: 21, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '分享后活跃人数', dataIndex: 'shareClkUv', label: '基本信息', align: 'center', width: 80, default: 22, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                ...trend
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 12 - 0
src/pages/iaaData/game/tencent/appCashTrend/index.less

@@ -0,0 +1,12 @@
+.dbox{
+    display: flex;
+    flex-flow: column;
+    align-items: center;
+    font-size: 12px;
+    // padding: 10px;
+    >span{
+        display: flex;
+        justify-content: left;
+        width: 100%;
+    }
+}

+ 100 - 0
src/pages/iaaData/game/tencent/appCashTrend/index.tsx

@@ -0,0 +1,100 @@
+import { getAppTrendListApi, GetAppTrendListProps, getAppTrendNewListApi, getAppTrendNewTotalApi, getAppTrendTotalApi } from "@/services/iaaData";
+import React, { useEffect, useState } from "react"
+import { useModel } from "umi";
+import moment from "moment";
+import { useAjax } from "@/Hook/useAjax";
+import TablePro from "@/components/TablePro";
+import QueryForm from "@/components/QueryForm";
+import columns12 from "./tableConfig";
+
+/**
+ * 应用变现趋势
+ * @returns 
+ */
+const AppCashTrend: React.FC = () => {
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [queryForm, setQueryForm] = useState<GetAppTrendListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().subtract(1, 'days').format('YYYY-MM-DD'),
+        costDayEnd: moment().subtract(1, 'days').format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+
+    const getAppTrendList = useAjax((params) => getAppTrendNewListApi(params))
+    const getAppTrendTotal = useAjax((params) => getAppTrendNewTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getAppTrendList.run({ ...queryForm, appId, productType })
+            getAppTrendTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; dt: string, costDayBegin: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.costDayBegin = queryForm?.costDayBegin || moment().format('YYYY-MM-DD')
+                    data.dt = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, dt: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    return <div>
+        <TablePro
+            leftChild={<QueryForm
+                initialValues={{ day1: [moment().subtract(1, 'days'), moment().subtract(1, 'days')] }}
+                day1={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['costDayBegin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['costDayEnd'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['costDayBegin']
+                        delete newQueryForm['costDayEnd']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12()}
+            configName={'应用变现趋势'}
+            fixed={{ left: 4, right: 0 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='应用变现趋势(游戏)'
+            loading={getAppTrendList.loading}
+            ajax={getAppTrendList}
+            page={getAppTrendList?.data?.data?.current || 1}
+            pageSize={getAppTrendList?.data?.data?.size || 20}
+            total={getAppTrendList?.data?.data?.total || 0}
+            dataSource={getAppTrendList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryForm.pageNum.toString() + (index + '')) }))}
+            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 })
+            }}
+        />
+    </div>
+}
+
+export default AppCashTrend

+ 165 - 0
src/pages/iaaData/game/tencent/appCashTrend/tableConfig.tsx

@@ -0,0 +1,165 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { PRODUCT_TYPE_ENUM } from "../../../const"
+import style from './index.less'
+import moment from "moment"
+import { ACCOUNTTYPE, APPTYPE } from "@/pages/iaaSystem/manage/const"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+    const defaultIndex = 23
+    const trend = [1, 2, 3, 4, 5, 6, 7, 14, 30, 45, 60, 75, 90].map((index, count) => {
+
+        const dataIndex = `d${index}`
+        return {
+            title: `D${index}`, dataIndex, label: '基本信息', default: defaultIndex + count, width: 110,
+            render: (_: any, b: any) => {
+                if (moment().subtract(1, 'days') >= moment(b.dt === '总计' ? b.costDayBegin : b.dt).add(index - 1, 'days')) {
+                    const data = b?.[dataIndex]?.split('/')
+                    return <div className={style.dbox} style={{ height: 102 }}>
+                        <span style={{ color: '#d81b60', fontWeight: 600 }}>新增:<span><Statistic value={data?.[2] || 0} precision={2} /></span></span>
+                        <span style={{ color: '#0f538a', fontWeight: 600 }}>累计:<span><Statistic value={data?.[3] || 0} precision={2} /></span></span>
+                        <span style={{ color: 'rgb(12,130,16)', fontWeight: 600 }}>增:<span><Statistic value={data?.[4] ? data?.[4] * 100 : 0} precision={2} valueStyle={!data?.[4] ? {} : data?.[4] >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" /></span></span>
+                        <span style={{ color: '#ff5722', fontWeight: 600 }}>回:<span><Statistic value={data?.[5] ? data?.[5] * 100 : 0} precision={2} valueStyle={!data?.[5] ? {} : data?.[5] >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" /></span></span>
+                        <span style={{ color: '#d81b60', fontWeight: 600 }}>倍:<span><Statistic value={data?.[6] || 0} precision={2} /></span></span>
+                    </div>
+                }
+                return <div style={{ height: 102, width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>--</div>
+            }
+        }
+
+    })
+
+    return [
+        {
+            label: '基本信息',
+            data: [
+                {
+                    title: '日期', dataIndex: 'dt', label: '基本信息', align: 'center', width: 80, default: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '基本信息', align: 'center', width: 120, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '基本信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序名称', dataIndex: 'mpName', label: '基本信息', align: 'center', width: 85, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '基本信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '基本信息', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用类型', dataIndex: 'appType', label: '基本信息', align: 'center', width: 80, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={APPTYPE[a as keyof typeof APPTYPE]?.text} />)
+                },
+                {
+                    title: '推广媒体', dataIndex: 'accountType', label: '基本信息', align: 'center', width: 80, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={ACCOUNTTYPE[a as keyof typeof ACCOUNTTYPE]?.text} />)
+                },
+                {
+                    title: '变现广告位', dataIndex: 'realizationAdUnit', label: '基本信息', align: 'center', width: 80, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '总消耗', dataIndex: 'totalCost', label: '基本信息', align: 'right', width: 95, default: 8, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 107, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic style={{ fontWeight: 'bold' }} value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '消耗', dataIndex: 'cost', label: '基本信息', align: 'right', width: 85, default: 9, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 107, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '赔付金', dataIndex: 'payout', label: '基本信息', align: 'right', width: 80, default: 10, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册人数', dataIndex: 'userRegCnt', label: '基本信息', align: 'center', width: 80, default: 11, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本', dataIndex: 'regPaid', label: '基本信息', align: 'center', width: 80, default: 12, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '今日留存人数', dataIndex: 'userRetentionCnt', label: '基本信息', align: 'center', width: 80, default: 13, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '今日留存率', dataIndex: 'userRetentionCntRatio', label: '基本信息', align: 'center', width: 80, default: 14, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '首日广告变现人数', dataIndex: 'appAdPayingUsers', label: '基本信息', align: 'center', width: 75, default: 15, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+
+                {
+                    title: '总ecpm', dataIndex: 'totalEcpm', label: '基本信息', align: 'center', width: 80, default: 16, sorter: true,
+                    render: (a: number, b: any) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '总arpu', dataIndex: 'totalArpu', label: '基本信息', align: 'center', width: 80, default: 17, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告总曝光量', dataIndex: 'viewTotal', label: '基本信息', align: 'center', width: 80, default: 18, sorter: true,
+                    render: (a: number, b: any) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计总收入', dataIndex: 'totalIncome', label: '基本信息', align: 'right', width: 80, default: 19, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '累计总回收', dataIndex: 'totalIncomRoi', label: '基本信息', align: 'right', width: 80, default: 20, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '分享成功人数', dataIndex: 'shareUv', label: '基本信息', align: 'center', width: 75, default: 21, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '分享后活跃人数', dataIndex: 'shareClkUv', label: '基本信息', align: 'center', width: 80, default: 22, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                ...trend
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 99 - 0
src/pages/iaaData/game/tencent/appEveryDayData/index.tsx

@@ -0,0 +1,99 @@
+import QueryForm from "@/components/QueryForm";
+import TablePro from "@/components/TablePro";
+import { useAjax } from "@/Hook/useAjax";
+import { getAppTxEveryDayListApi, GetAppTxEveryDayListProps, getAppTxEveryDayTotalApi } from "@/services/iaaData";
+import React, { useEffect, useState } from "react"
+import { useModel } from "umi";
+import moment from "moment";
+import columns12 from "./tableConfig";
+
+/**
+ * 应用每日数据
+ * @returns 
+ */
+const AppEveryDayData: React.FC = () => {
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [queryForm, setQueryForm] = useState<GetAppTxEveryDayListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().format('YYYY-MM-DD'),
+        costDayEnd: moment().format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+
+    const getAppTxEveryDayList = useAjax((params) => getAppTxEveryDayListApi(params))
+    const getAppTxEveryDayTotal = useAjax((params) => getAppTxEveryDayTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getAppTxEveryDayList.run({ ...queryForm, appId, productType })
+            getAppTxEveryDayTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; appName: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.appName = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, appName: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    return <div>
+        <TablePro
+            leftChild={<QueryForm
+                initialValues={{ day1: [moment(), moment()] }}
+                day1={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    newQueryForm.pageNum = 1
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['costDayBegin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['costDayEnd'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['costDayBegin']
+                        delete newQueryForm['costDayEnd']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12()}
+            configName={'应用每日数据'}
+            fixed={{ left: 4, right: 0 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='应用每日数据(游戏)'
+            loading={getAppTxEveryDayList.loading}
+            ajax={getAppTxEveryDayList}
+            page={getAppTxEveryDayList?.data?.data?.current || 1}
+            pageSize={getAppTxEveryDayList?.data?.data?.size || 20}
+            total={getAppTxEveryDayList?.data?.data?.total || 0}
+            dataSource={getAppTxEveryDayList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryForm.pageNum.toString() + (index + '')) }))}
+            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 })
+            }}
+        />
+    </div>
+}
+
+export default AppEveryDayData

+ 535 - 0
src/pages/iaaData/game/tencent/appEveryDayData/tableConfig.tsx

@@ -0,0 +1,535 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { PRODUCT_TYPE_ENUM } from "../../../const"
+import { formatSecondsToTime } from "@/utils/utils"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+
+    return [
+        {
+            label: '基本信息',
+            data: [
+                {
+                    title: '应用', dataIndex: 'appName', label: '基本信息', align: 'center', width: 120, default: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '基本信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序名称', dataIndex: 'mpName', label: '基本信息', align: 'center', width: 85, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '基本信息', align: 'center', width: 80,
+                    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: 'dt', label: '基本信息', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '累计消耗', dataIndex: 'costToday', label: '基本信息', align: 'center', width: 95, default: 5, sorter: true,
+                    className: 'padding_0 redColorClass',
+                    render: (a: number) => <div style={{ height: 26, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic style={{ fontWeight: 'bold' }} value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '每日真实消耗', dataIndex: 'costTotal', label: '基本信息', align: 'center', width: 90, default: 6, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '每日消耗', dataIndex: 'cost', label: '基本信息', align: 'center', width: 85, default: 7, sorter: true,
+                    className: 'padding_0 redColorClass',
+                    render: (a: number) => <div style={{ height: 26, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '每日赔付金', dataIndex: 'payout', label: '基本信息', align: 'right', width: 80, default: 8, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '推广广告账号数量', tips: '消耗大于0', dataIndex: 'accountCount', label: '基本信息', align: 'center', width: 80, default: 9, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '推广广告数量', tips: '消耗大于0', dataIndex: 'adCount', label: '基本信息', align: 'center', width: 80, default: 10, sorter: true, className: 'redColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '应用端指标',
+            data: [
+                {
+                    title: '累计注册人数', dataIndex: 'regUserTotal', label: '应用端指标', align: 'center', width: 80, default: 11, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新增注册人数', dataIndex: 'regUserNew', label: '应用端指标', align: 'center', width: 80, default: 12, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'DAU', tips: '日活用户人数', dataIndex: 'dau', label: '应用端指标', align: 'center', width: 80, default: 13, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新增占比', tips: '新增注册人数/DAU', dataIndex: 'newProportion', label: '应用端指标', align: 'center', width: 90, default: 14, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告变现累计利润', tips: '广告变现累计收入-累计消耗', dataIndex: 'totalProfit', label: '应用端指标', align: 'right', width: 100, default: 15, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现利润率', tips: '(广告变现累计收入-累计消耗)/累计消耗*100%', dataIndex: 'profitRate', label: '应用端指标', align: 'center', width: 100, default: 16, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '广告变现收入', dataIndex: 'adMonRevenue', label: '应用端指标', align: 'right', width: 80, default: 17, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={(a || 0) / 100} precision={2} />
+                },
+                {
+                    title: '广告变现累计收入', dataIndex: 'adMonRevenueTotal', label: '应用端指标', align: 'right', width: 85, default: 18, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={(a || 0) / 100} precision={2} />
+                },
+                {
+                    title: '新增用户成本', tips: '总消耗/新增注册人数', dataIndex: 'newUserRate', label: '应用端指标', align: 'right', width: 80, default: 19, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '人均新增成本', tips: '累计消耗/累计注册人数', dataIndex: 'avgUserRate', label: '应用端指标', align: 'right', width: 80, default: 20, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '人均活跃成本', tips: '累计消耗/DAU', dataIndex: 'avgActiveRate', label: '应用端指标', align: 'right', width: 80, default: 21, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '分享用户人数', dataIndex: 'shareUser', label: '应用端指标', align: 'center', width: 70, default: 22, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '分享次数', dataIndex: 'shareCount', label: '应用端指标', align: 'center', width: 60, default: 23, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均分享次数', tips: '分享次数/分享用户人数', dataIndex: 'avgShareCount', label: '应用端指标', align: 'center', width: 80, default: 24, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '分享用户占比', tips: '分享用户人数/DAU', dataIndex: 'shareUserProportion', label: '应用端指标', align: 'center', width: 80, default: 25, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '新增次日留存人数', dataIndex: 'newRetainedTomorrow', label: '应用端指标', align: 'center', width: 80, default: 26, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新增注册次日留存率', tips: '新增注册次日留存人数/新增注册人数', dataIndex: 'newRetainedTomorrowRate', label: '应用端指标', align: 'center', width: 80, default: 27, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '活跃用户次日留存人数', dataIndex: 'retainedUserTomorrow', label: '应用端指标', align: 'center', width: 85, default: 28, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={0} />
+                },
+                {
+                    title: '活跃用户次日留存率', tips: '指定时间活跃(即访问小游戏)的用户,在之后的第1天(或周、月),再次访问小游戏的用户数占比', dataIndex: 'retainedUserTomorrowRate', label: '应用端指标', align: 'center', width: 85, default: 29, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '活跃用户访问次数', dataIndex: 'activeUserAccessCount', label: '应用端指标', align: 'center', width: 100, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '活跃用户人均访问次数', tips: '活跃用户访问次数/活跃用户人数', dataIndex: 'avgActiveUserAccessCount', label: '应用端指标', align: 'center', width: 100, default: 30, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '活跃用户停留总时长', tips: '活跃用户人均停留时长*活跃用户人数', dataIndex: 'activeDuration', label: '应用端指标', align: 'center', width: 110, default: 31, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => {
+                        return formatSecondsToTime(a ? Math.round(a) : 0)
+                    }
+                },
+                {
+                    title: '活跃用户人均停留时长', tips: '活跃用户停留总时长/活跃用户人数', dataIndex: 'avgActiveDuration', label: '应用端指标', align: 'center', width: 120, default: 32, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => {
+                        return formatSecondsToTime(a ? Math.round(a) : 0)
+                    }
+                },
+                {
+                    title: '广告新增ARPU', tips: '广告变现收入/新增注册人数', dataIndex: 'nweAdArpu', label: '应用端指标', align: 'center', width: 80, default: 33, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告总ARPU', tips: '广告累计变现收入/累计注册人数', dataIndex: 'adArpuTotal', label: '应用端指标', align: 'center', width: 80, default: 34, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激励视频广告收入', dataIndex: 'videoAdIncome', label: '应用端指标', align: 'right', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激励视频广告ecpm', dataIndex: 'videoAdEcpm', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激励视频拉取量', dataIndex: 'videoAdCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均视频次数', dataIndex: 'avgUserVideoCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '插屏广告收入', dataIndex: 'plaqueAdIncome', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '插屏广告ecpm', dataIndex: 'plaqueAdEcpm', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '插屏广告拉取量', dataIndex: 'plaqueAdCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '插屏广告曝光量', dataIndex: 'interstitialExposureCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '插屏广告点击量', dataIndex: 'interstitialClickCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激励视频曝光量', dataIndex: 'videoExposureCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激励视频点击量', dataIndex: 'videoClickCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'Banner广告点击量', dataIndex: 'bannerClickCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'Banner广告曝光量', dataIndex: 'bannerExposureCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: 'Banner广告收入', dataIndex: 'bannerIncome', label: '应用端指标', align: 'right', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'Banner广告ecpm', dataIndex: 'bannerEcpm', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: 'banner广告拉取量', dataIndex: 'bannerReqSuccCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均Banner广告广告收益', dataIndex: 'avgUserBannerIncome', label: '应用端指标', align: 'right', width: 100, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '人均激励视频收益', dataIndex: 'avgUserVideoIncome', label: '应用端指标', align: 'right', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '人均插屏广告次数', dataIndex: 'avgUserInterstitialCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均插屏广告收益', dataIndex: 'avgPlaqueAdIncome', label: '应用端指标', align: 'right', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '人均Banner广告次数', dataIndex: 'avgUserBannerCount', label: '应用端指标', align: 'center', width: 80, sorter: true, className: 'green2ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '广告媒体端指标',
+            data: [
+                {
+                    title: '点击量', dataIndex: 'validClickCount', label: '广告媒体端指标', align: 'center', width: 65, default: 35, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册人数', dataIndex: 'miniGameRegisterUsers', label: '广告媒体端指标', align: 'center', width: 80, default: 36, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册率', dataIndex: 'miniGameRegisterRate', label: '广告媒体端指标', align: 'center', width: 80, default: 37, 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: 'miniGameRegisterCost', label: '广告媒体端指标', align: 'right', width: 80, default: 38, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationUsers', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive1dPv', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现次数(平台上报)', dataIndex: 'incomePv1dPla', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现金额(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationAmount', label: '广告媒体端指标', align: 'right', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日变现ARPPU', tips: '注册首日广告变现金额(平台上报)/小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdPayingArpu', label: '广告媒体端指标', align: 'center', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日变现ARPU', tips: '小游戏注册首日广告变现金额(平台上报)/小游戏注册人数', dataIndex: 'miniGameFirstDayAdPayingArppu', label: '广告媒体端指标', align: 'center', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日广告变现成本(平台上报)', dataIndex: 'miniGameFirstDayAdPayingCost', label: '广告媒体端指标', align: 'right', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日ROI', tips: '小游戏注册首日广告变现金额(平台上报)/消耗*100%', dataIndex: 'miniGameFirstDayAdPayingRoi', label: '广告媒体端指标', align: 'center', width: 80, 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: '激活首24小时广告变现人数(平台上报)', dataIndex: 'adPayingUsers24hPla', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现次数(平台上报)', dataIndex: 'incomePv24hPla', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额(平台上报)', dataIndex: 'incomeVal24hPla', label: '广告媒体端指标', align: 'right', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现ARPPU(平台上报)', dataIndex: 'firstDayAdPurArppuCost24hPla', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '24小时广告变现ARPU(平台上报)', dataIndex: 'firstDayAdPurArpuCost24hPla', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '24小时广告变现成本', dataIndex: 'firstDayAdPurArpuCost24hPlaCost', label: '广告媒体端指标', align: 'right', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '24小时广告变现ROI', dataIndex: 'firstDayAdPurArpuCost24hPlaRoi', label: '广告媒体端指标', align: 'center', width: 80, 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日广告变现人数(平台上报)', dataIndex: 'minigame3dIncomeUv', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册3日广告变现次数(平台上报)', dataIndex: 'minigame3dIncomeCount', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现次数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive3dPv', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD3', label: '广告媒体端指标', align: 'right', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现ARPPU(平台上报)', dataIndex: 'adPurArppuDay3Cost', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现ARPU(平台上报)', dataIndex: 'adPurArpuDay3Cost', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现成本(平台上报)', dataIndex: 'adPurDay3Cost', label: '广告媒体端指标', align: 'right', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现ROI', dataIndex: 'adPurDay3Roi', label: '广告媒体端指标', align: 'center', width: 80, 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日广告变现人数(平台上报)', dataIndex: 'minigame7dIncomeUv', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive7dPv', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数(平台上报)', dataIndex: 'minigame7dIncomeCount', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现金额(平台上报)', dataIndex: 'miniGameRegD7Amount', label: '广告媒体端指标', align: 'right', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现ARPPU(平台上报)', dataIndex: 'miniGameRegD7Arppu', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现ARPU(平台上报)', dataIndex: 'miniGameRegD7Arpu', label: '广告媒体端指标', align: 'center', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现成本(平台上报', dataIndex: 'miniGameRegD7Cost', label: '广告媒体端指标', align: 'right', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现ROI', dataIndex: 'miniGameRegD7Roi', label: '广告媒体端指标', align: 'center', width: 80, 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: 'miniGameAdMonetizationUsers', label: '广告媒体端指标', align: 'center', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现次数(平台上报)', dataIndex: 'incomePvPla', label: '广告媒体端指标', align: 'center', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmount', label: '广告媒体端指标', align: 'right', width: 100, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现ARPPU(平台上报)', dataIndex: 'miniGameAdMonetizationArppu', label: '广告媒体端指标', align: 'center', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现ARPU(平台上报)', dataIndex: 'miniGameAdMonetizationArpu', label: '广告媒体端指标', align: 'center', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现成本(平台上报)', dataIndex: 'miniGameAdMonetizationCost', label: '广告媒体端指标', align: 'right', width: 80, sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现总ROI', dataIndex: 'miniGameAdMonetizationRoi', label: '广告媒体端指标', align: 'center', width: 80, default: 39, 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: 'totalBalance', label: '应用广告金指标', align: 'right', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告金账户即将过期金额', dataIndex: 'expireBalance', label: '应用广告金指标', align: 'right', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告金账户余额过期时间', dataIndex: 'expireTime', label: '应用广告金指标', align: 'center', width: 85,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告金结算金额', dataIndex: 'amt', label: '应用广告金指标', align: 'right', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告金结算金额有效期', dataIndex: 'amtExpireTime', label: '应用广告金指标', align: 'center', width: 85,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告金金额', dataIndex: 'adFund', label: '应用广告金指标', align: 'right', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '累计广告金金额', dataIndex: 'adFundTotal', label: '应用广告金指标', align: 'right', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '30天内激励用户人数', dataIndex: 'usersWithinThirtyDays', label: '应用广告金指标', align: 'center', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '30天以上的激励用户人数', dataIndex: 'usersBeyondThirtyDays', label: '应用广告金指标', align: 'center', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '30天内激励用户广告流水', dataIndex: 'amtWithinThirtyDays', label: '应用广告金指标', align: 'right', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '30天以上的激励用户广告流水', dataIndex: 'amtBeyondThirtyDays', label: '应用广告金指标', align: 'right', width: 100, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '外部应用激励用户广告流水', dataIndex: 'outerAdFund', label: '应用广告金指标', align: 'right', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '30天内激励用户占比', dataIndex: 'usersWithinThirtyPro', label: '应用广告金指标', align: 'center', width: 85, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: '应用回收数据指标',
+            data: [
+                {
+                    title: '应用总收入', dataIndex: 'appTotalAmount', label: '应用回收数据指标', align: 'right', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '应用累计收入', dataIndex: 'appAddAmount', label: '应用回收数据指标', align: 'right', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '应用累计利润', dataIndex: 'appTotalProfit', label: '应用回收数据指标', align: 'right', width: 100, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '应用累计利润率', dataIndex: 'appTotalProfitRate', label: '应用回收数据指标', align: 'center', width: 100, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 55 - 0
src/pages/iaaData/game/tencent/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/game/tencent/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/game/tencent/dynamic/index.less


+ 265 - 0
src/pages/iaaData/game/tencent/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, Space, Table } from "antd"
+import { 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/game/tencent/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/game/tencent/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

+ 543 - 0
src/pages/iaaData/game/tencent/dynamic/tableConfigDay.tsx

@@ -0,0 +1,543 @@
+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 { 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

+ 100 - 0
src/pages/iaaData/game/tencent/pitcherEveryDay/index.tsx

@@ -0,0 +1,100 @@
+import { useAjax } from "@/Hook/useAjax";
+import { getPutUserTxEveryDayListApi, getPutUserTxEveryDayListProps, getPutUserTxEveryDayTotalApi } from "@/services/iaaData";
+import React, { useEffect, useState } from "react"
+import { useModel } from "umi";
+import moment from "moment";
+import TablePro from "@/components/TablePro";
+import QueryForm from "@/components/QueryForm";
+import columns12 from "./tableConfig";
+
+/**
+ * 投手每日数据
+ * @returns 
+ */
+const PitcherEveryDay: React.FC = () => {
+
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [queryForm, setQueryForm] = useState<getPutUserTxEveryDayListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        costDayBegin: moment().format('YYYY-MM-DD'),
+        costDayEnd: moment().format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+
+    const getPutUserTxEveryDayList = useAjax((params) => getPutUserTxEveryDayListApi(params))
+    const getPutUserTxEveryDayTotal = useAjax((params) => getPutUserTxEveryDayTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getPutUserTxEveryDayList.run({ ...queryForm, appId, productType })
+            getPutUserTxEveryDayTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; pitcher: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.pitcher = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, pitcher: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    return <div>
+        <TablePro
+            leftChild={<QueryForm
+                initialValues={{ day1: [moment(), moment()] }}
+                day1={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                isPutUserIdList
+                onChange={(data: any) => {
+                    console.log(data)
+                    const { day1, ...params } = data
+                    let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                    if (day1 && day1?.length === 2) {
+                        newQueryForm['costDayBegin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['costDayEnd'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['costDayBegin']
+                        delete newQueryForm['costDayEnd']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12()}
+            configName={'投手每日数据'}
+            fixed={{ left: 4, right: 0 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='投手每日数据(游戏)'
+            loading={getPutUserTxEveryDayList.loading}
+            ajax={getPutUserTxEveryDayList}
+            page={getPutUserTxEveryDayList?.data?.data?.current || 1}
+            pageSize={getPutUserTxEveryDayList?.data?.data?.size || 20}
+            total={getPutUserTxEveryDayList?.data?.data?.total || 0}
+            dataSource={getPutUserTxEveryDayList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(queryForm.pageNum.toString() + (index + '')) }))}
+            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 })
+            }}
+        />
+    </div>
+}
+
+export default PitcherEveryDay

+ 300 - 0
src/pages/iaaData/game/tencent/pitcherEveryDay/tableConfig.tsx

@@ -0,0 +1,300 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { PRODUCT_TYPE_ENUM } from "../../../const"
+
+function columns12(): { label: string, fieldSHow?: { label: string, saveField: string, defaultValue: any[], data: any[] }, data: any[] }[] {
+
+
+    return [
+        {
+            label: '基本信息',
+            data: [
+                {
+                    title: '投手', dataIndex: 'pitcher', label: '基本信息', align: 'center', width: 120, default: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '基本信息', align: 'center', width: 80, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用名称', dataIndex: 'appName', label: '基本信息', align: 'center', width: 80, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '应用ID', dataIndex: 'appId', label: '基本信息', align: 'center', width: 80,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '基本信息', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '消耗时间', dataIndex: 'dt', label: '基本信息', align: 'center', width: 80, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '总消耗', dataIndex: 'cost', label: '基本信息', align: 'center', width: 90, default: 6, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 26, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#10c1e9',
+                                to: '#6892d0',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic style={{ fontWeight: 'bold' }} value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '消耗', dataIndex: 'costToday', label: '基本信息', align: 'center', width: 85, default: 7, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 26, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: '50%', top: '50%', width: '100%', padding: '0 5px', transform: 'translate(-50%, -50%)' }}><Statistic value={a || 0} precision={2} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 'bold' } : { fontWeight: 'bold' }} /></span>
+                    </div>
+                },
+                {
+                    title: '赔付金', dataIndex: 'payout', label: '基本信息', align: 'center', width: 80, default: 8, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '推广广告账号数量', tips: '消耗大于0', dataIndex: 'accountCount', label: '基本信息', align: 'center', width: 80, default: 9, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '推广广告数量', tips: '消耗大于0', dataIndex: 'adCount', label: '基本信息', align: 'center', width: 80, default: 10, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '基础数据',
+            data: [
+                {
+                    title: '点击量', dataIndex: 'validClickCount', label: '基础数据', align: 'center', width: 80, default: 11, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '基础数据', align: 'center', width: 80, default: 12, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '基础数据', align: 'center', width: 80, default: 13, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '基础数据', align: 'center', width: 80, default: 14, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册人数', dataIndex: 'miniGameRegisterUsers', label: '基础数据', align: 'center', width: 80, default: 15, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册成本', dataIndex: 'miniGameRegisterCost', label: '基础数据', align: 'center', width: 80, default: 16, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册率', dataIndex: 'miniGameRegisterRate', label: '基础数据', align: 'center', width: 80, default: 17, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: 'D1数据',
+            data: [
+                {
+                    title: '小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationUsers', label: 'D1数据', align: 'center', width: 100, default: 18, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive1dPv', label: 'D1数据', align: 'center', width: 90, default: 19, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首日广告变现次数(平台上报)', dataIndex: 'incomePv1dPla', label: 'D1数据', align: 'center', width: 90, default: 20, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册首日广告变现金额(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationAmount', label: 'D1数据', align: 'center', width: 90, default: 21, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日变现ARPPU', dataIndex: 'miniGameFirstDayAdPayingArppu', label: 'D1数据', align: 'center', width: 80, default: 22, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日变现ARPU', dataIndex: 'miniGameFirstDayAdPayingArpu', label: 'D1数据', align: 'center', width: 80, default: 23, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日广告变现成本(平台上报)', dataIndex: 'miniGameFirstDayAdPayingCost', label: 'D1数据', align: 'center', width: 80, default: 24, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日ROI', dataIndex: 'miniGameFirstDayAdPayingRoi', label: 'D1数据', align: 'center', width: 80, default: 25, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '24小时数据',
+            data: [
+                {
+                    title: '激活首24小时广告变现人数(平台上报)', dataIndex: 'adPayingUsers24hPla', label: '24小时数据', align: 'center', width: 90, default: 26, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现次数(平台上报)', dataIndex: 'incomePv24hPla', label: '24小时数据', align: 'center', width: 90, default: 27, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活首24小时广告变现金额(平台上报)', dataIndex: 'incomeVal24hPla', label: '24小时数据', align: 'center', width: 90, default: 28, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '激活首24小时广告变现ARPPU(平台上报)', dataIndex: 'firstDayAdPurArppuCost24hPla', label: '24小时数据', align: 'center', width: 100, default: 29, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '24小时广告变现ARPU(平台上报)', dataIndex: 'firstDayAdPurArpuCost24hPla', label: '24小时数据', align: 'center', width: 90, default: 30, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '24小时广告变现成本', dataIndex: 'firstDayAdPurArpuCost24hPlaCost', label: '24小时数据', align: 'center', width: 80, default: 31, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '24小时广告变现ROI', dataIndex: 'firstDayAdPurArpuCost24hPlaRoi', label: '24小时数据', align: 'center', width: 80, default: 32, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: 'D3数据',
+            data: [
+                {
+                    title: '小游戏注册3日广告变现人数(平台上报)', dataIndex: 'minigame3dIncomeUv', label: 'D3数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现人数(平台上报)', dataIndex: 'regUserTotal', label: 'D3数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现次数(平台上报)', dataIndex: 'minigame3dIncomeCount', label: 'D3数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活3日广告变现次数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive3dPv', label: 'D3数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD3', label: 'D3数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现ARPPU(平台上报)', dataIndex: 'adPurArppuDay3Cost', label: 'D3数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现ARPU(平台上报)', dataIndex: 'adPurArpuDay3Cost', label: 'D3数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现成本(平台上报)', dataIndex: 'adPurDay3Cost', label: 'D3数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '3日广告变现ROI', dataIndex: 'adPurDay3Roi', label: 'D3数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: 'D7数据',
+            data: [
+                {
+                    title: '小游戏注册7日广告变现人数(平台上报)', dataIndex: 'minigame7dIncomeUv', label: 'D7数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日变现人数(平台上报)', dataIndex: 'adMonetizationPlaDedupActive7dPv', label: 'D7数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活7日广告变现次数(平台上报)', dataIndex: 'minigame7dIncomeCount', label: 'D7数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现金额(平台上报)', dataIndex: 'miniGameRegD7Amount', label: 'D7数据', align: 'center', width: 90, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现ARPPU(平台上报)', dataIndex: 'miniGameRegD7Arppu', label: 'D7数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现ARPU(平台上报)', dataIndex: 'miniGameRegD7Arpu', label: 'D7数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现成本(平台上报)', dataIndex: 'miniGameRegD7Cost', label: 'D7数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '7日广告变现ROI', dataIndex: 'miniGameRegD7Roi', label: 'D7数据', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: 'D总数据',
+            data: [
+                {
+                    title: '广告变现人数(平台上报)', dataIndex: 'miniGameAdMonetizationUsers', label: 'D总数据', align: 'center', width: 80, default: 33, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现次数(平台上报)', dataIndex: 'incomePvPla', label: 'D总数据', align: 'center', width: 80, default: 34, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmount', label: 'D总数据', align: 'center', width: 80, default: 35, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现ARPPU(平台上报)', dataIndex: 'miniGameAdMonetizationArppu', label: 'D总数据', align: 'center', width: 80, default: 36, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现ARPU(平台上报)', dataIndex: 'miniGameAdMonetizationArpu', label: 'D总数据', align: 'center', width: 80, default: 37, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现成本(平台上报)', dataIndex: 'miniGameAdMonetizationCost', label: 'D总数据', align: 'center', width: 80, default: 38, sorter: true,
+                    render: (a: number) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '广告变现总ROI', dataIndex: 'miniGameAdMonetizationRoi', label: 'D总数据', align: 'center', width: 80, default: 39, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 49 - 0
src/pages/iaaData/novel/tencent/adList/const.tsx

@@ -0,0 +1,49 @@
+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' = '快应用',
+}

+ 94 - 0
src/pages/iaaData/novel/tencent/adList/dayAd.tsx

@@ -0,0 +1,94 @@
+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 { getGDTDailyListApi, getNovelGDTDetailListApi } from "@/services/iaaData"
+
+interface Props {
+    queryForm: {
+        costDayBegin?: string,
+        costDayEnd?: string
+    }
+    iaaApp: string,
+    adName: string,
+    promotionId?: number
+    onClose?: () => void
+    visible?: boolean
+}
+
+/**
+ * 广告每日监控
+ * @returns 
+ */
+const DayAd: React.FC<Props> = ({ iaaApp, adName, queryForm, promotionId, 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 getGDTDailyList = useAjax((params) => getNovelGDTDetailListApi(params))
+    /***********************************/
+
+    useEffect(() => {
+        let params: any = {}
+        const [appId, productType] = iaaApp.split('||')
+        if (promotionId) {
+            params.adgroupId = promotionId
+        }
+        if (date && date?.length > 0) {
+            params.costDayBegin = date[0]
+            params.costDayEnd = date[1]
+        } else {
+            delete params?.costDayBegin
+            delete params?.costDayEnd
+        }
+        getGDTDailyList.run({ ...params, ...data, appId, productType })
+    }, [promotionId, queryForm, data, date, 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={getGDTDailyList}
+            loading={getGDTDailyList.loading}
+            fixed={{ left: 3, right: 0 }}
+            dataSource={getGDTDailyList?.data?.data?.records?.map((item: any, index: number) => ({ ...item, id: Number(data.pageNum.toString() + index.toString()) }))}
+            page={getGDTDailyList?.data?.data?.current || 1}
+            pageSize={getGDTDailyList?.data?.data?.size || 20}
+            total={getGDTDailyList?.data?.data?.total || 0}
+            title='腾讯广告每日监控(小说)'
+            onChange={(pagination: any, _: any, sortData: any) => {
+                let { current, pageSize } = pagination
+                let newQueryForm = JSON.parse(JSON.stringify(data))
+                if (sortData && sortData?.order) {
+                    newQueryForm['sortAsc'] = sortData?.order === 'ascend' ? true : false
+                    newQueryForm['sortFiled'] = sortData?.field
+                } else {
+                    delete newQueryForm['sortAsc']
+                    delete newQueryForm['sortFiled']
+                }
+                newQueryForm.pageNum = current || newQueryForm.pageNum
+                newQueryForm.pageSize = pageSize || newQueryForm.pageSize
+                setData({ ...newQueryForm })
+            }}
+            config={columns12()}
+            configName={'腾讯小说广告每日监控'}
+        />
+    </Drawer>
+}
+
+export default React.memo(DayAd)

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


+ 227 - 0
src/pages/iaaData/novel/tencent/adList/index.tsx

@@ -0,0 +1,227 @@
+import React, { useEffect, useState } from "react"
+import { useAjax } from "@/Hook/useAjax"
+import { getNovelGDTListApi, GetNovelGDTListProps, getNovelGDTTotalApi } from "@/services/iaaData"
+import TablePro from "@/components/TablePro"
+import columns12 from "./tableConfig"
+import moment from "moment"
+import { useModel } from "umi"
+import { Button, message, notification, Space } from "antd"
+import { newEditAdqAdgroupsDataApi } from "@/services/gameData"
+import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons"
+import DayAd from "./dayAd"
+import QueryFormNovel from "@/components/QueryForm/queryFormNovel"
+
+/**
+ * 腾讯广告列表
+ * @returns 
+ */
+const TencentNovelAd: React.FC = () => {
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [selectedRows, setSelectedRows] = useState<any[]>([])
+    const [queryForm, setQueryForm] = useState<GetNovelGDTListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        dataTimeMin: moment().format('YYYY-MM-DD'),
+        dataTimeMax: moment().format('YYYY-MM-DD'),
+    })
+    const [totalData, setTotalData] = useState<any[]>([])
+    const [visible, setVisible] = useState<boolean>(false)
+    const [promotionId, setPromotionId] = useState<number>()
+    const [adName, setAdName] = useState<string>('')
+
+    const editAdqAdgroupsData = useAjax((params) => newEditAdqAdgroupsDataApi(params))
+    const getGDTList = useAjax((params) => getNovelGDTListApi(params))
+    const getGDTTotal = useAjax((params) => getNovelGDTTotalApi(params))
+    /****************************************/
+
+    useEffect(() => {
+        if (initialState?.iaaApp) {
+            const [appId, productType] = initialState.iaaApp.split('||')
+            getGDTList.run({ ...queryForm, appId, productType })
+            getGDTTotal.run({ ...queryForm, appId, productType }).then((res: { data: { id: number; accountId: string } }) => {
+                if (res?.data) {
+                    let data = res?.data
+                    data.id = 1
+                    data.accountId = '总计'
+                    setTotalData([data])
+                } else {
+                    setTotalData([{ id: 1, accountId: '总计' }])
+                }
+            })
+        }
+
+    }, [queryForm, initialState?.iaaApp])
+
+    const dayHandle = (data: any) => {
+        setVisible(true)
+        setAdName(data.adgroupName)
+        setPromotionId(data.adgroupId)
+    }
+
+    // 批量启停
+    const adStatus = (type: 'play' | 'suspend') => {
+        let params: any = {}
+        if (type === 'play') {
+            params.configuredStatus = 'AD_STATUS_NORMAL'
+            params.adgroupIds = selectedRows.filter((item: { configuredStatus: string, adgroupId: number }) => item.configuredStatus === 'AD_STATUS_SUSPEND').map(item => item.adgroupId)
+        } else {
+            params.configuredStatus = 'AD_STATUS_SUSPEND'
+            params.adgroupIds = selectedRows.filter((item: { configuredStatus: string, adgroupId: number }) => item.configuredStatus === 'AD_STATUS_NORMAL').map(item => item.adgroupId)
+        }
+        if (params.adgroupIds.length === 0) {
+            message.warn(`所以账号都是${type === 'play' ? '启动' : '暂停'}状态,无需${type === 'play' ? '启动' : '暂停'}操作`)
+            return
+        }
+        editAdqAdgroupsData.run(params).then(res => {
+            message.success(`${type === 'play' ? '启动' : '暂停'}成功: ${res.success},失败: ${res.fail}`)//
+            if (res?.fail) {
+                notification.error({
+                    message: `${type === 'play' ? '启动' : '暂停'}失败`,
+                    description: `成功: ${res.success},修改失败${res.fail}条,失败的请到任务列表查看`,
+                    duration: 0
+                });
+            }
+            getGDTList.refresh()
+            setSelectedRows([])
+        })
+    }
+
+
+    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={editAdqAdgroupsData.loading} icon={<PlayCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus('play')}>启动</Button>
+                <Button type='primary' size="small" style={{ background: '#e6a23c', borderColor: '#e6a23c' }} loading={editAdqAdgroupsData.loading} icon={<PauseCircleOutlined />} disabled={selectedRows.length === 0} onClick={() => adStatus('suspend')}>暂停</Button>
+                <span style={{ color: 'red' }}>操作完数据结果延时5分钟之内,即时结果去腾讯后台查看</span>
+            </Space>}
+            leftChild={<QueryFormNovel
+                initialValues={{ day3: [moment(), moment()] }}
+                isAccountId
+                isPutUserId
+                isAdgroupId
+                isAdgroupName
+                isMarketingGoal
+                isMarketingTargetType
+                isMemo
+                isRemark
+                isDeleted
+                isStatus
+                isPromotedObjectName
+                isPromotedObjectType
+                isOptimizationGoal
+                isDeepConversionSpec
+                isCostTotalMin
+                isThousandDisplayPriceTotalMin
+                isConversionsCountTotalMin
+                isIncomeRoi1
+                isRegCost
+                isRegCostPla
+                isCpc
+                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['adCreateTimeMin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['adCreateTimeMax'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['adCreateTimeMin']
+                        delete newQueryForm['adCreateTimeMax']
+                    }
+
+                    if (day2 && day2?.length === 2) {
+                        newQueryForm['putDateBegin'] = moment(day2[0]).format('YYYY-MM-DD')
+                        newQueryForm['putDateEnd'] = moment(day2[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['putDateBegin']
+                        delete newQueryForm['putDateEnd']
+                    }
+
+                    if (day3 && day3?.length === 2) {
+                        newQueryForm['dataTimeMin'] = moment(day3[0]).format('YYYY-MM-DD')
+                        newQueryForm['dataTimeMax'] = moment(day3[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['dataTimeMin']
+                        delete newQueryForm['dataTimeMax']
+                    }
+                    setQueryForm({ ...newQueryForm, ...params })
+                }}
+            />}
+            isZj
+            totalData={totalData}
+            config={columns12(dayHandle, () => { getGDTList.refresh() })}
+            configName={'腾讯小说广告列表'}
+            fixed={{ left: 4, right: 2 }}
+            scroll={{ x: 1000, y: 620 }}
+            title='腾讯广告列表(小说)'
+            loading={getGDTList.loading}
+            ajax={getGDTList}
+            page={getGDTList?.data?.data?.current || 1}
+            pageSize={getGDTList?.data?.data?.size || 20}
+            total={getGDTList?.data?.data?.total || 0}
+            dataSource={getGDTList?.data?.data?.records?.map((item: any) => ({ ...item, id: item.adgroupId }))}
+            onChange={(pagination: any, _: any, sortData: any) => {
+                let { current, pageSize } = pagination
+                let newQueryForm = JSON.parse(JSON.stringify(queryForm))
+                if (sortData && sortData?.order) {
+                    newQueryForm['sortAsc'] = sortData?.order === 'ascend' ? true : false
+                    newQueryForm['sortFiled'] = sortData?.field
+                } else {
+                    delete newQueryForm['sortAsc']
+                    delete newQueryForm['sortFiled']
+                }
+                newQueryForm.pageNum = current || newQueryForm.pageNum
+                newQueryForm.pageSize = pageSize || newQueryForm.pageSize
+                setQueryForm({ ...newQueryForm })
+            }}
+            rowSelection={{
+                selectedRowKeys: selectedRows.map(item => item.adgroupId + ''),
+                getCheckboxProps: (record: any) => ({
+                    disabled: record.status === 'STATUS_DELETED' || record?.accountId === '总计'
+                }),
+                onSelect: (record: { adgroupId: number }, selected: boolean) => {
+                    if (selected) {
+                        selectedRows.push({ ...record })
+                        setSelectedRows([...selectedRows])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { adgroupId: number }) => item.adgroupId !== record.adgroupId)
+                        setSelectedRows([...newSelectAccData])
+                    }
+                },
+                onSelectAll: (selected: boolean, selectedRowss: { adgroupId: number }[], changeRows: { adgroupId: number }[]) => {
+                    if (selected) {
+                        let newSelectAccData = [...selectedRows]
+                        changeRows.forEach((item: { adgroupId: number }) => {
+                            let index = newSelectAccData.findIndex((ite: { adgroupId: number }) => ite.adgroupId === item.adgroupId)
+                            if (index === -1) {
+                                newSelectAccData.push({ ...item })
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    } else {
+                        let newSelectAccData = selectedRows.filter((item: { adgroupId: number }) => {
+                            let index = changeRows.findIndex((ite: { adgroupId: number }) => ite.adgroupId === item.adgroupId)
+                            if (index !== -1) {
+                                return false
+                            } else {
+                                return true
+                            }
+                        })
+                        setSelectedRows([...newSelectAccData])
+                    }
+                }
+            }}
+        />
+
+        {visible && <DayAd iaaApp={initialState?.iaaApp as string} adName={adName} visible={visible} onClose={() => { setVisible(false); setPromotionId(undefined) }} queryForm={{ costDayBegin: queryForm?.dataTimeMin, costDayEnd: queryForm?.dataTimeMax }} promotionId={promotionId} />}
+    </div>
+}
+
+export default TencentNovelAd

+ 40 - 0
src/pages/iaaData/novel/tencent/adList/switchStatus.tsx

@@ -0,0 +1,40 @@
+import { useAjax } from "@/Hook/useAjax"
+import { newEditAdqAdgroupsDataApi } from "@/services/gameData"
+import { message, notification, Switch } from "antd"
+import React from "react"
+
+
+
+/**
+ * 修改启停
+ */
+interface Props {
+    configuredStatus: string,
+    isDeleted?: boolean,
+    adgroupId: number,
+    onChange?: () => void
+}
+const SwitchStatus: React.FC<Props> = (prosp) => {
+
+    const { configuredStatus, isDeleted, adgroupId, onChange } = prosp
+    const editAdqAdgroupsData = useAjax((params) => newEditAdqAdgroupsDataApi(params))
+    
+    const switchHandle = (adgroupIds: number[], configuredStatus: string) => {
+        editAdqAdgroupsData.run({ adgroupIds, configuredStatus }).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={editAdqAdgroupsData.loading} disabled={isDeleted} onChange={(checked) => switchHandle([adgroupId] ,checked ? 'AD_STATUS_NORMAL' : 'AD_STATUS_SUSPEND')}/>
+}
+
+
+export default React.memo(SwitchStatus)

+ 659 - 0
src/pages/iaaData/novel/tencent/adList/tableConfig.tsx

@@ -0,0 +1,659 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Badge, Progress, Space, Statistic } from "antd"
+import React from "react"
+import { ADGROUP_STATUS, AdUnitType_Enum, BID_MODE_ENUM, MARKETING_GOAL_ENUM, MARKETING_TARGET_TYPE_ENUM, OPTIMIZATIONGOAL_ENUM, PRODUCT_TYPE_ENUM, SMART_BID_TYPE_ENUM } from "../../../const"
+import SwitchStatus from "./switchStatus"
+import CreativePreview from "../../../components/CreativePreview"
+import TimeSeriesLook from "@/pages/iaaData/components/TimeSeriesLook"
+
+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: 'memo', label: '广告基本信息', width: 80, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '本地备注', dataIndex: 'remark', label: '广告基本信息', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '广告基本信息', align: 'center', width: 80, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '广告基本信息', align: 'center', width: 100, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '广告基本信息', align: 'center', width: 100,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'adgroupId', label: '广告基本信息', align: 'center', width: 80, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '统计日', dataIndex: 'day', label: '广告基本信息', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '公司ID', dataIndex: 'companyId', label: '广告基本信息', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '广告基本信息', align: 'center', width: 60, default: 8,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'adgroupName', label: '广告基本信息', align: 'center', width: 120, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投放日期', dataIndex: 'beginDate', label: '广告基本信息', align: 'center', width: 180, default: 10,
+                    render: (a: string, b: any) => (<WidthEllipsis value={b?.accountId === '总计' ? '--' : `${a}-${b?.endDate}`} />)
+                },
+                {
+                    title: '投放时间', dataIndex: 'timeSeries', label: '广告基本信息', align: 'center', width: 180, default: 11,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <TimeSeriesLook timeSeries={a} />
+                    }
+                },
+                {
+                    title: '首日开始投放时间', dataIndex: 'firstDayBeginTime', label: '广告基本信息', align: 'center', width: 70, default: 12,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '出价', dataIndex: 'bidAmount', label: '广告基本信息', align: 'right', width: 140, default: 13,
+                    render: (a: string, b: { bidMode: string, optimizationGoal: string, accountId: any }) => {
+                        if (b?.accountId === '总计') return '--';
+                        return `${b?.bidMode ? BID_MODE_ENUM[b?.bidMode as keyof typeof BID_MODE_ENUM] : ''} ${a}元/${b?.bidMode === 'BID_MODE_CPM' ? '千次曝光' : b?.bidMode === 'BID_MODE_CPC' ? '点击' : OPTIMIZATIONGOAL_ENUM[b?.optimizationGoal as keyof typeof OPTIMIZATIONGOAL_ENUM]}`
+                    }
+                },
+                {
+                    title: '深度优化出价', dataIndex: 'deepConversionWorthRate', label: '广告基本信息', align: 'center', width: 70, default: 14,
+                    render: (a: string, b: { accountId: any }) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <Statistic value={a || 0} precision={2} />
+                    }
+                },
+                {
+                    title: '出价类型', dataIndex: 'smartBidType', label: '广告基本信息', align: 'center', width: 80, default: 15,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return SMART_BID_TYPE_ENUM[a as keyof typeof SMART_BID_TYPE_ENUM]
+                    }
+                },
+                {
+                    title: '广告组日预算(元)', dataIndex: 'dailyBudget', label: '广告基本信息', align: 'right', width: 70, sorter: true, default: 16,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <Statistic value={a || 0} precision={2} />
+                    }
+                },
+                {
+                    title: '是否开启自动版位功能', dataIndex: 'automaticSiteEnabled', label: '广告基本信息', align: 'center', width: 80, default: 17,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <WidthEllipsis value={a ? '是' : '否'} />
+                    }
+                },
+                {
+                    title: '定向条件描述', dataIndex: 'targetingTranslation', label: '广告基本信息', align: 'center', width: 120,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '是否已删除', dataIndex: 'isDeleted', label: '广告基本信息', align: 'center', width: 60, default: 18,
+                    render: (a: any, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return <Badge status={!a ? "processing" : "error"} text={a ? '是' : '否'} />
+                    }
+                },
+                {
+                    title: '广告状态', dataIndex: 'systemStatus', label: '广告基本信息', align: 'center', width: 100, default: 19,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') return '--';
+                        return ADGROUP_STATUS[a as keyof typeof ADGROUP_STATUS]
+                    }
+                },
+                {
+                    title: '营销目的', dataIndex: 'marketingGoal', label: '广告基本信息', align: 'center', width: 85, default: 20,
+                    render: (a: string) => (<WidthEllipsis value={MARKETING_GOAL_ENUM[a as keyof typeof MARKETING_GOAL_ENUM]} />)
+                },
+                {
+                    title: '推广内容资产类型', dataIndex: 'marketingTargetType', label: '广告基本信息', align: 'center', width: 85, default: 21,
+                    render: (a: string) => (<WidthEllipsis value={MARKETING_TARGET_TYPE_ENUM[a as keyof typeof MARKETING_TARGET_TYPE_ENUM]} />)
+                },
+                {
+                    title: '标记备注', dataIndex: 'tagRemark', label: '广告基本信息', align: 'center', width: 80, default: 22,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务单元类型', dataIndex: 'adUnitType', label: '广告基本信息', align: 'center', width: 75, default: 23,
+                    render: (a: string) => (<WidthEllipsis value={AdUnitType_Enum[a as keyof typeof AdUnitType_Enum]} />)
+                },
+                {
+                    title: '创意预览', dataIndex: 'dynamicCreativeVOList', label: '腾讯广告列表', width: 150, default: 32,
+                    render: (a: any, b: any) => {
+                        if (b?.accountId === '总计') {
+                            return '--'
+                        }
+                        if (a?.length) {
+                            let deliveryMode: string[] = []
+                            let creativePreview = a?.map((item: { creativeComponents: any, deliveryMode: string }) => {
+                                deliveryMode.push(item.deliveryMode)
+                                return { ...item?.creativeComponents }
+                            })
+                            return <CreativePreview creativePreview={creativePreview} deliveryMode={deliveryMode} />
+                        }
+                        return null
+                    }
+                }
+            ]
+        },
+        {
+            label: '广告消耗信息',
+            data: [
+                {
+                    title: '消耗', dataIndex: 'cost', label: '广告消耗信息', align: 'center', width: 85, default: 24, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: 0, top: 2, bottom: 0, right: 0, padding: '0 5px' }}><Statistic value={a || 0} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 500 } : { fontWeight: 500 }} /></span>
+                    </div>
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '广告消耗信息', align: 'center', width: 70, default: 25, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告消耗信息', align: 'right', width: 65, default: 26, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告消耗信息', align: 'center', width: 70, default: 27, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告消耗信息', align: 'center', width: 70, default: 28, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '广告消耗信息', align: 'center', width: 65, default: 29, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '不感兴趣点击次数', dataIndex: 'noInterestCount', label: '广告消耗信息', align: 'center', width: 65, default: 30, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '朋友圈视频播放次数', dataIndex: 'videoPlayCount', label: '广告消耗信息', align: 'center', width: 65, default: 31, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '广告转化信息',
+            data: [
+                {
+                    title: '下载次数', dataIndex: 'downloadCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '安装次数', dataIndex: 'installCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活次数', dataIndex: 'activatedCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注人数', dataIndex: 'followUv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本', dataIndex: 'followCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '公众号关注率', dataIndex: 'followRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '公众号关注次数', dataIndex: 'bizFollowCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注次数成本', dataIndex: 'bizFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '快应用添加次数', dataIndex: 'addDesktopPv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '快应用添加成本', dataIndex: 'addDesktopCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '快应用添加率', dataIndex: 'addDesktopRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加企业微信客服人数', dataIndex: 'scanFollowUserCount', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服成本', dataIndex: 'scanFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '加企业微信客服率', dataIndex: 'scanFollowRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '商品转化',
+            data: [
+                {
+                    title: '首日新增下单量', dataIndex: 'firstDayOrderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日新增下单金额', dataIndex: 'firstDayOrderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '首日新增下单ROI', dataIndex: 'firstDayOrderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '订单量', dataIndex: 'orderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '订单金额', dataIndex: 'orderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '下单成本', dataIndex: 'orderCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '下单率', dataIndex: 'orderRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单ROI', dataIndex: 'orderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '客单价', dataIndex: 'atv', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '转化量', dataIndex: 'conversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化成本', dataIndex: 'conversionsCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '深度转化', dataIndex: 'deepConversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化率', dataIndex: 'conversionsRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加粉数', dataIndex: 'addFansCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加粉成本', dataIndex: 'addFansCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+            ]
+        },
+        {
+            label: '其他业务(平台上报指标)',
+            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: '注册率', dataIndex: 'regRate', label: '其他业务(其他指标)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活注册率', dataIndex: 'activateRegisterRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存次数', dataIndex: 'retentionCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存人数', dataIndex: 'miniGameRetentionD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存成本', dataIndex: 'retentionCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '关键页面次日留存率', dataIndex: 'appKeyPageRetentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存率', dataIndex: 'miniGameRetentionD1Rate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存成本', dataIndex: 'miniGameRetentionD1Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            data: [
+                {
+                    title: '小游戏注册首日广告变现ARPU(平台上报)', dataIndex: 'miniGameFirstDayAdPayingArpu', label: '小游戏(平台上报)', width: 130, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现ARPU(平台上报)', dataIndex: 'miniGameAdMonetizationArpu', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册首日广告变现ROI(平台上报)', dataIndex: 'miniGame1dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册3日广告变现ROI(平台上报)', dataIndex: 'minigame3dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册7日广告变现ROI(平台上报)', dataIndex: 'minigame7dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏广告变现ROI(平台上报)', dataIndex: 'miniGameAdMonetizationRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册首日广告变现成本(平台上报)', dataIndex: 'miniGameFirstDayAdPayingCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏广告变现成本(平台上报)', dataIndex: 'miniGameAdMonetizationCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册3日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD3', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现人数(平台上报)', dataIndex: 'minigame3dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现人数(平台上报)', dataIndex: 'minigame7dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现人数(平台上报)', dataIndex: 'miniGameAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册次数(平台上报)', dataIndex: 'regPlaPv', label: '小游戏(平台上报)', width: 90, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册人数(平台上报+广告主上报)', dataIndex: 'regAllDedupPv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(平台上报+广告主上报)', dataIndex: 'regCostPla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册率(平台上报+广告主上报)', dataIndex: 'regClickRatePla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '操作',
+            data: [
+                {
+                    title: '操作', dataIndex: 'cz', label: '操作', align: 'center', width: 150, default: 33,
+                    render: (_: number, b: any) => {
+                        if (b?.accountId === '总计') return '--'
+                        return <Space>
+                            <a onClick={() => dayHandle(b)} style={{ fontSize: 12 }}>广告每日监控</a>
+                            <a onClick={() => {
+                                window.open(`https://ad.qq.com/atlas/${b?.accountId}/admanage/adgroup?tab=adgroup&query={%22operation_status%22:[%22CALCULATE_STATUS_EXCLUDE_DEL%22],%22system_status%22:[],%22search_name%22:%22${b.adgroupId}%22}`)
+                            }} style={{ fontSize: 12 }}>腾讯广告</a>
+                        </Space>
+                    }
+                },
+                {
+                    title: '启停',
+                    dataIndex: 'configuredStatus',
+                    label: '操作',
+                    align: 'center',
+                    width: 45,
+                    default: 1,
+                    render: (a: string, b: any) => {
+                        if (b?.accountId === '总计') {
+                            return '--'
+                        }
+                        return <SwitchStatus configuredStatus={a} isDeleted={b?.isDeleted} adgroupId={b?.adgroupId} onChange={onChange} />
+                    }
+                }
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 520 - 0
src/pages/iaaData/novel/tencent/adList/tableConfigDay.tsx

@@ -0,0 +1,520 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { AdUnitType_Enum, MARKETING_GOAL_ENUM, MARKETING_TARGET_TYPE_ENUM, PRODUCT_TYPE_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: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '广告基本信息', align: 'center', width: 80, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '广告基本信息', align: 'center', width: 100, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '广告基本信息', align: 'center', width: 100,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'adgroupId', label: '广告基本信息', align: 'center', width: 80, default: 4,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '统计日', dataIndex: 'day', label: '广告基本信息', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '公司ID', dataIndex: 'companyId', label: '广告基本信息', width: 100,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '广告基本信息', align: 'center', width: 60, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'adgroupName', label: '广告基本信息', align: 'center', width: 120, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务单元类型', dataIndex: 'adUnitType', label: '广告基本信息', align: 'center', width: 75, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={AdUnitType_Enum[a as keyof typeof AdUnitType_Enum]} />)
+                }
+            ]
+        },
+        {
+            label: '广告消耗信息',
+            data: [
+                {
+                    title: '消耗', dataIndex: 'cost', label: '广告消耗信息', align: 'center', width: 85, default: 8, sorter: true,
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: 0, top: 2, bottom: 0, right: 0, padding: '0 5px' }}><Statistic value={a || 0} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 500 } : { fontWeight: 500 }} /></span>
+                    </div>
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '广告消耗信息', align: 'center', width: 70, default: 9, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告消耗信息', align: 'right', width: 65, default: 10, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告消耗信息', align: 'center', width: 70, default: 11, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告消耗信息', align: 'center', width: 70, default: 12, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '广告消耗信息', align: 'center', width: 65, default: 13, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '不感兴趣点击次数', dataIndex: 'noInterestCount', label: '广告消耗信息', align: 'center', width: 65, default: 14, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '朋友圈视频播放次数', dataIndex: 'videoPlayCount', label: '广告消耗信息', align: 'center', width: 65, default: 15, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+            ]
+        },
+        {
+            label: '广告转化信息',
+            data: [
+                {
+                    title: '下载次数', dataIndex: 'downloadCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 16,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '安装次数', dataIndex: 'installCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 17,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '激活次数', dataIndex: 'activatedCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 18,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注人数', dataIndex: 'followUv', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 19,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本', dataIndex: 'followCost', label: '广告转化信息', align: 'right', width: 80, sorter: true, default: 20,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '公众号关注率', dataIndex: 'followRate', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 21,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '公众号关注次数', dataIndex: 'bizFollowCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 22,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注次数成本', dataIndex: 'bizFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true, default: 23,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '快应用添加次数', dataIndex: 'addDesktopPv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '快应用添加成本', dataIndex: 'addDesktopCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '快应用添加率', dataIndex: 'addDesktopRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加企业微信客服人数', dataIndex: 'scanFollowUserCount', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 24,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服成本', dataIndex: 'scanFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true, default: 25,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '加企业微信客服率', dataIndex: 'scanFollowRate', label: '广告转化信息', align: 'center', width: 80, sorter: true, default: 26,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        },
+        {
+            label: '商品转化',
+            data: [
+                {
+                    title: '首日新增下单量', dataIndex: 'firstDayOrderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '首日新增下单金额', dataIndex: 'firstDayOrderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '首日新增下单ROI', dataIndex: 'firstDayOrderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '订单量', dataIndex: 'orderCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '订单金额', dataIndex: 'orderAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单成本', dataIndex: 'orderCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单率', dataIndex: 'orderRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单ROI', dataIndex: 'orderRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '客单价', dataIndex: 'atv', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化量', dataIndex: 'conversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化成本', dataIndex: 'conversionsCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '深度转化', dataIndex: 'deepConversionsCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化率', dataIndex: 'conversionsRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加粉数', dataIndex: 'addFansCount', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加粉成本', dataIndex: 'addFansCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+            ]
+        },
+        {
+            label: '其他业务(平台上报指标)',
+            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: '注册率', dataIndex: 'regRate', label: '其他业务(其他指标)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '激活注册率', dataIndex: 'activateRegisterRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存次数', dataIndex: 'retentionCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存人数', dataIndex: 'miniGameRetentionD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存成本', dataIndex: 'retentionCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '关键页面次日留存率', dataIndex: 'appKeyPageRetentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存率', dataIndex: 'miniGameRetentionD1Rate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存成本', dataIndex: 'miniGameRetentionD1Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            data: [
+                {
+                    title: '小游戏注册首日广告变现ARPU(平台上报)', dataIndex: 'miniGameFirstDayAdPayingArpu', label: '小游戏(平台上报)', width: 130, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现ARPU(平台上报)', dataIndex: 'miniGameAdMonetizationArpu', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册首日广告变现ROI(平台上报)', dataIndex: 'miniGame1dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册3日广告变现ROI(平台上报)', dataIndex: 'minigame3dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册7日广告变现ROI(平台上报)', dataIndex: 'minigame7dIncomeRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏广告变现ROI(平台上报)', dataIndex: 'miniGameAdMonetizationRoi', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏注册首日广告变现成本(平台上报)', dataIndex: 'miniGameFirstDayAdPayingCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏广告变现成本(平台上报)', dataIndex: 'miniGameAdMonetizationCost', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册3日广告变现金额(平台上报)', dataIndex: 'miniGameAdMonetizationAmountD3', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '小游戏注册首日广告变现人数(平台上报)', dataIndex: 'miniGameFirstDayAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册3日广告变现人数(平台上报)', dataIndex: 'minigame3dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏注册7日广告变现人数(平台上报)', dataIndex: 'minigame7dIncomeUv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏广告变现人数(平台上报)', dataIndex: 'miniGameAdMonetizationUsers', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册次数(平台上报)', dataIndex: 'regPlaPv', label: '小游戏(平台上报)', width: 90, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册人数(平台上报+广告主上报)', dataIndex: 'regAllDedupPv', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '注册成本(平台上报+广告主上报)', dataIndex: 'regCostPla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '注册率(平台上报+广告主上报)', dataIndex: 'regClickRatePla', label: '小游戏(平台上报)', width: 110, align: 'center', sorter: true, className: 'purple1ColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+            ]
+        }
+    ]
+}
+
+export default columns12

+ 55 - 0
src/pages/iaaData/novel/tencent/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/novel/tencent/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 { getNovelDynamicDetailListApi } from "@/services/iaaData"
+
+interface Props {
+    queryForm: {
+        dataTimeMin?: string,
+        dataTimeMax?: 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?.dataTimeMin && queryForm.dataTimeMax) ? [queryForm.dataTimeMin, queryForm.dataTimeMax] : undefined)
+    const getGDTDynamicDayList = useAjax((params) => getNovelDynamicDetailListApi(params))
+    /***********************************/
+
+    useEffect(() => {
+        let params: any = {}
+        const [appId, productType] = iaaApp.split('||')
+        if (promotionId) {
+            params.adgroupId = 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?.dataTimeMin ? [moment(queryForm?.dataTimeMin), moment(queryForm?.dataTimeMax)] : 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/novel/tencent/dynamic/index.less


+ 259 - 0
src/pages/iaaData/novel/tencent/dynamic/index.tsx

@@ -0,0 +1,259 @@
+import React, { useEffect, useState } from "react"
+import { useAjax } from "@/Hook/useAjax"
+import { getNovelDynamicListApi, GetNovelDynamicListProps, getNovelDynamicTotalApi } from "@/services/iaaData"
+import TablePro from "@/components/TablePro"
+import columns12 from "./tableConfig"
+import moment from "moment"
+import { useModel } from "umi"
+import { Button, message, Modal, Space, Table } from "antd"
+import { updateBatchDynamicCreativesInfoApi } from "@/services/gameData"
+import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons"
+import DayAd from "./dayAd"
+import QueryFormNovel from "@/components/QueryForm/queryFormNovel"
+
+/**
+ * 腾讯创意列表
+ * @returns 
+ */
+const DynamicNovel: React.FC = () => {
+
+    /****************************************/
+    const { initialState } = useModel('@@initialState');
+    const [selectedRows, setSelectedRows] = useState<any[]>([])
+    const [queryForm, setQueryForm] = useState<GetNovelDynamicListProps>({
+        pageNum: 1,
+        pageSize: 30,
+        dataTimeMin: moment().format('YYYY-MM-DD'),
+        dataTimeMax: 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) => getNovelDynamicListApi(params))
+    const getDynamicTotal = useAjax((params) => getNovelDynamicTotalApi(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.dynamicCreativeName)
+        setPromotionId(data.adgroupId)
+        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={<QueryFormNovel
+                initialValues={{ day3: [moment(), moment()] }}
+                isPutUserId
+                isDeleted
+                isConfiguredStatus
+                isDynamicCreativeName
+                isDynamicCreativeId
+                isDeliveryMode
+                isAccountId
+                isAdgroupName
+                isAdgroupId
+                day1={{ placeholder: ['创意创建时间开始', '创意创建时间结束'] }}
+                day3={{ placeholder: ['消耗日期开始', '消耗日期结束'] }}
+                isCostTotalMin
+                isThousandDisplayPriceTotalMin
+                isConversionsCountTotalMin
+                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['createdTimeMin'] = moment(day1[0]).format('YYYY-MM-DD')
+                        newQueryForm['createdTimeMax'] = moment(day1[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['createdTimeMin']
+                        delete newQueryForm['createdTimeMax']
+                    }
+
+                    if (day3 && day3?.length === 2) {
+                        newQueryForm['dataTimeMin'] = moment(day3[0]).format('YYYY-MM-DD')
+                        newQueryForm['dataTimeMax'] = moment(day3[1]).format('YYYY-MM-DD')
+                    } else {
+                        delete newQueryForm['dataTimeMin']
+                        delete newQueryForm['dataTimeMax']
+                    }
+                    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.dynamicCreativeId }))}
+            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 DynamicNovel

+ 41 - 0
src/pages/iaaData/novel/tencent/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)

+ 678 - 0
src/pages/iaaData/novel/tencent/dynamic/tableConfig.tsx

@@ -0,0 +1,678 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Badge, Progress, Space, Statistic } from "antd"
+import React from "react"
+import { AdUnitType_Enum, DYNAMIC_CREATIVE_TYPE, 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: 'adgroupName', label: '腾讯创意基本信息', align: 'center', width: 120, 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: 'adgroupId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 8,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '创意ID', dataIndex: 'dynamicCreativeId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 9,
+                    render: (a: string, b: any) => (b?.accountId === '总计' ? '--' : <WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '腾讯创意基本信息', align: 'center', width: 60, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '创意创建时间', dataIndex: 'createTime', label: '基本信息', align: 'center', width: 140,
+                    render: (a: string, b: any) => (<WidthEllipsis value={b?.accountId === '总计' ? '--' : `${a}`} />)
+                },
+                {
+                    title: '投放模式', dataIndex: 'deliveryMode', label: '腾讯创意基本信息', align: 'center', width: 75, default: 11,
+                    render: (a: string) => (<WidthEllipsis value={DELIVERY_MODE_Enum[a as keyof typeof DELIVERY_MODE_Enum]} />)
+                },
+                {
+                    title: '动态创意类型', dataIndex: 'dynamicCreativeType', label: '腾讯创意基本信息', align: 'center', width: 60, default: 12,
+                    render: (a: string, b: any) => {
+                        return <WidthEllipsis value={b?.accountId === '总计' ? '--' : DYNAMIC_CREATIVE_TYPE[a as keyof typeof DYNAMIC_CREATIVE_TYPE]} />
+                    }
+                },
+                {
+                    title: '创意形式', dataIndex: 'creativeTemplateId', label: '腾讯创意基本信息', align: 'center', width: 75, default: 13,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '已删除?', dataIndex: 'isDeleted', label: '腾讯创意基本信息', align: 'center', width: 50, default: 14,
+                    render: (a: number, b: any) => (b?.accountId === '总计' ? '--' : a == 1 ? <Badge status="error" text="是" /> : <Badge status="success" text="否" />)
+                },
+                {
+                    title: '创意预览', dataIndex: 'dynamicCreativeVOList', label: '腾讯创意基本信息', width: 150, default: 31,
+                    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
+                    }
+                },
+                {
+                    title: '业务单元类型', dataIndex: 'adUnitType', label: '广告基本信息', align: 'center', width: 75, default: 15,
+                    render: (a: string) => (<WidthEllipsis value={AdUnitType_Enum[a as keyof typeof AdUnitType_Enum]} />)
+                }
+            ]
+        },
+        {
+            label: '广告消耗信息',
+            data: [
+                {
+                    title: '消耗', dataIndex: 'cost', label: '广告消耗信息', align: 'center', width: 100, default: 16, sorter: true, 
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: 0, top: 2, bottom: 0, right: 0, padding: '0 5px' }}><Statistic value={a || 0} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 500 } : { fontWeight: 500 }} /></span>
+                    </div>
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '广告消耗信息', align: 'center', width: 90, default: 17, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告消耗信息', align: 'right', width: 65, default: 18, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告消耗信息', align: 'center', width: 90, default: 19, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '广告消耗信息', align: 'center', width: 65, default: 20, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告消耗信息', align: 'center', width: 70, default: 21, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '不感兴趣点击次数', dataIndex: 'noInterestCount', label: '广告消耗信息', align: 'center', width: 65, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '广告转化信息',
+            data: [
+                {
+                    title: '公众号关注人数(点击归因)', dataIndex: 'fromFollowByClickUv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本(点击归因)', dataIndex: 'fromFollowByClickCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '公众号关注率(点击归因)', dataIndex: 'fromFollowByClickRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '公众号关注人数(平台上报)', dataIndex: 'bizFollowUv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本(平台上报)', dataIndex: 'bizFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '公众号关注率(平台上报)', dataIndex: 'bizFollowRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '转化目标量', dataIndex: 'conversionsCount', label: '广告转化信息', align: 'center', width: 85, default: 22, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '广告转化信息', align: 'center', width: 75, default: 23, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标率', dataIndex: 'conversionsRate', label: '广告转化信息', align: 'center', width: 70, default: 24, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '深度目标转化量', dataIndex: 'deepConversionsCount', label: '广告转化信息', align: 'center', width: 65, default: 25, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '深度目标转化率', dataIndex: 'deepConversionsRate', label: '广告转化信息', align: 'center', width: 70, default: 26, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加企业微信客服次数', dataIndex: 'scanFollowCount', label: '广告转化信息', align: 'center', width: 80, default: 27, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服人数', dataIndex: 'scanFollowUserCount', label: '广告转化信息', align: 'center', width: 80, default: 28, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服成本(人数)', dataIndex: 'scanFollowUserCost', label: '广告转化信息', align: 'center', width: 85, default: 29, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '加企业微信客服率(人数)', dataIndex: 'scanFollowUserRate', label: '广告转化信息', align: 'center', width: 85, default: 30, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: '商品转化',
+            data: [
+                {
+                    title: '下单次数', dataIndex: 'orderPv', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '下单人数', dataIndex: 'orderUv', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '下单金额', dataIndex: 'orderAmount', label: '商品转化', align: 'right', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单单价', dataIndex: 'orderUnitPrice', label: '商品转化', align: 'right', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单率', dataIndex: 'orderRate', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单成本', dataIndex: 'orderCost', label: '商品转化', align: 'right', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单ROI', dataIndex: 'orderRoi', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '客单价', dataIndex: 'unitPrice', label: '商品转化', align: 'right', sorter: true, width: 70,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单次数(点击归因)', dataIndex: 'orderByClickCount', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '下单金额(点击归因)', dataIndex: 'orderByClickAmount', label: '商品转化', align: 'right', sorter: true, width: 70,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单率(点击归因)', dataIndex: 'orderByClickRate', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单成本(点击归因)', dataIndex: 'orderByClickCost', label: '商品转化', align: 'right', sorter: true, width: 70,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单ROI(点击归因)', dataIndex: 'orderByClickRoi', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击首日下单次数(点击归因)', dataIndex: 'firstDayOrderByClickCount', label: '商品转化', align: 'center', width: 95, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击首日下单金额(点击归因)', dataIndex: 'firstDayOrderByClickAmount', label: '商品转化', align: 'right', sorter: true, width: 95,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日下单次数(首日新增下单量)', dataIndex: 'firstDayOrderCount', label: '商品转化', align: 'center', width: 100, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击首日下单金额(首日新增下单金额)', dataIndex: 'firstDayOrderAmount', label: '商品转化', align: 'right', sorter: true, width: 100,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日下单ROI(首日新增下单ROI)', dataIndex: 'firstDayOrderRoi', label: '商品转化', align: 'center', width: 100, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击7日下单次数', dataIndex: 'orderClk7dPv', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击7日下单金额', dataIndex: 'orderClk7dAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击7日下单单价', dataIndex: 'orderClk7dUnitPrice', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击7日下单ROI', dataIndex: 'orderClk7dRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击15日下单次数', dataIndex: 'orderClk15dPv', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击15日下单金额', dataIndex: 'orderClk15dAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击15日下单单价', dataIndex: 'orderClk15dUnitPrice', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击15日下单ROI', dataIndex: 'orderClk15dRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击30日下单次数', dataIndex: 'orderClk30dPv', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击30日下单金额', dataIndex: 'orderClk30dAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击30日下单单价', dataIndex: 'orderClk30dUnitPrice', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击30日下单ROI', dataIndex: 'orderClk30dRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+
+                {
+                    title: '点击首日付费次数', dataIndex: 'cheoutPv1d', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击首日付费金额', dataIndex: 'cheoutFd', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日付费成本', dataIndex: 'cheout1dCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日付费率', dataIndex: 'cheout1dRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击首日付费ROI', dataIndex: 'cheoutFdReward', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击首日付费金额(平台上报)', dataIndex: 'purchasePlaClk1dAmount', label: '商品转化', align: 'right', width: 100, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            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: '注册率', dataIndex: 'regRate', 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: 'activateRegisterRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存次数', dataIndex: 'retentionCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏次日留存人数', dataIndex: 'miniGameRetentionD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存成本', dataIndex: 'retentionCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '关键页面次日留存率', dataIndex: 'appKeyPageRetentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存率', dataIndex: 'miniGameRetentionD1Rate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存成本', dataIndex: 'miniGameRetentionD1Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            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: 32,
+                    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.adgroupId}%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

+ 605 - 0
src/pages/iaaData/novel/tencent/dynamic/tableConfigDay.tsx

@@ -0,0 +1,605 @@
+import WidthEllipsis from "@/components/widthEllipsis"
+import { Progress, Statistic } from "antd"
+import React from "react"
+import { AdUnitType_Enum, PRODUCT_TYPE_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: 1,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务类型', dataIndex: 'productType', label: '腾讯创意基本信息', align: 'center', width: 80, default: 2,
+                    render: (a: string) => (<WidthEllipsis value={PRODUCT_TYPE_ENUM[a as keyof typeof PRODUCT_TYPE_ENUM]} />)
+                },
+                {
+                    title: '应用', dataIndex: 'appName', label: '腾讯创意基本信息', align: 'center', width: 100, default: 3,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '小程序ID', dataIndex: 'mpId', label: '腾讯创意基本信息', align: 'center', width: 100, default: 4,
+                    render: (a: string, b: any) => (<WidthEllipsis isCopy value={a} />)
+                },
+                {
+                    title: '广告名称', dataIndex: 'adgroupName', label: '腾讯创意基本信息', align: 'center', width: 120, default: 5,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '创意名称', dataIndex: 'dynamicCreativeName', label: '腾讯创意基本信息', align: 'center', width: 120, default: 6,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '广告ID', dataIndex: 'adgroupId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 7,
+                    render: (a: string) => (<WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '创意ID', dataIndex: 'dynamicCreativeId', label: '腾讯创意基本信息', align: 'center', width: 90, default: 8,
+                    render: (a: string, b: any) => (b?.accountId === '总计' ? '--' : <WidthEllipsis value={a} isCopy />)
+                },
+                {
+                    title: '投手', dataIndex: 'pitcherName', label: '腾讯创意基本信息', align: 'center', width: 60, default: 9,
+                    render: (a: string) => (<WidthEllipsis value={a} />)
+                },
+                {
+                    title: '业务单元类型', dataIndex: 'adUnitType', label: '广告基本信息', align: 'center', width: 75, default: 10,
+                    render: (a: string) => (<WidthEllipsis value={AdUnitType_Enum[a as keyof typeof AdUnitType_Enum]} />)
+                }
+            ]
+        },
+        {
+            label: '广告消耗信息',
+            data: [
+                {
+                    title: '消耗', dataIndex: 'cost', label: '广告消耗信息', align: 'center', width: 85, default: 11, sorter: true, 
+                    className: 'padding_0',
+                    render: (a: number) => <div style={{ height: 27, position: 'relative' }}>
+                        <Progress
+                            strokeColor={{
+                                from: '#ff5900',
+                                to: '#ffd380',
+                            }}
+                            status="active"
+                            showInfo={false}
+                            percent={a ? a / 20000 * 100 : 0}
+                        />
+                        <span style={{ position: 'absolute', left: 0, top: 2, bottom: 0, right: 0, padding: '0 5px' }}><Statistic value={a || 0} valueStyle={a >= 20000 ? { color: '#000', fontWeight: 500 } : { fontWeight: 500 }} /></span>
+                    </div>
+                },
+                {
+                    title: '曝光量', dataIndex: 'viewCount', label: '广告消耗信息', align: 'center', width: 70, default: 12, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '千次曝光成本', dataIndex: 'thousandDisplayPrice', label: '广告消耗信息', align: 'right', width: 65, default: 13, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击量', dataIndex: 'clickCount', label: '广告消耗信息', align: 'center', width: 70, default: 14, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击均价', dataIndex: 'cpc', label: '广告消耗信息', align: 'center', width: 65, default: 15, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击率', dataIndex: 'ctr', label: '广告消耗信息', align: 'center', width: 70, default: 16, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '不感兴趣点击次数', dataIndex: 'noInterestCount', label: '广告消耗信息', align: 'center', width: 65, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                }
+            ]
+        },
+        {
+            label: '广告转化信息',
+            data: [
+                {
+                    title: '公众号关注人数(点击归因)', dataIndex: 'fromFollowByClickUv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本(点击归因)', dataIndex: 'fromFollowByClickCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '公众号关注率(点击归因)', dataIndex: 'fromFollowByClickRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '公众号关注人数(平台上报)', dataIndex: 'bizFollowUv', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '公众号关注成本(平台上报)', dataIndex: 'bizFollowCost', label: '广告转化信息', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2}/>
+                },
+                {
+                    title: '公众号关注率(平台上报)', dataIndex: 'bizFollowRate', label: '广告转化信息', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '转化目标量', dataIndex: 'conversionsCount', label: '广告转化信息', align: 'center', width: 65, default: 17, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '转化目标成本', dataIndex: 'convertCost', label: '广告转化信息', align: 'center', width: 65, default: 18, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '转化目标率', dataIndex: 'conversionsRate', label: '广告转化信息', align: 'center', width: 70, default: 19, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '深度目标转化量', dataIndex: 'deepConversionsCount', label: '广告转化信息', align: 'center', width: 65, default: 20, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '深度目标转化率', dataIndex: 'deepConversionsRate', label: '广告转化信息', align: 'center', width: 70, default: 21, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '加企业微信客服次数', dataIndex: 'scanFollowCount', label: '广告转化信息', align: 'center', width: 80, default: 22, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服人数', dataIndex: 'scanFollowUserCount', label: '广告转化信息', align: 'center', width: 80, default: 23, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '加企业微信客服成本(人数)', dataIndex: 'scanFollowUserCost', label: '广告转化信息', align: 'center', width: 85, default: 24, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '加企业微信客服率(人数)', dataIndex: 'scanFollowUserRate', label: '广告转化信息', align: 'center', width: 85, default: 25, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                }
+            ]
+        },
+        {
+            label: '商品转化',
+            data: [
+                {
+                    title: '下单次数', dataIndex: 'orderPv', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '下单人数', dataIndex: 'orderUv', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '下单金额', dataIndex: 'orderAmount', label: '商品转化', align: 'right', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单单价', dataIndex: 'orderUnitPrice', label: '商品转化', align: 'right', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单率', dataIndex: 'orderRate', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单成本', dataIndex: 'orderCost', label: '商品转化', align: 'right', sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单ROI', dataIndex: 'orderRoi', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '客单价', dataIndex: 'unitPrice', label: '商品转化', align: 'right', sorter: true, width: 70,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单次数(点击归因)', dataIndex: 'orderByClickCount', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '下单金额(点击归因)', dataIndex: 'orderByClickAmount', label: '商品转化', align: 'right', sorter: true, width: 70,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单率(点击归因)', dataIndex: 'orderByClickRate', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '下单成本(点击归因)', dataIndex: 'orderByClickCost', label: '商品转化', align: 'right', sorter: true, width: 70,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '下单ROI(点击归因)', dataIndex: 'orderByClickRoi', label: '商品转化', align: 'center', width: 70, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击首日下单次数(点击归因)', dataIndex: 'firstDayOrderByClickCount', label: '商品转化', align: 'center', width: 95, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击首日下单金额(点击归因)', dataIndex: 'firstDayOrderByClickAmount', label: '商品转化', align: 'right', sorter: true, width: 95,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日下单次数(首日新增下单量)', dataIndex: 'firstDayOrderCount', label: '商品转化', align: 'center', width: 100, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击首日下单金额(首日新增下单金额)', dataIndex: 'firstDayOrderAmount', label: '商品转化', align: 'right', sorter: true, width: 100,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日下单ROI(首日新增下单ROI)', dataIndex: 'firstDayOrderRoi', label: '商品转化', align: 'center', width: 100, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击7日下单次数', dataIndex: 'orderClk7dPv', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击7日下单金额', dataIndex: 'orderClk7dAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击7日下单单价', dataIndex: 'orderClk7dUnitPrice', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击7日下单ROI', dataIndex: 'orderClk7dRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击15日下单次数', dataIndex: 'orderClk15dPv', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击15日下单金额', dataIndex: 'orderClk15dAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击15日下单单价', dataIndex: 'orderClk15dUnitPrice', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击15日下单ROI', dataIndex: 'orderClk15dRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击30日下单次数', dataIndex: 'orderClk30dPv', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击30日下单金额', dataIndex: 'orderClk30dAmount', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击30日下单单价', dataIndex: 'orderClk30dUnitPrice', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击30日下单ROI', dataIndex: 'orderClk30dRoi', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+
+                {
+                    title: '点击首日付费次数', dataIndex: 'cheoutPv1d', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '点击首日付费金额', dataIndex: 'cheoutFd', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日付费成本', dataIndex: 'cheout1dCost', label: '商品转化', align: 'right', width: 80, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '点击首日付费率', dataIndex: 'cheout1dRate', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击首日付费ROI', dataIndex: 'cheoutFdReward', label: '商品转化', align: 'center', width: 80, sorter: true,
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '点击首日付费金额(平台上报)', dataIndex: 'purchasePlaClk1dAmount', label: '商品转化', align: 'right', width: 100, sorter: true,
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            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: '注册率', dataIndex: 'regRate', 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: 'activateRegisterRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存次数', dataIndex: 'retentionCount', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '小游戏次日留存人数', dataIndex: 'miniGameRetentionD1', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '次日留存率', dataIndex: 'retentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '次日留存成本', dataIndex: 'retentionCost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                },
+                {
+                    title: '关键页面次日留存率', dataIndex: 'appKeyPageRetentionRate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存率', dataIndex: 'miniGameRetentionD1Rate', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 0.5 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
+                },
+                {
+                    title: '小游戏次日留存成本', dataIndex: 'miniGameRetentionD1Cost', label: '其他业务(其他指标)', width: 80, align: 'center', sorter: true, className: 'volcanoColorClass',
+                    render: (a: string) => <Statistic value={a || 0} precision={2} />
+                }
+            ]
+        },
+        {
+            label: '小游戏(平台上报)',
+            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

+ 11 - 0
src/pages/iaaData/playlet/tencent/adList/index.tsx

@@ -0,0 +1,11 @@
+import TencentNovelAd from "@/pages/iaaData/novel/tencent/adList"
+import React from "react"
+
+
+const TencentPlayletAd: React.FC = () => {
+
+
+    return <TencentNovelAd />
+}
+
+export default TencentPlayletAd

+ 12 - 0
src/pages/iaaData/playlet/tencent/dynamic/index.tsx

@@ -0,0 +1,12 @@
+import DynamicNovel from "@/pages/iaaData/novel/tencent/dynamic"
+import React from "react"
+
+
+
+const DynamicPlaylet: React.FC = () => {
+
+
+    return <DynamicNovel />
+}
+
+export default DynamicPlaylet

+ 5 - 5
src/pages/user/login/index.tsx

@@ -195,7 +195,7 @@ const Login: React.FC<{}> = () => {
 				} else {
 					timeOut(0)
 				}
-			})
+			}).catch(() => timeOut(0))
 		} else {
 			message.error('请输入正确的手机号!!!')
 		}
@@ -212,7 +212,7 @@ const Login: React.FC<{}> = () => {
 				} else {
 					timeOut(0)
 				}
-			})
+			}).catch(() => timeOut(0))
 		} else {
 			message.error('请输入正确的手机号!!!')
 		}
@@ -294,10 +294,10 @@ const Login: React.FC<{}> = () => {
 							</div> : <div className={`${styles.main}  ${isMobile ? '' : show ? '' : styles.login_hide}`}>
 								<h1>趣程集团IAA业务应用数据系统</h1>
 								{/*  (isMobile || location.origin === 'http://localhost:8000' || location.origin.includes('test')) */}
-								{true && <div className={styles.tabs}>
+								{/* {true && <div className={styles.tabs}>
 									<span onClick={() => { setTab(1) }} style={tab === 1 ? { color: localStorage.getItem('color') || '#24DB95' } : {}}>手机</span>
-									{/* <span onClick={() => { setTab(2) }} style={tab === 2 ? { color: localStorage.getItem('color') || '#24DB95' } : {}}>钉钉</span> */}
-								</div>}
+									<span onClick={() => { setTab(2) }} style={tab === 2 ? { color: localStorage.getItem('color') || '#24DB95' } : {}}>钉钉</span>
+								</div>} */}
 
 								{
 									tab === 1 ? <>

+ 134 - 2
src/services/iaaData/index.ts

@@ -184,7 +184,7 @@ export async function getAppTxEveryDayTotalApi(data: GetAppTxEveryDayListProps)
     });
 }
 
-export interface GetAppTrendListProps extends Paging, SortProps{
+export interface GetAppTrendListProps extends Paging, SortProps {
     costDayBegin?: string
     costDayEnd?: string
 }
@@ -239,7 +239,7 @@ export async function getAppTrendNewTotalApi(data: GetAppTrendListProps) {
 
 
 
-export interface GetAppAnalysisListProps extends Paging, SortProps{
+export interface GetAppAnalysisListProps extends Paging, SortProps {
     costDayBegin?: string
     costDayEnd?: string
 }
@@ -385,4 +385,136 @@ export async function getByteAppTotalApi(data: GetByteAppListProps) {
         method: 'POST',
         data
     });
+}
+
+
+
+export interface GetNovelGDTListProps extends Paging, SortProps {
+    accountId?: string
+    putUserId?: number       // 投手ID列表
+    adgroupId?: number       // 广告ID
+    adgroupName?: string     // 广告名称
+    marketingGoal?: string   // 营销目的
+    marketingTargetType?: string  // 推广内容资产类型
+    memo?: string,           // 账号备注
+    remark?: string          // 账号备注
+    putDateBegin?: string    // 投放开始时间
+    putDateEnd?: string      // 投放开始时间
+    isDeleted?: boolean,      // 是否删除
+    dataTimeMin?: string,    // 广告数据时间
+    dataTimeMax?: string,    // 广告数据时间
+    status?: string[]         // 广告状态(多选)
+    adCreateTimeMin?: string  // 广告创建时间
+    adCreateTimeMax?: string  // 广告创建时间(end)
+    promotedObjectType?: string //推广目标类型 
+    promotedObjectName?: string // 推广目标名称
+    optimizationGoal?: string  // 优化目标类型
+    isDeepConversionSpec?: boolean  // 是否深度优化
+    costTotalMin?: number       // 最小总消耗
+    thousandDisplayPriceTotalMin?: number  // 最低总千次曝光成本
+    conversionsCountTotalMin?: number   // 最低转化数
+    incomeRoi1Min?: number     // 激活首日广告变现ROI区间最小值
+    incomeRoi1Max?: number     // 激活首日广告变现ROI区间最大值
+    regCostMin?: number        // 注册成本区间最小值
+    regCostMax?: number        // 注册成本区间最大值
+    regCostPlaMin?: number     // 注册成本(平台上报+广告主上报)区间最小值
+    regCostPlaMax?: number     // 注册成本(平台上报+广告主上报)区间最大值
+    cpcMin?: number            // 点击均价最小值
+    cpcMax?: number            // 点击均价最大值
+}
+/**
+ * 小说腾讯广告列表
+ * @param data 
+ * @returns 
+ */
+export async function getNovelGDTListApi(data: GetNovelGDTListProps) {
+    return request(wapi + `/monitor/novel/ad/listOfPage`, {
+        method: 'POST',
+        data
+    });
+}
+
+/**
+ * 广告总计
+ * @param data 
+ * @returns 
+ */
+export async function getNovelGDTTotalApi(data: GetNovelGDTListProps) {
+    return request(wapi + `/monitor/novel/ad/total`, {
+        method: 'POST',
+        data
+    });
+}
+
+
+export interface GetNovelGDTDetailListProps extends Paging, SortProps {
+    accountId: number, adgroupId: number, costDayBegin?: string, costDayEnd?: string
+}
+/**
+ * 广告列表每日数据
+ * @param data 
+ * @returns 
+ */
+export async function getNovelGDTDetailListApi(data: GetNovelGDTDetailListProps) {
+    return request(wapi + `/monitor/novel/ad/daily/detail`, {
+        method: 'POST',
+        data
+    });
+}
+
+
+
+
+export interface GetNovelDynamicListProps extends Paging, SortProps {
+    accountId?: number
+    putUserId?: number       // 投手ID列表
+    isDeleted?: boolean
+    configuredStatus?: string[]
+    adgroupName?: string,
+    adgroupId?: string
+    dynamicCreativeName?: string,
+    dynamicCreativeId?: string
+    deliveryMode?: string[]
+
+    createdTimeMin?: string
+    createdTimeMax?: string
+    costTotalMin?: number
+    dataTimeMin?: string
+    dataTimeMax?: string
+    thousandDisplayPriceTotalMin?: number
+    conversionsCountTotalMin?: number
+}
+
+/**
+ * 小说腾讯创意列表
+ * @param data 
+ * @returns 
+ */
+export async function getNovelDynamicListApi(data: GetNovelDynamicListProps) {
+    return request(wapi + `/monitor/novel/creative/listOfPage`, {
+        method: 'POST',
+        data
+    });
+}
+
+/**
+ * 总计
+ * @param data 
+ * @returns 
+ */
+export async function getNovelDynamicTotalApi(data: GetNovelDynamicListProps) {
+    return request(wapi + `/monitor/novel/creative/total`, {
+        method: 'POST',
+        data
+    });
+}
+
+export interface GetNovelDynamicDetailListProps extends Paging, SortProps {
+    accountId: number, adgroupId: number, dynamicCreativeId: number, dataTimeMin?: string, dataTimeMax?: string
+}
+export async function getNovelDynamicDetailListApi(data: GetNovelDynamicDetailListProps) {
+    return request(wapi + `/monitor/novel/creative/daily/detail`, {
+        method: 'POST',
+        data
+    });
 }

+ 41 - 1
src/utils/utils.ts

@@ -158,4 +158,44 @@ export const getImgSizeProper = (file: RcFile): Promise<void> => {
         }
         img.src = _URL.createObjectURL(file);
     })
-}
+}
+
+// 数组分组
+export const groupBy = (array: any[], f: (item: any) => any[], isObject?: boolean) => {
+    const groups: any = {};
+    array.forEach(function (o) { //注意这里必须是forEach 大写
+        const key = f(o)
+        const group = typeof key === 'string' ? key : JSON.stringify(key);
+        groups[group] = groups[group] || [];
+        groups[group].push(o);
+    });
+    if (isObject) {
+        return groups
+    }
+    return Object.keys(groups).map(function (group) {
+        return groups[group];
+    });
+}
+
+/**
+ * 防抖
+ * @param func 
+ * @param delay 
+ * @returns 
+ */
+export function debounce<T extends (...args: any[]) => any>(func: T, delay: number): (...args: Parameters<T>) => void {  
+    let timeoutId: NodeJS.Timeout | undefined;  
+
+    return function (...args: Parameters<T>) {  
+        // 清除之前的定时器  
+        if (timeoutId) {  
+            clearTimeout(timeoutId);  
+        }  
+
+        // 设置新的定时器  
+        timeoutId = setTimeout(() => {
+            // @ts-ignore
+            func.apply(this, args);  
+        }, delay);  
+    };  
+}