Merge remote-tracking branch 'origin/客户运营'

dev/voice
Lei OT 6 months ago
commit fbccb2ebe3

@ -21,6 +21,7 @@ export const EMAIL_HOST = 'https://p9axztuwd7x8a7.mycht.cn/mail-server/service-m
export const API_HOST = 'https://p9axztuwd7x8a7.mycht.cn/whatsapp_server/v2';
export const WS_URL = 'wss://p9axztuwd7x8a7.mycht.cn/whatsapp_server'; // prod:
export const VONAGE_URL = 'https://p9axztuwd7x8a7.mycht.cn/vonage-server'; // 语音和视频接口:
export const HT3 = process.env.NODE_ENV === 'production' ? 'https://p9axztuwd7x8a7.mycht.cn/ht3' : 'http://127.0.0.1:8000';
export const DATE_FORMAT = 'YYYY-MM-DD';
export const DATETIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';

@ -30,6 +30,8 @@ import DingdingAuthCode from '@/views/dingding/AuthCode'
import useAuthStore from '@/stores/AuthStore'
import '@/assets/index.css'
import CustomerRelation from '@/views/customer_relation/index'
useAuthStore.getState().loadUserSession()
const isMobileApp =
@ -81,6 +83,7 @@ const router = createBrowserRouter([
{ path: 'chat/unassign', element: <Unassign /> },
{ path: 'callcenter/call', element: <CallCenter /> },
{ path: 'callcenter/call/:phonenumber', element: <CallCenter /> },
{ path: 'customer_relation/index', element: <CustomerRelation /> },
],
},
],

@ -157,7 +157,8 @@ const useAuthStore = create(devtools((set, get) => ({
},
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 (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"}]}`

@ -0,0 +1,41 @@
import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
import { fetchJSON, postForm } from '@/utils/request'
import { HT3, EMAIL_HOST } from '@/config'
import { isNotEmpty, prepareUrl } from '@/utils/commons'
export const useCustomerRelationStore = create((set, get) => ({
loading: false,
setLoading: (loading) => set({ loading }),
tasksList: [],
fetchSearchTasks: async (data) => {
set({ loading: true })
const formData = new FormData()
for (const key in data) {
formData.append(key, data[key])
}
fetch(`${HT3}/customerrelation/search_tasks`, {
method: 'POST',
body: formData,
})
.then((res) => {
if (!res.ok) {
throw new Error(`HTTP error! status: ${res.status}`)
}
return res.json()
})
.then((data) => {
set({ tasksList: data })
})
.catch((error) => {
console.error('Fetch error:', error)
})
.finally(() => {
set({ loading: false })
})
},
}))
export default useCustomerRelationStore

@ -57,6 +57,7 @@ const SearchForm = memo(function ({ initialValues, onSubmit, onReset }) {
</Form.Item>
<Form.Item label='日期' name='msgDateRange'>
<RangePicker format={'YYYY-MM-DD'} />
</Form.Item>
</Flex>
<div style={{ flex: '0 1 64px' }} className='flex justify-between'>

@ -177,6 +177,10 @@ function DesktopApp() {
key: '/chat/history',
label: <Link to='/chat/history'>聊天记录</Link>,
},
{
key: '/customer_relation/index',
label: <Link to='/customer_relation/index'>客户运营</Link>,
},
]}
/>
</Col>

@ -0,0 +1,119 @@
import React, { useState } from 'react'
import { Form, Input, Button, DatePicker, Select, Table } from 'antd'
import dayjs from 'dayjs'
import useCustomerRelationStore from '@/stores/CustomerRelationStore'
const { RangePicker } = DatePicker
const { Option } = Select
const Index = () => {
const { loading, tasksList, fetchSearchTasks } = useCustomerRelationStore()
//
const initialFormValues = {
crt_coli_id: '', //
dateRange: [dayjs().startOf('M'), dayjs().endOf('M')], //
crt_status: '', //
}
//
const onFinish = (values) => {
const formattedValues = {
...values,
start_date: values.dateRange ? values.dateRange[0].format('YYYY-MM-DD') : '',
end_date: values.dateRange ? values.dateRange[1].endOf('day').format('YYYY-MM-DD HH:mm:ss') : '',
}
fetchSearchTasks(formattedValues)
}
const DATE_RANGE_PRESETS = [
{
label: '本周',
value: [dayjs().startOf('w'), dayjs().endOf('w')],
},
{
label: '上周',
value: [dayjs().startOf('w').subtract(7, 'days'), dayjs().endOf('w').subtract(7, 'days')],
},
{
label: '本月',
value: [dayjs().startOf('M'), dayjs().endOf('M')],
},
{
label: '上月',
value: [dayjs().subtract(1, 'M').startOf('M'), dayjs().subtract(1, 'M').endOf('M')],
},
{
label: '前三月',
value: [dayjs().subtract(2, 'M').startOf('M'), dayjs().endOf('M')],
},
{
label: '本年',
value: [dayjs().startOf('y'), dayjs().endOf('y')],
},
]
//
const columns = [
{ title: '团号', dataIndex: 'crt_coli_id', key: 'crt_coli_id' },
{ title: '客人', dataIndex: 'crt_mei_firstname', key: 'crt_mei_firstname', render: (text, record) => record.crt_mei_firstname + ' ' + record.crt_mei_lastname },
{ title: '国家', dataIndex: 'crt_coi2_country', key: 'crt_coi2_country' },
// { title: '', dataIndex: 'ct_coi_code', key: 'ct_coi_code' },
{
title: '状态',
dataIndex: 'crt_status',
key: 'crt_status',
render: (status) => {
if (status == '0') {
return '待发送'
} else if (status == '99') {
return '已发送'
}
return '失败'
},
},
{ title: '发送时间', dataIndex: 'crt_send_datetime', key: 'crt_send_datetime' },
{ title: '模板', dataIndex: 'crt_template', key: 'crt_template' },
{ title: 'WhatsApp', dataIndex: 'crt_whatsapp', key: 'crt_whatsapp' },
{ title: '会话ID', dataIndex: 'crt_conversation_id', key: 'crt_conversation_id' },
{ title: '消息ID', dataIndex: 'crt_message_id', key: 'crt_message_id' },
// { title: '', dataIndex: 'crt_mei_maillist', key: 'crt_mei_maillist' },
// { title: '', dataIndex: 'ct_datetime', key: 'ct_datetime' },
// { title: '', dataIndex: 'crt_mei_country', key: 'crt_mei_country' },
]
return (
<>
{/* 搜索栏 */}
<Form layout='inline' onFinish={onFinish} style={{ marginBottom: 24 }} initialValues={initialFormValues}>
<Form.Item label='团号' name='crt_coli_id'>
<Input placeholder='输入团号' />
</Form.Item>
<Form.Item label='任务时间' name='dateRange'>
<RangePicker allowClear={true} inputReadOnly={true} presets={DATE_RANGE_PRESETS} />
</Form.Item>
<Form.Item label='状态' name='crt_status'>
<Select placeholder='请选择状态' style={{ width: 120 }}>
<Option value=''>所有</Option>
<Option value='0'>待发送</Option>
<Option value='99'>已发送</Option>
</Select>
</Form.Item>
<Form.Item>
<Button type='primary' htmlType='submit'>
搜索
</Button>
</Form.Item>
</Form>
{/* 搜索结果 */}
<span>搜索结果总数: {tasksList && tasksList.length}</span>
<Table dataSource={tasksList} columns={columns} pagination={false} rowKey='crt_sn' loading={loading} />
</>
)
}
export default Index
Loading…
Cancel
Save