wjx hai 3 semanas
pai
achega
2804238970

+ 2 - 1
src/pages/weComTask/API/businessPlan/typings.d.ts

@@ -31,6 +31,7 @@ declare namespace BUSINES_SPLAN_API {
         projectName?: string
         createTimeMin?: string,
         createTimeMax?: string,
-        projectType?: number
+        projectType?: number,
+        status?: number
     }
 }

+ 3 - 1
src/pages/weComTask/API/groupChat/typings.d.ts

@@ -10,6 +10,8 @@ declare namespace GROUP_CHAT_API {
         pageSize: number,
         projectName?: string
         createTimeMin?: string,
-        createTimeMax?: string
+        createTimeMax?: string,
+        status?: number,
+        corpChatUserIds?: any[]
     }
 }

+ 3 - 0
src/pages/weComTask/components/filterUser/filterUserText.ts

@@ -10,6 +10,7 @@ const targetingData = [
     { key: 'lastChapterNameList', name: '最近阅读章节' },
     { key: 'platformUserId', name: '书城用户ID' },
     { key: 'rechargeBook', name: '充值小说' },
+    { key: 'allCorp', name: '是否查询所有公司' },
     { key: 'begin', name: '关注时间' },
     { key: 'genders', name: '性别' },
     { key: 'rechargeCount', name: '充值次数' },
@@ -51,6 +52,7 @@ interface ContentProps {
     lastChapterNameList?: string[],
     platformUserId?: string,// 书城用户ID
     rechargeBook?: string,  // 充值小说
+    allCorp?: boolean,  // 是否查询所有公司
     begin?: {               // 关注时间
         beginTime?: string,
         endTime?: string
@@ -302,6 +304,7 @@ const FilterUserText = ({ data, configName, configType = 'USER_GROUP', bookCityL
     (content?.addGroupCount ? `进群次数:${content?.addGroupCount?.addGroupCountMin ? content?.addGroupCount?.addGroupCountMin : '不限'} - ${content?.addGroupCount?.addGroupCountMax ? content?.addGroupCount?.addGroupCountMax : '不限'}\n` : '') +
     (content?.exitGroupCount ? `退群次数:${content?.exitGroupCount?.exitGroupCountMin ? content?.exitGroupCount?.exitGroupCountMin : '不限'} - ${content?.exitGroupCount?.exitGroupCountMax ? content?.exitGroupCount?.exitGroupCountMax : '不限'}\n` : '') +
     (content?.retentionGroupCount ? `留存群聊数:${content?.retentionGroupCount?.retentionGroupCountMin ? content?.retentionGroupCount?.retentionGroupCountMin : '不限'} - ${content?.retentionGroupCount?.retentionGroupCountMax ? content?.retentionGroupCount?.retentionGroupCountMax : '不限'}\n` : '') +
+    (configType === 'USER_GROUP' ? `是否查询所有公司:${content?.allCorp ? '是' : '否'}\n` : '') +
     (content?.unlimited ? `不限:${content?.unlimited}` : '')
 }
 

+ 6 - 0
src/pages/weComTask/components/filterUser/filterUserTooltip.tsx

@@ -13,6 +13,7 @@ const targetingData = [
     { key: 'lastChapterNameList', name: '最近阅读章节' },
     { key: 'platformUserId', name: '书城用户ID' },
     { key: 'rechargeBook', name: '充值小说' },
+    { key: 'allCorp', name: '是否查询所有公司' },
     { key: 'begin', name: '关注时间' },
     { key: 'genders', name: '性别' },
     { key: 'rechargeCount', name: '充值次数' },
@@ -59,6 +60,7 @@ interface ContentProps {
     lastChapterNameList?: string[],
     platformUserId?: string,// 书城用户ID
     rechargeBook?: string,  // 充值小说
+    allCorp?: boolean,  // 是否查询所有公司
     begin?: {               // 关注时间
         beginTime?: string,
         endTime?: string
@@ -394,6 +396,10 @@ const FilterUserTooltip: React.FC<Props> = (props) => {
             <strong>留存群聊数:</strong><span>{content?.retentionGroupCount?.retentionGroupCountMin ? content?.retentionGroupCount?.retentionGroupCountMin : '不限'} - {content?.retentionGroupCount?.retentionGroupCountMax ? content?.retentionGroupCount?.retentionGroupCountMax : '不限'}</span>
         </div>}
 
+        {configType === 'USER_GROUP' && <div>
+            <strong>是否查询所有公司:</strong><span>{content?.allCorp ? '是' : '否'}</span>
+        </div>}
+
         {content?.unlimited && <div>
             <strong>不限:</strong><span>{content?.unlimited}</span>
         </div>}

+ 5 - 0
src/pages/weComTask/components/filterUser/newFiterUser.tsx

@@ -568,6 +568,11 @@ const NewFilterUser: React.FC<NewFilterUserProps> = ({ bookCityList, configType
                         </Space>
                     </Form.Item>
                 </div>
+                <div className={style.newSpace}>
+                    <Form.Item name="allCorp" label={<strong>查询所有公司</strong>} style={{ marginBottom: 0 }} valuePropName='checked'>
+                        <Checkbox>是否查询所有公司</Checkbox>
+                    </Form.Item>
+                </div>
             </>}
         </Form>
     </Modal>

+ 17 - 1
src/pages/weComTask/page/businessPlan/taskList/index.tsx

@@ -1,6 +1,6 @@
 import { useAjax } from '@/Hook/useAjax';
 import { cancelProjectApi, delProjectApi, getProjectListApi } from '@/pages/weComTask/API/businessPlan/create';
-import { App, Button, Card, DatePicker, Input, Popconfirm, Space, Table } from 'antd';
+import { App, Button, Card, DatePicker, Input, Popconfirm, Select, Space, Table } from 'antd';
 import React, { useEffect, useState } from 'react';
 import taskListColumns from './tableConfig';
 import dayjs from 'dayjs';
@@ -111,6 +111,21 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
                     }}
                 />
             </Space.Compact>
+            <Space.Compact>
+                <Button>状态</Button>
+                <Select
+                    style={{ width: 120 }}
+                    onChange={(e) => {
+                        setQueryForm({ ...queryForm, status: e })
+                    }}
+                    placeholder="请选择状态"
+                    allowClear
+                    options={[
+                        { value: 1, label: '可用' },
+                        { value: 3, label: '暂停' },
+                    ]}
+                />
+            </Space.Compact>
             <Button
                 type='primary'
                 onClick={() => {
@@ -155,6 +170,7 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
             bordered={true}
             size='small'
             scroll={{ y: 600, x: 1200 }}
+            loading={getProjectList?.loading}
             pagination={{
                 current: getProjectList?.data?.data?.current,
                 pageSize: getProjectList?.data?.data?.size,

+ 21 - 1
src/pages/weComTask/page/groupChat/create/components/groupUser/addGroupObject.tsx

@@ -199,6 +199,16 @@ export const ShowGroupUserTable: React.FC<GROUP_CHAT_CREATE.ShowGroupUserTablePr
                 return value ? <span style={{ color: '#1890ff' }}>是</span> : <span style={{ color: 'red' }}>否</span>
             },
         },
+        {
+            title: '是否根据所选主体相同客户去重',
+            dataIndex: 'excludeSameCorpUser',
+            key: 'excludeSameCorpUser',
+            width: 70,
+            align: 'center',
+            render(value) {
+                return value ? <span style={{ color: '#1890ff' }}>是</span> : <span style={{ color: 'red' }}>否</span>
+            },
+        },
         {
             title: '群聊关联公众号',
             dataIndex: 'weChatAppid',
@@ -348,7 +358,7 @@ const AddGroupObjectModal: React.FC<GROUP_CHAT_CREATE.AddGroupObjectModalProps>
                 message.error(errorFields?.[0]?.errors?.[0])
             }}
             onFinish={handleOk}
-            initialValues={(initialValues && Object.keys(initialValues).length > 0) ? initialValues : { externalUserType: 'specify', isRepair: false, groupIndex: 1, groupUserCount: 37, autoOutGroup: false, excludeInGroup: true, deleteGroupTag: true, isRetry: false }}
+            initialValues={(initialValues && Object.keys(initialValues).length > 0) ? initialValues : { externalUserType: 'specify', isRepair: false, groupIndex: 1, groupUserCount: 37, autoOutGroup: false, excludeInGroup: true, deleteGroupTag: true, isRetry: false, excludeSameCorpUser: false }}
             preserve={true}
         >
             <Form.Item
@@ -467,6 +477,16 @@ const AddGroupObjectModal: React.FC<GROUP_CHAT_CREATE.AddGroupObjectModalProps>
                     <Radio value={false}>否</Radio>
                 </Radio.Group>
             </Form.Item>
+            <Form.Item
+                name={'excludeSameCorpUser'}
+                label={<strong>是否根据所选主体相同客户去重</strong>}
+                rules={[{ required: true, message: '请选择是否开启失败人群重试!' }]}
+            >
+                <Radio.Group>
+                    <Radio value={true}>是</Radio>
+                    <Radio value={false}>否</Radio>
+                </Radio.Group>
+            </Form.Item>
             <Form.Item
                 name={'weChatAppid'}
                 label={<strong>群聊关联公众号</strong>}

+ 2 - 1
src/pages/weComTask/page/groupChat/create/const.ts

@@ -12,11 +12,12 @@ export const getPullGroupData = (strategyList: any[]) => {
             return {
                 ...item,
                 id,
-                groupObjectList: taskDetail.map(({ externalUserFilter, weChatAppid, mpAccountInfo, msgTagDTO, groupName, isRetry, ...go }, i) => {
+                groupObjectList: taskDetail.map(({ externalUserFilter, weChatAppid, mpAccountInfo, msgTagDTO, groupName, isRetry, excludeSameCorpUser, ...go }, i) => {
                     const id = go.id || nowTime_inherit + (index * 1000) + (i * 100)
                     const inherit: { [x: string]: any } = {
                         ...go,
                         isRetry: isRetry || false,
+                        excludeSameCorpUser: excludeSameCorpUser || false,
                         id,
                         weChatAppid: mpAccountInfo?.name ? mpAccountInfo?.name + '_' + mpAccountInfo?.id : undefined,
                         tagDTO: msgTagDTO,

+ 10 - 0
src/pages/weComTask/page/groupChat/create/tableConfig.tsx

@@ -173,6 +173,16 @@ export const PreviewColumns = (bookPlatForm: TASK_CREATE.BookPlatFormProps[], bo
                 return value ? <span style={{ color: '#1890ff' }}>是</span> : <span style={{ color: 'red' }}>否</span>
             },
         },
+        {
+            title: '是否根据所选主体相同客户去重',
+            dataIndex: 'excludeSameCorpUser',
+            key: 'excludeSameCorpUser',
+            width: 70,
+            align: 'center',
+            render(value) {
+                return value ? <span style={{ color: '#1890ff' }}>是</span> : <span style={{ color: 'red' }}>否</span>
+            },
+        },
         {
             title: '群聊关联公众号',
             dataIndex: 'weChatAppid',

+ 10 - 0
src/pages/weComTask/page/groupChat/taskList/details.tsx

@@ -179,6 +179,16 @@ const Details: React.FC<Props> = ({ data, bookPlatForm, bookList, visible, onClo
                         return value ? <span style={{ color: '#1890ff' }}>是</span> : <span style={{ color: 'red' }}>否</span>
                     },
                 },
+                {
+                    title: '是否根据所选主体相同客户去重',
+                    dataIndex: 'excludeSameCorpUser',
+                    key: 'excludeSameCorpUser',
+                    width: 70,
+                    align: 'center',
+                    render(value) {
+                        return value ? <span style={{ color: '#1890ff' }}>是</span> : <span style={{ color: 'red' }}>否</span>
+                    },
+                },
                 {
                     title: '拉群完成后自动删除拉群标签',
                     dataIndex: 'excludeInGroup',

+ 36 - 3
src/pages/weComTask/page/groupChat/taskList/index.tsx

@@ -1,6 +1,6 @@
 import { useAjax } from '@/Hook/useAjax';
 import { cancelProjectApi, delProjectApi, getProjectListApi } from '@/pages/weComTask/API/groupChat';
-import { App, Button, Card, DatePicker, Input, Popconfirm, Space, Table } from 'antd';
+import { App, Button, Card, DatePicker, Input, Popconfirm, Select, Space, Table } from 'antd';
 import React, { useEffect, useState } from 'react';
 import { DeleteOutlined, PauseCircleOutlined, PlusCircleOutlined, SearchOutlined } from '@ant-design/icons';
 import dayjs from 'dayjs';
@@ -9,6 +9,7 @@ import { toJS } from 'mobx';
 import { inject, observer } from 'mobx-react';
 import Details from './details';
 import AddToGroup from '../../businessPlan/taskList/components/addToGroup';
+import SelectGroupLeader from '../../groupLeaderManage/selectGroupLeader';
 
 const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookListProps[], bookPlatForm: TASK_CREATE.BookPlatFormProps[] } } }> = ({ weComTaskStore }) => {
 
@@ -36,7 +37,14 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
     }, [])
 
     useEffect(() => {
-        getProjectList.run(queryFormNew)
+        const { corpChatUserIds, ...p } = queryFormNew
+        let params: any = { ...p }
+        if (corpChatUserIds?.length) {
+            params.corpChatUserIds = corpChatUserIds.map(item => item.value)
+        } else {
+            delete params?.corpChatUserIds
+        }
+        getProjectList.run(params)
     }, [queryFormNew])
 
     // 复制
@@ -68,7 +76,7 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
                 break
             case 'cancel':
             case 'open':
-                cancelProject.run({...data, pause: type === 'cancel' ? false : true}).then(res => {
+                cancelProject.run({ ...data, pause: type === 'cancel' ? false : true }).then(res => {
                     hide()
                     setselectedRows([])
                     if (res?.data) {
@@ -107,6 +115,30 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
                     }}
                 />
             </Space.Compact>
+            <Space.Compact>
+                <Button>群主号</Button>
+                <SelectGroupLeader
+                    value={queryForm?.corpChatUserIds}
+                    onChange={(corpChatUserIds) => {
+                        setQueryForm({ ...queryForm, corpChatUserIds })
+                    }}
+                />
+            </Space.Compact>
+            <Space.Compact>
+                <Button>状态</Button>
+                <Select
+                    style={{ width: 120 }}
+                    onChange={(e) => {
+                        setQueryForm({ ...queryForm, status: e })
+                    }}
+                    placeholder="请选择状态"
+                    allowClear
+                    options={[
+                        { value: 1, label: '可用' },
+                        { value: 3, label: '暂停' },
+                    ]}
+                />
+            </Space.Compact>
             <Button
                 type='primary'
                 onClick={() => {
@@ -152,6 +184,7 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
             bordered={true}
             size='small'
             scroll={{ y: 600, x: 1200 }}
+            loading={getProjectList?.loading}
             pagination={{
                 current: getProjectList?.data?.data?.current,
                 pageSize: getProjectList?.data?.data?.size,

+ 17 - 1
src/pages/weComTask/page/groupChatSend/official/taskList/index.tsx

@@ -10,7 +10,7 @@ import { inject, observer } from 'mobx-react';
 import { toJS } from 'mobx';
 import { getBindMpListApi } from '@/pages/weComTask/API/corpUserAssign';
 import { getCorpAllListApi } from '@/API/global';
-import { DefaultOptionType } from 'antd/es/select';
+import Select, { DefaultOptionType } from 'antd/es/select';
 import AddToGroup from '../../../businessPlan/taskList/components/addToGroup';
 
 /**
@@ -129,6 +129,21 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
                     }}
                 />
             </Space.Compact>
+            <Space.Compact>
+                <Button>状态</Button>
+                <Select
+                    style={{ width: 120 }}
+                    onChange={(e) => {
+                        setQueryForm({ ...queryForm, status: e })
+                    }}
+                    placeholder="请选择状态"
+                    allowClear
+                    options={[
+                        { value: 1, label: '可用' },
+                        { value: 3, label: '暂停' },
+                    ]}
+                />
+            </Space.Compact>
             <Button
                 type='primary'
                 onClick={() => {
@@ -173,6 +188,7 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
             bordered={true}
             size='small'
             scroll={{ y: 600, x: 1200 }}
+            loading={getProjectList?.loading}
             pagination={{
                 current: getProjectList?.data?.data?.current,
                 pageSize: getProjectList?.data?.data?.size,

+ 17 - 1
src/pages/weComTask/page/groupChatSend/robot/taskList/index.tsx

@@ -10,7 +10,7 @@ import { inject, observer } from 'mobx-react';
 import { toJS } from 'mobx';
 import { getBindMpListApi } from '@/pages/weComTask/API/corpUserAssign';
 import { getCorpAllListApi } from '@/API/global';
-import { DefaultOptionType } from 'antd/es/select';
+import Select, { DefaultOptionType } from 'antd/es/select';
 import AddToGroup from '../../../businessPlan/taskList/components/addToGroup';
 
 /**
@@ -129,6 +129,21 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
                     }}
                 />
             </Space.Compact>
+            <Space.Compact>
+                <Button>状态</Button>
+                <Select
+                    style={{ width: 120 }}
+                    onChange={(e) => {
+                        setQueryForm({ ...queryForm, status: e })
+                    }}
+                    placeholder="请选择状态"
+                    allowClear
+                    options={[
+                        { value: 1, label: '可用' },
+                        { value: 3, label: '暂停' },
+                    ]}
+                />
+            </Space.Compact>
             <Button
                 type='primary'
                 onClick={() => {
@@ -173,6 +188,7 @@ const TaskList: React.FC<{ weComTaskStore: { data: { bookList: TASK_CREATE.BookL
             bordered={true}
             size='small'
             scroll={{ y: 600, x: 1200 }}
+            loading={getProjectList?.loading}
             pagination={{
                 current: getProjectList?.data?.data?.current,
                 pageSize: getProjectList?.data?.data?.size,

+ 2 - 2
src/pages/weComTask/page/home/index.less

@@ -1,11 +1,11 @@
 .item {
     display: flex;
-    padding: 10px;
+    padding: 6px 10px;
     background-color: #f9fafb;
     border-radius: 8px;
     justify-content: space-between;
     align-items: center;
-    font-size: 16px;
+    font-size: 14px;
 
     .num {
         display: flex;

+ 197 - 44
src/pages/weComTask/page/home/index.tsx

@@ -20,7 +20,18 @@ const Home: React.FC = () => {
     const [barCorpUserData, setBarCorpUserData] = useState<Record<string, any>[]>([])
     const [activeKey, setActiveKey] = useState<string>('1')
     const [userData, setUserData] = useState<Record<string, any>[]>([])
-    const [overflowData, setOverflowData] = useState<{ avgCorpRepeatUserRate: number, repeatUserRate: number, userCount: number }>({ avgCorpRepeatUserRate: 0, repeatUserRate: 0, userCount: 0 })
+    const [overflowData, setOverflowData] = useState<{
+        avgCorpRepeatUserRate: number,
+        repeatUserRate: number,
+        userCount: number,
+        qcUuidCount: number,
+        qcUuidCountRate: number,
+        qcUuidNullCount: number,
+        qcUuidNullCountRate: number,
+        deletedUserCount: number,
+        deletedUserCountRate: number
+        qcUuidUserCount: number
+    }>({ avgCorpRepeatUserRate: 0, repeatUserRate: 0, userCount: 0, qcUuidCount: 0, qcUuidCountRate: 0, qcUuidNullCount: 0, qcUuidNullCountRate: 0, deletedUserCount: 0, deletedUserCountRate: 0, qcUuidUserCount: 0 })
 
     const getExternalUserRepeatCorp = useAjax(() => getExternalUserRepeatCorpApi())
     const getExternalUserRepeatCorpUser = useAjax(() => getExternalUserRepeatCorpUserApi())
@@ -60,7 +71,18 @@ const Home: React.FC = () => {
             if (res?.data) {
                 const cur = res.data
                 setCorpUserRepeat(cur)
-                setOverflowData({ avgCorpRepeatUserRate: cur?.avgCorpRepeatUserRate || 0, repeatUserRate: cur?.repeatUserRate || 0, userCount: cur?.userCount || 0 })
+                setOverflowData({
+                    avgCorpRepeatUserRate: cur?.avgCorpRepeatUserRate || 0,
+                    repeatUserRate: cur?.repeatUserRate || 0,
+                    userCount: cur?.userCount || 0,
+                    qcUuidCount: cur?.qcUuidCount || 0,
+                    qcUuidCountRate: cur?.qcUuidCountRate || 0,
+                    qcUuidNullCount: cur?.qcUuidNullCount || 0,
+                    qcUuidNullCountRate: cur?.qcUuidNullCountRate || 0,
+                    deletedUserCount: cur?.deletedUserCount || 0,
+                    deletedUserCountRate: cur?.deletedUserCountRate || 0,
+                    qcUuidUserCount: cur?.qcUuidUserCount || 0,
+                })
                 setBarCorpUserData([
                     { name: '仅添加1名客服', '人数': cur?.oneRepeatCount },
                     { name: '添加2名客服', '人数': cur?.twoRepeatCount },
@@ -71,7 +93,7 @@ const Home: React.FC = () => {
                 ])
             } else {
                 setCorpUserRepeat({})
-                setOverflowData({ avgCorpRepeatUserRate: 0, repeatUserRate: 0, userCount: 0 })
+                setOverflowData({ avgCorpRepeatUserRate: 0, repeatUserRate: 0, userCount: 0, qcUuidCount: 0, qcUuidCountRate: 0, qcUuidNullCount: 0, qcUuidNullCountRate: 0, deletedUserCount: 0, deletedUserCountRate: 0, qcUuidUserCount: 0 })
                 setBarCorpUserData([])
             }
 
@@ -95,15 +117,40 @@ const Home: React.FC = () => {
                         <Statistic
                             title={<strong style={{ fontSize: 14 }}>集团总企微用户数</strong>}
                             value={overflowData.userCount}
+                            style={{ flex: 1 }}
                         />
                         <Avatar style={{ backgroundColor: '#DBEAFE', color: '#2563eb' }} size={40}><UserOutlined /></Avatar>
                     </Flex>
                 </Card>
+                <Card variant="borderless" style={{ width: '20%' }}>
+                    <Flex justify='space-between'>
+                        <Statistic
+                            title={<Space>
+                                <strong style={{ fontSize: 14 }}>集团跨主体去重企微用户数</strong>
+                                <Tooltip title="集团跨主体去重企微用户数=未识别人数+添加1个客服人数+添加多个(>1)客服人数">
+                                    <QuestionCircleOutlined />
+                                </Tooltip>
+                            </Space>}
+                            style={{ flex: 1 }}
+                            value={overflowData.qcUuidUserCount}
+                        />
+                        <Avatar style={{ backgroundColor: '#fff0f6', color: '#f759ab' }} size={40}><UserOutlined /></Avatar>
+                    </Flex>
+                </Card>
                 <Card variant="borderless" style={{ width: '20%' }}>
                     <Flex justify='space-between'>
                         <Statistic
                             title={<strong style={{ fontSize: 14 }}>已识别用户数</strong>}
-                            value={0}
+                            value={overflowData.qcUuidCount}
+                            style={{ flex: 1 }}
+                            suffix={<div style={{ display: 'flex' }}>
+                                (<Statistic
+                                    value={overflowData.qcUuidCountRate ? overflowData.qcUuidCountRate * 100 : 0}
+                                    precision={4}
+                                    suffix="%"
+                                    valueStyle={overflowData?.qcUuidCountRate < 0.8 ? { color: '#cf1322' } : { color: '#3f8600' }}
+                                />)
+                            </div>}
                         />
                         <Avatar style={{ backgroundColor: '#DCFCE7', color: '#16a34a' }} size={40}><CheckOutlined /></Avatar>
                     </Flex>
@@ -112,7 +159,16 @@ const Home: React.FC = () => {
                     <Flex justify='space-between'>
                         <Statistic
                             title={<strong style={{ fontSize: 14 }}>未识别用户数</strong>}
-                            value={0}
+                            value={overflowData?.qcUuidNullCount}
+                            style={{ flex: 1 }}
+                            suffix={<div style={{ display: 'flex' }}>
+                                (<Statistic
+                                    value={overflowData.qcUuidNullCountRate ? overflowData.qcUuidNullCountRate * 100 : 0}
+                                    precision={4}
+                                    suffix="%"
+                                    valueStyle={overflowData?.qcUuidNullCountRate > 0.05 ? { color: '#cf1322' } : { color: '#3f8600' }}
+                                />)
+                            </div>}
                         />
                         <Avatar style={{ backgroundColor: 'rgba(251, 192, 163, 1)', color: '#f50' }} size={40}><ExclamationOutlined /></Avatar>
                     </Flex>
@@ -121,7 +177,16 @@ const Home: React.FC = () => {
                     <Flex justify='space-between'>
                         <Statistic
                             title={<strong style={{ fontSize: 14 }}>双删用户数</strong>}
-                            value={0}
+                            value={overflowData?.deletedUserCount}
+                            style={{ flex: 1 }}
+                            suffix={<div style={{ display: 'flex' }}>
+                                (<Statistic
+                                    value={overflowData.deletedUserCountRate ? overflowData.deletedUserCountRate * 100 : 0}
+                                    precision={4}
+                                    suffix="%"
+                                    valueStyle={overflowData?.deletedUserCountRate > 0.4 ? { color: '#cf1322' } : { color: '#3f8600' }}
+                                />)
+                            </div>}
                         />
                         <Avatar style={{ backgroundColor: '#ffcece', color: '#ff0606' }} size={40}><DeleteOutlined /></Avatar>
                     </Flex>
@@ -135,6 +200,7 @@ const Home: React.FC = () => {
                                     <QuestionCircleOutlined />
                                 </Tooltip>
                             </Space>}
+                            style={{ flex: 1 }}
                             value={overflowData.repeatUserRate ? overflowData.repeatUserRate * 100 : 0}
                             precision={4}
                             suffix="%"
@@ -213,7 +279,7 @@ const Home: React.FC = () => {
                         children: <Card>
                             <Table
                                 columns={CorpExternalUserColumns()}
-                                scroll={{ y: 300, x: 900 }}
+                                scroll={{ y: 300, x: 1000 }}
                                 bordered
                                 dataSource={getCorpExternalUserRepeatList.data?.data?.records}
                                 loading={getCorpExternalUserRepeatList.loading}
@@ -222,9 +288,20 @@ const Home: React.FC = () => {
                                     total: getCorpExternalUserRepeatList.data?.data?.total,
                                     current: getCorpExternalUserRepeatList?.data?.data?.current || 1,
                                     pageSize: getCorpExternalUserRepeatList?.data?.data?.size || 20,
-                                    onChange: (page: number, pageSize: number) => {
-                                        setQueryParmasZt({ ...queryParmasZt, pageNum: page, pageSize })
+                                }}
+                                onChange={(pagination: any, _: any, sortData: any) => {
+                                    let { current, pageSize } = pagination
+                                    let newQueryForm = JSON.parse(JSON.stringify(queryParmasZt))
+                                    if (sortData && sortData?.order) {
+                                        newQueryForm['sortType'] = sortData?.order === 'ascend' ? 'ASC' : 'DESC'
+                                        newQueryForm['orderByField'] = sortData?.field
+                                    } else {
+                                        delete newQueryForm['sortType']
+                                        delete newQueryForm['orderByField']
                                     }
+                                    newQueryForm.pageNum = current || newQueryForm.pageNum
+                                    newQueryForm.pageSize = pageSize || newQueryForm.pageSize
+                                    setQueryParmasZt({ ...newQueryForm })
                                 }}
                             />
                         </Card>
@@ -250,28 +327,51 @@ const Home: React.FC = () => {
                                                 </Tooltip>
                                             </Space>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.userCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.userCount || 0} valueStyle={{ fontSize: 14 }} />
+                                            </div>
+                                        </div>
+                                        <div className={style.item}>
+                                            <Space>
+                                                <span>集团跨主体去重企微用户数</span>
+                                                <Tooltip title="集团跨主体去重企微用户数=未识别人数+添加1个客服人数+添加多个(>1)客服人数">
+                                                    <QuestionCircleOutlined />
+                                                </Tooltip>
+                                            </Space>
+                                            <div className={style.num}>
+                                                <Statistic value={corpRepeat?.qcUuidUserCount || 0} valueStyle={{ fontSize: 14 }} />
                                             </div>
                                         </div>
                                         <div className={style.item}>
-                                            <span>未识别人数</span>
+                                            <span>未识别用户数</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.wsbrsCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.qcUuidNullCount || 0} valueStyle={{ fontSize: 14 }} />
+                                                (<Statistic
+                                                    value={corpRepeat?.qcUuidNullCountRate ? corpRepeat?.qcUuidNullCountRate * 100 : 0}
+                                                    valueStyle={corpRepeat?.qcUuidNullCountRate > 0.1 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                                                    suffix="%"
+                                                    precision={4}
+                                                />)
                                             </div>
                                         </div>
                                         <div className={style.item}>
                                             <span>{`用户添加>1主体人数`}</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.addDy1ZtCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.gtOneRepeatCountTotal || 0} valueStyle={{ fontSize: 14 }} />
+                                                (<Statistic
+                                                    value={corpRepeat?.gtOneRepeatCountTotalRate ? corpRepeat?.gtOneRepeatCountTotalRate * 100 : 0}
+                                                    valueStyle={corpRepeat?.gtOneRepeatCountTotalRate > 0.2 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                                                    suffix="%"
+                                                    precision={4}
+                                                />)
                                             </div>
                                         </div>
                                         <div className={style.item}>
                                             <span>仅添加1个主体人数</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.oneRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.oneRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                                                 (<Statistic
                                                     value={corpRepeat?.oneRepeatCountRate ? corpRepeat?.oneRepeatCountRate * 100 : 0}
-                                                    valueStyle={corpRepeat?.oneRepeatCountRate > 0.5 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                                                    valueStyle={corpRepeat?.oneRepeatCountRate > 0.5 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                                                     suffix="%"
                                                     precision={4}
                                                 />)
@@ -280,10 +380,10 @@ const Home: React.FC = () => {
                                         <div className={style.item}>
                                             <span>添加2个主体人数</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.twoRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.twoRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                                                 (<Statistic
                                                     value={corpRepeat?.twoRepeatCountRate ? corpRepeat?.twoRepeatCountRate * 100 : 0}
-                                                    valueStyle={corpRepeat?.twoRepeatCountRate > 0.1 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                                                    valueStyle={corpRepeat?.twoRepeatCountRate > 0.1 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                                                     suffix="%"
                                                     precision={4}
                                                 />)
@@ -292,10 +392,10 @@ const Home: React.FC = () => {
                                         <div className={style.item}>
                                             <span>添加3个主体人数</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.threeRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.threeRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                                                 (<Statistic
                                                     value={corpRepeat?.threeRepeatCountRate ? corpRepeat?.threeRepeatCountRate * 100 : 0}
-                                                    valueStyle={corpRepeat?.threeRepeatCountRate > 0.09 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                                                    valueStyle={corpRepeat?.threeRepeatCountRate > 0.09 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                                                     suffix="%"
                                                     precision={4}
                                                 />)
@@ -304,10 +404,10 @@ const Home: React.FC = () => {
                                         <div className={style.item}>
                                             <span>添加4个主体人数</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.fourRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.fourRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                                                 (<Statistic
                                                     value={corpRepeat?.fourRepeatCountRate ? corpRepeat?.fourRepeatCountRate * 100 : 0}
-                                                    valueStyle={corpRepeat?.fourRepeatCountRate > 0.08 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                                                    valueStyle={corpRepeat?.fourRepeatCountRate > 0.08 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                                                     suffix="%"
                                                     precision={4}
                                                 />)
@@ -316,10 +416,10 @@ const Home: React.FC = () => {
                                         <div className={style.item}>
                                             <span>添加5个主体人数</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.fiveRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.fiveRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                                                 (<Statistic
                                                     value={corpRepeat?.fiveRepeatCountRate ? corpRepeat?.fiveRepeatCountRate * 100 : 0}
-                                                    valueStyle={corpRepeat?.fiveRepeatCountRate > 0.07 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                                                    valueStyle={corpRepeat?.fiveRepeatCountRate > 0.07 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                                                     suffix="%"
                                                     precision={4}
                                                 />)
@@ -328,10 +428,10 @@ const Home: React.FC = () => {
                                         <div className={style.item}>
                                             <span>添加5个主体以上人数</span>
                                             <div className={style.num}>
-                                                <Statistic value={corpRepeat?.gtFiveRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                                                <Statistic value={corpRepeat?.gtFiveRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                                                 (<Statistic
                                                     value={corpRepeat?.gtFiveRepeatCountRate ? corpRepeat?.gtFiveRepeatCountRate * 100 : 0}
-                                                    valueStyle={corpRepeat?.gtFiveRepeatCountRate > 0.06 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                                                    valueStyle={corpRepeat?.gtFiveRepeatCountRate > 0.06 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                                                     suffix="%"
                                                     precision={4}
                                                 />)
@@ -373,51 +473,104 @@ const DetailsTemplate: React.FC<{ data: { [x: string]: any }, title: string }> =
             <div className={style.item}>
                 <Space>
                     <span>粉丝总数</span>
-                    <Tooltip title="未识别+添加2名+添加多名(>1)">
+                    <Tooltip title="未识别+添加1名+添加多名(>1)">
                         <QuestionCircleOutlined />
                     </Tooltip>
                 </Space>
                 <div className={style.num}>
-                    <Statistic value={data?.userCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.userCount || 0} valueStyle={{ fontSize: 14 }} />
+                </div>
+            </div>
+            <div className={style.item}>
+                <Space>
+                    <span>集团跨主体去重企微用户数</span>
+                    <Tooltip title="集团跨主体去重企微用户数=未识别人数+添加1个客服人数+添加多个(>1)客服人数">
+                        <QuestionCircleOutlined />
+                    </Tooltip>
+                </Space>
+                <div className={style.num}>
+                    <Statistic value={data?.qcUuidUserCount || 0} valueStyle={{ fontSize: 14 }} />
                 </div>
             </div>
             <div className={style.item}>
                 <span>未识别用户数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.wsbkfCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.qcUuidNullCount || 0} valueStyle={{ fontSize: 14 }} />
+                    (<Statistic
+                        value={data?.qcUuidNullCountRate ? data?.qcUuidNullCountRate * 100 : 0}
+                        valueStyle={data?.qcUuidNullCountRate > 0.1 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                        suffix="%"
+                        precision={4}
+                    />)
                 </div>
             </div>
             <div className={style.item}>
                 <span>已激活集团客服号数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.yjhkf || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.activatedCorpUserCount || 0} valueStyle={{ fontSize: 14 }} />
+                    (<Statistic
+                        value={data?.activatedCorpUserCountRate ? data?.activatedCorpUserCountRate * 100 : 0}
+                        valueStyle={data?.activatedCorpUserCountRate < 0.6 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                        suffix="%"
+                        precision={4}
+                    />)
+                </div>
+            </div>
+            <div className={style.item}>
+                <span>已禁用集团客服号数</span>
+                <div className={style.num}>
+                    <Statistic value={data?.disabledCorpUserCount || 0} valueStyle={{ fontSize: 14 }} />
+                    (<Statistic
+                        value={data?.disabledCorpUserCountRate ? data?.disabledCorpUserCountRate * 100 : 0}
+                        valueStyle={data?.disabledCorpUserCountRate > 0.1 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                        suffix="%"
+                        precision={4}
+                    />)
                 </div>
             </div>
             <div className={style.item}>
                 <span>退出集团客服号数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.tckf || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.quitCorpUserCount || 0} valueStyle={{ fontSize: 14 }} />
+                    (<Statistic
+                        value={data?.quitCorpUserCountRate ? data?.quitCorpUserCountRate * 100 : 0}
+                        valueStyle={data?.quitCorpUserCountRate > 0.1 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                        suffix="%"
+                        precision={4}
+                    />)
                 </div>
             </div>
             <div className={style.item}>
                 <span>未激活集团客服号数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.wjhkf || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.unactivatedCorpUserCount || 0} valueStyle={{ fontSize: 14 }} />
+                    (<Statistic
+                        value={data?.unactivatedCorpUserCountRate ? data?.unactivatedCorpUserCountRate * 100 : 0}
+                        valueStyle={data?.unactivatedCorpUserCountRate > 0.1 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                        suffix="%"
+                        precision={4}
+                    />)
                 </div>
             </div>
             <div className={style.item}>
                 <span>{`用户添加>1客服号人数`}</span>
                 <div className={style.num}>
-                    <Statistic value={data?.addDy1kf || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.gtOneRepeatCountTotal || 0} valueStyle={{ fontSize: 14 }} />
+                    (<Statistic
+                        value={data?.gtOneRepeatCountTotalRate ? data?.gtOneRepeatCountTotalRate * 100 : 0}
+                        valueStyle={data?.gtOneRepeatCountTotalRate > 0.3 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
+                        suffix="%"
+                        precision={4}
+                    />)
                 </div>
             </div>
             <div className={style.item}>
                 <span>仅添加1名客服人数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.oneRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.oneRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                     (<Statistic
                         value={data?.oneRepeatCountRate ? data?.oneRepeatCountRate * 100 : 0}
-                        valueStyle={data?.oneRepeatCountRate > 0.5 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                        valueStyle={data?.oneRepeatCountRate > 0.5 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                         suffix="%"
                         precision={4}
                     />)
@@ -426,10 +579,10 @@ const DetailsTemplate: React.FC<{ data: { [x: string]: any }, title: string }> =
             <div className={style.item}>
                 <span>添加2名客服人数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.twoRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.twoRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                     (<Statistic
                         value={data?.twoRepeatCountRate ? data?.twoRepeatCountRate * 100 : 0}
-                        valueStyle={data?.twoRepeatCountRate > 0.1 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                        valueStyle={data?.twoRepeatCountRate > 0.1 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                         suffix="%"
                         precision={4}
                     />)
@@ -438,10 +591,10 @@ const DetailsTemplate: React.FC<{ data: { [x: string]: any }, title: string }> =
             <div className={style.item}>
                 <span>添加3名客服人数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.threeRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.threeRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                     (<Statistic
                         value={data?.threeRepeatCountRate ? data?.threeRepeatCountRate * 100 : 0}
-                        valueStyle={data?.threeRepeatCountRate > 0.09 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                        valueStyle={data?.threeRepeatCountRate > 0.09 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                         suffix="%"
                         precision={4}
                     />)
@@ -450,10 +603,10 @@ const DetailsTemplate: React.FC<{ data: { [x: string]: any }, title: string }> =
             <div className={style.item}>
                 <span>添加4名客服人数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.fourRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.fourRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                     (<Statistic
                         value={data?.fourRepeatCountRate ? data?.fourRepeatCountRate * 100 : 0}
-                        valueStyle={data?.fourRepeatCountRate > 0.08 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                        valueStyle={data?.fourRepeatCountRate > 0.08 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                         suffix="%"
                         precision={4}
                     />)
@@ -462,10 +615,10 @@ const DetailsTemplate: React.FC<{ data: { [x: string]: any }, title: string }> =
             <div className={style.item}>
                 <span>添加5名客服人数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.fiveRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.fiveRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                     (<Statistic
                         value={data?.fiveRepeatCountRate ? data?.fiveRepeatCountRate * 100 : 0}
-                        valueStyle={data?.fiveRepeatCountRate > 0.07 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                        valueStyle={data?.fiveRepeatCountRate > 0.07 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                         suffix="%"
                         precision={4}
                     />)
@@ -474,10 +627,10 @@ const DetailsTemplate: React.FC<{ data: { [x: string]: any }, title: string }> =
             <div className={style.item}>
                 <span>添加5名客服以上人数</span>
                 <div className={style.num}>
-                    <Statistic value={data?.gtFiveRepeatCount || 0} valueStyle={{ fontSize: 16 }} />
+                    <Statistic value={data?.gtFiveRepeatCount || 0} valueStyle={{ fontSize: 14 }} />
                     (<Statistic
                         value={data?.gtFiveRepeatCountRate ? data?.gtFiveRepeatCountRate * 100 : 0}
-                        valueStyle={data?.gtFiveRepeatCountRate > 0.06 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }}
+                        valueStyle={data?.gtFiveRepeatCountRate > 0.06 ? { color: '#cf1322', fontSize: 14 } : { color: '#3f8600', fontSize: 14 }}
                         suffix="%"
                         precision={4}
                     />)

+ 45 - 4
src/pages/weComTask/page/home/tableConfig.tsx

@@ -24,15 +24,30 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'userCount',
             key: 'userCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
         {
             title: '未识别人数',
-            dataIndex: 'wsbrsCount',
-            key: 'wsbrsCount',
+            dataIndex: 'qcUuidNullCount',
+            key: 'qcUuidNullCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
+        {
+            title: '未识别用户数占比',
+            dataIndex: 'qcUuidNullCountRate',
+            key: 'qcUuidNullCountRate',
+            align: 'center',
+            sorter: true,
+            render: (text: any) => <Statistic
+                value={text ? text * 100 : 0}
+                valueStyle={text > 0.1 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}
+                suffix="%"
+                precision={4}
+            />
+        },
         {
             title: <Space>
                 <span>重复总人数</span>
@@ -40,16 +55,31 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
                     <QuestionCircleOutlined />
                 </Tooltip>
             </Space>,
-            dataIndex: 'cfCount',
-            key: 'cfCount',
+            sorter: true,
+            dataIndex: 'gtOneRepeatCountTotal',
+            key: 'gtOneRepeatCountTotal',
             align: 'center',
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
+        {
+            title: '重复总人数占比',
+            dataIndex: 'gtOneRepeatCountTotalRate',
+            key: 'gtOneRepeatCountTotalRate',
+            align: 'center',
+            sorter: true,
+            render: (text: any) => <Statistic
+                value={text ? text * 100 : 0}
+                valueStyle={text > 0.2 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}
+                suffix="%"
+                precision={4}
+            />
+        },
         {
             title: '非重人数',
             dataIndex: 'oneRepeatCount',
             key: 'oneRepeatCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
         {
@@ -57,6 +87,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'oneRepeatCountRate',
             key: 'oneRepeatCountRate',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic
                 value={text ? text * 100 : 0}
                 valueStyle={text > 0.5 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}
@@ -69,6 +100,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'twoRepeatCount',
             key: 'twoRepeatCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
         {
@@ -76,6 +108,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'twoRepeatCountRate',
             key: 'twoRepeatCountRate',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic
                 value={text ? text * 100 : 0}
                 valueStyle={text > 0.1 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}
@@ -88,6 +121,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'threeRepeatCount',
             key: 'threeRepeatCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
         {
@@ -95,6 +129,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'threeRepeatCountRate',
             key: 'threeRepeatCountRate',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic
                 value={text ? text * 100 : 0}
                 valueStyle={text > 0.09 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}
@@ -107,6 +142,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'fourRepeatCount',
             key: 'fourRepeatCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
         {
@@ -114,6 +150,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'fourRepeatCountRate',
             key: 'fourRepeatCountRate',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic
                 value={text ? text * 100 : 0}
                 valueStyle={text > 0.08 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}
@@ -126,6 +163,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'fiveRepeatCount',
             key: 'fiveRepeatCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
         {
@@ -133,6 +171,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'fiveRepeatCountRate',
             key: 'fiveRepeatCountRate',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic
                 value={text ? text * 100 : 0}
                 valueStyle={text > 0.07 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}
@@ -145,6 +184,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'gtFiveRepeatCount',
             key: 'gtFiveRepeatCount',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic value={text || 0} valueStyle={{ fontSize: 12 }} />
         },
         {
@@ -152,6 +192,7 @@ export const CorpExternalUserColumns = (): ColumnsType<AnyObject> => {
             dataIndex: 'gtFiveRepeatCountRate',
             key: 'gtFiveRepeatCountRate',
             align: 'center',
+            sorter: true,
             render: (text: any) => <Statistic
                 value={text ? text * 100 : 0}
                 valueStyle={text > 0.06 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }}