diff --git a/src/components/DndModal.jsx b/src/components/DnDModal.jsx similarity index 100% rename from src/components/DndModal.jsx rename to src/components/DnDModal.jsx diff --git a/src/components/LexicalEditor/Index.jsx b/src/components/LexicalEditor/index.jsx similarity index 100% rename from src/components/LexicalEditor/Index.jsx rename to src/components/LexicalEditor/index.jsx diff --git a/src/stores/AuthStore.js b/src/stores/AuthStore.js index 62b35a7..9870ed2 100644 --- a/src/stores/AuthStore.js +++ b/src/stores/AuthStore.js @@ -158,7 +158,7 @@ const useAuthStore = create(devtools((set, get) => ({ loadUserSession: () => { let sessionData = window.sessionStorage.getItem('GLOBAL_SALES_LOGIN_USER') - // let sessionData ='{"userId":"155","userIdStr":"155","emailList":[],"whatsAppBusiness":"+8617607730395","whatsAppNo":null,"username":"尹诚诚","avatarUrl":"https://static-legacy.dingtalk.com/media/lADPBE1XYG_HAcDNAgDNAgA_512_512.jpg","mobile":"+86-18507832160","email":"ycc@hainatravel.com","openId":"K8BNXMf8ESSr1DzLVUrX7wiEiE","accountList":[{"OPI_SN":155,"OPI_Code":"YCC","OPI_NameCN":"尹诚诚","OPI_DEI_SN":1,"OPI_NameEN":"Yin Chengcheng"}]}' + if (import.meta.env.DEV) sessionData ='{"userId":"155","userIdStr":"155","emailList":[],"whatsAppBusiness":"+8617607730395","whatsAppNo":null,"username":"尹诚诚","avatarUrl":"https://static-legacy.dingtalk.com/media/lADPBE1XYG_HAcDNAgDNAgA_512_512.jpg","mobile":"+86-18507832160","email":"ycc@hainatravel.com","openId":"K8BNXMf8ESSr1DzLVUrX7wiEiE","accountList":[{"OPI_SN":155,"OPI_Code":"YCC","OPI_NameCN":"尹诚诚","OPI_DEI_SN":1,"OPI_NameEN":"Yin Chengcheng"}]}' // if (window.location.hostname === '202.103.68.93' && window.location.port === '4173' && isEmpty(sessionData)) { // sessionData = `{"userId":"383","userIdStr":"383,609","emailList":[{"opi_sn":383,"mat_sn":760,"email":"lyj@asiahighlights.com","default":false,"backup":false},{"opi_sn":383,"mat_sn":759,"email":"lyj@chinahighlights.com","default":true,"backup":false},{"opi_sn":383,"mat_sn":758,"email":"lyj@hainatravel.com","default":false,"backup":false}],"username":"廖一军","avatarUrl":"https://static-legacy.dingtalk.com/media/lALPBDDrhXr716HNAoDNAoA_640_640.png","mobile":"+86-18777396951","email":"lyj@hainatravel.com","whatsAppBusiness":"8617458471254","openId":"iioljiPmZ4RPoOYpkFiSn7IKAiEiE","accountList":[{"OPI_SN":383,"OPI_Code":"LYJ","OPI_NameCN":"廖一军","OPI_DEI_SN":7,"OPI_NameEN":"Jimmy Liow"},{"OPI_SN":609,"OPI_Code":"LYJAH","OPI_NameCN":"廖一军(ah)","OPI_DEI_SN":28,"OPI_NameEN":"Jimmy Liow"}]}` diff --git a/src/views/Conversations/Online/Components/EmailDetail.jsx b/src/views/Conversations/Online/Components/EmailDetail.jsx index 849b490..1203c47 100644 --- a/src/views/Conversations/Online/Components/EmailDetail.jsx +++ b/src/views/Conversations/Online/Components/EmailDetail.jsx @@ -4,7 +4,7 @@ import { LoadingOutlined, ApiOutlined } from '@ant-design/icons'; import { EditIcon, ReplyIcon, ResendIcon, ShareForwardIcon } from '@/components/Icons' import { isEmpty, TagColorStyle } from '@/utils/commons' import EmailEditorPopup from '../Input/EmailEditorPopup' -import DnDModal from '@/components/DndModal' +import DnDModal from '@/components/DnDModal' import useStyleStore from '@/stores/StyleStore' import { useEmailDetail, } from '@/hooks/useEmail'; import { EMAIL_ATTA_HOST } from '@/config'; diff --git a/src/views/Conversations/Online/Components/EmailDetailInline.jsx b/src/views/Conversations/Online/Components/EmailDetailInline.jsx index 5262600..223964c 100644 --- a/src/views/Conversations/Online/Components/EmailDetailInline.jsx +++ b/src/views/Conversations/Online/Components/EmailDetailInline.jsx @@ -4,7 +4,7 @@ import { LoadingOutlined, ApiOutlined, LeftOutlined, RightOutlined } from '@ant- import { EditIcon, ReplyIcon, ResendIcon, ShareForwardIcon } from '@/components/Icons' import { isEmpty, TagColorStyle } from '@/utils/commons' import EmailEditorPopup from '../Input/EmailEditorPopup' -import DnDModal from '@/components/DndModal' +import DnDModal from '@/components/DnDModal' import useStyleStore from '@/stores/StyleStore' import { useEmailDetail, } from '@/hooks/useEmail'; import { EMAIL_ATTA_HOST } from '@/config'; diff --git a/src/views/Conversations/Online/Input/EmailEditorPopup.jsx b/src/views/Conversations/Online/Input/EmailEditorPopup.jsx index 2c7b171..9af4298 100644 --- a/src/views/Conversations/Online/Input/EmailEditorPopup.jsx +++ b/src/views/Conversations/Online/Input/EmailEditorPopup.jsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import { App, ConfigProvider, Button, Form, Input, Flex, Checkbox, Popconfirm, Select, Space, Upload, Divider, Modal } from 'antd'; import { UploadOutlined, LoadingOutlined } from '@ant-design/icons'; import '@dckj/react-better-modal/dist/index.css'; -import DnDModal from '@/components/DndModal'; +import DnDModal from '@/components/DnDModal'; import useStyleStore from '@/stores/StyleStore'; import useConversationStore from '@/stores/ConversationStore'; import useAuthStore from '@/stores/AuthStore'; diff --git a/src/views/customer_relation/index.jsx b/src/views/customer_relation/index.jsx index ac7e97e..a802f0e 100644 --- a/src/views/customer_relation/index.jsx +++ b/src/views/customer_relation/index.jsx @@ -1,7 +1,8 @@ import { Link } from 'react-router-dom' import { Form, Input, Button, DatePicker, Select, Table } from 'antd' import dayjs from 'dayjs' -import { ReadIcon, DeliverIcon, SentIcon, WaitingIcon, FailedIcon } from '@/components/Icons' +import { ReadIcon, DeliverIcon, SentIcon, WaitingIcon, FailedIcon, ReplyIcon } from '@/components/Icons' +import { MessageTwoTone } from '@ant-design/icons' import useCustomerRelationStore from '@/stores/CustomerRelationStore' const { RangePicker } = DatePicker @@ -40,22 +41,28 @@ const Index = () => { // 按 crt_template 分组并统计每个非空 msg_status 的数量 const templateStatusCount = {} tasksList.forEach((item) => { - const { crt_template, msg_status } = item + const { crt_template, msg_status, msg_reply } = item if (msg_status !== null && msg_status !== undefined) { if (!templateStatusCount[crt_template]) { templateStatusCount[crt_template] = {} + templateStatusCount[crt_template]['msgreply'] = 0 } if (!templateStatusCount[crt_template][msg_status]) { templateStatusCount[crt_template][msg_status] = 0 } templateStatusCount[crt_template][msg_status]++ + + if (msg_reply) { + templateStatusCount[crt_template]['msgreply']++ + } } }) // 计算分组后的百分比并添加计数 const groupedResult = {} for (const template in templateStatusCount) { - const total = Object.values(templateStatusCount[template]).reduce((acc, val) => acc + val, 0) + //总数需要减去msgreply的数量,msgreply是状态之外的数据 + const total = Object.values(templateStatusCount[template]).reduce((acc, val) => acc + val, 0) - templateStatusCount[template]['msgreply'] groupedResult[template] = {} for (const status in templateStatusCount[template]) { const count = templateStatusCount[template][status] @@ -63,6 +70,7 @@ const Index = () => { groupedResult[template][`${status}_count`] = count groupedResult[template][`${status}_percentage`] = `${percentage}%` } + console.log(groupedResult) } // 将 groupedResult 转换为表格可用的数据格式 @@ -82,14 +90,17 @@ const Index = () => { key: 'crt_template', }) - const allStatuses = new Set() + const allStatuses = new Set(['msgreply']) tasksList.forEach((item) => { if (item.msg_status !== null && item.msg_status !== undefined) { allStatuses.add(item.msg_status) } }) - allStatuses.forEach((status) => { + // 将 Set 转换为数组并排序 + const sortedStatuses = Array.from(allStatuses).sort() + + sortedStatuses.forEach((status) => { groupedColumns.push({ title: `${status} 计数`, dataIndex: `${status}_count`, @@ -160,7 +171,7 @@ const Index = () => { const icon = statusIconMap[record.msg_status] || statusIconMap['default'] return ( - 查看会话 {icon} + 查看会话 {icon} {record.msg_reply ? : ''} ) }