wjx 1 år sedan
förälder
incheckning
1ab4a0bd3d

+ 4 - 0
src/components/BaseTable/index.less

@@ -16,4 +16,8 @@
 .BaseTable__row-cell,
 .BaseTable__header-cell {
     border-right: 1px solid #e0e0e0;
+}
+
+.BaseTable__row-cell > div {
+    width: 100%;
 }

+ 253 - 152
src/components/BaseTable/index.tsx

@@ -1,173 +1,274 @@
 import { useSize } from "ahooks";
-import React, { useRef } from "react"
-import Table, { Column, ColumnShape } from 'react-base-table'
+import React, { useRef, useState, useCallback, useEffect } from "react"
+import Table, { BaseTableProps, Column, ColumnShape, SortOrder } from 'react-base-table'
 import 'react-base-table/styles.css'
 import './index.less'
-import { Pagination } from "antd";
+import { Empty, Pagination, Spin } from "antd";
 import { PaginationProps } from "antd/es/pagination";
 
-interface Props {
+interface Props extends Omit<BaseTableProps, 'width'> {
+    isPagination?: boolean,
     pagination?: PaginationProps
+    width?: number
+    loading?: boolean
+    onChange?: (data: {
+        pagination?: { current?: number, pageSize?: number, gzh?: string },
+        sortData?: { column: ColumnShape<unknown>, field: React.Key, order: "ascend" | "descend" }
+    }) => void
 }
-const BaseTable: React.FC<Props> = ({ pagination }) => {
+const BaseTable: React.FC<Props> = ({ isPagination = true, pagination, width, height, estimatedRowHeight, rowHeight, fixed, columns, loading, onChange, ...props }) => {
 
     /***************************************/
     const ref = useRef(null);
+    const tableRef = useRef(null);
     const size = useSize(ref);
+    const [operate, setOperate] = useState<{
+        pagination?: { current?: number, pageSize?: number },
+        sortData?: { column: ColumnShape<unknown>, key: React.Key, order: SortOrder }
+    }>({})
     /***************************************/
 
-    let columns: ColumnShape<any>[] = [
-        {
-            key: 'name',
-            title: 'Name',
-            dataKey: 'name',
-            width: 150,
-            resizable: true,
-            sortable: true,
-            frozen: Column.FrozenDirection.LEFT,
-        },
-        {
-            key: 'score',
-            title: 'Score',
-            dataKey: 'score.math',
-            width: 60,
-            align: Column.Alignment.CENTER,
-            sortable: false,
-        },
-        {
-            key: 'gender',
-            title: '♂♀',
-            dataKey: 'gender',
-            width: 60,
-            align: Column.Alignment.CENTER,
-            sortable: true,
-        },
-        {
-            key: 'birthday',
-            title: 'Birthday',
-            dataKey: 'birthday',
-            width: 100,
-            align: Column.Alignment.RIGHT,
-            sortable: true,
-        },
-        {
-            key: 'email',
-            title: 'Email',
-            dataKey: 'email',
-            width: 200,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'country',
-            title: 'Country',
-            dataKey: 'country',
-            width: 100,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'address',
-            title: 'Address',
-            dataKey: 'address.street',
-            width: 200,
-            resizable: true,
-        },
-        {
-            key: 'name1',
-            title: 'Name',
-            dataKey: 'name',
-            width: 150,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'name2',
-            title: 'Name',
-            dataKey: 'name',
-            width: 150,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'name3',
-            title: 'Name',
-            dataKey: 'name',
-            width: 150,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'name4',
-            title: 'Name',
-            dataKey: 'name',
-            width: 150,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'name5',
-            title: 'Name',
-            dataKey: 'name',
-            width: 150,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'name6',
-            title: 'Name',
-            dataKey: 'name',
-            width: 150,
-            resizable: true,
-            sortable: true,
-        },
-        {
-            key: 'description',
-            title: 'Description',
-            dataKey: 'description',
-            width: 200,
-            resizable: true,
-            sortable: true,
-        },
-        // {
-        //     title: '操作',
-        //     key: 'action',
-        //     width: 100,
-        //     align: Column.Alignment.CENTER,
-        //     frozen: Column.FrozenDirection.RIGHT,
+    useEffect(() => {
+        setOperate({ ...operate, pagination: { current: pagination?.current || 1, pageSize: pagination?.pageSize || pagination?.defaultPageSize || 20 } })
+    }, [pagination?.current, pagination?.pageSize, pagination?.defaultPageSize])
 
-        //     cellRenderer: ({ rowData }: any) => (
-        //         <button
-        //             onClick={() => {
+    // let columns: ColumnShape<any>[] = [
+    //     {
+    //         key: 'name',
+    //         title: 'Name',
+    //         dataKey: 'name',
+    //         width: 150,
+    //         resizable: true,
+    //         sortable: true,
+    //         frozen: Column.FrozenDirection.LEFT,
+    //     },
+    //     {
+    //         key: 'score',
+    //         title: 'Score',
+    //         dataKey: 'score.math',
+    //         width: 60,
+    //         align: Column.Alignment.CENTER,
+    //         sortable: false,
+    //     },
+    //     {
+    //         key: 'gender',
+    //         title: '♂♀',
+    //         dataKey: 'gender',
+    //         width: 60,
+    //         align: Column.Alignment.CENTER,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'birthday',
+    //         title: 'Birthday',
+    //         dataKey: 'birthday',
+    //         width: 100,
+    //         align: Column.Alignment.RIGHT,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'email',
+    //         title: 'Email',
+    //         dataKey: 'email',
+    //         width: 200,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'country',
+    //         title: 'Country',
+    //         dataKey: 'country',
+    //         width: 100,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'address',
+    //         title: 'Address',
+    //         dataKey: 'address.street',
+    //         width: 200,
+    //         resizable: true,
+    //     },
+    //     {
+    //         key: 'name1',
+    //         title: 'Name',
+    //         dataKey: 'name',
+    //         width: 150,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'name2',
+    //         title: 'Name',
+    //         dataKey: 'name',
+    //         width: 150,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'name3',
+    //         title: 'Name',
+    //         dataKey: 'name',
+    //         width: 150,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'name4',
+    //         title: 'Name',
+    //         dataKey: 'name',
+    //         width: 150,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'name5',
+    //         title: 'Name',
+    //         dataKey: 'name',
+    //         width: 150,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'name6',
+    //         title: 'Name',
+    //         dataKey: 'name',
+    //         width: 150,
+    //         resizable: true,
+    //         sortable: true,
+    //     },
+    //     {
+    //         key: 'description',
+    //         title: 'Description',
+    //         dataKey: 'description',
+    //         width: 200,
+    //         resizable: true,
+    //         sortable: true,
+    //         cellRenderer: ({ rowData, cellData }: any) => (
+    //             <a
+    //                 onClick={() => {
+    //                     console.log(rowData, cellData)
+    //                 }}
+    //             >
+    //                 Remove
+    //             </a>
+    //         ),
+    //     },
+    //     // {
+    //     //     title: '操作',
+    //     //     key: 'action',
+    //     //     width: 100,
+    //     //     align: Column.Alignment.CENTER,
+    //     //     frozen: Column.FrozenDirection.RIGHT,
 
-        //             }}
-        //         >
-        //             Remove
-        //         </button>
-        //     ),
-        // },
-    ]
+    //     //     cellRenderer: ({ rowData, cellData }: any) => (
+    //     //         <button
+    //     //             onClick={() => {
+    //     //                 console.log(rowData, cellData)
+    //     //             }}
+    //     //         >
+    //     //             Remove
+    //     //         </button>
+    //     //     ),
+    //     // },
+    // ]
 
-    const defaultData = Array.from({ length: 10000 }, (_, key) => ({
-        id: key,
-        name: 'row' + key,
-        gender: '男',
-        score: {
-            math: 30,
-        },
-        birthday: 222,
-        attachments: 111,
-        email: '7787@qq.com',
-        country: '22',
-        description: '11',
-    }));
+    // const defaultData = Array.from({ length: 10000 }, (_, key) => ({
+    //     id: key,
+    //     name: 'row' + key,
+    //     gender: '男',
+    //     score: {
+    //         math: 30,
+    //     },
+    //     birthday: 222,
+    //     attachments: 111,
+    //     email: '7787@qq.com',
+    //     country: '22',
+    //     description: '11',
+    // }));
 
-    return <div ref={ref}>
-        <Table  fixed columns={columns} data={defaultData} width={size.width || 900} height={600} rowHeight={26}/>
-        <div className="pagination">
-            <Pagination {...pagination} />
+    let tableProps: BaseTableProps = {
+        fixed: fixed || true,  // 是否开启 列的宽度是固定的还是灵活的
+        // columns,               // 表的列
+        // data: defaultData,     // 表数据
+        width: width || size.width || 900,  // 表固定宽度
+        height: height || 600,              // 表固定高度
+    }
+    if (estimatedRowHeight) {
+        tableProps.estimatedRowHeight = estimatedRowHeight   // 灵活高度
+        if (props?.data?.length < 10) {
+            tableProps.maxHeight = 600
+        }
+    } else {
+        tableProps.rowHeight = rowHeight || 26               // 固定高度
+        if (props?.data?.length < 20) {
+            tableProps.maxHeight = 600
+        }
+    }
+
+    if (columns) {
+        let totalWidth = columns.reduce((pre: number, cur: { width: number; }) => {
+            pre += cur.width
+            return pre
+        }, 0)
+        if (totalWidth < tableProps.width) {
+            let length = columns?.length || 1
+            let diffW = (tableProps.width - totalWidth - 6) / length
+
+            columns = columns.map((item: any) => {
+                return { ...item, width: item.width + diffW }
+            })
+        }
+    }
+    if (!props?.data || props?.data?.length === 0) {
+        delete tableProps.maxHeight
+        tableProps.height = 200
+    }
+
+    tableProps.columns = columns
+
+    tableProps = { ...tableProps, ...props }
+
+    // 排序操作
+    const onColumnSort = useCallback((sortBy: { column: ColumnShape<unknown>, key: React.Key, order: SortOrder }) => {
+        const { key, order } = sortBy;
+        let newOperate = JSON.parse(JSON.stringify(operate))
+        const sortData = newOperate?.sortData
+        if (sortData && sortData.key === key) {
+            if (order === 'asc') {
+                newOperate = { ...newOperate, sortData: undefined } // 取消排序
+            } else {
+                newOperate = { ...newOperate, sortData: sortBy }
+            }
+        } else {
+            newOperate = { ...newOperate, sortData: sortBy }
+        }
+        setOperate(newOperate)
+        onChange?.({ ...newOperate, sortData: newOperate?.sortData ? { ...newOperate.sortData, field: newOperate.sortData.key, order: newOperate.sortData.order === 'asc' ? 'ascend' : 'descend' } : undefined })
+    }, [operate])
+
+    return <Spin spinning={loading}>
+        <div ref={ref}>
+            <Table
+                ref={tableRef}
+                overscanRowCount={2}
+                emptyRenderer={<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}
+                sortBy={operate?.sortData}
+                onColumnSort={onColumnSort}
+                {...tableProps}
+            />
+            {isPagination && <div className="pagination">
+                <Pagination 
+                    onChange={(page: number, pageSize: number) => {
+                        setOperate({...operate, pagination: { current: page, pageSize }});
+                        onChange?.({ ...operate, pagination: { current: page, pageSize }, sortData: operate?.sortData ? { ...operate.sortData, field: operate.sortData.key, order: operate.sortData.order === 'asc' ? 'ascend' : 'descend' } : undefined });
+                        (tableRef.current as any)?.scrollToTop(0)
+                    }} 
+                    {...pagination} 
+                />
+            </div>}
         </div>
-    </div>
+    </Spin>
 }
 
 export default React.memo(BaseTable)

+ 59 - 0
src/components/BaseTable/utils.ts

@@ -0,0 +1,59 @@
+import { ColumnsType } from "antd/lib/table";
+import { Column, ColumnShape } from "react-base-table";
+
+/**
+ * antd table columns 换 BaseTable columns
+ * @param columns 
+ * @returns 
+ */
+export const getBaseTableColumn = (columns: ColumnsType<any>): ColumnShape<any>[] => {
+    return columns.map((item: any) => {
+        const { key, dataIndex, width, resizable, title, align, sorter, className, render, fixed, ...pro } = item
+        let data: ColumnShape<any> = {
+            key: key || dataIndex,
+            dataKey: key || dataIndex,
+            width: width || 100,
+            resizable: resizable || true
+        }
+        if (title && typeof title === 'string') {
+            data.title = title
+        } else {
+            data.headerRenderer = () => {
+                return title
+            }
+        }
+        switch (align) {
+            case 'center':
+                data.align = Column.Alignment.CENTER
+                break
+            case 'left':
+                data.align = Column.Alignment.LEFT
+                break
+            case 'right':
+                data.align = Column.Alignment.RIGHT
+                break
+        }
+        if (sorter) {
+            data.sortable = true
+        }
+        if (className) {
+            data.className = className
+        }
+
+        switch(fixed) {
+            case 'left':
+                data.frozen = Column.FrozenDirection.LEFT
+                break
+            case 'right':
+                data.frozen = Column.FrozenDirection.RIGHT
+                break
+        }
+
+        if (render) {
+            data.cellRenderer = ({ rowData, cellData }: any) => {
+                return render(cellData, rowData)
+            }
+        }
+        return { ...data, ...pro }
+    })
+}

+ 2 - 0
src/pages/gameDataStatistics/components/TableData/index.tsx

@@ -1,5 +1,6 @@
 import CustomListModel from '@/components/CustomList'
 import Tables from '@/components/Tables'
+import TableBase from '@/components/Tables/index1'
 import { FullscreenExitOutlined, FullscreenOutlined, QuestionCircleOutlined, RedoOutlined, SearchOutlined, SettingOutlined } from '@ant-design/icons'
 import { useDebounceFn, useFullscreen, useThrottleFn } from 'ahooks'
 import { Button, Card, Col, Row, Space, Tooltip, } from 'antd'
@@ -362,6 +363,7 @@ const Tab = React.memo((props: any) => {
                 handelResize={((columns: any) => handelResize(columns))}
                 summary={summary}
             />
+            
         </div>
     </Col >
 })

+ 402 - 0
src/pages/gameDataStatistics/components/TableData/index1.tsx

@@ -0,0 +1,402 @@
+import CustomListModel from '@/components/CustomList'
+import Tables from '@/components/Tables'
+import { FullscreenExitOutlined, FullscreenOutlined, QuestionCircleOutlined, RedoOutlined, SearchOutlined, SettingOutlined } from '@ant-design/icons'
+import { useDebounceFn, useFullscreen, useThrottleFn } from 'ahooks'
+import { Button, Card, Col, Row, Space, Tag, Tooltip, } from 'antd'
+import React, { useEffect, useRef, useState, useCallback } from 'react'
+import style from './index.less'
+import moment from 'moment'
+import lodash from 'lodash';
+import BaseTable from '@/components/BaseTable'
+import { getBaseTableColumn } from '@/components/BaseTable/utils'
+
+interface Prosp {
+    isZj?: boolean,//是否查总计
+    tableTotal?: { [key: string]: string },//是个开启总计
+    scroll?: { x?: number, y?: number },//开启行滑动并设置容器最大宽度
+    title?: string,//tabel的标题
+    tooltip?: JSX.Element,//是否在标题后加问号展示说明
+    dataSource: any[],//table的数据
+    expandedRowRender?: (data: any) => JSX.Element,
+    className?: string,//自定义class
+    isdownload?: boolean,
+    leftChild?: JSX.Element,
+    config?: any,
+    configName?: any,
+    page?: number,
+    pageSize?: number,
+    size?: 'small' | 'middle' | 'large',
+    total?: number,
+    onChange?: (props: {
+        pagination?: { current?: number, pageSize?: number, gzh?: string },
+        filters?: any,
+        sortData?: {
+            column: { dataIndex: string },
+            order?: "ascend" | "descend"
+        }
+    }) => void,
+    ajax?: any,//接口刷新
+    fixed?: {
+        left: number,
+        right: number
+    },
+    totalData?: any[]
+    summary?: ((data: readonly any[]) => React.ReactNode)
+    rowClassName?: string | ((record: any, index: any) => string)
+    sortData?: {
+        field?: string,
+        order?: "descend" | "ascend"
+    }
+}
+
+export const version = '1.0.0'
+
+function TableData(props: Prosp) {
+
+    /*************************/
+    const { isZj, totalData, scroll, title, dataSource, expandedRowRender, sortData, className, rowClassName, leftChild, page = undefined, pageSize = undefined, size = 'small', total = 0, onChange, config, configName, ajax, fixed = { left: 0, right: 1 }, summary } = props
+    const [visible, setVisible] = useState<boolean>(false)
+    const [isFullscreen, setIsFullscreen] = useState<boolean>(true)
+    const [oldSelectData, setoldSelectData] = useState<any[]>([])
+    const [oldFixed, setoldFixed] = useState<any>({ left: '0', right: '0' })
+    const [newColumns, setNewColumns] = useState<any[]>([])
+    const [originalColumns, setOriginalColumns] = useState<any[]>([])
+    const [timer, setTimer] = useState<string>(moment().format('HH:mm:ss'))
+    const [selectData, setSelectData] = useState<{ selectData: any[], fixed: { left: number, right: number } }>({ selectData: [], fixed: { left: fixed.left, right: fixed.right } })
+    const ref = useRef(null)
+    const [isFull, { toggleFull }] = useFullscreen(ref);
+    const oldName = useRef(null)
+    /*************************/
+
+    useEffect(() => {
+        if (originalColumns.length > 0) {
+            if (sortData?.field && sortData.order) {
+                setNewColumns(originalColumns.map((item: any) => {
+                    if (item.dataIndex === sortData?.field) {
+                        item.sortOrder = sortData.order
+                    } else if (item?.sortOrder) {
+                        delete item.sortOrder
+                    }
+                    return item
+                }))
+            } else {
+                setNewColumns(originalColumns.map((item: any) => {
+                    const { sortOrder, ...ite } = item
+                    return ite
+                }))
+            }
+        }
+    }, [originalColumns, sortData])
+
+    const { run: runSet } = useThrottleFn((newArr, newConfig, fixedData) => {
+        console.log('设置配置改变重新赋值')
+        setoldSelectData(selectData.selectData)
+        setoldFixed(selectData.fixed)
+        if (newArr.length > 0) {
+            console.log('改变---->')
+            let c: any[] = []
+            newArr.forEach((newItem: any, index: number) => {
+                let oldItem = newConfig.find((c: { dataIndex: any }) => c.dataIndex === newItem.dataIndex)
+                if (oldItem) {
+                    // if (newItem?.width !== oldItem?.width) {
+                    oldItem.width = newItem?.width
+                    // }
+                    if (index < Number(fixedData.left)) {//设置左悬浮
+                        oldItem['fixed'] = 'left'
+                    } else if (index > (newArr?.length - Number(fixedData.right) - 1)) {//设置右悬浮
+                        oldItem['fixed'] = 'right'
+                        if (oldItem?.children?.length > 0) {
+                            oldItem['children'] = oldItem?.children.map((item: { [x: string]: string }) => {
+                                item['fixed'] = 'right'
+                                return item
+                            })
+                        }
+                    } else {
+                        oldItem['fixed'] = false
+                        if (oldItem?.children?.length > 0) {
+                            oldItem['children'] = oldItem?.children.map((item: { [x: string]: any }) => {
+                                item['fixed'] = false
+                                return item
+                            })
+                        }
+                    }
+                    let { label, default: a, tips, title, ...ite } = oldItem
+                    if (tips) {
+                        ite.title = <Space size={2}>
+                            {title}
+                            <Tooltip title={tips} placement='bottom'>
+                                <QuestionCircleOutlined />
+                            </Tooltip>
+                        </Space>
+                    } else {
+                        ite.title = title
+                    }
+                    c.push(ite)
+                }
+            })
+            setOriginalColumns(c)
+            // setNewColumns(c)
+            // setNewColumns(newArr.map((newItem: any, index: number) => {
+            //     let oldItem = newConfig.find((c: { dataIndex: any }) => c.dataIndex === newItem.dataIndex)
+            //     if (newItem?.width !== oldItem?.width) {
+            //         oldItem.width = newItem?.width
+            //     }
+            //     if (index < Number(fixedData.left)) {//设置左悬浮
+            //         oldItem['fixed'] = 'left'
+            //     } else if (index > (newArr?.length - Number(fixedData.right) - 1)) {//设置右悬浮
+            //         oldItem['fixed'] = 'right'
+            //     } else {
+            //         oldItem['fixed'] = false
+            //     }
+            //     let { label, default: a, ...ite } = oldItem
+            //     return ite
+            // }))
+        }
+    }, { wait: 500 });
+    /**重组选中的字段 */
+    useEffect(() => {
+        let oldConfigName = oldName.current || ''
+        let oldSelectDataString = JSON.stringify(oldSelectData)
+        if (configName !== oldConfigName && oldSelectData.length > 0) {
+            oldSelectDataString = ''
+        }
+        if (configName) {
+            const defSelectData = localStorage.getItem(`myAdMonitorConfig${version}_` + configName)
+            const defFixed = localStorage.getItem(`myAdMonitorConfigFixed${version}_` + configName)
+            let newArr: any = [], fixedData: { left: number, right: number } = selectData.fixed
+            const newConfig = config?.map((item: { data: any }) => item.data)?.flat()
+            if (defSelectData) {
+                newArr = JSON.parse(defSelectData)
+            }
+            if (defSelectData && (selectData?.selectData?.length === 0 || configName !== oldConfigName)) {//首次查找个人配置是否存在,并且selectData为空,存在用个人配置设置selectData
+                console.log('首次使用个人配置赋值')
+                let newDefSelectData = JSON.parse(defSelectData)
+                newDefSelectData = newDefSelectData.filter((item: any) => !!item && newConfig.some((c: { dataIndex: any }) => c.dataIndex === item.dataIndex))//去除空项
+                setSelectData(() => ({ selectData: newDefSelectData, fixed: defFixed ? JSON.parse(defFixed) : { left: 0, right: 0 } }))
+                fixedData = defFixed ? JSON.parse(defFixed) : { left: 0, right: 0 }
+                newArr = newDefSelectData
+            }
+            if (!defSelectData && (selectData?.selectData?.length === 0 || configName !== oldConfigName)) {//首次查找个人配置是否存在,并且selectData为空,不存在默认配置设置selectData
+                let newSelectData: any[] = []
+                config?.forEach((item: { data: { default: any }[] }) => {
+                    item?.data?.forEach((d: { default: any }) => {
+                        if (d.default) {
+                            newSelectData[d.default - 1] = d
+                        }
+                    })
+                })
+                console.log('首次使用默认配置赋值')
+                setSelectData(() => ({ ...selectData, selectData: newSelectData }))
+                newArr = newSelectData
+            }
+            if ((JSON.stringify(oldSelectDataString) !== JSON.stringify(selectData?.selectData)) || (JSON.stringify(selectData.fixed) !== JSON.stringify(oldFixed))) {
+                runSet(newArr, newConfig, fixedData)
+            }
+        }
+        if (configName !== oldConfigName) {
+            oldName.current = configName
+        }
+    }, [selectData, oldSelectData, dataSource, oldFixed, configName, config, timer])
+
+    const { run: runResize } = useDebounceFn((columns) => {
+        if (configName) {
+            let newSelectData = selectData?.selectData?.map((item) => {
+                if (item.dataIndex === columns.key) {
+                    item['width'] = columns['width'].toFixed(2)
+                }
+                return item
+            })
+            localStorage.setItem(`myAdMonitorConfig${version}_` + configName, JSON.stringify(newSelectData))
+        }
+    }, { wait: 100 });
+
+    //拖动宽度设置设置保存
+    const handelResize = useCallback((columns: any) => {
+        runResize(columns)
+    }, [configName, selectData])
+
+    const header = <Col span={24}>
+        <Row gutter={[0, 10]} align='bottom'>
+            <Col flex='1 1 150px'>
+                {isFullscreen && leftChild}
+            </Col>
+            <Col flex='0 1 150px'>
+                {/*紧凑*/}
+                <Space style={{ float: 'right', marginBottom: 4 }}>
+                    <Button size='small' type='text' style={{ color: '#F56C6C' }} onClick={() => { setIsFullscreen(!isFullscreen) }}>
+                        <Tooltip title={isFullscreen ? '隐藏搜索' : '显示搜索'}><SearchOutlined /></Tooltip>
+                    </Button>
+                    {ajax && <Button
+                        size='small'
+                        type='text'
+                        style={{ color: '#67C23A' }}
+                        onClick={() => {
+                            ajax.refresh()
+                        }}>
+                        {/* <span style={{ fontSize: 10, color: '#999' }}>刷新时间:{ajax?.data?.reqTime}</span> */}
+                        <Tooltip title='刷新'><RedoOutlined /></Tooltip>
+                    </Button>}
+                    <Button
+                        size='small'
+                        type='text'
+                        style={{ color: '#E6A23C' }}
+                        onClick={() => {
+                            setVisible(true)
+                        }}>
+                        <Tooltip title='设置'><SettingOutlined /></Tooltip>
+                    </Button>
+                    <Button
+                        type='text'
+                        size='small'
+                        style={{ color: '#409EFF' }}
+                        onClick={toggleFull}>
+                        {<Tooltip title={!isFull ? '全屏' : '退出全屏'}>{!isFull ? <FullscreenOutlined /> : <FullscreenExitOutlined />}</Tooltip>}
+                    </Button>
+                    {visible && <CustomListModel
+                        sysFixed={fixed}
+                        version={version}
+                        config={config}
+                        configName={configName}
+                        visible={visible}
+                        onClose={() => { setVisible(false) }}
+                        onChange={(arr: any) => {
+                            setTimer(moment().format('HH:mm:ss'));
+                            if (arr) {
+                                setSelectData({ selectData: [], fixed: { left: fixed.left, right: fixed.right } })
+                            } else {
+                                setSelectData({ selectData: [], fixed: { left: fixed.left, right: fixed.right } })
+                            }
+                        }}
+                        columns={newColumns}
+                    />}
+                </Space>
+            </Col>
+        </Row>
+    </Col>
+    const content = <Row gutter={[0, 20]} ref={ref} style={isFull ? { background: '#fff' } : {}}>
+        {/**table */}
+        <Col span={24}>
+            <Card
+                style={{ borderRadius: 8 }}
+                // title={<div style={{ textAlign: 'center', fontWeight: 'bold' }}>{title}</div>}
+                headStyle={{ textAlign: 'left' }}
+                bodyStyle={{ padding: '5px 10px' }}
+            >
+                <div style={{ textAlign: 'center', fontWeight: 'bold', padding: '4px 6px 6px', fontSize: 16, marginBottom: 4 }}>{title}</div>
+                <Row gutter={[0, 16]}>
+                    {header}
+                    <Tab {...{ size, newColumns, handelResize, className, isZj, totalData, rowClassName, scroll, isFull, page, pageSize, dataSource, onChange, expandedRowRender, total, ajax, summary }} />
+                </Row>
+            </Card>
+        </Col>
+    </Row >
+    return <>
+        {content}
+    </>
+}
+
+/**表格 */
+const Tab = React.memo((props: any) => {
+    const { size, newColumns, className, handelResize, scroll, isFull, page, isZj, rowClassName, pageSize, totalData, dataSource, onChange, expandedRowRender, total, ajax, summary } = props
+    let ran = Math.ceil(Math.random() * 100)
+
+    useEffect(() => {
+        const contentBodyScroll = (e: any) => {
+            let el = document.querySelector(`.header_table_body_${ran} .ant-table-body`);
+            if (el) {
+                el.scrollLeft = e.target.scrollLeft
+            }
+        }
+        const headerBodyScroll = (e: any) => {
+            let el = document.querySelector(`.content_table_body_${ran} .ant-table-body`);
+            if (el) {
+                el.scrollLeft = e.target.scrollLeft
+            }
+        }
+        if (isZj) {
+            document.querySelector(`.content_table_body_${ran} .ant-table-body`)?.addEventListener('scroll', contentBodyScroll);
+            document.querySelector(`.header_table_body_${ran} .ant-table-body`)?.addEventListener('scroll', headerBodyScroll);
+            // document.querySelectorAll('.content_table_body .ant-table-body')
+        }
+        () => {
+            if (isZj) {
+                document.querySelector(`.content_table_body_${ran} .ant-table-body`)?.removeEventListener('scroll', contentBodyScroll);
+                document.querySelector(`.header_table_body_${ran} .ant-table-body`)?.removeEventListener('scroll', headerBodyScroll);
+            }
+        }
+    }, [isZj, ran])
+    let ww = document.body.clientWidth < 415
+    
+    return < Col span={24} >
+        <div className={`${style[size]} ${className ? style[className] : ''} `}>
+            {/* {
+                isZj && <Tables
+                    bordered
+                    columns={newColumns}
+                    dataSource={totalData?.length > 0 ? [...totalData] : [{ id: 1 }]}
+                    scroll={scroll ? isFull ? { ...scroll, y: document.body.clientHeight - 300 } : scroll : {}}
+                    size={size}
+                    pagination={false}
+                    hideOnSinglePage
+                    current={page}
+                    pageSize={pageSize}
+                    loading={ajax?.loading}
+                    className={`all_table header_table_body header_table_body_${ran} ${className ? className : ''}`}
+                    sortDirections={['ascend', 'descend', null]}
+                    handelResize={((columns: any) => handelResize(columns))}
+                    onChange={(pagination: any, filters: any, sorter: any) => onChange && onChange({ pagination, filters, sortData: sorter })}
+                />
+            } */}
+            {/* <Tables
+                showHeader={!isZj}
+                className={`all_table content_table_body content_table_body_${ran} ${className ? className : ''}`}
+                bordered
+                sortDirections={['ascend', 'descend', null]}
+                current={page}
+                pageSize={pageSize}
+                columns={newColumns}
+                dataSource={dataSource}
+                scroll={scroll ? isFull ? { ...scroll, y: document.body.clientHeight - 300 } : scroll : {}}
+                onChange={(pagination: any, filters: any, sorter: any) => onChange && onChange({ pagination, filters, sortData: sorter })}
+                rowClassName={rowClassName}
+                expandedRowRender={expandedRowRender ? expandedRowRender : undefined}
+                size={size}
+                total={total}
+                loading={ajax?.loading}
+                defaultPageSize={20}
+                handelResize={((columns: any) => handelResize(columns))}
+                summary={summary}
+            /> */}
+            <BaseTable
+                columns={getBaseTableColumn(newColumns)}
+                data={dataSource}
+                loading={ajax?.loading}
+                onColumnResizeEnd={({ column }: any) => handelResize(column)}
+                onChange={(data) => onChange?.(data)}
+                pagination={
+                    {
+                        size: 'small',
+                        total: total || 0,//总共多少条数据,服务器给,设置后分页自动计算页数
+                        current: page,//当前页数,需state控制配合翻页
+                        pageSize: pageSize,
+                        defaultCurrent: 1,//默认初始的当前页数
+                        defaultPageSize: 20,//默认初始的每页条数
+                        pageSizeOptions: ['10', '20', '30', '40', '50', '60', '70', '80', '90', '100'],
+                        showTotal: (total) => <Tag color="cyan">总共{total}数据</Tag>,
+                        showSizeChanger: true, //手动开启条数筛选器,默认超过50条开启
+                        // onChange: pageChange, //点击页码或条数筛选时触发获取当前页数和每页条数
+                        // onShowSizeChange: sizeChange,//点击条数筛选器触发
+                        simple: ww ? true : false,//开启简单分页
+                        hideOnSinglePage: false,//只有一页数据隐藏分页
+                        showLessItems: true
+                    }
+                }
+            />
+
+        </div>
+    </Col >
+})
+
+export default React.memo(TableData, (prevProps, nextProps) => {
+    return lodash.isEqual(nextProps, prevProps); // 假设 deepEqual 是一个深层比较函数
+})

+ 4 - 4
src/pages/gameDataStatistics/extensionData/everyday/tableConfig.tsx

@@ -309,10 +309,10 @@ function columns12(rechargeTrendHandle: (data: any) => void): { label: string, f
                     title: '复充率', dataIndex: 'repeatRechargeRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
-                { title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, render: (a: string) => <Statistic value={a || 0} /> },
-                { title: '首日付费ARPPU', dataIndex: 'firstRechargeArpu', label: '付费数据', align: 'center', width: 70, sorter: true, render: (a: string) => <Statistic value={a || 0} /> },
-                { title: '至今付费ARPPU', tips: '至今付费ARPPU=新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayRechargeArpu', label: '付费数据', align: 'center', width: 90, sorter: true, render: (a: string) => <Statistic value={a || 0} /> },
-                { title: '账面ARPPU', dataIndex: 'showRechargeArpu', label: '付费数据', align: 'center', width: 70, sorter: true, render: (a: string) => <Statistic value={a || 0} /> }
+                { title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, render: (a: string) => <Statistic value={a || 0} precision={2}/> },
+                { title: '首日付费ARPPU', dataIndex: 'firstRechargeArpu', label: '付费数据', align: 'center', width: 70, sorter: true, render: (a: string) => <Statistic value={a || 0} precision={2}/> },
+                { title: '至今付费ARPPU', tips: '至今付费ARPPU=新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayRechargeArpu', label: '付费数据', align: 'center', width: 90, sorter: true, render: (a: string) => <Statistic value={a || 0} precision={2}/> },
+                { title: '账面ARPPU', dataIndex: 'showRechargeArpu', label: '付费数据', align: 'center', width: 70, sorter: true, render: (a: string) => <Statistic value={a || 0} precision={2}/> }
             ]
         },
         {

+ 13 - 13
src/pages/gameDataStatistics/medium/gameEvery/tableConfig.tsx

@@ -223,7 +223,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '创角人数', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '创角人数', tips: '包含新老用户创角', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -259,7 +259,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户创角率', dataIndex: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', tips: '新用户累计创角人数/注册人数', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]
@@ -316,7 +316,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 13,
+                    title: '首日ROI', tips: '首日新用户充值金额/实际消耗', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 13,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -324,7 +324,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a} precision={2} valueStyle={a < 0 ? { color: 'red' } : {}} />
                 },
                 {
-                    title: '至今回收率', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今回收率', tips: '新用户累计充值金额/实际消耗', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 ...roiC,
@@ -349,7 +349,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日付费率', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费率', tips: '首日新用户充值人数/注册人数', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -357,11 +357,11 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费比', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费比', tips: '首日新用户充值人数/账面充值人数', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日客单价', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日客单价', tips: '首日新用户充值金额/首日新用户充值次数', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -369,11 +369,11 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '账面客单价', dataIndex: 'paperAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '账面客单价',  tips: '账面充值金额/账面充值次数', dataIndex: 'paperAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日充值成本', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
+                    title: '首日充值成本', tips: '实际消耗/首日新用户充值人数', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -381,19 +381,19 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今复充率', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今复充率', tips: '新用户复充人数/新用户累计充值人数(新用户复充人数为累计值充值次数n≥2)', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 17,
+                    title: '新增注册ARPPU', tips: '新用户累计充值金额/注册人数', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 17,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日付费ARPPU', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费ARPPU', tips: '首日新用户充值金额/首日新用户充值人数', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今付费ARPPU', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今付费ARPPU', tips: '新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {

+ 28 - 24
src/pages/gameDataStatistics/medium/gameTotal/tableConfig.tsx

@@ -76,15 +76,15 @@ function columns12() {
                 //     render: (a: number) => <Statistic value={a || 0} valueStyle={a >= 100 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 // },
                 {
-                    title: '创角人数', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '创角人数', tips: '消耗时间范围内的用户,在充值时间范围内创角', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日创角人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '首日创角人数', tips: '消耗时间范围内的用户,在注册当天创建角色用户人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户累计创角人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 100, sorter: true,
+                    title: '新用户累计创角人数', tips: '消耗时间范围内的用户,累计创建角色用户人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 100, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -96,11 +96,11 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 // {
-                //     title: '创角量', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                //     title: '创角量', tips: '消耗时间范围内的用户,在充值时间范围内创角数量', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 // {
-                //     title: '首日创角量', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                //     title: '首日创角量', tips: '消耗时间范围内的用户,在注册当天创建角色数量', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 // {
@@ -111,11 +111,11 @@ function columns12() {
                 //     title: '新用户累计有效创角量', dataIndex: 'totalAmount', label: '用户数据', align: 'center', width: 70, sorter: true,
                 // },
                 {
-                    title: '首日创角率', dataIndex: 'firstRoleRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '首日创角率', tips: '首日创角人数/注册人数', dataIndex: 'firstRoleRate', 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: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', tips: '新用户累计创角人数/注册人数', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]
@@ -132,7 +132,7 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户充值金额', dataIndex: 'newUserAmount', label: '付费数据', align: 'center', width: 70, default: 9,
+                    title: '新用户充值金额', tips: '消耗时间范围内用户,在充值时间内充值金额统计', dataIndex: 'newUserAmount', label: '付费数据', align: 'center', width: 70, default: 9,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -184,15 +184,15 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
+                    title: '首日ROI', tips: '首日新用户充值金额/实际消耗', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户回收率', dataIndex: 'newUserRoi', label: '付费数据', align: 'center', width: 70, default: 14,
+                    title: '新用户回收率', tips: '新用户充值金额/实际消耗', dataIndex: 'newUserRoi', label: '付费数据', align: 'center', width: 70, default: 14,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '至今回收率', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今回收率', tips: '新用户累计充值金额/实际消耗', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -221,11 +221,11 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日付费率', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费率', tips: '首日新用户充值人数/注册人数', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费率', dataIndex: 'newUserAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费率', tips: '新用户充值人数/注册人数', dataIndex: 'newUserAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -233,7 +233,7 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费比', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费比', tips: '新用户充值人数/账面充值人数', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 // {
@@ -241,11 +241,11 @@ function columns12() {
                 //     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 // },
                 {
-                    title: '首日客单价', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日客单价', tips: '首日新用户充值金额/首日新用户充值次数', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户客单价', dataIndex: 'newUserAvg', label: '付费数据', align: 'center', width: 70,
+                    title: '新用户客单价', tips: '新用户充值金额/新用户充值次数', dataIndex: 'newUserAvg', label: '付费数据', align: 'center', width: 70,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -253,11 +253,15 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日充值成本', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
+                    title: '至今客单价', tips: '新用户累计充值金额/新用户累计充值次数', dataIndex: 'todayAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户充值成本', dataIndex: 'newUserAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 17,
+                    title: '首日充值成本', tips: '实际消耗/首日新用户充值人数', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户充值成本', tips: '实际消耗/新用户充值人数', dataIndex: 'newUserAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 17,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -265,11 +269,11 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户复充率', dataIndex: 'newUserAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 20,
+                    title: '新用户复充率', tips: '消耗时间范围内注册用户,在充值时间内重复充值(用户在充值时间范围内的累计充值次数n≥2)。计算公式:复冲率=新用户复充人数/新用户累计充值人数', dataIndex: 'newUserAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 20,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '至今复充率', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今复充率', tips: '消耗时间范围内注册用户,重复充值(即用户累计充值次数n≥2)。计算公式:至今复充率=复充人数/新用户累计充值人数', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 // {
@@ -278,7 +282,7 @@ function columns12() {
                 // },
 
                 {
-                    title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 21,
+                    title: '新增注册ARPPU', tips: '新用户累计充值金额/注册人数', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 21,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 // {
@@ -286,15 +290,15 @@ function columns12() {
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 {
-                    title: '首日付费ARPPU', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费ARPPU', tips: '首日新用户充值金额/首日新用户充值人数', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户付费ARPPU', dataIndex: 'newUserArpu', label: '付费数据', align: 'center', width: 70,
+                    title: '新用户付费ARPPU', tips: '新用户充值金额/新用户充值人数', dataIndex: 'newUserArpu', label: '付费数据', align: 'center', width: 70,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今付费ARPPU', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今付费ARPPU', tips: '新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {

+ 13 - 13
src/pages/gameDataStatistics/medium/pitcherEvery/tableConfig.tsx

@@ -214,7 +214,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '创角人数', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '创角人数', tips: '包含新老用户创角', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -250,7 +250,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户创角率', dataIndex: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', tips: '新用户累计创角人数/注册人数', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]
@@ -307,7 +307,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 11,
+                    title: '首日ROI', tips: '首日新用户充值金额/实际消耗', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 11,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -315,7 +315,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a} precision={2} valueStyle={a < 0 ? { color: 'red' } : {}} />
                 },
                 {
-                    title: '至今回收率', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今回收率', tips: '新用户累计充值金额/实际消耗', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 ...roiC,
@@ -340,7 +340,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日付费率', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费率', tips: '首日新用户充值人数/注册人数', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -348,11 +348,11 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费比', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费比', tips: '首日新用户充值人数/账面充值人数', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日客单价', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日客单价', tips: '首日新用户充值金额/首日新用户充值次数', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -360,11 +360,11 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '账面客单价', dataIndex: 'paperAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '账面客单价', tips: '账面充值金额/账面充值次数', dataIndex: 'paperAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日充值成本', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 13,
+                    title: '首日充值成本', tips: '实际消耗/首日新用户充值人数', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 13,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -372,19 +372,19 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今复充率', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今复充率', tips: '新用户复充人数/新用户累计充值人数(新用户复充人数为累计值充值次数n≥2)', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
+                    title: '新增注册ARPPU', tips: '新用户累计充值金额/注册人数', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日付费ARPPU', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费ARPPU', tips: '首日新用户充值金额/首日新用户充值人数', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今付费ARPPU', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今付费ARPPU', tips: '新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {

+ 28 - 24
src/pages/gameDataStatistics/medium/pitcherTotal/tableConfig.tsx

@@ -68,15 +68,15 @@ function columns12() {
                 //     render: (a: number) => <Statistic value={a || 0} valueStyle={a >= 100 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 // },
                 {
-                    title: '创角人数', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '创角人数', tips: '消耗时间范围内的用户,在充值时间范围内创角', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日创角人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '首日创角人数', tips: '消耗时间范围内的用户,在注册当天创建角色用户人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户累计创角人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 100, sorter: true,
+                    title: '新用户累计创角人数', tips: '消耗时间范围内的用户,累计创建角色用户人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 100, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -88,11 +88,11 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 // {
-                //     title: '创角量', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                //     title: '创角量', tips: '消耗时间范围内的用户,在充值时间范围内创角数量', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 // {
-                //     title: '首日创角量', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                //     title: '首日创角量', tips: '消耗时间范围内的用户,在注册当天创建角色数量', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 // {
@@ -103,11 +103,11 @@ function columns12() {
                 //     title: '新用户累计有效创角量', dataIndex: 'totalAmount', label: '用户数据', align: 'center', width: 70, sorter: true,
                 // },
                 {
-                    title: '首日创角率', dataIndex: 'firstRoleRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '首日创角率', tips: '首日创角人数/注册人数', dataIndex: 'firstRoleRate', 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: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', tips: '新用户累计创角人数/注册人数', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]
@@ -124,7 +124,7 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户充值金额', dataIndex: 'newUserAmount', label: '付费数据', align: 'center', width: 70, default: 7,
+                    title: '新用户充值金额', tips: '消耗时间范围内用户,在充值时间内充值金额统计', dataIndex: 'newUserAmount', label: '付费数据', align: 'center', width: 70, default: 7,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -176,15 +176,15 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 13,
+                    title: '首日ROI', tips: '首日新用户充值金额/实际消耗', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 13,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户回收率', dataIndex: 'newUserRoi', label: '付费数据', align: 'center', width: 70, default: 12,
+                    title: '新用户回收率', tips: '新用户充值金额/实际消耗', dataIndex: 'newUserRoi', label: '付费数据', align: 'center', width: 70, default: 12,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '至今回收率', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今回收率', tips: '新用户累计充值金额/实际消耗', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -213,11 +213,11 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日付费率', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费率', tips: '首日新用户充值人数/注册人数', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费率', dataIndex: 'newUserAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费率', tips: '新用户充值人数/注册人数', dataIndex: 'newUserAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -225,7 +225,7 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费比', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费比', tips: '新用户充值人数/账面充值人数', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 // {
@@ -233,11 +233,11 @@ function columns12() {
                 //     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 // },
                 {
-                    title: '首日客单价', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日客单价', tips: '首日新用户充值金额/首日新用户充值次数', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户客单价', dataIndex: 'newUserAvg', label: '付费数据', align: 'center', width: 70,
+                    title: '新用户客单价', tips: '新用户充值金额/新用户充值次数', dataIndex: 'newUserAvg', label: '付费数据', align: 'center', width: 70,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -245,11 +245,15 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日充值成本', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 16,
+                    title: '至今客单价', tips: '新用户累计充值金额/新用户累计充值次数', dataIndex: 'todayAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户充值成本', dataIndex: 'newUserAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
+                    title: '首日充值成本', tips: '实际消耗/首日新用户充值人数', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 16,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户充值成本', tips: '实际消耗/新用户充值人数', dataIndex: 'newUserAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 15,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -257,11 +261,11 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户复充率', dataIndex: 'newUserAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
+                    title: '新用户复充率', tips: '消耗时间范围内注册用户,在充值时间内重复充值(用户在充值时间范围内的累计充值次数n≥2)。计算公式:复冲率=新用户复充人数/新用户累计充值人数', dataIndex: 'newUserAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '至今复充率', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今复充率', tips: '消耗时间范围内注册用户,重复充值(即用户累计充值次数n≥2)。计算公式:至今复充率=复充人数/新用户累计充值人数', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 // {
@@ -270,7 +274,7 @@ function columns12() {
                 // },
 
                 {
-                    title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 19,
+                    title: '新增注册ARPPU', tips: '新用户累计充值金额/注册人数', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 19,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 // {
@@ -278,15 +282,15 @@ function columns12() {
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 {
-                    title: '首日付费ARPPU', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费ARPPU', tips: '首日新用户充值金额/首日新用户充值人数', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户付费ARPPU', dataIndex: 'newUserArpu', label: '付费数据', align: 'center', width: 70,
+                    title: '新用户付费ARPPU', tips: '新用户充值金额/新用户充值人数', dataIndex: 'newUserArpu', label: '付费数据', align: 'center', width: 70,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今付费ARPPU', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今付费ARPPU', tips: '新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {

+ 14 - 14
src/pages/gameDataStatistics/medium/promotionEvery/tableConfig.tsx

@@ -227,7 +227,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '创角人数', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '创角人数', tips: '包含新老用户创角', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -263,7 +263,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户创角率', dataIndex: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', tips: '新用户累计创角人数/注册人数', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]
@@ -320,7 +320,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 14,
+                    title: '首日ROI', tips: '首日新用户充值金额/实际消耗', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 14,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -328,7 +328,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a} precision={2} valueStyle={a < 0 ? { color: 'red' } : {}} />
                 },
                 {
-                    title: '至今回收率', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今回收率', tips: '新用户累计充值金额/实际消耗', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 ...roiC,
@@ -353,19 +353,19 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日付费率', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费率', tips: '首日新用户充值人数/注册人数', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '至今付费率', tips: '至今付费率(总)=新用户累计充值人数/注册人数', dataIndex: 'todayRate', label: '付费数据', align: 'center', width: 80, sorter: true,
+                    title: '至今付费率', tips: '至今付费率=新用户累计充值人数/注册人数', dataIndex: 'todayRate', label: '付费数据', align: 'center', width: 80, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费比', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费比', tips: '首日新用户充值人数/账面充值人数', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日客单价', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日客单价', tips: '首日新用户充值金额/首日新用户充值次数', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -373,11 +373,11 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '账面客单价', dataIndex: 'paperAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '账面客单价', tips: '账面充值金额/账面充值次数', dataIndex: 'paperAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日充值成本', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 16,
+                    title: '首日充值成本', tips: '实际消耗/首日新用户充值人数', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 16,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -385,19 +385,19 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今复充率', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今复充率', tips: '新用户复充人数/新用户累计充值人数(新用户复充人数为累计值充值次数n≥2)', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
+                    title: '新增注册ARPPU', tips: '新用户累计充值金额/注册人数', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日付费ARPPU', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费ARPPU', tips: '首日新用户充值金额/首日新用户充值人数', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今付费ARPPU', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今付费ARPPU', tips: '新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {

+ 28 - 24
src/pages/gameDataStatistics/medium/promotionTotal/tableConfig.tsx

@@ -80,15 +80,15 @@ function columns12() {
                 //     render: (a: number) => <Statistic value={a || 0} valueStyle={a >= 100 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 // },
                 {
-                    title: '创角人数', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '创角人数', tips: '消耗时间范围内的用户,在充值时间范围内创角', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日创角人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '首日创角人数', tips: '消耗时间范围内的用户,在注册当天创建角色用户人数', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户累计创角人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 100, sorter: true,
+                    title: '新用户累计创角人数', tips: '消耗时间范围内的用户,累计创建角色用户人数', dataIndex: 'newUserTotalRoleNum', label: '用户数据', align: 'center', width: 100, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -100,11 +100,11 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 // {
-                //     title: '创角量', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                //     title: '创角量', tips: '消耗时间范围内的用户,在充值时间范围内创角数量', dataIndex: 'roleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 // {
-                //     title: '首日创角量', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
+                //     title: '首日创角量', tips: '消耗时间范围内的用户,在注册当天创建角色数量', dataIndex: 'firstRoleNum', label: '用户数据', align: 'center', width: 70, sorter: true,
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 // {
@@ -115,11 +115,11 @@ function columns12() {
                 //     title: '新用户累计有效创角量', dataIndex: 'totalAmount', label: '用户数据', align: 'center', width: 70, sorter: true,
                 // },
                 {
-                    title: '首日创角率', dataIndex: 'firstRoleRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '首日创角率', tips: '首日创角人数/注册人数', dataIndex: 'firstRoleRate', 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: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', tips: '新用户累计创角人数/注册人数', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]
@@ -136,7 +136,7 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户充值金额', dataIndex: 'newUserAmount', label: '付费数据', align: 'center', width: 70, default: 10,
+                    title: '新用户充值金额', tips: '消耗时间范围内用户,在充值时间内充值金额统计', dataIndex: 'newUserAmount', label: '付费数据', align: 'center', width: 70, default: 10,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -188,15 +188,15 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日ROI', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 16,
+                    title: '首日ROI', tips: '首日新用户充值金额/实际消耗', dataIndex: 'firstRoi', label: '付费数据', align: 'center', width: 70, sorter: true, default: 16,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户回收率', dataIndex: 'newUserRoi', label: '付费数据', align: 'center', width: 70, default: 15,
+                    title: '新用户回收率', tips: '新用户充值金额/实际消耗', dataIndex: 'newUserRoi', label: '付费数据', align: 'center', width: 70, default: 15,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '至今回收率', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今回收率', tips: '新用户累计充值金额/实际消耗', dataIndex: 'todayRoi', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -225,11 +225,11 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '首日付费率', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费率', tips: '首日新用户充值人数/注册人数', dataIndex: 'firstRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费率', dataIndex: 'newUserAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费率', tips: '新用户充值人数/注册人数', dataIndex: 'newUserAmountRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
@@ -237,7 +237,7 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户付费比', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户付费比', tips: '新用户充值人数/账面充值人数', dataIndex: 'newUserAmountRatio', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 // {
@@ -245,11 +245,11 @@ function columns12() {
                 //     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 // },
                 {
-                    title: '首日客单价', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日客单价', tips: '首日新用户充值金额/首日新用户充值次数', dataIndex: 'firstAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户客单价', dataIndex: 'newUserAvg', label: '付费数据', align: 'center', width: 70,
+                    title: '新用户客单价', tips: '新用户充值金额/新用户充值次数', dataIndex: 'newUserAvg', label: '付费数据', align: 'center', width: 70,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -257,11 +257,15 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '首日充值成本', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 19,
+                    title: '至今客单价', tips: '新用户累计充值金额/新用户累计充值次数', dataIndex: 'todayAvg', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户充值成本', dataIndex: 'newUserAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
+                    title: '首日充值成本', tips: '实际消耗/首日新用户充值人数', dataIndex: 'firstAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 19,
+                    render: (a: string) => <Statistic value={a || 0} />
+                },
+                {
+                    title: '新用户充值成本', tips: '实际消耗/新用户充值人数', dataIndex: 'newUserAmountCost', label: '付费数据', align: 'center', width: 70, sorter: true, default: 18,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
@@ -269,11 +273,11 @@ function columns12() {
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户复充率', dataIndex: 'newUserAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 21,
+                    title: '新用户复充率', tips: '消耗时间范围内注册用户,在充值时间内重复充值(用户在充值时间范围内的累计充值次数n≥2)。计算公式:复冲率=新用户复充人数/新用户累计充值人数', dataIndex: 'newUserAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true, default: 21,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '至今复充率', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今复充率', tips: '消耗时间范围内注册用户,重复充值(即用户累计充值次数n≥2)。计算公式:至今复充率=复充人数/新用户累计充值人数', dataIndex: 'todayAgainRate', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 1 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 // {
@@ -282,7 +286,7 @@ function columns12() {
                 // },
 
                 {
-                    title: '新增注册ARPPU', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 22,
+                    title: '新增注册ARPPU', tips: '新用户累计充值金额/注册人数', dataIndex: 'newRegArpu', label: '付费数据', align: 'center', width: 70, sorter: true, default: 22,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 // {
@@ -290,15 +294,15 @@ function columns12() {
                 //     render: (a: string) => <Statistic value={a || 0} />
                 // },
                 {
-                    title: '首日付费ARPPU', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '首日付费ARPPU', tips: '首日新用户充值金额/首日新用户充值人数', dataIndex: 'firstArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '新用户付费ARPPU', dataIndex: 'newUserArpu', label: '付费数据', align: 'center', width: 70,
+                    title: '新用户付费ARPPU', tips: '新用户充值金额/新用户充值人数', dataIndex: 'newUserArpu', label: '付费数据', align: 'center', width: 70,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {
-                    title: '至今付费ARPPU', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
+                    title: '至今付费ARPPU', tips: '新用户累计充值金额/新用户累计充值人数', dataIndex: 'todayArpu', label: '付费数据', align: 'center', width: 70, sorter: true,
                     render: (a: string) => <Statistic value={a || 0} />
                 },
                 {

+ 1 - 1
src/pages/gameDataStatistics/pitcher/everyDay/tableConfig.tsx

@@ -244,7 +244,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户创角率', dataIndex: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]

+ 1 - 1
src/pages/gameDataStatistics/pitcher/everyDayGame/tableConfig.tsx

@@ -259,7 +259,7 @@ function columns12(): { label: string, fieldSHow?: { label: string, saveField: s
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户创角率', dataIndex: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]

+ 1 - 1
src/pages/gameDataStatistics/pitcher/total/tableConfig.tsx

@@ -102,7 +102,7 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户创角率', dataIndex: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]

+ 1 - 1
src/pages/gameDataStatistics/pitcher/totalGame/tableConfig.tsx

@@ -115,7 +115,7 @@ function columns12() {
                     render: (a: number) => <Statistic value={a ? a * 100 : 0} precision={2} valueStyle={!a ? {} : a >= 50 ? { color: 'red' } : { color: '#0f990f' }} suffix="%" />
                 },
                 {
-                    title: '新用户创角率', dataIndex: 'roleNumRate', label: '用户数据', align: 'center', width: 70, sorter: true,
+                    title: '新用户创角率', dataIndex: 'newUserTotalRoleRate', 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="%" />
                 }
             ]

+ 1 - 4
src/pages/gameDataStatistics/rankingList/gamer/index.tsx

@@ -2,12 +2,11 @@ import { useAjax } from "@/Hook/useAjax"
 import { getRechargeUserListApi, UserRechargeListType } from "@/services/gameData/rankingList"
 import React, { useEffect, useState } from "react"
 import TableData from "../../components/TableData"
+import TableData1 from "../../components/TableData/index1"
 import columns12 from "./tableConfig"
 import QueryForm from "@/components/QueryForm"
 import moment from "moment"
 import { getPresetsRanking } from "@/components/QueryForm/const"
-import VirtualTable from "@/components/VirtualTable"
-import BaseTable from "@/components/BaseTable"
 
 const Gamer: React.FC = () => {
 
@@ -21,8 +20,6 @@ const Gamer: React.FC = () => {
     }, [queryForm])
 
     return <div>
-        {/* <VirtualTable /> */}
-        {/* <BaseTable /> */}
         <TableData
             leftChild={<QueryForm
                 initialValues={{ sourceSystem: 'ZX_ONE', rechargeDay: [moment(), moment()] }}

+ 0 - 1
src/pages/gameDataStatistics/rankingList/gamer/tableConfig.tsx

@@ -2,7 +2,6 @@ import ProgressTable from "@/components/ProgressTable"
 import WidthEllipsis from "@/components/widthEllipsis"
 import { Statistic } from "antd"
 import React from "react"
-import moment from "moment"
 
 function columns12() {