Merge pull request #1 from hainatravel/master

已回复数据统计
dev/RoosterEditor
hainatravel 5 months ago committed by GitHub
commit b7fb0264f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -158,7 +158,7 @@ const useAuthStore = create(devtools((set, get) => ({
loadUserSession: () => { loadUserSession: () => {
let sessionData = window.sessionStorage.getItem('GLOBAL_SALES_LOGIN_USER') 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)) { // 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"}]}` // 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"}]}`

@ -4,7 +4,7 @@ import { LoadingOutlined, ApiOutlined } from '@ant-design/icons';
import { EditIcon, ReplyIcon, ResendIcon, ShareForwardIcon } from '@/components/Icons' import { EditIcon, ReplyIcon, ResendIcon, ShareForwardIcon } from '@/components/Icons'
import { isEmpty, TagColorStyle } from '@/utils/commons' import { isEmpty, TagColorStyle } from '@/utils/commons'
import EmailEditorPopup from '../Input/EmailEditorPopup' import EmailEditorPopup from '../Input/EmailEditorPopup'
import DnDModal from '@/components/DndModal' import DnDModal from '@/components/DnDModal'
import useStyleStore from '@/stores/StyleStore' import useStyleStore from '@/stores/StyleStore'
import { useEmailDetail, } from '@/hooks/useEmail'; import { useEmailDetail, } from '@/hooks/useEmail';
import { EMAIL_ATTA_HOST } from '@/config'; import { EMAIL_ATTA_HOST } from '@/config';

@ -4,7 +4,7 @@ import { LoadingOutlined, ApiOutlined, LeftOutlined, RightOutlined } from '@ant-
import { EditIcon, ReplyIcon, ResendIcon, ShareForwardIcon } from '@/components/Icons' import { EditIcon, ReplyIcon, ResendIcon, ShareForwardIcon } from '@/components/Icons'
import { isEmpty, TagColorStyle } from '@/utils/commons' import { isEmpty, TagColorStyle } from '@/utils/commons'
import EmailEditorPopup from '../Input/EmailEditorPopup' import EmailEditorPopup from '../Input/EmailEditorPopup'
import DnDModal from '@/components/DndModal' import DnDModal from '@/components/DnDModal'
import useStyleStore from '@/stores/StyleStore' import useStyleStore from '@/stores/StyleStore'
import { useEmailDetail, } from '@/hooks/useEmail'; import { useEmailDetail, } from '@/hooks/useEmail';
import { EMAIL_ATTA_HOST } from '@/config'; import { EMAIL_ATTA_HOST } from '@/config';

@ -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 { App, ConfigProvider, Button, Form, Input, Flex, Checkbox, Popconfirm, Select, Space, Upload, Divider, Modal } from 'antd';
import { UploadOutlined, LoadingOutlined } from '@ant-design/icons'; import { UploadOutlined, LoadingOutlined } from '@ant-design/icons';
import '@dckj/react-better-modal/dist/index.css'; import '@dckj/react-better-modal/dist/index.css';
import DnDModal from '@/components/DndModal'; import DnDModal from '@/components/DnDModal';
import useStyleStore from '@/stores/StyleStore'; import useStyleStore from '@/stores/StyleStore';
import useConversationStore from '@/stores/ConversationStore'; import useConversationStore from '@/stores/ConversationStore';
import useAuthStore from '@/stores/AuthStore'; import useAuthStore from '@/stores/AuthStore';

@ -1,7 +1,8 @@
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { Form, Input, Button, DatePicker, Select, Table } from 'antd' import { Form, Input, Button, DatePicker, Select, Table } from 'antd'
import dayjs from 'dayjs' 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' import useCustomerRelationStore from '@/stores/CustomerRelationStore'
const { RangePicker } = DatePicker const { RangePicker } = DatePicker
@ -40,22 +41,28 @@ const Index = () => {
// crt_template msg_status // crt_template msg_status
const templateStatusCount = {} const templateStatusCount = {}
tasksList.forEach((item) => { 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 (msg_status !== null && msg_status !== undefined) {
if (!templateStatusCount[crt_template]) { if (!templateStatusCount[crt_template]) {
templateStatusCount[crt_template] = {} templateStatusCount[crt_template] = {}
templateStatusCount[crt_template]['msgreply'] = 0
} }
if (!templateStatusCount[crt_template][msg_status]) { if (!templateStatusCount[crt_template][msg_status]) {
templateStatusCount[crt_template][msg_status] = 0 templateStatusCount[crt_template][msg_status] = 0
} }
templateStatusCount[crt_template][msg_status]++ templateStatusCount[crt_template][msg_status]++
if (msg_reply) {
templateStatusCount[crt_template]['msgreply']++
}
} }
}) })
// //
const groupedResult = {} const groupedResult = {}
for (const template in templateStatusCount) { for (const template in templateStatusCount) {
const total = Object.values(templateStatusCount[template]).reduce((acc, val) => acc + val, 0) //msgreplymsgreply
const total = Object.values(templateStatusCount[template]).reduce((acc, val) => acc + val, 0) - templateStatusCount[template]['msgreply']
groupedResult[template] = {} groupedResult[template] = {}
for (const status in templateStatusCount[template]) { for (const status in templateStatusCount[template]) {
const count = templateStatusCount[template][status] const count = templateStatusCount[template][status]
@ -63,6 +70,7 @@ const Index = () => {
groupedResult[template][`${status}_count`] = count groupedResult[template][`${status}_count`] = count
groupedResult[template][`${status}_percentage`] = `${percentage}%` groupedResult[template][`${status}_percentage`] = `${percentage}%`
} }
console.log(groupedResult)
} }
// groupedResult // groupedResult
@ -82,14 +90,17 @@ const Index = () => {
key: 'crt_template', key: 'crt_template',
}) })
const allStatuses = new Set() const allStatuses = new Set(['msgreply'])
tasksList.forEach((item) => { tasksList.forEach((item) => {
if (item.msg_status !== null && item.msg_status !== undefined) { if (item.msg_status !== null && item.msg_status !== undefined) {
allStatuses.add(item.msg_status) allStatuses.add(item.msg_status)
} }
}) })
allStatuses.forEach((status) => { // Set
const sortedStatuses = Array.from(allStatuses).sort()
sortedStatuses.forEach((status) => {
groupedColumns.push({ groupedColumns.push({
title: `${status} 计数`, title: `${status} 计数`,
dataIndex: `${status}_count`, dataIndex: `${status}_count`,
@ -160,7 +171,7 @@ const Index = () => {
const icon = statusIconMap[record.msg_status] || statusIconMap['default'] const icon = statusIconMap[record.msg_status] || statusIconMap['default']
return ( return (
<Link to={`/order/chat/${record.crt_coli_sn}`} title={record.errors_code ? record.errors_code + '' + record.errors_title : ''}> <Link to={`/order/chat/${record.crt_coli_sn}`} title={record.errors_code ? record.errors_code + '' + record.errors_title : ''}>
查看会话 {icon} 查看会话 {icon} {record.msg_reply ? <MessageTwoTone title='已回复' /> : ''}
</Link> </Link>
) )
} }

Loading…
Cancel
Save